diff --git a/code/url-analyzer.ipynb b/code/url-analyzer.ipynb index 5cdc6f5..4a0719a 100644 --- a/code/url-analyzer.ipynb +++ b/code/url-analyzer.ipynb @@ -1,5 +1,18 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# URL domain regisrtrar variation analysis\n", + "\n", + "Author: Pekka Helenius, 2021\n", + "\n", + "- Analyzes given URLs and stores results into a new JSON data file\n", + "- Outputs associated domain registrars for each input URL as a plot\n", + " - \"Phishing campaigns register domains of websites from the same registrar (than the legitimate URL)\"" + ] + }, { "cell_type": "code", "execution_count": 3, @@ -9,3184 +22,80 @@ "name": "stdout", "output_type": "stream", "text": [ - "Generating statistics: https://hoxhunt.com/\n" + "URL data: https://hoxhunt.com/\n", + "URL data: https://hs.fi\n", + "URL data: https://ts.fi\n", + "URL data: https://facebook.com\n", + "Generate statistics: https://hoxhunt.com/\n" ] }, { "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.');\n", - " };\n", - "}\n", - "\n", - "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = (this.ws.binaryType != undefined);\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById(\"mpl-warnings\");\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent = (\n", - " \"This browser does not support binary websocket messages. \" +\n", - " \"Performance may be slow.\");\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = $('
');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " fig.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '
');\n", - " var titletext = $(\n", - " '
');\n", - " titlebar.append(titletext)\n", - " this.root.append(titlebar);\n", - " this.header = titletext[0];\n", - "}\n", - "\n", - "\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._init_canvas = function() {\n", - " var fig = this;\n", - "\n", - " var canvas_div = $('
');\n", - "\n", - " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", - "\n", - " function canvas_keyboard_event(event) {\n", - " return fig.key_event(event, event['data']);\n", - " }\n", - "\n", - " canvas_div.keydown('key_press', canvas_keyboard_event);\n", - " canvas_div.keyup('key_release', canvas_keyboard_event);\n", - " this.canvas_div = canvas_div\n", - " this._canvas_extra_style(canvas_div)\n", - " this.root.append(canvas_div);\n", - "\n", - " var canvas = $('');\n", - " canvas.addClass('mpl-canvas');\n", - " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", - "\n", - " this.canvas = canvas[0];\n", - " this.context = canvas[0].getContext(\"2d\");\n", - "\n", - " var backingStore = this.context.backingStorePixelRatio ||\n", - "\tthis.context.webkitBackingStorePixelRatio ||\n", - "\tthis.context.mozBackingStorePixelRatio ||\n", - "\tthis.context.msBackingStorePixelRatio ||\n", - "\tthis.context.oBackingStorePixelRatio ||\n", - "\tthis.context.backingStorePixelRatio || 1;\n", - "\n", - " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband = $('');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('
');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " // put a spacer in here.\n", - " continue;\n", - " }\n", - " var button = $('');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = $('');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = $('
');\n", - " var button = $('');\n", - " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", - " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", - " buttongrp.append(button);\n", - " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", - " titlebar.prepend(buttongrp);\n", - "}\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(el){\n", - " var fig = this\n", - " el.on(\"remove\", function(){\n", - "\tfig.close_ws(fig, {});\n", - " });\n", - "}\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(el){\n", - " // this is important to make the div 'focusable\n", - " el.attr('tabindex', 0)\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " }\n", - " else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " var manager = IPython.notebook.keyboard_manager;\n", - " if (!manager)\n", - " manager = IPython.keyboard_manager;\n", - "\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which == 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " fig.ondownload(fig, null);\n", - "}\n", - "\n", - "\n", - "mpl.find_output_cell = function(html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiYAAAJICAYAAABVMC9sAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzdedzlc/3/8cfLzDD2JcPYiShalEnFlyRraVOSKJWoJCVKaZtWQlIpRZSlsrRY+klFaZGEElkryT5GtrGE4fX74/0+5szVdc1c5rrOdT7nOo/77Ta3uc7nLJ/357rOOZ/n571GZiJJktQEC3W7AJIkSS0GE0mS1BgGE0mS1BgGE0mS1BgGE0mS1BgGE0mS1BgGEzVKRKweEQ9ExIRul6UTIuKqiNhijPb13Yj43Ahf46CI+PY87n9bRPx+JPvoZxGxZkRkREwcw31eGBHPrz9Pj4iTx2rfIzFa77WIWDQizo6I+yLi9IjYNSJ+Ue9bJCKujYgVRl5iLSiDiYiIGyPi4YiYFRH3RsQfIuLdETHm74/MvCkzl8jMx8d632MhMzfIzAuG89h6wlqnw0Wap8z8Qma+s5ZnxCfR+l7basC2J084NZS2/j1R35et27vWE2lGxL4DXuMDdfv0enuLiLhllMrUOu5WOW6MiI/M7zVG21M5pnm8xquAWZn5l2E+fq7jGosgFRHHRMReQ90eBW8AVgSelpk7Zeb3MnMbgMx8BDgeOHAU96enyGCilldl5pLAGsAhlA/mcd0tkvpNDaVLZOYSwE2U92Vr2/fqw64Hdh/w1LfW7Z20TC3XG4BPRMTWHd5fJ7wbOKnbhZiP7YBz5nF7pNYArs/M2UPc/31g94hYZBT3qafAYKK5ZOZ9mXkWsDPlw/lsgIhYOiJOjIiZEfHviPh4q0alXl1eGBFfrjUuN0TEJnX7zRFxZ0Q8eSKJiFdGxF8i4v56//S2++a6IouICyLis/X1Z0XELyJi+Xrf5Ig4OSL+U/d7SUSsONhxRcRHIuKf9TWujojXtd23TkT8plbt3hURp9btUY/pznrfFcP5fdT794yIa9r294K6/ckr0IjYOCIuqmW/PSKOioiF632/rS/113qVvnPdvkNEXB5zarae27bP50fEn+s+TwUmD/V3rmXeqP68W/2dr19vvzMizqg/t1f1t8p0by3TS9pe7/CIuCci/hUR2w+131FyCbBYRGxQ970BsGjd3nGZeSlwFbDhU31uREyov6u7IuIG4JUD7n972/vmhoh4V92+OPAzYOWYU3Oz8rzeQ4Pse2FgS+A3A+5auL6XZ0VpapxWH38SsDpwdt3fhxnkPRBzPv9fq5+TayPi5W37fVs9lln1/bHrPH4/zwXuzcxbBrtdtw36XhvOfiLi08AngZ1r+feIAU1EdV/3AC8eqpzqLIOJBpWZfwJuATarm74GLA08HXgp5Qr17W1PeRFwBfA0yhXHKcALgXWA3YCjImKJ+tgH6/OXoXwxvyciXjuP4ry57msFYGHggLp991qm1ep+3w08PMRr/LMey9LAp4GTI2Klet9ngV8AywKr1mMF2AbYHFi3lnVn4D/z+31ExE7A9LptKeDVbc9r9ziwH7A88BLg5cDeAJm5eX3M82ptwak13BwPvKse77eAs6K0iy8MnEG5Gl4OOB14/RC/Cygnpy3qz5sDN9TjaN0eePJqbYdac5CZF9XbLwKuq8dxKHBcRMQ89j0aTqL8fqG8D07s8P6eFBEvBp4N/GMBnr4nsAPwfGAapfal3Z31/qUo76cvR8QLMvNBYHvgtrYapNuYx3toEM8Anmg/yVevpnxelwHOAo4CyMy3MHet1aHM+z1wQy3Hp4AfR8RyNVB9Fdi+1shuAlwOT/YnuzciVm8ryyuA/zeP24O+1+a1n3aZ+SngC8CptfxD1QpfAzxviPvUYQYTzcttwHJROqLuDHw0M2dl5o3Al4C3tD32X5n5ndo35FRKWPhMZj6Smb8AHqWEFDLzgsy8MjOfyMwrgB8w56Q4mO9k5vWZ+TBwGnOuVB+jnKDXyczHM/OyzLx/sBfIzNMz87a6z1OBvwMbt73OGsDKmfnfzPx92/YlgWcCkZnXZObtw/h9vBM4NDMvyeIfmfnvQcp0WWb+MTNn19f41nx+D3sC38rMi+vxngA8QrmyezEwCTgyMx/LzB8y7xqE37TtazPg4LbbL2XwYDKUf2fmsfVvfwKwEqUNfyhn1BPSvRFxL/CNp7CvlpOBXSJiEvCmervT7oqIh4GLKGU+YwFe442Uv9HNmXk35ff+pMz8f5n5z/q++Q0lMG822AvVxz+V99AywKxBtv8+M8+pf7+TWLAT8p3Mee+dSgkPrdqgJ4BnR8SimXl7Zl5Vy35TZi6TmTe1vc4rmbvZZuDteb3XBt3PAppF+X2pCwwmmpdVgLspVycLA+0n13/X+1tmtP38MEBmDty2BEBEvCgifh2lGeQ+Sk3H8vMoxx1tPz/Ueh3Kl+jPgVMi4raIOLSeqP5HRLy1rQnkXsoVb2ufHwYC+FOtyn5HLf+vKFePXwdmROmEt9Qwfh+rUWpo5iki1o2In0bEHRFxP+VKbl6/hzWA/Qec1FcDVq7/bs25V+X8nzDU5jfAZhExFZhACZObRsSalJqg/7nanIcn/z6Z+VD9cYkhHgvw2npCWiYzl2HoK/wh1ZPZPyi/s79n5s1P9TXazKaEunaTKMG03fKU4zqAUts06HttPlYG2ss6198oIraPiD9GxN317/sK5vGeeIrvoXsoQXuggZ+vyfHUO7cO9t5budb07Ez5jN8eEf8vIp45xLEsQ7kI+MNgtweWtf299lT2M0xLAveO4PkaAYOJBhURL6ScaH8P3MWcWoWW1YFbF/Dlv0+pMl4tM5cGvkkJBk9JvTr7dGauT6m63YE51ftPiog1gGOBfSg98ZcB/tbaZ2bekZl7ZubKlGaSb0QdDZOZX83MjYANKE06H2L+v4+bgbWHcQhHA9cCz8jMpYCDmPfv4Wbg8+0n9cxcLDN/ANwOrDKgCWX1wV8GMvMflJPQvsBvM3MW5Ut/L8oV9BODPW0YxzSWTgT2Z+TNODcBaw7YthaDBLtaU/Ul4L8sQKCi/J1Wa7v95N8oSmfLHwGHAyvW9+k5zHlPDPb7fyrvob+X3cQqQ9w/mIH7HOo9MNh77zaAzPx5Zm5Nqd24lvJZHMy2wPk5Z0TewNvzLujw9zMczwL+OoLnawQMJppLRCwVETtQ2pxPrk0uj1OaUD4fEUvWE/0HWfDq8yWBuzPzvxGxMaUPyYKU9WUR8ZzatHI/JSwM9iW2OOULdWZ93tspNSat19kpIlatN++pj308Il5Ya3cmUfrF/Bd4fBi/j28DB0TERrX9e536mMF+D/cDD9Sru/cMuH8GpQ9Ly7HAu2uZIiIWj9KReElK88JsYN+ImBgROzKnqWoov6GEtVazzQUDbg80k1Jd/vQh7h9rp1L6AZ021AOidJBu/zfYSftU4AMR8cz6e50GvIPyGRjKIcCHI6K9g/GkAfsarNbhNMrfaNWIWBZoH3a8MLAI5fc8O0rHzm3a7p8BPC0ilm7bNr/30JMy8zHgPObdXDjQwPfgUO+BFepxTYrSx+pZwDkRsWJEvLr2AXkEeIDBP6Mw/2acIT3F/czvtVah9NP644I8XyNnMFHL2RExi3JV/jHgCObu3Po+ysn5BkotyvcpHTEXxN7AZ+r+Psk8TizzMRX4IeWL+RrKCfV/wlJmXk3pA3IR5Yv2OcCFbQ95IXBxRDxAqcl5f2b+i9IB8VhKWPk3pQPr4fU5Q/4+MvN04PN12yxKX4TlBin/AZRQNqvu59QB908HTqjNNm/MMhpkT0rz0j2Upoy31X0+CuxYb99Dqdb+8aC/tTl+Qzmx/XaI23OpVeefBy6sZerqqIXMfDgzz6t9jwazCqUJsf3fYDVZxwLfAc4G7qPUwHwsM8+dx+7/H+X3vGfbtnMG7Gv6EPv6OeVq/M+0/Y1qrdW+lM/DPZT3xllt919L6Y91Q/39r8z830MDfYu5+4bNz8HAx+v+DpjHe+BiSufau+r9b8jM/1DOMftTak/upoSivWGuyRRXr4Fxa+Dcet9ct4dhXvvZrH62h+vNwAlZ5jRRF8TczYKSpPEsytDY9+UwJ1kbxuu9DXhnZv7fCF5jY+CozNx4sNtjpTan/RXYPDPvHMt9a44xmwZZktR9IwkQHfap+dzuuFpLMpJOsxoFBhNJUldlmTdpyNvqLzblSJKkxrDzqyRJagyDiSRJaoye6GOy/PLL55prrtntYkiSpFFw2WWX3ZWZUwa7ryeCyZprrsmll17a7WJIkqRREBFDLplhU44kSWoMg4kkSWoMg4kkSWoMg4kkSWoMg0mHXXzxxWyyySZsttlm7Lffflx++eVsscUWbLHFFqy11loceeSR3S6iJEmN0ROjcnrZGmuswa9+9SsmT57MrrvuyoQJE7jgggsAeM1rXsMOO+zQ3QJKktQgBpMOmzp16pM/T5w4kQkTJgDw4IMPcscdd7DOOut0q2iSJDWOTTlj5IorruCuu+5i/fXXB+BnP/sZ2223XZdLJUlSsxhMxsDdd9/NPvvsw3HHHffktp/85CfsuOOOXSyVJEnNYzDpsNmzZ7Pbbrtx2GGHPdms89hjj3HNNdfwvOc9r8ulkySpWexj0mGnn346l1xyCQceeCAABx98MPfffz9bbrlll0smSVLzRGZ2uwzzNW3atHStHEmSxoeIuCwzpw12n005kiSpMQwmkiSpMQwmkiSpMQwmkiSpMQwmkiSpMQwmkiSpMfo+mExddSoR0ZP/pq46df4HKElSD+n7CdZm3DoDpne7FAtmxvQZ3S6CJEmjqu9rTCRJUnMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmMYTCRJUmN0LJhExGoR8euIuCYiroqI99ft0yPi1oi4vP57RafKIEmSesvEDr72bGD/zPxzRCwJXBYRv6z3fTkzD+/gviVJUg/qWDDJzNuB2+vPsyLiGmCVTu1PkiT1vjHpYxIRawLPBy6um/aJiCsi4viIWHaI5+wVEZdGxKUzZ84ci2JKkqQu63gwiYglgB8BH8jM+4GjgbWBDSk1Kl8a7HmZeUxmTsvMaVOmTOl0MSVJUgN0NJhExCRKKPleZv4YIDNnZObjmfkEcCywcSfLIEmSekcnR+UEcBxwTWYe0bZ9pbaHvQ74W6fKIEmSeksnR+VsCrwFuDIiLq/bDgJ2iYgNgQRuBN7VwTJIkqQe0slROb8HYpC7zunUPiVJUm9z5ldJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYBhNJktQYHQsmEbFaRPw6Iq6JiKsi4v11+3IR8cuI+Hv9f9lOlUGSJPWWTtaYzAb2z8xnAS8G3hsR6wMfAc7PzGcA59fbkiRJnQsmmXl7Zv65/jwLuAZYBXgNcEJ92AnAaztVBkmS1FvGpI9JRKwJPB+4GFgxM2+HEl6AFcaiDJIkqfk6HkwiYgngR8AHMvP+p/C8vSLi0oi4dObMmZ0roCRJaoyOBpOImEQJJd/LzB/XzTMiYqV6/0rAnYM9NzOPycxpmTltypQpnSymJElqiE6OygngOOCazDyi7a6zgN3rz7sDZ3aqDJIkqbdM7OBrbwq8BbgyIi6v2w4CDgFOi4g9gJuAnTpYBkmS1EM6Fkwy8/dADHH3yzu1X0mS1Luc+VWSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDWGwUSSJDXGfINJRJw0nG2SJEkjNZwakw3ab0TEBGCjzhRHkiT1syGDSUR8NCJmAc+NiPvrv1nAncCZY1ZCSZLUN4YMJpl5cGYuCRyWmUvVf0tm5tMy86NjWEZJktQnJs7vAZn50YhYBVij/fGZ+dtOFkySJPWf+QaTiDgEeBNwNfB43ZyAwUSSJI2q+QYT4HXAepn5SKcLI0mS+ttwRuXcAEzqdEEkSZKGU2PyEHB5RJwPPFlrkpn7dqxUkiSpLw0nmJxV/0mSJHXUcEblnDAWBZEkSRrOqJx/UUbhzCUzn96REkmSpL41nKacaW0/TwZ2ApbrTHEkSVI/m++onMz8T9u/WzPzSGDLMSibJEnqM8NpynlB282FKDUoS3asRJIkqW8NpynnS20/zwZuBN7YkdJIkqS+NpxROS8bi4JIkiTNt49JRCwdEUdExKX135ciYulhPO/4iLgzIv7Wtm16RNwaEZfXf68Y6QFIkqTxYzhT0h8PzKI037wRuB/4zjCe911gu0G2fzkzN6z/zhluQSVJ0vg3nD4ma2fm69tufzoiLp/fkzLztxGx5oIWTJIk9Z/h1Jg8HBH/17oREZsCD49gn/tExBW1qWfZoR4UEXu1mo9mzpw5gt1JkqReMZxg8h7g6xFxY0TcCBwFvHsB93c0sDawIXA7c4/4mUtmHpOZ0zJz2pQpUxZwd5IkqZcMZ1TO5cDzImKpevv+Bd1ZZs5o/RwRxwI/XdDXkiRJ489wRuV8ISKWycz7M/P+iFg2Ij63IDuLiJXabr4O+NtQj5UkSf1nOE0522fmva0bmXkPMN9hvhHxA+AiYL2IuCUi9gAOjYgrI+IK4GXAfgtYbkmSNA4NZ1TOhIhYJDMfAYiIRYFF5vekzNxlkM3HPcXySZKkPjKcYHIycH5EfAdI4B3ACR0tlSRJ6kvD6fx6aG162QoI4LOZ+fOOl0ySJPWd4dSYkJnnAud2uCySJKnPDafzqyRJ0pgwmEiSpMYwmEiSpMaYbx+TujbOdGCN+vgAMjOf3tmiSZKkfjOczq/HUSZCuwx4vLPFkSRJ/Ww4weS+zPxZx0siSZL63nCCya8j4jDgx8AjrY2Z+eeOlUqSJPWl4QSTF9X/p7VtS2DL0S+OJEnqZ8OZ+fVlY1EQSZKkIYNJROyWmSdHxAcHuz8zj+hcsSRJUj+aV43J4vX/JceiIJIkSUMGk8z8Vv3/02NXHEmS1M+GM8HaZGAPYANgcmt7Zr6jg+WSJEl9aDhT0p8ETAW2BX4DrArM6mShJElSfxpOMFknMz8BPJiZJwCvBJ7T2WJJkqR+NJxg8lj9/96IeDawNLBmx0okSZL61nAmWDsmIpYFPgGcBSwBfLKjpZIkSX1pOBOsfbv++BvAFYUlSVLHDGdUzjLAWynNN08+PjP37VyxJElSPxpOU845wB+BK4EnOlscSZLUz4YTTCZn5qDT0kuSJI2mYc1jEhF7RsRKEbFc61/HSyZJkvrOcGpMHgUOAz4GZN2W2BFWkiSNsuEEkw9SJlm7q9OFkSRJ/W04TTlXAQ91uiCSJEnDqTF5HLg8In4NPNLa6HBhSZI02oYTTM6o/yRJkjpqODO/nhARCwPr1k3XZeZj83qOJEnSghjOzK9bACcANwIBrBYRu2fmbztbNEmS1G+G05TzJWCbzLwOICLWBX4AbNTJgkmSpP4znFE5k1qhBCAzrwcmda5IkiSpXw2nxuTSiDgOOKne3hW4rHNFkiRJ/Wo4weQ9wHuBfSl9TH4LfKOThZIkSf1pOKNyHomIk4CTMnPmGJRJkiT1qSH7mEQxPSLuAq4FrouImRHxybErniRJ6ifz6vz6AWBT4IWZ+bTMXA54EbBpROw3JqWTJEl9ZV7B5K3ALpn5r9aGzLwB2K3eJ0mSNKrmFUwmDbaicO1n4nBhSZI06uYVTB5dwPskSZIWyLxG5TwvIu4fZHsAkztUHkmS1MeGDCaZOWEsCyJJkjScKeklSZLGhMFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1hsFEkiQ1RseCSUQcHxF3RsTf2rYtFxG/jIi/1/+X7dT+JUlS7+lkjcl3ge0GbPsIcH5mPgM4v96WJEkCOhhMMvO3wN0DNr8GOKH+fALw2k7tX5Ik9Z6x7mOyYmbeDlD/X2GoB0bEXhFxaURcOnPmzDEroCRJ6p7Gdn7NzGMyc1pmTpsyZUq3iyNJksbAWAeTGRGxEkD9/84x3r8kSWqwsQ4mZwG71593B84c4/1LkqQG6+Rw4R8AFwHrRcQtEbEHcAiwdUT8Hdi63pYkSQJgYqdeODN3GeKul3dqn5Ikqbc1tvOrJEnqPwYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGAYTSZLUGBO7sdOIuBGYBTwOzM7Mad0ohyRJapauBJPqZZl5Vxf3L0mSGsamHEmS1BjdCiYJ/CIiLouIvbpUBkmS1DDdasrZNDNvi4gVgF9GxLWZ+dv2B9TAshfA6quv3o0ySpKkMdaVGpPMvK3+fyfwE2DjQR5zTGZOy8xpU6ZMGesiSpKkLhjzYBIRi0fEkq2fgW2Av411OSRJUvN0oylnReAnEdHa//cz89wulEOSJDXMmAeTzLwBeN5Y71eSJDWfw4UlSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkSVJjGEwkDeriiy9mk002YbPNNmO//fbrdnE6qp+OVWo6g4mkQa2xxhr86le/4ne/+x133nknV155ZbeL1DH9dKxS003sdgEkNdPUqVOf/HnixIlMmDChi6XprH46VqnprDGRNE9XXHEFd911F+uvv363i9Jx/XSsUlNZYyJpSHfffTf77LMPp512WreL0nH9dKxSk1ljImlQs2fPZrfdduOwww6bq6ljPOqnY5WazmAiaVCnn346l1xyCQceeCBbbLEFF110UbeL1DH9dKxS00VmdrsM8zVt2rS89NJLO/LaEQHTO/LSnTcdeuHvJ0lSu4i4LDOnDXafNSaSJKkxDCaSJKkxDCaSJKkxDCaSJKkxDCaSJKkxDCaSJKkxDCZSj5q66lQioif/TV31qU1i1k/HKvU7p6TXqLntttvYYYcduPrqq3nggQeYOHF8vr2acpwzbp3Rs3PwzJg+46k9vo+OtdOa8v7ttH45Thh/x2qNiUbNcsstx/nnn8+LX/zibhelo/rlODU+9cv7t1+OE8bfsfZ2rFKjTJ48mcmTJ3e7GB3XL8ep8alf3r/9cpww/o7VGhNJktQYBhNJktQYBhNJktQYBhONmscee4ytttqKv/71r2y77bZcfPHF3S5SR/TLcWp86pf3b78cJ4y/Y7Xzq0bNpEmTOO+887pdjI7rl+PU+NQv799+OU4Yf8dqjYkkSWoMg4kkSWoMg4kkSWoMg4kkSWoMg4kkSWoMg4kkSWoMg0mf6Kdl4/vpWDW+9NN7t1+OtV+OczQ5j0mf6Kdl4/vpWDW+9NN7t1+OtV+OczRZYyJJkhrDYCJJkhrDYCJJkhrDYCJJkhrDYCJJkhrDYCJJkskn39gAACAASURBVBrDYCJJkhrDYCJJkhrDYCJJkhrDYCJJkhqjK8EkIraLiOsi4h8R8ZFulEGSJDXPmAeTiJgAfB3YHlgf2CUi1h/rckiSpObpRo3JxsA/MvOGzHwUOAV4TRfKIUmSGqYbwWQV4Oa227fUbZIkqc9FZo7tDiN2ArbNzHfW228BNs7M9w143F7AXvXmesB1Y1rQ0bE8cFe3CzFG+uVY++U4oX+OtV+OE/rnWPvlOKF3j3WNzJwy2B0Tx7oklBqS1dpurwrcNvBBmXkMcMxYFaoTIuLSzJzW7XKMhX451n45TuifY+2X44T+OdZ+OU4Yn8fajaacS4BnRMRaEbEw8CbgrC6UQ5IkNcyY15hk5uyI2Af4OTABOD4zrxrrckiSpObpRlMOmXkOcE439j3Gerop6inql2Ptl+OE/jnWfjlO6J9j7ZfjhHF4rGPe+VWSJGkoTkkvSZIaw2Ai9amIWKTbZZCkgQwmIxQR0e0yaPRExLsjYu06YmzcioiPAjtHxNLdLoukwUXEQhHx5Yh4Q7fLMpYMJgsoIlq/uwldLcgYqOsbjXsR8RXgpZS/6bjtfBURXwSeCZwLzO5ycToqIhbtdhmkBVEvek8HHgD+3HbOGff65kBHU0QslJlPRMTKwHcjYpeIeG63y9UJETEhMx+PiJVrct86ItbrdrlGW0RsASyTmbtk5vWZ+Vi3y9QJdcHMVTNz98y8MzMf7HaZOqX+Tb9SP6fjVnutbUQs082ydFq/XCRVmwIzM/MTdW25J7pdoLFiMFkANZRMAX5Muep8IfCuiHhxd0s2uiJitRpKpgInAf8GNgfeHhEbdLd0o24R4L+tG60v+4hYYpx9Gd4D3NS60Tq2iFglIpbtWqlGWQ0lBwM/BR5q2z7uml6zDq2sy3vsHxGTxuNxRkTU76OFIuKIiFhnwP1dmf6ig+4AZkfEIu1/0/EetMFg8pQMqEp7FPg0ZaK4l9RtO0bEi8a8YB1QQ9bUenMp4BvAqcArgUWBd0TEs7pUvE74AzCj1ig8+WUPvIy5l1DoWfWL7V5g7YjYFyAzH693bwBsNx5CWP2cvgT4eGaeBdzXuq/tJD4u/qYtEfEKYG/gq5n5WNtxHhARK3S3dKOj7TP5DeCxzPxH6756jFtHxKSuFG6U1c/qg0AAa7b/TYE3jfc+JwaTYapp/YmIWDEiNgFmZ+bPgPcCXwO+T1lM6Z/dLOdoiIhNgRmZeUk9gU3MzB9RgtiBlCUEJtGbC0c9KSKWaLv5OPAfYPOIeGG9/9mU431aF4o3aiJip9r8mJn5MGVxzK0i4v0RsVREvAT4PHBTW1DpSRExqVZ5zwae0zruKCZExHI1fG7S5aKOyCA1IvcAJ2bmzLbHLAmclZl3jmnhRln7BWE9pkVpm1SsduCeAvytl5tg63t0WyghLDNvBy4ADo2ITSJigxpAXw1c1sWidpwTrA1DW5+SJSk1JHcAF1HeNMsBbwSeD7yxPcX3oloLsjfwa8qKzi8EVqc05TwXeBewOPD2zLyhW+UcqYh4DbA1MD0z76rbpgI7AC8AFgOeDnwhM8/tWkFHqHb+/AwleB3UaqeuzTZfBG4Fngd8IzPP61pBR0Gt2n8b8BXKiuQbAj8A7qmf3+WAjwGf7OW+NfUiqVUj8n/AnZQO258DPkr5fvoccGVmHjvwOb2krY9bAGsBtwPbAP8HHE65GPwI8L7MvLd7JR25+v1zLnB4Zp7ctn17YH1gTWBJ4NDMvLorhRwjBpP5aAslK1BOWGtl5tER8WZKKLkd+BNAZt7cxaKOWNuxbgS8HvgjpT/CesC6wG+Bh4H/ZOZ4qBn6FKXm5ysDrjQnAssCi2bmTUM9v1fUDpH7UL7UDmrVikTEKpRaosm9/qXeEhFfoPQpOYVSM3Rj/XcecBQwKzP371b5RkMrZETEzpRjfAI4iDLS6kWUptcHMnPvLhZz1NQak5MozRr3AedTgvaelEB2dGae0b0Sjp6IWBM4FjgpM09s2752Zv4zIhbLzIeGev54YTAZhtrR9QTgfmAJSpPGFcBulNqDb2XmI90r4eip1aJPAM8GtqeErpuB51D6Whzay9X9EbFM+0k4IqYDC1PCyYzarLETcEAv94KPiGcCt2TmA/X2MsC+wBKZ+eGIeA7wQUpQub2LRR2xiNiKMoLhuMy8JSIOonxWzwM2otScLAY8lJkfqs/puRqEiJhG6Vvx14jYjHJi/gLwGPBh4LvA1QCZeV99Ts8dJ0BEvA64PjOviogTgdsy8yMR8XLKivTfBK4CnpaZt/bqcQJExLaZ+fO222sC36Y0zZ0YETsCrwHe2/o8j3f2MZmPKLNjHgn8MTPfRHnDtKr7TwC+28uhpPZwb31Zr0q5MvkcpYak1ZSzLvBX4Os9Hko2B37e3qs9M6dTOjLvVdt3Pw38osdDyTTgncC0iFgMoIaxrwL3RMSPgC8D3x8HoWRRSlPje4FTIuJgSk3flpTq/p/XMHJgL4eSalXgW7W59T/ALOCFtfbym5T+UE8fB6FkGWBFSifPKZTmjZ0iYo3MPB84E/gAsHBm3gpzdYztKbW/09ZRRlQBkJk3UkLnLhFxDPAO4PP9EkrAGpNBtdo1227vSulbsXdm/i0i3gg8C/hiZv53qNdpulpFegpwSWYeFhHfoHwJPEzpf7AlpW1zS+DI8fDBiIh3Aq8F9srM29q2H0rpa3F4Zv6yW+UbLbXX/vqU5rdLWn0qaig7EDgvM8/uYhFHLCLWpjRd/Bl4BqUpYzXgDODjlD4JM4HNW5/TXj1Zt0TEqyg1X++m1PTtSvn7nhlleH9PNye31Pfp1sA6lGHfW1OOed/M/HtELN/qG9bLImIy5XtnG+DfA5pvNqZ0St8nM6/rUhG7wmAyQMw9edr7gYuBWyg9wd8CfK1WpS7RyyfqGkq+D7wK2Cgzr42IdwGPUDrzfoTSVg1wWR3N0bMGdBh8J7Aj8K7MvLlegW4JnJ+Z13aznCM14DjfQBkG/LvM/FVEvADYn1IlfO84OEk/h3Ji/jNlNNwUSi3JiZQRYxsB22bmAV0r5CgZ8Hd9LaWG6F2UJqr3UJqx/jzwsb2sfgdvS+mEfhjwcmC/uu2/vXqMtSPvjsDPMvOhKMtfvIByXDdm5gn1s7s6cGxmzupicbvCYDKI2s/iREoouRHYAjiZMmx0W0pqf7Rb5RsNEXEsZcK0C4DPUqpGF6VU93+LctzTgT17/WTdMkg42YbSdPU+4DOZ+ftulm+0DBJO1qFMa/16Si1fz44yGijKRH87AddQmh5XB14MnNP+9xwvJ+uWKKPK3kvp1Pxgq0ljvKnhZCtKn7fPUTpq9+zw53pBeDrlIugbbdtb4WQzysXEisAHM/OarhS0ywwmVaumpP78dOBQYLfM/G9E7ESZy+MHEbHkeEiwEbFmbcskInYADqC0Za5EGfr8POBL4yWUtAw4ae9D6Wvxysz8RXdLNroGCSevo/SH6vlmqoGizDfzBkrHz+soo8ieyMwfdrVgIzCcIBURuwCrZeahw31OE7V/9w5x/6qUi4jfZ+b1Y1ey0VVDyamUZsftM/P2ui0zM2s4eSElbH42x/mQ4HkxmDBX883TgMmUGfdeS2nD/S6lI9IzM/N93StlZ0TExMycHRGvpFST7l+bqub5ZdF08yr/gJP2Gpn577Et3egZ2B9qwH3tx/m0zPzP2JZu7LSFkxspV6Pjpa/FdpRmiwu6XZZOaPvunQBslW2jUwY8bpFeHmQAEBHfogw4+RlllOMPM/Oqel9rCPhClE69Pdt3cTT0fTBpe0OsQJmM6V/ADcAMyrDZHSjzP7x/vFer1erhvShV/o/2ajBp+7ILYGnKEMsHB9SKTcrMx9r+/j13tdkWKheijML5HWWejlvq/Yv2et+glojYEngkMy+cx2OeT5m++ydjV7LOiYjdKEsi7N06KdfOkuNm3pmWKKOpHs/Mj7dtWzYz7+lisUZNlLmRnpWZV9YL4FcBawPfG2+10qOh74cL15PSopTJl87MzHcC/6A0aVxJacd963gPJQCZeSZl9tr/9nAoibZQ8ktKk9znI+LpdfsW9QvvMZgzzLAHQ8m6NZQE8D3KrJBvBN4WEYtHxFrAPvW93dMiYhvKfB1LzetxmfmXXg4l9W/ZbkNgk7ZQsihlDo+Nxrpso639WKOMNFqb0om5tW0l4PtRRl71rCjTMRwFfAh4fb04+g9wDnA9ZUjweFsQdcT6NphE22Jl9aryMuCVUaYFPgu4jdKuOTMz7+hOKbuiZ2cVrB/6VsDYmFKlvxdwOfCh2la9EnBMbc/tSRFxBCUwQ2mvvpVy4n45pcP245SOzFl/7klRLEEZHfeBzPxZRCwbEau2AleU1Z+ndbekIzeg2W3DGp4PAH4UESfBk99TMymd8QcLMj2hNj+2jnW5LMPWzwbWj4hn18/x7ZR5opaY12s1Wf37nEhZOPO7lJnCPxQR69QOvL+mTF752hgniw+Olr5symmrvp9KuQI5h/KB34GyKunnKOtPLJaZ93evpBquAc03Z1DmYlkLeEnd/m7KsOg9I2KjzOzZRbAiYj9Kr/17KO/d3ShB7GjgQsr7d39g3cz8Y7fKOVIRsXRm3hcRXwN+CCxCmdfhBsqFxJmUZtYtgCN6tZavXUTsSWlO/QWwSv15f8pcLNvXx/T8tOS1+fFMSqielZkfioi3U0ZVnZWZf4mIKdm2VESviYgVKTMrv7/eXojSsXWpzPxc3TaVMiOx55k2fVVjUqvVXgEsFGUYWmtF4PdRVmw8H7iUModH+mbpHW0npa9R5gd4E+XveXztOPdNyrBoWqGk1644Y84qq8dRQvQOmXklZVbeGynrhnwH+Elm3t2roSTKKsDLA2fWTq3nUuYQ2oEyw+lbKfN3rEg57ofo0e+yiFi87eenAS8FXpWZH6Mse/GJzDyYUnsAQK+GkgGft/dTJv/bD9g7Io7KzO9Q1h67H6CXQ0m1CLBGlMUjW99RRwEbRZmLhsy8w/PM/+qbGpOYM378n5SZL19PWcDt15QPyO8p1eBnUeYF8M3SA+J/Z+k9A7gvM3evt79ImaDpjb3Wj6Rd+3HWjnRvo5yYnwAOoczzsBrl2IfsINpL6kXE+ynzOVzV6rBc7/sBZfjo13u1k29tTt6eMsfMBOBvlBlr/56ZX60ntAMz88C25/RcJ22Y8/6t38Pvo3zfXk/pH3UiZTbb8zPz010s5ojV8DWNsmTAjZTazK0oHZhb61btC/wlM3/XrXI2XT8Fk0Moq8W2qtWWp3wZHEGZVfCFlGnmP511rQk1W1vzzUKUGq/bMvNPEXE0JVweUB/3jMz8e1cLOwIDjvNgypX0ucBsyhXn5Mz8SDfLOFpqf5GvAZ+i1F625hQ6IDP/HGWOoU9Tqv/3rs/puZN1RKxOaYa6jzIa8BnAypSmjPfUh61AGSr8nkFfpMfUk/YhwDWZ+d3a5+tdlFqwz1IWrbugi0Uckfr5PIGyqOK9lAuFj1HOLTtTauJb61i9PcfBCu2d0pPVnwvoQuCaiHhBRHyd8gZ6N/BcYA/KHAhfM5T0jrY+JWdTOiq/tVYJvwdYISKOrA/9R9cKOUJRhgS3mqnOoQxjfwllLaOVgW8Aj0RZTbinRVkwc3FK4Ho38GPKSJx/AF+MiOdR+tX8ocdDyUTKJHA3UY73D5Q+JdtnmfTws8DfgQtboaTXmh1b6t+sZRNKM1xrjZtHKKPJvg78KDMv6OHjDMrf8JLMfEdmfpAyq/RRlNGBP6TMULw5ZTZtQ8k89FONyaqUjmRTgInAZ4CpwO6UN871/TAkeDyIuecjWYMynXyr6earwF8z87iI2DAzL+9mWUei1vz8ibIcwqLAdpl5WkScTTl5/5uy2vV1rSaOXhVlWOjulONZj7KS7rKU6vBVKTVDawDrtWq/ejSUtDreT6SMENuJ0kfoeuATlGblycBprebkXjzOlojYntLh8wlKc82zgY9SJnK8qI6umtTrTee12e0yYHqWtW5af+edgOdm5ifq43p64sqx0jc1Jlkmnfospc36XVlmhlwfWCkzzzSU9IbaVv1E7cj8espV5/IRsXd9yLnAMgA9Hkq+Qmmi+U5mPla/uE+PssbP+ZQv+fUok471dCgBqFeQEynh5HpKG/0jlIn+vkoZCv3m9ia5XjtZDwgYy1NqDu6mrI2yOqXJ6pXAhu0n6l47TpgzHUNm/oxSy7UhcHOWocGfAo6KiE0y8+FeDyUAmXk3pUboTRGxd9vf7Fog2h5nKBmGid0uwFhq6zi3aJT1Q/aktPepR9QOdK35Aa6tVyX7AF+qzRkvpbTl9qx6NZ2UjpBExJsp/aFuppzI1qJMa/2+Xu47A0/WlCyemVdk5kER8XHg7ZTRRY8DG0TEYpSq/hvqc3ryqrN1soqIt1JqEY6hTOK4LmXStD9S1udqdXLuyZqS+vd5vL6Pdwe+AlwEnBERr87MX0bEUpRalJ5Vv4dOpqy3NTMz/x0Re1BGApJlkb61Kc3KPdlBu1v6pimnXZRJm3YFLsjM67pdHj01EfFy4J2ZuUvbtkUoq8rek5lXdK1wIxRzppk/jLJm0yrAiyhD2ydQFqq7hnIy7+W5WILSufPHlAByNHB6Pfb9KLVex1M6Dj5Yr7x7XkRsQam1/TBlPa67KP1JNgBuah1nD4eSqZl5R/37/pTSJHVCve/tlIVCHwD2yMzbuljUEavHeBGlBnNtSh/FC6MM+/4m5fM6idJx2/PMU9BXNSYtmflARBzbi1ddAsp6RtdEmTXy7ihrpDwnM0/sdsFGojZTza43J1P6G1wJfDgz74mID1Mm/ev5tTXqSXdGlFlsW8vaL1mvLL8cEQdQajSPzMy75vVaTTZIwHgWZZ6OiZQwthdluftzs23l3B4NJZtQmi3uoBznvcCFEfFRSifXT1KaXh/o9VBSBXAKpa/XF4BTIuIKyud2D0owe4+h5Knry2ACtvX1iiGuHG+nTFW9Z0Q8QWmX/8yYF26U5Zx5Hj5I6dB6duu+iNgI2I5xcJz1WCIzL6UsPLh4Zp4YZc6Zl0SZ/PCPwHLjJZTUmpJ7gV9RasJeBlxAubLevD2U9LBr64XCqygn7fMpwes0ymiUHTPz6G4WcCTaOrR+mVITdFGUeZOmU4Z+L0GZn+VtlGHuW3ieWTB90/lVvS0iPhF1PYnaVvsZyjwX9wCfysxfdbN8IxFzZnSFMr36nsB19b7F6pXop4HDs7fneYg6CuMM4OMR8ZIsa4asFRF/AJbOzM0pkx7enZnHtZ7XvVIvuLZQsidlJMq+lE68D1Jmq92Zcszndq2Qo6Cto+vdEbEKZU6WFYBLM/PDwCxKDcKV3SvlyLVdIF0EfDYiXpRlePdJlLWrPl6b4t5MWRDWULKA+rKPiXpPvUq5OTOPqLdXqCe1nhZzr/GzfGbOjIjtgA9Q2uFvjYgplFqFG7ta2FFSO56/hjLT8p8z8w8RcRxlCfieDZgtdYjsBpl5eP27HgMcSwnSe1BqE34CPCszf9u9ko5czJnRNSijii6irBK8DbAwJYysD/wzM3/RvZKOTD2+I4GjM/PaiNiYMlnc+ynNU4cD+2RdCVojY42JGicidm/7eY/649eB+9pqF/aIiPXGvHCjLOfM6HoesH9EnE6ZD+EoSpv1mpk5s9dDSURsERHbR5lx+ULKd89s4LkRsTmlPX75Xq0dGWB94MDapLEQZXXrlesV9I+AVwCzW6Gkl4+5LZR8H1iaMiJuPcpkY1A69Z4xDkLJKyid0I+JiJ9SwuUFlIkOF6XU8h0fbavWa8FZY6LGiYhvUj74+1Am3LqGUvX9CuAr42GExoCakv0px3cSZXbXByht8xtRp9nvXklHpq1d/leU6bh/Qjne3SkTHP6F0j6/AmWa+SOHfLEeERHPogTLWyjv34Uoq5hfA2xJWQvnQ90r4cjF3JMcrkdpxnhL7T90COVC4m/AY5n57y4WdcRqwNyQ0h/qBZTF+R6nfGYPosxOvClwQ2bO6lY5xxNrTNQYEbEwQGa+mzLh1CFZZnQ9G5hJOYG9Icosvj1rQCjZjVL1fTxlmYRDKDMRnwCc08uhpFoEIDO3BD4P/B9lttMlKfN3XEiZSO28Xg4lEbFlRJwdEdOyTNb4NcrIqj0o37NHUzr0ntUKJb1aU1Kbb1qhZFnKKKNHImK1OoT9NEpT5Jp1bo+ePE548m80C1iy9u+6gTKX0PWZeRTl8/ttSgAzlIySvh2Vo+bJzEcjYjKl5uCXwGZ1WPeewFURcQtlZMrSlKvRntTWfHMCcHFmnhRlUbcEbgO2Bj6UmY92s5wjFREvBV4VETOBqzPzi/W4N6WshbMn5aR2Smb+tz6nJ+fvqNYCPlnfp0dTrrB/T6n5uyAzT6YsMdCzk8TBXKPHvk05aZ9PWcPpsIj4E/A6Sp+avSPi0sy8t3ulXTA1kLyBMpLqIuBtUea/+jmwLfCMiHg18NPx0C+qaawxUddFxO4R8Z16cxHgocw8IjNfBywUEWcBZFkmfBZlOF7PXXFGxNo1gEBZs2lhSq0BmXkTZc2Uz1HmtOjZydMAaufAIyhf5DdQZnA9OjMPppzEPpWZX87Me1qhBHpz/g6AenLam3K8S1EmT9uLMvX8oZTak/bH92QogSdHkR1GWeX6FMpw2aMoM6BeRjnuaykTjM0e/FUab0nK5IZbUWq/ng+8vI4IPJcyd8kawGJdK+E4Zh8TNULtVzIjMz8VET+hDDX8fES8iPKF987MvDoidqWsLvuvrhb4KapDnZ9JmXF4a8oX+68p64bckJmH18ct04tXmAPVDsyTM/NbbdsOBO7PzKMj4lTgZ5n53W6VcaQiYq3W+7B24F2IUuv1EspIjfOBJXIcrCQbEe+grF90eW2e2QW4j3KR8D1Kc+Q6mfnriFiJUmM0PXtsvaoaunaiDOm+NjP/US+AtqEsEfHJeoyLUBYffKCLxR23rDFRU/wN2DzK7KZvADaOiCOBrwIfyMyrATLzez0YShbKsk7TrZS+M/dT2qhnUOZjWTMiPlkffl+XijnaZgLrRlnnpuUcygygZObOPR5KFgK+HBGfr5teRTlx/5FS9b8BsOU4CSWHUiaEW4EyKmUxSufPTwCXUGpHfkCpIYEy8+tuPRpKTqDUjmxF6c/2BeBpmflzyoijr0bESzPzEUNJ51hjoq6rX3z3UaqFP0WZ++BwyjTlC2XmX+vjeq7/QduolIUoJ6+HKVfVm1OGjt5KGW64SPb+gnxPp1zs3AcsDrwF+CFlDotHI2Jx4BvAgZl5R31OL/5NW52XFwZOBX5DOSmfXpvkiIhtKH/Ts+fxUo0XZQHJkzJzQr39VeALWdbD2RZ4DmXEykn15N2zIuKHlNW6d623l6GMplqcsg7Oo7UG945eH2nUdHZ+1ZirvfpbK6hOoFx9zcjMf0bEeyhtuItn5vT25/XgCWzRzHy4VgX/Ejg7M4+MsrLqBMrK1lsCO2dmT8+KGREvo4TKSyn9Zr5O6UPzJuDmiLiasmrwjFYogd77m8Jc/UOeT6nx+gDwemD1iHiE0q/igl4PJQCZ+f2IWD8ijgKuAnYBHo6IFSgh8xTgq+Ogo/Ykymd0hYh4Tv083kcJnXtSa4My8+LulbJ/WGOiMdV2tbkQ5Yv9RsqH/jDKpEyXUVYg/XFm/rFrBR2hOvfBA7U9el3gfcDHKCfvOyjV/udTZnvt9Y6um1I6CL4rMy+pt59NWdPoIUrz1XqUlZ8Pqc/puZqSdhGxFaUD72YRMZEypP1uyjpH62TmhV0t4CgYcAFxKKVz7/qZeVOtSdmQMhNqTzWtDqXW6L2CMlfJj7Ks5UREnEiZp+Wmbpavn1hjojFTT0ZP1C/yH1NCSVKuSg6ihJOdKdWmPRtKqnPqsMqdKKNtgnLldT5luPOUWh3c01XC9W+5CeVq8+8AWZZ+f4Qyh8chmXnegJNczw2VbQ9StcZrU+CmOnfHzRHxOkofmmdn5vkDn9NLWuWu79+JmTk7Mz8cZcHMgyJi31qTctZ46meRmQ9GxDmUz+qOdZj7WtTJ/7pauD5jjYnGRG2PfyIzZ0fEeykf/tMoU1nfTakhOSUilswenqho4Em3duC9HvhhZt4ZEc+gVH9/NHt4mu52EbEiZXTGLOD8rMu8R8THKZ18T+ti8UZsQCh5BqVf0FKUEVb3Uppt/hkRC4+DJo3/CY2tcFJ/PpwycdobejFgDketOdmOUnO7AqUj73XdLVV/MZio4+qIk+Upo1GuyzKh2ATgOErNCZQpyt+Xmbd1qZgjFnPP6PoNShB7bz3+JyjHuztlUrVfd7OsIxURU9v7ikTEVEofkvsoa6PcFhHfpvSrObNb5RxNEbEf8FJKLd9ngEcpfYQmASdnXVSyh2tK2ptZv0w5vs9k5qwB4WzdzLy+q4XtsDryaEfgEkPJ2HO4sDoqIg4DlqHMa/B9ykygB9Zq/YUow0ffDHy2l0MJPDmja1BGolwPrBoRh2fmZygTMe1C6SjY66FkS+DzUVY9BqCGlOMpNQmviogzKX1KejaURMQ2EbFZ/XkDYIvMfC3lhH0CpUnuQuDKbFvpuhdDCczVqfeTlOHedwKfiYhV6siyqI8b16EEIDMfoqx2bSjpAmtM1DERsSPlJL1YzplyfBHKlPMnUCahOgg4PjN/2bWCjtCAq8mVgYOzrPFDRJxCGYny/ohYvdc70EXEdpRRKJ+tfUkWybal3mvNyd4AmfnJuq1XaxBOA55LmXDrJkrz42sp6/38nPJ7+P/t3Xu01XWZx/H3B2SCEZWBxsu0HGWURssLKqYrNVExZww10pWlK9LJe2I2UV5CR8cySMdqcvDCmHnN25DTeEEzMlJEDVEwo2SWmtg4ouJtFAJ95o/nu+PnmYNz8Bza+7f357WWi7N/t/Pd7CO/53x/z/N8Px2rSoTr+j6rC/LtT87q4wBFegAADslJREFUTSu5QSeQPVnOjYhnmjlO6xyeMbG1JiKmk5Uol0tar2xbTgYmm5aSvPE1D0r6V4KSTchKlPeWaX/IBnG7SPqnNghKNiLLgBeVoOR9wBmSNi37VWZOJleCkn51vFkX04Cl5EJtm0Z25H0PcDXwATKf5g+faR3fZ/n5fUtpC+AuMpF5x/LIZio5+7d+UwdqHcUzJtbnqhUY5fVEsqHYYRHxWik1HEE+p+9XPbaOyjP5G8gy4CXA98nHGnOBPchqnM8CX4uIWnZ2VTbT2o6sPPkacD+wK9lW/pLVnFO7GYQyI7QDcEXJkzmTLB/9HXAxqxqKDY6I48s5tXufVeXn97ry8mngRmAUmRd2feRqyWZ/NJ4xsT5VfkN+U1I/SUcpV5i9kOzzcEl5PR6Y2ShJbOqA+8YEciXZLwNfIBNdDyC7gh4GDCVbetdq0cEGSfsAU4BHI+KX5PsdD6xsBCWSzmvkYzTU7WZdcii2Ih/RfEfSBDIvajrZ9O8E4DHgq3UPSkow0jCO7LnzSWAR+bN7FbnYYq2rjKye3MfE+lQlAfQa4DUyQfBk8kY2lFy4br/IlYJrSdLpZBfM5yMbab1MWUeErEz5U2BMRFxeHnMcDBwRNVycT9JoMnF5DrBYucjgYmXL9amSjiRnUt6q82cKGUhJuogsB94aGA1sTFZnjCEf4+wQEfOg1kFJ//LLg8h+LC+QAQmRCyxeDmwbERc1c5zWuRyYWJ+Q9BnyZj2fbErULyKOLvteJ3sBTJF0c50z3ZWtuTcgp7x3kfQocDfwI+Bh8gZ+DbnWD+QjgElRw94sykZiY8imd0PIAOtnkuaW4OR4chG3uyJifDmnljfrhohYLmkGsIzsSHwPcAu5RMKNXY6t3fssn8+bZcbk38h1mj4OfF7S35NJvn9NlvabNYUf5VivlZLg/YEXIrtEPg4sLLklAIvJtuSQiXSNafNaUS5tvy/Z2+EqcpbkgxHxJPmo5nfAl4BvR8SMxmOtmgYlG0TEK8AZETGvlDg/RuYK7ahshPcM+f7bIihpKJ/XT8nFJPcClrVLiWzl87kZmAc8XSrmjiIXmBxO5kLNb9IQzZz8ar1TpvL3jIgjyutPAVuS/7DvTiYKbkqWG97WrHH2BUmDyOfvmwHDyte/IVvOLyWTI39f95uzpO3JBN47yLLR/6zs+yT5mGMOMCsi3ijb264LqLID6CHA/0TETc0eT290k5B+QET8h6TrgePIFXTfF2WRunYJMq2ePGNivTWAvIEhaRQ57b+CbOd8MVleemxE3FbHWZKqchO+lSwJHku+r3HAJcAuwPB2+Mc8Ih4BZpElomdIGqdcmI/I9vKPk4823qic01ZBCeTaKcB1bRCUVBPST1AuMHlP2T0bOJBVVTlAPR9TWfvwjIn1SrlhfYzMqVgODIiIl0qZ5b+Xm1xbkTSQrGQYTq6TMrvJQ+pzkg4kkyIfIJvhDQZmkjfqZ9/pXGs95ZeCG4CFZP7M1mQZ+wnk4pn7RM07Elv78IyJ9dYCsiplT+DPSlCyC5k0uaKpI1tLyjP5H5ErAx8oaYMu5Ze1I2knSYeWpmkAvwJOIpuMvUg2GfsLYOcmDdHWUJefyd2A24FvkLN7A8hZkhuBkQ5KrJV4xsR6TdJm5AzCrmRC3TiyEuWupg5sLSs5COvVfQZBufbNN8jmaZ8C9o+IJ0qp8BnA4RHxrLq0n7fW1aXN/BDg5VIOPYnMiZoFXA6c3ZjVdF6JtQoHJtYnJA0A3k+Wlb7Wjo9w2lEJKm8BToyIn0k6jZwJujUiXpb0ZbIL6nOVc3wDa2GNz6c8vrmNrIobBHwOOAb4W7InyykR8YvmjdSsew5MzDqcpH8gH9OcS+aRzCKbxJ0PnANMj4hLmzdC66kuMyX7ATtFxLmSzgC2IBsAjgOebcfcKGsPDkzMOlDJAxpB5o/cAZxI3rSmRsSlksaRwcqLEfGD5o3UeqoRlJSZkpuAAAZGxNiyfwqZsH2oZ7yslTkwMesw5TfpU4AfkssEbA8cTi40uDNwVHkUMLAk+vrxTU2UhNdJwHMRcXHpU/JERJxa9o8oDRDNWlatKwnM7F0ZC0yMiO9GxNnAT8g2+t8je5TcUgKRZY0THJS0LklblwRXyMZ/+wIbAUTEocAISf9c9i9qwhDN1ogDE7POM4RcnA6AiPgX4D5gQkRMBq50IFIPkv4OuBP4tqSREbGEXHRwJ0lHA0TEwcBl5Wt/rtby/CjHrAOUdX42IdfzeZmcNbmpsQaMpA8Du0XEeZVz/PimBsqaVP3JTr3/TXZz/SXZpfiaiLisicMzW2NeXdiszUnaBzibbJZ2OtkU735gf0nDIuI+MvH1qep5DkpaW0lyFbkS8IPAEuAqYG9yFuVbwHOrvYBZi/KMiVmbKomQ65EL7k2LiAskDSXXMLq2HDaRDFT6RcSxzRmp9UbpRTONzC85JyJuLv1nrouIp5s7OrM158DErE1Vykd3Ab4OTImIH0u6ALg4In4jaX1gZUS8Xs7x45sakrQXMDYivlRet91qz9Y5nPxq1oZKO/lLJY0FHgZOBSZJugL4c+AJgIh4xUFJW5gLvEfShtCeqz1b53BgYtZmJI0h176ZBXwIOKi0Hj+N7FlyTUSskPS2HDMHJfUVEa+Qj+c2b/JQzHrNgYlZG5E0mKy4uTciriSTIsdK2ri0ID8MOF/S9hGxspljtb4VEbMj4oFmj8Ost5xjYtZmJH0AGA0MJKttHgZ+D7xAJsLOrvuKyGbWvlwubNYGJH0U+DDZPO1C4ElgV2BuRBxRZlK2BD4eEdPLOc4pMbOW4xkTs5qTtBtZdXMasAPZaOsp4DVgM+BV4CcRsbhpgzQz6yHnmJjVVGmwBZngelVE3BcRU4Efk5U3zwIzyYTI4U0ZpJnZGnJgYlZfG5Y/l1Y3RsRcMiiZFBGPAddGxM//2IMzM3s3HJiY1ZCkvYFpkrYGHgKOlLRfY39E3AD8tnz9eDlH3V3LzKyVOPnVrGYkfYjsU3IK8ExEvCLpZHKF2cHAr4GTgLeVAzvR1czqwMmvZjUj6XBgYERcVtbDobSe3wk4FFiem+LMcryrb8ysNjxjYlY/S4G9JQ2MiGWS1ikByqKI+Er1QAclZlY3zjExq4lKjsjjwOvAZpLWKR1cA/iupFHV4x2UmFndeMbErMWVTq5LI+K/IJNZJS0GjgAWSZoPHAM8X9bEoRznoMTMasc5JmYtrFTaTASuBK4HVjQCDkkfAf6K7Oj6akRMKds9U2JmteXAxKxFSRoBXAKcWPqRNLb3qy5rX33toMTM6s45JmataxiwMCIea1TfFI0ZE0FW5Pxhh4MSM6s5ByZmLUbSluXLp4ClkvqXcuABZfuukjZxEGJm7ciBiVkLKR1drywdXV8ChgInAkTEinLYccCY5ozQzGztco6JWYuQtC2Z5DohIu4p2wYBFwELgT8B/pJMgD2+aQM1M1uLHJiYtYjSuXWfiPhmSXydCDwIzAHWJYMSlXVwnOhqZm3JgYlZk0kaTZb83gv8AJgNbAPcDqwHvBURk7qc46DEzNqSG6yZNVHpU3IaMDUifiVpX2Aj8peGBeWYmyRt23gNrr4xs/blwMSsSUqVzSeAL0TEI6X6ZgmwRGl94DvA4mpQYmbWzhyYmDXXEDJ/hIh4E7JhGrAhcCTwQkRMLNv9+MbM2p5zTMyaSNLBZGByW0Q8X7ZtAuwOzIiIV8s2ByVm1hHcx8SsuWaT1TZ7Svpg2XYOsKuDEjPrRJ4xMWsySZuSDdM+Aywiq3COa+6ozMyaw4GJWYuQNIz8f7LxSMczJWbWcRyYmLUgByVm1qkcmJiZmVnLcPKrmZmZtQwHJmZmZtYyHJiYmZlZy3BgYtYBJL0p6eHKf5u/w7GbSzqsB9d8UtJ7ezGmuyWN+n+OGS3plnf7PXo4jn+UNGZtfg8z6zm3pDfrDG9ExMgeHrs5cBhw7dobTuuIiDObPQYzW8UzJmYdSlJ/SedJelDSfEnHll2TgT3KzMoXy3HnS1pQjptQucwESQ+VfVuV664r6XvluvMkHVS2D5J0XbnG9cCg1YzrbyQtlHQPuchhY/tQSTeX8+dI2q5sP0vSFZLuLLM4n5D0zTKmGWWxRCSdWcb0qKRLJals/76kQ8rXT0o6u5v3tGdltmmepPX68KMwswoHJmadYVDlxvrDsu1zwMsRsTOwM3C0pOHAqcDPI2JkRHwLOAYYDuwQEdsB11Su+3xE7AhcBEws274KzCzX3Qs4T9K6wPHA6+UaXwd26jpISQOBacABwB7AxpXdZwPzyvmnA1dW9m0BfAw4CLga+GlEbAu8UbYDXBgRO0fENmRQNHY1f1fdvaeJwOfLrNMe5bpmthY4MDHrDG+UQGNkRIwr2z4KjJf0MHA/MAwY0c25Y4CLI2IlQES8WNk3vfw5l3wE1LjuqeW6dwMDyfWAPkIGDUTEfGB+N99rK+CJiHi8NJi7urJvd+Cqcv5MYJikDcq+2yNiBbAA6A/MKNsXVMa1l6T7JS0A9gYaaxN11d17uhe4QNJJwJDG34WZ9T3nmJh1LgETIuKOt22URndz3Oo6MS4vf77Jqn9PBBwcEb/ucl3e4TpVqztG73DscoCIeEvSikrX3LeAdcpMzFRgVEQ8LeksMmDqzv95TxExWdKtwP7AHEljImJhD96Lma0hz5iYda47gOMrORjvL49cXgWqORR3AsdJWqccN7QH151QyeHYoWyfBRxetm0DbNfNuQuB4ZK2KK8/XdlXPX80+cjllR68T1gVhDwvaTBwSA/Po3y/LSJiQURMAX5BzuyY2VrgwMSsc/0r8BjwkKRHgUvIGYL5wEpJj0j6Yjnut8B8SY+QFTvv5BxgQDn+0fIaMmdjsKT5wFeAB7qeGBHLyJyWW0vy61OV3WcBo8r5k4HP9vSNRsRLZO7KAuBm4MGenlucXJJmHyHzS25fw/PNrIe8Vo6ZmZm1DM+YmJmZWctwYGJmZmYtw4GJmZmZtQwHJmZmZtYyHJiYmZlZy3BgYmZmZi3DgYmZmZm1DAcmZmZm1jL+F9okwPpSPhf6AAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "
" ] }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] + "metadata": { + "needs_background": "light" }, - "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "Generating statistics: https://ts.fi\n" + "Generate statistics: https://ts.fi\n" ] }, { "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.');\n", - " };\n", - "}\n", - "\n", - "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = (this.ws.binaryType != undefined);\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById(\"mpl-warnings\");\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent = (\n", - " \"This browser does not support binary websocket messages. \" +\n", - " \"Performance may be slow.\");\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = $('
');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " fig.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '
');\n", - " var titletext = $(\n", - " '
');\n", - " titlebar.append(titletext)\n", - " this.root.append(titlebar);\n", - " this.header = titletext[0];\n", - "}\n", - "\n", - "\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._init_canvas = function() {\n", - " var fig = this;\n", - "\n", - " var canvas_div = $('
');\n", - "\n", - " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", - "\n", - " function canvas_keyboard_event(event) {\n", - " return fig.key_event(event, event['data']);\n", - " }\n", - "\n", - " canvas_div.keydown('key_press', canvas_keyboard_event);\n", - " canvas_div.keyup('key_release', canvas_keyboard_event);\n", - " this.canvas_div = canvas_div\n", - " this._canvas_extra_style(canvas_div)\n", - " this.root.append(canvas_div);\n", - "\n", - " var canvas = $('');\n", - " canvas.addClass('mpl-canvas');\n", - " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", - "\n", - " this.canvas = canvas[0];\n", - " this.context = canvas[0].getContext(\"2d\");\n", - "\n", - " var backingStore = this.context.backingStorePixelRatio ||\n", - "\tthis.context.webkitBackingStorePixelRatio ||\n", - "\tthis.context.mozBackingStorePixelRatio ||\n", - "\tthis.context.msBackingStorePixelRatio ||\n", - "\tthis.context.oBackingStorePixelRatio ||\n", - "\tthis.context.backingStorePixelRatio || 1;\n", - "\n", - " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband = $('');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('
');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " // put a spacer in here.\n", - " continue;\n", - " }\n", - " var button = $('');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = $('');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = $('
');\n", - " var button = $('');\n", - " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", - " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", - " buttongrp.append(button);\n", - " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", - " titlebar.prepend(buttongrp);\n", - "}\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(el){\n", - " var fig = this\n", - " el.on(\"remove\", function(){\n", - "\tfig.close_ws(fig, {});\n", - " });\n", - "}\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(el){\n", - " // this is important to make the div 'focusable\n", - " el.attr('tabindex', 0)\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " }\n", - " else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " var manager = IPython.notebook.keyboard_manager;\n", - " if (!manager)\n", - " manager = IPython.keyboard_manager;\n", - "\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which == 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " fig.ondownload(fig, null);\n", - "}\n", - "\n", - "\n", - "mpl.find_output_cell = function(html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], + "image/png": "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\n", "text/plain": [ - "" + "
" ] }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] + "metadata": { + "needs_background": "light" }, - "metadata": {}, "output_type": "display_data" } ], @@ -3220,7 +129,7 @@ "\n", "######################################\n", "\n", - "%matplotlib notebook\n", + "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "\n", "from bs4 import BeautifulSoup as bs\n", @@ -3901,7 +810,7 @@ " fetch_json_data = json_url_data()\n", "\n", " for u in urls:\n", - " print(\"Fetching URL data: %s\" % u)\n", + " print(\"URL data: %s\" % u)\n", " try:\n", " data_parts.update(fetch_json_data.get_url_data(u))\n", " except:\n", @@ -4001,7 +910,7 @@ " # Get URLs from an available JSON data\n", " for key_url in json_data.keys():\n", " \n", - " print(\"Generating statistics: %s\" % key_url)\n", + " print(\"Generate statistics: %s\" % key_url)\n", "\n", " fig = plt.figure()\n", " fig_params = {\n", @@ -4055,18 +964,18 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "## Analysis\n", + "\n", + "| Website | Analysis | Top registrars |\n", + "|--------------|--------------------------------------------------------------------------------|----------------------------------------|\n", + "| HoxHunt | Great variation of different registrars | `MarkMonitor Inc.`, `CloudFlare Inc.` |\n", + "| HS.fi | Average variation of different registrars, relies mostly on its own registrar | `Sanoma` |\n", + "| TS.fi | Great variation of different registrars, uses mostly its own regisrtrar | `TS-Yhtymä Oy` |\n", + "| Facebook | Very low variation of different registrars, relies on a single regisrtrar | `RegistrarSafe LLC` |" + ] } ], "metadata": {