{ "metadata": { "name": "", "signature": "sha256:fcaaddd188e30b06b38b51a3082a5955b5e47b89cd9ca393d5eee783031b54c3" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "#Driveby PCAP analysis\n", "
\n", "###Check yo'self before you wreck yo'self\n", "

We sumbled upon a really great collection of PCAPs that were interactions with suspicious websites. Which seemed to lead to the suspicion being correct, and an end system got exploited, or the suspicion was wrong and nothing bad happened. While we do no machine learning in this notebook, there are several techniques that are usful for collecting statistics about features across all the samples. However, when dealing with network traffic it's often very useful to have the additional context that a full session can provide. Here we try to break out of the sample box and begin showing groups of data as viewed by Bro in each network session.\n", "\n", "####Tools\n", " - Bro (http://www.bro.org)\n", " - IPython (http://www.ipython.org)\n", " - pandas (http://pandas.pydata.org)\n", "\n", "####What we did:\n", " - Data gathered with Bro (default Bro content)\n", " - bro -C -r <pcap file> local\n", " - Data cleanup\n", " - Explored the Data!\n", " - Found some patterns\n", " - Exploited the patterns to us find new things!\n", "\n", "####Thanks!\n", " - To the people that we borrowed the data from. Once they get back to me I'll be sure to give proper recognition. :)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# All the imports and some basic level setting with various versions\n", "import IPython\n", "import os\n", "import pylab\n", "import string\n", "import pandas\n", "import pickle\n", "import matplotlib\n", "import collections\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib as plt\n", "from __future__ import division\n", "\n", "print \"IPython version: %s\" %IPython.__version__\n", "print \"pandas version: %s\" %pd.__version__\n", "print \"numpy version: %s\" %np.__version__\n", "print \"matplotlib version: %s\" %plt.__version__\n", "\n", "%matplotlib inline\n", "pylab.rcParams['figure.figsize'] = (16.0, 5.0)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "IPython version: 2.0.0\n", "pandas version: 0.13.0rc1-32-g81053f9\n", "numpy version: 1.6.1\n", "matplotlib version: 1.3.1\n" ] } ], "prompt_number": 78 }, { "cell_type": "code", "collapsed": false, "input": [ "# Mapping of fields of the files we want to read in and initial setup of pandas dataframes\n", "# Borrowed from aonther notebook, this time we're just going to focus on notice and files for starters\n", "# But the rest are here when we need 'em\n", "logs_to_process = {\n", " 'conn.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','proto','service','duration','orig_bytes','resp_bytes','conn_state','local_orig','missed_bytes','history','orig_pkts','orig_ip_bytes','resp_pkts','resp_ip_bytes','tunnel_parents','sample'],\n", " 'dns.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','proto','trans_id','query','qclass','qclass_name','qtype','qtype_name','rcode','rcode_name','AA','TC','RD','RA','Z','answers','TTLs','rejected','sample'],\n", " 'files.log' : ['ts','fuid','tx_hosts','rx_hosts','conn_uids','source','depth','analyzers','mime_type','filename','duration','local_orig','is_orig','seen_bytes','total_bytes','missing_bytes','overflow_bytes','timedout','parent_fuid','md5','sha1','sha256','extracted','sample'],\n", " 'ftp.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','user','password','command','arg','mime_type','file_size','reply_code','reply_msg','data_channel.passive','data_channel.orig_h','data_channel.resp_h','data_channel.resp_p','fuid','sample'],\n", " 'http.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','trans_depth','method','host','uri','referrer','user_agent','request_body_len','response_body_len','status_code','status_msg','info_code','info_msg','filename','tags','username','password','proxied','orig_fuids','orig_mime_types','resp_fuids','resp_mime_types','sample'],\n", " 'irc.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','nick','user','command','value','addl','dcc_file_name','dcc_file_size','dcc_mime_type','fuid','sample'],\n", " 'notice.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','fuid','file_mime_type','file_desc','proto','note','msg','sub','src','dst','p','n','peer_descr','actions','suppress_for','dropped','remote_location.country_code','remote_location.region','remote_location.city','remote_location.latitude','remote_location.longitude','sample'],\n", " 'signatures.log' : ['ts','src_addr','src_port','dst_addr','dst_port','note','sig_id','event_msg','sub_msg','sig_count','host_count','sample'],\n", " 'smtp.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','trans_depth','helo','mailfrom','rcptto','date','from','to','reply_to','msg_id','in_reply_to','subject','x_originating_ip','first_received','second_received','last_reply','path','user_agent','fuids','is_webmail','sample'],\n", " 'ssl.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','version','cipher','server_name','session_id','subject','issuer_subject','not_valid_before','not_valid_after','last_alert','client_subject','client_issuer_subject','cert_hash','validation_status','sample'],\n", " 'tunnel.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','tunnel_type','action','sample'],\n", " 'weird.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','name','addl','notice','peer','sample']\n", " }\n", "\n", "conndf = pd.DataFrame(columns=logs_to_process['conn.log'])\n", "dnsdf = pd.DataFrame(columns=logs_to_process['dns.log'])\n", "filesdf = pd.DataFrame(columns=logs_to_process['files.log'])\n", "ftpdf = pd.DataFrame(columns=logs_to_process['ftp.log'])\n", "httpdf = pd.DataFrame(columns=logs_to_process['http.log'])\n", "ircdf = pd.DataFrame(columns=logs_to_process['irc.log'])\n", "noticedf = pd.DataFrame(columns=logs_to_process['notice.log'])\n", "smtpdf = pd.DataFrame(columns=logs_to_process['smtp.log'])\n", "ssldf = pd.DataFrame(columns=logs_to_process['ssl.log'])\n", "weirddf = pd.DataFrame(columns=logs_to_process['weird.log'])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [ "process_files = ['notice.log','files.log']\n", "for dirName, subdirList, fileList in os.walk('..'):\n", " for fname in fileList:\n", " tags = dirName.split('/')\n", " if len(tags) == 2 and fname in logs_to_process:\n", " logname = fname.split('.')\n", " try:\n", " if fname in process_files:\n", " #print \"Processing %s - %s\" %(tags[1], fname)\n", " tempdf = pd.read_csv(dirName+'/'+fname, sep='\\t',skiprows=8, header=None, \n", " names=logs_to_process[fname][:-1], skipfooter=1)\n", " tempdf['sample'] = tags[1]\n", " if fname == 'conn.log':\n", " conndf = conndf.append(tempdf)\n", " if fname == 'dns.log':\n", " dnsdf = dnsdf.append(tempdf)\n", " if fname == 'files.log':\n", " filesdf = filesdf.append(tempdf)\n", " if fname == 'ftp.log':\n", " ftpdf = ftpdf.append(tempdf)\n", " if fname == 'http.log':\n", " httpdf = httpdf.append(tempdf)\n", " if fname == 'notice.log':\n", " noticedf = noticedf.append(tempdf)\n", " if fname == 'signatures.log':\n", " sigdf = sigdf.append(tempdf)\n", " if fname == 'smtp.log':\n", " smtpdf = smtpdf.append(tempdf)\n", " if fname == 'ssl.log':\n", " ssldf = ssldf.append(tempdf)\n", " if fname == 'tunnel.log':\n", " tunneldf = tunneldf.append(tempdf)\n", " if fname == 'weird.log':\n", " weirddf = weirddf.append(tempdf)\n", " except Exception as e:\n", " print \"[*] error: %s, on %s/%s\" % (str(e), dirName, fname)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 25 }, { "cell_type": "code", "collapsed": false, "input": [ "#You can use these to save a copy of the raw dataframe, because reading in the files over-and-over again is awful\n", "#pickle.dump(filesdf, open('files.dataframe', 'wb'))\n", "filesdf = pickle.load(open('files.dataframe', 'rb'))\n", "#pickle.dump(noticedf, open('notice.dataframe', 'wb'))\n", "noticedf = pickle.load(open('notice.dataframe', 'rb'))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 26 }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Well, it took a while to get the data read into the dataframes let's take a quick peek at what it looks like. If everything looks pretty, or at least how we'd expect we can move on with some analysis." ] }, { "cell_type": "code", "collapsed": false, "input": [ "noticedf.head(3)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "

\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tsuidid.orig_hid.orig_pid.resp_hid.resp_pfuidfile_mime_typefile_descprotonotemsgsubsrcdstpnpeer_descractionssuppress_for
0 1.338423e+09 C2cBNO2DuqzRxvfac6 192.168.88.10 1068 195.210.47.109 80 FEdFLYNt00bHPa9sb application/x-dosexec http://navozmi.ipq.co/f/1100.exe?ts=405b7ca&af... tcp TeamCymruMalwareHashRegistry::Match Malware Hash Registry Detection rate: 33% Las... https://www.virustotal.com/en/search/?query=85... 192.168.88.10 195.210.47.109 80 - bro Notice::ACTION_LOG 3600...
0 1.336524e+09 Cbs89uRcl9HnSASEc 192.168.15.10 1104 85.17.147.215 80 FaeRAd49IO4E2V2ndb application/x-dosexec http://mybisyo.com/w.php?f=96ece&e=2 tcp TeamCymruMalwareHashRegistry::Match Malware Hash Registry Detection rate: 24% Las... https://www.virustotal.com/en/search/?query=bc... 192.168.15.10 85.17.147.215 80 - bro Notice::ACTION_LOG 3600...
1 1.336524e+09 Cpcwv13LGlszc39oQc 192.168.15.10 1105 85.17.147.215 80 F2ZPuu3GQcfZNFezk application/x-shockwave-flash http://mybisyo.com/data/field.swf tcp TeamCymruMalwareHashRegistry::Match Malware Hash Registry Detection rate: 60% Las... https://www.virustotal.com/en/search/?query=d6... 192.168.15.10 85.17.147.215 80 - bro Notice::ACTION_LOG 3600...
\n", "

3 rows \u00d7 27 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 27, "text": [ " ts uid id.orig_h id.orig_p id.resp_h \\\n", "0 1.338423e+09 C2cBNO2DuqzRxvfac6 192.168.88.10 1068 195.210.47.109 \n", "0 1.336524e+09 Cbs89uRcl9HnSASEc 192.168.15.10 1104 85.17.147.215 \n", "1 1.336524e+09 Cpcwv13LGlszc39oQc 192.168.15.10 1105 85.17.147.215 \n", "\n", " id.resp_p fuid file_mime_type \\\n", "0 80 FEdFLYNt00bHPa9sb application/x-dosexec \n", "0 80 FaeRAd49IO4E2V2ndb application/x-dosexec \n", "1 80 F2ZPuu3GQcfZNFezk application/x-shockwave-flash \n", "\n", " file_desc proto \\\n", "0 http://navozmi.ipq.co/f/1100.exe?ts=405b7ca&af... tcp \n", "0 http://mybisyo.com/w.php?f=96ece&e=2 tcp \n", "1 http://mybisyo.com/data/field.swf tcp \n", "\n", " note \\\n", "0 TeamCymruMalwareHashRegistry::Match \n", "0 TeamCymruMalwareHashRegistry::Match \n", "1 TeamCymruMalwareHashRegistry::Match \n", "\n", " msg \\\n", "0 Malware Hash Registry Detection rate: 33% Las... \n", "0 Malware Hash Registry Detection rate: 24% Las... \n", "1 Malware Hash Registry Detection rate: 60% Las... \n", "\n", " sub src \\\n", "0 https://www.virustotal.com/en/search/?query=85... 192.168.88.10 \n", "0 https://www.virustotal.com/en/search/?query=bc... 192.168.15.10 \n", "1 https://www.virustotal.com/en/search/?query=d6... 192.168.15.10 \n", "\n", " dst p n peer_descr actions suppress_for \n", "0 195.210.47.109 80 - bro Notice::ACTION_LOG 3600 ... \n", "0 85.17.147.215 80 - bro Notice::ACTION_LOG 3600 ... \n", "1 85.17.147.215 80 - bro Notice::ACTION_LOG 3600 ... \n", "\n", "[3 rows x 27 columns]" ] } ], "prompt_number": 27 }, { "cell_type": "code", "collapsed": false, "input": [ "filesdf.head()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tsfuidtx_hostsrx_hostsconn_uidssourcedepthanalyzersmime_typefilenamedurationlocal_origis_origseen_bytestotal_bytesmissing_bytesoverflow_bytestimedoutparent_fuidmd5
0 1.320786e+09 FDbQJR35HG4EfZ0nb4 75.119.221.151 192.168.41.10 C9KyD7n902u8uko9j HTTP 0 SHA1,MD5 text/html - 0.000024 - F 4305 - 0 0 F - 8b07497c411ce08842cf2145380d238e...
1 1.320786e+09 Fhv2Jx2f5EiIs52jf4 75.119.221.151 192.168.41.10 C9KyD7n902u8uko9j HTTP 0 SHA1,MD5 text/plain - 0.000323 - F 3233 3233 0 0 F - db8f4e6949c0fc0fc9cadf85d02e099a...
2 1.320786e+09 FUJQ4k1k9m9EUOiDL5 31.31.74.239 192.168.41.10 CaTFVw42sBoMSa9Zcl HTTP 0 SHA1,MD5 text/html - 0.000000 - F 2717 2717 0 0 F - b030b8e337724d4a2786041a38c0951f...
3 1.320786e+09 F7p0uQ1a9czI7BIwW4 69.31.75.17 192.168.41.10 CgQksU3fAxqa2VzJmi HTTP 0 SHA1,MD5 text/html - 0.000000 - F 1567 1567 0 0 F - 644a4a82d7580c2cf9f97e13b0ee1ced...
4 1.320786e+09 FitWMF3UfEasz2Vyql 75.119.221.151 192.168.41.10 C9KyD7n902u8uko9j HTTP 0 SHA1,MD5 application/x-shockwave-flash - 1.356016 - F 1177469 1177469 0 0 F - c2045c6a5e95a99f6ebbc073e62894cd...
\n", "

5 rows \u00d7 24 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 28, "text": [ " ts fuid tx_hosts rx_hosts \\\n", "0 1.320786e+09 FDbQJR35HG4EfZ0nb4 75.119.221.151 192.168.41.10 \n", "1 1.320786e+09 Fhv2Jx2f5EiIs52jf4 75.119.221.151 192.168.41.10 \n", "2 1.320786e+09 FUJQ4k1k9m9EUOiDL5 31.31.74.239 192.168.41.10 \n", "3 1.320786e+09 F7p0uQ1a9czI7BIwW4 69.31.75.17 192.168.41.10 \n", "4 1.320786e+09 FitWMF3UfEasz2Vyql 75.119.221.151 192.168.41.10 \n", "\n", " conn_uids source depth analyzers mime_type \\\n", "0 C9KyD7n902u8uko9j HTTP 0 SHA1,MD5 text/html \n", "1 C9KyD7n902u8uko9j HTTP 0 SHA1,MD5 text/plain \n", "2 CaTFVw42sBoMSa9Zcl HTTP 0 SHA1,MD5 text/html \n", "3 CgQksU3fAxqa2VzJmi HTTP 0 SHA1,MD5 text/html \n", "4 C9KyD7n902u8uko9j HTTP 0 SHA1,MD5 application/x-shockwave-flash \n", "\n", " filename duration local_orig is_orig seen_bytes total_bytes \\\n", "0 - 0.000024 - F 4305 - \n", "1 - 0.000323 - F 3233 3233 \n", "2 - 0.000000 - F 2717 2717 \n", "3 - 0.000000 - F 1567 1567 \n", "4 - 1.356016 - F 1177469 1177469 \n", "\n", " missing_bytes overflow_bytes timedout parent_fuid \\\n", "0 0 0 F - \n", "1 0 0 F - \n", "2 0 0 F - \n", "3 0 0 F - \n", "4 0 0 F - \n", "\n", " md5 \n", "0 8b07497c411ce08842cf2145380d238e ... \n", "1 db8f4e6949c0fc0fc9cadf85d02e099a ... \n", "2 b030b8e337724d4a2786041a38c0951f ... \n", "3 644a4a82d7580c2cf9f97e13b0ee1ced ... \n", "4 c2045c6a5e95a99f6ebbc073e62894cd ... \n", "\n", "[5 rows x 24 columns]" ] } ], "prompt_number": 28 }, { "cell_type": "code", "collapsed": false, "input": [ "noticedf.note.value_counts()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 29, "text": [ "TeamCymruMalwareHashRegistry::Match 7212\n", "Scan::Address_Scan 105\n", "SSL::Invalid_Server_Cert 105\n", "dtype: int64" ] } ], "prompt_number": 29 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Everything checks out nicely, and we've got a super-high-level view of what kinds of alerts were generated by Bro. I have a feeling the Team Cymru MHR results will come in handy if we want to get a feel for what's being detected vs. what's sneaking past the goalie.\n", "
" ] }, { "cell_type": "code", "collapsed": false, "input": [ "hashes = set()\n", "def grab_hash(s):\n", " if 'virustotal' in s:\n", " hashes.add(s.split('=')[1])\n", " return ''\n", "\n", "throwaway = noticedf['sub'].map(grab_hash)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 30 }, { "cell_type": "code", "collapsed": false, "input": [ "def box_plot_df_setup(series_a, series_b): \n", " # Count up all the times that a category from series_a\n", " # matches up with a category from series_b. This is\n", " # basically a gigantic contingency table\n", " cont_table = collections.defaultdict(lambda : collections.Counter())\n", " for val_a, val_b in zip(series_a.values, series_b.values):\n", " cont_table[val_a][val_b] += 1\n", " \n", " # Create a dataframe\n", " # A dataframe with keys from series_a as the index, series_b_keys\n", " # as the columns and the counts as the values.\n", " dataframe = pd.DataFrame(cont_table.values(), index=cont_table.keys())\n", " dataframe.fillna(0, inplace=True)\n", " return dataframe" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 31 }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Everybody loves a good stacked bar graph. Here we can get a general feel for the data and there seem to be a lot of files! Apparently in some of the driveby activities some malware was (probably) run and grabbed something from an FTP site" ] }, { "cell_type": "code", "collapsed": false, "input": [ "ax = box_plot_df_setup(filesdf['source'], filesdf['mime_type']).T.plot(kind='bar', stacked=True)\n", "pylab.xlabel('Mime-Type')\n", "pylab.ylabel('Number of Files')\n", "patches, labels = ax.get_legend_handles_labels()\n", "ax.legend(patches, labels, title=\"Service Type\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 32, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAA8IAAAHwCAYAAABtxtYiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl4lOW9//HPQBBtSQiklS2WYAlSMJKwBI7L1QACkRak\nhwqiP1atihVR0YJaFDxV0NNWxRqtNipoZVGrgFbEUlygsghErXEJSBRCpJawRFk08Pz+oJkDhDHb\nPZkvud+v68olM8m88zwzTzA383xnQkEQBAIAAAAAwBMNYr0BAAAAAADUJRbCAAAAAACvsBAGAAAA\nAHiFhTAAAAAAwCsshAEAAAAAXmEhDAAAAADwStQWwvv371fPnj2Vnp6uTp066eabb5YklZSUqF+/\nfurQoYP69++vXbt2hW8zY8YMpaamqmPHjlq6dGn4+nXr1iktLU2pqamaOHFi+PoDBw5o+PDhSk1N\nVa9evfTpp5+GPzd79mx16NBBHTp00Jw5c6K1mwAAAACAE0zUFsInn3yyli9frry8PL377rtavny5\nVqxYoZkzZ6pfv376+OOP1bdvX82cOVOSlJ+fr/nz5ys/P19LlizR1VdfrfK3OB4/frxyc3NVUFCg\ngoICLVmyRJKUm5urpKQkFRQU6Prrr9fkyZMlHV5s33HHHVqzZo3WrFmj6dOnH7XgBgAAAAD4K6qn\nRn/nO9+RJH399dc6ePCgmjVrpkWLFmn06NGSpNGjR+uFF16QJC1cuFAjRoxQo0aNlJKSovbt22v1\n6tUqLi5WaWmpMjMzJUmjRo0K3+bI1tChQ7Vs2TJJ0iuvvKL+/fsrMTFRiYmJ6tevX3jxDAAAAADw\nW1QXwocOHVJ6erpatGih3r17q3Pnztq+fbtatGghSWrRooW2b98uSdq2bZuSk5PDt01OTlZRUVGF\n69u0aaOioiJJUlFRkU477TRJUlxcnJo2baodO3ZEbAEAAAAAEBfNeIMGDZSXl6fdu3drwIABWr58\n+VGfD4VCCoVC0dwEAAAAAACOEtWFcLmmTZvqJz/5idatW6cWLVro888/V8uWLVVcXKxTTz1V0uFn\nerds2RK+zdatW5WcnKw2bdpo69atFa4vv81nn32m1q1bq6ysTLt371ZSUpLatGmj1157LXybLVu2\nqE+fPhW2q3379tq0aVOU9hoAAAAAEEtdunRRXl5eheujdmr0v//97/ALVO3bt0+vvvqqMjIyNHjw\nYM2ePVvS4Vd2HjJkiCRp8ODBmjdvnr7++mtt3rxZBQUFyszMVMuWLZWQkKDVq1crCAI9+eSTuvDC\nC8O3KW89++yz6tu3rySpf//+Wrp0qXbt2qWdO3fq1Vdf1YABAyps46ZNmxQEQaUft99+e5W+7kRu\nWd42qy3L28Z+xr7nQ8vytrGfse9ZbVneNqsty9vGfsa+50PL8raxn5V/vPPOO8ddr0btGeHi4mKN\nHj1ahw4d0qFDhzRy5Ej17dtXGRkZGjZsmHJzc5WSkqIFCxZIkjp16qRhw4apU6dOiouLU05OTvi0\n6ZycHI0ZM0b79u3TwIEDlZ2dLUm67LLLNHLkSKWmpiopKUnz5s2TJDVv3lxTp05Vjx49JEm33367\nEhMTa7wvhYWFtbgnToyW654PLdc9qy3XPast1z0fWq57Vluue1ZbrntWW657PrRc96y2XPestlz3\nfGi57lltue5ZbZWL2kI4LS1N69evr3B98+bN9be//e24t7nlllt0yy23VLi+W7dueu+99ypc37hx\n4/BC+lhjx47V2LFjq7nVAAAAAID6ruG0adOmxXojYmX69Omqyu4nJiYqJSXFyfe02nLd86Hlume1\n5bpnteW650PLdc9qy3XPast1z2rLdc+Hluue1ZbrntWW654PLdc9qy3XPSutSGu+UBAEQe0268QV\nCoXk8e4DAAAAQL0Wac0X1fcRri+OfAXq+tpy3fOh5bpnteW6Z7XluudDy3XPast1z2rLdc9qy3XP\nh5brntWW657VluueD61IvebNm4ffDpaP2H80b968Wo9pnbx9EgAAAADUJzt37uTsUkPKX2i5yl/P\nqdHe7j4AAACAGmItYUukx4NTowEAAAAAEAvhKrE6r8C8SGxbrntWW657Vluuez60XPestlz3rLZc\n96y2XPd8aLnuWW257lltue750IpGD7HHQhgAAAAAYuzOO+/UmWeeqS5duigjI0Nr1qxx0r399tu1\nbNmyGt9+x44dysjIUEZGhlq1aqXk5GRlZGSoa9eu+uabb5xsYywwI+zv7gMAAACoIZdribfeekuT\nJk3S66+/rkaNGqmkpEQHDhxQq1atqnT7gwcPqmHDhk625dtMnz5d8fHxuuGGG6L+vaqLGWEAAAAA\nOIF8/vnn+t73vqdGjRpJOvzWTOWL4HXr1ikrK0vdu3dXdna2Pv/8c0lSVlaWrr/+evXo0UN33nmn\nUlJSwgu+r776Sj/4wQ9UVlamMWPG6LnnnpMkrV27Vuecc47S09PVs2dPffXVVzp48KBuuukmZWZm\nqkuXLnrkkUe+dVuDIFBpaanatWunsrIySdKePXt0+umnq6ysTFlZWbruuuuUkZGhtLQ0rV27NrxN\n48aNU8+ePdW1a1ctWrTI/R1ZDSyEq8DqvILl2QcfWq57Vluue1Zbrns+tFz3rLZc96y2XPestlz3\nfGi57lltue5Zbbnu+dCKRu9Y/fv315YtW3TGGWfol7/8pd544w1J0jfffKMJEyboueee09tvv62x\nY8fq1ltvlXT4mc5vvvlGa9eu1W233ab09HS9/vrrkqQXX3xR2dnZiouLC7/P7tdff62LL75Ys2bN\nUl5enpYtW6aTTz5Zubm5SkxM1Jo1a7RmzRo9+uijKiws/NbtjY+PV+/evfXSSy9JkubNm6ehQ4eG\nv9++ffu0YcMG5eTkaNy4cZIOn/rdt29frV69Wn//+9910003ae/evVG6RyvHQhgAAAAAYui73/2u\n1q1bp0ceeUTf//73NXz4cM2ePVsfffSR3n//fZ1//vnKyMjQnXfeqaKiovDthg8fftSf58+fL+nw\nwvTIzwVBoI8++kitWrVSt27dJElNmjRRw4YNtXTpUs2ZM0cZGRnq1auXSkpKtHHjxkq3+fLLL9fj\njz8uSXriiSc0duzY8OdGjBghSTrvvPO0Z88e7d69W0uXLtXMmTOVkZGh3r1768CBA9qyZUst7rXa\nYUbY390HAAAAUEPRXEs899xzmj17tu666y5dccUV+sc//lHha3r37q3f/e536tq1qyTpyy+/VFpa\nmtavX6/09HQVFhYqFApp7Nix+ulPf6ozzjhDV111lVasWHFU5+c//7muvPJK9evXr9Ltmj59upo0\naaJJkyZJktLT03Xfffdp8uTJWr16dXi7br/9dmVlZUmS2rZtq/fee099+vTR3LlzlZqaWpu7JiJm\nhAEAAADgBPLxxx+roKAgfHnDhg1KSUnRGWecoS+++EKrVq2SdPhU6fz8/OM2mjRpoh49eujaa6/V\noEGDFAqFwp8LhUI644wzVFxcrLfffluSVFpaqoMHD2rAgAHKyckJz/t+/PHHVT5ledSoUbr00kvD\npz+XK39mesWKFUpMTFRCQoIGDBigWbNmHbWPscRCuAqszitYnn3woeW6Z7Xlume15brnQ8t1z2rL\ndc9qy3XPast1z4eW657Vluue1Zbrng+taPSO9eWXX2rMmDHq3LmzunTpog8//FDTpk1To0aN9Oyz\nz2ry5MlKT09XRkaG3nrrrYid4cOH6+mnnz7qtOhyjRo10vz58zVhwgSlp6drwIABOnDggC6//HJ1\n6tRJXbt2VVpamsaPHx9eFB/PkQvsSy65RDt37gyfCl3u5JNPVteuXXX11VcrNzdXkjR16lR98803\nOuuss3TmmWfq9ttvr+7d5FRcTL87AAAAAHiua9euWrly5XE/16VLl/CLYB1p+fLlFa4bOnSoDh48\neNR15XO8ktS9e/fjLqTvvPNO3XnnnZVu57GL1xUrVuiiiy5SQkLCUdePHDlS995771HXnXzyyXr4\n4Ycr/R51hRlhf3cfAAAAQA35vpaYMGGCXnnlFf31r39V+/btw9cfO7tcV6o7I8xC2N/dBwAAAFBD\nrCVs4cWyosDqvILl2QcfWq57Vluue1Zbrns+tFz3rLZc96y2XPestlz3fGi57lltue5Zbbnu+dCK\nRg+xx0IYAAAAAOAVTo32d/cBAAAA1BBrCVs4NRoAAAAAgG/BQrgKrM4rWJ598KHlume15bpnteW6\n50PLdc9qy3XPast1z2rLdc+Hluue1ZbrntWW654PrWj0EHsshAEAAAAAXmFG2N/dBwAAAFBDx1tL\nJCQ0V2npzqh9z/j4ZtqzpyRq/RMZM8IAAAAAEAOHF8FB1D6qsshOSUnRd77zHcXHxys+Pl4NGzZU\nw4YNFR8fr1NOOUVxcXHhz6WlpUmSGjRooCZNmig+Pl7JycmaNGmSDh06VKXvk5CQoGbNmumcc87R\nH//4x+MuOrOystS8eXN98803kqSrrroqvA2NGzfWSSedFL78k5/8RJIUBIFOP/10de7cudJ9rgkW\nwlVgdV7B8uyDDy3XPast1z2rLdc9H1que1ZbrntWW657Vluuez60XPestlz3rLZc93xoRaMXTaFQ\nSC+++KJKS0tVWlqqgwcP6uDBgyotLdXDDz+ss88+O/y59957L3y7d999V6WlpVq2bJmefvppPfro\no1X6Pnv27NFnn32mKVOm6O6779Zll1121NcVFhZqzZo1OvXUU7Vw4UJJ0sMPPxzehltuuUUXX3xx\n+PJLL70kSXrjjTd04MABffHFF3r77bcd30sshAEAAADAC0EQVDoaesYZZ+i8887T+++/X+VufHy8\nBg0apPnz52v27NlH3XbOnDk6//zzNXLkSM2ePbvK2zR79mwNHTpUF1544XFvV1vMCPu7+wAAAABq\n6HhriVAopMOnMUftu1a6fmnXrp3+9Kc/qW/fvhU+98QTTyg3N1dvvvnmUdc3aNBABQUF+uEPf6j8\n/Hz17dtXd911l8aOHfut3yc3N1d9+vQ56vq2bdvq5ptv1lVXXSVJat++vaZPn67MzEx17txZW7du\n1amnnhr++mnTpmnTpk168sknw9ft3btXrVq10l//+lft3btXl1xyibZt26ZGjRpFvmeYEQYAAAAA\nPwVBoCFDhqhZs2Zq1qyZ/vu//7tKt+vatauaN2+uwYMH6xe/+IXGjBlTo+/funVr7dx5eJZ5xYoV\nKioq0uDBg5WamqpOnTrp6aefrrTxl7/8RQkJCTrnnHPCC+3yU6ZdYSFcBVbnFSzPPvjQct2z2nLd\ns9py3fOh5bpnteW6Z7Xlume15brnQ8t1z2rLdc9qy3XPh1Y0etEUCoW0cOFC7dy5Uzt37tRf/vKX\nKt1uw4YNKikp0caNG3XHHXf859nt6tu6dauaN28u6fDpzf3791d8fLwk6aKLLqrSac6zZ88OL+Ab\nNmyoIUOGOD89Os5pDQAAAADgpbVr12rbtm0699xztW/fPi1YsECHDh1Sq1atJEkHDhzQrl279O67\n7+qss86SpAoL7q1bt+rvf/+71q5dqwULFkg6fKr0/v37tWPHDiUlJTnZVmaE/d19AAAAADVk9X2E\nI83uSt8+I7xx40adfvrpVd6WI2eR9+zZozfeeEPXXXedzj33XD3xxBOaO3eurrnmGr3zzjs66aST\nJB0+bXvYsGHq0aOHfvvb30qqOCM8Y8YMPfXUU1q+fHn4ewVBoLPPPlvXX3+9rrnmmuNuT3VnhHlG\nGAAAAAAcqGyRGmuhUOi4pzzX9DToQYMGKS4uTg0aNFDnzp01adKk8ItkzZkzR+PGjVNycvJRt7nm\nmms0ceJE3XPPPWrQoEGFbZozZ46uueaao15QSzr83sPln3Mi8FhVd3/58uXOvqfVluueDy3XPast\n1z2rLdc9H1que1ZbrntWW657Vluuez60XPestlz3rLZc93xoRep5vpQyJ9LjEel6XiwLAAAAAOAV\nZoT93X0AAAAANVTf1xKfffaZOnfuXOH6UCik/Pz8Cqc8x1p1Z4RZCPu7+wAAAABqiLWELdVdCEft\n1OgtW7aod+/e6ty5s84880zNmjVL0uFXBUtOTlZGRoYyMjL08ssvh28zY8YMpaamqmPHjlq6dGn4\n+nXr1iktLU2pqamaOHFi+PoDBw5o+PDhSk1NVa9evfTpp5+GPzd79mx16NBBHTp00Jw5c2q1L1bf\n08zy+6P50HLds9py3bPact3zoeW6Z7Xlume15bpnteW650PLdc9qy3XPast1z4dWNHqIvai9anSj\nRo107733Kj09XV9++aW6deumfv36KRQK6YYbbtANN9xw1Nfn5+dr/vz5ys/PV1FRkc4//3wVFBQo\nFApp/Pjxys3NVWZmpgYOHKglS5YoOztbubm5SkpKUkFBgebPn6/Jkydr3rx5Kikp0R133KF169ZJ\nkrp166bBgwcrMTExWrsLAAAAADhB1Nmp0UOGDNE111yjlStXqkmTJpo0adJRn58xY4YaNGigyZMn\nS5Kys7M1bdo0tW3bVn369NEHH3wgSZo3b55ee+01Pfzww8rOztb06dPVs2dPlZWVqVWrVvriiy80\nd+5cvfHGG3rooYckHX6p7aysLF188cVHfU9OZwAAAPBTQmKCSneXfuvXxDeN155de+poi3CiYS1h\ni8n3ES4sLNSGDRvUq1cvrVy5Ug888IDmzJmj7t2763e/+50SExO1bds29erVK3yb5ORkFRUVqVGj\nRkcNYrdp00ZFRUWSpKKiIp122mmHdyQuTk2bNtWOHTu0bdu2o25T3gIAAAAkHV4ET6vka6Z9+0IZ\nwIkr6gvhL7/8Uj//+c91//33q0mTJho/frxuu+02SdLUqVM1adIk5ebmRnszIhozZoxSUlIkSYmJ\niUpPT1dWVpako2cBsrKywpeP/Xx1Lufl5em6666r8e2PvHzfffcdd3st9I6972rTO7Zp5f63/Hi6\nvP95PGvWs/p4Htu01LN6/7vu8XjyeJ5o97/lx7M293/Y5v/8t90Rfy6/XIvtO3Ybrdz/9fXxjOb9\n/2092FJ+fO/atUvS4SdkI3L3FsYVff3110H//v2De++997if37x5c3DmmWcGQRAEM2bMCGbMmBH+\n3IABA4JVq1YFxcXFQceOHcPXP/3008FVV10V/pq33norCIIg+Oabb4Lvfe97QRAEwdy5c4Mrr7wy\nfJsrrrgimDdvXoXvX9Xdt/rm3ry5emxbrntWW657Vluuez60XPestlz3rLZc96y2XPd8aLnuWWlJ\n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\nqjp27KilS5eGr1+3bp3S0tKUmpqqiRMnhq8/cOCAhg8frtTUVPXq1Uuffvpp+HOzZ89Whw4d1KFD\nB82ZM6dK2wsAAAAAqP8qnRGujTfffFNNmjTRqFGjwjPF06dPV3x8vG644YajvjY/P1+XXHKJ1q5d\nq6KiIp1//vkqKChQKBRSZmam/vCHPygzM1MDBw7Utddeq+zsbOXk5Oif//yncnJyNH/+fD3//POa\nN2+eSkpK1KNHD61bt06S1K1bN61bt06JiYlH7zwzwgAA1GvMCCMSZoQBP9R4Rrg2zjvvPDVr1qzC\n9cfbkIULF2rEiBFq1KiRUlJS1L59e61evVrFxcUqLS1VZmamJGnUqFF64YUXJEmLFi3S6NGjJUlD\nhw7VsmXLJEmvvPKK+vfvr8TERCUmJqpfv35asmRJtHYTAAAAAHACiepCOJIHHnhAXbp00WWXXRZ+\nIa5t27YpOTk5/DXJyckqKiqqcH2bNm1UVFQkSSoqKtJpp50mSYqLi1PTpk21Y8eOiK2asnp+OzMB\nsW257lltue5Zbbnu+dBy3bPact2z2nLds9qSZHZ202rLdc9qSxIzwrTqpGe15bpntVUu7ts+WVZW\nps6dO+ujjz5y9g3Hjx+v2267TZI0depUTZo0Sbm5uc761TVmzBilpKRIkhITE5Wenq6srCxJFe/w\n8svHfr46l/Py8mp1+yMv5+Xl1Xp7otlzdbmctfvf+uNp9XI5a/e/L49nOYs9y/c/j2f1L1t6PMML\nknb/+e/nx1z+z23q0+PJ349Vv78rHB/HXK5xL0I/1vd/fX08o/nz5Lpn+f6vD49nXl5e+MnWwsJC\nRVLpjPCFF16oWbNmqW3btt/2ZREVFhZq0KBBx33f4SM/N3PmTEnSlClTJEnZ2dmaPn262rZtq969\ne+uDDz6QJM2dO1dvvPGGHnroIWVnZ2vatGnq1auXysrK1KpVK33xxReaN2+eXnvtNT388MOSpCuv\nvFJ9+vTR8OHDj955ZoQBAKjXmBFGJMwIA36o8YxwSUmJOnfurD59+mjQoEEaNGiQBg8eXOMNKS4u\nDv/5+eefD7+i9ODBgzVv3jx9/fXX2rx5swoKCpSZmamWLVsqISFBq1evVhAEevLJJ3XhhReGbzN7\n9mxJ0rPPPqu+fftKkvr376+lS5dq165d2rlzp1599VUNGDCgxtsMAAAAAKg/Kl0I/8///I9efPFF\n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\nr1Z8fHxdb1vUMSMMAEDtWZ6PZA4UkXBsAH6ItOaLeGr073//exUVFek3v/mNWrdurfj4+PBHQkLN\n3hYAAAAAAIBYi7gQPnTokPbv36/S0tIKH3v27KnLbYw5q+e3MxMQ25brntWW657VluueDy3XPast\n1z2rLec9w/ORPsyBWj42rLYkeXFsuO750HLds9py3bPaKhdxIQwAAAAAQH0UcUbYB8wIAwBQe5bn\nI5kDRSQcG4Afqj0j7MK4cePUokULpaWlha8rKSlRv3791KFDB/Xv31+7du0Kf27GjBlKTU1Vx44d\ntXTp0vD169atU1pamlJTUzVx4sTw9QcOHNDw4cOVmpqqXr166dNPPw1/bvbs2erQoYM6dOigOXPm\nRHM3AQAAAAAnkKguhMeOHaslS5Ycdd3MmTPVr18/ffzxx+rbt69mzpwpScrPz9f8+fOVn5+vJUuW\n6Oqrrw6v3MePH6/c3FwVFBSooKAg3MzNzVVSUpIKCgp0/fXXa/LkyZIOL7bvuOMOrVmzRmvWrNH0\n6dOPWnBXl9Xz25kJiG3Ldc9qy3XPast1z4eW657Vluue1ZbznuH5SB/mQC0fG1Zbkrw4Nlz3fGi5\n7lltue5ZbZWL6kL4vPPOq/C+w4sWLdLo0aMlSaNHj9YLL7wgSVq4cKFGjBihRo0aKSUlRe3bt9fq\n1atVXFys0tJSZWZmSpJGjRoVvs2RraFDh2rZsmWSpFdeeUX9+/dXYmKiEhMT1a9fvwoLcgAAAACA\nn6I+I1xYWKhBgwbpvffekyQ1a9ZMO3fulHR4RqJ58+bauXOnJkyYoF69eunSSy+VJF1++eW64IIL\nlJKSoilTpujVV1+VJL355pu65557tHjxYqWlpemVV15R69atJSm8eH7iiSe0f/9+3XrrrZKk3/zm\nNzrllFM0adKko3eeGWEAAGrN8nwkc6CIhGMD8ENMZoQrEwqFDv/FAQAAAABAHYmr62/YokULff75\n52rZsqWKi4t16qmnSpLatGmjLVu2hL9u69atSk5OVps2bbR169YK15ff5rPPPlPr1q1VVlam3bt3\nKykpSW3atDnqPPItW7aoT58+x92eMWPGKCUlRZKUmJio9PR0ZWVlSTr6XPSsrKzw5WM/X53LeXl5\nuu6662p8+yMv33fffcfdXgu9Y++72vSObVq5/y0/ni7vfx7PmvWsPp7HNi31rN7/rnv18fGUdHge\n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\nooUkqUWLFtq+fbskadu2bUpOTg7fNjk5WUVFRRWub9OmjYqKiiRJRUVFOu200yRJcXFxatq0qUpK\nSupk3wAAAAAAdsXF6huvXLlSrVq10hdffKF+/fqpY8eOR30+FAodnreIsjFjxiglJUWSlJiYqPT0\ndGVlZUn6v395cH25XG175de52j6XvaysrKjdf1buf8uPp+v7n8ezfj2eli+Xs3T/u+7Vx8dT0uFn\nv9od8ecjHXO5ru//8Pcv375jt7eK/Qr70+4/H8fpuzz+Yv3zZPnnszY/T2GVPJ616h3ncqzv//r6\neJ5ol8tZuv9d92L1eObl5WnXrl2SpMLCQkUSsxfLOtL06dPVpEkTPfroo3rttdfUsmVLFRcXq3fv\n3vrwww/Ds8JTpkyRJGVnZ2v69Olq27atevfurQ8++ECSNHfuXL3xxht66KGHlJ2drWnTpqlXr14q\nKysLL7qPxItlAQBQe5ZfKIgXREIkHBuAH0y9WNbevXtVWloqSfrqq6+0dOlSpaWlafDgwZo9e7Yk\nafbs2RoyZIgkafDgwZo3b56+/vprbd68WQUFBcrMzFTLli2VkJCg1atXKwgCPfnkk7rwwgvDtylv\nPfvss+rbt2+Nt7fCv/TVgtWW654PLdc9qy3XPast1z0fWq57Vluue1ZbznuG5yN9mAO1fGxYbUny\n4thw3fOh5bpnteW6Z7VVLianRm/fvl0/+9nPJEllZWW69NJL1b9/f3Xv3l3Dhg1Tbm5u+O2TJKlT\np04aNmyYOnXqpLi4OOXk5IRPm87JydGYMWO0b98+DRw4UNnZ2ZKkyy67TCNHjlRqaqqSkpI0b968\nWOwqAAAAAMAYE6dGxwqnRgMAUHuWTwvl9FdEwrEB+MHUqdEAAAAAAMQKC+EqsHp+OzMBsW257llt\nue5Zbbnu+dBy3bPact2z2nLeMzwf6cMcqOVjw2pLkhfHhuueDy3XPast1z2rrXIshAEAAAAAXmFG\n2N/dBwDACcvzkcyBIhKODcAPzAgDAICwhMQEhUKhb/1ISEyI9WYCABAVLISrwOr57cwExLblume1\n5bpnteW650PLdc9qy3XPSqt0d+nhZ7CO/Bh99OXS3aU13zjD85E+zIHyM1BDHhwbrns+tFz3rLZc\n96y2yrEQBgAAAAB4hRlhf3cfAOAxX+YjfdlPVB/HBuAHZoQBAAAAABAL4Sqxen47MwGxbbnuWW25\n7lltue750HLds9py3bPakuTNfKQP+8nPQA15cGy47vnQct2z2nLds9oqx0IYAAAAAOAVZoT93X0A\ngGuWccgAACAASURBVMd8mY/0ZT9RfRwbgB+YEQYAAAAAQCyEq8Tq+e3MBMS25bpnpZWQmKBQKPSt\nHwmJCTHZtmi2XPd8aLnuWW257lltSfJmPtKH/eRnoIY8ODZc93xoue5ZbbnuWW2Vi3NeBHBCK91d\nWvH0rs2S2h3xNdNK63CLAAAAALeYEfZ394HjcjkzBcAuX+YjfdlPVB/HBuAHZoQBAAAAABAL4Sqx\nen47MwGxbbnuWW1JMjvnxOMZ25brntWW657VliRv5iN92E9+BmrIg2PDdc+Hluue1ZbrntVWORbC\nAAAAAACvMCPs7+4Dx8WMMOAHX+YjfdlPVB/HBuAHZoQBAAAAABAL4Sqxen47MwGxbbnuWW1JMjvn\nxOMZ25brntWW657VliRv5iN92E9+BmrIg2PDdc+Hluue1ZbrntVWORbCAAAAAACvMCPs7+4Dx8WM\nMOAHX+YjfdlPVB/HBuAHZoQBAAAAABAL4Sqxen47MwGxbbnuWW1JMjvnVB8fz4TEBIVCoUo/EhIT\n6nS76qJnteW6Z7UlyZv5SB/2k5+BGvLg2HDd86Hlume15bpntVUuznkRAFBjpbtLK55et1lSu2O+\nblppHW0RAABA/cOMsL+7DxwXM8KxxZwZ6oov85G+7Ceqj2MD8AMzwjEQ7VMcAQAAAADVx0K4Cmp6\nTnr4FMcjP0arwnWlu2t2iiMzAbFtue5ZbUkyO+fky+Np9f533bPact2z2pLkzXykD/vJz0ANeXBs\nuO750HLds9py3bPaKseMMACgziUkJlTpHwHjm8Zrz649dbBFAADAJ8wIR3H3mRfBiYgZ4djy5e8N\nX/bTMl/mI33ZT1QfxwbgB2aEAQAAAAAQC+EqYdaPVl30rLYkmT1ufXk8rd7/znue7KfVliRv5iN9\n2E9+BmrIg2PDdc+Hluue1ZbrntVWORbCAAAAAACvMCPMjDBwFGaEY8vy3xsuX+DK8n76wpf5SF/2\nE9XHsQH4IdKaj1eNBgBUSfgt4Sr7umk1e0s4AACAulKvT41esmSJOnbsqNTUVN1999017jAD9+0S\nEhMUCoUq/UhITKjT7Yp2y3XPakuS2ePWl8fT6v0viXm6etSS5M3j6cN+8jNQQx4cG657PrRc96y2\nXPestsrV24XwwYMHdc0112jJkiXKz8/X3Llz9cEHH9SolZeX527DPneXcrpdteiFnyU68mOAKlxX\nlVMqXW5XtFuue1Zbkswet748nlbvf0lOt83yflo9Nng8a8iD/eRnoIY8ODZc93xoue5ZbbnuWW2V\nq7cL4TVr1qh9+/ZKSUlRo0aNdPHFF2vhwoU1au3atcvdhu13l3K6Xa57Rvbz2Gerr7/+emfPVNd2\n206UliQzj2c0W7XpHe+sCKfHmtH7X5LTbbO8n1aPWx7PGvJgP/kZqCEPjg3XPR9arntWW657Vlvl\n6u2McFFRkU477bTw5eTkZK1evTqGW2RLpBe9mT59evjPVXnBG+sqzDQul9T7mK9hnhG1dNzZWY41\nAIABLn/nq0qrOj0glurtQjgUCtXodlFfIDr8x4zCwsIa3/a4v7g/L+lnR3xNbX5pr+F+Rv0vWMf/\nmFTTxyDa+1mbY+O4jD6ervfTac/lsWbk743j8mQ/XfastiR583j6sJ9WfgZc/3/geD2nizADx4br\n+8zl73xVaVWnd6z6+DPguuXyZ+BE+j3N+f8HVI/fPmnVqlWaNm2alixZIkmaMWOGGjRooMmTJ4e/\nJj09Xe+8806sNhEAAAAAEEVdunQ57oxxvV0Il5WV6YwzztCyZcvUunVrZWZmau7cufrRj34U600D\nAAAAAMRQvT01Oi4uTn/4wx80YMAAHTx4UJdddhmLYAAAAABA/X1GGAAAAACA46m3zwi78vnnn6tl\ny5ax3gwAAFBD69atq/Aimk2bNlXbtm0VF8evQieiPXv2KBQKKT4+PtabAuAExTPClejatavWr19f\no9sePHhQkydP1m9/+1vHW+XGzp07NWfOHBUWFqqsrEzS4VfbnjVrVpUbffv21bJly/SrX/1K99xz\nT622Jy0tLeLnQqGQ3n333Wo3P/nkE51++umVXlcdhYWF2rhxo84//3zt3btXZWVlSkio3vvDHjx4\nUA0bNpQk7d69Wxs3blRqamq1O+XKH4fKrquqTz75RK1atdIpp5wiSdq3b5+2b9+ulJSUardGjRql\n+++/X82aNZMklZSU6MYbb9Rjjz1W5cb+/ft18sknV/t7V5WLX6hcPwYHDx7U9u3bwz+bkvSDH/yg\nWo0gCLR169aj3krOmq+//loffPCBGjRooDPOOEMnnXRSrDdJkjRhwgSFQiGV/y8yFAopISFBPXr0\n0IUXXhiz7Xruuef005/+VI0bN3bSe++99771796quP/++zVx4kStWLFC5557bq1a7777rq644gpt\n3bpVAwcO1N133x3+uyMzM1Nr1qypUbdXr15at26dzjrrLEmH97tz587avXu3HnroIQ0YMKDKLRfH\nhsv/302ePFl33323FixYoGHDhlX5dlWRl5enN998U6FQSOedd566dOlSo86KFSs0ffr0Cr9vfPLJ\nJ9VurV27VuPGjdOePYdfwTYxMVG5ubnq3r17jbbNms2bN6tdu3ax3oxv9dZbb6lz587h31n27Nmj\nDz74QD179ozxlvln/fr16tq1a60aX3zxhb7//e872qITC/8MWona/DtBw4YNtWLFCgVBUOO3c5Kk\nJk2aRLx9KBQK/8+gugYOHKj/+q//0llnnaUGDRrUaDuLi4v1j3/8Q4sWLdLFF19coVGdH87FixdL\nknJyciRJI0eOVBAE+vOf/1ytbTrS0KFDtWHDhqOuu+iii7Ru3boa9R555BE9+uijKikp0aZNm7R1\n61aNHz++Woud+fPn65e//KWaNm2q3//+95o4caJ++MMfqqCgQI888oiys7Or3Nq3b5/27t2rL774\nQiUlJeHr9+zZo6Kiomrt25EuuugivfXWW+HLDRo00M9//nO9/fbb1W69++674V9kJal58+bV/sel\ns88+W+vXr9f/+3//T0899VS1tyESF79QReMxeOCBBzR9+nSdeuqp4X8wkQ7/8l5dF1xwgf75z3/W\naDuOFI2/h1566SVdddVV4X+Y+uSTT/THP/5RAwcOrHLjnHPO0cqVK4+7ff+fvfcOq+Jao8YXsd9o\njPUaYkMFC0WK9CYqKlYkELsUsWBEjT1RAY1GrBFMVKICFiwUjWDBBhZsKCKoGBAFUbBGBenF9/cH\nv5l7DqBh9mzuzfd9ruc5z+M5ZFb2mTOz563rlbM/FhcXIzU1FU5OTiAiREREQE1NDcnJyYiNjcWm\nTZtqzbVgwQIsW7YMTZo0weDBg5GUlIRffvkFEydOlLyuqKgofP/997C2tsbo0aMxePBgWRlNDw8P\nlJSUwNXVFePHj0fz5s0lcwQGBmL27Nnw9PSstt+yrMfHxwfGxsbYuXMnzM3NERkZiW7duqGsrIyZ\nV1VVFTt37oSmpiYAICUlBcuWLcPatWvh4OAgyRHmcW0IzzseOHbsGHx9fbF69WqujrCfnx+2b98O\nBwcHEBEmTJiAKVOmYNasWZK5Jk+ejE2bNkFfX19pT2OBm5sbtmzZAktLSwCVTrabm5vkYHldBN9f\nvHiB7du3V3P4pQR+HR0dkZCQgH79+iEmJkbyGj6Ehw8fYvPmzdXWFhkZKZnLw8ND6Tn++eefY/r0\n6bLuf09PT2zevJnp2OHDh3/wb6zfEQBevXqF5cuXIy4uTgwGeXl5oVWrVpK5iAiHDh1S4rK3t5dk\ndwvnXLC1iQgjRowQ9xNWh9jMzAxqamoYPXo0HBwclGy22mLixInYs2cPNm3ahDlz5jCtoypKS0ux\ndetWXLhwAQDQt29fTJ8+HQ0aNODCD3xyhP8WU6ZMkXW8rq4uRo4cCScnJ/zrX/8CUHlTOjg41Joj\nPz8fALB06VKoqqpiwoQJAICQkBDk5OQwr62kpAQbN25kPh6onDO2YsUKZGdnY968edX+HhsbW2su\nIdt46tQpJYlzHR0d6OnpYc2aNbXmunfvHlJSUpCbm4tDhw6Jm0ZeXh6Ki4trzVMVv/32G+Lj42Fi\nYgIA0NDQwIsXLyRxrFq1Cnfu3EFRURE0NTVx8+ZN9OjRA48ePYKTk5MkRzggIAB+fn7IycmBgYGB\n+HmzZs0wc+ZMSetSREVFhVJmrlGjRsxGKBHh9evXaNmyJYDKjHBFRYUkjpKSEoSEhODy5cvi7ylA\n6v2kCB4GVV38Bps2bUJqairTw1YRKioqMDAwQHx8PIyMjGRxCfsQT8ydOxexsbHo1q0bAODBgwcY\nMmSIJEf40qVLdbK+5ORkXLp0SXQyZ8yYAQsLC8TFxUnOoJ46dQrr1q3D4cOH0blzZxw6dAiWlpZM\njnBwcDBKS0tx4sQJ7N+/HzNmzICtrS127twpmQuovObT0tIQGBgIfX19GBkZwdXVFQMHDqw1R69e\nvaCuro7s7Oxq50aqQ/Hu3TtxD5w/fz4MDAwwePBg2QGw1NRU0QkW1vznn3+ia9eukgPAPK6NqtU1\neXl5StUfUmBnZ4cWLVogPz+/WlWLnGDQjh07cO3aNXz++ecAgMWLF8PExITJEf7yyy9hZ2fHtI6q\nqF+/vrhnA4CFhQVTMIhnMELAyJEjYWVlBVtbW3z22WcAIPn6qqiowKpVq5CWloaNGzdWe97NnTuX\naW329vZwd3fH8OHDmdemCIEDqEz8SH2uV0VcXBzzsTXZnzwwZswYWFtbi3bHvn37MHr0aJw5c0Yy\n14wZM/DgwQOMHTsWRISAgACcPn1aTP7UBn369IGJiYlSRdDr16/F7y/F5lbE/fv3ce3aNRw4cACr\nVq1Cr169MHr0aEnPqISEBOTk5CAwMBCTJk2q9nfBBpQCDw8PlJeX47vvvgMRYc+ePfDw8MCOHTsk\nc30Inxzhv8GMGTNkHV9cXIyWLVtWi+qxGO6RkZFKBoWHhwd0dHTw008/Ma1t3Lhx+P333zF8+HCl\nm0rKxerk5AQnJyesWLECXl5eTOuoCiJSKrG7dOmS5Mx8WloaoqKikJubq/Swa9asGbZv3868tkaN\nGimdq/LycskPknr16ol952pqaujRowcAoFOnTpKdzTlz5mDOnDnw9/dnMk4+hNatW+PIkSNimd+R\nI0fQunVrJq558+bB1NQU3377LYgIYWFhWLJkiSSObdu2ISQkpNrvKYDVEeZhUNXFb9CxY0fmMvmq\nuHr1Kvbu3YtOnTqJBi1rtkPAmzdv8PjxYyXDnSUS/cUXX4hOMAB06dJF8vdWzMLXBJaHLwC8ffsW\n+fn5+PLLLwFUOtqvX79G/fr1JZfpC+fp6NGjcHR0RPPmzWUZoA0bNoSdnR0+++wzFBYW4o8//mB2\nhIHKgN7KlSvRp08fzJo1C7du3cL79+/x888/45tvvvnb4/fv349nz55h4MCBiIqKklVJpaKigtzc\nXDEzbWNjg0OHDsHBwQFv3rxh5tXU1ISHh4dYuRQaGopevXqhpKREcnaB57UREBAAb29vNGrUSMk5\nkVIy/NNPP2HdunUYOXIkjhw5Iun//3dQdHYU/y0VNjY2WLBgARwcHJSeoSz7hrW1NaZNm4axY8cC\nqKyysra2FrNlteXkGYwQUFRUJCloXxMOHjyIw4cPo6KiAu/evZPFpYjGjRtze0apqanB398fHh4e\nICJs3bpVVsuZXPTt27dOeJ89e4Zly5aJ75cuXYqDBw8yccXGxiIlJUW8j1xcXNCrVy9JHGFhYfDz\n88OCBQvEgLGamhqzA6wIY2NjGBsbY8mSJfj+++/h7OwsyRGePn06+vfvj4cPHyolBQB5bRCKtkr/\n/v3F9hZe+OQI1zGCg4O5cX3++efYu3evuPkfOHAATZs2ZeZr3LgxFixYgFWrVjE/gAUBkqFDh9ZY\n7srykAsMDISrqytyc3MBVEaSg4KCJHGMHDkSI0eOxJUrV2Bqaip5DR+CtbU1Vq1ahcLCQjGS97GS\nnA/h/fv3+Oyzz5S+V3l5OXPWddasWbh8+bJSyROAGqNytcG2bdswfvx4MaPZvn177Nmzh4lr0qRJ\nMDAwQExMDFRUVHD48GHJm7+lpSUsLS2hpaVVLcsqJ8PPy6ACKkv/fvrpJ2RlZWH79u24f/8+UlNT\nMWzYsFpzbNiwAUClQ9i3b18MGzZMzMyzZgJOnjwp+ZiPYdmyZQgODkaXLl2UDGOWB7GBgQGGDBki\nlnOGhYWhT58+OHToEIDaBTj09fXFErGsrCyxpOvNmzfo1KkTMjIyJK8LABYuXAg9PT1YW1sDAM6f\nP48ff/wRBQUFGDBggCSu4cOHo0ePHmjcuDG2bt2KFy9eMPe8Hz9+HKGhoYiNjUXfvn0xZcoUhIWF\nMXEBQFJSEoKDg3H06FHY2tri6NGj0NfXR05ODkxMTGrlCANAu3btZAVXBCxcuBApKSlK+7aOjg5i\nYmKwYsUKZt7g4GBs2bJFLFs2NzfH+vXr0aBBA8nlpzyvjXXr1uHOnTvMgUbgP60jvEWjXF1dYWxs\nLJZG//HHH3Bzc2Piunr1KlRUVKq117DsG7du3YKKigqWL18O4D9lokIlmVROHsEIAcOGDcOxY8cw\ndOhQyccKiI6OxuLFi1FaWsotwQBUlh77+Phg0KBBsoMR27Ztw6xZs7By5UoAlQ7K77//Lpmnc+fO\nYlAwJydH7I1mPf9paWn48ccfcffuXdE2YOUCgIEDB2L//v0YPXo0gMpnlJRqGUV069YNWVlZYgAm\nKytLKRBcG3zzzTcYOHAgli1bhqCgIG4aRLm5uTh8+DAOHjyI9PR0jBo1CtevX5fEMWvWLMyaNQvT\np0/Htm3buKyrfv36SE9PV6oa4y1u+Eksq45RVFSEnTt3IiUlBUVFReINL6VfREBGRgZmz56Ny5cv\nA6h8kPv5+TEJGAGVUaTr16/LegD37dsXKioqKCoqUhIiSU5ORp8+fZT6TKUiNzcXRCRG3VkwadIk\n+Pv7ixxv3rzBvHnzmM4/UFmytHPnTpw6dQoAMGjQILi7u0vK7sTHx0NbW1sUohKQmZmJuLg4sfRd\nCiZMmICHDx9CV1dXqf+Ktd9GQH5+PoiIycCqmqlTFJYB2DJ1enp61XqQ5AjaCdev4hoV30sxqL79\n9lsYGBhg9+7duHv3LgoKCmBmZoakpKRac/j4+Ij/f8W1CP/29vauNVdVvHjxQiloIFV4S4CGhgbu\n3LnDRdTKxcUFAGr8zgAkBcCmTJmCUaNGiVHyEydO4PDhw0zGmYCcnBzRGDA0NISqqioTT3FxMQoK\nCtC8eXPUr18fBQUFePfuHdNEgrFjx4q9wTwE5KytrTF58mQ4OjqK7TsCdu/eXatgmpOTE8LCwmos\nC5ZbfcBTGbiwsBBZWVliFY4c5OTkID4+HioqKrKujYEDB+Lw4cNitQYLNDU18eOPP2LZsmVYv349\nt9YRoDLYrdjTqKenx8z1T0W3bt1w9epVWbaQgKZNm6KwsBANGzYUKw2klqf37t0bSUlJNT7v5GDx\n4sXYs2cPunXrJjuIWRfg8X3Nzc2xfPlyzJ07F1FRUQgKCkJFRQVz5aTwewrn6/3790qVVVJ+Vysr\nK1y/fh1GRkZQUVFBfHw8DA0N8cUXXzD1Md+8eRNz587F3bt38fLlS0nHVoWamhpGjhyJ0aNHw8TE\nRFbFUnp6Otq3b4/GjRsjNjYWt2/fxqRJk5hs+bNnz8LV1VUMkGRmZiIoKAj9+vVjXl9VfHKE6xiO\njo7o2bMnQkJC4O3tjb1796Jnz56SlJmBulGg5vEAFuDg4IDly5eLhtCdO3fg7e2NiIgIyVzPnj3D\nkiVLkJ2djejoaKSkpODKlSuYPHmyZC5dXV2lfuMPfSYFJSUl+PPPP6GiooIePXr8I1Rue/bsiZSU\nFFmblyJ4/AaKkd6aICVT9/TpU+Tk5GD8+PHYt2+fUs/39OnT8eeff9aaq65gYGCAhIQEpYe5YNDI\nQUVFBfLz85lEjIDKlop58+YhJycHbdu2xaNHj9CzZ0/cvXuXiW/UqFHYtm0b/v3vfzMdX1fQ0tKq\nJgpW02e1xfv37xESEoKMjAx4eXkhKysLz549Y+q1rilYIyeAwwvl5eWYNGkS9u3bJ4snJycHqqqq\nyMzMrPHvLMFa3srAkZGRWLBgAUpKSpCZmYnExER4e3szi+hkZ2eLFTjCPmdlZSWZ5+bNm3BxcYGp\nqalS9YcUG+HixYsICQlBWFgYRowYUe3vUiuqBAjBTMUgZrNmzZiEat6+fYvly5crid54eXkx7Ws8\nJl4ogqctxANjx47FjRs3kJ2dja5duyr9TU5gqWvXrrh37x53m4XXXsbDERbWoq2tLYpL/hP2WgA4\nd+7cB/+moqIiVphIARHh3bt3slup5Ir6KkJXVxc3btxAZmYmhgwZgpEjR+Lu3bs4fvw4E19JSQlS\nU1MBAN27d+c2MUHAp9LoOkZ6ejrCw8Nx5MgRODs7Y9y4cUzjJXgpUCviX//6F3R1dWFjYyNeWKwP\nkz///FMpG6ClpYV79+4xrcvFxQWurq5YtWoVAEBdXR3ffvstkyPMQ6hJETxUbnNzc7F69WpxPMi4\ncePEv82YMUOScIIALS0tPH36lDkrURU8foMPGcUsOHXqFIKDg6uJsjVr1gw///yzZL49e/Zg4sSJ\n2LBhQ40ZYZYS5EaNGqGoqEh8/+DBA+YNe9y4cdi2bRvq1asHQ0ND5ObmYvbs2Vi4cKFkrqVLl+LK\nlSuwtbVFYmIiYmNjmcvcAeDHH3+Enp4etLS0lPYNKQ7FmjVrsGjRInh6elb7G+sepKqqipUrV2LC\nhAmiqMnXX38tmUfAjBkz8NlnnyE2NhZeXl5o2rQpZsyYIUk5XQjgFBYW4ubNm0oBnMLCQqZ1Xbly\nBbNmzUJKSgpKS0tRUVGBpk2bMgki1a9fH1lZWSgpKZFlXAj7Dmt1Uk3gpQwswMfHB9euXYONjQ2A\nSqObtVxy0aJFOHjwIHr16qVUgcPiCE+dOhUDBgyAtrY28/QGoXXE0NCQ6Tn5Iejr61drN2jXrh3a\ntWuH7du3V+sD/Bjc3Nygra2NsLAwUfTG1dVVbIOQAh4TLxTh6+sLU1NTWcGIe/fuoWfPnh90uKSU\nH/PsuVeEtrY23rx5wz2IyWt9jo6OsjkaN26MiooKdOvWDb/++itUVVVRUFAgizM7OxuPHj1Sajtj\nudd59jE/ePAAc+bMwZUrV6CiogIzMzP88ssvkvu060JtW0VFBfXr18ehQ4fg6ekJT09P5kqSgoIC\nbNy4UVbL2d/hkyNcxxA21ebNm+P27dto164dcwkDDwVqRdjb28Pe3l7pM9aHiY6ODtzd3ZWMUNZ5\ng69evcLo0aPh6+sLAGjQoAFzTwAPoSZF8FC5dXV1hYaGBr755hsEBgYiIiICISEhaNy4MXMp+cuX\nL9GrVy8YGRkxOyeK4Pkb8MisOTs7w9nZGWvXrq3mDLIYs4IT8u7dO26BJR8fHwwePBhPnjzBuHHj\ncOnSJWaNgLt37+KLL75ASEgI7Ozs4OvrC319fSZHuEGDBmjdujXev3+PiooK2NjYYPbs2UzrAirb\nDRYvXgwtLS1m5VGhR1wwpD9UGi0F+/fvx/LlyzFq1CgAlYbK/v37mbgA4Nq1a0hMTBQf4C1btpTc\nw3/y5EmuARwAmDlzJg4cOIBvv/0WN27cwO7du8VoOQvU1NRgYWGBESNGKD1XWIJBNZUvN2/eHIaG\nhtiwYYMkI42XMrCABg0aVCvNYxV/Onz4MFJTU7lkJioqKmRPbzh79iz69++PL7/8skbHktVGsLW1\nhaOjozha6tSpUwgPD4erqys8PDwkzXR+8OCB0tp8fHyYbQQeEy8UwSMYsXHjRmzfvh1z586t8Vip\n5cdCz31paSnS0tIAVGbD5IyNefPmDXr06AFDQ0MudoIAOf3QipBjmwnYtGkTCgsL4e/vj2XLliEv\nLw+7du1i5uMR9MrKysLChQvF5MeCBQvE39He3h5//PGH5HWNGzcOM2fOFO+pgwcPYuzYsbh27Zok\nnvnz5yuNYlIE67O4YcOG2LdvH3bv3i2Km7Lq37i6usLAwEBsCVVVVYWjo+MnR/j/JEyZMgWvX7/G\nypUrMWLECOTn5zP3KvBUoAb+05/HA0FBQdi6dSv8/PwAVG4SHh4eTFxNmzbFX3/9Jb6/evUqc1mo\nINQkPIRYhJoUwUPlVtEgGDVqFFatWoX+/fvLUvv08fEBAKXNTO7sal6/gZBZi4mJYc6sCdi/f381\nZ5BlLvS0adMAVGYpqvbKPn36VPK6gMryOn19fVy9ehUA4O/vz9xzJgin/fHHH/juu+/QoEED5t+z\nRYsWePfuHSwtLTF+/Hi0bdtWlshe06ZNZSuPClHoLl26wNzcXMnAYJ3x3apVK+bSyJrQsGFDpeqR\nly9fSnacXFxc4OLigoiIiFqLTtUG6urqqKioQL169eDq6gpdXV0xaCUVXbt2RdeuXfH+/XtRE4D1\nWps9ezY6dOigJOj44MED6Onpwc3N7aOlgVXBU8gOqOyjDQkJQXl5Oe7fvw9/f3+YmZlJ4hDQtWtX\nlJaWcnGE7ezsEBAQgBEjRjBPb7hw4QL69++PqKioGn87VhvhypUrSlMWBg4ciHnz5uH3339HaWmp\nJK4mTZrg4sWLShn+qj3ptQWPiReK4BGMEM6TlGv873Du3Dk4OzujU6dOACodql27djGV0AIQxcUE\nyLERUlJSRFtKEMw6d+6crKzn6dOnYWtry3w8ADHA3qxZMy5itTyCXm5ubnB0dBRno1tbWyMyMhKt\nW7fGo0ePmDiLioqUFJ0nTJiAdevWSeZZsWIFzp49i4ULF2Lt2rVMa6mKwMBAbNu2DUuWLIGamhoe\nPnzIpH0DVNrLoaGhOHDgAADUSfvCpx7h/4chqOsJQl6APHU9Xr2zCQkJ8PT0xN27d6GpqYmXtwVS\ndwAAIABJREFUL18iPDycOXp88eJFpKenw9XVFS9fvkR+fr7YeC8V06dPR1ZWlpLKbceOHcXNuzYG\nh9CfqWhUBwcHY926dcjPz2feGDMzM5Geno4BAwagsLAQ5eXlzH0jPH8Doe9HTu+sMBd6wYIFohiM\nUGK6bt065n7X+vXrw9HREYGBgaJRJrWfSFBOF1A1EMGiyOnv7481a9ZAR0cHx44dQ1ZWFiZOnIiL\nFy9K5iooKEDjxo3FzHxeXh7Gjx/PPKN47ty5aNSoUTXDneV7/utf/4KhoSFCQ0PFcj2pfWKzZ8+G\nn59fjSVecrIde/fuRWhoKBISEuDs7Izw8HCsXLlSvPdrA6H0/kPOJUvW1crKCqdPn4a7uzu++uor\ntGvXDrt27ZLdi84DOjo61UqXBU0Gqfc8TyE7oPI+WLVqlZLQ4bJly5gExxwcHJCUlIT+/fvLbiv6\nkJYCi9r5w4cPq2Xda/qstrC1tcWAAQOURk6dOnUKJ0+ehKGhoaR98tatW5g0aZI4DaJFixbYtWsX\n0zPl119/xZIlS/Dll1/KVnkGKts9OnXqJCsYoYjbt2/j3r17SuKELBMc9PX1sX//fnTv3h1Apc02\nZswY5n7X/Px8NGnSBPXq1UNqaipSU1NhZ2fHlGXW0tLCxIkTsXDhQhQVFWHRokW4fv26GAhmAY8e\nYVtbW4SFhSkJpI4ZM4Z5eoKdnR1CQ0NlifVV3fv27t2Ln3/+GVFRUXB0dGT6zosWLcKXX36pFCh8\n8+aNmCio7bXbq1cv7NixA25ubjVqRbA813nCzMwMZ8+ehZmZGRITE8U5zFKqUf4OnxzhOoJiD6IA\nxYddq1atMGLECLH3pjZ4/PgxZs2aJQ4dt7Kygp+fH9q3b8+0Rp7qejx6ZxVRVlam1BzPWg7k4+OD\nhIQEpKamIi0tDdnZ2fj2229x6dIlJj4eKrcLFizAwIEDq0U+o6Oj4enpifv370te1++//47t27fj\n9evXePDgAdLS0uDh4YGzZ89K5hIg/AZEJD6IWYIbxsbGuHz5Mvr06YPExES8fPkSAwcOlLT5Hzly\nBIcPH0ZUVJSSGEyzZs0wZswY5syOnp4e3N3dsWPHDoSFhaFbt26SH8ZVDfaq4KHISUSoqKhgKg1d\ntGhRtbmWNX1WW3zo+7J8Tz09PaxYsQILFy7Ejh07YG5uLvn8JyQkwMDA4IOZGDkZinv37on3UP/+\n/dGzZ09Jxwsq4Kmpqbh+/TpGjBgBIsLRo0dhZGSEvXv3Sl7To0eP0LZtW5SWluKXX35BXl4eZsyY\nIXkMh4AXL15g7dq11QKiUkcKAYCJiQm+//57ODk5AQDCw8OxceNGXL16VbZIIS/k5uZCRUVFlriM\nkGmq+hxwdnbmsURm1BTEE0T8WPDy5UssX75cfF6am5vD29sbzZs3Zxr9AkB0hFkrjAA+Ey8UwTMY\n4ePjg/Pnz+Pu3bsYOnQoTpw4AQsLC4SHh0vmqimwVNNntYW+vj7i4uLw5s0bmJubw9DQEA0bNkRI\nSIhkroKCAixatAg3btxAfn4+xo0bh8WLF8uaNc3DEeYlkCroV+Tk5ODWrVuygl6amppISEhQCrqd\nOXMG06dPR0FBAVMV2sfESKUEhcLCwrBz505cunSpRiFCluc6zyTbqVOnsGrVKqSkpMDW1lZsORO0\nHriAPqFOsG3bNiIi8vb2Jh8fn2qvmTNnkrGxsSTO/v37U2BgIJWWllJpaSkFBQXRgAEDmNeop6dH\nRERaWlrVPpMKDQ0Nun//vvg+PT2dNDQ0mLgOHjxIubm5RES0YsUKGjVqFCUkJDBx6ejoUEVFBenq\n6oqfaWtrM3EREb18+ZL52LqEjo4OFRcXK31Pxd9VKqysrOjhw4fi+2vXrjGftz179tDw4cNJVVWV\nfvjhB1JXV6eDBw8ycV26dInpuA9BOF9xcXHUo0cPioyMVDqH/0tERUXRmjVryMfHh5YvX07Lly9n\n4qnp+8i5NnhCWFtaWhrp6emRv7//P+b8ExHduHGDNm3aRH5+fsx7EBGRhYUF5eXlie/z8vLIwsKC\niev06dNUWFjIvJaqGDBgAG3fvp26d+9O586dIxcXF1qwYAETV3p6Og0dOpRatWpFrVq1oqFDh9L9\n+/epsLCQLl68WCuO3bt3ExHR+vXracOGDUqvjRs3UnBwML1+/Vry2uLj40lLS4s6duxIHTt2JB0d\nHbp+/bpkHgHFxcV069YtSkpKopKSEmaepUuXUllZmfj+7du35OLiIokjJSWFwsPDSU1NjSIiIig8\nPJwiIiIoKCiIevXqxbw2AXl5eUrXLwsWL15Mb968Ed+/fv2alixZwsRla2tL+fn5stajiKKiolp9\nVhtoampSeXk56ejoEBHRs2fPqH///kxcLi4uNHnyZIqNjaWYmBiaPHkyubq6MnER/We/9ff3pzVr\n1hARieuUiuLiYpo/fz7p6OhQ165daf/+/Uw8Li4u4qtly5biv1m/p76+PmVmZorvMzIymOzaoKAg\nCg4OpuDg4Br/LQUbNmyg2NjYap/fvHlTlg3PE6z2RU0wMzOj06dPk7a2NmVmZpK3tzctXbqUme/l\ny5cUFRVFUVFRdWKDf+oRriM0a9YMf/31l9i7WROWLVsmifPly5dwdXUV37u4uOCXX35hXSJXdT0e\nvbMCfvrpJ3z77beIi4vD2bNnMX/+fEyfPp2pFKJRo0ZKEUq56oGmpqbQ1dWFq6sr7OzsuAktCQgK\nClL6jWuLRo0aKZV0KY70YMGPP/4IOzs7eHp6Ijs7GydOnGDut5kwYQIMDAzEzNqRI0ckZ9YEKGZ+\neY5EMDc3R0xMDJycnJhHMRUVFWHLli1KMzc9PDyYSi+nTZuGoqIixMTEYMqUKQgNDYWxsbEkjq1b\nt2LLli148OCBkqL7u3fvYG5uLnlNAiZMmIBff/1VLD3LzMzE5MmTmaoP6P8vSFJXV8eFCxdkqQJH\nRUXBy8ur2kgVFjVloLJ3KiwsDA4ODiAiuLq6wtHRUfK+DVRmXRWrWho0aIAXL14wrWv37t2YMWMG\nWrRoASsrK1hZWcHCwkJSdZEi/vrrL7i7u8Pf3x/W1tawtraWPKJo3759GDRoELp27YqjR4/W+N/U\ndlrC3wnZPXz4EFu3bpVcgslThZpnBVR5eTmMjIwQFBSE58+fw9PTEzNnzpTEkZaWhqioKOTm5ori\nNEClHaLY4ysVwvxPQS+iTZs22LVrF7S0tCRznThxAqtXrxbft2jRAseOHRP7S6WA58QLoPK5UvVZ\nUtNntYFQely/fn3k5uaibdu2ePz4MdO6tm3bhl9//VX8XpaWlpgxYwYTl4ArV64gJCQEO3fuBFAp\nZskCIyMjjBgxAjdu3MCrV68wbdo0REREICwsTBKPs7Oz2D4SFxcHFxcXWToFq1atgqWlJaytrUFE\nuHDhAtMseUUNHbltfx9qgdHT08Pp06clrw2o3DeOHTsmqlkL54yl3QYAvLy8xH/7+Ph81Hf5OxQV\nFWHAgAEgInTq1Ak+Pj7Q19eXVG1ateVMVVUVRISsrCxkZWXxLdnm7lp/AhERrV69mmxsbMjc3Jy8\nvb3p6tWr9P79e1mcNjY2tHv3biovL6eysjLas2cP9evXj5nv2rVrlJeXR1lZWeTs7EyjRo2iK1eu\nMHFNmzaN7OzsKCgoiIKCgmjIkCE0ffp0ioiIoIiICElcvXv3JiKiRYsW0d69e4mo5qxWbbB27Vqa\nOnUqde7cmQICAsjY2Jj8/PyYuIiIKioq6OTJkzR69Gjq0qULLV68mFJTU5n5qqJ9+/ZMx82fP59W\nrlxJGhoadOrUKbK3t6cff/xR1lpiYmKoXr161K5dO3r69KksLgFCpQQP8Mgc5uTkKL0vLS2l8+fP\nM3E5OjqSm5sbxcTE0NmzZ2ny5Mnk6OjIxCVkbIUs/Lt378jc3FwSx9u3bykjI4NGjx5NmZmZlJGR\nQZmZmfTq1SumNQnYtm0baWho0NGjRykgIIDU1dUpMjJSEkdISMgH16EYzZeCLl26UFJSElVUVDAd\nXxXq6upKWaHCwkJSV1dn4lq5ciVpa2uTt7c3eXl5kY6ODq1atUrW+rKzs8nPz486dOhA9erVY+YR\nKpNsbW0pKiqKEhISqEuXLpI4eD7vPnZtCGDJLtS0X/wTKqCIKrP8jRs3pq+++orS0tIkHx8SEkIv\nX76ky5cvM6+hJpiYmFBMTIz4PjY2lkxNTZm4tLW1q91PrNlqwc6Qk6Ujqtz/b9y4Qd27d6eEhAS6\nceMGJSQkUGxsLHXv3p1pbR4eHvT69WvaunUrdevWjXr37i05w09EVFZWxryGD+HcuXM0fPhw8vX1\nJaLK69bT05OJKz4+vtpnu3btkrU+XtVAL168oMjISC4ZxKNHj1L79u3JysqKrKysqH379nTs2DEm\nrvT0dBo2bBi1atWKWrduTSNGjKAHDx4wcQ0ePJhGjRpFXl5eStWmPCD3dzA1NaXy8nKyt7enzZs3\nU0REhOT90dramvr27UvGxsZUv3590tfXJ319fapfvz6ZmJjIWl9VfOoRrmPk5eXhzJkzOHnyJOLj\n49GjRw/Y2dlh0KBBkme5ZWZmwtPTU4yEm5mZYfPmzdVUb6WisLCQWb1RAI/eWQFDhw7F119/jdOn\nTyMxMRGNGzeGsbExsxjMqVOnlARS5KoSCoiJicGECRNQUFAAXV1drF69ula9qorZuapIS0tDSUmJ\n5LW8f/8eO3bsUPqe7u7uzFHVn376CQcPHsT27duRnJyMjRs3YsOGDbIl63n0AAlYunQpUzZBEYpi\nRkDl9du8eXMYGBhAV1dXElevXr2QkpLyt5/VBkZGRoiPj4eJiQkiIiLQqlUraGlpIT09XTKXIn7/\n/XdMnTpVFgdQKUDXr18/tG7dGjdv3sRXX30l6XhfX1+cOnUKpaWlGDBgAOzs7GBkZCSrisHa2hox\nMTFKCtRyYGNjg0OHDinNUP3mm2+YemeBygj3xYsXoaKiAisrK+a5inv27EFcXBySk5PRpk0bWFhY\nwMLCgrlPPioqCpaWlnj8+DE8PT2Rl5cHHx8fpV782kJ43kVHR+P69etMz7u6uDYAYM6cOSgqKlIS\nl2ncuLGovColw2BoaIjr16+L74kIRkZGSp/VFufPn4eHhwcmTJiA27dv4+3bt9ixY4ekGdh1dc5q\nEjiTKnomYM2aNYiMjISbmxuICEFBQRgxYgQWLVrEtDYe4py7du1CcHAwbty4oVQF0axZM7i4uDCr\nbQvIyMhAXl4es9DnyJEj4e/vL6pG/xNgYGAACwsL2NnZoW/fvkwVTx+CiYmJLLEtALh06RJ69+6N\npk2bYs+ePUhMTMTs2bOZz2H37t1x7NixaiMzWUbWGRsbY+bMmRgzZgyAyj1o8+bNkkceAfJ6xf8O\ncu20+Ph49OzZE2/fvhVHWC1cuBAmJiaSuRwcHLB8+XLRbr5z5w68vb0RERHBvL6q+OQI/5dx9+5d\nnDhxQsk5qy2Ki4u5bjqXL1+Gu7s73r17h8ePHyMpKQkBAQHYsmVLrTmEkjhWBdqaUFBQgOjoaOjo\n6EBdXR1Pnz7F7du3MXDgQG7/D1a8evUKISEh2L17N/7973/D3d0dw4cPR1JSEhwdHZGZmfm3HP/+\n978RHR1dYymjmZkZcnJyJK2pvLwcWlpazCW9NWHOnDlYvXo1mjRpAqBSoMfd3Z25jEeA3A2Wt/DT\nuHHjcOPGDQwfPhxEhGPHjkFbWxuPHj2Co6OjJCNtwoQJ+O6772BqagqgcuTUb7/9hj179khe14oV\nK+Dp6YmYmBh89913ACpHsbGOXhPAIxCxZ88erFixAitWrEBycjKio6MRFBQkOXAA8A0UXr16FV5e\nXrCxsRGNYjmlYiNHjsT169fFfef06dMwMjJC+/btmcswnz9/juLiYtFBYQlitmrVCl27doWHhwf6\n9u3LrID/34Cc5x0Pp1oRPFWoeUwPEGBkZITg4GBxFM2hQ4fwww8/MBnavM+Zvb09DAwMMHHiRBAR\nQkJCkJCQgMOHD0vmAirLo8+cOQMVFRXY2tqK84mlgrc4Z3h4OBwdHZmOFVC1lLMqWEo5LS0tkZiY\nCCMjI3FsjBwlfB7CeGVlZYiLi0N0dDTOnTuHli1bYvDgwbCzs4OGhgbTunhCW1sbSUlJuH37Nlxc\nXODu7o7Q0FCcP3+eiY9n0Ksm55U1sDR//nxZ99DHIIzmKy0tZZ7+IuDp06eSA+WK4Jlg+BA+OcL/\nBWRnZyvV8QNgmgPXtWtX/Pvf/4aVlRUsLS1hYWEhS3nRyMgI4eHhGDlypGgca2pqShpFUxeR6AcP\nHuDrr79G48aNERsbi+TkZDg7O4s9ibWBubk5Ll26hKZNm1Zbi4qKClq2bIkFCxaITkZtoaGhgQkT\nJsDNza2aWrevry8WL178txxubm5wdXUVe9UUMXbsWOzfv1/SmoC6iRwXFRUhKytLVIzmgcePH6ND\nhw7Mx9fkyGlra+P27dtMfJaWljhx4oQ4Vzc/Px9DhgxBdHQ0DAwMcO/evVpz9ejRA2lpaejQoQNU\nVFTEc1e/fn2oqKgwR2+Li4tRXFws6fr/EHg4wvb29vj999/Rtm1bAJXR36lTp3JRBJbjONna2qJZ\ns2bQ1tZW0gXw9vZmWsvHeuKlKgRHRkZi3rx5yMnJQdu2bfHo0SNxjJpUEBHu3r2LixcviqPhNDQ0\nmBSogUrjePv27dV6qwMDAyVzCSO6MjIy4OXlhaysLDx9+lRyf3tNkHNt8AbPCqjy8vJqavCvXr3i\noogs95y9fv0a3t7eomq0paUlfHx8mPvReYFnlg6o3GMjIiKQmZmJiooK8fdU7Jv8O9TF9IDz58+j\nqomuoqLCPEfY1tYWo0ePxvr16xEQEIDg4GC0adNG1vzY7OxsREdH4+TJk0hPT4eJiYmkZApQ2bes\nqakp6srk5eXh3r17TPuG8Ixbvnw5vv76a7i7u8vSE+EZ9OI18gioDJhNmDAB79+/F/Un5GhiWFtb\nIzg4WAysxsfHw93dXXbWWa6Wy5gxY9C0aVNMmDABRIR9+/YhPz+fyU7+ED45wnWMRYsW4eDBg+jV\nq5dSyZ6ioIUUPHr0CHFxcYiLi8Px48fRokULZgNUKL+UM99VAM9IdO/evZGQkIDMzEwMGTIEI0eO\nxN27d3H8+HHJ6/oQ/vrrL5iZmUl+cIaGhlabI1rTZ/9t8I4cR0ZGYsGCBSgpKUFmZiYSExPh7e3N\nxFeTuJKbm5ukKLSi8FPXrl3FzwXhJ5bxD0Cl85qcnCxGPUtKSqCjo4PU1FTJTqNQDaBoHCuic+fO\nf8sRERHxQeMakPbQrQlyAhEfq/4oKSlREmuTAl6BQi0tLdy5c4dpDXUNHR0dxMTEwNbWFomJiYiN\njcWePXuYnM28vDzExcXhwoULuHDhAl69egUTExPs3r2baW2mpqawsrKCgYGB0kzWb775RjLX9OnT\n8dlnnyEmJgZ//vknXr9+jUGDBjFlT3g51YqjDD8UFK3tKMO6qIAScOrUKdlVT3UZiGDF3wWlWQx3\nnlk6oLKV6Msvv4SBgYGSnTZv3jwmPl5YuHBhNSdVTgWU4JQoZib79OmDGzduSOYKCwsTx6QJCA0N\nxddffy1ZjFFXVxc3b94U95+Kigpx3KJUWFlZYfDgwQgKCsLFixfRpk0b6OrqMgfLXVxcPlpJIiXo\nxWvkkcAVGRkJLS0tWSOrBJw8eRKzZ89WEkjduXOnbFEqucH3oqIibN26FRcvXgRQ+fuyipB+CJ9U\no+sYhw8fRmpqKrORqIgnT57g0qVLuHjxIm7dugVNTc0as4q1RceOHcVIb2lpKfz9/ZnVfL/44gs4\nODiIhroQiZ44caLkSPRnn32G+vXr49ChQ/D09ISnpydzPx0A3Lx5ExcvXsRnn30Gc3Nz6Ovro1Wr\nVkwRWl9f32pO7+rVq2U7wnJ7N1euXFlj5JgVPj4+uHbtmjirTU9Pj2kGHFDppBsbG2Pjxo3Izs7G\n+vXrleZr1wbjxo2DnZ0dFi9ejDVr1ojftVmzZrKM0vHjx8PY2Bj29vYgIkRFRWHcuHEoKCgQSxVr\ni86dOyMhIQFxcXFK15oUfEhxVwCLI6wYiOjQoQNTIAIAsrKy4OTkVGP1B+v+9qFAIYsjPGTIEJw8\neZJbqRhPFeoGDRqgdevWeP/+PSoqKmBjY4PZs2czrcvCwgLm5uawtLTEzJkzmefICygqKmI2rKvi\n2rVrSExMFPfrli1borS0lIlrxowZolPt5eWFpk2bYubMmZKdHZ4q1B+7B+Ri0aJFsh1hXuds+PDh\nH/yb1ACrYGPk5+dLWkNNEPoC+/TpgyFDhihl6aQqnSsiOzsbJ0+elL0+gO/0gJpakY4fP858vwoB\n33bt2uHo0aNQVVXFmzdvmLh+/vnnao6wr68vc/ZP0ZmrV68eKioqmHgOHjyIffv2ITAwEO3atUNW\nVhbmz5/PxAV8vDJIKmrTOldbdOzYEZqamlycYKAyGLR161bY2tqiTZs2SExMRLt27WTzTpkyRdbx\nTZo0wdy5c5lbnGqDT45wHaNr164oLS3l4gh37NgRhoaG+OGHH7B161bZD99t27Zh1qxZyM7Oxtdf\nf42BAwfit99+Y+armtkxNDRk2oAaNmyIffv2Yffu3WLmvKysjGlNHxuBoqqqWmueEydO4Pjx43jy\n5AlmzZolOmLv3r1TGovCiq1btzI7wuXl5Zg6dSpzWVhNaNCgQbVSXNYNd9q0aejVq5cscaXmzZuj\nefPmOHDgACoqKvD8+XOUl5ejoKAABQUFzIJxy5Ytw+DBg3Hp0iWoqKggICBANKikZpl5jNvp3bs3\n5syZg7i4uFqPm/k78AhEAMDixYuxePFisfojMDAQ06dPl1X9wTNQuGXLFqxfvx4NGzbkUio2Z84c\nHD58mEvEvUWLFnj37h0sLS0xfvx4tG3bVizHlwrFUrVnz57JWhcADBs2DMeOHcPQoUNlczVs2FDJ\ngH358iXzuePlVPMcZVj1Hti5c6fse4AneJ2zj2VCeTj9rIHfqKgo8f/ftm1bse+zTZs2KC4uZl6P\nmZkZkpOToaOjw8whYNKkSfjiiy9EO2Hfvn2YOHGipLFCW7ZswdatW7mPvluyZAnevn2LDRs2iMJ4\nUkdwCrZQdnZ2NVuoaol/baGmpgZ/f394eHiAiLB161ax/1sqvvrqK6Xrt2PHjpLaWD4GuWW+PEce\nqampwcbGBnZ2dlw0MQSB1IsXLyI5ORnW1tbMAqnp6elo3749GjdujJ49e8Lf3x+TJk2S1N7l5OSE\nsLAwaGlp1VhJwlMo7FNpdB3DwcEBSUlJ6N+/v+x5d0lJSWJfWFZWFtTV1WFlZQV3d3fJXOXl5XB2\ndmYuKa0KniXgd+/eRUBAAExNTTF27FhkZGQgNDSUSV1SQ0MDycnJYjS2qKgIvXv3RlpamiSepKQk\nJCYmwsvLCz/99JO4+X/xxRewsbGR3TMlt3yEd4+wm5sb+vfvD19fXxw6dAj+/v4oKyvDtm3bJHPx\nFFfavHkzli9fjrZt2ypdZ6xlT4oICAjAtGnTmI/nca0JrQk81bUB+SrPH4OcPkQ7OzuEhoaiWbNm\nzP//srIyLsGoquCpQl1QUIDGjRuLpat5eXkYP3687BJbHrO0mzZtisLCQi4BhL179yI0NBQJCQlw\ndnZGeHg4Vq5cyVQxY2xsjMuXL4slki9fvsTAgQMl3xd1paisCNZ7QHFmfGRkpKjUzdqjzeuc1YTX\nr1/jyZMnXJxF3vsbKwQns6KiAvfv34eampqSncZibPMQ98nNzcWbN2/www8/wNfXl1sFFA/UZAup\nqKigWbNmzLbQ8+fPMWvWLLFKr3///vDz8xN1KKTgypUrmDVrFu7du4eSkhJUVFSgadOmzAFRRci9\nbu3s7NCkSRMuOhZCYK/qPsaqiTF79mz4+vpyEUjl0d6Yk5MDVVVVPHr0qFq1I1C7VrNag+swpk+o\nBl7z7gTk5eXRiRMn6IcffqAOHTpQhw4dmLnMzc2puLiY+XhFqKurc+MiIiooKKB79+7J5unbty+9\nfv1afP/69WuysbFh5istLZW9ppqQlZUl63gLCwv6/PPPycbGhoYNG0bDhg2j4cOHM/Pl5+fTDz/8\nQAYGBmRgYEA//vij0gxIKRg5ciQ9f/5cfH/t2jVxVrRUdOnSRfYc3A9B7uw8HtfamDFjqFu3btSk\nSRPS0tJSegkzhaVi9+7d1K1bN9q3bx8tXryYdHV1KTExkYlLwJMnT+jSpUt0/vx5OnfuHJ07d46J\nZ9SoUdSlSxeaMmUKzZw5k2bOnCl5rqWBgQGNGDGCtm7dShkZGUzrqAlXrlwhW1tb+vnnn2n9+vW0\nfv162rBhg2xeqTOXPwZeczd5IiUlhTZv3kybN2+mlJQUZp49e/bQ8OHDSVVVlX744QdSV1engwcP\nMvPl5uZSREQETZkyhXR1dWnMmDG0a9cuevbsmWSuiooK2r17Ny1fvpyIiB49ekRXr16VzBMbG0vn\nzp2j2NhY6tatm/hv1vuJ9zmztram3Nxc+uuvv6hz585kaGhIc+bMYeYTwPO6ZZ0FTVQ5s1x4ZWRk\nVHuxYPz48UrznK9cuUITJkyQxKGvr0+zZs2i48ePMz93/w5yzhtRzTbLn3/+KYuTB/T19SktLY10\ndXWpvLycAgMDadGiRVy4lyxZIut41me4IlatWkU3b96UzVMbPtZZ8ML9vWbNGvL391f6TCrWr19P\nT548YTq2tviUEf4voKSkRMwK9ejRgzl7YWBggJKSEpiZmYnK0XIygBMnTsSff/6JESNGiHOEWUsr\neGR2BPAQavL09ARQKQ4UHx9fbQQK6/iHuLg4LF++vFrfIEv/LA8RKQHnzp0T1wL8R9CBVV1SERUV\nFcjPz5esUF4X4ko2NjY4depUnWQAeWTleYzbefbsGQYOHIioqCgmwa2q4K3yzLP6Q+jmG+48AAAg\nAElEQVS/qnrdSi1ly8jIEJVLnzx5AgsLCwwZMgTW1tbMZde8VagF8MyGbdmyBTNmzGA69t69e+jZ\ns+cHM8osIimvX78W/00KmSLW+/XevXs4e/YsgMosEauGRU2QU8nAUxRMAK/rguc509XVxa1bt7Bj\nxw48fvxYnOcptwJH7vQARcg5b3UxE5fH9ABhRNHJkycRGxtbJyOK5F5v3bt3x4oVKzB69GgQETZu\n3IgdO3ZImrRQE+RWuRgYGCAhIUFJEEy4jlmQkpJSTS/k3Llz6Nu3r2QuHiOPDhw4gOjoaNy6dQu6\nurqws7PDwIEDmasSFfl69+6NIUOGyOIDKitTZs+ejZ9//hlRUVFQU1NjFrP08fFBWFgYWrRogTFj\nxsDJyYl7+8knR7iOce7cOTg7O4sOa1ZWFnbt2sXkoLx8+RJt2rThtjaepRU8S8D19fURExMDGxsb\ncaOWehMFBwfXqL7LamgL6N69OzZt2gR9fX0lJ4Bl1EVAQAA2btxYrXfzY0IlH8OzZ89w/fp1qKio\nwMjIiKmsSMDYsWMREBCAevXqwdDQELm5uZg9e7Yo818b1EVJopubG9LS0jB06FAufTGKkGuc8Ry3\no4ibN28yOSV1pfKsoaGB27dvc+nrFdbCI1AooLS0FBcvXkR0dDTOnz+PNm3a4NixY5J56kqFWq4B\neubMGQwYMEDps127dkm+vqZMmYLt27d/cOwLi5hg586dkZWVJRpRb968Qbt27dCuXTts374dBgYG\ntebi7VTzVFQWfkMeExcEmJiY1Eqw62Pgfc60tbVx6tQpODs7Y+XKlTAyMqpxFmptwDPwq4ilS5di\n5cqVTMfWxUzcvxNEYglm8hhRVBVyzhtQOR926tSpaNy4MZ4/f44ePXpg48aNzNoHAuTuj1ZWVjh9\n+jTc3d3x1VdfoV27dti1axfzvamlpYWJEydi4cKFKCoqwqJFi3D9+nWme5XnyCMiQmJiIqKjo3H6\n9GmUl5fD1tYWgwcPhpGR0f+U7+7du9i2bRvMzMwwduxYPHz4EKGhobUaL/ohJCUlITQ0FOHh4Wjf\nvr0Y7OOCOs03fwLp6ekplYukpqYyl6Rs2rSJcnNz6f379+Tm5ka6uroUHR3NvLaaSqZYy6h4loAb\nGRkRkXIphZySkuLiYkpOTqbk5GTZpc3C2njhwoULVL9+fWrXrh3l5OQw8xw8eJA6duxIEydOpIkT\nJ1KnTp0oNDSUmU9HR4eIiPbu3Utz586l0tJS0tLSYuISShKnTp0quyTR29ubvL29ycfHh3x8fMR/\ns2L8+PH05s0b8X1GRoas0vm6AGtJ0erVq8nGxobMzc3J29ubrl69ylzqpIjBgwdTXl6ebB6iytLQ\njh07kqWlJVlaWlKnTp2Yy0KJiEpKSuj27dt0+/ZtKikpISKix48fM3EtWLBA1v76IVy7dk3W8RYW\nFjR9+nTKz8+np0+f0rBhw8jBwYGZr7CwkNavX0/29vY0atQo2rBhAxUWFjJxubu7K52zkydP0pQp\nU+jy5ctkaGgoiatTp06koqJCLVu2pJYtW5KKigp99dVXpKenRzdu3JC8tmnTppGHhwd1796diIj+\n+usv6tOnj2QeosrnQHl5uXhvvnjx4h9Rps77nIWGhpK2tjZNnz6diIjS09OZr7Vt27aRhoYGHT16\nlAICAkhdXZ25TeDdu3dUXl5ORJXluEeOHOHStvTkyRPasWMHOTk5kZ6eHnl4eNT6WKGc+cSJE9zK\nmWt6hh88eJDi4uKY+O7evVvts9jYWCYuIqLNmzeTqqoqdejQgS5dusTMowi55ccZGRlUWFhIb9++\nJW9vb/r+++/p/v37zHz5+fn03XffkbGxMWlqatKqVauooqKCiatTp06UlJTEfPzH8PbtWwoLCyN3\nd/d/JJ9c5OTkkL+/P5mamnIpMVfEJ0e4jlHTD8b6IwrHRUdHk729Pd2+fVvWw7emY+Xw8XI4XV1d\nae/evaSlpUVpaWk0c+ZMmjZtGhMXb0N70aJFNH/+fLp8+TIlJCSILxbw7N3U1tZW6sN98eKFrM2i\nV69eVFpaSo6OjuKDktfmc+fOHVq3bh3Z2toyc+Tl5XFxxngaZ6mpqfTNN99Qz549qXPnztS5c2dS\nU1OTvUa5BjbPQAQRn75eATwDhVXv9c6dO8u61z///HNSUVGhRo0aUdOmTalp06bUrFkzJq7NmzdX\n6x//7bffmLgqKipo7dq11LVrV+rWrRuFhIQw8QhwdHQkNzc3iomJobNnz9LkyZPJ0dGRiUtTU7Pa\nZ0IATaouAE+nmug/95Hi/SQE/KSCZy/uX3/9Ve3F+vzkfc54g1fgV09PjwoKCujJkyfUqVMncnR0\npHHjxjHz8XA4S0tLKSYmhhYuXEhGRkY0ePBg2rRpE6WmpjKvq6a9X05vr6amJvn6+tL79++poKCA\nZs6cScbGxkxc/fv3pwkTJtCbN28oOTmZDA0Nad68eUxcvB304uJiSkpKoqSkJNnaNcXFxTR//nzS\n0dGhrl270v79+5m5LC0txQCOXJSUlNCmTZvIwcGBHBwcyN/fXwz+/q/5IiMjSVdXl7788kvZz87f\nfvuNrK2tqWfPnuTl5VXjtSIXnxzhOoaLiwtNnjyZYmNjKSYmhiZPnkyurq5MXIJB4enpSREREUTE\nZiQfP36cZs6cSW3atCFPT0/RmHV2dmZ+WPJ0OAsKCrgJNfE0tIkqxUP69u1b7cUCniJSWlpaStm+\niooK5gwuEZGfnx+pqqrS4MGDqaKigjIyMsjCwoKZj5e4UnJyMunq6opCcfr6+nT79m3mdRHxM87M\nzMzo9OnTpK2tTZmZmeTt7U1Lly6VtTYiosOHD8vmUITcQATP6g+egUJe93pdCOLV5HCx3uuvXr0i\nJycnGjhwIPXq1YtWr14tK9Pfs2fPWn1WGwwYMIB8fX1F8aE1a9ZQ//79qby8XPJvwdOpJuKfxeUl\nCsYzi8v7nGVlZZG9vT21bt2aWrduTQ4ODswVFjwDv8Lv5u/vT2vWrCEi9qCGIp8i5IpJycku14WN\nRsQ3u3no0CGl92VlZbRixQomLp4O+tGjR6l9+/ZkZWVFVlZW1L59ezp27BgTF1HldbV06VIqLS2l\nnJwcGj58OHOgcNKkSWRpaclFgNHNzY0mTZpEZ8+epTNnzpCzszNNnjyZiYs3X5cuXbhlvhcvXixb\n3PPv8MkRrmMUFRXR+vXradSoUTRq1CjauHEjc4TK2dmZbG1tqWvXrpSfn0+5ubmkr68vmefWrVsU\nFBREHTp0EA3ZoKAgioiIUMpaSAEvI7SsrIzZsawJPA1tXggJCfmg8jHrtTF//nyytbWloKAgCgwM\npEGDBtGCBQvkLFMJ79+/Z3YQFi5cSJ06dSI7OztR0XrYsGFMXCYmJhQTEyO+j42NJVNTUyYuIr7G\nmXC9KwYgWI2pmlRp5ZTU8gpECOBV/cEzUMjrXq8LFWotLS0lo6C8vJx69erFxKWurk47duwgIhKN\nRjn3AA+VWwEvXryg7777jnR1dUlXV5e+++47evHiBZWUlEguT+TpVBPVXRb31atX/5gsLu9z1r9/\nfwoMDKTS0lIqLS2loKAgGjBggGQeIr6BX11dXbp8+TIZGxvTnTt3iIiYAr914XDyyC7XZKMFBwfL\nstGI+GY3iSqDyIGBgURUee8/ePCAiYeng66hoaG019y/f580NDSYuIiI4uPjq322a9cuJq6qrV3C\niwW8bVuefFZWVtwy3/fv3xcTYTExMeTn56fUzsYDnxzh/4NQXl5ON27cEC+CV69eUVJSEjOf4oP7\nr7/+ksXF8ybq168ftwudp6FNRPT06VNyc3OjQYMGEVFlSY9glNYWddW7GR4eTt9//z19//331aK1\nUvHmzRuaM2cO6evrk76+Ps2dO5fevn3LxMVztFZNUX85mQCexpmpqSmVl5eTvb09bd68mSIiIpgf\nwDX1MxoYGDBx8QxEEPGt/uAZKOR5rz98+JC2bNlCI0eOJAMDA5o9ezadPHmSeW3z5s0jJycnOnPm\nDJ0+fZocHR1p7ty5kjiE/frRo0fV/sZy/oWxXD169CAVFRXq2LGjmJ3s0aOHZD7e4OlUC/i/PYvL\n+5zx2G/rIvB77tw5Gj58OPn6+hJRZe8yS3tGXTicPLPLvEcU8cxuent707Bhw0hdXZ2IKoOtZmZm\nTFw8HfSqff/v379n0gLg2fPNe+QRUeU1pXhPp6eny6pi4MnHc/Rg7969qaysjO7fv0/q6uo0f/58\nsrOzY+L6ED6pRtcRnJycEBYWBi0trWqKnKyD2oFK5bRHjx6hrKxM5HJwcGDi6tu3LyIjI1FeXg4D\nAwO0adMG5ubm+OWXXyRzubq6ol69epgwYQKICCEhIXj//j0CAwMlc40YMQKJiYmwtbXF559/DoBd\ngbqkpAS//vorLl26BACwtLTEjBkzmBVvBw8eDFdXV6xatQrJyckoKyuDnp4ek7psXl4ezpw5g5Mn\nTyI+Ph49evSAnZ0dBg0aJFkeftGiRVizZs3fflZbODg4QFtbG87OziAi7NmzB8nJyTh06JBkLp6j\ntezt7WFgYICJEyeK11lCQoLkcVh1oagcHx+Pnj174u3bt1i2bBny8vKwcOFCmJiYSObiqUrLW+VZ\nX18f+/fvR/fu3QEAaWlpGDNmjKyRFzxQXFyM3377jdu9LoCHCnVFRQV+//13UenS1tYW7u7uSsrz\nf4c+ffrg66+/hp2dHQYPHsykPquIj6nbqqioMI3me/HiBdauXYuUlBQUFRWJXHKVgXmAp6LylClT\n4OjoKI5BOXXqFMLDw+Hq6orZs2cjPj6+1ly2trYYMGAAxowZAyJCaGgoTp06hZMnT8LQ0PB/el/1\n69cPrq6uGDduHIgIBw4cQFBQkCTF1rqYHsAbNU0MSE1NFfe42uDEiRM4fvw4Dh48KP6WAPDu3Tuk\npKRIuiYE8B5RdP36dRgaGip9tnv3bkyaNEkyV+/evZGYmAgDAwPxGcWqKN67d2+MGDECXl5eePXq\nFaZNm4ZGjRohLCxMMtf06dORlZWFb7/9FgAQFhaGjh07wtbWFgBqbS/zVBTnPfIIAM6ePQtXV1eo\nqakBqNzPg4KC0K9fv/85H8/Rg4INtHbtWjRp0gSenp5cRxACn8Yn1RlycnKgqqqKR48eVZsFympk\nuLq64vbt29DU1FS6uIKCgpjWyHNGIE8jlNdsUQDw8/PD7Nmz//az2qJPnz64ceOG0o0oZ0adIuTM\ntaxpY5Az77Emp4vVEeM5Wuv169fw9vZWus58fHwkP1Dq2jh7+vQpvvrqK+bjjY2NcfnyZfTp0weJ\niYl4+fIlBg4cyLT58wxEADUbO1INoLoKFPJGaWmpONpJQ0MDDRs2xJMnT9C+ffv/yXrqYl4yT9ja\n2mL06NFYv349AgICEBwcjDZt2mDt2rWSuXg71TxHO9U0WkvYb6U+D16+fInly5eLe5q5uTm8vb3R\nvHlzZGVloVu3brXm4n3OMjMz4enpKY6KMTMzw+bNm9GxY0fJXELgNzo6GtevX5cV+L1+/Tp+/vln\nZGZmory8HIC8fYOHw5mUlITExER4eXnhp59+Ugq22NjYMDk9vEYU1cW8ZCMjI8THx4u2R0FBAUxN\nTZl+A54OuouLi9IzhRTGZwLs9jKPEVbEeeRRSUkJUlNTAVRew3KfAbz4eI4e5DmT+IPgml/+hGpY\nuHBhrT6rDXr27MmlhFaAlpYW5eTkkK2trdh/+L/unxVQXFxMt27doqSkJFlKeDWVKbGWvhJVimW9\nevVK5L1y5QpZWVkx88nt3dyyZQtpaWlRkyZNxFJHLS0t6tSpkywVTWNjY7pw4YL4/uLFi2RiYsLE\nxUNcSehZ/OWXX5jW8CHwVlQWIFdohWc/I0+VZyI+JcjZ2dlERGIvo+IrMzNTEpdQ2qd4/QsvOfsZ\nTxXqulAULykpoTNnztD8+fPJ0NCQhgwZIouPB4TrXvG8s5b0DxgwgLZv307du3enc+fOkYuLiyzd\ng39qLy7r1IEPrYvnOatLyBHtU1dXpyNHjtCDBw+U9g5W5OTk0LBhw8jR0ZEsLS1pypQp9O7dOyYu\n3uXMPEYU1YWi9bp162jq1KnUuXNnCggIIGNjY/Lz85PEURcjp3iD9wgrRcgZUZSfn08rVqwQj01L\nS6OoqCjmtfDk4zl68M6dOzRz5kzat28fERE9ePCAVq9ezYVbwCdHuI5RkyPGquY7adIkURiCB3jM\nCBSMUE1NTW5GKA/Vv3379tGwYcOoefPmSn2R1tbW1K9fP6Z1ERHduHGDTE1N6YsvviBTU1Pq1q0b\n3bp1i4mLR+/m27dvKSMjg8aMGaPkVHyoJ6u2SExMJG1tberYsSN17NiRevfuzfw9ieSLK/Xs2ZOy\ns7NJW1u7xnEjvMBjtBOR/JFHRPz6GXmqPBPx7evlESgUnOqqDrVc45in4ryionhGRoZsRXGe85J5\nQlB6tbW1paioKEpISKAuXbowcfF0qon+ub241tbW1L17d1q6dKlsBXxe50zovRUCZ4ov1iBaTQKA\nV69eZeJi7UX9GHjNxNXQ0KADBw4QUWV/6vr165l77nmOKFKEHEVrAQsWLKCTJ0/SvHnzaN68eXTy\n5EnJQZe6cNAVITcgTcS355vniCInJyfy9fUVRRfz8/Nl6aXw5OM5evC/gU+OcB2hLjJ1sbGx1KxZ\nM1JXV+eS8eABnpkdAVVV/9LT0yWLDmVmZlJsbCwZGxvTuXPnKDY2lmJjY+nGjRtUVlbGtC4BZWVl\ndOfOHbp9+7YsxVyeIlLjx4+v9hmr8qsicnNzKTc3VxYHD3ElPz8/6tGjBzVs2FDMqPHKrPFWVCYi\n5hmxAmbOnCnLGKsKXirPvMEzUMgbvEc7EfFRFOc9L5knIiMjRaPd2tqa9PT06MiRI0xcPJ1qIv6K\nyjyRk5NDmzZtIjMzM9LS0mIeQ8PrnAmz1IUgmuKLNYhWkwAgi4gRUWU2383Njfbt20fh4eEUHh4u\njpRkAU+Hk2d2meeIIiK+2c262Lt5OOiKkBOQrgtFcZ4jioSJMTzmotcFHy/wnEn8IXxyhOsIQqZu\n9OjR3DJ1Xbp04VoOpAi5hgDPEnBeqn91gcLCQlq/fj3Z29uL2TDWkp7BgwdTXl4el3VV3fDLysqY\nZoEKCn+Cyl/VFwt4ZtamTZvGdNyHwFtRmYjo+fPnlJmZSY8ePapR4bc2CAoKIjs7O1JTU6N58+bR\n9evXmdfDS+WZZ/UHz0Dh559/Lj4gq77kPDB5qlDzVBTnPRv9nwqeTjUR3yzu8+fPad68eWRnZyfO\nkrexsWFem4Dk5GQaP3481a9fn+l43udMwNu3b2U/q4RnFA9De9y4cWRgYECTJk0iFxcX8cUK3g4n\nr+wyEb8RRUR8spt1keSpq/LjJUuWMB9bF4riPIOrpqamVFhYKP6m6enpsmZM8+YT4O3tLet4njOJ\nP4RPjvB/Cc+fPxcNY1bjmLVHszaQW8rJMzo4bdo0srOzEyPQQ4YMoenTp9P/x96Zx1VVrf//c0QT\nb2pShEhpXDXHwyCDhsiggEhXEUgERa+AqDmgXa1ALyoO3bTERBNFClFyAPGLU4akwg0UhQDDAbFw\nwOmGBIogQ8D6/cHv7DiC5V5nbc8B1vv14vXyHDtPS2DvvZ71PM/nc/DgQdGnvgkJCaR///6kW7du\nTDbHkyZNIv7+/uT06dPk1KlTZObMmdT2AyxmNz/55BPStWtXoqWlpZQA6OjokKCgINFrUnjcTZky\nhfTv358sXryY/Otf/yJvv/12i1Xn50EqL+fIyEiVY7Csyh8+fJj079+f/O1vfyOGhoZEJpNRe8Uq\nKCkpITt27CCjR48m/fr1o4rBKnFi2f0hxUHhv//9b7J161ahiyEiIkKl9mOWLeDnz58n5eXlpKio\niMyYMYO4u7uTjIwMqlia6I2uoLCwkHzwwQfEzc1NOFSaMGGCupfFHJazuJcvXyYrV64kQ4cOJba2\ntmTr1q1Klm7qJDMzk8jlcmFExtjYmPpQbvjw4aSurk7YKxQXF1PvOwYMGMBUL4UQdgkny+oyK4si\nltVNKe7dLNuPL1++3Oy9lJQUqliEsJ35ZmlRdOLECWJra0t0dXXJlClTSJ8+fcjp06epYkkRT4Gq\nuQVLT+JnwVWjJebIkSNYsmQJ7t27Bz09Pdy6dQuDBw/G5cuXRceaN28eHj58iAkTJuCll14CoJp9\nUlNCQkKwdu1a0Z/btm0bIiIiUFhYiH79+gnvP378GNbW1tizZ4/omL6+vgCaq0YrEKP6169fPxw7\ndgyDBw8WvY6WGDJkCK5cufKX7z0PLNWxg4ODsW7dOtGfexY2NjY4fvy4oDT8+PFjvPvuu0hLSxMd\ni6W1VlNYSOizVFQ2NjbG6dOn4eTkhNzcXKSkpCA2Nlalf+f58+cRHx+PQ4cOYciQITh69CjVulRV\neW4Ka6suoFHttrq6WnhNo0rL+t+pqUh1PbHA2NgYAQEBkMvlgrOBTCaDnZ2d6FjXr1/Hli1bmikD\nHzlyhGptLBWVzczMkJOTo/T7pXAUEMs777wDb29vTJ48GQYGBqI/3xTW3zMjIyNERETAxsYGAJCe\nno558+ZRXVPffPMN4uPjkZ2djRkzZiAhIQFr164VbG7E4Ofnhw8//BBDhw4V/dmWCA0NRXZ2NgoK\nCnDt2jXcvXsXkydPFpS8xZCYmAh3d3fhdV1dHT799FMsX75cdCxWFkVSKFqzQArLKblcjunTp+Pj\njz9GVVUVgoKCkJWVJSifi4WlhRVry6OSkhLh3/XOO+9AV1eXKo5U8QDV92nnzp3DihUrMHr0aKW8\nZ/HixSqvTUFHZpE4LRISEoKMjIxmm2Manjx5gpdeeqmZtQ5tItx086pIgsVuaKdOnQoXFxcEBwdj\n/fr1wo2sW7duLXq0Pg+KBJEF+vr6zJJgoHEDlJGRASsrKwCNF6kY242m+Pr6oqamRrBnGTRokGhP\ny6tXr2LQoEHw9PRs0W/SzMyMam3FxcVKa+nUqROKi4upYm3btg1bt24V7JIU1lqaQJcuXWBqasrE\n2qlTp07Q1dVFQ0MD6uvrMXr0aGqbro8//hiJiYno27cvvL29sXz5cvTo0YMqlrm5OQICApQSJwsL\nC6pYQKNn6tP3iOPHj1MlwiwPCl9++WV88803mDJlCoBG70axNiPAH9ZORkZGzf6O1qJFkYRdvnxZ\nSPhpkzBNvp60tbWxcOFCJrHc3NwQEBCACRMmKCXVtPj4+MDLywvHjh1TsnaiQbEh09fXx7Fjx2Bg\nYICysjKqWE036GVlZbh9+zaMjY2pYrH+nnXs2FFIggFg1KhR6NiRbts4bdo0mJubCx7Ehw8fpn42\nZ2RkwNTUFH//+9+V7tu0h16JiYlCwgkAb7zxBh4/fkwVy93dHWlpafjll1/g5+eHsrIy+Pj4UMXq\n3LmzklVmZWUlVRwTExOYmJjAwcGhRb9kdSXCBgYGMDc3x+HDh2Fubq6UoH/xxRdUMc+fP4+goCBY\nWVmhoqICU6dOxdmzZ6nXmJqaitmzZyMhIUGwsMrKyqKK5eDggJ9//lkli6Ls7Gyla9rAwACEEBQV\nFaGoqEj0no91vKdRHA7W1tYK900xLF++HN26dUN1dTVqa2tVWsuz4BVhiTE3N0d2djZMTEyQk5MD\nLS0t0Sd6e/fuhbOzM3Vi+SxYe88CbCo7LE+1Fy1ahP/9739wc3NjUkUfNGgQrl27ht69e0Mmk6Go\nqAgDBw5Ex44dRT+IU1NTMWPGDMFTuqioCLt27RJVPZk1axaioqJgb2/f4oYnJSXluWM15ZNPPkFc\nXBw8PDxACMGhQ4fg5eWFZcuWUcWTgtu3bzd7qIuFZVXe0dERiYmJWLp0KUpKSqCnp4cff/yR6iG8\nfft2TJo0icmJLCuPbym6P1hW0W/cuIFFixYJ329ra2uEh4fD0NBQVByFB/zNmzdb/Hux8QC2/rqa\nTGxsLAoLC+Hs7Kz0+0WzmVL4lLKCZRX36NGjsLGxwe3btxEYGIjy8nKEhobC1dVVdCx7e3scOXIE\ndXV1MDc3x+uvvw5ra2uqRIDV9yw7OxtA48+zqqpKOFyKi4uDtrY21dpKS0uFPzdNeMQe/gJQujZl\nMplwAE9zbQJsPXFZVpc3bNiAn3/+GcnJyVi6dCmio6MxdepU6sMmltVNlrT0LC8oKMDAgQNFx6qp\nqUFISAiSk5NRWVmJtWvXwtvbW6X1ffnll/j000+hpaWF/fv3Y+TIkVRxKisrsXHjRhQVFSEqKkpI\nisePH//cMRR7vaqqKmRnZwuHZnl5ebCwsEBGRoaoNbGOBwB2dnaIiYkRKt+ZmZkICAigup6Yewa3\nAE+EJYbF5njdunVITk5GbW0tHB0d4eLiguHDh1Of9EqxoWVZ2WHZXvd0m7UCWlN1xQO4aeLUFDEP\nYjMzM+zbt0+42V+7dg3e3t4tVnbVQXZ2NtLS0iCTyWBra4thw4aJ+ryisiaXy5t9/2lP76dNm4Yv\nv/xSqI7evHkT/v7+VJU1BapW5RVUVlZCW1sbDQ0N2LNnD8rLy+Hj40N9gFVWVoaff/5Z6WDJ1taW\nKhYLHj16hLKyMqbdHywOClsDLJIwKSrVrAkODkZsbCz69++vVMmiOZBjmVQDja1+586dw9ixY7Fw\n4UIYGBjA09MThYWFVPFYYWpqigsXLuCrr77C7du3sWrVKuoDaVbfs2cdrCoSWJqfp6GhIYqKioTq\nY1lZGfT19aGvr4+oqCjqzqodO3Zg9uzZVJ9VwDLhZNXODDR2Bjk6OgpdgGPHjsXJkyepD9Du37+P\n2bNnQ1tbW6hubty4kapzhiUsE3QTExO4urpixYoVKCkpwZw5c9C5c2ccOHCAam2Ojo7o1asXtmzZ\ngtu3b2PmzJmwtbXFhg0bRMeaPHkyzM3NsXv3bly+fBmVlZUYOXIkfvrpJ9GxPEHjfy0AACAASURB\nVDw8hHsFAFy6dAkrV67EwYMHRcdiHe/EiRNYtGgRAgMDcffuXXz33Xf4+uuvqe7dH3/8MRwcHODs\n7Cz6s8+NpBPIHFJRUUHq6upIbW0t2blzJwkPD6cWFXj06BE5ePAgmTVrFjE1NSXe3t5k165d5H//\n+5+oOFKIHRgZGZEHDx4Ig/GnT5+mVlhloVQnJbm5uWTz5s1ky5YtKnnrshS9Yalm/TTbt2+n+pwU\n1lrbt28nAwYMIMeOHSORkZHk7bffFqw+aGClqExIo+L2nTt3qNfSlB07dhC5XE5eeeUVYm9vT7S1\ntUWr0krh8d0UFgKADg4OpLy8nMyfP594eXmRwMBAYmVlRRWrqXqsr68v8fPzo7oHSaFCzcLWRiq/\nZJb07duX2hfzaYKCgoiBgQGxtbUVlJnt7e2p47FUVGYpCiaXy8m9e/eIk5MTOX/+PCGE/jnA+nvG\nkoCAAJKUlCS8PnHiBJk1axY5e/asSs98Fp7tLDxxFSj+LYp1VVRUUP88pbAoYqlozQqWllOZmZnN\n3tu1axf12lgqirO0KGrJFYTGKUSqeKdPnyZaWlpEX1+f3L9/nzrOi/Ak5omwxFy/fp08efJEeP3k\nyRNmm5ZLly6Rzz//nDg5OVHHeFop8fr161RxFBe4sbGxoPBGe/PfvXs3WblyJTl79izJzs4Wvmgo\nKioibm5uRFdXl+jq6hIPDw9y+/ZtqliEELJp0yYydOhQsnz5chISEkLkcjkJDw+nisXSnoWlmvXT\nqLrRYGmtRUjj72zHjh2Jvr4+uXfvnipLY2pFs3LlSjJkyBBibW1NtmzZIvqAqilDhw4lT548ISYm\nJoQQQvLz84mbm5uoGFIcRBDCVh2b5UHhgQMHBE/R2NhY4uHhQRYsWEAVixC2KtRS2dpoGhMnTlTp\n974pLJNq1hgZGZHw8HBy6tQpwaOe9gAtPj6eGBkZkffff58Q0qgk6+HhQRVLyu/ZP/7xD5U+P3To\n0GbvKZI6xX2OBhaJMMuE8/PPPyezZ88mhoaGJDIykowYMUL0HkEKiyJC2Cpas0bVBN3MzIwsXLiQ\nfPfdd8yKAApYKYqztCjy8vJS2j8GBAQQb29vqlis461evZoMHTqUnD17ViheHD16lHptUsMTYYkx\nMzNTejBVV1cTc3Nz6nh37twhZ86cIf/9739Jamoq9cOXkJal+WmrMSwrOyxPtR0cHEh0dDSpra0V\nNtuOjo5UsQhpfDhWVFQIrysqKqgfmCztWVif5jVFk6y1du/eTfr370/27t1LgoODiampKcnNzaVe\nmxRWNBcuXCDLli0jAwYMIGPGjKGKobhHmJiYCA912p8n64MIlt0fUh4U1tfXq2Q5p2k2RVL5JbPE\n1taW9OjRgzg5OalcKWWZVBPCtorLomtpz549KnVhtQTr71lTVH0OODo6knXr1gkHc+vXrycODg6k\nrq5OJR/sluxtnhcpEk4W1WUpuvYIYe+XzAoWCXptbS05ffo0+fjjj8nw4cPJuHHjyKZNm0hBQYFK\na2NlYUUIW4uiJ0+ekLCwMOLm5kbc3NxU7gJkGW/hwoVKz/WbN2+qtO9WoKon8bPgibDEtHTSSdsK\n8fHHH5O33nqLuLi4CA/y8ePHU6/N2NiY1NfXKz3gaDd6LCs7LE+1W/pe037/CWlM4J7euKvaqsQC\nHx8fcvbsWeF1RkYGmTZtGpPYtBsNKTYZEydOVPLYPH/+vErVBJZVeQX37t0jmzdvJlZWVtTXk5ub\nGyktLSUrV64ko0aNIhMmTCAuLi5UsVi317Hs/mB9UNiU/Px8au9lQhp922NjY0ldXR2pq6sj33zz\nDfXhXlNU2fQTwt4vmSWK6ujTXzSwTKoJYVvFZdG19Omnn5LRo0cTa2trsnLlSnLu3DmVvXFZf8+a\n4uvrq9Lni4uLyfz584mpqSkxNTUl8+fPJ8XFxaSmpkbJW/V58PHxIWVlZcLrGzduiB4dIeTFeeJq\nwh5BAavqJkukSNDv3LlDvvrqK+Lp6UmGDRtG5s6dSxWH5T6ZEEIePHhAjh49So4ePUoePHhAHUcT\n+eSTT0hOTk6Lf8fC95tF90dLcPskidHV1cXhw4cxceJEAI2WAbRKsImJiSgoKBCt9vosWEnzA41q\n0fr6+ujSpQt8fX1RVVWFX3/9lUpEx8jICGVlZejZsyf1ehS89tpriI2NxdSpU0EIwf79+1VS4vXz\n88OIESOU1JT9/f1FxWApIqUQNqirq4O1tXUzNWtamopS9e7dm0qUiqW1lkI5/dChQ0rvDx8+HOfP\nnxcVqyksrWgiIiIQHx+P4uJieHp64quvvsKQIUOoYiUmJgJoVCC1t7dHeXk5xo0bJypGU1G8pgJL\nClE8WnR0dPD48WPY2NjAx8cHenp61GIr9fX1SpYKnTt3xu+//04Vq2vXrsL1JJPJ0LNnT5W8jffu\n3YtFixbhgw8+ANCoQr13717qeAqIivqUR44cUbpHzJ07F8bGxlizZo2qS1MZe3t7ZrFWrVrFLBbA\n1trp8uXLiI2NRUpKCrUoWHBwMIKDg1FeXo6TJ0/i66+/xvvvv49BgwbBxcUFzs7Oop+BrL9nTaEV\nmFTw+uuv48svv2zx7/r37y8qlo2NDUaMGIGNGzfi7t272LBhA8LCwkSv6ZVXXsErr7yC/fv3i/7s\n00h1v2VJU0VrPz8/1NbWYvr06VSK1ixhaTl14MABeHp64o033sDMmTMxc+ZMxMfH44033qCKx2Kf\nzNKiiLVoIst4ffv2RXh4OC5cuAATExO8++67GDt2LHR0dFSycZMarhotMb/88gt8fHxw7949AMCb\nb74pqGqKxcXFBfHx8ejWrRuTtX3++ef45ZdfmCglmpubIyMjQ9jU1tTUwNramsqaws7ODnl5ebC0\ntFTyCKSxT7p58yYCAwMFr8aRI0diy5YtVLZOCrKzs5Geng6ZTAYbGxvRasoKe5Zbt2412xTLZDLB\nTul5eJbFC02spkRGRmLjxo3NNhoTJkygigeoZq3FWjldCoKDg+Ht7Q1TU1OVY4WEhMDOzg4jR47E\nyy+/TBVDCpVngK06tqOjIwIDA5UOCjdv3ix4jYqltLRUSWlboXiuSYSEhAi+7TRYWVlh/vz5Sn7J\nW7duVckrU1Wsra1x5swZpcMIBTKZDOXl5Wpa2R+wVKHu168f8vPzqXwx/4rLly/ju+++Q3JysqAW\n/KJpaVOsQFUv7StXrqCqqkqIRav4n5aWhjFjxkBXVxc5OTno1asXVRxWSHW/ZQlLRWuWsLScaskW\nVKHaTwMLRXGWFkX3799Hr169EBYWhhEjRgi2U4TSQox1PMVnc3NzkZSUhO+//x51dXVwcnLCuHHj\nMHz4cNHxFNTX10NLS4vak/hZ8ET4BVFRUQEAKsnUe3h44KeffoKDg4NSgqioZtHQ9GHr7OwMJycn\nqjgKC4immJiYUMnCp6amAmju7SrGPikoKAjr169HfHw8Jk+eLHoNz8PRo0dVSgwVa/yr98TCwk4C\nYLfRYGmtpaienDhxApmZmdTVEymsnRSw8NKOjo5GWloazp07h65du8LW1hY2NjZwc3NT67qARr9e\nRfcHAKH7g+aByfKgMCoqCps3b8adO3dgamqKc+fOwcrKinqj7efnp/Ra8XtC43F85cqVZt0Bqamp\nVBVUVn7JmopUSTVLayc3NzdERkYy6VpSHCjduHEDK1asQFFREe7fv48RI0Y8dwzW3zPFAWtERAQA\nYPr06SCECNaKNM8oll7asbGxWL16NVavXo28vDwkJSVh586dTA4h2zIs/ZJZwiJB/+6773D8+HHE\nxcXB29tbSOQeP36MK1euUPtrs7SwYmlRFBoaigMHDkBHRwfe3t7w9PRU6X7EOl5THj16hO+//x4n\nTpxAVFSUqM+y9CR+JpI0XHPI7t27CSGNliphYWHCl+I1DTt37iQ7d+4kMTExJCYmRvgzLSxFdBwc\nHMihQ4eE14cOHaIWCiKEkPv375MjR46Qo0ePKs2EPi9Dhw4lDQ0Nks0UEKJZIlJ/FVcsLEWpWIor\nPQ2tcroUisos1ZQV3L9/n2zatIm8+eab5OWXX9aIdUkx1/v48WNquwwFTyttX7lyRbTSdlNYqlAP\nHTqUrFu3jjQ0NJDKykqyYMECwVKJ82JgqT3BchZ3zpw5ZO7cuWTgwIGEEEJ+++03YmFhwWSdqtKS\n/gLt80UxG990vpL2vsFaK6K9wELRWgpYWE5duHCB7Ny5k/Tu3Vtpf3zw4EFSWlpKvTaW+zQpRE1Z\niHOyjldTU0M2bdpEPDw8iIeHB9m8eTP1vTcpKYkMHDiQfPnll2Tp0qXE1NSU2kXmWfAZYYl48uQJ\ngMbTqKYntOT/Vzdp8PX1RU1NDa5duwYAGDRoEDp16kS9xuTk5GYnu8ePH6c67d2+fTt8fHywYMEC\nAH9UdmiIj4/HRx99JFSAFyxYgM8//xyenp7PHcPFxQU6OjqoqKho1kqu7la91jBLdPDgQZw5cwZ6\nenqYMmUK3N3d4evr26zq/zx06tQJurq6aGhoQH19PUaPHo1FixZRr+3u3bu4desW6urqQAiBpaUl\nPvzwQ1ExDAwMADRWPFhV5UNCQpCRkQEnJyfk5uYiJSWF+hqYOXMm8vPz0bNnT4waNQoHDx4U3YIv\nxboANnO9sbGxmD59OsLCwlq8Py5evFj0urS1tYUqdXV1NQYPHoyCggLRcRRMmjRJ6fXUqVOpr8/z\n588jKCgIVlZWqKiowNSpU6lbmVlWqtsTLLUnWM7inj9/Hrm5ucL1/eqrr6K2tpZZfFUghCA9PR2j\nRo0CAJw5c4Z6xl1xz9DX18exY8dgYGCAsrIyUTGk0opoLxQXF+O9995Dt27dcO3aNaxevRonT55U\n97IwefJkzJkzBw8fPsSOHTsQHR2NgIAAUTFMTExgYmICBwcHob1XQUFBAXR0dETFk2KfZmxsjICA\nAEybNg2EEOzduxcmJiZUsRTo6elBX18fr732Gh48eKBSLFbx5s6di7q6OsyfPx+EEMTGxmLevHn4\n6quvRMdydnbGtm3b4OTkhNdffx25ubnQ19enWtez4ImwRMyZMwdAY7sBK1JTUzFjxgxh7rOoqAi7\ndu0S1TIMSHOB9+/fH+fPn2fSAr527VpkZWVBT08PAPDgwQM4ODiISoQ///xzfP7553B1daWaLX4e\nIiMjqT7HUkSqJVT590qx0WAprhQUFIS4uDgMGTIEWlpawvtirwEFLA+DWCb8paWlqKurQ48ePfDq\nq69CV1eX+tCL9UEECwFAKQ4Ke/fujbKyMri5ucHJyQk6OjpM24WvXbtGvTHo2LEjunTpgqqqKlRX\nV6Nv375K7bli+Mc//iF8j6qqqpCYmCgc7HCeTVlZGQYNGsREe4KlKNhLL72E+vp64fWDBw+ofzdY\nEx0dDT8/Pzx69AgA0KNHD2rRrH//+994+PAhwsLCEBgYiPLycnzxxReiYhQVFcHT07NFrQhWIqJt\nme+//x6fffYZxo4dK7y3ZMkSqjZflrBM0B0dHbF69Wp4eXmBEIKNGzfiq6++Qn5+vqg4UuzTdu7c\niW3btiE8PBwAYGtri7lz51LFYinOyTpeVlaWUuuyg4ODMBctljVr1iAuLg5paWnIy8uDnZ0dwsLC\nMH78eKp4LcFnhCUiMDDwmX9HO9drZmaGffv2CWrA165dg7e3t2gRAJaiDlJUdoyMjJCXlyfEa2ho\ngImJCS5evCg6VlOOHTum8sUTHx+PcePGoXv37lizZg1ycnKwfPlyKsEVBSxmN5uqPAOgUnkGpBGl\nYimuNGDAAFy8eFHlTU/Tw6B+/foJ7ysOgxSzcGJwdHREYmIili5dipKSEujp6eHHH39UScQoPz8f\nSUlJ2LRpE+rr63Hnzh21r4vlXK9UpKamCkrbtKIaLalQr1u3Du+9957oWCYmJnB1dcWKFStQUlKC\nOXPmoHPnzjhw4ADV2prS0NAAa2trUYIr7RGF9sTTiElqpZhf/uabbxAfH4/s7GzMmDEDCQkJWLt2\nrWTaFs9LfX09Nm/ejH/96194+PAhAAjPF3Wj0IpISkpCVlaWSkrb7QEpnncsaUngysjIiGrPd//+\nfcyePRva2tr49ddfMWjQIGzcuFGl4owmsnTpUnh5eTGbi2cZz8zMDPHx8cKeoLCwEJ6enlSCZYsW\nLcK6deuEbq9bt24hICAA33//vcrrVMATYYmIiYmBTCZrsY1IJpNhxowZomO2JB6giuJfRkYGhg4d\niu7duwNofLjk5+eLEumIjIzEnDlzEBoa2mIivHLlStHr+uijj/DTTz8JlkdxcXEwNjZW+dSypZut\nWBQ35/T0dISEhODDDz/EmjVrqKqlLEWkWKs8sxKlAtiKK7FSTpdC4bOiogJdunRhkvAfPXoUaWlp\nSEtLw8OHD/HOO+/AxsZGtFUXwPYgoimqdH9IcVAoBaxUqLOysmBpaan03u7du/HPf/5T5TVevXoV\n48ePxy+//KJyLI56yM/PF5TSHRwcMHjwYDWvqBFLS0tkZWUxiXX9+nVs2bIFN2/eRF1dHQD6ivzT\naILStiajqYrWUiXoX375JT799FNoaWlh//79GDlyJKslU8Ha8kjTOXXqFPz8/ASBq5s3b2Lnzp0Y\nM2bMc8f4z3/+AxcXlxZHwlTpHGsJngi/IB49eoQOHTqotIH38/ODlpaWMF+wZ88eNDQ0UM+GmZqa\nIicnR2jDqq+vh4WFhcrJIgsUM6pAo2egu7u7yjFZJMIKdezg4GAYGRnBx8eHOq6xsTFOnz7dbHaT\n9ucppZ2EKhsNltZaUiinA+wUlVmxYMEC2NjYwMbGRuW2V1YHESy7P6Q4KGQNaxXq+vp6/Prrr0IS\nAND9nrGsVLcHNN3aqbS0VPiz4lrq1q2bSvofrPjXv/6F33//HV5eXnj55ZeF9dF0QCnmI+VyubDn\nEOsGoYCF0jZH/UiRoDs6OqJXr17YsmULbt++jZkzZ8LW1hYbNmxguXRRSGFRpOnU1NQIGh0DBw4U\n3cW3f/9+JCUltehJzBqeCEtMVlYW/P39hYdtjx498PXXX8PCwkJ0rOrqamzdulUpQZw3bx51m2hL\nlkdiK8xSVHZYVhCbkpmZqZKHGdA4n/fGG2/g+++/R25uLrS1tTFixAgqmyhzc3NkZ2fDxMQEOTk5\n0NLSoq7wS2En8bQoFUA3i8vSWismJgZAc2st2sSJRVX+rzbar776Kj766CPMnz//uWMeP34c7777\nrtJ727dvx/vvv//cMRSwOoiQovtDAYuDQtbI5XJkZWXBysoKFy5cQH5+PpYtW4bExETRsbZs2YJV\nq1ZBT09PmG1XpRLQGvySOc+HoaEhioqKhA1eWVkZ9PX1oa+vj6ioKJibm6ttbQr/06ehsZxSWPew\n4P3330eHDh1w+vRpXL16FaWlpXB2dmZWvea0XhITE5UKJ3V1dfj000+xfPlyNa6qESktijSJyspK\nbNy4EUVFRYiKisLPP/+MgoICqtFEIpEn8dP/E46EyOVy8sMPPwiv09LSRMvCS4WbmxsJDw8ntbW1\ngtz5xIkTRcVQSNQrrJ2aftFaO7G0Z4mLiyOPHj0ihBCyevVq4ubmppL0ekVFBUlISCDXrl0jhBBy\n7949cuLECapYDg4OpLy8nMyfP594eXmRwMBAYmVlRRWLtZ3Exx9/TN566y3i4uIi2IOMHz+eKhZr\na63q6mqSl5dH8vLySG1tLXUcQqS1dlJQUlJCBgwYIOozVlZW5OTJk8Lr9evXE2dnZ6r/f0u/B8bG\nxlSxWJOZmUnkcjnp06cP6dOnDzE2NiZZWVnqXhYh5A9rFxMTE1JVVUUIobe66Nu3LykpKWGyrh07\ndhC5XE569OhB7O3tiba2Nhk9ejST2JwXT0BAAElKShJenzhxgsyaNYucPXtWsJVpC+zevZusXLmS\nnD17lmRnZwtfNCju102tbTTlnsZRPz/88AOJjo4mhBBSXFxMCgsL1bwiZVhbHmkanp6eZN26dYJN\nY0VFBbPr8+HDh+TAgQMkICCASTxCuH2S5HTs2BE2NjbC61GjRqFjR3HfdsV8gVwub7HiRFtV2L59\nOxYuXIi1a9cCaJxN2rFjh6gYvr6+Sq9ZVHZY2LMoWLNmDSZPnoz09HScOnUKH374IebOnUutgPzy\nyy9j9OjRuHPnDnJyckAIEa2Yq+Dw4cPQ1tbGF198Icxuiq2qSWUnkZiYiIKCAiZKnCyttVgppytg\nraisYMeOHZg9ezYA4LXXXhNdQTly5AjGjx+Pl156CUlJSbh69Sr1LB0LlWdAmu4Pf39/RERECPfI\n9PR0+Pv7a8TMFEsV6j59+ghaDKoSHh4uVKpTUlKESjWndZKRkYGoqCjh9dixY7FkyRLs2LFDI2yU\njh07hitXriiNjqxYsUJ0nMuXLyM2NhYpKSlKqtg01WVNVtrmqJfQ0FBkZ2ejoKAAfn5+qK2txfTp\n04VOSk2AteWRplFYWIj4+Hjs378fQOO+mZba2lps27YNP/zwA4DGLpU5c+Y0szdUBZ4IS4ydnR3m\nzJmDKVOmAADi4uJgZ2cnqKc9z6yNQmr922+/bTZTp8rAeM+ePREXF0f9+aawbAFntXEHILQhHjt2\nDLNmzcL48eNVapFZvnw5YmJimtmf0DzMi4uLhRZwX19foQVczGyMVHYS/fr1Q21tLZNEmKW11uLF\ni5GcnKyycroCltZOTdm2bZuQCAMQPeerq6uLI0eOwMHBARYWFkhISKC+1lkdRJibm//pXC8NLA4K\npULRAh0aGgp7e3tBhVoMYWFhAIC+ffvC3t5eONwAoDF+yRz10qtXL6xfvx7e3t4ghCA+Ph49e/ZE\nfX292pO7OXPmoKqqCqdPn8asWbNw4MAB6jncAwcO4MaNG9Qq7k0JDAyEu7s7iouLsWzZMkFpm8NJ\nTExEbm6uMFLwxhtv4PHjx2peVSOsLY80lc6dO6Oqqkp4XVhYSL2XZOlJ/Cz4jLDEPD1jQ55SOxOT\nQAUFBTXzN23pvefl9u3bWLhwIdLT0wE0epqFh4fjzTffFB3LyMioWWVn3rx5VJUdlvYsLGd6gUb7\nnkuXLjF5mLMUkWKp8gywEaWSwlqLtXK6VIrKtAJqT88Z19bWolOnTpDJZCoL+7A4iGgKi+6PDz74\nAFVVVUoHhdra2pg+fTqA5zso1GSazlM/fe8HQDVX7e7ujujoaISHh+PUqVPQ0dFBXV0djh8/zmTN\nnBfLgwcPsGrVKqFiZW1tjZUrV+KVV15BUVGRWm3JFC4JintsRUUFxo0bJ+wZxODm5obIyEhmM5Ga\nqrTNUS+KWXTFM7iyshJWVlYa0WXE2vJIU0lOTsYnn3yCK1euwMnJCWfOnEFMTAxGjx4tOhbrPV9L\n8ES4FcHSaw1oVNfz8fHBtGnTAAB79uzBnj17qPy5WlqbmZkZdaUOaJTQl8lkKm3cKysrkZSUBGNj\nY7z99tu4f/8+Ll68qGQoLwZ3d3ds376dycOcpYjU06hqJ8FClEoKcSXWyulSCbPdvn1bUIZUF1Ic\nRABsuz9YHhS2FhQKoixg4ZfM4TwLRVLxzjvv4ODBg3jttdcgl8uprLrs7OyQl5cHS0tLpcNVmpEP\nTVba5qiXDRs24Oeff0ZycjKWLl2K6OhoTJ06FQsXLlT30toVJSUlOHfuHADgnXfeoe7qZOlJ/Cx4\nIiwxJSUlWLVqFdLT0yGTyWBjY4MVK1aIqjhJ5bXWUtJFm4hJVdkZP348jh07RvVZBaWlpbhz546g\nfkxr/wA0JgETJ06EXC5X+WHu6OiIwMBApRbwzZs3C6fcYmGl8qygpqYG165dAwAMGjRIIzYZrJXT\nWVblp02bhi+//BI9evQA0Oid5+/vT2W3k5iYiNGjRwuxHj58iNTUVLi5uT13DKlUnll2f7RHVD0g\n5LQtiouL8dlnn+HKlStCO6FMJqO26WLJ6tWrERgYiNOnTwuq97NmzcKaNWtEx0pNTW3xfXt7e9Gx\nNFlpm6NePv74Yzg6OgoFgLFjx+LkyZP47LPP1Lyytk92dnazrqemh9s0+24WnsR/BU+EJcbR0RF2\ndnZCBWvv3r1ITU3FyZMnnzuGVGboY8aMgZ+fH6ZOnQpCCPbv34+dO3dSJWJSVXZU9f5lOdMLAIMH\nD8bcuXOZeCGybAEPCgpCXFwchgwZIsxFA8DRo0dFxwLYiFJJIa7EGpZV+cjISGzcuBEbN27E3bt3\nsWHDBoSFhWHChAmiY7W0hpbWqg5Ydn+wOChsbbDwM+e0HZycnODl5YUNGzYgMjISMTExeP311zVu\n415dXY3q6mrhcE6dzJo1C5MmTYKzszOAxlbMhIQE+Pn5YdGiRcxsmjitD9adk5znR5EHVFVVITs7\nG8bGxgCAvLw8WFhYICMjgyquqp7EfwVPhCVGLpfj0qVLSu+pelEWFxcrKTj26dOHKs7NmzcRGBgo\ntC+MHDkSW7ZsoY4nBf7+/tRtrwDbmV4AsLS0ZO5VyGJ2c8CAAbh48SKzG4SZmRn27dunkihVTEzM\nn4oriWmzlko5nXVVPi0tDWPGjIGuri5ycnKoW2BbmoERe9+Q6iCCZfcHi4PC1kZERATmzZun7mVw\nNATFIVLTa97CwoKqK4U1o0aNgp2dHWxsbGBtbU2lB/BXPus0ugd/tq/SlANDzotFqs5Jjng8PDyw\natUqGBkZAQAuXbqElStX4uDBg6JjsfQkfhY8EZaYxYsXw9LSEl5eXiCEICEhAZmZmYKaqBiOHDmC\nJUuW4N69e9DT08OtW7cwePBgXL58WVQcheUOy6oL68pObW0t8vPzIZPJMGjQIOpEluVML9D48+zc\nuTNcXV2Vkk4xm38pZjddXFwQHx+vknBRU6QQKFBFXOnevXswMDDArVu3WlROV1SuxcKyKh8bG4vV\nq1dj9erVyMvLQ1JSEnbu3EkljOHn5wcdHR1BKXHr1q0oKysTZrefB5YHxhJ/oQAAIABJREFUEU1h\n2f0hxUGhJnLy5Ek4Ojoqvbdr1y7qnwGn7fDOO+/g3LlzGDt2LBYuXAgDAwN4enqisLBQ3UvD9evX\nkZaWhvT0dGRkZEBbWxujRo3Cpk2b1LouJycnODo6KiltJycn48SJE7C0tOSjB+0QqTonOeIZMmQI\nrly58pfvPQ+TJ0+Gubk5du/ejcuXL6OyshIjR45koqWjgCfCEtO1a1c8efJEaKNtaGgQPLXEnoYa\nGxvj9OnTcHJyQm5uLlJSUhAbGyu6Yrpu3TokJye3aLlDC8vKzrfffov3338fffv2BdD4MI6MjMS7\n774rOhbLmV6geRKgQMzmX4rZTRYqz01hKUrFUlyJtXK6AhZVeTc3N+zYsQN6enoAgMzMTMyePZuq\nOlFRUYE1a9YIlWknJyeEhISo5MfHQuWZNSwPCjUZGxsbyOVybNiwAY8fP8asWbPw0ksvUZ2Qc9oW\nR48ehY2NDW7fvo3AwECUl5cjNDQUrq6u6l4agMZDyB9++AE//PADUlJS0KdPH5w4cUKta9JkpW0O\np73j7e2Nrl27KuUDFRUV2Ldvn+hY5ubmyM7OVmp5ZyUqq4Anwi+A0tJS/Pzzz0rtzDQzpYpfCBMT\nE+Tk5EBLS0ulKp3CcicpKQlZWVkqWe6wrOwMHDgQ3377rZJK3LvvvkvllclypleTYaHy3BSWolQs\nxZVYzf+wrMr/WYdFTU2NSu3qCv9DVZJXlgcRANvuD5YHhZpMQ0MDwsLCEBkZCZlMhlWrVmHq1Knq\nXhaH86f069cPurq6mDp1KkaNGoVhw4ap3duYw+FoNlVVVdi2bRvS0tIANFqzzp07F9ra2qJjjRw5\nEqdOncLIkSORm5uLwsJCTJkyhakOQEdmkTgtEhUVhc2bN+POnTswNTXFuXPnYGVlRaUIqaOjg8eP\nH8PGxgY+Pj7Q09NTqYLVvXt3eHh4wMPDA8AfljvTp08XbbkzduxY7Nu3T6myQ2tR1L17d6UT3b59\n+6J79+5Usbp27Sq5bH5OTo6o1mgpZjd9fX2Zqjxra2tjyZIlWLJkCXUMBR07dhSSYKBx7qxjR3G3\nnqbzP4q5E+CP+R+xPHnyRPj8n7X5Pg9FRUXw9PRsscOCNgm+ePEi/vnPf+K3334DALz++uvYtWsX\n5HK56Fj+/v7NDiL8/f2pD9C8vb1hZ2eH//u//xNOe728vKi6PyoqKpgdFGoyZWVlyMrKQr9+/XDn\nzh0UFRVR/a5x2h7Xr1/Hli1bcPPmTdTV1QFQrWuJJQsXLkRaWhr27duHnJwc2NnZwdbWVu0VV01W\n2uZw2jtdunTB4sWLqS0amxIaGopx48bhzp07mDp1quBJzBJeEZYYuVyOrKwsWFlZ4cKFC8jPz8ey\nZcuQmJgoOlZlZSW0tbXR0NCAPXv2oLy8HD4+PirNP7Cy3GFR2VG0CZ48eRK3bt3C5MmTAQAHDhxA\nnz59sG3bNtHrYjHT+1fMmjULUVFRz/3fSzG7yULlGZBGlIqFuFJrmP9RdFicOHECmZmZKnVYWFlZ\n4T//+Y9gQJ+amoply5bh7NmzotfF2uObZfcHy4NCTWbAgAEICgrCzJkz8eTJEwQFBSE7O5vq58lp\nWxgbGyMgIECju5YqKiqwc+dOfP7557h79y7q6+vVup7WorTN4bQnFPvHpsUKBaqImrLyJH4WPBGW\nGIX6o2KTp62tTT00fuPGDejr66NLly4AGtsPfv31VxgaGlKtjbXljqqVHV9f32atvU3/vHPnTtFr\nYjHTKzUsZjdZqDwD0ohSSWGtpapy+ouwdlJ0WCQnJ4vusNBkj2+Wc70sDwo1kd9//x2dOnVCUVFR\ns9/R//73vxqV7HDUw/DhwzXW7mfJkiVIS0tDRUUFRo4cCRsbG4waNUpJlVcdaLLSNofTXrl//z56\n9eqFsLAwjBgxAr179wYAYS8pJleRwpP4WfBEWGLc3d0RHR2N8PBwnDp1Cjo6Oqirq8Px48dFxzI3\nN0dGRoagoFxTUwNra2vqmz9Ly522XtlRXJTPamekuShZzm6yVnmWSpRKVVgpp0ulqMyqw8LNzQ3m\n5uaYPn26IFaWnZ1NlSCyPohgOdfL8qBQE7GwsMAbb7wBFxcXjBs3jvrQktN2iY2NRWFhIZydnSXr\nWqLlwIEDsLW1Zea6wApNVtrmcNo7oaGhOHDgAHR0dODt7Q1PT0/R9xCpPIlbgifCL5DU1FSUl5dj\n3LhxVHZALfnjqaKextJyh2Vlp6qqCl9//bUw/6PYtKviJ9wUsTO9gDQXJUsRKZYqzwBbU3qW4kqs\nlNOfhkVVnmWHRWlpKVauXKkkVhYaGgodHR3q9bGE1Vwvy4NCTeXGjRtISkrCiRMncOfOHYwaNQrv\nvvsu7OzsmPl+c1ovwcHBgmVbUyEqTelaKisra3at29raqnFFmq+0zeFwgJ9++gnx8fFISEjAm2++\nKbhgiIGlJ/EzIZxWg4ODAzl06JDw+tChQ2TMmDHU8dzd3Unfvn3JrFmzyIIFC8iCBQtIYGAgVSxz\nc3NCCCEmJiakqqqKEELI4MGDqWK99957JCQkhPz9738nMTExxNHRkXpdLREQEED9WXd3d5KXlye8\nvnjxIvHw8KCKZWpq2uy9YcOGUcWqqqoiGzZsIO7u7sTd3Z1s3LiRVFdXi44TERFB5HI56dKlC5HL\n5cLXW2+9RaZOnUq1NgcHB7J69Wpy/fp1UlhYSNasWUMcHByoYpmZmRFCCDE2NiZ1dXWEEEKMjIyo\nYhFCSGZmJpHL5aRPnz6kT58+xNjYmGRlZVHFevvtt6m+51Lz4MEDsmDBAmJqakqGDRtGFi5cSEpK\nSqjj7dixg8jlctKjRw9ib29PtLW1yejRo1VeZ0pKCjl8+DCpqalROZamUlNTQ06ePEk+/PBDYmlp\nSd599111L4mjZvr27auxv/OKa/2VV15heq1zOJy2z71798jmzZuJlZUV9T6tpTyCNrd4Frwi3Ir4\n5Zdf4OPjg3v37gEA3nzzTeEkmQaWljssKzuKyreitff333/HqFGjcP78edGxWMPSKJz17CYLpBCl\nYimu5OjoiMTERCxduhQlJSXQ09PDjz/+SC06xLIqz7LDoqCgABs2bGimJEszasDS4xto+3O9UlFb\nWyuoug8YMAAvvfQS7ty5gzfffFPNK+OoEzc3N0RGRmpc+zHQ/Fq/evUqli5dqvZrXZOVtjmc9k5E\nRATi4+NRXFwMT09PeHl5YciQIVSxWHoSPwueCLdCKioqAEAl6yQFLC13FKjaAq4QD7GxsUFERAT0\n9fUxYsQIXL9+/bljSDHTC7C9KFnMbkqh8twUVUWpALbiSqyV01kqKnt4eOCnn36Cg4OD0PJKK7xl\nbGyMuXPnwszMTGizlslkMDc3Fx2L5UEE0PbneqXgaVX327dvIyYmhotlcWBnZ4e8vDxYWloq3Tc0\nIanT1Gu9NShtczjtlaVLl8LLywumpqYqx2LpSfwseCLcCoiNjcX06dMRFhbWYuJE69XFynKHNVFR\nUXjvvfdw8eJF+Pr6oqKiAmvWrMH777//3DGkGrR/ERelGKRQeQbYiVIBbMWVWCuns6zKs+ywMDc3\nR3Z2tujPtQTLgwigfcz1soaVqjun7ZGamtri+/b29i90HS2hqde6Jittczic1gVPhFsBkZGRmDNn\nDkJDQ1tMhFeuXEkVtz1szl7IoD0lLEWkWKs8sxalYiWuxFo5nbWisqodFqWlpSCEYMuWLXj99dfh\n4eGhJKj06quviooHsD2IeBpVuz/aC6xV3TmcF40mXeuarLTN4XBURypP4pbgiXA7RlM3Z8uWLcNH\nH30kKOSWlZUhLCwMa9euFR2L5Uwv0DhDumrVqmazSWLathWwnN1kqfIM/FGRNDExQU5ODrS0tKh/\nN1haa7FWTmcJiw4LQ0PDFlv5Fdy4cYNqbawOIjh0sFZ157R+rK2tcebMGXTt2rXFsRZVDqikQHEg\nrwloutI2h8NRDZaexH8FT4RbAYGBgc/8O9oZREBzN2ctJTstJXrPA+tB+4EDB2LTpk1Ks5sAoKur\nKzoWi9nNbdu2ISIiAoWFhejXr5/w/uPHj2FtbY09e/aIXhfAVpSKpbiSo6MjAgMDMXHiRADA4cOH\nsXnzZipZfoBtVV5TOyzausd3a6C6uhpbt25VssOaN28et0/itBpon8FS0K9fP+Tn56u9Ms3hcKSF\nhSfxX8ET4VZATEyMIPz0NLQziIDmbs6MjY2RmZkpzN1WVVXBwsKCaj6V9UzviBEjmKlXs5jdlELl\nGWArSsVScIW1cjrLqjzLDosDBw7A2dkZ3bt3x5o1a5Cbm4uQkBCq1j+u8szhcFRFkxJhTVba5nA4\n7GHhSfwseCLcCnn06BE6dOjAxKZFE1m/fj2OHDkCf39/EEKwc+dOuLq6IigoSN1LQ3BwMOrr65vN\nbtIkKFLMbrJQeQbYilJJIbjCSjmdpaIyyw4LxRrS09MREhKCDz/8EKtXr6YSiNFU5df2wIucc+Jw\npOT27dtCe6K60WSlbQ6Hw5779+8jISEB+/btQ0VFBZ8Rbq9kZWXB399fSJB69OiBr7/+GhYWFqLi\nSG25w4LvvvtOOPFxcnKCs7MzVRyWM71Ac3ElBbSzSaxmN1mqPAPsRakU0AquSKWczlJRmWWHhWI8\nIDg4GEZGRvDx8aGuyGiq8mt7QKHqfvPmzRb/nuWcE4fDmmnTpuHLL79Ejx49AAA3b96Ev7+/2scq\nNFlpm8PhsIOlJ/Gz4IlwK8LIyAgRERGwsbEB0JjkzZs3T3TiKpXljhQcPXoUEyZMoP48y5leAKir\nq0PHjh2p19MUlrObrFWeNU2USirldCkVlVXhH//4B9544w18//33yM3Nhba2NkaMGKHy91+TlF85\nHI5mExkZiY0bN2Ljxo24e/cuNmzYgLCwMJWeyRwOh/O8sPQkfhY8EW5FtFQRMjMzoxbjYW25IwWq\nziWxnOkFGluNx40bBy8vL4wZM+ZPFX7/CpazmyxVngH2olSajKpVeSk6LCorK5GUlARjY2O8/fbb\nuH//Pi5evIixY8eKjsVRHy0pAivQRGVgDudp0tLSMGbMGOjq6iInJwe9evVS21pam9I2h8PRfHgi\n3Ir44IMPUFVVhSlTpgAA4uLioK2tjenTpwMQP6fK2nJHClRNhFnO9AKNCcqxY8ewf/9+5OTkYMKE\nCfDy8hKq9GJgObvJUuUZYC9KpSpSKaezqMpL3WGxY8cOzJ49W6UYHPUSEhICAwMDTJs2DQCwZ88e\n3Lt3D2vWrFHzyjicZxMbG4vVq1dj9erVyMvLQ1JSEnbu3ClpdYbD4XBeJDwRbkU8PZ+qaAtV8Lxz\nqlJZ7khBZmYmhg8fTv151jO9TSkrK8PChQuxd+9e1NfXi/48y9lNlirPTWElSqUqUimns6zKS9Vh\noUlqrRw6NNWzncP5M9zc3LBjxw7o6ekBaHwez549u9nYDIfD4bRWeCLcDpHKcocV8fHxGDdunGAd\nk5OTg+XLl1NVcVnO9CpITU1FXFwckpKSBKGl9957T+WYqsxuslJ5lkqUijWslNNZVuWl6rDgiXDr\nx8rKCvPnzxe6efbv34+tW7dSd2xwOFKyd+9eODs7t7gfqKmpUbvFIofD4bCig7oXwHl+SkpKEBgY\niGHDhsHMzAyLFi3Cb7/9JjrOK6+8AkNDQ+zfvx9vvfUW/va3v6FDhw6orKxEUVGRBCsXx5o1a9C9\ne3ekp6fj1KlTmDlzJubOnUsVq2/fvpg9ezZOnTrVYjVRLIaGhti0aRNsbW1x8eJFxMfHq5wEA42V\na1dXV2oBo0mTJimJgXXo0AGTJk0SHefJkycAGrsDWvpSN1lZWTAyMoKxsTHkcjlMTExUUrLu3bs3\nysrK4ObmBicnJ7i6uoo+PNi2bRuMjIxQUFAAIyMj4cvQ0BDGxsbUa1PALUFaP3v37kV8fDx69uyJ\nnj17Ij4+Hnv37lX3sjicFikqKoKnpydGjRqF0NBQnD9/Xnh+8iSYw+G0JXhFuBXh6OgIOzs7wad0\n7969SE1NxcmTJ6nisbbcYQVL6xhWM72KE/JOnTqhe/fuotchNZqm8iwVrJTTW4K2Ki9Fh4Wm2pZw\nOJz2Q3l5OU6ePImkpCRkZWVh0KBBcHFxgbOzM3r27Knu5XE4HI7K8ES4FSGXy3Hp0iWl91RpvWRt\nucMKqaxjVJnpXbduHZKTk1FbWwtHR0e4uLhg+PDhKqlGs4SVyrNUolSsYK2cLgXFxcVKCtR9+vQR\nHYPblrQt/Pz8lF4r7hvqvtdyOGK4fPkyvvvuOyQnJyM5OVndy+FwOByV4YlwK2Lx4sXCTCohBAkJ\nCcjMzERYWBhVPNaWO6xgbR3DcqZXcUJ+4sQJZGZmaswJOSuVZ6lEqVjBWjmdJaw7LDTJtoSjGgkJ\nCULyW1VVhcTERBgYGGDLli1qXhmH82wU4os3btzAihUrUFRUhPv372PEiBHqXhqHw+EwgSfCrYiu\nXbviyZMn6NChcbS7oaEBL7/8MgA6Dz3WljssKS0txZ07d1BXVycINdEkOYaGhjA1NYWXlxcmTJjA\nXP1Y007IWas8sxKlYgUr5XQpYNlhwW1L2jYNDQ2wtrZGRkaGupfC4TyT999/Hx06dMDp06dx9epV\nlJaWwtnZGVlZWepeGofD4TCBJ8KtjNLSUvz8889KrZd2dnZUsaSy3FGV5cuXIyYmBn379hWSfkBc\nkiPlTO/du3dx69YtIUkH6H8GqiKVynNWVhb8/f2Fw5UePXrg66+/hoWFBZN1t0VYdlhw25K2zdWr\nVzF+/Hj88ssv6l4Kh/NMFKMoTUdS2qL2BIfDab+w9ZXhSEpUVBQ2b96MO3fuCHYvVlZW1AI6xcXF\nguWOr6+vYLmj7kQ4Li4OhYWF1ArKwB+ql6xneoOCghAXF4chQ4YoqTSrKxFuqvL8Z5VSsfj7+zcT\npfL391d723xJSQlWrVqF9PR0yGQy2NjYYMWKFWr/nQUAHR0dPH78GDY2NvDx8YGenp7oyrziAOfQ\noUNK7w8fPhznz59nuVzOC6Rr167C9SiTydCzZ0+V/aU5HKl56aWXlPQ0Hjx4oHQ4zeFwOK0dXhFu\nRcjlcmRlZcHKygoXLlxAfn4+li1bhsTERKp45ubmyMjIEBLOmpoaWFtbq2RHwwJ3d3ds376dycwt\n65neAQMG4OLFi23eQkJTRalYK6ezhEWHhaaLsnHoebqbRyaTwdbWVs2r4nCezTfffIP4+HhkZ2dj\nxowZSEhIwNq1azF58mR1L43D4XCYwBPhVoSFhQV+/PFHoRqsra2NIUOG4MqVK1TxNNVyJysrCxMn\nToRcLhcSTplMxsRPVdWZXhcXF8THx2vMzKxUKs+aKkrFWjmdJTdu3BA6LAAIHRZifYkBzRVl49DB\nupuHw3lR5OfnC+4DDg4OGDx4sJpXxOFwOOzgrdGtiN69e6OsrAxubm5wcnKCjo4O1SZbga6uLg4f\nPqxkuaOrq8totfT885//RHBwMORyudCGpUpF7OmZXktLS3z44YdUsbp06QJTU1M4ODgoJenqshUy\nNzf/U5VnWi5cuACZTIZVq1YB+KPVWnFwoi5RqrFjx2Lfvn1Kyum0auKsmTRpkpL4UYcOHTBp0iSq\nDovu3bvDw8MDHh4eAP44wJk+fbpGiLJxxBEeHi5086SkpAjdPByOJlNaWoqePXti6tSpwjPg999/\nR6dOndS9NA6Hw2ECrwi3UlJTU1FeXo5x48ZRz9KystxhjaWlJTNVymfN9B49epQqXkxMDIA/kkzF\n5kDdtkIKNE3lmTWsldNZwrrDQpNE2Tiqwbqbh8N5ERgaGqKoqAg6OjoAgLKyMujr60NfXx9RUVEw\nNzdX8wo5HA5HNXhFuJVib2+vcoz+/fvj/PnzzC13VMXGxgZLly6Fq6ur0iwuTTtuYmIiCgoKmM30\n+vr6oqamBteuXQMADBo0SCNOx1mrPGuqKFVFRQVT5XSWsOyw0DRRNo5qsO7m4XBeBE5OTpg0aRKc\nnZ0BAMnJyUhISICfnx/mzp2LzMxMNa+Qw+FwVINXhNshUlnusOJpr1gFNO24rGd6U1NTMWPGDLz1\n1lsAGtWpd+3apfYExcjIqJnK87x586hVnjVVlEqTZy1Zdli0F1G29giLbh4O50XwZ5oMLXXAcDgc\nTmuDV4TbIVJZ7rAiNTWVWSzWM72LFy9GcnIyBg4cCAC4du0avL291a6m3LFjRyEJBoBRo0ahY0f6\ny/t///sfli9fLrwOCQlBXFycSmtkgSbPWrLssOjXrx9qa2t5ItwGYdHNw+G8CHr16oX169fD29sb\nhBDEx8ejZ8+eqK+v5zZKHA6nTcAT4XbInDlzAAChoaHqXYgIcnJyqFqjXV1d4erq2myml5a6ujoh\nCQYaK3d1dXXU8VhhZ2eHOXPmKKk829nZCQm62O+dpopSaWtrC6rM1dXVGDx4MAoKCtS6Jik6LDRN\nlI3D4bQ/9u7di1WrVsHNzQ0AYG1tjX379qG+vh7x8fFqXh2Hw+GoDm+NbodIZbkjJbNmzUJUVBTV\nZ1nO9Pr5+UFLS0toGd6zZw8aGhoQHR1NHZMFT7eTP53wi20r11RRKnd3d0RHRyM8PBynTp2Cjo4O\n6urqcPz4cbWsBwAiIyMxZ84chIaGtvgzWLlypeiYmi7KxuFwOBwOh9Pa4YlwOyQmJuZPLXfa0mab\n9UxvdXU1tm7dijNnzgBoFPaaN29em2xh1VRRKgVtfdZSE0XZOBxO+6G4uBifffYZrly5gqqqKgCN\newRN0GTgcDgcFvBEmKMxljvZ2dlCgt5S+zJNa7SZmRn27duncTO9rGGt8qzJolSahhQdFpoqysbh\ncNoPTk5O8PLywoYNGxAZGYmYmBi8/vrr+Oyzz9S9NA6Hw2ECT4TbMawtd1RF0d5bVVWF7OxsGBsb\nAwDy8vJgYWGBjIwM0TGNjY2bKSe39N5f4enpiQMHDkAulzdL0mUyGbU6MytYqzzL5XJBlOrChQuC\nKFViYiLjlbd+pOiwaC8HOBwOR3MxMzNDTk6O0jNT4YnN4XA4bQEultWO8ff3b2a54+/vr7akTqEW\n7eHhgaioKBgZGQEALl26RDVnCQDm5uYICAhQmumlSfTDw8MBAN9++22zhEcTlLZZqzxroiiVpuLr\n66v0mkWHhaaKsnE4nPaDYuREX18fx44dg4GBAcrKytS8Kg6Hw2EH179vx7C23GHF1atXhSQYaKxO\n5ufnU8Xatm0bBg8ejM2bN2PLli0YOnQotm3bJjqOgYEBACAiIgKGhoZKXxEREVRrY4lC5bmhoQH1\n9fWIi4tTSeW5d+/eKCsrg5ubG5ycnODq6gpDQ0N2C26DZGVlwcjICMbGxpDL5TAxMaGunCgOcFJT\nU5GSkoKAgAC1dWpwOJz2yb///W88fPgQYWFh2LBhAwICAvDFF1+oe1kcDofDDN4a3Y754IMPUFVV\npWS5o62tjenTpwOgm8llgbe3N7p27arU5ltRUYF9+/apZT1NGTZsGHJzc5XeMzIywsWLF9W0okak\nVHlu66JUrDAyMmrWYTFv3jyqDov2JMrG4XA4HA6How54ItyOYW25w4qqqips27YNaWlpAABbW1vM\nnTsX2trazx2D9Uzvtm3bEBERgcLCQvTr1094//Hjx7C2tsaePXtExZMCTVd5buu0dEiimLHjcDic\n1sb169exZcsW3Lx5UxjNkMlkOHLkiJpXxuFwOGzgiTCnTXLv3j0YGBjg1q1bLc70KtR4n5dHjx6h\nrKwMwcHBWL9+vRCzW7du1MrMLOEqz+qHRYeFpouycTic9oOxsTECAgIgl8uFbiOZTMYPWDkcTpuB\nJ8LtGNaWO6xIT0/HqlWrmp1CX79+XXSsoKAgrF+//i/fE0txcbFS5bVPnz4qxVMVrvKsflh0WLA+\nwOFwOBxahg8fjszMTHUvg8PhcCSDJ8LtGNaWO6wYOHAgNm3aBDMzM2hpaQnv6+rqio7Feqb3yJEj\nWLJkCe7duwc9PT3cunULgwcPxuXLl6nisUJhaaGoBmtra2PIkCG4cuWKWtfFoUOqAxwOh8N5XmJj\nY1FYWAhnZ2clfQJ16YdwOBwOa9QvEcxRG6wtd1jRo0cPuLi4qBSj6UxvUwVqxUwvLSEhIcjIyICT\nkxNyc3ORkpKC2NhYldbKgqdVnnV0dLjK8wuGZYdFcnJys6T3+PHjPBHmcDgvjMuXLyM2NhYpKSlC\nazSgPv0QDofDYQ2vCLdjFi9eDEtLS3h5eYEQgoSEBGRmZiIsLEyt6woODkZ9fT08PDyoT6Glmuk1\nNzdHdnY2TExMkJOTAy0tLRgbG2vU7CZXeVYPLDosWoMoG4fDaR/069cP+fn5/DnC4XDaLDwRbsdI\nabmjCk/PWipQ5RSa1Uyvo6MjEhMTsXTpUpSUlEBPTw8//vgjzp49S702TttALpfj0qVLSu+JbcPX\ndFE2DofTfnBzc0NkZCR69uyp7qVwOByOJPBEuJ2jiZY7dXV16NiRTdc+65neyspKaGtro6GhAXv2\n7EF5eTl8fHx4ksKRpMNC00TZOBxO+8HOzg55eXmwtLQUurO4fRKHw2lL8ES4HaOpljt9+vTBuHHj\n4OXlhTFjxrRYHX5ejI2Ncfr06WYzvdHR0VTxbty4AX19fXTp0gVAo+fxr7/+yudxOUw7LDRVlI3D\n4bQfUlNTW3zf3t7+ha6Dw+FwpIInwu0YTbXcqaysxLFjx7B//37k5ORgwoQJ8PLygo2NjehYrGd6\nzc3NkZGRIcxM1dTUwNraGj/++CNVPE7bglWHBesDHA6Hw+FwOByOMlw1uh2jra0tVDarq6sxePBg\nFBQUqHlVwMsvvwwvLy94eXmhrKwMCxcuhL29Perr60XH0tHRwePHj2FjYwMfHx/o6emha9eu1Gur\nr69XEg7p3Lkzfv/9d+p4nLYDyw6LTp06QVdXFw0NDaivr8fo0aPa+mdEAAAP3klEQVSxaNEiCVbN\n4XA4ylhbW+PMmTPo2rVrs44sdeqHcDgcDms6/PV/wmmrPG254+rqqjEtvqmpqZg7dy7MzMxQU1OD\n+Ph4qjiHDx/G3/72N3zxxRcYN24c+vfvj6NHj1KvS1dXF4cPH1aKT+NvzGl7hIeHIzMzE2+99RZS\nUlKQk5ODV155hSrW0wc4CxcuVOkAh8PhcJ6XM2fOAAAqKirw+PFjpS+eBHM4nLYEb43mANAsyx1D\nQ0OYmprCy8sLEyZMUCkBYD3T+8svv8DHxwf37t0DALz55puIjY1F//79qdfIaRtYWFjgxx9/FKrB\n2traGDJkCK5cuSI6Fhdl43A4HA6Hw5EWnghzNIa9e/fC2dkZnTp1Qvfu3ZnElGqmt6KiAgB4lY4j\n4O7ujujoaISHh+PUqVPQ0dFBXV0djh8/LjoWF2XjcDgcDofDkRaeCHM0hnXr1iE5ORm1tbVwdHSE\ni4sLhg8frpJqtKmpKS5cuKD0nomJCX766SdRcWJjYzF9+nSEhYUprYcQAplMhsWLF1OvkdP2ULXD\ngouycTgcDofD4UgLnxHmaAzBwcE4ffo0jh8/DmNjY0RHR8PMzAxTpkzB7t278euvv4qOyWqm98mT\nJwDQbF5K8cXhNMXe3h6urq7UYwZclI3D4XA4HA5HWnhFmKPxXL58Gd999x2Sk5ORnJws6rN8ppfT\nGnF0dERgYCAmTpwIoPEAZ/PmzTh16pSaV8bhcDgcDofTNuCJMEcjuXv3Lm7duoW6ujoofkVp/FgV\nqDrTGxgY+My/k8lk2Lx5M1VcDqcl+AEOh8PhcDgcjrRwH2GOxhEUFIS4uDgMGTIEWlpawvtiEmHW\nM73m5uaQyWRo6dxIlRlmDqcl+vfvj/Pnz3NRNg6Hw+FwOByJ4IkwR+NITExEQUEBOnfuTB2j6Uxv\nS4mwWHx9fZVeP3r0CB06dEC3bt2o18jhPA0XZeNwOBwOh8N5MfBEmKNx9OvXD7W1tSolwnPmzAEA\nhIaGMlpVI1lZWfD390d5eTkAoEePHvj6669hYWHB9P/DaZ+wPsDhcDgcDofD4bQMnxHmaBweHh74\n6aef4ODgICTDYudwpZrpNTIyQkREBGxsbAAA6enpmDdvHvLy8qjicTgcDofD4XA4nBcPrwhzNA5X\nV1e4uroKFTCaaphUM70dO3YUkmAAGDVqFDp25JcRhw1clI3D4XA4HA7nxcArwhyNpKamBteuXQMA\nDBo0CJ06dVIpHquZ3g8++ABVVVWYMmUKACAuLg7a2tqYPn06AMDMzEyl+Jz2TUxMzJ8e4MyYMUMN\nq+JwOBwOh8Npe/BEmKNxpKamYsaMGXjrrbcAAEVFRdi1axeVfRLrmV57e/s/nd1MSUmhisvhtAQX\nZeNwOBwOh8ORBp4IczQOMzMz7Nu3DwMHDgQAXLt2Dd7e3sjJyREdi8/0clojXJSNw+FwOBwOR1o6\nqHsBHM7T1NXVCUkwAAwYMAB1dXVUsVjP9JaUlCAwMBDDhg2DmZkZFi1ahN9++406HofTEv7+/oiI\niMCtW7dw69YtbN26Ff7+/upeFofD4XA4HE6bgVeEORqHn58ftLS0MG3aNBBCsGfPHjQ0NCA6Olp0\nLNYzvY6OjrCzsxPWtnfvXqSmpuLkyZOi18bhPIthw4YhNzdX6T0zMzOqrggOh8PhcDgcTnN4IszR\nOKqrq7F161acOXMGAGBjY4N58+ZR+QqznumVy+W4dOmS0ntGRka4ePGi6LVxOM+Ci7JxOBwOh8Ph\nSAtPhDkcESxevBiWlpbw8vICIQQJCQnIzMxEWFiYupfGaUNwUTYOh8PhcDgcaeGJMEdj8PT0xIED\nByCXy5t5/cpkMiqBq5KSEqxatQrp6emQyWSwsbHBihUr8Nprr1GtsWvXrnjy5Ak6dGgcr29oaMD/\na+/+Q6uq/ziOv851blfm1UZzWM2c9ovpvdN7B62NRhuxJZZmJOn1sqwRBMOh2A8llJTwj0UW2x8G\nWrGQmgMxdCS02I/A0DZ11VoyVjhRRuaPtbv2w3a3ff+QHZq5+nq7t3O89/kA4d7PvX7Oe/e/1/l8\n3p+TnJxs1jhxuBEAAAAA+yIIwzZ6enp0991369y5c395jqphGObjlG5FNHp6r169qq6uLg0PD5tj\n4TzaCZhKpG/gAAAAYDKCMGxny5Ytqqio+Mex/0eke3r37dunqqoqXbhwQUuXLtWJEyeUm5urxsbG\nsOYDboZD2QAAAKKLxyfBdurr6/8ydvTo0bDmKi4uVk1NjcbGxjQ6Oqra2loVFxeHXVtlZaVaWlo0\nf/58NTU16fTp05o9e3bY8wE388svv2j79u1asGCBFi5cqG3btunixYtWlwUAABAzCMKwjffff18e\nj0ednZ3yeDzmv4yMDGVlZYU15969exUIBJSYmKikpCT5/X7t3btXLpdLs2bNuuX5nE6nZsyYIen6\n6daZmZnq7OwMqzZgKpG+gQMAAIDJ2BoN2+jr61Nvb6+2bt2qiooKs0/Y5XL9q97ISPb0PvPMM/ro\no49UWVmphoYGpaSkKBQKhb1iDdwMh7IBAABEF0EYtvXrr79OCq/33nvvLc8RzZ7e5uZmBYNBLVu2\nTImJif96PuDPOJQNAAAgegjCsJ0jR47olVdeUU9Pj9LS0nTu3DllZmaqo6Pjludyu91qbW1Vbm6u\nvv32W505c0ZvvPGGPvvssyhUDkQGh7IBAABEFz3CsJ1t27bp+PHjevDBB3X27Fk1NDQoJycnrLno\n6cXtiEPZAAAAoivB6gKAG02fPl2pqanmQUGFhYXauHFjWHPNmzdPvb29WrVqlYqKipSSkqKMjIzI\nFgxEGDdwAAAAoosgDNtJSUlRf3+/8vPzFQgElJaWppkzZ4Y118QW6B07dqigoMDs6QXsjBs4AAAA\n0UWPMGxnYGBATqdTY2Nj+uSTTxQMBhUIBP7VydHA7YpD2QAAACKPIAzbOXv2rObOnWtuDR0aGtLF\nixdZEQMAAAAQERyWBdtZvXq1pk2bZr53OBxavXq1hRUBAAAAiCUEYdjO6OjopC2gSUlJGhkZsbAi\nAAAAALGEIAzbSU1N1eHDh833hw8fVmpqqoUVAQAAAIgl9AjDdn766ScFAgH19PRIktLT07V//37d\nf//9FlcGAAAAIBYQhGFbv//+uySF/egkAAAAALgZniMM29i/f79KSkq0e/duGYZhjo+Pj8swDG3e\nvNnC6gAAAADECoIwbGNwcFCS1N/ff9MgDAAAAACRwNZoAAAAAEBcYUUYtlFeXj7lZ4ZhqKqq6j+s\nBgAAAECsIgjDNrKzs2UYhm62SYGt0QAAAAAiha3RsK2+vj45HA65XC6rSwEAAAAQQxxWFwDcqLW1\nVR6PR1lZWXK73VqyZIlOnjxpdVkAAAAAYgQrwrAdj8ejPXv2KD8/X5J07NgxlZWV6fvvv7e4MgAA\nAACxgBVh2E5CQoIZgiXp0UcfVUIC7ewAAAAAIoMVYdjOpk2bNDQ0JL/fL0mqra2V0+lUSUmJJMnn\n81lZHgAAAIDbHEEYtlNQUDDplOjx8fFJ75uamqwoCwAAAECMIAgDAAAAAOIKPcKwncuXL6u8vFxe\nr1c+n08bN27UlStXrC4LAAAAQIwgCMN21q5dq7S0NB06dEgHDx7UnDlztGbNGqvLAgAAABAj2BoN\n23G73frhhx8mjXk8HrW3t1tUEQAAAIBYwoowbKe4uFg1NTUaGxvT6OioamtrVVxcbHVZAAAAAGIE\nK8KwnZkzZ2pwcFAOx/X7NGNjY0pOTpYkGYahYDBoZXkAAAAAbnMEYdjS1atX1dXVpeHhYXPsscce\ns7AiAAAAALEiweoCgBvt27dPVVVVunDhgpYuXaoTJ04oNzdXjY2NVpcGAAAAIAbQIwzbqaysVEtL\ni+bPn6+mpiadPn1as2fPtrosAAAAADGCIAzbcTqdmjFjhiRpeHhYmZmZ6uzstLgqAAAAALGCrdGw\nnXnz5qm3t1erVq1SUVGRUlJSlJGRYXVZAAAAAGIEh2XB1pqbmxUMBrVs2TIlJiZaXQ4AAACAGEAQ\nBgAAAADEFXqEAQAAAABxhSAMAAAAAIgrBGEAAAAAQFwhCAMAYAMOh0MlJSXm+1AopDlz5mjFihWS\npLq6OlVUVETseleuXJHX65XX69Vdd92l9PR0eb1e+Xw+jYyMROw6AADYEY9PAgDABpKTk9XR0aHh\n4WE5nU59+eWXSk9Pl2EYkqQVK1aYoTgS7rzzTrW1tUmSdu7cKZfLpc2bN0dsfgAA7IwVYQAAbGL5\n8uX6/PPPJUk1NTXy+/2aeLhDdXW1ysvLJUkvvPCCysrKlJubq/vuu0/Nzc1av369Fi1apBdffNGc\nr76+Xnl5ecrOztZzzz2ngYGBKa89Pj6u/v5+LViwQKFQSJIUDAa1cOFChUIhFRQUaNOmTfJ6vfJ4\nPGptbZUkDQwMqLS0VDk5OfL5fDpy5EhUfhsAACKJIAwAgE2sWbNGBw4c0LVr19Te3q6cnJwpv/vb\nb7/p+PHjeu+997Ry5Uq9/vrr6ujoUHt7u7777jtdvnxZu3btUkNDg06dOqXs7Gy9++67f3t9l8ul\nwsJCM4wfOHBAzz77rBISEmQYhoaGhtTW1qY9e/aotLRUkrRr1y49/vjj+uabb9TY2KjXXntNg4OD\nkftRAACIArZGAwBgEx6PR93d3aqpqdGTTz455fcMwzC3Sbvdbs2dO1eLFy+WJC1evFjd3d06f/68\nfvzxR+Xl5UmS/vjjD/P133nppZf09ttv6+mnn1Z1dbU++OAD8zO/3y9Jys/PVzAYVF9fn+rr61VX\nV6d33nlHknTt2jWdP39eDz30UHg/AgAA/wGCMAAANrJy5Uq9+uqr+uqrr3Tp0qUpv5eYmCjp+iFb\nSUlJ5rjD4VAoFNK0adNUVFSkTz/9dNL/a2lp0csvvyxJeuutt/TUU09N+jwvL0/d3d1qbm7W6Oio\nFi1aNGUNE/3Lhw4d0gMPPHBrfygAABZiazQAADZSWlqqHTt2mCu84TAMQ4888oi+/vpr/fzzz5Ku\n9/J2dXXp4YcfVltbm9ra2v4Sgic8//zzCgQC5vbnCbW1tZKkY8eO6Y477tCsWbP0xBNPqKqqyvzO\nxAFcAADYGUEYAAAbmFhdveeee7RhwwZzbGL8z6///P0bX09ITU1VdXW1/H6/lixZory8PHV2dv7j\n9SVp3bp16u3tNbdCT3A6nfL5fCorK9OHH34oSdq+fbtGRkaUlZUlt9utN99881b/dAAA/nPG+MRx\nlAAAAJIOHjyouro6ffzxx+ZYYWGhdu/eLZ/PZ2FlAABEBj3CAADAVF5eri+++EJHjx61uhQAAKKG\nFWEAAAAAQFyhRxgAAAAAEFcIwgAAAACAuEIQBgAAAADEFYIwAAAAACCuEIQBAAAAAHGFIAwAAAAA\niCv/AxPbXB+4fNleAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 32 }, { "cell_type": "code", "collapsed": false, "input": [ "filesdf.mime_type.value_counts().head()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 33, "text": [ "text/html 252401\n", "text/plain 244182\n", "image/jpeg 200075\n", "image/gif 141428\n", "image/png 116836\n", "dtype: int64" ] } ], "prompt_number": 33 }, { "cell_type": "code", "collapsed": false, "input": [ "print \"Lots of files!\"\n", "print \"Total # of files (across all samples): %s\" %filesdf.shape[0]\n", "print \"Total # of unique files: %s\" %len(filesdf['sha1'].unique())\n", "print \"Total # of network sessions involving files: %s\" %len(filesdf['conn_uids'].unique())\n", "print \"Total # of unique mime_types: %s\" %len(filesdf['mime_type'].unique())\n", "print \"Total # of unique filenames: %s\" %len(filesdf['filename'].unique())" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Lots of files!\n", "Total # of files (across all samples): 1100106\n", "Total # of unique files: 312453" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Total # of network sessions involving files: 238211" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Total # of unique mime_types: 46" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Total # of unique filenames: 18324" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 34 }, { "cell_type": "code", "collapsed": false, "input": [ "# We can use some of the output from above and get rid of them and look are more exciting files\n", "# Just an example, I don't think we'll do much with this data frame today\n", "boring = set(['text/html','text/plain','image/jpeg','image/gif','image/png','application/xml','image/x-icon'])\n", "exciting_filesdf = filesdf[filesdf['mime_type'].apply(lambda x: x not in boring)]\n", "exciting_filesdf.head(2)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "

\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tsfuidtx_hostsrx_hostsconn_uidssourcedepthanalyzersmime_typefilenamedurationlocal_origis_origseen_bytestotal_bytesmissing_bytesoverflow_bytestimedoutparent_fuidmd5
4 1.320786e+09 FitWMF3UfEasz2Vyql 75.119.221.151 192.168.41.10 C9KyD7n902u8uko9j HTTP 0 SHA1,MD5 application/x-shockwave-flash - 1.356016 - F 1177469 1177469 0 0 F - c2045c6a5e95a99f6ebbc073e62894cd...
7 1.320786e+09 FAnnpf1X8a1w6JLtV9 95.211.160.73 192.168.41.10 CENibi3Z3bv3ZVlyqf HTTP 0 SHA1,MD5 application/x-dosexec - 0.895983 - F 342016 - 0 0 F - ae12a0a1d449b9f2816d20546c477c0b...
\n", "

2 rows \u00d7 24 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 35, "text": [ " ts fuid tx_hosts rx_hosts \\\n", "4 1.320786e+09 FitWMF3UfEasz2Vyql 75.119.221.151 192.168.41.10 \n", "7 1.320786e+09 FAnnpf1X8a1w6JLtV9 95.211.160.73 192.168.41.10 \n", "\n", " conn_uids source depth analyzers mime_type \\\n", "4 C9KyD7n902u8uko9j HTTP 0 SHA1,MD5 application/x-shockwave-flash \n", "7 CENibi3Z3bv3ZVlyqf HTTP 0 SHA1,MD5 application/x-dosexec \n", "\n", " filename duration local_orig is_orig seen_bytes total_bytes \\\n", "4 - 1.356016 - F 1177469 1177469 \n", "7 - 0.895983 - F 342016 - \n", "\n", " missing_bytes overflow_bytes timedout parent_fuid \\\n", "4 0 0 F - \n", "7 0 0 F - \n", "\n", " md5 \n", "4 c2045c6a5e95a99f6ebbc073e62894cd ... \n", "7 ae12a0a1d449b9f2816d20546c477c0b ... \n", "\n", "[2 rows x 24 columns]" ] } ], "prompt_number": 35 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "

\n", "After getting a high-level look at the data and doing our Python and pandas stretches we're set to move on to some more intresting ways to view the data and how different properties relate to one another.\n", "

\n", "Instead of looking at the top 10 of this or that, let's see how we can examine the top N broken down by various categories.\n", "

\n", "We'll start off easy and look at the most popular protocols and then the most popular mime-types by count within those protocls. Followed by a view of the same data but with the restriction that Bro know something about the filename, and last but not least we can look at the most popular filenames within a mime-type within a protocol!\n", "" ] }, { "cell_type": "code", "collapsed": false, "input": [ "filesdf['count'] = 1\n", "filesdf[['source','mime_type','count']].groupby(['source','mime_type']).sum().sort('count', ascending=0).head(10)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "

\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
sourcemime_type
HTTPtext/html 252401
text/plain 244182
image/jpeg 200075
image/gif 141428
image/png 116836
binary 39964
application/x-dosexec 30456
application/x-shockwave-flash 17878
application/jar 14372
application/zip 12247
\n", "

10 rows \u00d7 1 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 36, "text": [ " count\n", "source mime_type \n", "HTTP text/html 252401\n", " text/plain 244182\n", " image/jpeg 200075\n", " image/gif 141428\n", " image/png 116836\n", " binary 39964\n", " application/x-dosexec 30456\n", " application/x-shockwave-flash 17878\n", " application/jar 14372\n", " application/zip 12247\n", "\n", "[10 rows x 1 columns]" ] } ], "prompt_number": 36 }, { "cell_type": "code", "collapsed": false, "input": [ "# We can get a slightly different view if we look at percentages of files\n", "# Wonder how accurate the percentages are vs. monitored network traffic?\n", "filesdf.groupby('source')['mime_type'].apply(lambda x: pd.value_counts(x)/x.count().astype(float)).head(20)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 37, "text": [ "source \n", "FTP_DATA application/x-java-applet 1.000000\n", "HTTP text/html 0.229434\n", " text/plain 0.221963\n", " image/jpeg 0.181869\n", " image/gif 0.128559\n", " image/png 0.106205\n", " binary 0.036328\n", " application/x-dosexec 0.027685\n", " application/x-shockwave-flash 0.016251\n", " application/jar 0.013064\n", " application/zip 0.011133\n", " application/xml 0.006645\n", " application/pdf 0.004922\n", " application/vnd.ms-fontobject 0.002872\n", " application/x-java-applet 0.002678\n", " text/x-c 0.002036\n", " application/octet-stream 0.001929\n", " text/x-asm 0.001733\n", " application/x-elc 0.000960\n", " application/vnd.ms-cab-compressed 0.000865\n", "dtype: float64" ] } ], "prompt_number": 37 }, { "cell_type": "code", "collapsed": false, "input": [ "filesdf['count'] = 1\n", "filesdf[filesdf['filename'] != '-'][['source','mime_type','count']].groupby(['source','mime_type']).sum().sort('count', ascending=0).head(10)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
sourcemime_type
HTTPapplication/x-dosexec 17793
binary 16810
application/jar 8874
image/jpeg 4756
application/pdf 4672
application/zip 4247
image/png 847
image/gif 161
text/plain 120
text/html 80
\n", "

10 rows \u00d7 1 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 38, "text": [ " count\n", "source mime_type \n", "HTTP application/x-dosexec 17793\n", " binary 16810\n", " application/jar 8874\n", " image/jpeg 4756\n", " application/pdf 4672\n", " application/zip 4247\n", " image/png 847\n", " image/gif 161\n", " text/plain 120\n", " text/html 80\n", "\n", "[10 rows x 1 columns]" ] } ], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "filesdf[filesdf['filename'] != '-'][['source','mime_type','filename','count']].groupby(['source','mime_type','filename']).sum().sort('count', ascending=0).head(20)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
sourcemime_typefilename
HTTPapplication/x-dosexecsetup.exe 4471
binarysetup.exe 1461
application/x-dosexecabout.exe 1204
contacts.exe 1170
info.exe 1146
calc.exe 1101
readme.exe 1081
scandsk.exe 645
PluginInstall.exe 598
files/load1.exe 432
application/jar938a99f1be85e19406438f9a572fdf71.jar 374
loading.jar 351
a03cb4b8e5bb148134a57a2c87ddacd9.jar 300
application/x-dosexecfiles/load2.exe 231
uplayermediaplayer-setup.exe 231
foto43.exe 188
binary./files/cit_video.module 133
image/pngad516503a11cd5ca435acc9bb6523536.png 127
application/jarapp.jar 112
application/x-dosexec2.exe 108
\n", "

20 rows \u00d7 1 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 39, "text": [ " count\n", "source mime_type filename \n", "HTTP application/x-dosexec setup.exe 4471\n", " binary setup.exe 1461\n", " application/x-dosexec about.exe 1204\n", " contacts.exe 1170\n", " info.exe 1146\n", " calc.exe 1101\n", " readme.exe 1081\n", " scandsk.exe 645\n", " PluginInstall.exe 598\n", " files/load1.exe 432\n", " application/jar 938a99f1be85e19406438f9a572fdf71.jar 374\n", " loading.jar 351\n", " a03cb4b8e5bb148134a57a2c87ddacd9.jar 300\n", " application/x-dosexec files/load2.exe 231\n", " uplayermediaplayer-setup.exe 231\n", " foto43.exe 188\n", " binary ./files/cit_video.module 133\n", " image/png ad516503a11cd5ca435acc9bb6523536.png 127\n", " application/jar app.jar 112\n", " application/x-dosexec 2.exe 108\n", "\n", "[20 rows x 1 columns]" ] } ], "prompt_number": 39 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The takeaway seems to be that if you're going to cause a file to be downloaded by a user over HTTP (malicious or not, but likely malicious) you should really call it 'setup.exe' followed not-so closely by: 'about.exe', 'contacts.exe', 'info.exe', 'calc.exe', 'readme.exe'. And looking for a mime-type of 'binary' or 'application/x-dosexec' should do pretty well." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Filenames with a '/' in them??\n", "# Just some random exploring, wonder why these have a path associated w/them and not the rest? Questions for another day.\n", "print filesdf[filesdf['filename'].str.contains('/')]['filename'].value_counts().head(10)\n", "print \n", "print filesdf[filesdf['filename'].str.contains('\\.\\.')]['filename'].value_counts()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "files/load1.exe 432\n", "files/load2.exe 231\n", "./files/cit_video.module 133\n", "./files/cit_ffcookie.module 60\n", "users/leftunch/file/ractrupt.exe 44\n", "files/load5.exe 42\n", "files/load3.exe 37\n", "./files/barman.png 36\n", "./files/up.bin 26\n", "users/root/file/file.exe 26\n", "dtype: int64\n", "\n", "./../load/12.exe 4\n", "../admin/files/cit_video.module 2\n", "Ray Rice had three TD\\xe2\\x80\\x99s..jpeg 2\n", "../admin/files/cit_ffcookie.module 2\n", "../admin/files/gconfig8.dll 2\n", "\\xe1\\xba\\xa3nh h\\xc3\\xa0i h\\xc3\\xb3a ra ng\\xc3\\xa0nh c\\xc6\\xa1 kh\\xc3\\xad b\\xc3\\xa1ch khoa....jpg 2\n", "../admin/files/webinjects/merged-1.txt 2\n", "Sexy Dr..jpg 2\n", "dtype: int64" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 40 }, { "cell_type": "code", "collapsed": false, "input": [ "# Lots of duplicate files Wonder what these look like?\n", "filesdf.md5.value_counts().head()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 41, "text": [ "28d6814f309ea289f847c69cf91194c6 8328\n", "b4491705564909da7f9eaf749dbbfbb1 7527\n", "cd2e0e43980a00fb6a2742d3afd803b8 5831\n", "d9feff91276e487e595cc23f62d259bc 4740\n", "325472601571f31e1bf00674c368d335 4320\n", "dtype: int64" ] } ], "prompt_number": 41 }, { "cell_type": "code", "collapsed": false, "input": [ "filesdf[filesdf['filename'] != '-'][['filename','mime_type','count']].groupby(['filename','mime_type']).sum().sort('count', ascending=0).head(10)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
filenamemime_type
setup.exeapplication/x-dosexec 4471
binary 1461
about.exeapplication/x-dosexec 1204
contacts.exeapplication/x-dosexec 1170
info.exeapplication/x-dosexec 1146
calc.exeapplication/x-dosexec 1101
readme.exeapplication/x-dosexec 1081
scandsk.exeapplication/x-dosexec 645
PluginInstall.exeapplication/x-dosexec 598
files/load1.exeapplication/x-dosexec 432
\n", "

10 rows \u00d7 1 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 42, "text": [ " count\n", "filename mime_type \n", "setup.exe application/x-dosexec 4471\n", " binary 1461\n", "about.exe application/x-dosexec 1204\n", "contacts.exe application/x-dosexec 1170\n", "info.exe application/x-dosexec 1146\n", "calc.exe application/x-dosexec 1101\n", "readme.exe application/x-dosexec 1081\n", "scandsk.exe application/x-dosexec 645\n", "PluginInstall.exe application/x-dosexec 598\n", "files/load1.exe application/x-dosexec 432\n", "\n", "[10 rows x 1 columns]" ] } ], "prompt_number": 42 }, { "cell_type": "code", "collapsed": false, "input": [ "filesdf[filesdf['filename'] != '-'][['filename','md5','count']].groupby(['filename','md5']).sum().sort('count', ascending=0).head(10)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
filenamemd5
loading.jar2d272e75e6be0d397dcc9b493936d873 238
setup.exe7776d42f2e2167591de7321b18704e9a 134
b87668c676063c0f36f2c7faef6b7d3d 92
618ba1bbd7e537482f7e058419fa8a28 92
405f6ef1172501148ac36495780a69d0 78
938a99f1be85e19406438f9a572fdf71.jare872a71a6060413c1abfa5e41839aa8d 72
ad516503a11cd5ca435acc9bb6523536.png102345b9de00a7f5d7ee00f688ba68ab 72
938a99f1be85e19406438f9a572fdf71.jar88f7ddd10321d1a035b05a7a0ca263f1 66
foto43.exe0cd1f2bc16529f88a919830c87f180f7 66
Applet.jar0e658e5217ea9f0d28e60ab491e716f2 63
\n", "

10 rows \u00d7 1 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 43, "text": [ " count\n", "filename md5 \n", "loading.jar 2d272e75e6be0d397dcc9b493936d873 238\n", "setup.exe 7776d42f2e2167591de7321b18704e9a 134\n", " b87668c676063c0f36f2c7faef6b7d3d 92\n", " 618ba1bbd7e537482f7e058419fa8a28 92\n", " 405f6ef1172501148ac36495780a69d0 78\n", "938a99f1be85e19406438f9a572fdf71.jar e872a71a6060413c1abfa5e41839aa8d 72\n", "ad516503a11cd5ca435acc9bb6523536.png 102345b9de00a7f5d7ee00f688ba68ab 72\n", "938a99f1be85e19406438f9a572fdf71.jar 88f7ddd10321d1a035b05a7a0ca263f1 66\n", "foto43.exe 0cd1f2bc16529f88a919830c87f180f7 66\n", "Applet.jar 0e658e5217ea9f0d28e60ab491e716f2 63\n", "\n", "[10 rows x 1 columns]" ] } ], "prompt_number": 43 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "

\n", "It seems (from this data) there is a fair amount of resuse of both filenames and actual samples. Perhaps these samples were of the more boring exploit kits that don't try to obfuscate each individual download. Oh well, at least we've got some easy potential IOCs to look for.\n", "

\n", "Now we've got some hunches, how can we back these up using the results of the MHR events we found earlier?\n", "" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Lookup to see what the Bro - Team Cymru Malware Hash Registry picks up\n", "def tc_mhr_present_single(sha1):\n", " if sha1 in hashes:\n", " return True\n", " return False\n", "\n", "tempdf = filesdf\n", "tempdf['count'] = 1\n", "tempdf['mhr'] = tempdf['sha1'].map(tc_mhr_present_single)\n", "# The following 2 Commands Print out the tables below\n", "#tempdf[tempdf['filename'] != '-'][['mhr','filename','count']].groupby(['mhr','filename']).sum().sort('count', ascending=0).head(12)\n", "#tempdf[tempdf['filename'] != '-'][['filename','mhr','count']].groupby(['filename','mhr']).sum().sort('count', ascending=0).head(12)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 44 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The tables below were converted to .png files for pretty display, but they're just screen-caps of the above commands\n", "


\n", "

\n", "
" ] }, { "cell_type": "code", "collapsed": false, "input": [ "tempdf.groupby('mhr')['filename'].apply(lambda x: pd.value_counts(x)/len(tempdf.index))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 45, "text": [ "mhr \n", "False - 0.940176\n", " setup.exe 0.003344\n", " scandsk.exe 0.000546\n", " PluginInstall.exe 0.000544\n", " contacts.exe 0.000528\n", " about.exe 0.000525\n", " readme.exe 0.000515\n", " calc.exe 0.000509\n", " info.exe 0.000499\n", " files/load1.exe 0.000230\n", " a03cb4b8e5bb148134a57a2c87ddacd9.jar 0.000224\n", " uplayermediaplayer-setup.exe 0.000210\n", " 938a99f1be85e19406438f9a572fdf71.jar 0.000204\n", " foto43.exe 0.000157\n", " files/load2.exe 0.000135\n", "...\n", "True windows-update-sp4-kb66639-setup.exe 0.000001\n", " f13f6a19.jar 0.000001\n", " 34dcaa0c.jar 0.000001\n", " 7af76.pdf 0.000001\n", " windows-update-sp3-kb74463-setup.exe 0.000001\n", " windows-update-sp2-kb66551-setup.exe 0.000001\n", " a37002b0.jar 0.000001\n", " windows-update-sp2-kb88572-setup.exe 0.000001\n", " d1af818e.jar 0.000001\n", " load/49.exe 0.000001\n", " FIX_KB111703.exe 0.000001\n", " windows-update-sp2-kb81951-setup.exe 0.000001\n", " c5d53367.jar 0.000001\n", " 2bba99f3.jar 0.000001\n", " 3.exe 0.000001\n", "Length: 18400, dtype: float64" ] } ], "prompt_number": 45 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "<SURPRISE> AV isn't perfect </SURPRISE>\n", "\n", "
\n", "

\n", "

\n", "At least we got that out of our systems we can keep moving foward and see what else we can discover!\n", "
" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Number of files per sample\n", "filesdf[['sample','count']].groupby(['sample']).sum().sort('count', ascending=0).head(10)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
sample
fffa22264e6ebebdfcc3c9526d8bc19c_20130313 14598
c352624409de5b479f26a904c29d413f_20130719 4936
ef3be687d525c85b00a91efdfda711e9_20121204 4928
51e711110049f0788bcac16b0acd558a_20130814 4674
e259f0c751b02bd2419538ddc6b99772_20140314 3496
d3819a56d678838f0e01fa2c637f3b1a_20111004 3480
7138d1cd36d383673844013d4eae97af_20130116 3312
ae3d23caa091be1d3df1107898ea5231_20110902 3292
a1da196baea54a71d34e6421b7a8f040_20130908 3210
0f0fd9ada450841ab1fd767d7387e489_20130803 3198
\n", "

10 rows \u00d7 1 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 46, "text": [ " count\n", "sample \n", "fffa22264e6ebebdfcc3c9526d8bc19c_20130313 14598\n", "c352624409de5b479f26a904c29d413f_20130719 4936\n", "ef3be687d525c85b00a91efdfda711e9_20121204 4928\n", "51e711110049f0788bcac16b0acd558a_20130814 4674\n", "e259f0c751b02bd2419538ddc6b99772_20140314 3496\n", "d3819a56d678838f0e01fa2c637f3b1a_20111004 3480\n", "7138d1cd36d383673844013d4eae97af_20130116 3312\n", "ae3d23caa091be1d3df1107898ea5231_20110902 3292\n", "a1da196baea54a71d34e6421b7a8f040_20130908 3210\n", "0f0fd9ada450841ab1fd767d7387e489_20130803 3198\n", "\n", "[10 rows x 1 columns]" ] } ], "prompt_number": 46 }, { "cell_type": "code", "collapsed": false, "input": [ "filesdf[['conn_uids','count']].groupby(['conn_uids']).sum().sort('count', ascending=0).head(10)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
conn_uids
C9KyD7n902u8uko9j 2916
CENibi3Z3bv3ZVlyqf 972
COhNOY1kIa174wPKK6 972
CCBO2p2JDrryA2k1gb 972
CaTFVw42sBoMSa9Zcl 972
CBiXTD427Vvn9DXymd 972
CN0i562AIvEXAXVdS6 972
CVANI54q1eA8PJEPNl 972
C9O3nw2UUAuRVkxqHe 972
CgQrNE10zxxoKNF1O7 972
\n", "

10 rows \u00d7 1 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 47, "text": [ " count\n", "conn_uids \n", "C9KyD7n902u8uko9j 2916\n", "CENibi3Z3bv3ZVlyqf 972\n", "COhNOY1kIa174wPKK6 972\n", "CCBO2p2JDrryA2k1gb 972\n", "CaTFVw42sBoMSa9Zcl 972\n", "CBiXTD427Vvn9DXymd 972\n", "CN0i562AIvEXAXVdS6 972\n", "CVANI54q1eA8PJEPNl 972\n", "C9O3nw2UUAuRVkxqHe 972\n", "CgQrNE10zxxoKNF1O7 972\n", "\n", "[10 rows x 1 columns]" ] } ], "prompt_number": 47 }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's always fun when data causes more questions than it answers! What's with all the repeated 972s above? Maybe we're not looking at it correctly" ] }, { "cell_type": "code", "collapsed": false, "input": [ "filesdf[['sample','conn_uids','count']].groupby(['sample','conn_uids']).sum().sort('count', ascending=0).head(20)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
sampleconn_uids
fffa22264e6ebebdfcc3c9526d8bc19c_20130313C9KyD7n902u8uko9j 2910
CVANI54q1eA8PJEPNl 970
C3lCz83lC3PGZKMUR9 970
C9O3nw2UUAuRVkxqHe 970
CBiXTD427Vvn9DXymd 970
CCBO2p2JDrryA2k1gb 970
CN0i562AIvEXAXVdS6 970
COhNOY1kIa174wPKK6 970
CENibi3Z3bv3ZVlyqf 970
Cf6EYC22yHQsulV7mc 970
CgQksU3fAxqa2VzJmi 970
CgQrNE10zxxoKNF1O7 970
CaTFVw42sBoMSa9Zcl 970
c352624409de5b479f26a904c29d413f_20130719CFPUpI2zTBwvTHZWe5 468
C7HuQHe3tlEc740dk 450
42c918193f5f3fe008e1ad8007ee0a64_20120612CNCa6Z2Ybjei8Cu0B 446
CJtgFl3ASjdriC7976 438
b1321a9f0dd6c48c296a07205557b969_20120201CNzvnh3VdsIivzr2z8 346
CyP6oYOs7782sfNO1 310
9003a3423d9e3d05d96b4a09d8d64c61_20120131CgDZVO1O4jpz7Rz3uj 292
\n", "

20 rows \u00d7 1 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 48, "text": [ " count\n", "sample conn_uids \n", "fffa22264e6ebebdfcc3c9526d8bc19c_20130313 C9KyD7n902u8uko9j 2910\n", " CVANI54q1eA8PJEPNl 970\n", " C3lCz83lC3PGZKMUR9 970\n", " C9O3nw2UUAuRVkxqHe 970\n", " CBiXTD427Vvn9DXymd 970\n", " CCBO2p2JDrryA2k1gb 970\n", " CN0i562AIvEXAXVdS6 970\n", " COhNOY1kIa174wPKK6 970\n", " CENibi3Z3bv3ZVlyqf 970\n", " Cf6EYC22yHQsulV7mc 970\n", " CgQksU3fAxqa2VzJmi 970\n", " CgQrNE10zxxoKNF1O7 970\n", " CaTFVw42sBoMSa9Zcl 970\n", "c352624409de5b479f26a904c29d413f_20130719 CFPUpI2zTBwvTHZWe5 468\n", " C7HuQHe3tlEc740dk 450\n", "42c918193f5f3fe008e1ad8007ee0a64_20120612 CNCa6Z2Ybjei8Cu0B 446\n", " CJtgFl3ASjdriC7976 438\n", "b1321a9f0dd6c48c296a07205557b969_20120201 CNzvnh3VdsIivzr2z8 346\n", " CyP6oYOs7782sfNO1 310\n", "9003a3423d9e3d05d96b4a09d8d64c61_20120131 CgDZVO1O4jpz7Rz3uj 292\n", "\n", "[20 rows x 1 columns]" ] } ], "prompt_number": 48 }, { "cell_type": "code", "collapsed": false, "input": [ "filesdf[filesdf['conn_uids'] == 'CVANI54q1eA8PJEPNl'].shape[0]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 49, "text": [ "972" ] } ], "prompt_number": 49 }, { "cell_type": "code", "collapsed": false, "input": [ "print filesdf[filesdf['conn_uids'] == 'CVANI54q1eA8PJEPNl']['sample'].unique()\n", "print filesdf[filesdf['conn_uids'] == 'C9KyD7n902u8uko9j']['sample'].unique() " ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[fffa22264e6ebebdfcc3c9526d8bc19c_20130313\n", " 2f261ef858fe6ac50d3c1a4f9abf9090_20111108]\n", "[fffa22264e6ebebdfcc3c9526d8bc19c_20130313\n", " 2f261ef858fe6ac50d3c1a4f9abf9090_20111108]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 50 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Guess Bro conn uids weren't as unique as I thought they should be.\n", "
\n", "\n", "
\n", "\n", "Let's move on, quickly, shall we!\n", "\n", "

\n", "Now that we have a good handle on the data and the successes/failurs of AV, what if we could figure out what samples and sessions had \"interesting\" combinations of file types. Could we build a better driveby detector?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# These are so we can pick up combinations of executable/persistent mime-types along with a mime-type that is frequently\n", "# associated with exploits/drivebys\n", "executable_types = set(['application/x-dosexec', 'application/octet-stream', 'binary', 'application/vnd.ms-cab-compressed'])\n", "common_exploit_types = set(['application/x-java-applet','application/pdf','application/zip','application/jar','application/x-shockwave-flash'])\n", "\n", "# If there is at least one executable type and one exploit type in a list of mime-types\n", "def intresting_combo_data(mimetypes):\n", " mt = set(mimetypes.tolist())\n", " et = set()\n", " cet = set()\n", " et = mt.intersection(executable_types)\n", " cet = mt.intersection(common_exploit_types)\n", " if len(et) > 0 and len(cet) > 0:\n", " return \":\".join(cet) + \":\" + \":\".join(et)\n", " if len(et) > 0 and len(cet) == 0:\n", " return \":\".join(et)\n", " if len(cet) > 0 and len(et) == 0:\n", " return \":\".join(cet)\n", " return \"NONE\"\n", "\n", "def intresting_combo_label(mimetypes):\n", " mt = set(mimetypes.tolist())\n", " et = set()\n", " cet = set()\n", " et = mt.intersection(executable_types)\n", " cet = mt.intersection(common_exploit_types)\n", " if len(et) > 0 and len(cet) > 0:\n", " return \"C-c-c-combo\"\n", " if len(et) > 0 and len(cet) == 0:\n", " return \"Executable only\"\n", " if len(cet) > 0 and len(et) == 0:\n", " return \"Exploit only\"\n", " return \"NONE\"\n", "\n", "# Lookup to see what the Bro - Team Cymru Malware Hash Registry picks up\n", "def tc_mhr_present(sha1):\n", " for h in set(sha1.tolist()):\n", " if h in hashes:\n", " return True\n", " return False" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 51 }, { "cell_type": "code", "collapsed": false, "input": [ "# Get the data in a list (Series) of -> \n", "sample_groups = filesdf.groupby('sample')\n", "s = sample_groups['mime_type'].apply(lambda x: x.unique())\n", "\n", "# Rebuild the series into a dataframe and then \"collapse\" the dataframe with a reset index\n", "sample_combos = pd.DataFrame(s, columns=['mime_types'])\n", "sample_combos['sample'] = s.index\n", "sample_combos['combos_data'] = s.map(intresting_combo_data)\n", "sample_combos['combos_label'] = s.map(intresting_combo_label)\n", "\n", "# Add some more columns and reset the index\n", "sample_combos['sha1'] = sample_groups['sha1'].apply(lambda x: x.unique())\n", "sample_combos['num_files'] = sample_groups['sha1'].apply(lambda x: len(x))\n", "sample_combos = sample_combos.reset_index(drop=True)\n", "sample_combos['mhr'] = sample_combos['sha1'].map(tc_mhr_present)\n", "sample_combos.head()\n", "# Now we have a nice \"flat\" dataframe that for each sample has a list of sha1s associated with it, along with mime-types\n", "# associated with it. Including the list of interesting mime-type combinations and if any of the sha1 hashes were picked up in\n", "# the MHR" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "

\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mime_typessamplecombos_datacombos_labelsha1num_filesmhr
0 [text/html, text/plain, image/jpeg, applicatio... 00065098d5b9f76f15b7eafadc0fd262_20120531 application/zip:application/x-dosexec:binary C-c-c-combo [faa7c496d19abe7fdb0e46deeac899353a6d29f8, a37... 84 True
1 [text/html, image/png, text/plain, image/jpeg,... 0009e3e91e87268dfa577f4626072bab_20120615 application/zip:application/x-dosexec:binary C-c-c-combo [7f140fddab21ae35f577f3527aed9933d05b58d3, 32f... 66 False
2 [text/plain, text/html, image/jpeg, image/gif,... 001d54c3e3f4cb05bc7676c98d70d0ec_20120509 application/x-shockwave-flash:application/pdf:... C-c-c-combo [3e611f6de96f98df23791dc837aa62f0d627a366, 17a... 350 True
3 [text/html, text/plain, application/jar, appli... 0020e9fc0bf7538cdf75b0308c5a236c_20121230 application/x-shockwave-flash:application/jar:... C-c-c-combo [fad057c5e1022a584646517aa2a4ef2998937490, cda... 126 True
4 [text/html, text/plain, image/gif, application... 002487431d095f45222491166c16f2ae_20120121 application/x-shockwave-flash:application/jar:... C-c-c-combo [fea5705f0bfa0f45a6dac2dbc8ffa9106a7bc3f4, be0... 132 True
\n", "

5 rows \u00d7 7 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 52, "text": [ " mime_types \\\n", "0 [text/html, text/plain, image/jpeg, applicatio... \n", "1 [text/html, image/png, text/plain, image/jpeg,... \n", "2 [text/plain, text/html, image/jpeg, image/gif,... \n", "3 [text/html, text/plain, application/jar, appli... \n", "4 [text/html, text/plain, image/gif, application... \n", "\n", " sample \\\n", "0 00065098d5b9f76f15b7eafadc0fd262_20120531 \n", "1 0009e3e91e87268dfa577f4626072bab_20120615 \n", "2 001d54c3e3f4cb05bc7676c98d70d0ec_20120509 \n", "3 0020e9fc0bf7538cdf75b0308c5a236c_20121230 \n", "4 002487431d095f45222491166c16f2ae_20120121 \n", "\n", " combos_data combos_label \\\n", "0 application/zip:application/x-dosexec:binary C-c-c-combo \n", "1 application/zip:application/x-dosexec:binary C-c-c-combo \n", "2 application/x-shockwave-flash:application/pdf:... C-c-c-combo \n", "3 application/x-shockwave-flash:application/jar:... C-c-c-combo \n", "4 application/x-shockwave-flash:application/jar:... C-c-c-combo \n", "\n", " sha1 num_files mhr \n", "0 [faa7c496d19abe7fdb0e46deeac899353a6d29f8, a37... 84 True \n", "1 [7f140fddab21ae35f577f3527aed9933d05b58d3, 32f... 66 False \n", "2 [3e611f6de96f98df23791dc837aa62f0d627a366, 17a... 350 True \n", "3 [fad057c5e1022a584646517aa2a4ef2998937490, cda... 126 True \n", "4 [fea5705f0bfa0f45a6dac2dbc8ffa9106a7bc3f4, be0... 132 True \n", "\n", "[5 rows x 7 columns]" ] } ], "prompt_number": 52 }, { "cell_type": "markdown", "metadata": {}, "source": [ "With the nice table above we have a sample view of the unique mime-types, unique files, total # of files and if any of those files were detected by the MHR all rolled into once nice package.\n", "

\n", "

\n", "Assumption Alert!\n", "
\n", "In the case of using sample (eg. PCAP) we can treat this as activity from a single host w/o worry about trying to unique out all the information about the sandbox env and it's IPs.\n", "
" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print \"Reminder\"\n", "print \"Total files found: %s\" %len(filesdf.index)\n", "print \"Total Samples: %s\" %len(sample_combos.index)\n", "print \"\\nData summary\"\n", "print sample_combos.combos_label.value_counts()\n", "sample_combos['count'] = 1\n", "sample_combos[['combos_label','combos_data','count']].groupby(['combos_label','combos_data']).sum().sort('count', ascending=0).head(15)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Reminder\n", "Total files found: 1100106\n", "Total Samples: 6662\n", "\n", "Data summary\n", "C-c-c-combo 5410\n", "Executable only 1218\n", "Exploit only 25\n", "NONE 9\n", "dtype: int64\n" ] }, { "html": [ "

\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
combos_labelcombos_data
Executable onlyapplication/x-dosexec 801
C-c-c-comboapplication/jar:application/x-dosexec 403
application/zip:application/x-dosexec:binary 361
application/jar:application/x-dosexec:binary 352
Executable onlyapplication/x-dosexec:binary 305
C-c-c-comboapplication/jar:application/pdf:application/x-dosexec:binary 303
application/zip:application/pdf:application/x-dosexec:binary 274
application/zip:application/pdf:application/x-shockwave-flash:application/x-dosexec:binary 248
application/zip:application/pdf:application/x-shockwave-flash:application/x-dosexec 238
application/x-shockwave-flash:application/x-dosexec 228
application/zip:application/x-dosexec 184
application/zip:application/x-shockwave-flash:application/x-dosexec:binary 181
application/x-shockwave-flash:application/pdf:application/x-dosexec 172
application/x-shockwave-flash:application/jar:application/pdf:application/x-dosexec:binary 171
application/x-shockwave-flash:application/jar:application/x-dosexec:binary 168
\n", "

15 rows \u00d7 1 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 53, "text": [ " count\n", "combos_label combos_data \n", "Executable only application/x-dosexec 801\n", "C-c-c-combo application/jar:application/x-dosexec 403\n", " application/zip:application/x-dosexec:binary 361\n", " application/jar:application/x-dosexec:binary 352\n", "Executable only application/x-dosexec:binary 305\n", "C-c-c-combo application/jar:application/pdf:application/x-dosexec:binary 303\n", " application/zip:application/pdf:application/x-dosexec:binary 274\n", " application/zip:application/pdf:application/x-shockwave-flash:application/x-dosexec:binary 248\n", " application/zip:application/pdf:application/x-shockwave-flash:application/x-dosexec 238\n", " application/x-shockwave-flash:application/x-dosexec 228\n", " application/zip:application/x-dosexec 184\n", " application/zip:application/x-shockwave-flash:application/x-dosexec:binary 181\n", " application/x-shockwave-flash:application/pdf:application/x-dosexec 172\n", " application/x-shockwave-flash:application/jar:application/pdf:application/x-dosexec:binary 171\n", " application/x-shockwave-flash:application/jar:application/x-dosexec:binary 168\n", "\n", "[15 rows x 1 columns]" ] } ], "prompt_number": 53 }, { "cell_type": "code", "collapsed": false, "input": [ "(100. * sample_combos.combos_data.value_counts() / len(sample_combos.index)).head(10)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 54, "text": [ "application/x-dosexec 12.023416\n", "application/jar:application/x-dosexec 6.049234\n", "application/zip:application/x-dosexec:binary 5.418793\n", "application/jar:application/x-dosexec:binary 5.283699\n", "application/x-dosexec:binary 4.578205\n", "application/jar:application/pdf:application/x-dosexec:binary 4.548184\n", "application/zip:application/pdf:application/x-dosexec:binary 4.112879\n", "application/zip:application/pdf:application/x-shockwave-flash:application/x-dosexec:binary 3.722606\n", "application/zip:application/pdf:application/x-shockwave-flash:application/x-dosexec 3.572501\n", "application/x-shockwave-flash:application/x-dosexec 3.422396\n", "dtype: float64" ] } ], "prompt_number": 54 }, { "cell_type": "code", "collapsed": false, "input": [ "# Sorry for the lousy formatting, I really wanted (me) and you to see all the crazy combinations of files in some of these samples.\n", "# Maybe they're multiple malicious sites, or maybe it's just some crazy spray-and-pray happening!\n", "sample_mhr = sample_combos[sample_combos['mhr'] == True]\n", "print \"Total Samples: %s\" %len(sample_mhr.index) \n", "print\n", "print sample_mhr.combos_label.value_counts()\n", "print\n", "print (100. * sample_mhr.combos_data.value_counts() / len(sample_mhr.index)).head(10)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Total Samples: 2849\n", "\n", "C-c-c-combo 2761\n", "Executable only 85\n", "Exploit only 3\n", "dtype: int64\n", "\n", "application/jar:application/x-dosexec 9.582310\n", "application/jar:application/pdf:application/x-dosexec:binary 7.230607\n", "application/zip:application/pdf:application/x-shockwave-flash:application/x-dosexec:binary 7.195507\n", "application/zip:application/pdf:application/x-shockwave-flash:application/x-dosexec 6.739207\n", "application/zip:application/x-dosexec:binary 6.598807\n", "application/zip:application/pdf:application/x-dosexec:binary 5.440505\n", "application/jar:application/x-dosexec:binary 5.229905\n", "application/x-shockwave-flash:application/pdf:application/x-dosexec 4.563005\n", "application/x-shockwave-flash:application/pdf:application/x-dosexec:binary 3.580204\n", "application/x-shockwave-flash:application/jar:application/pdf:application/x-dosexec:binary 3.545104\n", "dtype: float64\n" ] } ], "prompt_number": 55 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "

\n", "We've got a great picture at how things could look coming from a host in a \"short\" amount of itme, wonder what it looks like when it's broken up at the network layer. Let's mimic the layout and some of the analysis from above and see what pops up.\n", "

\n", "" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Get the data in a list (Series) of -> \n", "uid_groups = filesdf.groupby('conn_uids')\n", "s = uid_groups['mime_type'].apply(lambda x: x.unique())\n", "\n", "# Rebuild the series into a dataframe and then \"collapse\" the dataframe with a reset index\n", "uid_combos = pd.DataFrame(s, columns=['mime_types'])\n", "uid_combos['conn_uid'] = s.index\n", "uid_combos['combos_data'] = s.map(intresting_combo_data)\n", "uid_combos['combos_label'] = s.map(intresting_combo_label)\n", "\n", "# Same trick, different day\n", "uid_combos['sha1'] = uid_groups['sha1'].apply(lambda x: x.unique())\n", "uid_combos['num_files'] = uid_groups['sha1'].apply(lambda x: len(x))\n", "uid_combos = uid_combos.reset_index(drop=True)\n", "uid_combos = uid_combos[uid_combos['conn_uid'] != '(empty)']\n", "uid_combos['mhr'] = uid_combos['sha1'].map(tc_mhr_present)\n", "uid_combos.head()\n", "# Now we've got the same type of dataframe as above in sample_combos." ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "

\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mime_typesconn_uidcombos_datacombos_labelsha1num_filesmhr
1 [image/png, text/plain] C000io4MJcSJMUYhmb NONE NONE [d34f84ee29438bba5c353a9d20f3536badb38178, 577... 32 False
2 [image/jpeg] C001r8hbIKrnTGyHf NONE NONE [74d87f7b1ca35f84cd4f1a08314c2d2b8c2aa763, 59d... 4 False
3 [application/zip] C002bZ2fhBI7mYwQxf application/zip Exploit only [c17ac3fb131adc485b32bebb3bcad742a0a676d1] 2 False
4 [text/html] C007502KmyrlCzKHqb NONE NONE [36124e9da41313a4bc3a903abe5fccf0ea9c7736] 2 False
5 [image/gif] C009392KwetlBZpxC NONE NONE [75e91ae3e549dab12ed1c9787ade9131aef1c981] 2 False
\n", "

5 rows \u00d7 7 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 56, "text": [ " mime_types conn_uid combos_data combos_label \\\n", "1 [image/png, text/plain] C000io4MJcSJMUYhmb NONE NONE \n", "2 [image/jpeg] C001r8hbIKrnTGyHf NONE NONE \n", "3 [application/zip] C002bZ2fhBI7mYwQxf application/zip Exploit only \n", "4 [text/html] C007502KmyrlCzKHqb NONE NONE \n", "5 [image/gif] C009392KwetlBZpxC NONE NONE \n", "\n", " sha1 num_files mhr \n", "1 [d34f84ee29438bba5c353a9d20f3536badb38178, 577... 32 False \n", "2 [74d87f7b1ca35f84cd4f1a08314c2d2b8c2aa763, 59d... 4 False \n", "3 [c17ac3fb131adc485b32bebb3bcad742a0a676d1] 2 False \n", "4 [36124e9da41313a4bc3a903abe5fccf0ea9c7736] 2 False \n", "5 [75e91ae3e549dab12ed1c9787ade9131aef1c981] 2 False \n", "\n", "[5 rows x 7 columns]" ] } ], "prompt_number": 56 }, { "cell_type": "code", "collapsed": false, "input": [ "# Same deal as above, these 2 make the same tables as the images below\n", "#uid_combos.describe()\n", "#sample_combos.describe()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 57 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The tables below were converted to .png files for pretty display, but they're just screen-caps of the above commands\n", "


\n", "

Stats bassed on session (conn_uid)
\n", "
Stats based on sample (sample)
" ] }, { "cell_type": "code", "collapsed": false, "input": [ "df_uid = pd.DataFrame()\n", "df_uid['num_files'] = uid_combos['num_files']\n", "df_uid['label'] = \"session\"\n", "df_sample = pd.DataFrame()\n", "df_sample['num_files'] = sample_combos['num_files']\n", "df_sample['label'] = \"sample\"\n", "df = pd.concat([df_sample, df_uid], ignore_index=True)\n", "df.boxplot('num_files','label',vert=False)\n", "plt.pyplot.xlabel('Number of Files, Session v. Sample')\n", "plt.pyplot.ylabel('# of Files')\n", "plt.pyplot.title('Comparision of # Files')\n", "plt.pyplot.suptitle(\"\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 82, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAA+0AAAFICAYAAAAlCR9nAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmcjXX/x/H3mWFwk73IjC0Mxqx2So4kdWevSNGtRd1K\n0uJO26+IcJNf6Ud3d7dQ6Vbu+06ixR2OSlmGmclSWZpBthozyDDM8P39ccwxM2Ycmu2c73k9H4/z\nmHOt53td75PmM+f6XMdhjDECAAAAAAA+J6isBwAAAAAAAApG0Q4AAAAAgI+iaAcAAAAAwEdRtAMA\nAAAA4KMo2gEAAAAA8FEU7QAAAAAA+CiKdgAALDN//nz17NnT63ojRozQhAkTSmFEeb3++uuqU6eO\nqlatqvT09BJ9rfznIigoSD/99FOJviYAAMXJwfe0AwBQsPfee0/Tp0/Xjz/+qMsuu0yxsbF65pln\ndPXVV5f10PxWVlaWqlWrpnXr1ikyMvKC6x47dkwRERHavXu33nrrLW3ZskUvv/xygeu6XC5dd911\nqly5smfeddddp48++ijPekFBQdqxY4euuuqqoh8MAACloFxZDwAAAF80ffp0TZkyRW+88YZ69uyp\nkJAQffbZZ1q8eLFPF+2nT59WcHBwWQ+jUAcOHFBmZqZatmzpdd2EhAS1bt1akrRhwwav5z00NFR7\n9uwplnECAOAruDweAIB8jhw5oueff16zZs1Sv379VKlSJQUHB+vmm2/WlClTJEknT57U6NGjFRoa\nqtDQUD366KM6deqUJPenvmFhYZo6daquuOIK1atXT4sWLdInn3yi8PBw1apVS5MnT/a83gsvvKBb\nb71Vt99+u6pWrao2bdrou+++8yyfPHmymjZtqqpVq6pVq1ZatGiRZ9ncuXN19dVX67HHHlPt2rX1\nwgsvaO7cuerSpYskyRijRx99VHXq1FG1atUUHR2trVu3SpKGDRum5557zrOvN998U82aNVOtWrXU\nt29f7d+/37MsKChIb7zxhsLDw1WjRg2NHDmy0PNX2LnZtm2bp1ivXr26rr/++gvmEB8fn6doj4uL\nu+D6Bcl9Lgoa5xNPPKGGDRuqbt26GjFihDIzMyVJqamp6tWrl2rUqKFatWrp2muvFRcnAgDKAkU7\nAAD5fPvtt8rMzFT//v0LXWfixIlat26dkpKSlJSUpHXr1uXpDz948KBOnjyp/fv3a/z48brvvvs0\nf/58JSQk6KuvvtL48eO1a9cuz/qLFy/WwIEDlZ6erjvuuEP9+vXT6dOnJUlNmzbV119/raNHj+r5\n55/XkCFDdPDgQc+269atU5MmTfTLL7/omWeeyTPOZcuW6auvvtL27dt15MgRLVy4UDVr1pQkORwO\nORwOSdKKFSv09NNPa+HChdq/f78aNmyo22+/Pc++li5dqvj4eH333Xf64IMP9Pnnn1/SuQkPD9eW\nLVskuf8w8sUXXxS4/X333acaNWpo7NixmjZtmmrUqKH4+Hh17txZUVFRhWZyqcaOHasdO3YoKSlJ\nO3bs0N69ezV+/HhJ0ssvv6z69esrNTVVv/zyiyZNmuQ5VwAAlCaKdgAA8jl06JBq166toKDC/zf5\n3nvv6X/+539Uu3Zt1a5dW88//7zeeecdz/Ly5cvrmWeeUXBwsAYNGqS0tDSNHj1alStXVkREhCIi\nIpSUlORZv23bthowYICCg4P12GOPKTMzU99++60k6dZbb1XdunUlSQMHDlSzZs20du1az7b16tXT\nQw89pKCgIFWsWDHPOMuXL6/ffvtN33//vc6cOaPmzZt79pXb/Pnzde+99yo2NlYhISGaNGmSvv32\nW+3evduzztixY1W1alXVr19f3bp1U2Ji4iWfm4v5tPof//iHfvrpJzVq1Ei//vqrZs2apT//+c9K\nT0/Xpk2bCt1u3759qlGjhuexcOHCQgttY4zefPNNTZ8+XdWrV1eVKlX01FNPacGCBZKkkJAQ7d+/\nXykpKQoODvbplggAgN0o2gEAyKdWrVpKTU3VmTNnCl1n3759atiwoWe6QYMG2rdvX5595BSMlSpV\nkiTVqVPHs7xSpUo6duyYZzosLMzz3OFwKCwszHN5+ttvv624uDhPMbp582YdOnTIs379+vULHed1\n112nkSNH6qGHHlKdOnX0wAMP6LfffjtvvZxP13NUrlxZtWrV0t69ez3zchf7f/jDH/KMPzdv5+ZC\nFi9erBo1aqh+/fratWuX6tatqz/96U96++23VaNGDW3YsKHQbevVq6f09HTP47bbbiv0jwS//vqr\njh8/rjZt2njO60033aTU1FRJ0pgxY9S0aVPdcMMNatKkiactAgCA0kbRDgBAPp06dVKFChX04Ycf\nFrpOvXr1lJKS4pnevXu36tWr97tfM/cN1M6cOaOff/5Z9erV065du3T//fdr5syZSktLU3p6uiIj\nI/MUo94u23744YcVHx+vrVu3atu2bZo6darX48nIyNChQ4cUGhp6ycdSlHPTp08fpaena+jQoZo3\nb57S09NVs2ZNpaamKj09XW3atLnk8RSkdu3aqlSpkrZu3eop8g8fPqyjR49KkqpUqaJp06Zp586d\nWrx4saZPn64VK1YUy2sDAHApKNoBAMinWrVqGj9+vB566CF99NFHOn78uLKysvTpp5/qySeflCQN\nHjxYEyZMUGpqqlJTUzV+/HgNHTr0d7/mhg0b9OGHHyo7O1uvvPKKKlasqI4dOyojI0MOh0O1a9fW\nmTNnNGfOHG3evPmi9xsfH6+1a9cqKytLf/jDH1SxYkXP3eWNMZ7if/DgwZozZ46SkpJ08uRJPf30\n0+rYsaMaNGhQ4H4vdJl7cZybnJvQJScn68orr1RISMglbe9NUFCQhg8frtGjR+vXX3+VJO3du1fL\nli2T5O7f37Fjh4wxqlq1qoKDg336rvwAAHtRtAMAUIDHHntM06dP14QJE3TFFVeoQYMGmjVrlufm\ndM8++6zatm2r6OhoRUdHq23btnr22Wc92+f/9PtCn4Y7HA717dtX77//vmrWrKn58+frP//5j4KD\ngxUREaHHH39cnTp1Ut26dbV582Zdc801ebYt6LVy5h09elT333+/atasqUaNGql27doaM2bMeet1\n795dL774om655RbVq1dPycnJnv7uwo6nsGO61HOTX1ZWlnbv3q1mzZopISFBbdu2veD6F9pv/nHm\nfj5lyhQ1bdpUHTt2VLVq1dSjRw9t27ZNkrR9+3b16NFDl112mTp37qyHHnpIXbt2vahxAABQnByG\n7y8BAKBMjRs3Tjt27MhzIzsAAACJT9oBAChz/P0cAAAUhqIdAIAydqFLzQEAQGDj8ngAAAAAAHwU\nn7QDAAAAAOCjypX1AMpKbGyskpKSynoYAAAAAAALxMTEKDExsdj3G7CXxzscDm78Y4lhw4Zp7ty5\nZT0MFAOytAdZ2oU87UGW9iBLe5ClPUqqxuTyeAAAAAAAfBRFO/xeo0aNynoIKCZkaQ+ytAt52oMs\n7UGW9iBLeEPRDr/ndDrLeggoJmRpD7K0C3nagyztQZb2IEt4Q9EOAAAAAICPomgHAAAAAMBHcfd4\nAAAAAACKiLvHAwAAAAAQYCja4fdcLldZDwHFhCztQZZ2IU97kKU9yNIeZAlvKNoBAAAAAPBR9LQD\nAAAAAFBE9LQDAAAAABBgKNrh9+gDsgdZ2oMs7UKe9iBLe5ClPcgS3lC0AwAAAADgo+hpBwAAAACg\niOhpBwAAAAAgwFC0w+/RB2QPsrQHWdqFPO1BlvYgS3uQJbyhaAcAAAAAwEfR0w4AAAAAQBHR0w4A\nAAAAQIChaIffow/IHmRpD7K0C3nagyztQZb2IEt4Q9EOAAAAAICPoqcdAAAAAIAioqcdAAAAAIAA\nQ9EOv0cfkD3I0h5kaRfytAdZ2oMs7UGW8IaiHQAAAAAAH0VPOwAAAAAARURPOwAAAAAAAYaiHX6P\nPiB7kKU9yNIu5GkPsrQHWdqDLOENRTsAAAAAAD6KnnYAAAAAAIqInnYAAAAAAAIMRTv8Hn1A9iBL\ne5ClXcjTHmRpD7K0B1nCG4p2AAAAAAB8FD3tAAAAAAAUET3tAAAAAAAEGIp2+D36gOxBlvYgS7uQ\npz3I0h5kaQ+yhDcU7QAAAAAA+Ch62gEAAAAAKCJ62gEAAAAACDAU7fB79AHZgyztQZZ2IU97kKU9\nyNIeZAlvKNoBAAAAAPBR9LQDAAAAAFBE9LQDAAAAABBgKNrh9+gDsgdZ2oMs7UKe9iBLe5ClPcgS\n3lC0AwAAAADgo+hpBwAAAACgiOhpBwAAAAAgwFC0w+/RB2QPsrQHWdqFPO1BlvYgS3uQJbyhaAcA\nAAAAwEfR0w4AAAAAQBHR0w4AAAAAQIChaIffow/IHmRpD7K0C3nagyztQZb2IEt4Q9EOAAAAAICP\noqcdAAAAAIAioqcdAAAAAIAAQ9EOv0cfkD3I0h5kaRfytAdZ2oMs7UGW8IaiHQAAAAAAH0VPOwAA\nAAAARURPOwAAAAAAAYaiHX6PPiB7kKU9yNIu5GkPsrQHWdqDLOENRTsAAAAAAD7Kr3ra9+3bp0ce\neUQLFy4s8r7oaQcAAAAAFJeSqjH9qmgvTg6HQ5L3Qw8Kks6ckSIjpddek1591T3/kUfOreN0Si6X\n+2duLpeUmCjFxp6/rKSFhEinTpXua6L4FPR+AgAAAOC7/O5GdBkZGbr55psVGxurqKgoffDBB9qw\nYYOcTqfatm2rG2+8UQcOHJAkzZgxQ61atVJMTIwGDx4sSVq1apXi4uIUFxen1q1bKyMjQykpKYqK\nipIkZWZm6u6771Z0dLRat27t6QWZO3euBgwYoJtuuknh4eF68skni3QcZ864f37/vbuQWrnS/XC5\nzj2kcz9zc7mkRYsKXlbSsrJK/zXLio19QBYe0kWxMctARZZ2IU97kKU9yNIeZAlvypXUjj/77DOF\nhoZq6dKlkqSjR4/qpptu0uLFi1WrVi29//77euaZZzR79mxNmTJFKSkpKl++vI4ePSpJevnllzVr\n1ix16tRJx48fV4UKFfLsf+bMmQoODtZ3332nH3/8UTfccIO2bdsmSUpKSlJiYqJCQkLUvHlzjRo1\nSqGhoSV1qAAAAAAAlIgSK9qjo6P1xBNPaOzYserVq5eqV6+uzZs36/rrr5cknT59WvXq1fOse8cd\nd6hfv37q16+fJOnqq6/Wo48+qjvvvFMDBgw4r+hevXq1Ro0aJUlq3ry5GjZsqG3btsnhcKh79+66\n7LLLJEkRERFKSUkppGgfJqnR2efVJcVKcp6ddp396Tw7XpfGjTs3PW7cueV/+5t08KBLa9ZIdes6\ntXWrtGOHS+np7uWrVkkzZrjUtKn01786z15O797eefYa6OKYvv566fTpc+N3ONyvX768tGxZ8b+e\nr0w7nU6fGs/vnU5MlA4fdk+PG+dSSorUqJHz7GXyZT8+ppm+1OkcvjIepos2ncNXxsP075vOmecr\n42H69087nU6fGg/TTAfidGJiog4fPixJSklJUUkp0Z72w4cPa+nSpXrzzTfVrVs3ff755/rmm2/O\nW+/MmTP68ssv9fHHH+vTTz/V5s2bFRQUpC1btmjp0qWaNWuWPv/8c1WoUEG9e/fWpk2bNGDAAD38\n8MPq1q2bJOnaa6/VzJkztXHjRsXHx+u1116TJPXu3VtjxozRtddem/fAL7KnPUdwsPTss9Irr7in\nR48+t+yFF849cnvhBcnlkpzO85eVNIdDCsy7FdihoPcTAAAAAN/ldz3t+/fvV8WKFXXnnXfqiSee\n0Lp165Samqo1a9ZIkrKysrR161YZY7R79245nU5NnjxZR44c0bFjx7Rz5061atVKf/nLX9SuXTv9\n+OOPefbfpUsXzZ8/X5K0bds27d69Wy1atCjwJAXovfYCRs5fveD/yNIeZGkX8rQHWdqDLO1BlvCm\nxC6P37Rpk8aMGaOgoCCFhITo9ddfV3BwsEaNGqUjR44oOztbjz76qMLDwzV06FAdOXJExhg98sgj\nqlq1qp599lmtXLlSQUFBioyM1E033aS9e/ee/YRcevDBBzVixAhFR0erXLlymjdvnsqXLy+Hw+FZ\nJ0f+6UsRFOS+GV3Llu5PzJOS3PNzXWVW4HTOvOrV3XePL23ly5f+a6L4FPR+AgAAABB4Avor3wL0\n0AEAAAAAxczvLo8HAAAAAABFQ9EOv0cfkD3I0h5kaRfytAdZ2oMs7UGW8IaiHQAAAAAAH0VPOwAA\nAAAARURPOwAAAAAAAYaiHX6PPiB7kKU9yNIu5GkPsrQHWdqDLOENRTsAAAAAAD6KnnYAAAAAAIqI\nnnYAAAAAAAIMRTv8Hn1A9iBLe5ClXcjTHmRpD7K0B1nCG4p2AAAAAAB8FD3tAAAAAAAUET3tAAAA\nAAAEGIp2+D36gOxBlvYgS7uQpz3I0h5kaQ+yhDcU7QAAAAAA+Ch62gEAAAAAKCJ62gEAAAAACDAU\n7fB79AHZgyztQZZ2IU97kKU9yNIeZAlvKNoBAAAAAPBR9LQDAAAAAFBE9LQDAAAAABBgKNrh9+gD\nsgdZ2oMs7UKe9iBLe5ClPcgS3lC0AwAAAADgo+hpBwAAAACgiOhpBwAAAAAgwFC0w+/RB2QPsrQH\nWdqFPO1BlvYgS3uQJbyhaAcAAAAAwEfR0w4AAAAAQBHR0w4AAAAAQIChaIffow/IHmRpD7K0C3na\ngyztQZb2IEt4Q9EOAAAAAICPoqcdAAAAAIAioqcdAAAAAIAAQ9EOv0cfkD3I0h5kaRfytAdZ2oMs\n7UGW8IaiHQAAAAAAH0VPOwAAAAAARURPOwAAAAAAAYaiHX6PPiB7kKU9yNIu5GkPsrQHWdqDLOEN\nRTsAAAAAAD6KnnYAAAAAAIqInnYAAAAAAAKM16L9lVde0ZEjR2SM0b333qu4uDh9/vnnpTE24KLQ\nB2QPsrQHWdqFPO1BlvYgS3uQJbzxWrS/9dZbqlatmpYtW6a0tDS98847Gjt2bGmMDQAAAACAgOa1\npz0qKkqbNm3SqFGj5HQ6NWDAAMXFxSkhIaG0xlgi6GkHAAAAABSXMutpb9OmjW644QZ98sknuvHG\nG3X06FEFBdEKDwAAAABASfNafc+ePVuTJ09WfHy8/vCHPygrK0tz5swpjbEBF4U+IHuQpT3I0i7k\naQ+ytAdZ2oMs4Y3Xot3hcGjLli2aMWOGJCkjI0OZmZklPjAAAAAAAAKd1572P//5zwoODtby5cv1\nww8/KC0tTTfccIPi4+NLa4wlgp52AAAAAEBxKakas5y3FdauXauEhATFxcVJkmrWrKmsrKxiHwgA\nAAAAAMjL6+XxISEhOn36tGf6119/5UZ08Cn0AdmDLO1BlnYhT3uQpT3I0h5kCW+8Vt8PP/yw+vfv\nr19++UVPP/20rr76aj311FOlMTYAAAAAAAKa1552Sfr++++1fPlySVL37t3VsmXLEh9YSaOnHQAA\nAABQXEqqxiy0aE9LS8sznbOaw+GQ5O5t92cU7QAAAACA4lJSNWahl8e3bt1abdq08Tzatm2rtm3b\neqYBX0EfkD3I0h5kaRfytAdZ2oMs7UGW8KbQu8enpKSU4jAAAAAAAEB+hV4e/8MPP6hFixbauHFj\ngRu2bt26RAdW0rg8HgAAAABQXEq9p3348OF688035XQ6PX3sua1cubLYB1OaKNoBAAAAAMWl1Hva\nb7zxRknuHot///vfWrlyZZ4H4CvoA7IHWdqDLO1CnvYgS3uQpT3IEt4UWrRPmDDB8/z6668vlcEA\nAAAAAIBzCr08Pi4uTgkJCec9twWXxwMAAAAAiktJ1ZiF3j3+xIkT2rhxo4wxeZ7n9Lf7+43oAAAA\nAADwdYV+0p77BnS5i/Uc/t7Xzift9nC5XHI6nWU9DBQDsrQHWdqFPO1BlvYgS3uQpT1K/ZN2bogA\nAAAAAEDZKvSTdtvxSTsAAAAAoLiU+le+AQAAAACAslVo0b569WpJUmZmZqkNBvg9aOWwB1nagyzt\nQp72IEt7kKU9yBLeFFq0jxo1SpLUqVOnUhsMAAAAAAA4p9Ce9g4dOig6OlofffSRbr/99jzX5jsc\nDs2YMaPUBlkS6GkHAAAAABSXUr97/JIlS7R8+XItW7ZMbdq0Oa9oBwAAAAAAJcvr3eMTExMVGxtb\nWuMpNXzSbg++29IeZGkPsrQLedqDLO1BlvYgS3uU2d3ja9Wqpf79++vyyy/X5ZdfrltuuUU///xz\nsQ8EAAAAAADk5fWT9uuvv1533nmnhgwZIkmaP3++5s+fr//+97+lMsCSwiftAAAAAIDiUlI1ptei\nPSYmRklJSV7n+RuKdgAAAABAcSnTy+PfeecdnT59WtnZ2Xr33XdVu3btYh8I8Hvx3Zb2IEt7kKVd\nyNMeZGkPsrQHWcIbr0X7W2+9pQ8++EB169bVlVdeqYULF2rOnDmlMTYAAAAAAAKa18vjbcXl8QAA\nAACA4lJml8cDAAAAAICyQdEOv0cfkD3I0h5kaRfytAdZ2oMs7UGW8IaiHQAAAAAAH+W1p33ChAl6\n9tlnJUmZmZmqWLFiqQyspNHTDgAAAAAoLqXe0z558mR98803WrhwoWde586di30AAAAAAACgYIUW\n7S1atNDChQuVnJysa665RsOHD1dqaqp++OGH0hwf4BV9QPYgS3uQpV3I0x5kaQ+ytAdZwptCi/bq\n1atr0qRJatKkiVwul0aNGiWHw6EpU6aoU6dOpTlGAAAAAAACUqE97U899ZTWrVun9evX6+6771Z0\ndLSmTZum77//vrTHWCLoaQcAAAAAFJeSqjG93oguJiZGs2fP1oYNG/Tss88qPDxcNWvW1Mcff1zs\ngylNFO0AAAAAgOJS6jeiy9GzZ0+1bdtWDzzwgMLCwrR69Wq99dZbxT4Q4PeiD8geZGkPsrQLedqD\nLO1BlvYgS3jjtWj/61//6nk+d+5cSdLll19eYgMCAAAAAABuXi+PtxWXxwMAAAAAikuZXR4PAAAA\nAADKBkU7/B59QPYgS3uQpV3I0x5kaQ+ytAdZwhuKdgAAAAAAfBQ97QAAAAAAFBE97QAAAAAABBiK\ndvg9+oDsQZb2IEu7kKc9yNIeZGkPsoQ3FO0AAAAAAPgoetoBAAAAACgietoBAAAAAAgwFO3we/QB\n2YMs7UGWdiFPe5ClPcjSHmQJbyjaAQAAAADwUfS0AwAAAABQRPS0AwAAAAAQYCja4ffoA7IHWdqD\nLO1CnvYgS3uQpT3IEt5QtAMAAAAA4KPoaQcAAAAAoIjoaQcAAAAAIMBQtMPv0QdkD7K0B1nahTzt\nQZb2IEt7kCW8oWgHAAAAAMBH0dMOAAAAAEAR0dMOAAAAAECAoWiH36MPyB5kaQ+ytAt52oMs7UGW\n9iBLeEPRDgAAAACAj6KnHQAAAACAIqKnHQAAAACAAEPRDr9HH5A9yNIeZGkX8rQHWdqDLO1BlvCG\noh0AAAAAAB9FTzsAAAAAAEVETzsAAAAAAAGGoh1+jz4ge5ClPcjSLuRpD7K0B1nagyzhDUU7AAAA\nAAA+ip52AAAAAACKiJ72ElSzpuRwuB9yODzPcx41a5b1CAEAAAAAgYiiXVJ6umSM+yGde57zSE8v\n2/HhwugDsgdZ2oMs7UKe9iBLe5ClPcgS3lC0AwAAAADgo+hpl/sSeM9ZyDNR6CwAAAAAADzoaQcA\nAAAAIMBQtBczh8NR1kMIOPQB2YMs7UGWdiFPe5ClPcjSHmQJb6wp2p1OpzZs2FDWwwAAAAAAoNhY\nU7Q7HA4f+ZT7tfO+Mq6gx2WXub9KrmZN6Zpr3POios7Na9zY/fOyy6SRI92PqKhz8195xT3vmmvc\nr+pySf37u+dfc417mct17vHKK+6fUt7nubfLPS/3dM68nJ+5n+fIWb+g9UaOPP8s5V6eex+5l+V+\n5J6fs17OvMREp2d+7nEUNM78Y7iU+QWtU9C6l/LH0oLOw8Vud6HXy59f7vUu9vjK4o++Tqez9F/0\nIhXlfOR+zwYKX84Sl4487UGW9iBLe/hSlnzo75tKtGjPyMjQzTffrNjYWEVFRemDDz7Qiy++qPbt\n2ysqKkoPPPCAZ12n06nHHntM7dq1U8uWLbV+/Xr1799f4eHheu655yRJKSkpatGihYYMGaKIiAjd\ndtttOnHixHmvu2zZMnXu3Flt2rTRwIEDlZGRUZKHmU+vi1rr2DH3V8mlp0vx8e55339/bt6uXe6f\nx45JS5a4H99/f27+okXueTnbulzSypXu+fHx7mW5i9dFi879R5j7ee7tcs/LPZ0zL+dnQcVfzvoF\nrbdkyfnHX1BRuGhR3mWFFe056+Uf66JFeccRyEV7/vxyr+fLRbsvK8r5yP2eBQAA8FX8/uebSrRo\n/+yzzxQaGqrExERt2rRJN954o0aOHKl169Zp06ZNOnHihJacregcDocqVKig9evXa8SIEerbt6/+\n9re/afPmzZo7d67Sz35Z+rZt2/TQQw9p69atqlq1qmbNmpXnNVNTUzVx4kQtX75cGzZsUJs2bTR9\n+vSSPEyUscOHXWU9BBQTerrsQZZ2IU97kKU9yNIeZAlvypXkzqOjo/XEE09o7Nix6tWrl6655hr9\n+9//1tSpU3X8+HGlpaUpMjJSvXq5P53u06ePJCkyMlKRkZGqU6eOJOmqq67Snj17VLVqVdWvX1+d\nOnWSJA0ZMkQzZszQ448/LkkyxmjNmjXaunWrOnfuLEk6deqU53l+DscwSY0kSa+8Ul2xsbFynl2W\n8x9PzuUqDofr7BLPGvrTn6S5c50aOVKaOfP85Rc7ffKke/r06XPLjTm3fNeu87dfterctLsrwHV2\nvnv5rl0ujRuX9/VWrZJefNGpM2fc2+devmqVe/m4cXnXnzbNqWrVpH37XPrb36SDB93L//Y3lw4e\nlGbMcOrUKSkjw72+5NSUKVJmpns8kye7j69mTff0FVc4VbfuufG/+65Tx45JwcEu7dsnVanilPvC\niLzHO2FC3vNTrpxLxkhnzrink5LOre8eh+vsOJ06eFBas8alunWl2FinDh+WUlJcmjfv3P5SU106\ndkxq1MhyMQFCAAAahElEQVSpcePcyyVp2DCnnE73+yExUTp82KmUFGnePJcWLZKSktzTBw641+/Y\nsfDtJff7yeWSJk926cAB9/aStGiRe3xjx56/vpT39SVp3Dj361ev7j7elBSXtm6V0tKcys52579q\nlfv4q1Rxn//16yWXy71+zvnIf3yJie7jycnH5XKqUSMpNtal2Ni848k/vuKYzlFS+7/08bjzyv9+\nqV7d+/n417+kzZvd06tWudevXt2pfv3c59MXjq8kpxMTE31qPEyTJ9Pu6cTERJ8aD9NMM31O2b2+\nUy7X7/t9J9CnExMTdfjwYUnuq8JLjClh6enp5t133zVdu3Y148aNM3Xq1DE///yzMcaYF154wYwb\nN84YY4zT6TQbNmwwxhizcuVK06tXL88+cpYlJyebhg0beuYvX77c9O/f37NOfHy8+fjjj83gwYO9\njiv3oec5CwWckks5S1KycX+r+8U/KlRw/wwOPjfP4Tj3vGFD9yM4+Nz8rl3d8ypUcL/u888bU62a\ne36FCu5lzz9/7tG1q/unMXmf594u97zc0znzcn7mfp4jZ/2C1ssVWZ795d4+Zx+5l+V+5J6fs17+\nsXbtmnccBY0z/xguZX5B6xS07sVsn3vdS1m/oNcoaPv8+eVe72KP7/eMy2ZFOR+537MAAAC+it//\niqakyuugkvtzgLR//35VrFhRd955p8aMGaOEhAQ5HA7VqlVLx44d08KFCy95n7t379aaNWskSe+9\n9566dOniWeZwONSxY0etXr1aO3fulOTuq9++fXvxHBAAAAAAAKWoRC+P37Rpk8aMGaOgoCCFhITo\n9ddf14cffqjIyEjVrVtXHTp0KHC7C90Jvnnz5po5c6buuecetWrVSiNGjMizvHbt2po7d64GDx6s\nk+7rzjVx4kQ1a9aseA+uUEskFXC79HyqVJHKl3c/j4iQVq+WWraU9u51z6tWTTpyRMrKks52D2jV\nKveN6Y4ckfr1k3bskM5e5SanU0pKkrp2lbKzdfZSlnOvV726e56ks5fnnr9d7nm518+Zl/tn/ue5\n95l/Wa8C7s2Xe3nufRS2LPf86tXzzktNdcnpdHrm5x7HxezvYucXtE5B617M9r9n3cK2K+xcFnYe\n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\nJScnKywsTBs3blSdOnXI0g/169dPK1askCRt27ZNp06dUu3atUsvy0vqyLfAJ598YsLDw02TJk3M\nSy+9VNbDQQG++uor43A4TExMjImNjTWxsbHm008/NYcOHTLdu3c3zZo1Mz169DDp6emebSZOnGia\nNGlimjdvbj777DPP/Pj4eBMZGWmaNGliHn744bI4HJzlcrk8d48nS/+UmJho2rZta6Kjo03//v3N\n4cOHydKPTZkyxURERJjIyEhz1113mVOnTpGnn7j99tvNlVdeacqXL2/CwsLMW2+9VazZZWZmmttu\nu800bdrUdOjQwSQnJ5fm4QWU/FnOnj3bNG3a1DRo0MDzO1DOXaaNIUtflpNlSEiI57/L3Bo3buy5\nEZ0xZOnLCsry1KlTZsiQISYyMtK0bt3arFy50rN+aWTpMIbmCgAAAAAAfFFAXR4PAAAAAIA/oWgH\nAAAAAMBHUbQDAAAAAOCjKNoBAAAAAPBRFO0AAAAAAPgoinYAAAAAAHwURTsAwBpBQUF64oknPNPT\npk3TuHHjimXfw4YN07///e9i2deFLFy4UBEREerevXue+SkpKapUqZLi4uIUFxen1q1ba8+ePbrt\nttskSS6XS7179y7WsSxZskStW7dWbGysWrVqpb///e/Ftu+bb75ZR48eLbb9XayJEycqMjJSMTEx\niouL07p160r09ZxOpzZs2FCirwEAsFu5sh4AAADFJSQkRB9++KGeeuop1apVSw6Ho9j2XZR9ZWdn\nq1y5i/tf7uzZs/WPf/xDnTt3Pm9Z06ZNlZCQkGfewoULf/e4LiQrK0sPPPCA1q9fr3r16ikrK0vJ\nycnFtv+lS5cW274u1rfffqulS5cqISFB5cuXV1pamk6ePFmir+lwOIr1fQgACDx80g4AsEb58uV1\n//3363//93/PW5b/k/IqVapIcn9C3bVrV/Xr109NmjTR2LFj9c4776h9+/aKjo7WTz/95Nnmiy++\nULt27dS8eXNP0Xn69GmNGTNG7du3V0xMjOfTaJfLpS5duqhv375q1arVeeP55z//qejoaEVFRWns\n2LGSpPHjx2v16tW655579Je//MXr8aakpCgqKuq8+RkZGbrnnnvUoUMHtW7dWosXL5YkbdmyRR06\ndFBcXJxiYmK0Y8eOQvf922+/KTs7WzVr1pTkPrfh4eGSpF9//VW33nqr2rdvr/bt2+ubb76RJK1a\ntSrPlQAZGRnav3+/rr32WsXFxSkqKkqrV6+WJDVq1EhpaWmSpOnTpysqKkpRUVF69dVXPcfWsmVL\n3X///YqMjFTPnj2VmZmZZ4xHjhxRo0aN8hx3gwYNdPr06QKP6cCBA6pdu7bKly8vSapZs6auvPJK\nSdKLL76o9u3bKyoqSg888IBnG6fTqccee0zt2rVTy5YttX79evXv31/h4eF67rnnPGNt0aKFhgwZ\nooiICN122206ceLEea+/bNkyde7cWW3atNHAgQOVkZFR6PkHAMDDAABgiSpVqpijR4+aRo0amSNH\njphp06aZF154wRhjzLBhw8y//vWvPOsaY8zKlStN9erVzYEDB8zJkydNvXr1zPPPP2+MMebVV181\no0ePNsYY86c//cncdNNNxhhjtm/fbsLCwkxmZqZ54403zIQJE4wxxmRmZpq2bdua5ORks3LlSlO5\ncmWTkpJy3jj37t1rGjRoYFJTU012dra57rrrzKJFi4wxxjidTrNhw4bztklOTjaVKlUysbGxJjY2\n1owcOdKkpKSYyMhIz3H06tXLGGPMU089Zd59911jjDHp6ekmPDzcZGRkmIcfftjMnz/fGGNMVlaW\nOXHixAXP53333WeuuOIKM3jwYDN//nxz5swZY4wxgwcPNl9//bUxxphdu3aZli1bGmOM6d27t/nm\nm2+MMcZkZGSY7Oxs8/LLL5uJEycaY4w5ffq0+e2334wxxjRq1MgcOnTIxMfHm6ioKHP8+HFz7Ngx\n06pVK5OQkGCSk5NNuXLlTFJSkjHGmIEDB3qOKbe+ffualStXGmOMWbBggRk+fHihx3Ps2DETGxtr\nwsPDzYMPPmhWrVrlWZaWluZ5PnToUPPxxx8bY9x5jB071hjjfj9ceeWVnvdKWFiYSUtLM8nJycbh\ncHiO/Z577jHTpk3zbL9hwwbz66+/mmuvvdYcP37cGGPM5MmTzfjx4y94/gEAMMYYPmkHAFjlsssu\n01133aUZM2Zc9Dbt2rVTnTp1FBISoqZNm6pnz56SpMjISKWkpEhyX+Y8cOBASe7L1K+66ir98MMP\nWrZsmd5++23FxcWpY8eOSktL83yC3b59ezVs2PC811u/fr26deumWrVqKTg4WHfeeae+/PJLz3Jj\nTIHjbNKkiRISEpSQkKDXXnut0PWWLVumyZMnKy4uTt26ddPJkye1e/duderUSS+99JL++te/KiUl\nRRUrVrzgeXnzzTe1fPlytW/fXtOmTdM999wjyX3FwciRIxUXF6e+ffvqt99+U0ZGhq6++mo9+uij\neu2115Senq7g4GC1a9dOc+bM0bhx47Rp0ybPFQ45x/n1119rwIABqlSpkipXrqwBAwboq6++ksPh\nUOPGjRUdHS1JatOmjSeL3AYNGqT3339fkrRgwQINGjSo0OOpXLmyNmzYoL///e+6/PLLNWjQIM2b\nN0+StGLFCnXs2FHR0dFasWKFtm7d6tmuT58+ktzvh8jISM975aqrrtKePXskSfXr11enTp0kSUOG\nDNHXX3+d5zjXrFmjrVu3qnPnzoqLi9Pbb7+t3bt3X/D8AwAg0dMOALDQ6NGj1bp1a919992eeeXK\nldOZM2ckSWfOnNGpU6c8yypUqOB5HhQU5JkOCgpSdnZ2oa+T06v8f//3f+rRo0eeZS6XS5UrVy50\nu9wFtzEmT99zcfRA/+c//1GzZs3yzGvRooU6duyoJUuW6I9//KPeeOMNdevW7YL7ySlUhw4dqsaN\nG2vOnDkyxmjt2rUKCQnJs+6TTz6pXr16aenSpbr66qv1+eefq0uXLvrqq6+0ZMkSDRs2TI899piG\nDh2a51gLOxe5cwkODi7wkvPevXvr6aefVnp6ujZu3KjrrrvugscTFBSkrl27qmvXroqKitK8efN0\n++2368EHH9TGjRsVGhqqcePG5bkUP/f7If97Jef9kTuz/Hnm6NGjh957770Ljg8AgPz4pB0AYJ0a\nNWpo4MCBmj17tqd4atSokecu3osXL1ZWVtYl7dMYo4ULF8oYo507d+qnn35SixYt1LNnT82aNctT\nvG3btk3Hjx+/4L7atWunVatW6dChQzp9+rQWLFigrl27/o4jLVjPnj3zXGmQc/O65ORkNW7cWA8/\n/LD69u2rTZs2SZK6d++u/fv359lHRkaGXC5Xnn3k9I/fcMMNefafmJgoSdq5c6datWqlv/zlL2rX\nrp1+/PFH7d69W5dffrnuu+8+3XvvvXlupOdwONSlSxctWrRIJ06cUEZGhhYtWqQuXboUehVBflWq\nVFG7du00atQo9e7d+4J/8Ni2bZu2b99+3jFlZmbK4XCoVq1aOnbs2O+6ud/u3bu1Zs0aSdJ7772n\nLl265DnOjh07avXq1dq5c6ck9/nNPRYAAApD0Q4AsEbugu3xxx9XamqqZ3r48OFatWqVYmNjtWbN\nmjyXaRdW6OW+87fD4VCDBg3Uvn17z6fUISEhuu+++xQREaHWrVsrKipKI0aMUHZ29gXvGn7llVdq\n8uTJ6tatm2JjY9W2bduL+rq2gvZX0Cf0zz33nLKyshQdHa3IyEg9//zzkqQPPvhAkZGRiouL05Yt\nW3TXXXfpzJkz2rlzp+eGczmMMZo6dapatGihuLg4jRs3TnPnzpUkzZgxQ/Hx8YqJicnzVXCvvvqq\noqKiFBMTo5CQEN14441yuVyKjY1V69attXDhQj3yyCN5XicuLk7Dhg1T+/bt1bFjRw0fPlwxMTEF\nHm9h53PQoEF67733PJfGx8fHa/jw4eetd+zYMQ0bNkytWrVSTEyMfvjhB73wwguqVq2ahg8frsjI\nSN14443q0KFDoee/sDE0b95cM2fOVEREhI4cOaIRI0bkWV67dm3NnTtXgwcPVkxMjDp37qwff/yx\nwH0BAJCbw1zsn7IBAIB1tmzZojlz5mjatGllPRS/lZKSot69e3uuXAAAoDhRtAMAABRBSkqK+vTp\no++++66shwIAsBBFOwAAAAAAPoqedgAAAAAAfBRFOwAAAAAAPoqiHQAAAAAAH0XRDgAAAACAj6Jo\nBwAAAADAR1G0AwAAAADgo/4f7ur81GtJQrUAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 82 }, { "cell_type": "code", "collapsed": false, "input": [ "print \"Total connections: %s\" %len(uid_combos.index)\n", "#100. * uid_combos.combos.value_counts() / len(uid_combos.index)\n", "uid_combos['count'] = 1\n", "uid_combos[['combos_label','combos_data','count']].groupby(['combos_label','combos_data']).sum().sort('count', ascending=0).head(15)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Total connections: 238210\n" ] }, { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
combos_labelcombos_data
NONENONE 198045
Executable onlyapplication/x-dosexec 10395
binary 10136
Exploit onlyapplication/x-shockwave-flash 6035
application/jar 3276
application/zip 2570
application/x-java-applet 1483
application/pdf 1398
C-c-c-comboapplication/pdf:application/x-dosexec 1030
application/jar:application/x-dosexec 902
application/zip:application/x-dosexec 877
Executable onlyapplication/octet-stream 862
application/vnd.ms-cab-compressed:binary 242
application/vnd.ms-cab-compressed 198
C-c-c-comboapplication/x-shockwave-flash:application/pdf:application/x-dosexec 186
\n", "

15 rows \u00d7 1 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 83, "text": [ " count\n", "combos_label combos_data \n", "NONE NONE 198045\n", "Executable only application/x-dosexec 10395\n", " binary 10136\n", "Exploit only application/x-shockwave-flash 6035\n", " application/jar 3276\n", " application/zip 2570\n", " application/x-java-applet 1483\n", " application/pdf 1398\n", "C-c-c-combo application/pdf:application/x-dosexec 1030\n", " application/jar:application/x-dosexec 902\n", " application/zip:application/x-dosexec 877\n", "Executable only application/octet-stream 862\n", " application/vnd.ms-cab-compressed:binary 242\n", " application/vnd.ms-cab-compressed 198\n", "C-c-c-combo application/x-shockwave-flash:application/pdf:application/x-dosexec 186\n", "\n", "[15 rows x 1 columns]" ] } ], "prompt_number": 83 }, { "cell_type": "code", "collapsed": false, "input": [ "uid_mhr = uid_combos[uid_combos['mhr'] == True]\n", "print \"Total connections: %s\" %len(uid_mhr.index)\n", "print\n", "print uid_mhr.combos_label.value_counts()\n", "print\n", "100. * uid_mhr.combos_data.value_counts() / len(uid_mhr.index)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Total connections: 6066\n", "\n", "Executable only 2998\n", "C-c-c-combo 1748\n", "Exploit only 1320\n", "dtype: int64\n", "\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 84, "text": [ "application/x-dosexec 49.010880\n", "application/pdf:application/x-dosexec 9.347181\n", "application/jar:application/x-dosexec 9.066930\n", "application/x-shockwave-flash 8.127267\n", "application/jar 6.594131\n", "application/zip:application/x-dosexec 5.637982\n", "application/x-java-applet 4.648863\n", "application/x-shockwave-flash:application/pdf:application/x-dosexec 2.884932\n", "application/pdf 2.176063\n", "application/x-shockwave-flash:application/x-dosexec 1.483680\n", "application/x-dosexec:binary 0.395648\n", "application/pdf:application/x-dosexec:binary 0.263765\n", "application/x-shockwave-flash:application/pdf 0.214309\n", "application/x-shockwave-flash:application/pdf:application/x-dosexec:binary 0.049456\n", "application/jar:binary 0.049456\n", "application/pdf:binary 0.016485\n", "application/x-shockwave-flash:application/pdf:binary 0.016485\n", "application/x-dosexec:application/octet-stream 0.016485\n", "dtype: float64" ] } ], "prompt_number": 84 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "

\n", "After a long slog through the data (some interesting, and some ... eh) we've got a few more questions we can answer. We'll stick to just the session view from now on, but these can just as easily be done above via the sample dataframe.\n", "

\n", "Great, AV was able to detect some things, but what is it missing? Can we find any relationships between what AV missed and what it found?\n", "" ] }, { "cell_type": "code", "collapsed": false, "input": [ "uid_mhr = uid_combos[uid_combos['mhr'] != True]\n", "print uid_mhr.combos_label.value_counts()\n", "print\n", "uid_mhr[uid_mhr['combos_label'] == 'C-c-c-combo']['combos_data'].value_counts()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "NONE 198045\n", "Executable only 18981\n", "Exploit only 13496\n", "C-c-c-combo 1622\n", "dtype: int64\n", "\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 85, "text": [ "application/zip:application/x-dosexec 535\n", "application/pdf:application/x-dosexec 463\n", "application/jar:application/x-dosexec 352\n", "application/jar:binary 150\n", "application/x-shockwave-flash:application/x-dosexec 35\n", "application/x-shockwave-flash:binary 33\n", "application/pdf:binary 26\n", "application/x-shockwave-flash:application/pdf:application/x-dosexec 11\n", "application/zip:binary 4\n", "application/zip:application/jar:application/x-dosexec 4\n", "application/x-shockwave-flash:application/octet-stream 3\n", "application/pdf:application/x-dosexec:binary 3\n", "application/x-shockwave-flash:application/x-dosexec:binary 1\n", "application/zip:application/jar:binary 1\n", "application/x-java-applet:application/x-dosexec 1\n", "dtype: int64" ] } ], "prompt_number": 85 }, { "cell_type": "code", "collapsed": false, "input": [ "combos = uid_combos[uid_combos['combos_label'] == 'C-c-c-combo'].shape[0]\n", "print \"% of MHR hits in sessions with an \\\"interesting\\\" file combination\"\n", "print uid_combos[uid_combos['combos_label'] == 'C-c-c-combo']['mhr'].value_counts().apply(lambda x: x/combos)\n", "print \"\\n% of MHR hits from samples (end systems) with an \\\"interesting\\\" file combination\"\n", "combos = sample_combos[sample_combos['combos_label'] == 'C-c-c-combo'].shape[0]\n", "print sample_combos[sample_combos['combos_label'] == 'C-c-c-combo']['mhr'].value_counts().apply(lambda x: x/combos)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "% of MHR hits in sessions with an \"interesting\" file combination\n", "True 0.518694\n", "False 0.481306\n", "dtype: float64\n", "\n", "% of MHR hits from samples (end systems) with an \"interesting\" file combination\n", "True 0.510351\n", "False 0.489649\n", "dtype: float64\n" ] } ], "prompt_number": 86 }, { "cell_type": "markdown", "metadata": {}, "source": [ "

\n", "\n", "

\n", "Wait, what!?\n", "

\n", "Did we just figure out that (according to our samples) that if you're relying on AV to detect bad files instead of looking for a super easy pattern in network traffic you're missing out on 1/2 of the possible malware driveby downloads. Granted this requires an \"interesting\" file combination be present in both the same session or from the same source host, but wow.\n", "\n", "

\n", "\n", "Assumption Alert!\n", "
\n", "Again, we believe this data to be composed of mostly driveby downloads, so we're only looking at labels within a known-malicous set. Looking for those interesting file combinations on the network may yield additional false-positives.\n", "
\n", "

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

\n", "We were able to successfully dissect properties of files that traverse the network. Based on the properties the effectiveness of current solutions, proposed patterns to look for new and \"un-known\" attacks were discovered! Never underestimate the value of having better data. With this set, some insights were gained, but if the data came pre-labeled or we knew more about how it was collected perhaps we'd have more or different assumptions and gotten different results.\n", "" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }