{ "metadata": { "name": "", "signature": "sha256:ecb3149e07c9f2bc76940c175d8a2f133b5f847662839241ab0e52226268d291" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

[Data, the Humanist's New Best Friend](index.ipynb)
*Assignment 2*
Apple Keynote Perception

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On March 9th, Apple revealed its new series of products. That included the price for the long time awaited Apple watch, as well as the new MacBook.\n", "\n", "In this assignment you will explore 10k tweets from Twitter's firehose that were collected shortly after the announcement and captures interesting data within moments of announcements for analysis.\n", "\n", "
\n", "
\n", "\n", "*Fanboys be like...*\n", "
\n", "\n", "\n", "The goal will be to better understand the *twitter reaction* to Apple's announcements.\n", "\n", "\n", "Assignment\n", "----------\n", "\n", "**Your mission will be to complete the Python code in the cells below and execute it until the output looks similar or identical to the output shown.** I would recommend to use a temporary notebook to work with the dataset, and when the code is ready and producing the expected output, copypaste it to this notebook. Once is done and validated, just copy the file elsewhere, as the notebook will be the only file to be sent for evaluation. Of course, everything starts by downloading this [notebook](https://raw.githubusercontent.com/versae/DH2304/master/assignment2.ipynb).\n", "\n", "
\n", "\n", "*No tests here, but put some work into the assignments!*\n", "
\n", "\n", "Deadline\n", "--------\n", "**March $20^{th}$.**\n", "\n", "Data\n", "----\n", "Twitter is an ideal source of data that can help you understand the reaction to newsworthy events, because it has more than 200M active monthly users who tend to use it to frequently share short informal thoughts about anything and everything. Although Twitter offers a Search API that can be used to query for \"historical data\", tapping into the firehose with the Streaming API is a preferred option because it provides you the ability to acquire much larger volumes of data with keyword filters in real-time.\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will be using the `twitter` package that trivializes the process of tapping into Twitter's Streaming API for easily capturing tweets from the firehose.\n", "\n", " $ pip install twitter\n", " \n", "Or if running Anaconda:\n", "\n", " $ conda install twitter" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Tapping Twitter's Firehose" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's a lot easier to tap into Twitter's firehose than you might imagine if you're using the right library. The code below show you how to create a connection to Twitter's Streaming API and filter the firehose for tweets containing keywords.\n", "\n", "The next function makes a seach of the query term `query` using the Streaming API, and waits until receive 10 results before ending." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Nothing to change in this cell\n", "import os\n", "import twitter\n", "# XXX: Go to http://twitter.com/apps/new to create an app and get values\n", "# for these credentials that you'll need to provide in place of these\n", "# empty string values that are defined as placeholders.\n", "#\n", "# See https://vimeo.com/79220146 for a short video that steps you\n", "# through this process\n", "CONSUMER_KEY = os.environ.get(\"CONSUMER_KEY\", \"\")\n", "CONSUMER_SECRET = os.environ.get(\"CONSUMER_SECRET\", \"\")\n", "OAUTH_TOKEN = os.env.environ(\"OAUTH_TOKEN\", \"\")\n", "OAUTH_TOKEN_SECRET = os.environ.get(\"OAUTH_TOKEN_SECRET\", \"\")\n", "\n", "def print_tweets(query, limit=10):\n", " # Authenticate to Twitter with OAuth\n", " auth = twitter.oauth.OAuth(OAUTH_TOKEN, OAUTH_TOKEN_SECRET,\n", " CONSUMER_KEY, CONSUMER_SECRET)\n", "\n", " # Create a connection to the Streaming API\n", " twitter_stream = twitter.TwitterStream(auth=auth)\n", " print('Filtering the public timeline for \"{0}\"'.format(query))\n", "\n", " stream = twitter_stream.statuses.filter(track=query)\n", " # Write one tweet per line as a JSON document.\n", " cont = 0\n", " for tweet in stream:\n", " print(tweet['text'])\n", " if cont >= limit:\n", " break\n", " else:\n", " cont += 1" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "# Nothing to change in this cell\n", "print_tweets(\"Apple Watch, Apple Keynote, Apple MacBook\")" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Filtering the public timeline for \"Apple Watch, Apple Keynote, Apple MacBook\"\n", "HHTV PROMO NEWS Hands On With The Apple Watch - \u00a0Apple\u2019s smartwatch was on display again at today\u2019s special Apple ... http://t.co/JKOZ97vhRj" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "RT @Hoodairmed: Hands On With The Apple Watch http://t.co/GknoVy1zLI http://t.co/bbbZisNvRa\n", "Hands On With The Apple Watch http://t.co/TzmPKPulqd\n", "Will These 2 Stunning Smartwatches Steal Apple Watch's Thunder? - http://t.co/C0IyjitALD.. Related Articles: http://t.co/0yC9xszNjj" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Apple \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u0441\u0430\u043c\u044b\u0439 \u0442\u043e\u043d\u043a\u0438\u0439 Macbook \u0441 Retina-\u0434\u0438\u0441\u043f\u043b\u0435\u0435\u043c\n", "Oblig\u00e9 j'ach\u00e8te l'apple watch" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "RT @arden_cho: No thanks apple, last thing I wanna strap to my wrist is an iPhone. Aren't we glued to our phones enough? Real watch: http:/\u2026\n", "Donc en gros Apple a pr\u00e9sent\u00e9 le Macbook et non le macbook air et a hauss\u00e9 les prix de tous les Macbook. Super cool \u00e7a\n", "HHTV PROMO NEWS What Your Favorite Apps Look Like On Apple Watch (Plus New Ones!) http://t.co/B3Hl1wGxN8\n", "I actually want to meet the people who will pay $17,000 for an apple watch. I just want to ask why" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "New post: \"Opinion: One thing Android Wear desperately needs to take from Apple Watch\" http://t.co/gX6pR9SsRf #breaking #news\n" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the function above, we could easily write a program to dump search results into a file by serializing the JSON objects returned by the API. But if you don't feel like downloading now all the tweets, you can always use the [dump with 10k tweets](https://raw.githubusercontent.com/versae/DH2304/master/data/twitter_apple.json) that it is already collected. Each line in the file is just a JSON dump of a tweet as returned by the Streaming API. When properly formatted, they look just like this:\n", "\n", " {\n", " \"in_reply_to_status_id\": null,\n", " \"created_at\": \"Mon Mar 09 19:48:05 +0000 2015\",\n", " \"filter_level\": \"low\",\n", " \"geo\": null,\n", " \"place\": null,\n", " \"entities\": {\n", " \"trends\": [],\n", " \"urls\": [{\n", " \"expanded_url\": \"http://strawpoll.me/3832278/r\",\n", " \"indices\": [64, 86],\n", " \"url\": \"http://t.co/ZSdFmZgKi6\",\n", " \"display_url\": \"strawpoll.me/3832278/r\"\n", " }],\n", " \"hashtags\": [{\n", " \"text\": \"Apple\",\n", " \"indices\": [87, 93]\n", " }, {\n", " \"text\": \"AppleWatch\",\n", " \"indices\": [94, 105]\n", " }, {\n", " \"text\": \"Keynote\",\n", " \"indices\": [106, 114]\n", " }],\n", " \"symbols\": [],\n", " \"user_mentions\": []\n", " },\n", " \"contributors\": null,\n", " \"favorited\": false,\n", " \"retweet_count\": 0,\n", " \"timestamp_ms\": \"1425930485002\",\n", " \"in_reply_to_status_id_str\": null,\n", " \"id\": 575020247423586305,\n", " \"in_reply_to_user_id\": null,\n", " \"user\": {\n", " \"time_zone\": \"Athens\",\n", " \"profile_image_url\": \"http://pbs.twimg.com/profile_images/562968082952368128/0u4u4UmE_normal.jpeg\",\n", " \"created_at\": \"Mon May 14 16:29:41 +0000 2012\",\n", " \"profile_banner_url\": \"https://pbs.twimg.com/profile_banners/580024012/1425304201\",\n", " \"profile_sidebar_fill_color\": \"DDFFCC\",\n", " \"following\": null,\n", " \"profile_background_tile\": false,\n", " \"listed_count\": 14,\n", " \"statuses_count\": 19519,\n", " \"profile_background_image_url_https\": \"https://pbs.twimg.com/profile_background_images/560091394086158337/LDW-IOcI.png\",\n", " \"default_profile\": false,\n", " \"profile_background_color\": \"9AE4E8\",\n", " \"profile_link_color\": \"0084B4\",\n", " \"protected\": false,\n", " \"name\": \"Gared\",\n", " \"favourites_count\": 18424,\n", " \"is_translator\": false,\n", " \"profile_use_background_image\": true,\n", " \"geo_enabled\": true,\n", " \"screen_name\": \"edgard22360\",\n", " \"id\": 580024012,\n", " \"profile_sidebar_border_color\": \"BDDCAD\",\n", " \"url\": \"https://takethisgame.wordpress.com\",\n", " \"lang\": \"fr\",\n", " \"notifications\": null,\n", " \"followers_count\": 1556,\n", " \"default_profile_image\": false,\n", " \"verified\": false,\n", " \"profile_text_color\": \"333333\",\n", " \"utc_offset\": 7200,\n", " \"follow_request_sent\": null,\n", " \"location\": \"Testeur JV pour @TakeThisGame_\",\n", " \"profile_image_url_https\": \"https://pbs.twimg.com/profile_images/562968082952368128/0u4u4UmE_normal.jpeg\",\n", " \"description\": \"GEEK Level 21 // Breton // Nintendo // Sony //Cin\u00e9phile // Apple Addict // Cookie // Futur CM !\",\n", " \"friends_count\": 518,\n", " \"contributors_enabled\": false,\n", " \"id_str\": \"580024012\",\n", " \"profile_background_image_url\": \"http://pbs.twimg.com/profile_background_images/560091394086158337/LDW-IOcI.png\"\n", " },\n", " \"lang\": \"en\",\n", " \"in_reply_to_screen_name\": null,\n", " \"text\": \"Quelle Apple Watch choisiras tu ? // Which one will you choose?\\nhttp://t.co/ZSdFmZgKi6\\n#Apple #AppleWatch #Keynote\",\n", " \"coordinates\": null,\n", " \"possibly_sensitive\": false,\n", " \"source\": \"Twitter Web Client\",\n", " \"truncated\": false,\n", " \"retweeted\": false,\n", " \"id_str\": \"575020247423586305\",\n", " \"in_reply_to_user_id_str\": null,\n", " \"favorite_count\": 0\n", " } " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Preparation\n", "-----------\n", "\n", "
\n", "\n", "*For everyone!*\n", "
" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Nothing to change in this cell\n", "%matplotlib inline\n", "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# Set some options\n", "pd.set_option('display.max_columns', 20)\n", "pd.set_option('display.max_rows', 25)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Assuming that you've amassed a collection of tweets from the firehose in a line-delimited format, or that you are using the provided dump, one of the easiest ways to load the data into Pandas for analysis is to build a valid JSON array of the tweets." ] }, { "cell_type": "code", "collapsed": false, "input": [ "filename = \"data/twitter_apple.json\"\n", "file_line_list = ...\n", "\n", "data = \"[{0}]\".format(\",\".join(file_line_list))\n", "df = pd.read_json(data, orient='records')\n", "df.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", "
contributorscoordinatescreated_atentitiesextended_entitiesfavorite_countfavoritedfilter_levelgeoid...placepossibly_sensitiveretweet_countretweetedretweeted_statussourcetexttimestamp_mstruncateduser
0NaN None2015-03-09 21:01:01 {'trends': [], 'urls': [{'expanded_url': 'http... NaN 0 0 low None 5.750386e+17... None 0 0 0 NaN <a href=\"http://ifttt.com\" rel=\"nofollow\">IFTT... 'Gold On My MacBook' is the perfect rap song f... 1.425935e+12 0 {'profile_link_color': '009999', 'contributors...
1NaN None2015-03-09 21:08:06 {'urls': [], 'symbols': [], 'media': [{'indice... {'media': [{'indices': [125, 140], 'url': 'htt... 0 0 low None 5.750404e+17... None 0 0 0 {'extended_entities': {'media': [{'id_str': '5... <a href=\"http://twitter.com/download/android\" ... RT @MisterC00l: Noyer son Apple Watch en or \u00e0 ... 1.425935e+12 0 {'profile_link_color': '0084B4', 'contributors...
2NaN None2015-03-09 21:21:47 {'urls': [{'expanded_url': 'http://phon.es/ylj... {'media': [{'indices': [104, 126], 'url': 'htt... 0 0 low None 5.750438e+17... None 0 0 0 {'extended_entities': {'media': [{'id_str': '5... <a href=\"http://twitter.com/download/android\" ... RT @androidcentral: Apple's new MacBook cable ... 1.425936e+12 0 {'profile_link_color': '0084B4', 'contributors...
\n", "

3 rows \u00d7 28 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ " contributors coordinates created_at \\\n", "0 NaN None 2015-03-09 21:01:01 \n", "1 NaN None 2015-03-09 21:08:06 \n", "2 NaN None 2015-03-09 21:21:47 \n", "\n", " entities \\\n", "0 {'trends': [], 'urls': [{'expanded_url': 'http... \n", "1 {'urls': [], 'symbols': [], 'media': [{'indice... \n", "2 {'urls': [{'expanded_url': 'http://phon.es/ylj... \n", "\n", " extended_entities favorite_count \\\n", "0 NaN 0 \n", "1 {'media': [{'indices': [125, 140], 'url': 'htt... 0 \n", "2 {'media': [{'indices': [104, 126], 'url': 'htt... 0 \n", "\n", " favorited filter_level geo id \\\n", "0 0 low None 5.750386e+17 \n", "1 0 low None 5.750404e+17 \n", "2 0 low None 5.750438e+17 \n", "\n", " ... place \\\n", "0 ... None \n", "1 ... None \n", "2 ... None \n", "\n", " possibly_sensitive retweet_count retweeted \\\n", "0 0 0 0 \n", "1 0 0 0 \n", "2 0 0 0 \n", "\n", " retweeted_status \\\n", "0 NaN \n", "1 {'extended_entities': {'media': [{'id_str': '5... \n", "2 {'extended_entities': {'media': [{'id_str': '5... \n", "\n", " source \\\n", "0 IFTT... \n", "1 \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
text
0 127
1 573
2 545
3 556
4 495
5 444
6 471
7 492
8 324
19 199
20 386
21 397
22 414
23 395
24 401
25 355
26 286
27 387
28 385
29 363
30 455
31 397
32 417
33 420
34 301
\n", "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ " text\n", "0 127\n", "1 573\n", "2 545\n", "3 556\n", "4 495\n", "5 444\n", "6 471\n", "7 492\n", "8 324\n", "19 199\n", "20 386\n", "21 397\n", "22 414\n", "23 395\n", "24 401\n", "25 355\n", "26 286\n", "27 387\n", "28 385\n", "29 363\n", "30 455\n", "31 397\n", "32 417\n", "33 420\n", "34 301" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "tweets_per_minute = ...\n", "print(\"Average number of tweets per minute:\", tweets_per_minute)\n", "print(\"Average number of tweets per second:\", tweets_per_minute / 60)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Average number of tweets per minute: 399.4\n", "Average number of tweets per second: 6.65666666667\n" ] } ], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Every second, on average, around 6,000 tweets are tweeted on Twitter. That roughly means that during the time we collected our data, Apple Keynote took over ~0.1% of all tweets produced. Seen that way it might not be seem like a lot, but 1 message out of 1000 produced in the world was about Apple or their products.\n", "\n", "Let's plot a histogram of the number of tweets per minute." ] }, { "cell_type": "code", "collapsed": false, "input": [ "ax = ...plot(kind=\"bar\", grid=False, figsize=(12, 4))\n", "ax.set_xticklabels(tweets_minute.index, rotation=0)\n", "ax.set_ylabel(...)\n", "ax.set_xlabel(...)\n", "ax.set_title(...)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nPgY4rapuqqotwJXA4V3aKEmSJPVp0THQSX5r4ObtgF8Cftg1KMkBwKHAecD6qtrW3rUNWN9O7wN8\nauBhW2kKbkmSJGkiDHMWjscB1U7fDGyh6SkeWpI9gPcCL6iqG5Lcel9VVZKa98G3Zd9q48aNt05P\nTU0xNTXVpTmSJEnSdqanp5menl50uVQtVLsuX5JdgH8HPlxVf9fOuwyYqqprkuwNnFtV90myAaCq\nTmyX+whwQlWdN7C+6rvNw2i+BHRtR+ja9qXlrNas7jmrNWt1b6vu3FYrJWuy31fjzJr8bTXOrMne\nVuPMcltNXlYSqmq7D6d5e6CTzHf+5wKoqlcu2pzmWbwV2DxTPLdOB44FTmr//8DA/FOT/A3N0I17\nA+cvliNpNem+45MkaZwWGsLxfbb/JLsj8GzgrsCiBTTwYOD/AJ9PcmE773jgRGBTkmfTDAl5EkBV\nbU6yCdhMM1zkuRPR3SxJkiS1hhrCkeTOwHE0xfMm4LVVdW3PbZuvLRNRU/tzzo7ImoyfcyYhy221\ncrImf1uNM2uyt9U4syZ/W40za7K31Tiz3FaTl9V5CEf7oJ8G/gj4beBfgMOq6vqOrZIkSZJWjYXG\nQL8GeALwJuAXquqGsbVKkiRJmlDzDuFIcgvwI5qrCc5WVXXnPhs2H4dwrOWsyfg5ZxKy3FYrJ2vy\nt9U4syZ7W40za/K31TizJntbjTPLbTV5WZ2HcFSVl9CWJEmSZrFIliRJkjqwgJYkSZI6sICWJEmS\nOrCAliRJkjqwgJYkSZI6sICWJEmSOrCAliRJkjqwgJYkSZI6sICWJEmSOrCAliRJkjqwgJYkSZI6\nsICWJEmSOrCAliRJkjqwgJYkSZI6sICWJEmSOrCAliRJkjqwgJYkSZI6sICWJEmSOrCAliRJkjrY\neUc3YJSSLOlxVTXilkiSJGm1WlUFdKNrMby0oluSJElrk0M4JEmSpA4soCVJkqQOLKAlSZKkDnot\noJO8Lcm2JBcPzNszyVlJLk9yZpJ1A/cdn+SKJJclObLPtkmSJElL0XcP9D8BR82atwE4q6oOBs5p\nb5PkEODJwCHtY05OYg+5JEmSJkqvBWpVfRy4ftbso4FT2ulTgMe308cAp1XVTVW1BbgSOLzP9kmS\nJEld7Yge3vVVta2d3gasb6f3AbYOLLcV2HecDZMkSZIWs0OHSFRzBZOFTtzsFU4kSZI0UXbEhVS2\nJdmrqq5JsjdwbTv/amD/geX2a+dtZ+PGjbdOT01NMTU11U9LJUmStGZMT08zPT296HLp+zLWSQ4A\nzqiq+7W3Xw18s6pOSrIBWFdVG9qDCE+lGfe8L3A2cK+a1cAks2cN3sdSrkS4lL/BuLKWlrNasyZ7\nW40zy221crImf1uNM2uyt9U4syZ/W40za7K31Tiz3FaTl5WEqtrustW99kAnOQ04ArhrkquAlwMn\nApuSPBvYAjwJoKo2J9kEbAZuBp47b6UsSZIk7SC990CPmj3QazlrsrfVOLPcVisna/K31TizJntb\njTNr8rfVOLMme1uNM8ttNXlZ8/VAe55lSZIkqQMLaEmSJKkDC2hJkiSpAwtoSZIkqQMLaEmSJKkD\nC2hJkiSpAwtoSZIkqQMLaEmSJKkDC2hJkiSpAwtoSZIkqQMLaEmSJKkDC2hJkiSpAwtoSZIkqQML\naEmSJKkDC2hJkiSpAwtoSZIkqQMLaEmSJKkDC2hJkiSpAwtoSZIkqQMLaEmSJKkDC2hJkiSpAwto\nSZIkqQMLaEmSJKkDC2hJkiSpAwtoSZIkqQMLaEmSJKkDC2hJkiSpAwtoSZIkqYOJK6CTHJXksiRX\nJHnxjm6PJEmSNGiiCugkOwGvB44CDgGemuTnRrP26dGsZmJyzFo5OWatrKxx5Zi1srLGlWPWyskx\na2VljTZnogpo4HDgyqraUlU3Ae8EjhnNqqdHs5qJyTFr5eSYtbKyxpVj1srKGleOWSsnx6yVlTXa\nnEkroPcFrhq4vbWdJ0mSJE2ESSuga0c3QJIkSVpIqianZk3yIGBjVR3V3j4euKWqThpYZnIaLEmS\npFWtqjJ73qQV0DsDXwQeCfwPcD7w1Kq6dIc2TJIkSWrtvKMbMKiqbk7y/4CPAjsBb7V4liRJ0iSZ\nqB5oSZIkadJN2kGEIzeuC7MkeVuSbUku7itjIGv/JOcmuSTJF5Ic11PObknOS3JRks1JXtVHzqzM\nnZJcmOSMnnO2JPl8m3V+z1nrkrwnyaXt3/FBPeX8bPt8Zv59p8fXxvHt6+/iJKcmuf0I173deynJ\nLyb5ZLvNTk9ypxFlzfleSrJnkrOSXJ7kzCTresx6Yjvvx0kO6zHnr9vX4OeSvC/JT/WY9edtzkVJ\nzkmyf19ZA/f/SZJbkuzZV1aSjUm2DrzHjuojp73v+e32+kKSkxZazzKf07sGns9XklzYY9bhSc5v\n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\nA/R/4tyot5/BAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we had collected the data during a whole day, that would make much more interesting a time-series analysis, as we could see how the information got viral or not across time. But with only half an hour, there is no much more we can do. Furthermore, process all the tweets in a period of 24 hourse is way more demaning that \"only\" 10k.\n", "\n", "Let's now compute the Twitter accounts that authored the most tweets and compare it to the total number of unique accounts that appeared. First we need to extract the column `user`, containing a dictionary per cell, and create a `DataFrame` out of that by convertinf eac cell into a `Series`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Nothing to change in this cell\n", "users = df.user.apply(pd.Series)\n", "users.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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
contributors_enabledcreated_atdefault_profiledefault_profile_imagedescriptionfavourites_countfollow_request_sentfollowers_countfollowingfriends_count...profile_sidebar_fill_colorprofile_text_colorprofile_use_background_imageprotectedscreen_namestatuses_counttime_zoneurlutc_offsetverified
created_at
2015-03-09 21:00:45 False Thu Jun 04 20:59:45 +0000 2009 True False Realzalea bihotzez, software librea filosofiaz... 94 None 100 None 81... DDEEF6 333333 True False kristiansanz 2619 Madrid None 3600 False
2015-03-09 21:00:45 False Fri Aug 14 17:12:23 +0000 2009 False False Sp\u00e9cialiste dans le d\u00e9veloppement et le r\u00e9f\u00e9re... 18 None 184 None 131... ACACAC 000000 True False sudmedia66 50127 Paris http://www.sud-media66.fr 3600 False
2015-03-09 21:00:45 False Sat Jan 22 18:47:53 +0000 2011 False False None 2413 None 130 None 168... DDEEF6 333333 True False ssantoss93 11073 Madrid None 3600 False
\n", "

3 rows \u00d7 38 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ " contributors_enabled created_at \\\n", "created_at \n", "2015-03-09 21:00:45 False Thu Jun 04 20:59:45 +0000 2009 \n", "2015-03-09 21:00:45 False Fri Aug 14 17:12:23 +0000 2009 \n", "2015-03-09 21:00:45 False Sat Jan 22 18:47:53 +0000 2011 \n", "\n", " default_profile default_profile_image \\\n", "created_at \n", "2015-03-09 21:00:45 True False \n", "2015-03-09 21:00:45 False False \n", "2015-03-09 21:00:45 False False \n", "\n", " description \\\n", "created_at \n", "2015-03-09 21:00:45 Realzalea bihotzez, software librea filosofiaz... \n", "2015-03-09 21:00:45 Sp\u00e9cialiste dans le d\u00e9veloppement et le r\u00e9f\u00e9re... \n", "2015-03-09 21:00:45 None \n", "\n", " favourites_count follow_request_sent followers_count \\\n", "created_at \n", "2015-03-09 21:00:45 94 None 100 \n", "2015-03-09 21:00:45 18 None 184 \n", "2015-03-09 21:00:45 2413 None 130 \n", "\n", " following friends_count ... \\\n", "created_at ... \n", "2015-03-09 21:00:45 None 81 ... \n", "2015-03-09 21:00:45 None 131 ... \n", "2015-03-09 21:00:45 None 168 ... \n", "\n", " profile_sidebar_fill_color profile_text_color \\\n", "created_at \n", "2015-03-09 21:00:45 DDEEF6 333333 \n", "2015-03-09 21:00:45 ACACAC 000000 \n", "2015-03-09 21:00:45 DDEEF6 333333 \n", "\n", " profile_use_background_image protected screen_name \\\n", "created_at \n", "2015-03-09 21:00:45 True False kristiansanz \n", "2015-03-09 21:00:45 True False sudmedia66 \n", "2015-03-09 21:00:45 True False ssantoss93 \n", "\n", " statuses_count time_zone url \\\n", "created_at \n", "2015-03-09 21:00:45 2619 Madrid None \n", "2015-03-09 21:00:45 50127 Paris http://www.sud-media66.fr \n", "2015-03-09 21:00:45 11073 Madrid None \n", "\n", " utc_offset verified \n", "created_at \n", "2015-03-09 21:00:45 3600 False \n", "2015-03-09 21:00:45 3600 False \n", "2015-03-09 21:00:45 3600 False \n", "\n", "[3 rows x 38 columns]" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can count how many tweets per author there are and return the 25 more active (with more tweets)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "authors_counts = users.groupby(...)...aggregate...\n", "authors_counts.rename(columns=..., inplace=True)\n", "authors_counts.sort(..., ..., inplace=True)\n", "authors_counts[:25]" ], "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", "
tweets
screen_name
asdplayer55 21
iphone_np 13
lexinerus 11
WhinyAppleWatch 10
niftytech_news 10
world_latest 9
JapanTechFeeds 8
asdplayer42 8
technews_today 8
thinkb4talk07 8
gachinko2 8
smartclinic56 8
anghel30637137 7
sonuise 7
GET2GETHERKIM 7
iStantApple 7
aohhAREEYA 6
ios7italia 6
MetroPcTechs 6
Goem9 6
HerodenMark 6
LinkBuilding7 6
SquireStocks 6
Elia_Hicks 5
matematikogreni 5
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ " tweets\n", "screen_name \n", "asdplayer55 21\n", "iphone_np 13\n", "lexinerus 11\n", "WhinyAppleWatch 10\n", "niftytech_news 10\n", "world_latest 9\n", "JapanTechFeeds 8\n", "asdplayer42 8\n", "technews_today 8\n", "thinkb4talk07 8\n", "gachinko2 8\n", "smartclinic56 8\n", "anghel30637137 7\n", "sonuise 7\n", "GET2GETHERKIM 7\n", "iStantApple 7\n", "aohhAREEYA 6\n", "ios7italia 6\n", "MetroPcTechs 6\n", "Goem9 6\n", "HerodenMark 6\n", "LinkBuilding7 6\n", "SquireStocks 6\n", "Elia_Hicks 5\n", "matematikogreni 5" ] } ], "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "And also count unique authors." ] }, { "cell_type": "code", "collapsed": false, "input": [ "num_unique_authors = ...\n", "print(\"There are {0} unique authors out of {1} tweets\".format(num_unique_authors, ...))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "There are 8535 unique authors out of 9985 tweets\n" ] } ], "prompt_number": 18 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Visualizations\n", "--------------\n", "\n", "
\n", "\n", "*Oh, Dawson, only you.*\n", "
\n", "\n", "\n", "Now we need to get a better intution about the underlying distrubution of tweets and authors, so let's take a quick look at a frequency plot and histogram. We'll use logarithmic adjustments in both cases." ] }, { "cell_type": "code", "collapsed": false, "input": [ "ax = ...plot(..., grid=False, figsize=(12, 4)) # how can we plot with logarithmic adjustments, google it!\n", "ax.set_ylabel(...)\n", "ax.set_xlabel(...)\n", "ax.set_title(...)\n", "ax.set_xlim([0, 10**4])\n", "ax.set_xscale('log')\n", "ax.set_yscale('log')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nliRJkiry/wHkAargIyxTVwAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "ax = ...(log=True, grid=False, bins=10, figsize=(12, 4))\n", "ax.set_ylabel(...)\n", "ax.set_xlabel(...)\n", "ax.set_title(...)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n2P6CvvX7JVmX5iYQr2rXPZbmzmg/GXVckpbU/jRf2f+App70GXNvLo3MOG8nL2kVGHlZSJJH0NQc\nnlBVu7Xr1gDfBR5D88f2bJp5VZ8J3A64H810VE+u5Va3IkmSJM1i5FPxVdUZSXbsW70ncElVXQ6Q\n5CSa+Xdf1y4fAvzExFqSJEmTZFzzXG/PpqPnrwL2ml6oqg/OtXMSk25JkiQtiaoaeLzGuJLrRSfH\ndmqrX6fTodPpjDsMLTNeF5qJ14Vm4nWhmbRT6g9sXLOF/ICeO2S1jzd3S9lNdDodut3uMGOSJEmS\nAOh2uwv6sDWunutzgJ3bWuwf0kzmf/B8DrAUnyzPP/981q9fP/J2ltpWW23F/e9//3GHIUmStGxN\nTU0xNTXF2rVr57XfyJPrJCcC+wDbJbkSOLyqjk/yUuCzwBrgfVX1nVHHMl/PetYLuPTS69lii603\nv/GEuOmm9eyww6258MKzxx3K0E1NTY07BC1DXheaideFZuJ1oWFYdndoHESSOuKIIzZ8ohiVXXfd\nm3XrjgH2HlkbS+9sdt75xVx00cpLriVJkoal2+3S7XZZu3btvAY0TmxyvRRxm1xLkiStbknmlVwv\nx9ufS5IkSRNpYpNrZwuRJEnSqCx0thDLQuZgWYgkSdLqZlmIJEmSNCYm15IkSdKQTGxybc21JEmS\nRsWa6xGw5lqSJGl1s+ZakiRJGhOTa0mSJGlIJja5tuZakiRJo2LN9QhYcy1JkrS6WXMtSZIkjYnJ\ntSRJkjQkJteSJEnSkJhcS5IkSUMyscm1s4VIkiRpVJwtZAScLUSSJGl1c7YQSZIkaUxMriVJkqQh\nMbmWJEmShsTkWpIkSRoSk2tJkiRpSCY2uXYqPkmSJI2KU/GNgFPxSZIkrW5OxSdJkiSNicm1JEmS\nNCQm15IkSdKQmFxLkiRJQ2JyLUmSJA2JybUkSZI0JCbXkiRJ0pCYXEuSJElDMrHJtXdolCRJ0qh4\nh8YR8A6NkiRJq5t3aJQkSZLGxORakiRJGhKTa0mSJGlITK4lSZKkITG5liRJkobE5FqSJEkaEpNr\nSZIkaUhMriVJkqQhMbmWJEmShmRZJddJ7pvkXUk+luTQcccjSZIkzceySq6ral1VvQh4BvC4cccj\nSZIkzcfIk+sk709ydZIL+tbvl2RdkouTvKpn/ZOA/wROGnVskiRJ0jAtRc/18cB+vSuSrAGObdff\n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\nMrW0VNYAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 20 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Although we could filter the `DataFrame` for coordinates (or locations in user profiles), an even simpler starting point to gain rudimentary insight about where users *might* be located is to inspect the language field of the tweets and compute the tallies for each language." ] }, { "cell_type": "code", "collapsed": false, "input": [ "df...[:25] # it returns a Series, think about counting values ;)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 21, "text": [ "en 6680\n", "es 847\n", "ja 686\n", "ru 480\n", "fr 363\n", "tr 246\n", "de 155\n", "it 104\n", "pt 79\n", "in 70\n", "zh 48\n", "th 46\n", "nl 44\n", "und 21\n", "pl 17\n", "ar 14\n", "el 13\n", "sk 12\n", "sv 10\n", "bg 6\n", "hu 4\n", "et 4\n", "is 4\n", "ko 4\n", "no 4\n", "dtype: int64" ] } ], "prompt_number": 21 }, { "cell_type": "markdown", "metadata": {}, "source": [ "A staggering number of English speakers were talking about \"Apple\" at the time the data was collected. Bearing in mind that it was already evening on Monday in America when Apple Keynote hit the news with the Apple Watch and the new MacBook.\n", "\n", "However there are at least 21 tweets with undetermined language, `und`, and we want to know which are those languages. As we know, `TextBlob` internally uses [Google Translate API](https://cloud.google.com/translate/) to detect the language of a text. Twitter might use its own algorithm. But Google might support more languages, therefore, by detecting the language of the tweets using `TextBlob` and then comparing which ones are not in the set of recognized languages in the tweets collected, we will know which are those languages missing.\n", "\n", "The first step is to detect the language of the tweets and store that into a `Series`. Every time you invoke `.detect_language()` you are not only creating a `TextBlob` object, which consumes time and space, but also performing a HTTP request to the Google service for translation. And that is very expensive. Let's say that the average request takes up to 250 milliseconds (that would be **a lot**), if we have 10k tweets, that's around 40 minutes. Therefore, before executing language detection in all the tweets, it would be better to test the code in a small scale by slicing 25 tweets." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import textblob as tb\n", "\n", "def detect_language(text):\n", " ...\n", "\n", "languages = df.text[:25].apply(detect_language)\n", "languages..." ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 22, "text": [ "en 12\n", "es 5\n", "fr 3\n", "ru 3\n", "ja 2\n", "dtype: int64" ] } ], "prompt_number": 22 }, { "cell_type": "markdown", "metadata": {}, "source": [ "When the code is ready just run the next cell. In the meantime, go grab something to eat and get comfortable in the couch until it finishes the execution. Relax, it can take a while but this is how real data analysis work :)\n", "\n", "
\n", "\n", "*Good for you, mate*\n", "
\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Are you ready to execute this cell? Go!\n", "languages = df.text.apply(detect_language)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 23 }, { "cell_type": "code", "collapsed": false, "input": [ "# Let's see those results counting each language\n", "lang_counts = languages...\n", "lang_counts[:25]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 24, "text": [ "en 6795\n", "es 816\n", "ja 676\n", "ru 479\n", "fr 318\n", "tr 243\n", "de 147\n", "it 93\n", "pt 81\n", "id 73\n", "th 51\n", "zh-CN 48\n", "nl 42\n", "ar 16\n", "el 13\n", "pl 12\n", "gl 11\n", "ca 10\n", "sv 10\n", "cs 7\n", "da 5\n", "hu 4\n", "ko 4\n", "no 3\n", "et 2\n", "dtype: int64" ] } ], "prompt_number": 24 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's plot a simple pie chart showing the 10 most used languages." ] }, { "cell_type": "code", "collapsed": false, "input": [ "ax = ...plot(\n", " ..., figsize=(8,8), autopct='%1.1f%%', shadow=False, startangle=55,\n", " colors=plt.cm.Pastel1(np.linspace(0., 1., len(lang_counts[:10])))\n", ")\n", "ax.set_title(...)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 25, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAcwAAAHbCAYAAABGCKqlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XVUVFsbBvDnPTMwBYjdXddrXrvj2t15VRQTL3Zg17UD\nOzAwsRO7u7u7xQSDGmrO/v6YwQ+VGBUYwPe3FkuYc+bsd4Ylz+x99tmHhBBgjDHGWPQkSxfAGGOM\nJQYcmIwxxpgZODAZY4wxM3BgMsYYY2bgwGSMMcbMwIHJGGOMmYEDkzFmcUQkE1EOS9fBWHQ4MFm8\nIiJ/IvIzfclEFBjh59ax1EYLIjpNRAFEdCSS7UWI6JJp+0UiKhzNsZYT0X+xUVdSQ0RtTO+fHxG9\nIqLdRFTO0nUxFlc4MFm8EkLYCCFshRC2AJ4BqBf+sxBibSw14wPAFcCkbzcQkTWA7QBWArAHsALA\ndiKyiqpk0xeLgIj6AZgBYByANAAyA5gHoIEl62IsLnFgsgSBiFRENJOIvExfM0zhBiKqTEQviWgI\nEb0noidE1CaqYwkhDgkhNgF4HcnmygAUQohZQohQIcQcAATg7+jKi6LmWUT0nIg+m3pa5SNsG01E\nG4hoBRH5EtFNIioWYXtRIrpi2raBiNaH92SJqAMRnfimrS9DlkRU1/Tcz6b2R32zb3siekZE3kQ0\nnIieElFV0zYiosFE9NC0fT0RJTdtUxPRatPjH4noPBGlieR1JwMwBkAPIcQ2IYReCGEQQuwSQriY\n9ony92naPtDUK31JRI7fHF9FRNNMr+ENES0gIrVpWyoi2mmqz4eIjhNRpL8fxmIbByZLKIYBKAmg\nsOmrJIDhEbanBZASQAYADgAWEVGen2gnP4Dr3zx2zfT4jzoPY63JAawBsDFiKACoD2AtgGQAPAHM\nBb70crcCcDc9dy2ARjC/J+sPoK0QIhmAugCciKih6dh/wtjTaw0gvantDBGO3QvGXmBF0/aPpv0B\n4/tqByATgBQAugHQR9J+GQBq02uISpS/TyKqBaA/gGoA8pj+jWgSgFym5+UCkBHASNO2/gBeAEgF\nY892iOD1PVk84cBkCUUbAGOFEN5CCG8YezDtvtlnhKlXeBzALgAtfqIdGwCfv3nMF4Dtjx5ICOEh\nhPgohJCFEK4AVADyRtjlhBBir+kP+moYAwAASsPYy51j6plthTF8zW33mBDilun7GwDWAahk2twM\ngKcQ4rQQIhTGoIkYKN0ADBdCvDJtHwOgGREpAITA+KEktzC6IoTwi6SElAC8hRByNGVG9/tsAcBd\nCHFbCBEI4EsP2dRb7AKgnxDikxDCH8BEAK1Mu4TAGPTZTO/dqRjfMMZiCQcmSygywHhOM9xz02Ph\nPgohIvZ2nn2z3Vx+MPaiIkoGY2j+ECIaQES3iegTEX00HSdVhF3eRvg+EICaiCQY6/b65nAvfqDd\nUkR0hIjeEdEnGEMwpWlzBgAvw/c1vWc+EZ6eDcBW05DmRwC3AYTB2FtbBWAfgHWmYdTJRKSMpAQf\nAKlMryUq0f0+0+Pr1/s8wvepAWgBXIpQ4x78/32dCuAhgP1E9IiIXKKpgbFYxYHJEopXMP4xD5fF\n9Fi45ESkjfBzVnwfOt+KbKjuFoBC3zxWyPS42cchogoABgJoLoSwF0Ikh7Hnas75tNcwDjNGlCXC\n9wEwhkZ4W+m+2XcNgG0AMgkh7AEsjNDuKxiHVMOfq8H/wxQwhlMtIUTyCF9aIcRrIUSYEGKsECI/\ngLIA6gFoH0n9ZwAEA2gczWuM7PcZ/vt6/c3rjfi9N4zDwH9GqM9eCGEHAEIIfyHEACFEThiHlvsR\nUXTnnxmLNRyYLKFYC2C4aVJHKhiHEld9s88YIrIyhVVdABsjOxARSaZJIlYAJNMkkvBZsEcBGIio\nl+nxXgBkAIejqIsAKE0TYsK/rGEcwg0D4E1E1kQ0Et/3XKNyxlSDMxEpTecfS0TYfg1AfiIqbHod\no795vg2MPe4QIioJ4/BnuM0A6hNRGVOdo/F1iC8EMIGIspjeq9RE1MD0fWUiKmganvUDEArA8G3x\nQojPMP5+5hFRQyLSmn4vtYlosmm3yH6fq03bNgDoQET5TB+CRkU4tgxgMYCZRJTaVFdGIqph+r4u\nEeUyDd36mur7rkbG4gIHJksoxgG4COOEnOum78dF2P4Gxgkqr2AM0m5CiPtRHKs9jEOg8wFUgLHH\n4gYApvN2jUz7fDT920gIERbFsQSAwabjhX8dBLDX9HUfwFNTG8+/ed63PVNhqiEEQBMAnUw1/ANg\nJ4zn52B6XWNN7dwDcOKbY/UAMJaIfAGMALD+SwPGc5s9YTyv+QrG4HsHY48QAGbBOAFpv+n5Z2Cc\nkAMA6WD8EPIZxqHao/j+Q0t4O64A+sE4keed6bX3wP8nAkX5+xRC7AUwE8YPKfcBHPrm9bnAOOx6\nlog+AzgA4+QgAMht+tkPwGkA84QQxyKrkbHYRjzBjCV0RFQZwCohRGZL1xJXiOgcgPlCiBWxfFwb\nGEM5lxDiWUz7M8aixj1MxiyAiCoSUTrTkKwDgAIw9lhj49j1TcOkOgDTAFznsGTs13FgssQiqQ2F\n5AVwFcbeX18AzYQQb6N/itkawDjBxgtATvz/kgzG2C/gIVnGGGPMDNzDZIwxxszAgckYY4yZgQOT\nMcYYMwMHJmOMMWYGDkzGGGPMDByYjDHGmBk4MBljjDEzcGAyxhhjZuDAZIwxxszAgckYY4yZgQOT\nMcYYMwMHJmOMMWYGDkzGGGPMDByYjDHGmBk4MBljjDEzcGAyxhhjZuDAZIwxxszAgckYY4yZgQOT\nMcYYMwMHJmOMMWYGDkzGGGPMDByYjDHGmBk4MBljjDEzcGAyxhhjZuDAZIwxxszAgckYY4yZgQOT\nMcYYMwMHJmOMMWYGDkzGGGPMDByYjDHGmBk4MBljjDEzcGAyxhhjZuDAZIwxxszAgckYY4yZgQOT\nMcYYMwMHJmOMMWYGDkzGGGPMDByYjDHGmBk4MBljjDEzcGAyxhhjZuDAZIwxxszAgckYY4yZgQOT\nMcYYMwMHJmOMMWYGpaULYOx3QEQKACkApASQyvSvDgDB+ME1/OvbnyM+JgPwB+Bn+gr/3hfABwAB\nQggRby+Ksd8MByZjP4mICEAaAHkA5AKQTm1tlU5jbZ1BIimtgEgVGmZIHhIWZkdEGq1KFZxMqw1N\nYWsjp06WDDqNWlJKEiRJIoUkgQCSJAkKSSJJIihIIiIybSeEGWThGxho+BQQIPsF6mVfvZ789Xry\n1wcp/fV6a1kI0qnV/tZK5WeFJH0A8D4wOPiePiTkHoDHAJ4AeCqE0FvuXWMs8SL+QMpY9IgoJYDc\nAPIoJCmPnVZbBBB5A4KCM1splSJb2tTBf2TKpMiWNq06dTI7ZUo7Wxi/7JDS1hap7Oxgr9NCoVDE\naZ364GB88POHj58fPvj54f1nXzx/9x73vLyC7r3wCn7y9q307tNnrdrKyk9lbfVCCDz8HBh4Q5bl\nRzCG6WMAr7iXyljkODAZMyEiKwCFAJRKptNVlogKBQYHZ5aIlFnSpNb/kTmTVCBrFl3ujBmkXBnS\nI3eG9Ehha2vpsn+IwWCAl88HPH37Do/fvMHjN2/luy9eBj7wemV49v69dWhomKxVq2/56/VHQ8LC\nzgG4COAFhyhjHJjsN2UaTs0CoJTG2rq8xtq6il+QPk+GFCmDyufPpyyXP5/2zyyZkSdjBqSys4Nx\n96Tv9YcPuPzwMS4+eCifunXH/9LDR1YhYWEGrUp13S8w8GiowXAewCUAXhyi7HfDgcl+C0RkA6CE\nRFTG3kZXLSgktKhSobAukSdXaOVCBW1L5c1DxXLnhJ1Wa+lSExQhBF75fMClh49w8cFDw8lbtwOu\nPnpiHSYbQjTWqmuf/P13ykLsBXCDA5QldRyYLEky9SDzSUR17XW6Fv5BQYXyZsqor1SwgKbsn39Y\nl8ybG1lSp/5teo6xSQiBF++9cfHBQxy4fDV414WLoZ8DAgxWSuXBzwGBWwEcFEK8tXSdjMU2DkyW\nZBCRDkAVG7W6MYAGamtrTf3SJRQNSpVUVylcEDq12tIlJlmP37zBgcvXsOPceb/jN26pVFZWL4NC\nQrYGhYbuBnBKCBFs6RoZ+1UcmCxRI6LcBNRJbmvT0l8fVKxQ9mxBTcuXsa1dvBj9mSUz9yAtIMxg\nwLl797H/8lXD9jPnAh54vVLZqNUXP/r7bxDAFiHES0vXyNjP4MBkiQ4RFdRYWzsqFYpWCklKVrdk\ncTQsU0pTtUghPgeZAH3098fhq9fhefa8ftuZc6SyUt756B/gBmCTEMLH0vUxZi4OTJYoEFE6hST9\nY6NWOykUivQdqv9t1apSBasiObJzLzIRCQ4Nxb5LV7Di4GH//ZevWKmtrc988g9YDMBTCOFv6foY\niw4HJkuwiEgLoJG9ja5HcEho8QalSxo61ayurVjgzzhfBIDFPb9APXacOw/3/Yf8zt69Z6W2tjrw\nOSBwMYB9QogQS9fH2Lc4MFmCQkQSgMp2Wk3X4NCwBiXz5g7rUquGbYPSJXnSThLm/dkXm0+dgfv+\ng763n79QWCkUW/30ejcYJwzxHymWIHBgsgSBiDKrra16KiTJMX2KFNZda9fQtapUQUqfIoWlS2Px\n7MV7b6w/fkKe67k70E+vf+MbGDgBwFohRJCla2O/Nw5MZlFEVMJOqx0eZjDU6FC9KnWuVV1VMFtW\nS5fFEgBZlnHgylVM27TN/9y9+0IAC4JCQubwLFtmKRyYLN6ZbnXVIJlOO9JaqcwzsFkTdaea1SSe\n4cqi8sDrFWZ77gxeefCIsFIqDn8OCJwE4CQP17L4xIHJ4g0R2SokyVFjbT0ke7q02qGtmts2KlMK\nSp7Aw8zkF6jHykNHxNRNWwP89Pq3voGB4wGs41uWsfjAgcniHBFl1qpU/WQhulQrUhiDmjfRlcmX\n19JlsUTs2+FaAAv0ISFTEvJ1nUR0SghRLpLHlwPYIYTYHP9VsR/BgcniDBEVtNNqx4Uawmo41qhG\nfRo1UGVLm8bSZbEk5oHXK0zasDlow4lTMiBmBoWEThVCfLJ0XeYiomUwBuYWS9fCoseByWIdEeW1\n02qmAFR9SIumqi61a0jJdDpLl8WSuMdv3mDkqjV6zzPnDbKQpwaHhs0QQvhZuq5wROQvhLAx3Rhg\nDoBqAF4ACAHgzj3MhI8Dk8UaIspuq9FMFEI0HNS8ibJng7pKG43G0mWx38y9l14YsdIjcO/Fy4Yw\nWR4XGhY2VwgRaOm6iMhPCGFLRE0AdAdQE0A6ALcBdOIeZsLHgcl+GRGls1GrxwshWvduVN+qb+OG\nSnsb7lEyy7r59BmGrVgdcPT6zdDg0NDRBll2s+S1nBECcyaAq0KI5abHNwPw4MBM+Dgw2U8jIlu1\ntZULgfp1rlVdMaxVC+uUdraWLouxr1x59BhDlq0MOHPnXnBQaMhwWRZLLbH0XoTAnAHguhBimelx\nDsxEggOT/TAislJKUhdrK+WEOiWKW03s2F7Lk3lYQnfu3n0Mdl/hf+XRE7+AoKBOQog98dl+hMBs\nDKAbgDoA0gK4BaBzVIFJRH0AuPGlM5bHgcl+CBHVsFGr3QvlyGY/s1tn3V85c1i6JMZ+yN6Ll9Ft\nzvwAf73+lG+gvqsQ4ll8tEtEvkIIO9P3cwBUB/Ac/5/0E1VgPgFQPCFfMvO74MBkZiGidLYazUKt\nWlV9Ua8e2jolilu6JMZ+WlBICKZt3hY2ddPWEFmWJweFhk4WQgRbsiYiygZgL4CLAIrC2PM8DmAa\ngHsA3gshqlqqPsaByWJARJJSkrpbKZVTetSrbTWyTStrrVpl6bIYixVP377Dv/MWBpy+ffeTf1CQ\noxBiv6VqMQXmYwDlhBBniGgpjDNonQEUE0J8sFRtzIgDk0WJiArbajSrc6ZPl31Zv166ArwoOkui\ndl+4iG6zFwQGBgcf8w0M7CaEeBHfNZgC85gQIqvp5yoAegMoDB6STRAkSxfAEh4istGp1bNtNOoz\nUzo55D83cyqHJUvS6pQojgdLF2h7NqhbTaOyvqu2th5GRNYWKCViD4YAyJE8ziyEe5jsK0RUX6dW\nLa1dvJjNrO6dNWns7S1dEmPx6vGbN+gxd2HAubv3P/oHBbUWQpyMj3YjDMmWFUKcJaIlMA7JdgDQ\nQAjxND7qYFHjwGQAACLKaKvVLLXTaMu79+2p+7tIIUuXxJhFbT9zDp1nztWHGsIWBQQFD47rRQ9M\ngbkHxkk/xWCc9NMeQCcYz2OmE0LYE1FWGEN1bVzWw77HgclARE00KuvlfRo1UA9t2cxKbW2JkSjG\nEp73nz+j88y5gcdv3nrnrw9qKoS4HFdtmQJzhxCiYAz7VQbQXwhRP65qYZHjwPyNEZFWp1bPt9Vo\nmm8a7qItlTePpUtiLMERQmDt0ePi3/luQSGhYUtCwsJc4mIRAVNgegohIh3eibB4+1kAfwB4AmC5\nEGJWbNfCIseB+ZsiosI6tdqzVvGiqRf16qGx02otXRJjCdqlBw9RechIKJXKp/7+/tWFEA/js/0I\nKwVVAjCAe5jxj2fJ/maIiFRWVn11atWZeT26Zl43eACHJWNmaO86x1C/fn3DiBEjMms0mmtKpbKD\n6VZd8c0SbTIASksXwOIPEaWx1WjWZ02bpsSmYS6anOnTWbokxhKFIe4r8TkkRJo5cybZ2tqiYsWK\n2pYtW8778OFDPSLqmJDuu8niDvcwfxNEVEOrUt3rVqdm2fMzp+o4LBkzz9XHjzFvzz6sXr2abG2N\nd+PJnz8/zp8/r23QoEFdnU53h4iKxGNJfgD4tkAWwOcwkzgistap1dPUVlad1g4eoK1SONoJeIyx\nCGRZRlbH7nLrdu0wZsyYSDsYGzZsEL169dIHBwePDwsLmxBXtYQv3k5ESgD7AKQEsIwn/cQfDswk\njIjS2mo0+8rky5t75YC+Wr5XJWM/pvXk6eLGO29x+vRpycrKKsr9NmzYgO7du8NaabUlMEjflm/F\nlTRxYCZRRFREq1Lt79O4gf2oNi2tJIlH3xn7EbsvXEKrKa44efIkcufOHeV+Hz58QIkSJUSzGvXJ\n6+1r/eEzJ575B/jXFEI8j8dyWTzgwEyCiKixVqVavaSPs6Z5hXI8o46xH+QfqEf2Lk7y8BEjqWvX\nrlH+H5JlGfXq1ZP1n/3FuW2HFEIITFs8J+y/WVMCAoP0DYQQx+Ozbha3ODCTECIijbX1CK1K5bJz\n7Aht8dy5LF0SY4lSJZfhsiJFSuzcuVOK7sqRiRMnyovcFuHJsauSNsLlWfuOH0Yr5456fVBQ39Cw\nULf4qDk6RDQagJ8QYrqla0nMeJwuiSAija1GszlH+nSDLs+dwWHJ2E9y270PN56/kNzd3aMNy8OH\nD2PWrFnSnmUbvwpLAKhZ8W+c235IkyFtOldbnY2baaKOJXHPKBZwYCYBRJTeVqO5UO2vwrXOuE7W\nZUiZwtIlMZYoeXn7wGXFauHm5oa0adNGud+LFy/Qrl07/NdvGIoWKBzpPnmy58LlXce1RfIXamuj\n050movRxVXdkiGgYEd0johMA8poey0lEe4joIhEdJ6K88VlTYsdDsokcERXVqlT7BzRrZDe8VQsr\nyyw8wljSkN+pt+GvsmWxePFiRVT7BAcHo2LFinLWtBmxc+n6GDsd9588RKGa5aBUKl4GBQeXFkJ4\nxW7V3yOiYgCWASgJwArAZQALAdQG0F0I8ZCISgGYIISoGtf1JBWWHiZgv0CSpGZalWrFsn69tE3K\nlbF0OYwlaoNNq/m4urpG+6lzwIABBr/PvvD0PB5lqIb7+PkTarVvKupWrywK5MudbsbCZdeIqIoQ\n4kbsVR6pCgC2mG5JFkREngDUAMoC2BjhgzXfmugHcGAmUtZWVt2T2+im7x03WvtXzhyWLoexRO3q\n48eYv2cfPD09v6zmE5l169aJzZs3Szf2nKKYLtUKCQlBXccWcvLktmLJzHEKAFKWTOlT9Bk2/jQR\n1Y3jGbQC3685KwH4JIT4Kw7bTdL4HGYipFFZD0hho5t+2nUKhyVjv0iWZdQfO8ng5OQklypVKsr9\nbt++jT59+tCSSXMoc4ZM0R5TCIEOA3oYvN54id1r3b70RJvUrUGr5k+10Wk1e4ioUey9iu8cB9CI\niNREZAugPoBAAE+IqBlgnFVPRHyn+B/A5zATESIitbX16FR2tgOOT52ozZw6laVLYizRazVpurjl\n7SNOnToV5Wo+vr6+KFWqlKhVvircJsyIcaLA2FmT5Tkr3HBq91opdSST8K7dvIsmHZ31gXq9c2ho\nmPuvv4rvEdFQAA4A3gF4BuN5zC0AFgBID+O5zbVCiHFx0X5SxIGZSBARaVUq13TJk3c5NnW8Ll3y\n5JYuibFEb/f5i2g1dUa0q/kIIdCiRQvDiyfPcH3PqRjPW67ZvlE4De9HOz3cUCBf1CsEPXz8DPXb\ndQ/09fMfFRwcMu3nXwWLLzwkmwgQkaRTqxdlS5umy2nXyRyWjMUC/0A9HGbOFf/995+Ibum7OXPm\nyOfPnaPj63fFGJYnL55F92F9ad7kkdGGJQDkypEVBzYu06ZMbj9GrVbF2aLtLPZwDzOBIyKljVq9\nKm+mjPX3jR+tS6bTWbokxpKESi7DDYoUKSm61XxOnz6Nxo0bY8+yTShfonS0x3vw5BFKNaqKnl3a\nok83B7PruHbzLqo16wArK+Wq0NAwB8F/lBMsniWbgBGRtY1GvblIjux/7xwzQqtTqy1dEmNJwsLd\ne3Hz+QvFpW3bEVVYvn37Fq1bt8agbr1jDEufjx9Q7Z+Goubf5dCnm4PZF0O/8/aBQ08XUbFCUeHl\n9a7J6zfeb4jIhUMzYeIeZgJFRGpbjWZXmXx5S28ePlirtubLpRiLDS+9vVHg375iyZIlVLdu3Uj3\nCQsLQ7Vq1WSdUo0ja3dEe+oqODgY5ZvXkiWlLPauXxLjsG04n4+fULOFo8iSNZ28b/c8hbfPJ1St\n3i3A69W7xYGBQf04NBMePoeZABGRylajOVC1SOEy20YO5bBkLBbVHDHWUK9ePTmqsASAESNGGLxe\nemHfis3R/o0UQqBt364G74/vsdNjodlh+emzL+q27irSpk8h79k5RwEAqVLa4/CBRbpMmdJ20WrU\nU8x+QSzecGAmMESksNVoNpTPn6/o2sH9NVZKHjVnLLYMdl8J39AwacaMGVGG244dO7B82XLFYY/t\nknUMH1aHTxsnHzt3kg5tWS4pzfy/6uvnj3r/dJNtk2nkw/vdFBEXQEiZMhkO7luoS5MmRQ+tRj3S\nzJfF4gkHZgJCRKRTqxfmy5yp2oahg7RKhdkfWBljMQhfzWfVqlVkY2MT6T4PHz5E165dMWvUROTN\nEf0s1+Wb1oh5KxfT9tXzpeT2ycyqwT8gEA3bOclKa0mcPOauiGy1oFQp7XHogJvWPrmti1qt6mvW\ngVm84HOYCYhWpfovc+pUfU+7TubZsIzFIlmWkdWxm6FNewcaPXp0pB2FwMBAlClTRpTIXwRrZi2J\nduLOkTMn0LBLayx2/Q81qpQ3q4ZAfRAaO/SQ/fUB4uK51YqYeqTPn79G+cqOgZ8++TmHhoYtM6sR\nFqc4MBMIa6Xy39TJkk05P2uaNm1ye0uXw1iS0mrSNHHL+0OUq/kIIdChQwfD9StXcefA+Uh7fuHu\nPrqPMo2rY4CzI3p0bGNW+0HBwWjWsZf8/pOPuHzeQxHTUG+4e/efovLfXfSfff1bCyG2m/UkFmd4\nSDYBkCSpuY1GM/XIlHEclozFsl3nL2L3pSvk4eER5dJ37u7u4tDBg9KJ9XuiDcv3Pt6o9k9D0aB2\nFWFuWIaEhKJ1137y6/fvxMWzq8wOSwDImycbdnrO1uh0mjVEVNnsJ7I4wYFpYURUTadSrTgwYYwm\nR7p0li6HsSTFP1CPDrPminHjxkW5ms/ly5cxdOhQWjt7KaVJlTrKY+mD9KjRvrGcLUsGMXPcMLOu\ntQwNDUP7fwfJT168wOULaxTqn7iWuljRfNi4bopWo1HtIKLI71Ydi4goGRE5xXU7iREPyVoQERXX\nqlRHd44ZrqtQIL+ly2EsyankMsygTJmaduzYEelqPj4+PihRogQcGrfE5MFjozyOLMto0q2t4eaD\nWzi3b0O0vdBwYWFhcOw91HD15m26cmmtZGcX+UQjc23cfFA4/TveJzAwqEhc3oSaiLIB2CGEKPjN\n40ohRFhctZsY8DULFkJEebQq64OrBvblsGQsDizYtQc3n79UXNrmGelqPrIso23btnK2DJnF5MFj\no52S7jJplOHMlfN0dt96yZywlGUZ3QaMMly6fpOuxkJYAkDzptXoyZOX9tNcVx4mouJCCL9fPmjk\nJgHISURXAIQCCAbwAcAfAPLGUZuJAgemBRBRaq1KdWJGt062DUqXtHQ5jCU5L729MWTlGrFkyRJK\nmzZtpPtMmDDBcO/uXXp89Gq0Ybl47QqxeN0K6cAmd7K3s4uxbVmW0XPIf4ZT5y/RlYtrJXv7mJ9j\nroH9HZTXrz/ItmffqbtElDWOenwuAPILIf4iokoAdpl+fhYHbSUqfA4znhGR0laj2dGjXm17xxrV\n+P1nLA7UHDHWUL9+/ShX8zl48CDmzp2r2Lt8s6TVaqM8zoGTR9B//DBynz2BcmXPGmO7QggMGDXZ\ncPD4aTp/ZqWUKlXsTuI7eeoKDhw8a21no0mj06pnxOrB/4+++f48h6UR/8GOZzq1asZfOXMUHNf+\nH17vjrE4EL6aj6ura6Q9xxcvXsDBwQHjB4xAkT8LRrYLAODmvTto7uSAEf17oEq5UjG2K4TA0PGu\nhh37D9OZkyuk9OmjnkD0M1au2ikaN+2P4f1a4dbJRUr7ZDpHKytlp1htJHIB8dBGosCBGY8kSWpj\np9E6bhw2SKvgVXwYi3VXHkW/mk9wcDCaNWsmVyhRRu7p0DXK47x5/xbV2zVCs4Y1Ree2zWNsVwiB\nMdPmGjZ67pFOHHOXMmeOfBj4Z8iyjGEj5soDBrli/ZIhGOjcHCmS2+LApolatcp6DhGZt3KC+fwA\n2MbyMZNFPifvAAAgAElEQVQEniUbT4iosFalOn1i2kRtoezZLF0OY0mOaTUf+R+HDhg1alSknQFn\nZ2fDkUOH8ejolShnugbqA1GqUTU5VSpbsWX5XLM+2U6evVhetGodHT28hP7Im+3nX8Q39PogtOsw\nwnDu3A06sWOq9EfuzF9t33f4Epp2/O9zoD64iBDiaWy1S0QeAAoB0AN4I4RoEFvHTsw4MOMBEaXU\nqVW33Hr2SNOyUgWz75XHGDNfy0nTxO1oVvNZu3at6N+/P27sOUWZM2SK9BgGgwH1O7eSHz57KM7s\nWWfW5SMz3VbIsxatoEMH3KhggVy//DrCvX33AfUa9JL1gYHi4v7ZCnv7yGfazly41TBy8sqn/gFB\nf8XhzFkGHpKNc6a7j2zvVLN6cg5LxuLGrvMXsSea1Xxu3bqFvn370tLJc6IMSwDoN26o4crNqzi0\nZblZYblg2Rp51qIVtGf33FgNy1u3H6FkmbZInUIn7p9dEmVYAkDvbo0UjeqUzWhro1lJUd0Nm8UK\nDsw4plWpphbMlvWvyY4OPMmHsTgQ02o+vr6+aNq0qWjToLloWivqkcV5K5eIlZvXSbvXLZJsdFHP\nnA3nvmaTmDRnsbR9qysV+yvfL72GiPYfOIPKVbugWb2y4vCWyTEGNxHBbVovdZpU9tWVSkXnWCuE\nfYeHZOOQJEktUiezW3Zt3ixtqmSxdy0WY+z/Kg4aZrBKFflqPkIINGvWTH717KW4tudklOcjdx85\ngFY9O8Jj4TSUL1UsxjZXb9wuhk2YQZs2TEXlSsV//UWYLHDbKIaPnEfTRneGU8d6P/TcO/efo2SN\nXoEBgcGlhBA3Y60o9gUvXBBHiKiAVqVatnPMCA5LxuLIgp17cOull+Ky545IV/OZNWuWfPHCBTw6\neiXKsLx25yZa9+qEsS69zArLjZ57xLAJM2jN6gmxFpYGgwH9Brga1m3YK+30GIMq5X98ydh8ebJg\n7qR/NT2HzN9JRPmFEHw5SCzjIdk4QERqG7V6xxynLpq/cuawdDmMJUkvvb0xZNUasWjRIqRJk+a7\n7adOncKkiZOk7YvWSHa2kX9o9XrzCjXaNUbb5vWEQ6vGMba5bc9B0X/kZFrmPgY1qpf55dcAAH5+\nAajfqI9hu+cRunZkHv1MWIZzaFWd6tcsndZGp1kaK8Wxr3BgxgGdWjW1SuGCadpVrcIn4BmLI+Gr\n+dSpU+e7bW/evEHr1q3h0r0PyhaLfNEB/wB/VGvbSBTOn1ceN6RvjP9X9xw6jl5D/qNFC4ejft2K\nv/4CALz0eodyFTuKN6/f4fEFdylbll+/Y5HbtF7qlMlt6yuVCodYKJFFwOcwYxkRVU5uY7PrzqJ5\n2pR2fO0vY3HBZelyrDlzXly+fPm7BQrCwsJQtWpV2U6lE4c8tkc6FGswGFDLoans9e6lOLHDI8aJ\nNQePn4ZjryGYPXMQ/mnzfUD/jMtX7qJ+o94oUzyv7LlqtFmLupvr+q0nKFunb0CgPriQEOJxrB34\nN8c9zFhERHY6tWr9iv69OSwZiyNXHj7Ggr0HsHr16khX8xk+fLjhtdcr7FuxOcrzls6jBhpuPbiD\nAxuXxRiWx89cQKfeQzF1cp9YC0vPncdQo7YTuvxTAzs9xsZqWAJAofzZMcalndrORruZiHiuSizh\nwIxFthrNwmbly9nVLhHzxAHG2I+TZRkNxk2Ue/ToIZcs+f2dfjw9PbFixQrF4TWeklIZeU7MXDpf\nXr9ji7R/4xJJq43+hs6nL1xBux4DMXaMExw7Nvrl+oUQmO66SnbsPBoLpjhj0si4Wwq2b/fGigL5\nsubRqK2Hx1kjvxkeko0lRNQwXfLka+4smqu10WgsXQ5jSVLLSdPEHZ+P4uTJk98tUPDgwQNUrFgR\ns0dNhkPT1pE+3/PAbrTt2xUblsxAqWJFom3rwpUbaN6pF4a4dES/vu1+ufbQ0DD0cJ5g2LnrhLR3\n/X9Uqtgfv3zMmLx89R75y3fT+/nrKwshzsd5g0kc9zBjARGl0aqsV6wbMoDDkrE4svP8BeyNYjWf\ngIAANG3aVNT/u6aIKiwv3biKtn27YdKI/jGG5dUbd9C8Uy/07fNPrITlp09+qFHbST5y5DzdOrkw\nXsISADJlSI0lM/tqbHTqLUSki5dGkzAOzF9ERGSr0azuXqe2ptyfsbfaB2Ps//wD9eg4c54YN368\nyJXr6yXohBBwcnIyKCHJK13dIp3t+vzVS9RyaIpO/zRB6ybRLwhw8+4DNOnoDCen5hg6+NeHTJ88\n8UKpsu1EiF4vHl90lzKkS/nLx/wRzRtUQL0apVLY6DSz4rXhJIiHZH+RUqHokD1d2rlX583UqSJZ\nw5Ix9usqDhpqsE6dFp6enopvFyhYvHixGDNmDO4fukipUnwfRr5+vijeoIrInTOzWL1garSdhHsP\nn6BO6y5o376umDKxzy9fFnb23HU0atofNSr/JW9YMtRiHZSPn/yQs4Sj/tNn/6pCiDOWqiOx4x7m\nLyCirCorq7nrhwzksGQsjszfuQe3Xr5SLF269LuwvHTpEoYPH07rZ7tHGpahoaFo0KWNrFYr5ZXz\nJkf79+7Rk+eo16YrWjSvFithuX7DPlGvYW8M6NEElgxLAEhub4v5U/7V2NpoPIiI/1j9JA7Mn0RE\nZKfVrh7SspmK72/JWNx46e2NoavWiMWLF3+3mo+Pjw+aN28O53adUb1Cle+eK4RA92F9DQ+fPsS+\nDUuivXzk6Qsv1G7dBfXqVRCzZ7r8UlgKITDmPzeDc+/JtHJufwzvF/k51fjWslElFCucO43K2srF\n0rUkVjwk+5OIqGn2tGlX3HKbo7OKYvo6Y+zX/OnUy1C8fAW4ubl9dU2lwWBA3bp15dCAIHFmy4FI\nr7ecsnCWPHnhTDqx04PSp00dZRsvvF6jZgtHUalyMaxc9t8vhWVQUDAcu4w2HD9+iQ5vmSQVyp+w\nlsZ88uwNClbsrg/UBxcUQjyydD2JDfcwfwIR2ehUKjf3vj05LBmLIy5Ll8M/zCBNnz79u0CcMGGC\n4f69+ziyZkekYbl5j6cYP3eatGHpjGjD8vXbd6jduosoXbqg+NWwfO/9EVWqdZWvXL6De2eWJLiw\nBIDsWdNh5IB/rO1stKv53pk/jgPzJ+jUqnF1S5XQli/wp6VLYSxJCl/NZ9WqVd+t5nPgwAHMmzdP\nsW/FZkmt/n7hgXNXL6LjwB40bewgFC2UP8o23r73Qe1WXUShQrnE+rXRn9+Myb37T1GqbHuhUyvF\ng3NLFClTJNw7FBXOn0Ph5x9YGsA4S9eS2HBg/iAiKkBEXV27OPIFl4zFgbCwMNQfN9Hg7Oz83Wo+\nz58/R4cOHTBh4EgUzlfgu+c+efEMdTu2gFPH1mhWv1aUbfh8/IQ6rbuInLkyydu3zPilv4NHjl5A\nhcqdUPvvoji5c7oiqhWGLO312w9o0uE/QzPHcWhRrwbUKmsnIkq4yZ4AcWD+AONEH82yCQ7tVGmT\n21u6HMaSpDZTZ8gpUqehwYMHf/X3KTg4GM2aNpMrlSgrO7fv8t3zPvl+RrV/GooKpYvJg3t1jfL4\nHz99Rt3WXUX6DCnl3TtmR7nerDncl28XzVoOxFiXtlg6M+Y7nliCwWDArEXbRJ5SneDl9RlXdq/H\nwonDUb9aJbVWox5v6foSEw7MH9M0TTL7fF1r1+D3jbEftO/SZRTo3hP5uvyLqZu2fLfd+7MvSvTu\nj22nz0ohISHShg0bjI97e6NGjRrIlSsX3r9/jy1uqyUAaNKtLd68fwsACAkJQT3HFrJdMq3sPntC\nlP8/ff38Ub9td9nOXisf2r8wxoXXoyLLMgYNmWkYPHQWtiwfjj7dYr6XpiWcu3QX+ct3ExNmrBeL\nJ4/C/tULFKlTJgcAjB/orCGiTkQU9bg1+wr/4TcTEWl0atX8hT2ddArFL30oZey3YzAY0HvhEuwc\nMwLXF8zCumMncefFy6/2mbnVE3deeMHV1VUcPHgQQ4cORWhoKDZu3Ih8+fIJQ5hB5M6aQ5IkCTsO\n7cVfBQojXeq0EEKgk0tPw/NXL8TedYuj/M/p7x+Ahu2cZCuVQpw4uvSnwzIwMAhNmw+Q163bSxcP\nzKaaVYr/1HHi0oePfnDsNd1QtclglCtaDHcPb5NqVy731T6pUybHyN5dVbY2usUWKjPR4cA0k9rK\nyqVSwQK6SoW+P2/CGIve+fsPkTN9OmRLmwZWSiVaViyPHWe/Xgt8w8lTcspUqYSjoyP5+voiRYoU\nUCqV8Pb2hoeHB80dM5W0Gg0MBgPmLHfDwK49AQDj506T9xw9IO3f5K6wtraOtP1AfRCadHSWQ+VQ\ncfpEzLf0isrrN94oX6mj/PjRc/Hw3FIpT85MP3WcuCKEwPJ1B0SO4h1w4fJjnNmyAq4jB1BUr7dj\n84aSrU5biIhqxFVNRNSLiG4T0aq4aiO+8HWYZiCijBpr6wfX5s/SZE+X1tLlMJbobD55GvsvX4Vb\nrx4AAI8jx7DpxCk8ePUaBoOMfFky4ejtu8iXLx+eP38Of39/zJkzB8uXL8fJkychESFjugxYPGk2\nzl65gBWb10JtrUL18lXEonXLyXPVfEyb746po12QNvXXK/4EBQejWcdesvcnH3H5whrFtwu3m+v6\njQeo16AXihTIbti7ftxPh25cuXnnKTr0nC4/efYGEwb1klo1iHrSU0SeB47i3xGTHvgHBP4hhJBj\nuy4iugOgqhDiVYTHlEKIsNhuK64lrN94AmWr0cxyblBXyWHJ2M/59pI/WZZx/OZt7BwzArv/G4Fd\nFy6hXLlyKFasGO7fv4+TJ0+iT58+ePz4sciXO6/hxZnb8PX3Q/7cf2DV1vVw6d4HmTNkxAz3+dS7\nWzu8fvsehf7M+11YhoSEonXXfvIb73fiwtlVPx2We/aeQtUa3dC6SSWxf+OEBBWW/v569B3uZihV\nszeyZchMdw9vMzssAaB+tUrIkiFdegBtYrs2IloIIAeAvUT0iYhWEtFJACtiu634kDDnPycgRJTf\nVqOpO6RFM15/kbGflCFlCrz09v7y89m795HWPhmypU2DP516GQoWLEgPHz6U+vXrBwDIkSMHlEol\n3rx+g2sXjyu8P35ASvsUmLxwJupUqY4dB/fgyJmTyJIxPc6cv4qTZy/BY+H0r9oMDQ1Dux4D5acv\nX4qrl9YpIrtm0xxz56+TR491k2aM7You7WsnmJmwQghs3XUa3QbMhr2tLQ56LMKfeXL8cH1EhClD\n+9i06DHIlYg2CiGCY7HG7kRUE0BlAD0B1ANQPjbbiE8J52NSAmWn1UxyadHUylbLl10y9rOK586F\nh69e4+nbdwgJDcW+S5dRMFs2DFyyDP5hBqlz586SRqPBkSNHAAA7duyAj48P8ubMRflrlEbRehUx\noGtPvH73Fs7tumD3kf2QJGDKyEF48vwlWjSsA7VK9aW9sLAwOPYeYrjz8BEunfdQaLU/HpZhYWFw\n7jXJMG78Etq9Ziy6tK8da+/Hr3r89DWqNhksO/Z2Ff07O+DizrWKP/P8/MpC5YoXQcnCBbRKpcI5\nFsuMKDzIPRNrWAJ8DjNaRFTAVqs5/3zFEg3fGJqxX7P34mX0X+wOgyyjRJ7c0AeHYPely/j333/x\n559/YvLkyXjx4gUAY1jly5UHVctWguuICXj07AmK1q2IOlVqwPPgboCAXNmyICQ0FJIkwUanw6Mn\nz5A7ZzaMHugMt5UbDHsPH1ecP70SefJk++FafX0D0LzVQPn+/ac4t2+mlCVjmpifFA+Cg0MwcdZ6\nedq8zVLZYkXkZdPHSDZabawc+87DJ/i7VVf/oODgzEKIT7FyUABE9ARAcQDOAPyFENNjeEqCxT3M\naNhptZOGtGhmzWHJ2K+rVbwobrnNxd3F89G9Tk3suXRZ9OnTRx47diy8vLxQqVIl7Nu3D5IkoWKp\nsobM6TOhae2GAICcWbMjZ9bsOHTqmEiTKqVhy7I5UKtVqFqhDCqULo4/cmfHqEE9IUkKOPYeJo6c\nOkvOPVr+VFi+ePEGZSs4iA/eH8TjC8sSTFgePHYFuUo6iqUeB8RmN1dsXDA11sISAPLlyo4G1Ssp\nNGrV8Fg7aBLDgRkFIioI4O8e9WrzRZeMxbIZ23fKAqA2bdpIISEh2LJlC5ycnLBo0SJDWFgY9i7f\nrMibMzcOnT4GAHjr/Q53Ht5DUHAQDmxapihZtDDe+3zE0xevkDdXdgQE6hEWGoanz18Inw8fqWDB\nXNLwoZ1/uK4LF2+hVLn2KJA3s7h2dL5Co1HF/KQ49uqNDxq1G2No7DAWrerXpZv7NytK/1UwTtoa\n2burRgjRg4jSxeJhRRTfJzocmFGw02onD2nZzFr3kxMFGGOR23HuAg5cuSa5urqiefPmKFGiBJo0\naYK7d+9i06ZNUopk9lAqlRji1BeXblxF0boVUbJhVYQZDJg6ZiClTGFcllKv16NN03poWq8mPn78\njCHjp+Od9wdq2LAKOrZvALX6x8Juy9ZDonZdZ/ToUBfbVo6SLD0TNizMgBkLt4i8pTvh7bsAurZ3\nA4b3/PEPAT8iY7o0aNOwtqTVqIfG1jGFEDmEED5CiDFCCNfYOq4lcGBGgogKEaGyU91a3LtkLBb5\nB+rRcdY8MX7CBOHg4IDLly/j2rVraNCgAbp3744JA0ZQmpTG23GlSpES2xevwYyRE/Hx00cUzv8H\nsmbO+OVY+fLkRIZ0aWCj06JAvjyyTqsRp04sw6ePvmjUsAp69JyIf9oPxfnzN6OtSQiBSVOWyV2d\nxtEi114YN9QhTt8Dc5y9eAf5y3cVk2dvEu5Tx2LvynlSynhav7pfl3YqWZY7E1HU90X7TXFgRiKZ\nVjtlWMvmKu5dMha7ao/6z1Dkr79kR0fHL5c/BAQEoGnTpqJBtdqica36X+1/7/EDNOrSBgOcHVE4\n/x949frdl22v3rxH+rSpMWn2IsPKjdvo2JEltHbtXrgM6oD1G/ejfNkiWLxwJMZNXBJlPSEhoejY\nebRh9pw1dHTbZLRpWiUOXrX5fD74wsF5mqFa0yGoWKIk7hzaKtWoWCZea8iYLg2a1alGapVqULw2\nnAhwYH6DiAqDULFbnVr83jAWi+bv2I3bXq8U7u7uivCFDIQQ6N69u8GKFPKKaQu+uobwvY83qv3T\nUKRKaY8Fy9bg8IkzWL99NwDg4tWbSGZnA49NnvL8ZWskWZapZRsXrFy9EydPXUWQPhh+AYGoU78n\nTp+5hh27jn85bovWLnjz1gcfPnxGtZrd5VOnruD2STcqXiRPPL4bX5NlGe4e+0TOEh1x9fpTnNm2\nCtOG94tySbu4NrCbgxoQPYgouUUKSKB44YJvJNNqpwxr1UKl/cHzH4yxqL14/x5DV68V7u7ulDr1\n/0f6Fi9eLI4cOSLdP3SR2vXthuPnT8H74wdkLVcARJKwVilF7aoVqWn9mnB2GYusmTKiRI1m0GnU\nKF+quDxr8UqaMqk37d13GhqNCpvXT0OOHJnw3vsjKlXphNDQMCyYNxTz5q9H/boVsWvPCRQpnAcB\n/oGoUM9ZpE+dTDw6vyTKNWjjw/VbT9Ch53T5+ct3mDq0H7WoV8Pip4KyZEyPOlUqYMehY84A/rN0\nPQkF96IiIKLCRFShe52a/L4wFotqjBhraNiwoVy79v8v/r948SJGjBhBG+Yso1QpUsJj1mK8OHMb\nAbdfoViBIgaFAvLZPeulMS69YG9nCwCYPHIALuzfhHYtGonVm7bTzm2zKE/urBBCYNXycciRw7gY\neupUydG3T1sMGdwJ1f4uBYVCgsFgwPwFG1CmdCGUrdgRFUv9ifP7Z1ssLP38A9FryHxDmdp9kDNL\nNrpzaKvUol6crYH+wwZ0a69VKhQDiIivqzPhYIjAVqMZ0r9pI2uNinuXjMWWgUuWIcAgS9OnT//S\nc/Lx8UGL5i3Qs31XVCtf+av9h04dK5+8eIYOblmmUCq/HwRbvXG7GDttHm3eOI1KlSoIIuDcuRso\nVbYdGjXthzt3nwAAWjaviZ27jqN+oz4YNKAD3BZtRrasGUSzlgMxpHcLeCx0scgyd0IIbNpxAjmK\ndcDeQ1dweO1iLJk8iizZy41MvlzZUapIQUmSpI6WriWh4JV+TIgopdra6uWTZYvVqZLZWbocxpKE\nyw8eofLQkdi1axeKFzfeN9JgMKBOnTqyQR8iTm/e/9Xw49L1q0T/8cOwb8MSypMz+5fHn798hbZO\nA+Hcua0YMHoyrfOYiOrVSgMA/PwCoFAooNWqsW//GQx0mYHrVzZ8VceHD59RrmJHeHt/FGVL5KNk\ndjr0c2qC0sXzxfVb8JWHj1+hc98Z8tWbj2nov52p2z/N4rX9H3X2yg006zbgbYBen1EIYbB0PZbG\nPUwTpULRuUHpUjKHJWOxIywsDA3GTTL07NlTDg9LABg3bpz84P4DHPbw/CosD506hr5jh9CSGeO+\nCstwvn7+GDBqMi13H/MlLAHA1laH8LVia9Yog9CwMHz48PnL9qCgYFSo0kl8+PBZHvBvU2rbvCqW\nz+mPMVM9Yv01RyUoKAQjJq2UC1d2glppgzsHtyX4sASA0n8VROaM6bQA6li6loSAAxMAESlUVlb9\n+jSqH3vrTDH2m2szxVVOmTYtDR48+Mvfmf3792PBggXS/pWbpYh3D7n94C6adm+Hof26oWokl1Ec\nPX0er96+w6KFw1G/bsWvtr199wHhI2UXLt6CEAIpUiQDALx7/wGly7WX3771wZNLy6Tk9rZfbjWm\nD4qfNcD3H7mEXCU7ipXrDontS2di/fwp0s8sBm8pvTq0sk1ma8OXmIBnyYarnTVNak2JPLktXQdj\nScKOcxew7+p16eTJkwg/D/ns2TN06NABkwaNQqE/CnzZ9633O1T7p5FoXK8aurVv9d15xQbtnHDm\nwhUoFBIGD5sN/4BAhIYa7z3c2bExtm47jCVLt0KhVECrUWGlu3FS5527T1C7nrOQw8Lo0sHZlCK5\nHVo3roTGDv9h8pwNGOvSLk7fA6/X3ug+cI7h2Kkb0r/tW9LgHo4Wn/36MxrX+hsDJ8wsTkS5hBAP\nLV2PJfE5TADJbWxOTO/qWL59VctetMxYUuAfqEe2zk5izNixCF+gICgoCBUqVBB5MmUXWxd5fOlx\nBuoDUaZJDTlZMg22r5r/3YjX8TMX0LbHQEyd1BuOHRuZXcOhw+fR+p/BaN2ksnCb3iteJ/eEhRkw\na9E2edTkVVLhP/PKq2aOl1LaJ4vPEmLd8KlzQ903bF8QqA/qbelaLOm3D0wiym2r0Vx75bFMo05g\ns9QYS4zKDxxq0KZLj23btn1ZoMDJyclw4uhxenj08pc1WmVZRoPOreV7T+6Js3vXK769SP/0hSto\n3bUvxo5xQo/uLcxuf/GSLWLIsDk0cUQH9OzcMPZemBlOn78NB+dpws8/SMwbO0SqVqF0zE9KBJ6+\neIUyjdv7BwWHpBFC6C1dj6X89kOyOrWqd5faNZQcloz9urmeu3DH65Xiys5dX84Vrl69Wnhu3y7d\n2Hv6q5VrBowfbrh44zKd27/hu7C8cOUG2nTrh2FDO5kdlgaDAQMHzzR4eOyWtq8ciaqV/oq9FxYD\nb5/P6DvCzbB112lF2yb1aOKgnhZbpScuZMucASUK58eJ81daAVhm6XosJen8Rn8CEekMBrmjU93a\nVpauhbHE7sX79xjusU4sXrwY4av53LhxAwMGDKBlUxdQpvT/Xzh9oYe7WLbRQ9q91k2ys7H56jhX\nb9xB80690LdPW/Tt3TbGdl++fIvqtZyQLmM1LF6yRdG7a0P6NiyPnroO+5xNUfTvf1H0738xznUt\nAOC99ydUqNcfhSo5YfueM1/2b9x+LN68/RBj27IsY/HKPSJniY64ceslznl6YPLg3khKYRnO2aGV\njZ2NzsXSdVjSb93DJKI25fLnk7OlTRg3iGUsMasx4j9Do0aNULu28R6ynz59QrNmzUT7xq3QqEad\nL+cR9x47hEETR9LKeZORPWvmr45x8+4DNO7wL5ycmmPoYEez2vX2+YQXL9+IjBlSyUe3TlJUbuSC\n1k0qI1+eLF/tV6lsQWxfNfqrx9ZuPQanjvXQuE5Z1G0zEg1rl8GOfWfxV6GcSJc2RbTtXrv5GA7O\n0+SXr7wxY+RAalq7WqKc1GOuquVKQq2yzkREJYQQFyxdjyUkvY9BZiIistVoXPo3aWQT896MsegM\nWLIMgQaDNG3aNAVgXM2mQ4cOhlT2KeS5Y6d+Ccvrd2+hpXNHjB7kjEplS351jLsPHqNhOyd06FBf\njB3lZFa7V6/dQ72GvZEvZ0Zx+6SbIl3alMiXOwtevfH5bt/I5mtYWykREBiEoOAQKCTj8nmzF23H\nIOfmUbbp5x8I58HzDWXr9MUfOXLRvSPbpaa1q5lVb2KmUCjQvW1zjY1O+9tO/PltAxPAXxprq3RV\nixSydB2MJWqXHjzEon0HsdrDg3Q6HQDA1dVVvnrlCh1bu/NLr+vV29eo0a4xWjepIzq2bvrVMR49\neY76/3RDixbVxZSJfcya1bpz9wlUq9kdDi3+FnvWj5MkScLT529x5eYjlCr6x1f7EgGnL9xBkco9\nULf1CNy+9wwA0KZpZXjuPYuaLYZhaN9WmOe+E+1aVIVa/f2cBiEENmw/juxFO+DAkas4sn4p3CaO\noMiW70uqWjWoJYWGhjX+XdeX/X1+09/QWFu3a1f1b+ukeK6BsfgSFhaGhuMmG3r16kXFixeXAODE\niROYMmWKdHDVdtjZGlfO8g/wR/W2jUWBP3LKE4f3/2ro8snzl6jTpgvq1asgZs8YFGNYCiEwa84a\nedyEJdKciU7o2LoGAYC/vx7NO43HzHHdYGPz9d/zooVy4fmVldBq1dhz6AIaO/yHe2eXwM5Whx0e\nYwAAHz/5YdKs9diyfCS69JuFz5/9vyyf9+CxFxx7zZBv3nlKw3t1pc6tGifp4deopE+TCkXy5zWc\nu47NmgAAACAASURBVHKjAYD1lq4nvv2Wl5UQEenU6nfHpoxPVTjH90twMcbM02LCFPn+Zz+cOHFC\nUiqVeP36NUqWLIlBXXvBpXsfAKa1Yzs0Nzx7/Qyndq35akbsC6/XqNHcEVX+Li5WuI+NMSxDQ8PQ\ns/dkw3bPI9LONWOoXMn8Xx6v/88o1KpaHH26NY6x7hzFO+DigTlIkdz2y2P9RixCozplcO/hS6hV\n1mharxwaOYxFiSJ55Jlu26RKpYrKS6eMSVSr9MSF9Tv2w2XizOOffP0qWbqW+Pa79jBLpbCxURfK\nns3SdTCWaG0/cw77rl6XTp06BaVSidDQULRo0UIulr+wcOne50sPrPcYF8P1ezfp/P6NUsSwfP32\nHWq36iLKli0kVriPjXGo5/NnfzRtMUB+8uQl3Ti+gDJlMM7EFUKgc5+ZyJc3S5Rh+fbdR6RJbQ8i\nwvnL94zL50UIywePvfD6rQ8qlimIqzcfQ6NWYf+xyzh++gbuP3glPJfOQvFCf/7Ww1FCCNy4+wCn\nL12Tff0DKhLRH0KIu5auKz79loGpU6nata9WRRN+nRhj7Mf4B+rRac4CMWHCBOTMmZMAYOjQoYZ3\nb97SueP/vwPJ7GUL5TXbN0pHt68iG93/l2p++94HtVt1EUWK5Bbr1kyKMYiePXuNWnX/FXa2avHo\nvLsi4jnGU+duYfWmwyj0Z3YU/ftfAMD4YR3w/OV7AEA3hzrYtOMkFq7YBaXCuHzeWrfBXx1/xMSV\nGD/UAQBQqUwBVGk8GL6+AWhc628smTLqtxx+Dffc6zXW79wvr9y8kz5+9qU8ef5AgQIFg27evFEF\nwG8VmL/dkCwRSVqVyufszKn2+TJnsnQ5/2PvrsOi2Po4gH/PzLIsaaFiN/a1vXajotiK3YmB3d3d\niqJioyAhIiAIBqKiYHd307U9c94/UO711XuvsbCwnM/z+HhlZ2d+exW+c2LOYZhs6f9X8zl69Cgd\nPXo0rh0PI2VKpA1z+J8ORh+noTi8Yx0a1PnruciYuHi0cRhKS5UqJJ4I2PKfYRQZeQeduk1Eq8bV\nRM/dczKslafRaLHB5ai4cLUbV6NyBXH/+qVc3tw5c/eiuIRE+J48iz1HjolPXrziihcvLvTq1Zfv\n6dALPM/j9OlTmDFr+o3ExMTMWx0iC8iJLcxGBfPk5llYMsyv2eIXgAfv3vPXPq/m8/jxYzg6OhLn\nRWvxJSyv3bmJPk7DsGz2xK/CMj4hEfZ9RtLCRazEgOOb/jMsPb1CqOPYZWTK6G5YMK1fhoXl+Ut3\nMHDcWiqXq+nBDcvQvEGdHNf9qlCqEHT2AvZ5HRcirt/iCxYoILRv14Hfd3AkzMzMvvq7atSoMdRq\ndUVCSFFK6Rt91ZzZclxgmstkAwbZtmTbeDHML3gdHY05Bw9jz969yJ8/P1JSUtClSxfapbU9+nVx\nIADw+t1btB3QDYN6daZ9u3dMH/dISk5Bh76jRMvcpjQ0eNs3y+H9HaUUy1a4ius3unG7N06EQ6cm\n/3js74iOScCE2S6CX/AlfkDXDmTJ1DH/WpehEQQB4ZHXsd/HXzhx5gJvaWkhNGnanD+5fD2sra3/\n8YZGKpXCtlVrMSDQ3wHAukwsWa9yVJcsIURiIpXGXd+6waJMIWt9l8Mw2U7FUeOEP5s2w7Zt23hK\nKfr27Ss8uvcAd4IjeI7jkJySjNodm9PSJQvTQy5r05MnJSUV9v1GiYSn9NKFff8aSiqVGsNGLhJO\nnY4kp32Wc9WrlNH55xBFETsPBNGpC3aRsiWLCW6blvOFC+TX+XWyIkopbt1/hEPHggSP48E8x3Fi\n9Zq1ydgx40jlSpV/+Dzh58MxecrE+4mJiZUysNwsJae1MJsWL5AfLCwZ5uelreYjcmvWrCEA4OLi\nQsPPhXMPT0URjuPSnskc0Vc0MiL04LbV6a0TuUKJroPHilpRQ6MuHvjXsIyNTUTHLhPEmOg4PLiw\ngyuQP7fOP8f1208wcMxa8f3HOGxaOJ10adMiR0zqefnmHdyPB4sHfAJIYlIKyleoSFasXIPmzVr8\nUpO63p/1IAhCKUJIaUrpM13XmxXlqMC0MDEZNNi2pZm+62CY7ObLaj4BAQHEzMwMUVFRmD9/PvF1\ncYNV3nyglMJxziTh4bNH5EqIZ3ooKlUq9BjiJCalJtPrVw7z/7YqzuPHr9DWfgwtXtiKPo1y/ddj\nf0VScipmLNot7D9yiu9o25ycOTzN4FfpiY1PwNHgM3SP5zH67OUbrkSJknT4yDGcQ4+e4Djutx4T\nMDIyQquWttTv+LEOADbqqOQszbD/tfwNIUQikxp16dG4Yc4ZoGAYHfi8mo/o5OSE2rVrczExMXBw\ncMD4gSPRsmHas+trd20RfYL8uHPH3YhMlvZgv0qtRq/hE8WPsdH0+pVD/xqA58KvoUfPqejcrj72\nbZmi0xYfpRQevmEYM20r8ufLi7MerihXqrjBPlMmVyhx4uwF7PX0EyJv3uGtCxQU7Tt04g8MGfbN\n5J3f1axpM5OzYWe6IocEZo4ZwySE1CtTyDr4wU7nnDlPnGF+UfelK8UnSSkIDw/nCCGws7MTqUpL\nL3gF8wDgG+yPAZMd4bV7I+rUqAog7RGNfo5TxEfPn+PGVfd/XR1n3/7jdPLUdWT+1D6Y+i+Lnv+K\nR0/fYLDTOvHew1dk/vhRZLBD5m4onVm0Wi3ORV7DAe8AISjsIp/L0lJo0qw5P3bMOBQsUDDDrhuf\nEI8mTRupNBqNJaVUnWEXyiJyTAvTiOfbtK9bO0cuGMwwv+pYxGWE3LydvprPggULxKdPnuB52E0e\nAKJuXcPAyY5Ys2BaelhqtVoMGT9TuP/kKbl57Z/DUhRFzJm3Vdy1+yg54joT7VrV/e5xv0KhUGHR\nGjdx085jXPMGdfDg1CYCArTqMxIqtQYajQZ2zRth/oSRX70v8HQ4lm3dDY7jwBGCRZMd0eTPWoiJ\nS0C/CbORlJyCOeOGoV2LxgCAvk6zsG7eZBS0yqez2n8UpRQ37z2Cm2+gcMT/JM9LJGLNmrW5w4eP\noGKFipkyLpsndx4UL1Zc9fTZ0/oAwjLjmvqUYwLTwsSkS+ua1dlG0Qzzg5LlcgzbvI0uX74cZcqU\nIUFBQdi+fTt30SsYMpkML968QrtBPTBiYA/06NQWQNpjCiMnzxOu3b5Lblw9zJmbf/8JLoVCiX4D\nZouRUXcRdXIjKV+22HeP+xUBIZEYNmE9lUllNGDvFtSoXCF9GMbPdSNMTWTQarWwGzgWEdduoX7N\nv3YsalqvdnoY3n30FP0nzMG1wMPwPhGKoT07w75lEziMnoZ2LRrjxNkLqFbRJtPD8sXrd3A/HiQe\n8AkgSSmpqFChElmzdgOaNG6ql+GmFi1amr5+89oOLDANAyHEXCqRVGpUOcfMfmaY39Z23mKhRq1a\nGDRoEP/ixQsMGTIEq6YvRJXylZCQlIhWfTvR+nWq0VkTHDkgrcU4buZi4eKV6+Ra1CEu9z+skvPh\nYyzsOzmJSrmCPr60i8+dWzdb0r568wkjJ28SLkbd48YP6UcmD+//TSvL1CSttavWaCEIIvLk+rpG\nM9O/OqFS5Qrky5MLQNoEF7lCCdXf9s10OegF960rdFL7f4mJS8DRoFN0r9dx+uzVW65kyRJ0pKMT\n16N7j9+evPO7GjduIvE44t4ZwIz/PDibyxGBCaBx1ZIlFGYyGWthMswP2HzMHw/ff+CvBQRCpVKh\ne/futGX9JnRUvyGcRqNBx6G9RDNzGd2zaXn6htGT560QToVHkCuRbpyV1fcfB7lz9wnad3BClQrF\nacjpzTpZJECj0WKts4+4ZN0hrlbVSrgV7EVyW1p891hRFNHUYRhevH6LwT07o0KZkt8cE3AqHIs2\nuuBDTBx8XNYAALq3a4Xh0xdhn9dxLJw0Crvcj6JXxzaQGRv/dv3/RK5QIvDMeez19BOibt3lrQta\nix06dOIPDhkGU1PTLPMoTPVq1aFUKksRQvJRSr/duduA5IjANDGW2nWsV1c3t7EMY+BeR0djrpt7\n+mo+I0eOFFRyJTyd9/GUUgybMU54/vYFok6mPT5CKcXMJWsF/5Cz5PLF/Zx1we93UZ4MiUDfAbMx\n0KEl3bJyjE5+4J+LuI1B49ZSpVJDD21egaZ/1vrX83Ich3Cv3UhMTkH3UVNwPuo6GtX5ejnU9i0b\no33Lxrh49SZGzVqKqONusDQ3g8fWlQCAhMRkrN91EAc2LMX4BauQmJSCMQN7ok61H3/o/59otVqE\nXb6GA97+QvC5i3yuXLmEZs1a8MvWbEbBAgWzTEj+nVQqRY3qNZSXIy+3AOCp73oyUo4ITKlE0qFl\njWrscRKG+QGt5y4SunTtirZt2/IHDhyg/sf9ubsnIwjHcVjmvE4MOB3MnQ84TIyNjUEpxYLVm0Wv\n40HcxfN7SbFi35+Ruc3Fk86d70xWzx8Kx8H2v92F+Ck6AU6ztwkBJyP5wT06kYWTHH+qtZrLwhyt\nG9fH9bsPvgnMLxrUqgatVkBcQiLy5s6V/vXVLvswecQAeAWGon6taujYqikGTJwDr+1rfumzUEpx\n/e4DHPI9IRwJCOGNJBKxZu26nIe7N8qXL58lQ/L/tWjRyuLO3budwAIzeyOEWJtIpYVqldX98loM\nY2gm7dhN5SLlVq9eTW7fvo2pU6aQg+t3oHDBQjjif5Su3Lae892/FQXzp7UiV2zaIRz0PMadO+tK\nSpUs8s35BEHApCnrBPcjQZy/2wI0a1jtt+oTBAEu+wPpjEV7SLlSJRB1/BAKFbD6offGxidAwvPI\nZWkBhVKFMxFRmO44+Ktjnr9+i5JFC4MQgpv3HgLAV2H59OVrvI+OQcPa1XHn4ZP0LlmFUvXTn+X5\n67dw9wsWD/j4k+RUOSpWrEzWrduExo0aZ7ub+0YNG5KNm9a3IYQQasDPKhp8YAJo0ahKJbWE5zNu\nsIFhDMDVx0+wK+QUCQwMhEajQbdu3ejAbn3Q0bYdibgWhWHTx5GNy2ejepWKAIB12/aIO/Z7cKdP\n7SA25Up8c77k5FQ49J4u3r//jNw660xK/EPr80ddu/UEA8esET9+SsDWxTNJR9tmP9X6+hAdi9Fz\nlkEUKURRRM8ObdC0Xi3sOXIMADDYoRP8QsLgfjwYRhIJzExN4Lp6/lfnWLp5F+aOHwEA6GbXCn3H\nz8KG3W6YPXboD9UQHRsPn6BTdK+nH33x9j1XqmQpOmbcJK5rl656n7zzO0qXLgMjIyNTAOUAPNJ3\nPRnF4BcuyGVmenjxgH69Rtvb6bsUhsmytFotSg51FAcPH44ZM2ZwXbp0EWI/RuPa8TD+2asXqNOx\nOUYMdMC0scMAAFt3u4mrt+4iQYFbSa0aFb8535s3H2HXYSyV8pwYdXIj/28LF/yXxKRUTFvoKrh5\nnea7tG1JN8ybkq2WtEuVKxB45jz2ePoJ127f462tCwkdO3bmBw8aAlNTw9k4aeq0KYrj/n5TKaVb\n9V1LRsk+/+p+ASGEmMlktq1q/F43EMMYul4r14pW1taYNm0at27dOvHmjRvk2dkbXHxiAlr26Uib\nN6qLaWOHEQDYddCTrt6yi/gf2/jdsLx2/QE6dB6PBrUr0GMH5v/yTFhKKQ55n6HjZjgT6wJWOOe5\nG2VKFMsWrTCtVoszEVdwwMdfCAm/xOfOlVto3qIVv2qdM/Lnz58txiV/VtOmzUzOhYd1A8ACM5sq\nI5VITMoVLqTvOhgmy/qyms/Fixdx8eJFrFmzhgs94Ju252GvLmK+fJZ05/olPAAcOOJLF6/dSny8\n1uLPP6t+e67jZzF0+EKMHWKPFfOG/vJY3IPHrzFo3Frx0ZO3ZOGk0RjQrUOWDxlKKa7duY+DRwMF\n78BQ3kgqFWvXrst5HvFBuXI2Wb7+39WgfgPI5fL6hBCOUirqu56MYOiBWbtu+XICIdnippRhMl2S\nXI6hm7fRFStWQCaTkb59+2LO2CmoU60m+owfJrz79A6RwUd4ADhy7ASdvXwDcXdbjiaNa351Hkop\n1q4/IK5YtYfbvnos+vVo+Uv1yOVKLFzjJm5xPc61avgnOXZqC5HJsvb0g6cvX8PdL5geOBoAuUKJ\nihUrkw0btqJhw5y10UPevHmRyzKXNiY2xgbAA12em6T9ECf6DmKDDkyZkVGdBhUrsO28GOYf2M1b\nLNSuUwd9+vThmzdvLtauUp1OGzmeX7hhhRh6/gy5EHiYk0qlOBoYQqfMX0n2710E21b1vjqHRqOF\n45ilQsCJ89xpnxWoW7P8L9Xif/Iyhk3YQE1lJvTE3q2oVskmy97pfoqJS5+88+rdB65UyVLi+PGT\n+c6ds/fknd9V9Y8/cObM6drQQWASQkoCCAZwCUAtAJUAcJ9f6w6gPaV08D+9PyMYdGCayowb1yhT\nOkfd5THMj/qyms/1wBOYMWOGEBsdQ6K8QvmDvkfoOtetXMAhF+TPlxeBoWEYP2sp2bljLtq3a/zV\nOeLjk9C1x2Tx9av35G74dlLY+ufXVX35+iNGTNokXLp6n5s0bACZMLRvluy+TJHLEXDqPPZ6+QnX\n79znC1kXEjt16soPHjwEMpksS9ac2WrVrGUWEXGxAYCDOjplWQD9KaWRhJDkv31dL7NVDTYwCSFE\nZmRUqUbZ0vouhWGynL+v5nPu3Dl6+PBh7rr/ORJxPQqjZ08izqvno3KFcggJu4hRU+Zh86YZ6Nq5\nxVfnePbsDezsx1KrvOb02ZXdvFQq/aka1GoN1mz1FpdtcOfqVKtC7oR4E0vzrLUgl0ajxZmIKBzw\n8RdCz1/mc+fOLbRoYcuv3eiCfPnysZD8P1WqVCXGxsaN//vIH/aSUhqpw/P9FoMNTADFZFIpsc6T\nR991MEyWYztnodC1WzeULl2ab9KkCdm2eB20ghadhvXGpNGD0N62GcIuRmLohFlYs2oi+vRq+9X7\nIy7dRJfuU9CmeQ147Jz108Fx9sItDBq3lmrUAvXYsgqN6tbIMj1BlFJcuXUPbr6BgveJU7yxVCrW\nrlOP8/I8irJly7GQ/BeVK1VGamqqDSFEQinV6uCUqX/777+3KvWyVaMhB2bNP0qX1MVfGMMYlEk7\ndlMFBbdgwQLSvHlz2q1NB7Rp0oLUtG9C27RoiPEjBpILkdfQf8w0LF08GoMHfb3psrtHMB07fgWZ\n4eSAOZN6/9R43cdP8Rg701kIOnWFH9arK5k3foROFmDXhScvXsPdL4gePBoAuVKFypWrks2btqF+\n/fpZo8BswMLCAnnz5lN9+vSxAoA7Oj79R0JIBaQtjNAFQJKOz/+fDDYwJTxfm034YZivXXn0OH01\nn/HjxwsyI2M4L1nLN+5hJxYuZEWdVy3gI6/dQp+RkzB39jCMGtEj/b2UUixaskPY4uzB798yBV3t\nG/7wdQVBwLa9AXTm4j2kQtlSuBpwWC+bLv+/jzGx8A48Rfd6+dE37z9ypUqVFidOns537NApR0/e\n+R1/VP0DoadCakE3gfn3VuUMAP4AogFcAZDpP98NNjAtTU2b1CpbhnWfMMxnWq0WnZauEsePH4/I\nyEiEnwvnHp2OIv0njhTiEmNxOfgIf/32PTgMG48pk/tjglPf9PcqlSoMHrZAOBd+lVzwX4M/Kv/4\n3IArNx5h4Jg1YnRsErYvnUPsWzXR6/dlcqocAafDsefIMeHGvYd84UKFxS5duvMDBwxik3d0oGrV\nqubh58/VALDvd85DKX0B4I+//dkbgPfvVfd7DDYwlWp11epl2IQfhvmi54o1YoFChdC8eXOuc+fO\nOL7zMNbu3Cqei7xALgV5cPcfP0PXQWMxZrQDZkwbkv6+6Jh4dOw8QUyIT8TjS7u4vHm+vzH0/0tI\nTMHUBbuEwz5n+e7tbMn6eVOIvrpfNRotTkdEYb/XceHUhUg+b548QstWrfkNW3Yhb968LCR1qHz5\n8sTExORPfdeREQwyMAkh1qbGxiYlCuTXdykMkyX4XryE0Ft3OD8/P/Ts2RMTBjvi+dtX1PngLnLC\nYyf58CkGnQeMxuDBneiCeaPSuyIfPnoBu/ZjaeniBWnU5V38j6zhSinFQc/T1GnWNlKkYAGc996L\nUsWKZHr3JqUUUTfv4uDRAOFo0Bne2NhYrPtnfe6ojx9Kly7NQjKD2JQrD5VK9e2aiQbAIAMTQI0q\nJUsoCSFZe4kQhskESXI5hm3ZTpcuXYpZs2ZRmxJlaPP6jfnOI/qQnesWQ8LxsOszDL16tqYrlzml\nB9uZs1Ho2Wc6enRsDNcNE38oYO49fIlB49aJT56/I0umjEW/Lu0zPZgePXsJ9+NBotvRE0SpUqNy\nlSrE2Xk76tatxybvZIJChQpBFEUTQogVpTRG3/XokkEGJgGq1atgYzjbADDMb/iyms/Lly/x/Nlz\ncmKPJ9+8lz1mOI1AuTIl0cZhKDp0bEI3rJuaHpa79/jSqTM2kKWzBmLCyC7/2TpMTVVi/qoD4rY9\nAVzrxvVJgKsz+dnnMn/Hh+gYeAWeovu8/OjbD9Fc6dKl6ZRpMzn79h3Y5J1MRghByZKlFA8fPqgK\n4Iy+69ElgwxMS1PTyjZFihjpuw6G0bcvq/msGD8BkydPxvGd7mg/2IF2smsB+9bNSOseQ2BrW5e6\nOM8hACCKImbM2iTs3e/H+eydgzbNa//nNY6diMCISRthbmZGgw86o2r5cpkSUMmpcviHhmGPp59w\n6/5jvnDhwmKXLj35QQMHQSqVsi5XPapataoxC8xsQsLzNiULsvFLJmf7sprPwkWLMHXqVCyZNBvj\nF00XS5csgqljh3GtewymDRpWo3tdF3EAkJqqQN8Bs8Rr1+6TqyGbSbkyRf71/C9efcTwiRuEyOuP\nuGkjB5Gxg3pleEipNRqcuhCJ/d7+wpmLUXzevHmEVq3a8Bu3urLJO1mITTkbmampaWV916FrBhmY\nGkFbvHiBAvoug2H0ynbuIqG9vT1cXFy4lvWb0FMXwpAiT6aHdqzi2/YcSqtXt6Hubss5AHj3Phrt\nOziJolZDn1x25S0t//kRN7Vag5WbPcWVm45wf9aoSu6GehMLs4x7JI5Siss37sDtaKBwNPg0byKT\niXX/bMD5HvVDqVJs8k5WVLCgNaRSaVl916FrBheYhBBOwnNWJfKzFiaTc010caVKkXIqlYpqlCqx\nRNFicPM9QoI8dvHt+4ygNjbFxKPe63gAuHX7Mdp3HIcaVUrTII8l/7ryzunwGxjstI4KWko9nVej\nQe3qGTaR5uGzF3A/Fiy6+QYSlUaDylWqku3bdqJOnboZOnlHEAR079EVBa2tsd3Z5avXEhMTMXvO\nTLx+8xrGUmMsXbIc5cqVQ1xcHMY6jUZycgomOE1Ay5atAABjxjpiwfxFyJ/Dfh4VsrYGpbSYvuvQ\nNYMLTAAFTaTGGlOZsSF+Nob5T1GPHsM19DTp3bs3PD09MXW4E1ntshFeezaSnsMn0CJF84sBxzfz\nAHAi6AIGDJ6LoX1a0w1LR/1ja+3DxziMneEsBJ+5yo/o043MdRrBZ8Q+s+8/xcA7MJTu8fSj7z/F\ncGXLlqXTZ8zl2rVrl2mTd/Yf2IcyZcoiVZ76zWsuO7ajUqXK2LLZGc+eP8PixQuxZ/c++Af4o3ev\nvrBtZYsRo4ajZctWOH3mNCpVqpzjwhIAClpbQ61SF9R3HbpmiKFSsqhVPjX0tDgvw+iTVqtF56Ur\nxZYtW5LDhw+TcQNGkBXO67B11TyMm7lEzJ3XnIYGb+MBYPNWd3HhYhdu/eIRGN7f7rthJAgCtu72\np7OX7iWVy5XG9UAP5M+n2w0NklJS4R96DruPHBPuPHzMFylcROzaozc/oP/ATJ+88+HDB5w7F4aR\nIx2xd9+eb15/+uwpRgwbAQAoXao03r59i9jYWEiNjKBQyKFSqcBzHARBwIED+7B9247MLD/LsMpn\nBbVGbUYIkVJK1fquR1cMMjBLF7Jmz1sxOVLPFWtEUwtLcvnyZdK6UXM4H9iFqeOGYo3zbtHYRELP\nndnFi6KI8RNXC94+p7gThxejcf0q3z1X5LWHGDh2DY2LT6E7V84nds0a6iy81BoNQs9fxj6v40LY\npSt8vrz5hNat2/JbXfYid+7cehuXXL5iGaZOmY6U1JTvvl6hfAWcDD2JWrVq49atm3j3/h0+fvwI\ne/sOmDx1Eo54emDK5GlwO+SGTp06w9g4Zz4KzvM8LC0slfEJ8YUBvNB3PbpiiIFZwqZIYda6ZHIc\n34uXEHLzNlekSBGaxzyXePFqJNepXQt67MQpKlAtjTi3n09JUaB7z6ni48cvya1zzqR4kW8nx8Un\nJGPK/F2Ch28Y72DfBmvnTOJ0saSdKIrpk3d8g8/wJiYmYr36DfhjfgEoWbyk3ifvnDl7Bvny5UWl\nSpVwOfLyd48ZPnwEli1bii5dO8HGxgYVK1YEz3MwNzeHy+fWZGJiInbsdMGWTVsxd95sJCUlY/Dg\nIaherXpmfhy9y1+ggDY+Ib4YWGBmXZamphVLWRc0uM/FMP8mbTWfbbRQoUIkJiYG+XLlIeXKFBMf\nP32JZEUKvR51iH/3Lhp29mOpqcyIPovazZuYfN36oZRi/5FQOmG2CylqXRARPvtQvGjh3x43fPD0\nBdyPnRAP+p7gNFotrVq1GnHZ4YratWpnqZ6g69ev4fSZ0wg7dw5qlQopqSmYPmMqVq5YnX6MuZk5\nli1dnv7nlrYtULTo13NbnLdvheOo0fAPOI7ateugtW0bjBs/Frt2uGbaZ8kKihYpwj169LCovuvQ\nJYMLFiOetynJHilhcpi28xYLIgX//v17lChcDGqNQqQA+RQXQ29cPcxfv/EQnbpORNP6lan3nrnf\nzIS9++AlBo1bKz578R7Lp48nvTu2/a0W37uP0fAMCKH7vI/jY3QsKVO2HJ09ex7atm1HsurKO5Mm\nTsakiZMBAJFRkdi9x/WrsASA5ORkGBsbQyqV4oinB+rUqQOzvz1S8+LFC0R/+oQ6tevg/v37Inx0\ngAAAIABJREFUkBnLAABKpTLzPkgWUaxYcRkAFphZmUYQipcoyAKTyTk2HfPHlYePeEIIihUqQmPi\nY2j5siXIy7fv6I2r7rx/QDgdMWoJmTCqM5bMHPhVUqakKDB3xX5hx/5Avm3ThiRw97ZfXtIuMTkF\nx0PDsOeIn3D30VO+aJEiokPP/nzfvv2y5co7X2YBu3u4AwB69eyFJ0+fYOasGSAEKFfOBksXL/vq\nPRs3rcfECWmha9/eHmPGjcbOXTvg5DQ+c4vPAgoXLmxkampqUM9iEkrpfx+VTRBCiITj1NEeByTm\nJmwYkzF8Lz9+wh/jJkEulyO3ZS4IgkAr2JSib95/wM1r7tzmre7i2vUHuJ3rnNC7a/P091FK4Rt4\nESOnbEIucwth/7qlfCWbn98OT6VWIzT8MvZ5HxfOXb7K58tnJbRu3ZZ3HDUauXLl0uVHZbKZ4JPB\nmL9g7qn4+PhW+q5FVwythSkDIWBhyeQUrectFuRyOW9qYgqlSoXSJYvSV2/fITLiADfGaYUQEhLB\nnfVdidrVbdLf8+zFewyftFG8evMxmeE4hDj2d/ip1p8oirh0/TYO+gQIx0LO8qampmL9+o14P79A\nlCheItu1JJmMYV3QGqJIi+u7Dl0ytMC0NJFKNTC8z8Uw35jo4kqfvX3Lm5iYQKVWoVABK/opJhan\nQ124rj0mix8+xOD+hR2kYIG05yZVKjVWbDwirt7qxdWvVQ13Q32IuemPb+pz7/EzHPYLEg/7nuC0\ngkir/lGN27VzD2rWrJWlJu8wWYO1dUGo1WqDGh8ztGCxNJMZa/VdBMNktKhHj7HzZCiRSCRQKBQw\nNzOFXKmknh6rODv7sbRQ/tz0aeQu/st4ZGjYdQx2WkcBQr1d1qFejao/FHJvP3xKn7zzKSaOlC1r\ng7nzFqFNm7YkI1b6YQyHlVV+qNUqC0NavMDgAtPCxETUdxEMk5G0Wi06LVkpqlQqjhACnudhZCQR\nN6ybwnXuNgkdWtfFwW3TeAB4/zEOo6dtEULDrvOj+jmQOeOG/WeXaWJSMvw+T9659/gZX7RoUbFn\nn4F8vz79YGRkxFqTzA/heR7GxsZqhUJhASBW3/XoguEFpikbv2QMm8Py1WJ0XBxnbGwMUMDY2IiO\nd+pDRo5egrmT+2CGkwPRagVscfWjc5fvJ5VtyuJm0BHky5P7H8+pUqsREn4J+7yOC+GR13grKyuh\nTZt2vIvrQVhaWrJxSeaXyIxlgkKhMAcLzCzJMpdpxm0zxDD65nvxEgKvXONMTU1BBRG8lKPt2zei\na9buI+4u09GhbX1cvvoAA8euoQkJcuq6agFp07TBdwNPFEVEXL2Fg0cDBL/QMN7M1Exs0LAR7388\nCMWKFWMhyfw2mYlMQALM9V2HrhhcYOY2N2Pf6IxBSpLLMXTzNsrzPBEFATzPURubEjT45EVEnFhP\nChXMi8Hj1gqefuF87452WDVrwneXtLv76CkOHwsSD/ud4ESRilWr1eB2u+5H9eoZt1UXkzOZmJhQ\ngAVmVmWZx9ycBSZjkFrOmi8kJSfzRhIjgCcwNZUhPjaePrq4k/cNiqCT5u4gJYoUQsTR/ShepNBX\nM3LefPiII/4hdL/XccTEJZCy5Wwwf8EStGndloUkk2HM0nr8WGBmUZZ5zM1/bZkShsnC1vscw40n\nT/m0cUsRKrUadcqVo5uWOvK2PWaJL15/wqqZk0jPDq3TbxgTk5JxLCQMu4/4ig+evOCKFSsm9h0w\nhO/Tuy8kEgkLSibDfV42kAVmVmTE87lzm5uyFiZjUF5+/IT5hzxgamoKtVoFUaTo16MFzZPLnDZo\nPwntmjUiQXtdiFQqhVKlwslzEdjndVy4cOUGb2WVX7Br15533esOc9b7wvwfSinUajWUSiVUahVU\nSiVUKjWUKiXUKtXnr6vTvq5WQaVSQalUQa1Oe02hUFC5XC4qFAooFAqqUCqgVCqIUqmCSqUkr169\nsgTQCMAxfX9WXTCowJRJpVYWJj/+IDbDZAeNp88RBVHkqCCA4zh0bPsnAkOjSB5LS5w+tAM2pUuQ\ni1dvYr+Pv+Afeo43NzcXGjZqwgcGrEKRIkVYSGYDoiimhVF6UKn+FmAqKFUqqFWq9GNUKjVUqs+v\nKZVQKOSiXK6gacElT/uaUoEvwaVSqaFWq4larYJGoyEajQZarRZarRY8z6f/4jiOfvmd43nw/Jff\necob8ZBIJERiJIGRVEqMpBLO2ERGjI2NeZmpDMZ5ZbA0zQWZqQlMzUxhYmaKYO8Tqvs3777S9/9f\nXTGowJTwfF5L9lgJY0AGrtlAP8TGckZGRuA4wCqPJQ0Nu4ZZY4aRhrVr8Pt9AkR3vyCOUojVqtfg\n9u1zwx9V/2Ah+Yu0Wi1Un4PpuwGmUqW3tv7e0voSXHKFXFTIFVShkH9ucSmhVCqJSqmEUqUiarXq\nc3CpiUajwZfgEgThq+DieZ5yHJf2+1+hlRZcEh4SIwkkRhJiZCzljKRGRCYz5qQyGWQmMpgUMEM+\ns/xfBZepmSnMLMxgZm4OM0tzWFiYwyKXBUwtzCCRfBUD5P9+/y2P7zwU79+8q9HFubICgwpMjhBj\nYyMjfZfBMDoRdusOPMIvEKmREUAoBK2AItbWaPpnbTjvP0IXb9pJypUrj0WLl8G2VWuDGZOklEKj\n0fzVVahSpbemVJ+/pv5uSystwBQKBdK6CeVUoUhrdSmVSihVSpJ2PjVRqVTQqNVEpVYTrfav4KKU\nfr/FxXM0PcQkPOV5HrxE8lVwSY2lxFhmzBnLjGFiYgKLPLlRwMwEJqYmMDVPCy1TczOYmZvBzMIM\n5hbmMLOwSAsuc1P834xmnQaXvkiNjTkABjOvxKACk4LCgDZf+UcJKakYuWkr7r16DUIIdowfAxOp\nFGO2uiBVpULJAvmxf8pEfG8Rh03H/LH7ZChAKYa0sYVTJ3sAwMw9+xF89TqqlS6FPZOcAABuZ8IQ\nm5ScfgyTebRaLdovWAKJRAJBq4GRkQSWuSzprfuPSXyKShgweDjfq2fvDJ2882V8668W11/dg9+0\ntNID7K/WmUIhp3K5QvyqtaVQQKlSEaVSCbVaRVQqFVGr07oLNRottNq04PqyglFaaH3uGvw6vMB9\n6SbkP4eW1IgYGRtxRsZSyGSytOCyMEGeAlYwNTVJb3GZmpvB1ML0c3BZwNzSDOaWFrC0tIRUJjXI\n4NIXqbGUBWYWRikMPzEn7nBF29q14DFrGrSCgFSlEm3mLMCaoYPRqEol7A05hbU+vljQr/dX77vz\n4iV2nwzFpfWrYMTzaD9/MdrXrQ0rSwvcePYc17asx8hNzrjz4iXKFLLG/tAzCFw0V0+fMmcSRRFh\nt+/CYfkqqtFqCccBgkhRIE9eoXkLW75v7z6QSIx4lUqF+w/ufw6qf+8qlMvlVKFQiAqFgsoVcqjS\nJmsQZdp7SFpXo5poNF+C66/xrc/dgn91E/I8eI6jHM+lBdbncS5eIoFEwkMiNSJGRmnBZSwzJsYy\nGW9sYgxZHhnym+SCianJ5y5Ck79aW+ZmMLM0h7mlBSwszWFqYQaZTPb//2sIWGhlO0ZSIxaYWRg1\npP09vycxNRUX7t5PbwVKeB65zMzw5N17NKpSCQDQsno12M9f/E1gPnzzFnXLl4Ps84LcTapUhu/F\nSxjZrg00WgGUUshVKhhJJFjncwxjO7YDz7PhsMzEcRzex8UhMVVOCACtNu3f88dP0bynpwd8fLz+\nqZvw8/hWWmtLYmQEI6mEGEmlnLGJcfrEDJP8pshragWZqSx9fMvM/HNXoYU5zC3MYfE5vMwszTN0\nfIsxfFqNVgRgMBtiZHhgEkL6ARiHtLuMywDGAEgEsAGAPQAFgE6U0k86uJzBB+bzj59glcsSQzds\nxq3nL1CzTBmsGzEElYoXg9+lSHSsVxde5y/idXTMN++tXKI45h04hLjkZMiMpAiMuoo6NuVgbmIC\nu9o1UWf8FLSs/gcsTU0Q9egJZvd20MMnZPo0b4qFhzyE13FxPCdSNGnTVOg/ZhBfvmqFL4ew4GKy\nBY1GQwEYxE4lAJChEwUIIRUBOABoQCmtAUAA0BeAKYAISml1AOcADNfRJQ07LQFoBQHXnz7DqHZt\nEbVxLcxkxljtdRQ7x4/F9oAg/DlhKlKVSkiNvr0XqlCsKKZ06wK7uYtgv2AxqpcpBY5L+5k7uVtn\nXNm0FiuHDMSCg+5Y0L83XIND0GflGiz38Mrsj5njXd24ljeRysSO3frSpBgVGd1tOAbY9hZD/U5C\nqzGYG3bGwKlVagGAwcySzeiZdS0B1AJwhRByHUALAKUAqCmlAZ+PuQqgpC4uRim0WtGwd/cqapUP\nRa3yoY5NOQBA14YNcP3pM5QvWgSBi+fh8obVcGjSCKWtrb/7/sGtW+LyhtU4vWIJcpuZwaZIka9e\nv/70GQDApnBh+FyIwKHpU/D0/Qc8efc+Yz8Y8xVzUxP4zJrCBfi6k8GjJnHeQVdQo2ZTbv3ctWL7\n6rZwXbdDjIuJ03eZDPOvNGo1a2H+pH2U0hqff1WklC7E13ccInTUNUwpVaoN/O7bOk8eFLWywqO3\n7wAAp2/cRKXixRCdmAggbdLIMndPjGzX5rvv/5SQAAB49SkaxyIuo3ezxl+9vvCgOxb27w21Vgvh\n880HxxEo1Abzbz7baFq1Chzb2mLu5BFUrdVg5PiZ8DwRyU2YvgyhR0/Rrn/aY86oGcL9m/f0XSrD\nfJdGrRHBWpg/7BSA7oSQ/ABACMlLCCmRURcTqKhQaw07MAFgw8ihGLBmPWqOnYjbL15ihkM3uIed\nR+WRY1HV0QlFrfJhYKsWAIB3sXHouGBJ+nt7Ll+DaqPHo8vi5dg8egQsTf9aGcnvUiRq25SFdZ48\nyG1uhmqlS6HG2IlQabSoWjLD/tqYf7F62GAUsjATV8ydKH4Zn2/aqh1cPU7yO9wCkRKnIWN7jEK/\nlj3Fk75B0KgN5mcTYwDUKsNqYZKMniRDCHEAMBNp4awGMBZACKXU8vPr3QC0p5QO+d1rmctkW+f3\n6z16YpeOv3sqhskyElJSUHrYGDrIcTI69ej/zUQftVKJfTs34uQJb0GjVvM9hvQUuw7ozuUrYKWP\nchkm3eT+TkkRZy4OpZQaxESIDO+SpZQe+dwdW41SWodSevlLWH5+3VsXYQkAGkGQa3JAC5PJWXKb\nm8Nj2gSyY/MK8uTRt92vUpkMw8dNh2dgJD9p1gqc9guj3ep3xKzh04R71+/ooWKGSaNWayhYl2zW\npBEEuUpjMH83DJPOtmYNDGnZnM6dNJzKU1P+8bgmLdrC1T2I33koCIokyo3rNZr2ae4gBvucYN21\nTKbTpv08NpguWYMKTEqpPFmhYE1MxiBtchxO8siMxNWLpwn/NZRSpFgJLF2/i3gHXyX1G7bhNi/a\nKLSvbguXlc5izMdvn9FlmIygVCgBQKnvOnTFoAITQMyHuHiVvotgmIwStnwxf/3yBS7I78gPTT6Q\nSqUYOnoKjgRe5qfOWYNzJ87T7g06YsbQKcKdq7dh6At9MPqVGJ9IAMTquw5dMbTAjH4fH89amIzB\nssplif2TxpGtaxeTF08f/dR7Gzazxc5DJ/jdHiHQKHhuQp8xtE/zHuIJL3+oVQbTa8ZkISmJyUYw\noMDM8FmymYkQUq9S8WJBN5035tJ3LQyTkUZs3EoD7zzALvcgYvKLm6ar1Woc2rMVJ/w8BKVSzncd\n0EPsPsiBy1+ogI6rZXIiSikal/hTFEXRjFJqEN2yhhaYZQrkynXjrdsec33XwjAZiVKKCqOchJJV\namLW4g2/vUL+pfOnsXvbGuHNq+d83Sb1hP5jBvJVav0BQthytcyvSU1Ogd0frVQateabrWeyK4Pr\nkk2UpxrruwiGyWiEEIQtX8RfDj/NnQzw+e273nqNWmCHWyC/x/MUqNqYm9jPifZu2p0GHDkOlZJN\nC2B+XmJ8Ioyk0mR916FLhhaYyVpBJAoV+wZnDJ913jxwdXIkm1bOI69fPtPJOQtaF8bC1duJz8lr\npGmLTsRlxTahffXW2Lp0k/jp3UedXIPJGRLiEiAxkiTouw5dMqjApJRSmVSaHJ2YpO9SGCZTdGvU\nAF3q1aGzJw6jKqXuhokkEgkGjhgPd/8Ifs6Szbh0KpI6NO6CKQMnCDcuXzfY2bUvn77AwDZ90n/Z\nVmyKI67u3xy3bu5qODTqggG2vfHwzgMAQHxsPEZ1GYp+LXviXPDZ9GOnD52M2E8571GepPhEcIQY\nzIQfwMACEwCkEj4+OokFJpNz7J3kRCRalbh59XwhI85ft0FTuBwM4Pd5nQYnmnFTB06gDo27UH/3\nY1ApDGIuR7oSZUpiX/Ah7As+hD0nDkJmIkNTu2ZfHXPx1Hm8ffEaR84fxfSVs7Fm5goAQIhvMLoO\n6AFX/304suswAOB8yDmUr1IBOXGZwoS4BFBKDapbwuACk+O4T9EJifoug2EyDcdxCFuxiD8XGsid\nCfHPsKZf/oKFsGClM/E+eY3Ytu1Bdq7eIbSv3hqbF28QP7z9kFGX1Zuo8EgUKVEUBQt/vVXe+ZBz\nsOthDwCoXLMKkpOSEfspBkZSCRRyBVQqNTiehyAIOOLqjr6OA/RRvt4lxidCo9EY1L6ABheYokg/\nfNnqimFyiqJWVtg2ejhZt2QmeffmZYZeSyKRoN+QsTh8/CI/b4Uzos5eo72adMOk/k7C9YirBtNd\nG+oXDNvObb/5evSHaBQsXDD9zwUKFUTMxxi07twW4SfDMKHvWAwcNwTeez1h170djGU5cx7ip3cf\ntYpURcb+Y8xkBheYSo36DQtMJifq07wp2tasJs6ZNJyq1Zkz8a32n42x/cBxfr/PGUi5XNy0IZNp\nj4adqd8h3y/LomVLGrUGF0LC0cK+1Xdf/95NgZmFOdbs24DdAftRrrINLpwKR7N2LbF86hLMHjkd\nd67ezuiys5QXT57LAehmNloWYXCBqVCp37yLjWOr/TA5kvv0yZyQmiw6r1uSIeOZ/8Qqf0HMW76F\n+Jy8RuzsexPXtTuF9tVtsXHBOvH963eZWYpORJy5gPJVKyJPvjzfvJbfOj8+/m3G8Kf3H5HfOv9X\nx+zZuAuDnIbi5NEgVP+zBuZuWAjXdTsyvO6s5M3z1xQsMLO8J3devpbruwiG0QeO43Bm+UL+1Alf\n7sLZk5l+fZ7n0XuQIw4fv8gvWr0D1y/cpL2bdceEvmOFqxeuZJvu2pBjwbDt3Oa7rzWybYIgrwAA\nwJ2rt2FhaYG8+fOlv/762SvEfIxGjXo1oVKq0hd/yGnPs356/1EGFphZ3sMHr9+w5UmYHKuUdUFs\nGD6IrFgwBR/evdFbHTVqN4DzPj/+4NFzMJXm42YMm0K7N+hEjx7wogq5Qm91/ReFXIEr4ZFoatc8\n/Wu+B73he9AbANCgZSMULl4EPRp2xqoZyzBl2Yyv3r9j9TaMnDYGAGDbuQ2OHvDCUPsB6Dmsd+Z9\nCD1LSkiCIIgAEKfvWnTJoJbGAwBCiEzCcSlJPu68kUSi73IYRm86LVou3o9NwrYDxziJxEjf5UAU\nRXi67cIxz31CclIib9+ro9BzWB++cPEi+i6N0bGHtx/Aqafj86TEpNL6rkWXDK6FSSlVyoylcc8/\nftJ3KQyjVz6zp3GKhFjs2LQiU8cz/wnHcejZfwQO+V3gF6/dhVuX7qFPCwc49RotXDkfmW26a5n/\n9vblG3A8Z1DdsYABBiYASCVGjx+9eavvMhhGr3iex+llC7nAYx78pfNn9F3OV6rXqoete315N99z\nyGVmzc0aMZ12q9eBeu/zpPJUNgUhu3v36i0UcsVdfdehawYZmAqV6vqjtywwGaZckUJYNbAfls2d\ngOiPWe8Z8jx5rTBz8Xric/Ia6dR9MDmwZb9oX7011s5ZJbx5ob/xV+b3vHr2SqFWqX9uw9ZswDAD\nU62+c+v5S3abyjAAHO3tUN+mrDhvykhR0GbNJ644jkOPvsNw6Nh5fvmGvbh75SH6t+qJsQ6jhMth\nl1h3bTbz4vFzNYDn+q5D1wwyMAE8vPPypUbfRTBMVuE/fxaXEP2e7t62VtR3Lf+lao062LLbh3fz\nO4+8uYpycx1n0i5/2lOvPR40NSVV3+UxP+Dlk+dGAAyuS9bgZskCACGksIWJydM4TzeD2biUYX7X\n3ZcvUW/yLCxcvR21/myk73J+mCiK8D2yH97urkJifBxv18Ne6D28L1+0VDF9l8Z8R2J8AjrWtFNq\nNBpTamABY6gtzPcqjYbEp6Touw6GyTIqlyiBxX17YvHMcYiNyT6zyDmOQ9deg+DmG86v3HwAD64/\nIf1te2FM9xHCpTMXIYpZvtGcozy9/wQmZiZPDC0sAQMNTEopNZMZv3rIZsoyzFcmdOmIGqWKiwum\nOYqCkCWeNvkplf+oic2u3tzh4xeRP18pfv7YObRLXXt6xPUwTU1mN8hZwZP7T6DVaKP0XUdGMMjA\nBAAK3H3wms2yY5j/F7RwDvfpzUsc2LUp2zbNLHPlxrT5q+AdfJX07OdI3F3cRfsabbFqxjLh1TOD\n2iAj23lw655cnirXWWASQi7o6ly/y2ADMyElNezCvQfZd7sEhskgUqkUJxbM5rzcdnE3rl7Sdzm/\nheM4dHYYgIO+5/g1zgfx+NYLMrB1Hzh2HSZcPHWeddfqwZ1rt7UArunqfJTShro61+8yyEk/AEAI\nqVvKumDIo13bLPVdC8NkRSs8vLDqWAD2eIYgd558//2GbCIlKQkum5bhfFgwlRpL0ddxAOx7diTm\nlub6Ls3gqVVqtCzfRCtotZaUUp0sGEwISQFQEMAxAHkAGAGYQyn108X5f6oWAw5MqZGET/5waJ/U\n0tRU3+UwTJbUaOosQW5sQdZuP8RxnGF1OImiCP+jh+B5cKcQFxvNt+lqJ/Qa0Y8vWbakvkszWA9u\n3YdTL8eXyYnJJXV1TkJIMoBcAMwopcmEECsAEZTScrq6xo8yrO+Qv6GUqs1lJo+iHj3WdykMk2WF\nLl3Av3n+CO57txtc3yXHcejYrR8OHA3j12/3wLN7b8jgtn0xsvNQ4UJoOOuuzQAPbt0HgMgMODUH\nYDkh5CaAEACFCSEFMuA6/1mEwVKoVCER9x+y7wqG+QcyqRTH587k3PZu5e7cvKLvcjKMTaWq2LDD\ng/Pwv4RiRSvwiycsEDvWsqOHXA7S5MRkfZdnMG5F3VCkJKWcy4BT9wVgBaAmpbQGgE8AMv05e4MO\nTKVGE3765i0215xh/sWfFWwwuVMHzJ/qiMSEeH2Xk6HMLS0xadYyeAVd4QYOm0h89niLHWu1xbIp\ni4Tnjwxuc41MFxUeKQDIiMDMBeATpVQghDQHUCIDrvGfDHYMEwAIIdamxsYv4j3djA1tfIZhdK3u\nxOkCyZ0fK7fs5wnJOXuwP3pwB9s3LBUf3b/FlalYThwwdhDXoGUj8Dyv79KylegP0ejRsFOqWqW2\npJTqrGePEJIEoBSA4wDMAVwB8CcAO0rpK11d50cYdIpQSj9wHEl8+PadvkthmCzv9NIF/NMHd4in\n264cNYxhU6EK1m0/zHkEXEKpklW5ZZMXix1r2VG3bftpUkKSvsvLNm5cvgaZieyyjsMyH4A4Smks\npbQBpfQPSukQSmnlzA5LwMADEwAkHB9x6f5DfZfBMFmeuakJfGZN5fa5bOAe3L2p73IynZm5BSbM\nWAzv4KvckJFTydH9vmKn2nZYMnGB8PTBE32Xl+VdOR+pTEpMCtDV+QghhQFcBLBaV+f8XQYfmAmp\nqSFht+/o5HkghjF0TapWxtj2bTF38giakpxzW1d2nRyw3/sMv3mXD94+iybDOwzCUPuBYljQWWTH\nJQUzQ+S5yxpQhOnqfJTSd5TS8pTSrbo65+8y6DFMACCE1Cye3+rs0z07LPRdC8NkFzXGTRZMC5XA\n0vW7ctR45j+Ry1Owa8tqhJ3yFwlHuN4j+tFOfToTyzy59F1alhAfG4/OddopNWqNOaXUYO8oDL6F\nCeDWh/gEaWwSmzrOMD/q7IpF/P1bV7ljngcM+476B5mamsNp2kJ4B1/lho+ZCT83P7Fj7XZY5DRP\neHKPPet98/J1mJiaXDXksARyQGBSSrVmMtmF4Ks6W9qQYQxeLjMzeM6YRHZuWUkePzS4fYB/Sxv7\nbtjndZrfuucoPryKJyM6DcaQdv3Fs4GnodVq9V2eXly5EKVKTkr213cdGc3gAxMA4lNSDvtciGBb\ntTPMT2hZvRqGtWpO50waRuWp7HHm/1eqbHmscT7IeQVHoWLFutyqGcvFDjXbYu8mVzEhLkHf5WWq\nS2cuqqhIz+q7joxm8GOYQNpsK1Nj42cxHgeMjSQSfZfDMNlK1dEThHylKmDBKmc2nvkfQgOP4uCe\nLcKnD+/5ZnbNhT6O/XmbyuX1XVaG+vTuIxwad0lVq9S5KaUG3cTOES1MSuk7qUTyKoI9XsIwPy1s\nxWL+5pWLXICvu+HfXf+mVu26YK/nKX7bfj/Evk8hozoPw6C2fcXT/qEG2117PjQcUqk02NDDEsgh\ngQkAqSqlh9+lSI2+62CY7CavpQXcJjuRbeuXkmdP2E3njyhRqixWbt7HeQVHomrVhtyaWatE++pt\nsGfDLjE+1rCWHww9Fpyckpziru86MkOO6JIFAEJI7aJW+U4/37uTPV7CML9g1GZnevzmPbh6BBMT\nE7Zl3s86HeyHg7s3Cx/eveGbtGkm9HUcwJevWkHfZf0WeaocdlVbqjVqTX5KqcE/uJtjWpgArsUm\nJ4tP3r3Xdx0Mky1tHzeaWPBEXLd0pkE/OpBRWrTpiN0eIbzLwQAkfFKQ0d2GY0Dr3mKo30loNdmz\nNzMy7BJMTE2u54SwBHJQYFJKRQnH+wdGXc0ZTWqGyQDnVi7mI8+f4YL9vdn30S8qVqI0Vmzay3kH\nXUGNGk259XPXiO1rtIbruh1iXEycvsv7KacDTsmTE5MP6ruOzJJjumQBgBDSuV6F8vtH3/x+AAAg\nAElEQVTC1yy31HctDJNd+VyIwMD1W+C8/xiKlyyj73IMwtmQAOzftVH48O4138i2idDXcQBfsVol\nfZf1rwRBQOtKzZWKVHkFSulLfdeTGXJMC/Oz0GtPnsqS5HJ918Ew2VbXhvXRrUFdOnviMKpSKvVd\njkFoZtseuz1O8jvcApESpyFje4xE/1a9xJO+QdCos+ZcxbvXboPnufc5JSyBHBaYlNIUM5nsauj1\nnLcTA8Po0u4J44hU1IgbV85l45k6VLR4KSzbsJvzDrqC2nVacBvnrxfaV2+NnWu2i3HRsfou7yth\nQWc1KqUqR8yO/SJHdckCACHEsVP9P1d7zZ5upu9aGCY7exMTg8qjJ9AJM5eiRZuObEWDDHLudBD2\n7dggvH/7km/QspHQz3EAX6lGFb3WJIoiOtRsmxofE9eEUppj1h3NUS3Mz44EX7kmSUhhK+UxzO8o\namUFlzEjybpls8nb1y/0XY7BatKiLVzdg/idh4KgSKTcuF6jad8WDmKwzwm9ddfeiroJtVIVC+C6\nXgrQkxwXmJTSWGOp0RnP8xf0XQrDZHu9mjZG+1rV6eyJw6hardJ3OQatSLESWLp+F/EOvkrq1W/N\nbV60UWhf3RY7Vm0TYz7GZGot/u7HlEqlcjvNYV2UOa5LFgAIIfZ/lCrpdnXzOjZblmF+kyiKKD1s\ntFC9QQtMnLWU13c9OcmFsyHYu2Od8Pb1C75+84ZCX8cBfOWaVZCRa/6qlCrYVW2pVCqU5SilbzLs\nQllQjmthfhb8+O07PHr7Tt91MEy2x3EcwpYv4k8H+3HhZ4L1XU6O0rCZLXYeOsG7up+EOpVwE/qM\noX2a9xBPeAVArVJnyDUvhIbDSGp0O6eFJZBDA5NSqiGE7N8bciprztdmmGymRMEC2DRiCFm1cAre\nv32t73JynEJFimHx2p3EK/gqadSkPee8dLPQvrottq/YIkZ/iNbptY65+aQkJyY76/Sk2USODEwA\nkKtUO3efDNUIApsVzzC6MMi2BVr9UUWcO3mEqNFkTOvm7w7t3YahPdtiWG87LJ0zAf80hvrg3i20\nrm+DL63fhPhYjB/ugGG97XAhLCT9uHlTRiIuRrfhktmkUikGj5oEj4DL/IwFG3A+KIL2aNgJ04dM\nEm5fuYnfHYKLj43HjcvXjQB466bi7CXHBial9JZWEN6dvX1H36UwjMHwmjWNUybFUZeNKzL0TvTD\nuzcI9PXAtgPHsOvwCYiigLMn/b85ThAE7Nq8EnXqNUn/2pmTx9GxWz9s3XMUPu57AAAR4adQrkIV\n5LXKn5FlZ6r6jVtgx6FAfo/nKYgqKTexrxPt3bQ7DfT0h0r5axO0TvmdpFJj4yBKabKOy80Wcmxg\nAkCyXLFlV1AIW/aHYXSE4zicWbaQDz5+hL8UfjrDrmNqZg6JRAKVUglBq4VKqUS+AtbfHOd7ZD8a\nt7RD7jx501tXEokUSqUcarUKHMdDEAT4uO9Fz/4jMqxefSpoXRgLV7sQn5BrpGmLTmTb8q1C++qt\n4bxss/jp3cefOtfRA94pqckp2zOo1CwvRwemSKmbf2QUz5bKYxjdKVu4EFYN7o9lcyfg08eMmVhn\nmSs3uvcdij4dG6Nn+/owt7BErboNvzom5tMHXDwXgo7d+gJA+szRFm064GJYKKaPG4i+g0fDz+sA\nbNt1gdTYOENqzSokEgkGjhgPD/9L/JwlmxERepk6NO6CKQMnCDcjb/xnd+3TB0/w7vU7AUBo5lSc\n9eTowKSUxsiMpOHe5yP0XQrDGJRR7dqiYUUbcd7kkaKg1f3WVe/evISP+14c9A2DR0AEFPJUnAo6\n9tUxzuuWYNiYaSCEgFKaHghm5hZYun4XnPf5ooxNJVw6fwaNW7TF2qUzsWjGWNy7bfjP4tdt0BQu\nBwP4fV6nwYlm3P/au+/oqKq1DeDvPjOZZCYJoQgIV5qIXixgRQVFUUQEEUG9iAUEpYq0YEB6BwWk\nSZcOQmjKJYLSq4jSQTqhl0BImzltZs55vz/k8zbLAMmcKc9vrSxYWSHzwMrwnH32PnsnN+vETZ5u\nzGmp/yRd/f39gRdPX6ixYU5g5vA8iywfROVzmP9OCNGwaoXyc3eO/xwHSwPkI7/fT+VatjOfqdeI\n2nT8JF8vzjesSaPdO7ZRcu9hRES0ZuXXdPjgXuqYMuC3r3nn1WeJrv//lpubTbFxcdS151CqXrP2\nb18zafQQqvHMC3TubDo5HLH09HN1qX9KOxo+blZ+xg15fr+fFs6ZTGnL5huK7LE1fKex+Y/335RK\nlv71Nrfs9tDLD72o65p+JzNH7fN4UT3CvO7bE5cuaz8dPW51DoCIYrfbac2gPtKKJfOln7dvztfv\nXbZcRTp8cA/pmkbMTLt/2kblKtz1H18z75uNNG/5Jpq3fBPVfK4udeo+6D/K8vzZU3QtM4OqPFyN\nvLr22y1brx59OxbZ7XZ6p2UHWpi23dZ32ET6eeNubvJ0Y+r6bkdjz4+7aeXiNLbHxKyL5rIkQmES\nM/s1r3fY8EVLsLksQD67t1xZGvJuUxrcqyNlXr2xBSZ/puLdlemFeo2offNXqdVb9YiIqN6rTSht\n2VeUtuyrgL7HzMmfU8t2yUREVKtOA1qxdD51eK8RNX7zvXzLGY4efeJpmjx3hW3Oso3kkJKklPe6\n8ph+o4Ts9kyzOpvVov6WLBGRECIxzuG4tH/i2PgKt5e0Og5AxKnds5+R4ZfE2OmLJZsNu+eFkx3b\nNtLAHh9e1HXtjmjbO/a/Rf0Ik4iImd1C0JTPly2PvnsxAEGwsn8vW+bFszRn2ljsFBJmFs6Z7NF1\nrXe0lyURCvM3qu4dNXvtes5yR+XzuAAFyuFw0KqBvaSlX82w7d2JVenh4kz6cTp26IBJRAuszhIK\nUJjXMfPFGLtt+ZSV3+MKGKAAPHjnndSnSWPq3/1Dys4K7nFUcHMWzftSM9kcx8y//6xJlMEc5r8R\nQtxfOD7+p/PzZjhjY2KsjgMQkWqm9DLcMfHi8ykLJEnCNXuoys3JoqYNntK8ul6emfNvxVYYw0/r\nv2Hmg0y8a8HG/F0CDwD/snpwP9uF08fpq5kTTauzwB9bMn+6z2azL0FZ/gsK87/kykr/wQsWeTDy\nBigYcQ4Hfduvp7Rg9iTpwN6dVseB35Gbk0XLUmcbqiL3sTpLKEFh/q/12R758nc7d1udAyBiPXZ3\nJUpp9Ar1+7gt5eZkWx0H/svCOVO8kiSlMvNpq7OEEsxh/g4hxNuPVrpr8vbRnyVYnQUgkj3Rtbth\nFLpNjJgwV/r/nXbAWtlZmfROw2c0XdfuYeazVucJJRhh/r5FR86dz1u7Z6/VOQAi2vqhA2ynjh2i\nRXOnYT4zRCyYNckrSdI8lOX/QmH+Dmb2eTStc+cp0z2mifcxQEFxxcXRN70+luZMGysdPogLVKtd\ny7xCaV8vNFVV6W91llCEwvxjSy5lZZ1bvOUHq3MARLSn7ruXOjV4ifp0a83uvFyr40S1r2ZM0CVJ\nmsXMF6zOEoowh/knhBC1bi9SeMXJGVPiHXguE6BAPdKxmxFb8g4aOmaGDfOZwZd5NYOaN35O1XXt\nTma+bHWeUIQR5p9g5g2K7t097bvVuC8LUMA2DB9oO3pwj/g6dTbebxaYN328JoSYhrL8Yxhh/gUh\nRNVCLtf207OmORNdTqvjAES0DfsOUINBw2jM1FSq9Pf7rY4TNa5kXKT3Xn9B9epaOWa+anWeUIUR\n5l9g5n3MvHLUsm/8VmcBiHS1qj5ArevU5t5dW7HswUEIwTJr8mhNCJqEsvxzGGEGQAhR3hUbe/jY\nl5PiShYpbHUcgIj3wIddjKLlKtGAEZMxn1nAjh7aT13bNs3VNa08M+dYnSeUYYQZAGY+LYhmDJi/\nEDv2AwTBpmEDbft3/yilLVuAK/oCZJomjRzcw+PV9c4oy7+GwgyQrOv95q3faJy4eMnqKAARr2ih\nRFrQrbOYPHaISD9+xOo4EWv1t0s549KFU8w8x+os4QCFGSBmzjTZ/KzbtJmK1VkAokHdRx+m5s/W\n5F5dP2BVka2OE3E87jyaNHqIpsieFsyMlckBQGHeAN3nH7HxwMG81bv2WB0FICpM6NBWJMXYzJGD\ne+Bg93w2Y+JI3TTNxcy8y+os4QKFeQOYWZU1reUHY7+QVV23Og5AVNg0fKBt5/bN0ncrlmA+M5+k\nHz9C36ct9amKnGx1lnCCwrxBzLxK1rRNQ1OX+KzOAhANShQuTLM7fyi+GNFfnEk/bnWcsMfMNGrI\nJ7Lf7+vOzJlW5wknKMybkKeorcctX+E9eh7bLQIEQ8MnH6c3qj/Ovbu2Yk1TrY4T1jasXkFnT5+8\naBjGFKuzhBsU5k1g5gt+w+zzwZgvZDzHChAcX3buIOLYMMcM6435zJukyB4aP2KAoipyC2bGv+MN\nQmHeJK/fP/6XM2fPzV67Ho0JEASSJNHG4QNtP2xaLa1dtRzvu5swa8oYr2H4v2XmbVZnCUcozJvE\nzH63qr7ZZep07VJWltVxAKJC6WJFaWqHtmLMsF7i/JlTVscJKwf27qRvv1mgKrKng9VZwhUK8xYw\n8z7DMMe3HT8Jz2YCBEmTmk9Rg2oPc+/kD9iL1eoBURWZBvXsoOia1pyZr1idJ1yhMG+R6vX223zg\nl2vLtm23OgpA1JjXrYsgXeUvRg7APFwAJowapKmK8k9mXm51lnCGwrxFzKx5NK1pm3ET1Sw3TlcA\nCAZJkmjz8IHShtUrpM3rVlkdJ6T99MNG2rgmza0qclurs4Q7FGY+YOZtPsOY1eLzcQpWzQIER5ni\nxWl8m5ZixMAUunjhrNVxQlJebg4N65usaJrahJlzrc4T7lCY+UTWtC5bDh46P3nld9iTESBImtd+\njmpXvd/s07W16fN5rY4Tcj4f8oni83lnM/MGq7NEAhRmPmFm3a2qDXrMmKPtP3Xa6jgAUWNJzxTJ\n68nhyWOGYj7z32xYvYJ37diaqakKtr/LJyjMfMTMx3Sfr33jQcMVWcPRmQDBIEkSbRja37Y6bant\nh81rrY4TEjKvZtDoob00VVVeY2ZsjZRPUJj5zG8Ys7Pc7lUdJk5FYwIEScVSpWhUy2Y0vG9Xyrh8\n0eo4lmJmGta3i2wYxmhm3ml1nkiCwiwAblVt8fUPP15L3bQFK4AAgqTVS3Xo6cr3mH2TW5t+f/Se\njfB16izj2OGD53Rd6291lkiDwiwAzOyWNa1hm/GTtPTLl62OAxA1vunTQ/JkXaEvv/gsKuczD+3f\nTdMnjFRVRa7PzNF71VBAUJgFhJl3+fz+3q8N/lT2+vBzCxAMdrud1g7uK6UtW2D7afsmq+MEVU72\nNerTrbWi69pbzJxudZ5IhMIsQF6/f/SZjCs/9Zo9D+vdAYLk72XK0LBmb9GQXp0o82qG1XGCwjAM\n6p/SXtY0bSIzr7A6T6RCYRYgZma3qjaZumq157udu62OAxA1OrxSn6pVrGD069bGNPx+q+MUuFlT\nRvvSjx8+qGvqJ1ZniWQozALGzFcVXW/U9NOR6pFz562OAxA10vr1tF27fIFmTR0T0ZuJbNu4mpYt\nnJWnKHJDZo78qwMLoTCDgJk3a15fhxd79Vcyc/OsjgMQFRwOB30/sLf09cKZ0u6fIvP4xzPpx2lY\nv2RF19SXmDk67j9bCIUZJD6/f0aOLE9t0H+womMREEBQVKlQnvq++QYN/KQDZV/LtDpOvnLn5VL3\nj5orXl1rz8w/W50nGqAwg0jR9eSj5y9s+WDMFxo2aQcIjo9fb0RVyt5h9u/ezjTNyLg7axgG9e/e\nXvF43HMMw5htdZ5ogcIMImY23ar6WtpPP5/9bPEyzDUABMn3g/pKl86k07zp4yPi+cwpY4d6jx85\nuF9TlY+szhJNUJhBxsyyR9WeH5q6JO/rH360Og5AVIhzOGhl/55S6typtgN7wvvu5eL5Xxqrli+6\npMiel7HIJ7hQmBZg5vOKrr/43qixyq4TJ62OAxAVHql0F/V47VXql9KWcnOyrI5zU9Z9t5xnTRmT\no6pKTWa+ZnWeaCMwl2YdIcRrxRIT5+wa/7nrb7cVszoOQFSontzD8MYXESMmzpMkKXzGDLt2bKW+\nH7dx65pWnZkPWp0nGoXPT0sEYualsq4Nr9tngIzjwACCY+2Q/rYzJ47QorlTw2YF0LHDB6hfSjtF\n17T6KEvroDAtpnl9gy9kXlvRcMBQPG4CEASuuDha3jtFmjt9vHTowB6r4/yli+fPUEqHZqqmKm8z\n85aCeA0hxDtCiB1CiD1CiMlCCEkIMUsIcUAIsV8I0bkgXjfcoDAtdn37vHd3nzi5sfGgYYovCrbx\nArBa9XsrU+cG9ahvt9bkzsu1Os4fyr6WSV1av6loqprMzN8UxGsIISoT0T+IqDozP0REBhH1IaLS\nzPwAM1chopkF8drhBoUZApjZ71bVRtsPH/2xybARqt+IiJXvACFtcPN3qHyxIsbgXh2NUFzLocge\nSm73luxx543x+byTCvClnieiR4hopxBiDxE9R0RFiOhOIcQ4IcSLRIQtygiFGTKY2etW1fob9x/c\n1WzkGNVAaQIUuA1DB9qOH9ovli2YGVLzmT6fl3p2fl+5knFpia5rvYPwkrOZ+aHrH5WZuTMRVSGi\njUTUloi+DEKGkIfCDCHMrLlV9cXvdu4+0GrcBC1SdiUBCFUJLict69lNmjF5lHT00H6r4xDRr2XZ\nP6WdevL44a2aqnzABT/8XUdErwshihMRCSGKCiHKEpGdmZfRr7dnHy7gDGEBj5WEICFEQqLTueXN\nZ56uPOHDNrFCCKsjAUS0btNm8NytO2jG4jUiISHRshxeXafeya2Uwwf3blUV+RVm1oPxukKIfxDR\nJ/TrIMpLRMlENJr+NajqwczfByNLKENhhighRFKCM25bixeerzSqVUsHShOgYFXt0NVIKnMnDRw5\n1WbF+03TVOrZqaVy/Ogv61VFbszMWDYfYnBLNkQxc65H1Z6euWbdmd6z53utzgMQ6TYNH2g7uOdn\n6Z9L5wd9FKGqCqV8+K5y/Ogvq1RFboSyDE0ozBDGzNkeVasxMW3lhYFfpeINBFCACick0MKUzmLq\nuGHi5LHDQXtd2eOm5LZN5VMnji5XFbkJ9ocNXbglGwaEELfHx8Vtb/HC86VGtWoRG07beQGEmw4T\npvDSXftoRur3whWfUKCv5XHnUdc2TeWLF84uur7AByv9QhgKM0wIIYomOp3r6jz84D1zunV2OmJi\nrI4EELHua9fJKFnpPuo77IsCm8/MzcmmLq2byFcyLs3VVKV9EFbDwi3CUCVMMHOWW1Wrr969d8uL\nvfsrbkW1OhJAxNo0fJBtz46t0ncrlhRIiWVnZVLH91+XMy5fnIayDB8ozDDCzKpbVevvPXlqSfXk\n7nJGdo7VkQAi0m1JhWhO14/EhJEDxOmTx/L1e1++eJ46tGisZF69PF7X1K4oy/CBwgwzzOz3aNp7\nZzKujKnWqZty4uIlqyMBRKQGjz9GTZ56knt1/YA1LX/u6Bw6sIfavttAvZZ5pZemqp+gLMMLCjMM\nMTMrut77al5utye7pKg4hBqgYEzt2F64BJufD+l5y3tVblidxh9/+K7scee94fN6x+RHPgguFGYY\n8/r8k3Jk+a3ne/RR1uzea3UcgIgjSRJtHj7I9uOWddKalV/f1GiQmWnul+N8Iwf3uKZrag1m/ja/\nc0JwYJVsBBBCPOWKdayc1KFdwlu1nsGWQAD5bPGWbdRy7ESaPHcF3VGuQsB/zuvVacTA7tqPW9ef\nUhX5eWbGHEoYQ2FGCCHEfa7Y2A3t6tdNGtL8HYfNZrM6EkBEeXfEaN6SfpamfbVKOGJj//Lrc3Oy\nqWfnlvK50ye3KIr8OjPLQYgJBQiFGUGEEMUTnc7lVSqUr7K4V0p88aQkqyMBRAzTNOmuVh8a9z1e\nk7r1Hv6nV6Tnz5yibu3fVjwe91RNVZKxIUFkwBxmBGHmq25VrbnnZPqUqu07KT8fO251JICIIUkS\nbRo+0LZ5zbfShjVpfzjS2Ld7B7Vv/qqanZXZRVXkLijLyIERZoQSQjRyxjrmft6qpfODunVwYQSQ\nT+Zv2ETtJk6jKfPTqPQd5X77PDPT4nlfGrOnjlF0XWvMzGstjAkFAIUZwYQQf4+Pi/uuUfUnSk7q\n0DYuzuGwOhJARHh96GfmnotXxeR5K4TDEUsedx4N7dNZObB352lVkesz82mrM0L+Q2FGuOuHUS+4\n47ZitVYM6B1frkQJqyMBhD3TNKnC++2MR2rWoZdeecPWO7m1osieeZqqfMTMOI4vQqEwo4AQQsTG\n2D+OjXH0T/2km7P2Qw9aHQkg7KVfukxVP0omk1n3efVmpmkusjoTFCzMbUUBZmbN6/ssT1HqvTb4\n05wB8xf6/MYtb1wCELWy3G7qNHmaIkzjjFfXGqIsowNGmFFGCPG3RKcztWyJ4g8u6NEtvnKZO6yO\nBBBWNh/4hZoMG6GoXn2mrOnJzKxbnQmCA4UZhYQQwm6T2sbY7CP7vf1mbOdXG9iw0QHAn/MbBg2Y\nv9A3bvkKRdG9TZl5ldWZILhQmFFMCFEx0elcVOlvpe/5qntyfMVSt1sdCSAk7T91mpqPHCOfuXJ1\nr1tVX2fmy1ZnguBDYUY5IYTksNu72G22QcNbNIttU+9FSZIwtQ1ARKR5vTRowSLf+OVpXq/f38Uw\nzenYiCB6oTCBiH59ZjPR6VxSpUL58nO6dY4vW6K41ZEALLX14CFqNmqMnCvLW/MUtSUzX7Q6E1gL\nhQm/EULY42Jietpsth5j2rwf17z2c0IIHH4C0SVPUShl+ix9wcYtiqLrHzDzMqszQWhAYcL/EEJU\nTXDGLXm00l2lJ3Vo57qrdCmrIwEExYodP1GrMRMUr9+/zK2qHzFzjtWZIHSgMOF3CSEcDru9m02S\nerWtX9fep2kTR6LLaXUsgAKRkZ1D7SdMVtbt3Z8ja9o7zLzB6kwQelCY8KeEEKUSnc6xdput/qhW\nLZxv13pGYFEQRArDMGj22g2c/OUMzTR5sqLrvZhZtToXhCYUJgRECPFEotM5vXzJEuUmf9Q+vto9\nlayOBHBL1u7ZSx0nTZMzcnLS8xS1OTPvsToThDYUJgRMCCEJIZo5HY7RDZ+sFvvZ++85by9SxOpY\nADdkX/op6jxlurz3ZHqeR9M6EtFSxn+EEAAUJtwwIUSh+LjYgcTUulfTfzg6NXzZ5oiJsToWwJ86\ndzWTes6aqy7fvsPv9ft7GaY5BSeLwI1AYcJNE0LcXcjlmpLodD42us378a8++TjhMRQINbmyTMNS\nl3gnpq0yiOgL1esdwsy5VueC8IPChFsmhKhbyOUae3uRwqWHt2yW8HK1x1CcYDmvz0eTV35v9p+3\nQCeib9yqmsLM563OBeELhQn54voOBw0TXc5RdxQrVuLTls0T6j76MIoTgs5vGLR4yzbqPmO2LGv6\n7jxF6cDM+63OBeEPhQn5SgghEVHjRKdzZLmSJYoNbvZ2Qr3HHkFxQoFTNJ1mrlnHQ1MXK7rXdyxX\nUVKYea3VuSByoDChQAghbET0WiGXc2jxpKSSA999K+G1Gk8SjhGD/HYtz01frPjWP/abFT4hxNY8\nRenHzNutzgWRB4UJBer6rdr6hVyuYYlOZ4X+77wZ/9azNQmrauFWnc64QiOXfq3PWbuB7TbbUreq\nDmbmI1bngsiFwoSguF6czybFu4YSUdW29erGtH7pRTtORYEbtS/9FA1NXaKs/HknCSGmqLp3JE4S\ngWBAYULQCSHujY+L62SYxjs17q1sdn71lYQ6Dz9I2HIP/ohpmrR+334amrrEs+v4Sb/P8H/q8xuT\n8HgIBBMKEywjhIgnoqaFXK4Up8NRumPDl50t6jwvFU9KsjoahIjTGVdo1pp1/qmrvte9Pv/lPFUd\nxszzmFm3OhtEHxQmWO767dpqiU5nV6/f/0r9ao+aH73ysqvGvX/H6toopOo6fbN9B01MW+nem35K\nskm2+bKmTcZer2A1FCaEFCFEUZsktXDGOrqWSEoq1LFhg/jXnnpSYM/ayMbMtPP4CZr23WotddNW\ncsTYd+V45HFE9E9m1qzOB0CEwoQQdf15zueSXK4PNZ+v7v3ly/qaPf9cYuMaTxDKM3Jczc2l+es3\nmRPSVsqZuXmK1++f6PX7ZzLzOauzAfw3FCaEPCFEHBG9mORyvaf5fHXvK1fW2+z5WomNazwhShUt\nanU8uEGnLmdQ2k8/c+qmre696accsTH2FXmKOoGItjCzaXU+gD+CwoSw8v/lWcjlaq77fHXvLVvG\n16x2rcTG1Z8UpYuhPEORaZq068RJWr59h3/Rlm3qpaxscthtaXmKmkpEa5lZtjojQCBQmBC2rpdn\nnevl+dK9Zcv43ni6RuJzD1YRD1Yoj12FLKR5vbR+335atu1Hbfn2HWwyX/P6fKmaz7eMiHYws2F1\nRoAbhcKEiCCEiCWiOvFxcQ3sklTXZxglatxX2VvvsUcSa1V5gO4tWwYrbgsQM9Pxi5do6y+HaNm2\n7e5N+w/GOmNjD+XK8nyTeTkzH7c6I8CtQmFCRBJClCKiWoVczvomc21JSIm1qtxv1n30kfhaVR+g\nO28viQK9BV6fj3adSKcfDh/mdXv2u388ctRhMst2m21briwvJaJvmfma1TkB8hMKE6KCEKICEdUq\nHB/fwOv3P+uKjY2p/VBVUeO+yq6qFSrQA+XLUoLTaXXMkJXt8dD2w0do6y+H/Wt275UPnT3ncsXG\nnvMZxjpZ09YT0TasbIVIh8KEqHN9o4R7iKhWUrzraUmIR92qVr54UiH94YoVudo9lRIerFhBVK1Q\ngUoXKxpVI1HTNOnMlat05Nx5OnLuPO1NP6VsO3TYuJSV7Uhwxu13q+r3Pr+xmX6dh8yzOi9AMKEw\nAYhICGGnX0u0alxMzKPxcXHVFV2/V5KkmPvKldUfv+du10MVK8RULF2Kyha/jasUFUMAAAMBSURB\nVEoVKRLWi4q8Ph+duHSZjpw7T4fPnee9J9PlA6fPmGevZjoddps7NsZxQvN6dyu6vo+Ifiaifczs\ntzo3gJVQmAB/4PpI9HYiqioJ8VBSfHx1Ieguzesrpft8iUUSEtS/3VbUX6FkSdtdpUs5y5UsYStz\n221UpvhtVLZ4cUqKd1kyOjVNk7LcHrqUnU2XrmXRxawsunAti89euaqfzrjiPXr+gsjIzna54mKv\n2G22ox5V2+n1+w8S0SEiOsLM7qCHBggDKEyAmyCEcBDR34ioLBGVFURlC7lcd9vttrv8hlFG1b0l\nhBCikMvpdcXGmQnOWE6Ic1KheJdIcrmkQi6XLSneFVPI5bLHx8VRgjOOEuLiKMZuJ5/fT16/n3x+\ng7zXf+//7XN+0nx+w+v3mbrPZyq6bmRk5/iv5OTytTy3lCPLdlnTYmPsdi3OEZNlt9kumiaf86jq\nCZ9hnCeii0R0jIiOYwNzgBuDwgQoIEKIwkRUhIgSiCjx+q//8SGESHA6HEVj7LbCNklKEiRimVhn\nZp2ZdMM0dcM0NdM0NZ9haIZp6kTkIyLv9V81IrpGRFeJKPP6RxYz+4L+FwaIcChMAACAAODEXgAA\ngACgMAEAAAKAwgQAAAgAChMAACAAKEwAAIAAoDABAAACgMIEAAAIAAoTAAAgAChMAACAAKAwAQAA\nAoDCBAAACAAKEwAAIAAoTAAAgACgMAEAAAKAwgQAAAgAChMAACAAKEwAAIAAoDABAAACgMIEAAAI\nAAoTAAAgAChMAACAAKAwAQAAAoDCBAAACAAKEwAAIAAoTAAAgACgMAEAAAKAwgQAAAgAChMAACAA\nKEwAAIAAoDABAAACgMIEAAAIAAoTAAAgAChMAACAAKAwAQAAAoDCBAAACAAKEwAAIAAoTAAAgACg\nMAEAAAKAwgQAAAgAChMAACAAKEwAAIAAoDABAAACgMIEAAAIAAoTAAAgAChMAACAAKAwAQAAAoDC\nBAAACAAKEwAAIAAoTAAAgACgMAEAAALwf/clOqSOnGwaAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 25 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comparing the two sets of unique languages codes we can finally know which are the languages not available in twitter." ] }, { "cell_type": "code", "collapsed": false, "input": [ "set(...) ... set(...) # try playing with sets here" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 26, "text": [ "{'az',\n", " 'ca',\n", " 'cs',\n", " 'gl',\n", " 'id',\n", " 'ig',\n", " 'la',\n", " 'mk',\n", " 'mt',\n", " 'sl',\n", " 'sq',\n", " 'uz',\n", " 'yo',\n", " 'zh-CN'}" ] } ], "prompt_number": 26 }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, there are now languages recognized by twitter that are not recognized by Google. Suprise, surprise..." ] }, { "cell_type": "code", "collapsed": false, "input": [ "..." ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 27, "text": [ "{'ht', 'in', 'sk', 'tl', 'uk', 'und', 'zh'}" ] } ], "prompt_number": 27 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's filter out only the 140 characters of text from tweets where the author speaks English and learn more about the reaction." ] }, { "cell_type": "code", "collapsed": false, "input": [ "en_text = df...\n", "en_text[:25]" ], "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", "
text
created_at
2015-03-09 21:00:46 Why I wound up buying a Pebble\u200b Watch instead....
2015-03-09 21:00:46 RT @BobScottCPA: How is the Apple Watch \"state...
2015-03-09 21:00:46 #AppleWatch Can't wait to wear one :) http://t...
2015-03-09 21:00:46 RT @MEMMOSdubai: Should you buy the $10,000 go...
2015-03-09 21:00:46 #setting4success Hands On With The Apple Watch...
2015-03-09 21:00:46 #Apple redefines itself as a luxury brand htt...
2015-03-09 21:00:46 RT @guardiantech: #Apple's new #MacBook comes ...
2015-03-09 21:00:46 RT @Fallonam: You guys we did this. We gave Ap...
2015-03-09 21:00:46 What Your Favorite Apps Look Like On Apple Wat...
2015-03-09 21:00:47 RT @TechCrunch: Apple Watch Will Ship On April...
2015-03-09 21:00:47 RT @selenalarson: For the price of a high-end ...
2015-03-09 21:00:47 RT @petercoffee: What if trusted data, from an...
2015-03-09 21:00:47 Apple Watch and new MacBook announcement: all ...
2015-03-09 21:00:47 RT @JamesTylerESPN: Louis van Gaal: definitely...
2015-03-09 21:00:48 @ZenTriathlon I'll just tow my Apple watch beh...
2015-03-09 21:00:48 $10k for a watch? ABSOLUTELY, APPLE! #nawwwwwt
2015-03-09 21:00:48 Someone give me $10,000 for a gold Apple watch...
2015-03-09 21:00:48 \"@AppStore: The Watch is coming. 4.24.15. htt...
2015-03-09 21:00:48 Check Out The Apple Watch [video] http://t.co/...
2015-03-09 21:00:48 RT @edaccessible: Use This Ingenious Trick to ...
2015-03-09 21:00:48 CNET: Apple Watch hands-on: Release date April...
2015-03-09 21:00:48 RT @PRNews: Top #PR Takeaways From the Apple W...
2015-03-09 21:00:49 RT @ClaraJeffery: If you spend $10k on a first...
2015-03-09 21:00:49 RT @AppStore: Mac in its purest form ever. The...
2015-03-09 21:00:49 RT @mashabletech: Should you buy the $10,000 g...
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 28, "text": [ " text\n", "created_at \n", "2015-03-09 21:00:46 Why I wound up buying a Pebble\u200b Watch instead....\n", "2015-03-09 21:00:46 RT @BobScottCPA: How is the Apple Watch \"state...\n", "2015-03-09 21:00:46 #AppleWatch Can't wait to wear one :) http://t...\n", "2015-03-09 21:00:46 RT @MEMMOSdubai: Should you buy the $10,000 go...\n", "2015-03-09 21:00:46 #setting4success Hands On With The Apple Watch...\n", "2015-03-09 21:00:46 #Apple redefines itself as a luxury brand htt...\n", "2015-03-09 21:00:46 RT @guardiantech: #Apple's new #MacBook comes ...\n", "2015-03-09 21:00:46 RT @Fallonam: You guys we did this. We gave Ap...\n", "2015-03-09 21:00:46 What Your Favorite Apps Look Like On Apple Wat...\n", "2015-03-09 21:00:47 RT @TechCrunch: Apple Watch Will Ship On April...\n", "2015-03-09 21:00:47 RT @selenalarson: For the price of a high-end ...\n", "2015-03-09 21:00:47 RT @petercoffee: What if trusted data, from an...\n", "2015-03-09 21:00:47 Apple Watch and new MacBook announcement: all ...\n", "2015-03-09 21:00:47 RT @JamesTylerESPN: Louis van Gaal: definitely...\n", "2015-03-09 21:00:48 @ZenTriathlon I'll just tow my Apple watch beh...\n", "2015-03-09 21:00:48 $10k for a watch? ABSOLUTELY, APPLE! #nawwwwwt\n", "2015-03-09 21:00:48 Someone give me $10,000 for a gold Apple watch...\n", "2015-03-09 21:00:48 \"@AppStore: The Watch is coming. 4.24.15. htt...\n", "2015-03-09 21:00:48 Check Out The Apple Watch [video] http://t.co/...\n", "2015-03-09 21:00:48 RT @edaccessible: Use This Ingenious Trick to ...\n", "2015-03-09 21:00:48 CNET: Apple Watch hands-on: Release date April...\n", "2015-03-09 21:00:48 RT @PRNews: Top #PR Takeaways From the Apple W...\n", "2015-03-09 21:00:49 RT @ClaraJeffery: If you spend $10k on a first...\n", "2015-03-09 21:00:49 RT @AppStore: Mac in its purest form ever. The...\n", "2015-03-09 21:00:49 RT @mashabletech: Should you buy the $10,000 g..." ] } ], "prompt_number": 28 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Reception\n", "---------\n", "\n", "Let's now tokenize those tweets and get the counts of the words to get an initial glance about what's being talked about. The first step is to apply tokenization to each cell and flatten the `Series`'s values into a single list." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from nltk.tokenize import word_tokenize\n", "\n", "en_text[\"tokens\"] = en_text.text.apply(...).values\n", "words = sum(en_text[\"tokens\"], [])\n", "words[:25]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 29, "text": [ "['Why',\n", " 'I',\n", " 'wound',\n", " 'up',\n", " 'buying',\n", " 'a',\n", " 'Pebble\\u200b',\n", " 'Watch',\n", " 'instead..',\n", " 'Apple',\n", " 'Watch',\n", " 'vs.',\n", " 'the',\n", " 'competition',\n", " ':',\n", " 'Where',\n", " 'does',\n", " 'it',\n", " 'stand',\n", " '?',\n", " 'http',\n", " ':',\n", " '//t.co/VyqVd17Y7T',\n", " 'RT',\n", " '@']" ] } ], "prompt_number": 29 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can build a `Series` from the flattened list of words in order to show the 25 most common words." ] }, { "cell_type": "code", "collapsed": false, "input": [ "pd.Series(words)...[:25]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 30, "text": [ ": 10773\n", "Apple 6579\n", "http 6011\n", "Watch 4896\n", "the 3534\n", "@ 3451\n", "RT 2534\n", ". 2238\n", "# 2072\n", ", 2006\n", "to 1520\n", "The 1437\n", "$ 1346\n", "watch 1274\n", "new 1246\n", "a 1177\n", "for 1127\n", "is 1068\n", "MacBook 1007\n", "'s 930\n", "in 851\n", "I 835\n", "of 803\n", "? 767\n", "you 728\n", "dtype: int64" ] } ], "prompt_number": 30 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Not surprisingly, \"Apple\" is the most frequently occurring token, there are lots of retweets (actually, \"quoted retweets\") as evidenced by \"RT\", and lots of stopwords (such as \"the\", \"a\", etc.) and characters used in the Twitter universe (\"@\" is used for designating user names, and \"#\" for hastags) at the top of the list. Let's further remove some of the noise by filtering stopwords out." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import nltk\n", "nltk.download('stopwords')\n", "\n", "english_stopwords = nltk...\n", "clean_words = ... # remember that in english_stopwords words are lowercase\n", " \n", "pd.Series(clean_words)...[:25]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[nltk_data] Downloading package stopwords to /home/versae/nltk_data...\n", "[nltk_data] Package stopwords is already up-to-date!\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 31, "text": [ ": 10773\n", "Apple 6579\n", "http 6011\n", "Watch 4896\n", "@ 3451\n", "RT 2534\n", ". 2238\n", "# 2072\n", ", 2006\n", "$ 1346\n", "watch 1274\n", "new 1246\n", "MacBook 1007\n", "'s 930\n", "? 767\n", "... 658\n", "apple 658\n", "'' 634\n", "10,000 627\n", "`` 583\n", "! 544\n", "gold 536\n", "- 506\n", "AppStore 418\n", "https 416\n", "dtype: int64" ] } ], "prompt_number": 31 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now data looks a bit cleaner, although we still have those \"@\" and \"#\", plus the \"http\" that is coming from all the URLs contained in the tweets. Removing those is tricky, since we can't just ignore them. If we do that, we might lose valuable information, like who were the more mentioned users, or the most shared hashtag. Instead, we are going to tweak NLTK's `PunktWordTokenizer` by modifying some of the internally used regular expressions.\n", "\n", "The first one is the regular expression used to express those characters that cannot appear within words. Take a look to the actual regular expression and make the necessary changes to allow \"@\" and \"#\" be part of a word." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Original (?:[?!)\\\";}\\]\\*:@\\'\\({\\[])\n", "re_non_word = r\"(?:[?!)\\\";}\\]\\*:@\\'\\({\\[])\"" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 32 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The second regular expression excludes some characters from starting word tokens. Try to modify it to allow \"@\" and \"#\" be part of a word too." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Original [^\\(\\\"\\`{\\[:;&\\#\\*@\\)}\\]\\-,]\n", "re_word_start = r\"[^\\(\\\"\\`{\\[:;&\\#\\*@\\)}\\]\\-,]\"" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 33 }, { "cell_type": "code", "collapsed": false, "input": [ "# Nothing to change in this cell\n", "import re\n", "from nltk.tokenize import PunktWordTokenizer\n", "from nltk.tokenize.punkt import PunktLanguageVars\n", "\n", "lang_vars = PunktLanguageVars()\n", "lang_vars._re_word_tokenizer = re.compile(lang_vars._word_tokenize_fmt % {\n", " 'NonWord': re_non_word,\n", " 'MultiChar': lang_vars._re_multi_char_punct,\n", " 'WordStart': re_word_start,\n", "}, re.UNICODE | re.VERBOSE)\n", "tokenizer = PunktWordTokenizer(lang_vars=lang_vars)\n", "\n", "def twitter_tokenize(value):\n", " return tokenizer.tokenize(value)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 34 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can use the defined function `twitter_tokenize` to tokenize our tweets. Once we are sure that usernames and hashtags are safe, we can extended `english_stopwords` to also include regular string punctiation characters, plus some other random words that are of no interest or glitches of tokenization." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import string\n", "\n", "word_lists = en_text.text.apply(...)\n", "words = sum(word_lists.values, [])\n", "\n", "english_stopwords += list(string.punctuation)\n", "english_stopwords += [\"http\", \"https\", \"...\", \"'s\", \"'t\"]\n", "\n", "clean_words = ...\n", "pd.Series(clean_words)...[:25]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 35, "text": [ "Apple 6411\n", "Watch 4764\n", "RT 2533\n", "new 1243\n", "watch 1155\n", "MacBook 881\n", "$10,000 617\n", "apple 550\n", "gold 535\n", "App 385\n", "@AppStore 378\n", "New 361\n", "buy 359\n", "Look 351\n", "coming. 341\n", "4.24.15. 335\n", "event 307\n", "//t.co/4iiurTDTt9 289\n", "Apple\u2019s 285\n", "First 280\n", "look 255\n", "standard 255\n", "launching 254\n", "douchebag 253\n", "thanking 252\n", "dtype: int64" ] } ], "prompt_number": 35 }, { "cell_type": "markdown", "metadata": {}, "source": [ "What a difference removing a little bit of noise can make! We now see much more meaningful data appear at the top of the list. Actually, it can almost be read as a single sentence: `\"Apple Watch RT new watch $10,000, MacBook gold. @AppStore New buy, coming 4.24.15 t.co/4iiurTDTt9\"`. The URL, in fact, takes you to the Apple Watch site.\n", "\n", "There is, however, an unexpected term: `douchebag`. We are not sure but could be related to the fact that the price of the watch seems to be `$10,000`.\n", "\n", "Let's now treat the problem as one of discovering statistical collocations to get more insight about the phrase contexts." ] }, { "cell_type": "code", "collapsed": false, "input": [ "text = nltk.Text\n", "text..." ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Apple Watch; coming. 4.24.15.; apple watch; 4.24.15.\n", "//t.co/4iiurTDTt9; standard douchebag; @AnnaKendrick47 thanking;\n", "douchebag detection.; //t.co/4iiurTDTt9 //t.co/3Bedz37DAy; gold\n", "standard; launching $10,000; Companion App; Favorite Apps; Watch\n", "coming.; $10,000 apple; First Enterprise; new MacBook; internet\n", "reacts; Salesforce First; App Jump; Enterprise App\n" ] } ], "prompt_number": 36 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Even without any prior analysis on tokenization, it's pretty clear what the topic is about as evidenced by this list of collocations. But what about the *context* in which these phrases appear? Toward the bottom of the list of commonly occurring words, the words \"watch\" and \"$10,000\" appear. The word \"favorite\" is interesting, because it is usually the basis of an emotional reaction, and we're interested in examining the reaction. And \"thanking\" could also mean something. What about the word \"douchebag\"? What might it mean? The concordance will help us to find out." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Print concordance for watch, favorite, and $10,000\n", "text...\n", "text...\n", "text..." ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Displaying 25 of 5943 matches:\n", " Watch instead .. Apple Watch vs. competiti\n", " Watch vs. competition stand //t.co/VyqVd17\n", " Watch state art even beam time ceiling lik\n", " @MEMMOSdubai buy $10,000 gold Apple Watch helpful flowchart //t.co/Crn3LPr7Ve \n", "ai #UAE #setting4success Hands Apple Watch //t.co/VRGA6NaWXP #Mobile #Tablets #\n", "nam guys this. gave Apple power sell watch $10k. blame. #AppleLive #AppleWat\u2026 F\n", "leWat\u2026 Favorite Apps Look Like Apple Watch Plus New Ones //t.co/XIweD7HZ8f RT @\n", "t.co/XIweD7HZ8f RT @TechCrunch Apple Watch Ship April 24 Cost $349 $10,000+ Dep\n", "T @selenalarson price high-end Apple Watch fund entire Charity Water project tr\n", " //t.co/Zybh0uto7B @Salesforce Apple Watch new MacBook announcement news Apple\u2019\n", "s van Gaal definitely type buy Apple Watch leave park bench. @ZenTriathlon 'll \n", "k bench. @ZenTriathlon 'll tow Apple watch behind little waterproof boat $10k w\n", "h behind little waterproof boat $10k watch ABSOLUTELY APPLE #nawwwwwt Someone g\n", "wwwt Someone give $10,000 gold Apple watch @AppStore Watch coming. 4.24.15. //t\n", "e $10,000 gold Apple watch @AppStore Watch coming. 4.24.15. //t.co/DQuKRR3Bur /\n", "mGlLA @VictoriaDemenko \ud83d\ude02 Check Apple Watch video //t.co/8QCihNEuAV RT @edaccess\n", "e Ingenious Trick Choose Right Apple Watch Size //t.co/QMVOCKHRjx @TIME CNET Ap\n", "e //t.co/QMVOCKHRjx @TIME CNET Apple Watch hands-on Release date April 24 price\n", "q RT @PRNews Top #PR Takeaways Apple Watch Preview //t.co/TMNfdPZSc0 RT @ClaraJ\n", "raJeffery spend $10k first-gen Apple watch check every priority life. RT @AppSt\n", "@mashabletech buy $10,000 gold Apple Watch helpful flowchart @MaxKnoblauch //t.\n", "wM //t.co/C\u2026 RT @charlesarthur Apple Watch watch way first iPhone phone. people\n", ".co/C\u2026 RT @charlesarthur Apple Watch watch way first iPhone phone. people want \n", "irst iPhone phone. people want apple watch start saving $10,000 //t.co/SEzAGJeK\n", "eKEy Australia among first get Apple Watch //t.co/Syx3GPCuvS RT @AppStore There\n", "Displaying 25 of 145 matches:\n", "$10k. blame. #AppleLive #AppleWat\u2026 Favorite Apps Look Like Apple Watch Plus Ne\n", "wristwatch histo //t.co/ZS1WpLr3dF Favorite Apps Look Like Apple Watch Plus Ne\n", "cBook //t.co/OoLf5Wqe5q //t.co/59\u2026 Favorite Apps Look Like Apple Watch Plus Ne\n", "nk @tim_cook much apple watch cost Favorite Apps Look Like Apple Watch Plus Ne\n", "ptYjuc March 09 2015 04 55PM #What Favorite Apps Look Like Apple Watch Plus Ne\n", "today Apple news //t.co/ARphq3OmgT Favorite Apps Look Like Apple Watch Plus Ne\n", "pple new MacBook //t.co/dLfNvRFk4n Favorite Apps Look Like Apple Watch Plus Ne\n", "Apple Watch font //t.co/pjz2OJ5zZv Favorite Apps Look Like Apple Watch Plus Ne\n", "pple Watch event //t.co/9OZCPIQZku Favorite Apps Look Like Apple Watch Plus Ne\n", "l @danielas_bot @ThisIsFusion //t\u2026 Favorite Apps Look Like Apple Watch Plus Ne\n", "Apple Watch apps //t.co/qbN3jyT8hn Favorite Apps Look Like Apple Watch Plus Ne\n", "/t.co/Wg9I3EprvT //t.co/ye5W7t5d2x Favorite Apps Look Like Apple Watch Plus Ne\n", "pple Watch pushed back month haha. Favorite Apps Look Like Apple Watch Plus Ne\n", "/t.co/n4Y2ZacIwB //t.co/dch3Kh0SUn Favorite Apps Look Like Apple Watch Plus Ne\n", "/t.co/U62E2iyNT6 //t.co/jRtWddN0Wi Favorite Apps Look Like Apple Watch Plus Ne\n", "tible Apple Watch cases size. Swap Favorite Apps Look Like Apple Watch Plus Ne\n", "r person wearing $600 Apple watch. Favorite Apps Look Like Apple Watch Plus Ne\n", "pple new MacBook //t.co/CNA4Q564bf Favorite Apps Look Like Apple Watch Plus Ne\n", "ant @lilyhnewman //t.co/bn3LWYOJsE Favorite Apps Look Like Apple Watch Plus Ne\n", "down PC Magazine //t.co/kCCuRpOLpm Favorite Apps Look Like Apple Watch Plus Ne\n", " -- Live Blog 2- //t.co/MMwNSRzrrD Favorite Apps Look Like Apple Watch Plus Ne\n", "s start April 10 //t.co/un2pGcE2i4 Favorite Apps Look Like Apple Watch Plus Ne\n", "t.co/T9quScjxGI $17K beauty yours. Favorite Apps Look Like Apple Watch Plus Ne\n", "ch Plus New Ones //t.co/X0uDYzCNTb Favorite Apps Look Like Apple Watch Plus Ne\n", "cial Apple event //t.co/zsyo8mFx1A Favorite Apps Look Like Apple Watch Plus Ne\n", "Displaying 25 of 617 matches:\n", "t.co/7rL7SBLEvy RT @MEMMOSdubai buy $10,000 gold Apple Watch helpful flowchart \n", "LUTELY APPLE #nawwwwwt Someone give $10,000 gold Apple watch @AppStore Watch co\n", ".co/jRtWddN0Wi RT @mashabletech buy $10,000 gold Apple Watch helpful flowchart \n", "eople want apple watch start saving $10,000 //t.co/SEzAGJeKEy Australia among f\n", "Kendrick47 thanking Apple launching $10,000 apple watch new gold standard douch\n", ".co/X878RvKjty RT @cjwerleman think $10,000 Apple watch popular amongst muggers\n", "00+ RT @wesleyfenlon Yeah could buy $10,000 Apple Watch could buy 20,000 Reeses\n", "t.co/5Plg8S4rVe RT @MEMMOSdubai buy $10,000 gold Apple Watch helpful flowchart \n", "Kendrick47 thanking Apple launching $10,000 apple watch new gold standard douch\n", "t.co/ZkpBsfg4zX RT @MEMMOSdubai buy $10,000 gold Apple Watch helpful flowchart \n", "H9WlF Apple Watch ranges price $349 $10,000 sale April 24 //t.co/8BOiosAnED RT \n", "t.co/X7RwknBuOG RT @MEMMOSdubai buy $10,000 gold Apple Watch helpful flowchart \n", "Kendrick47 thanking Apple launching $10,000 apple watch new gold standard douch\n", "t.co/e5TtdeRet4 RT @LATimesGraphics $10,000 Apple Watch Here\u2019s many Apple produ\n", "t.co/fqenQ08jOw RT @MEMMOSdubai buy $10,000 gold Apple Watch helpful flowchart \n", "WatkT Haha apple watch edition gold $10,000 hay pewwww RT @AppStore Mac purest \n", "V5DfYA9wOX RT @TheSeanBrewster glad $10,000 Apple watch look like poor person w\n", "keginn sorry Apple one watch 'd pay $10,000 //t.co/TC7PyMUXfY Live Apple reveal\n", " //t.co/UoP0u2iELL RT @mashable buy $10,000 gold Apple Watch flowchart help //t\n", " //t.co/ZLrwdxpTvF RT @mashable buy $10,000 gold Apple Watch flowchart help //t\n", "RT @andylassner way hell 'm getting $10,000 Apple watch unless really rich talk\n", "Kendrick47 thanking Apple launching $10,000 apple watch new gold standard douch\n", "Kendrick47 thanking Apple launching $10,000 apple watch new gold standard douch\n", "t.co/GbYeFKRicE RT @MEMMOSdubai buy $10,000 gold Apple Watch helpful flowchart \n", "Kendrick47 thanking Apple launching $10,000 apple watch new gold standard douch\n" ] } ], "prompt_number": 37 }, { "cell_type": "code", "collapsed": false, "input": [ "# Print concordance for thanking, and douchebag\n", "text...\n", "text..." ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Displaying 25 of 252 matches:\n", "t.co/7ICkQWTHGC RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "t.co/3Bedz37DAy RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "t.co/wbOQ9uWhI7 RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "c @TheEllenShow RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", " Apple money ?\u201d RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "t.co/Mzr5A5Uufw RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "ebag detection. RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "t.co/v4Q41A5QGO RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "iJy0pozOa5 THIS> @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "XyyPf7qf #apple RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "//t.co/5U0xPydGyN \u201c@AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "ife like iPhon\u2026 RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "f2wLGnvMF #tech RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "rice bracket xD RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "t.co/UKxSvbWzqN RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "t.co/zuCMt8nU4N RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "t.co/W94WGibGiV RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", " makes immortal RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "cking Internet. RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "t.co/D4ck0CuCHA RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "t.co/iugi0MUGuf RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "ng money stuff. RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "t.co/jSHGFf4yIU RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "t.co/Te5Pb58msM RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "ebag detection. RT @AnnaKendrick47 thanking Apple launching $10,000 apple watc\n", "Displaying 25 of 253 matches:\n", ",000 apple watch new gold standard douchebag detection. update iOS Apple puts n\n", ",000 apple watch new gold standard douchebag detection. Apple releases new vide\n", ",000 apple watch new gold standard douchebag detection. #telemarketing Apple im\n", ",000 apple watch new gold standard douchebag detection. #telemarketing Apple Wa\n", ",000 apple watch new gold standard douchebag detection. RT @edaccessible Use In\n", ",000 apple watch new gold standard douchebag detection. RT @AnnaKendrick47 than\n", ",000 apple watch new gold standard douchebag detection. RT @luufycom New Apple \n", ",000 apple watch new gold standard douchebag detection. Apple Watch proof human\n", ",000 apple watch new gold standard douchebag detection. new MacBook shows San F\n", ",000 apple watch new gold standard douchebag detection. Apple Watch sounds like\n", ",000 apple watch new gold standard douchebag detection.\u201d RT @WarrenHolstein For\n", ",000 apple watch new gold standard douchebag detection. need Apple watch last t\n", ",000 apple watch new gold standard douchebag detection. RT @holman Conference s\n", ",000 apple watch new gold standard douchebag detection. #mktg new MacBook shows\n", ",000 apple watch new gold standard douchebag detection. iOS 8.2 come Apple watc\n", ",000 apple watch new gold standard douchebag detection. Get Free Apple Watch //\n", ",000 apple watch new gold standard douchebag detection. RT @TechCrunch Apple Wa\n", ",000 apple watch new gold standard douchebag detection. Apple watch hasn impres\n", ",000 apple watch new gold standard douchebag detection. RT @CityNews 5 things n\n", ",000 apple watch new gold standard douchebag detection. RT @desusnice New life \n", ",000 apple watch new gold standard douchebag detection. Amazing Apple set buy t\n", ",000 apple watch new gold standard douchebag detection. Hey apple think make ne\n", ",000 apple watch new gold standard douchebag detection. Favorite Apps Look Like\n", ",000 apple watch new gold standard douchebag detection. RT @AnnaKendrick47 than\n", ",000 apple watch new gold standard douchebag detection. RT @Joemon871 @tldtoday\n" ] } ], "prompt_number": 38 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "*$10,000 watch*\n", "
\n", "\n", "\n", "It would appear that there is indeed a common thread of amazement in the data, although it's not evident if positive or negative. `@AnnaKendrick47` turns out to be [Anna Kendrick](https://en.wikipedia.org/wiki/Anna_Kendrick), an actress that recently appeared as a presenter in 86th Academy Awards, and that has played a role in *The Twilight Saga*.\n", "\n", "But what else can usernames, hashtags, and URLs tell us? All that information is in our column `entities`, but remember that `entities` is a dictionary containing other keys. Let's now extract the value counts for `screen_name`'s in `user_mentions`, `text`'s in `hashtags`, and `expanded_url`'s in `urls`. Then show the 25 more frequent." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# screen_name's in user_mentions\n", "def list_screen_name_in_user_mentions(user_mention):\n", " ...\n", "\n", "screen_name_lists = df.entities.apply(list_screen_name_in_user_mentions)\n", "screen_names = pd.Series(sum(screen_name_lists.values, []))...\n", "screen_names[:25]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 39, "text": [ "AppStore 421\n", "AnnaKendrick47 254\n", "sosyalansmedya 149\n", "verge 81\n", "TechCrunch 66\n", "Chris_Vanouu 64\n", "gizmodojapan 57\n", "YouTube 47\n", "MEMMOSdubai 46\n", "mashable 44\n", "wylsacom 39\n", "TIME 38\n", "sageboggs 38\n", "engadget 37\n", "TheOnion 31\n", "tomstandage 29\n", "waltmossberg 29\n", "ComplexMag 28\n", "edaccessible 27\n", "desusnice 25\n", "androidcentral 24\n", "CNET 23\n", "Recode 22\n", "shutupmikeginn 21\n", "BMWi 20\n", "dtype: int64" ] } ], "prompt_number": 39 }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we see above, `AnnaKendrick47` is mentioned more than half the times that `AppStore` is. Then some tech media companies and blogs, including the funny `TheOnion`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# text's in hashtags\n", "def list_text_in_hastags(hashtag):\n", " ...\n", "\n", "hastag_lists = df.entities.apply(list_text_in_hastags)\n", "hastags = pd.Series(sum(hastag_lists.values, []))...\n", "hastags[:25]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 40, "text": [ "Apple 243\n", "AppleWatch 190\n", "apple 147\n", "AppleLive 131\n", "tech 118\n", "MacBook 79\n", "news 75\n", "applewatch 67\n", "Tech 51\n", "technology 49\n", "watch 49\n", "AppleEvent 29\n", "wwwhatsnew 28\n", "News 25\n", "changepenang 24\n", "Dubai 23\n", "Technology 23\n", "UAE 23\n", "Watch 23\n", "Macbook 21\n", "AppleWatchEvent 21\n", "iphone 18\n", "android 18\n", "tecnologia 16\n", "\u043d\u043e\u0432\u043e\u0441\u0442\u0438 16\n", "dtype: int64" ] } ], "prompt_number": 40 }, { "cell_type": "markdown", "metadata": {}, "source": [ "About the hashtags, nothing really interesting here. Only mention the hashtag `\u043d\u043e\u0432\u043e\u0441\u0442\u0438`, let's see what the meaning is in English." ] }, { "cell_type": "code", "collapsed": false, "input": [ "tb.TextBlob...string" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 41, "text": [ "'news'" ] } ], "prompt_number": 41 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Well, it means \"news\".\n", "\n", "Finally, let's take a look to the the URLs." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# expanded_url's in urls\n", "def list_expanded_url_in_urls(url):\n", " ...\n", "\n", "url_lists = df.entities.apply(list_expanded_url_in_urls)\n", "urls = pd.Series(sum(url_lists.values, []))...\n", "urls[:25]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 42, "text": [ "http://apple.com/watch 338\n", "https://amp.twimg.com/v/ee08d048-6b15-4544-9dda-46b991a954f7 262\n", "http://ift.tt/1BkhBpV 49\n", "http://apple.com/macbook 49\n", "http://ift.tt/196oFw0 43\n", "http://ift.tt/1NBugtG 42\n", "http://ift.tt/1F4vwSD 41\n", "http://ift.tt/1AacV0Z 41\n", "http://apple-watch-news.com 40\n", "http://japan.cnet.com/sp/apple_watch/35061515/?tag=as.rss 34\n", "http://bit.ly/1KMXXck 33\n", "http://ift.tt/1MmmwbR 33\n", "http://ift.tt/1Aab7VR 32\n", "http://ift.tt/1FBpBm6 32\n", "http://ift.tt/1wm5sAA 32\n", "http://theverge.com/e/7941194 32\n", "http://ift.tt/1Mmmvoe 31\n", "http://apple.com/live 30\n", "http://ift.tt/1Aab8ZJ 29\n", "http://engt.co/1Aad1FU 29\n", "http://xkcd.com/1420/ 29\n", "http://trib.al/OKvbiFO 28\n", "http://ln.is/time.com/3737949/app/lHrJg 27\n", "http://read.bi/1AXKvrd 23\n", "http://ift.tt/196fWtT 23\n", "dtype: int64" ] } ], "prompt_number": 42 }, { "cell_type": "markdown", "metadata": {}, "source": [ "A lot of the same: reviews and links to official pages. An excemption is this XKCD comic.\n", "\n", "
\n", "\n", "*[Watches](http://xkcd.com/1420/)*\n", "
\n", "\n", "First The Onion, now XKCD... It is starting to see like a lot of tweets had a comical twist, it might be sarcasm or just jokes. Let's take a look to the most popular tweets to confirm it. We could use the number of retweets, `retweet_count`, to find those. However, it looks like in our dataset everyone was retweeting by embeding the tweets (using \"RT @someone: ...\"), and therefore `retweet_count` is always zero. There is still a way to find the most retweeted status. But I will leave that to you to figure it out." ] }, { "cell_type": "code", "collapsed": false, "input": [ "retweets = en_text[...]\n", "grouped_retweets = retweets.groupby...aggregate...\n", "grouped_retweets.sort(..., ...)[:25]" ], "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", "
text
text
RT @AnnaKendrick47: We should be thanking Apple for launching the $10,000 \"apple watch\" as the new gold standard in douchebag detection. 246
RT @AppStore: The Watch is coming. 4.24.15. http://t.co/4iiurTDTt9\\nhttps://t.co/3Bedz37DAy 225
RT @sageboggs: Is there a way to sync my Google Glass to my Apple Watch? I want to ensure I won't kiss anyone for the rest of my life 38
RT @AppStore: Mac in its purest form ever. The new MacBook. http://t.co/U62E2iyNT6 http://t.co/jRtWddN0Wi 33
RT @verge: 10 things you can buy instead of a $10,000 Apple Watch http://t.co/skzHFWDCX0 http://t.co/RrZxqxN188 28
RT @tomstandage: Genius from xkcd, as Apple prepares to launch its Watch http://t.co/OzcVuUoYJP http://t.co/nvhMdfw9vy 27
RT @ComplexMag: Everything you need to know about the Apple Watch and the New Gold MacBook: http://t.co/aylpX2MQi4 http://t.co/ORUNZwS0nh 27
RT @edaccessible: Use This Ingenious Trick to Choose the Right Apple Watch Size http://t.co/QMVOCKHRjx @TIME 27
RT @MEMMOSdubai: Should you buy the $10,000 gold Apple Watch? A helpful flowchart http://t.co/Crn3LPr7Ve @MEMMOSDubai #Dubai #UAE 23
RT @shutupmikeginn: sorry Apple, there's only one watch I'd pay $10,000 for: http://t.co/TC7PyMUXfY 21
RT @AppStore: The Watch is coming. 4.24.15. http://t.co/4iiurTDTt9\\nhttps://t.co/kkGlBBJIB9 18
RT @WSJD: .@GeoffreyFowler says today's Apple Watch event was about \"quantity over quality\": http://t.co/FT8MI4sqlC http://t.co/c9v44NU4V3 18
RT @RANsquawk: Loving my Apple Watch $AAPL http://t.co/c75QFoDSS3 18
RT @TheOnion: From The Archives: Interim Apple Chief Under Fire After Unveiling Grotesque New MacBook http://t.co/OoLf5Wqe5q http://t.co/59\u2026 17
RT @AppStore: The Watch is coming. 4.24.15. http://t.co/4iiurTDTt9\\nhttps://t.co/JY0qjXldir 17
RT @desusnice: JIGS UP RT @engadget: These $79 dongles will add more ports to Apple's new MacBook http://t.co/dLfNvRFk4n 16
RT @AppStore: The Watch is coming. 4.24.15. http://t.co/4iiurTDTt9\\nhttps://t.co/Z18Ue9rp7X 16
RT @SarcasticRover: I cost 250,000 Apple Watch Editions. 16
RT @waltmossberg: Apple Watch Selection Flowchart (Comic) http://t.co/TNfdhECT9P via @Recode http://t.co/jSHGFf4yIU 16
RT @robfee: Just preordered my $10,000 Apple Watch and I couldn't be more excited! http://t.co/r9qJ1lWIv1 15
RT @andylassner: No way in hell I'm getting a $10,000 Apple watch unless a really rich talk show host buys me one. \\n\\ncc @TheEllenShow 13
RT @Rachelskirts: And nine\u2014nine Apple Watch Editions were gifted to the race of men, who above all else desire power. 13
RT @AppStore: The Watch is coming. 4.24.15. http://t.co/4iiurTDTt9\\nhttps://t.co/hI2YFOSf0f 12
RT @bmw: .@BMWi is excited to provide one of the apps for Apple Watch when it becomes available in April. Stay tuned! http://t.co/CSfKmneOAT 12
RT @TheTweetOfGod: The Apple Watch may become so addictive it keeps people from looking at what's truly important in life, like their iPhon\u2026 12
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 43, "text": [ " text\n", "text \n", "RT @AnnaKendrick47: We should be thanking Apple for launching the $10,000 \"apple watch\" as the new gold standard in douchebag detection. 246\n", "RT @AppStore: The Watch is coming. 4.24.15. http://t.co/4iiurTDTt9\\nhttps://t.co/3Bedz37DAy 225\n", "RT @sageboggs: Is there a way to sync my Google Glass to my Apple Watch? I want to ensure I won't kiss anyone for the rest of my life 38\n", "RT @AppStore: Mac in its purest form ever. The new MacBook. http://t.co/U62E2iyNT6 http://t.co/jRtWddN0Wi 33\n", "RT @verge: 10 things you can buy instead of a $10,000 Apple Watch http://t.co/skzHFWDCX0 http://t.co/RrZxqxN188 28\n", "RT @tomstandage: Genius from xkcd, as Apple prepares to launch its Watch http://t.co/OzcVuUoYJP http://t.co/nvhMdfw9vy 27\n", "RT @ComplexMag: Everything you need to know about the Apple Watch and the New Gold MacBook: http://t.co/aylpX2MQi4 http://t.co/ORUNZwS0nh 27\n", "RT @edaccessible: Use This Ingenious Trick to Choose the Right Apple Watch Size http://t.co/QMVOCKHRjx @TIME 27\n", "RT @MEMMOSdubai: Should you buy the $10,000 gold Apple Watch? A helpful flowchart http://t.co/Crn3LPr7Ve @MEMMOSDubai #Dubai #UAE 23\n", "RT @shutupmikeginn: sorry Apple, there's only one watch I'd pay $10,000 for: http://t.co/TC7PyMUXfY 21\n", "RT @AppStore: The Watch is coming. 4.24.15. http://t.co/4iiurTDTt9\\nhttps://t.co/kkGlBBJIB9 18\n", "RT @WSJD: .@GeoffreyFowler says today's Apple Watch event was about \"quantity over quality\": http://t.co/FT8MI4sqlC http://t.co/c9v44NU4V3 18\n", "RT @RANsquawk: Loving my Apple Watch $AAPL http://t.co/c75QFoDSS3 18\n", "RT @TheOnion: From The Archives: Interim Apple Chief Under Fire After Unveiling Grotesque New MacBook http://t.co/OoLf5Wqe5q http://t.co/59\u2026 17\n", "RT @AppStore: The Watch is coming. 4.24.15. http://t.co/4iiurTDTt9\\nhttps://t.co/JY0qjXldir 17\n", "RT @desusnice: JIGS UP RT @engadget: These $79 dongles will add more ports to Apple's new MacBook http://t.co/dLfNvRFk4n 16\n", "RT @AppStore: The Watch is coming. 4.24.15. http://t.co/4iiurTDTt9\\nhttps://t.co/Z18Ue9rp7X 16\n", "RT @SarcasticRover: I cost 250,000 Apple Watch Editions. 16\n", "RT @waltmossberg: Apple Watch Selection Flowchart (Comic) http://t.co/TNfdhECT9P via @Recode http://t.co/jSHGFf4yIU 16\n", "RT @robfee: Just preordered my $10,000 Apple Watch and I couldn't be more excited! http://t.co/r9qJ1lWIv1 15\n", "RT @andylassner: No way in hell I'm getting a $10,000 Apple watch unless a really rich talk show host buys me one. \\n\\ncc @TheEllenShow 13\n", "RT @Rachelskirts: And nine\u2014nine Apple Watch Editions were gifted to the race of men, who above all else desire power. 13\n", "RT @AppStore: The Watch is coming. 4.24.15. http://t.co/4iiurTDTt9\\nhttps://t.co/hI2YFOSf0f 12\n", "RT @bmw: .@BMWi is excited to provide one of the apps for Apple Watch when it becomes available in April. Stay tuned! http://t.co/CSfKmneOAT 12\n", "RT @TheTweetOfGod: The Apple Watch may become so addictive it keeps people from looking at what's truly important in life, like their iPhon\u2026 12" ] } ], "prompt_number": 43 }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see, there are lots of intersting tweet entities that give you helpful context for the announcement. One particularly notable observation is the appearance of \"comedic accounts\" relaying a certain amount of humor. And for once we can see why the
tweet by `@AnnaKendrick47`, embedded below, got that popular.\n", "\n", "

We should be thanking Apple for launching the $10,000 "apple watch" as the new gold standard in douchebag detection.

— Anna Kendrick (@AnnaKendrick47) March 9, 2015
\n", "\n", "\n", "When you take a closer look at some of the developed news stories, you also see sarcasm, unbelief, and even a bit of spam. Everything has a place on Twitter.\n", "\n", "Sentiment\n", "---------\n", "\n", "Identifying sarcasm or irony is a very hard task for machines, as [it demands a lot of background knowledge](http://arstechnica.com/tech-policy/2014/06/us-secret-service-wants-software-to-detect-sarcasm-on-social-media/). We can, however, take a look on how sentiment evolved over time, and if in average the announcement of the new watch and laptop was positive or negative.\n", "\n", "Let's start by adding new columns to our `DataFrame` `en_text` that captures the sentiment of the tweets. But instead of using the regular polarity analyzer, we will use a `NaiveBayesAnalyzer()`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from textblob.sentiments import NaiveBayesAnalyzer\n", "analyzer = NaiveBayesAnalyzer()\n", "\n", "def extract_sentiment(value):\n", " ...\n", " return pd.Series([sentiment, pos_prob, neg_prob])\n", "\n", "en_text[...] = en_text.text.apply(extract_sentiment)\n", "en_text[[\"text\", \"sentiment\", \"pos_prob\", \"neg_prob\"]].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", "
textsentimentpos_probneg_prob
created_at
2015-03-09 21:00:46 Why I wound up buying a Pebble\u200b Watch instead.... pos 0.949290 0.050710
2015-03-09 21:00:46 RT @BobScottCPA: How is the Apple Watch \"state... neg 0.260906 0.739094
2015-03-09 21:00:46 #AppleWatch Can't wait to wear one :) http://t... neg 0.443928 0.556072
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 44, "text": [ " text \\\n", "created_at \n", "2015-03-09 21:00:46 Why I wound up buying a Pebble\u200b Watch instead.... \n", "2015-03-09 21:00:46 RT @BobScottCPA: How is the Apple Watch \"state... \n", "2015-03-09 21:00:46 #AppleWatch Can't wait to wear one :) http://t... \n", "\n", " sentiment pos_prob neg_prob \n", "created_at \n", "2015-03-09 21:00:46 pos 0.949290 0.050710 \n", "2015-03-09 21:00:46 neg 0.260906 0.739094 \n", "2015-03-09 21:00:46 neg 0.443928 0.556072 " ] } ], "prompt_number": 44 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now can see how many positive and negative tweets are there in the dataset." ] }, { "cell_type": "code", "collapsed": false, "input": [ "sentiments = en_text.groupby(...).aggregate({\n", " ...,\n", " ...,\n", " ...,\n", "})\n", "sentiments" ], "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", "
pos_probtextneg_prob
sentiment
neg 0.379798 1057 0.620202
pos 0.799055 5623 0.200945
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 45, "text": [ " pos_prob text neg_prob\n", "sentiment \n", "neg 0.379798 1057 0.620202\n", "pos 0.799055 5623 0.200945" ] } ], "prompt_number": 45 }, { "cell_type": "code", "collapsed": false, "input": [ "ax = ...plot(..., figsize=(8, 4))\n", "ax.set_title(...)\n", "ax.set_xlabel(...)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 46, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 46 }, { "cell_type": "markdown", "metadata": {}, "source": [ "It seems like the perception of the new products has been mostly positive. But it's the same for both the watch and the laptop? Let's add a new column keyword with value \"watch\" if the tweet contains the word \"watch\" (ignore case), \"macbook\" if it contains \"macbook\", \"both\" if it contains both, and `np.NaN` otherwise." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def get_keyword(value):\n", " ...\n", "\n", "en_text[\"keyword\"] = en_text.text.apply(get_keyword)\n", "en_text[\"keyword\"][:25]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 47, "text": [ "created_at\n", "2015-03-09 21:00:46 watch\n", "2015-03-09 21:00:46 watch\n", "2015-03-09 21:00:46 watch\n", "2015-03-09 21:00:46 watch\n", "2015-03-09 21:00:46 watch\n", "2015-03-09 21:00:46 NaN\n", "2015-03-09 21:00:46 macbook\n", "2015-03-09 21:00:46 watch\n", "2015-03-09 21:00:46 watch\n", "2015-03-09 21:00:47 watch\n", "2015-03-09 21:00:47 watch\n", "2015-03-09 21:00:47 NaN\n", "2015-03-09 21:00:47 both\n", "2015-03-09 21:00:47 watch\n", "2015-03-09 21:00:48 watch\n", "2015-03-09 21:00:48 watch\n", "2015-03-09 21:00:48 watch\n", "2015-03-09 21:00:48 watch\n", "2015-03-09 21:00:48 watch\n", "2015-03-09 21:00:48 watch\n", "2015-03-09 21:00:48 watch\n", "2015-03-09 21:00:48 watch\n", "2015-03-09 21:00:49 watch\n", "2015-03-09 21:00:49 macbook\n", "2015-03-09 21:00:49 watch\n", "Name: keyword, dtype: object" ] } ], "prompt_number": 47 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can create a pivot table to see the average values of the distributions of probability and count the number of tweets per keyword and sentiment." ] }, { "cell_type": "code", "collapsed": false, "input": [ "pd.pivot_table(en_text, index=..., aggfunc={\n", " ...,\n", " ...,\n", " ...,\n", "})" ], "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", "
neg_probpos_probtext
keywordsentiment
bothneg 0.734580 0.265420 9
pos 0.140977 0.859023 235
macbookneg 0.624145 0.375855 140
pos 0.183667 0.816333 724
watchneg 0.616332 0.383668 872
pos 0.206179 0.793821 4592
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 48, "text": [ " neg_prob pos_prob text\n", "keyword sentiment \n", "both neg 0.734580 0.265420 9\n", " pos 0.140977 0.859023 235\n", "macbook neg 0.624145 0.375855 140\n", " pos 0.183667 0.816333 724\n", "watch neg 0.616332 0.383668 872\n", " pos 0.206179 0.793821 4592" ] } ], "prompt_number": 48 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Conclusions\n", "-----------\n", "\n", "We *aspired* to learn more about the general reaction to Apple's announcement by taking an initial look at the data from Twitter's firehose, and it's fair to say that we learned a few things about the data without too much effort. Lots more could be discovered, but a few of the themes that we were able to glean included...\n", "\n", "What about the sentiment? Did the specific product make any difference in the sentiment? And in the amount of tweets?\n", "\n", "What other impressions you got after running the analysis?\n", "\n", "
\n", "
\n", "\n", "*The real apple watch*\n", "
\n" ] } ], "metadata": {} } ] }