ml-finance-python
python scripts for finance machine learning
git clone https://9o.is/git/ml-finance-python.git
lab_126.ipynb
(73213B)
1 {
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# GHP Construction with Duration matching\n",
8 "\n",
9 "As we saw in the previous lab, we can easily match a liability if we had a zero coupon bond that had the exact maturity as the liability, in which case, assuming we had enough funds available, we could do perfect cash flow matching.\n",
10 "\n",
11 "In this lab, we'll use a portfolio of standard, non-coupon bonds to try and achieve the same behaviour as a zero coupon bond.\n",
12 "\n",
13 "In order to do this, we'll have to find a way to price a bond, but as it turns out, we've already written the code to do this. Recall that we implemented the code to compute the present value of a sequence of liability cash flows. Well, a bond is nothing more than a series of cash flows that the issuer is offering to make to you, and therefore, the price of a bond is nothing more than the present value of the future cash flows.\n",
14 "\n",
15 "To be more precise, we should use discount rates matching the payment horizons using the yield curve. For simplicity, we'll assume that the yield curve is flat, and the rate of interest is the same regardless of whether it is 1 year, 5 year, 10 year or 30 year horizon. We'll also assume that bonds pay a monthly coupon thereby avoiding some of the complexities of intra-coupon payment. \n",
16 "\n",
17 "Add the following code:\n",
18 "\n",
19 "```python\n",
20 "import math\n",
21 "def bond_cash_flows(maturity, principal=100, coupon_rate=0.03, coupons_per_year=12):\n",
22 " \"\"\"\n",
23 " Returns the series of cash flows generated by a bond,\n",
24 " indexed by the payment/coupon number\n",
25 " \"\"\"\n",
26 " n_coupons = round(maturity*coupons_per_year)\n",
27 " coupon_amt = principal*coupon_rate/coupons_per_year\n",
28 " coupon_times = np.arange(1, n_coupons+1)\n",
29 " cash_flows = pd.Series(data=coupon_amt, index=coupon_times)\n",
30 " cash_flows.iloc[-1] += principal # add the principal to the last payment\n",
31 " return cash_flows\n",
32 " \n",
33 "def bond_price(maturity, principal=100, coupon_rate=0.03, coupons_per_year=12, discount_rate=0.03):\n",
34 " \"\"\"\n",
35 " Computes the price of a bond that pays regular coupons until maturity\n",
36 " at which time the principal and the final coupon is returned\n",
37 " This is not designed to be efficient, rather,\n",
38 " it is to illustrate the underlying principle behind bond pricing!\n",
39 " \"\"\"\n",
40 " cash_flows = bond_cash_flows(maturity, principal, coupon_rate, coupons_per_year)\n",
41 " return pv(cash_flows, discount_rate/coupons_per_year)\n",
42 "```\n"
43 ]
44 },
45 {
46 "cell_type": "code",
47 "execution_count": 1,
48 "metadata": {},
49 "outputs": [],
50 "source": [
51 "import numpy as np\n",
52 "import pandas as pd\n",
53 "import edhec_risk_kit_126 as erk\n",
54 "%matplotlib inline\n",
55 "%load_ext autoreload\n",
56 "%autoreload 2"
57 ]
58 },
59 {
60 "cell_type": "code",
61 "execution_count": 2,
62 "metadata": {},
63 "outputs": [
64 {
65 "data": {
66 "text/plain": [
67 "1136.7773962036904"
68 ]
69 },
70 "execution_count": 2,
71 "metadata": {},
72 "output_type": "execute_result"
73 }
74 ],
75 "source": [
76 "erk.bond_price(20, 1000, 0.05, 2, .04)"
77 ]
78 },
79 {
80 "cell_type": "markdown",
81 "metadata": {},
82 "source": [
83 "## Bond prices change with interest rates\n",
84 "\n",
85 "Consider the following chart that shows the change in value of a bond for interest rates from 2% to 10%. The bond in question is a 10 year bond that pays a 5% coupon semiannually and the face value is $1000."
86 ]
87 },
88 {
89 "cell_type": "code",
90 "execution_count": 3,
91 "metadata": {},
92 "outputs": [
93 {
94 "data": {
95 "text/plain": [
96 "<matplotlib.axes._subplots.AxesSubplot at 0x1a1ba3c390>"
97 ]
98 },
99 "execution_count": 3,
100 "metadata": {},
101 "output_type": "execute_result"
102 },
103 {
104 "data": {
105 "image/png": "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\n",
106 "text/plain": [
107 "<Figure size 432x288 with 1 Axes>"
108 ]
109 },
110 "metadata": {
111 "needs_background": "light"
112 },
113 "output_type": "display_data"
114 }
115 ],
116 "source": [
117 "rates = np.linspace(.01, .10, num=20)\n",
118 "prices = [erk.bond_price(10, 1000, 0.05, 2, rate) for rate in rates]\n",
119 "pd.DataFrame(data=prices, index=rates).plot(title=\"Change in 10Y Bond Prices with Interest Rates\", legend=False)"
120 ]
121 },
122 {
123 "cell_type": "markdown",
124 "metadata": {},
125 "source": [
126 "Assume that we have a liability of \\$1000 in 10 years. Clearly, we cannot use this as a hedge, since we would be severely underfunded if interest rates rise, and over funded if they fall. If we had a Zero Coupon bond, we could purchase that, but Zero Coupon bonds of specific maturities arent always available.\n",
127 "\n",
128 "What is available are various bonds with maturities from 5 to 30 years. How do we build a portfolio that has the same sensitivity to interest rates as our liabilities do? If they both respond the same way to changes in interest rates, we can effectively obtain immunity to interest rate changes.\n",
129 "\n",
130 "One way to do this is through _Duration Matching_. The duration of a bond measures its senstivity to interest rate changes. Therefore, we match the duration of the liabilities to the duration of the bond portfolio. As it happens, the duration of a bond which is computed as the weighted average time of the cash flows, weighted by the cash flows.\n",
131 "\n",
132 "Thus the duration of a Zero Coupon bond is just the maturity, since there is a single cash flow at maturity."
133 ]
134 },
135 {
136 "cell_type": "code",
137 "execution_count": 4,
138 "metadata": {},
139 "outputs": [
140 {
141 "data": {
142 "text/plain": [
143 "1 30.0\n",
144 "2 30.0\n",
145 "3 30.0\n",
146 "4 30.0\n",
147 "5 30.0\n",
148 "6 1030.0\n",
149 "dtype: float64"
150 ]
151 },
152 "execution_count": 4,
153 "metadata": {},
154 "output_type": "execute_result"
155 }
156 ],
157 "source": [
158 "cf = erk.bond_cash_flows(3, 1000, .06, 2)\n",
159 "cf"
160 ]
161 },
162 {
163 "cell_type": "code",
164 "execution_count": 5,
165 "metadata": {},
166 "outputs": [
167 {
168 "data": {
169 "text/plain": [
170 "Float64Index([ 0.970873786407767, 0.9425959091337544, 0.9151416593531595,\n",
171 " 0.8884870479156888, 0.8626087843841639, 0.8374842566836542],\n",
172 " dtype='float64')"
173 ]
174 },
175 "execution_count": 5,
176 "metadata": {},
177 "output_type": "execute_result"
178 }
179 ],
180 "source": [
181 "discounts = erk.discount(cf.index, .06/2)\n",
182 "discounts"
183 ]
184 },
185 {
186 "cell_type": "code",
187 "execution_count": 6,
188 "metadata": {},
189 "outputs": [
190 {
191 "data": {
192 "text/plain": [
193 "1 29.126214\n",
194 "2 28.277877\n",
195 "3 27.454250\n",
196 "4 26.654611\n",
197 "5 25.878264\n",
198 "6 862.608784\n",
199 "dtype: float64"
200 ]
201 },
202 "execution_count": 6,
203 "metadata": {},
204 "output_type": "execute_result"
205 }
206 ],
207 "source": [
208 "dcf = (discounts*cf)\n",
209 "dcf"
210 ]
211 },
212 {
213 "cell_type": "code",
214 "execution_count": 7,
215 "metadata": {},
216 "outputs": [
217 {
218 "data": {
219 "text/plain": [
220 "5.5797071871945345"
221 ]
222 },
223 "execution_count": 7,
224 "metadata": {},
225 "output_type": "execute_result"
226 }
227 ],
228 "source": [
229 "(cf.index*dcf).sum()/dcf.sum()"
230 ]
231 },
232 {
233 "cell_type": "markdown",
234 "metadata": {},
235 "source": [
236 "This is the Macaulay Duration which is the weighted average number of periods you have to be invested in the bond to get the present value of the bond back. In this example, we'll need to wait about 5.58/2 = 2.79 years on average to get back the present value of the bond. You can also compute something called the _Modified Duration_ which gives you a more direct measure of how much the bond price will move for a small change in interest rates (i.e. the first derivative of the bond price with respect to interest rates). However, we won't need to compute that since the Macaulay Duration is itself a measure of sensitivity and all we need to do is to match that to our liability.\n",
237 "\n",
238 "Let's add the following code to our toolkit:\n",
239 "\n",
240 "```python\n",
241 "def macaulay_duration(flows, discount_rate):\n",
242 " \"\"\"\n",
243 " Computes the Macaulay Duration of a sequence of cash flows, given a per-period discount rate\n",
244 " \"\"\"\n",
245 " discounted_flows = discount(flows.index, discount_rate)*flows\n",
246 " weights = discounted_flows/discounted_flows.sum()\n",
247 " return np.average(flows.index, weights=weights)\n",
248 "```\n"
249 ]
250 },
251 {
252 "cell_type": "code",
253 "execution_count": 8,
254 "metadata": {},
255 "outputs": [
256 {
257 "data": {
258 "text/plain": [
259 "5.579707187194534"
260 ]
261 },
262 "execution_count": 8,
263 "metadata": {},
264 "output_type": "execute_result"
265 }
266 ],
267 "source": [
268 "erk.macaulay_duration(erk.bond_cash_flows(3, 1000, .06, 2), 0.06/2)"
269 ]
270 },
271 {
272 "cell_type": "markdown",
273 "metadata": {},
274 "source": [
275 "# Duration Matching\n",
276 "\n",
277 "Assume we have a liability of \\\\$100 K in 10 years time and another of \\\\$100K in 12 years time. Assume interest rates are 4%. What is the duration of the liabilities?\n"
278 ]
279 },
280 {
281 "cell_type": "code",
282 "execution_count": 9,
283 "metadata": {},
284 "outputs": [
285 {
286 "data": {
287 "text/plain": [
288 "10.960799385088393"
289 ]
290 },
291 "execution_count": 9,
292 "metadata": {},
293 "output_type": "execute_result"
294 }
295 ],
296 "source": [
297 "liabilities = pd.Series(data = [100000, 100000], index=[10, 12])\n",
298 "erk.macaulay_duration(liabilities, .04)"
299 ]
300 },
301 {
302 "cell_type": "markdown",
303 "metadata": {},
304 "source": [
305 "Now assume we have two types of bonds available. We have a 10 year bond and a 15 year bond. Each of them pays a 5% coupon once a year and has a face value of \\\\$1000. What are the durations of these bonds?"
306 ]
307 },
308 {
309 "cell_type": "code",
310 "execution_count": 10,
311 "metadata": {},
312 "outputs": [
313 {
314 "data": {
315 "text/plain": [
316 "8.190898824083233"
317 ]
318 },
319 "execution_count": 10,
320 "metadata": {},
321 "output_type": "execute_result"
322 }
323 ],
324 "source": [
325 "md_10 = erk.macaulay_duration(erk.bond_cash_flows(10, 1000, .05, 1), .04)\n",
326 "md_10"
327 ]
328 },
329 {
330 "cell_type": "code",
331 "execution_count": 11,
332 "metadata": {},
333 "outputs": [
334 {
335 "data": {
336 "text/plain": [
337 "13.544718122145921"
338 ]
339 },
340 "execution_count": 11,
341 "metadata": {},
342 "output_type": "execute_result"
343 }
344 ],
345 "source": [
346 "md_20 = erk.macaulay_duration(erk.bond_cash_flows(20, 1000, .05, 1), .04)\n",
347 "md_20"
348 ]
349 },
350 {
351 "cell_type": "markdown",
352 "metadata": {},
353 "source": [
354 "Therefore, we need to hold a portfolio of these two bonds that has a combined target duration that matches the duration of the liability, which is given by the following expression, where $w_s$ is the weight in the short duration bond whcih has duration $d_s$ and the duration of the longer bond is $d_l$. We designate the targeted duration as $d_t$.\n",
355 "\n",
356 "In our case, the fraction in the short duration asset $w_s$ should be such that:\n",
357 "\n",
358 "$$ w_s \\times 8.19 + (1-w_s) \\times 13.54 = 10.96 $$\n",
359 "\n",
360 "more generally:\n",
361 "\n",
362 "$$ w_s \\times d_s + (1-w_s) \\times d_l = d_t $$\n",
363 "\n",
364 "rearranging gives:\n",
365 "\n",
366 "$$ w_s = \\frac{d_l -d_t}{d_l - d_s} $$\n",
367 "\n",
368 "```python\n",
369 "def match_durations(cf_t, cf_s, cf_l, discount_rate):\n",
370 " \"\"\"\n",
371 " Returns the weight W in cf_s that, along with (1-W) in cf_l will have an effective\n",
372 " duration that matches cf_t\n",
373 " \"\"\"\n",
374 " d_t = macaulay_duration(cf_t, discount_rate)\n",
375 " d_s = macaulay_duration(cf_s, discount_rate)\n",
376 " d_l = macaulay_duration(cf_l, discount_rate)\n",
377 " return (d_l - d_t)/(d_l - d_s)\n",
378 "```\n",
379 "\n",
380 "While we are at it, let's update the funding ratio we developed the last time to support cash flows in the assets:\n",
381 "\n",
382 "```python\n",
383 "def funding_ratio(assets, liabilities, r):\n",
384 " \"\"\"\n",
385 " Computes the funding ratio of a series of liabilities, based on an interest rate and current value of assets\n",
386 " \"\"\"\n",
387 " return pv(assets, r)/pv(liabilities, r)\n",
388 "```\n"
389 ]
390 },
391 {
392 "cell_type": "code",
393 "execution_count": 12,
394 "metadata": {},
395 "outputs": [
396 {
397 "data": {
398 "text/plain": [
399 "0.48263092069478974"
400 ]
401 },
402 "execution_count": 12,
403 "metadata": {},
404 "output_type": "execute_result"
405 }
406 ],
407 "source": [
408 "short_bond = erk.bond_cash_flows(10, 1000, .05, 1)\n",
409 "long_bond = erk.bond_cash_flows(20, 1000, .05, 1)\n",
410 "w_s = erk.match_durations(liabilities, short_bond, long_bond, 0.04)\n",
411 "w_s"
412 ]
413 },
414 {
415 "cell_type": "code",
416 "execution_count": 13,
417 "metadata": {},
418 "outputs": [
419 {
420 "data": {
421 "text/plain": [
422 "10.960799385088393"
423 ]
424 },
425 "execution_count": 13,
426 "metadata": {},
427 "output_type": "execute_result"
428 }
429 ],
430 "source": [
431 "p_short = erk.bond_price(10, 1000, .05, 1, 0.04)\n",
432 "p_long = erk.bond_price(20, 1000, .05, 1, 0.04)\n",
433 "a_0 = 130000\n",
434 "dm_assets=pd.concat([a_0*w_s*short_bond/p_short,a_0*(1-w_s)*long_bond/p_long])\n",
435 "erk.macaulay_duration(dm_assets, 0.04)"
436 ]
437 },
438 {
439 "cell_type": "code",
440 "execution_count": 14,
441 "metadata": {},
442 "outputs": [
443 {
444 "data": {
445 "text/plain": [
446 "10.960799385088393"
447 ]
448 },
449 "execution_count": 14,
450 "metadata": {},
451 "output_type": "execute_result"
452 }
453 ],
454 "source": [
455 "erk.macaulay_duration(liabilities, 0.04)"
456 ]
457 },
458 {
459 "cell_type": "code",
460 "execution_count": 15,
461 "metadata": {},
462 "outputs": [
463 {
464 "data": {
465 "text/plain": [
466 "0.9998760012192478"
467 ]
468 },
469 "execution_count": 15,
470 "metadata": {},
471 "output_type": "execute_result"
472 }
473 ],
474 "source": [
475 "cfr = erk.funding_ratio(dm_assets, liabilities, 0.04)\n",
476 "cfr"
477 ]
478 },
479 {
480 "cell_type": "code",
481 "execution_count": 16,
482 "metadata": {},
483 "outputs": [
484 {
485 "data": {
486 "text/plain": [
487 "0.9998760012192477"
488 ]
489 },
490 "execution_count": 16,
491 "metadata": {},
492 "output_type": "execute_result"
493 }
494 ],
495 "source": [
496 "lb_assets = a_0*long_bond/p_long\n",
497 "erk.funding_ratio(lb_assets, liabilities, 0.04)"
498 ]
499 },
500 {
501 "cell_type": "code",
502 "execution_count": 17,
503 "metadata": {},
504 "outputs": [
505 {
506 "data": {
507 "text/plain": [
508 "0.9998760012192477"
509 ]
510 },
511 "execution_count": 17,
512 "metadata": {},
513 "output_type": "execute_result"
514 }
515 ],
516 "source": [
517 "sb_assets = a_0*short_bond/p_short\n",
518 "erk.funding_ratio(sb_assets, liabilities, 0.04)"
519 ]
520 },
521 {
522 "cell_type": "code",
523 "execution_count": 18,
524 "metadata": {},
525 "outputs": [
526 {
527 "data": {
528 "text/plain": [
529 "0.027467589831998485"
530 ]
531 },
532 "execution_count": 18,
533 "metadata": {},
534 "output_type": "execute_result"
535 }
536 ],
537 "source": [
538 "erk.funding_ratio(lb_assets, liabilities, 0.03)-cfr"
539 ]
540 },
541 {
542 "cell_type": "code",
543 "execution_count": 19,
544 "metadata": {},
545 "outputs": [
546 {
547 "data": {
548 "text/plain": [
549 "-0.02232913141503523"
550 ]
551 },
552 "execution_count": 19,
553 "metadata": {},
554 "output_type": "execute_result"
555 }
556 ],
557 "source": [
558 "erk.funding_ratio(lb_assets, liabilities, 0.05)-cfr"
559 ]
560 },
561 {
562 "cell_type": "code",
563 "execution_count": 20,
564 "metadata": {},
565 "outputs": [
566 {
567 "data": {
568 "text/plain": [
569 "-0.026067215268698818"
570 ]
571 },
572 "execution_count": 20,
573 "metadata": {},
574 "output_type": "execute_result"
575 }
576 ],
577 "source": [
578 "erk.funding_ratio(sb_assets, liabilities, 0.03)-cfr"
579 ]
580 },
581 {
582 "cell_type": "code",
583 "execution_count": 21,
584 "metadata": {},
585 "outputs": [
586 {
587 "data": {
588 "text/plain": [
589 "0.02721629283763294"
590 ]
591 },
592 "execution_count": 21,
593 "metadata": {},
594 "output_type": "execute_result"
595 }
596 ],
597 "source": [
598 "erk.funding_ratio(sb_assets, liabilities, 0.05)-cfr"
599 ]
600 },
601 {
602 "cell_type": "code",
603 "execution_count": 22,
604 "metadata": {},
605 "outputs": [
606 {
607 "data": {
608 "text/plain": [
609 "0.0016300375570328374"
610 ]
611 },
612 "execution_count": 22,
613 "metadata": {},
614 "output_type": "execute_result"
615 }
616 ],
617 "source": [
618 "erk.funding_ratio(dm_assets, liabilities, 0.03)-cfr"
619 ]
620 },
621 {
622 "cell_type": "code",
623 "execution_count": 23,
624 "metadata": {},
625 "outputs": [
626 {
627 "data": {
628 "text/plain": [
629 "0.001583022308244031"
630 ]
631 },
632 "execution_count": 23,
633 "metadata": {},
634 "output_type": "execute_result"
635 }
636 ],
637 "source": [
638 "erk.funding_ratio(dm_assets, liabilities, 0.05)-cfr"
639 ]
640 },
641 {
642 "cell_type": "code",
643 "execution_count": 24,
644 "metadata": {},
645 "outputs": [
646 {
647 "data": {
648 "text/plain": [
649 "<matplotlib.axes._subplots.AxesSubplot at 0x1a1be26208>"
650 ]
651 },
652 "execution_count": 24,
653 "metadata": {},
654 "output_type": "execute_result"
655 },
656 {
657 "data": {
658 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmQAAAF1CAYAAABGc/YfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xdc1uX+x/HXJUNQFE3EvfcAAcG9NRuOzCwz07RhWurpdM6p06lcWTbMU6ZWZqWnoS01V0tNBTeOnLhyDxRcIDiA6/fHDfyoHKjgl/F+Ph49gPt7f6/v+77B+HBd1/e6jLUWEREREXFOAacDiIiIiOR3KshEREREHKaCTERERMRhKshEREREHKaCTERERMRhKshEREREHKaCTCSfMMaMMMZ87nSOazHGbDXGtHE6x9UYY5YYYx5P/by3MeZnpzNlRm7KKpLfqCATyUOMMQ8ZYyKNMfHGmKPGmB+MMS2cznU9rLX1rLVLbuRcY4w1xpxLff3xxpjTWRzvL6y1X1hrO2ZH28aYfcaYxNTXcswYM9UY45PJcyunvh/utyKriNwcFWQieYQx5lngHeA1oBRQEZgE3ONkLgc0sNb6pP5XzOkwWaCLtdYHCAKCgRccziMi2UAFmUgeYIzxBUYBT1trZ1prz1lrL1lr51pr/5XhqZ7GmP8ZY+JShwZDM7Txb2PMntRj24wx92Y41s8YE2GMGWuMOWWM2WuMuSvD8SrGmGWp5y40xkzMODxqjGlijFlhjDltjPntakOSqb1CHVI/H2GM+fpKma/j/elnjIn402PWGFM99fOpqZnnp15ntTGmWobn3m6MiTLGnDHGTADMldpObXegMWZX6ns10RhjUo+5GWPeNsbEpL6Hg//ci3Ul1tpjwE+4CrO0a3Uyxmwwxpw1xhw0xozIcMqy1I+nU3vYml4mazNjzNrU17XWGNMsc++oiGQ1FWQieUNTwAuYdY3ndQVmAMWAOcCEDMf2AC0BX2Ak8LkxpkyG442BHYAf8CbwcVqhAXwJrAFKACOAPmknGWPKAfOB0cBtwD+B74wxJTP52q6WOSv1wvW6iwO7gVcBjDF+wHfAS7he+x6g+TXa6gyEAQ2AB4A7Uh9/ArgLV1EVAnTLbDhjTPnUc3dnePgc0BfXe9MJGGSMSWuzVerHYqm9hSv/1N5tuL4v43F938YB840xJTKbSUSyjgoykbyhBBBjrU26xvMirLULrLXJwGe4CgYArLXfWGuPWGtTrLVfAbuARhnO3W+t/Sj13GlAGaCUMaYiruJjmLX2orU2AlfhlOZhYEHqdVOstb8AkcDdmXxtV8x8BetTe+JOG2PGZ/IaADOttWtS38Mv+P+eqLuBbdbab621l3ANCx+7RluvW2tPW2sPAL9maOsB4F1r7SFr7Sng9Uzkmm2MiQMOAseB4WkHrLVLrLWbU9/XTcB0oHXmXi6dgF3W2s+stUnW2ulAFNAlk+eLSBZSQSaSN8QCfpkY+spYSCQAXmnnGGP6GmM2phUzQH1cPUJ/Oddam5D6qQ9QFjiZ4TFwFQ9pKgH3ZyiSTgMtcBV0mXHFzFcQYq0tlvrf0Exe43LXSZs8X5YMr8daa/nj67vhtjLRDkA3a20RoA1QmwzfE2NMY2PMr8aYE8aYM8BA/vg9u5qywP4/PbYfKJfJ80UkC6kgE8kbVgLnuY4hsIyMMZWAj4DBQInUyfBbyDBX6iqOArcZYwpleKxChs8PAp9lKJKKWWsLW2sz0zuUVc4B6fmMMaWv49yjZHg9qcO0Fa789Gu2VT7D15lux1q7FJgKjM3w8Je4eiMrWGt9gQ/4/++ZvUaTR3AVyxlVBA5nNpOIZB0VZCJ5gLX2DDAMmGiM6WaMKWSM8TDG3GWMeTMTTRTG9Qv8BIAxpj+uHrLMXHs/riHIEcYYT2NMU/447PU50MUYc0fqpHYvY0yb1DlRt8pvQD1jTJAxxgvXPLfMmp96bvfUnrmhwPUUdBl9DfzNGFPOGFMMeP46z38HuN0YkzYEWgRX7+R5Y0wj4KEMzz0BpABVr9DWAqCmcS2V4m6M6QnUBeZdZyYRyQIqyETyCGvtOOBZXJPPT+DqmRoMzM7EuduAt3H1tEUDAcDy67h8b1w3FsTimrz/FXAhte2DuJbe+E+GXP/iFv7/x1q7E9ddqAtxzY2LuPoZfzg3Brgf13yvWKAG1/feZPQR8DOwCdiAqyhKApIzmeUE8D/g5dSHngJGpc4xG4ar4Et7bgKuGxOWpw4VN/lTW7G4bj74R+rreg7onPp6ReQWM67pECIiWccY8xUQZa0dfs0n52OpS4d8YK3989ChiOQz6iETkZtmjAkzxlQzxhQwxtyJq0fsmj1z+Y0xxtsYc3fqEGE5XHdMXmupEhHJB1SQiUhWKA0sAeJxrWs1yFq7wdFEOZPBtdbZKVxDlttxDTWKSD6nIUsRERERh6mHTERERMRhKshEREREHHbNDW2d4OfnZytXrux0DBEREZFrWrduXYy1NrP7815WjizIKleuTGRkpNMxRERERK7JGPPnbcium4YsRURERBymgkxERETEYSrIRERERByWI+eQXc6lS5c4dOgQ58+fdzqK5CNeXl6UL18eDw8Pp6OIiEgelmsKskOHDlGkSBEqV66MMcbpOJIPWGuJjY3l0KFDVKlSxek4IiKSh+WaIcvz589TokQJFWNyyxhjKFGihHplRUQk2+WaggxQMSa3nH7mRETkVshVBZnTfHx8btm1+vXrR5UqVQgKCqJ27dqMHDkyy9quXLkyMTExWdaeiIiI3BwVZDnYW2+9xcaNG9m4cSPTpk1j7969TkcSERGRbKCC7Cbt37+f9u3bExgYSPv27Tlw4ADg6uEaOnQozZo1o2rVqnz77bcApKSk8NRTT1GvXj06d+7M3XffnX7sStLmMBUuXBiARYsWERwcTEBAAI8++igXLlwAXD1fw4cPJyQkhICAAKKiogCIjY2lY8eOBAcH8+STT2KtzZb3QkRERG5MrrnLMqORc7ey7cjZLG2zbtmiDO9S77rPGzx4MH379uWRRx7hk08+YejQocyePRuAo0ePEhERQVRUFF27dqVHjx7MnDmTffv2sXnzZo4fP06dOnV49NFHL9v2v/71L0aPHs3u3bsZOnQo/v7+nD9/nn79+rFo0SJq1qxJ3759ef/993nmmWcA8PPzY/369UyaNImxY8cyZcoURo4cSYsWLRg2bBjz589n8uTJN/5GiYiISJZTD9lNWrlyJQ899BAAffr0ISIiIv1Yt27dKFCgAHXr1iU6OhqAiIgI7r//fgoUKEDp0qVp27btFdtOG7I8duwYixYtYsWKFezYsYMqVapQs2ZNAB555BGWLVuWfk737t0BaNiwIfv27QNg2bJlPPzwwwB06tSJ4sWLZ90bICIikl9ZC1u+y5KmcmUP2Y30ZN0qGe/KK1iwYPrnacOENzJc6OPjQ5s2bYiIiKBjx45XfW7aNd3c3EhKSrpsLhEREblJp/bBnKGwd2mWNKcespvUrFkzZsyYAcAXX3xBixYtrvr8Fi1a8N1335GSkkJ0dDRLliy55jWSkpJYvXo11apVo3bt2uzbt4/du3cD8Nlnn9G6deurnt+qVSu++OILAH744QdOnTqViVcmIiIif5GSDKveh0lN4fB66DQuS5rNlT1kTklISKB8+fLpXz/77LOMHz+eRx99lLfeeouSJUvy6aefXrWN++67j0WLFlG/fn1q1qxJ48aN8fX1vexz0+aQXbx4kfbt29O9e3eMMXz66afcf//9JCUlERYWxsCBA696zeHDh9OrVy9CQkJo3bo1FStWvP4XLyIikt+d2AHfD4ZDa6D67dDlHfAtDzx+002bnHjHXWhoqI2MjPzDY9u3b6dOnToOJcpa8fHx+Pj4EBsbS6NGjVi+fDmlS5d2OpZcQV762RMRkRuQfAmWvwNL3wTPwnDnGxD4AKROBzLGrLPWht7MJdRD5oDOnTtz+vRpLl68yMsvv6xiTEREJKc6+ht8/zQc2wx1u8Hdb4GPf5ZfRgWZAzIzb0xEREQcdOk8LH0Dlr8Lhf2g5+dQp0u2XU4FmYiIiEhGB1a55orF7oKgh+GO0eCdvUtGqSATERERAbgQD4tGwZrJ4FsBHp4J1dvfkkurIBMRERHZsxjm/A3OHIRGA6D9MCjoc8sur4JMRERE8q/EU/DTS7DxcyhRA/r/AJWa3vIYWhj2Orz66qvUq1ePwMBAgoKCWL16NeDa1DsmJuaG2924cSMLFiy47LElS5bg6+tLUFAQgYGBdOjQgePHj9/wtTIaMWIEY8eOzZK2REREcp3t82BiY/htOrT4OwyMcKQYAxVkmbZy5UrmzZvH+vXr2bRpEwsXLqRChQo33W5SUtJVCzKAli1bsnHjRjZt2kRYWBgTJ0686euKiIjkW/HH4etH4KveUNgfnlgMHUaAh5djkVSQZdLRo0fx8/NL3yvSz8+PsmXLph9/7733CAkJISAggKioKABOnjxJt27dCAwMpEmTJmzatAlw9UwNGDCAjh070rdvX4YNG8ZXX31FUFAQX3311RUzWGuJi4tL3xz8au0/+uijtGnThqpVqzJ+/Pj0Nl599VVq1apFhw4d2LFjR9a+SSIiIjmZtfDbVzCxEexYAO1eggG/Qtkgp5Pl0jlkP/zbtUBbViodAHe9fsXDHTt2ZNSoUdSsWZMOHTrQs2fPP+wh6efnx/r165k0aRJjx45lypQpDB8+nODgYGbPns3ixYvp27cvGzduBGDdunVERETg7e3N1KlTiYyMZMKECZe9dnh4OEFBQcTGxlK4cGFee+01gKu2HxUVxa+//kpcXBy1atVi0KBBbNq0iRkzZrBhwwaSkpIICQmhYcOGWfUOioiI5FxnDsG8v8Oun6F8GHSdAP61nU6VTj1kmeTj48O6deuYPHkyJUuWpGfPnkydOjX9ePfu3QFo2LAh+/btAyAiIoI+ffoA0K5dO2JjYzlz5gwAXbt2xdvbO1PXThuyPHjwIP379+e55567ZvudOnWiYMGC+Pn54e/vT3R0NOHh4dx7770UKlSIokWL0rVr15t+X0RERHK0lBSI/AQmNoF9EXDn6/DoTzmqGIPc2kN2lZ6s7OTm5kabNm1o06YNAQEBTJs2jX79+gGkD2W6ubmRlJQEuIYY/8yk7ntVuHDhG8rQtWtX7rvvvmu2n5bnz5nSjouIiOR5sXtg7t9gXzhUaQ1d3oXbqjid6rLUQ5ZJO3bsYNeuXelfb9y4kUqVKl31nFatWvHFF18Arrsl/fz8KFq06F+eV6RIEeLi4jKVIyIigmrVql1X+xnzzJo1i8TEROLi4pg7d26mrikiIpKrpCTDivfg/eauvSi7jIe+3+fYYgxyaw+ZA+Lj4xkyZAinT5/G3d2d6tWrM3ny5KueM2LECPr3709gYCCFChVi2rRpl31e27Ztef311wkKCuKFF16gZ8+efzieNofMWouvry9Tpky5rvbThISE0LNnT4KCgqhUqRItW7a8jndAREQkF4jeBnMGw+F1UOtu6PQ2FC177fMcZi437OW00NBQGxkZ+YfHtm/fTp06dRxKJPmZfvZERHKBpIsQMQ6WjQWvonDXm1D/PrgFU3WMMeustaE304Z6yERERCR3O7gG5gyFE9uhfg+46w0o7Od0quuigkxERERyp/NnXZuBr53iGpbsNQNq3eV0qhuigkxERERyn6gFMP8fEHcUGj/pWuS1YBGnU90wFWQiIiKSe8QdgwX/gu1zwL8e9PwMyt/U9K0cQQWZiIiI5HwpKbB+GvwyHJLOQ7uXofnfwM3D6WRZQgWZiIiI5GwndroWeD2wAiq3dC3wWqKa06mylBaGvQ5ubm4EBQVRr149GjRowLhx40hJScmy9qdOncqRI0fSv3788cfZtm1blrRrjGHRokXpj82aNQtjDN9+++11ZbrScwYPHnzD+ZYsWULnzp0v+7ivry9BQUEEBgbSoUMHjh8/fsPXyWjEiBGMHTs2S9oSEZFsknQRlrwBHzSH49tc+08+MjfPFWOgguy6eHt7s3HjRrZu3covv/zCggULGDly5HW1kZycfMVjfy5+pkyZQt26dW84b0YBAQFMnz49/esZM2bQoEGDa56XmYIsO6Xt47lp0ybCwsKYOHGiY1lEROQWOrAKPmwJS16DOl1g8FoI6XNL1hVzggqyG+Tv78/kyZOZMGEC1tq/9BJ17tyZJUuWAK6NyYcNG0bjxo1ZuXIlo0aNIiwsjPr16zNgwACstXz77bdERkbSu3dvgoKCSExMpE2bNqQtkDt9+nQCAgKoX78+zz//fPp1fHx8ePHFF2nQoAFNmjQhOjr6snlbtmzJmjVruHTpEvHx8ezevZugoKD045nNtHbtWpo1a0aDBg1o1KhR+pZPR44c4c4776RGjRrpm58D/PzzzzRt2pSQkBDuv/9+4uPjAfjxxx+pXbs2LVq0YObMmdd8v621xMXFUbx4cQBOnjxJt27dCAwMpEmTJmzatAlw9Xw9+uijtGnThqpVqzJ+/Pj0Nl599VVq1apFhw4d2LFjR/rj48ePp27dugQGBvLggw9eM4uIiGSj82dg3rPwyR1w8Rw89DX0+AR8/J1Olq1y5RyyN9a8QdTJqCxts/ZttXm+0fPXfmIGVatWJSUl5ZrDaOfOnaN+/fqMGjUKgLp16zJs2DAA+vTpw7x58+jRowcTJkxg7NixhIb+8W6RI0eO8Pzzz7Nu3TqKFy9Ox44dmT17Nt26dePcuXM0adKEV199leeee46PPvqIl1566S8ZjDF06NCBn376iTNnztC1a1f27t2bfnzw4MHXzHTx4kV69uzJV199RVhYGGfPnsXb2xtw7e25YcMGChYsSK1atRgyZAje3t6MHj2ahQsXUrhwYd544w3GjRvHc889xxNPPMHixYupXr36X7aKyiht26jY2FgKFy7Ma6+9BsDw4cMJDg5m9uzZLF68mL59+7Jx40YAoqKi+PXXX4mLi6NWrVoMGjSITZs2MWPGDDZs2EBSUhIhISE0bNgQgNdff529e/dSsGBBTp8+fdXvpYiIZKPt82DBPyE+Gpo8BW1fhII+Tqe6JdRDdpMys/WUm5sb9913X/rXv/76K40bNyYgIIDFixezdevWq56/du1a2rRpQ8mSJXF3d6d3794sW7YMAE9Pz/T5Vw0bNmTfvn1XbOfBBx9kxowZzJgxg169ev3hWGYy7dixgzJlyhAWFgZA0aJFcXd31fTt27fH19cXLy8v6taty/79+1m1ahXbtm2jefPmBAUFMW3aNPbv309UVBRVqlShRo0aGGN4+OGHr5g5bcjy4MGD9O/fP733LSIigj59+gDQrl07YmNjOXPmDACdOnWiYMGC+Pn54e/vT3R0NOHh4dx7770UKlSIokWL0rVr1/RrBAYG0rt3bz7//PP01yMiIrfQ2aMwozd81RsKlYDHF8KdY/JNMQa5tIfsenuyssvvv/+Om5sb/v7+uLu7/2GC//nz59M/9/Lyws3NLf3xp556isjISCpUqMCIESP+8NzLuVrR5+HhgUkdT3dzcyMpKemKz23UqBFbtmzB29ubmjVr/iFrZjJZa9Ov9WcFCxZM/zwth7WW22+//Q9z18DVm3aldq6ma9eu6YXt5d6TtDYvlyXj8T+bP38+y5YtY86cObzyyits3bpVhZmIyK2QkgLrPoWFIyD5IrQfDs2G5JmlLK6Heshu0IkTJxg4cCCDBw/GGEPlypXZuHEjKSkpHDx4kDVr1lz2vLRCx8/Pj/j4+D/c5VikSJH0OVkZNW7cmKVLlxITE0NycjLTp0+ndevWN5R7zJgx6cN+15updu3aHDlyhLVr1wIQFxd31QKwSZMmLF++nN27dwOQkJDAzp07qV27Nnv37mXPnj0AfynYriQiIoJq1Vx31rRq1YovvvgCcN2N6efnR9GiRa94bqtWrZg1axaJiYnExcUxd+5cgPTvV9u2bXnzzTc5ffp0+jw3ERHJRsej4NO7YP6zUDYIBq2Als/my2IMMtFDZoz5BOgMHLfW1r/M8drAp0AI8KK1dmyGY/uAOCAZSLrZndCdlpiYSFBQEJcuXcLd3Z0+ffrw7LPPAtC8eXOqVKmSPvE+JCTksm0UK1aMJ554goCAACpXrpw+/AfQr18/Bg4ciLe3NytXrkx/vEyZMowZM4a2bdtireXuu+/mnnvuuaHXcNddf93j63oyffXVVwwZMoTExES8vb1ZuHDhFa9VsmRJpk6dSq9evbhw4QIAo0ePpmbNmkyePJlOnTrh5+dHixYt2LJly2XbSJtDZq3F19eXKVOmAK7J+/379ycwMJBChQoxbdq0q77ukJAQevbsSVBQEJUqVaJly5aA667Xhx9+mDNnzmCt5e9//zvFihW7+psoIiI3LukChI+D8LddQ5L3TIKgh/Ls3ZOZZa41B8oY0wqIB/53hYLMH6gEdANOXaYgC7XWxlxPqNDQUJt2d2Ga7du3U6dOnetpRiRL6GdPRCSL7F8Jc4dCzE4IuB/uGAM+JZ1OddOMMetuttPpmj1k1tplxpjKVzl+HDhujOl0M0FEREQkj0o87Zontu5T8K0Ivb+FGrc7nSpHye6Zyxb42RhjgQ+ttZOv9ERjzABgAEDFihWzOZaIiIjcEtvmuDYDP3ccmg6GNi/kq7snMyu7C7Lm1tojqcOavxhjoqy1yy73xNRibTK4hiyzOZeIiIhkp7NHXIVY1DwoHQC9pkO5y8+vlmwuyKy1R1I/HjfGzAIaAZctyDLZ3g0tlyByozKzzpyIiGSQkgyRn8DCkZCSBLePci3ymk/vnsysbCvIjDGFgQLW2rjUzzsCo260PS8vL2JjYylRooSKMrklrLXExsbi5eXldBQRkdzh6CaY9wwcXgdV20Dn/8JtVZ1OlStkZtmL6UAbwM8YcwgYDngAWGs/MMaUBiKBokCKMeYZoC7gB8xKLZ7cgS+ttT/eaNDy5ctz6NAhTpw4caNNiFw3Ly8vypcv73QMEZGc7UI8/PoarH7ftdJ+949cd1GqAyXTMnOXZa9rHD8GXO431lmgwY2EupCU8pfHPDw8qFKlyo00JyIiItll+zz44Tk4exga9ocOw8G7uNOpcp0cuT/MnhPxRO47SWjl25yOIiIiIpdz+qCrENuxAPzrwf1ToUIjp1PlWjly6yS3AobeU1bz45ZjTkcRERGRjJKTYMV7MLEx/L7ENWn/yaUqxm5SjizIqpX0oW7Zogz6Yh3TVuxzOo6IiIgAHFwLk9vAzy9BlZbw9Gpo/jfdQZkFcmRB5l7A8OXjTehQpxTD52xlzA/bSUnR8gMiIiKOSDwN8/4OH98OCbHwwGfQawYU00LuWSVHziED8PZ044OHGzJ8zhY+XPo7x86c580egRR0d3M6moiISP5gLWz5Dn58ARJioPFAaPciFCzidLI8J8cWZOCaS/bKPfUpW8ybN3/cwfGzF/igT0N8vdU1KiIikq1i98D8f8Dvv0LZYOj9DZQNcjpVnpUjhywzMsbwVJvqjHugAWv3neSBD1Zy9Eyi07FERETypqQLsPQtmNQUDkXCXW/B44tUjGWzHF+QpekeUp6p/Rtx+HQi3SetYMexOKcjiYiI5C17w+GDFvDraKh1FwxeC40HQAFNF8puuaYgA2hRw4+vn2xKirX0+GAFK/bEOB1JREQk9zsXC7MGwbTOrh6y3t/CA9OgaBmnk+UbuaogA6hbtigzn2pO6aJe9PtkLXN+O+J0JBERkdwpJQXWfwYTGsLmr6HFs/DUKqhxu9PJ8p1cV5ABlCvmzbcDmxFUsRhDp29g8rI9WKtlMURERDLteBRM7QRzBkPJ2jAwwrXtkWchp5PlS7myIAPwLeTB/x5tRKfAMry2IIqRc7eRrLXKREREru5iAiwa5ZordmI7dJ0A/RaAfx2nk+VrOXrZi2vx8nDjvQeDKV3Ui48j9nLszHneeTAILw9NPhQREfmLXQth/rNwej80eAg6vgKF/ZxOJeTiHrI0BQoYXu5cl5c61eGnbcd4eMpqTp276HQsERGRnCPuGHzTD764D9w84ZF5cO/7KsZykFxfkKV5vGVVJvQKYdOhM9z3wQoOnkxwOpKIiIizUpJhzUcwIQyiFkDbF2HQctc+lJKj5JmCDKBTYBk+e6wRMXEX6P7+CrYcPuN0JBEREWccWgcftYMF/4RyIfDUSmj9HLgXdDqZXEaeKsgAGlctwXeDmuHpVoCeH65k6c4TTkcSERG5dRJOwty/wZT2rqHK+z6GPrOhRDWnk8lV5LmCDKBGqSLMfKoZFUsU5rGpa/km8qDTkURERLJX+ppioa6PTZ5yrbQf0AOMcTqdXEOeLMgAShX14usnm9Ckagn+9e0mxi/apbXKREQkbzq6CT65w7WmmF9NeHIZ3PkaeBV1OplkUp4tyACKeHnwSb8wugeXY9wvO/nPrM0kJac4HUtERCRrnD8DC56Dya3h5O/Q7X3o/wOUru90MrlOuXodsszwdC/A2w80oLSvF5OW7CH67AUmPBRMIc88/9JFRCSvshY2fwM/vQjnTkDYY9DuJfAu7nQyuUF5uocsjTGG5+6szSvd6rNkx3F6TV5FTPwFp2OJiIhcv+NRMK0LzHwCilWAAb9Cp7dVjOVy+aIgS9OnSSU+eLghO6LjuO/9FeyLOed0JBERkcy5EA8/vwwfNIdjm6HzO/DYQigb7HQyyQL5qiAD6FivNF8+0YS480l0f38FGw6ccjqSiIjIlVkLW2fDxEawYjw06AVD1kNofyiQ736N51n58jsZUrE43w1qhk9Bd3p9tIpftkU7HUlEROSvYvfA593hm0eg0G3w2C9wzwQoXMLpZJLF8mVBBlDFrzDfDWpGzVJFePKzSD5buc/pSCIiIi4XE2DxaJjUBA5Fwp1vwBNLoEIjp5NJNsm3BRlAySIFmTGgCW1r+fPy91t5cdZmLmlZDBERcdKOH2BSY1j2FtS7FwZHQpOB4KbVAfKyfP/dLeTpzuS+obz5UxQfLv2d3cfjmdQ7hBI+2utLRERuoVP74Id/w84foGRteGSeNgHPR/J1D1katwKGF+6qw38o1xYLAAAgAElEQVR7NmDDwdPcM3E524+edTqWiIjkB0kXYOlbMLEx7F0Gt4+CgREqxvIZFWQZ3Btcnq+fbMql5BTue38FP2455nQkERHJy3YvgklN4dfRUPMO196Tzf8Gbh5OJ5NbTAXZnwRVKMacwS2oUaoIAz9fx7sLd5GSoj0wRUQkC505DF/3dd1BCfDwTHjgf+Bbztlc4ph8P4fsckoV9eKrAU34z8zN/HfhTnZEn2Xs/Q203ZKIiNyc5EuwahIseQNsMrR9CZoPBXfNW87vVGFcgZeHG28/0IA6ZYoy5oft7I1J4KO+DSlfvJDT0UREJDfaGw4L/gknoqDmXXDX61C8stOpJIfQkOVVGGN4olVVPu4XxqFTCdwzYTlr9p50OpaIiOQmZw7DN/1hWme4lAC9ZsBDM1SMyR+oIMuEtrX8mf10c3y9Peg9ZRXT1xxwOpKIiOR0SRcg/G2YEAo7FkCbF+DpNVDrLqeTSQ6kIctMqlbSh1lPNWfIjA28MHMzUUfP8lLnuni4qaYVEZE/2fkT/PhvOPk71O4Md7wGxSs5nUpyMBVk18G3kAefPBLKGz9G8VH4XnYdj2fiQyEUL+zpdDQREckJYvfAT/+BnT+CX03oMwuqtXM6leQC6t65Tu5uBXixU13G3t+AyH2nuGficnYci3M6loiIOOniOVg0yrX35L4IuP0VGLhcxZhkmgqyG9SjYXlmPNmExEvJdJ+0nF+2RTsdSUREbjVrYctMmBDmmi9WrzsMWZe6lIVGTyTzVJDdhJCKxZk7uAXV/H0Y8FkkExbvwlotIisiki9Eb4NpXeDb/lDoNnj0J+j+IRQp7XQyyYVUkN2k0r5efP1kU7o2KMvYn3cyZPoGEi8mOx1LRESyS+Jp1ybgH7SAY5uh09swYClUbOJ0MsnFNKk/C3h5uPFOzyBqly7Kmz9FsS/2HJP7hFK2mLfT0UREJKukpMBvX8LCEXAuBhr2g3YvQ+ESTieTPEA9ZFnEGMOgNtWY0jeUfTEJdJ0Qwbr9WkRWRCRPOLwOPr4dvn8aileBAUugyzsqxiTLqCDLYu3rlGLWU83wKejOg5NX8fXag05HEhGRG3UuBuYMgY/aw+kD0O0D11yxskFOJ5M85poFmTHmE2PMcWPMliscr22MWWmMuWCM+eefjt1pjNlhjNltjPl3VoXO6WqUKsLsp5vTuEoJnvtuEyPnbiUpOcXpWCIiklnJSbB6MrwXAhu/hKZPu+6eDOoFBdSXIVkvMz9VU4E7r3L8JDAUGJvxQWOMGzARuAuoC/QyxtS9sZi5T7FCnkztH0b/5pX5dPk++n26ltMJF52OJSIi17JvOXzYCn74F5QNhkEr4I5Xwauo08kkD7tmQWatXYar6LrS8ePW2rXApT8dagTsttb+bq29CMwA7rmZsLmNu1sBhnepx5v3BbJ6byzdJi5n93EtIisikiOdPQLfPgZT74YLZ+GB/0Gf2VCyltPJJB/Izn7XckDGCVSHUh+7LGPMAGNMpDEm8sSJE9kY69Z7IKwC059oQvyFJLpNXMGi7VpEVkQkx0i6AOHj4L1Q2D4XWj/v2gS87j1gjNPpJJ/IzoLscj/FV1w11Vo72Vobaq0NLVmyZDbGckZo5duYM7gFlf0K8fj/Inl/yR4tIisi4rRdv8CkprBoJFRtA0+vhrb/Ac9CTieTfCY7C7JDQIUMX5cHjmTj9XK8ssW8+ebJZnQKKMMbP0bxtxkbSbiY5HQsEZH85+RemN4Lvujh6gXr/R30+hJuq+J0MsmnsnNh2LVADWNMFeAw8CDwUDZeL1fw9nTjvV7B1ClTlLE/72D70bNM6h1CjVJFnI4mIpL3XYiHiHGwYgIUcIcOI6HJU9p3UhxnrjVsZoyZDrQB/IBoYDjgAWCt/cAYUxqIBIoCKUA8UNdae9YYczfwDuAGfGKtfTUzoUJDQ21kZOQNvaDcJHzXCZ6ZsZGEi8m81r0+9waXdzqSiEjelJICm75yrbIffwwCe0KHEVC0rMPBJC8wxqyz1obeVBs5cR5TfinIAKLPnmfI9A2s2XuSB8MqMKJrPbw83JyOJSKSdxxcCz8+71ptv1xDuPMNqBDmdCrJQ7KiINPqdg4rVdSLLx9vzFNtqjFj7UG6TVzO7yfinY4lIpL7nT0CM5+EjzvAmcOuVfYfW6hiTHIkFWQ5gLtbAZ67szaf9gvj2NnzdJ2wnHmb8vX9DyIiN+5SIix7C95rCFtnQct/aJV9yfH0k5mDtK3tz/yhLalZyofBX25g2PdbuJCU7HQsEZHcwVrY9j1MbASLR0P19q5lLNoPg4I+TqcTuarsvMtSbkC5Yt589WRT3vwxio/C97LhwGkmPhRCxRJaE0dE5IqObYYfX4B94eBfDx6ZC1VaOZ1KJNPUQ5YDebgV4MVOdZncpyH7Y8/R6b1wftxyzOlYIiI5z7kYmPuMa+/J6K3QaRw8uUzFmOQ6KshysI71SjN/aEuq+BVm4OfreGXeNi4mpTgdS0TEecmXYOUkGB8CGz6DRk/C0PUQ9hi4afBHch/91OZwFW4rxDcDmzJmQRQfR+xl3f5TTOwdQrli3k5HExFxxq5f4Kf/QMxOqNYe7hyjDcAl11MPWS5Q0N2NEV3rMfGhEHYfj6fT+HAWR2mDchHJZ2J2wRf3u7Y7SkmGh76Gh79TMSZ5ggqyXKRTYBnmDmlBGV9vHp0ayes/RJGUrCFMEcnjEk/DTy/CpCZwYBV0HA1PrYKad7j2oRTJAzRkmctU8SvMrKeaMXLuNj5Yuof1+08xvlcwpX29nI4mIpK1UpJh/f9cS1gkxEJIX2j3MviUdDqZSJZTD1ku5OXhxpjuAbzTM4gtR87QaXw4y3aecDqWiEjW2RcBH7aGec+AX014cil0Ha9iTPIsFWS5WLfgcswZ3IISPp488ukaxv28g+SUnLc3qYhIpp3aD18/AlM7wfnT0ONT6L8AyjRwOplIttKQZS5X3d+H2U83Z9j3Wxm/eDdr953i3V5B+BfREKaI5CIXz0HEf2HFe4CBti9CsyHgoTvKJX9QD1keUMjTnbH3N+DNHoFsOHiKTuMjWLEnxulYIiLXZi1s+hreC3XtP1mnCwyJhNbPqRiTfEUFWR7yQGgFZj/dnCJe7jw8ZTUTFu8iRUOYIpJTHVwDUzrAzCegSCl49Ge4bwr4lnc6mcgtp4Isj6lduihzBregc2BZxv68k35T1xIbf8HpWCIi/+/UfvimP3x8O5w9DPdMgscXQ8XGTicTcYzmkOVBPgXdeffBIBpXvY2Rc7fRaXwEEx4KJrTybU5HE5H87PxZiBjn2vLIFIDW/4bmQ8GzsNPJRBynHrI8yhhD78aVmDmoGQU9CtBz8io+XLpHQ5gicuslJ0HkJzA+2DVxv/59rn0n276gYkwklXrI8rj65XyZO6QFz3+7iTE/RLFm70nG3t+A4oU9nY4mIvnB7kXw80twfBtUag53fAtlg51OJZLjqIcsHyjq5cGk3iGM6FKXZbtOcMc7y1iqhWRFJDsdj4LPe8Dn3eFSIvT8HPrNVzEmcgUqyPIJYwz9mldh1lPN8fX24JFP1jDs+y0kXkx2OpqI5CXnYmD+P+D9Zq67KDu+Ck+vdi1noX0nRa5IQ5b5TNoQ5ps/7uCT5XuJ2BXDf3sG0aBCMaejiUhulnQBVn8Iy8bCxXgIe8w1ab9wCaeTieQK6iHLh7w83BjWpS5fPN6YxEvJdH9/Be8u3EVScorT0UQkt7EWts6GCWHwy8tQsQk8tQrufkvFmMh1UEGWjzWv7sePz7SiS2AZ/rtwJz0+WMnemHNOxxKR3OLwOvj0LvjmEfD0gT6zoPfXULKm08lEch0VZPmcr7cH7zwYzHu9gvn9RDx3vxvOF6v3Y62WxxCRKzhzGGYOgI/aQexu6PIuDAyHau2cTiaSa2kOmQDQpUFZwirfxr++/Y0XZ21h4bZo3ugRqE3KReT/XYiH5e+6NgC3KdDyH9Di71CwiNPJRHI9kxN7QkJDQ21kZKTTMfKllBTL/1buY8wPURTydGNM9wDurF/G6Vgi4qSUZPhtOix6BeKPQf0e0GE4FKvodDKRHMEYs85aG3ozbWjIUv6gQAHX8hjzh7agXHFvBn6+nn9+8xtx5y85HU1EnLB3GUxuDd8/7SrAHlsIPT5WMSaSxVSQyWVV9y/CzEHNGdKuOjPXH+LOd8JZ/Xus07FE5FaJ2Q3TH4JpXSDxDPT4BB77GSqEOZ1MJE9SQSZX5OlegH90rMU3A5vh7mZ48KNVjFmwnQtJWkxWJM9KOAk/vgCTGrt6x9oPh8FrXftPamFXkWyjSf1yTQ0rFWfB0JaMnr+dD5f9ztKdJ3jnwSBqly7qdDQRySpJF2HtFFj6Blw4CyGPQNv/gI+/08lE8gX1kEmmFC7ozpjuAXz8SCgx8Rfo+t5yPlr2OykpOe+mEBG5DtbClpkwMQx+esG11+TACOjyjooxkVtIBZlcl/Z1SvHTM61oU6skry7YzkNTVnHoVILTsUTkRuxfCVM6wLf9waMwPPwd9J0Npeo5nUwk31FBJtethE9BPuzTkDd7BLL50BnueiecmesPaTFZkdwiZjfM6A2f3glnD8M9E10Lu1bv4HQykXxLc8jkhhhjeCC0Ak2rluDZrzfy7Ne/sXB7NK92C6B4YU+n44nI5cSfgKWvQ+Sn4FEI2r0ETZ4Gz0JOJxPJ91SQyU2pcFshZgxoyuRlvzPulx1E7jvFmz0CaVNLc09EcoyLCbBqIkS8C5cSILQ/tP43+JR0OpmIpNKQpdw0twKGQW2qMfvp5hQr5EG/T9fy8uwtJFxMcjqaSP6WkgwbPof3GsLi0VC1NTy9Gjq9rWJMJIdRD5lkmXplfZkzuAVjf9rBlIi9LN8dw7ieQQRVKOZ0NJH8Z/ci+GUYRG+BcqGu1fUrNXM6lYhcgXrIJEt5ebjxUue6fPl4Y85fSua+91fwzsKdXEpOcTqaSP5wbDN8di983h0uxkOPT+HxhSrGRHI4FWSSLZpV9+OHZ1rRtUFZ3lm4i/veX8G2I2edjiWSd505DLMGwQct4cgGuGMMPL0G6nfXCvsiuYDJiUsVhIaG2sjISKdjSBaZv+kow+ds4VTCJQa0qsrf2tfAy8PN6VgiecP5sxDxX1g1ybXIa+MnoeU/wFtTBURuFWPMOmtt6M20oTlkku06BZahefUSvDp/O+8v2cMPm4/y2r0BNKvu53Q0kdwr+ZJr+Yqlr0NCLAQ8AO1fhmIVnU4mkq8cjj+cJe2oIJNbolghT966vwH3BpfjhVmbeWjKau5vWJ4XO9WhWCGtWyaSadbC9rmwcASc3AOVW0LHV1xbHolItrPWsuf0HhYdWMSiA4vYfnJ7lrR7zSFLY8wnQGfguLW2/mWOG+Bd4G4gAehnrV2feiwZ2Jz61APW2q6ZCaUhy7zt/KVk3l20i8nLfqd4IQ+GdalHl8AyGM1zEbm6g2vh55fg4CooWRtuHwU1OmqOmEg2S7EpbInZwqIDi1h8YDH7zu4DoEHJBrSv2J5HAx696SHLzBRkrYB44H9XKMjuBobgKsgaA+9aaxunHou31vpcbygVZPnDtiNneWHmJn47dIa2tUoy+t4AyhXzdjqWSM4TuwcWjYRt34NPKWj7Hwh6GNw0yCGSXZJSklgXvY6F+xey+OBijiccx924E1Y6jPYV29O2Ylv8C7kWQb8lc8istcuMMZWv8pR7cBVrFlhljClmjCljrT16M8Ek76tbtigzn2rO1BX7GPvTDm4ft5R/dqzFI80q41ZAf/GLcC4Wlr0Jaz8GN09o8wI0HQwFr/vvXBHJhPNJ51l5ZCWLDixiyaElnLlwBi83L5qXa077iu1pVb4VvgV9s+XaWfHnVTngYIavD6U+dhTwMsZEAknA69ba2VlwPclD3AoYHmtRhY51S/HS7C2MmreN7387wuvdA6hTpqjT8USccSkRVn8I4ePgYhyE9HUVY0VKO51MJM+JuxjHskPLWHRgERGHI0hMSqSIZxFal29Nh4odaFauGd7u2T96kxUF2eW6MtLGQStaa48YY6oCi40xm621ey7biDEDgAEAFSvqLqH8psJthZjaP4w5vx1h1NxtdHkvgidbV2VIOy2RIflIchL8Nh2WjIGzh6HmndBhJPjXdjqZSJ4SkxjDkoNLWHhgIauPriYpJQk/bz+6VO1C+0rtCSsdhkcBj1uaKSsKskNAhQxflweOAFhr0z7+boxZAgQDly3IrLWTgcngmkOWBbkklzHGcE9QOVrVKMno+duZ+OseFmw+xmv3BtC0Wgmn44lkH2thxwJYNApORLm2Ouo+GSq3cDqZSJ5xOP4wi/a77ozccHwDFkt5n/I8XOdh2ldsT2DJQAoY59bLz4qCbA4w2BgzA9ek/jPW2qPGmOJAgrX2gjHGD2gOvJkF15M8rnhhT95+wLVExn9mbabXR6voGVqB/9xdB99Ct/YvFpFst38lLBwOB1dDiRrQ83Oo3Vl3TorcpLTlKRYeWMjiA4vTl6eoWbwmgxoMol3FdtQsXjPH3OGfmbsspwNtAD8gGhgOeABYaz9IXfZiAnAnrmUv+ltrI40xzYAPgRRcWzS9Y639ODOhdJelpEm8mMw7i3YyJXwvxQt5MqJrXToFaIkMyQOOb4eFI2HnD+BTGtq+oDsnRW5S2vIUaUXY/rP7MZj05SnaV2xPhaIVrt3QdcqKuyy1dZLkClsOn+GFmZvZfPgM7Wv780q3+pTVEhmSG505BL+Ogd++BM8i0OJv0HgQeBZyOplIrpRwKYE1x9YQfiicJYeWpC9P0ahMI9fyFBXaUrJQyWzNoIJM8pWk5BQ+Xb6Pcb/spICBf91Riz5NtUSG5BIJJyFiHKyeDFhoNMC152Sh25xOJpLrHDh7gPDD4YQfCmftsbVcTLlIIfdCNC3bNNuXp7gcFWSSLx08mcB/Zm0mfFcMwRWL8Xr3QGqVLuJ0LJHLu5QIqz+A8P/ChbPQoJdreFJ7Topk2sXki0RGRxJ+KJyIwxHpK+VXLlqZVuVb0bJ8Sxr6N8TDzZl5xirIJN+y1jJ742Fembeds4mXGNi6GoPbVdcSGZJzJCfBxi9gyesQd8S1hEX7YVCqntPJRHKFY+eOpfeCrTq6isSkRDwLeBJWJoxW5VrRslzLbJkPdiNuyUr9IjmRMYZ7g8vTuqY/o+dtY8Kvu1mw+SivdQ+gSVUtkSEOshai5ru2OorZCeXD4L4pULm508lEcrSklCQ2ndjEskPLCD8czs5TOwEoU7gMXat1pWW5ljQq0+iWLNLqBPWQSZ6wbOcJXpy9mYMnE+nVqAL/vqsOvt5aIkNusf0r4JfhcGgN+NWE9sOhdictYSFyBSfPn2T54eUsO7SM5UeWE3cxDnfjTnCpYFqWa0nLci2pVqxajr+zXkOWIhkkXEzinYW7mBL+OyV8CjKyaz3uql86x/9DljwgepurR2znj1CkjGubo6DeWsJC5E9SbArbY7ez7PAywg+FsyVmCxZLCa8StCjXglblW9G0bFOKeOauecEqyEQuY/OhM/x75ia2HjlLyxp+DOtclxqlctc/bsklTh+EX19zbXdUsCi0eAYaD9QSFiIZnL14lpVHVqZPyI89H4vBEOAXQIvyriKszm11HF0l/2apIBO5gqTkFD5ftZ9xv+zk3MVk+jSpxN871NRK/5I1Ek5C+Nuw5iPX140HQItntYSFCK6brnad3kXE4QjCD4Wz4fgGkm0yRTyL0KJsC1qWb0mzss0o4Z135vuqIBO5hpPnLvL2zzuYvuYAvt4e/KNjLXo1qqi1y+TGXEyA1e9DxDtwMR4aPARt/g3FcsadXiJOORx/mNVHV7Pq6CpWH13NyfMnAdc2RS3LtaRV+VYElgzEvUDeHMZXQSaSSduOnGXE3K2s2XuSOmWKMrxLXd2NKZmXnAQbP09dwuIo1LwrdQmLuk4nE3HEqfOnWH1stasIO7KKQ/GHACjhVYLGZRrTpEwTmpZtSunCpR1OemuoIBO5DtZaFmw+xmsLtnP4dCKdAsrwwt21KV9c833kCqyF7XNg0SsQuwvKN4LbR0KlZk4nE7mlEi4lsC56HauPrmb1sdVEnYwCoLBHYcJKhdG4TGMal2lM9WLV8+WNVCrIRG5A4sVkPly2hw+W7sFaGNi6GgNbV8PbU4vKSiprYc9iWDQKjm4Ev1rQYTjUultLWEi+cCnlEptPbE4fhtwUs4mklCQ8CngQ5B9E49KuAqy+X/08Owx5PVSQidyEw6cTGbNgO/M2HaWsrxcv3F2HzoFl8uVfd5LBwTWwcCTsjwDfiq5tjgJ7QgEV7JJ3pdgUdp3alT4HLDI6ksSkRAyGOiXquIYhSzchuFRwnl2Y9WaoIBPJAqt/j2Xk3G1sO3qWRlVuY3iXutQre+s2pZUc4tgWWDwadv4AhUtCq39Bw37gXtDpZCLZ4mDcQdcQ5NHVrDm2Jn0ifuWildOHIBuVbnRLN+nOrVSQiWSR5BTLV2sPMvbnHZxOuMiDjSryj9trUsJHv4zzvNg9sGQMbP7WtZZY86HQZBB4FnY6mUiWik2MZc2xNenDkIfjDwNQ0rtkegHWpEyTfDMRPyupIBPJYmcSLvHOop38b+V+Cnu68UyHmvRpWgkPt9y7YKFcwdkjsPRN2PAZFPCAJgOh+d/Au7jTyUSyxMnzJ9lwfEP6ZPy0vSGLeBQhtHQojcs0pmmZplTxraKpGjdJBZlINtkVHceoedsI3xVDDX8fhnWpS8saJZ2OJVkh4SREjHMt6pqS7BqWbPVPKKJeAcm9rLUcjDvI+uPr2XB8A+uj17Pv7D4APAt4EuwfnN4DVqdEHU3Ez2IqyESykbWWhduPM3r+NvbHJtChTile7lyHSiU0lJUrXYiDlZNgxXupi7o+6FrUtXhlp5OJXLeklCR2nNrBhugNrD++nvXR64k9HwtAUc+iBPsHE+wfTEipEOqWqEtBN02/yE55tiDzqepj+3/Un9DSoYSVDqNW8Vq46Q4ncciFpGQ+idjHhMW7uJRseaxlFZ5uWx2fgvoLM1e4dB4iP3ZtdZQQC7U7Q7uXwL+O08lEMi3hUgKbYjalF2C/nfiNxKREAMr5lPv/Asw/hKrFqubqfSFzozxbkJWtXdaGjAlh/9n9gGu8u2GphirQxFHRZ8/zxo9RzFx/GP8iBXn+ztrcG1yOAtqGKWdKToKNX8DSN+DsYajaBtoNg/INnU4mck0xiTFsPL4xvfcr6mQUyTYZg6Fm8ZrpvV/B/sGahJ8D5NmCLG3IMvpcNJHRkaw9tpbI6EgVaJIjrD9wipFzt/HbwdMEVSjGiK71CKpQzOlYkiYlBbbNgsWvwsk9UK4htB8OVVs7nUzksqy17D+73zX3K3UOWNrvu4JuBQnwC0gvwBqUbEARzyIOJ5Y/y/MF2Z+pQJOcIiXFMnPDYd74MYoTcRfo0bA8z91RC/+iXk5Hy7+shV2/wOJRcGwzlKwD7V/W6vqS41xKucSOkztYF72ODcc3sOH4hvQ1wIoVLJY+9BhcKpi6t9XFw83D4cRyLfmuIPuzKxZonq4CLaxUGGGlw6hZvKYKNMkW8ReSeG/xLj6J2IunWwGGtK9B/+aVKeiun7dbav8K1zZHB1ZCsUrQ9kUI6KHV9SVHiD4XzZbYLWyN2cqmE5vYFLMpff5XeZ/y6UOPIaVCqFJUS1DkRvm+IPszFWjilL0x53h1/jYWbj9OuWLe/P32mtwbXA43zS/LXkd/c238vfsX8CkFrZ+D4L7g7ul0MsmnTp8/nV58pX08kXgCADfjRs3iNdMLsGD/YPwL+TucWLKCCrJrOHbuGJHRkUQecxVpB+IOACrQJPuE7zrBmz/uYPPhM1T39+GfHWtyR73S+os3q8Xshl9Hw9ZZ4FUMWjwDjZ4Ez0JOJ5N85Nylc2yL3ZZefG2J2ZK++j1AFd8q1CtRj/p+9alXoh61b6uNl7umNeRFKsiu09UKtKCSQQSUDCDAL4D6JepTzEuTtOXGWGv5Ycsxxv68g99PnKNBeV/+dUdtWtTwczpa7nfmECx5HTZ+Ce5eri2Omg0Bb/17lex1IfkCO07uYEvMFrbGbuX/2rvv+LjOAt//n2dmpFHvsizZKu5xS3G3U+wESINNSAhcNgsbAnllQwgsXODuUl6/e3fvcpdlWcreJBAIxVm4oQQWApsQAknsJI4TlySWXFUsW7Jkq4+kkTT1+f1xRmPJVbZkjcr3DfM6Z845M/PIJxp//dSqtioO+w5jcf4OLUkvYWmBE76W5S9jSf4SMpIzElxqGS8KZKM0GNB2HN/BntY91HbVxn+5SjNLWVawjOUFTkjTv2zkQoUjUX795jG+/adqjnX1s2FePp+/aRFXlWlpngvWcxxe/gbs+pHzfNVH4drPQoaae2TshaNhartqqWqrijc7VndWE7ZhAPJT8p1ar4KlLMt3tnkpeQkutSSSAtkYG6x+rmyrpLK1ksq2Sk70nQDAYzwsyF3g1KDFgtqc7Dlq6pTzCoQj/HT7UR55sYZ2f5AblxTxuZsWsbBIQ9fPy98Gr34L3ngcIkG48m6nn1hOWaJLJlNE1EY50n2EqrYq9rXvo6qtigMdBxiIDABOC8rS/KXxpsdlBcsoSitSNwQZRoFsHLT0tTj/SmqrorKtkqq2KnpDvQCkJ6XHf0kHg5p+UeVsegNhfvjKYb6/tY7eYJg7rprFZ965kNI89Xs6TX8nbHsYXv8uBP1w+Qdg499B/rxEl0wmsVAkRJ2vjuquag51HmJf2z72te+jJ9QDQIo7hcX5i4eFr9LMUs16L+elQJYAURulvrveCWitTkA70HmAcNSpyi5MLWRZwTIuL7w83pFTk/jJUJ3+IN/dUsuPt9UTtZa715TxiRvmMyNTTeIMdDshbNvDEPDBkvfCpi/AjMsSXTKZRKy1nOg7waHOQ8FjizAAACAASURBVFR3OuGruquaw12H482OHpeHhbkLWZa/LN78ODd7rhbdlouiQDZBBCNBDnQciNegVbVVUd9dHz8/J3tOvAbt8oLLWZi7UBP9Ccd9A/z7C9X8fEcDyW4X915dwd9snEd26jT8byPYBzu+D698C/o7nMlcN30Bii9PdMlkgusL9cVrvA51HIrv9wR74tcUpxezIHcBC3MXsiDH2ZZnl5Pkmoa/a3JJKJBNYL6Aj73te+O1aHva9sRnYk5yJbE4bzFL8pewMM/5gpifM18jcqapw21+vvn8IZ5+u4msFA8PbJrHvRvmkJo8DfonhgZg14+dhb/9LTDvHc6krlpvUk4RiUY42nN0eK1XZzWNvY3xa9KT0lmQs+Bk+Mp19rOSsxJYcpkOFMgmEWstx/3H47VolW2V7GvfR1+4L35NSXoJ83Pnx79Q5ufMZ272XNWmTRP7mrr5+h8P8sKBFgozvXzqhvn8t9VlJHumYP+VcBDe+gls/bqz8Hf5NXDDl6F8faJLJhNAe3+7U9M1pMartquWQCQAgMu4KM8qH1bjtTBvISXpJerDKwmhQDbJRW2UZn8z1Z3VzqPL2db76k/2czAeyrPK4//Sm58znwW5C5iVMUsdTaeoHfUd/OsfDvJGfQdleWl85l0LuO2KKTLrfyQMe34OW74KXUdh9hq44UswZ6PWm5yGfAEfR7qPOB3th9R6tQ+0x6/JT8mP13YNbudmz9U0RDKhKJBNUaFIiPruemq6aoaFtaEzQKd6UuPhbHC7IGcB+an5CSy5jBVrLS8dauVf/3CQfc3dLCrK5HM3LeKdi2dMzhqAaBT2/hpe+mdor4HiK+D6L8OCdymITXED4QEaehqo767nSPcR6n3O9kj3EToDnfHrvG4v83Lmnaz1inXn0HeaTAYKZNOMP+Sntqs2HtBqOmuo7qqO900DyEvJc/qkndL0mZakqRUmo2jU8kxVM9/44yHq2vxcVZbD529axIZ5k2TWf2th/+/gxf8DrfthxhK4/otw2XsUxKaQSDRCk78pHrSGhq5mf3N8wm1wRqJXZFdQnlVORZazLc8qpyyzTPM6yqSlQCbAyf4W1Z3V8Vq1mq4a+sP98WtmZcyKB7TyrHJKM0spyyojPyV/cta4TDPhSJSndjXy7T9X0+wb4NoFBXz+pkVcPnuCLhlkLVT/EV78irMAeP4C2PT3sPROcKmpfTKy1tI+0H4ydHXXc8Tn7B/tOUooGopfm5GU4YSt7PLTgld6UnoCfwqRS0OBTM4qaqMc6z12Wkgb2j8NnKbP0szSMz5mps/UnDwTzEAowk+2H+GRF2vo7Atxy7KZfPbGRcyfMUFG6FoLdS85QaxxB+SUO0Fs+QfArf+WJgN/yD88dHUfiQevwQlUwRktXpZZ5gStbCd0DQavvJQ8/UNPphUFMrlgoUiIJn8TDT0NHO0+SkNPA409jRztOUpjTyPBaDB+rcd4mJU5i9mZsynLLIsHtbLMMmZlzsLr9ibwJ5neegZCPP7yYR5/uY7+UIQ7rprNg9fPY15hAoPZkW3wwlfgyCuQNQuu+zxc9SHQKOEJw1qLL+Cj2d9Mk7+J4/7jNPU20exvprnXOTa0C4TBUJxe7NRyndLMWJxerCZGkRgFMhlTURulpa+Fhp6G+GMwtDX0NMSXjALni3pG2gzKssrOWLum1QnGR3tvgEdfquWnrx8hEI5yy7KZPLhpPstmZY9fIRp3wYv/BLUvQEaRs+j3insgSaPgxls4Gqa1rzUeuJp7m0+Gr97jNPmbhnVlAGe5oOKMYorTncfszNnx0FWaWarRjCIjoEAm48ZaS1egywlpPUNq1mKBbegwdYBcby6lmaVO7VpWGSXpJcxImxF/ZCVnqUljDLX1BvjRq4d54rUj9AyEuW5hIZ/YNI81cy5h01HzHqez/qFnIS0frv40rL4PkjWA5FLpC/U5tVr+k7Vazf7meC1XS18LERsZ9ppcb+6wwFWSUeLsx47lenP1uygySgpkMmH0hfqG16wNCW3N/maiNjrseq/bS2FqYTygFaYVMiN1yH7seKonNUE/0eTUPRDiJ9uP8MNXDtPWG2RleS4PbprHDZeN4XQZx6ucecT2/w5SsmHDJ2HtA+BVrejFikQjdAW6aB9op72/Pb4d1qTob6Yr0DXsdW7jpiit6KyBa2baTI2wFhkHCmQyKYQiIU70naC1v9XZ9rXS2tcaP9bS10JLX8tpTSkAmUmZp4W0wtRCitKK4sfyU/O1Jt0pBkIRfrGzgce21HGsq5/LZmby8U3zePfyYjzuixzleGIvvPRV2P80eLOcELb+E5A6QUd6Jlg4GqZzoPO0kDVsP7btDHSe9o8WcAbdlKSXxANXPGzF9gtTC9WPS2QCUCCTKcNaiz/kd8JZf8vJwNbXOuxYa1/rsFGi4PRny0vJO622rTCtkGxvNtnJ2WR7s8lKziLbm02qJ3XaNNGEIlGefquJ72yppaall/L8NB7YOI87V8zC6xnhX+Qn9jk1Yvt+C8mZsO7jziMt79IWfgIKRUJOiDpLuOro74g/7wp0DZt/a5DX7SU/JZ/81Pz4Ni8lz3k+5Fh+Sr6a9kUmiXELZMaYHwLvAVqstcvOcN4A3wZuBfqAj1hrd8fO3QN8OXbpP1lrN5/v8xTI5GyiNkrnQOewmrUz1bYNHSl2Ko/xkOXNGhbSspOznWOx7eDxodssb9akrYmLRi1/3HeCR1+qYU+jj6IsL/ddM5e715aR7j3LdBQt+50asX2/iQWxB2Ddg5M6iEVtFH/IT2+wl55Qj7MN9sT3e0Ox58GeYdf4gj7a+9vpDnaf8X1TPamnhaxTw9XgNj0pXSFLZIoZz0B2HdALPHGWQHYr8EmcQLYW+La1dq0xJg/YCawCLLALWGmt7Tz1PYZSIJPRGqzJ8AV8dAe76Q504wv64tvB476Ab9g1Q+dZOpP0pPTTQtxgWBt8nuZJI8WdQoonBa/be3LrTsHr8caPJbuSx/0vZmstr9a08+hLNWyrbScnLYl71lfwkQ0V5KYnOxe1HHBqxPb+BpLTTzZNJjCIWWsJRoMEI8F4oBoMT8NC1CnHhoaqwdecqdZqqCRXEpnJmWQkZZCRnEFmciZZyVkna7HOELLUT0tkehvXJktjTAXw+7MEsseAl6y1T8aeHwQ2DT6stX9zpuvORoFMEiUSjdAT7DlreItvA93DjnUFuobNVD4SBhMPa6cGt1PD3PnOJ7mSMMYw+D/Myc8wmJPnhgTAulY//7XnOLuPduH1uLhjTpQbI1tJbtiGSUrBXPYeWHoHxnuy2czE3njweSgaIhgJnnxEz7J/rnMjuG6kf7Zu446HqczkTDKSM+L7w44POZ+ZlBkPXpnJmZpfT0Qu2FgEsrGaOnsW0DDkeWPs2NmOn8YYcz9wP0BZWdkYFUvkwrhdbnJScshJubCO6tZaBiID+AI++sP9BCIBBsIDBCIBApHAGY8N7g+eC4QDDEQG4ud6Q73Djg3uX2jwO5+02K/b0wF4GqB4hnOgbSts2Trq93cZVzw0et1ekt3JJLmSSHYnx4+nelLJ8eac8dzg/uC5tKS04SEq6WTwmk79A0VkahmrQHamb0B7juOnH7T2e8D3wKkhG6NyiYwLYwypntRxmaYjEo04oS0yMCykDdZ2DzbJWWsZ/J/z/1OOdx7FvvUfUPsieFLomXcrvwqu5dmafiLRCBvmFXD7lSWU5afFXzP4/oOfNSw8uZNIdiWfFrq0/JaIyPmN1TdlI1A65PlsoCl2fNMpx18ao88UmZbcLjdprrSL77fUVg1bvgZVT4EnBdY8ABs+BekFXAt8sXuAH7xymJ9sP8LWyl7ecVkaD14/n5Xlk7czv4jIRDdWfcjeDTzEyU79/26tXRPr1L8LWBG7dDdOp/6zD4FDfchELom2Gtj6Naj8pRPEVt8HV/8tpBec8XJfX4jNr9Xzo1cP09kXYu2cPB68fj7XLShQs6CIyBDjOcrySZyargLgBPA/gSQAa+13Y9NePAzcjDPtxb3W2p2x134U+GLsrb5irf3R+T5PgUxkDLXXOjVilb8AtxfW3Acb/hYyCkf08r5gmCffaOD7W+s43j3AsllZPLhpPjctnYnbpWAmIqKJYUXk7NprYeu/wp6fO0Fs9cecGrGMGRf1doFwhN+8eYzvvFRLfXsfcwvTuXdDBXeumH32ucxERKYBBTIROV1HHWwZDGJJTtPkhk9BZtGYvH0kanm2qpnHttRRecxHptfDXatm89frK5hTkD4mnyEiMpkokInISR11sPXf4O0nnSC2KlYjNkZB7FTWWnYf7eKJ1+p5prKZUMSycWEhH9lQwcaFhbjUnCki04QCmYhAx2F4+evw1mAQ+2gsiM0ctyK09Azw5OsN/PT1I7T0BCjPT+PD68p5/6pSslMn53JTIiIjpUAmMp211cDL/+Y0Tbo8ThC75tPjGsROFQxH+cPe4zyxrZ6dRzpJTXJzx4pZ3LO+gkUzMxNWLhGRS0mBTGQ6ajng1IhV/crprL/qXqePWFZxoks2TNUxH0+8Vs9v32oiEI6ybm4eH9lQwTsXF+FxuxJdPBGRMaNAJjKdnNjrjJrc+xtISnNGTW745EWPmhwvnf4gP9vRwE+2H+FYVz8l2Sn81bpy/nJNGXmDC5qLiExiCmQi00Hz2848Ygd+D8mZsPZ+WPcJSM9PdMkuSCRq+dP+EzzxWj2v1rST7HHxF5eX8JENFSyfnZ3o4omIXDQFMpGp7NguZ/qKQ8+CNxvWPQBrH4C0yb+EUfWJHja/Vs+vdx+jLxhhRVkO92yo4JZlxSR71JwpIpOLApnIVNTwBmz5F6j5E6TkwPqHnFqxlKlXi9Q9EOKpnY088Vo99e19FGR4uXttGX+1toyirJREF09EZEQUyESmkvpXnSB2eAuk5Tv9w1bfB96pPzoxGrVsrW5l87Z6XjrUitsYbllezD3ry1lZnqu1M0VkQhuLQKb1TkQSyVo4vNXpI3bkFUifATf+kzOFRfL0mfXe5TJsWjSDTYtmUN/m5z+2H+EXOxv43dtNLC3J4p4NFdx2RQkpSe5EF1VE5JJQDZlIIlgLtX92gljD65BZDFd/GlbeA0mpiS7dhOAPhPnNW8fYvK2eQyd6yU1L4r+tdpozS/PSEl08EZE4NVmKTDbWwqHnYOvXnE77WbOdyVyv+jAkqc/UmVhr2V7XweZt9fxx33GiFtbNzeOulaXcsmymFjYXkYRTIBOZLKJROPiM00fs+B7IKYNrPwtX3A0ezcU1Uk1d/fx6dyNP7Wqkvr2PtGQ3ty4v5q6Vs1lTkaf1M0UkIRTIRCa6aBT2/xa2fh1OVEHeXLj2c3D5B5x1J+WiWGvZdaSTX+5s5L8qm+kNhCnLS+N9K2Zz54pZatIUkXGlQCYyUUUjsPc/nZn1Ww9AwUK47vOw9E5wq4ltLPUFwzy39zhP7WpkW2071sL6ufnctXI2tyyfSVqy/rxF5NJSIBOZaCJhqPyls9Zkew0ULoaNn4cl7wWXRgheao2dffzn7mM8tbuRI+19pA9t0pyTp+kzROSSUCATmSjCAXj7SXjlm9BZD0XLnSB22V+ASzPPjzdrLTvqO3lqVwP/tacZfzBCWV4ad610mjRn56pJU0TGjgKZSKIF/bBrM2z7v9DTBCUr4LrPwaJbQbUxE0JfMMwfqk42aQJsmOc0ad68TE2aIjJ6CmQiiTLggze+D9sfhb52KL8GrvsszL1eQWwCa+jo49e7j/HU7gYaOvrJ8Hp49/Ji7lo1m1VaEUBELpICmch487c7IeyN70PAB/Pf5dSIla1LdMnkAkSjlh31HTy1yxml2ReMUJ6fxl0rZnPnytnMytHkvCIycgpkIuOlu9lpltz1Iwj1w5Lb4Jr/DiVXJrpkMkr+QJhnq47z1K4Gttd1YMyQJs2lxaQmazCGiJybApnIpdZxGF79Nrz1U2cqi8s/ANd8BgoXJbpkcgk0dPTxq92N/Gp3Y7xJ8z2XF3PnCqdJUxPPisiZKJCJXCotB+CVb0DlU850FVd9CK7+W8itSHTJZBxEo5Y3Yk2az8SaNGdkerll2UxuWV7M6oo83ApnIhKjQCYy1precuYQ2/97Z5HvVR+F9Q9BVnGiSyYJ4g+EeX7fCZ6taualg60EwlEKMpK5aelMbl1ezNo5eXjcmtpEZDpTIBMZK0dec4JYzZ/Amw1r74e1H4f0/ESXTCYQfyDMiwdbeLbyOC8caKE/FCE3LYmbljo1Zxvm5ZOkcCYy7SiQiYyGtVD7Arz8b3DkVUgrgPUPwur7ICU70aWTCa4/GGHLoRaeqTzOn/efwB+MkJ2axI1Lirh1eTEb5ufj9WhAgMh0oEAmcjGiUTj4jFMj1vQmZJbA1Z+CFfdAsmZwlws3EIrwcnUbz1Y28/y+E/QEwmSmeHjX4iJuWV7MtQsKSElSOBOZqhTIRC5EJAx7fw0vfwNa9zsd9K/5DFzxl+DxJrp0MkUEwhG21bTzTGUzf9x3Al9/iPRkN+9YXMSty2eyceEMTaUhMsUokImMRHydyW9B52Fnwe9rPwtL7wC3ls2RSycUifJabTvPVjXz3N4TdPiDpCa5ueGyGdyyfCbXL5pBulf/DYpMdgpkIucS7IPdm+HVf4+tM3kVXBtbZ1ILfss4C0eivH64g2cqm3lu73HaeoN4PS42LSrk1uXF3HDZDDJTkhJdTBG5CApkImfS3wU7Hoft34G+Nii/2qkRm3eD1pmUCSESW7rp2cpmnq06TktPgGS3i+sWFnDLsmLeuaSI7FSFM5HJQoFMZKjuZmedyZ0/gmAPzH+nUyNWvj7RJRM5q2jUsvtoJ89UHufZqmaafQMkuQ1Xzy/gHYuL2LSwkNI8DTYRmcgUyEQA2mud5Y3efhKiYVh6J1zzaZi5PNElE7kg0ajl7cYunq1ywllDRz8AcwvS2biokI0LC1k3N18jNkUmGAUymd6a3oJXvwX7fguuJLjqr2DDJyFvbqJLJjJq1lrq2vxsOdjKlkOtbK9rJxCO4vW4WDc3n40LC9m0qJA5BekYNcWLJJQCmUw/1kL9y/DKN51JXb1ZsPpjzqz6mUWJLp3IJTMQirC9rp0th5yAVtfqB6A0L9UJZwtnsH5evkZtiiSAAplMH4OTub7yTTi2E9JnwLqPO2FMs+rLNHS0vY8t1a1sOdjKtto2+oIRktyG1RV5bFpUyMaFM1hYlKHaM5FxoEAmU184CJW/dJom2w45k7lu+BRcebez+LeIEAhH2FXfyZZDrbx0sJWDJ3oAKM5OYeNCp+/Z1QsKyNK0GiKXhAKZTF1BP+x+ArY9DN2NULTc6ai/5L2azFXkPJp9/WyNhbNXqtvoCYRxuwwry3LjgwOWFGfhcqn2TGQsKJDJ1NPXAW98D15/DPo7nDnErvmMM4WFml5ELlgoEuWthi5eOtjClkOtVB3rBqAgw8t1CwvYtGgG184vIDc9OcElFZm8FMhk6vAdg9cegV0/hpAfFt7iBLGytYkumciU0toT4OVqp/bs5epWOvtCuAxcUZrDxoWFXDO/gOWzs/F6NLWGyEgpkMnk13rImUNsz8/BRmH5++Hqv4WiJYkumciUF4laKo/54rVnbzV0YS14PS6uKM1hTUUeq+fksbI8lwyN3hQ5KwUymbyO7XJGTO7/PXhSYMVfw4aHIKcs0SUTmbY6/UHeqO9gx+EOdtR3UNXUTSRqcRlYUpLF6oo81lTksaoij8JMb6KLKzJhKJDJ5GIt1L0Er3wDDm91pqtYcz+sfQDSCxJdOhE5hT8Q5s2jXfGQ9mZDJwOhKOCsHrCqItcJaXPyKMtL0xQbMm2NWyAzxtwMfBtwA49ba796yvly4IdAIdABfMha2xg7FwEqY5cetdbedr7PUyCbYqIR2P87p0as+S3ILIb1n4CVHwFvZqJLJyIjFAxHqWryxWvQdtR34usPATAj08vqOU4N2uqKPBbNzMStUZwyTYxLIDPGuIFDwLuARmAH8JfW2n1Drvkl8Htr7WZjzA3AvdbaD8fO9VprMy6kUApkU0So31lfctvD0FELefOc/mFXfBA8au4QmeyiUUt1S++wZs5m3wAAmSkeVpXnxkOaBgrIVDYWgWwkvTTXADXW2rrYh/4MuB3YN+SaJcBnYvsvAr8ZTaFkkuvrgB0/gDceA38rlKyA9/8YFt8GLn0hi0wVLpdh0cxMFs3M5MPryrHW0tjZH68921HfwYsHDwKQ7HFx5ewcVs9xmjlXlueSqYlqReJGEshmAQ1DnjcCp85F8DbwPpxmzTuATGNMvrW2HUgxxuwEwsBXrbVnDGvGmPuB+wHKytSxe1LqPALbH4Xd/+FMXbHgRmdW/YprNIeYyDRgjKE0L43SvDTuXDEbgPbeADuPdMZr0L67pY5HXqzFZWBxsTNQYHVFHstnZVOal6p+aDJtjaTJ8v3ATdba+2LPPwyssdZ+csg1JcDDwBxgK044W2qt9RljSqy1TcaYucALwDustbXn+kw1WU4yzXtg279D1a+d4LX8/bDhk1C0NNElE5EJ5lwDBbJSPCwtyWbZrCyWzcpmaUk2cwrS1RdNJrzxarJsBEqHPJ8NNA29wFrbBNwZK1QG8D5rrW/IOay1dcaYl4CrgHMGMpkEBkdMvvptqHsRkjOdxb7XfRyyZye6dCIyQaV7PVyzoIBrFjgjq4PhKPubu9nb1E1Vk4+9x3xsfu0IwbAT0lKT3CwpyWJZSRZLZ2WzrCSbBUUZJLldifwxRMbcSGrIPDid+t8BHMPp1H+3tXbvkGsKgA5rbdQY8xUgYq39/4wxuUCftTYQu+Y14PahAwLORDVkE1gkDPt+4yz2fbwSMmbCugdg5b2QmpPo0onIFBCKRKlp6XVC2jEfe5t87G3qpi8YASDZ7eKy4kyWlmSztMSpTbtsZiYpSeqjKokxLjVk1tqwMeYh4DmcaS9+aK3da4z5R2CntfZpYBPwz8YYi9Nk+YnYyxcDjxljooALpw/ZOcOYTFBBv9M37LVHwHcUChbCbQ/D5R/QiEkRGVNJbheLi7NYXJzFXSudGvdo1HK43c/epm72HvNR1eTjmcpmnnzjKABul2HBjIxhTZ6Li7O0woBMGpoYVs6tt9UZLbnjcejvhLL1ztQVC24Cl5oMRCRxBkd1DtagVR3zUXmsm7beAOB0aZ2Tnx5r6hzsl5ZFTpoWUpexNV59yGQ6aq+Fbf/XmUcsHIDL3u0EsdI1iS6ZiAgwfFTnzcuK48dbugeoavJRdaybvU0+dh/p5Hdvn+z6PDs3laUlWSwsymRuYTpzCzKYW5iuaTgkoRTIZLjGnU7/sP2/B3cyXPmXsP6TUDA/0SUTERmRGVkp3JCVwg2XFcWPdfqD8YEDVcd87Gvq5k/7W4hET7YSFWZ6mVuQztzCDOYVpsfD2uzcVDwaRCCXmAKZQDQK1X90pq448qqzxuS1n4W1fwMZMxJdOhGRUctNTx42uhOcEZ5HO/zUtvqpa/VT19pLXZufP1Q109kXil+X7HZRlp8WD2tzC9OdwFaQQW66mj9lbCiQTWfhIFT+0glirQcguxRu+mdY8WGtMSkiU16yx8X8GZnMn3H6912nP0hdWy+1rX5qW3upi21fPNhCKHKyVi0vPTkW1GJhLRbayvLSSPaoVk1GToFsOhrwwa4fw/bvQE8zFC2HO78PS+8At/pQiIjkpiezMj2PleV5w46HI1EaOvud2rRWfzy0vXCglV/sbIxf53YZyvLSTgtrFQXpFGR4NdmtnEaBbDrxHYPXvws7fwTBHpizEW5/BObdoKWNRERGwON2MacgnTkF6bxj8fBzvv4Qh9v8w8JaXaufV2raCMQmugXwuAxFWSnMzE6hOP5IdbY5zlahbfpRIJsOmt+GbQ/D3l+DjTo1YRs+BSVXJrpkIiJTRnZqEleW5nBl6fBJsqNRy7Gufura/Bzt6OO4r5/mrgGafQNUHfPx/L4TwwIbnAxtxdlOcCvJSWVmVgolOSnMzE6lJBbaXAptU4YC2VQVjULN887UFfUvQ3IGrPkbp6N+bnmiSyciMm24XCen5zgTay2dfSGaB4Na9wDNXf0c9w3Q5OsfUWgbrFk7tcZNoW3yUCCbakIDsOfnzoz6bQchaxa863/Dynuc0ZMiIjKhGGPIS08mLz2ZpSVn/p4+X2irbOziub0D8TVABw2Gttz0JHJSk8lOSyInNYnctGRy0pLITk0iJ7afE9vPTk3SgIQEUCCbKvxtsOMHsOP74G+FmZero76IyBRxIaGtKRbUmn39NPsGON49QFdfiK6+IE2+fnx9Ibr6Q8PmYDtVerI7Hs5y0pwAlx0PbSfDXe6QMJedloTXo/VEL5YC2WTXVu3Uhr39JIQHnCWNNjwEFdeqo76IyDQyNLQtm3XuFhFrLT2BsBPO+kJ09Qfjoa0rFti6+kL4+oN09oU4cLwbX+xY+BxBLjXJ7QS0tGTSk914k1x4PW68HlfsMXhsyPEh16QknX7sXK+51AMfrLVELUStJWot1oId8jxqnWvGggLZZGStM4Hrtofh0LPg9sIVH4T1n4DCRYkunYiITHDGGLJSkshKSaI07/zXD7LW4g9G6PQH4wHtzGEuSH8oQiAUpbs/TCAcIRCOEghFGQhH4tvRZhmPy5wMcR4XHrcrHpyGbgeDU9RaLM5Ai2HnGHrNydeOJwWyySQSgn2/dTrqN78Fafmw8e9h9X2QUZjo0omIyBRnjCHD6yHD66F0lO9lrSUctbGgFgts4agT3kJn2Q9HGQidDHfxoBe7Lhy1GAMuYzA4W5fLKbfLgCG2NcY5Z5xBF4aT1wwe55Tnxpj4ew8eN7HP+di/jPqPVoFsUhjoht2b4fXHwNcA+QvgPd9yasWSUhNdOhERkQtmjCHJbUhyu8jwTu448rExeI/J/Scw1XU1OBO57trsTORa95k+sAAACitJREFUcS3c+nVYcCO4NAJGRERkqlAgm4ia3oxN5PqfzvNldzr9w0quSmy5RERE5JJQIJsoolGofs4JYkdeAW8WrPs4rH0AckbbUi8iIiITmQJZooX6nSkrXnsU2qshuxRu/Aqs+GtIyUp06URERGQcKJAlSm8L7HjcefS1O82R7/sBLHkvuHVbREREphP9zT/ejlfB9u9A5S+caSwW3QLrH4LyDZrIVUREZJpSIBsP0ShU/xG2PwKHt0JSmtMkufbjUDA/0aUTERGRBFMgu5QCvU7/sO3fgY5aZ6Hvd/6Ds9B3am6iSyciIiIThALZpeBrdCZx3b0ZBnwwaxXc9UNYfJsW+hYREZHTKJCNpYYdsP1RZ3kjgCW3wbpPQOnqxJZLREREJjQFstGKhGH/b51mycYd4M12JnFdc7/mDxMREZERUSC7WP2dsPsJeP170N0IeXPhln+FK+8Gb0aiSyciIiKTiALZhWqrcdaXfOv/QcgPc66Dd38dFtyk9SVFRETkoiiQjYS1znQV2x+FQ885HfOXv99Z2mjm8kSXTkRERCY5BbJzCQ1A1VNO/7ATVZBWABv/DlZ9FDKLEl06ERERmSIUyM6ktwV2/AB2/gD8rTBjKdz+CCy7C5JSEl06ERERmWIUyIY6Xhlb1uiXEAnCwpudZsk5G7WskYiIiFwyCmTRSGxZo0eHLGt0D6x9QMsaiYiIyLiYvoFswAdv/hTeeAw667WskYiIiCTM9AtkbdXOskaD01aUrYd3/i+47D1a1khEREQSYnoEsmgUav/szB9W8ydwJzsd9NfeDyVXJbp0IiIiMs1N7UAW6HFqwl5/DDpqIWMmXP8lWHkvZBQmunQiIiIiwFQNZO218Mb34c2fQLAHZq+G678Ii28DT3KiSyciIiIyzNQJZNZC3Yuw/bvOqEmXB5be4YyWnL0y0aUTEREROavJH8gCvbDnZ84i320HIb0wNpv+vZA5M9GlExERETmvyRvIOuudZsnd/wEBHxRfCXc85tSKebyJLp2IiIjIiE2uQDa4yPfrj8HBZ8DlhiW3x5olV2s2fREREZmUJkcgC/ZB5S+cINayD9Ly4drPwuqPQVZJoksnIiIiMioTO5B1HYUdj8OuzTDQBUXLtci3iIiITDkjCmTGmJuBbwNu4HFr7VdPOV8O/BAoBDqAD1lrG2Pn7gG+HLv0n6y1m8/7gcFe+PmH4cDvneeL/8Jplixbr2ZJERERmXLOG8iMMW7gEeBdQCOwwxjztLV235DLvg48Ya3dbIy5Afhn4MPGmDzgfwKrAAvsir2285wf2lYN9QOw4VOw+j7IKb2oH05ERERkMhhJDdkaoMZaWwdgjPkZcDswNJAtAT4T238R+E1s/ybgeWttR+y1zwM3A0+e8xNzyuAzeyE5bYQ/hoiIiMjk5RrBNbOAhiHPG2PHhnobeF9s/w4g0xiTP8LXni4tX2FMREREpo2RBLIzddqypzz/HLDRGPMmsBE4BoRH+FrnQ4y53xiz0xizs7W1dQTFEhEREZkaRhLIGoGhnbhmA01DL7DWNllr77TWXgV8KXbMN5LXDnmP71lrV1lrVxUWauFvERERmT5GEsh2AAuMMXOMMcnAB4Gnh15gjCkwxgy+1xdwRlwCPAfcaIzJNcbkAjfGjomIiIhIzHkDmbU2DDyEE6T2A7+w1u41xvyjMea22GWbgIPGmENAEfCV2Gs7gP+NE+p2AP842MFfRERERBzG2jN26UqoVatW2Z07dya6GCIiIiLnZYzZZa1dNZr3GEmTpYiIiIhcQgpkIiIiIgmmQCYiIiKSYApkIiIiIgmmQCYiIiKSYApkIiIiIgmmQCYiIiKSYApkIiIiIgk2ISeGNcb0AAcTXQ65KAVAW6ILIRdN92/y0r2b3HT/JrdF1trM0byBZ6xKMsYOjnbGW0kMY8xO3bvJS/dv8tK9m9x0/yY3Y8yolxdSk6WIiIhIgimQiYiIiCTYRA1k30t0AeSi6d5Nbrp/k5fu3eSm+ze5jfr+TchO/SIiIiLTyUStIRMRERGZNsY1kBljbjbGHDTG1Bhj/v4M573GmJ/Hzr9ujKkYcu4LseMHjTE3jWe5xXGx988Y8y5jzC5jTGVse8N4l326G83vXux8mTGm1xjzufEqs5w0yu/Oy40xrxlj9sZ+B1PGs+wyqu/OJGPM5th922+M+cJ4l326G8G9u84Ys9sYEzbG3HXKuXuMMdWxxz3n/TBr7bg8ADdQC8wFkoG3gSWnXPMg8N3Y/geBn8f2l8Su9wJzYu/jHq+y6zHq+3cVUBLbXwYcS/TPM50eo7l3Q87/Cvgl8LlE/zzT7THK3z0PsAe4IvY8X9+dk+r+3Q38LLafBtQDFYn+mabLY4T3rgK4HHgCuGvI8TygLrbNje3nnuvzxrOGbA1QY62ts9YGgZ8Bt59yze3A5tj+U8A7jDEmdvxn1tqAtfYwUBN7Pxk/F33/rLVvWmubYsf3AinGGO+4lFpgdL97GGPei/NlsnecyivDjeb+3Qjssda+DWCtbbfWRsap3OIYzf2zQLoxxgOkAkGge3yKLYzg3llr6621e4DoKa+9CXjeWtthre0EngduPteHjWcgmwU0DHneGDt2xmustWHAh/MvupG8Vi6t0dy/od4HvGmtDVyicsrpLvreGWPSgb8D/mEcyilnNprfvYWANcY8F2tW+R/jUF4ZbjT37ynADzQDR4GvW2s7LnWBJW402eOCXzueM/WbMxw7dYjn2a4ZyWvl0hrN/XNOGrMU+Becf7XL+BnNvfsH4JvW2t5YhZmMv9HcPw9wDbAa6AP+bIzZZa3989gWUc5hNPdvDRABSnCavV42xvzJWls3tkWUsxhN9rjg145nDVkjUDrk+Wyg6WzXxKpos4GOEb5WLq3R3D+MMbOB/wT+2lpbe8lLK0ON5t6tBb5mjKkHPg180Rjz0KUusAwz2u/OLdbaNmttH/AMsOKSl1iGGs39uxv4g7U2ZK1tAV4FtLzS+BlN9rjg145nINsBLDDGzDHGJON0XHz6lGueBgZHItwFvGCd3nFPAx+MjUSZAywA3hincovjou+fMSYH+C/gC9baV8etxDLoou+dtfZaa22FtbYC+Bbwf6y1D49XwQUY3Xfnc8Dlxpi02F/0G4F941RucYzm/h0FbjCOdGAdcGCcyi0ju3dn8xxwozEm1xiTi9My9Nw5XzHOIxZuBQ7hjFr4UuzYPwK3xfZTcEZy1eAErrlDXvul2OsOArckatTFdH5c7P0DvozTD+KtIY8Zif55ptNjNL97Q97jf6FRlpPu/gEfwhmQUQV8LdE/y3R8jOK7MyN2fC9OkP58on+W6fYYwb1bjVMb5gfagb1DXvvR2D2tAe4932dppn4RERGRBNNM/SIiIiIJpkAmIiIikmAKZCIiIiIJpkAmIiIikmAKZCIiIiIJpkAmIiIikmAKZCIiIiIJpkAmIiIikmD/P8ywQo3LRnHfAAAAAElFTkSuQmCC\n",
659 "text/plain": [
660 "<Figure size 720x432 with 1 Axes>"
661 ]
662 },
663 "metadata": {
664 "needs_background": "light"
665 },
666 "output_type": "display_data"
667 }
668 ],
669 "source": [
670 "rates = np.linspace(0, .1, 20)\n",
671 "fr_change = pd.DataFrame({\n",
672 " \"Long Bond\":[erk.funding_ratio(lb_assets, liabilities, r) for r in rates],\n",
673 " \"Short Bond\":[erk.funding_ratio(sb_assets, liabilities, r) for r in rates],\n",
674 " \"Duration Matched Bonds\":[erk.funding_ratio(dm_assets, liabilities, r) for r in rates]\n",
675 "}, index=rates)\n",
676 "fr_change.plot(title='Change in Funding Ratio', figsize=(10,6))"
677 ]
678 },
679 {
680 "cell_type": "markdown",
681 "metadata": {},
682 "source": [
683 "## Conclusion\n",
684 "\n",
685 "We've seen that if you have the assets on hand, you can secure future liabilities by matching the duration of your liabilities with the durations of your assets to immunize yourself against level shifts in the yield curve. In practice, you might also want to protect against changes in the slope and curvature of the yield curve by using convexity hedging, but duration hedging is a simple but essential step towards ensuring that you will have the money to meet your liabilities when interest rates fluctuate.\n"
686 ]
687 },
688 {
689 "cell_type": "code",
690 "execution_count": null,
691 "metadata": {},
692 "outputs": [],
693 "source": []
694 }
695 ],
696 "metadata": {
697 "kernelspec": {
698 "display_name": "Python 3",
699 "language": "python",
700 "name": "python3"
701 },
702 "language_info": {
703 "codemirror_mode": {
704 "name": "ipython",
705 "version": 3
706 },
707 "file_extension": ".py",
708 "mimetype": "text/x-python",
709 "name": "python",
710 "nbconvert_exporter": "python",
711 "pygments_lexer": "ipython3",
712 "version": "3.8.8"
713 }
714 },
715 "nbformat": 4,
716 "nbformat_minor": 2
717 }