0% found this document useful (0 votes)
1K views320 pages

Corrélation - Transmission de Données - Ipynb

The document defines functions to plot a square wave signal and its autocorrelation function. It initializes libraries for signal processing, sets plotting parameters, and defines a function to plot the correlation between received and transmitted signals.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
1K views320 pages

Corrélation - Transmission de Données - Ipynb

The document defines functions to plot a square wave signal and its autocorrelation function. It initializes libraries for signal processing, sets plotting parameters, and defines a function to plot the correlation between received and transmitted signals.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 320

{

"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Corrélation - transmission de données \n",
"\n",
"Ce notebook illustre l'exercice I.2 du TD 1."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib notebook\n",
"\n",
"\n",
"import numpy as np\n",
"import numpy.random as rd\n",
"import matplotlib.pyplot as plt\n",
"import IPython.display\n",
"import scipy.signal.windows as ww\n",
"import scipy.signal as si\n",
"import scipy.fft as fft\n",
"\n",
"plt.rcParams['figure.figsize'] = (8, 4)\n",
"\n",
"XLIMS = [-50,800]\n",
"\n",
"\n",
"def plot_correl(correl, data, T):\n",
" plt.figure()\n",
" plt.plot(correl, alpha=0.5, label='Corrélation')\n",
" plt.scatter(np.arange(data.shape[0])*T, data, c='r', alpha=0.5, s=60,
label=\"Données transmises\")\n",
" plt.scatter(np.arange(data.shape[0])*T, correl[np.arange(8)*T], c='b',
s=20, label='Données décodées')\n",
" plt.title(\"Corrélation entre signal reçu et forme d'onde\");\n",
" plt.plot(np.zeros(correl.shape))\n",
" plt.xlim(XLIMS);\n",
" plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On défini ici la forme d'onde, prise ici carrée, et on trace sa fonction
d'autocorrélation"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"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 = $('<div/>');\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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all '
+\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\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 = $('<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 = $('<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 = $('<canvas/>');\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 = $('<div/>');\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 = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all
' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\
n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt ===
mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then
trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\
n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id:
this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format =
format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\
n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL ||
window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21)
== \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message
type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \",
msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type +
\"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-
in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from
http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the
document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-
home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-
arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-
right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan
axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"],
[\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"],
[\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-
save\", \"download\"]];\n",
"\n",
"mpl.extensions =
[\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm)
{\n",
" // Create a \"websocket\"-like object which calls the given IPython
comm\n",
" // object with the appropriate methods. Currently this is a non binary\
n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage
function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a
real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id +
\"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in
FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' +
width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\"
width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\"
title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></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 = $('<span class=\"mpl-message\" style=\"text-
align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline
pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\"
title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove
icon-large\"></i></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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 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"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img
src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAGQCAYAAABWJQQ0AAAgAElEQVR
4nO3de5CV5X0H8JeunLNilcV6A2RXMXiJlqTRnqhRGSWNU7VgM1YaU1gnFbwsrWhEsblsYlSoxksGMGodJG
MNW2MlaSolF4NOIoI6QSBgjEaqGypoJ4IkCpHl1z86nHZld13zwNkH/Hxmnj/
23ffwvueZ37jfr3vO2SIAAABqpOjrGwAAAN4/
FBAAAKBmFBAAAKBmFBAAAKBmFBAAAKBmFBAAAKBmFBAAAKBmFBAAAKBmFBAAAKBmFBAAAKBmFBAAAKBmFBA
AAKBmFBAAAKBmFBAAAKBmFBAAAKBmFBAAAKBmFBAAAKBmFBAAAKBmFBAAAKBmFBAAAKBmFBAAAKBmFBAAAK
BmFBAAAKBmFBAAAKBmFBAAAKBmFBAA+tSiRYuiKIpYtGhRX99KRES0trZGUfjxCLCr+C8sQB+79957oyiKL
tc111zT17e3y3VVQJqbm2PUqFF9cj8KCMCu5b+wAH1sewG57rrr4r777uu0li1b1te3t8spIADvL/
4LC9DHtheQp556apf8+9u2bYs333xzl/
zbO4MCAvD+4r+wAH2stwXk7bffjuuuuy6GDx8epVIpmpqa4tprr43Nmzd3Oq+pqSnOPvvsWLhwYRx//
PFRLpfjtttui4iIoiiipaUlHnjggTjmmGOivr4+TjzxxFixYkVERNx5551xxBFHRLlcjlGjRsWaNWt2uI8l
S5bEmWeeGfvtt1/svffecdppp8VPfvKTXj3X9vb2GDt2bAwYMCAOPPDAmDJlSixcuLBXBeQ3v/
lNXHnllXHooYdGqVSKI488Mm6++ebYtm1bp/O2P8f58+fHscceG6VSKT74wQ/Gf/zHf+xwPz/+8Y/
jhBNOiHK5HMOHD48777yz2wJy3333xUc+8pGor6+PQYMGxbhx4+Lll1/
u1fMG4P8oIAB9bHsB+eEPfxivvfZap/X/
NTc3R1EUcd5558Xs2bNjwoQJURRFnHvuuZ3Oa2pqig984AMxaNCgmDZtWtx5553VcF8URYwcOTKGDRsWM2b
MiBkzZsTAgQOjsbExZs2aFR/84Afjlltuic9//vNRKpXi9NNP7/RvP/
LII1EqleKkk06KW265JW677bYYOXJklEqlWLp0aY/P880334wjjzwy6uvr4+qrr47bb789jj/+
+Bg5cuS7FpBt27bFGWecEf369YuLLrooZs2aFX/
xF38RRVHElClTOl2nKIr40Ic+FIMHD46vfOUrcfvtt8fw4cNjwIAB8d///d/
V81asWBF77713NDY2xvTp0+MrX/lKHHzwwdX7+f+uv/
766NevX4wbNy7uuOOO+PKXvxwHHHBAHHbYYfH666/3+LwB6EwBAehjPb0JfbtnnnkmiqKIiy66qNNjr7rqq
iiKIn70ox9VjzU1NUVRFLFw4cIdrlUURZTL5U6/2bjrrruiKIo45JBD4o033qgev/
baa6Moiuq527ZtixEjRsSZZ57Z6bcOb775Zhx++OHxZ3/2Zz0+z9tvvz2KoogHHnigeuy3v/
1tfOADH3jXT8H69re/HUVRxPXXX9/
p+HnnnRf9+vWLF154odNzLJVKnY4tX748iqKImTNnVo+de+65UV9fHy+99FL12OrVq6Ourq7T3v/nf/
5n1NXVxQ033NDp2itXroy99tprh+MA9EwBAehj2wvI7Nmz4wc/
+EGntd2NN94YRVHE6tWrOz32lVdeiaIo4rOf/Wz1WFNTUxx+
+OFdXqsoijjrrLM6HdteblpaWjod3x76H3nkkYiI+OlPfxpFUcQ3vvGNHX5Tc9FFF0W5XI6Ojo5un+cnPvG
JGDx48A4vmbrpppvetYBMmjQp6urqOhWkiIgnnnhih2LR1XOMiNhvv/3iiiuuiIiIrVu3xt577x1//dd/
vcN5Z511VqcCcuutt0a/fv3i+eef3+F5H3PMMfHxj3+82/sGYEcKCEAf6817QC6++OL4gz/4g/jd7363w/
caGhrivPPOq37d1NQUZ5xxRpf/TlEUcckll3Q6tmbNmiiKImbMmNHp+PY3hz/44IMREfEv//
Iv3f6mZvv69a9/3e1zOOqoo+LUU0/d4fh3vvOddy0gZ555ZgwbNmyH4xs2bIiiKOKqq67q8TlG/O+
+XHjhhRHxf8XtC1/4wg7nXXHFFZ0KyKWXXtrjcx45cmS39w3AjhQQgD72XgrI22+/vcP3uiogZ599dpf/
Tle/6dheQG6++eZOx7cXkG9961sRETFv3rzqee/8Tc321VVB2q6WBeSdzzHif/
elubk5It5bAbn44oujX79+sXDhwi6f8xNPPNHtfQOwIwUEoI/
1poB09xKsdevWdfkSrF1RQJ588skoiiLuuuuu9/
T8tvvEJz4RQ4YM2akvwVqyZEmXL8F6twLyXl6Ctf3+nnvuud48TQDehQIC0Md6U0C2v09j0qRJnY5fffXVX
b4JfVcUkI6OjjjiiCNixIgRsWnTph3+7VdffbXH57kz3oR+4403djo+bty4Lt+E/m4FJKL3b0J/
4YUXoq6uLi644IIdytO2bds6fbIWAO9OAQHoY739OyDbP4b3/PPPj9mzZ1e/
7upjeHdFAdl+rL6+PhobG6O1tTXuvvvuaG1tjdNOOy3OOeecHu9/
e9mor6+Pa665pseP4X2njo6OOP3006Nfv34xadKkmD17dowdO7bbj+HtTQFZvnx59bnMmDEjrr/++m4/
hnf69OlRFEWcfPLJcdNNN8XXv/71uPrqq2PEiBE77BsAPVNAAPrYe/lDhF/+8pfj8MMPj/79+8ewYcN6/
EOEXUktIBERy5Yti09+8pPxR3/0R1Eul6OpqSnOP//86qdl9eSll16KMWPGxIABA+KAAw6Iyy+/vMs/
RNiVTZs2xRVXXBFDhgyJ/v37V8N/d3+I8J3eWUAiIh577LE4/vjjo1QqvesfIvzXf/
3XOOWUU2KfffaJffbZJ44+
+uhoaWnx0iyA90gBAQAAakYBAQAAakYBAQAAakYBAQAAakYBAQAAakYBAQAAakYBAQAAakYByUhHR0e0t7f
Hhg0bYuPGjZZlWZZlWVZma8OGDdHe3h4dHR19HR13WwpIRtrb26MoCsuyLMuyLCvz1d7e3tfRcbelgGRkw4
YN1YHu63ZvWZZlWZZl7bi2/w/jDRs29HV03G0pIBnZuHFjFEURGzdu7OtbAQCgC/
JaOgUkIwYaACBv8lo6BSQjBhoAIG/yWjoFJCMGGgAgb/JaOgUkIwYaACBv8lo6BSQjBhoAIG/
yWjoFJCMGGgAgb/JaOgUkIwYaACBv8lo6BSQjBhoAIG/yWjoFJCMGGgAgb/
JaOgUkIwYaACBv8lo6BSQjBhoAIG/yWjoFJCMGGgAgb/JaOgUkIwYaACBv8lo6BSQjBhoAIG/
yWjoFJCMGGgAgb/JaOgUkIwYaACBv8lo6BSQjBhoAIG/yWjoFJCMGGgAgb/
JaOgWkG4899licc845MXjw4CiKIubPn/+uj1m0aFH8yZ/8SZRKpTjiiCPi3nvvfU/
XNNAAAHmT19IpIN1YsGBBfO5zn4uHHnqoVwXkxRdfjAEDBsSVV14Zq1evjpkzZ0ZdXV0sXLiw19c00AAAeZ
PX0ikgvdCbAnL11VfHscce2+nYuHHj4swzz+z1dQw0AEDe5LV0Ckgv9KaAnHrqqXH55Zd3OjZnzpzYb7/9e
n2dWg70tm3b4rdb3rYsy7Isy9oj1rZt23Z5fopQQHYGBaQXelNARowYETfeeGOnYw8//HAURRFvvvlml4/
ZvHlzbNy4sbra29trNtC/
3fJ2NF3z75ZlWZZlWXvE+u2Wt3d5fopQQHYGBaQXdlUBaW1tjaIodlgKiGVZlmVZ1ntbCsjuQwHphV31Eqy
+/A2Il2BZlmVZlrUnLS/B2n0oIL3Q2zehH3fccZ2OfepTn/
ImdACAPYi8lk4B6camTZti2bJlsWzZsiiKIm699dZYtmxZvPTSSxERMW3atBg/fnz1/
O0fwzt16tR49tlnY/bs2T6GFwBgDyOvpVNAurFo0aIu35/R3NwcERHNzc0xatSoHR7z4Q9/
OEqlUgwfPtwfIgQA2MPIa+kUkIwYaACAvMlr6RSQjBhoAIC8yWvpFJCMGGgAgLzJa+kUkIwYaACAvMlr6RS
QjBhoAIC8yWvpFJCMGGgAgLzJa+kUkIwYaACAvMlr6RSQjBhoAIC8yWvpFJCMGGgAgLzJa+kUkIwYaACAvM
lr6RSQjBhoAIC8yWvpFJCMGGgAgLzJa+kUkIwYaACAvMlr6RSQjBhoAIC8yWvpFJCMGGgAgLzJa+kUkIwYa
ACAvMlr6RSQjBhoAIC8yWvpFJCMGGgAgLzJa+kUkIwYaACAvMlr6RSQjBhoAIC8yWvpFJCMGGgAgLzJa+kU
kIwYaACAvMlr6RSQjBhoAIC8yWvpFJCMGGgAgLzJa+kUkIwYaACAvMlr6RSQjBhoAIC8yWvpFJCMGGgAgLz
Ja+kUkIwYaACAvMlr6RSQjBhoAIC8yWvpFJCMGGgAgLzJa+kUkIwYaACAvMlr6RSQjBhoAIC8yWvpFJCMGG
gAgLzJa+kUkIwYaACAvMlr6RSQjBhoAIC8yWvpFJCMGGgAgLzJa+kUkIwYaACAvMlr6RSQjBhoAIC8yWvpF
JCMGGgAgLzJa+kUkIwYaACAvMlr6RSQjBhoAIC8yWvpFJAezJo1K5qamqJcLkelUomlS5f2eP5tt90WRx55
ZNTX18ehhx4aU6ZMibfeeqvX1zPQAAB5k9fSKSDdaGtri1KpFHPmzIlVq1bFxIkTo6GhIdavX9/
l+ffff3+Uy+W4//77Y82aNfG9730vBg8eHFdccUWvr2mgAQDyJq+lU0C6UalUoqWlpfp1R0dHDBkyJKZPn9
7l+S0tLXHGGWd0OnbllVfGxz72sV5f00ADAORNXkungHRhy5YtUVdXF/Pnz+90fMKECTFmzJguH3P//
ffHwIEDqy/
T+uUvfxlHH3103HDDDb2+roEGAMibvJZOAenC2rVroyiKWLx4cafjU6dOjUql0u3jvva1r0X//
v1jr732iqIo4pJLLunxOps3b46NGzdWV3t7u4EGAMiYApJOAenC71NAFi1aFAcffHD80z/
9U6xYsSIeeuihGDZsWFx33XXdXqe1tTWKothhGWgAgDwpIOkUkC78Pi/BOuWUU+Kqq67qdOy++
+6LvffeOzo6Orp8jN+AAADsXhSQdApINyqVSkyePLn6dUdHRwwdOrTbN6F/
5CMfiauvvrrTsW9+85ux9957x9atW3t1TQMNAJA3eS2dAtKNtra2KJfLMXfu3Fi9enVMmjQpGhoaYt26dRE
RMX78+Jg2bVr1/NbW1th3331j3rx58eKLL8b3v//9OOKII+L888/
v9TUNNABA3uS1dApID2bOnBmNjY1RKpWiUqnEkiVLqt8bNWpUNDc3V79++
+2340tf+lIcccQRUV9fH8OGDYvLLrssXn/
99V5fz0ADAORNXkungGTEQAMA5E1eS6eAZMRAAwDkTV5Lp4BkxEADAORNXkungGTEQAMA5E1eS6eAZMRAAw
DkTV5Lp4BkxEADAORNXkungGTEQAMA5E1eS6eAZMRAAwDkTV5Lp4BkxEADAORNXkungGTEQAMA5E1eS6eAZ
MRAAwDkTV5Lp4BkxEADAORNXkungGTEQAMA5E1eS6eAZMRAAwDkTV5Lp4BkxEADAORNXkungGTEQAMA5E1e
S6eAZMRAAwDkTV5Lp4BkxEADAORNXkungGTEQAMA5E1eS6eAZMRAAwDkTV5Lp4BkxEADAORNXkungGTEQAM
A5E1eS6eAZMRAAwDkTV5Lp4BkxEADAORNXkungGTEQAMA5E1eS6eAZMRAAwDkTV5Lp4BkxEADAORNXkungG
TEQAMA5E1eS6eAZMRAAwDkTV5Lp4BkxEADAORNXkungGTEQAMA5E1eS6eAZMRAAwDkTV5Lp4BkxEADAORNX
kungGTEQAMA5E1eS6eAZMRAAwDkTV5Lp4BkxEADAORNXkungGTEQAMA5E1eS6eAZMRAAwDkTV5Lp4BkxEAD
AORNXkungGTEQAMA5E1eS6eAZMRAAwDkTV5Lp4BkxEADAORNXkungPRg1qxZ0dTUFOVyOSqVSixdurTH819
//
fW47LLL4pBDDolSqRQjRoyIhx9+uNfXM9AAAHmT19IpIN1oa2uLUqkUc+bMiVWrVsXEiROjoaEh1q9f3+X5
W7ZsiRNOOCHOOuus+MlPfhJr1qyJRx99NJ555pleX9NAAwDkTV5Lp4B0o1KpREtLS/
Xrjo6OGDJkSEyfPr3L87/+9a/H8OHD43e/+93vfU0DDQCQN3ktnQLShS1btkRdXV3Mnz+/0/
EJEybEmDFjunzMn//5n8enP/
3pmDhxYhx00EFx7LHHxg033BBbt27t9jqbN2+OjRs3Vld7e7uBBgDImAKSTgHpwtq1a6Moili8eHGn41OnT
o1KpdLlY4466qgol8vxmc98Jp5++uloa2uL/
fffP770pS91e53W1tYoimKHZaABAPKkgKRTQLrw+xSQESNGxLBhwzr9xuOWW26JQw45pNvr+A0IAMDuRQFJ
p4B04fd5CdZpp50Wo0eP7nRswYIFURRFbNmypVfXNdAAAHmT19IpIN2oVCoxefLk6tcdHR0xdOjQbt+Efu2
110ZTU1N0dHRUj91+++0xePDgXl/
TQAMA5E1eS6eAdKOtrS3K5XLMnTs3Vq9eHZMmTYqGhoZYt25dRESMHz8+pk2bVj3/5Zdfjn333TcmT54czz
33XPz7v/97HHTQQXH99df3+poGGgAgb/JaOgWkBzNnzozGxsYolUpRqVRiyZIl1e+NGjUqmpubO52/
ePHi+OhHPxrlcjmGDx/+rp+C9U4GGgAgb/JaOgUkIwYaACBv8lo6BSQjBhoAIG/yWjoFJCMGGgAgb/
JaOgUkIwYaACBv8lo6BSQjBhoAIG/yWjoFJCMGGgAgb/JaOgUkIwYaACBv8lo6BSQjBhoAIG/
yWjoFJCMGGgAgb/JaOgUkIwYaACBv8lo6BSQjBhoAIG/yWjoFJCMGGgAgb/
JaOgUkIwYaACBv8lo6BSQjBhoAIG/yWjoFJCMGGgAgb/JaOgUkIwYaACBv8lo6BSQjBhoAIG/
yWjoFJCMGGgAgb/JaOgUkIwYaACBv8lo6BSQjBhoAIG/yWjoFJCMGGgAgb/
JaOgUkIwYaACBv8lo6BSQjBhoAIG/yWjoFJCMGGgAgb/JaOgUkIwYaACBv8lo6BSQjBhoAIG/
yWjoFJCMGGgAgb/JaOgUkIwYaACBv8lo6BSQjBhoAIG/yWjoFJCMGGgAgb/
JaOgUkIwYaACBv8lo6BSQjBhoAIG/yWjoFJCMGGgAgb/JaOgUkIwYaACBv8lo6BSQjBhoAIG/
yWjoFJCMGGgAgb/JaOgUkIwYaACBv8lo6BSQjBhoAIG/yWjoFJCMGGgAgb/
JaOgUkIwYaACBv8lo6BSQjBhoAIG/
yWjoFpAezZs2KpqamKJfLUalUYunSpb163Lx586Ioihg7dux7up6BBgDIm7yWTgHpRltbW5RKpZgzZ06sWr
UqJk6cGA0NDbF+/foeH7dmzZoYOnRonHrqqQoIAMAeRl5Lp4B0o1KpREtLS/
Xrjo6OGDJkSEyfPr3bx2zdujVOPvnkuOeee6K5uVkBAQDYw8hr6RSQLmzZsiXq6upi/
vz5nY5PmDAhxowZ0+3jvvjFL8a5554bEaGAAADsgeS1dApIF9auXRtFUcTixYs7HZ86dWpUKpUuH/PjH/
84hg4dGq+99lpE9K6AbN68OTZu3Fhd7e3tBhoAIGMKSDoFpAvvtYC88cYbcdhhh8WCBQuqx3pTQFpbW6Moi
h2WgQYAyJMCkk4B6cJ7fQnWsmXLoiiKqKurq65+/
fpFv379oq6uLl544YUur+M3IAAAuxcFJJ0C0o1KpRKTJ0+uft3R0RFDhw7t8k3ob731VqxcubLTGjt2bJxx
xhmxcuXK2LJlS6+uaaABAPImr6VTQLrR1tYW5XI55s6dG6tXr45JkyZFQ0NDrFu3LiIixo8fH9OmTev28d6
EDgCw55HX0ikgPZg5c2Y0NjZGqVSKSqUSS5YsqX5v1KhR0dzc3O1jFRAAgD2PvJZOAcmIgQYAyJu8lk4ByY
iBBgDIm7yWTgHJiIEGAMibvJZOAcmIgQYAyJu8lk4ByYiBBgDIm7yWTgHJiIEGAMibvJZOAcmIgQYAyJu8l
k4ByYiBBgDIm7yWTgHJiIEGAMibvJZOAcmIgQYAyJu8lk4ByYiBBgDIm7yWTgHJiIEGAMibvJZOAcmIgQYA
yJu8lk4ByYiBBgDIm7yWTgHJiIEGAMibvJZOAcmIgQYAyJu8lk4ByYiBBgDIm7yWTgHJiIEGAMibvJZOAcm
IgQYAyJu8lk4ByYiBBgDIm7yWTgHJiIEGAMibvJZOAcmIgQYAyJu8lk4ByYiBBgDIm7yWTgHJiIEGAMibvJ
ZOAcmIgQYAyJu8lk4ByYiBBgDIm7yWTgHJiIEGAMibvJZOAcmIgQYAyJu8lk4ByYiBBgDIm7yWTgHJiIEGA
MibvJZOAcmIgQYAyJu8lk4ByYiBBgDIm7yWTgHJiIEGAMibvJZOAcmIgQYAyJu8lk4ByYiBBgDIm7yWTgHJ
iIEGAMibvJZOAcmIgQYAyJu8lk4ByYiBBgDIm7yWTgHJiIEGAMibvJZOAcmIgQYAyJu8lk4ByYiBBgDIm7y
WTgHpwaxZs6KpqSnK5XJUKpVYunRpt+fefffdccopp0RDQ0M0NDTE6NGjezy/
KwYaACBv8lo6BaQbbW1tUSqVYs6cObFq1aqYOHFiNDQ0xPr167s8/4ILLojZs2fHsmXL4tlnn40LL7wwBg4
cGL/
61a96fU0DDQCQN3ktnQLSjUqlEi0tLdWvOzo6YsiQITF9+vRePX7r1q2x7777xje+8Y1eX9NAAwDkTV5Lp4
B0YcuWLVFXVxfz58/vdHzChAkxZsyYXv0bb7zxRtTX18d3v/vdXl/
XQAMA5E1eS6eAdGHt2rVRFEUsXry40/
GpU6dGpVLp1b9x6aWXxvDhw+Ott97q9pzNmzfHxo0bq6u9vd1AAwBkTAFJp4B0IbWATJ8+PQYNGhTLly/
v8bzW1tYoimKHZaABAPKkgKRTQLqQ8hKsm2+
+OQYOHBhPPfXUu17Hb0AAAHYvCkg6BaQblUolJk+eXP26o6Mjhg4d2uOb0P/xH/
8x9ttvv3jiiSd+r2saaACAvMlr6RSQbrS1tUW5XI65c+fG6tWrY9KkSdHQ0BDr1q2LiIjx48fHtGnTqufPm
DEjSqVSPPjgg/
HKK69U16ZNm3p9TQMNAJA3eS2dAtKDmTNnRmNjY5RKpahUKrFkyZLq90aNGhXNzc3Vr5uamrp8P0dra2uvr
2egAQDyJq+lU0AyYqABAPImr6VTQDJioAEA8iavpVNAMmKgAQDyJq+lU0AyYqABAPImr6VTQDJioAEA8iav
pVNAMmKgAQDyJq+lU0AyYqABAPImr6VTQDJioAEA8iavpVNAMmKgAQDyJq+lU0AyYqABAPImr6VTQDJioAE
A8iavpVNAMmKgAQDyJq+lU0AyYqABAPImr6VTQDJioAEA8iavpVNAMmKgAQDyJq+lU0AyYqABAPImr6VTQD
JioAEA8iavpVNAMmKgAQDyJq+lU0AyYqABAPImr6VTQDJioAEA8iavpVNAMmKgAQDyJq+lU0AyYqABAPImr
6VTQDJioAEA8iavpVNAMmKgAQDyJq+lU0AyYqABAPImr6VTQDJioAEA8iavpVNAMmKgAQDyJq+lU0AyYqAB
APImr6VTQDJioAEA8iavpVNAMmKgAQDyJq+lU0AyYqABAPImr6VTQDJioAEA8iavpVNAMmKgAQDyJq+lU0A
yYqABAPImr6
VTQDJioAEA8iavpVNAMmKgAQDyJq+lU0AyYqABAPImr6VTQDJioAEA8iavpVNAMmKgAQDyJq+lU0AyYqABA
PImr6VTQDJioAEA8iavpVNAMmKgAQDyJq+lU0B6MGvWrGhqaopyuRyVSiWWLl3a4/
kPPPBAHHXUUVEul+O4446Lhx9+
+D1dz0ADAORNXkungHSjra0tSqVSzJkzJ1atWhUTJ06MhoaGWL9+fZfnP/
7441FXVxc33XRTrF69Oj7/+c9H//
79Y+XKlb2+poEGAMibvJZOAelGpVKJlpaW6tcdHR0xZMiQmD59epfnn3/+
+XH22Wd3OvbRj340Lr744l5f00ADAORNXkungHRhy5YtUVdXF/
Pnz+90fMKECTFmzJguHzNs2LC47bbbOh374he/
GCNHjuz2Ops3b46NGzdWV3t7u4EGAMiYApJOAenC2rVroyiKWLx4cafjU6dOjUql0uVj+vfvH9/85jc7HZs
9e3YcdNBB3V6ntbU1iqLYYRloAIA8KSDpFJAu1KqA+A0IAMDuRQFJp4B0oVYvwXonAw0AkDd5LZ0C0o1KpR
KTJ0+uft3R0RFDhw7t8U3o55xzTqdjJ510kjehAwDsQeS1dApIN9ra2qJcLsfcuXNj9erVMWnSpGhoaIh16
9ZFRMT48eNj2rRp1fMff/zx2GuvveKrX/
1qPPvss9Ha2upjeAEA9jDyWjoFpAczZ86MxsbGKJVKUalUYsmSJdXvjRo1Kpqbmzud/
8ADD8SRRx4ZpVIpjj32WH+IEABgDyOvpVNAMmKgAQDyJq+lU0AyYqABAPImr6VTQDJioAEA8iavpVNAMmKg
AQDyJq+lU0AyYqABAPImr6VTQDJioAEA8iavpVNAMmKgAQDyJq+lU0AyYqABAPImr6VTQDJioAEA8iavpVN
AMmKgAQDyJq+lU0AyYqABAPImr6VTQDJioAEA8iavpVNAMmKgAQDyJq+lU0AyYqABAPImr6VTQDJioAEA8i
avpVNAMmKgAQDyJjtwO+0AAAjLSURBVK+lU0AyYqABAPImr6VTQDJioAEA8iavpVNAMmKgAQDyJq+lU0Ays
mHDhiiKItrb22Pjxo2WZVmWZVlWZqu9vT2KoogNGzb0dXTcbSkgGdk+0JZlWZZlWVbeq729va+j425LAclI
R0dHtLe3x4YNG2ra4P3GxT7v7sse2+c9Zdlj+7ynrD15jzds2BDt7e3R0dHR19Fxt6WAvI9t3Og1jLVgn3c
9e1wb9nnXs8e1YZ93PXtMTxSQ9zH/cagN+7zr2ePasM+7nj2uDfu869ljeqKAvI/
5j0Nt2Oddzx7Xhn3e9exxbdjnXc8e0xMF5H1s8+bN0draGps3b+7rW9mj2eddzx7Xhn3e9exxbdjnXc8e0x
MFBAAAqBkFBAAAqBkFBAAAqBkFBAAAqBkFBAAAqBkF5H1s1qxZ0dTUFOVyOSqVSixdurSvb2m39dhjj8U55
5wTgwcPjqIoYv78+Z2+v23btvjCF74QhxxySNTX18fo0aPjF7/4RR/d7e7pxhtvjBNOOCH+8A//
MA488MAYO3Zs/PznP+90zltvvRWXXXZZ7L///rHPPvvEJz/5yVi3bl0f3fHu6Y477og//uM/
jn333Tf23XffOPHEE2PBggXV79vjnW/69OlRFEVcfvnl1WP2OV1ra2sURdFpHXXUUdXv2+Od41e/
+lV8+tOfjv333z/q6+vjuOOOi6eeeqr6fT//6IoC8j7V1tYWpVIp5syZE6tWrYqJEydGQ0NDrF+/
vq9vbbe0YMGC+NznPhcPPfRQlwVkxowZMXDgwPj2t78dy5cvjzFjxsThhx8eb731Vh/
d8e7nzDPPjHvvvTd+9rOfxTPPPBNnnXVWNDY2xm9+85vqOZdcckkMGzYsHnnkkXj66afjxBNPjJNPPrkP73
r382//9m/x8MMPxy9+8Yt47rnn4h/+4R+if//+8bOf/
Swi7PHO9uSTT8Zhhx0WI0eO7FRA7HO61tbWOPbYY+OVV16prtdee636fXuc7te//
nU0NTXFhRdeGEuXLo0XX3wxvve978ULL7xQPcfPP7qigLxPVSqVaGlpqX7d0dERQ4YMienTp/
fhXe0Z3llAtm3bFoccckjcfPPN1WMbNmyIcrkc8+bN64tb3CO8+uqrURRFPPbYYxHxv3vav3//+Na3vlU95
9lnn42iKOKJJ57oq9vcIwwaNCjuuecee7yTbdq0KUaMGBE/
+MEPYtSoUdUCYp93jtbW1vjQhz7U5ffs8c5xzTXXxCmnnNLt9/38ozsKyPvQli1boq6ubof/
Sz9hwoQYM2ZMH93VnuOdBeSXv/xlFEURy5Yt63TeaaedFn//939f69vbYzz//
PNRFEWsXLkyIiIeeeSRKIoiXn/
99U7nNTY2xq233toXt7jb27p1a8ybNy9KpVKsWrXKHu9kEyZMiClTpkREdCog9nnnaG1tjQEDBsTgwYPj8M
MPjwsuuCBeeumliLDHO8sxxxwTU6ZMifPOOy8OPPDA+PCHPxx333139ft+/
tEdBeR9aO3atVEURSxevLjT8alTp0alUumju9pzvLOAPP7441EURfzXf/1Xp/P+6q/+Ks4///
xa394eoaOjI84+++z42Mc+Vj12//33R6lU2uHcP/
3TP42rr766lre321uxYkXss88+UVdXFwMHDoyHH344IuzxzjRv3rw47rjjqi9D+f8FxD7vHAsWLIgHHnggl
i9fHgsXLoyTTjopGhsb44033rDHO0m5XI5yuRzXXntt/PSnP4277ror6uvrY+7cuRHh5x/
dU0DehxSQXUsB2fUuueSSaGpqivb29uoxgWLn2bJlSzz//
PPx9NNPx7Rp0+KAAw6IVatW2eOd5OWXX46DDjooli9fXj2mgOx6r7/+euy3335xzz332OOdpH///
nHSSSd1OvZ3f/d3ceKJJ0aEn390TwF5H/
ISrF3LS7B2rZaWljj00EPjxRdf7HTcSyp2ndGjR8ekSZPs8U4yf/78KIoi6urqqqsoiujXr1/
U1dXFD3/4Q/u8i5xwwgkxbdo0s7yTNDY2xt/
+7d92OnbHHXfEkCFDIsLPP7qngLxPVSqVmDx5cvXrjo6OGDp0qDeh7wTdvQn9q1/9avXYxo0bvQnvPdq2bV
u0tLTEkCFDuvwIx+1vKn3wwQerx37+8597U+lOcPrpp0dzc7M93kneeOONWLlyZad1wgknxN/8zd/
EypUr7fMusmnTphg0aFB87Wtfs8c7yac+9akd3oQ+ZcqU6m9F/
PyjOwrI+1RbW1uUy+WYO3durF69OiZNmhQNDQ0+A/
33tGnTpli2bFksW7YsiqKIW2+9NZYtW1Z9w+OMGTOioaEhvvOd78SKFSti7NixPobwPbr00ktj4MCB8eijj
3b6WM0333yzes4ll1wSjY2N8aMf/
SiefvrpOOmkk3Z4eQA9mzZtWjz22GOxZs2aWLFiRUybNi369esX3//+9yPCHu8q//8lWBH2eWf47Gc/G48+
+misWbMmHn/88fj4xz8eBxxwQLz66qsRYY93hieffDL22muvuOGGG+L555+P+++/PwYMGBD//M//
XD3Hzz+6ooC8j82cOTMaGxujVCpFpVKJJUuW9PUt7bYWLVq0wx+8KooimpubI+L//
hDTwQcfHOVyOUaPHh3PPfdc3970bqar/S2KIu69997qOdv/sNigQYNiwIAB8Zd/
+Zfxyiuv9N1N74Y+85nPRFNTU5RKpTjwwANj9OjR1fIRYY93lXcWEPucbty4cTF48OAolUoxdOjQGDduXKe
/
T2GPd47vfve7cdxxx0W5XI6jjz6606dgRfj5R9cUEAAAoGYUEAAAoGYUEAAAoGYUEAAAoGYUEAAAoGYUEAA
AoGYUEAAAoGYUEAAAoGYUEAAAoGYUEAAAoGYUEAAAoGYUEAAAoGYUEAAAoGYUEAAAoGYUEAAAoGYUEAAAoG
YUEAAAoGYUEAAAoGYUEAAAoGYUEAAAoGYUEAAAoGYUEAAAoGYUEAAAoGb+B+/
EwGnkstXEAAAAAElFTkSuQmCC\" width=\"800\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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 = $('<div/>');\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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all '
+\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\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 = $('<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 = $('<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 = $('<canvas/>');\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 = $('<div/>');\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 = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all
' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\
n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt ===
mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then
trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\
n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id:
this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format =
format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\
n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL ||
window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21)
== \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message
type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \",
msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type +
\"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-
in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from
http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the
document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-
home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-
arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-
right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan
axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"],
[\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"],
[\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-
save\", \"download\"]];\n",
"\n",
"mpl.extensions =
[\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm)
{\n",
" // Create a \"websocket\"-like object which calls the given IPython
comm\n",
" // object with the appropriate methods. Currently this is a non binary\
n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage
function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a
real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id +
\"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in
FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' +
width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\"
width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\"
title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></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 = $('<span class=\"mpl-message\" style=\"text-
align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline
pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\"
title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove
icon-large\"></i></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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 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"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img
src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAGQCAYAAABWJQQ0AAAgAElEQVR
4nOzdaXxU5fn/8UMpBKFV8C+KqASsVKzUpQoFXKhi1WqFn/
uOVitFcMGlBlCMG7igWBVBXAAXBAUFNYSw73sEQtgDBAj7OmHLNnO+/
wdJziQk6CQnmXPPzOf9ep0HTibJzfRquD5kJrEEAAAAAGFieX0AAAAAALGDAAEAAAAQNgQIAAAAgLAhQAAA
AACEDQECAAAAIGwIEAAAAABhQ4AAAAAACBsCBAAAAEDYECAAAAAAwoYAAQAAABA2BAgAAACAsCFAAAAAAIQ
NAQIAAAAgbAgQAAAAAGFDgAAAAAAIGwIEAAAAQNgQIAAAAADChgABAAAAEDYECAAAAICwIUAAAAAAhA0BAg
AAACBsCBAAAAAAYUOAAAAAAAgbAgQAAABA2BAgAACjpKWlKTExUVu2bPH6KACAakCAAACM4fP5dPbZZ+uJJ
54o87YHHnhA8fHxVfr5hg0bJsuylJmZWaUfFwBwfAQIAITZhx9+KMuy1Lp1a1cfZ/
z48UpMTKyaQxni5ptv1q233qpAIFDmbW4CpG/fvho7dmyZ2wkQAAg/
AgQAwqxdu3Zq2rSpLMtSRkZGpT9O9+7dZVnR82U8MzNTffv2VU5OTrlvdxMg9erV0wMPPFDmdr/
fr5ycHNm2XamPCwCouOj5mwsAIsDGjRtlWZa+//
57NWzYUC+99FKlP1YkBMiRI0fKvd22bR09erRCH6s6AgQAEH5m/
80FAFHm1VdfVYMGDZSXl6dHH31UzZs3L/
X26dOny7IsTZ8+vdTtmZmZsixLw4YNk1S4jFuWVeYqdvjwYT399NM688wzVbt2bf3xj39U//79y/2X/
i+//FKtWrXSCSecoPr16+uKK67QxIkTS93nww8/1J/+9CfVrl1bp59+urp166YDBw6Uuk/79u11/
vnnKzU1VVdccYVOOOEEPfnkk5Kk+Ph43XjjjUpJSdEll1yiuLg4vfvuu6XO8Je//
EV16tRRgwYNdOedd5Z5EXp5AdK/f3+1bdtWJ598surUqaO//OUvGj16dKn7lPc4FcfI8Z6CVZE/78qVK/
W3v/1NJ5xwgho3bqw333yzzGMMAAgiQAAgjFq0aKGHH35YkjRr1ixZlqVFixY5bw81QObNm6e///
3vsixLX375pXNJhd9duPrqq1WjRg39+9//1sCBA3XTTTfJsiz16NGj1Md96aWXZFmW2rVrp/79+
+u9997TPffco4SEBOc+iYmJsixL11xzjT744AM99thjqlmzplq1aqX8/
Hznfu3bt1ejRo3UsGFDPf744xoyZIjGjRsnqTBAzjnnHDVo0EA9e/
bURx995PwZX3vtNdWoUUN33nmnBg0apJdfflmnnHKKmjZtWmrpLy9AzjzzTHXr1k0DBw7UgAED1Lp1a1mWp
aSkJOc+X375peLi4nTFFVc4j9O8efMklR8gFfnzNm7cWGeddZaefPJJDRo0SFdffbUsy1JycvJxZwAAYh0B
AgBhkpqaKsuyNHnyZEmFoXDmmWc63yWQQg8Q6fhPwRo3bpwsy9Jrr71W6vbbbrtNNWrU0Pr16yVJGRkZ+s1
vfqObb765zIu+i79Tsnv3btWuXVvXXnttqfsMHDhQlmVp6NChzm3t27eXZVn66KOPypwpPj5elmUpJSWl1O
2bNm1SzZo11bdv31K3p6en67e//
W2p28sLkGOfxpWfn6+WLVvq6quvLnX78Z6CdWyAVObP+8UXXzi35eXlqVGjRrr11lvLfC4AQCECBADC5Kmn
ntJpp50mv9/v3PbMM8+Uuq0qAqRLly6qWbOmDh48WOr2+fPny7IsffDBB5IKn75kWZaWLl163DN//
fXX5f6Lfl5enk488cRSi3b79u0VFxenvLy8Mh8nPj5ezZo1K3P7gAEDVKNGDWVkZGjPnj2lrvPOO0/
XXHONc99few3I/v37tWfPHj366KOqX79+qbeFGiAV/fP+7ne/K/O0to4dO+riiy8+7jkBINYRIAAQBn6/
X6effrruuusuZWRkONe3334ry7Kc11xURYBcd911Ouuss8rc7vP5ZFmWnn32WUlS165d9Zvf/
KbcYCj2+uuvy7IsbdiwoczbLrroIl166aXOf7dv315nn312uR8nPj6+zHclJOnRRx8t9zUaxdcFF1zg3Le8
APnpp5/017/+VXFxcaXer0aNGqXuF2qAVPTP26JFizL3e+CBB9S0adNyHwcAAAECAGExadKkX1y0O3fuLEm
aMWNGuQGyfv36iAiQ888/v9yPU/wi9GP95z//UY0aNZSSkqLJkyeXuebPn+/
c99gAmTVrlmrUqKH27dvrs88+U3JysiZPnqx77rmnzONSXQFS3p+3On5hIgBEEwIEAMLggQce0KmnnqrRo0
eXue6++279/ve/19GjR5WWlibLssr80rypU6eWCZDHHnusQk/
BWrBgQZU+Beukk04q85SkigbIW2+9JcuytHbt2uOeodixi/2TTz6pE044Qbm5uaXuV16A/O53v3P9FKxQ/
7wECAD8MgIEAKrZ0aNH9fvf/
14PPfRQuW+fO3euLMvSqFGj5PP5VLNmTT311FOl7nPrrbeWCZCEhARZllXmx8MWvwi9X79+pW6/8847K/
0i9Ouvv77Uax0GDRpU7ouyKxog69evV82aNXXPPfeUeS2Fbdvau3ev89/HLvZPP/
206tatW+p3jWRmZqpu3bplAuS0005Tp06dynz+470I3c2flwABgF9GgABANRs1apQsy3J+JO2xAoGAGjZsq
JtuukmSdNddd+m3v/2tnn76aX344Yf6xz/+oUsuuaRMgBS/fuT+++/
XV199pZEjRzof76qrrlKNGjXUpUsXffjhh+rUqVO5P4a3T58+zo/hffvtt/
XBBx+oc+fO6tmzp3Of4h9Le+2112rgwIF6/PHHj/tjaSsaIFLwaU/t2rXTW2+9pcGDB+u5555T8+bN1b9/
f+d+xy72xd8VuuKKKzR48GC9/PLLOvXUU3XBBReUCZAbbrhB9erV0zvvvKORI0dqwYIFkn75x/
BW9s9LgADALyNAAKCa3XTTTapTp85xfyu4JD344IOqVauW9u7dqz179ujWW29V3bp11aBBA/3nP//
RihUrygSI3+/X448/roYNG6pGjRqllu5Dhw7pqaeeUuPGjVWrVi1nmS/
vFxEOHTpUF198seLi4tSgQQO1b9/e+VHBxQYOHKgWLVqoVq1aOu200/Too48e9xfzleeXAkSSvvvuO11+
+eWqV6+e6tWrpxYtWqh79+6lnppV3mL/
2WefqXnz5oqLi1OLFi00bNgwJyBKWrNmja688kqdcMIJIf0iQjd/
XgIEAH4ZAQIAAAAgbAgQAAAAAGFDgAAAAAAIGwIEAAAAQNgQIAAAAADChgABAAAAEDYECAAAAICwIUAMEgg
ElJWVJZ/
Pp+zsbC4uLi4uLi4uLsMun8+nrKwsBQIBr1fHiEWAGCQrK0uWZXFxcXFxcXFxcRl+ZWVleb06RiwCxCA+n8
8ZaK/rnouLi4uLi4uLq+xV/A/GPp/
P69UxYhEgBsnOzpZlWcrOzvb6KAAAACgH+5p7BIhBGGgAAACzsa+5R4AYhIEGAAAwG/
uaewSIQRhoAAAAs7GvuUeAGISBBgAAMBv7mnsEiEEYaAAAALOxr7lHgBiEgQYAADAb+5p7BIhBGGgAAACzs
a+5R4AYhIEGAAAwG/
uaewSIQRhoAAAAs7GvuUeAGISBBhBtbNuWbdteHwMAqgz7mnsEiEEYaADRZOuBo7ru3Zm67t2Z2nrgqNfHA
YAqwb7mHgFiEAYaQLTI2n9El785VfEJSYpPSNLlb04lQgBEBfY19wgQgzDQAKJB1v4juuyNwvi48q1puvKt
aU6EZO0/4vXxAMAV9jX3CBCDMNAAIt2WfcH4aP/
WNG33HdV231EnQi57Y6q27CNCAEQu9jX3CBCDMNAAItmWfUfU7vXC+Phb/+na4ctx3rbDl6O/
9Z+u+IQktXudCAEQudjX3CNADMJAA4hUm/cG4+Oq/
tO1MzunzH12+HJ0FRECIMKxr7lHgBiEgQYQiTbtPay2/
aYUxsfb07WrnPgotjM7R1e9XRghbftN0ea9RAiAyMK+5h4BYhAGGkCkydxzWG2K4uPqX4mPYruyc3R1UYS0
6TdFm/YeDsNJAaBqsK+5R4AYhIEGEEky9xzWX/
sWxkeHd2Zo18Ffj49iuw6WjpDMPUQIgMjAvuYeAWIQBhpApNi457Ba952s+IQkXfPODO0+mFvhj7H7YK6ue
WeG4hOS9Ne+U7SRCAEQAdjX3CNADMJAA4gEG3YfUqvXCuPj7wNmaM+hisdHsZIR0rrvZG3YfagKTwoAVY99
zT0CxCAMNADTrS8RH9cOmOkqPortOZSrawfMVHxCklq9NlnriRAABmNfc48AMQgDDcBkGbsO6dKi+Lju3Zn
aWwXxUWwvEQIgQrCvuUeAGISBBmCqjF0Hqy0+iu09lKvr3i2MkEtfm6yMXUQIAPOwr7lHgFTA1q1bde+99+
rkk09WnTp11LJlSy1evNh5u23b6tOnjxo1aqQ6deqoQ4cOWrduXcgfn4EGYKJ1Ow/
qklcL4+P6/83SvsN51fa59h3OcyLkklcnK2PXwWr7XABQGexr7hEgIdq/f7/
i4+P14IMPauHChdq4caMmTpyo9evXO/d54403dNJJJ2ncuHFKS0tTx44d1axZM+XkhPajKRloAKZZu/
OgLnl1khMf+6sxPortP5yn6/83qyhCJmndTiIEgDnY19wjQEKUkJCgyy+//Lhvt21bjRo1Uv/+/
Z3bfD6f4uLiNHLkyJA+BwMNwCRrdhzUX14pjI8b3gtPfBTbfzhP/
yiKkL+8MklrdhAhAMzAvuYeARKi8847Tz169NBtt92mhg0b6qKLLtLHH3/
svH3Dhg2yLEtLly4t9X5XXnmlnnjiiZA+BwMNwBSrd2Tr4qL4uPH9WTpwJHzxUezAkTzd8B4RAsAs7GvuES
AhiouLU1xcnHr16qUlS5ZoyJAhqlOnjoYPHy5Jmjt3rizL0vbt20u93+2336477rij3I+Zm5ur7Oxs58rKy
mKgAXhu1fZgfPzz/dmexEexA0fydOP7hRFy8SuTtHoHXx8BeIsAcY8ACVGtWrXUtm3bUrc9/
vjjatOmjaTKBUhiYqIsyypzMdAAvLJyW7Yuenmi4hOSdNMHs+U7ku/1keQ7kq9/
vj9b8QlJuujliVq1na+RALxDgLhHgISoSZMmevjhh0vdNmjQIDVu3FhS5Z6CxXdAAJhkxTZf6fg46n18FPM
dyddNHwQjZOU2vk4C8AYB4h4BEqK77767zIvQe/To4XxXpPhF6G+//bbz9uzsbF6EDiAipG/
16cKi+Og4cI5R8VHMdzRfHYsi5MKXJ2rFNp/XRwIQg9jX3CNAQrRo0SL99re/Vd+
+fZWRkaERI0aobt26+uqrr5z7vPHGG6pfv75++OEHLV+
+XJ06deLH8AIwXvpWny54qTA+Og2co+wc8+KjWHZOvjoNnKP4hCRd8NJEpW8lQgCEF/
uaewRIBfz0009q2bKl4uLi1KJFi1I/BUsK/iLC0047TXFxcerQoYPWrl0b8sdnoAGE2/
KsYHz834dzdNDg+CiWnZOv//uQCAHgDfY19wgQgzDQAMIpLeuA/
pyYoviEJN0yaG5ExEexgzn5urkoQv6cmKK0rANeHwlAjGBfc48AMQgDDSBclm05oJZF8XHroLk6lFvg9ZEq
7GBOvm4ZNNeJkGVbiBAA1Y99zT0CxCAMNIBwWLrlgFq+WBgftw2OzPgodii3QLcWRUjLxBQtJUIAVDP2Nfc
IEIMw0ACq25LN+534uH3wvIiOj2KHcgt02+CiCHkxRUs27/
f6SACiGPuaewSIQRhoANXp5837dX5xfHw0T4ejID6KHc4t0O2D5zkR8jMRAqCasK+5R4AYhIEGUF1SNwXj4
46P5ulIXvTER7HDuQW6/aPCCDn/
xRSlbiJCAFQ99jX3CBCDMNAAqsPizH1OfNw5JDrjo9iRvALdOaRkhOzz+kgAogz7mnsEiEEYaABVbVHmPv2
pzwTFJyTp7o/
n62ie3+sjVbsjeQW6a8h8xSck6U99JmhxJhECoOqwr7lHgBiEgQZQlRZu3KfziuLjnk9iIz6KHc3z6+6Pgx
GyiAgBUEXY19wjQAzCQAOoKgs27HXi495PFignP3bio9jRPL/u/
WSB4hOSdF6fCVq4kQgB4B77mnsEiEEYaABVYf6GvWrxQmF83PdpbMZHsZx8v+77NBghCzbs9fpIACIc+5p7
BIhBGGgAbs1bH4yP+z9bGNPxUaxkhLR4YYLmrSdCAFQe+5p7BIhBGGgAbszN2KNzX0hWfEKSOhMfpeTk+3X
/ZwudCJm7fo/
XRwIQodjX3CNADMJAA6isOSXi44GhxEd5cvL96lwUIee+kKy5GUQIgIpjX3OPADEIAw2gMmav26M/
Pl8YHw8OXajcAuLjeHLy/XpwaGGE/PH5ZM0hQgBUEPuaewSIQRhoABU1a91uJz7+NWwR8RGC3AK//
jVskRMhs9cRIQBCx77mHgFiEAYaQEXMWLtbzYvi4+HhxEdF5Bb49VCJCJm5drfXRwIQIdjX3CNADMJAAwjV
9DW7SsTHYuUVBLw+UsTJLfDr4eGFEdL8+WTNIEIAhIB9zT0CxCAMNIBQTCsRH//+nPhwI68goH9/
vtiJkOlrdnl9JACGY19zjwAxCAMN4NdMW71LzXsXxkeXL4iPqpBXENAjxRHSO1nTVhMhAI6Pfc09AsQgDDS
AXzJl1U4nPv7zRary/cRHVckrCKjLF8EImbp6p9dHAmAo9jX3CBCDMNAAjmfyyp06p/
d4xSckqeuXxEd1yPcH1PXLVMUnJOmc3uM1ZRURAqAs9jX3CBCDMNAAyjOpRHx0+
+pn4qMa5fsDevSrYIRMXkmEACiNfc09AsQgDDSAY6Ws2OHER/
cRP6uA+Kh2+f6Auo342YmQiSt2eH0kAAZhX3OPADEIAw2gpAnpO/SHXsSHFwr8AXUvipA/
9BqvFCIEQBH2NfcIEIMw0ACKTUjf7sTH418vIT48UOAP6LGvlzgRMiF9u9dHAmAA9jX3CBCDMNAAJCl5+Xa
dXRQfT4wkPrxU4A/
oiZHBCEleToQAsY59zT0CxCAMNIDxJeKjx6il8gdsr48U8wr8AT1ZFCFnEyFAzGNfc48AMQgDDcS2pLRgfD
xFfBjFH7D11KilToQkpREhQKxiX3OPADEIAw3Erh+XbXPi4+lvlhEfBvIHbD31TTBCfkrb5vWRAHiAfc09A
sQgDDQQm34oER/PfEt8mMwfsPX0N8ucCPlxGRECxBr2NfcIEIMw0EDsGbd0q5r1TFJ8QpKe/
XaZAsSH8fwBW89+WxghzXom6QciBIgp7GvuESAGYaCB2FIyPp4bnUZ8RJBAwNZ/
RwcjZNzSrV4fCUCYsK+5R4AYhIEGYsfYJcH4SBhDfESiQMBWwpg0J0LGLiFCgFjAvuYeAWIQBhqIDd/
9nKWmRfHR87vlxEcECwRs9fwuGCHfL8ny+kgAqhn7mnsESIgSExNlWVap69xzz3XenpOTo27duunkk09WvX
r1dMstt2jnzp0V+hwMNBD9RqcG46P398RHNAgEbPX6frniE5LUtGeSxqQSIUA0Y19zjwAJUWJios4//3zt2
LHDufbs2eO8vWvXrjrrrLM0depUpaamqk2bNmrXrl2FPgcDDUS3bxdvIT6iVCBgq3eJCBlNhABRi33NPQIk
RImJibrwwgvLfZvP51OtWrU0evRo57bVq1fLsizNnz8/5M/
BQAPR65tFwfh4YWy6bJv4iDa2bev5scEI+WbxFq+PBKAasK+5R4CEKDExUXXr1tXpp5+uZs2a6Z577tHmzZ
slSVOnTpVlWTpw4ECp92nSpIkGDBhw3I+Zm5ur7Oxs58rKymKggSg0atFmJz5eHEd8RDPbttVnXHowQhYRI
UC0IUDcI0BClJycrG+//
VZpaWlKSUlR27Zt1aRJEx08eFAjRoxQ7dq1y7xPq1at9Nxzzx33Y5b3uhIGGoguXy/crPiEwvhI/
GEF8REDbNtW4g8rnP/
dRy7c7PWRAFQhAsQ9AqSSDhw4oBNPPFGffvpppQOE74AA0W3EgmB8vPQj8RFLjo2QEQuIECBaECDuESAuXH
rpperZs2eln4J1LAYaiB5fzt/kLJ8v/
7iS+IhBtm3rpR+DEfLVgk1eHwlAFWBfc48AqaRDhw6pQYMGeu+995wXoY8ZM8Z5+5o1a3gROhCjvpiX6Syd
r/5EfMQy27b1yk8rnXn4Yj4RAkQ69jX3CJAQPfPMM5oxY4YyMzM1d+5cXXPNNTrllFO0e/duSYU/
hrdJkyaaNm2aUlNT1bZtW7Vt27ZCn4OBBiLf5yXio+/
4VcQHZNu2XksKRsjn8zK9PhIAF9jX3CNAQnTnnXfq9NNPV+3atXXGGWfozjvv1Pr16523F/
8iwgYNGqhu3bq6+eabtWPHjgp9DgYaiGzD5mx0lsx+xAdKsG1b/
cavcuZj+NxMr48EoJLY19wjQAzCQAOR67PZwfh4PXk18YEybNtWv+RghAyds9HrIwGoBPY19wgQgzDQQGT6
ZNYGZ6l8cwLxgeOzbVtvTFjtzMuns4kQINKwr7lHgBiEgQYiT8n46J+yhvjAr7JtW2+lBCPkk1kbvD4SgAp
gX3OPADEIAw1Elo9nBuPj7YnEB0Jn27b6p6whQoAIxL7mHgFiEAYaiBwfzVjvLI/
vTFpLfKDCbNvWOxODETJk5vpffycAnmNfc48AMQgDDUSGQdOD8TFg0lqvj4MIN2DSWmeeBs8gQgDTsa+5R4
AYhIEGzPfh9AxnWXx3MvGBqvHu5GCEDJpOhAAmY19zjwAxCAMNmG3gtGB8vDdlndfHQZT53+R1znwNnJbh9
XEAHAf7mnsEiEEYaMBcH0wNLocfTCU+UD1KzhkRApiJfc09AsQgDDRgpvemsBQifEp+p+19vtMGGId9zT0C
xCAMNGCeks/N/3A68YHwKBkh/5tMhAAmYV9zjwAxCAMNmKVkfPDTiRBuJX/aGj/
wADAH+5p7BIhBGGjADLZt650SPxr1I+IDHhk8gx/5DJiGfc09AsQgDDTgvWN/OdzHM/
kN1fDWkJn80kvAJOxr7hEgBmGgAW/
Ztq3+KcH4+GQW8QEzfDxzgzOXb09cQ4QAHmJfc48AMQgDDXjHtm29lbLaWfI+nb3R6yMBpXwyKxghb6WsJk
IAj7CvuUeAGISBBrxh27bemBCMj8+IDxjq09kbnTl9cwIRAniBfc09AsQgDDQQfrZtq1/
yKmepGzaH+IDZhs4JRsjryUQIEG7sa+4RIAZhoIHwsm1bfccH42P43EyvjwSEZFiJCOk3fhURAoQR+5p7BI
hBGGggfGzb1mtJK50l7vN5mV4fCaiQz+dlOvPblwgBwoZ9zT0CxCAMNBAetm3rlZ+C8fHF/
E1eHwmolC9KRMirP60kQoAwYF9zjwAxCAMNVD/
btvXSjyucpe1L4gMR7sv5m5x5fvlHIgSobuxr7hEgBmGggepl27YSfwjGx4gFm70+ElAlvloQjJCXflxBhA
DViH3NPQLEIAw0UH1s29aL49KdJW3kQuID0eXrhZud+U78gQgBqgv7mnsEiEEYaKB62LatPkXx0bRnkr5Zt
MXrIwHVYtSizWraszBCXhyXToQA1YB9zT0CxCAMNFD1AgFbz49dHoyPxcQHots3i7Y4EfLCWCIEqGrsa+4R
IAZhoIGqFQjY6v19MD6+JT4QI75dHIyQ58cuVyBAhABVhX3NPQLEIAw0UHUCAVs9vwvGx5jULK+PBITV6NQ
sJ0J6fU+EAFWFfc09AsQgDDRQNQIBWwlj0hSfkKRmPZP0/RLiA7Hpu5+DEdLzuzQiBKgC7GvuES
AGYaAB9wIBW8+NDsbH2CVbvT4S4Knvl2SpWVGEJIwhQgC32NfcI0AMwkAD7gQCtp79dpkTH+OWEh+AJI1bu
tWJkP+OXkaEAC6wr7lHgBiEgQYqzx+w9UyJ+Phh2TavjwQYpWSEPPstEQJUFvuaewSIQRhooHL8AVtPf1MY
H2f3Gq8fiQ+gXD8s2+ZEyDPfLpOfCAEqjH3NPQLEIAw0UHH+gK2nvlnqxMdPacQH8Et+XLZNZ/car/
iEJD31zVIiBKgg9jX3CJBKeP3112VZlp588knntpycHHXr1k0nn3yy6tWrp1tuuUU7d+6s0MdloIGK8Qds9
RgVjI+ktO1eHwmICElp24MRMooIASqCfc09AqSCFi1apKZNm+qCCy4oFSBdu3bVWWedpalTpyo1NVVt2rRR
u3btKvSxGWggdAX+gJ4YuUTxCUn6Q6/
xSl5OfAAVMX55MEKeHLmECAFCxL7mHgFSAYcOHVLz5s01efJktW/
f3gkQn8+nWrVqafTo0c59V69eLcuyNH/+/JA/
PgMNhKbAH9DjXwfjY0I68QFURvLy7fpDUYQ8MXKJCvwBr48EGI99zT0CpAI6d+6sHj16SFKpAJk6daosy9K
BAwdK3b9JkyYaMGBAyB+fgQZ+XYE/
oMdKxccOr48ERLQJ6TucCHnsayIE+DXsa+4RICEaOXKkWrZsqZycHEmlA2TEiBGqXbt2mfdp1aqVnnvuueN
+zNzcXGVnZztXVlYWAw38ggJ/QN1G/Kz4hCSd03u8Jq4gPoCqkLIiGCHdR/xMhAC/
gABxjwAJwZYtW3TqqacqLS3Nua0qAiQxMVGWZZW5GGigrHx/
QN2+CsbHpJUV+yEPAH7ZxBU7dE7vwgjp9tXPyidCgHIRIO4RICEYO3asLMtSzZo1ncuyLNWoUUM1a9bUlCl
TKvUULL4DAoQm3x9Q1y9TnfiYTHwA1WLSyp1OhDz6VSoRApSDAHGPAAnBwYMHlZ6eXuq69NJLdd999yk9Pd
15EfqYMWOc91mzZo3IjRgAACAASURBVA0vQgeqQL4/
oP98URgfzXsna8oq4gOoTlNW7VTz3smKT0hS1y+JEOBY7GvuESCVVPIpWFLhj+Ft0qSJpk2bptTUVLVt21Z
t27at0MdkoIHS8goC6vLFYic+pq3e5fWRgJgwdXUwQrp8sVh5BUQIUIx9zT0CpJKODZDiX0TYoEED1a1bVz
fffLN27KjYC2QZaCAoryCgRz4nPgCvTFu9y4mQRz4nQoBi7GvuESAGYaCBQnkFAT08vCg+nk/
W9DXEB+CFaWt2qfnzhRHybyIEkMS+VhUIEIMw0ICUW+DXw8MXOfExY+1ur48ExLTpJSLk4eGLlFvg9/
pIgKfY19wjQAzCQCPW5Rb49dCwwvj44/PJmkl8AEaYuXa3/
lgUIQ8NI0IQ29jX3CNADMJAI5blFvj1rxLxMXvdHq+PBKCEWeuCEfIvIgQxjH3NPQLEIAw0YlVOvl8PDl2o
+IQknftCsuZkEB+AiWav2+NEyINDFyonnwhB7GFfc48AMQgDjViUk+9X58+C8TF3PfEBmGxuxh6d+0JhhDx
AhCAGsa+5R4AYhIFGrMnJ9+v+ovho8cIEzVu/1+sjAQjB3PXBCLn/
MyIEsYV9zT0CxCAMNGJJTr5f9326wImP+RuIDyCSzFu/
Vy1emKD4hCTd9+kCIgQxg33NPQLEIAw0YsXRPL/u/
aQwPs7rM0ELiA8gIs3fQIQg9rCvuUeAGISBRiw4mufXPZ/
Md+Jj4cZ9Xh8JgAsLNuzVeX0KI+TeTxboaB4RgujGvuYeAWIQBhrR7mieX3d/
XBgff+ozQYsyiQ8gGizK3Kc/FUXI3R/
PJ0IQ1djX3CNADMJAI5odySvQXUMK4+P8F1OUuon4AKLJ4hIRcteQ+TqSV+D1kYBqwb7mHgFiEAYa0epIXo
Hu+GheifjY7/
WRAFSD1E37dP6LKYpPSNKdQ+YRIYhK7GvuESAGYaARjQ7nFuj2ovho+WKKft5MfADRLHXTfidCbv9ong7nE
iGILuxr7hEgBmGgEW0O5xbo9sHB+FhCfAAx4efN+9WyOEIGEyGILuxr7hEgBmGgEU0O5RbotsFzC+MjMUVL
txzw+kgAwmhJiQi5bfBcHSJCECXY19wjQAzCQCNaHMzJ1y2DgvGxjPgAYtLSLQfUMrEwQm4dRIQgOrCvuUe
AGISBRjQ4mJOvmz+co/iEJP05MUVpWcQHEMuWlYiQWwbN1cGcfK+PBLjCvuYeAWIQBhqRLjsnX/
9XFB8XvDRRy7N8Xh8JgAHSsg7oz0URcvOHc4gQRDT2NfcIEIMw0Ihk2Tn56jQwGB/
pW4kPAEHLs3y64KWJik9I0v99OEfZRAgiFPuaewSIQRhoRCrf0Xx1LIqPC18mPgCUL31rMEI6DSRCEJnY19
wjQAzCQCMS+Y7mq+MHs534WLGN+ABwfOlbfbrw5cII6ThwjnxHiRBEFvY19wgQgzDQiDS+I/
m6qSg+Lnp5olZuY3YB/LoV20pEyAeziRBEFPY19wgQgzDQiCS+I/n65/
uF8XHxK5O0ajtzCyB0K7dl66KiCLnpg9nyHSFCEBnY19wjQAzCQCNSHDiSpxvfn+XEx+odzCyAilu1PVsXv
zJJ8QlJ+uf7RAgiA/uaewSIQRhoRIIDR/J0w3uF8fGXVyZpzY6DXh8JQARbs+Og/
lIUITe8N0sHjuR5fSTgF7GvuUeAGISBhun2H87TP/5XGB+XvDpJa3cSHwDcKxkh//jfLO0/
TITAXOxr7hEgBmGgYbJ9h/
N0vRMfk7WO+ABQhdbuPKhLXiVCYD72NfcIEIMw0DDVvsN5uu7dmU58ZOwiPgBUvXU7D+qSVycrPiFJ1/9vl
vYRITAQ+5p7BIhBGGiYaO+hXCc+Ln1tsjJ2HfL6SACiWMauYIRc9+5MIgTGYV9zjwAxCAMN0+w5lKtrBxAf
AMIrY9chXfpaMEL2Hsr1+kiAg33NPQLEIAw0TLLnUK7+PmCG4hOS1Oq1yVq/m/
gAED7rdx9Sq6IIuXbATO0hQmAI9jX3CBCDMNAwxe6DubrmncL4aN13sjYQHwA8sGH3IbXuWxgh17wzQ7sPE
iHwHvuaewSIQRhomGDXwRx1KIqPv/adoo17Dnt9JAAxbOOew/
pr3ymKT0hSh3dmaNfBHK+PhBjHvuYeAWIQBhpe25Wdo6vfnq74hCS16TdFmcQHAANk7jmsNv0KI+Tqt6cTI
fAU+5p7BEiIBg0apD//+c/6/e9/r9///
vdq06aNkpOTnbfn5OSoW7duOvnkk1WvXj3dcsst2rlzZ4U+BwMNL+3KztFVRfHRtt8UbdpLfAAwx6a9x0RI
NhECb7CvuUeAhOjHH3/U+PHjtW7dOq1du1a9e/
dWrVq1tGLFCklS165dddZZZ2nq1KlKTU1VmzZt1K5duwp9DgYaXtmZnaOr+hfGR7vXp2rz3iNeHwkAyti09
7DaFkXIVf2naycRAg+wr7lHgLjQoEEDffrpp/L5fKpVq5ZGjx7tvG316tWyLEvz588P+eMx0PDCDl+O/
lYiPrbsIz4AmGvz3iNq9/pUxSck6W/
9p2uHjwhBeLGvuUeAVILf79fIkSNVu3ZtrVy5UlOnTpVlWTpw4ECp+zVp0kQDBgw47sfJzc1Vdna2c2VlZT
HQCKvtvqNq/
9Y04gNARNmyLxgh7d+aRoQgrAgQ9wiQCli+fLnq1aunmjVr6qSTTtL48eMlSSNGjFDt2rXL3L9Vq1Z67rnn
jvvxEhMTZVlWmYuBRjhsO3BUVxbFx2VvEB8AIsuWfUd02RvBCNnuO+r1kRAjCBD3CJAKyMvLU0ZGhlJTU9W
zZ0+dcsopWrlyZaUDhO+AwCtbDxzVFW8Wxsflb05V1n7iA0DkydofjJAr35qmbQeIEFQ/
AsQ9AsSFDh06qEuXLpV+CtaxGGiEw9YDR3X5m4V/YV/x5jRt5S9sABGMr2kIN/
Y19wgQF6666io98MADzovQx4wZ47xtzZo1vAgdxsnaf6TUX9T8ayGAaMB3dRFO7GvuESAh6tmzp2bOnKnMz
EwtX75cPXv2VI0aNTRp0iRJhT+Gt0mTJpo2bZpSU1PVtm1btW3btkKfg4FGdSr5fOkreb40gChz7OvaiBBU
F/Y19wiQED300EOKj49X7dq11bBhQ3Xo0MGJDyn4iwgbNGigunXr6uabb9aOHTsq9DkYaFSXkj8x5m/
9pxMfAKJSyZ/sxw/
XQHVhX3OPADEIA43qcGx88OMqAUQzfrcRqhv7mnsEiEEYaFS1zXuP8FuDAcScHb4cXVUiQjbvJUJQddjX3C
NADMJAoypt2ns4GB9vT9cu4gNADNmZHYyQtv2maNPew14fCVGCfc09AsQgDDSqSuaew2pTFB9XEx8AYtSu7
Bxd/XZhhLQhQlBF2NfcI0AMwkCjKmTuOay/
9i2Mjw7vzNCug8QHgNi162DpCMncQ4TAHfY19wgQgzDQcGvjnsNq3Xey4hOSdM07M7T7YK7XRwIAz+06mKM
O78xQfEKS/
tp3ijYSIXCBfc09AsQgDDTc2LD7kBMffx9AfABASbsP5uqaoghp3XeyNuw+5PWREKHY19wjQAzCQKOy1u8+
pFavFcbHtQNmas8h4gMAjrXnUK7+PqAwQlq9NlnriRBUAvuaewSIQRhoVEbGrkO6tCg+rnuX+ACAX7LnUK6
uHTDTiZCMXUQIKoZ9zT0CxCAMNCoqY9fBUvGxl/
gAgF+191Curnu3MEIuJUJQQexr7hEgBmGgURHrdh7UJa8G42Pf4TyvjwQAEaNkhFzy6mRl7Dro9ZEQIdjX3
CNADMJAI1Rrdx7UJa9OUnxCkv7xv1naT3wAQIXtO5yn6/83qyhCJmntTiIEv459zT0CxCAMNEKxZsdB/
eUV4gMAqsL+w3n6R1GE/OUVIgS/jn3NPQLEIAw0fs3qHdlOfNzw3iwdOEJ8AIBb+w/
n6Yb3ghGyZgcRguNjX3OPADEIA41fsmp7ti4uio9/
vj+b+ACAKnTgSJ5ufL8wQi5+ZZJW7+DvYpSPfc09AsQgDDSOZ9X2bF308kTFJyTppg9my3ck3+sjAUDU8R3
J1z/fn634hCRd9PJErdrO38coi33NPQLEIAw0yrNim8+Jj44fzJbvKPEBANXFdzRfN30QjJCV2/
g7GaWxr7lHgBiEgcax0rf6dGFxfAycQ3wAQBj4juar48A5ik9I0oUvT9SKbT6vjwSDsK+5R4AYhIFGSelbf
brgpcL46DRwjrJziA8ACJfsnHx1KoqQC16aqPStRAgKsa+5R4AYhIFGseVZPv05MUXxCUm6+cM5Okh8AEDY
Zefk6/8+JEJQGvuaewSIQRhoSFJa1gEnPm4ZNJf4AAAPHczJ181FEfLnxBSlZR3w+kjwGPuaewSIQRhoLNt
yQC2L4uPWQXN1KLfA6yMBQMw7lFugWwbNdSJk2RYiJJaxr7lHgBiEgY5tS7ccUMsXC+PjtsHEBwCY5FBugW
4tipCWiSlaSoTELPY19wgQgzDQsWvJ5v1OfNw+eJ4OEx8AYJxDuQW6bXBRhLyYoiWb93t9JHiAfc09AsQgD
HRs+rlkfHxEfACAyQ7nFuj2wfOcCPmZCIk57GvuESAGYaBjT+qm/Tq/KD7uHDJPR/
KIDwAw3eHcAt3xUWGEnP9iilI3ESGxhH3NPQLEIAx0bFmcuU9/6jNB8QlJumvIfOIDACLIkbwC3TmkZITs8
/pICBP2NfcIEIMw0LFjUYn4uPvj+Tqa5/f6SACACjqSV6C7hsxXfEKS/
tRnghZnEiGxgH3NPQLEIAx0bFiUuU/
nFcXHPZ8QHwAQyY7m+XX3x4URcl6fCVq4kQiJduxr7hEgBmGgo9+CDXud+Lj3kwXEBwBEgaN5ft3zSTBCFm
zY6/
WRUI3Y19wjQAzCQEe3+Rv2qsULhfFx36cLlJNPfABAtMjJ9+veTxY4ETKfCIla7GvuESAGYaCj17z1wfi4/
7OFxAcARKGcfL/u+7QwQlq8MEHz1hMh0Yh9zT0CxCAMdHSam7FH576QTHwAQAzIyffr/s8WOhEyd/
0er4+EKsa+5h4BYhAGOvqUjI8HhhIfABALcvL96lwUIee+kKy5GURINGFfc48ACVG/fv106aWX6ne/
+50aNmyoTp06ac2aNaXuk5OTo27duunkk09WvXr1dMstt2jnzp0hfw4GOrrMXrdHf3y+MD7+NWyRcguIDwC
IFTn5fj0wNBghc4iQqMG+5h4BEqLrrrtOw4YN04oVK7Rs2TLdcMMNatKkiQ4fPuzcp2vXrjrrrLM0depUpa
amqk2bNmrXrl3In4OBjh6z1u124uMh4gMAYlJugV//
GrZI8QlJ+uPzyZq9jgiJBuxr7hEglbR7925ZlqWZM2dKknw+n2rVqqXRo0c791m9erUsy9L8+fND+pgMdHS
YuXa3mhfFx8PDiQ8AiGW5BX49VCJCZq7d7fWR4BL7mnsESCVlZGTIsiylp6dLkqZOnSrLsnTgwIFS92vSpI
kGDBgQ0sdkoCPfjFLxsVh5BQGvjwQA8FhugV8PDy+MkObPJ2sGERLR2NfcI0AqIRAI6MYbb9Rll13m3DZix
AjVrl27zH1btWql5557rtyPk5ubq+zsbOfKyspioCPY9DW7nPh45HPiAwAQlFcQ0L8/
X+xEyPQ1u7w+EiqJAHGPAKmErl27Kj4+XllZWc5tlQmQxMREWZZV5mKgI8+01bvUvHdhfHT5gvgAAJSVVxD
QIyUiZBoREpEIEPcIkArq3r27zjzzTG3cuLHU7ZV5ChbfAYkOU1fvdOKj65epyvcTHwCA8uX7A/
rPF6mFEdI7WdNWEyGRhgBxjwAJkW3b6t69uxo3bqx169aVeXvxi9DHjBnj3LZmzRpehB7lpqzaqXN6j1d8Q
pIe/Yr4AAD8unx/QF2/DEbIlFWh/
8h+eI99zT0CJESPPvqoTjrpJM2YMUM7duxwrqNHjzr36dq1q5o0aaJp06YpNTVVbdu2Vdu2bUP+HAx0ZJm8
Mhgf3b76mfgAAIQs3x/Qo18VRsg5vcdr8koiJFKwr7lHgISovNdqWJalYcOGOfcp/
kWEDRo0UN26dXXzzTdrx44dIX8OBjpyTFyxIxgfI35WAfEBAKigfH9A3Ub87ETIJCIkIrCvuUeAGISBjgwp
K3boD70K4+Oxr5cQHwCASivwB9S9RIRMXBH6P1zCG+xr7hEgBmGgzTchPRgfjxMfAIAqUOAP6LGvlyg+IUl
/6DVeE9KJEJOxr7lHgBiEgTZb8vLtTnw8OZL4AABUnQJ/
QE+MLBkh270+Eo6Dfc09AsQgDLS5ktK26+yi+Ogxaqn8AdvrIwEAoow/
YOvJogg5u9d4jV9OhJiIfc09AsQgDLSZfkrb5sTHU8QHAKAa+QO2nhq11ImQpDQixDTsa+4RIAZhoM3z47J
gfDz9zTLiAwBQ7fwBW099E4yQH5dt8/
pIKIF9zT0CxCAMtFnGLd2qZj2TFJ+QpGe+JT4AAOHjD9h6+ptlToT8QIQYg33NPQLEIAy0OUrGx39HL1OA+
AAAhJk/
YOvZbwsjpFnPJI1butXrI0Hsa1WBADEIA22G75dkER8AACMEArb+OzoYIWOXECFeY19zjwAxCAPtve9+DsZ
Hwpg04gMA4LlAwFbCmDQnQr5fkuX1kWIa+5p7BIhBGGhvjU7NUtOi+Oj53XLiAwBgjEDAVs/
vCiOkac8kjUklQrzCvuYeAWIQBto7JeOj1/
fEBwDAPIURstyJkNFEiCfY19wjQAzCQHvjm8VbnPh4fizxAQAwVyBgq/
f3wQj5dvEWr48Uc9jX3CNADMJAh983i4Lx8cLYdOIDAGC8QMDW82ODEfLNIiIknNjX3CNADMJAh9fIhZsVn
1AYH4k/rJBtEx8AgMhg27b6jEt3ImTUos1eHylmsK+5R4AYhIEOnxELiA8AQGSzbVuJP6xw/
j4buZAICQf2NfcIEIMw0OHx1YJNzhfrl39cSXwAACKWbdt66cdghIxYQIRUN/Y19wgQgzDQ1e/
L+cH4eOUn4gMAEPls29bLP650/n77asEmr48U1djX3CNADMJAV68vSsTHa0nEBwAgeti2rVd+CkbIF/
OJkOrCvuYeAWIQBrr6fD4v0/
mi3Hf8KuIDABB1bNvWa0klImReptdHikrsa+4RIAZhoKvH8LnB+OiXTHwAAKKXbdvqO36V8/
fe50RIlWNfc48AMQgDXfWGztnofBF+PXk18QEAiHq2batfcjBChs3Z6PWRogr7mnsEiEEY6Kr16exgfLw5g
fgAAMQO27b1xoTVzt+Dn80mQqoK+5p7BIhBGOiq88msDc4X3bdSiA8AQOyxbVtvloiQT2Zt8PpIUYF9zT0C
xCAMdNX4eGYwPt6euIb4AADELNu21T9lDRFShdjX3CNADMJAu/
fRjPXOF9l3Jq0lPgAAMc+2bb0zMRghQ2au9/
pIEY19zT0CxCAMtDuDS8THgElrvT4OAABGGTBprfP35EcziJDKYl9zjwAxCANdeR9Oz3C+qL47mfgAAKA87
04ORsig6URIZbCvuUeAGISBrpyB04Lx8d6UdV4fBwAAo/
1v8jrn782B0zK8Pk7EYV9zjwAxCANdcR9MDX4R/
WAq8QEAQCjen8Lfn5XFvuYeAWIQBrpi3pvCv+AAAFBZJZ9B8D7PIAgZ+5p7BIhBGOjQlXwO64fTiQ8AACqj
ZIT8bzIREgr2NfcIEIMw0KEp+VM8eAEdAADuDJrOT5GsCPY19wgQgzDQv8y2bb3DjxAEAKDKDeb3aIWMfc0
9AsQgDPTx2batt0v8EqWPZ/KbXAEAqEpDZpaIkIlriJDjYF9zjwAJ0cyZM/XPf/
5Tp59+uizL0tixY0u93bZt9enTR40aNVKdOnXUoUMHrVtXsedSMtDls21b/
VOC8fHJLOIDAIDq8MmsDc7ft28TIeViX3OPAAlRcnKynn/+eX3//
fflBsgbb7yhk046SePGjVNaWpo6duyoZs2aKScnJ+TPwUCXZdu23pyw2vli+OnsjV4fCQCAqFYyQt5KWU2E
HIN9zT0CpBKODRDbttWoUSP179/
fuc3n8ykuLk4jR44M+eMy0KXZtq03SsTH0DnEBwAA4fDZ7I3O379vTCBCSmJfc48AqYRjA2TDhg2yLEtLly
4tdb8rr7xSTzzxxHE/
Tm5urrKzs50rKyuLgS5i27b6Ja9yvvgNIz4AAAiroXOCEdIveRURUoQAcY8AqYRjA2Tu3LmyLEvbt28vdb/
bb79dd9xxx3E/
TmJioizLKnPF+kDbtq1+44Px8fm8TK+PBABATBo+NzMYIeOJEIkAqQoESCVUVYDwHZCybNvWa0krnS92XxA
fAAB46vN5wQjpS4QQIFWAAKmEqnoK1rFifaBt29YrPwXj48v5m7w+EgAAkPRFiQh59aeVMR0hsb6vVQUCpB
KO9yL0t99+27ktOzubF6FXgG3bevnHYHx8tYD4AADAJF/
O3+T8Pf1KDEdILO9rVYUACdGhQ4e0dOlSLV26VJZlacCAAVq6dKk2b94sqfDH8NavX18//
PCDli9frk6dOvFjeENk27YSf1jhfFEbsWCz10cCAADlGLFgs/P39Us/rojJCInVfa0qESAhmj59erkvGH/
ggQckBX8R4Wmnnaa4uDh16NBBa9eurdDniMWBtm1bL45Ld76YjVxIfAAAYLKvFwYjJPGH2IuQWNzXqhoBYp
BYG2jbttWnKD6a9kzSqEXEBwAAkWBkiQh5cVx6TEVIrO1r1YEAMUgsDXQgYOv5scud+Phm0RavjwQAACrgm
0Vb1LRnYYS8MDZ2IiSW9rXqQoAYJFYGOhCw1fv7YHx8u5j4AAAgEn2zOBghvb9frkAg+iMkVva16kSAGCQW
BjoQsNXzu2B8jE7N8vpIAADAhdGpWU6E9IqBCImFfa26ESAGifaBDgRsJYxJc+Lju5+JDwAAosGYEhHS87v
ojpBo39fCgQAxSDQPdCBg67nRhfHRrGeSvl9CfAAAEE2+X
5KlZkURkjAmLWojJJr3tXAhQAwSrQMdCNh69ttlTnyMW7rV6yMBAIBqMHbJVidCnhsdnRESrftaOBEgBonG
gfYHbD1DfAAAEDPGLQ1GyLPfLou6CInGfS3cCBCDRNtA+wO2nv6mMD7O7jVePy7b5vWRAABAGPywbJsTIc9
8u0z+KIqQaNvXvECAGCSaBtofsPXUqKVOfPyURnwAABBLfly2TWf3Gq/
4hCQ99c3SqImQaNrXvEKAGCRaBtofsNWjRHyMX77d6yMBAAAPJKVtD0bIqOiIkGjZ17xEgBgkGga6wB/
QkyOXKD4hSX/oNV7JxAcAADEtefl2/
aEoQp4cuSTiIyQa9jWvESAGifSBLvAH9PjXwfiYkE58AAAAaUJ6MEKeGLlEBf6A10eqtEjf10xAgBgkkge6
wB/
QYyXiI2XFDq+PBAAADDIhfYcTIY99HbkREsn7mikIEINE6kAX+APqNuJnxSck6Zze4zWR+AAAAOVIWRGMkO
4jfo7ICInUfc0kBIhBInGg8/0BdfsqGB+TVu70+kgAAMBgE1fs0Dm9CyOkWwRGSCTua6YhQAwSaQOd7w/
o0a9SnfiYTHwAAIAQTF65MxghX/2s/AiKkEjb10xEgBgkkgY63x/Qf74ojI/
mvZM1dTXxAQAAQjdl1U41752s+IQkdf0yNWIiJJL2NVMRIAaJlIHOKwioyxeLnfiYtnqX10cCAAARaOrqYI
R0+WKx8grMj5BI2ddMRoAYJBIGOq8goEc+L4qP55M1bQ3xAQAAKm/
a6l1OhDzyufkREgn7mukIEIOYPtB5BQE9PDwYH9OJDwAAUAWmr9ml5s8XRsi/DY8Q0/
e1SECAGMTkgc4t8Ovh4YsUn5CkPz6frJlrd3t9JAAAEEVmrN3tRMjDwxcpt8Dv9ZHKZfK+FikIEIOYOtC5B
X49NCwYH7PWER8AAKDqzVy7W38sipCHhpkZIabua5GEADGIiQOdW+DXv0rEx+x1e7w+EgAAiGKz1gUj5F8G
RoiJ+1qkIUAMYtpA5+T79eDQhYpPSNK5LyRrTgbxAQAAqt/
sdXucCHlw6ELl5JsTIabta5GIADGISQOdk+/
XAyXiYy7xAQAAwmhOxh6d+0JhhHT+zJwIMWlfi1QEiEFMGeicfL/u/6wwPlq8MEHz1u/
19DwAACA2zS0RIfcbEiGm7GuRjAAxiAkDnZPv132fLnDiY/
4G4gMAAHhn3vq9avHCBMUnJOm+Txd4HiEm7GuRjgAxiNcDfTTPr3s/KYyP8/
pM0ALiAwAAGGD+BnMixOt9LRoQIAbxcqCP5vl1zyfznfhYuHFf2M8AAABwPAs27NV5fQoj5N5PFuhonjcRQ
oC4R4AYxKuBPprn190fF8bHn/pM0KJM4gMAAJhn4cZ9ToTc/
fF8TyKEAHGPADGIFwN9JK9Adw0Jxsdi4gMAABhsceY+/akoQu4aMl9H8grC+vkJEPcIEIOEe6CP5BXojo/
mKT4hSee/mKLUTcQHAAAwX+qmfTr/xRTFJyTpziHzwhohBIh7BIhBwjnQh3MLdHtRfLR8MUU/
b95f7Z8TAACgqqRu2u9EyO0fzdPh3PBECAHiHgFSxQYOHKj4+HjFxcWpdevWWrhwYcjvG86BPpJXGCAtX0z
REuIDAABEoJ8371fLF1N0x0fh+y4IAeIeAVKFRo0apdq1a2vo0KFauXKlHnnkEdWvX1+7du0K6f3DPdCHcw
u0ajv/
5wEAAJFr5bZsnoIVYQiQKtS6dWt1797d+e9AIKDGjRvr9ddfD+n9GWgAAACzsa+5R4BUkby8PNWsWVNjx44
tdXvnzp3VsWPHct8nNzdX2dnZzpWVlcVAAwAAGIwAcY8AqSLbtm2TZVmaN29eqdv/+9//
qnXr1uW+T2JioizLKnMx0AAAAGYiQNwjQKpIZQKE74AAAABEFgLEPQKkilTmKVjHYqABAADMxr7mHgFSNMb
0AgAACq1JREFUhVq3bq3HHnvM+e9AIKAzzjiDF6EDAABECfY19wiQKjRq1CjFxcVp+PDhWrVqlbp06aL69e
tr586dIb0/
Aw0AAGA29jX3CJAq9sEHH6hJkyaqXbu2WrdurQULFoT8vgw0AACA2djX3CNADMJAAwAAmI19zT0CxCAMNAA
AgNnY19wjQAzCQAMAAJiNfc09AsQgPp9PlmUpKyur1O8H4eLi4uLi4uLiMuMq/r1tPp/
P69UxYhEgBikeaC4uLi4uLi4uLrOvrKwsr1fHiEWAGCQQCCgrK0s+n8/zug+l/
PlODY9xpF88zjzG0XDxGPM4R8sVKY+xz+dTVlaWAoGA16tjxCJAUGHZ2Tz3sbrxGIcHj3P14zGufjzG4cHj
XP14jGMHAYIK4wtE9eMxDg8e5+rHY1z9eIzDg8e5+vEYxw4CBBXGF4jqx2McHjzO1Y/
HuPrxGIcHj3P14zGOHQQIKiw3N1eJiYnKzc31+ihRi8c4PHicqx+PcfXjMQ4PHufqx2McOwgQAAAAAGFDgA
AAAAAIGwIEAAAAQNgQIAAAAADChgABAAAAEDYECCokKSlJrVu3Vp06dVS/
fn116tSp1Ns3b96sG264QSeccIIaNmyoZ599VgUFBR6dNrLl5ubqwgsvlGVZWrp0aam3paWl6fLLL1dcXJz
OPPNMvfnmmx6dMvJkZmbqoYceUtOmTVWnTh2dffbZevHFF5WXl1fqfjzG7g0cOFDx8fGKi4tT69attXDhQq
+PFNH69eunSy+9VL/73e/UsGFDderUSWvWrCl1n5ycHHXr1k0nn3yy6tWrp1tuuUU7d+706MSR7/
XXX5dlWXryySed23iMq8bWrVt177336uSTT1adOnXUsmVLLV682Hm7bdvq06ePGjVqpDp16qhDhw5at26dh
ydGVSJAELIxY8aoQYMGGjx4sNauXauVK1fqm2++cd7u9/
vVsmVLXXPNNVq6dKmSk5N1yimnqFevXh6eOnI98cQT+sc//
lEmQLKzs3Xaaafp3nvv1YoVKzRy5EidcMIJGjJkiIenjRwTJkzQgw8+qIkTJ2rDhg364YcfdOqpp+qZZ55x
7sNj7N6oUaNUu3ZtDR06VCtXrtQjjzyi+vXra9euXV4fLWJdd911GjZsmFasWKFly5bphhtuUJMmTXT48GH
nPl27dtVZZ52lqVOnKjU1VW3atFG7du08PHXkWrRokZo2baoLLrigVIDwGLu3f/
9+xcfH68EHH9TChQu1ceNGTZw4UevXr3fu88Ybb+ikk07SuHHjlJaWpo4dO6pZs2bKycnx8OSoKgQIQlJQU
KAzzjhDn3766XHvk5ycrN/85jel/
iVo8ODBOvHEE8v86zJ+WXJyslq0aKGVK1eWCZBBgwapQYMGpR7ThIQEnXvuuV4cNSq89dZbatasmfPfPMbu
tW7dWt27d3f+OxAIqHHjxnr99dc9PFV02b17tyzL0syZMyVJPp9PtWrV0ujRo537rF69WpZlaf78+V4dMyI
dOnRIzZs31+TJk9W+fXsnQHiMq0ZCQoIuv/zy477dtm01atRI/
fv3d27z+XyKi4vTyJEjw3FEVDMCBCFZuHChLMvS0KFDddFFF6lRo0a6/
vrrlZ6e7tynT58+uvDCC0u938aNG2VZlpYsWRLuI0esnTt36owzztDixYuVmZlZJkDuv//
+Mk99mzZtmizL0v79+8N93Kjw/
PPP65JLLnH+m8fYnby8PNWsWVNjx44tdXvnzp3VsWNHj04VfTIyMmRZlvN1eOrUqbIsSwcOHCh1vyZNmmjA
gAFeHDFide7cWT169JCkUgHCY1w1zjvvPPXo0UO33XabGjZsqIsuukgff/yx8/YNGzaU+/
TjK6+8Uk888US4j4tqQIAgJCNHjpRlWWrSpInGjBmj1NRU3X333fp//+//ad+
+fZKkRx55RNdee22p9zty5Igsy1JycrIXx444tm3r+uuv16uvvipJ5QbI3//+d3Xp0qXU+xV/
p2TVqlVhPW80yMjI0IknnljqLz8eY3e2bdsmy7I0b968Urf/97//
VevWrT06VXQJBAK68cYbddlllzm3jRgxQrVr1y5z31atWum5554L5/
Ei2siRI9WyZUvnqT4lA4THuGrExcUpLi5OvXr10pIlSzRkyBDVqVNHw4cPlyTNnTtXlmVp+/
btpd7v9ttv1x133OHFkVHFCJAYl5CQIMuyfvFavXq1RowYIcuySj0HPjc3V6eccoo+
+ugjSQTILwn1cX7vvfd02WWXye/3SyJAKiLUx7ikrVu36g9/+IMefvjhUrfzGLtDgFS/
rl27Kj4+XllZWc5tLMfubdmyRaeeeqrS0tKc2wiQqlerVi21bdu21G2PP/
642rRpI4kAiQUESIzbvXu3Vq9e/YtXXl6e8/ST2bNnl3r/
1q1bq3fv3pJ4CtYvCfVx7tSpk37zm9+oZs2azmVZlmrWrKnOnTtL4ulBxxPqY1xs27Ztat68ue6//34FAoF
SH4vH2B2eglW9unfvrjPPPFMbN24sdTtPD3Jv7Nixztfckl+Da9SooZo1a2rKlCk8xlWgSZMmZf7hZ9CgQW
rcuLEknoIVCwgQhCQ7O1txcXGlXoSen5+vU0891fmuSPGL0Ev+lJshQ4boxBNPVG5ubtjPHIk2b96s9PR05
5o4caIsy9KYMWOcf+ksfoF0fn6+8369evXiBdIVsHXrVjVv3lx33XWX892mkniM3WvdurUee+wx578DgYDO
OOMMXoTugm3b6t69uxo3blzujyMtfoH0mDFjnNvWrFnDC6Qr4ODBg6W+Bqenp+vSSy/Vfffdp/
T0dB7jKnL33XeXeRF6jx49nO+KFL8I/e2333beXryH8CL06ECAIGRPPvmkzjjjDE2cOFFr1qzRww8/
rFNPPdX5F+HiH8N77bXXatmyZUpJSVHDhg35MbwulPcULJ/Pp9NOO03333+/
VqxYoVGjRqlu3br8iNgQbd26Veecc446dOigrVu3aseOHc5VjMfYvVGjRikuLk7Dhw/
XqlWr1KVLF9Wv///
bu2PVRIIwgONNcHFBYkC0CFhbWAupTWMV8ham3mcIbO8DbKMPIPZiKcFKbIKNT5EizXfV5eLdBS4oE3L8fv
UUwzDNH3bna5qXcIKHh4e4vLyM1Wp1dG9fXl7e1ozH4+h2u7FcLmOz2cTNzc0fn7rwOe8/
wYpwxufw9PQUFxcX8fj4GPv9PmazWeR5HtPp9G1NWZbRbDZjPp/HdruNu7s7z/D+RwQI/
+z19TWKooh2ux2NRiNub29jt9sdrTkcDjEajaJer0er1YqiKAwiPMHfAiTieEje9fV1lGX5RTv8fqqq+vAf
kfec8ekmk0l0u92o1WoxGAxivV5/9Za+tY/ubVVVb2t+Dsm7urqKPM/j/v7+KK75vN8DxBmfx2KxiH6/
H1mWRa/
XO3oIJOLXIMJOpxNZlsVwOIzn5+cv2i3nJkAAAIBkBAgAAJCMAAEAAJIRIAAAQDICBAAASEaAAAAAyQgQAA
AgGQECAAAkI0AAAIBkBAgAAJCMAAEAAJIRIAAAQDICBAAASEaAAAAAyQgQAAAgGQECAAAkI0AAAIBkBAgAA
JCMAAEAAJIRIAAAQDICBAAASEaAAAAAyQgQAAAgmR/EFRo+qriQsAAAAABJRU5ErkJggg==\"
width=\"800\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"L = 64 # longueur de l'onde\n",
"\n",
"waveform = np.ones([L])\n",
"\n",
"norm_w = (np.sum(waveform**2))\n",
"\n",
"plt.figure()\n",
"plt.plot(waveform)\n",
"plt.ylim([-0.1, 1.1])\n",
"plt.title(\"Forme d'onde\")\n",
"\n",
"autocorr = si.correlate(waveform, waveform)\n",
"idx = np.arange(-(L-1), L)\n",
"\n",
"plt.figure()\n",
"plt.plot(idx, autocorr)\n",
"plt.title(\"Autocorrélation\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On transmet 8 bits d'informations."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"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 = $('<div/>');\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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all '
+\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\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 = $('<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 = $('<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 = $('<canvas/>');\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 = $('<div/>');\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 = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all
' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\
n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt ===
mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then
trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\
n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id:
this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format =
format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\
n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL ||
window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21)
== \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message
type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \",
msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type +
\"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-
in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from
http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the
document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-
home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-
arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-
right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan
axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"],
[\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"],
[\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-
save\", \"download\"]];\n",
"\n",
"mpl.extensions =
[\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm)
{\n",
" // Create a \"websocket\"-like object which calls the given IPython
comm\n",
" // object with the appropriate methods. Currently this is a non binary\
n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage
function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a
real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id +
\"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in
FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' +
width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\"
width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\"
title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></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 = $('<span class=\"mpl-message\" style=\"text-
align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline
pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\"
title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove
icon-large\"></i></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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 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"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img
src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAGQCAYAAABWJQQ0AAAgAElEQVR
4nO3de3RV5Z3/8Y2RcxAhCUqUm8QbUAcs0NFTXTpmzdBBhjphtfUGU4nSgepABVsp2IpZMnJpdakUpd4g9D
IDdc1wsQqisNAlIBHGFJCgXEQb7oomRCCRnHx+f/jj1GMCnM1Xzt4P+/
1a61mr2dnn8PS7ntvHZJ94AgAAAIAs8YLuAAAAAIDoIIAAAAAAyBoCCAAAAICsIYAAAAAAyBoCCAAAAICsI
YAAAAAAyBoCCAAAAICsIYAAAAAAyBoCCAAAAICsIYAAAAAAyBoCCAAAAICsIYAAAAAAyBoCCAAAAICsIYAA
AAAAyBoCCAAAAICsIYAAAAAAyBoCCAAAAICsIYAAAAAAyBoCCAAAAICsIYAAAAAAyBoCCAAAAICsIYAAAAA
AyBoCCAAAAICsIYAAAAAAyBoCCAAgdH7zm9/o97//fdDdAACcAgQQAECo/
OY3v1H79u21efPmoLsCADgFCCAAcBoqKyuT53mpFo/H1bFjR/Xv31/
Tpk3TgQMHgu5is9566y3l5+frzTffDLorAIBThAACAKehowFk4sSJ+sMf/qBZs2Zp8uTJ6t+/
v1q0aKHCwkKtW7cu6G42UVZWpmXLlgXdDQDAKUQAAYDT0NEAsmbNmibfW7Zsmc466ywVFhbq0KFDAfQOABB
lBBAAOA0dL4BI0uTJk+V5np555pnUtWXLlunaa69V69atlZeXp+LiYlVWVqa9rrS0VJ7nacuWLSopKVFeXp
5yc3N1++236+DBg2n3ep6nkSNHav78+erZs6disZj+7u/
+TosXL27Snx07duiOO+7Qeeedl7pv5syZTe6rq6vTAw88oEsuuUSxWExdunTR2LFjVVdXl3bfK6+8omuuuU
Z5eXk6++yz1b17d913330Z1w8AcOoQQADgNHSiAFJVVSXP83TjjTdKkl599VWdeeaZ6t69u37961/
rwQcfVPv27dWuXTtt37499bqjAaRv3776/ve/rxkzZujf//3f5Xmefv7zn6f9G57nqXfv3urYsaP+8z//
U48//rguvvhitW7dWh9//HHqvj179qhLly664IILNHHiRP32t79VcXGxPM/TY489lrovmUyqf//
+at26tcaMGaOnn35ao0aN0plnnqlBgwal7nvnnXcUi8V0xRVXaNq0aXrqqad077336rrrrvs6SgsAMCKAAM
Bp6EQBRJLy8vLUt29fSVKfPn103nnnaf/+/anvr1u3TmeccYaGDh2aunY0gAwbNiztvb73ve/
p3HPPTbvmeZ5isZi2bt2a9p6e52n69Ompaz/60Y/UsWPHtFAiSbfeeqvy8vJSvyb2hz/
8QWeccYbeeOONtPueeuopeZ6nlStXSpIee+wxeZ6njz766NgFAgAEhgACAKehTAJI586ddemll2rXrl3N/
gRDkq6//nq1b98+9fXRAPLWW2+l3ffoo4/
K8zzV1NSkrnmep4EDBzZ5z9zcXN1zzz2SpMbGRuXn52vEiBH66KOP0trR/
w8rVqyQJBUXF6tnz55N7tu8ebM8z9NDDz2U9v/9ueeeUzKZ9FE1AEA2EEAA4DTk5ycgb775pjzPa/
aZizFjxsjzPH322WeS/hZA9uzZ0+y/98EHH6SueZ6nO+
+8s8l7FhYW6vbbb5ck7d27N+3jgptr8+bNkyRddtllx73v7rvvliQdOnRI11xzjTzPU/
v27XXLLbfoT3/6E2EEAEKCAAIAp6FMnwG56aabTiqAfPXXm47+e19+XuToQ+hfVVhYqJKSEknS7t275Xmef
vjDH+rVV19ttu3du1eS1KNHD11++eXHvO/dd99N/RvJZFJLly7VPffckwou//RP/
6SGhgZfdQQAfP0IIABwGsr0U7Cee+654/4K1oABA5r9FayvK4A0NDSobdu2Gjx48An/
Pw0cOFCdO3dWY2PjCe/9qkmTJsnzPL366qu+XwsA+HoRQADgNJTJ3wG56KKLdPjwYUlfPIR+/
vnn69NPP03dt2HDhmM+hP51BRBJuv322xWLxbRhw4Ym9+7bty/1v2fPni3P8/T00083ue/
QoUOpn9J8+UH6o1566SV5nqcXX3yxyfcAANlFAAGA09BX/xJ6WVmZpk6dmvpL6BdeeGHagf/ox/
B+4xvf0MMPP6yJEyeqoKBA7dq10/
vvv5+671QEkD179qiwsFCtW7fW6NGj9fTTT2vKlCm66aab1K5du9R9yWRSAwcOVIsWLXTrrbdq+vTpevzxx
3XnnXfqnHPOSYWt0aNHq2/fvrr//
vv17LPPatKkSercubO6dOmi6upqa2kBAEYEEAA4DR0NBEdbLBZThw4d9M///
M+aNm2aDhw40OQ1S5cu1TXXXKOzzjpLubm5+td//ddj/iHCrzOASF88jD5y5EhdcMEFatmypTp06KB+/
fql/
aFESfr888/1q1/9Sj179lQ8Hle7du3093//93rwwQdTn8C1bNkyDRo0SJ06dVIsFlOnTp00ePBgbd682U8J
AQCnCAEEAAAAQNYQQAAAAABkDQEEAAAAQNYQQAAAAABkDQEEAAAAQNYQQAAAAABkDQEEAAAAQNYQQEIkmUy
qqqpK1dXVqqmpodFoNBqNRqOFrFVXV6uqqkrJZDLoo6OzCCAhUlVVlfaHw2g0Go1Go9Fo4WxVVVVBHx2dRQ
AJkerq6tSADjrd02g0Go1Go9GatqP/wbi6ujroo6OzCCAhUlNTI8/
zVFNTE3RXAAAA0AzOa3YEkBBhQAMAAIQb5zU7AkiIMKABAADCjfOaHQEkRBjQAAAA4cZ5zY4AEiIMaAAAgH
DjvGZHAAkRBjQAAEC4cV6zI4CECAMaAAAg3Div2RFAQiSbA7oh2ahVWz/
WgoodWrX1YzUkG0/5vwng68U8tqF+dtQQQQtiDBJA7CIZQF5//XXdcMMN6tixozzP0/
z580/4muXLl6tv376KxWK65JJLVFZW1uSeJ554QoWFhYrH40okEiovL/
fVr2wN6MUbdumqyUtVOO7FVLtq8lIt3rDrlP67AL4+zGMb6mdHDRG0oMYgAcQukgFk0aJF+uUvf6l58+ZlF
EDef/99tW7dWj/96U9VWVmp6dOnKycnRy+//HLqnrlz5yoWi2nWrFnauHGjhg8frvz8fO3duzfjfmVjQC/
esEsXfmmiHm0X/v/GxgGEH/PYhvrZUUMELcgxSACxi2QA+bJMAsjPf/
5z9ezZM+3aLbfcouuvvz71dSKR0MiRI1NfJ5NJderUSVOmTMm4L6d6QDckG5v8l4KvTtqrJi/
lR+hAiDGPbaifHTVE0IIegwQQOwJIBgHkH/
7hHzR69Oi0a7NmzVJubq4kqb6+Xjk5OU3eZ+jQoSouLj7m+9bV1ammpibVqqqqTumAXrX142NO1i+3VVs/
PiX/PgA75rEN9bOjhgha0GOQAGJHAMkggHTr1k2TJ09Ou/bSSy/
J8zwdOnRIO3fulOd5WrVqVdo9Y8eOVSKROOb7lpaWyvO8Ju1UDegFFTsymrALKnackn8fgB3z2Ib62VFDBC
3oMUgAsSOABBhA+AkIAL+YxzbUz44aImhBj0ECiB0BJMBfwfqqbD0D0txDW4Xj+L1dwAXMYxvqZ0cNEbSgx
yABxI4AkuFD6L169Uq7Nnjw4CYPoY8aNSr1dTKZVOfOnUP1ELr0t0+N+Oqk5ZNLAHcwj22onx01RNCCHIME
ELtIBpDa2lpVVFSooqJCnufp0UcfVUVFhT788ENJ0vjx43Xbbbel7j/
6Mbxjx47Vpk2b9OSTTzb7MbzxeFyzZ89WZWWlRowYofz8fO3ZsyfjfmXz74AkJr2aNmH57HbALcxjG+pnRw
0RtKDGIAHELpIBZPny5c0+/
F1SUiJJKikpUVFRUZPX9OnTR7FYTBdffHGzf4hw+vTp6tq1q2KxmBKJhFavXu2rX9kc0AcOf56arMvf3cuP
ygEHMY9tqJ8dNUTQghiDBBC7SAaQsMrmgD5YfyQ1YQ/WHznl/x6Arx/
z2Ib62VFDBC2IMUgAsSOAhAgBBIAfzGMb6mdHDRE0AoibCCAhQgAB4Afz2Ib62VFDBI0A4iYCSIgQQAD4wT
y2oX521BBBI4C4iQASIgQQAH4wj22onx01RNAIIG4igIQIAQSAH8xjG+pnRw0RNAKImwggIUIAAeAH89iG+
tlRQwSNAOImAkiIEEAA+ME8tqF+dtQQQSOAuIkAEiIEEAB+MI9tqJ8dNUTQCCBuIoCECAEEgB/
MYxvqZ0cNETQCiJsIICFCAAHgB/
PYhvrZUUMEjQDiJgJIiBBAAPjBPLahfnbUEEEjgLiJABIiBBAAfjCPbaifHTVE0AggbiKAhAgBBIAfzGMb6
mdHDRE0AoibCCAhQgAB4Afz2Ib62VFDBI0A4iYCSIgQQAD4wTy2oX521BBBI4C4iQASIgQQAH4wj22onx01
RNAIIG4igIQIAQSAH8xjG+pnRw0RNAKImwggIUIAAeAH89iG+tlRQwSNAOImAkiIEEAA+ME8tqF+dtQQQSO
AuIkAEiIEEAB+MI9tqJ8dNUTQCCBuIoCECAEEgB/MYxvqZ0cNETQCiJsIICFCAAHgB/
PYhvrZUUMEjQDiJgJIiBBAAPjBPLahfnbUEEEjgLgp0gHkiSeeUGFhoeLxuBKJhMrLy495b1FRkTzPa9IGD
hyYuqekpKTJ96+//vqM+0MAAeAH89iG+tlRQwSNAOKmyAaQuXPnKhaLadasWdq4caOGDx+u/
Px87d27t9n79+/fr927d6faO++8o5ycHJWVlaXuKSkp0YABA9Lu++STTzLuEwEEgB/
MYxvqZ0cNETQCiJsiG0ASiYRGjhyZ+jqZTKpTp06aMmVKRq9/7LHH1LZtW3322WepayUlJRo0aNBJ94kAAs
AP5rEN9bOjhggaAcRNkQwg9fX1ysnJ0fz589OuDx06VMXFxRm9R69evTR8+PC0ayUlJcrLy1NBQYG6d+
+uO++8Ux9//HHG/SKAAPCDeWxD/
eyoIYJGAHFTJAPIzp075XmeVq1alXZ97NixSiQSJ3x9eXm5PM9r8szInDlztHDhQq1fv17z58/
XZZddpiuvvFINDQ3Nvk9dXZ1qampSraqqigACIGPMYxvqZ0cNETQCiJsIIF+SaQAZMWKELr/
88hPet23bNnmep6VLlzb7/dLS0mYfbCeAAMgE89iG+tlRQwSNAOKmSAYQy69gffbZZ8rNzdXjjz+e0b/
Vvn17PfXUU81+j5+AALBgHttQPztqiKARQNwUyQAiffEQ+qhRo1JfJ5NJde7c+YQPoZeVlSkej2f0bEdVVZ
VatGihhQsXZtQnngEB4Afz2Ib62VFDBI0A4qbIBpC5c+cqHo9r9uzZqqys1IgRI5Sfn689e/
ZIkm677TaNHz+
+yeuuvfZa3XLLLU2u19bW6t5779Wbb76p7du3a+nSpfrWt76lbt26qa6uLqM+EUAA+ME8tqF+dtQQQSOAuC
myAUSSpk+frq5duyoWiymRSGj16tWp7xUVFamkpCTt/nfffVee5+mVV15p8l6HDh1S//
79VVBQoJYtW6qwsFDDhw9PBZpMEEAA+ME8tqF+dtQQQSOAuCnSASRsCCAA/GAe21A/
O2qIoBFA3EQACRECCAA/mMc21M+OGiJoBBA3EUBChAACwA/msQ31s6OGCBoBxE0EkBAhgADwg3lsQ/
3sqCGCRgBxEwEkRAggAPxgHttQPztqiKARQNxEAAkRAggAP5jHNtTPjhoiaAQQNxFAQoQAAsAP5rEN9bOjh
ggaAcRNBJAQIYAA8IN5bEP97KghgkYAcRMBJEQIIAD8YB7bUD87aoigEUDcRAAJEQIIAD+YxzbUz44aImgE
EDcRQEKEAALAD+axDfWzo4YIGgHETQSQECGAAPCDeWxD/eyoIYJGAHETASRECCAA/GAe21A/
O2qIoBFA3EQACRECCAA/mMc21M+OGiJoBBA3EUBChAACwA/msQ31s6OGCBoBxE0EkBAhgADwg3lsQ/
3sqCGCRgBxEwEkRAggAPxgHttQPztqiKARQNxEAAkRAggAP5jHNtTPjhoiaAQQNxFAQoQAAsAP5rEN9bOjh
ggaAcRNBJAQIYAA8IN5bEP97KghgkYAcRMBJEQIIAD8YB7bUD87aoigEUDcRAAJEQIIAD+YxzbUz44aImgE
EDcRQEKEAALAD+axDfWzo4YIGgHETQSQECGAAPCDeWxD/eyoIYJGAHETASRECCAA/GAe21A/
O2qIoBFA3EQACRECCAA/
mMc21M+OGiJoBBA3RTqAPPHEEyosLFQ8HlcikVB5efkx7y0rK5PneWktHo+n3dPY2KgJEyaoQ4cOatWqlfr
166fNmzdn3B8CCAA/mMc21M+OGiJoBBA3RTaAzJ07V7FYTLNmzdLGjRs1fPhw5efna+/
evc3eX1ZWptzcXO3evTvV9uzZk3bP1KlTlZeXpwULFmjdunUqLi7WRRddpMOHD2fUJwIIAD+YxzbUz44aIm
gEEDdFNoAkEgmNHDky9XUymVSnTp00ZcqUZu8vKytTXl7eMd+vsbFRHTp00MMPP5y6Vl1drXg8rjlz5mTUJ
wIIAD+YxzbUz44aImgEEDdFMoDU19crJydH8+fPT7s+dOhQFRcXN/
uasrIy5eTkqGvXrurSpYuKi4v1zjvvpL6/
bds2eZ6nioqKtNddd911uvvuu5t9z7q6OtXU1KRaVVUVAQRAxpjHNtTPjhoiaAQQN0UygOzcuVOe52nVqlV
p18eOHatEItHsa1atWqXf/
e53qqio0GuvvaYbbrhBubm5qqqqkiStXLlSnudp165daa+76aabdPPNNzf7nqWlpU2eKyGAAMgU89iG+tlR
QwSNAOImAsiXHC+AfNXnn3+uSy65RPfff7+kkwsg/
AQEgAXz2Ib62VFDBI0A4qZIBpCT+RWs5tx444269dZbJZ3cr2B9Fc+AAPCDeWxD/
eyoIYJGAHFTJAOI9MVD6KNGjUp9nUwm1blz52M+hP5VDQ0N6tGjh+655x5Jf3sI/
ZFHHkndU1NTw0PoAE4Z5rEN9bOjhggaAcRNkQ0gc+fOVTwe1+zZs1VZWakRI0YoPz8/9dG6t912m8aPH5+6
/8EHH9SSJUu0bds2/d///
Z9uvfVWtWrVShs3bkzdM3XqVOXn52vhwoVav369Bg0axMfwAjhlmMc21M+OGiJoBBA3RTaASNL06dPVtWtX
xWIxJRIJrV69OvW9oqIilZSUpL4eM2ZM6t7zzz9fAwcO1Ntvv532fkf/
EOH555+veDyufv366b333su4PwQQAH4wj22onx01RNAIIG6KdAAJGwIIAD+YxzbUz44aImgEEDcRQEKEAAL
AD+axDfWzo4YIGgHETQSQECGAAPCDeWxD/eyoIYJGAHETASRECCAA/GAe21A/O2qIoBFA3EQACRECCAA/
mMc21M+OGiJoBBA3EUBChAACwA/msQ31s6OGCBoBxE0EkBAhgADwg3lsQ/
3sqCGCRgBxEwEkRAggAPxgHttQPztqiKARQNxEAAkRAggAP5jHNtTPjhoiaAQQNxFAQoQAAsAP5rEN9bOjh
ggaAcRNBJAQIYAA8IN5bEP97KghgkYAcRMBJEQIIAD8YB7bUD87aoigEUDcRAAJEQIIAD+YxzbUz44aImgE
EDcRQEKEAALAD+axDfWzo4YIGgHETQSQECGAAPCDeWxD/eyoIYJGAHETASRECCAA/GAe21A/
O2qIoBFA3EQACRECCAA/mMc21M+OGiJoBBA3EUBChAACwA/msQ31s6OGCBoBxE0EkBAhgADwg3lsQ/
3sqCGCRgBxEwEkRAggAPxgHttQPztqiKARQNxEAAkRAggAP5jHNtTPjhoiaAQQNxFAQoQAAsAP5rEN9bOjh
ggaAcRNBJAQIYAA8IN5bEP97KghgkYAcRMBJEQIIAD8YB7bUD87aoigEUDcFOkA8sQTT6iwsFDxeFyJRELl
5eXHvPeZZ57Rtddeq/z8fOXn56tfv35N7i8pKZHneWnt+uuvz7g/
BBAAfjCPbaifHTVE0AggbopsAJk7d65isZhmzZqljRs3avjw4crPz9fevXubvX/
IkCF68sknVVFRoU2bNun2229XXl6eduzYkbqnpKREAwYM0O7du1Ptk08+ybhPBBAAfjCPbaifHTVE0Aggbo
psAEkkEho5cmTq62QyqU6dOmnKlCkZvb6hoUFt27bV7373u9S1kpISDRo06KT7RAAB4Afz2Ib62VFDBI0A4
qZIBpD6+nrl5ORo/
vz5adeHDh2q4uLijN7jwIEDatWqlf785z+nrpWUlCgvL08FBQXq3r277rzzTn388ccZ94sAAsAP5rEN9bOj
hggaAcRNkQwgO3fulOd5WrVqVdr1sWPHKpFIZPQed911ly6++GIdPnw4dW3OnDlauHCh1q9fr/
nz5+uyyy7TlVdeqYaGhmbfo66uTjU1NalWVVVFAAGQMeaxDfWzo4YIGgHETQSQL8k0gEyZMkXt2rXTunXrj
nvftm3b5Hmeli5d2uz3S0tLmzy0TgABkCnmsQ31s6OGCBoBxE2RDCCWX8F6+OGHlZeXpzVr1mT0b7Vv315P
PfVUs9/jJyAALJjHNtTPjhoiaAQQN0UygEhfPIQ+atSo1NfJZFKdO3c+7kPov/
rVr5Sbm6s333wzo3+jqqpKLVq00MKFCzO6n2dAAPjBPLahfnbUEEEjgLgpsgFk7ty5isfjmj17tiorKzVix
Ajl5+drz549kqTbbrtN48ePT90/depUxWIx/c///E/
ax+zW1tZKkmpra3XvvffqzTff1Pbt27V06VJ961vfUrdu3VRXV5dRnwggAPxgHttQPztqiKARQNwU2QAiSd
OnT1fXrl0Vi8WUSCS0evXq1PeKiopUUlKS+rqwsLDZ5zVKS0slSYcOHVL//
v1VUFCgli1bqrCwUMOHD08FmkwQQAD4wTy2oX521BBBI4C4KdIBJGwIIAD8YB7bUD87aoigEUDcRAAJEQII
AD+YxzbUz44aImgEEDcRQEKEAALAD+axDfWzo4YIGgHETQSQECGAAPCDeWxD/eyoIYJGAHETASRECCAA/
GAe21A/O2qIoBFA3EQACRECCAA/mMc21M+OGiJoBBA3EUBChAACwA/
msQ31s6OGCBoBxE0EkBAhgADwg3lsQ/
3sqCGCRgBxEwEkRAggAPxgHttQPztqiKARQNxEAAkRAggAP5jHNtTPjhoiaAQQNxFAQoQAAsAP5rEN9bOjh
ggaAcRNBJAQIYAA8IN5bEP97KghgkYAcRMBJEQIIAD8YB7bUD87aoigEUDcRAAJEQIIAD+YxzbUz44aImgE
EDcRQEKEAALAD+axDfWzo4YIGgHETQSQECGAAPCDeWxD/eyoIYJGAHETASRECCAA/GAe21A/
O2qIoBFA3EQACRECCAA/mMc21M+OGiJoBBA3EUBChAACwA/msQ31s6OGCBoBxE0EkBAhgADwg3lsQ/
3sqCGCRgBxEwEkRAggAPxgHttQPztqiKARQNxEAAkRAggAP5jHNtTPjhoiaAQQNxFAQoQAAsAP5rEN9bOjh
ggaAcRNBJAQIYAA8IN5bEP97KghgkYAcRMBJEQIIAD8YB7bUD87aoigEUDcRAAJEQIIAD+YxzbUz44aImgE
EDdFOoA88cQTKiwsVDweVyKRUHl5+XHvf/7559WjRw/
F43H16tVLL730Utr3GxsbNWHCBHXo0EGtWrVSv379tHnz5oz7QwAB4Afz2Ib62VFDBI0A4qbIBpC5c+cqFo
tp1qxZ2rhxo4YPH678/Hzt3bu32ftXrlypnJwc/frXv1ZlZaXuv/
9+tWzZUhs2bEjdM3XqVOXl5WnBggVat26diouLddFFF+nw4cMZ9YkAAsAP5rEN9bOjhggaAcRNkQ0giURCI
0eOTH2dTCbVqVMnTZkypd
n7b775Zn33u99Nu/btb39bP/7xjyV98dOPDh066OGHH059v7q6WvF4XHPmzMmoT9kc0J/Vfa7uP/tfdf/
Z/6r20xolDx6k0WiOtdpPa5jH1I8a0iLdvjwGP6v7/JSfnyQCyNchkgGkvr5eOTk5mj9/
ftr1oUOHqri4uNnXXHDBBXrsscfSrj3wwAP65je/
KUnatm2bPM9TRUVF2j3XXXed7r777mbfs66uTjU1NalWVVWVtQFd+2mNKnt8g0aj0Wg0Gu20aLWfZicQEED
sIhlAdu7cKc/ztGrVqrTrY8eOVSKRaPY1LVu21H//
93+nXXvyySd13nnnSfriV7Q8z9OuXbvS7rnpppt08803N/
uepaWl8jyvScvGgE4ePBj4QkGj0Wg0Go32dbXkwYOn/PwkEUC+DgSQL8l2AAnyJyCNjY2B/9jU9cavHlA/
Go1GszTWwa+3NTY2nvLzk0QA+TpEMoCE5VewvooB7RYevrShfgCijnXQTZzX7CIZQKQvHkIfNWpU6utkMqn
OnTsf9yH0G264Ie3a1Vdf3eQh9EceeST1/
ZqamtA+hA47Ng4b6gcg6lgH3cR5zS6yAWTu3LmKx+OaPXu2KisrNWLECOXn52vPnj2SpNtuu03jx49P3b9y
5UqdeeaZeuSRR7Rp0yaVlpY2+zG8+fn5WrhwodavX69BgwaF9mN4YcfGYUP9AEQd66CbOK/
ZRTaASNL06dPVtWtXxWIxJRIJrV69OvW9oqIilZSUpN3//PPPq3v37orFYurZs+cx/
xDh+eefr3g8rn79+um9997LuD8MaLewcdhQPwBRxzroJs5rdpEOIGHDgHYLG4cN9QMQdayDbuK8ZkcACREG
tFvYOGyoH4CoYx10E+c1OwJIiDCg3cLGYUP9AEQd66CbOK/
ZEUBChAHtFjYOG+oHIOpYB93Eec2OABIiDGi3sHHYUD8AUcc66CbOa3YEkBBhQLuFjcOG+gGIOtZBN3Fesy
OAhAgD2i1sHDbUD0DUsQ66ifOaHfMoR5oAABuYSURBVAEkRBjQbmHjsKF+AKKOddBNnNfsCCAhwoB2CxuHD
fUDEHWsg27ivGZHAAkRBrRb2DhsqB+AqGMddBPnNTsCSIgwoN3CxmFD/
QBEHeugmziv2RFAQoQB7RY2DhvqByDqWAfdxHnNjgASIgxot7Bx2FA/
AFHHOugmzmt2BJAQYUC7hY3DhvoBiDrWQTdxXrMjgIQIA9otbBw21A9A1LEOuonzmh0BJEQY0G5h47ChfgC
ijnXQTZzX7AggIcKAdgsbhw31AxB1rINu4rxmRwAJEQa0W9g4bKgfgKhjHXQT5zU7AkiIMKDdwsZhQ/
0ARB3roJs4r9kRQEKEAe0WNg4b6gcg6lgH3cR5zY4AEiIMaLewcdhQPwBRxzroJs5rdgSQEGFAu4WNw4b6A
Yg61kE3cV6zI4CECAPaLWwcNtQPQNSxDrqJ85odASREGNBuYeOwoX4Aoo510E2c1+wiF0D279+vIUOGqG3b
tsrLy9OwYcNUW1t73PtHjRql7t27q1WrVrrgggv0k5/8RNXV1Wn3eZ7XpM2ZM8dX3xjQbmHjsKF+AKKOddB
NnNfsIhdABgwYoN69e2v16tV64403dOmll2rw4MHHvH/Dhg36/ve/rxdeeEFbt27VsmXL1K1bN/
3gBz9Iu8/
zPJWVlWn37t2pdvjwYV99Y0C7hY3DhvoBiDrWQTdxXrOLVACprKyU53las2ZN6trixYvVokUL7dy5M+P3ef
755xWLxXTkyN8WC8/zNH/+fFP/GNBuYeOwoX4Aoo510E2c1+wiFUBmzpyp/Pz8tGtHjhxRTk6O5s2bl/
H7PPvss2rfvn3aNc/
z1KlTJ5177rm68sorNXPmTDU2NvrqHwPaLWwcNtQPQNSxDrqJ85pdpALIpEmT1L179ybXCwoKNGPGjIze46
OPPlLXrl31i1/8Iu36xIkTtWLFCr399tuaOnWq4vG4pk2bdtz3qqurU01NTapVVVUxoB3CxmFD/
QBEHeugmwggdqdFABk3blyzD4F/uW3atMkcQGpqapRIJDRgwAB9/
vnnx713woQJ6tKly3HvKS0tbbavDGg3sHHYUD8AUcc66CYCiN1pEUD27dunTZs2HbfV19ebfgXrwIEDuvrq
q9WvX7+MHi5/8cUX5Xme6urqjnkPPwFxGxuHDfUDEHWsg24igNidFgEkU0cfQl+7dm3q2pIlS074EHpNTY2
uuuoqFRUV6eDBgxn9Ww899JDatWvnq38MaLewcdhQPwBRxzroJs5rdpEKINIXH8Pbt29flZeXa8WKFerWrV
vax/Du2LFDPXr0UHl5uaQvBtm3v/1tXX755dq6dWvax+w2NDRIkl544QU9+
+yz2rBhg7Zs2aIZM2aodevWeuCBB3z1jQHtFjYOG+oHIOpYB93Eec0ucgFk//
79Gjx4sNq0aaPc3FzdcccdaX+IcPv27fI8T8uXL5ckLV++/JjPlWzfvl3SFx/
l26dPH7Vp00Znn322evfuraeeekrJZNJX3xjQbmHjsKF+AKKOddBNnNfsIhdAwowB7RY2DhvqByDqWAfdxH
nNjgASIgxot7Bx2FA/
AFHHOugmzmt2BJAQYUC7hY3DhvoBiDrWQTdxXrMjgIQIA9otbBw21A9A1LEOuonzmh0BJEQY0G5h47ChfgC
ijnXQTZzX7AggIcKAdgsbhw31AxB1rINu4rxmRwAJEQa0W9g4bKgfgKhjHXQT5zU7AkiIMKDdwsZhQ/
0ARB3roJs4r9kRQEKEAe0WNg4b6gcg6lgH3cR5zY4AEiIMaLewcdhQPwBRxzroJs5rdgSQEGFAu4WNw4b6A
Yg61kE3cV6zI4CECAPaLWwcNtQPQNSxDrqJ85odASREGNBuYeOwoX4Aoo510E2c1+wIICHCgHYLG4cN9QMQ
dayDbuK8ZkcACREGtFvYOGyoH4CoYx10E+c1OwJIiDCg3cLGYUP9AEQd66CbOK/
ZEUBChAHtFjYOG+oHIOpYB93Eec2OABIiDGi3sHHYUD8AUcc66CbOa3YEkBBhQLuFjcOG+gGIOtZBN3Fesy
OAhAgD2i1sHDbUD0DUsQ66ifOaHQEkRBjQbmHjsKF+AKKOddBNnNfsCCAhwoB2CxuHDfUDEHWsg27ivGZHA
AkRBrRb2DhsqB+AqGMddBPnNTsCSIgwoN3CxmFD/
QBEHeugmziv2RFAQoQB7RY2DhvqByDqWAfdxHnNjgASIgxot7Bx2FA/AFHHOugmzmt2kQsg+/
fv15AhQ9S2bVvl5eVp2LBhqq2tPe5rioqK5HleWvvxj3+cds+HH36ogQMH6qyzzlJBQYHuvfdeHTnibzFhQ
LuFjcOG+gGIOtZBN3Fes4tcABkwYIB69+6t1atX64033tCll16qwYMHH/
c1RUVFGj58uHbv3p1qXx50DQ0N6tWrl77zne+ooqJCixYtUvv27XXffff56hsD2i1sHDbUD0DUsQ66ifOaX
aQCSGVlpTzP05o1a1LXFi9erBYtWmjnzp3HfF1RUZFGjx59zO8vWrRIZ5xxhvbs2ZO69tvf/la5ubmqr6/
PuH8MaLewcdhQPwBRxzroJs5rdpEKIDNnzlR+fn7atSNHjignJ0fz5s075uuKiorUvn17nXvuuerZs6fGjx
+vgwcPpr4/YcIE9e7dO+0177//vjzP09tvv33M962rq1NNTU2qVVVVMaAdwsZhQ/
0ARB3roJsIIHaRCiCTJk1S9+7dm1wvKCjQjBkzjvm6p59+Wi+//LLWr1+vP/7xj+rcubO+973vpb4/
fPhw9e/fP+01Bw8elOd5WrRo0THft7S0tMmzJQxod7Bx2FA/AFHHOugmAojdaRFAxo0b1+xB/
stt06ZNJx1AvmrZsmXyPE9bt26VdPIBhJ+AuI2Nw4b6AYg61kE3EUDsTosAsm/fPm3atOm4rb6+/qR/
BeurPvvsM3mep5dfflnSyf8K1lcxoN3CxmFD/
QBEHeugmziv2Z0WASRTRx9CX7t2berakiVLTvgQ+letWLFCnudp3bp1kv72EPrevXtT9zz99NPKzc1VXV1d
xu/
LgHYLG4cN9QMQdayDbuK8ZhepACJ98TG8ffv2VXl5uVasWKFu3bqlfQzvjh071KNHD5WXl0uStm7dqokTJ2
rt2rXavn27Fi5cqIsvvljXXXdd6jVHP4a3f//++stf/
qKXX35ZBQUFfAzvaY6Nw4b6AYg61kE3cV6zi1wA2b9/
vwYPHqw2bdooNzdXd9xxR9ofIty+fbs8z9Py5cslSX/
961913XXX6ZxzzlE8Htell16qsWPHNhl0H3zwgf7lX/5FZ511ltq3b6+f/exn/
CHC0xwbhw31AxB1rINu4rxmF7kAEmYMaLewcdhQPwBRxzroJs5rdgSQEGFAu4WNw4b6AYg61kE3cV6zI4CE
CAPaLWwcNtQPQNSxDrqJ85odASREGNBuYeOwoX4Aoo510E2c1+wIICHCgHYLG4cN9QMQdayDbuK8ZkcACRE
GtFvYOGyoH4CoYx10E+c1OwJIiDCg3cLGYUP9AEQd66CbOK/
ZEUBChAHtFjYOG+oHIOpYB93Eec2OABIiDGi3sHHYUD8AUcc66CbOa3YEkBBhQLuFjcOG+gGIOtZBN3Fesy
OAhAgD2i1sHDbUD0DUsQ66ifOaHQEkRBjQbmHjsKF+AKKOddBNnNfsCCAhwoB2CxuHDfUDEHWsg27ivGZHA
AkRBrRb2DhsqB+AqGMddBPnNTsCSIgwoN3CxmFD/
QBEHeugmziv2RFAQoQB7RY2DhvqByDqWAfdxHnNjgASIgxot7Bx2FA/
AFHHOugmzmt2BJAQYUC7hY3DhvoBiDrWQTdxXrMjgIQIA9otbBw21A9A1LEOuonzmh0BJEQY0G5h47ChfgC
ijnXQTZzX7AggIcKAdgsbhw31AxB1rINu4rxmRwAJEQa0W9g4bKgfgKhjHXQT5zU7AkiIMKDdwsZhQ/
0ARB3roJs4r9kRQEKEAe0WNg4b6gcg6lgH3cR5zS5yAWT//v0aMmSI2rZtq7y8PA0bNky1tbXHvH/
79u3yPK/Z9vzzz6fua+77c+bM8dU3BrRb2DhsqB+AqGMddBPnNbvIBZABAwaod+/
eWr16td544w1deumlGjx48DHvb2ho0O7du9Pagw8+qDZt2qQFF8/
zVFZWlnbf4cOHffWNAe0WNg4b6gcg6lgH3cR5zS5SAaSyslKe52nNmjWpa4sXL1aLFi20c+fOjN+nT58+Gj
ZsWNo1z/M0f/58U/8Y0G5h47ChfgCijnXQTZzX7CIVQGbOnKn8/
Py0a0eOHFFOTo7mzZuX0XusXbtWnudp5cqVadc9z1OnTp107rnn6sorr9TMmTPV2Njoq38MaLewcdhQPwBR
xzroJs5rdpEKIJMmTVL37t2bXC8oKNCMGTMyeo+77rpLl112WZPrEydO1IoVK/
T2229r6tSpisfjmjZt2nHfq66uTjU1NalWVVXFgHYIG4cN9QMQdayDbiKA2J0WAWTcuHHHfFD8aNu0aZM5g
Bw6dEh5eXl65JFHTnjvhAkT1KVLl+PeU1pa2mxfGdBuYOOwoX4Aoo510E0EELvTIoDs27dPmzZtOm6rr683
/wrW73//e7Vs2VL79u074b0vvviiPM9TXV3dMe/
hJyBuY+OwoX4Aoo510E0EELvTIoBk6uhD6GvXrk1dW7JkScYPoRcVFekHP/hBRv/
WQw89pHbt2vnqHwPaLWwcNtQPQNSxDrqJ85pdpAKI9MXH8Pbt21fl5eVasWKFunXrlvYxvDt27FCPHj1UXl
6e9rotW7aoRYsWWrx4cZP3fOGFF/
Tss89qw4YN2rJli2bMmKHWrVvrgQce8NU3BrRb2DhsqB+AqGMddBPnNbvIBZD9+/
dr8ODBatOmjXJzc3XHHXek/T2Po394cPny5Wmvu++++3TBBRcomUw2ec/FixerT58+atOmjc4+
+2z17t1bTz31VLP3Hg8D2i1sHDbUD0DUsQ66ifOaXeQCSJgxoN3CxmFD/
QBEHeugmziv2RFAQoQB7RY2DhvqByDqWAfdxHnNjgASIgxot7Bx2FA/
AFHHOugmzmt2BJAQYUC7hY3DhvoBiDrWQTdxXrMjgIQIA9otbBw21A9A1LEOuonzmh0BJEQY0G5h47ChfgC
ijnXQTZzX7AggIcKAdgsbhw31AxB1rINu4rxmRwAJEQa0W9g4bKgfgKhjHXQT5zU7AkiIMKDdwsZhQ/
0ARB3roJs4r9kRQEKEAe0WNg4b6gcg6lgH3cR5zY4AEiIMaLewcdhQPwBRxzroJs5rdgSQEGFAu4WNw4b6A
Yg61kE3cV6zI4CECAPaLWwcNtQPQNSxDrqJ85odASREGNBuYeOwoX4Aoo510E2c1+wIICHCgHYLG4cN9QMQ
dayDbuK8ZkcACREGtFvYOGyoH4CoYx10E+c1OwJIiDCg3cLGYUP9AEQd66CbOK/
ZEUBChAHtFjYOG+oHIOpYB93Eec2OABIiDGi3sHHYUD8AUcc66CbOa3YEkBBhQLuFjcOG+gGIOtZBN3Fesy
OAhAgD2i1sHDbUD0DUsQ66ifOaHQEkRBjQbmHjsKF+AKKOddBNnNfsCCAhwoB2CxuHDfUDEHWsg27ivGZHA
AkRBrRb2DhsqB+AqGMddBPnNTsCSIgwoN3CxmFD/
QBEHeugmziv2RFAQoQB7ZYDhz9PbRzL392rhmRj0F1yCvUDEHWsg27ivGYXuQDy0EMP6eqrr9ZZZ52lvLy8
jF7T2NioCRMmqEOHDmrVqpX69eunzZs3p92zf/
9+DRkyRG3btlVeXp6GDRum2tpaX31jQLtj8YZdSkx6NbVxFI57UVdNXqrFG3YF3TUnUD8AUcc66C7Oa3aRC
yAPPPCAHn30Uf30pz/
NOIBMnTpVeXl5WrBggdatW6fi4mJddNFFOnz4cOqeAQMGqHfv3lq9erXeeOMNXXrppRo8eLCvvjGg3bB4wy
5d+KUN42i78P83No/
jo34Aoo510G2c1+wiF0COKisryyiANDY2qkOHDnr44YdT16qrqxWPxzVnzhxJUmVlpTzP05o1a1L3LF68WC
1atNDOnTsz7hMDOvwako26avLSJpvGlzePqyYv5cfox0D9AEQd66D7OK/
ZEUBOYNu2bfI8TxUVFWnXr7vuOt19992SpJkzZyo/Pz/
t+0eOHFFOTo7mzZt3zPeuq6tTTU1NqlVVVTGgQ27V1o+PuWl8ua3a+nHQXQ0l6gcg6lgH3UcAsSOAnMDKlS
vleZ527Ur/cehNN92km2++WZI0adIkde/
evclrCwoKNGPGjGO+d2lpqTzPa9IY0OG1oGJHRhvHgoodQXc1lKgfgKhjHXQfAcTutAgg48aNa/Yg/
+W2adOmtNeEIYDwExD38F+ubKgfgKhjHXQfAcTutAgg+/bt06ZNm47b6uvr014Thl/B+ioGdPgd/
d3d5h4e5Hd3T4z6AYg61kH3cV6zOy0CyMnw+xD6I488krpWU1PT7EPoa9euTd2zZMkSHkI/
TR399JKvbh58eklmqB+AqGMddBvnNbvIBZAPP/
xQFRUVevDBB9WmTRtVVFSooqIi7W929OjRI+0nF1OnTlV+fr4WLlyo9evXa9CgQc1+DG/
fvn1VXl6uFStWqFu3bnwM72ls8YZdTT7FhM9vzxz1AxB1rIPu4rxmF7kAUlJS0uwzIsuXL0/
d43meysrKUl8f/UOE559/
vuLxuPr166f33nsv7X3379+vwYMHq02bNsrNzdUdd9zBHyI8zTUkG7Vq68daULFDq7Z+zI/
LfaJ+AKKOddBNnNfsIhdAwowBDQAAEG6c1+wIICHCgAYAAAg3zmt2BJAQYUADAACEG+c1OwJIiDCgAQAAwo
3zmh0BJEQY0AAAAOHGec2OABIiDGgAAIBw47xmRwAJEQY0AABAuHFesyOAhEh1dbU8z1NVVZVqampoNBqNR
qPRaCFrVVVV8jxP1dXVQR8dnUUACZGjA5pGo9FoNBqNFu5WVVUV9NHRWQSQEEkmk6qqqlJ1dXVWEzw/
caGG1M/dRg2pX9CNGlK/
oFu2a1hdXa2qqiolk8mgj47OIoBEWE0Nv8NoRQ1tqJ8dNbShfnbU0Ib62VFD9xBAIowJa0cNbaifHTW0oX5
21NCG+tlRQ/cQQCKMCWtHDW2onx01tKF+dtTQhvrZUUP3EEAirK6uTqWlpaqrqwu6K86ihjbUz44a2lA/
O2poQ/3sqKF7CCAAAAAAsoYAAgAAACBrCCAAAAAAsoYAAgAAACBrCCAAAAAAsoYAEmFPPPGECgsLFY/
HlUgkVF5eHnSXnPH666/
rhhtuUMeOHeV5nubPnx90l5wyefJkXXHFFWrTpo0KCgo0aNAgvfvuu0F3yxkzZszQ5ZdfrrZt26pt27a66q
qrtGjRoqC75bQpU6bI8zyNHj066K44obS0VJ7npbUePXoE3S3n7NixQ//2b/
+mc845R61atVKvXr20Zs2aoLvljMLCwibj0PM8/cd//EfQXcMJEEAiau7cuYrFYpo1a5Y2btyo4cOHKz8/
X3v37g26a05YtGiRfvnLX2revHkEkJNw/fXXq6ysTO+8847+8pe/aODAgeratas++
+yzoLvmhBdeeEEvvfSSNm/erPfee0+/
+MUv1LJlS73zzjtBd81Jb731li688EJ985vfJIBkqLS0VD179tTu3btT7aOPPgq6W0755JNPVFhYqNtvv13
l5eV6//33tWTJEm3dujXorjlj3759aWPw1Vdfled5Wr58edBdwwkQQCIqkUho5MiRqa+TyaQ6deqkKVOmBN
grNxFA7Pbt2yfP8/T6668H3RVntWvXTs8991zQ3XBObW2tunXrpldffVVFRUUEkAyVlpaqd+/
eQXfDaePGjdO1114bdDdOK6NHj9Yll1yixsbGoLuCEyCARFB9fb1ycnKaHJqHDh2q4uLigHrlLgKI3ZYtW+
R5njZs2BB0V5zT0NCgOXPmKBaLaePGjUF3xzlDhw7VmDFjJIkA4kNpaalat26tjh076qKLLtKQIUP04YcfB
t0tp1x22WUaM2aMbrzxRhUUFKhPnz565plngu6Ws+rr63Xuuedq0qRJQXcFGSCARNDOnTvleZ5WrVqVdn3s
2LFKJBIB9cpdBBCbZDKp7373u7rmmmuC7opT1q9fr7PPPls5OTnKy8vTSy+9FHSXnDNnzhz16tVLhw8flkQ
A8WPRokV6/vnntW7dOr388su6+uqr1bVrVx04cCDorjkjHo8rHo/
rvvvu09tvv62nn35arVq10uzZs4PumpP+9Kc/
KScnRzt37gy6K8gAASSCCCBfLwKIzZ133qnCwkJVVVUF3RWn1NfXa8uWLVq7dq3Gjx+v9u3b8xMQH/
7617/qvPPO07p161LXCCAn79NPP1Vubi6/BuhDy5YtdfXVV6dd+8lPfqKrrroqoB65rX///
rrhhhuC7gYyRACJIH4F6+tFADl5I0eOVJcuXfT+++8H3RXn9evXTyNGjAi6G86YP3+
+PM9TTk5OqnmepxYtWignJ0cNDQ1Bd9E5V1xxhcaPHx90N5zRtWtX/
ehHP0q7NmPGDHXq1CmgHrnrgw8+0BlnnKEFCxYE3RVkiAASUYlEQqNGjUp9nUwm1blzZx5CPwkEEP8aGxs1
cuRIderUSZs3bw66O6eFf/zHf1RJSUnQ3XDGgQMHtGHDhrR2xRVX6Ic//
CHPIp2E2tpatWvXTtOmTQu6K84YPHhwk4fQx4wZ0+SnIjix0tJSdejQQUeOHAm6K8gQASSi5s6dq3g8rtmz
Z6uyslIjRoxQfn6+9uzZE3TXnFBbW6uKigpVVFTI8zw9+uijqqio4CHMDN11113Ky8vTa6+9lvYRiocOHQq
6a04YP368Xn/9dW3fvl3r16/X+PHj1aJFC73yyitBd81p/ApW5n72s5/ptdde0/
bt27Vy5Up95zvfUfv27bVv376gu+aMt956S2eeeaYmTZqkL
Vu26L/+67/UunVr/
fGPfwy6a05JJpPq2rWrxo0bF3RX4AMBJMKmT5+url27KhaLKZFIaPXq1UF3yRnLly9v9o8f8V+gM9Nc7TzP
U1lZWdBdc8KwYcNUWFioWCymgoIC9evXj/DxNSCAZO6WW25Rx44dFYvF1LlzZ91yyy38/YqT8Oc//
1m9evVSPB7XN77xDT4F6yQsWbJEnufpvffeC7or8IEAAgAAACBrCCAAAAAAsoYAAgAAACBrCCAAAAAAsoYA
AgAAACBrCCAAAAAAsoYAAgAAACBrCCAAAAAAsoYAAgAAACBrCCAAAAAAsoYAAgAAACBrCCAAAAAAsoYAAgA
AACBrCCAAAAAAsoYAAgAAACBrCCAAAAAAsoYAAgAAACBrCCAAAAAAsoYAAgAAACBrCCAAAAAAsoYAAgAAAC
BrCCAAAAAAsoYAAgAAACBr/h/kRjdqy3tQtAAAAABJRU5ErkJggg==\" width=\"800\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"data = np.array([1, -1, -1, 1, 1, 1, -1, 1])\n",
"\n",
"plt.figure()\n",
"plt.stem(data, use_line_collection=True);\n",
"plt.title(\"Données\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"La somme donnant le signal transmis en fonction des données et de la forme
d'onde peut être calculée sous forme de convolution."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"scrolled": false
},
"outputs": [
{
"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 = $('<div/>');\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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all '
+\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\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 = $('<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 = $('<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 = $('<canvas/>');\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 = $('<div/>');\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 = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all
' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\
n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt ===
mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then
trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\
n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id:
this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format =
format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\
n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL ||
window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21)
== \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message
type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \",
msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type +
\"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-
in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from
http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the
document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-
home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-
arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-
right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan
axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"],
[\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"],
[\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-
save\", \"download\"]];\n",
"\n",
"mpl.extensions =
[\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm)
{\n",
" // Create a \"websocket\"-like object which calls the given IPython
comm\n",
" // object with the appropriate methods. Currently this is a non binary\
n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage
function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a
real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id +
\"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in
FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' +
width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\"
width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\"
title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></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 = $('<span class=\"mpl-message\" style=\"text-
align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline
pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\"
title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove
icon-large\"></i></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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 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"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img
src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAGQCAYAAABWJQQ0AAAgAElEQVR
4nOzdeVxU9f7H8WMko6ZCqTevmpMLWmm5dKVdKsu82rXdm91f0qbVVbNu2aip5K5pmmsuKWaLZotL476QO6
iJG+COiggoKKgIyPL+/
TGckRGEM35Pc86X834+HucPhsP4vfC99nnJnDMKiIiIiIiIfEQxegFERERERGQdDBAiIiIiIvIZBggRERER
EfkMA4SIiIiIiHyGAUJERERERD7DACEiIiIiIp9hgBARERERkc8wQIiIiIiIyGcYIERERERE5DMMECIiIiI
i8hkGCBERERER+QwDhIiIiIiIfIYBQkREREREPsMAISIiIiIin2GAEBERERGRzzBAiIiIiIjIZxggRERERE
TkMwwQIiIiIiLyGQYIERERERH5DAOEiIiIiIh8hgFCREREREQ+wwAhIiIiIiKfYYAQEREREZHPMECIiIiIi
MhnGCBEREREROQzDBAiKlfsdjtCQ0ONXgYAID4+HoqiIDw83OilXFdYWBgU5a/
9T0FERAQURUFERMRf+ueQNjLsSyIq3xggRCSFvXv34qWXXkL9+vVhs9lQp04dPPXUU5g0aZLHeQwQ7zBAXB
ITExEWFobo6Gijl/KXk2FfElH5xgAhItPbsmUL/
P390bhxYwwbNgyzZs3C4MGD0b59ezRq1Mjj3OzsbFy5csWglXqSYdDzRYDk5+cjKysL+fn5f+mfI2LHjh2m
/1nppaCgAFlZWcjLyzN6KURkUQwQIjK9jh07olatWjh//nyxz6WkpBiwIm0YIPLwNkAyMzP/2gUREZVj/
K8OEZle06ZN8fjjj2s6t6SXYO3Zswdt27ZFpUqVULduXQwbNgxz5syBoiiIj4/3+NpOnTph06ZNaNOmDWw2
Gxo0aIBvv/3W4/nS0tLw8ccfo3nz5rjllltQrVo1dOjQAbt37/Y4T2uAaH0+9aVMP/
30E4YPH466devCZrPhySefxOHDhz3O3bhxI15++WXccccd8Pf3R7169fDhhx/
i8uXLHueVFCC5ubkYOnQoGjZsCH9/f9jtdvTv3x/Z2dke5+Xn5yMsLAx///vfUblyZTz+
+OOIiYkp9jO43kuwZsyYgYYNG6JSpUpo06YNNm7ciJCQEISEhLjPCQ8PL/
ZzKu05IyMj8cwzz6B69eqoXLky2rZti82bN1/nO+/5XNce6s8tJCQEzZo1w86dO/
HYY4+hcuXK6NOnDwBg8eLF6NixI/7+97/D398fDRs2xNChQ4v9dkF9jpiYGDz+
+OOoXLky6tSpgzFjxhRbz6RJk3DPPfegcuXKCAwMxP33348ffvjB/Xn1Z3bw4EH85z//
QfXq1VGzZk0MHDgQBQUFOHnyJDp37oxq1arh9ttvx7hx4zyev6R9mZSUhDfeeAN169aFv78/
ateujc6dOxf7vhMR6YEBQkSm1759e1SrVg379u0r89xrh99Tp07htttuQ40aNTBkyBCMGzcOd911F1q0aFF
igDRt2hS33347BgwYgClTpqB169aoUKEC9u/
f7z5vx44daNSoEfr164cZM2Zg6NChqFu3LgICApCYmOg+T2uAaH0+dVBu1aoV7r//fkyYMAGff/
45qlSpguDgYI/n7N27Nzp27IiRI0dixowZePvtt+Hn54eXX37Z47ySAiQ0NBSKouDll1/
G1KlT0a1bNyiKgueff97jvE8//RSKouBf//oXpkyZgu7du6NevXqoWbNmmQHyzTffQFEUPPzww5g0aRI+/
PBDBAYGomHDhjccIOvWrYO/vz8eeughfPnll5gwYQLuu+8++Pv7Iyoq6rrf/
+TkZAwdOhSKoqBHjx747rvv8N133+Ho0aMAXPFQu3Zt1KpVC71798aMGTOwePFiAMDzzz+PLl26YOzYsfj6
66/xyiuvQFEUfPLJJx5/RkhICOrUqYM77rgDffr0wbRp0/Dkk09CURQsX77cfd7MmTPd3/
sZM2Zg4sSJePvtt/HBBx8U+5m1bNkSXbt2xbRp09CpUycoioLx48ejadOmeP/
99zFt2jQ88sgjUBQFGzZscH99Sfvy4YcfRkBAAAYOHIhvvvkGI0eOxBNPPOHxdUREemGAEJHprV69Gn5+fv
Dz88NDDz2ETz/
9FKtWrSrxWo9rA6R3796oUKGCx8XFaWlpuO2220oMEEVRsHHjRvdjZ86cgc1mw8cff+x+LDs7u9j1DPHx8b
DZbBg6dKjHY1oCROvzqUP33XffjZycHPfjEydOhKIoHoF27W86AGDUqFGoUKECTpw44X7s2gDZvXs3FEXBO
++84/G1n3zyCRRFwfr16wG4hvabb765WJR8/vnnUBSl1AC5cuUK/va3v6Fly5Ye/
zvU4ftGAqSgoABBQUF45plnUFBQ4PF9aNCgAZ5+
+uli34+iSnsJVkhICBRFwfTp04t9rqTv87vvvosqVap4/
MZIfY558+a5H8vJyUHt2rXx0ksvuR977rnn0KxZs1LXqv7MevTo4X4sLy8P9erVQ4UKFTB69Gj34+fPn0fl
ypU9fh7X7svz589DURSMHTu21D+XiEgvDBAiksL27dvxwgsvoEqVKu6XyNSqVQtLlizxOO/
aAAkKCsLDDz9c7Pl69+5dYoDcc889xc6977778MILL5S4rry8PKSmpuLs2bO47777PAbyG7kGpLTnU4fuL7
74wuNrdu3aBUVRin0vVJcuXcLZs2exYcMGKIri/td7oHiAjBw5EoqiIDY21uM5kpKSoCiKO8R+
+OEHKIqC1atXe5yXlpZWZoBs3bq1xIH+ypUrCAgIuKEAUb8H3377Lc6ePetxvPPOO7DZbKVeBF9WgNhsNo9
YKsmFCxdw9uxZfP/991AUxeMldCEhIahatapHHAFA586d0apVK/fHoaGhCAgIwPbt26/756g/
s2vPef7556EoCs6ePevxeMuWLfHYY4+5P752X2ZnZ8Pf3x+dOnXCuXPnSv3fSESkBwYIEUklJycH27dvR//
+/VGpUiVUrFgRMTEx7s9fGyD+/v7o1q1bsedRf2twbYB06NCh2LkhISEe16Dk5+dj/PjxaNy4Mfz8/
DyuG3jiiSfc52kNEK3Ppw7dCxYs8Ph69c+ZO3eu+7ETJ04gNDQUt956a7FrG4pe03JtgLz77ru46aabSvzt
UmBgoPslXGqoHDt2rNh5t956a6kBMn/
+fCiKgnXr1hX72latWt1QgPz0008lXsdR9ChtuC4rQBo2bFji1+3fvx/PP/88qlevXuzPK/
rypZCQENx1113Fvj40NBR33nmn+
+PY2FjUrVsXiqKgcePG+O9//1vsGhb1Z5acnFzsuSpVqlTi+ps3b+7+uKR9OWHCBNx0002oWLEiHnvsMYwZ
MwZJSUkl/
m8mIhLFACEiaanD6eeff+5+TDRAOnXqVOzcay+MHjZsGBRFwVtvvYX58+dj1apVWLNmDZo1a+ZxntYA0fp8
6tD9888/e3z9tX9OXl4emjRpgpo1a2L06NFYvHgx1qxZg7lz5xZbz/
UCJDc3t9g6jQgQdc3XBsjatWtLfM6xY8dizZo1JR6l3Z65rAAp6WVR58+fR40aNdCgQQN89dVX+P3337Fmz
RqMGTOm2PUp13uO0NBQ2O12j8cuXbqEBQsW4I033sDtt98ORVEwePBg9+fVn9m1v+kIDQ3FLbfcUub6r7cv
jxw5gnHjxuHpp5+Gv78/AgMDsWvXrmLPR0QkigFCRNLat28fFEXBu+++635M9CVYWgKkRYsWHr+ZUNWtW/
eGAkTr82kNkOjo6GK/6QBc19KUFSDXewlWcnKyppdgpaamCr0EKzAw0ON/
85IlS6AoSrE3CJw9e7bHc27fvh2KomDGjBm4ETt37vQ6QBYtWlTsNx3A1WtZbjRAisrJyUGnTp3g5+eHrKw
sAH9dgBR16NAhVKlSBf/
5z3+uew4R0Y1igBCR6a1fv77Ya+cBuP+lefz48e7Hrg2QXr16eXURupYAad26dbHbAi9cuLDYBdRaA0Tr82
kNkL179xZ7SVZBQYH7TkmlBYh6EXrRC5yBq3e8uvYi9GuvjdF6EXqtWrU0XYS+f/9+KIqCiRMnuh/
Ly8vDAw884PGc+fn5aNSoEYKCgnDx4kVc68yZM8UeKyouLg6KomDChAnFPne9eFi6dCkURcEff/
zhfiwnJwctW7a84QBJTU0tdk7fvn1x00034cKFCwD0D5DMzEx33Kjy8/Nx+
+23F7trGhGRHhggRGR6zZo1Q4MGDfC///0PM2fOxJQpU/Daa6/
Bz88Pd955p8cbFF4bICdPnkRgYCBq1qzpcRtedUg8fvy4x9dqCZDBgwdDURS88cYbmDlzJnr37o3bbrut2C
1ktQaI1ufTGiBXrlxBo0aNULNmTYwYMQKTJ0/G448/7r71cGkBAly9DW+XLl0wdepU98fX3vHq448/
hqK4bsM7depU9OjRA3fccQdq1qyJN954o9i6iw7kM2bMgKIoeOSRRzBp0iR89NFHJd6GFwAefPBBVKlSBWF
hYZg4cSIeeugh3H///cWeMyIiApUqVUL9+vURFhaGmTNnIiwsDG3btsWzzz5b6s9A/e1L06ZN8c0332D+/
Pnul5ddLx5SU1Nx6623wm6348svv8T48ePRqlUr9/f5RgKkdevW6NixI0aMGIFvvvkGH3/8MWw2G/
71r3+5z9E7QKKjo3Hbbbfhvffew6RJkzBt2jQ8/fTTUBQFv/
zyS6nfNyKiG8EAISLTW7FiBd566y3cddddqFq1Kvz9/dG4cWP07t272Duhl/
RGhNHR0Xjsscdgs9lQr149jBo1CpMmTSp2Ia/WAMnOzsbHH3/
sfgO+Rx55BNu2bSt2nje34dXyfFoDBHBdzPzUU0+hatWqqFmzJrp37449e/
ZoCpDc3FwMGTIEDRo0QMWKFXHHHXeU+EaEeXl5GDRoEGrXro3KlSvjySefRFxcHGrUqIH33nuv2LqvfdPAa
dOmoUGDBrDZbPjHP/
5R4hsRAsDRo0fx1FNPwWazud+jZc2aNSU+Z3R0NF588UXUqFEDNpsNdrsdXbp0KfF6k2stWbIE99xzD26+
+WaP79P14gEAtmzZggcffND9xoLqLaJvNEBmzJiBtm3butffqFEj9O3bFxkZGe5z9A6Q1NRU9OzZE3fddRd
uueUWBAQE4IEHHsDChQvL+pYREd0QBggRWVKfPn1QqVKlYu9YTWLU95QYPnz4DX19SQFCRETlCwOEiMq9a9
8sLjU1Fbfddhueeuopg1ZUPpT0Jnzqv85fe+tYrRggRETlHwOEiMq9Fi1aoE+fPpg+fTqGDBmC+vXr4+abb
y529yLyTnh4OEJCQjBmzBhMnToVXbt2haIoaN++/Q0/JwOEiKj8Y4AQUbnXv39/
BAUFoXLlyqhSpQoeffRRrFmzxuhlSe/PP/
9Eu3btUKNGDVSsWBH16tVDnz59SrwLlVYMECKi8o8BQkREREREPsMAISIiIiIin2GAEBERERGRzzBATCQ/
Px8JCQlIT09HRkYGDx48ePDgwYMHD5Md6enpSEhIQH5+vtGjo7QYICaSkJAARVF48ODBgwcPHjx4mPxISEg
wenSUFgPERNLT090b2ui658GDBw8ePHjw4FH8UP/
BOD093ejRUVoMEBPJyMiAoijIyMgweilEREREVALOa+IYICbCDU1ERERkbpzXxDFATIQbmoiIiMjcOK+JY4
CYCDc0ERERkblxXhPHADERbmgiIiIic+O8Jo4BYiLc0ERERETmxnlNHAPERLihiYiIiMyN85o4BoiJcEMTE
RERmRvnNXGWDJANGzbg2Wefxd///ncoioJFixaV+TURERFo1aoV/
P390ahRI4SHhxc7Z8qUKbDb7bDZbAgODkZUVJRX6+KGJiIiIjI3zmviLBkgy5cvx2effYbffvtNU4AcO3YM
VapUwf/+9z/ExsZi8uTJ8PPzw8qVK93nLFiwAP7+/
pgzZw5iYmLQvXt3BAYGIiUlRfO6uKGJiIiIzI3zmjhLBkhRWgLk008/RbNmzTwe+/e//41nnnnG/
XFwcDB69uzp/jg/Px916tTBqFGjNK/FbBs6OzcPmTm5Uh45uflGf/ssKSc33/
CfPQ85jss5eUZvVyFZV+T8+zEvv8Dobx2R9Mw2r8mIAaIhQB577DH06dPH47E5c+agevXqAICcnBz4+fkVe
55u3bqhc+fO133e7OxsZGRkuI+EhARTbeiwJfthdzilPO4auAJRx9KM/hZayvoDKQj6bLnhP3se8hyOX/
YYvW1vyOgVcYZ/
7270aDN8Dc5dyjH6W0gkNQaIOAaIhgAJCgrCyJEjPR5btmwZFEXB5cuXkZiYCEVRsHXrVo9z+vbti+Dg4Os
+b1hYGBRFKXaYZUPLHCB2hxPTIo4Y/
S20FJmHMh7GHA+PWmf0tr0hz07aZPj3TuTYdjTV6G8hkdQYIOIYIAYGiNl/
AyLrS7A+XBANu8OJqRGHjf4WWsqo5a4AGbx4n+F7gIe5j6hjabA7nHho5Fqjt+0N6TRpI+wOJ1bsSzL8e+n
N8cS4CNgdTmw9wgAhEsEAEccAMfAlWNfihtbHJwt3w+5wYsp6BogvjVweC7vDiWG/
xxi9FDK5PQnnYXc48aCkAdJxoitAIg5ov8mIGTz15R+wO5zYcuSs0UshkhrnNXEMEI0XoTdv3tzjsa5duxa
7CL1Xr17uj/
Pz81G3bl2pL0KXVd+fGSBGUANkuJMBQqXbm5BeLgLkj4NnjF6KV54eXxgghxkgRCI4r4mzZIBcvHgR0dHRi
I6OhqIoGD9+PKKjo3HixAkAQL9+/fD666+7z1dvw9u3b1/
ExcVh6tSpJd6G12azYe7cuYiNjUWPHj0QGBiI5ORkzevihtYHA8QYI5cxQEgbNUAeGCFngPzzKzkD5JkJG2
B3OLHpEAOESATnNXGWDJCIiIgSL/4ODQ0FAISGhiIkJKTY17Rs2RL+/v5o2LBhiW9EOHnyZNSvXx/+/
v4IDg5GZGSkV+vihtbHpz/
vgd3hxOR1h4xeiqWMKAyQEctijV4Kmdy+U64ACR6xxuil3JAOhQGyQdIA2XhIrnUTmQ3nNXGWDBCz4obWh+
MXBogR1AAZyQChMpSXAJFtkJc1nIjMhvOaOAaIiXBD60MNkElrGSC+NNwZwwAhTdQAaTNczgCR9TcJsl48T
2Q2nNfEMUBMhBtaH/1+dQXIRAaITw37vTBAljNAqHT7E10B8g/
JA0S2aynU2wevZ4AQCeG8Jo4BYiLc0Pro9+teBogB1AAZtTzO6KWQycUkZpSLANks2d2k1DdQXB/
HACESwXlNHAPERLih9aEGyFdrGCC+NJQBQhqpAXL/
MDkDpP14OQOk82RXgKyN1X53RiIqjvOaOAaIiXBD66P/
b64AmbDmoNFLsZQhS10BMnoFA4RKF3taDZDVRi/
lhsj6fhqdp2yG3eHEmhgGCJEIzmviGCAmwg2tjwEMEEOoATKGAUJliEsqJwEi2TuKP1cYIKsZIERCOK+JY4
CYCDe0PtQAGb+aAeJLny/dzwAhTdQAaT1UzgB56ks5A+SFqa4AWbk/
yeilEEmN85o4BoiJcEPr47NFrgD5kgHiU2FLXAHyxUoGCJXuQNIF2B1OtJI0QNoVBsjWI6lGL8UrL07bArv
DiRX7GCBEIjiviWOAmAg3tD4GLtrHADGAGiBjVx4weilkcgeTy0eAbDsqV4C85A6Q00YvhUhqnNfEMUBMhB
taH+4AWcVB2JcYIKSVGiAth6wyeik35MlxEVIGyCtfb4Xd4cSyvQwQIhGc18QxQEyEG1ofgxa7AmQcA8SnB
vP7ThodKgyQFpIGyBOFARIpW4BMdwWIcw8DhEgE5zVxDBAT4YbWBwdhY6jfd/
7micpyOKV8BEjUsTSjl+KVLoUB8vueRKOXQiQ1zmviGCAmwg2tD3UQ5kuBfGsQA4Q0UgPkvs8lDZCxcgbIq
zO2we5wYsluBgiRCM5r4hggJsINrQ/
ejckYvPiftDqcchF2hxP3hq00eik35PHCANkeL1eAdJ3pCpDF0aeMXgqR1DiviWOAmAg3tD4YIMZQA4Tvv0
JlOXKmfATIDskC5LVZDBAiPXBeE8cAMRFuaH2oAcI3xPMt9f1XGCBUFjVAmksaICFfrJcyQP7vm0jYHU78t
ivB6KUQSY3zmjgGiIlwQ+tDfUfu0QwQn1LfgX7CGgYIle6oGiCD5QyQtoUBsvO4nAHy658MECIRnNfEMUBM
hBtaH0OWxjBADKAGyFdrDhm9FDK5Y2cvlZMAOWf0Urzy+uwo2B1O/
LKTAUIkgvOaOAaIiXBD60MNkFHLGSC+1J8BQhqpAdJM0gB5bIycARI6xxUgC3ecNHopRFLjvCaOAWIi3ND6
GPq7K0BGLo81eimW0u9XV4BMXMsAodLFFwbIPYNWGL2UG/
LomHWwO5z484RcAfJGYYD8xAAhEsJ5TRwDxES4ofUxjAFiCDVAJjFAqAzHU8tHgOySLEDeDN/
uCpDtDBAiEZzXxDFATIQbWh/uAFnGAPGlfr/
uYYCQJmqA3C1pgDwyWs4AeXuuK0DmR50weilEUuO8Jo4BYiLc0PoY7nQFyAgGiE85fnEFyOR1DBAq3YnUTN
gdTtw1UM4AeXiUK0CiT543eileeXvuDtgdTvzIACESwnlNnKUDZMqUKbDb7bDZbAgODkZUVNR1zw0JCYGiK
MWOjh07us8JDQ0t9vlnnnlG83q4ofUxYlksA8QAaoBMWX/Y6KWQyZ1MKx8BsluyAHnnW1eA/
BDJACESwXlNnGUDZMGCBfD398ecOXMQExOD7t27IzAwECkpKSWen5aWhqSkJPexf/9+
+Pn5ITw83H1OaGgoOnTo4HHeuXPaf0XPDa0PNUCGO2OMXoqlfPozA4S0UQOk6cDlRi/
lhsgaID3muQLku23HjV4KkdQ4r4mzbIAEBwejZ8+e7o/z8/
NRp04djBo1StPXT5gwAdWqVcOlS5fcj4WGhuK555674TVxQ+tjZGGADPudAeJLfX/
ezQAhTdQAafKZnAHy0Mi1sDuc2JMgV4C8O28n7A4n5jFAiIRwXhNnyQDJycmBn58fFi1a5PF4t27d0LlzZ0
3P0bx5c3Tv3t3jsdDQUAQEBKBWrVpo0qQJ3nvvPaSmpmpeFze0PkYuZ4AYQQ2QqREMECpdwrnyESB7E9KNX
opX3vuuMEC2xhu9FCKpcV4TZ8kASUxMhKIo2Lp1q8fjffv2RXBwcJlfHxUVBUVRil0zMn/
+fCxZsgR79+7FokWLcPfdd6NNmzbIy8sr8Xmys7ORkZHhPhISErihdaAGyFAGiE99spABQtqoARIkaYA8KG
mA/
Pf7P2F3ODF3S7zRSyGSGgNEHAOkCK0B0qNHD9x7771lnnf06FEoioK1a9eW+PmwsLASL2znhhYzankc7A4n
hixlgPjSx4UBMi3iiNFLIZM7df6yK0AGyBkgD4xwBci+U5IFyA+uAAnffMzopRBJjQEizpIBIvISrEuXLqF
69er46quvNP1ZNWvWxPTp00v8HH8D8tcYvYIBYgQ1QL7+gwFCpUtkgBiiZ2GAzGGAEAlhgIizZIAArovQe/
Xq5f44Pz8fdevWLfMi9PDwcNhsNk3XdiQkJKBChQpYsmSJpjVxQ+tDDZDPl+43eimW8r+fGCCkjRogjQcsM
3opNyR4xBopA6T3j7tgdzjxzSYGCJEIzmviLBsgCxYsgM1mw9y5cxEbG4sePXogMDAQycnJAIDXX38d/
fr1K/Z1jz76KP79738Xe/
zixYv45JNPsG3bNsTHx2Pt2rVo3bo1goKCkJ2drWlN3ND6GFMYIGFLGCC+9NFP0bA7nJjOAKEynE53BUij/
nIGSJvhrgDZnyhXgHww3xUgszYeNXopRFLjvCbOsgECAJMnT0b9+vXh7++P4OBgREZGuj8XEhKC0NBQj/
MPHDgARVGwev
XqYs91+fJltG/fHrVq1ULFihVht9vRvXt3d9BowQ2tjy9WMkCMoAbIjA0MECpdUnpWuQiQmES5/
q7uwwAh0gXnNXGWDhCz4YbWBwPEGB8tYICQNmqANJQ0QP4haYDw/6NE+uC8Jo4BYiLc0PoYu/IA7A4nBi/
eZ/
RSLOXDwuFm5gb+6yqVLjnDFSAN+jmNXsoNuX+YK0BiT8v1dzVfJkmkD85r4hggJsINrY9xqxggRlADhC/
voLKklJMAiUuS6+9q3iiCSB+c18QxQEyEG1ofaoAMYoD4FF9fTlqpAXKntAGyWsoA4ZuFEumD85o4BoiJcE
Pr48vCABm4iAHiS7zDDmmVcsEVIHaHnAHSeqgrQA4kXTB6KV7p+7MrQKasZ4AQieC8Jo4BYiLc0Pr4cvVBB
ogB1ADhewxQWc5cyC4XAXIwWa4A+fTnPQwQIh1wXhPHADERbmh9qAHy2aK9Ri/
FUvgmZ6SV7AHSStIA6ferK0AmrT1k9FKIpMZ5TRwDxES4ofUxvjBABvzGAPGlXoUBMpsBQmU4e/
FqgBQUFBi9HK+1HLIKdocTh6QLkL2wO5yYyAAhEsJ5TRwDxES4ofUxYQ0DxAhqgMzZzACh0qWWkwA5nCJXg
PT/zRUgX61hgBCJ4LwmjgFiItzQ+lADpD8DxKd6/vAnA4Q0KRog+fnyBUgLSQPks0WuABm/
+qDRSyGSGuc1cQwQE+GG1sdXaw7B7nCi368MEF/
6b2GAhDNAqAxpl3LcAZInYYDc97kaIBeNXopXBi7aB7vDiS8ZIERCOK+JY4CYCDe0PiauZYAYQQ2QuVvijV
4Kmdy5chIgR87IFSCDFhcGyKoDRi+FSGqc18QxQEyEG1ofVwNkj9FLsZT/fs8AIW2KBkhuXr7Ry/
HavWErpQyQsCX7YXc4MXYlA4RIBOc1cQwQE+GG1sekwgBx/
MIA8aX3v98Ju8OJb7fGG70UMrnzmVcD5IqEAdK8MECOShogX6yMM3opRFLjvCaOAWIi3ND6mLyOAf2NiOUA
ACAASURBVGIENUDmMUCoDOmZV8pFgBw7e8nopXjl86WuABmzggFCJILzmjgGiIlwQ+tDDZBPf2aA+NJ73zF
ASJuiAZKTK2GADJYzQIb+HgO7w4lRyxkgRCI4r4ljgJgIN7Q+pqw/
DLvDib4/7zZ6KZby7rzCANl23OilkMmlX74aINm5eUYvx2vNCgMkXrIAGVYYICOXxxq9FCKpcV4TxwAxEW5
ofTBAjKEGyHcMECpDRlb5CJDjqXIFyHBnYYAsY4AQieC8Jo4BYiLc0PpQA+SThQwQX+oxbwcDhDQpGiBZV+
QLkHsGrZAyQEYui4Xd4cRwZ4zRSyGSGuc1cQwQE+GG1sfUCFeAfMwA8anu37oC5PtIBgiV7oLkAXJ3YYCcS
M00eileGbncFSDDfmeAEIngvCaOAWIi3ND6mBZxhAFiADVAfog8YfRSyOQuZueWiwA5mSZXgIxaHge7w4mh
DBAiIZzXxDFATIQbWh9qgPzvJwaIL73DACGNigbI5Rz5AuSugXIGyJgVrgD5fOl+o5dCJDXOa+IYICbCDa2
Pr/
9wBchHP0UbvRRLeXuuK0B+jGKAUOkuFQmQzJxco5fjtaYDl0sZIF+sdAVI2BIGCJEIzmviGCAmwg2tj+kME
EOoATKfAUJlyMwpHwGScE6uABm78gADhEgHnNfEMUBMhBtaH+4AWcAA8aW3525ngJAmRQPkUrZ8AdLkMzkD
5MtVrgAZtHif0UshkhrnNXEMEBPhhtbHjA2uAPmQAeJTb4W7AmTBdgYIle5yTp47QC5KGCBBhQFy6vxlo5f
ilS9XH4Td4cTARQwQIhGc18RZOkCmTJkCu90Om82G4OBgREVFXffc8PBwKIricdhsNo9zCgoKMGjQINSuXR
uVKlVCu3btcOjQIc3r4YbWx8wNRxkgBlAD5KftJ41eCplc1pXyESCJkgXI+MIA+WzRXqOXQiQ1zmviLBsgC
xYsgL+/
P+bMmYOYmBh0794dgYGBSElJKfH88PBwVK9eHUlJSe4jOTnZ45zRo0cjICAAixcvxp49e9C5c2c0aNAAWVl
ZmtbEDa0PNUD6zN9l9FIs5U0GCGlUNEAuZF0xejleCxogZ4B8teYQ7A4n+v/
GACESwXlNnGUDJDg4GD179nR/nJ+fjzp16mDUqFElnh8eHo6AgIDrPl9BQQFq166NsWPHuh9LT0+HzWbD/
PnzNa2JG1ofsza6AuQDBohPvTEnyhUgOxggVLqiAZIhYYA0HrAMdocTp9PlCpCJa10B0u9XBgiRCM5r4iwZ
IDk5OfDz88OiRYs8Hu/WrRs6d+5c4teEh4fDz88P9evXR7169dC5c2fs33/1TiJHjx6FoiiIjvZ82U/
btm3xwQcflPic2dnZyMjIcB8JCQnc0DpggBhDDZCFDBAqQ3Zu+QiQpHRtv902i0nuANlj9FKIpMYAEWfJAE
lMTISiKNi6davH43379kVwcHCJX7N161Z8++23iI6Oxh9//
IFnn30W1atXR0JCAgBgy5YtUBQFp0+f9vi6V155BV26dCnxOcPCwopdV8INLU4NkN4/
MkB8KZQBQhoVDZD0y/
IFSKP+cgbIlPWHYXc48enPDBAiEQwQcQyQIkoLkGtduXIFjRo1wsCBAwHcWIDwNyB/
jW82HYPd4UQvBohPdZvtCpCfdyYYvRQyuZzc/KsBkilfgDQsDJDkDDkDpO/Pu41eCpHUGCDiLBkgN/
ISrJK8/PLLePXVVwHc2EuwrsUNrY/
ZDBBDqAHyCwOEynAlr3wESIpkATI1whUgnyxkgBCJ4LwmzpIBArguQu/Vq5f74/z8fNStW/
e6F6FfKy8vD02bNsVHH30E4OpF6OPGjXOfk5GRwYvQDaAGSM8f/
jR6KZbyOgOENCoaIOczc4xejtca9HNKGSBfF75J6/9+YoAQieC8Js6yAbJgwQLYbDbMnTsXsbGx6NGjBwID
A9231n399dfRr18/9/
lDhgzBqlWrcPToUfz555949dVXUalSJcTExLjPGT16NAIDA7FkyRLs3bsXzz33HG/Da4A5m10B8l8GiE/
93zeRsDuc+PVPBgiVLrdIgJy7JF+A3KkGyAW5AmR6YYB89BPfI4lIBOc1cZYNEACYPHky6tevD39/
fwQHByMyMtL9uZCQEISGhro//vDDD93n3n777ejYsSN27fJ8iY/
6RoS33347bDYb2rVrh4MHD2peDze0PsIZIIZQA+S3XQwQKl1efkG5CJAzF7KNXopXZmwoDBC+SSuREM5r4i
wdIGbDDa0Pd4B8zwDxJQYIaVU0QNIkDBB17bIFiHqHQL5JK5EYzmviGCAmwg2tj7lb4mF3OPH+9zuNXoql/
GeWK0AW7Tpl9FLI5PKLBEjqRbmGeOBqgJyVbO18jyQifXBeE8cAMRFuaH18u5UBYgQ1QBZHM0CodAUF5SNA
ZFu7eotyvkcSkRjOa+IYICbCDa0PNUDe+44B4kuvzdrGACFNigaIbL9FkDme1Bt08A6BRGI4r4ljgJgIN7Q
+5hUGyLvzGCC+1HUmA4S0k/U6inyJr1/
hDTqI9MF5TRwDxES4ofUxb9txBogB1ABZsjvR6KWQBMpDgMh2By/
1+jjeoINIDOc1cQwQE+GG1ocaID3m7TB6KZby6gwGCGmnDvGyvZeGzLcQnseXpxLpgvOaOAaIiXBD6+O7wg
Dp/
i0DxJf+PWMr7A4nljJASIM7JX038VyJ38Wdvx0m0gfnNXEMEBPhhtbH95EMECOoAfL7HgYIla1BOQiQ9Mwr
Ri/HK9/
xt8NEuuC8Jo4BYiLc0PpQA+QdBohPdZnOACHt1ABJlixArkgcID9EnuDfjUQ64LwmjgFiItzQ+lD/I/
v2XP5H1pdeKQwQ557TRi+FJNCw/zLYHU4kpcsVIDm5RQLkslwB8mMU/24k0gPnNXEMEBPhhtYH/
yNrDDVAlu1lgFDZGpWDAMnIkitA5rv/btxu9FKIpMZ5TRwDxES4ofXxI/
8ja4hXvmaAkHZqgJxOv2z0UrySnZsnbYD8tP0k7A4n3gzn341EIjiviWOAmAg3tD7Uf+V7i/
+R9amXv94Cu8OJ5QwQ0qDxAFeAJJ6XK0CyrlwNkAuyBcgOV4C8MSfK6KUQSY3zmjgGiIlwQ+tjwXYGiBHUA
FmxjwFCZQsasFz6ALmYnWv0cryysDBAQhkgREI4r4ljgJgIN7Q+1ADhywx866VpDBDSTg2QUwwQn/
llZwLsDiden80AIRLBeU0cA8REuKH1ob7OmS8z8K0X3QGSZPRSSAJBn7kCJOFcptFL8crlnKsBckmyAPn1T
1eA/N83kUYvhUhqnNfEMUBMhBtaH3ydszHUAFm5nwFCZWtSDgIkM0euAPltFwOESA+c18QxQEyEG1ofP/
F1zoZ4YepmBghppgbIyTS5AiQzJ1faAFkcfQp2hxOvzdpm9FKIpMZ5TRwDxES4ofWhXmjZja9z9qnnCwNkF
QOENGg6UM4AuZR9NUAu5+QZvRyvqAHSdSYDhEgE5zVxDBAT4YbWx8+FF1oyQHxLDZDVMclGL4UkcNfAFdIH
SNYVuQJkye5E2B1OvDqDAUIkgvOaOAaIiXBD6+Nn3unFEM9NYYCQdmqAnEiVK0AuShwgv+9xBUiX6VuNXgq
R1DiviWOAmAg3tD7UW03yQkvf6lwYIGsYIKTB3YNcAXI89ZLRS/
HKhawr0gaIc89p2B1OvMIAIRLCeU0cA8REuKH1wVtNGkMNkLWxDBAq2z3lIECyc+UKkGV7CwPkawYIkQjOa
+IsHSBTpkyB3W6HzWZDcHAwoqKu/
5KdmTNn4tFHH0VgYCACAwPRrl27YueHhoZCURSP45lnntG8Hm5ofTBAjNF58iYGCGmmBkj8WbkCJEPiAFmx
zxUgL03bYvRSiKTGeU2cZQNkwYIF8Pf3x5w5cxATE4Pu3bsjMDAQKSkpJZ7/2muvYerUqYiOjkZcXBzeeOM
NBAQE4NSpU+5zQkND0aFDByQlJbmPc+fOaV4TN7Q+1Hvd/2cWA8SX/
lUYIOviGCBUtmaDV8LucOKYZAGSfvlqgOTk5hu9HK+s2JcEu8OJFxkgREI4r4mzbIAEBwejZ8+e7o/z8/
NRp04djBo1StPX5+XloVq1avj222/
dj4WGhuK555674TVxQ+tj0a5TDBADqAGyPq7kiCcqqnk5CJAreXIFyMr9rgB5Yepmo5dCJDXOa+IsGSA5OT
nw8/
PDokWLPB7v1q0bOnfurOk5Lly4gEqVKuH33393PxYaGoqAgADUqlULTZo0wXvvvYfU1FTN6+KG1ocaIHyzL
d96dhIDhLRTA+TomYtGL8Ur6ZnyBsjqmGTYHU48N4UBQiSC85o4SwZIYmIiFEXB1q2eF+L17dsXwcHBmp7j
/
fffR8OGDZGVleV+bP78+ViyZAn27t2LRYsW4e6770abNm2Ql1fy64Szs7ORkZHhPhISErihdcA32zJGp0kb
XQFygAFCZWse5gqQI5IFyPnMHHeA5EoWIGsKA6QzA4RICANEHAOkCK0BMmrUKNx6663Ys2dPqecdPXoUiqJ
g7dq1JX4+LCys2EXr3NDiGCDGUAMkggFCGtxbDgIkL7/
A6OV4ZW1sYYBM3mT0UoikxgARZ8kAEXkJ1tixYxEQEIAdO3Zo+rNq1qyJ6dOnl/g5/gbkr6EGCN/
t17c6TmSAkHZqgBxOkStAzl2SN0DWx6XA7nDi2UkMECIRDBBxlgwQwHUReq9evdwf5+fno27duqVehD5mzB
hUr14d27ZpG2wTEhJQoUIFLFmyRNP53ND6WLLb9W6//57Be9370j+/cgXIHwfPGL0UksB9n68qDJALRi/
FK2lFAiRftgA54AqQTpM2Gr0UIqlxXhNn2QBZsGABbDYb5s6di9jYWPTo0QOBgYFITnbdQvT1119Hv3793O
ePHj0a/v7+
+OWXXzxus3vxoutf7y5evIhPPvkE27ZtQ3x8PNauXYvWrVsjKCgI2dnZmtbEDa2PpQwQQ6gBsoEBQhq0GCJ
/gBQUyBUgEYUB0nEiA4RIBOc1cZYNEACYPHky6tevD39/
fwQHByMy8uptW0NCQhAaGur+2G63l3i9RlhYGADg8uXLaN++PWrVqoWKFSvCbreje/
fu7qDRghtaH2qAdJnOAPGlDgwQ8oIaIIeS5QqQ1IvZ0gbIhoNnYHc40eErBgiRCM5r4iwdIGbDDa2P3/
e4AuQVBohPPTNhA+wOJzYeYoBQ2VoWBshByQLkbJEAkc3GQ64AeWbCBqOXQiQ1zmviGCAmwg2tD+ee0wwQA
6gBsunQWaOXQhJoNXQ1A8THNh06ywAh0gHnNXEMEBPhhtaHO0C+ZoD4EgOEvKEGyIEkuQLkzAV5A2TLYVeA
PD3+D6OXQiQ1zmviGCAmwg2tj2V7XQHy8tdbjF6KpbQf7wqQzYcZIFS21oUBEpck1993KReyYHc4cWc/
CQPkiCtAnvqSAUIkgvOaOAaIiXBD62M5A8QQaoBsYYCQBvcPkztAGkgYIFuPpMLucKIdA4RICOc1cQwQE+G
G1ocaIC9NY4D40tPj/
2CAkGZqgMSeluvvu5QMeQMk8qgrQJ4YF2H0UoikxnlNHAPERLih9bFinytAXmSA+NRTXxYGyBEGCJXt/
mFrYHc4EZMo1993yYUB0rD/
MqOX4rWoY2muABkbYfRSiKTGeU0cA8REuKH1sWJfEgPEAGqAbD2SavRSSAL/
GC53gDSSMEC2x7sC5HEGCJEQzmviGCAmwg2tDzVAXpi62eilWEo7Bgh5QQ2Q/YnpRi/
FK0np8gbIzuOuAGn7xXqjl0IkNc5r4hggJsINrY+V+10B8jwDxKeeHBcBu8OJbUcZIFS2NoUBsu+UXAFyOv
0y7A4nGg+QMUDOwe5w4rExDBAiEZzXxDFATIQbWh+rGCCGUAMkkgFCGgSPkDtAggYsN3opXvvzhCtAHh2zz
uilEEmN85o4BoiJcEPrQw2Q56YwQHzpCQYIeUHWAEk8L2+ARJ88D7vDiYdHMUCIRHBeE8cAMRFuaH2sjkmG
3eFEZwaITz0x1hUgUcfSjF4KSeCBEWthdzixN0GuADmlBshn8gXIbgYIkS44r4ljgJgIN7Q+1jBADKEGyPZ
4BgiV7cGRcgdIEwkDZE+CK0AeGrnW6KUQSY3zmjgGiIlwQ+vDHSCTNxm9FEt5nAFCXlADZE/
CeaOX4pWEc5nSBsi+U+mwO5x4YAQDhEgE5zVxDBAT4YbWx9pYV4D8iwHiUyFfrIfd4cQOBghp8FBhgOw+KV
eAnExzBUjTgfIGSPCINUYvhUhqnNfEMUBMhBtaH+viGCBGUANk53EGCJXt4VHrpA6QuwauMHopXtuf6AqQN
sMZIEQiOK+JY4CYCDe0PtQAeXYSA8SX2jJAyAtqgEQzQHwm9nQG7A4n7h/
GACESwXlNHAPERLih9bE+LgV2hxOdJm00eimW8tgYNUDOGb0UkoAaILtOyLVfTqS6AuTuQfIFSFySGiCrjV
4KkdQ4r4ljgJgIN7Q+1h9ggBhBDZA/
JRsoyRiPjJY7QO6RMEAOJF2A3eFE66EMECIRnNfEMUBMhBtaH2qAdJzIAPGlR8esY4CQZmqAyLZfjqdekjZ
ADiW7AqTlkFVGL4VIapzXxDFATIQbWh8RhQHyz68YIL4k679okzHUYJXtJXvxZ10B0mzwSqOX4rXDKa4Aac
EAIRLCeU0cA8REuKH18cfBMwwQA6gBIttFxWQMWa8ZUgOkuZQBchF2hxP3fc4AIRLBeU0cA8REuKH1oQZIB
waIT8l6VyMyxtUAkeuuacckDpCjZ1wB0jxMvrUTmQnnNXEMEBPhhtbHhsIAeWbCBqOXYimyvq8DGaOtpG9c
KfMQL3M8EZkJ5zVxDBAT4YbWx8ZDDBAjqAGyJ4EBQmULkTxA7pUwQGS+foXITDivibN0gEyZMgV2ux02mw3
BwcGIiooq9fyFCxeiadOmsNlsaN68OZYtW+bx+YKCAgwaNAi1a9dGpUqV0K5dOxw6dEjzerih9cEAMcZDI9
cyQEgzNUC2SxYgRyQOEJnfw4TITDivibNsgCxYsAD+/v6YM2cOYmJi0L17dwQGBiIlJaXE87ds2QI/
Pz988cUXiI2NxcCBA1GxYkXs27fPfc7o0aMREBCAxYsXY8+ePejcuTMaNGiArKwsTWvihtbHpkNnYXc40X4
8A8SXHiwMkL0J6UYvhSTw+NgI2B1ORB2TK0BkvpBb5ndxJzITzmviLBsgwcHB6Nmzp/vj/
Px81KlTB6NGjSrx/C5duqBTp04ejz3wwAN49913Abh++1G7dm2MHTvW/
fn09HTYbDbMnz9f05q4ofWx+TADxAhqgOw7xQChsj0heYDIeCtbNUCafLYcmTm50h15+QVGfwuJAHBe04Ml
AyQnJwd+fn5YtGiRx+PdunVD586dS/
yaO+64AxMmTPB4bPDgwbjvvvsAAEePHoWiKIiOjvY4p23btvjggw9KfM7s7GxkZGS4j4SEBG5oHagB8vT4P
4xeiqU8MIIBQtqpARJ5NNXopXhF5vfSSDjnChBZD/7dQmbBABFnyQBJTEyEoijYunWrx+N9+/
ZFcHBwiV9TsWJF/Pjjjx6PTZ06FX/
7298AuF6ipSgKTp8+7XHOK6+8gi5dupT4nGFhYVAUpdjBDS1mS2GAPPUlA8SXgkes4ZBAmj0xzhUg2yQLEJ
nfTfxKXj7aj99geEgwQEh2DBBxDJAifB0g/A3IX2PLEQaIEdQA2Z/
IIYHK9qTkAdJq6Gqjl3JD8vMLDH8pFV+CRbJjgIizZICY5SVY1+KG1ocaIO0YID7VZjgDhLRTA2TrEbkC5K
DkAUJE4jivibNkgACui9B79erl/jg/Px9169Yt9SL0Z5991uOxhx56qNhF6OPGjXN/
PiMjgxehG2DrkVTYHU48OS7C6KVYyj8KAyQmkfuXytbuyz9gdzix5chZo5filQNJrgBpzQAhsizOa+IsGyA
LFiyAzWbD3LlzERsbix49eiAwMBDJyckAgNdffx39+vVzn79lyxbcfPPNGDduHOLi4hAWFlbibXgDAwOxZM
kS7N27F8899xxvw2uAbUcZIEZQAyT2NPcvle0pyQPk/mEMECKr4rwmzrIBAgCTJ09G/fr14e/
vj+DgYERGRro/FxISgtDQUI/zFy5ciCZNmsDf3x/
NmjW77hsR3n777bDZbGjXrh0OHjyoeT3c0PpQA+QJBohP3T+MAULauQPksFwBEpeUwQAhsjjOa+IsHSBmww
2tj0g1QMZGGL0US7l/2GrYHU7EJXH/
UtmeHu8KkM2SBUjsaTVA1hi9FCIyCOc1cQwQE+GG1kfUsTQGiAHUADmQdMHopZAE1NvByhog/
xjOACGyKs5r4hggJsINrQ81QB5ngPhU66EMENJODZBNh+QKkJhEBgiR1XFeE8cAMRFuaH1sj3cFSMgX641e
iqW0KgyQg8kMECrbMxNcAbLx0Bmjl+KV/
YnpsDucaMMAIbIszmviGCAmwg2tjx0MEEOoAXKIAUIayB4gwSMYIERWxXlNHAPERLih9aEGSFsGiE+1HLKK
AUKaqQGy4aBcAbLvFAOEyOo4r4ljgJgIN7Q+dh53BchjYxggvtSiMEAOpzBAqGwdvtoIu8OJPyQNkAdGrDV
6KURkEM5r4hggJsINrY+dx88xQAxwNUAuGr0UksA/
JQ+QB0cyQIisivOaOAaIiXBD60MNkEfHrDN6KZZy3+cMENJODZCIAylGL8UrexMYIERWx3lNHAPERLih9fH
nCVeAPDKaAeJL94athN3hxJEzDBAqW8eJrgBZL1mA7Ek4D7vDiYcYIESWxXlNHAPERLih9bGLAWIINUCOMk
BIg06T5A6Qh0fx7xciq+K8Jo4BYiLc0PpQA4QDgm81Z4CQF9wBEidXgOw+yQAhsjrOa+IYICbCDa2PaA4Ih
mg+2BUgx85eMnopJIFnJ22C3eHEurhko5fiFf79QkSc18QxQEyEG1of/
BdKY6gBEs8AIQ3+NVnuAOFLPImsi/
OaOAaIiXBD60MNEF4k6lvNGCDkBTVA1sbKFSC8xoyIOK+JY4CYCDe0PtSLRHmbTN+6Z9AK2B1OHE9lgFDZO
hcGyJoYuQJEvcseb/NNZF2c18QxQEyEG1ofvE+/
MdQAOZGaafRSSAKdp2yWOkD4RqdE1sV5TRwDxES4ofWhBsgDIxggvnQ3A4S8oAbIaskCRH2jUwYIkXVxXhP
HADERbmh97DvlCpDgEWuMXoql3DXQFSAn0xggVLbnCgNk1f4ko5filZ3H02B3ONH2CwYIkVVxXhPHADERbm
h9MECMwQAhbzw/
Ve4ACWGAEFkW5zVxDBAT4YbWhxogbYYzQHyp6cDlDBDSTA2QlZIFyI54BgiR1XFeE8cAMRFuaH3sT3QFyD8
YID7V5DNXgCScY4BQ2V4oDJAV+
+QKkO2FAfL42Aijl0JEBuG8Jo4BYiLc0PqIScxggBhADZBT5y8bvRSSwIvTtkgdIE8wQIgsi/
OaOAaIiXBD60MNkPuHMUB8KYgBQl64GiCnjV6KV6KOMUCIrI7zmjjLBUhaWhpee+01VKtWDQEBAXjrrbdw8
eLFUs/
v1asXmjRpgkqVKuGOO+5A7969kZ6e7nGeoijFjvnz53u1Nm5ofcSeVgNktdFLsZSgAa4ASWSAkAYvFQbI8r
1yBUjk0VRXgIyLMHopRGQQzmviLBcgHTp0QIsWLRAZGYlNmzahcePG6Nq163XP37dvH1588UUsXboUR44cw
bp16xAUFISXXnrJ4zxFURAeHo6kpCT3kZWV5dXauKH1EZfEADGCGiCn0xkgVLaXv5Y7QJ5kgBBZFuc1cZYK
kNjYWCiKgh07drgfW7FiBSpUqIDExETNz7Nw4UL4+/sjNzfX/
ZiiKFi0aJHQ+rih9aEGSOuhDBBfajxgGQOENFMDZJlkAbKNAUJkeZzXxFkqQGbPno3AwECPx3Jzc+Hn54ff
fvtN8/PMmjULNWvW9HhMURTUqVMHNWrUQJs2bTB79mwUFBR4tT5uaH0cSLoAu8OJVgwQn2rU3xUgSene/
eaPrOmVr7fC7nDCuUeuANl6xBUg7b78w+ilEJFBOK+Js1SAjBgxAk2aNCn2eK1atTBt2jRNz3H27FnUr18f
AwYM8Hh86NCh2Lx5M3bt2oXRo0fDZrNh4sSJpT5XdnY2MjIy3EdCQgI3tA4OJjNAjKAGSHIGA4TK9sp0uQP
kKQYIkWUxQMSViwBxOBwlXgRe9IiLixMOkIyMDAQHB6NDhw64cuVKqecOGjQI9erVK/
WcsLCwEtfKDS1GDZCWQ1YZvRRLacgAIS+oAfL7Hu0vfzWDLUfOMkCILI4BIq5cBMiZM2cQFxdX6pGTkyP0E
qwLFy7goYceQrt27TRdXO50OqEoCrKzs697Dn8D8tc4VBggLRggPtWgnxN2hxMpDBDSoEthgCzdLVmAHHYF
yNPjGSBEVsUAEVcuAkQr9SL0nTt3uh9btWpVmRehZ2Rk4MEHH0RISAgyM7W9y/
Pw4cNx6623erU+bmh9HE5hgBjBHSAXGCBUtn/PkDtA2o/
fYPRSiMggnNfEWSpAANdteFu1aoWoqChs3rwZQUFBHrfhPXXqFJo2bYqoqCgArk32wAMP4N5778WRI0c8br
Obl5cHAFi6dClmzZqFffv24fDhw5g2bRqqVKmCwYMHe7U2bmh9qAFy3+cMEF+6kwFCXlADZIlkAbKZAUJke
ZzXxFkuQNLS0tC1a1dUrVoV1atXx5tvvunxRoTx8fFQFAUREREAgIiIiOteVxIfHw/
AdSvfli1bomrVqrjlllvQokULTJ8+Hfn5+V6tjRtaH4dTLsLucOLesJVGL8VS7A5XgJy5cP2XHRKpXp2xDX
aHE4ujTxm9FK9sOuQKkGcmMECIrIrzmjjLBYiZcUPr48gZBogR1AA5e5EBQmXrOpMBQkRy4rwmvC7BQQAAI
ABJREFUjgFiItzQ+lADpDkDxKcYIOQNWQNk46EzDBAii+O8Jo4BYiLc0Po4qgbIYAaIrxQUFLgDJJUBQhq8
NssVIIt2yRUgGw66AqTDVxuNXgoRGYTzmjgGiIlwQ+vj2NlLDBAfKxogaZdyjF4OSeA/syKlDpB/
MkCILIvzmjgGiIlwQ+tDDZBmDBCfyc9ngJB31AD5bVeC0Uvxyh8MECLL47wmjgFiItzQ+ogvDJB7Bq0weim
WkVckQM4xQEiD//vGFSC//
ilXgEQcSIHd4UTHiQwQIqvivCaOAWIi3ND6OJ7KAPG1ogFyPpMBQmWTPUA6TWKAEFkV5zVxDBAT4YbWhxog
dzNAfCY3L58BQl5RA+SXnXIFyHoGCJHlcV4TxwAxEW5ofZxIzYTd4cRdAxkgvnKlSICkZ14xejkkgddnR8H
ucOJn2QIkzhUgz07aZPRSiMggnNfEMUBMhBtaHyfTGCC+5hEglxkgVLZukgfIvyYzQIisivOaOAaIiXBD60
MNkKYDlxu9FMvIyWWAkHfUAFm446TRS/
HKurhkBgiRxXFeE8cAMRFuaH2oAdLkMwaIr2Tn5rkDJCOLAUJlC53jCpCfJAuQtbGuAOnMACGyLM5r4hggJ
sINrY+EcwwQXysaIBcYIKTBG7IHyJTNRi+FiAzCeU0cA8REuKH1oQZIEAPEZ7KuMEDIO+4A2S5XgKyJYYAQ
WR3nNXEMEBPhhtbHqfOXXQEygAHiK0UD5GJ2rtHLIQm8Gb4ddocTC7afMHopXlldGCDPMUCILIvzmjgGiIl
wQ+sjkQHic0UD5BIDhDR4S/
IAeX4qA4TIqjiviWOAmAg3tD7UAGk8YJnRS7GMyzkMEPKOGiDzo+QKkFX7kxggRBbHeU0cA8REuKH1cTrdF
SCN+jNAfCUzJ9cdIJk5DBAq29tzXQHyo2QBsrIwQF5ggBBZFuc1cQwQE+GG1kdSehYDxMeKBsjlnDyjl0MS
eHvuDqkD5MVpW4xeChEZhPOaOAaIiXBD60MNkIYMEJ+5lM0AIe+oAfJDpFwBsmIfA4TI6jiviWOAmAg3tD6
SM1wB0qCf0+ilWMbFIgGSdYUBQmV751tXgHwfedzopXhlxb7TsDuceIkBQmRZnNfEMUBMhBtaHykMEJ9jgJ
C3ukseIC9/
zQAhsirOa+IYICbCDa0PNUDuZID4zIWsKwwQ8ooaIN9tkytAlu9lgBBZHec1cQwQE+GG1kfKhSz3MEy+kVE
kQLJzGSBUth7zXAEyT7IAWVYYIK98vdXopRCRQTiviWOAmAg3tD7OXMhmgPhY0QDJyc03ejkkgXfn7ZQ7QK
YzQIisivOaOAaIiXBD64MB4nvplxkg5B13gGyNN3opXnHuYYAQWR3nNXGWC5C0tDS89tprqFatGgICAvDWW
2/h4sWLpX5NSEgIFEXxON59912Pc06cOIGOHTuicuXKqFWrFj755BPk5nr3hmzc0Po4e/
FqgBQUFBi9HEtIz7waIFfyGCBUtve+cwXIt5IFyO97EmF3ONGFAUJkWZzXxFkuQDp06IAWLVogMjISmzZtQ
uPGjdG1a9dSvyYkJATdu3dHUlKS+yi66fLy8tC8eXM89dRTiI6OxvLly1GzZk3079/
fq7VxQ+sjlQHic0UDJJcBQhq8/73cAfLvGQwQIqvivCbOUgESGxsLRVGwY8cO92MrVqxAhQoVkJiYeN2vCw
kJQZ8+fa77+eXLl+Omm25CcnKy+7Gvv/4a1atXR05Ojub1cUPro2iA5OczQHzhfGYOA4S8ogbI3C3xRi/
FK0t3M0CIrI7zmjhLBcjs2bMRGBjo8Vhubi78/Pzw22+/
XffrQkJCULNmTdSoUQPNmjVDv379kJmZ6f78oEGD0KJFC4+vOXbsGBRFwa5du677vNnZ2cjIyHAfCQkJ3NA
6SLt0dRjOY4D4xDl+z8lL//
3+T9gdToRvPmb0UryypDBAXp2xzeilEJFBGCDiLBUgI0aMQJMmTYo9XqtWLUybNu26XzdjxgysXLkSe/
fuxffff4+6devihRdecH++e/fuaN++vcfXZGZmQlEULF++/LrPGxYWVuzaEm5ocRyGfa/o95y/dSIt/
vuD3AHSdSYDhMiqGCDiykWAOByOEgf5okdcXNwNB8i11q1bB0VRcOTIEQA3HiD8Dchfo+gwzJcD+UYaA4S8
pAbIHMkCZHH0KQYIkcUxQMSViwA5c+YM4uLiSj1ycnJu+CVY17p06RIURcHKlSsB3PhLsK7FDa2Potcj8I5
MvsEL/8lbPQsDZPYmOQPktVkMECKr4rwmrlwEiFbqReg7d+50P7Zq1aoyL0K/
1ubNm6EoCvbs2QPg6kXoKSkp7nNmzJiB6tWrIzs7W/
PzckPrg7eE9b2iAUKkRa8fd0kdIP+ZFWn0UojIIJzXxFkqQADXbXhbtWqFqKgobN68GUFBQR634T116hSaN
m2KqKgoAMCRI0cwdOhQ7Ny5E/Hx8ViyZAkaNmyItm3bur9GvQ1v+/
btsXv3bqxcuRK1atXibXgNUjRA+KZ4vnGWAUJeUgPkG8kCZNEuBgiR1XFeE2e5AElLS0PXrl1RtWpVVK9eH
W+++abHGxHGx8dDURREREQAAE6ePIm2bdvitttug81mQ+PGjdG3b99im+748eP45z//
icqVK6NmzZr4+OOP+UaEBin6rtzZuXlGL8cS+O7z5K3ehQEya+NRo5fild92JcDucOL/
vmGAEFkV5zVxlgsQM+OG1kdGFgPE19QAubMfA4S0+WA+A4SI5MR5TRwDxES4ofVRNECyrjBAfCHlQhYDhLw
ia4D8+icDhMjqOK+JY4CYCDe0Pi4wQHwuJcMVIA0YIKRRn8IAmblBrgD5ZacrQF6fHWX0UojIIJzXxDFATI
QbWh8Xs3MZID6mBkjD/
suMXgpJ4sMF0VIHSDcGCJFlcV4TxwAxEW5ofRQNkMs5DBBfSGaAkJfUAJmx4YjRS/
HKzwwQIsvjvCaOAWIi3ND6uFQkQDJzvLsTGd2YpHRXgDRigJBGHxUGyPQ/
5AqQhTtOwu5wInQOA4TIqjiviWOAmAg3tD4ycxggvqYGSOMBDBDS5qOf5A6QNxggRJbFeU0cA8REuKH1UTR
ALmUzQHzhdPplBgh5RQ2QryULkJ8YIESWx3lNHAPERLih9XE5J88dIBcZID6ReN4VIEEDlhu9FJLE/
37aDbvDiWkRkgXIdleAvBm+3eilEJFBOK+JY4CYCDe0PrKuMEB8zR0gnzFASJuPF8odIG8xQIgsi/
OaOAaIiXBD66NogFzIumL0cizhFAOEvKQGyNSIw0YvxSsLtp9ggBBZHOc1cQwQE+GG1kfRAMlggPhEwrlM2
B1ONGGAkEafFAbIlPVyBcj8KFeAvD2XAUJkVZzXxDFATIQbWh/ZuQwQX1MDpOlABghp0/
dn2QNkh9FLISKDcF4TxwAxEW5ofRQNkPTLDBBfOJnGACHvyBogPzJAiCyP85o4BoiJcEPrIyc3/2qAZDJAf
EENkLsGrjB6KSSJT3/eA7vDicnrDhm9FK/
8EOkKkHe+ZYAQWRXnNXEMEBPhhtbHlTwGiK+pAXL3IAYIaeP4Re4A6c4AIbIszmviGCAmwg2tj6IBcj4zx+
jlWMKJVAYIeUcNkElr5QqQ7yOPM0CILI7zmjgGiIlwQ+sjt0iAnLvEAPGF46mXYHc4cQ8DhDTq96srQCZKF
iDfbXMFSI95DBAiq+K8Jo4BYiLc0PrIyy9ggPiYGiDNBq80eikkiX6/7pU6QN6dt9PopRCRQTiviWOAmAg3
tD6KBkgaA8Qn4s8yQMg7aoB8tUauAJnHACGyPM5r4hggJsINrY/8IgGSejHb6OVYwrHCAGnOACGN+v/
mCpAJaw4avRSvzNsaD7vDife+Y4AQWRXnNXEMEBPhhtZHQQEDxNfcARLGACFtBkgeIO9/
zwAhsirOa+IYICbCDa2PogFylgHiE0fPXGSAkFfUABm/
Wq4A+ZYBQmR5nNfEMUBMhBtaP2qAnLnAAPGFI4UBci8DhDT6bJErQL6ULEDmbnEFyH+//
9PopRCRQTivibNcgKSlpeG1115DtWrVEBAQgLfeegsXL1687vnx8fFQFKXEY+HChe7zSvr8/
PnzvVobN7R+GCC+pQbIfZ+vMnopJImBi/bJHSA/
MECIrIrzmjjLBUiHDh3QokULREZGYtOmTWjcuDG6du163fPz8vKQlJTkcQwZMgRVq1b1CBdFURAeHu5xXlZ
Wlldr44bWjxogKRe8+xnQjTmcwgAh77gDZNUBo5filfDNxxggRBbHeU2cpQIkNjYWiqJgx46rbyC1YsUKVK
hQAYmJiZqfp2XLlnjrrbc8HlMUBYsWLRJaHze0fu7sVxggGQwQXziccgF2hxMthjBASJtBi10BMk6yAJlTG
CA9GSBElsV5TZylAmT27NkIDAz0eCw3Nxd+fn747bffND3Hzp07oSgKtmzZ4vG4oiioU6cOatSogTZt2mD2
7NkoKCjwan3c0PppwADxKTVAWjJASKPBkgdIrx93Gb0UIjII5zVxlgqQESNGoEmTJsUer1WrFqZNm6bpOd5
//33cfffdxR4fOnQoNm/
ejF27dmH06NGw2WyYOHFiqc+VnZ2NjIwM95GQkMANrRM1QJIZID5xKJkBQt5RA2TsSrkCZPYmBgiR1TFAxJ
WLAHE4HNe9UFw94uLihAPk8uXLCAgIwLhx48o8d9CgQahXr16p54SFhZW4Vm5ocQ37L4Pd4URSOgPEFw4WB
kiroauNXgpJImzJftgdTnyxMs7opXjlm8IA6c0AIbIsBoi4chEgZ86cQVxcXKlHTk6O8Euw5s2bh4oVK+LM
mTNlnut0OqEoCrKzr38XJv4G5K/TiAHiU2qAtGaAkEayB8gH8xkgRFbFABFXLgJEK/
Ui9J07r76B1KpVqzRfhB4SEoKXXnpJ0581fPhw3HrrrV6tjxtaP2qAnE6/
bPRSLOFAEgOEvKMGyJgVcgXIrI1HGSBEFsd5TZylAgRw3Ya3VatWiIqKwubNmxEUFORxG95Tp06hadOmiIq
K8vi6w4cPo0KFClixYkWx51y6dClmzZqFffv24fDhw5g2bRqqVKmCwYMHe7U2bmj9NB7gCpDE8wwQX4hLyo
Dd4cT9wxggpM3nS10BMlrSAOnDACGyLM5r4iwXIGlpaejatSuqVq2K6tWr48033/R4Pw/
1jQcjIiI8vq5///644447kJ+fX+w5V6xYgZYtW6Jq1aq45ZZb0KJFC0yfPr3Ec0vDDa2foAHLGSA+dDVA1h
i9FJLEkKUxUgfIhwuijV4KERmE85o4ywWImXFD60cNkFMMEJ+IPc0AIe+oATJquVwBMnMDA4TI6jiviWOAm
Ag3tH6CPnMFSMK5TKOXYgkxia4A+cdwBghpM/
R3V4CMXB5r9FK8MmPDEdgdTnzEACGyLM5r4hggJsINrZ8mDBCfUgOkDQOENBome4D8xAAhsirOa+IYICbCD
a0fNUBOpjFAfGF/YjoDhLziDpBlcgXI9D8YIERWx3lNHAPERLih9dN0IAPEl/
adcgVI8AgGCGkz3OkKkBGSBcjXhQHyv592G70UIjII5zVxDBAT4YbWz10DVzBAfEgNkAdGrDV6KSSJEctip
Q6QjxcyQIisivOaOAaIiXBD60cNkBOpDBBfYICQt9QAGe6MMXopXpkWwQAhsjrOa+IYICbCDa2fuwe5AuR4
6iWjl2IJexNcAfLgSAYIaTOyMECG/
S5XgEyNOAy7w4lPGCBElsV5TRwDxES4ofVzDwPEp9QAeYgBQhqNXC53gPT9mQFCZFWc18QxQEyEG1o/
aoDEn2WA+MKehPMMEPKKGiBDJQuQKesZIERWx3lNHAPERLih9dNs8ErY/
7+9+w+Kqv73OH4QZVERUEHxR6AlWhNl3q8xWl27Xbxm6ujkpA7aaNromJY6WYGZkRVK+eNevzk2NppOk4Nl
F3/
kz8zUUUuS6wr+1vxJatGXBKmEUXjdP5Y9uYIttOvZXff5mPn8wTkH5rPv3p4+r90956St12kCiCUOnHcEkE
dmb/
P1VBAgZm88qoS09Zq5LjADyGur8n09FQA+wnrNcwQQP0JDe08SAcRSBBDUV9amwA4gaV8QQIBgxXrNcwQQP
0JDe48zgJwqKvP1VIKCnQCCenIGkLfWHfL1VOrlg20nCCBAkGO95jkCiB+hob0nKcMRQH4ggFhi/
7lflZC2Xo9mEUBQN+9VB5CMtYEVQP75tSOApP8vAQQIVqzXPEcA8SM0tPc8QACxlDOAPPYeAQR18/7mQA8g
Bb6eCgAfYb3mOQKIH6GhvccZQE7+TACxwv8RQFBPgRpAFhBAgKDHes1zBBA/
QkN7z4NvbakOIFd8PZWgkHfWEUD+/b1vfD0VBIg5m48pIW293lxz0NdTqZf/
2eoIINNyCCBAsGK95jkCiB+hob2n60wCiJWcAaTX+wQQ1M3cLYEdQF4ngABBi/
Wa5wggfoSG9h5nADnxEwHECnlniwkgqBdnAJkRYAHkv7ceJ4AAQY71mucIIH6Ehvaeh6oDyHECiCX2nXEEk
McJIKijedUB5I3VgRVA5n/lCCDTVxNAgGDFes1zBBA/
QkN7T7e3vyKAWMgZQP5jznZfTwUBYl71Qj5QA0igzRuA97Be8xwBxI/
Q0N7jDCDHLhFArPA9AQT1NC9AP0kI1OAEwHtYr3mOAOJHaGjv+bfqAHL0ErW0Qu5pRwB5ggCCOnJ+khBo11
LMC9BrVwB4D+s1zxFA/AgN7T3/
eIcAYiUzgMzd7uupIEAE6sXc8wL07l0AvIf1mucIIH6EhvYeZwA5cpFaWmHvqX8RQFAvzgASaM/
TCNTbBwPwHtZrniOA+BEa2nv+8c5WJaSt1+EL1NIK31UHkP8kgKCOnM/
TCLQnijsfoBhoT3AH4D2s1zwXdAHk3XffVc+ePdW4cWNFRUXV6Xeqqqo0Y8YMxcXFKTw8XCkpKTpx4oTLMc
XFxRo+fLiaNWumqKgojRkzRmVlZfWaGw3tPd3fJYBYyRlAUubt8PVUECAWfE0AARCYWK95LugCyJtvvqn58
+fr5ZdfrnMAycrKUlRUlNasWaP8/
HwNHDhQHTt21NWrV81j+vbtq65du2rv3r3atWuXOnXqpNTU1HrNjYb2HmcAOXShxNdTCQrf/
kAAQf38GUDyfT2Venl/
81ECCBDkWK95LugCiNOyZcvqFECqqqoUFxenOXPmmNtKSkpks9mUnZ0tSTpy5IgMw9C+ffvMYzZt2qSQkBB
duHChznOiob3n4eoAkne2WL9XXGPc5vHNsZ+VkLZevQkgqKN/VgeQqZ8f8Hn/
1mdkbjiihLT1emsdAQQIVqzXPEcAcePUqVMyDEN2u91le69evTRp0iRJ0tKlSxUdHe2y/
9q1awoNDVVOTs4t/3Z5eblKS0vNUVhYSEN7SXKmI4AwrB3/NZ8Agrr5YNsJn/
erJ2PmusO+LiEAHyGAeI4A4saePXtkGIYuXrzosn3IkCEaOnSoJCkzM1OdO3eu8buxsbFatGjRLf92RkaGD
MOoMWhoz73y+QGfL1CCcbAoQ119d+pfuveNTT7v2b8zEl/fqE0HL/
m6hAB8hADiuTsigKSlpdW6kL9xHD161OV3/CGA8AnI7fVHxXWff10jmMYfFdd9/Z8cAabiWqXP+/
bvjPJr9DoQzAggnrsjAkhRUZGOHj36l6OiosLld/
zhK1g3o6EBAAD8G+s1z90RAeTvqO9F6HPnzjW3lZaW1noRel5ennnMli1buAgdAADgDsN6zXNBF0DOnTsnu
92umTNnKiIiQna7XXa73eWZHV26dHH55CIrK0vR0dFau3atCgoKNGjQoFpvw9utWzfl5uZq9+7dSkxM5Da8
AAAAdxjWa54LugAyatSoWq8R2b59u3mMYRhatmyZ+bPzQYStW7eWzWZTSkqKjh8/7vJ3i4uLlZqaqoiICEV
GRmr06NE8iBAAAOAOw3rNc0EXQPwZDQ0AAODfWK95jgDiR2hoAAAA/8Z6zXMEED9CQwMAAPg3
1mueI4D4ERoaAADAv7Fe8xwBxI/
Q0AAAAP6N9ZrnCCB+hIYGAADwb6zXPEcA8SM0NAAAgH9jveY5AogfKSkpkWEYKiwsVGlpKYPBYDAYDAbDz0
ZhYaEMw1BJSYmvl44BiwDiR5wNzWAwGAwGg8Hw73Hq1ClfLx0DFgHEj1RWVqqwsFAlJSU+T/
c3Jnw+kaFG1Iga+XpQI2pEjaiRv4zz58/
LMAxdvnzZ10vHgEUAwS2VlvIdR3eokXvUyD1q5B41co8auUeN3KNG7lEjzxFAcEv8A3OPGrlHjdyjRu5RI/
eokXvUyD1q5B418hwBBLfEPzD3qJF71Mg9auQeNXKPGrlHjdyjRu5RI88RQHBL5eXlysjIUHl5ua+n4reok
XvUyD1q5B41co8auUeN3KNG7lEjzxFAAAAAAFiGAAIAAADAMgQQAAAAAJYhgAAAAACwDAEEAAAAgGUIILil
hQsXKiEhQTabTcnJycrNzfX1lCyzc+dODRgwQG3atJFhGFq9erXL/
qqqKs2YMUNxcXEKDw9XSkqKTpw44XJMcXGxhg8frmbNmikqKkpjxoxRWVmZlS/jtpk1a5a6d+
+uiIgIxcbGatCgQTp27JjLMVevXtWECRPUokULNW3aVIMHD9ZPP/3kcsy5c+fUr18/
NW7cWLGxsXrllVd07do1K1/
KbbNo0SI98MADatasmZo1a6YePXpo48aN5v5gr09tZs+eLcMwNHnyZHNbsNcpIyNDhmG4jC5dupj7g70+Tj
/++KNGjBihFi1aKDw8XElJSdq3b5+5P9jP2QkJCTX6yDAMTZgwQRJ9JEnXr1/
XG2+8oQ4dOig8PFx333233n77bVVVVZnHBHsfeRMBBLVauXKlwsLC9PHHH+vw4cMaO3asoqOj9fPPP/
t6apbYuHGjpk+frpycnFoDSFZWlqKiorRmzRrl5+dr4MCB6tixo65evWoe07dvX3Xt2lV79+7Vrl271KlTJ
6Wmplr9Um6LJ598UsuWLdOhQ4d04MAB9evXT/Hx8frtt9/MY8aPH6+77rpL27ZtU15ennr06KFHHnnE3H/
9+nUlJSWpd+/
estvt2rhxo2JiYjRt2jRfvCSvW7dunTZs2KATJ07o+PHjev3119WoUSMdOnRIEvW52ffff68OHTrowQcfdA
kgwV6njIwM3X///bp06ZI5fvnlF3N/
sNdHkn799VclJCToueeeU25urk6fPq0tW7bohx9+MI8J9nN2UVGRSw9t3bpVhmFo+/
btkugjScrMzFTLli21fv16nTlzRqtWrVJERIQWLFhgHhPsfeRNBBDUKjk5WRMnTjR/
rqysVNu2bTV79mwfzso3bg4gVVVViouL05w5c8xtJSUlstlsys7OliQdOXJEhmG4vAO3adMmhYSE6MKFC9Z
N3iJFRUUyDEM7d+6U5KhHo0aNtGrVKvOYo0ePyjAMfffdd5IcIa9BgwYu77J9+OGHioyMVEVFhbUvwCLNmz
fXkiVLqM9NysrKlJiYqK1bt+rxxx83Awh1cgSQrl271rqP+jikpaXpscceu+V+ztk1TZ48Wffcc4+qqqroo
2r9+/
fXmDFjXLYNHjxYI0aMkEQfeRsBBDVUVFQoNDS0xrv+I0eO1MCBA300K9+5OYCcOnVKhmHIbre7HNerVy9Nm
jRJkrR06VJFR0e77L927ZpCQ0OVk5Nz+ydtsZMnT8owDB08eFCStG3bNhmGocuXL7scFx8fr/
nz50uSZsyYUWNhdfr0aRmGof3791szcYtcv35d2dnZCgsL0+HDh6nPTUaOHKkpU6ZIkksAoU6OANKkSRO1a
dNGHTt21PDhw3Xu3DlJ1Mfpvvvu05QpU/
TMM88oNjZWDz30kD766CNzP+dsVxUVFWrZsqUyMzMl0UdOmZmZSkhI0PHjxyVJBw4cUKtWrfTpp59Koo+8j
QCCGi5cuCDDMPTtt9+6bH/
11VeVnJzso1n5zs0BZM+ePTIMQxcvXnQ5bsiQIRo6dKgkx4msc+fONf5WbGysFi1adHsnbLHKykr1799fjz
76qLltxYoVCgsLq3Hsww8/rNdee02SNHbsWPXp08dl/++//
y7DMFyulQhkBQUFatq0qUJDQxUVFaUNGzZIoj43ys7OVlJSkvkVhhsDCHVyvPP8+eefKz8/
X5s3b1bPnj0VHx+vK1euUJ9qNptNNptN06ZN0/79+7V48WKFh4dr+fLlkjhn3+yzzz5TaGio+Y48feRQWVm
ptLQ0hYSEqGHDhgoJCdGsWbPM/
fSRdxFAUAMBxBUB5K+NHz9eCQkJKiwsNLfxPzSHiooKnTx5Unl5eUpPT1dMTIwOHz5MfaqdP39erVq1Un5+
vrmNAPLXLl+
+rMjISC1ZsoT6VGvUqJF69uzpsu2ll15Sjx49JHHOvlmfPn00YMAA82f6yCE7O1vt27dXdna2CgoK9Mknn6
hFixYE2duEAIIa+AqWK76CdWsTJ05U+/
btdfr0aZftfKRfu5SUFI0bN476VFu9erUMw1BoaKg5DMNQSEiIQkND9fXXX1OnWnTv3l3p6en0UbX4+Hg9/
/
zzLtsWLVqktm3bSuKcfaOzZ8+qQYMGWrNmjbmNPnJo3769Fi5c6LLtnXfeMe86Rx95FwEEtUpOTtaLL75o/
lxZWal27dpxEbr+vBBt7ty55rbS0tJaL0TLy8szj9myZcsdcyFaVVWVJk6cqLZt29a4BaH058WxX3zxhbnt
2LFjtV7UeOOd1RYvXqzIyEiVl5ff/
hfhA0888YRGjRpFfapduXJFBw8edBndu3fXs88+q4MHD1KnWpSVlal58+ZasGAB9amWmppa4yL0KVOmmJ+K
cM7+U0ZGhuLi4lxun0sfObRo0aLGpxSzZs1SYmKiJPrI2wggqNXKlStls9m0fPmc6lCvAAACrUlEQVRyHTl
yROPGjVN0dHSN+4LfqcrKymS322W322UYhubPny+73W5e/
JmVlaXo6GitXbtWBQUFGjRoUK234uvWrZtyc3O1e/duJSYm3jG34nvhhRcUFRWlHTt2uNza8Y8//
jCPGT9+vOLj4/
XNN98oLy9PPXv2dPmahPO2jn369NGBAwe0efNmxcbG3jG3dUxPT9fOnTt15swZFRQUKD09XSEhIfrqq68kU
Z9bufErWBJ1mjp1qnbs2KEzZ85oz5496t27t2JiYlRUVCSJ+kiOWzg3bNhQmZmZOnnypFasWKEmTZqYFw9L
nLMlxxuJ8fHxSktLq7GPPpJGjRqldu3ambfhzcnJUUxMjPk1NIk+8iYCCG7pgw8+UHx8vMLCwpScnKy9e/
f6ekqW2b59e60PbRo1apSkPx9G1Lp1a9lsNqWkpJh3znAqLi5WamqqIiIiFBkZqdGjR98xDyOqrTaGYWjZs
mXmMc4HWzVv3lxNmjTR008/
rUuXLrn8nbNnz+qpp55S48aNFRMTo6lTp94xD7YaM2aMEhISFBYWptjYWKWkpJjhQ6I+t3JzAAn2Og0bNkx
t2rRRWFiY2rVrp2HDhrk83yLY6+P05ZdfKikpSTabTffee6/
LXbAkztmS4514wzBqvG6JPpIcn8hOnjxZ8fHx5oMIp0+f7nKbYfrIewggAAAAACxDAAEAAABgGQIIAAAAAM
sQQAAAAABYhgACAAAAwDIEEAAAAACWIYAAAAAAsAwBBAAAAIBlCCAAAAAALEMAAQAAAGAZAggAAAAAyxBAA
AAAAFiGAAIAAADAMgQQAAAAAJYhgAAAAACwDAEEAAAAgGUIIAAAAAAsQwABAAAAYBkCCAAAAADLEEAAAAAA
WIYAAgAAAMAyBBAAAAAAliGAAAAAALDM/wO2/7wdex8KygAAAABJRU5ErkJggg==\" width=\"800\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"T = 64 # période\n",
"\n",
"\n",
"data_up = np.zeros([T * data.shape[0]])\n",
"data_up[::T] = data\n",
"\n",
"\n",
"\n",
"sig = si.convolve(data_up, waveform)\n",
"\n",
"plt.figure()\n",
"plt.plot(sig)\n",
"plt.title(\"Signal analogique transmis\");\n",
"plt.xlim(XLIMS);\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On décode le signal en calculant la corrélation entre le signal reçu (ici
identique au signal émis) et la forme d'onde. Le signe de la valeur de
l'autocorrélation aux temps $kT$ permet de retrouver les données."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"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 = $('<div/>');\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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all '
+\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\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 = $('<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 = $('<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 = $('<canvas/>');\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 = $('<div/>');\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 = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all
' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\
n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt ===
mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then
trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\
n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id:
this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format =
format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\
n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL ||
window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21)
== \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message
type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \",
msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type +
\"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-
in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from
http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the
document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-
home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-
arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-
right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan
axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"],
[\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"],
[\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-
save\", \"download\"]];\n",
"\n",
"mpl.extensions =
[\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm)
{\n",
" // Create a \"websocket\"-like object which calls the given IPython
comm\n",
" // object with the appropriate methods. Currently this is a non binary\
n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage
function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a
real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id +
\"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in
FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' +
width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\"
width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\"
title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></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 = $('<span class=\"mpl-message\" style=\"text-
align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline
pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\"
title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove
icon-large\"></i></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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 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"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img
src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAGQCAYAAABWJQQ0AAAgAElEQVR
4nOzdeVxUVf8H8Mu+yQiFu4bibpmYW24PlZZaqZWWPVpRLj2puZQ/
l6wEs73HQUU0l9yw1MfUylIcFxRcUARc0TuAbMoiqwjIMjOf3x+XuTrMAMMyc++d+b5fr/
sqZ67MmcsRzmfuOd/
DgBBCCCGEEELMhBG6AYQQQgghhBDrQQGEEEIIIYQQYjYUQAghhBBCCCFmQwGEEEIIIYQQYjYUQAghhBBCCC
FmQwGEEEIIIYQQYjYUQAghhBBCCCFmQwGEEEIIIYQQYjYUQAghhBBCCCFmQwGEEEIIIYQQYjYUQAghhBBCC
CFmQwGEEEIIIYQQYjYUQAghhBBCCCFmQwGEEEIIIYQQYjYUQAghhBBCCCFmQwGEEEIIIYQQYjYUQAghhBBC
CCFmQwGEEEIIIYQQYjYUQAghhBBCCCFmQwGEEEIIIYQQYjYUQAghhBBCCCFmQwGEEEIIIYQQYjYUQAghhBB
CCCFmQwGEEEIIIYQQYjYUQAghBp06dQrLly9HYWGh0E0hhBBCiAWhAEII0ZOSkgJPT0/I5XK95/z8/
ODn59ekrxcQEACGoR9HpuTv7w9vb2+hm8Hz9vaGv7+/
0M0Qvfv372PatGlo1aoVGIbBvHnzhG6SSYntZ4Epft4RQiiAECK4xMREfPjhh+jUqROcnJzg7u6OIUOGYNW
qVSgtLTV7eyoqKjBo0CB88sknBp9v6C/
kkpISBAQEIDw8XO85sQ06GuP69esICAhAcnKy0E3RQQFEHEJCQrB161ajz//
ss89gZ2eHwMBAhIaG4uLFi6ZrnAgY+lng7e2NgIAAQdpDAYQQ07CM3/iESNTff/
8NFxcXeHh4YO7cudi4cSPWrl2Lt99+Gw4ODpgxY4bZ2xQXF4egoCBoNBqDzzf0F3JOTg4YhjE4kKisrMSDB
w/q/TXFaO/evWAYxmDQElJFRQXKysqEbgbPWgPIk08+Wa9/
P4MGDcLQoUNN1yCRoQBCiHWgAEKIQG7duoVmzZqhR48eyMjI0Hs+ISEBq1atavTraDSaGu+kqNXqeg/
8TRFALEl9Akht3xtL19AAUllZifLy8qZvkJnUN4B06tQJr7zySpO9vtivHwUQQqwDBRBCBPLRRx+BYRicOX
PGqPMrKyvx1VdfwcfHB46OjvD29sZnn32m96m2t7c3XnnlFYSFhaFfv35wcnJCUFAQAIBhGMyePRs7d+5Er
169YG9vjwMHDgDgwkhQUBB69eoFJycntGzZEh9++CHy8/
N1vn71X8jl5eX48ssv8cwzz0Amk8HV1RXDhg3DiRMn+HOSk5PBMIzeoR1UGBp01Pf9RkZGYsCAAXByckKnT
p2wfft2o66rse/
bmNfZunWrwfepDSO1fW8AIDQ0FM888wycnZ3h6emJSZMmIS0trc73UFRUhHnz5sHb2xuOjo5o0aIFRo4ciZ
iYGP4cQ1OwcnNz8c4778Dd3R3NmzfHe++9h0uXLoFhGJ1pQv7+/
nBzc8Pt27cxfvx4uLm5wcvLCwsWLIBKpdL5mj/99BMGDx6Mxx57DM7OznjmmWewd+9evTYbE0C0/
eann35CUFAQfHx8YGtri7i4OABAWVkZli1bhs6dO8PR0RHt27fHwoULDd7pCQ0NxYABA/
g7jsOHD8eRI0f452sKx8YGJWP6kbe3t17fqGlwGx4ebrAvaaf2ZWdnY+rUqWjZsiWcnJzw9NNPY9u2bUZfP
+3X37NnDwIDA9G2bVs0a9YMEyZMQGFhIcrKyjBv3jy0aNECbm5ueP/992u8rg3pswAQGRmJ/
v37w8nJCT4+Pvj555+NDiBJSUmYOHEiPD094eLigkGDBuHvv/
82eA337NmDr7/+Gu3atYOTkxNeeOEFJCQk6LVnw4YN8PHxgbOzMwYMGICIiAiDAaQ+/
Y4QYhgFEEIE0q5dO/j4+Bh9vr+/PxiGwcSJExESEoL33nsPDMPgtdde0znP29sbXbp0gaenJ5YsWYKff/
6ZHwAzDIOePXuiRYsWWL58OUJCQvjB3PTp02Fvb48ZM2bg559/xuLFi+Hm5oYBAwagoqKC//
rVfyHn5OSgTZs2+PTTT7F+/Xr8+OOP6N69OxwcHPivXVxcjPXr14NhGLz++usIDQ1FaGgoLl++DMBwAKnP+
+3evTtatWqFpUuXYu3atXjmmWdgY2ODa9eu1XldjX3fxrxOUlIS5s6dC4ZhsHTpUv59ZmVl1fm9+frrr2Fj
Y4NJkyZh3bp1WL58Oby8vNCxY0cUFBTU+h4mT54MR0dHfPrpp9i8eTN+
+OEHjB07Fjt37tS5no8GELVajcGDB8POzg4ff/wx1q5dixdffBF9+vQxGECcnZ3x5JNPYurUqVi/
fj0mTJgAhmGwbt06nba0b98es2bNwtq1ayGXyzFw4EAwDKM3OKxPAOnVqxd8fHzw/
fffIygoCKmpqVCr1XjppZfg6uqK+fPnY8OGDfj4449hb2+P8ePH63ydwMBAMAyDIUOG4KeffsLq1asxefJk
LF68mD+nsQHEmH504MABtG/fHj169OD7hkKhMPj1srKyEBoaCi8vL/j6+vLnFxcXo7S0FD179oSDgwM+
+eQTrFmzBsOHDwfDMDp3TWu7ftrBua+vLwYPHow1a9Zg7ty5sLGxwdtvv43JkydjzJgxCAkJwbvvvguGYbB
8+XKdNjamz165cgUuLi544okn8N1332HFihVo1aoVnn766ToDSFZWFlq1agV3d3d8/
vnnkMvl6NOnD2xtbbF//37+PO177Nu3L/r164egoCAEBgbC1dUVAwcO1HmNzZs3831kzZo1mD9/
Pjw8PODj46Pz864+/Y4QUjMKIIQI4N69e2AYxuhfWNpPpadPn67z+P/
93/+BYRiduw3aT1nDwsL0vg7DMLC1tcX169d1Ho+MjATDMPj11191Hg8LC9N7vHoAUalUelM6CgoK0KpVK0
ydOpV/rLYpWNUDSEPeb0REBP/Y3bt34eTkhAULFui9VkPft7GvU9sUrJq+NykpKbCzs8M333yj8/
jVq1dhb2+v93h1zZs3x+zZs2s9p3oA2bdvn96AVa1W44UXXjAYQBiGwVdffaXzNbUDu0dVn1JWUVGBp556C
i+88ILO4/UJIDKZDHfv3tV5LjQ0FLa2toiMjNR5/Oeff9a5s5iQkABbW1u8/
vrrUKvVOuc+us6pMQGkPv2ovlOwtHfNHrVq1SowDKMTMCsqKjB48GA0a9YMRUVFAGq/ftrB+VNPPaUTtP/
973/DxsYGY8aM0Tl/8ODBOv2nsX32tddeg7OzM1JTU/nH4uPjYWdnV2dBivnz54NhGJ3v/
f3799GpUyd07NiR/z5r32PPnj11fkatXr0aDMPg6tWrALhr17JlS/
j6+uqct3HjRr27VMb2O0JI7SiAECKA9PR0MAyDd955x6jzv/32WzAMg/
j4eJ3HMzMzwTCMzgDY29sbnTp1Mvh1GIbB888/r/
f43Llz0bx5c9y9exc5OTk6R7NmzXSCQG1zotVqNfLy8pCTk4NXXnkFvr6+/HP1CSD1fb+9evXS+5pPP/
00Xn/9dYPtbMj7NvZ16goghr43crkcNjY2SEhI0GtHz549MXLkyFrfh7e3N/
r37487d+7UeE71ADJjxgw4ODigpKRE5zxtMDEUQKoPYufOnQtPT88aXzM/
Px85OTmYOXMmPDw89NpsbAD54IMP9J4bN24cnnzySb3rpVQqwTAMvv76awDclDCGYfi7cTVpTACpTz9qigD
y0ksvoXXr1nqBateuXWAYBgcPHgRQ+/XTDs5//
PFHnce14ab6tLn58+fD1tYWlZWVABrXZ1UqFVxcXPD222/rPffyyy/
XGUC6deumdwcDAL777judYFHTe4yNjQXDMPjzzz8BAGfPngXDMPj55591zquoqEDz5s11vl/
G9jtCSO0ogBAigPreAfnPf/
4DW1tbnU8qtTw8PDBx4kT+z97e3nqfNmsxDKNzV0JrzJgxBueba49x48bx5xoKINu2bUPv3r3h4OCg8/
ceHWzXJ4DU9/2OHj1a7zw/Pz8899xzBq9DQ963sa9TVwAx9L2ZOXNmre14+umna30fe/
bsgbOzM2xtbTFgwAAEBAQgKSlJ55zqAeSll17CE088ofe1Ll+
+XOMUrOoMTZ07ePAgBg0aBCcnJ533YGNjo3ctjA0g1e+8AEDPnj1rvWZz584FwK21srW1rXPhdWMCSH36UV
MEkO7du2P48OF652rvHK5duxZA7ddPOzjfvXu3zuPadUxRUVE6j2u/
17m5uQAa12e1HyR8+eWXes998skndQYQJycnvPvuu3qP//HHH2CYh9P9anqP2uuiXTOjDW7Hjx/X+5p9+/
bV+X4Z2+8IIbWjAEKIQNq2bYvOnTsbda52QK799PFRhgbkNVXNYRjG4FSdUaNGoWXLljh69KjB49KlS/
y51QNIaGgoGIZbm7Fjxw6EhYXh6NGjeOGFF3QGvA0JII15v8ZUr6nP+zb2deoKIIa+xn/+8x/
Y2Njw1676ce7cuVrfBwBkZGQgJCQE48ePh6urK5ydnXHo0CH++cYGEDc3N71zq3/fIiIiYGNjAz8/P/
zyyy84dOgQjh49ismTJ+sNKuu7CL267t27o3fv3jV+727evAmg8QGkffv2dbazPv1IiABi6PppB+fV73RoA
0h0dLTO49rvdU5ODoDG9VlzB5Dq71F7XbR9vD4BxNh+RwipHQUQQgTy4YcfgmEYnD17ts5za5qSlJWVZXBK
Un0DyKxZs2BnZ2dUSdjqA+7x48fDx8dHb9+QIUOG6Ax4c3NzGz0Fqz7v15gAUp/3bezr/P777/UOID/+
+CMYhgHLsnW2wxjZ2dlo166dzv4RjZ2CZUwAmTdvHlxcXPSqAZkigLz88sto165djfvVaBk7BcvT01Nvl/
Hy8nLY2dnV2c769KOnnnrKZFOwdu/ebXAKlikCSGP6rKmmYH3//
fcGp2DVFUBqm4Ll4eGh8/0ytt8RQmpHAYQQgSQmJsLNzQ29evXiqyRVf167QFj7yeaHH36oc86iRYvAMPqL
susbQE6ePAmGYfDZZ5/
pPVdZWalT0ab6gPuNN96Aj4+PzmAoKioKNjY2OgPe0tJSMAyjN8gDal6E3pj3a0wAqc/
7NvZ1Dh8+DIZh+PLGj6rpayQmJsLOzg6TJ0/WG9hoNBp+2oshKpUKhYWFeo8PGDAA/
fv35/9cPYBog5Kxi9CNCSCffvopXF1ddUJNcnIyXF1dmzyAbNu2DQzDYMOGDXrPlZaWori4GIDxi9D79+
+Pvn376jwfHBwMhmHqbGd9+tGgQYPQp0+fWr/eo2pbhP7bb7/
pvM7QoUMNLkI3RQBpTJ8FmmYR+qMf3hQXF8PHx8fgIvS6AkhFRQVatGhh1CJ0Y/sdIaR2FEAIEdCff/
7J18+fN28eNm3ahJCQEEyZMgWOjo46A3DtQuC33noLISEh/
J8NlaWtbwABuCkVDMNgzJgxCAoKwtq1azFv3jy0bdtW5xd49QH3li1b+HnuGzZswJIlS+Dh4YEnn3xSZ8AL
AL169ULr1q0REhKCXbt28Z9U1laGt6Hv19gNxIx938a+TmZmJuzs7PDss89i27Zt2LVrF7Kzs2v9GsDDBbR
DhgzBjz/
+iPXr12PRokXo2rWrwQGkVkFBAdzc3ODv7w+5XI6NGzfirbfeAsMwWLlyJX9e9QCiUqkwcOBAnTK8L730En
x9fXXmx2v/rjEB5Pjx42AYBsOHD8f69euxfPlytGzZssbSqo0JIGq1Gi+//
DJfNjY4OBirVq3CRx99hMcee0xnAP3ll1/y1/a///
0vgoOD8d5772HJkiX8OdoqRm+88QbWr1+Pjz76CJ06dYKXl5dRZXiN7UezZs2CjY0NVqxYgV27dhmc9lP9O
lXvM9oyvI6OjliwYAGCg4Ph5+enFyhNGUCAhvdZgJvq5+zsjCeeeALff/
89vv766xrL8FanLcPbvHlzfPnllwgKCoKvry9sbGwMluGtK4AA3B4gDMNg6NChWLNmDT755JMay/
Aa2+8IITWjAEKIwJRKJWbMmIGOHTvC0dER7u7uGDp0KIKDg3WmslRWVmL58uXo1KkTHBwc0KFDh1o35jOkt
gACcJ/49evXDy4uLnB3d0fv3r2xaNEinZ3aqw+4NRoNvv32W3h7e8PJyQl9+/bF33//
bXDju7Nnz6Jfv35wdHTUmY5V00aEjXm/9dnB2Jj3XZ/
X2bRpE3x8fPhPc6tvRFiTffv2YdiwYXBzc4Obmxt69OiB2bNn1zrNpby8HAsXLkSfPn3g7u4ONzc39OnTR2
9/DkPfj5ycHEyePJnfiPD999/HmTNn9BbuGhtAAOCXX35B165d4eTkhB49emDr1q01bi7XmAACcJ9c//
DDD3jyySfh5OQET09P9OvXD8uXL8e9e/d0zt2yZQv69u3LLxb28/
PD0aNH+efVajUWL14MLy8vuLq6YtSoUUhMTDSqnVrG9KOsrCy88sorcHd31/t03ZCa+kx2djY+
+OADeHl5wdHREb1799YZUAOmDyBAw/qs1qlTp/
ifB7VtRGiIdiNCDw8PODs7Y+DAgTVuRGhMAAGAdevWoVOnTnByckL//
v1r3IiwPv2OEGIYBRBCCCG8AwcOgGEYnD59WuimmERycjK6dOlS56J0QgghpkMBhBBCrFT1RdMqlQovvPAC
ZDKZUQuqpcrX17fOqU+EEEJMhwIIIYRYqWnTpmHy5MkIDg7Gf//
7XwwZMgQMw+Dbb78VumkmERAQgODgYLi5ufGb0BFCCDE/
CiCEEGKlfv31VzzzzDOQyWRwdHREr169EBwcLHSzTEY7v3/06NF6a4kIIYSYDwUQQgghhBBCiNlQACGEEEI
IIYSYDQUQQgghhBBCiNlQABERtVqN9PR0FBYW4t69e3TQQQcddNBBBx10iOwoLCxEeno61Gq10ENHyaIAIi
Lp6en8Jll00EEHHXTQQQcddIj3SE9PF3roKFkUQESksLCQ79BCp3s66KCDDjrooIMOOvQP7QfGhYWFQg8dJ
YsCiIjcu3cPDMPg3r17QjeFEEIIIYQYQOO1xqMAIiLUoQkhhBBCxI3Ga41HAUREqEMTQgghhIgbjdcajwKI
iFCHJoQQQggRNxqvNR4FEBGhDk0IIUSsVCoVHjx4QAcdFn+oVKpa/
y3QeK3xKICICHVoQgghYqPRaJCRkYH4+Hg66LCaIyMjAxqNxuC/
CRqvNR4FEBGhDk0IIURstOEjNzcXpaWlgn86TQcdpjxKS0uRm5vLhxBDaLzWeBRARIQ6NCGEEDFRqVR8+CD
EmmhDiKHpWDReazwKICJCHZoQQoiYPHjwAPHx8SgtLRW6KYSYVWlpKeLj4/
HgwQO952i81ngUQESEOjQhhBAx0QYQQ4MwQixZbX2fxmuNRwFERETVobOygPBw4PBh7r9ZWUK3iIidVPuMV
NsNSLvtUmVl15wCSMPl5+cjMDCwxnUERNwogJgWBZAanDp1Cq++
+iratGkDhmFw4MCBOv9OeHg4+vbtC0dHR3Tu3Blbt26t12uKokPn5QEbNgDTpwNvvAFMmMD9d/
p07vG8POHaRsRJqn1Gqu0GpN12qbLSa04BpGE0Gg3Gjh2LxYsX6zweEBCAPn36NPrrN9XXITWjAGJaFEBqc
OjQIXz++efYv3+/
UQHk1q1bcHV1xaeffor4+HgEBwfDzs4OYWFhRr+m4B06Lw9Ytgx47TVg5kyws1bh0ORQKGcFATNnco8vW2a
xv2hJA0i1z0i13YC02y5VVnzNpR5AMjMz8fHHH6NTp05wdHRE+/
bt8eqrr+LYsWMmfd0ffvgBU6ZM0Svj2pDgYGgMcv/
+fSoMYGIUQEyLAogRjAkgixYtwpNPPqnz2KRJkzBq1CijX0fwDr1hA/Daa8j7ZAVGdU4Aw4A/
RnVOQP4nX3G/aDdsEKZ9RHyk2mek2m5A2m2XKiu+5lIOIMnJyWjbti169eqF33//
HSzL4tq1a1i5ciW6d+/eoK9ZXl5er8era6oAQkyPAohpUQAxgjH/
+IcPH4558+bpPLZlyxbIZDKjX0fQDp2VxU0lmDkTozonwM5GDRvHCth73oetcznsbNQY1TmB+7Rv+nSLn/
dMjKDXZ1Swcy+FvUcx7D2K4ehZhOefvo6UWQuQ8uFcpNxMQUpusfDHzRSuPbMW4Pmnr8PRs4hvs6jbXUvbb
exVYBjQv1NTMPCzkbFVw9a53CquuZQDyJgxY9CuXTsUFxfrPVdQUAAASE1Nxbhx4+Dm5gZ3d3e8+eabyHrk
e6gNDJs2bULHjh1hY2MDAPDz88Ps2bMxb948PP7443juuef4rztt2jR4eXnB3d0dzz//
PC5duqT39bQuXLiAkSNH4vHHH4dMJsO//
vUvxMTE8M97e3uDYRj+8Pb2Nvh11Go1li9fjnbt2sHR0RF9+vTB4cOH+eeTk5PBMAz27duH5557Di4uLnj6
6adx9uzZxlxii0YBxLQogBjBmADStWtXfPvttzqP/fPPP2AYpsbyhWVlZbh37x5/
pKenC9ehw8OBN94AO2sV/8meS9dMNB/Kwql9Lv+YclYQN+/55Enzt5GIS7U+49gmH82HsnrHF/
O3Qz59BeSbjkCuYIU/Nh6BfPoKfD5/h8H2irbdtbS9Wd9knU/l6d9pEzLws9G1xx00H6KEnXupxV/
z6oMwjUaD8kq1IEdNu1IbkpeXBxsbG73fy49Sq9Xw9fXFsGHDcPHiRURFRaFfv37w8/
PjzwkICICbmxtGjx6N2NhYXL58GQAXQJo1a4aFCxfi5s2buHnzJgBg5MiRGDt2LKKjo6FUKrFgwQI8/
vjjyKuanlc9OBw/fhyhoaG4ceMG4uPjMW3aNLRq1QpFRUUAgLt374JhGGzduhWZmZm4e/
euwa8jl8shk8mwa9cu3Lx5E4sWLYKDgwOUSiWAhwGkR48e+Pvvv8GyLCZOnAhvb29UVlYafV2tCQUQ06IAY
gRTBZCAgACdTza0hyAd+vBhYMIEHJocyv9CdWqXh+ZDWbh2y+AfOzQ5FJg4kTufWLdqfca1ewaaD2Xh3j8J
zXxT+GPJjD0Info5Qjf/g9BzKcIfm/9B6AdLsWTGHp12Vj9E1+4a2q4NIdq7IPTvtInp/
WzUQDYoAc2HsnDpnGXx17z6IKy8Ui1YAC+vVBvd7vPnz4NhGOzfv7/GcxQKBezs7JCWlsY/
dv36dTAMgwsXLgDgfk87ODjwA38tPz8/9O3bV+exyMhIyGQylJWV6TzeuXNnbKianlfXFCy1Wg13d3ccPHi
Qf8zQGKT612nbti2++eYbnXMGDBiAWbNmAXgYQDZv3qz3Xm/
cuFFje6wZBRDTogBiBFNNwRL7HRB7z2Lu01XfFIv/
lI80QLU+06xvMpoPZWHvUSzuT+MN9HVDh+jaDRhsu3v/JDQfylrFp/
GCqHbNbRwr+NAnG5QIxkZj0ddcqgEkKiqqzgCyevVqdOzYUe9xDw8PbN++HQA30O/
SpYveOX5+fpg+fbrOY2vXroWtrS3c3Nx0DltbWyxatIj/
eo8Gh6ysLEyfPh1dunSBTCaDm5sbbGxsEBISwp9TVwDRDoZPVut78+fPx/PPPw/
gYQDRBiuAKxPMMAxOnTpV4zWyZhRATIsCiBGMXYT+1FNP6Tz273//
WzqL0GtYA9J8KMtNNbBV6c5zzs42fxuJuDzSZ17qooTH0JvcJ/
GOlYbnxoulzxia0/9I8BBtuwGDbXfrdRvNh7JwbF0g7rZLVbVr7uhZpDP9zemxIou+5pY8BcvYAGLojoWfn
5/eh47ff/892rVrh4SEBL0jJyfH4NcbNWoU+vfvj3/++QfXrl1DQkICvLy8EBQUxJ/
TlAEkLi6Of76goAAMwyA8PLzGa2TNKICYFgWQGty/fx9xcXGIi4sDwzCQy+WIi4
tDamoqAGDJkiV49913+fO1ZXgXLlyIGzduICQkRHpleKsqveR/
8lVVpRcNZM9yUw1G9Lxh0ZVeSANV9ZmET77FM2PPQTaI6zeM2KsD6fV1CVU1qtZ254530XwoC2efbPG3Xao
euebDB17RCSBDhsda9DWX8iL00aNH17oIvbYpWNHR0QDqF0C0Xy85ObnGNlX/
es2aNcOOHTv4P6elpYFhGJ0A4uDggN9//73Wr1PTFKzZs2cDoADSEBRATIsCSA3Cw8MNrs/w9/cHAPj7+
+ssVNP+HV9fXzg6OsLHx0d6GxFWq3WvnBWEpTP24Iv528HOXmjRte5JA1X1mRtvfQD5fDnWzP1FGvsjGOjr
kmg3oNf2wx+HYNZHexE8d7P42y5Vj1zzsDmB+GL+dgRM5342rp33X1S+9rrFXnMpB5CkpCS0bt2aL8OrVCo
RHx+P1atXo0ePHtBoNPD19cXw4cMRExOD8+fPG1yEbmwA0Wg0GDZsGPr06YMjR44gOTkZZ86cwdKlS2sMNH
379sWLL76I+Ph4REVFYfjw4XBxcdEJIF27dsXMmTORmZmJ/
Px8g18nKCgIMpkMu3fvxs2bN7F48WKDi9ApgBiPAohpUQAREVF06Gq7/
Sre+wTy6Stw5qMlFr3bL2mEvDycXrUN8jn/
xbF353ELcaWwQ3T1na2l0m5Ap+3Zb06BfMbXWD8tABoptF2qqq75r7NXQD59BZT/noZNU7+EfM5/
kRD8i8VecykHEADIyMjA7Nmz4e3tDUdHR7Rr1w7jxo3jB93GluGtzlAAAYCioiLMmTMHbdu2hYODAzp06IA
pU6bwd1mqf73Y2Fj0798fzs7O6Nq1K/bu3Qtvb2+dAPLXX3+hS5cusLe3r7UMb2BgINq1awcHB4cay/
BSADEeBRDTogAiIqLq0FlZwMmTiNl9CPJNR/
BXRLzQLSIi9kfcbcgPxCDuj+NcFaCTJ6UzF76qr0uu3QCQlYWKE+EIWv8P5JuOoDg9Q+gWWTSNRoPgP2Mh3
92jNQIAACAASURBVHQEeX8ewsm9xyA/EIt/
rljudZd6ACGkoSiAmBYFEBERY4dOzS2BXMFi6+lbQjeFiNgvkbcgV7BIyysRuilWaetp7vqn5tL1N6WCknL
IFSzWHFNCrdYgs/
AB5AoWwceV9arQJCUUQIi1ogBiWhRARESMHbq4rBJyBYugoywqVJb5C5Y0zqNlOUvLVUI3xyr9dekO5AoWM
an5QjfFoiVk34dcwSL0XAoA7o6INnzfzCwSuHWmQQGEWCsKIKZFAURExNihNRoN1p9MhFzBIvse/
QIi+rSfAm84lSh0U6zWmcQcyBUsFNez6j6ZNFhUUi7kChaHrz6ccnU6gbv2f166I2DLTIcCCLFWFEBMiwKI
iIi1Q/8vOg1yBYvrd8TVLiIOV28XQq5g8fvFdKGbYrXYrCLIFSx2nU8VuikW7Z8rGZArWFxIfrjg/
G5RGeQKFquPKfGgwvLuAFIAIdaKAohpUQAREbF26BM3siFXsIhQ3hW6KUSETrJ3IVewCL8pocXbFibnPjcI
XnsioV6btZH62XE2GXIFi6S79/
nHNBoNtlc9bokf0lAAIdaKAohpUQAREbF26MvpBZArWByIvS10U4gI7YtJh1zB4urtQqGbYrVUag1WH1NCr
mBRWFohdHMsUm3X+FzV1CxL/
BlJAYRYKwogpkUBRETE2qFvF5RCrmCxKSJJ6KYQEdp4KglyBYuMwlKhm2LVDH06T5pObi13mfKKuepYq44q
La4QAwUQYq0ogJgWBRAREWuHflCh4qsclVVa1i9X0jjUN8RDuz4hOtkyN8QTWl3rbELPpUCuYHEl3bLuBFI
AMY38/
HwEBgYiI8Ny95CROgogpkUBRETE3KE3RdCn3ESf9u7Y5kjaJ0ZoDys0ZQrdFItUV6WxC8l5kCtY7LWwYgwU
QJqeRqPB2LFjsXjxYqGbInrh4eFgGAYFBQVmf20KIKZFAURExNyh98fSPH+iT7s+6I84y5v7LjXaPSp2RqU
I3RSLVNdeK4WlFfyeSffLKs3cOtORagDx9/cHwzBgGAb29vZo2bIlRo4ciV9+
+QVqtbB7Wv3www+YMmWKyQtGBAQEoE+fPiZ9DVMrLy9HZmamIMU1KICYFgUQERFzh6ZKR8QQqpAmHtV36SZ
Ny5jd5nedT4VcwSLWgjaEbLIAkpUFhIcDhw9z/80y7Z41/v7+GD16NDIzM3H79m3ExMTgm2+
+QbNmzTBmzBhUVlpOSKyJsQGkooIKVxhCAcS0KICIiJg7NO31QAyhPWLEQ6PRIPg4V6Upv7hc6OZYlAqVGk
FHubVOxbXc3YhJzYdcwWLPhTQzts60Gh1A8vKADRuA6dOBN94AJkzg/jt9Ovd4nmnWLPn7+2P8+PF6jx8/
fhwMw2DTpk38Y6mpqRg3bhzc3Nzg7u6ON998E1mPBCTtQH7Hjh3w9vaGTCbDpEmTUFRUxJ/
j5+eHOXPmYOHChfD09ESrVq0QEBCg89oFBQWYNm0avLy84O7ujueffx6XLl3SOeePP/
5A37594eTkhE6dOiEwMJAPSxqNBgEBAejQoQMcHR3Rpk0bzJkzx+D737p1K38HSHts3boVAMAwDNatW4exY
8fC1dUVAQEBUKlUmDp1Kjp27AhnZ2d069YNq1atMnhNf/
rpJ7Ru3RqPPfYYZs2apRNgQkJC0KVLFzg5OaFly5aYMGGCzjX6+OOPMW/
ePHh4eKBly5bYuHEjiouL8f7776NZs2bo3LkzDh06xP+d6lOwUlJS8Oqrr8LDwwOurq7o1asX/vnnH/
78q1evYvTo0XBzc0PLli3xzjvvICcnh39+7969eOqpp+Ds7IzHHnsMI0aMQHFxscFrSAHEtCiAiIiYOzTtd
k2q02g0WH8yEXIFi+x70pqeYal+jeI+gU/
ILqr7ZGK07Hvcz7/1JxNrnQpS9KCCDyr3HljGp8qNCiB5ecCyZcBrrwEzZwJffgkEBHD/
nTmTe3zZMpOEkJoCCAD06dMHY8aMAQCo1Wr4+vpi2LBhuHjxIqKiotCvXz/
4+fnx5wcEBKBZs2Z44403cPXqVURERKB169ZYunQpf46fnx9kMhkCAwOhVCqxfft22NjYQKFQ8OeMHDkSY8
eORXR0NJRKJRYsWIDHH38ceVXvPyIiAjKZDNu2bUNSUhIUCgU6duyIwMBAANzgWSaT4dChQ0hNTcX58+exc
eNGg+
+xtLQUCxYswJNPPonMzExkZmaitJRbw8kwDFq2bIktW7YgKSkJqampqKiowLJlyxAdHY1bt25h586dcHV1x
Z49e3SuqUwmw0cffYQbN27g4MGDcHV15dsQHR0NOzs7/
Pbbb0hJSUFsbCxWr16tc43c3d2xYsUKKJVKrFixAnZ2dhgzZgw2btwIpVKJmTNn4vHHH0dJCXensXoAeeWV
V/Diiy/
iypUrSEpKwsGDB3Hq1CkAXMBr0aIFPvvsM9y4cQOxsbF48cUX8fzzzwMAMjIyYG9vD7lcjuTkZFy5cgUhIS
G4f99w5UAKIKZFAURExNyhyyvVfLUjSyszSRqmuKySn/
NeoRJ2TjXhhF3LhFzB4lxSrtBNsSjX79yDXMHif9F139nYU3VX8GKKZVQja1QA2bCBCxlLl3LBo/
qxdCn3/IYNTdpmoPYAMmnSJPTs2RMAoFAoYGdnh7S0h9/
b69evg2EYXLhwAQAXQFxdXXXueCxcuBCDBg3i/
+zn54dhw4bpvM6AAQP4heaRkZGQyWQoKyvTOadz587YUPX+R4wYgW+//
Vbn+dDQULRp0wYAsHLlSnTr1s3oKVM1TcFiGAbz58+v8+/Pnj1b5w6Gv78/
vL29oVI9HAO8+eabmDRpEgBg3759kMlkOtfpUdWvkUqlgpubG959913+sczMTDAMg3PnzgHQDyC9e/
fmA1l1K1aswEsvvaTzWHp6OhiGAcuyiImJAcMwSEkxbp0cBRDTogAiImLv0L9EcnOg0/
JqngNNrEdqbgnkChZbT1MFLLG4mMJVYvr7MpX2bEoRSm4N3PEbda9buJTGFWb4NcpwuV6paXAAycriplnNn
Gk4fGiPmTO585p4TUhtAeStt95Cr169AACrV69Gx44d9c7x8PDA9u3bAXADee35WnK5HJ06deL/
7Ofnh1mzZumcM27cOHzwwQcAgLVr18LW1hZubm46h62tLRYtWgQA8PLygrOzs87zzs7OYBgGJSUlSEtLQ4c
OHdC+fXtMnz4d+/fvr3UtS20BZOfOnXqPr127Fs888wy8vLzg5uYGBwcHDBgwgH/
e398fL7/8ss7fmTt3Ln+HoaioCL1794aXlxfeeecd7Ny5k7+TUdM1euKJJ/Djjz/yf9ZoNGAYBn/++ScA/
QCyadMm2NvbY8iQIVi2bBkuX77M/
92JEyfCwcFB7xozDINDhw5BpVJhxIgRcHd3x8SJE7Fx40bk59e8XosCiGlRABERsXfoP+JuQ65gEZdm/
nJ4RHy0893/unRH6KaQKsk5xZArWGw/
myx0UyzKgVjuZ98lI372lZRXYtVRbi1OQYn01+I0OICEh3NrPbTTrmo6vvySO+/
kySZtd20BpHfv3njllVcAGB9Aqg/kg4KC4O3tzf/Zz88P8+bN0zln/
Pjx8Pf3BwB8//33aNeuHRISEvQO7RoFZ2dn/PDDDwbP0VbuKi0txV9//
YU5c+agdevWGDx4cI13RGoLIAcOHNB5bNeuXXB2dkZISAhiY2ORkJCADz/
8UOfvG7qm8+bN05muVllZiaNHj2LhwoXw8fFBly5d+PBg6Bp5e3sjKCioxvYZKsOblpaG9evX4/
XXX4eDgwPWrFkDABg9ejTeeOMNg9dPu85Do9Hg9OnTWLZsGXr37o0WLVrg1i3DH6JRADEtCiAiIvYOfTqBq
4N/
LN601UuINCiuZ0GuYHEmMafuk4lZFD2o4HfkrqRpcU1Guw9Ser5xd3/3xXBly6MsYCpcgwPI4cPcgvPawof
2mDiRO78J1bUIfcuWLQBqn4IVHR0NoGkCiPZ1kpOTa2zzkCFDMHXqVKPf482bN8EwDGJiYgw+/
8033+Cpp57Se9xQAPn444/
xwgsv6Dw2YsSIegeQRxUXF8Pe3h779u0D0HQB5FFLlixB7969AQBLly5F9+7dja5wplKp0K5dO6xcudLg8x
RATIsCiIiIvUPfyLxncRVeSMNpS46yWbTgWSw0Gg1CwhMgV7C4W1RW918gdSqrVPHr3x5UGLf+TVs1cIcF3
ImS8h2Qmsrwvvrqq/w6Bo1GA19fXwwfPhwxMTE4f/
68wUXojQ0gGo0Gw4YNQ58+fXDkyBEkJyfjzJkzWLp0KR90wsLCYG9vj8DAQFy7dg3x8fHYtWsXPv/
8cwBcZavNmzfj6tWrSEpKwhdffAEXFxfk5hoOur/+
+ivc3NwQFxeHnJwcfv2JoQCyevVqyGQyhIWFgWVZfPHFF5DJZPUKIAcPHsTq1asRFxeHlJQUrFu3Dra2trh
27VqN16i+AWTevHkICwvDrVu3EBMTg0GDBuGtt94CANy5cwctWrTAxIkTceHCBSQmJiIsLAzvv/
8+VCoVoqKi8M033yA6Ohqpqan43//+B0dHR52qW4+iAGJaFEBEROwd+m5RGeQKFiHhCYJsCkTEQ6PRYO0Jb
qCbe58GumKy+wIXDG9kivPniNTcKSiFXMFi46kko//OgwoVVh/
jpmHlSPzfh9nWgGQ37R5T1TcibNGiBUaOHIktW7bobURobBneR9U3gADcGok5c+agbdu2cHBwQIcOHTBlyh
Sduy9hYWEYMmQIXFxcIJPJMHDgQL7K1IEDBzBo0CDIZDK4ubnh2WefxbFjx2q8BmVlZZgwYQI8PDz0yvBWD
yBlZWV4//330bx5c3h4eGDmzJlYsmRJvQJIZGQk/Pz84OnpCRcXFzz99NM6VbSaIoB8/
PHH6Ny5M5ycnNCiRQu8++67OgFMqVTi9ddfh4eHB1xcXNCjRw/
Mnz8fGo0G8fHxGDVqFFq0aAEnJyd069YNwcHBNV4/
CiCmRQFERMTeoStVan5uc5GFlJgkDaPd9Xn1MSVUtOmdqBytmhp3OoGmxjWFK+nc3Yx9MfXbA0m7Zk7qUxS
lWgWLkMaiAGJaFEBERAodevvZZMgVLJJzDG/
cQ6xD0t373BSTc8aVMyTmE1tVHOCPuNtCN8UinLiZDbmCxUn2br3+XnzGPb5KnJTvGEt1HxBCGosCiGlRAB
ERKXTovy9nWFSNe9Iw0clcuddDV6jcq9ik5XHlkbdQeeQm8ftFbkH51duF9fp7ZZUqrKmahiXljTqbfCf0i
RPNshM6IY1FAcS0KICIiBQ69LmkXMgVLI5cyxS6KURAh69yG96dv0WDB7EpKX+4QWR5JVXCaqwNpxIhV7DI
LKz/APzg5TuQK1hEKOt390RMGh1AtLKyuIXmhw9z/
23iNR+ENDUKIKZFAUREpNChE7KLIFew+O28ZWyyRRpmZ1QK5AoWiXfvC90UYsDPJ7lBc5aEP3kXA22Ykysa
FuaUWdzPy00RSZKdhtVkAYQQiaEAYloUQERECh06r7gccgWL4ONKyf5CJY2jVmv4qSWFJVSMQIz2Vk0buna
nftOGiC7tdLZfIhs2na1Cpearxd0pKG3i1pkHBRBirSiAmBYFEBGRQoemwSfJpxAqetqF06fquXCa6IpLK2
j0gv7DV7l1cyduSnPKEQUQYq0ogJgWBRARkUqHDj1H02+smXYa3q9RNA1PrLSlY/
fH1q90LNF1LL7xJY21FeM2nkqCWoIlqymAEGtFAcS0KICIiFQ6tPYTPVqAbJ20hQjCqBCBaGk3z9sUYfzme
UTfngtpjd7UUaV+uDt9Wl5JE7bOPCiAEGtFAcS0KICIiFQ69AUqwWrVqBSz+D2oUPGLpx9UqIRujiRpNA+D
w92ixu1mfuQaVzXuWHxW3SeLDAUQ08jPz0dgYCAyMsT1e3Tr1q04dOiQoG1ITk7GihUrcP+
+sLMsKICYFgUQEZFKh6ZN6KwbbUYpDZsikiBXsLgt0cXPQit6UAG5gsWqo0pUqhpXzjgltxhyBYv1JxOhkt
g0LAogTU+j0WDs2LFYvHix2V87ICAAffr0Mfjc77//jp49eyI/P9/
k7WAYBgcOHNB7vKysDP3798f69etN3oa6UAAxLQogIiKVDl1Yyv1iXn1MKblfpqRxKlVqrDrKFSEoekBFCM
TsQOxtyBUsLqcXCN0USUrO4ULDtjPJjf5aarWGL40steAu1QDi7+8PhmHAMAzs7e3RsmVLjBw5Er/
88gvUamH3x/
nhhx8wZcoUQYp41BRAEhIS0KNHD6SkmOeDxZoCyMyZM7F06VKztKEuFEBMiwKIiEilQ2s0Gr60ZO79xk1NI
NJyt6gMcgWLkPAEqoAlchHKu1z1pRvSrL4ktIsp3FTTg5fvNMnXO34jS5Jrp6QcQEaPHo3MzEzcvn0bMTEx
+Oabb9CsWTOMGTMGlZWVQjdRELXdATGnmgKImFAAMS0KICIipQ6963wq5AoWbFaR0E0hZnQj8x7kChZ7LqQ
J3RRSh+t3uO/V/6Lpe9UQYVXrNs4m5jbJ10vPL+HDe2OndJmTlAPI+PHj9R4/
fvw4GIbBpk2b+MdSU1Mxbtw4uLm5wd3dHW+++Saysh6u19EO2nfs2AFvb2/IZDJMmjQJRUUPf//
5+flhzpw5WLhwITw9PdGqVSsEBATovHZBQQGmTZsGLy8vuLu74/nnn8elS5d0zvnjjz/
Qt29fODk5oVOnTggMDOTDkkajQUBAADp06ABHR0e0adMGc+bMqfU6fPfdd2jZsiWaNWuGqVOnYvHixXoBZN
OmTejRowecnJzQvXt3hISE6Dyfnp6Ot99+G56ennB1dUW/
fv0QFRXFP79u3Tr4+PjAwcEB3bp1w44dO3T+vlKpxPDhw+Hk5ISePXtCoVDoBZC0tDS8+eabaN68OTw9PTF
u3DgkJycb3c7y8nLMnj0brVu3hpOTE5544gl8+
+23tV6bulAAMS0KICIipQ6tuM59mncmseHlKYn0nE7IkexiWmuTde8Bv+6A7lbV369R3Icsyib6kEWj0WDj
qSTJlTBvygDCssChQ4BS2QQNq0NNAQQA+vTpgzFjxgAA1Go1fH19MWzYMFy8eBFRUVHo168f/
Pz8+PMDAgLQrFkzvPHGG7h69SoiIiLQunVrnalCfn5+kMlkCAwMhFKpxPbt22FjYwOFQsGfM3LkSIwdOxbR
0dFQKpVYsGABHn/8ceTlcQU9IiIiIJPJsG3bNiQlJUGhUKBjx44IDAwEAOzduxcymQyHDh1Camoqzp8/
j40bN9Z4Dfbs2QMnJyds3rwZN2/exOeffw53d3edALJz5060adMG+/btw61bt7Bv3z489thj2LZtGwDg/
v378PHxwfDhwxEZGYmEhATs2bMHZ8+eBQDs378fDg4OCAkJAcuyWLlyJezs7HDixAn+
+j711FMYMWIELl26hFOnTqFv3746AaSiogI9e/bE1KlTceXKFcTHx2Py5Mno3r07ysvLjWrnTz/
9hA4dOiAiIgIpKSmIjIzEb7/9Vlc3qRUFENOiACIiUurQMan5kCtY/
HWpaaYnEGn4I45bVxCXRusKxK5CpUbQUa4SVnGZdU43aSiNRoPg49xap7zi8ib7uifZu5KrINgUASQvDxg1
CmCYh8eoUYAp1zrXFkAmTZqEnj17AgAUCgXs7OyQlvbwTuH169fBMAwuXLgAgAsgrq6uOnc8Fi5ciEGDBvF
/
9vPzw7Bhw3ReZ8CAAfxC88jISMhkMpSV6U5b7ty5MzZs2AAAGDFihN6n9qGhoWjTpg0AYOXKlejWrRsqKox
bfzd48GDMmjVL57FBgwbpBJDOnTvrDdRXrFiBwYMHAwA2bNgAd3d3PiRVN2TIEMyYMUPnsTfffBMvv/
wyAODIkSOwt7fHnTsPxwqHDx/WCSChoaHo3r27zgcl5eXlcHFxwZEjR4xq55w5c/
DCCy806YctFEBMiwKIiEipQ6fmctMJtp6+JXRTiBn9EnlLsvsZWKMtp7nvV2oufb/
qo7CEK7Sx5piySTcPzCjk9mdZeyIBFRKZhtUUAWTUKMDOTjeA2Nlxj5tKbQHkrbfeQq9evQAAq1evRseOHf
XO8fDwwPbt2wFwAUR7vpZcLkenTp34P/
v5+ekN9seNG4cPPvgAALB27VrY2trCzc1N57C1tcWiRYsAAF5eXnB2dtZ53tnZGQzDoKSkBGlpaejQoQPat
2+P6dOnY//+/bWuZXn0PWjNnz+fDyDFxcVgGAYuLi46r+nk5ISWLVsC4BaF/+tf/
6rxNTw9Pfm7EFqrVq3ir82j/
69VWFioE0D+7//+D3Z2dnrXxsbGBuvWrTOqnTExMXjsscfQtWtXzJkzhw8ujUEBxLQogIiIlDp0cVkl5AoW
QUdZSc1nJg1XXvnwE/
WScvpEXQr+vHQHcgWL2FTTl9W0JIlVpcZDm7jUuEajweaqEC+V9XONDSAsqxs8qh+mmo5VWwDp3bs3XnnlF
QDGB5Dq6yaCgoLg7e3N/9nPzw/z5s3TOWf8+PHw9/cHAHz//
fdo164dEhIS9I6cHG4qs7OzM3744QeD52grd5WWluKvv/
7CnDlz0Lp1awwePLjGOyJ1BZCsrCwwDIOdO3fqvd6tW9yHi59+
+qnJA8hHH32EgQMHGnzfhYWFRrUT4MZQu3fvxvTp09G8eXNMmDChxnYbgwKIaVEAEREpdWiNRoP1VWUls4u
ktTiRNIx2TcGGU4lCN4UY6UzVmp2j12nNTn2cv8VVwDp8temnSkUqcyQ1fbWxAeTQodoDiKn2vKtrEfqWLV
sA1D4FKzo6GkDTBBDt61RfWP2oIUOGYOrUqUa/
x5s3b4JhGMTExBh83tAUrGeffVbnvbRt2xZfffVVja+xbds2yGSyek/
B0gY87RSsRzdcDAsL0wkgGzduhKenZ61jn7raWZ32NWpqtzEogJgWBRARkVqH3hOdBrmCRXyGNNpLG
ufanULIFSx+v5gudFOIkW5mFkGuYLH7QqrQTZGUQ1cyIFewuJDc8MFLTbKLHvDTu8oqxb9LvZTvgNRUhvfV
V1+FSsVde41GA19fXwwfPhwxMTE4f/
68wUXojQ0gGo0Gw4YNQ58+fXDkyBEkJyfjzJkzWLp0KR90wsLCYG9vj8DAQFy7dg3x8fHYtWsXPv/
8cwDcLuWbN2/G1atXkZSUhC++
+AIuLi7IzTVcqW337t1wdnbGli1bwLIsli1bprcIfdOmTXBxccHq1avBsiyuXLmCLVu2YOXKlQC4tRjdunX
D8OHDcfr0aSQlJeH333/
nF6EfOHAADg4OWLduHZRKJb8IPTw8HAC3CL1Xr1548cUXcenSJURERKBfv346AaSkpARdu3bFc889h4iICN
y6dQvh4eGYM2cO0tPTjWrnypUr8dtvv+HGjRtgWRbTpk1D69atG7XnCwUQ06IAIiJS69DauvaRSqqEZQ1OV
S2gPXGT9pWQipz7ZfyaA6qEZbwd51IgV7BIMkG1Ko1Gg21nkiFXsLh+R/w/
66W8BuTRjQhbtGiBkSNHYsuWLXqDUmPL8D6qvgEEAIqKijBnzhy0bdsWDg4O6NChA6ZMmaJz9yUsLAxDhgy
Bi4sLZDIZBg4cyFe6OnDgAAYNGgSZTAY3Nzc8++yzOHbsWK3X4ZtvvoGXlxeaNWsGf39/LFq0SO+9/
Prrr/D19YWjoyM8PT3xr3/9C/v37+efT0lJwYQJEyCTyeDq6or+/fvj/Pnz/
PN1leFlWRbDhg2Do6MjunXrpncHBAAyMzPx3nvvwcvLC05OTvDx8cGMGTN0xkO1tXPjxo3w9fWFm5sbZDIZ
RowYgdjY2FqvTV0ogJgWBRARkVqHvpRWALmCxR9xt4VuCjGD/
bHpkCtYXEkvFLopxEgqtYbfuf4e7VxvFJVag9XHuGtWWGqaa3Y2MVcyPzubIoDk55u/
ChYhjUUBxLQogIiI1Dq0dmOtzZFUCcsabIrg9jC4U1AqdFNIPew4y33afiunWOimSEKuGe4aaV9j1VElHlS
IexpWU+4DolSabx8QQhqLAohpUQAREal16AcVKsgVXFUkKcxlJg1H32vp+qdqPUO0CdYzWCI2i1s3s+u8ad
fNaKd5Xb0t7juKUt0JnZDGogBiWhRARESKHVq7s29GIX0qbsluF3D7F2yKSBK6KaSeopJyqyo6ZQrdFEk4k
8hVqVKYuHKYttKW2Is6UAAh1ooCiGlRABERKXbofTHpkvgUjzTO5XRuvc+BWPHPWSe6ErK5PS12RjXtnhaW
6q+qvVMupph2gYJ2s8Ogo+LeqZ4CCLFWFEBMiwKIiEixQ5+sqowUTpWRLNqJG9mQK1hEKO8K3RRSTwUl5Sb
Z1dtSba3aPT4l1/RrZn47nwq5gkVcWoHJX6uhKIAQa0UBxLQogIiIFDv01du0N4Q1+F/
Vni9SKBtKdKnVGgQf56o65ReXC90cUatQqRF0lFvrdN8MdyUupuRDrmCx50Ja3ScLRDsIKy2labbEupSWll
IAMSEKICIixQ6dWUi7Y1s6nV3v79GnoFK0M4pb8JyQXSR0U0Qt+x7382xdeKJZ9k0pelDBF3coEmmZZJVKh
fj4+Bo3uyPEUuXm5iI+Pp7ftPJRUhyviQ0FEBGRYocur1Tzv0BLy6k6kiUqLqvk56pXqBq+qywRzuGrmZAr
WJxLokFkba7fucfdkYg23x2JPVV3F0295qQxMjIy+BBSWlqKBw8e0EGHxR6lpaV8+MjIyDD4b0KK4zWxoQA
iIlLt0L9EcnOm0/JKhG4KMYHUXG6/l62nab8XqYpO5iou/X3Z8C9TwolUchWwjt8wbQWsR8VVbej6m4nL/
jaGRqPhQwgddFjLkZGRUeOdUKmO18SEAoiISLVD/xF3W/QLKUnDxaZy89T/
unRH6KaQBrqVUwy5gsWOs8lCN0XUtD/LLpnxZ1lxxOcwCAAAIABJREFUWSW/
7qSgRNxrdFQqleCfTtNBhzkOQ9OuHiXV8ZqYUAAREal26NMJ5v/
UkJjP0etZkCtYnEnMEboppIHuVa01WHVUCRVVwqrR5qq7uen55r2b+/
tFrpz5+Vu0WSQhUiDV8ZqYUAAREal26BuZ5p83Tcxn9wWuVCibRQuYpUqj0WDtiQTIFSxy7pcJ3RxRKqtUC
baeTVtNcMc52quFECmQ6nhNTCiAiIhUO3R2kXkrxxDzoYGr5dAGyZuZFCQNySgshVzBYuOpJLO/
9oMKFVYd5Uol59K/
M0JET6rjNTGhACIiUu3QlSo1/8vTHLXziflop+6sPkZTd6SOn0qXQFPpDNHehdgXI8yeRtr1J2cTqVIZIWI
n1fGamFAAEREpd+htZ5LNtnswMR9avGw5tMUE/
qRiAgaF38yGXMHiJHtXkNePz+Cmsm47k0x3kgkROSmP18SCAkgt1q5dC29vbzg5OWHgwIE4f/
58jedu3boVDMPoHE5OTvV6PSl36IOX74i+lj2pP2351n+uUPlWqUvL48opb6FyygZpF4JfvV0oyOuXVaqw5
hh3Jzm7iDb8JETMpDxeEwsKIDXYvXs3HB0dsWXLFly/fh0zZsyAh4cHsrOzDZ6/
detWyGQyZGZm8kdWVv2qQkm5Q59NzIVcweLItUyhm0KakHYDuyjawE7ySsppQ8nabDiVCLmCRWahcIP/
vy5xH+REKmmaHCFiJuXxmlhQAKnBwIEDMXv2bP7ParUabdu2xXfffWfw/
K1bt6J58+aNek0pd2hlVpHoN9Mi9bczKgVyBYuE7PtCN4U0gZ9PcoPsrHv0CfujSssfVsAqrxQunLFVP0c3
R96iaViEiJiUx2tiQQHEgPLyctjZ2eHAgQM6j7/33nsYN26cwb+zdetW2NnZ4YknnkD79u0xbtw4XLt2rV6
vK+UOnVdcDrmCxdoTCfSL00Ko1Rp+SojYN0gjxtlbNc3o2h1hphmJlXZ62uZIYaenVajUfNW5jMJSQdtCCK
mZlMdrYkEBxIA7d+6AYRicPXtW5/GFCxdi4MCBBv/
O2bNnsX37dsTFxeHkyZN49dVXIZPJkJ5ec0WVsrIy3Lt3jz/
S09Ml26HVag1WVw1WC0sqhG4OaQL5VaEy+LiSQqWFOFG10PqUQAutxSourQByBYs/
4m4L3RQcupIBuYJF+E3D030JIcKjANJ4FEAMaEgAqa6iogKdO3fGF198UeM5AQEBegvXpdyhQ89x03US79J
0HUuQkM1NB/
k1iqbVWYor6Vyp2f2xwpSaFatj8VmiWXuRePc+vx8JBX9CxIkCSONRADGgIVOwDJk4cSLefvvtGp+3pDsgA
HD4KvfJ3flbeUI3hTSBc0lcYYEwKixgMW4XcJvtbYow/2Z7YrbnQhrkChbxGcL/
7K1UqRESzk3DSs8vEbo5hBADKIA0HgWQGgwcOBAff/wx/
2e1Wo127drVuAi9OpVKhe7du+OTTz4x+jWl3qEvVJVsPUQlWy3C35czqkorU6C0FA8qHi62flChEro5oqDR
aLAuPFFU5W/DrnHV547fqF8lRUKIeUh9vCYGFEBqsHv3bjg5OWHbtm2Ij4/
Hhx9+CA8PD7607rvvvoslS5bw5y9fvhxHjhxBUlISYmJi8Pbbb8PZ2RnXr183+jWl3qGTqqYO7DiXInRTSB
PYfpbbXDI5hzaXtCSbIpIgV7C4XUCLnAHgfhlXnnjVUSUqRVKeOLlqA9CfTyZCraZpWISIjdTHa2JAAaQWw
cHBeOKJJ+Do6IiBAwciKiqKf87Pzw/+/
v78n+fPn8+f26pVK7z88suIjY2t1+tJvUMXllZArmCx+piSfmlKnEqtwaqjXFGBogdUVMCS7I/
lKmFdSadKWACQklvM70AuFiq1BuurSian5NIHAISIjdTHa2JAAUREpN6hNRoNX0Iyr5jKtkpZzv0yyBUsQs
KprLKlOcXehVzB4gRVWQIAXEzJh1zB4uDlO0I3RYd2YTxt7kqI+Eh9vCYGFEBExBI69G/
nUyFXsFBmFQndFNIINzO5Cli7L1AFLEtz7Q5XCWvvRaqEBQBHqtZbnE3MFbopOrR7k4SEJ0BFd5QJERVLGK
8JjQKIiFhChxbrL3NSP2cSciBXsDh6nRbBWpqsew/
49QVEvB+aqNUabDzFrddJotLmhIiKJYzXhEYBREQsoUOLdToDqZ8/
L92BXMEiNjVf6KaQJlahUiPoKFcJq6S8UujmCEqj0SD4uFK000bDqzaOPHyVKgsSIiaWMF4TGgUQEbGEDi3
GBZ2k/
racvgW5gkVaHu1DYIno+8spLBF34Yw7Vfu2rD2RgAqRVOgihFjGeE1oFEBExBI6tLakZdBRVjQlLUn90Cfk
lo/
ucHG0u46HirR0uEajwebIW6KcIkaINbOE8ZrQKICIiCV0aDFu6kXqh9YIWD5a48M5fytP9FOcIpR3aVorIS
JjCeM1oVEAERFL6dB7otMgV7CIz5D2+7BWVCXJ8lGVM86hKxmQK1icv5UndFNqlF31gcCaY0qUVdLu9YSIg
aWM14REAURELKVDH7/B1a+PVOYI3RTSALRPhOXT7vOy9oR17/
Oy41wK5AoWiSKuMqXRaLC1as0OfahDiDhYynhNSBRARMRSOvSltALIFSz+iLstdFNIA9BO2Zbv0Z3u71npT
vcqtQarj3HXoLBE3NfgTGIO/
UwlREQsZbwmJAogImIpHTo9n9tAa3PkLaGbQhpgUwS398CdglKhm0JMaPvZZMgVLG7lFAvdFEHkSugukLat
q48p8aCCpmERIjRLGa8JiQKIiFhKhy4tV0Gu4Koo0ZxlaXlQ8fB7RwMdy/b3ZW79Q3SyeNc/
mJIyi1sH89t5aayD2VEVGK/epjuThAjNUsZrQqIAIiKW1KG1O/
hmFNKn6FJyu2rfgU0RSUI3hZjYuaTcqgpQmUI3RRBnE7n3f+SaNN5/
VNX3a18MFYcgRGiWNF4TCgUQEbGkDr0vJp0+rZOgy+nc+p0DsTTX3NIlZHN3AH6NksYdgKZ28DK3F8rFFGn
shVJQUg65gsWqo0ran4cQgVnSeE0oFEBExJI69MmqSkon2btCN4XUw4mb2ZArWEQo6ftm6fKLuQFt8HFx7g
JuatvOcFOaUnKlswbm16hUyBUsLqUVCN0UQqyaJY3XhEIBREQsqUNfvV1I0wUkaO9F7s7VtTt058rSqdUar
KmqAlVQUi50c8yqUqVG0FFurdP9MuncTbiYwm2cuCc6TeimEGLVLGm8JhQKICJiSR06o5BbS7DxFK0lkJKf
T3K72Gfdo13srcHOKG4fjIRs8e6DYQrZRdzmfuvCE0VfAetR9x5UQK5gEXSURZGVlk8mRAwsabwmFAogImJ
JHbqs8mE1pdJyqqYkBSXllfzgpkKlFro5xAwOX82EXMEiKilX6KaYVXzGPcneSdhzIQ1yBYuYVGmsXSHEEl
nSeE0oFEBExNI69OZIbvfe9PwSoZtCjJCWx+3fsuU07d9iLaKTuSk9/1zJELopZhWp5Db2O34jS+im1Ftsa
j7kCha7JFI+mBBLZGnjNSFQABERS+vQf8TdpgWTEqId2Px56Y7QTSFmciunGHIFix1nk4VuillJ+WdTcVkl
v35F7Du4E2KpLG28JgQKICJiaR1ayp8yWqOj17MgV7A4k5AjdFOImWjXFKw6qoTKiiphSf3urLZYxAUr3US
SEKFZ2nhNCBRARMTSOrSU51lbo90XuBKfNzOLhG4KMRONRoO1JxIgV7DIuV8mdHPMwhLWp11J56oMhp5LEb
ophFglSxuvCYECiIhYWoeWaqUZa2SNA1HCsbbgqa3Qt+FUotBNabDSchVWHeVKKOcVW1cJZULEwNLGa0KgA
CIiltahpVpr3xpZ61QcYn1T77R7FP1+Udp7FB2I5daxnE20rgpmhIiBpY3XhEABREQssUNLcbdha2Sti5GJ
9RUfCL+ZDbmCRfjNbKGb0ijX73BTXLedSaY7zISYmSWO18yNAoiIWGKHPnj5DuQKFhdTqGa9mFlrOVYCpOZ
aV/
nlfTHcAu6rtwuFbkqjPKhQ8TvZ3y2iaZOEmJMljtfMjQKIiFhihz6bmAu5gsWRa5lCN4XUwlo3pCNcWVdr2
oBy46kkyBUsMgpLhW5Ko/
15ifuA57SVTJ8jRCwscbxmbhRARMQSO7QyqwhyBYvfaNMsUdsZlQK5gkVC9n2hm0LMTKPRYP3JRMgVLLLuP
RC6OSZVWv6wAlZZpTQrYD3qZib38/WXyFs0DYsQM7LE8Zq5UQAREUvs0HnF5ZArWKw9kUC/
IEVKrdYg+Dg3laOghCrqWKP/RadBrmBx/Y7l/
OwxJD2fm262OdIyppuVV6r5f7uZhZYdHgkRE0scr5kbBRARscQOrVZrsLpqnnJhKe3aK0YFJVxIDD6uhJoq
YFmlEze4hdkRyrtCN8WkLqUVQK5g8UfcbaGb0mT+uZIBuYLFSdayv3eEiIkljtfMjQKIiFhqh95xjpvek3S
XpveIUUL2fcgVLHZG0aZm1upyOjcwPxBrOQNzQ47f4EoORyotZ82E9t/
vpogkustMiJlY6njNnCiAiIilduhDVZ/QXUjOE7opxICoJK5QwOGrVCjAWt0uKOUHsZZsT9VUs/gMy/
kZW6lS85uI3i6Q/
sJ6QqTAUsdr5kQBREQstUOfv5VXNcClEq9ipJ3CEU0B0Wo9qHi4OPtBhfQXZxui0WiwLpxbbJ9dZFnrJcKu
cVXsTtyQ9t4mhEiFpY7XzIkCiIhYaodOvMtNEQg9R1N8xGjHWW6zyFs5tFmkNdsUwZWnvWOhn6Lff6TccKW
FlRvWbiT688lEWsdFiBlY6njNnCiAiIildujCkgrIFSxWH6NFzmLz/+3deXBc1ZU/
8DbGFouxDdiELXYI20zhhOT3YxwYpnBNOQVMoCBhEiiTGTwwmLAkgUzCYIaAfxOGpRLmesXELDaYxRvYZvH
2JGuxJVuyZGuzJF/t+760drWk7u/vjye13dau19339nvfT9WrGVot9dHLQZzTfe+5/
V4fVkWbQwJauzkkwMl2njAP6MuqiOwD+kZS2tjhPzncbvq9pz/
dKWvsVB0Oke3ZtV4LJzYgGrFrQvt8Pv8a5aYOjnnVSUN7D8ckEwAgQdaby3hO2XMZT1ppM4Qh8XVmlepQQi
I6x9xgb+TUqg6FyPbsWq+FExsQjdg5oT9LKYMwJPJr21SHQmcYPMhs6zEeFOl0J6vcEIbEjrQK1aGExIGBf
RJHChtVhxIS5U3mGSfr4wrRz0+aiULKzvVauLAB0YidE9ru//GPVEkFDRCGRDTfNXW82tZu/
z4COxp8E0Ta9E0Qr9eHDQmFHHlOFAZ2rtfChQ2IRuyc0HZf/
hCpvsyogjAkTpQ1qw6FFPP0ebEy2pyE1enpUx1OUJ25DLSxvUd1OCETe6qOI7WJwsDO9Vq4sAHRiJ0T2s4b
QCPZxsRiCEOivIkbV8m+
+XDmIAw7L0+qGjjPZV1sAXptNumLSCd2rtfChQ2IRuyc0IMjMFdF59tuBGak6u237zveNDm70ytt+YlY0cA
o8M02HwXu8/n845QL6uy51IxIB3au18KFDYhG7JzQdj4ELFLZfc0/TVyiTfcEHSsxD0Pdm2X/
w1AHp5l9k2n/35VIFTvXa+HCBkQjdk/obanlEIZEbrU9f79IY/
epRzRxeTWttpyKti+7GsKQSCluUh1KyA2+sbD2YD48ffy0mSgU7F6vhQMbEI3YPaFjcs059YkFDapDIQCH8
u197gNNXH2beS7M23H2Ohfm46OlEIZEoQOmQ/l8Pv9enrwae/
63hEg1u9dr4cAGRCN2T+j08hYIQ2J3eqXqUAjArhPmev/
MihbVoZAm+r0+rIrOhzAk2rp7VYcTFF6vD6tjzN/
J3WmP32ksg+O1+beWKDTsXq+FAxsQjdg9oQcPyvrgcLHqUAjwb1atbOlSHQpp5KMjJRCGRElDh+pQgqKpw+
NfkmSnT3VG09De45/61d3brzocItuxe70WDmxANGL3hO7y9EMY5tQlrk1Wq7v39P8WLFDoTN9kmvsl0krts
V8iv7YNwpD4LMVe+1rGsnmgkTxZ5VYdCpHt2L1eCwc2IBpxQkIPntRb4+YkLJUGzwt471CR6lBIM0eLGiEM
if0n7XGY3ZFC8/c5YJPfZ7wG/
3fceYJDJoiCzQn1WqixAdGIExL687QKCEMiu5LvyqmUVeFmcULDKqgzPzH4NNkenxh8nVk18ImOvc42GUvz
wNKzVdH5POeHKMicUK+FGhsQjTghoeNO1UEYEvGyXnUojhY78L9DAv93oLM022zPxIdJ5lKk0kZ77GmZiE+
SSzlogigEnFCvhRobEI04IaGzK8133r84znfeVdox8EkU14fT2bxeH9YMTI1q6fSoDseSvn6vf6pXe4/
zPgVIHTiAcXtquepQiGzFCfVaqLEB0YgTErrabe49eDeBew9U+mu8uRentpV7cWiowXfOC+oi+9yMujbzUL
71cYW2+DRnotxdvRCGxMpoZzZgRKHihHot1NiAaMQJCd3Tx+lLqnV6+vxFCaeR0XD2ZddAGBLJRY2qQ7Ekt
9o82X3bMed+ArD1WBmEIXGizFl7YIhCyQn1WqixAdGIUxL6/
cPmKb0VzZ2qQ3GkwfNYNibyPBYa3uDSnT1Z1apDseRwvnkgX0xurepQlDlR1gxhSGw9Zo+hAkQ6cEq9Fkps
QDTilITenW6ewJ1Rzo2RKgwWJF9mVKkOhTRVVN8OYUhsPlKiOhRLBv/
WpDv4b017Tx9WRpufOru7nHESPFGoOaVeCyU2IBpxSkIPvit5MM+570qqFJ1TC2FIJBU0qA6FNDW4d2BVdD
76vZG7d+KDgU9by5uc/
Wnr9tRyCEMitcQeh0sSqeaUei2U2IBoxCkJ7V+XzcksSgyuCT9V06Y6FNKUz+fDutgCCEOiob1HdTiT4unz
+vebdXmcvd8ss6IFwpD4JLlUdShEtuCUei2U2IBoxCkJPTiZ5p14Z06mUcnn8+HtuMguLCk8tqSYjaqsjcx
GtcZt/p3ZkFCoOhTlujz9/
nHEzR2RPVqZSAdOqddCiQ2IRpyS0H39Xv+a5A6Ohgyrtm57LK2h0DMGl+oVRuZSvcEzhz5P45lDALDzhHn2
z9EIn2xGpAOn1GuhxAZkFOvWrcP8+fMRFRWFhQsXIiUlZdTnb9+
+HTfeeCOioqKwYMEC7NmzZ0Kv56SE3pRors0ua3T22uxwK2nogDAkPorwzcUUescHhhV8FaHDCuJlPYQhEX
eqTnUoWjhZ5bbFYAEiHTipXgsVNiAj2Lp1K6ZPn46NGzciJycHy5Ytw+zZs1FXN/x/zJKSkjB16lT8+c9/
Rm5uLv74xz9i2rRpyM7OHvdrOimhv8qogjAkjnM2fVillZrjVb/
JjOzxqhR6ZY3muOZNETqu+Yvj5jv+2ZVu1aFoobu3H6sHTrjn8ksia5xUr4UKG5ARLFy4EM8884z/
n71eL6688kq88cYbwz7/wQcfxD333BPw2I9+9CP86le/GvdrapXQPh/
g6QjZdTSvDGv2ZSAmszikr8Mr8IrOKMKafRlIOVWuPBZeel8dbW6s2ZeBtfsz0NvVpjyeiV4bY09izb4M1D
Q0KI9Fl+vr1Hx8FJ+D0obIPuGeSDWt6rUIxQZkGB6PB1OnTsWuXbsCHn/
kkUdw3333Dfs93/72t7Fy5cqAx1555RV8//vfH/
F1enp60Nra6r8qKir0SWhPB7BiJi9evHjxstvl6VD9XxiiiMYGxDo2IMOoqqqCy+XCkSNHAh5//
vnnsXDhwmG/
Z9q0afjss88CHnv77bdx2WWXjfg6K1asgMvlGnJpkdBsQHjx4sXLnhcbECJL2IBYxwZkGOFqQLT+BCTES7D
6u9vx9oFMrNmXAbe7RfnSBCdcLS3NWLMvA+sPZMLb3a48Hl76X/
HZJVizLwOJuaXKY5nIlVVUhTX7MvB1ar7yWLS8OP6cyBI2INaxARlGuJZgnc1pCb35aCmEIVFUz/
XI4VBQ187DyGhCBg+w23Wi
UnUoE3IwzxwhfDg/MkcIE5HenFavhQIbkBEsXLgQv/71r/
3/7PV6cdVVV426Cf3ee+8NeOy2226L3E3oYbA3qxrCkDhW0qQ6FEdILmqEMCT2ZdeoDoUiRGVLF4Qh8d6hI
tWhTMi21HIIQyK32hl/S4kovJxWr4UCG5ARbN26FVFRUfjwww+Rm5uLJ554ArNnz0ZtbS0A4F//
9V+xfPly//
OTkpJw7rnn4q233kJeXh5WrFjBMbxjSCluGiiIORI2HPYMNHypbPhonLp7+yEM89DQnr5+1eGMi8/nw/
q4QghDoq61W3U4RGRDTqvXQoENyCjWrl2LefPmYfr06Vi4cCGSk5P9X1u0aBGWLl0a8Pzt27fjhhtuwPTp0
3HTTTfxIMIxFNabS4I+PsolQeGw+UgJhCFR3NChOhSKIO8dKoIwJKpaulSHMi4dPX0QhsTKaInefq/
qcIjIhpxWr4UCGxCNOC2h3Z29EIbEmph8eL3cFBlK/
V4fVkWbh5C1dveqDociyOCBflkVkXGgX6QfoEhE+nNavRYKbEA04rSE9vl8WHvQLIqbOjyqw7G1hvYeCENi
XWwBfJyAQxMQL+shDInYU3WqQxmX42XNEIbEVxlVqkMhIptyWr0WCmxANOLEhP4spQzCkMivbVMdiq2dqmm
DMCS2HitTHQpFmOxKN4QhsSOtQnUo42LkmBOwkgo5AYuIQsOJ9VqwsQHRiBMTev/
JGghD4mhRo+pQbC2psAHCkDByalWHQhGmxt0NYUhsSChUHcq4bBl4U0PyTQ0iChEn1mvBxgZEI05M6LRScx
LWN5mchBVKX2VUQRgSx8uaVYdCEcbT5/VPwur09KkOZ1Q+nw/
rYgsgDInG9h7V4RCRTTmxXgs2NiAacWJClzR0QBgSHx0pUR2KrW1KLIYwJMoaO1WHQhHog8Nm/
pQ36Z0/7i5zsMXqmHz0c7AFEYWIE+u1YGMDohEnJnRbt1kwrIrORx9HZoZEb78XK6PNd7A7evR+B5v0tDu9
EsKQSC9vUR3KqIoGRntv5mhvIgohJ9ZrwcYGRCNOTGifz4e348wlE/
VtXDIRCnWt5hr+d+ILOQGLJiWxwNxDFJOr9x6iYyXmks69WVzSSUSh48R6LdjYgGjEqQm97Vg5hCGRV+Os3
ztccqpaIQyJ7anlqkOhCJVXY+bQtmN659C+7GoIQyKluEl1KERkY06t14KJDYhGnJrQMbnm2MzEAo7NDIVD
+QPnOORFxjkOpJ/
6NvMcmbfj9D5H5uOjpRCGRGF9u+pQiMjGnFqvBRMbEI04NaHTy1sgDInd6ZWqQ7GlXSfM9fuZFXqv3yd99f
V7sSraPDS0rbtXdTjD8np9WBNjxuju1DNGIrIHp9ZrwcQGRCNOTejypk4IQ+KDw8WqQ7Gl9w4VQRgSlS1dq
kOhCPbRkRIIQ6KkoUN1KMNq6vBAGBJrD+Zr/SkNEUU+p9ZrwcQGRCNOTehOT5//
nAFPHydhBVNPX7//3nb39qsOhyLYN5nm/
oq0Uj33V+TXtkEYEp8ml6kOhYhszqn1WjCxAdGIkxN6Q0IhhCFR4+5WHYqtVLV0QRgS7x0qUh0KRbijRY0Q
hsT+kzWqQxmW7vERkX04uV4LFjYgGnFyQn+eVgFhSGRXulWHYitZFW4IQ2LniQrVoVCE0/0TBt0/
oSEi+3ByvRYsbEA04uSEjjtVB2FIxMt61aHYSuzAfU3gfSWLdN9jofseFSKyDyfXa8HCBkQjTk7o7Erznfo
vjvOd+mDaMfDJ0skqfrJE1pw5Zaql06M6nACRMKWLiOzDyfVasLAB0YiTE3pwr8K7CdyrEEzcW0PBpOs5G5
FyTgkR2YOT67VgYQOiEScnNKc1BR+ni1Gw6XrSeKSc1E5E9uDkei1Y2IBoxOkJzfMqgovnq1CwHStpgjAk9
mZVqw4lQGJBA4QhEZNbqzoUInIAp9drwcAGRCNOT2ie2B1cPGGegq2ovh3CkNh8tFR1KAF2p5t/
O9LL+beDiELP6fVaMLAB0YjTE/
pQfj2EIRGbV6c6FFuIya2FMCQSCxpUh0I24e7qhTAkVsfko9+rz16LDw4XQxgS5U2dqkMhIgdwer0WDGxAN
OL0hM6pMtdxb0/
lOu5g2HasHMKQyKtxZj5R8Pl8PqyLLYAwJBrbe1SHAwDw9Hn9e506PX2qwyEiB3B6vRYMbEA04vSErmvthj
Ak3okv5CQbi3w+H96OMwvF+jY9CkWyhy0pZRCGhKxtUx0KAKDGbf7d2JBQqDoUInIIp9drwcAGRCNOT+jef
i9WRpvvZHb08J1MK9q6zaUyq6Lz0dfPCVgUPEaOubQvqVCPpX2DZwh9nsYzhIgoPJxerwUDGxCNMKGBTYnm
Wu6yRq7ltqKkoQPCkPjoSInqUMhmjpc1QxgSX2VUqQ4FABAvzb1jcae4d4yIwoP1mnVsQDTChAa+yqiCMCS
OlzWrDiWipZWa41K/ydRrXCpFvrJGc7zzpkQ9xjt/cbwCwpDIrnSrDoWIHIL1mnVsQDTChAaSCs15/
kYO5/
lbsf9kDYQhcbSoUXUoZDMdPeYBlyujJXo1WN43eH5QFc8PIqIwYb1mHRsQjTChAVnbBmFIbEkpUx1KRPs02
dwoXFCnx0Zhsg+fz4d34gshDIm61m6lsXT39vsnYPX09SuNhYicg/
WadWxANMKEBhrbeyAMiXWxBZyENUk+nw9rD+ZDGBLNHR7V4ZANbUs1RzznVKn9W1XZ0gVhSLx3qEhpHETkL
KzXrGMDohEmNNDv9WF1jFk8u7t6VYcTkVo6PRCGxJqYfHg1OiyO7ONgnjkJ61B+vdI4MitaIAyJXScqlcZB
RM7Ces06NiAaYUKbNh8pgTAkiurbVYcSkQrq2iEMiU+SS1WHQjaVUa5H4R+bV6c0hVl9AAAgAElEQVRFI0R
EzsJ6zTo2IBphQpv2ZFVDGBKpJU2qQ4lIKcXmBKx92ZyARaFR0WxOwnr/
sNpJWNs1WQpGRM7Ces06NiAaYUKbkosaBwroGtWhRKS9Aw3cMTZwFCI6bP7WaTM8ETkL6zXr2IBohAlt4hI
iazYfLeUSNgq5dxPM8bfVbjXjb3UbB0xEzsF6zTo2IBphQpu4iXryuImfwkX1AYC6HYhIRM7Bes06NiAaYU
KbOEZ28jjGmMIlXtZDGBJxp+qUvP7xsmYIQ+KrjColr09EzsV6zTo2IBphQp/Gg/
Qmhwc5UrhkV7ohDInP0yqUvL6RY44CTipsUPL6RORcrNesYwOiESb0aftP1kAYEkeLGlWHElGSChsgDAkjp
1Z1KGRzNe5uCENiQ0KhktffkmK+SSFr+SYFEYUX6zXr2IBohAl9WlqpOUr2m0yOkp2IrzKqIAyJ42XNqkMh
m/
P0ef2TsLo84Z2E5fP5sC62AMKQaGzvCetrExGxXrOODYhGmNCnlTR0QBgSHx0pUR1KRNmUWAxhSJQ1dqoOh
Rzgg8NmvpU3hTff3F29EIbE6ph89HNQBRGFGes169iAaIQJfVpbt1lgrIrORx9HbI5Lb78XK6PNd6Q7evpU
h0MOsDu9EsKQSC9vCevrFg+8QbH5KEd1E1H4sV6zjg2IRpjQp/l8PrwdZy6xqG/jEovxqGs11+S/E1/
ICVgUFokF5p6jmNzw7jlKLTGXaO7J4hJNIgo/
1mvWsQHRCBM60LZj5RCGRF4N78d45FS1QhgS21PLVYdCDpFbbebctmPhzbl92eaQimQOqSAiBVivWccGRCN
M6EAxueaYzcQCjtkcj0P55rkMsXlqzmUg56lrMz91ezsuvOfOfJJcOjCmuz1sr0lENIj1mnVsQDTChA6UXt
4CYUjsTq9UHUpE2HXCXI+fWRHe9fjkXH39XqyKNg8NbevuDctrer0+rIkxX7OlkweVElH4sV6zjg2IRpjQg
cqbOiEMiQ8OF6sOJSK8d6gIwpCoaOYELAqfD5NKIAyJ0saOsLxec4cHwpBYezCfe52ISAnWa9axAdEIEzpQ
p6cPwpBYGS3h6eMkrNH09PX7z2To7g3vmQzkbF9nmmfPpJWG5+yZgro2CEPi0+SysLweEdHZWK9ZxwZEI0z
oof4aXwhhSNS2dqsORWvV7i4IQ+LdhCLVoZDDHClshDAkDpysCcvrHS0yX29/
mF6PiOhsrNesYwOiESb0UDvSKiAMiZNVbtWhaC270g1hSHxxvEJ1KOQw+bXmJxKfpYTnE4lvMqsHPnFpCsv
rERGdjfWadWxANMKEHir2VB2EIZEg61WHorW4gfsUz/
tEYdYU5j0ZHx0x95yUNIRnzwkR0dlYr1nHBkQjTOihsirMd/
Z3nuA7+6P5fOCTouxKflJE4eX1+rB6YCqVuzO0k7BUTN0iIjob6zXr2IBohAk9VFWLubfhvUPc2zCaDQnmX
pkaN/fKUPh9fNQ8l6OwPrTnctS39Sg5d4SI6Eys16xjA6IRJvRQ3b2c7jSWLs/
pe8RpYaTCvmxzX0ZKcWj3ZeTVqDl5nYjoTKzXrGMDohEm9PAGz7eobOlSHYqWeF4KqXaspAnCkNibVR3S10
ksaIAwJGJya0P6OkREo2G9Zh0bEI0woYfHE75HxxPjSbWi+nYIQ2Lz0dKQvs7udPNvQXo5/
xYQkTqs16xjA6IRJvTwDuXXQxgSsXl1qkPRUkxuLYQhkVjQoDoUcih3Vy+EIbE6Jh/
93tDtzdiYWAxhSJQ3dYbsNYiIxsJ6zTo2IBphQg8vp8pc9709leu+h7PtWDmEIZFXw7whNXw+H9bFFkAYEo
3tPSF5DU+fFyujzb1OnZ6+kLwGEdF4sF6zjg3IMJqamvDwww/joosuwqxZs/
DYY4+hvX306S6LFi2Cy+UKuH71q19N6HWZ0MOra+2GMCTeiS/k5Juz+Hw+vB1nFn71baEp/
IjG47OUMghDQta2heTn1w78HfhrfGFIfj4R0XixXrOODcgw7r77btx8881ITk7G4cOHcd1112HJkiWjfs+i
RYuwbNky1NTU+K+JJiYTeni9/aff+ezo4TufZ2rrNpe+rIrOR18/
J2CROgdO1kAYEkmFoVkKeLLKPBNoRxrPBCIitVivWccG5Cy5ublwuVxITU31P7Zv3z5MmTIFVVVVI37fokW
L8Oyzz1p6bSb0yAbXfpc1cu33mUoaOiAMiQ+TSlSHQg6XVtoMYUh8lTHy30krEuTAXrBT3AtGRGqxXrOODc
hZPvjgA8yePTvgsb6+PkydOhU7d+4c8fsWLVqEOXPm4NJLL8VNN92E5cuXo7Nz9GK5p6cHra2t/
quiooIJPYIvM6ogDIkTZc2qQ9HKYNH3dWZoij6i8SptDG0zvPNEBYQhkVXhDsnPJyIaLzYg1rEBOctrr72G
G264Ycjjc+fOxfr160f8vg0bNmD//v3IysrCJ598gquuugo/+9nPRn2tFStWDNk3woQeXtLA/P/oHM7/
P9PgspcjhY2qQyGHa+/pgzAkVkbLkCwHHDwPqIrnARGRYmxArHNMA/
LCCy8MW+yfeeXl5U26ATnbwYMH4XK5UFg48oZJfgIyfqdq2iAMia3HylSHopXBjb/
5Idr4SzRePp8P6+MKIQyJurbuoP7s7t5+CMPcB9bT1x/
Un01ENFFsQKxzTANSX1+PvLy8US+PxzPpJVhn6+jogMvlwv79+8f9PUzokTW090AYEutiCzgJa4DP58Pag/
kQhkRTh0d1OETYlmqOhM6tDu7fsMqWLghD4r1DRUH9uUREk8F6zTrHNCDjNbgJPS0tzf/
YgQMHxtyEfrbExES4XC5kZmaO+3uY0CPr9/
qwOsYstlu7e1WHowV3pzkBa01MPrwhPPyNaLwO5pmHYh7OD+4krMyKFghDYteJyqD+XCKiyWC9Zh0bkGHcf
ffd+OEPf4iUlBQkJibi+uuvDxjDW1lZiRtvvBEpKSkAgMLCQvzpT39CWloaSkpK8OWXX+K73/0u7rjjjgm9
LhN6dJuPlEAYEsUNHapD0UJhfTuEIfHx0VLVoRABADLKzUZhd3pwG4XYvDoIQ+JQfn1Qfy4R0WSwXrOODcg
wmpqasGTJEsyYMQMzZ87Eo48+GnAQYUlJCVwuF+Li4gAA5eXluOOOO3DJJZcgKioK1113HZ5//
nmeAxJke7KqIQyJ1JIm1aFoIaW4CcKQ2JddrToUIgBARXMnhCHx/
uHioP7c7QNLu3Kq+LeRiNRjvWYdGxCNMKFHl1zUOFBw16gORQt7BxqyY2zISBNdnuBvFvf5fHgnfmBze2tw
N7cTEU0G6zXr2IBohAk9uoI6c8nRJ8lccgQAm4+WQhgSRfXtYz+ZKEzeTTDH5Va7gzMut+OM8b69IRjvS0Q
0UazXrGMDohEm9OhaOj3cdD3gzE357i5uyid9fHHcPDAwuzI4BwaWN5nLujYlBndZFxHRZLFes44NiEaY0K
Pzek+PnW12+NjZRo4lJk3Fy3oIQyLuVF1Qft6JsmYIQ+KrjPFPISQiCiXWa9axAdEIE3psnyabB+8V1Dn74
D1Zax7MuCWFBzOSXrIr3RCGxOdpFUH5edE55mjfpILgjvYlIpos1mvWsQHRCBN6bPtP1kAYEkeLGlWHolRS
YQOEIWHk1KoOhShAtds8NHBDQmFQft7WY+abDqdqnP2mAxHpg/WadWxANMKEHltqiTl69ptMZ4+e/
SqjCsKQSCttVh0KUYCevtOTsLo81iZh+Xw+rIstgDAkGtp7ghQhEZE1rNesYwOiESb02IobOiAMiY+OlKgO
RalNicUQhkRpIw9lJP28f9jMz4rmTks/p7W7F8KQWB2Tj36HD54gIn2wXrOODYhGmNBjGyxIVkU7tyDp6/
diZbT5DnN7T5/
qcIiG2J1eCWFIZJS3WPo5g284bHb4Gw5EpBfWa9axAdEIE3psXJIB1LV1QxgS6+MKOQGLtHQ439yjdDDP2h
6lwSWXe7KcveSSiPTCes06NiAaYUKPj9M3peZWt0IYEttSy1WHQjSsYOXovmxz6ESyw4dOEJFeWK9ZxwZEI
0zo8XH6WM5gvbtMFCrB+pTuk+TSgbHb7UGMjojIGtZr1rEB0QgTenwGDyb70qEHkwVrfT1RqARjn5LX68Oa
GPPg0ZZOZx88SkR6Yb1mHRsQjTChx6e8qRPCkNiYWKw6FCWCNWGIKJQ+TCqxNKmtucMDYUisPZgPr0MHThC
RnlivWccGRCNM6PHp9PRBGBIroyV6+72qwwmrYJ6xQBRKX2daO6umoK4NwpD4NLksyJEREVnDes06NiAaYU
KP31/jCyEMidrWbtWhhNXgKdPvJhSpDoVoVEcKGyEMiQMnayb1/UeLzO/
fP8nvJyIKFdZr1rEB0QgTevx2pFVAGBInq9yqQwmr7Eo3hCHxxfEK1aEQjSq/
1vwE47OUyX2CsSereuATlKYgR0ZEZA3rNevYgGiECT1+safqIAyJBFmvOpSwihv4veMd9ntT5Gka2MOxLrZ
gUpOwNh8x95CUNExuDwkRUaiwXrOODYhGmNDjl1VhfhKw84SzPgn4fOCTn+xKZ33yQ5HH6/
Vh9cAUK3dn74S+t9/
rw6po83tbuyf2vUREocZ6zTo2IBphQo9fVYu5F+K9Q87aC7Ehwdz7UuN21t4Xikybj5rneBTWT+wcj4b2Hk
ufnhARhRLrNevYgGiECT1+3b2np0F19zpjGlSX5/Tv7Olz1vQvikx7B/ZxpBRPbB/HqRpz/
8jWY5yARUT6Yb1mHRsQjTChJ+a9Q0UQhkRlS5fqUMJi8PyT9w878/
wTijwpxU0QhsTerOoJfV9SQQOEIRGdUxuiyIiIJo/1mnVsQDTChJ6YnSfM/
RBZFc7YD5FR3gJhSOxOr1QdCtG4FNa3QxgSHx8tndD3fZlhniFyomxyZ4gQEYUS6zXr2IBohAk9MQmyHsKQ
iD1VpzqUsDiYVwthSBzOb1AdCtG4uDt7IQyJ1TETO818Y2IxhCFR3tQZwuiIiCaH9Zp1bEA0woSemJNV5iS
sHWnOmIS1LbUcwpDIrWZ+UGTw+XxYF1sAYUg0dXjG9T29/
V6sjDb3OnV6+kIcIRHRxLFes44NiEaY0BNT29oNYUj8Nb5QdSgh5/
P5sD7OnIBV18YJWBQ5PkspgzAk8mvbxvV8J/
17TUSRifWadWxANMKEnhgnvVPa3tMHYUisis5HXz8nYFHkOHCyBsKQOFLYOK7nO+2TTSKKPKzXrGMDohEm9
MQ5Za14aWMHhCHxYVKJ6lCIJiSttBnCkPg6s2pcz3fa3i4iijys16xjA6IRJvTEOWVazkSLOCJdTLR5dtp0
OyKKPKzXrGMDohEm9MQ55byAiS5jIdLFRJcPDp7vU+WQ832IKPKwXrOODYhGmNAT55QTkye6kZdIFxMZoND
d2w9hmPu6unv7wxQhEdHEsF6zjg2IRpjQE9fQ3gNhSKyLLYDPN/
5zBiLJZEaZEulkvCOkq1q6IAyJ9w4VhSkyIqKJY71mHRsQjTChJ67f68Oq6HwIQ6K1u1d1OCEx2cPciHQx3
kM0syrMCVi7TlSGKTIiooljvWYdGxCNMKEnZ/
OREghDorihQ3UoIVFY3w5hSHx8tFR1KESTklHeAmFI7E4fvbGIPVUHYUgkyPowRUZENHGs16xjA6IRJvTkf
JNZDWFIpJY0qQ4lJFKKmyAMib1Z1apDIZqU8qZOCEPi/
cPFoz5vR5o5AetkFSdgEZG+WK9ZxwZEI0zoyTla1AhhSOzLrlEdSkjszTIbrJRiezZYZH9dntOby3v6Rt5c
/
td4c7N6bevom9WJiFRivWYdGxCNMKEnp6DOnIT1SbI9lyhtPloKYUgU1rerDoVo0jYkmM1FtXv48bqdHnNc
78poid5xjOslIlKF9Zp1bEA0woSenOYOD4Qhsfag/
TZpe70+rI4xN9m7O+25yZ6c4fOB5VXZlcMvrxpcprUxcfRlWkREqrFes44NiEaY0JPj9fqwZqBIb+m015ja
poHmys5jhskZ4gY2mMePsMH8RFkzhCHxZUZVmCMjIpoY1mvWsQHRCBN68j5JNpcpFdTZa5lSfq25vOyzFHs
ftEj2l11pjtj94njFsF+PzjFH9SYVjD6ql4hINdZr1rEB0QgTevL2ZddAGBLJRY2qQwmqI4XmBvsDJ+25wZ
6co9ptHjL4bsLwhwxuPVYGYUicqmkLc2RERBPDes06NiAaYUJPXmqJOap2j81G1X6dWQVhSKSVNqsOhciSn
r7Tk7C6PIGTsHw+H9bFFkAYEg3tPYoiJCIaH9Zr1rEB0QgTevKKGzogDInNR0pUhxJUHyaZhyyWNtrzkEVy
lvcPF0MYEhXNnQGPt3b3QhgSq6Lz0W+zQRJEZD+s16xjA6IRJvTk2bGA6ev3YmW0+Y5xe0+f6nCILNudXgl
hSGSUtwQ8btc3EIjInlivWccGRCNM6Mmz4xKOurZuCENifVwhJ2CRLRzOb4AwJA7m1QY8nlZqzyWURGRPrN
esYwOiESa0NXbbxJpb3QphSGxLLVcdClFQjJTT+0/
ac4gEEdkT6zXr2IBohAltjd3GeI70bjFRpBrpU71Pk8tsOUabiOyJ9Zp1bEA0woS2xm4HmY20Xp4oUg23r8
nr9WHtQXseJEpE9sR6zTo2IBphQltT3tQJYUhsTCxWHUpQjDQxiCiSbUosDpjs1tLpgTAk1sTkw2uTARJEZ
G+s16xjA6IRJrQ1HT19EIbEymiJ3n6v6nAsGe3MBKJI9lVG4Nk2BXXtEIbEJ8mliiMjIhof1mvWsQHRCBPa
Gp/
Ph3fiCyEMidrWbtXhWDJ4avSGhELVoRAFVVKhubfpwMkaAEByUSOEIbEvu0ZxZERE48N6zTo2IBphQlu3Pb
UcwpDIqYrse5hd6YYwJD5Pq1AdClFQydo2CENiS0oZAGBPVjWEIZFa0qQ4MiKi8WG9Zh0bEI0woa2LzauDM
CQO5derDsWSeFkPYUjEnapTHQpRUDW290AYEutiC+Dz+bD5SAmEIVHc0KE6NCKicWG9Zh0bEI0woa3LrGiB
MCR2nahUHYolXxyvgDAksivdqkMhCqp
+rw+rY8ypV80dHqyKNv//
1u5e1aEREY0L6zXr2IBohAltXWWLuXfivUNFqkOx5N2EIghDotrdpToUoqDbfLQUwpA4VtIU8GkIEVEkYL1
mHRsQjTChrevuPT09qrs3MqdHdXlO/w49fZH5OxCNZu/
Avo+PBxqRrcfKVIdERDRurNesYwOiESZ0cLy3JwPi3QOo2rUXiIsDaiPoJPHaWlTsPQixfg/
e32REVuxE45RS3ASx6zjEuwcg1u9B9LZo5joRRQzWa9axAdEIE9qipiZgwwbsfPr/
QTz+KrIefgJ44AHg8ceBDRvMr+tqIHY8/
jgyljwBsexV7F76h8iInWgimppQuPYDiN+8BfH4qxDLXsWJJb9irhNRxGC9Zh0bkGH8z//8D2677Tacf/
75mDVr1ri+x+fz4eWXX8bll1+O8847D4sXL0Z+fv6EXpcJbUFTE/DKK8BPf4qEX7+Ml57bjD8/
tgX5T68EnnoK+OlPza/rWNycETueegqbf/Munn5yB7b+5q/
6x040EQO57n7gQYjnBF56bjOefnIHEp5Zy1wnoojBes06NiDDeOWVVyCEwH/
8x3+MuwF58803MWvWLOzevRuZmZm47777cM0116C7e/
wH4jGhLdiwAfjpT9H0u1ex6P9kY9btEhcuqIDLBdx1bQGaf/
cns7jZsEF1pEOdEftd1xbgwu+VY9btEtPmtuofO9FEDOR64+9exf+9JxmzbpeYdbvElGl9zHUiihis16xjA
zKKTZs2jasB8fl8uPzyy/GXv/zF/
5jb7UZUVBS2bNky7tdjQk9Sba25fOOpp3DXtQWYdlEnZt0uMXNhIVwuYOoUL+66tsB8h/Xxx/
Vaa35W7FOn9GPmjwox63aJcy7s1jt2ook4K9dn3lwaOf+eEhGdgfWadWxARjHeBqSoqAgulwvp6ekBj99xx
x347W9/O+L39fT0oLW11X9VVFQwoScjLg544AHIp1fB5QJc53j976zO+EGp//rfZzfi40dfxMebo/
Hx0VI9ro8MfPzoi/jfZzf64xyM3TXFa/
4+LphLyR54AIiPV323iSbnrH9Pz7+uJuCTSuY6EUUKNiDWsQEZxXgbkKSkJLhcLlRXVwc8/otf/
AIPPvjgiN+3YsUKuFyuIRcTeoL27QP++Z+x9+GP/UXMjJvL/IX84PX0kzsglv0PxPo9/jG3yq/
1eyCWvYqnn9wREOuM75cFFGV7H/4Y+PnPzd+VKBKd9e/
ptDmtmHW7RNTVTcx1IooobECsc0wD8sILLwxb7J955eXlBXxPqBsQfgISJGd/
AuICppzbj3NndwRc8c+sQ+lDS1G6JxaljR16XHsOovShpYh7Zl1ArK6p/
XxXmOxlyL+nPpxzvgcul4+5TkQRhQ2IdY5pQOrr65GXlzfq5fF4Ar4n1EuwzsaEnqQh+yi8AQXNkLXldXWq
Iz4tkmMnmgjmOhHZBOs16xzTgEzGRDehv/XWW/7HWltbuQk9nAam6zT/7k+469qCgMJG+
+k6kRw70UQw14nIBlivWccGZBhlZWVIT0/Hf//3f2PGjBlIT09Heno62tvb/c+58cYbsXPnTv8/v/
nmm5g9eza+/PJLZGVl4f777+cY3nA66yyN/KdXYu/
DH0fkOSARFTvRRDDXicgGWK9ZxwZkGEuXLh12j0hcXJz/OS6XC5s2bfL/8+BBhN/
61rcQFRWFxYsXQ0o5oddlQlt0xmnieOABcyNrBJ6EHnGxE00Ec52IIhzrNevYgGiECR0ktbXmBtZ9+8z/
G0lrySM5dqKJYK4TUYRivWYdGxCNMKGJiIiI9MZ6zTo2IBphQhMRERHpjfWadWxANMKEJiIiItIb6zXr2IB
ohAlNREREpDfWa9axAdEIE5qIiIhIb6zXrGMDohEmNBEREZHeWK9ZxwZEI0xoIiIiIr2xXrOODYhGmNBERE
REemO9Zh0bEI0woYmIiIj0xnrNOjYgGmFCExEREemN9Zp1bEA04na74XK5UFFRgdbWVl68ePHixYsXL16aX
RUVFXC5XHC73apLx4jFBkQjgwnNixcvXrx48eLFS+
+rqKhIdekYsdiAaMTr9aKiogJut1t5d39mh89PZHiPeI94j1RfvEe8R7xHvEe6XOXl5XC5XGhpaVFdOkYsN
iA0otZWrnEcC+/R2HiPxsZ7NDbeo7HxHo2N92hsvEdj4z2yjg0IjYj/go2N92hsvEdj4z0aG+/
R2HiPxsZ7NDbeo7HxHlnHBoRGxH/BxsZ7NDbeo7HxHo2N92hsvEdj4z0aG+/
R2HiPrGMDQiPq6enBihUr0NPTozoUbfEejY33aGy8R2PjPRob79HYeI/
Gxns0Nt4j69iAEBERERFR2LABISIiIiKisGEDQkREREREYcMGhIiIiIiIwoYNCBERERERhQ0bEBrRunXrMH
/+fERFRWHhwoVISUlRHVLYJCQk4N5778UVV1wBl8uFXbt2BXzd5/
Ph5ZdfxuWXX47zzjsPixcvRn5+fsBzmpqa8PDDD+Oiiy7CrFmz8Nhjj6G9vT2cv0bIvP7667jlllswY8YMz
J07F/fffz9OnToV8Jzu7m48/fTTuOSSS3DhhRfigQceQG1tbcBzysrK8JOf/ATnn38+5s6diz/84Q/
o6+sL568SMuvXr8f3vvc9XHTRRbjoootw6623Yu/evf6vO/3+DOeNN96Ay+XCs88+63/
M6fdpxYoVcLlcAdeNN97o/7rT78+gyspK/PKXv8Qll1yC8847DwsWLEBqaqr/607/mz1//
vwheeRyufD0008DYB4BQH9/P/74xz/iO9/5Ds477zx897vfxZ/+9Cf4fD7/
c5yeR8HEBoSGtXXrVkyfPh0bN25ETk4Oli1bhtmzZ6Ourk51aGGxd+9evPTSS9i5c+ewDcibb76JWbNmYff
u3cjMzMR9992Ha665Bt3d3f7n3H333bj55puRnJyMw4cP47rrrsOSJUvC/
auExF133YVNmzbh5MmTyMjIwE9+8hPMmzcPHR0d/uc8+eST+Pa3v42DBw8iLS0Nt956K/7+7//e//X+/
n4sWLAAP/7xj5Geno69e/dizpw5ePHFF1X8SkH31VdfYc+ePcjPz4eUEv/1X/
+FadOm4eTJkwB4f8527NgxfOc738H3v//9gAbE6fdpxYoVuOmmm1BTU+O/Ghoa/F93+v0BgObmZsyfPx//
9m//hpSUFBQXF+PAgQMoLCz0P8fpf7Pr6+sDcig6OhoulwtxcXEAmEcA8Nprr+HSSy/
FN998g5KSEuzYsQMzZszA6tWr/c9xeh4FExsQGtbChQvxzDPP+P/Z6/
XiyiuvxBtvvKEwKjXObkB8Ph8uv/xy/OUvf/E/
5na7ERUVhS1btgAAcnNz4XK5At6B27dvH6ZMmYKqqqrwBR8m9fX1cLlcSEhIAGDej2nTpmHHjh3+5+Tl5cH
lcuHo0aMAzCbvnHPOCXiX7Z133sHMmTPh8XjC+wuEycUXX4z333+f9+cs7e3tuP766xEdHY1Fixb5GxDeJ7
MBufnmm4f9Gu+P6YUXXsA//MM/jPh1/s0e6tlnn8W1114Ln8/HPBpwzz334LHHHgt47IEHHsAvf/
lLAMyjYGMDQkN4PB5MnTp1yLv+jzzyCO677z5FUalzdgNSVFQEl8uF9PT0gOfdcccd+O1vfwsA+OCDDzB79
uyAr/
f19WHq1KnYuXNn6IMOs4KCArhcLmRnZwMADh48CJfLhZaWloDnzZs3D0IIAMDLL788pLAqLi6Gy+XCiRMnw
hN4mPT392PLli2YPn06cnJyeH/
O8sgjj+C5554DgIAGhPfJbEAuuOACXHHFFbjmmmvw8MMPo406iDwAAAYuSURBVKysDADvz6C//du/
xXPPPYef//znmDt3Ln7wgx/g3Xff9X+df7MDeTweXHrppXjttdcAMI8Gvfbaa5g/
fz6klACAjIwMXHbZZfjkk08AMI+CjQ0IDVFVVQWXy4UjR44EPP78889j4cKFiqJS5+wGJCkpCS6XC9XV1QH
P+8UvfoEHH3wQgPmH7IYbbhjys+bOnYv169eHNuAw83q9uOeee3D77bf7H/v0008xffr0Ic/9u7/7O/
znf/4nAGDZsmW48847A77e2dkJl8sVsFcikmVlZeHCCy/
E1KlTMWvWLOzZswcA78+ZtmzZggULFviXMJzZgPA+me88b9++HZmZmdi/fz9uu+02zJs3D21tbbw/
A6KiohAVFYUXX3wRJ06cwIYNG3Deeefhww8/BMC/
2Wfbtm0bpk6d6n9Hnnlk8nq9eOGFFzBlyhSce+65mDJlCl5//XX/
15lHwcUGhIZgAxKIDcjonnzyScyfPx8VFRX+x/gfNJPH40FBQQHS0tKwfPlyzJkzBzk5Obw/
A8rLy3HZZZchMzPT/xgbkNG1tLRg5syZeP/993l/BkybNg233XZbwGO/
+c1vcOuttwLg3+yz3Xnnnbj33nv9/8w8Mm3ZsgVXX301tmzZgqysLGzevBmXXHIJG9kQYQNCQ3AJViAuwRr
ZM888g6uvvhrFxcUBj/Mj/eEtXrwYTzzxBO/
PgF27dsHlcmHq1Kn+y+VyYcqUKZg6dSpiYmJ4n4Zxyy23YPny5cyjAfPmzcO///u/
Bzy2fv16XHnllQD4N/tMpaWlOOecc7B7927/
Y8wj09VXX41169YFPPbqq6/6p84xj4KLDQgNa+HChfj1r3/t/
2ev14urrrqKm9BxeiPaW2+95X+stbV12I1oaWlp/
uccOHDANhvRfD4fnnnmGVx55ZVDRhACpzfHfv755/7HTp06NeymxjMnq23YsAEzZ85ET09P6H8JBf7xH/
8RS5cu5f0Z0NbWhuzs7IDrlltuwb/8y78gOzub92kY7e3tuPjii7F69WrenwFLliwZsgn9ueee838qwr/
Zp61YsQKXX355wPhc5pHpkksuGfIpxeuvv47rr78eAPMo2NiA0LC2bt2KqKgofPjhh8jNzcUTTzyB2bNnD5
kLblft7e1IT09Heno6XC4XhBBIT0/3b/588803MXv2bHz55ZfIysrC/fffP+wovh/+8IdISUlBYmIirr/
+etuM4nvqqacwa9YsxMfHB4x27Orq8j/nySefxLx58xAbG4u0tDTcdtttAcskBsc63nnnncjIyMD+/
fsxd+5c24x1XL58ORISElBSUoKsrCwsX74cU6ZMgWEYAHh/RnLmEiyA9+n3v/894uPjUVJSgqSkJPz4xz/
GnDlzUF9fD4D3BzBHOJ977rl47bXXUFBQgE8//RQXXHCBf/MwwL/ZgPlG4rx58/
DCCy8M+RrzCFi6dCmuuuoq/
xjenTt3Ys6cOf5laADzKJjYgNCI1q5di3nz5mH69OlYuHAhkpOTVYcUNnFxccMe2rR06VIApw8j+ta3voWo
qCgsXrzYPzljUFNTE5YsWYIZM2Zg5syZePTRR21zGNFw98blcmHTpk3+5wwebHXxxRfjggsuwM9+9jPU1NQ
E/JzS0lL80z/9E84//3zMmTMHv//9721zsNVjjz2G+fPnY/
r06Zg7dy4WL17sbz4A3p+RnN2AOP0+PfTQQ7jiiiswffp0XHXVVXjooYcCzrdw+v0Z9PXXX2PBggWIiorC3
/zN3wRMwQL4Nxsw34l3uVxDfm+AeQSYn8g++
+yzmDdvnv8gwpdeeilgzDDzKHjYgBARERERUdiwASEiIiIiorBhA0JERERERGHDBoSIiIiIiMKGDQgRERER
EYUNGxAiIiIiIgobNiBERERERBQ2bECIiIiIiChs2IAQEREREVHYsAEhIiIiIqKwYQNCRERERERhwwaEiIi
IiIjChg0IERERERGFDRsQIiIiIiIKGzYgREREREQUNmxAiIiIiIgobNiAEBERERFR2LABISIiIiKisGEDQk
REREREYcMGhIiIiIiIwoYNCBERERERhQ0bECIiIiIiChs2IEREREREFDb/
H481HEStOPx3AAAAAElFTkSuQmCC\" width=\"800\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"correl_ideal = si.correlate(sig, waveform, mode=\"valid\") / norm_w\n",
"# valid : on ne prend que les valeurs de la corrélation pour lesquelles le
support de l'onde est inclus dans le signal\n",
"\n",
"plot_correl(correl_ideal, data, T)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Cas bruité : même si le signal est difficile à décoder en l'observant, le
décodage par corrélation donne de bons résultats. La corrélation aux temps $kT$ est
bien du même signe que la donnée correspondante."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"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 = $('<div/>');\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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all '
+\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\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 = $('<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 = $('<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 = $('<canvas/>');\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 = $('<div/>');\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 = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all
' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\
n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt ===
mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then
trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\
n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id:
this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format =
format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\
n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL ||
window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21)
== \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message
type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \",
msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type +
\"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-
in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from
http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the
document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-
home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-
arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-
right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan
axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"],
[\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"],
[\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-
save\", \"download\"]];\n",
"\n",
"mpl.extensions =
[\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm)
{\n",
" // Create a \"websocket\"-like object which calls the given IPython
comm\n",
" // object with the appropriate methods. Currently this is a non binary\
n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage
function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a
real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id +
\"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in
FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' +
width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\"
width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\"
title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></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 = $('<span class=\"mpl-message\" style=\"text-
align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline
pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\"
title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove
icon-large\"></i></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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 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"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img
src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAGQCAYAAABWJQQ0AAAgAElEQVR
4nOydeXBU15X/+Wtmav6Y30zVVM2kpmo6nsTJJHFWO06cxY5jZ0/
sbHYySSZO4mSSOKtjJ42xMbYx2GCDMV7ABmODMatZjIUQCCQEiFVICLEKrQiQBAIkIaFd5/dH6/
T73vvuve91qyW9xudTdaqg+/
Xr10+v+93vved8zzgSBEEQBEEQBEEYJcaN9QEIgiAIgiAIgvDOQQSIIAiCIAiCIAijhggQQRAEQRAEQRBGD
REggiAIgiAIgiCMGiJABEEQBEEQBEEYNUSACIIgCIIgCIIwaogAEQRBEARBEARh1BABIgiCIAiCIAjCqCEC
RBAEQRAEQRCEUUMEiCAIgiAIgiAIo4YIEEEQBEEQBEEQRg0RIIIgCIIgCIIgjBoiQARBEARBEARBGDVEgAi
CIAiCIAiCMGqIABEEQRAEQRAEYdQQASIIgiAIgiAIwqghAkQQBEEQBEEQhFFDBIggCIIgCIIgCKOGCBBBEA
RBEARBEEYNESCCIAiCIAiCIIwaIkAEQRAEQRAEQRg1RIAIgiAIgiAIgjBqiAARBEEQBEEQBGHUEAEiCIIgC
IIgCMKoIQJEEARBEARBEIRRQwSIIAiCIAiCIAijhggQQRAEQRAEQRBGDREggiAIgiAIgiCMGiJABEEQBEEQ
BEEYNUSACIIgCIIgCIIwaogAEQRBEARBEARh1BABIgiCIAiCIAjCqCECRBAEQRAEQRCEUUMEiCAIgiAIgiA
Io4YIEEEQBEEQBEEQRg0RIIIgCIIgCIIgjBoiQARBEARBEARBGDVEgAiCIAiCIAiCMGqIABEEQRAEQRAEYd
QQASIIgiAIgiAIwqghAkQQBEEQBEEQhFFDBIggCIIgCIIgCKOGCBBBEARBEARBEEYNESCCIAiCIAiCIIwaI
kAEQRAEQRAEQRg1RIAIgiAIgiAIgjBqiACJEAMDA9TQ0ECtra3U1tYmISEhISEhISERsWhtbaWGhgYaGBgY
66Fj1iICJEI0NDTQuHHjJCQkJCQkJCQkIh4NDQ1jPXTMWkSARIjW1tbkBT3W6l5CQkJCQkJCQsIfPGHc2to
61kPHrEUESIRoa2ujcePGUVtb21gfiiAIgiAIgmBAxmvDRwRIhJALWhAEQRAEIdrIeG34iACJEHJBC4IgCI
IgRBsZrw0fESARQi5oQRAEQRCEaCPjteEjAiRCyAUtCIIgCIIQbWS8NnxEgEQIuaAFQRAEQRCijYzXho8Ik
AghF7QgCIIgCEK0kfHa8BEBEiHkghYEQRAEQYg2Ml4bPiJAIoRc0IIgCIIgCNFGxmvDRwRIhJALWhAEQRAE
IdrIeG34iACJEFf6BT0wMDjWhyAIgiAIgjAsrvTx2mggAiRCXMkX9JrSU3TNpDzaWdUy1ociCIIgCIKQNlf
yeG20EAESkqKiIvrmN79J73rXu2jcuHG0Zs0a5fnBwUGaOHEi/fu//zv9wz/
8A91yyy1UWVmZ0ntk6wV9uaefevoGnNvE4jkUi+fQByduGKWjEgRBEARByDzZOl6LEiJAQpKbm0sPPvggrV
692ihAnnzySfp//+//
0dq1a6m8vJxuu+02uuqqq6irqyv0e2TjBd3V209Xjc+hjz+2ybmdCBBBEARBEK4EsnG8FjVEgKSBLkAGBwf
p3//93+mpp55KPtba2kp///d/T0uXLg2932y8oA+fbkuKi8FBe40Hb/Ohh/
NG8egEQRAEQRAySzaO16KGCJA00AVIdXU1jRs3jsrKypTtbrzxRvrjH/8Yer/
ZeEEfbfQEiKvIXASIkEmCUv4EQRAEYaTIxvFa1BABkga6ACkuLqZx48bRmTNnlO3uuOMOuvPOO6376e7upr
a2tmQ0NDRk3QV9rLE9KS76+u2DQt7mGhEgwjA5ffEyvXfCevrL8gNjfSiCIAjCOxARIMNHBEgaZEqATJo0i
caNG+eLbLqgjzd5AsQ1K50UIJNEgAjD44nco8nrSRAEQRBGGxEgw0cESBpkKgXrSlgBqQQB0tXbb91OBIiQ
KaZtEAEiCIIgjB0iQIaPCJA0sBWhP/
3008nH2tra3hFF6CeaPQFyuSdYgHxYBIgwTJ7KOyYCRBAEQRgzsnG8FjVEgITk0qVLVFZWRmVlZTRu3DiaO
XMmlZWVUX19PRElbHj/+Z//
md566y06ePAg3X777e8IG94TzZeSg8GO7j7rdrzNRx7ZOIpHJ1yJzNgoAkQQBEEYO7JxvBY1RICEpLCw0Fi
vcddddxGR14jw3/7t3+jv//
7v6ZZbbqHjx4+n9B7ZeEFXnfUESHtXr3U7ESBCppi56bgIEEEQBGHMyMbxWtQQARIhsvGCrgYB0no5WIB89
FERIMLwmJVfKQJkBBgcHKRZ+ZWUf7hprA9FEAQh0mTjeC1qiACJENl4Qdee60gOBi929li3420+JgJEGCaz
N4sAGQkKjjXLeRUEQQhBNo7XooYIkAiRjRd0XYsnQFoudVu3EwEiZIrnC07IQHkEWLa3fkTO6+WefqdBhSA
IQraRjeO1qCECJEJk4wWNAuRse7AA+fhjm0bx6IRsZHBwkLYeP0uNrWYDhxcKRYCMBMv3ncz4ee3rH6B3j8
+hq8a7G5UKgiBkE9k4XosaIkAiRDZe0ChAmtvsjl+8zSdEgAgB5B1qpFg8MWg1MXdrlQiQEWBlSUPGz+vZ9
u7kPs85VkgFQRCyiWwcr0UNESARIhsvaKwBsc1YE7kFyIyNx2jGxmMjeZhCFjFh9UHnQPjlomoRICPAqv0i
QARBEMKQjeO1qCECJEJk4wVdAwLk9MXL1u1sAqS1s9dYxD44OEj9A4MjdtxCdHkgQIDM2yYCZCRYU3oq4+f
13CURIIIgXHlk43gtaogAiRDZeEGjDW/DhU7rdrzNtZNVAXK+o8eYwvXLhfvoc9O2UFevFK++0xi/
qtw5EH5le40IkBFgbZkIkKjRcqmbXi6qlnMnCBEjG8drUUMESITIxgsaGxGePJ+6ALnY6QmQM62XfdtvPiI
9Cd5pxN90C5BXd4gAGQneLj+d8fPa3N7lTTC021M0BTPfn1NMsXgOffuFHWN9KIIgANk4XosaIkAiRDZe0C
eaPQFS19Jh3c4TIPnK4xdgBeTURb8AkaZo7zz+uvKAcyC8cGetCJARYP3BMxk/
r42tngBx1YgJZvjcybUuCNEiG8drUUMESITIxgv6RHN78gZZcy5YgFz3uCpAWiBFA1dQ+LFNIkDecdy/
wi1AFu2qSz4/
OCh1QpliQ0XmBcjpi5eNEwyCm9bOXiISASIIUSUbx2tRQwRIhMjGC7qyyRMgVWcvWbezCRB0yakFAcOPbTz
UOGLHLkSTvyx3C5DFuz0BIr0lMgfbH2dS2J083xkqRfOdzMDAIP1k/
m66b8UBIvJWop7KOyYCRBAiSjaO16KGCJAIkY0X9HEQICea263b8Taf1ARIc1uX8fX8WJ4IkHcc9y4vcw66
luzxOnZ394lJQabYdLgp48IO+wTVOlZI38kcbGhVrvdrJ29ShIcIEEGIHtk4XosaIkAiRDZe0McaPQFyvCl
YgFw/
RRUgmCN+tLHNt70IkHcef17mFiDL9noCpLOnb5SP7spl85GmjAs7tOl2rZC+k9lff0G53q97PF8EiCBEnGw
cr0UNESARIhsv6KONbUYBoWMTIJgjXnGq1bf9hgoRIO80/
rS01DnoWrHvZPL59q7eUT66K5eCo83J83q5JzMCBE0qKh0TFO9kSuo8ATI4OEjXTxlbAdLd108Ld9Y6a/
oE4Z1ONo7XooYIkAiRjRc0CpBDp1ut2/
E2n5qyWXm84YKXI15af4GIEk0IPQFyZkSPX4gGff0DdO+yMnpjdz39YYlbgLxZ4nXs5mJdYfgUHvMEyKXuz
KwsYYrmsUYRICb21Z5PnqOBgUH69NTNYypAnttSKasughBANo7XooYIkAiRjRf0kTOeAMEVDB3e5tNTVQFS
3+IJkL2154mIqH/AEyC5B8MLkIudPXTg5MX0PogwpmATvN8HCJDVpZ4AOd/
RM8pHGi3211+glSUNab9+Q8UZmri2gvr6B6jo+FlP2F3OjLDDCYrDp7Pnd2002VPjCZD+gUH6zBNbxlSA/
GzBHhEgghBANo7XooYIkAiRjRf04dPeAKO8wT74twmQWsgR31nVQkREvf0DycfWpyBAPjwpj2LxHCquOpfe
hxHGjEXQ2+N3b+wPLUDOtl95HaIHBgapI+QKBJ+H3dUtab0Xv3753pO048S55P8vZEjYHTrtFVi7Jijeyey
ubkmeo97+gTEXIHe/
tlcEiCAEkI3jtaghAiRCZOMFjQOMMsfqA29zgyZAqqGT+rbKs0SUyEHmx3LKwwsQfs2U9UfS+zDCmIEC5J7
FbgGyar8nQJrarrzmdjwDHca2ls/D4t11ab0Xv/75ghNUDALk3KXMCDt0eJLVSTO7QIB09/
XT56aNrQD5v0X7RIAIQgDZOF6LGiJAIkQ2XtAVp7wBxv6hGg4TvM1nntiiPI5FqgVHm4mIqKt3eALkidyj6
X0YYczA5oK/XVwSugbk9BXY3I4/29Mbj4Xe9rXi2mG91/
MFJ5QVkOYMCbsDJy+G+n14J1Nc5Z33rt5+unF6wZgKkKAJAEEQsnO8FjVEgESIbLygUYCU1J33Pb+t8ixNf
vuwVYBgI0NuOtjR3Zd87O3y06GPhV8zPS+zAuRE86VkepgwMrwOAuTXi9wCZCUIkCuxuR1/tic3BF/
HvO387TXDeq8XCk/
Q9kpvIHymNTPCDi1m99X6fx8EUoTf5Z5+ummMBUhQDZYgCNk5XosaIkAiRDZe0JhisdcwwNBvoroAwT4iXH
De3tWbfGzdgdQFyIwQM8epwPuVPgYjB3Y3D0oBQRveupaxswp9fVcdffbJLRlvsMefbWqIVELe9qWiqmG91
4uFVbSt0itCb7iQGWGHDk/p1qlc6aDw6+juo5ufKhxTARLUh0cQhOwcr0UNESARIsoXdGdPH+2pOU/
9A4PK4+UNF50DjCABgkXsbw2JjdbLvb7HwsCveSb/eBqfMHi/0pNk5EAB8suFbgGyHARI9RiKQj6G/
31lz4jsd/Lbh0Nv+0LhiWG915ytVYoLVn1LZgQIOjyJOYQZPO/
tXb30xafHVoDct+KACBBBCCDK47VsQQRIhIjyBf2Dl3ZSLJ5DLxdVK49jjrcpTSlIgGAK16r9CTvRi509yc
fWlp0KfYz8mmc3V6bxCYP3Kz1JErR39dLEtRUZTal5Y7fX3fzu1wIEyF5PgIxlczs+hh/
N2zUi+5301qHQ26Z7zfPr526toq0wEM5UE7qdVV6B9Y4TIkBMbNXsj2+dsXVMBcjfVpaLABGEAKI8XssWRI
BEiChf0HxDuvmpQuXxMhAgxYYBxg1aU63PPqkKEEzhWr73JBERne8YngB5viC92eCg/
YoASTDprUMZH6As3eMJkF+86rYBXbbX2/ZoY7jvyqz8Svrui8XU1ZuZDt9E3nXx43m7M7ZP3O/
EtRWht52xKb1VP379S0VVSiPCE82ZWVlCZ62i42czss8rjQI4762dvfSlmWMrQMavOigCRBACiPJ4LVsQAR
IhonxB8w3plhlblcdLoch0e6VfgOie9p+bpgoQXEF5Y3c9ERGdu9SdfGxNaeoC5MXC9PLhg/
YrKVgJfjxvd8YHKCgqfh4gQFCsHDodrreEfo1lgpEWIBNWHwy9bbrGC/
z6l4uqlYHw8QytLGFdScGx5ozs80pjy9Gm5Dm60NFDX3mmaEwFyENrKkSACEIAUR6vZQsiQCJE1C7oI2faK
O9Qo+JU9eWZRco2KEBMM5xBAgRfv3BnLRERNbd1JR97M4Uuzzibm0lkBUTlR/N2jagAuSugE/
MSECAHG1ITIIuGrrFMwPv8yfyRESDjV5WH3jZMwbrr9fO2qQLkyJnM/
AbhqsrmI00Z2eeVxuYjngBpudRNX521bUwFyEiscArClUbUxmvZiAiQCBG1C3ri2sRM2NMbjyVvSF+dtU3Z
Bm02Cw0znLoA+fy0guRzmH4Vi3tWoo2tngBZvu9k6OPFwVQmEQGi8j8vZ16AYF3HT+a7V1iwXsTV/
BIZyRWQkRIg9684EHrbx0IUrLteP397DRUc9cRCprqW4z7ZZltQ2XioMXmOzrZ309dSFCCtl3vpwMmLNDg4
aN0mFR4D23RBEMxEbbyWjYgAiRBRu6B5JmzahqPJG9I3ZqsCpKTOEyDcSBDRBciN0z0B8tFHNyrPzd2aWLk
4ffFy8rGle8INGAcHB5OvWbAjvZ4INkSAqLAhQUYFCDhb/
fAlt8BBx6ySunDN7Xj7ZXuzR4Dcu7ws9LZhCtZdr5+/
vUZJBSpvyEzX8vzDTfL9CWBDxZnkOWpu76JvzE5NgFz3eL51Aigdpq4/
IgJEEAKI2ngtGxEBEiGidkHzTNjUXO+GdNtz25VtSuo8m838w/
4UC5cA0W+wXDzecKEz+dji3XWhjrWvfyD5moUZTLPB45QBVII7546sALljjnv/2LTQ1HvGBG+/
MoWUvrD7HCkb3j8tLQ297YNrgutFXK9fsKNGSQUqzVDX8jyY3c8pl+
+PiZxyT4A0tXXRt57bnpIA4efD1AyF4UmYcHKtqnT3Zc7QQRCyjaiN17IRESARImoXNM+EPZ7jLcl/
+4UdyjbYaMyUYqG7YN3kECCz8hNWoifPewIkbM5+V29/8jWv7wonWsIiAkTljhEQINhc8Nsv7HDufxEIkF0
hm9vx9qtLMy9AfjpCAuR3b+wPvW2YehHX61/
dUaOsVpTUuYVde1cv3fb8jkDDB5zdT6WnzzuJtWWnkufoTOtl+ubs9ATIQ2uCXdPCgCm3et8n5tUdNRSL59
Amw6STILwTiNp4LRsRARIhonZB80zYI+u8osTvvVisbLMXBIjJJepTU1QB8gWw8dVvsE8PdTCva+lQBkZhu
NTdl3zNkpBpW2Hh/XKn9nc6359TnHEBsrKkIblPnAE2sWhnbfJ5k/
WzzsCAl56Xiq1zELzPuxaMjAD57eKS0NsG1Yu8XX6avjZrm69rO7/+teJa2gQCZE+NW4A8X3Ai1DWAs/
uZPPdXEqtLvWv/1MXLKReh8/PppuHpPJN/PLlPm201P/
+BiRsy8p6CkG1EbbyWjYgAiRBRu6CfykvMhD281rNlvGPuTmUb7HRsGqBzfnIYAfJEbsJKtOacJ0C4MD0Ib
F7I/UQyhQgQle+9mHkB8iYIEByAmVgIAmRbZXBvie4+b3Usk2lAIy1A/m/RvtDb/
nmZu17E9v3lxxfurFWKoU1NRRGcJXfx1oHTye240aigguL75PnOlBsR8vOPrMuMAJm9uTK5z0vdfc73/
O+HMidADp9uo1tnbKU8MSsQsoCojdeyEREgESJqF/
TMTYmZsAfXeI2pfviS2vV5d7XX6dg0uLt28iblJnqzQ4A8npNw8jnRfCn5mN553Qb2DknFOSsILG6XFKwE3
x1hAYKN2Exw+kcsHq63BK6OZfJvyPv82QgJkLtfcwuQzh7vc/
1+ibtehLf7muZix48v2lmr1GsEdS2fEVKAYHrRigx+L68k0IL65PlO+sJThWkJkMlpOqHpvFDorW5d7Oxxv
uf7H8rNyHsSEX1+WkHGf1cEYaSI2ngtGxEBEiGidkE/
OzQTNn5VefLGoDdd2wUC5GcL9tCj6w4rhYsff0wTIE8XJp/
Tb7CcQoB9R+ZsDdfTQ7HuzeAKSD+k78gKSIKgGo10wFngm2EAZmIBCJAwvSVwdSzVnPVfLdxHd87dSQOGXH
je589f3ZvSPoMII2ywgWcsHpyuxdt9/VlPgKC4XrSrjjZUeAIkqGv5jE3HQ10Dq/
Z7f9dMOpBdSaCtdF1LB31ummrcEVaATEmzF4zOnK1VyX2ebe92vufVD2ZOgHwMXBEFIepEbbyWjYgAiRBRu
6A5z/uvKw8kbwy648/
OqhbfjXLLUW+Q95FHVKtdlwBhJ59jjZ4AYWesINA5K5MDHXTXEgGS4PbnMy9AsA8IDsBMvLLdEyBheks0t3
vi1OTUZqMX/vbVZy/
5nh9pAeJy10Kr4lg8h3610L1awtuhjTaK69c1ARK0sjQzQIBMzztK97yxX3E3y2QPlihysbMnrV4caKpQc6
6DPq0Zd4QVIJzCOlxeLPQEyJnWy873vHpC5gQI3isEIepEbbyWjYgAiRBRu6D5RvSX5Z4A0Wdli6vO+W6Um
GpxzaQ85bkvOgRI/
M2Ek8+RM23Jx2Zvrgx1rLVQN5LJIvSePhEgOreNgABZCt3NcQBmYj4IkDApVaegr0wqzfCwdsQlQH4xQgJE
X21E9GZ1QSLIJEDw2l68u05xrApaWQoSIPwcrp4uyrA7XZTgAv506jAwpbDq7CW6drJaNxdWgEzbkBkBggY
DJ893Ot/
zvRPWZ+Q9idR7hSBEnaiN17IRESARImoX9MtF1RSL59AflpQmbwx3v6YOdEwCBFOgPjhxQ2gB8pflCSefQ6
e9DunP5B8PdaxYNxK2d0gYcBAqAiTBbQEuVemAaShoXGBi3rbq5PNhisrRVc3k1GYDrZ1rNPcoIrJ+J4YL7
/cHL+20bvPZJ9U0naBeJCYBgp/vjd31lHvQEyBBQg2dklzv9+dlZcl/
v1Zc69yniXUHTtMdc3dSc1tXyq8dTYLSBl2goD7RfElJRUpFgLCL4HBBAWIS3vie73kgcwLkQw+LABGyh6i
N17IRESARImoXNN8Yf7lwX/LGoKd6FJ/
wCxDsXv7fD4UXINx4reKUJ0BmhLypHm30Vk0y2QcEB2kiQBIE2eSmAzYXtOWC76puodpzHYoACdNb4kRze1
p/Qyzy1u1ricIXi6cK7/eOOXYBoq8s/mjeLuu2uM9vzvYaiV7u8a7tJXvqaT0IkKCVpVn5lc5rgJ/
741Jv8uKVkI52tv1EmeEUUPNETyyeQ5VN7XTNw+rfNqwAmbEp3GRNEM9t8f62x5vane951Xj/
cc3eXEnPbQm3co18ACarBCHqRG28lo2IAIkQUbugOTXgJ/
N3J28Mv3ldLXbdYRAgmOv9vgdzledumbE1+Zz+unuGGq9hge30vHBpBShawjYvDAMOQteLACEiom/
MdtvkpgNa6+LgmnPqUWDigG1NaXBvCUzpS8WGt72rN/
m6upbRFyDf1XrumLZJipW5drGC26MAQXewpXvqlZ4dQefp2c12AYJ9V3D1dN62cI52puPOtNVxpvnME+66J
RdYc3GssZ3e/1Cu7+8bRoCEXS0OAv+2h063Ot/
z3ZoAae30vjOtnb0pvS9OVglC1InaeC0bEQESIaJ2QXNxJDae0912tlf6BQiuQLx3wnrluVsdAoT7HpTWX0
g+FrawsgxEy8IMCpCObhEgOl9/NvMCBPPgcSaU3aewU/
pLRd6A7c2S4N4S5Q3etbEuhW7crZe9wVR9iz8Xnp/
7ZUABeKrwfm97fkfgNmHECm6PAqQNBNayvfX0drnXsyNoZcklQLB4//
cgQF4qCudoZzruTFsdZ5qguiUXmPJ05Eyb7zczrADhernjTe3W4vEw4OrWgZMXne+pH1cL2KE3t6eWNoeTV
YIQdaI2XstGRIBEiKhd0JyXjzPeenO0bZVnfTdKXIH4rwf8N9Prp+Qr7jgcXMxbUucJkLDWkiV1XkPEsN3T
w4Cz4FdiCtbRxjb6/pxi2lXtbjyHfC2gUWA6oLPV1RO8gUhf/
wARqS5Zc8EmNEzPF7w2UunGfaHDs+81FePyc0EOVKliEgu2bcKIFds+lead+07SOmgaGLSy5BIgmLZ4zxv7
k/9+sTB9AZJppzGkf2CQ7l9xYFguXZ8MqFtygQN+rH8LEiAd3X2KJfbzBScUO/
J0wfqekrrzxm1sx4XfmaYU63bwey8IUSdq47VsRARIhIjaBc0Nsr74tFdgqaebFB33CxAsNrXdTE3x06FC2
n213oDxsZDNtbAfST
q55jZwlvhKXAG5IY2Z2688U5TxgQLWdbx7vHdN9A4JEHTJwj4FS0M4nuG1ESZli8HZ3IYLoy9A9KaBpm04s
Ljctf23nvMEyHkYLK7Yd1LpWh60sjTbIUAwbfG3i0uUAXKqeL87IydAsPYlXbDhaqpgTxW9v4tLgOBKIAu8
wmPNw/
4seDy2iQnbceF3JtVVmPfAZJUgRJ2ojdeyEREgESJqFzSnvWB+M6ZCDAwMKgNHjgVDKxDY6CxMcCHtnhpPg
HBzQp3cg2doVn5lskYAU8HmZ1CAYE7zlShA0rnppyJAevsHKP9wE7V29lJzWxdNzT1iTGfSB1Mc3X39RES0
eLdXpI4582EMB3CVbtX+4JQt5my7N5hyrYDoq4JhWLKn3mp1y/
v9yjNFxudN3yvbtvo+UYCcg8Hiin0nla7lQStLWKisg6uGv17kCZBnQ1pqm447qM5mT815unF6ARUG9C8xs
QTEbboMp4neU3leV3mcfAkSILhSEYsnUtwyIkCgy/32ynPGbWzHhT13bBa+yNvlp5NNL68ab/
+sghA1ojZey0ZEgESIqF3Qq0sTXYyxmznafT6ec9h4o2QBgI3OwgQX0uKM9cS1FcZj02fo8MabTrGrDUwpE
AGS4MszwwsQnin/
yjNF9N0Xi5OCVgdXNTC6ehMCBJu1vVDo5cyHqffZcrQpuf3KEDUjTFObezCFg2wbPX0D9MelpcqAHl25TPB
zaNiAYF0Sx62WbfV93gYCpBk+3/K9qgAJWlnCugUdFO2/Age9mWm4NPFrg+pshlPAnAkBMpweFk/
kHk2+1mRrbtsv9mLh372CDAiQp0GA2BpS2o4LU8BM1tUI9udx7VMQokjUxmvZiAiQCBG1C5oHJHhzR7tP24
2SBQA2OgsT334hkceON+EJqw8aj42f57qM/
MPeIPPloswJkPMiQHzcOmNr6Ndg+p5rgIGiAuNyT0KAvFbsuWTh4HdBiHqfvENeh+8wNSPMmVZvgORywdKd
4RDsb8Kgc5wJfu7mp9dxdgkAACAASURBVAqNz+PKDMcXLNvq+8RaERwsLttbrwiQoF46LgGC3xm08E6nTwW
/NmiVaTiz55kQIB8choXslPVHkq/FiZSg78wMTYC8sr0mlACZuv6IM011ep4niDYddq/
S6e+DoqLSYuHLoDmEa5+CEEWiNl7LRkSARIioXdDsioM5+dgczXajnLs1UWyKxahhgtNIMJ1q/
Kpy47Hx89wwbUNFo+/9MwGmqaRi4Zot/
FcaAuQWgwApO3nRmK6B27oGGJjSg9HZ00dERAvAJQsHv2FWu9Ddadne8IXGDRc6k6+bvbmSLnX3Kc+HESCm
gXpYAXLj9ALj8yiMOD43zb+qZNonChAcLC7dU09rSj0BEmRl7RIgKJB+8ere5L/
T6dTNr3WtMhGRYl2bKiaRmCrDef/
H3vZWkjfBREqgAIGVilg8Yb5RcNQtQNCS2sa0DZ4AsRlv2I7r5HnvO3P4tPs+htbpA9pquSBEnaiN17IRES
ARImoX9IaKM76b4PfneHafthslu91gMWqY+Py0xIALC9v/
uvKA8dj4ec6jx0FmOm47NjCn+e3ycBaupy5eTqYORZ10BMjNsKpBpNYk6NabYQUIuiph8KAfu0WjWAlj7Yo
D6yUhitYZHEyZBsH8uG5NjZiKtVFgF1edo/4hq2F9v6ZUNSKi+pZO33m6Yepm52cxCRD8fG/
srk+mXPJg1oVLgODKyk9f2ZP8d1hLbdNxBwmQDw8jBSoTAmQ4Dk6T3jqUfC32Ygn6zmDtSCyeSEcMEiBYY2
LjSRAgNjtm23HVnutIPl7eYLbwZQ6f9sSQvlouCFEnauO1bEQESISI2gW9EVJXODhNisguQNjt5pIhV90V1
07eRERqPcdflrsFCBedYvrIC4Wpu+3YwDz5MD0k+Kb6pZnunPyokJYAeUoVILjSpaddhBUgekEtR3tXopkZ
mh2gWAkjNtHyefHuOnp1Rw1NeutQ0sDABg6mTMfNj92zeL91Hya7Wt26WhdR/
PinLaKi6uwl33F98vF8ZZve/gF6dUdNspM1b3c7CBAUMot319Gq/Z4ACTJywJQ5HVxZ+dG8Xcl/
h7XURvi1rlUmIqJrJ6dvg4sGB+mSzveIeWhNRfK1KJZTFSCvFdcq9U4mwgiQqbleSpjNtMF2XHhtltRdcH5
uXI3RV8sFIepEbbyWjYgAiRBRu6A3H/
GnA2ARa5AAwUZuYeIDEzcQESmzeH9eVuY7Lixu57SflSUNvvdPF7Z+3XykSZmRDNNDAvO5s4GwA6e+/
gGasfEY7a5uoS9oAgStN/
Vi7VtDChA9nYSj9XJCgKBLFhbfhvlb4wATi9n317sHSNWGgT4SRoDgsTK6dfXNTxcmn8PVJF1UMNgVnuMTj
21StsHGjnisKEBqQGC9vquO3oTvUFAdFTqR6eDKyh1zdib/HdZSGwlzjomG14k8EwJkOIPnB1YfTL7W1B/
JtF9creJ4dUdNoADZG0aAwG/
Y8r3mminbcVU2eQYLuwN6Cx1r9LbVjRUEIepEbbyWjYgAySCTJk2icePGKfH+978/9OujdkEXGAoiv/
6s12/
AdqNku01sdBY2BgYGFeHzhyWlvuPC2bKdVYmbHPcsicUTKTrpUtfSQe97MFexD+UI00PiwTXeYCIbCFuEvm
inVwR+4/QC5TU4k56uANFnc5MCpDMhQNAlC7cNY+2KBewL4XOw/
aeNE80hBcgb9sExCitmqyZAboJaD8yF5xVBHcyd5/jIIxtpcHCQ1pSeomON7fSX5QcCBQjOVi/
aWauI+DkBdVT499DBlaPvQKM8m6W2izDnmIh8ojgVxlqA/
G1lefK1r4NADnPtYbyyvUb57TQRRoDgJIrNjMB2XCiOd5wwW/gyKFaw31K2/
HYK72yiNl7LRkSAZJBJkybRhz70IWpsbEzGuXPuH2Ekahe0qcs59huw3SifyU/
YbaIbTtjo7OlTCjFNAw9M7dpbm+jUizfudPoNMPetOGA9tjA9JPSBX9QJK0BQWH1+mipAMJe7VrPe/
NLMcAIEC18xLnT0EJGa8oO2pWGsXTF9C1cGtgYIkOMwQHINAn/nGByjWGJ0AcK1T0Tq6t5HH91o3Gdp/
QXfcV0zKU9ZOcRZdTxWTKFEO+CFO2uTfX9i8eCVpbkOAYLC5lvPbU/
+22ap7SLMOSZKzRpaZzgCZHd1i5Jmls4+8DcHzRbCXHsY8zUBYkoxDCNAJkNRPDaVtb0/gp3cg3qyoMC/
oN0rkHOXumn5vpNJQwpBiAJRG69lIyJAMsikSZPoox/9aNqvj9oFXXzC70mP/
QZsN8oZQ4NCk11oUJxt71YcrUy537iywmk0OMvNAigdfr+k1HpsQd2hiUjp/
JwNhBEguhnB56ap6S44qKk+e0l5bVgBgqIC4/yQAMGiZ+w/
E8baFdOFXoFidluPA8aU6oTwY783rNIxKKwY3Wr1s096xeZ9/V4x7jWT8oz7xEadHB96OE85R4+sO6S8L/
8bBQimwLxWXKuk/
8wOEPEuAYIz21+dtS35b7TU7uzpo5ZL3c73wOM2rYQi35y93Xo8QQxHgIS5toO4d1lZ8rW2fji2aw9j3rZq
xY5cNzcgUr+rthooLIq3uczZjutggydA8i0WvgwKVXQb1PfJjU/jb5odEQVhLIjaeC0bEQGSQSZNmkT/
+I//SO9617voqquuoh/96EdUXx/
edSdqFzQ2BOTA3gS2G+WMoUEhFnCHjfqWTso96A14f2VoQIbCpuxkwmkFZ7nTaXjGmFKvOFaE6CFx1wLP9S
cbCCNA9PPw2SdVAYKpeieaVQGCM9OuQRqmfWCcGxqkopsUDq6fDGHtioXgeJ0ECRCczXUNAl0CBIUVo6c2o
oMVugF9cKgmSsc0MfCBiRuUwSsWEuOxogDBIuAFO2po+V5PgASJeKzJ0cH9YgoeWmpzb6EgEcKv/
eNStwDhJpfpfO/
GWoD8ASY9bGYMtmsP4+UiVYD0DdWyIShABgwCZfyqcmWftpUw23GVnfR6e2yoaHR+bhQg+r3C9F42QS4IY0
HUxmvZiAiQDJKbm0srVqyg8vJyysvLoxtuuIH+8z//
k9rbzQ2Zuru7qa2tLRkNDQ2RuqDRMYUDexPYbpTT8xKDQlO/gqA42timFH7f/
dpe33HhfkuHVkBwRnZGGg3PmJ9D3wI9bAWZyB1zvaLbsSSsDXCYInT9POgFv2iBfFxzweLZy6BBGqZ9YLCt
76x8T0RMXOu5Bk0N4ayEnZ1fLgIBctQtQEy1Fqbz4pqdn2owJcBUqVg8h66f4hWbd/
d59U3vezDXuE89hYu3RXE1Qyt+539/BwQIfr5XttcodVRB3yE8j67zhrUZaKkd9m/
A2/0pQID88KVd1uMJYqwFyD1v7E++1rYSaLv2MOZurVLSV3v6BqjiVCt9c/
b2pFkHChDTCom+T5t1su24Suq89MAg23JMAdTvFab3+tDDIkCE6CACZPiIABlBLl68SP/0T/
9E8+fPNz5vKlqP0gW935Brjr0JbDdKnpVGO86wUVJ3gdYd8Aa0P1uwx3dc6LLDKViYfpJOx2VGz+fGWBqih
wTmvI8VXLsTphYmHQFyw9TNymtw4Hq0Ub12TQLkvRPWJ5/
nNJBH11kESFtCgOCAGusbJodwVsJBHQrVLUfdKSIHYDYXP+/
AwKByDK7ZeUwXY9CpKBbPoWsnewIEDRbwPCH5hmZ1V0/
ItTZrRGet776Y6OPT1z9Af1zqzbzP1wQITyLYQAGip/
Jgh2tcLbtvhV+ABNUJ8HYmNzwE+42kCtaPpYrpmrVRWn+B7l9xILmqx+CqK6Y/
ufZrev7FQlWAdPf103WPq/bEmL5nWiHR9/
ngmoO+bfTtEJy0CjLtwFQ9bPpp+6wfsKwICsJYIAJk+IgAGWGuu+46Gj9+vPG5qK+AmAZg2JvAdqPkWWm9k
VuY2F55Tunp8b+v+AVIteI1nyhCxxnyoMGTi+/PKbYeW5gmdrcauoRnkv6BQbp3eZm1OJSIfEXiLtIRIJ/
WBAg2CTx0ulV5rUmAvP+hxMz+pLcO0Wef3EKtl3utA6/
G1oQAmZ7niQh0DXpkXbCzEnaaxnqQIAFiKvYm8q9guAQIvjej21ujhe7lHk+AXDXe/
DcxNQj9rwfWKxbDuBqCooYFCLqa8fZL93gCJKhpIO5fT+XB84bXyr0gIvixbZVuIwDTa038cuG+tL93oyVA
+Pn/W6SmleKx6ylQQYNyjBcKTyi9m7p6+
+m9E9TvNwqQ3hACxHZt245rN6TtBqWsYg1SXUtH4Gfl3w1BiAIiQIaPCJAR5NKlS/Qv//
Iv9Oyzz4baPmoXtCkF5TroTWC7UbLfv35TCRN5hxqVZlw/
nrfbd1w4c7ZvyAUL02zC1AXYuA1WMPSwWVIiw+lHEIY8GGDY0G1yXaQjQD41RRUgWJ9RcSpYgHAqBf//
5aJqJa0K40zrZSJSU5nQaezhEM5KD8O+cWVg8xG3ACmp86cgEpHSsC8Wd6cH6cXgRH4Bgm5XYfohvAUrhBz
vHp+jdPRGgYFudCxA/
rpSdXt7uaialoAACWoaiAJEn0nH84YNAnEwy49xapAN3u7e5W4BgmlMppl9FyhAgppT2o4v6G+G234R+r4Q
Ef0C0j7/DAXptv3iihbG8wWqALnc0+/r0I4CpKcvWID8/FV/
Cqy+HVJc5dUnBU3YoMmD3nPH9F5XTxABIkSHqI3XshERIBnkvvvuo61bt1JtbS0VFxfTrbfeSv/6r/
9KZ8+6Z/mYqF3QWEzKgbO1thsl+/
3XGDpJB8Wa0lPKAO+HL+3yHRfavrIN75PgNoSzt2vLTtHXn93m609hA1179Fi0yy5ANlQ0UsWpVvr4Y5sCB
yLDAc+NjZtGWIB8UkvrwILnA0OmAIxJgHzkkY3Kfudtq1ZsfjFOXUwIEEzR+hOkDnGKSM25DmvfgfGrvH0/
t8UTS5sCXHr2GmqgiEixq+VBow1c2WH0FKoPQ3HtpRACRBdAHJhCha5wmAr5vSEBYrKbxvMa1DQQBYg+k46
z4B99dGPy32yliwPo4oBeEbzdX5YfcG6HTlKXulOza0UBYirMDnN8QX8z3PZmTYBg+thvXrebYHQMfS40Ks
B4bkulMkHR0d1H73vQLkBMdWL6Pr8/
pzjwcyPbKz0BsmhnrfPc4f0F60H0ffJj73nAnJIoCGNB1MZr2YgIkAzygx/8gN71rnfR3/3d39F//Md/
0A9+8AOqqnI39EKidkGb+iDw4JHILkB4UGhq5BYUi3fXKQO8O+bu9B0X5pjvqUkIEHRRwsJkfuwuQy2JiS8
+XWg9toWWGyrO5LG7j2sgMhwwPc1GKk3Z0hEgel45iodSrbu4SYCwiOX/
z99eo9RUYDRcSAhHXCH5Hcx2j191UNnX4dP+7w6mbKHLUJAA2W1wgSNSa15icXd6EB43s0kTIFhc2x6iIRu
6VWGgjS66VOH3kAXIvcvtM+2xeHDTQEy76+7rp8bWLuofGFRsWPmz8b9/
uzhhqY29TriRqA3e7v4VbgGCf+Mw9r4ICpBUV09M5y5oW3QSJCL6yfzdyed+Bi56phgcHKTWy73W5/
F6u9TdR+9/
aHgCBPs+2bZD0CDhle01znOHLnOYjqXvkx+zpSQKwlgQtfFaNiICJEJE7YI2CQgcLNlugmy3WWkQMEExb1u
1MsDiAROCTiu7qxMDGMy1n2IQIN817McEFs3qYau70GsCggYiwwHTb2zc/
PTIChBMqyEiJW2Ea3IY04oSuz7hQCX+pjn3nVeucBUDZ4n/
trJc2ZfJqQxn+zFVb+Mht00oppPg58VUp1jcnR6E4ozBNJlYXC2u1QeXOCM/ODhIb5efVq51jBVaHw/
+N6ZSJgWII9UnFg9uGqj0Uxm6/n/6yh6f7TLOwHPtAzp98QSCDd4OHbRMoADhVbOwoAAxpSWFOb4w33t+/
iZwEiQi+p+XPeMLdPMyRXdfPzWFtDdv6+qlD0xUJ0RQgFzuCRYgaDpi2y734Jlkvx78LXypyD35htelbnlt
ey9BiApRG69lIyJAIkTULuhaQwrVfz/
kDZZsNz52u9FntcLErPxKpRgW+xYwODO9a0iAYK49OiO59mPi+in51mNbsMM8o4eCaKRvlmh5a+OLIyxAPq
GlmWERLafEMSYBwoMa/v+rO2p8NQkc9S0JAXI/iAh8v/
tWHKBeaN5nKnzFwTY2BswLECA7DP02iEgp9o7F3QJE70hOpNbxxOKJQfrg4CBd6Oih1k5VgGB6k/
46PVaWeKlZWLSPqWScUuOqNYjF1aaBJtBx68fzvBl8fcUL+8zc/
VpCgGChvX696PB2LDRt4PWjN8MMAv+eYe2r9eML873n52/UBAhad3/nhR3Ov0tbV6/
xd9kUrZd76YOaAMHfTlNncX0fH7b03tC3+
+qsbUSkphfaeogwuFqmr5zZ3ksQokLUxmvZiAiQCBG1C9rkYoWFgLYbH+fEY61G2Jiae0SZYb7tue2+48KB
IadwYKHxo+v8AuS258MJkI9Bzroe8y0pBaZi/ZG6WWKTRhu3pODElY4A0etc/
hdy2FkQMl8zCJDPTytQ9rtwZ62xJiEWz6Hacx1EpA6YsVfLvcvKqAW6KJsECNY2YL1KUKO0IkO/
DSJS6iticXd9Aq7ccIGzLiTeO2E9TVxbQVeNz/GtuuCA2NaskQNTsHCVBNNiWICgBa8psGmgCRQgOIA2/
b3x70ak1rnoK2Y6vF1QF2wUqKY0PBcoQEyrAmGOL8z3np//
3DR1VeF70ETRdf5i8Rw6295trM0zxcXOHiUFjkgVIB2GWhl9H1eNNxfm2z43Xtuz8t024JhKW6Y5LtreSxC
iQtTGa9mICJAIEbUL2tTH47+gENB24+PO0LaBuSsmrq1QUiK+MXub77gKoZN0cVWiiPWhNZ4AQWtWfuxbBi
FjAlMW9Ji3rdr4GryRjvTNckNFsAtWKlbA6QgQFGlEau8U/nswpgEV58Dz/1/
fVWetSagZEiBY94GC5w9LShUHHVOa3O+h0zQ2PNxQccZ5bgqP+VPriNT0o1jcLUAwNYjTqfBvyIM8HsS/
ukPdN85SY08RU6BwnwArL/h+LEDwnJgiqOYCBQjO2n/
L4SLHdViYZrZfqxnS4e2CBBE6o3Ed0oIdNYEik0gVIKZVARs2N6qgz6ILkG/
D+bvZUYMWiydqokz20Ka40NFD1zgESHtXr/UYMUxF/
bbPjRMkQf2Y0OZdX0W2vZcgRIWojdeyEREgESJqF3RjqznXmGfEbDc+Lja1Dcxd8ZflBxQLUV7aR3CZn52P
MNUFC2j5sW/ODidA0Ddfj5eLzAJEn70byZslFjDbHHu+NHNkBchHHlEFyJ0wA67bqn79Wb8AuXXGVmW/
i3fXKasUGFVD6TTYrA0Fzz1v7FcGZM9t8c+63rPYEy+Yqpd70C1A9IaB/HnRASoWVxvs6eDMPBc4m/
p4cP8ZLB7XB4m22g+OhfC9wRUltLW+Y07C1AFta00R1PgPhdI3Z3ui49uOFKKfzE9YaqMtsO6apsPbsdlAT
98AvbqjJnldMChgd1a1KKuvQeDvTVgHrYGBQWXlh8NVKM3bfPZJVYCgaOMmn2ifq38fTLVJpmi51E3XTLIL
kLaQAoStsIO2I1JTRIN6yeD3Vnecs72XIESFqI3XshERIBEiahf02fZu442GB1K2G98vFyZyvW0Dc1Nwsep
vF5cog5svz/S7sOAAjge8WMSMBbT8mGklxYTrGOduNRdVmjrGj9TNEntI2ApmMQ8/
iHQEyIe1QQ2mkBQdVy2nvzHbL0BYVPL/l+yppz9YZuRPNCcGmne/
5qVdoeD5zeslykqFqX8FihdM1QsSIKaO40SkdFOPxd2rBTgzz38vnCXm4FUE7FMSi+dQa6c3SETxZApcmcE
VI+zvwa5yKMpMcc/i/
c5zg2loeL3htWCKR9YdUoqoyxvCCRCuScHzg2CKXuGxZtpWeda4nQkUIKZBuYn6FnOTVVv3evwsn3lii/
LdRZHO9VX4HcM4dLrVKIxNce5St++7igKk9XI4AXK8qT3UdkSqS9/kACtn/
N3cWdXi25fpvQQhKkRtvJaNiACJEFG7oHGmEqO7L5Enbbvxca63bWBuCq4r+Okre5SB1C1Ds+XIOnCC4k7K
WIT60Bq/APmaYSXFhOsYXyw0CxBTw7qRulmiy4wtXx0Lv4NIR4Dos6q3P+/Nehcca1ZeaxIgvBrF/
1+2t14ZMGNUDg1+sFcCDnJ/
tXCf4gxmStXBonV0pVofIEBMRd9ERC8UqiLBJUCwAJ7rOdYbBAifwxmbjiuPs7sQEVm7xXPg6gl+Zvw+sQD
57WJ7v4lY3CsYt4GrLZg2dKdhVUAPFHBhV0DY2huvAwRX0DYdblLqxIJAAYKCz4WtENzVrVvflm29UcBx0T
g2+8TYX3+Bcsr9148pmtu7fKuVu1CAaJ/
VllJm+huZtiMiWl3qGSEEWTnj76Zu+GB7L0GIClEbr2UjIkAiRNQuaN2Rh4PzpG03vv99JZHrvc/
QyM0W3EH8jjk7lRQX3TOfSL3J8Yw7zjSjgw8/ZvOz13Edo83VxdSw7t0j5FmPs/
2mHG4ite4iiHQECBa2XuzsUaxXtxxVe2uYBMjtQ4YA/P/l+05aB8THGhMCBNOuUPDc/dpeJYf/njf8M/
fYaXr8Km+lLKfcLUBMqVJEpDQzjMXdKVg4MObvjUmA3DaUhvNE7lHl8bPtXk+Lhy3d4jlQGGFvCVw1uHNIg
OCqkOs7bAMFyOeneY0v8e9kC1zJ0fvG6PB2PKmAjlsIrqBtPNSofE+CupujALkAgs+FTYCwS+Dg4GByokb/
LPr1hKYR/
H28GXr5YOysalHczlzR3Nal1GsdOHlRsYC+2Kl+1r5+c4PD3dX+Xi22z4LHFuSkhvcH3fDB9l6CEBWiNl7L
RkSARIioXdB6V2YOHvjabnz/83Kiezl6zgcF34S//uw2ernIEyC6ZSWR2ol665AAwZnmB0ZZgJga1o2UA
MEbtW22FlM6gkhHgHzQUaivN/fD+gCO771YrMy2rixpsA6IjzYmvguYb4/7/
NmCPcoA2zRwvguau+FK2boDp53nxiQUiIhm5asCxGXDiwNjri8wzWCzUMOO77F4DjW1ddGBkxfp01M3K13F
TfEs9P7A84XNF1mA/N+ifc59/
eAlfwNQBFOwPj3Vm61H4WMLXMlxFaHjNfLwUFol9slAsKgeTQpi8RzqD+hujgIkbBNDmwB534OJFZBH1x2m
9z+USyeavfQl0/ZElJx8wbC5YRUea/bZQNuisbVLsczW47wmtrp6+43b6WmVrs+CTmxB1sk4cVMAglH/
7dTfQxCiQNTGa9mICJAIEbULGv36MXjmzHZj4zQPPa/XFTyovPmpQiVFQy/
YJCIlp71wKOUHbUUxDYcf+9JMfyqXzsCAOQWBY/
Zms62k6XOOVNfe7ZVeqoJtsISrDkGkI0BcTmF6bw2TAPnBSzuVbtir9jfQrxaaB8RsqYpOS5hi9r+v7FHsa
U39XnBAiitlQQIEU/
3wHM2AZoaxuLsTOqaWcX2B3sgwFvcGnOjmFovn0OmLl5OFyUGBx3UbFDbj4yxAfmk53xxBjTvRBQsbUwZ18
o7F1W7dJXV2AYLfR07n4WJ9/
Xp1FdXrKxE6uJqDK04uaiwChGtA+P9c9I+P6dcTpknh+Tdtv6GiUelC74ozrZfp2sl2AaL/
fnT2mCecTA079W049Qx7OLmEOZE6cYP1Vui0qL+XIESFqI3XshERIBEiahc0diw23biCBi/
FhkZutuAZ2+un5NOLhZ4A+fTUzb7jwhlLrjnAgR7OvPFjtxpqSXRsN2AOm6+96XPqN9FMgcW1zW1dxm1w0B
/EVeODb+7vHq9+tv9+yC5A9MJukwD54Uu7qKfPS/
dYU3qK7n7NPCA+dLqViFSnIHT5+vG83YoBgalmCNN2MCXqrQABggW1eI6wlwjv0wYWe1/
s7PHVj3BwHQDa9sbiOcqAOyiwySKmxWFTQhYgWNRviiDXOKwrwQG07e+IgSLL1QcEU4JYgKDLlu086xFkrY
umF7bvlI5NgPD3nv+PXe5N2xOZnffwmsVYW3ZKWSF2xamLlxVxqMc5TYC0dZlTbk1CXd/
mE49tIiKixbu91Zk/LLF/L4jUehSst9IL+fXzJQhRIGrjtWxEBEiEiNoF3W9ZEeCbtO3Gxk3/
cLAcFJwmc82kPCWl5trJm3zHhYOfgqMJAYIDkL+u9HLy+bEvPl0Y+HltRfccMzcdN77O1DH7PSMkQDAF6/
RFvz0mkTpYDyKMAGGHMg79/xh6XYWpL8Sdc3cq6R5ry04pzQUxKk4lBAiuemDR8w9f2qWk310/Jd93/
Ji2g6k6a8tOOc8N1hrhOdLTpP7oECC/
ed1LLXNdXyyqgjqUuwJXgm6c7tVlYF0Jp1b9wnK+OUzuc81tXXTkTOK3CWfhcUUsKLUrFld7lLg6oeMECAu
Q2yzXNp5nPYKcrfD3pGmYAoSPC//
vsi23TfLYVqiW7ztJc4ZWiHE1zxQNFzrpusftAkRf7blguT5NzT31bXilGieH2I7dBtoJozPc1Q+qhfz6uR
WEKBC18Vo2IgIkQkTtgra5opy+eNn6XCyeqOMgIqUDc1DYipA/
PCnPd1zo9rP5SKLmAGsIsCiYHzMVs+uYGi9izLAIEJPQctlxDgcsrj15vtO4zW3Pm2eJTYQRINdolqBXOwS
IvqpgEiB3zN2p1BetO3BaqdPAONiQECDYXBGLnu+Yu1Ops/jooxt9x4/1EChUgwTIm4ZiXyJSnLRica/
xpglMLTt3yWxrHYt7NVBB/TlcgcIIXZSw+SILkKBUqS8Yvi/
8XH1Lp2IUgTP4Qe5asXiO0h1+T41dgKBIfXRdwtLVVt/kKqoPKizHz2LqeWECm1/
qMTg4qNRJce2PaVubKLV1ql+0qy45QYP1TKY4eb6TPukQIM3tqtiyg1s+9AAAIABJREFU2a4v2lVnvRY4WL
DiahLbsdvAlWPsH/
I+ESBCFhC18Vo2IgIkQkTxgr5qvPnGZnNMicW9gu8CQydpW9hm8zCFgcEVkvyhomcc6GFnateASudEs31QE
YurnX1nbDpON00voAsdPUahdfUEux3ncEAbXu4SrnN7CgIkTA2InsZha5IWi/sH9bcZBMj35xQr3bBzys/
4Coc52AL0C+AKhEW7332xWBEV1xgEK9r24gz9mlK3AMGCWjxHeprU7wzOWwyuNDS3mxt7xuLeqk5QbYYrsL
YCC9ax6JsFSFCx+GeeUGuvcDV085EmXzNGjqAO67G4mmZmclhiMCXysaGeErYeN66Vl6C6DkxpOmVZVdRx/
Vb09Q8oaYqumrmT5839RDCtEGPetmqaPWQ2gI5upqhv6aTrp9gFiL7ag/
1Z9PfU0bdhZztcGfvZAreTGq4c42ojO4mZ3ksQokIUx2vZhgiQCBHFC9qUn1x7rsPqmBKLe3n42DQvKPRZZ
Q7TSgK6ELHrEua0Y1EwP2Zy09KpONXqPMbpeV5nX37s6Y3HjEJLTyNIh/
auXrprwR5aWdKQfAybkKHDDmLLkzcRJECONbbT+x9SBcd7HrB3i1+1v0F5vUmAfO/FYiXdI/
fgGWvOe9mQAPnsk57owEHV7c/vUAafHzQIVjwfWKOwurTBty2ybK+/
WJyIfGlSJutfBvtW2AZ4sXgO3TSUMvVTixALEw9AahMOgDHl6YcvJRzqTF28Ma57XE1lw2MvqTsfug7BFDh
zv8shQHCVjJva4UoY4hJuja3utKo5YHphW1XUOd7Ubn2/
nr4B5TvCAsi07dHGNuPjtqaTzxecSLqaTVh90GlQUHuuQ3EoCzovthVgk/
ufvs13hswf8Lr4yfzdznOIK8f4XdO/w/
r3TxCiQBTHa9mGCJAIEcULWh98xuKJ7tQdFoveWNxbbdhk6CRti4fXVlhn1nUf/
6fB1YcdWjClBIuC+bHPTwsWIEF9S57c4BcgT+QeNXYm1tMI0gE/J4NuMWxRq/
OdDAkQ0yzv1RNyldfogWKJSE0Hw8EKpiNtqDhD//
OyuX8E27RiShE6+3zrue2K+DQ1gsNjwFoTXSzpmNyqiPyOS65cdxRWpx0pfpxWhvUqqQYO7NE4AFcc2CIbR
ZkpPvKImspWdvJi8rl9teeVNMhU4/4V3nEWV52znjtcJeMO99gfA3EVvzdccIsKNAaobwknQGzCIRbP8dmX
c62WaduSOnOzVjQUwJix8VjS1Wzi2go60WwXQjXnOowWvxx6upne3Z1Xv2fAyi+j74vr/
lDMsdi1gfVsWDtyzcPqKqb+/
ROEKBDF8Vq2IQIkQkTxgjb1fKg41aoMDvTggsQNFf5O0raYuLbC2uegt39AOSYsqmXbV5w5/
qNBgJjsfHXQ4tYUT+T6BcjU3COKKODIhABBtyAGRR0XaOughWcQLgFiGoC/
54H1xrQ8juV71YLV2w0C5Pbnd1AzzKjnHjxDP3jJPCPPNq0oOvA6+cRjm5S6AFPqGzpxYarXmyVuAfK6od8
CkX+2/
Tevl1idlrAzeMMFc7oNX5+xuNrlPdW411LAfu9y73EWIKYGkRh6Ggx+l3dVtyhW2akGplsWn7ALkIud3irZ
1CEBgvU/
iKuovq7FnKrIYEpnrSWtUefQaftqqZ5qx6LGtK3egI9Db3aJ54FdzbgwX+9Lw1F19pJTgOgmFnphPf/2s/
hDdGe8bz233Xcuvz/HbeWM9WyY0qfX/
enfP0GIAlEcr2UbIkAiRBQvaL0AORZPzFq6BiCfnrrZlycfFBPXVljTCfTBHRbVbqhICBDMaceiYH5Mz2k3
EbRiMxVuxMnHco8o3YU5MpGChWlpDNpVcn2Ejq1XgglXEbpJgFw1Psc3+MBYuqde2YdJgNz2/A5lNSCn/
Iw1JWjfkEsSFr5f87D/muQwuY9hUzdckVhucPdBcFYWz5GtYN5UrIuCwpbvH4vnJK99U9F+2LDVX2CR/o/
mJQQIWhmbQreRxuLi7ZXnFKvsVAOF0g6HAMEC7am5ie8eDqgRm4taLJ4YiLuYDQ0cqwO2ZVzpmnqTQn5/07
YbKvxNKWPxHGuNzcNrK5ITMFwXgw0oMU40X1JSF/XQ61301RRuYjhxqAkkok9CfGP2Nt+5/
I6hJw+Cqau4CqUbSejfP0GIAlEcr2UbIkAiRBQv6I8ZViVsN00Ol/
WjLR5aU0FfBHtVjNbLno3mpe4+pfhyQ0XC9vVH87zUFSwK5sduMPQT0XnL0HgO4/Gcw779Tl1/
xLjSk4kidJMAwXNv6yJ9x5ydvtcxXb39ivtNqgIkKBbvVgfhJgHyree2K4Pxt8tPW2f+99Sc99UbufqQmDr
QY+Eypjgt21vv2xbBQTeeI1u6mOkc4ueva+mwvo5TzPBYUw2bAxU+zgIEi/
ptgR3EcdWx8FiztZ9JmMBeLNsr7QIEXZlY/
GMqHmIThbF4Dh1vMtdKMbiCcKI5nAA5AClpeuirI8caE+9v2nalwWktFs9Rmq3aglcmbKsllU3t9LlpdgGi
17voaWUs9kwdzfU0zK/
NSggQrk+Jxc1NQRE01MDXfUwEiJAFRHG8lm2IAIkQUbygTakvpuJcDJNoCYoH1xy0zv5ywyxTo0BufIcpPP
cs9guQT00JFiAm1yMMnnHE/
U5df0TxsMd4YPVB6up1d2F2YUrBwvey9VDA1QQdHlRwWopLgGBTsbChrwKYag2+OXu7Mhhfd+C0UreCsbu6
RUnXisXdLlyxuL9mCAuX8dws2eMWIK8YOk4TkbM5oA6mf7l6R7Bd6s0WER4mbIXY+DgLEFdqDsflHu/
axbSpp/KO0YxNx9M+TrSY3VZ51nr+8e/Og210ZENcxfuHT7t/T1FcVQaIFWZ/
vbl2g7+X+H9OlTRt+1qxf5UtFs8xNsHUg1NCMe0J43hTu5KypocuQPRVHf7emPrc6EYU7Hw4A+rWuC7EBpq
UYLNMESBCNhDF8Vq2IQIkQkTxgkYfeZ41DSpAdaXI2OLBNQeVfHkMdmspNdz0ufEdzvr/
5vUSah9qPsaPmRrU6Sw0pNxgcC8C3O+U9Ucop9y+IvRiYZXyHkfOtNHOKrvzD2ISIPhetv3c6RAg/
Pgr22uIKPMC5LXiWmUfJgHy9We3KX0U3jpw2rhSwp+xUnMcctWgxOIJG1QEB/
VYH6Ov1uiY0mCIzM5etnOIDRRd1q0s9F0pM0FhS0NCg4Yfz0s4E4VZpcSVxz9Z+lKkE5gqtvW4XYA0tnoCh
FcfcXIDcdkKcy8ZE7O19KWg1RKmpM5uWKHbcpfWX7D2TbKtJIVxEGRXPts+jja2Jd3VTKEX3Jc3qKs6LJ5/
vchvsqC7I35p5lZfjRPXhdjA2rnHc7y0Wt0A4d0hehUJwmgTxfFatiECJEJE8YJGG0eepcbZKlOYnLOCYsL
qg9bmaDxTZ7rpv12eaHxnSuHB1QLdVtREUGEtF30SeQP5ayfnOwWZnj/
Nj4dpeGYSINiwy5a+gqtBOvz4gh0jI0B4v0QJC1/
TNl+btU0RFWvLTllXv4qrzgW6k+nR3aeuOmG6EQodU80GYvq7EqmiwvQ8gqsvupDC+PhQvr2rcVxQ2Abh+D
ivgNgMHzCwf8YfQvT3CBvYt6XwWLP1/KMtLNvwYk0a4hIgtlRFIv+qhM1ZTmdPjf2a1FdE99aet/
ZNsv2W7qpuCTyP3JfIVo9z5EybM9VOL87XV3V4UucuQz8PfRXylhlbldW+WDwhYFxg7Rz2qtF7+YTpVSQIo
00Ux2vZhgiQCBHFCxpnZNlpxtazg8PVJ8IWD6w+aO0CzYWhuw035XVDnbdNM+08qIvFEzPMQdjcZDgeBjER
9nOhAMFaBlsBOWKqAcE6FdvgDescdPjxV0MIEJMLVFBg0zLbNl95pkjJN19TesrqyrTjxDmjzbEr9LQ3TEN
BoaOv1uiYBnZEZK1VisUTqxwogNA21ibIYnEvvTGd9EUOm4UvClJ2wfqAwd1ODyxS/
t0wOrTrgU1DCxwCBOuEOP0RXfmIKPm3tvWRicXtqYqmazQoXYvZWWUXCHpdR3HVOeruM/
dNsvX70FcjTDFz03Eisk+cHDrdqlx/
euiOX3rqGDvGcfNK5H0PqgLElDr49We3Oc8hGmqMX+X91uk2vCh2BCEqRHG8lm2IAIkQUbygb4Ql/PuG/
PvDdDtONcavOqj0B8DgIs7iKr9N7ltDAsTUbwIb1n3iMVWAdHT3KTnQ+s3XFBPTECAPrfFegyklYWZaTQIE
c8M3H2kyvg4L8nX48QfXHKSZWh6/
TjoC5OWiaqpsaldSrPT48swipVB3dWmD4lSFsf7gGaVLcpjo6FZd07DeAd8HV2tMmHLriciZVx+LJ+pMGNz
2yBl77wie2TfZXocNW20Krg5ybwZTg1E9amCAiqsWww1c6Sw4ahcg2JeC0x9x4Mu22c8XnHAaA7hSHvVtbd
bWOsUn7Jbdeirn1uNnjfVrsXiOssrJcfWDuc5rhePZzZVEZF6p48/iqinSHb/
0VRdu8GkqJteNIG6aXuArTP/
qLLcAQfMOrDHSGxHi31wQokIUx2vZhgiQCBHFCxpvYFPWH6FYXO2lkKkYv+ogPbzWfzPGQYGpT8faslNERL
7l/
1hczafXCxt5dYRdb1wzhRwPrjmYfH3Yz4UCBGf9XXnpDAqQhgud9I3Z25Rzzz1QdHA2eGBALch2HatOOgIE
i1Bt8aWZW+lggydAVu1vcLo/
Ba246dHW1at8DkwjxPeZv90tQPT6AD5Hru7S+rlE8eOybv3QUN1UGGFgC1tzQVxdunPuTms9gh4s/
ImIfvO62WErncB0KZuIJlL7UjyyLpH+iOcHHZ5cDRxdTlv6tmG+l0RqF2899JWzzUeaqL3L3DcJHf04Pjwp
z9lpnYM7lNssew82tNItM+x2y7o98Q5NVHHdj0lI6Cton59W4EvL4sJ0IqLuvn76yfzd9ELhCRocHKQNFWe
Uruk4qaX3oEGxIwhRIYrjtWxDBEiEiOIFjYMaLnY0rTYMN8avKlfcaDBKh3K4Tak4LEBMM+iY/
6wXNvLjnDIUxv70gdXDEyCYtlFSZ08LYXDgjasaHOuHHMB0cICnN3F0HavOojQESJj+L7fM2Kp01l5Z0hDY
lyKVuNjZo3wOrKvAmgxMFzNhSskjUp2Ygs4lvjeKLj3CpEQFRZgeInfM2WlNB9IDVwN4NjwTgSYJ+YftAqQ
KVtG4/
goLklHc2QwsYnF3nYm+bZjUSCLyFZpjPK2J8A0VjT4nNw6c+ee4fkq+07CAgw0u5hvc2mLxRBrXrQ4BolsO
65+JxdHNTxf6Pr++UvfZJ7f4av++PNMTIJiWZnIN/PUiT+C+/
yHVwvxDYGqiT6gIwlgRxfFatiECJEJE8YK++zVv4LF0yJs+zGpBqhF/
s9w44xyLJ3pBEJHxxrWmNCFATAICB7W27rpztlb5Pqctxq8q970+KHDVBI8/jBMWpmeYZt05/
UwHBYheD+E6Vp10BIhpQKXHF58uVAwFVuw76ZypTTVaLnUrnwOtpDFeKlIdyprbuxTnJz1Fjc9RmDoN5hNQ
h+TqHaHn1KcTruJ4ju+9WEyXe8IJEO5CT+Tv/
j6cQMvlTQ4Bgo3xuP4K94MCxNbIMhZ3r7Lo25ZaCtYvdvbQ9LyjyVUD7GGhx6PrDiv/
X7a33tq801T3duP0Al8zQ9f1a7KLjsVzqOzkRaewP9GsOn7pn4nrU0xNXD+kOR1+5oktPlHypZlbk9vjaqq
p7gXT8vQmrmg80NM3oB+KIIwJURyvZRsiQCJEFC9orMvgnF0cVIWJX7y6N3Bm/
G8ry62pBMVD3ZJNtQCrSxuIyNzZGVdF9MJGfpzTGGzpXxjxN4cnQLC5mMt+lEEBYirsZ/
Glg2laehd517HqmDqBB0UYu9abnypUXISW7zs5rP4XeqB7ExEpZgQYaJHcermX3j0+4ULFfUT0mWw+Rx+eF
GwzzXzkEU+smGykOYaTesXhmu3m+O6LxdTRba5H0ANF8t2v2TuNDyc2WtIIiUhJQ5poECA3gCh39WaxpSqa
vg8ouhB2AeNUTrSQjcUTq5E8UI6/
qf7WuRy6fmGwTv7KM0VKAb4teAXP1DCTrzfXyq7e82ST9pk4nfL9D+XSJa2uSrda//
TUzb7HbpnhCRD87eNUXgys4dGbuKJjG/amEYSxJIrjtWxDBEiEiOIFjf7sXKQY1AhOj9+9sZ+a280pCBx/
XXnA2nm74FgzDQwMJldgMN4sSQgQ0ww6pop9yCJAuJDTlv6lH6P+
+qCYAGlb6NfvSj1hgmofVg59dh1sytau1UO49qcT1BfF9rcO2uam6QVKOtryvSed/
Qo4bLPIejS1dSmfA0UABotPIjX//UJHIoXLZJFK5J/9dZ1L3Lakzi5AMhFhupt/
+4Ud1noEPVAk2yyyhxsbKuziAAuxOZURX4td0U023By2VEXT98GWGonXEJFqIRuLJ9LVeKCsWxa7Uva4dgU
LuG97fodiQWwLNlGwNTMsqXMLEKzxISLaUKGuMK8tO5Vc7X6h8ISS2qiLjU8+nu/7nmHqFjavNX2vsD/
Pex5YrxwXTiDov2eCMFZEcbyWbYgAiRBRvKDRCajMkULiij8sKaWz7d3Obf668oCz++/
XZm2jBYaZPh6Em9LCcFb0A5qzCj8+Y8jKcqphVk6P+1YMT4DgzJ9rUMQECZBle82dvHGwqNdDuPank44ACV
OsfOP0AmXAv3RPfaCzVCyeE6p7dyyeQ6cvqj1WbI0xn9tSmdwGc9S5DsAkSon8DkCuc4mpVWGc1oYTWJRti
9ue30FtIQUIpke5Oo0PJzZU2L8H6JTGK4n4WnS5+46lAD8Wt6cqmr4PNsterG8g8g/
WD59uSw6UsZ4hKLgvDe7/
zrk7Fcc8Dl1MLNxZS0T2lcqSuvPOtDzdiQ97DMXiCYtzPS2WV0L0dKtrJ+f7Vhpvfqowue8V+04mH38m35/
aiEYJV41Xf4swhVL/
PROEsSKK47VsQwRIhIjiBY3N6MJYQ5riz8vKqOVSsADRZxX1MC3dr9h3kohUu2AOdMbRCxv5ce4mPPltb6X
HlmJz7/
Iy3+uDAgXIX1d66Wy29CkkSIDYOnljR2y9HsK1Px3bzKorwtQKfG7aFiqCgtcle+pDdQB35fljoL0ykb3nB
a9+ERE9leelW/
GA1SRKiYiuDlGvwWCfFWy2NhIRxp3rtue2U2tnOAGSU+6JA1ca0XAi1yHE0TWMv0f4WizwtzmAxeJemqYJf
dvd1ebaLL1fznqtHu1oY1typSNMPRkHiwqsc7hrwR7jhM2vF5UoZhSvDzXStNVq7a09b7W3jsUTv+eIPgGU
U37GV19S3nDR+J36xGObfCs9n5u2hf73lT00cW0FvQkC/1lDrR+uYL/
bIUD09EpBGCuiOF7LNkSARIgoXtA55d6NtsrR28EV9y4vo/
MdPc5t7l9xgAqO2Qs7Y3HzAG75kAAxzf7ioOl9D5oFyBO5CQHChaPTNhy1DuTuXZa6AEHnLMyj5+N2ESRAe
AZUB1dAmtvVdCTX/nTSESCmnHY9PvvkFmcRr/U6WlYWaju9w7OtwPuZ/
OPJbTB1jFOzUJTiOdL7HdjOpa379UjFdSG6qH9z9na6EPBd5GCHOSJ3o7/
hhGslEIv2HzAIEPy8tzuc+VY4vmv6tlz3UnismSa/fZj6hlzk9L/
tugPqasHxpvakILorhXQ1njjBQfavF5UYfy9/u7hE+U1bsiexAoqTRBh7as7T15+1CxC96eKq/
WqN3fqDZ3z1JWVDq4O649XHHt2oCEI9sH7PtAKi/
35zHRaRauTQ2Kr+ngnCWBHF8Vq2IQIkQkTxgsZiYWwMlkrcv+JA4KBnyvojTmvLWDxHWUHgWL43Mbgwpefg
YFh3VsH3JaKkuHkq75g11edPS0t9rw8KFCBfnumlUPDspYsgAfKKpY8FpsvoN2zX/
nTSESBhesR85oktviLeMBF2BUFvsGYr8J6x8VhyG+wjw7U+upsRn6Og9+cZXFvzuZGKMO5cX392
W+BqJAeu0rka/YU5H7bncJVFB4v2x686SAMDav8SnHG/zWFBvHSPOVXR9Ldkwwv+/
6tDdRb6NaCvFpxobk9OXKSyWsSDdpz0+NPSUuMq1T1v7FcmF/
i3z1Y7t6u6xdgfiePQabXnyXJIk4rFE6tTehomu4Tpov7Dk/
KcK3B4vkwCRBcvaLeL13XDBXV1UxDGiiiO17INESARIooX9MDAIP16UQk9uu4wnQ5RGGmKv60st6Z9/
Hjebvr5q3up9XKvsdEghqnAmesgTDc/zMV+7wS1sJEf5w7LE4dcsGZsPGbNpf/
DkoQACdvILRZPDJz4NThrGNSFmyhYgLxcZO5jgQOgU1o9hGt/
OjZ3HVeY+pXoccPUzZQXkG5nCpMgMIXe3+AqywD4qTxPgGAN0c8W7CEiMgoefRBsCrZ8vtgZbqUhU2GrdcH
42qxtgfVYHKv2e6lLP3gpXPqbKVymFesc9RlYtB9/s9zXvwRrDlw9UFxiX9+Wmxby/x9cc9D3vl29/
T5Hvqqzl5ITF6mcK069whTS8avK6ZLBqez3S0qV9C6ufzOZc8TiidUc13nRu77r+9lQ0ehL79pff4EeWO3/
Xbrm4TxnjRYKEFOz0o9q4rkfBAgWt+urm4IwVkRxvJZtiACJEFG/oG3NtIJi/
Kpyar1sFiDo5HT4tLvGxJTew7ObpuV/FCz/9YBZgHB/AR7sP5N/
3OrI9Ls39hMRhRqEep89IUCatHM3d6vag8JEkABBG1kE02WwHiJIOOmkI0BcDeE4PjVls7GnS1CgI5srjmv
2orbtpm04mtwG/+Y/mreLiDxRitEbIq2K+yak+31JN/S0GFN85Zmi0Mf1Jnw3w9bfmMJVtO8qEMei/
b+t9A/
Kbe5merxWXGt9D33bTYebFJviPy8r8028NLd1KaYFsXgO1ZzrSE5cuCyB9WB7bayBmPTWIWOvlj8tLVUaQn
JtCzpMYRSfOOdsGqt3fX9dExt5hxp96V166hnHByducJogYBG6KbVRv0awgSrWx+iTC4IwVkR9vJYNiACJE
FG/oMOmbugxYfVBq/OOXoz97OZKWrSzlkrqLvhWPEwzi2/
sTggQU7M5rBnQnVXw2IiIxq9KDPaf3Vxp7Ulxz5AACTMI5WABsru6RXl8NhRA2wgSIOjihGC6TM05b8awP0
A46aQjQFx2qBiPGQYhtrh/xQEqO3mRpua6ncp4ph2La11iket/Gi50Kito359TbD3/QXVKsbjn/
tNwIb2UxXQjTC+RL88sMjosmQJrJ1IZVOtxjaNvCtaZ6OB35q8r/WmcYeyQY/Ecmm9JVSQyi1Ocjf/
Vwn0+843KpnZavldNV6pr6UiuYrgK4m2BxeJPbjhq7FZ/7/
Iyumex95vI505PneLYESBAuKCc0VMuNx5qVPp3xOI5xl5MsXhCQListHElZYJhBUVP08OGg/
h31q2DBWGsiPp4LRsQARIhon5Bh3XP0eOhNRXGlIJY3J2Cce9ytejYlOfNTlCmZnN6V+4p648kVwT4Me5uz
s3Dni84Ye3K/
dvFJdTc3mVtbGcK3v8KbZCA9Qc2ggQIFlEjKNRwxrCnzy2cdEy2x0HhysVPNzqGrD+nbXD3auGBCqaWuMTi
1PVHlI7s+BmIPFGaarAAqU7TtGEk40sztyoz+jc48vbRKOG7IYWlKVy1KS4Bgr1i7l9xwJc6FsYOORZPfE+
+9dx2etrwnQt67Y/m7aLyBtV+vKTuvC9d6eT5zmQanyvtyRYoFGblVxonC+5bcYB+Dz1G3i5P/
HbqqzEc2yrPOr+PbDfNzNccr/IPN/
lWV2wC5OoHc41OhBzYZDaMmURXr9dwEB239LoVQRgroj5eywZEgESIqF/
QNhERFJPeOmTtvuyy4dQ7Cps6PXN+tykdw3ajw5v7/UO9PbjA/
YXCE0qxOAbXwqTy2VmA6IP5qblHAs93kACxiRhMl8F0pK5e/
6wqhk46AsRl+5lu8GDE1Jkcg4Uhzuy6PvPktw/
T31aW+x7/6qxtxusvbHxhSIAcbUzPtnok45YZW5NN7q5+MNf5N8Y+My6XKVNgTY3LnctlkYu9Yu5bccCXOh
a2ISrWJugEvfb253f4ROqWo02+1KSGC530xaGVU1fvDVvcMcf7zs7dWmVMl/zrygP0Z/hN49/
ONy0CpOj4WWcRepkmQF4uqlae33ykybe6ojtlcbx3wnpnDQj2kwrTJwU7nnNq4dUTcmUFRIgMUR+vZQMiQC
JE1C/
ooAGsLR5Zd8jqCLTxkL0Tsj4AN93gFg0JEFOaxx+XlhrfsxgGNtzbg1dL5mytsg4gfrVwX6Ao0CP+ZkKA4A
xgLO4Vv7sIei+sYUAwXQbTkYJcmdD6koh8PQDChEkkDje4IHXmJr97DgZ3xsaBleszYydtjC8OdXC+f4Xfd
S1M3Di9gIjIN3OeyQjTONMUNz9dSCfPJ1LD3v9QrjPNbgm4R6W6soWriC53JCx019lW6bni/
WX5ATrTqtZi2MwF9EAbV6ZtqKN20GtvnbGVdmnpk2tKT/mKs09fvJy89r80M/
XvAJo3sL22vk38zXJlVTdv6LfTtipReKzZacO7f8jRinmxsEp5fsvRJp+4sYmd/
3pgvVNoYuF5GKe8zp6+5HFx3x29waggjCVRH69lAyJAIkTUL+hUah8wJr992Cpethxtsr6fvoJhSn1aNHSz
1jvzxuJm16xYXC2k/
OOQtS6/18tF1dab9i8X7kt5VpwFyJyt6s2dOzu7MOVKY0xdb15FwXQZTEcKWsFC5xmi9ATIFwwd6cPEz1/
dqzSew2BMDcwwuJt6SZ03sGoP2fUb43PTEkXkegpfqq/fNwKdzz/+2CY61tiekhGC/
vdhO+0PTNzgtFrm+ioics6kmwK7druKk7HQXQdtue9dXpaxu1CQAAAgAElEQVRcuUk1MAUMr2tbQTXGZ57Y
4nPnW7HvpO+8NbZ2JT8z15CF6RfDcZfBXlffZvyqg8qKXf5Qp/
o1paeM+yw41uxcjeHvyfGmdnq5qJpmaAK/
4FizT9zYBMi7x7tT7bCJLK722II7rhN5NtrSA0SIElEfr2UDIkAiRNQv6HQHPVNzj1gFyNbjZ63vp/
vpm1x+eLbQ9NxvF5uX+jGNgAvL/zS0WjJvW7U1h/vu1/
bSfSnOiv9tZUKAYApCLO71mnARJEAee9u8ioJFsJznXVJ3QZlRNgU6zxClJ0BcaRiuuHdZmdW2ltHPoR4sf
vbWnk++xua+5orrp+QTESnpLqmeAyJSVtoyFZ98PD/52dJ5/
U3TC6j2XAfF4omamUU77QIE7WtdM+mmwO1donSlQ4Bgwf+fl5UlV25SDUzPxPMWRiB89NGNvqaZy/
ee9H03mtu6koN9FsJha1Ri8cTqKv+b62L0bSasPqjUJRUcbSYif08Sji1HmxQhqEdJ3Xnn+Sg81uzbt17Lt
qHCs9M2TQJxPAyOct+YHXwt8QoVkdf4s6lNBIgQHaI+XssGRIBEiGy4oMOmPWBMzztqLYDeMdT4y0SYegK2
2Lza0O0aLSv1AQT/+9eLSqijuy+ZAvHK9hprvvvPX92b8qCUBYg+e/9n6KpuIygFa9Jbh4yvw4LW/
fUXQtfuoPMMkb8oNUy4uiG74t7lZdbVCkZPEdGDc/
B3VbckXxO26zfGxx7dSERkTeELihumbiaiRDftdF7vik8P7ZsoPQHy+WkFyeL4aybl+VKJMBaBAEm1rgFTt
mymDrG4u0v55iNes8o/
LS2lupaOtD7zhyE9E89bGDOJqyfk0katZ82yvfW+lMqz7d3JgTWL8LA2wbG4ulrLaan6NhPXVtBDa7yBPE/
evGVZydl8pMmZDrav9rzxfXD/
+r714vuwfxNcOba5DGK0XvYECDtkNbeLABGiQzaM16KOCJAIkQ0XtGmgHxQzNh23pm/
trGqxvtf1U4IHs9yp+D2G2Uxs2oWBg65fLtynFLO+VlxL37HYaN61YI81rcsWLED09IZ7Fu8PPNdBAsSWxo
UrOPtqz4dOXUHnGSJ/3UqYCNON2xT3rThgXSVjgoriebBVDKL2XBrW0R+cuIGIKOW/
NcenpiREgj5wzUTw6gpRegLks09uoRPNCQHykUc2+no/
YPDqIhE5Z9JNgd8h12s53cjEpsOeAPnj0tK0XcWwQSOaYYRNF8wpV3vWLNlTTy8VqWK45VJ38nvHItxVE6E
HppsWDQkLvch+0luHlOaY3DTx7XKzANl0uMlZk7U3QIBsqzzr27cuWMNaTf8JxLzLeY3jYmeP7zo/d6nb/
mMpCKNMNozXoo4IkAiRDRf0BxzL7LZ4dnMl9VkECKbL6Dy3xZ3zH4snViyIzCszP1tgLnbE9Imfa80NF+2s
tfY8+Okre+g3rwc7uGBwqtX0vISF7PuGBNwvF+4LPNdBAoQdtnQwxWF3dUtoAYLOM0TkG2SFiTDduG3nySZ
SGVuxLQcPdHlgRpReM8D3Tkg0rcSeC6kEp0nZBobDic9PK0h+tnRe/
5kntlBlUzvF4gmx+MZucxO7WNwT90SUcmE15vm7Um7QaUsnDwTcH5aU0onm9rQ+M6YGYT2Kq0cGhp6G9Mbu
et9q3IWOnuTKKRe9p5KOiLUd/
Jv4Yc1Y45F1h5T+OSy0dYGE58z1nruHVgptz2+vPEfrtYah+iSAbgwQi5tTZdH5Su96borzHQkBgm5g/
JggRIFsGK9FHREgESIbLmhXUzFbPF9wwlo/ojuxIH39A1RcdY6unWyfSZy/
vcba4VuvIeGYCwXhuiPL67vqrN28fzJ/N/1yoXlVxRYsQLiJHq8Q/
PSVPYHnOqgGhC2EdTB1rbjqXGgB0gGFn0T+lCdsFmZacYrFPYGVavxtZbn178joufh68OfGuiLTAClMDA4O
piw2Oa6dnBAgNsvS4cRN04cnQG6YupmONSYG8p94bJOv0RzGAhAgrjQqU2AvGpeF79I9dgGSC4Pf3y8ppeN
N6QkQ26TJT0O4McXi/
rqH13fV+eqRWjt7k6s+LBzCpBpxYGoVdyjXV4BnbjquFHNzqmHuQbMACYpdAQJkx4lztKFC3bc+KdHc7hf4
h0/77adxMijMKvqa0lN00/QCxQAAV0UEYazJhvFa1BEBEiGy4YJOJ8XG5msfi/u78ZoIanBl6/
Bt6pwei+coKys/fGmX8tySPfVKHw2MH8/
bbV1VsQWLhMdzEjOXnH7ww5d2BX7uIAFyr6WOBFNetleeC50m0Q6Fn0T+om9cZbIJjVScfzB4Ncf0HLO//
oJzH+zUxMW5ROl3I+/
u61cKg1OJTzy2iYjIly+fibh5yCLYdq6C4lNTNif7k1w7eZPzGLGDeCqD6Vg88V3hf3/
P0cRwiSZAVpc2JJ3xcGb/d2/s93UkDxumGflYPCf031cXaYt21dFsraarras3uXLKKy6ppK3hykblUO8e/
N370bxddKm7j56EZpy8UoKF4KkEp7/ani+uOqesQsXiOb7fhPOGGqsqQ6rc/7y8K+Xji8VzFEc/
rAsRhLEmG8ZrUUcESITIhgvatRphi3nbqonIfKML09n2Zkeu9rxt1dbUHVsqFdZj6B2el+2tV1yk9JuobVX
FFixAHll3iGJxr1D6ey8WB37uIAHCFsI62Eix8Fhz6EH46tIGxepST4FDceFyvEknHlh90HqNMDVD7k224J
QaticlorSdk9LtARKLe0XsLoepdOPWGVuTny2d118/JT85Q33d4/m+TtcY/
L0lIrrJMQlgCrSVtU0ExOI5tHi3V+iO1ykRKTa597yxnw6dNts0B4Vtxv2ukJMJczUL7YU7a2lWvvrduNTd
l5y4YHGeSkf0J3I9YXHyfKfve8w8lef102AbXV0khI3iqnPO62hnVYtShxOL5/
g+t8llzvSds9XVBQUaiegTJIIwlmTDeC3qiACJENlwQduat7mCc8nfbajTCNPZ1pX+8XJRtbV42SYkcBZR7
2+wfN9Ja876D1/
a5VsxCQoWIBOHbCh53996brvvc55t71aaAQYJkN+9YS5kx8LTLUebUloF4MEzEfkGGyhA0knFc8WEEAIkyN
GKBzl50NyyNkC0jER85JHEOUyniD8ovvJMUfKzpfP66x7PT/ZbuX5Kvq/
TNcbLRZ4AYWvZsPELqK3C1RA90OoX+8D0DwwqtRf3LN5PBxvSFCCWjulhv8v69/DVHTU+U4nOnr7k/
jg90TYBYoqnoVHf2fZEsTXWqDDYjJMbbuoiIWxwDYnt+V3VLbTlqLpvFECxeI7RYc/
0e5OqjTP+3fnfeoqoIIwl2TBeizoiQCJENlzQ6fR5YDtPU6H4ieZLge/
pKoB9qaiKLveYBYitedpkSHfQ9/1mSYMy84hx59ydoZpoYdw3JEAeGBrE8KAEB5JEnuUo1nUEFaH/
dnGJ8Xx9EdJlNh1uSnkVgNE7j3NDsFg8XCFpKvHQmgoicguQ/
oFBo4jl4FSfDRVnkq8xpYOMdFwzKY+IiF4odPctSSe+Omtb8rOl8/prJ29KDuQ/
PXWzr74BY+7WquR7ffbJ1L73mN7kWmlAq19ODYvFE45saDrwm9dL6MDJ9DrL2+qVws7K66ueC3bU+AbiXb3
9SjfzWFyd6AgKFCA8048rRwzaeXOtSH6aAoTNGmzP765uUXqxxOKJ5qf659Zfd9pQc5ZqDREHprzqJhmCMJ
Zkw3gt6ogAiRDZcEG76jFswXnepvqA2nMdge/
pyqWeu7XK2ufC9jpsiqXP7K4ubbDac94xZ2fKqQQsQNjlhoveb36qUPmMKJaYIAHyf4vMTlqYsrahojHl/
gkMDopicVWApGu3a4uH1wYLECJy9lbgFJicck+AVKZZuDyc+NDDCQHyTP7xjO/
7G7OHJ0A+8dim5ED+M09soZWWztaxeA7NAQGS6sQDNgG9+7W91u0WgdUv/q3au3qVrtu/
XlQSWANkC1tdUpiGeLG4/zdi/
vYamqaJi+6+fp9QeXVHDeUdaqSvztpGf1nuT+nDlRncHzcEReHGYA0Gp6/
qqxRhY1vlWed1tLf2vNKNPhbPoUfXHVb+b+rv1NjqL0xPVcByoCGIbhMuCGNJNozX/j97Zx5eVXnt/
9z2tupz2+rtrc/
t7X1+91ittVasVltqrR1snWuxtbW91ta2Wm2v2lqs7QFkkEEQBFREEQdARAVRQAwhjAFkCFNCmMIQxhBCGD
MQSMiwfn+crLO/+93v3vvd55zk7J2sz/Os51FysnOyz3ty1vd91/
qusCMCJMOMHTuWYrEYnXXWWdS9e3davdrf7YiJwoIO2owaiyfKmojIlsBycL2zF17H9+OWlLlOu3bbdcNpw
urgvFnFB1yTrZ+/tCJQXXcsnkuPTUsIEE5AeLYET9vW/
Y5Mb58SLDcrX6zXn7PxYOD5CQxbB3PgTrLJELcgwUMVvZ4PkbcA5hKYDzZUJB+Pu+qZjG8OWWAbroZxadsc
ETVJzUT0GLs8+bul8v1XDpxHRW2J/
HeeXuTp1PViwc7kz7rGYHYDxiNgAYsWrGrwIFEi+2nV0boGW3nYg5PX0rq9xzJ6L71mZHjFq8t2JV3tOM40
tzhctXCOSktLK60sO2qz/
b4MLKvxZIHB+8aMg36U0srE54SfO5xb8LwRt36utXuO0bIddgGCbl2xeK7WAOSQxvo6ld7BWNw+0FIdlCoI
2SQK+VrYEQGSQaZOnUqf/OQnacKECbRlyxZ64IEH6LzzzqOqqir/
b6ZoLGi38iSveH99ORE5B2vF4gkfeT+8kv4XC3bSiXp9b4DbSQbuRqq9DLM3VLgOQLzzpRVG09nVn0VEyQn
q3Avylb5zk7/fifpG271her2vT3A57pu4Rnu/
cMd29oaK5OA502DUEhIUIFcPtgTIb14r9NxJN4knZ5sJkB4ea4F7Dd5du5/+/
u4GmlV8IHDjsk4ku60ttx35S/rmEZHlfJZuoAvTz15MT4B87cl5tG5v4nl/d/
hiz9kqYxdbAsRkKCjG32Cw3kMeAx1x1ggKkMrq07YG+QfeWEurd2dWgATta+F4Zekumx1uLJ5IxFWHPCwvY
3Dg4FUg4tmkIha31jveQwb7itgtq2BbagKE7arVTRiOdXuP0fKdR2z/
pv5N0tmr66x5U+0ZQ5HY1CwCRAgPUcjXwo4IkAzSvXt3evjhh5P/39LSQl/
4whdo2LBhRt8fhQUdNAGPxROnCkT6KepVtad9fiJ5Dgwbu3gnHXWZdo1DxzBwQJcqinJLDrqWF/
30xeWBBRgLEN4RxubVP76xlmpPn3EMHGNwOJkufjdBf7qG5Q4ziw4Enp/
AqPXeF9oEiJW09J25iWYWHQj0M9QYOHsLEfkLEK+GZi5v4xOu60cWBG5cNh2k+MORBcmTBDUufiIhQLDUL5
3guR2xuN09LZVrXT4gn9buSSTy3x+x2PN1e2HRjuTPCjLVOxZPlB7yf+MUbDVw1ggOGtx/
rN4mvP74xlpatetoRu4nR1BRxfHykjKbbW4snpgbo5aaocMXg+5qOBEcG90ZPKllcIhq2eFE/
5xaJmUaBdsSG2Nup9rr9x2nFWV2AaKWkuns1Q/XOv8em8z+0AWeRre0tJIghIUo5GthRwRIhmhsbKSPf/
zjNHPmTNu/33vvvdSjRw+ja0RhQQctQYrFrZp8nR+/
yXRbr76LsYt3uibYbmUjWJ+uxtxNB22lERg9xi4PXILWc1piVgf/
TEwgYvFcGqX0WWCy4WcF+5vXCrX3Cz+031tXHrgMiVF38FGAYELaf9Ym+mBDelO/
B39oJkC8hsdxzTzvHF89eEHgxmXTUpEbRy9xvTZPUvc7wTINHCR518srk/
cilWt1659Pa9oEyA+eKXBM+cZ4fqElQPDEyySwPE3X/8DxOswawfdx2eE6mlK4N/n/
909aSyuU3fh0I9U+pnFLymjAB5tt/
0ZEjlIzdcZJYk1YogJPaFGwMbpTkTfA2pn759QyKdPgeTluJa5F+447RN9fFTGprsOXl5S5bgilEnhKhA6B
gpBtopCvhR0RIBmioqKCcnJyaOXKlbZ//8c//
kHdu3fXfk9DQwPV1NQko7y8PPQL2s3a1ivmbkrYon6lr7PWuLre39vdy85SnVWB4ZZM3j/JfQBZ/
uZK1926n7zwUeAmfBYg7Ao0pXCvbTKzbhga45W4cWCdOYPCa9qa/
YHKkLh8iIgcu7zoYoa7xwM+2EwflqQnQJ6as5WI/
AUI1tCrwdavXPJzSd+8wI3Lps2yNz+7lErK3cXNg5PX2k7a0onqeqvHCQdYpnKtr/
abS4VtSeX1Iws8heNzCywBErTnB3f0/zm9xHEv2M0Mhx3ioMHSyhrbHJX7J62xTcVOJ/j9d2m/
uVpnPr94sWCn43SLiBy/49Q1TgHSD74PT1PxexneOPjFOOvU681Vlijj/jm1TMo0eOCjmwAp3n/
CUfambt6o65DI2y7by8VOF/
yZcUEv+98BQcg2IkDSRwRIhkhFgAwYMIBycnIcEeYFHcTbnmN+22C4SzXNjnUG3u44mXzMwh3U6/2NSatZL
6chN6vY33rsont56n/n6UWB3YB4Wjknx1PX7LMl77rTHQZrwL3iwAl7Hw1ef/
KqvYHKkK6AOSDqLi8mDzgPZuDsLZS38aDxz9DFUEMB4iUe/9gm5v4Ioi5o2Y6pXejNzy5NeS5F0GiCQZu/
fjU9AfKVvnNpZdnR5O8620OAjJ6/PfmzvNzHdIEJep8ZG6mhqdnW/
8C9NjjsEIXyxvJqmrTCEiD3TVyTcqmRGnx6d2HvOcY9PxhjF+90ONQROU8s2XwDwVMNPE3GgXvIkboGW+8D
Tq7n932qJ0MLtyb+LruV1ZaUn0iW63Go7z91HRKRa09eLJ4beB1xXNh7juaTQRCyhwiQ9BEBkiFSKcGK4gm
I11Rjt+Cjfl1pk4m1Ig4M48FlXN6i+vFjuNXzew0gS9XS0i1YgHB50PR15bbab92OO6OWO7iFOswRy6PGLy
0LVIZ01aD5yeuou7woQPCUZfCHW2juptSmMXMMyyslIn8BgonakNwtydkLv3mtMFkCg/a
lQYe0mVqz3vzsUtvgvPYMvC8PgPNZKte6pG9eMmG9cfQSyi1xF46j5m1L/
ixuIlbnQrgF2rWOyE+8tthUzjvbPOywtbXVNs/
iptFLbS5iv5+w2vhn+wW6xLlZ9HrFC4t22Eqp+DVSRcn0deWOv2V4X3AzR2e5qwOdwSqrE/
1zLCiDxoK2jaFbXATIxvJqxwmiOtNFXYdE5OpKGIvb+16CxEUiQISQIQIkfUSAZJDu3bvTI488kvz/
lpYW+u///u9O1YSOTcCmx+ls96gTBGcMnE3wZ77TVlfNCYDaKI2hK/
mKxa2BdbrIVJLDwQKEZwTMKCr37TNgHjEs4dl+yC5AsF7/
uQU7ApUh4SR01XLTLZF4as7WlKcxcwyfayZAsARkzsZEb1H58Xpqam5JTk2++xVLYLI71/
cNS+e81gbGTaOXGpe2pZLkqr//
O6v30Y2jl1D5ccu2OpVrXfxEXrKU6eZnl9Icj5OrkSBAePOg0PBECfuH3mtLxHHoIQua8UsTs0b8Zqb8bsL
q5LDOdMNUZLrF8wt3OCyYiZwli+9pBAgOQcW5IboSLB1om8wGHqk25/
PJtNu8pE0HqqlY2bxQTSDUdUhEVHvaXYCkOpDw4j55+hsiCFkiCvla2BEBkkGmTp1KZ511Fk2aNIm2bt1KD
z74IJ133nl06NAho+
+PwoLGJmC3CcNqrNiZmLirs2I0cTbBkql328oauMYcSxrUcCuv8LJyzVSZB8ff2gQIzqjwK0NgvOxLMXYoA
gTr9YfmbQ00P4GneBN5zyHBUrSheVvTTg55l9zrfhBRco5KLJ5LeRsP2r7Ggg13lrnp3/
TEwstlC+PG0UtsPQue99TQWctvPaikcq0v9ZlDS9vW+C3PLfMsnePXhMgqnzRdS8PyrNOL9fuOExHZBgtyA
zhPW/e73r2vr05b5HLgcLtU4rkFOxzlVkTOuS8zipwCBO1774N+psrq0/
Sr8SuTotoNdC07WtdARJSyPXH+5kRvnpuz3+aKakef013KvVNfOyJyHQwbi3v/
7fWKLz8hAkQIF1HI18KOCJAM88ILL9D//M//0Cc/+Unq3r07FRbqnYp0RGFB44emqbVi4a6jRKSvIzcBj/
15pgiXO/
hNC9eFW8lBLJ6bsUZXDhYgd41LfHDP2XhQ2wujuydebl0YO6vqbPcLe1/6z9oUKEHhIXpE3i5OWDr29NzSt
E+OeLddZ52M4E7x3E32ZI1L1tC2mXfWb3lumZFg8JrajXHDqCXG7mJucxZMw41UrnVR7znJuRG3Pb/
Ms3Tu6bmWAGEHO3VH3C2w1OhEfcLpDpNnLhN8qcBMgPz29dVpl/nhtUw3TzB4Q2P0/
O0OgwgioucW2A0x2H4cQWH25zedgwb9wHvI93XNntQESG7JQapvbKIbRydOJeZsPGg7YdlSUeMQ7aoJifra
ERHVN7oLEK/yV6/
AuUmCEAaikK+FHREgISIKCxpr8LHE6cseYmTd3mNERNqmcBNQ9PCHOpcHuU2j9gqvMoBMW30+
+k4REVlWwvmbK32TH8ZrgjQGzwNgcK7I4+9uCFQjjjuN/
5ju7sKFQmFEfmnaJ0ej2hqeq0+dcTS+ItiYz+5qDDc5o8DkRPjHY5YZCQbTU6cfjVpim8/
hFablX37rQSWVa32xV25ycvbtYz6i/M3uST335RBZM3xM+14e19jKouUv9xDxtHW/
6/3mtcK0jQ447pu4xnX6t1fw94yav91hEEFkn1IeiydOO1XwlEQ3aNAPvIc1pxMOgulMiL+kb15SDK4oO2J
zRdt6sMZRZqiWr+Frx05VpxqbXX+eqcDX3XtBCBNRyNfCjgiQEBGFBc119rF4rq2pfFheKTU2tWjrq4v3ny
Ai0vrum4CuRjxThO0se04zc4rC8LLSXVl2NFmz7zYPJEiwAOFd+YVbD/k2Yup+b69QBQiW/
Dz01vpAogqbPf/uMYcE7+HIedvSPjlCxyUi564qgzvPXEKiPl8UmPz4Hi98ZDSQ0W/
2CsePRi2hHYYDHt1q7L3i+yMW0+UD8pMnBDpSvddstNDjhY9onocAYWcyIkru/pue+izYcoh+/
tIKGgOzRNBxiwUsT1v3u949rxb69omYxp8mrwtsKxyLW2VjI+dtc1juEpFjxs+HJU4BMiLfEiC4eWIKCpCT
bQ6CPNk+3Vi166jNTntbZa3j1FBdy/
ja8d+O02fcBUgQa2rcqOnWP9/1nghCNohCvhZ2RICEiCgsaPwAwZ12LtfQ1fhuOlBNRGQbKhXkgxdPAnjXm
x2aUpm14CUAVu8+RsX7T9BvXisMND/DLR55OyFAWJgt3lbla9/KmO4WqiVYuLt738Q1gQeV8cAvL3GHu/
qj5m9P++QIZ04QuQsQPJWZpwgQnhz/3eHWc2Pb0J++uNw2adstTKeX/3BkgdH1YnG91bJfPDh5rW9/
VJDr4TRy7qXoMXa5zXlKjadAgLAoN/2dV5YddTxfbHi/vm0In6kAyWQ8/
NZ61yGlXsH21iPyS229SLxGcXBiLJ6r7ecYCYNH+e+L20BRHShA2EGwKOCsG7co3HXU9hptP1TrOOX7oTKI
FV87HsDZ2NTi+jOCDOfEv2OXDxABIoSLKORrYUcESIiIwoJGL3880WABcsdYZ7K19WDi99FNUzYBeyHYuYV
nVGAdtWl4TXVeu+eY7Wdn4oP92QXbkzuHy3YkHMFeXbbL9fGM19A9DLUJHUvj/
nf8qsDlUc1tie+jHjbAOMX52QXbjd2R3AKnbqv3HcEEhteC9bVEPxAml9w0+/
OXVlDZ4Trf5zE0z91VDeP6kQVG14vFzRvbMf785jrf90WQ66H7EvdS/
PTF5Z7mATydnoiSjnd7jpw0+nmrdjkFyNxNVnJ7Q9spFZ+QpLN2gkbPqcXGZXHc+xKLW6c2w+eWagfyTYcm
+8R9dgqQUfO3277naF1D8v1mApZINTYlHASD2Gx7xerdx2xlbjsO1TpO+VDc8+/A/31xW/
nmmWZ3ATJYcQrzCtywwvlEghAGopCvhR0RICEiCgsaS1TQTpZtVHW7vZwg6+xnTcDdRp4pwgLEazCdW1yuc
ePiWLf3uO1nZyrp4YRrRVnCEQynPLvdE9Vz3y3UOSDYj3PH2OXJmn/
T4MTG63TpetgJfX7hjrTq0GPxxGwFt/uO4ITtBYoA4a+hwGThd9fLK2m3QfKsNhK7/
v7PFNAuQwFiWkqH8X9TMitA0K6aZ3/c+dIK7dwbng4+cHZCgLS2tia/
tv9YvdHPW737mOP5Yr8Jvy7PZ0GA/GP6BmM7WPybxbv/w/
JKHf1ZROQY6qiWCBLZG9VTAX8GCxfVqSrVWLPnmK3Rf2dVHe2ssq9x9eQIXztuFG9uaXX9GSjA/
AKd9r4O84kEIQxEIV8LOyJAQkQUFjTuQOPEbbbs1M1R2NXWo6BzAzIBB/
LxTBG2373XY6p5KsH9KkymrsslJ5yY4UAxt3viNbEdY0uFfb1c3McSIDeNXhrYIvdUY6K0Qy0zwcBSjBcW7
Ui7DIRLcXT3HekHJVI8yVn9GgpMXnO/ea3QaPd+/
FKrkfjJ2ZtdT0R+8EyBkaCJxVMrE3zorfW+74sg13samp95F/
0X41ZoxSn3ezw5ezMR2RPKyurTRj9PPUkkIlu51+1jEqWaXHqXztoJGn1mbHS1nlUDT0p4YvjQvK0OUUlEj
n4a9YSOiGjMwvQECPZocKlkpgZirtt7zPY7lB2uc4hs9fQYXztuFEfBqsbLSqO+V1wPp6xXDxYBIoSLKORr
YUcESIiIwoJG21vspXgmP2GjqvrEx+K5tO9oYngaCpYgH8LoFrO8baYID/
3CoXOZiJLy9hEgXLrAJ1yJWtEAACAASURBVCxYy+12T0xLd7jHhsH5J98dvtiz0VgXtW3uOl42wLiDPHbxT
t++Fr9gNyRm9oYKurhPnmMXmU++YvFEM7Xua1g2w2LsDxPX0L6j/rv3eDL12ke7XQdd/
uCZAtp79KTR75aKU9vDGRYg2Pw8oyhRKnTXyyuTlrwYfII24IOEAMGSmiN1DUY/
j53vEDxtYTvXZxdsz+j7zCQGfLDZ04obA001uLz0qTlbbc58sXjiPauWOqoCmYjohUWZEyBM5gTIcZtI3HW
4zrHGVSt1fO2wUdztZ0xetdf4+eBr9I0hC1K6X4LQXkQhXws7IkBCRBQWNCaAOAuC5zj8arxTgBw4cYqIiL
71lLPx0wR0PuLacq4lxqFzmQg1mc/
UdbmcgE9YvGYaMKbiShVNOHn76sELbLX3JlFdnxAgXjbAPDsgFk+Ihy0VZu5IbjFuidPtqam5xfFvOF+Cy/
EYFqVcQoTxp8nrjMqHsI5/8so9rgLk+yMWGwmaWNx7WKZbsHmBF/zYbv3zbX0/HChER0HzM08k/
9X4ldr+IL5Wv1mbiIiooclyNTpR32j0/
Hn4IIJih9+3vWds9GyEb48YkrvFeBo6TivnzZUhuVvo90p5JJFzIrm6PomIxi7eafueoHD5HH5/
uu89fM1QJO45ctLxnlHti3EdYqP4BZr3YCyea5sz4hUX9LLP8+n+lAgQIVxEIV8LOyJAQkQUFvQgaCLEhsR
RbQJElzQfqjlNRKR1nzIBnY+4tGNIbuJ56Jre0wm1nClT12XxxQLHa3AfoxNzulDLxvDD/7L+
+TZnG5PgCcsPePQuYAnLuCVlxjMx3GL8Une7WYRf91g84SiGPOUiFmLxREJ/4MQp3+eBCd47q/
e5CpDvjVhs3A+Bpw+m8dd3zAXI1YPna8v1UPCjhe3UNfsoFk+cHi7VCBC2n+47MyFA0Fa19vSZlNYkEdl+V
qoD6TIRT88tNZ7I/VbhvuR/8/
tx0IdbHPebyOlGVbDNKUBeKiizfU9QdALEZMCmSRTtO277u7T36EkqP25f41jeyc+B/
xsbxS90mXVkOkzyot5zbJtL1wxdmNL9EoT2Igr5WtgRARIiorCgsSYea3R5kJyubOhIW0KLTYVBPoSx76So
bWeVk83bnjfbydSF+mEaiyfmHCCZSnq4mZUdwVaUudvWMrpyNl3gbrNaf/3FXrmO5li/
qGoTjF42wDgPYPzSMkezatB4ZemuwOtPTfC8HKx6Tiumg9X+AgR7It5bV+4qQL47fLEjOXNbY0EabzkeDSB
Arho0Xzs08lYoYXkeeg84qb7n1ULt/JZubT00fWZsJCL7ZGuvIXMY6qkcEdl+Fp4sdHSMmr/d2Bq5/
Hg9deufTxc/
kZcspXty9mbH3zkicth2L2nrV0OwxygVcDOBSVf8cxTvP2E7pdp3tJ4qFNGunmzgOsRGcbdhq6aW4Bc/
kUe/ftUSqdcOW5TS/RKE9iIK+VrYEQESIqKwoHE3F/
sAeJCcbif2RH0jEZGtZCvIh3BvcD7ixIYTQ9NmUl3opiFvVyxt+d/
T7TVhy2J2BFvv0bTN8x9My8uw4bdF40DzrkfDuy4OVidK5rxsgLE+
+9Vlu4wbst3i1WVmAgQnSasJHn5NjV7vlxg1UOPU+A82VLgKkOuGL3IkZ7ro1j/
fVnYzyNCGtOfUYt97wY+9atB87fPEJB+fA/e5/
Oa1Qlqumd9yRdta7d0mQOoaLAFy+kyztsRNjY3l1Y7ni6JbLWHqyBizcIfxe+tg9Smqrj9DFSdOJf/
2Dfhgs+PvARE5RDhbbiNov50KOgFiMmDTJErKT9hOqfYfq/
d9z+A6vHqwVSal29yJxXONhyZe2m+uzQXwO0+LABHCRRTytbAjAiRERGFB424uJv/
cTKqzjq1pa2pWPeRNP4T7zrScjzZXJBIb3u3GU5gHJwezO71CM5ldHerH/
37XOLPTCLfgXWV2BPMactjY1ELHT5rV2sfidsvTJo0H/
8TluwM91/3HEqYBXg5juLv+2ke7jcuR3OL1j3YbrQUc5LZUESD4NTX6zdpEVTX+AqQYZirM3XTQU4CYnKhc
PXiBLen0KhPD6DktmAAZp3EXwqGKWPozoW09/
Pb11doBkjwlvNf7JUREVANlV41NLa672xhqLxWRvUciFWviTMW4JWX0S8PTxcrq04711X/
WJsf3E5HjPcCGGUi6AiRPI0BMh0P6xcbyatspVfnxet/3DK5DbBS/
+Am9ACmtNCsX6zYg31YC+t3hi1O6X4LQXkQhXws7IkBCRBQWNJZy4C4422nqds3rG5uIiLTDv0zAxneeeTE
sL7EbyacqPcYuN24Kxg9M9d9YIDD87z9NYZo1Bp+27D16koicu6UYpxqbA01qxqFvuinEprMtOPYcSTxHrz
IZLH2bsHy30WmAV0xYbiZARoMAVneYR3uUOg36cAsdrvV3cMLd5IVbD7kKkO88vcjoROXaYYvoTXD+4XXrF
49N2+B7L/ixVw2an+zriMUTIudX41dSdf0Z6j1jI10zdCEdBfcqToJ/N2G17cSHg61W/
zk9IUCq6y0B0tTc4ppcYqi9VEREa/ZYs2JSGSCaqXh12S7jE03uXyOyNl/
6zdrk2JAgIqqqta8HnvmDvP7Rbtv3BKX6VOK1+PGYZcl/Mx2I6RebDlTbBOmBE6d83zO4DrFRHJ3oMEz/
Tlw5cJ7NBvz7I0SACOEiCvla2BEBEiKisKCxlAOdZHigmK5voKEpMVcCh9cF+RBGF6GdVQkBwnMNuNH2rnE
rA38Q63pSWCAw/O88tyDVYGvT8uOJ0wWvEwPTRt9kogM7rdgwzGVf/
5wezAaWT4G8bIDxfkxasYcOGZwueMWkFXuM1gIK4I92HHH9mhrD8kptSbhb4OuydPth24kF3ttrhy0yOlH5
4cgCm7OWaUP64++aC5CvD5pvs1pWRXRLS6ttlgfPYvjDxDUO56ZY3Jqd8o/
piedwDE7jWlpaXZNLDO51QnBY5SMpzEbJVLyxco9xD0oVCBAWuE/
M3Eh3KvOOiCxxwKGbBj9pxR7b96TC6TPNtunppgMx/
WLTgWqbID1Yfcr3PYPr8NvQKH6pprw1Fk+U426rrLWdyOni6sHzqSfYr//
gmYKU75cgtAdRyNfCjgiQEBGFBY2DpNBJZkybANE5J/
GHpW76sAmDoW5+d9vuPCdyV7WVi9z9yipqam6ha4ct0goLXehOZLj8iOF/v/
nZpdRzWrHRdXXBZStc0qHulqof0kGujYk4NgmzQMRmTpPgPhgvp6KfwGs/eeUe4/
kQbjF55R6jtYBzFNQSF/yaGqPmbzcqa8Md3xU7j9gECK6Ha4ct8nwNOW59bpnNuWiUR5kYBif/
XvBjvz5ovu10gU+wEOwN4k2E+yetoUKNAGFR//
c2EYSvLZEzudT1GPFJJYL1/5hcdnS8VbhPWyqqi6paS4DwSWLvGRsd7ntEdvEfi+unwbNo/
flLK3xfX1NMBmyaxOaKatt6qKw+7fueIbK/Jxhdf10snksnGxKn4TrzA4xvDllgm59z/
ciCjN0vQcgEUcjXwo4IkBARhQWNNcxYlsQCRDc7gif24uyIWDzhqGIClsGwQHgmP5HIcW/
Fb14rJKLE0LST0DTrFd/
TCBA+oWD43380agm1trYG6s3QxeHahCNYjccph8lOPQY2Y+Pvzq+F7vf0Ci6f8aqTR/
H55qq9gUWTGpNX7TVaCy8WWCdwKxQBgl9T44VFO4yeI96/
ZTsOuwqQbw9daCS6fvbictsketNyuPh7Jb73gh/
79UHzbSV9PPgTQXc0nsb9xzfW2oQLBwt4LgNjofXFtvdrt/
7WpPl3Vu+zPReOHYe8Bcjj7zpduzoq3l273zFI0C34/
UpknbD1en+jw8ZXvcexuH4aPFHiPdoCJxjpYjoQ0y+2Hqyh1but9XCo5rTjVEcNfO2vG24JEFwjGI1Nidk+
Xi6A/
P7C3r8fjVqSsfslCJkgCvla2BEBEiKisKCxofnnUIbwwqKEANFNz2bQujUWz6ULe88x+plPg7tRRdtQQ24I
5XKQP0xck3w8Dk6LxRMNjL3eL6G/
vmMv+7huuPOkhB2gGP73/5uyzvFvqcTxkwlHMC87U5PSHgych4HlW+y45ObJ7xbsYOTVeI87wG8V7vMUVCY
xpdBMgOAJnFpj/7KmEZvj5SVlvslULJ5rK1VavK3KU4CYCMX/Hb/
K5jT1wqId2pM3NbgB3At+7NcHzbc9F7WMkGELVZ4J8uDktbRWI0D4fcFOXFxed1Hb+/
XyAVZy+f76ciIix4RsLpVEsASr1/
sbfe9Be8XMogPGTfBsIU5knbDF3ytxDDJk0P1p3V7nMMb2IF0DCI7SyhrbeqiqPe1bDkpkrcPvQZ8GrhEM3
ozSlf5hfOfpRTbHuBtHiwARwkUU8rWwIwIkRERhQU+GhlrcIR+7eCcRka1xUP1wxqb1WDwxI8EErJvnplAu
ZeHSpgfeWJt8vOoExbtnuBPNH3Lqc8WmUyKiTQeqqe/
MTcnhfETpCZDqUwlHMFUkYQRt6F5Ueij53DDJnhDQ/
YqDh8ipde4YePr1zup9tlkRqcRbhfuM1gKewK0sO+r6NTUmLN9t1FuDr+/
8LYdcBcg1QxfaeiPc4vcTVtsS7xcLdlJDU7NvmSBb4HrBj71y4DybcNKVPxFR0j6Xxfuf31xne24cfGLGs0
jY7Yvfr+geN6MoIUB2HzmZPI2MxXOpTOlDISJbcou72x0dH5ZUaE9qdXGsbcOAyOp/+
+f0EsdmCoPlaUWaafDtQaYEyLbKWtsp1eHaBt/
TZCJrHWKfhipIcf0QkfbkTV2DaNhw87NLO+ReCoIpUcjXwo4IkBARhQX99mrLbQedZFiA/EXTXMqoQwO//
ISZAMG6ed6RVIe74QmFWgpxQ5sAUaeP65JArPl2Ax/
vlfTqgmugdXa5HEETihH5pfRSQRk1t7TaEitsTA4S6/YmSke8nL9wkNu0Nfsd9e9Bg0t5/
EAXIbXJF7+mxpur9hqV5uHru6WixlWAfOuphUYlXf83ZR1tOmBZLr+8JDHxvcdYb1e1Xu8HEyBERANnb6E/
TV6X3GVWYbHO81IemrJeO4+Gra15GjtPkOf3K/ddxeKJ0wQG/
zbs1vShYNKJxhJqXAkC58sGjltBY1tlLT00xblRoovjIEC4xO/xdzfQDUo/
G4MibINmGnx7cCBNBzqO7YdqbevhSF2D7+BJImsdYp/GlRqL86/2m5v8ut88kOtHFtj+xt/
y3DL11xaErBKFfC3siAAJEVFY0Nhwik4yLxYkBMij77gLENVJ6it957r9GBsoQHiooWq5+pe37ZOj8Ws3jU
7snuGQrVg8UUajPlc86XADH7+o9JDjGl5x+kzCEUwVSRipDvVDh51YPNdz2KFXFLYl9l5JMpbfvbt2v6egM
olpa/
YbrQX8HQsVAcID9tyubzLFmyiRKHNi7SZAuj+1wGZPq4tfjFtBy3cesbmz8cBFvLe6wX5BBhGyAPGDy4O4p
+qht9ZTkWaN/LDNre6RtvcUC2J+v1492LKvnlVsCRC0AtY1wmN/
gdc8lO5PWdfX7aSnG0T6jRJd8N8bIkrOWnls2gaHox+DibduGGN7YHJi2ut9fye8nVW1tvVw7GSj78YCkb1
Pjvk6iFSOK2Cd6tYdxo2jl9hMJW57XgSIEC6ikK+FHREgISIKC3pGkWUpioPqXipI7Ozq3G0YtXETd8S84I
bzWNwaash17G4JG/
Y98PG9OnRNN2sDdzzdwMerosYvmppbktdxmyid6mCxnyj312vWiFdwc7eX9TBOkn5vXbmnoDKJaWvNBAiWA
KouQ7gDr8bMogNGpzQqQ3K32L7G//3NIQt8+14Y3KHmgYsoQHSD/
f785jrHc3Fbh8YCpO00gWvrH3m7yDZ4kYPNIh56az0RUXK+Dr9fvwnzcz7YUJG8/
jTYnNA1wqPD0tMeU+uxNwvFSCaCT/f+ZujCVV1/
Jvn8uceo57Rih7EDg+JMN4yxPTCZR0NEvjNodlbV2dbD8ZON2rlC6nVx3Vj3wSlAcFBhSblz3WHc8twyGr/
U6um6fcxHHXIvBcGUKORrYUcESIiIwoL+YENF8kMBhw6Oayst+bvG3YZRrSu79c83+pkoQHiooeompNqWYj
PorW
3H92rjoy65wYTDDXy8bpCbV2B5zJf66JvDt1VmZrKxXzP7j8cs0zpH8YA/tWQOAxvUuQ/
ATVCZxPR15UZrYUqhJUDWKC5DOG9DjdySg559N+paZbwEiEmDLhHZGsQnLncKEFyrHL+fsNp4HZoKEDZs4M
Gef32nSJsIcn/DQ1MSAoRtXvn9isJ9NggQvP+qnTWR/
f3nNQ8F7bqDOrh5xej525PP5bFp9r9TfCKi9oVxzxYR0StLE+WWf5ta7CjfZPBvyuaKjhEgJjN4iCzjDrco
O2wXICfqG31PNonsVuWMbsgr2vRiWaIufjxmma2HrccLIkCEcBGFfC3siAAJEVFY0HM2WjMN7p9kOcmwAPn
HdHcB8jOlp+BrT5olTpis8FDDMcrQObVmHoel8fG92vio+5CsPR1MgOiaeN3ii4rtsFt9++YK7w9n0/
BrDOfX7Ffj7W5X7KqlNtpioAEBl+HoEmnTYDclP96BUw7V5nRW8QHX68/
bXElnDMrEVNwEyDeGLDBq0CWyWyPrSrB06+BX41car0NTAcIN0k/MTDhQ/
W1qMW0sd641NovgUxguIbt8QEKAYPL9YYklQN5fbwkQ1c6aiGxi3SsZvhXMKm4a7b4Gg8ZzC3Ykn4v6d2pn
VS2t3n3McT9q4O+BV78Xg/
dGN4yxPTAVIOqpsRq7FAFSfeqMbX6M23XxdWO+qfnbitPMt1TUeF63xwsf2TYb7hi7vEPupSCYEoV8LeyIA
AkRUVjQ+dDY/OBkpwDB4VHqh/
PPFVcl08RpOJRr8FBDdehcv1mbbN+Dg7D4+F5tfMRyCQ5uEvcCH79BU8LiFqrrFzrmvLFyT9Im1a88wTRaW
1s9LXhfWZpIhs80t9CBE6eSSfGCLQlXLa/
kD0ULl+F8pa9z+FjPqcU2swK34FMUP7DMh8tpGBz4F4vnJu9nLJ5LBduqbE5RXgkVogoQFq09pxb7CjwGfy
73SmE5IlvSouuYScLFj73C8H3E1qicfPecphcgbDH7p8kJAcIlgfx+xVOC3JKDyevPLLIEINtlIzj7wWsgI
5ofqGWbsXhiqn19Y5Ptb5FJ8KwiInL0RHDT/I5D9tNH3JB4zcPkgPnucOvExs2NLNOYChCvQZ18D/
DvWc3pM76llUTWOvzxGEuA8DBLjBugR8TvlPdnLy63vdd/9qIIECFcRCFfCzsiQEJEFBY0WtnizA8WIDp/
f0adK3H14PlGPxPrxbmEiS0xOZ6cvdn2PTgIi4/vVbFwlaZR8lRjs+/
zwcf77eRhqE336JhTuOtoMnlJtXlcd9+9mnhfa+tHYDgBzt9cSUTkcPrBwCnpvAt+mWb4WOGuo/
RSgft8Dg5sZvbiPSjzWa/YnKquXziLYMXOI0Z9KiqqACk/Xk+vLN1FtafPGDkEqWuGd+ExsT7V2Eyzig/
YXLVMbEf5saYniSyeuNzo7+9u0Ipdfm5sbb29LSm/alDi/
YplUXM2WgIET6Aqq51ucqfPNNM3hyygu8atdLjYYeDp2l2aYZjD55Y67oFJsFMfEVGfGfa/U9w0r/
Zf1cGGhJetNcMOYrG4fhhje2DaA+L3Ptx71C5AWHz5XZf/
+ydQJqUz+MATElXoqfGLcSts6ymTk+MFIRNEIV8LOyJAQkQUFnQBWNnizA8WIFzeoftwVidrY1OiF9g8yag
C5Kk5W23fg4k37yardcc6pxYu8fICHx+kYfwypecF5yms2XOMftCWvPh55JsGEXnOm+B+BIaTvTkbDzpmpq
jx61ctAcK74Dqxs3bPMVszqVtgM7MXuMuuzllYXGq3WcZmZu4XMblniCpAEBOHIHXNPJO/
jYjsJVi6x+FQNzfeW1dO3QbkO9zA3OC18EDbEL5/TNcLEO7Vun9SQoCUViZE9tWDE+/
XH0CSnQcCZDb0h1XV6O2sm5pbqLW11eFih4HuevjfHCPnbXPcL5Pg0yciov6z7HNIuGkeHcticfuJ6EQDAY
L9KzurnLNQ2gNTAcI9LG6x72i9bT3w7+53XV4PbDFNpP+70wNO9dT7rMYvX15pK/e9a5x/
SaIgdCRRyNfCjgiQEBGFBf3RDquMAi132QWr3yzngDEGd81j8UQTuAlD87Y6rqU2Tz8Nu6JEdhtIPr5XTyt
0XvVnwKXKDXz8ngCWuWqpDJ7ArNt7PJm8BG1s90oOvPo4Jq/cY3s+/
Pqg0YBb3POqlRhyEqoTdOv2HjealTLbUIDgcytW5izg2ozFc23Tqnkmg8k9Q7wEiF9Tu27NDG0Tyn4CxPS9
0dKin/mhg61jf9vmXhd/r0RbQsgnYfdPWkNE1vvmm20bBmhBO3eTJUCwBM5vno5qIoFx/6Q18N/
OieWjoJk8yPthHCTI6hwSbprfpSTGbHpBRPSGxua5z4yNVFpp/
b3G99suzTDG9oAHRfqtRa85OXwPUIDw7+533WMnG2nBlkM2hz/
dkNefQhmVn9X4r19dRQu2WJsgv3xZBIgQLqKQr4UdESAhIgoLGpPjntMsK0veXWSHnVg84baDH864ax6LJ+
ZwmKDOYiBylhOMgl1RIrsd5p1tx/
dq3bFux77ZIKHDxwcZAsY7yAw2wRftO55MXpYrdsGpBhHZ7HLVmFK41/
Z8eLcZrZbdAnem526qdPw+HMX7TxhNZMdeAi8wyVUHvakuZyiStlTUOF47t3uGDP7QXYD4NbXr1gyXCmIJl
u5xpmVVQeD1xaWQvd7XCxBeM3+YmBAgfHL4racS71cszeNyPSK7QcURn3k6zy90FyBY2vnnN50Ty7GZ3O0a
d7280jFscPxSS4Dg6xqLWwJETYyxJFM3Z0Z1+0LnON0slPbAZA4IkV5Aqb8LChD+3YO8XxjsheHAvia2dna
Lx6ZtsFmc/+/
4Ve17EwUhIFHI18KOCJAQEYUFvRbKg9BylwUI7izurLLXQKvlFGjL6IVOgPBQMI4R+fYTEHRh+cW4hABR52
JgDwaH2xRpBB9fVetf/sBxjSK4sFFzw/4TyeRlScDZIl7Jwe8nrHb9ujp9/Hdtj/
Wys+X4LcyAmdeWhOrmqpSUn/
BNfGJxey+BF3mQ5JaU2wWI6kiGCSivRZN7hngJEBOLUnXNPDEz4dbmJ0B46ngm4Z/
J82J6z9ioFSBcKslWwNyozhsGaE4wDwQIvjbHfObpqC52GHiyimWeHNhM7naNGUXljteHHciIKDmMkYNdu9
QTTR4cSkT0Jsyg4ThYbW+2x9dVNwulPagDl7WvD5rvKHXlNYauUrooP15vMyXg3z3I+4XR2SejlS4Pt8S4o
FfCAOP+SWvpaF2DbbPr7ldEgAjhIgr5WtgRARIiorCgcYLtP6dbTjIsQDBhU604cXBhLJ5L3x3uX+dOpC+D
eVkRIENyt9i+B+v/72o7vld3N9Epy+8DFcHHHz/
Z6LiGW1w33C64sE5604HqZPKC9zWdICJ6xGPiszr8j0tfcKK1W+Brya5ZurrvTQeqbcMD3QJLebxA5yN10r
Taz4CGCJwMmtwzxEuA+Llq6dbMP6eXEJG/
ADFdi0Hgkw8eNPjEzI3aQYTsWvatpxbSA2+sTboR8YbBLWCTO7/ttScimrvJEiB+Az29HJlw/
aMY4cBmcrdrzCo+4DAdQNMFdRDigTbXLnVnHgXIW4XO94VaaoYOXrpZKO3Fmj3HaN3eRE+UzmGMiHzf1xUn
Ttn65LgfLsj7hcE+IQ5sUted2lyg2JSja+GDk9dm+pYJQlpEIV8LOyJAQkQUFjTukPUGJxlOCjBhO6qUYai
78SaNtuo1GbWhsr9iw4ulEDxTQU0udHXKJuDj63xmQWBc/
0yB7TpYprC5otqWvKQb3PCucyXjUGdvcHOy305pLJ6bPC2JxXNpUWkiCdXtem6pqNEmbmpgKY8XWBeuTppW
e3zQvIB3qv2eh4qXADGxKGX4tJCdkdx6QHiQHVqaZgouSWNx3m/
WJtuGAgeWrmGwgMb31gIXAeI30FM1kcDoO9PqI1MHBsbiVr8ZkbcAISKbFfMEMF1Q55CwbbC6M4+mFG+vdq
5j9W8cljwe0FgRdwS6Bn8i70Gd/
B5BAdLYlOjpCPJ+Ya7XCBCcZq6zDlbnJOFnzcDZW9QfIQhZJQr5WtgRARIiorCgMcnDRIEFCDahq5a298Hk
9Fg8l36gJORuDNIkgWpjc6/3S2zfg3MquH64/LiVXFw5cB5tPei00DVBTVDw9/
H6sL5x9BLbdfDxpZU1npPHg8R768qTFppqqYkuSWO49p53yL3iD/
Ba8uBCbE7m2FZZa3SiMs9QgKDTlSpAVEcy7BPingT+/+uGL7KVkbm9/l4CRF0LXtdqbW21vR/
cBMieIyep36xN2kF+6cLvP+7VGfDBZq0A0TlPxeLWhsHtY6zTm4Vb9QKkxmegp2oigYF9ZLrTQOzlcLsGmx
rgHJxJK/
Ykv09N0tk2WBUgnIQT6U8QVKGFf3fU8qyOQjdwkMjuIKeLyurTNgHCTeWmaxz5oeZvAYpqXemqKkCwZ0+1D
BeEbBOFfC3siAAJEVFY0NvBvx0TBRYgmDCoDj2qo80PRxYY/cyBs/
0FSM9pxbbv4d38WDzhqEJkt6vk8gjTD1QEH4+TghduPUQnG5psu64Ytzxn39XGD+nth2q1PRSpBE4I95p+r
DpPeZVrqYFicsn2w0RktyDl2HGolt6FgWJugTvpXmB/zOYKuwBR6/fx5KVGmWlw9yurqLr+jO/
rnykBouJWgtWecEM39z49OXuzduaMWirJwSd4KJ749IvILkBqfQSI10wK3HDoPcN5gmciQNjU4OI+1pR5dH
1TpAqbSwAAIABJREFUm+APtdkG4yZFLG53xZu2xrmO65TBpXh6dMjFiri90TX4ExF9WOLtbneoxi5A2JAjl
TWumyF02/PW37+jdQ2Or1/
Ye47tGuhIZlqiKQgdRRTytbAjAiRERGFBo387CgMWIH+bWuz64YSiIBa3T8b1AhvbGXUq8cNvrbd9DzbI/
+a1QiKy77pxchAkaWSWbj9M33l6Ea3YecR2DS4jchMgWANNZG/m3VlVRxc/
kaf9vqCB7lBeiZ7a+P2XAAIErVKX7UgIEN2u586qOnp/vX9TOyayXqDVLjtbMWryyE3RF/RyNtTe/
coq7SBBlc4kQP7a1k/BSfmgD7fY6uw5/qCcVHLwhgGWCi4urUpef+4mqz/
npJKYq6gmEhjY86Wz9UY7Xb+1fUlf6z315irL9U0tAeO5JWpvAlrL6oS0esqL4s1tFkp7o2vwJ7ILRF1U1d
oFSEsaAkR3iooCRNc7pwoQfD+rhhOCkG2ikK+FHREgISIKC3rv0ZPaRIEFCFpoqvxpst1S02TaM5Hd2pdRP
e15ajODouW3ryfcfFCAHFVKctJJBjHh1V2T42fgg09kb+ZV5w+kE5iYe1ngsn0uo85p8Qo8zVreJsR0JWi7
j5z0Lf2Ixe2JrBcryiwBsvWg/X1SpdSVryg7QmMW7tA2LXNZHlrH6l5/Xfmf7rUPkpwRZUeA/
GO6vZ9iSK5egOhmb8Ti1oYBzwmJxa3yOyK7AFETcxWv4ZRYNqjO64jFzXpAeMf8UjCaeBtc31Rhzs3k6kwN
tOXW9VBgiRYR2cTb4VpvK+L2QtdfQ0Q0f4v3cNHDtQ20ucISIOwImMoa180fwkno1aecp48XKQIELc79bJ0
FoaOJQr4WdkSAhIgoLGjclcIBgZzkYWmOCoqTWNxZkuSGToCoifUjbxfZvgdrvH/
XZieKJVgn6hMuPUGSRjf4e7mkye3D+i5lmBYOykNhl26g/
bGucZZjvlL29H1NE7lb4GnWirKEANF5/+89etJosGHBNjMBgrM+cMYMUWIgGl5z9e5jju/nr+FcAa/
Xv90EiEsPSHvyxEx7OdPQOVu1AkQ9qeS4aXRiw4DdtGJxq/yOyC5A0D1Kh9dUbnSo0p2embhg8Wlkt/
6W1fbUNftcfz6LBXWqOJaR6p6LV5mp2qDeUbgJEOyf0sWRugbbRgiTyhrHzRUO/
HuvM+9QBciZ5ha6bvgiuv6ZAiN7dEHoSKKQr4UdESAhIgoLGj+gh0OiwEkBNrCqPKR4+uORvBf9oQyDmagI
ENVxBntEeJ7BSfjQc7OYTAX+3plFB7TX5OBeFAZ3wXW+
+KnG3qPWADSv8ie17Anr5WPxxOTrSzVWxbF4whaT/
3vVrqNEpJ9+vP9YvW14oFsshUTWizUwh2ZbpX3OTO1p+64q25LqXqusC5AsnIAMUobvDc3b6pidEovrh//
F4taJJc6ZwNcNLZLRPUqH2sOFMSK/lPYdrad1e49p55SYCBA2NcBho2g7rZZw8g676s6Eia/
uJE8F3xd+VsTthXq6M3xuYkbSUp/5QiyYnpy9mZ43mLXitXZv1QgQPPGub3QKkC/
1meO4TkNTs60MThDCQhTytbAjAiRERGFBH4HmQbSyfGFR4gMLd0dV1CZntSfCjX4aATJphTXcDgeMMdOgXv
u+tonOREQb9p+wuScFSRrdwGRbd02Oe9tKwRispQ8yUd0vKkCMqSVGGOqpg/
r1658pcBUgWE7HJw3f1jTRHzhxSlt73m1Avq0PgPtI/MAd+
+2H7ALk9Bl7T0fxfmfdOH+NrZnV31vFT4B8qc8c7f3xW0vZECDq7Iun55ZqBYg6QZyDS2iwVA9fNzwBOeOT
NHoJkJHztiUfp852icXNBhGyqcGVAy0BMn2dZTutbmDw4ETVnQmZVewvQFC8+VkRtxf4vsJ7uWLnEdf7hfd
ARffYLz+R53ChQ/
B0lwMFiPpejcX1AkQQwkoU8rWwIwIkRERhQZ+ot8pcsMyJkwKvxOqvylAx3Mn0YhT8HGYyTNd+XWPRiEnv/
ZPch1gFSRrdqK4/Yzt1cPuAv3/SGtv34cyAg9WnqGCbd4mEaWC99MKt7nXfatL/
nlLjfvuYj2wChE+3fj9hta2cjl23cLI7R2X1aZoHO+Mcj75TRDOKrJ/HfSR+4OC8HYoAUSdf6xIk/
tovX86MANENszRZS9kQIKoj2oj8UiqtdFpRu7mhsY0qOj19tMN63VCA+O1aqycQGKPnb08+DpuiOUx259ke
+OrB85P/
hnNv8O9HLG6dVhyutTZY1MF4ulJCFXxf+FkRtxfYX4P3shDKF3XBZakqusfy4Fk30KqZg0v4iIgam1ocX7+
4T15mboAgdABRyNfCjgiQEBGFBY1lLmj3yAIEmw9V0CFr1LxtvrukTF1DE90/aS3NKIIEAqZro78/
g7t9aoM6EiRpNMXtA/5Pk9fZHoelLOzKhYlpqlF9ykp8lnvseq7QJP3YYPyr8SttAqS6/
gxNW7Ofak6fse2Sc6kTz5fAqKo5bRseyPG3qcW2khbuI/
EDh5NhrwtRYtYGOpCpLln42tyVIQGCO+xB1lI2BIg6e4N3x0fkl9peZ9308VjcOrHEMksUjliCpfZGqHiZI
zy3wBIYOgHy7AIrqXa7BpsafBPWJJdIEpFj2CYn33jCq86lmG0gQLDMVLXo7SiwvwXFmu60y/
Z3w+XERvdYdCLTofs7hq6HzS3OIZ4XPyECRIgOUcjXwo4IkBARhQWN1qVjNAIEnZBUek6zBIjqYBSUN0GAo
L8/
g4nqg5PDIUBUq+C7X7FKWbgJ9mcZmIaODkRr97gnHdy7gWBy+YeJa2yJKYKJVtG+hAC5atB8x884UtegbX7
tObXYVtKyssz5XHSgS8/
OqjrH17GPRS3RwtcmUwKEJ5frwotsNKGrZU+jYHcc+7l6wkYBRo+xCRc3tJpd4SJA/
JqG1RIoDCyxwtebA3f13a7B5YV4KoeDN99RzBk4+cb5FKotrK6XSQVPj+obsyNA8HXGU+ZiTT+N7R6cMhcg
OItFxx1jnX/H7hpnvedaW50C5MsiQIQIEYV8LeyIAAkRUVjQeHSObiucNHg1oeNsDtXBKCi4gzmlcK/
j61hKwXNAdARJGk1x+4D/21T7sEQsZeEGUOyhSTWw/EW3g8yxZo/
TJep3E6zk8sHJa20lRggmWjx3RHcacOxko214YDLJnVZsK2kp1IghHVgyVHbYKUDw+eoESjIZMhQguiGYiM
75y2QtZeMEBE8NY3H7SQL2cz02bYP292EbaZwBgydXKED8wB4uNTBp3lLhLBEbBX0Nbtdgd65rh1nGCDh4U
53pwck3OqmpJyB5mn4qFSwz9XMCay+wvA0ti73+FsTi7iVjusfq+u4Q7G+79/
XV1GPsctp95KTtMeo1RYAIUSIK+VrYEQESIqKwoHHyN5Z0sACpOHGKHpqyntbtdSa3OCVddTAKCk65Rn9/
hL9+xcB5rtcJkjSa4vYB//i7G2yPQ7HGJSB4KnJZ/3ztHAS/
wN3nHTC5Xg2dSxQmlw+9td5VgODQQh4SdvmAfMfPOFHfaBseyDF+aZmtpEVnmasDf59dGgGCrkd7lIQHXxv
cjfV6/f0EiG76u8layoYAUSd5Y3kO9nM9/
q5egPz8pRVEZG+0xpOreQEEyBsr3QUI9hdsPegUICMNBAj3N1033BIgPB2dyOkOx8k39ripAkRnpqCC5Wt+
TmDtBZa34UmF7l5iuE2v1z32NU3fHYKlnH5/
nzku6SsCRIgOUcjXwo4IkBARlQXNdfbotoLJjBu93rcEiK48Jgg432Lamv3ax5gkg0GSRlPcPuB7vb/
R9rjfQikL78CiKLl8QD69sMg51dgvEC97X51LFM6A+Os7RXQZzFFAcKeXm73xsZjY4fDA0fO30/
MLd1BjUwt9WGIJkLWa0xgdO6usOQXqjiqRvemYXcl0r02mBIjObtRkLWVDgKguTuxcR0S2fq74eyXa34fvG
Z5+4clVEAGinsZg4AmIrkn+mXx/
AcK9Kd+D2TY8KFR3L7hfo7re6nFTBUi+xkxBBcvXTHvcMg2Wt+FJxc4q982IWNx9er3usROXewsQNNjA+St
e1/1K37mp/
9KC0MFEJV8LMyJAQkRUFjRbj6LbiokA6T3DGoSmOhgFBWu40V4T4QGGv1XsbxH8ADSdxu2H2wd8v1mbbI9D
AcIJ0O+hBOrrg+Y7nKlMAlFtRTE2ljtdotDF57FpG1wFCDahb65IXEdn2VvX0GQbHoj3GC2CdacxOnYfOZn
8Ht0JB9b8H6w+5fg6f+0X41Y4/
k2XUPoJEF2tu0kSng0BopYQYaKP5ZT4PsVg5zBMsvHkKogAedNQgGyrdCbNPNeCyP29xr0p10NP2txNlcnv
UxvKOfnGCd2qANG5ualg+VqzTyN+e4GnSxNAKOB7RxduPSu6x76h6btDsJQU5694XVcEiBAlopKvhRkRICE
iKgv6kr6JRl9sdjQRIDiJWXUwCsrUNZYAQXtNpLGphWYWHfCcSMzX6GE4k8QEtw/
4gbO32B6Hzbz84f9HOIG4evACX+9+v8QXEyo1WDgguLv9z+klrgKk1/vWa8kWpl9+Is/
xM041NtuGB+LsEUyI1+8zEyD7jlonOmh9zGAfiq4Gn7+WKQFy18vuPTteZEOAqJbMWOqEw+vUienJ90hbE/
o/
pltJNvYRBREgqgsVBgqQ7ZoSwqcNBAiXhmGJHA8nJHLOx+H3X81pdwGic3NTwfI1Pyew9gIthlEo+A07RfM
KRPfYyaucfXcIOvy5bRCp17y0nwgQITpEJV8LMyJAQkRUFnS3tqQUmx1NBAgOFNQ1CAcBBw2iu01QkslVBw
iQoXO22h6HAoSTZayv7/7UAt9dS7/
Et6HJOfCLQ2cEgFbJvWdsTL7W6nXLDtfRsLxSmwjQDeU7fabZNjwQJ2djTb2uHExH+XEridp31FlidWHvOd
rny/DXTAUIJp06sGQOQ01eVbIhQNReHLRSxdPM/
vA+1a2tPnBCgqVz833uFYI9XGqgANGVDQ3Ns95Hbtdgh7cbR1sChIcTEjnLqTj5rmuwJnSrc0B0M3VUsM/
NzwmsvcB5LFh2VuEz7NStaV73WJ3xB/
Kr8ZYAcdsgUq8pAkSIElHJ18KMCJAQEZUFfUXbLvPrIEDQu98NLomKxfUNxEFAFxt0twkKX8N0KnuQa6oxI
r/U9jh0nGpsStSLP
wz2ttcOW6SdGOwXiM7ukkNXBoclJP1nbXIVIDow+ec409xis/
90m5zNjex+HKy2kiivHg+358tf44Zqv+9pbW2lJdsPa8u5iOxN+xiqhatKNgTI6t12S2ZsUMbTTC/
jAyL7+xjNJoIIENUGFwN7U7DnhwOFvNs1uDQM5xJh+Z96msHJ90kPAaKzk1bBPrdswWt2zsaDNke8qhr3cs
xY3L1pXvdYt8ZyBs00cP6K13W/
KgJEiBBRydfCjAiQEBGVBc2NvtjsaCJAMLHRNRAHYTr0RqC7TVD4GrePaX8BgvMLiOz9Hlwvji461w1f5Hk
9EwHi9f06G1vcwR04ewt1G2AuQHQ/o7ml1TaTBQfXYcmOrh9FByZR6QiQOw0FiB/
YM4NxUQgFiDoHAhuU0TkJZ5/
E4gnR+KU+c5L2t4Ph69i7E0SAYAmllwApO+wUIENyrVJGt2vwycxtz1smAVj+p4oJFiD1je4CpGCbvwDB/
pmwgTNOdMGbICq6x7o1ljNoMe52Qi0CRIgyUcnXwowIkBARlQXNw9ew2RFnCriBiY2ugTgI2Jw9d1M0BAgm
VkREf5ho7Z5zuQbOSvn+iMVEZJWRXD/SaqgdkV/q+nNMn4/
uNcAEauicrWkLkNbWVtv8AZwbgQkrO2n5gZOqy49nX4C4TQ3/Up/
wCRB1pgZaqeJ7eUiuXYCcamy27Y4Py7PWHvbu+JWrIaolsNv7ZJdGgKDzlts1+GTm9jHWfcbyP3U2DSffOG
hVFSC6eTYq2D8TNtDhSxdurl26x77r0ljOYGmi2wm1es3L+uen/
TsKQkcRlXwtzIgAyRCxWIxycnJsMWzYsEDXiMqC5uFeaKVpIkAwsdE1EAcBffzzobk0KHyNH49Zltbz0V1T
Day5J7ILEAYtUH84soCIiE6faabK6tO2BvVNB6ptk+hTESC6EwTs0xk+tzRtAUJknz+AcyMwYd1SYbbmcVC
c1wlItwH6ZCbTAgQbsjEu7uM90yAbAkTtp0CHJHSlGjpnq+1xqpvTKBhaWAQCBHsM/Ji21kyAYA/
U6PnbHcYJbtdgYYQT5z/aYYlftR+Gk2+15BFZtsNfgOD7J2xgf4sumgIIkPdcGssZdPibs1G/
QSQCRIgyUcnXwowIkAwRi8Vo0KBBVFlZmYyTJ4Ml2VFZ0Dz9GZ1s1PIiHZjY6BqIgzCjyBIg2FwaFL7Gbc+
3vwBRpwffpxEg2OB74+gltsc/
ONkSIFsqamzWqakIkIoTzr4GrO8fNX97ctbLX94uSun3JrI7GeHuNTb1bj1otuZxF1e3hvhr1w5b5Pkceaq
3+ryD4uYYdbHPVOdsCBB0EIvFc2nSij3Jr2FPxtNzrRMOXTM9zgzZoJgH7DhUS1U1p32fy3QPe+kxYGixBw
TIBM3sCbdrsKnBz2Ai9woo/1tZdtT2eE6+VdMGRDdQU6V/
iAWIXz+Zm22w7rEzirwFCPa3uZ1Qq9fsJgJEiBBRydfCjAiQDBGLxejZZ59N6xpRWdDsrY/
DAE0ECJZu6HavgzCzyBokls78jo4UIJjwEdkbmBkUADc/u9T2eHTI2nqwxmadmooAOaRJFLG+//
mFO6i1tZW2VNS47o76/RwieyMx2rZiHf62SjNb5lqwSfWadH7Lc/
rXM9MCBG16Mb4cQgGCDfyxuN2iFU8knsm3Tjh006lfLLCEr6l5gIrXfBt01Nt79KT2+TJu12Bh9HOYyI2nb
2pDPiffjU0trutBZ4mtgu/fsHGmucX1fsXi7q5dusf6OQ9if5vbCbUIECHKRCVfCzMiQDJELBaj//zP/
6TPfvazdOWVV9KIESOoqUk/2MmNqCzoG9q89bGR1ESADJ+bOQGCk4yxuTQofI2HpqxP6/norqmGal15/
yTrRIPBPhm1LAwbnrdV1tLLS5wCBCd8+z2fw7XO+ShD86xTKpwTkervTWQvo0Hb1sXQ1Gs6mBKbhHVOalx7
7jd74KcZEiAjoRwp7ALkiNKEjLMcUBBgiZWulA0ds0zNA1SwhNJLgOCpjW72BH4f2kDz88I5LXj6tm6vXYD
wzA41SUfUUxPda+c3NyabtLS4O+J5PV/dYz/
wcR7E0935LifUDgHiUjYpCGEkKvlamBEBkiFGjRpFBQUFVFJSQuPGjaPzzjuPevbs6fk9DQ0NVFNTk4zy8v
JILGi2tsRGUhMBgjurugbiIHwAk4zR2jUoa/
cco8embaAjHsMKg4IfqnhqMW2NvXETezoYLFNTZ5P8AKY61zc22RJBFiU6K00UaxjH2gYIItjcjjatJizYc
oi+0neuw7oXd7HRNQldhUwHU2IZiW6WzOkzzVRSfsJ3N/eOsZkRIMdPNtL3Rix23FvdyQGSDQGCQ/
ZicbsgxhPFZxdsT/731YPnO66D7nem5gEqWEKpzo9BAYLD894qdDov8dd+NGqJzeWLn9f/
jrfsYPH0rWjfcdvP5PXSrCTpyKpd/gIETxDDSKYEiJ/
zIG6uLNxqJkAuFwEiRAgRIOkjAsSDeDzuaCxXo7S0VPu9r7/+Ov3rv/
4rNTS4J7YDBgzQXjPsC5qdZXAWh4kAwZ3VA5r+gyDMBgGCtd1hAD9Usf9BHcilEyAoAHCXXr0uEdkGQcbi3
pOXdQ3r1fVnHI/
D1whdkkxpbmm1NWYT2ZNIdE1CVyGdJbAO3KE2PTVBMi1AdNeIxXPpK329LUWzIUDUHgCc5YCCHns8vj10oe
M62LCeqgBBwfOVvnNtzwstvXHwpM76lb9250srbG5r3Kz+61ctAYIzS0rKT2hfd/
WUAFHLtnSvHRpthJFMCZA8l8ZyBv+2uZXIqtf82pPz0vrdBKEjEQGSPiJAPDh8+DCVlpZ6RmOjcxeZiGjz5
s2Uk5ND27Ztc71+VE9A7mhzlrGVbRgIkNHzrZ1VXQN0ED4ssRImrO0OA/
ihiiUkatnCAxoBMgruEU7rJiKavGovXfxEXtLKFmc3xOLek5fx3nPUnnYKkOcWWMmnrubehMfftQsQdEfCi
efoKmQ6mBITRNO+EaSjBMhf3/
Fu2s+GAFF39zGhzy2xptKjucH32qygESy9VF2pTMFTucvBaU0VIAdg7eisX1GAbK6wBAibGqAdLIpfFCtot
6sO7kTW7PEXIHiCGUYyJUDmbvJ2HkTDDLcSWREgQpQRAZI+IkDaiSlTptDHPvYxOn78uP+D24jKgubGTiyj
MBEguLPqNlnaFEyYeOpxWMAPVRycp9pR4oc0g/
foly87+znQqQZnN6gzC1R0c0PqG509Sph8qj0rpvxdESCH4B5g0zK6CpnOhcEE8bimhMwP/
t4eIEAuaysZu77N9jgV+Lp/mryOJq/
coxV3SDYECJF9Wv00SOjnbrLeT2hucMOoJY5rYP+GqX2yCp648GBTnQBB8aqzfuWv/
fylFTa759LKxPNCNyYUv6WV1mNVpy+3pFztG9G9dmi0EUYyJUDm+Vif/
2myVXqK81e8rnvFQBEgQnSISr4WZkSAZICVK1fSs88+Sxs2bKBdu3bRlClT6Pzzz6d777030HWisqB/
2dbYibuYJgLkhUVWcl1Z7W/V6cWcjVbChI3NYQA/VKtPWXX3at00fkgzKADufmWV58/
BOSwX+kzeVmc7xOLW9GdkHDS2qz0rpqgC5HCt1fyMTcvLwVUoiC3zzqralJufdQJk+6Fa6jm1OK3ZNHzdfr
M2GT3+J1kSIJf0zUv+XGzUx6n0aG5wq8ZNDMUDJ/
pBwRLKbz210FWAoHPXzCKn8xIKEBQV29vK83DWDorfHVAaqb533AWIvW9E99qh0UYYSUWA/
HN6YjYRD0SNxf2tz9EwA+evIDur6mzrQASIECWikq+FGREgGWD9+vX0rW99i84991w6+
+yz6dJLL6WhQ4d69n/oiMqCfvit9ckPliACBJNrnQVsEPJAgGBpRRjAD3WcK6BaV+oEyPilVvL3m9cKPX/
OW4VWKYzf5G101+LQTT5+ZanV2O43bMyNx6bZBcjROr0AQVvTdF3RTEkKEKXBP1PXDbsAwXIn7EnCmSy4Br
BUjcH3XiplcET2EsrvPL3Iti5xqGlltXV6pnNeQgGyrdISFWxqgM3Q2K9SBhPWLzIUIGrjuu61Q1e0MJKKA
GltbaWa02foydmbk49dVOotQB5q+4yIxf179PhxV4oAESJEVPK1MCMCJEREZUEfqWugxduqbPX4o+a597ow
WNphMqzMCywZUYehZRv8UMeSIbUJHR2yGGws/92E1Z4/B4fH+Q2+wwFpHLqm9dfh5/t5/
bvRc1qx7fc6UW9NL8ddaLQ1TdcVzZSuLkCw3AlPFNASGd3V7tKUAc6HCfbbUzACILKfYKK7WyxuN7TA8r0P
S7wFCJ5qsEMaljlivwoOOFTFu1tSvmG/
vXFd99qN6oQChMHGcj8TkYdBgPj16IkAEaJIVPK1MCMCJEREcUHzh8dIAwGCpR1VtekKEKtkJNVynPZC/
VDn/
56mNNFimQIzaYXV13HfxDWePwdtkP3mTvSe4ZzYrQP7SvysNt3oOdUuQND+FcUi2pqma0pgCv+8n7STABn8
4Rajx2erB+SaoVa5EwrMpeBIhuYG97zqPIUrSGF+iwqeotwJwwJVAYI9VDrnJRQgO6ssAcKmBrjusVwMndl
U8e72HlGds3SvHZo9hJF0BAgPqxzwwWbfx/
7l7aLkdXH+itdz+vogp+WzIISVKOZrYUMESIiI4oIOIkCwtEM3BC8IWLOeqhNPe+EmQND2lIjooSnrHR/
+Uwqtvo4H3ljr+XOmgwuZn+0rWuN6JRxoserndOPG3xQBcrLBGh5YBOVyhSBA0jUlMKW9BMhLBWV0w6gldN
Rwnky2BAjOLMGSJuzHQRH6B40Ixseazm9RwRPMxaVVNrtcFCDYP6SbqI0CBMuqdreZGmDZJ57WYHO7Kt7d3
iPonOX22qGLXBhJR4C0trbS/mP1nm57zKPvWAJkjU+PnggQIYpEMV8LGyJAQkQUF3QQAYKlHekO/
sMyELbcDAtuAkRt3MQ6aQYtTv/85jrPn4NuRF/t5y1AsCzKK+HAsi63AWJ+qAIE50+gAMG5Cun2BJnCP+/
2MZkVIEHJVgnWj0ZZjcRY0oTlcGhu8OBkpwhG4agbBmkCnmDymuD/
x34ynN6um6h99eAFFIvn0rglZbQLBAgbCqBRBoolLO1Sh0amI0Bw3k4YSUeABAH/
BhT7lMjy464SASJEiCjma2FDBEiIiOKC5g+PZ/KDCRDTnWI3FmSgDr29UD/
U522upGfytzl2DnUCBE81Hn5rvefPweSqW3/vKcKmJVg4XNLNv98P3P0kIlsjPhoGrIW5CumW5JnCP+/
HY5zuTh1JtgTIrc8tS/
5ctIVGMYjmBo+87Zxngm5QpgMkVfAEk0sodQIEDQx0griq9jTllhykpuYW2g19HWxqgGsMnyuerKinh27vk
S0VNbav6V47dPoLI+s1jfTt8XyxDNPPYEIEiBBFopivhQ0RICEiigs6iADBButjKcxwQNC1J9Vd2PbC9EP9
YY0AQVHhN8wO7VAvH+AtQA7XNlCPFz7yHZSGs12Wpzhh/
q+KAGmC6eU4jRrnKqRbkmdKVxcgPdqGiMbi9lkO+FrgKdhj0zY4rrGx3DoJMB0gqYInmDxLpFvbPBY8JTt2
0jIwcJuozew96hQgaOOLfyfwuqYCBG1+3V47LPkKK7jx0V4CBJv/
TzU67b4RftzVg0WACNEhivla2BABEiKiuKACbQEGAAAf4ElEQVSDCBB0WEpliByyqNRKYFJNgtoL0w/
1R94ucjwO7Ul7Ti32/H58bBAP/cWlVTY3KgQF0Cqf5lE3/
qL8XugEhjNbMOlN90TMlLAIkGz1gPxi3Art64sWs9PgFKzX+yWOa+DAP9MBkiq6E8zq+jOOcsrjIBT8TuT2
HbUay9mlCae/
49DE6nrLGMG0BwRtft1eOzwdCitoftFeAgTXmR8iQIQoEsV8LWyIAAkRUVzQQQQIuuucqE9PgCwutZx40hk
g1x6YfqiriTqRvTn38Xedu88IOgllqoETJ8zjaUUQdL8X/
z9OrUcBku6JmCn88257vmuegGCzN5o3oMPTe1AG2F9jK4xuU6m+9/
AE06uMCy2cl7hM1GbQ2QpNDcYvLaNe72+0lUDWgTHCxX3MBAja/KprGVmz51jag1bbE5w/
1F4C5PqRBcbXtQTIgow+B0FoT6KYr4UNESAhIooLmj88RuSX+j52IgiQ6lNn0vq5OLego4bYmZKOAMHSFN3
uM4KNvJnaPcRr+jWPuqE72eH/
R0tOFCDpClJTuroA+d2E1dr3DTZYYxnekFynrTCWOgWZYI+YbiDgScWyHd4CpPy4JUD8BMCpRqsvyXQQIQo
v1VI7SmB5VHsJkCsGzhMBInRqopivhQ0RICEiigs6iADBGRc1p9MTIDiLwG8oVkdj+qGu9koQ2YXVcwt2eH
4/ipVvDMnMhzeWxuDk6CDoelv4/7HsBxuE0xWkpvDPu/U5ESDV9dY9x/
4GLMMbPtf5vj4AFrapin9c515DKKtPWQLErycJn5ffoFM0RvhiL/
tr4Pb+RZvf99bZh4pGCRwo2F4CJMh1M/
03TBA6gijma2FDBEiIiOKCDiJAcL5AbZoCBAenha3cwfTDV3WLIiJatsP6vXBStQ4sY+n+VGY+vHFnGge3B
UHn7tVj7HK6cuA8On3GakhFAZKuIDWlqwuQX41fmfy5zS1WSRKWF80Gc4NnF2x3XAOHA6YqQHADwev9WwtD
LFf4CBBsOPdzVUNjBPU1cPt3tPn1e2+GmfsnrQmlAPmmCBAhQkQxXwsbIkBCRBQXdBABMhkESF1DU1o/
FxN1v93Ojsb0w1edl0FEtKLMGvK2bu9xj+
+2i4Vrhi7MyHNHYZfqkDndgMWWllY609xie9waECDprgdT2AXsox2pOXxlimwJkDvABQvB3X3sAxq7eKfjG
ugglaoAWQLrzMsBDXs1VpR5v2aV1ZYw8pszhMYIpgJkD9j84hT5qPGHie0vQG4fk1jfd7+yyvexmd5EEYSO
IIr5WtgQARIiorigAwkQGHB2MoMCJN2hhpnG9EO9p06AwJRpP2taTOK+nSEBgj8/
VYcjdNnxAgVIfWPHCBAiSnvtZYJsCZCbn13qm1yjEcKry3Y5roGnEqk60GEJllf/
z0kQIH6ubHgCYmJqEFSAoMsWDnGMGliG114C5GD1KXph0Y5Ar4MIECFKRDFfCxsiQEJEFBc0f3joasVV3gQ
Bkm7CiTv16Vr6Zpp0BAjW36uDC1VQhF07bFFGnjtOuU51dzsVAeI3K6CzkS0B8oNn9O5E6CCVD0MC31i5x3
ENnGy/I8UhoGij7VWOWd9oCRA31ykGBYjJ34SgAgTvEQ5xjBr3vm4JkAt6tY8ACQL//
G89lZlNFEHoCKKYr4UNESAhIooLmj88njYQIFMKLQGSbsKJu//
YTBsGTAUIl730A6vT6vozdNWg+fTQFO8p6ET2cq3rhmdGgGBfRqq9NX9+00yA4PRt7A3pCmRLgFwzdKH252
IDNxoRvL16n+Ma2D+hzu0wBQ0UvP4WoFsVzpDRgQLE5G9CUAGCLltzN1VSVPnNa4UiQAQhTaKYr4UNESAhI
ooLOogAeavQmrCcbsKJJRzpNrRnmiBlDY1NLY5/O9Pc4nv6QWQ/
QfjeiMUpPVeV9TCQLtXp5DhnwAs8bdHdh85MtgTIlS72qNg/gb1F72rsZrF/
YnuKJyBo9+z12uNpi99cGpsAMXBVCypAUKThFPmocc+r4RQgmepjE4SOIIr5WtgQARIiorigvz5ovlFyQET
09uoMChBIkjqyf8CEIAIkHVAs/OCZgoxcEydipzqbg3fQb/
FxmkIBojaod3ayJUC+0neu9udW1VoCBB2q3Nyenp5bSo9N22AklHXMgSGaLS3u10ABsn6ftylDewsQvP7Cr
Yd8rx9W7n7FGkYpAkQQUiOK+VrYEAESIqK4oGtPn6FtlWa7oO+AAGloSk+AoAVt2Mp3/
nd84gO+xwsftevPwenV148syMg1UdSkc7K0rbLW93VBAdLskYR2RrIlQMYu3kmxeC79/d0Ntn8/
WteQfD5Y3phb0j69Dh+WVBj9/
jivw28wZsWJ9hUgh2rsp0RRBa2YvxgiAZIpIw1B6AiimK+FDREgIaKzL+ipaywBkm7JDdaph61859jJRnpl
6a6US5hM2VxhTa/
+0aglGbnmur2WAGlvYYcCJNWd9KiSLQHS0tJKG8urHSdOJ+ota108Aclvp1IjNFvw4gz0m2zIsgDB+SdLtn
tPZQ8zv3w5nALkjrHLs/
YcBCEonT1f6whEgISIzr6gp63Zn7GSG2xibepi5TvMtkpreNyNozMlQI5l7DXyYxUIkK5GtgSIGzVgrYsCp
L1KjWYUlRv9/tjwXlKeXQFyuNY6JVq2I7oC5K5xlgC5sPecrK/
D5TuP0D2vFtLeo6nZfgtCNujs+VpHIAIkRHT2BT1t7f6MiQa0Cu1qu+cMDo+7+dmlGbkmCpD2vq9dWYBgEh
gGcN4GGjy0107/9HVmAqS5xWp433Sg2vOx6JhlIp6DCpAjUKbmN5U9zPz8pRWhEiCCEEU6e77WEYgACRGdf
UG/CwIk3Zp/
HJbWVdl79GTyHvg1fJuCNrztTVcWIGWH6+j6Zwpo+rrybD8VIrI3e6MAaa9EGzcjvGgBAbK5wluAEBHtPnL
SeCc9qADBCfB+U9nDzAcbEv0397xaKAJEEFKks+drHYEIkBDR2Rc07np6Od+YkLdRBAjOJbg1QwLkOCRZ7c
3Ksq4rQMJGY5NV6oQOc2t8Zm+kChpSeIGWv6nOHHEjqADB98bKMu+p7GGn7HAdnWluEQEiCCnS2fO1jkAES
Ijo7Av6PRAg6Zb35JaIAMHZDT8ekxkBQpSY+NzeDfRE9kGKQnbBUicUIEU+1repgkNJ/
eDHpWoL7XddUwFSXW/1yazaFW0BwogAEYTU6Oz5WkcgAiREdPYF/f56s7pvE0xtPDszWJN+
+5j2tfxtD0SAhAc8aUABsrHcv+wpFSav3GP82u8+cpJKKzP/
NzGoAMFGfREggtC16ez5WkcgAiREdPYFPbPIzHrTBK5j7sofnGidGkUBsulAdZd/
DcMEvxaLSi2HuUyXPTHsWJWp+TWpEFSA1IIAKRQBIghdms6er3UEIkBCRGdf0Kbe/
x19raiCCdFtz2euBKsjGTlvG71VuC/bT0MgK/HGIZ/
7jta32887frKx3a2evQgqQNApbPXu9umN6WguEgEiCCnR2fO1jkAESIjo7AtaBEhmQdvRTNnwCl0XFCDPLt
hOQ3K3ZPsptStBBUh9oyVA2qs5v6MRASIIqdHZ87WOQARIiOjsCzqTZVOmg8w6Mzgl+qbRIkCE9OC1NH9L+
wwfDBtBBQhaFa/tJALkS31EgAhCKnT2fK0jEAESIjr7gp6dQQHynuEgs84Mzki4YVRmJqELXRdeS/
mbK7P9VDqEoAKkockSIOv2igARhK5MZ8/XOgIRICGisy/oTDpXFe07Lh+cZCVLP8xiM6/
QOeC1dLD6VLafSocQVIDgrJR1e9vHnrijEQEiCKnR2fO1jkAESIjo7As609a5s4oP0Ib9JzJyrajC9/
MHzxRk+6kIEedEfWO7Np2HjaACpAlKHte303yUjkYEiCCkRmfP1zoCESAhorMvaBkemHn4fn53+OJsPxVBi
BRBBQgOa2yvAY0dzcV98uRvsiCkQGfP1zoCESAhorMv6DkbRYBkGr6f33l6UbafiiBEii/
2CiZAcFhjcSc5eRUBIgip0dnztY5ABEiI6OwLOk8ESMbh+3ntMBEgghAENwtaNwGCX+sspZ8iQAQhNTp7vt
YRiAAJEZ19Qc/dJAIk0/D9/
NZTC7P9VAQhUlz8hD75NhEgJeUiQAShK9PZ87WOQARIiOjsC3rupkr5sMswfD+/OWRBtp+KIESKS/
qmLkBO1Dd21NNsV0SACEJqdPZ8rSMQARIiOvuCzt8sAiTT8P28erAIEEEIwlf6zg0sQCqr
T9OeIyc76im2O26nQIIgeNPZ87WOQARIiOjsC3qeCJCMw/fzqkHzs/
1UBCFSfLVfcAHS2RABIgip0dnztY5ABEiI6OwLektFjXzYZRi+n1cMnJftpyIIkaJb/
3wRICJABCElOnu+1hGIAAkRXWFBT19XTit2Hsn20+g0cPJw+YD8bD8VQYgUX3tynggQESCCkBJdIV9rb0SA
hAhZ0EJQOHno1l8EiCAE4cqBIkC+LAJEEFJC8rX0EQESImRBC0Hh5OGr/
eZm+6kIQqS4atB8ESAiQAQhJSRfSx8RICFCFrQQFE4eLumbl+2nIgiR4urBIkBEgAhCaki+lj4iQEKELGgh
KJw8XNxHBIggBOEbQxaIABEBIggpIfla+ogACRGyoIWgcPJwUe852X4qghApuj8lAsRtGKMgCN5IvpY+IkB
ChCxoISicPHyxlyQQghCEbw9dKAJEBIggpITka+kjAiREyIIWgtKVkiVByCTXDlvU5QWI2zR4QRC8kXwtfU
SAhAhZ0EJQulKyJAiZ5LrhIkDkBEQQUkPytfQRARIiZEELQelKyZIgZJLvDl8sAkQEiCCkhORr6SMCxIAhQ
4bQt7/9bTrnnHPo3HPP1T5m3759dNttt9E555xD559/Pj3+
+OPU1NQU6OfIghaC0pWSJUHIJN8fIQJESrAEITUkX0sfESAG9O/
fn0aPHk2PPfaYVoA0NzdTt27d6IYbbqDi4mLKy8ujz33uc9S7d+9AP0cWtBCUrpQsCUImuX5kgQgQESCCkB
KSr6WPCJAATJw4UStA8vLy6GMf+xgdOnQo+W/
jxo2jz3zmM9TY2Gh8fVnQQlC6UrIkCJnkR6OWiAARASIIKSH5WvqIAAmAmwDp168fXXHFFbZ/
2717N+Xk5FBRUZHx9WVBC0HpSsmSIGSSG0eLABEBIgipIfla+ogACYCbAHnggQfopptusv1bfX095eTkUF6
e+4TqhoYGqqmpSUZ5ebksaCEQXSlZEoRMcvOzS7u8ALm0nwgQQUgFESDp02UFSDwep5ycHM8oLS21fU+mBc
iAAQO0P1cWtGBKV0qWBCGT3PLcMhEgIkAEISVEgKRPlxUghw8fptLSUs9Q+zcyXYIlJyBCunSlZEkQMsltz
4sA+aoIEEFICREg6dNlBUgq+DWhV1VVJf9t/
Pjx9JnPfIYaGhqMry8LWghK96cWUCyeS98YsiDbT0UQIsXtYz4SASICRBBSQvK19BEBYsC+ffuouLiYBg4c
SJ/61KeouLiYiouLqa6ujogsG96bbrqJNmzYQPn5+XT++eeLDa/
Q7uysqqNH3yminVW12X4qghAperwgAkQEiCCkhuRr6SMCxIDf/
e532l6NgoKC5GP27t1Lt956K51zzjn0uc99jv7+97/
LIEJBEISQcsfY5SJARIAIQkpIvpY+IkBChCxoQRCEjuFnL4oAEQEiCKkh+Vr6iAAJEbKgBUEQOoZtlbV05c
B59PpHu23/3pUEyGX987vM7yoImUTytfQRARIiZEELgiB0HK2trY5/
EwEiCIIfkq+ljwiQECELWhAEIbuIABEEwQ/
J19JHBEiIkAUtCIKQXUSACILgh+Rr6SMCJETIghYEQcguXUmAdBMBIggpIfla+ogACRGyoAVBELKLCBBBEP
yQfC19RICECFnQgiAI2UUEiCAIfki+lj4iQEKELGhBEITsIgJEEAQ/
JF9LHxEgIUIWtCAIQnbpUgJkgAgQQUgFydfSRwRIiJAFLQiCkF1EgAiC4Ifka+kjAiREyIIWBEHILiJABEH
wQ/K19BEBEiJkQQuCIGQXESCCIPgh+Vr6iAAJEbKgBUEQsosIEEEQ/
JB8LX1EgIQIWdCCIAjZpSsJkIGzt1Asnks/
f2lFtp+KIEQKydfSRwRIiJAFLQiCkF26kgBpaGqmeZsrqeb0mWw/
FUGIFJKvpY8IkBAhC1oQBCG7dCUBIghCaki+lj4iQEKELGhBEITsIgJEEAQ/
JF9LHxEgIUIWtCAIQnYRASIIgh+Sr6WPCJAQIQtaEAQhu4gAEQTBD8nX0kcESIiQBS0IgpBdRIAIguCH5Gv
pIwIkRMiCFgRByC4iQARB8EPytfQRARIiZEELgiBkFxEggiD4Ifla+ogACRGyoAVBELKLCBBBEPyQfC19RI
CECFnQgiAI2UUEiCAIfki+lj4iQEKELGhBEITsIgJEEAQ/
JF9LHxEgIUIWtCAIQnYRASIIgh+Sr6WPCJAQIQtaEAQhu4gAEQTBD8nX0kcESIiQBS0IgpBdRIAIguCH5Gv
pIwIkRMiCFgRByC4iQARB8EPytfQRARIiZEELgiBkl/
lbDlG3Afm0cOuhbD8VQRBCiuRr6SMCJETIghYEQcg+LS2t2X4KgiCEGMnX0kcESIiQBS0IgiAIghBuJF9LH
xEgIUIWtCAIgiAIQriRfC19RICECFnQgiAIgiAI4UbytfQRARIiZEELgiAIgiCEG8nX0kcESIiQBS0IgiAI
ghBuJF9LHxEgIUIWtCAIgiAIQriRfC19RICECFnQgiAIgiAI4UbytfQRARIiZEELgiAIgiCEG8nX0kcESIi
QBS0IgiAIghBuJF9LHxEgIUIWtCAIgiAIQriRfC19RICECFnQgiAIgiAI4UbytfQRARIiqqurKScnh8rLy6
mmpkZCQkJCQkJCQiJkUV5eTjk5OVRdXZ3t1DGyiAAJEbygJSQkJCQkJCQkwh27du3KduoYWUSAhIiWlhYqL
y+n6urqrKt7VPhyIiP3SO6R3KNsh9wjuUdyj+QehSX2799POTk5dOLEiWynjpFFBIjgSk2N1Dj6IffIH7lH
/sg98kfukT9yj/yRe+SP3CN/5B6ljwgQwRV5g/kj98gfuUf+yD3yR+6RP3KP/JF75I/cI3/
kHqWPCBDBFXmD+SP3yB+5R/7IPfJH7pE/co/
8kXvkj9wjf+QepY8IEMGVhoYGGjBgADU0NGT7qYQWuUf+yD3yR+6RP3KP/JF75I/cI3/
kHvkj9yh9RIAIgiAIgiAIgtBhiAARBEEQBEEQBKHDEAEiCIIgCIIgCEKHIQJEEARBEARBEIQOQwSIIAiCIA
iCIAgdhggQwZWxY8dSLBajs846i7p3706rV6/O9lPqMJYuXUq33347/dd//
Rfl5OTQzJkzbV9vbW2lfv360ec//3k6++yz6Uc/+hHt2LHD9phjx47Rr3/9a/
r0pz9N5557Lt13331UV1fXkb9GuzF06FD6xje+QZ/61Kfo/
PPPpzvuuIO2bdtme8zp06fpoYceos9+9rP0b//2b3TnnXfSoUOHbI/Zt28f3XbbbXTOOefQ+eefT48//
jg1NTV15K/Sbrz00kt0+eWX06c//Wn69Kc/
Tddccw3l5eUlv97V74+OYcOGUU5ODj366KPJf+vq92nAgAGUk5Nji0suuST59a5+f5gDBw7QPffcQ5/97Gf
p7LPPpm7dutHatWuTX+/qf7NjsZhjHeXk5NBDDz1ERLKOiIiam5upb9+
+dMEFF9DZZ59NF154IQ0aNIhaW1uTj+nq6yiTiAARtEydOpU+
+clP0oQJE2jLli30wAMP0HnnnUdVVVXZfmodQl5eHj3xxBM0Y8YMrQB5+umn6dxzz6VZs2ZRSUkJ9ejRg77
4xS/
S6dOnk4+55ZZb6IorrqDCwkL66KOP6Etf+hLdfffdHf2rtAs333wzTZw4kTZv3kwbNmyg2267jf7nf/
6HTp48mXzMn//8Z/p//+//
0aJFi2jdunV0zTXX0LXXXpv8enNzM3Xr1o1uuOEGKi4upry8PPrc5z5HvXv3zsavlHFmz55Nc+bMoR07dtD
27dupT58+9IlPfII2b95MRHJ/
VNasWUMXXHABfe1rX7MJkK5+nwYMGECXXXYZVVZWJuPIkSPJr3f1+0NEdPz4cYrFYvT73/+eVq9eTbt376Z
58+ZRWVlZ8jFd/W/24cOHbWtowYIFlJOTQwUFBUQk64iI6KmnnqL/+I//
oNzcXNqzZw9Nnz6dPvWpT9Hzzz+ffExXX0eZRASIoKV79+708MMPJ/+/
paWFvvCFL9CwYcOy+KyygypAWltb6fOf/zw988wzyX+rrq6ms846i9555x0iItq6dSvl5OTYduDmzp1L//
Iv/
0IVFRUd9+Q7iMOHD1NOTg4tXbqUiBL34xOf+ARNnz49+ZjS0lLKycmhVatWEVFC5H3sYx+z7bKNGzeOPvOZ
z1BjY2PH/gIdxL//+7/Ta6+9JvdHoa6uji6++GJasGABff/
7308KELlPCQFyxRVXaL8m9ydBPB6n6667zvXr8jfbyaOPPkoXXXQRtba2yjpq48c//
jHdd999tn+788476Z577iEiWUeZRgSI4KCxsZE+/vGPO3b97733XurRo0eWnlX2UAXI/2/
v7kKi6OI4js+2tlsWvrVrqctIF0aBFwUmSRCEIURBBJUYkVQkhr0IUm5EdBFKFyFEIRhFEslWhBURWPRikF
Egrq4YhaRWVBCEpBRJ2e+5WJ0cd3uubOLx+X5gL/bMsMz+ORz9zc4559WrVzIMQ+Fw2HbeqlWrtH//
fknS+fPnlZKSYjv+/ft3ud1uNTc3//mLdlhvb68Mw1B3d7ck6f79+zIMQ4ODg7bzTNNUXV2dJOno0aMx/
1j19fXJMAx1dHQ4c+EO+fHjh0KhkDwej3p6eqjPJNu3b1dlZaUk2QIIdYoGkMTERGVkZGjhwoXaunWrXr9+
LYn6jFuyZIkqKyu1adMm+f1+LV26VGfPnrWOM2bbjYyMaN68eaqpqZFEPxpXU1Oj7OxsvXz5UpLU2dmp9PR
0Xbp0SRL9aKoRQBDj3bt3MgxDT548sbUfPHhQ+fn5f+mq/p7JAaStrU2GYej9+/
e28zZv3qwtW7ZIig5kixYtivksv9+v+vr6P3vBDhsdHdW6deu0cuVKq62pqUkejyfm3OXLl+vQoUOSpN27d
6uoqMh2/
MuXLzIMwzZX4r8sEolozpw5crvdSk5O1u3btyVRn4lCoZByc3OtRxgmBhDqFL3zfPXqVXV1damlpUUFBQUy
TVNDQ0PUZ4zX65XX69Xhw4fV0dGhhoYGzZo1S42NjZIYsye7cuWK3G63dUeefhQ1Ojqq6upquVwuJSQkyOV
yqba21jpOP5paBBDEIIDYEUD+XXl5ubKzs/
X27VurjT9oUSMjI+rt7VV7e7uCwaB8Pp96enqoz5g3b94oPT1dXV1dVhsB5N8NDg4qKSlJ586doz5jZs6cq
YKCAlvbvn37tGLFCkmM2ZMVFRVp/
fr11nv6UVQoFFIgEFAoFFIkEtHFixeVlpZGkP1DCCCIwSNYdjyC9XsVFRUKBALq6+uztfOTfnyFhYUqKyuj
PmOuX78uwzDkdrutl2EYcrlccrvdunfvHnWKIy8vT8FgkH40xjRN7dq1y9ZWX1+vzMxMSYzZEw0MDGjGjBm
6ceOG1UY/igoEAjpz5oyt7fjx49aqc/SjqUUAQVz5+fnau3ev9X50dFRZWVlMQteviWgnT5602j5//
hx3Ilp7e7t1zp07d6bNRLSfP3+qoqJCmZmZMUsQSr8mx167ds1qe/HiRdxJjRNXVmtoaFBSUpK+ffv257/
EX7B69WqVlpZSnzFDQ0Pq7u62vfLy8rRt2zZ1d3dTpziGh4eVmpqqU6dOUZ8xJSUlMZPQKysrrV9FGLN/
OXbsmBYsWGBbPpd+FJWWlhbzK0Vtba1ycnIk0Y+mGgEEcV2+fFler1eNjY16/
vy5ysrKlJKSErMu+HQ1PDyscDiscDgswzBUV1encDhsTf48ceKEUlJSdPPmTUUiEW3YsCHuUnzLli3Ts2fP
9PjxY+Xk5Eybpfj27Nmj5ORktba22pZ2/
Pr1q3VOeXm5TNPUgwcP1N7eroKCAttjEuPLOhYVFamzs1MtLS3y+/3TZlnHYDCoR48eqb+/
X5FIRMFgUC6XS3fv3pVEfX5n4iNYEnWqqqpSa2ur+vv71dbWpjVr1sjn8+njx4+SqI8UXcI5ISFBNTU16u3
tVVNTkxITE63JwxJjthS9kWiapqqrq2OO0Y+k0tJSZWVlWcvwNjc3y+fzWY+hSfSjqUQAwW+dPn1apmnK4/
EoPz9fT58+/duX5JiHDx/G3bSptLRU0q/
NiObPny+v16vCwkJr5Yxxnz59UklJiebOnaukpCTt2LFj2mxGFK82hmHowoUL1jnjG1ulpqYqMTFRGzdu1I
cPH2yfMzAwoLVr12r27Nny+XyqqqqaNhtb7dy5U9nZ2fJ4PPL7/SosLLTCh0R9fmdyAPm/
16m4uFgZGRnyeDzKyspScXGxbX+L/
3t9xt26dUu5ubnyer1avHixbRUsiTFbit6JNwwj5ntL9CMp+ovsgQMHZJqmtRHhkSNHbMsM04+mDgEEAAAA
gGMIIAAAAAAcQwABAAAA4BgCCAAAAADHEEAAAAAAOIYAAgAAAMAxBBAAAAAAjiGAAAAAAHAMAQQAAACAYwg
gAAAAABxDAAEAAADgGAIIAAAAAMcQQAAAAAA4hgACAAAAwDEEEAAAAACOIYAAAAAAcAwBBAAAAIBjCCAAAA
AAHEMAAQAAAOAYAggAAAAAxxBAAAAAADiGAAIAAADAMQQQAAAAAI75B372aPFt9Zm9AAAAAElFTkSuQmCC\
" width=\"800\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sigma = 4\n",
"sig_noisy = sig + rd.normal(size=sig.shape)*sigma\n",
"\n",
"plt.figure()\n",
"plt.plot(sig_noisy)\n",
"plt.xlim(XLIMS);\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"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 = $('<div/>');\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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all '
+\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\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 = $('<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 = $('<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 = $('<canvas/>');\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 = $('<div/>');\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 = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all
' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\
n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt ===
mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then
trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\
n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id:
this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format =
format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\
n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL ||
window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21)
== \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message
type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \",
msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type +
\"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-
in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from
http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the
document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-
home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-
arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-
right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan
axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"],
[\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"],
[\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-
save\", \"download\"]];\n",
"\n",
"mpl.extensions =
[\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm)
{\n",
" // Create a \"websocket\"-like object which calls the given IPython
comm\n",
" // object with the appropriate methods. Currently this is a non binary\
n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage
function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a
real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id +
\"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in
FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' +
width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\"
width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\"
title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></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 = $('<span class=\"mpl-message\" style=\"text-
align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline
pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\"
title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove
icon-large\"></i></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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 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"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img
src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAGQCAYAAABWJQQ0AAAgAElEQVR
4nOydd3gUVdvGJ72RJdHQwUBQOhK6NKOIAiKgguAHahTQV0AM6ksRhAQRFH3Z0AIEkC5FpdgCLEKAEAiEEG
pg0wukkF5I3d37+2Mzk51t2ZTdnSXP77rOBZk5O3Nm9tndc895CgOCIAiCIAiCIAgTwZh7AARBEARBEARBN
B1IgBAEQRAEQRAEYTJIgBAEQRAEQRAEYTJIgBAEQRAEQRAEYTJIgBAEQRAEQRAEYTJIgBAEQRAEQRAEYTJI
gBAEQRAEQRAEYTJIgBAEQRAEQRAEYTJIgBAEQRAEQRAEYTJIgBAEQRAEQRAEYTJIgBAEQRAEQRAEYTJIgBA
EQRAEQRAEYTJIgBAEQRAEQRAEYTJIgBAEQRAEQRAEYTJIgBAEQRAEQRAEYTJIgBAEQRAEQRAEYTJIgBAEQR
AEQRAEYTJIgBAEQRAEQRAEYTJIgBAEQRAEQRAEYTJIgBAEQRAEQRAEYTJIgBAEQRAEQRAEYTJIgBAEQRAEQ
RAEYTJIgBAEQRAEQRAEYTJIgBAEQRAEQRAEYTJIgBAEoZXz589jxYoVKCgoMPdQCIIgCIJ4giABQhCEBsnJ
yXB3d4dYLNbY5+PjAx8fn0Y9n7+/
PxiGvo6Mia+vLzw9Pc09DA5PT0/4+vqaexiCp7i4GDNnzkSrVq3AMAz8/
PzMPSSjIrTvAmN83xEEQQKEIMxOfHw8PvnkE3Tq1AkODg5wdXXF0KFDsW7dOpSWlpp8PJWVlRg8eDC+
+OILrfvr+4P8+PFj+Pv7IzQ0VGOf0CYdDeHu3bvw9/dHUlKSuYfCgwSIMAgKCsKuXbsM7v/111/
DxsYGAQEB2LdvH65du2a8wQkAbd8Fnp6e8Pf3N8t4SIAQhHF4Mn7xCcJC+fvvv+Hk5AQ3Nzd8/
vnn2LZtGzZt2oR3330XdnZ2+Pjjj00+pujoaAQGBkKhUGjdX98f5OzsbDAMo3UiUVVVhbKysjofU4j89ttv
YBhGq9AyJ5WVlSgvLzf3MDiaqgDp2bNnnT4/
gwcPxrBhw4w3IIFBAoQgmgYkQAjCTCQmJqJZs2bo1q0b0tPTNfbHxcVh3bp1DT6PQqHQuZIil8vrPPE3hgB
5kqiLANH33jzp1FeAVFVVoaKiovEHZCLqKkA6deqEcePGNdr5hX7/SIAQRNOABAhBmIlPP/
0UDMMgPDzcoP5VVVX49ttv4eXlBXt7e3h6euLrr7/
WeKrt6emJcePG4eTJk+jfvz8cHBwQGBgIAGAYBnPnzsX+/
fvRo0cP2Nra4tixYwCUYiQwMBA9evSAg4MDWrZsiU8++QR5eXm846v/
IFdUVGDZsmXo168fRCIRnJ2dMXz4cJw9e5brk5SUBIZhNBo7qdA26ajr9YaFhWHgwIFwcHBAp06dsGfPHoP
uq6HXbch5du3apfU6WTGi770BgH379qFfv35wdHSEu7s7pk6ditTU1FqvoaioCH5+fvD09IS9vT1atGiBUa
NGISoqiuujzQUrJycH7733HlxdXdG8eXN88MEHuHHjBhiG4bkJ+fr6wsXFBQ8ePMDEiRPh4uICDw8PfPXVV
5DJZLxj/vTTTxgyZAieeuopODo6ol+/
fvjtt980xmyIAGHt5qeffkJgYCC8vLxgbW2N6OhoAEB5eTmWL1+Ozp07w97eHu3bt8eCBQu0rvTs27cPAwc
O5FYcR4wYgVOnTnH7dYljQ4WSIXbk6empYRu6JrehoaFabYl17cvKysKMGTPQsmVLODg44Pnnn8fu3bsNvn
/
s8Q8fPoyAgAC0bdsWzZo1w6RJk1BQUIDy8nL4+fmhRYsWcHFxwYcffqjzvtbHZgEgLCwMAwYMgIODA7y8vL
B161aDBUhCQgImT54Md3d3ODk5YfDgwfj777+13sPDhw/ju++
+Q7t27eDg4ICRI0ciLi5OYzzBwcHw8vKCo6MjBg4ciAsXLmgVIHWxO4IgtEMChCDMRLt27eDl5WVwf19fXz
AMg8mTJyMoKAgffPABGIbBm2+
+yevn6emJZ599Fu7u7li8eDG2bt3KTYAZhkH37t3RokULrFixAkFBQdxkbtasWbC1tcXHH3+MrVu3YtGiRX
BxccHAgQNRWVnJHV/
9Bzk7Oxtt2rTBl19+iS1btuDHH39E165dYWdnxx27pKQEW7ZsAcMweOutt7Bv3z7s27cPN2/
eBKBdgNTlert27YpWrVphyZIl2LRpE/r16wcrKyvcuXOn1vtq6HUbcp6EhAR8/
vnnYBgGS5Ys4a4zMzOz1vfmu++
+g5WVFaZOnYrNmzdjxYoV8PDwQMeOHZGfn6/3GqZNmwZ7e3t8+eWX2LFjB9asWYPx48dj//
79vPupKkDkcjmGDBkCGxsbfPbZZ9i0aRNeffVV9OnTR6sAcXR0RM+ePTFjxgxs2bIFkyZNAsMw2Lx5M28s7
du3x5w5c7Bp0yaIxWIMGjQIDMNoTA7rIkB69OgBLy8v/PDDDwgMDERKSgrkcjlee+01ODs7Y/
78+QgODsZnn30GW1tbTJw4kXecgIAAMAyDoUOH4qeffsL69esxbdo0LFq0iOvTUAFiiB0dO3YM7du3R7du3
TjbkEgkWo+XmZmJffv2wcPDA97e3lz/kpISlJaWonv37rCzs8MXX3yBDRs2YMSIEWAYhrdqqu/
+sZNzb29vDBkyBBs2bMDnn38OKysrvPvuu5g2bRrGjh2LoKAgvP/+
+2AYBitWrOCNsSE2e+vWLTg5OeGZZ57B999/j5UrV6JVq1Z4/
vnnaxUgmZmZaNWqFVxdXbF06VKIxWL06dMH1tbWOHr0KNePvca+ffuif//
+CAwMREBAAJydnTFo0CDeOXbs2MHZyIYNGzB//
ny4ubnBy8uL931XF7sjCEI3JEAIwgwUFhaCYRiDf7DYp9KzZs3ibf/vf/
8LhmF4qw3sU9aTJ09qHIdhGFhbW+Pu3bu87WFhYWAYBr/
88gtv+8mTJzW2qwsQmUym4dKRn5+PVq1aYcaMGdw2fS5Y6gKkPtd74cIFbtujR4/
g4OCAr776SuNc9b1uQ8+jzwVL13uTnJwMGxsbrFq1irf99u3bsLW11diuTvPmzTF37ly9fdQFyJEjRzQmrH
K5HCNHjtQqQBiGwbfffss7JjuxU0XdpayyshK9evXCyJEjedvrIkBEIhEePXrE27dv3z5YW1sjLCyMt33r1
q28lcW4uDhYW1vjrbfeglwu5/
VVjXNqiACpix3V1QWLXTVTZd26dWAYhicwKysrMWTIEDRr1gxFRUUA9N8/dnLeq1cvntD+v//
7P1hZWWHs2LG8/
kOGDOHZT0Nt9s0334SjoyNSUlK4bTExMbCxsak1IcX8+fPBMAzvvS8uLkanTp3QsWNH7n1mr7F79+6876j1
69eDYRjcvn0bgPLetWzZEt7e3rx+27Zt01ilMtTuCILQDwkQgjADaWlpYBgG7733nkH9V69eDYZhEBMTw9u
ekZEBhmF4E2BPT0906tRJ63EYhsHLL7+ssf3zzz9H8+bN8ejRI2RnZ/
Nas2bNeEJAn0+0XC5Hbm4usrOzMW7cOHh7e3P76iJA6nq9PXr00Djm888/
j7feekvrOOtz3YaepzYBou29EYvFsLKyQlxcnMY4unfvjlGjRum9Dk9PTwwYMAAPHz7U2UddgHz88cews7P
D48ePef1YYaJNgKhPYj///HO4u7vrPGdeXh6ys7Mxe/ZsuLm5aYzZUAHy0UcfaeybMGECevbsqXG/
YmNjwTAMvvvuOwBKlzCGYbjVOF00RIDUxY4aQ4C89tpraN26tYagOnjwIBiGwV9//QVA//1jJ+c//
vgjbzsrbtTd5ubPnw9ra2tUVVUBaJjNymQyODk54d1339XY9/rrr9cqQLp06aKxggEA33//
PU9Y6LrG69evg2EY/PHHHwCAS5cugWEYbN26ldevsrISzZs3571fhtodQRD6IQFCEGagrisg//
nPf2Btbc17Usni5uaGyZMnc397enpqPG1mYRiGtyrBMnbsWK3+5mybMGEC11ebANm9ezd69+4NOzs73utUJ
9t1ESB1vd4xY8Zo9PPx8cFLL72k9T7U57oNPU9tAkTbezN79my943j+
+ef1Xsfhw4fh6OgIa2trDBw4EP7+/khISOD1URcgr732Gp555hmNY928eVOnC5Y62lzn/
vrrLwwePBgODg68a7CystK4F4YKEPWVFwDo3r273nv2+eefA1DGWllbW9caeN0QAVIXO2oMAdK1a1eMGDFC
oy+7crhp0yYA+u8fOzk/dOgQbzsbxxQREcHbzr7XOTk5ABpms+yDhGXLlmns++KLL2oVIA4ODnj//
fc1th8/fhwMU+Pup+sa2fvCxsywwu3MmTMax+zbty/v/
TLU7giC0A8JEIIwE23btkXnzp0N6stOyNmnj6pom5DryprDMIxWV53Ro0ejZcuWOH36tNZ248YNrq+6ANm3
bx8YRhmbsXfvXpw8eRKnT5/GyJEjeRPe+giQhlyvIdlr6nLdhp6nNgGi7Rj/+c9/
YGVlxd079Xb58mW91wEA6enpCAoKwsSJE+Hs7AxHR0eEhIRw+xsqQFxcXDT6qr9vFy5cgJWVFXx8fPDzzz8
jJCQEp0+fxrRp0zQmlXUNQlena9eu6N27t8737v79+wAaLkDat29f6zjrYkfmECDa7h87OVdf6WAFSGRkJG
87+15nZ2cDaJjNmlqAqF8je19YG6+LADHU7giC0A8JEIIwE5988gkYhsGlS5dq7avLJSkzM1OrS1JdBcicO
XNgY2NjUEpY9Qn3xIkT4eXlpVE3ZOjQobwJb05OToNdsOpyvYYIkLpct6Hn+f333+ssQH788UcwDAOpVFrr
OAwhKysL7dq149WPaKgLliECxM/PD05OThrZgIwhQF5//
XW0a9dOZ70aFkNdsNzd3TWqjFdUVMDGxqbWcdbFjnr16mU0F6xDhw5pdcEyhgBpiM0aywXrhx9+0OqCVZsA
0eeC5ebmxnu/
DLU7giD0QwKEIMxEfHw8XFxc0KNHDy5Lkvp+NkCYfbL5ySef8PosXLgQDKMZlF1XAXLu3DkwDIOvv/
5aY19VVRUvo436hPvtt9+Gl5cXbzIUEREBKysr3oS3tLQUDMNoTPIA3UHoDbleQwRIXa7b0POcOHECDMNw6
Y1V0XWM+Ph42NjYYNq0aRoTG4VCwbm9aEMmk6GgoEBj+8CBAzFgwADub3UBwgolQ4PQDREgX375JZydnXmi
JikpCc7Ozo0uQHbv3g2GYRAcHKyxr7S0FCUlJQAMD0IfMGAA+vbty9u/
ceNGMAxT6zjrYkeDBw9Gnz599B5PFX1B6AcOHOCdZ9iwYVqD0I0hQBpis0DjBKGrPrwpKSmBl5eX1iD02gR
IZWUlWrRoYVAQuqF2RxCEfkiAEIQZ+eOPP7j8+X5+fti+fTuCgoIwffp02Nvb8ybgbCDwlClTEBQUxP2tLS
1tXQUIoHSpYBgGY8eORWBgIDZt2gQ/
Pz+0bduW9wOuPuHeuXMn5+ceHByMxYsXw83NDT179uRNeAGgR48eaN26NYKCgnDw4EHuSaW+NLz1vV5DC4g
Zet2GnicjIwM2NjZ44YUXsHv3bhw8eBBZWVl6jwHUBNAOHToUP/
74I7Zs2YKFCxfiueee0zqBZMnPz4eLiwt8fX0hFouxbds2TJkyBQzDYO3atVw/
dQEik8kwaNAgXhre1157Dd7e3jz/ePa1hgiQM2fOgGEYjBgxAlu2bMGKFSvQsmVLnalVGyJA5HI5Xn/
9dS5t7MaNG7Fu3Tp8+umneOqpp3gT6GXLlnH39n//
+x82btyIDz74AIsXL+b6sFmM3n77bWzZsgWffvopOnXqBA8PD4PS8BpqR3PmzIGVlRVWrlyJgwcPanX7Ub9
P6jbDpuG1t7fHV199hY0bN8LHx0dDUBpTgAD1t1lA6ern6OiIZ555Bj/88AO++
+47nWl41WHT8DZv3hzLli1DYGAgvL29YWVlpTUNb20CBFDWAGEYBsOGDcOGDRvwxRdf6EzDa6jdEQShGxIg
BGFmYmNj8fHHH6Njx46wt7eHq6srhg0bho0bN/JcWaqqqrBixQp06tQJdnZ26NChg97CfNrQJ0AA5RO//
v37w8nJCa6urujduzcWLlzIq9SuPuFWKBRYvXo1PD094eDggL59++Lvv//WWvju0qVL6N+/
P+zt7XnuWLoKETbkeutSwdiQ667LebZv3w4vLy/
uaa56IUJdHDlyBMOHD4eLiwtcXFzQrVs3zJ07V6+bS0VFBRYsWIA+ffrA1dUVLi4u6NOnj0Z9Dm3vR3Z2Nq
ZNm8YVIvzwww8RHh6uEbhrqAABgJ9//
hnPPfccHBwc0K1bN+zatUtncbmGCBBA+eR6zZo16NmzJxwcHODu7o7+/
ftjxYoVKCws5PXduXMn+vbtywUL+/
j44PTp09x+uVyORYsWwcPDA87Ozhg9ejTi4+MNGieLIXaUmZmJcePGwdXVVePpujZ02UxWVhY+
+ugjeHh4wN7eHr179+ZNqAHjCxCgfjbLcv78ee77QF8hQm2whQjd3Nzg6OiIQYMG6SxEaIgAAYDNmzejU6d
OcHBwwIABA3QWIqyL3REEoR0SIARBEATHsWPHwDAMLl68aO6hGIWkpCQ8+
+yztQalEwRBEMaDBAhBEEQTRT1oWiaTYeTIkRCJRAYFVFsq3t7etbo+EQRBEMaDBAhBEEQTZebMmZg2bRo2
btyI//3vfxg6dCgYhsHq1avNPTSj4O/vj40bN8LFxYUrQkcQBEGYHhIgBEEQTZRffvkF/
fr1g0gkgr29PXr06IGNGzeae1hGg/
XvHzNmjEYsEUEQBGE6SIAQBEEQBEEQBGEySIAQBEEQBEEQBGEySIAQBEEQBEEQBGEySIAICLlcjrS0NBQUF
KCwsJAaNWrUqFGjRo2awFpBQQHS0tIgl8vNPXW0WEiACIi0tDSuSBY1atSoUaNGjRo14ba0tDRzTx0tFhIg
AqKgoIAzaHOre2rUqFGjRo0aNWqajX1gXFBQYO6po8VCAkRAFBYWgmEYFBYWmnsoBEEQBEEQhBZovtZwSIA
ICDJogiAIgiAIYUPztYZDAkRAkEETBEEQBEEIG5qvNRwSIAKCDJogCIIgCELY0Hyt4ZAAERBk0ARBEIRQkc
lkKCsro0btiW8ymUzvZ4Hmaw2HBIiAIIMmCIIghIZCoUB6ejpiYmKoUWsyLT09HQqFQutnguZrDYcEiIAgg
yYIgiCEBis+cnJyUFpaavan09SoGbOVlpYiJyeHEyHaoPlawyEBIiDIoAmCIAghIZPJOPFBEE0JVoRoc8ei
+VrDIQEiIMigCYIgCCFRVlaGmJgYlJaWmnsoBGFSSktLERMTg7KyMo19NF9rOCRABAQZNEEQBCEkWAGibRJ
GEE8y+myf5msNhwSIgBCaQUulQEgIEBtr7pEQBEEQ5oAESP3Jy8tDQECAzjgCQtiQADEuJEAEhFAMOjcXGD
0aYJiaNno0kJdn1mERBEEQJoYESP1QKBQYP348Fi1axNvu7+
+PPn36NPj4jXUcQjckQIwLCRABIRSDHj0asLHhCxAbG+V2giAIoulg6QIkIyMDn332GTp16gR7e3u0b98eb
7zxBv7991+jnnfNmjWYPn26RhrX+ggHhmFw7Ngx3rbi4mJKDGBkSIAYFxIgAkIIBi2V1ogOh/
a5aNY3Cfat87lt5I5FEATRdLBkAZKUlIS2bduiR48e+P333yGVSnHnzh2sXbsWXbt2rdcxKyoq6rRdncYSI
ITxIQFiXEiACAghGHRISI0AceyUhebDpHDs+IjbFhJitqERBEEQJsaSBcjYsWPRrl07lJSUaOzLz88HAKSk
pGDChAlwcXGBq6sr3nnnHWRmZnL9WMGwfft2dOzYEVZWVgAAHx8fzJ07F35+fnj66afx0ksvccedOXMmPDw
84Orqipdffhk3btzQOB7L1atXMWrUKDz99NMQiUR48cUXERUVxe339PQEwzBc8/
T01HocuVyOFStWoF27drC3t0efPn1w4sQJbn9SUhIYhsGRI0fw0ksvwcnJCc8//
zwuXbrUkFv8REMCxLiQABEQQjBo3gpIhxw0HyaFU+dMWgEhCIJogqhPwhQKBSqq5GZpuqpSayM3NxdWVlZY
vXq1zj5yuRze3t4YPnw4rl27hoiICPTv3x8+Pj5cH39/f7i4uGDMmDG4fv06bt68CUApQJo1a4YFCxbg/
v37uH//PgBg1KhRGD9+PCIjIxEbG4uvvvoKTz/9NHJzc7njqQqHM2fOYN+
+fbh37x5iYmIwc+ZMtGrVCkVFRQCAR48egWEY7Nq1CxkZGXj06JHW44jFYohEIhw8eBD379/
HwoULYWdnh9jqH21WgHTr1g1///03pFIpJk+eDE9PT1RVVRl8X5sSJECMCwkQLaxevRoDBgxAs2bN0KJFC0
ycOJH7ctHHr7/+iq5du8LBwQG9evXCP//
8U6fzCsWg2RgQ+zZ5aD5MCuduDykGhCAIogmiPgmrqJJDLJGapVVUyQ0e95UrV8AwDI4ePaqzj0QigY2NDV
JTU7ltd+/eBcMwuHr1KgDlRN/Ozo6b+LP4+Pigb9++vG1hYWEQiUQoLy/nbe/
cuTOCg4O54+lzwZLL5XB1dcVff/
3FbdPmgqV+nLZt22LVqlW8PgMHDsScOXMA1AiQHTt2aFzrvXv3dI6nKUMCxLiQANHC6NGjsWvXLty5cwc3b
tzA66+/
jmeeeUbrMi5LeHg4bGxs8OOPPyImJgbffPMN7OzscPv2bYPPKxSDzstTig27FoVoPkwKl55plAWLIAiiCWK
pAiQiIqJWAbJ+/Xp07NhRY7ubmxv27NkDQDnRf/
bZZzX6+Pj4YNasWbxtmzZtgrW1NVxcXHjN2toaCxcu5I6nKhwyMzMxa9YsPPvssxCJRHBxcYGVlRWCgoK4P
rUJEHbucO7cOV6f+fPn4+WXXwZQI0BYYQUo0wQzDIPz58/
rvEdNGRIgxoUEiAGwS6D6PqRTpkzBuHHjeNsGDx6M//
znPwafR2gGfTayGHM2SyH+M9ncQyEIgiDMwJPsgmWoANG2YuHj4wM/Pz/eth9+
+AHt2rVDXFycRsvOztZ6vNGjR2PAgAH4559/cOfOHcTFxcHDwwOBgYFcn8YUINHR0dz+/
Px8MAyD0NBQnfeoKUMCxLiQADGAuLg4MAyjdzWjQ4cOvC8MAFi+fDmef/55na8pLy9HYWEh19LS0gRl0A/
zSyGWSPFzWKK5h0IQBEGYAUsOQh8zZozeIHR9LliRkZEA6iZA2OMlJSXpHJP68Zo1a4a9e/
dyf6empoJhGN58ws7ODr///
rve4+hywZo7dy4AEiD1gQSIcSEBUgtyuRzjxo3DsGHD9Pazs7PDgQMHeNuCgoLQsmVLna/x9/
fnZbdgm1AMOqe4HGKJFEGhceYeCkEQBGEGLFmAJCQkoHXr1lwa3tjYWMTExGD9+vXo1q0bFAoFvL29MWLEC
ERFReHKlStag9ANFSAKhQLDhw9Hnz59cOrUKSQlJSE8PBxLlizRKWj69u2LV199FTExMYiIiMCIESPg5OTE
EyDPPfccZs+ejYyMDORV+0KrHycwMBAikQiHDh3C/
fv3sWjRIq1B6CRADIcEiHEhAVILn376KTw9PZGWlqa3X30EiNBXQErKqyCWSBF4WlqnpW+CIAjiycCSBQgA
pKenY+7cufD09IS9vT3atWuHCRMmcJNuQ9PwqqNNgABAUVER5s2bh7Zt28LOzg4dOnTA9OnTuVUW9eNdv34
dAwYMgKOjI5577jn89ttv8PT05AmQP//8E88+
+yxsbW31puENCAhAu3btYGdnpzMNLwkQwyEBYlxIgOhh7ty5aN+
+PRITa3dBqo8LljpCM+gqWU2wYVmlzNzDIQiCEAyVMjmqZIYHRVsqli
5ACKK+kAAxLiRAtKBQKDB37ly0bduWW76sjSlTpuCNN97gbRsyZIhFB6EDwMYzsRBLpCh4XGnuoRAEQQgCm
VyBzaHx2BGW+MSvDpMAIZoqJECMCwkQLcyePRvNmzfHuXPnkJGRwbXS0lKuz/vvv4/
Fixdzf4eHh8PW1hb/+9//cO/ePS53uCWm4VVl2/
kEiCVSZBbSjw9BEARQEx8nlkhRXvVkrw6TACGaKiRAjAsJEC1oCwxnK5Gy+Pj4wNfXl/
e6X3/9FV26dIG9vT169uxpsYUIVdl7ORliiRSJ2bproBAEQTQl0gtKOQFSWPZkrw6TACGaKiRAjAsJEAEhR
IM+dv0BxBIpbj8oMPdQCIIgBEFcVjEnQB4Vldf+AguGBAjRVCEBYlxIgAgIIRr06buZEEukuBSfY+6hEARB
CIJbaQWcAHmQX1r7CywYEiBEU4UEiHEhASIghGjQlxNyIJZIIbmbWXtngiCIJsBv53IwZ7MU3xySIuFRsbm
HY1RIgBBNFRIgxoUEiIAQokHffqB80nf0uv46KARBEE86ubnA6NGAo1cWmg+TovkwKXwmFqK6NtwTCQkQoq
lCAsS4kAAREEI06OScEoglUuy9lGTuoRAEQZiV0aMBGxvAudtDToA4tsvH6NHmHpnxIAFiHPLy8hAQEID09
HRzD4XQAQkQ40ICREAI0aDZdJNBoXHmHgpBEITJUCgUvBofUinAMICtWwknPpoPk8KhfS4YBjCwZJTFQQKk
8VEoFBg/fjwWLVpk7qEIntDQUDAMg/z8fJOfmwSIcSEBIiCEaNDlVbImk+
+eIAgCUBYa3Hs5Gb9GpnIiJCQEsHaoRPOhsTwB4uiZDYZR7n8SsVQB4uvry6XQt7W1RcuWLTFq1Cj8/
PPPkMvNW8F+zZo1mD59utGLWPr7+6NPnz5GPYexqaioQEZGhlkKfpIAMS4kQASEUA1609k4iCVS5JZUmHso
BEEQRiejoIx78FJaoXzwIpUCtu7FaD5MCtELcXDspIwDceogBvYAACAASURBVOqcSSsghpCZCYSGAidOKP/
NNG5iE19fX4wZMwYZGRl48OABoqKisGrVKjRr1gxjx45FVVWVUc8vBAwVIJWVT3Ytm/
pCAsS4kAAREEI16D2XkiCWSJGS89jcQyEIgjA69zOKOAGSXlCTZtdnYiHcR0jh0jMN9m3z0HyYFG7DYvHaa
PM+UTcmDRYgublAcDAwaxbw9tvApEnKf2fNUm7PzW3cAVfj6+uLiRMnamw/
c+YMGIbB9u3buW0pKSmYMGECXFxc4OrqinfeeQeZKgKJncjv3bsXnp6eEIlEmDp1KoqKirg+Pj4+mDdvHhY
sWAB3d3e0atUK/v7+vHPn5+dj5syZ8PDwgKurK15+
+WXcuHGD1+f48ePo27cvHBwc0KlTJwQEBHBiSaFQwN/
fHx06dIC9vT3atGmDefPmab3+Xbt26SymzDAMNm/ejPHjx8PZ2Rn+/
v6QyWSYMWMGOnbsCEdHR3Tp0gXr1q3Tek9/+ukntG7dGk899RTmzJnDEzBBQUF49tln4eDggJYtW2LSpEm8
e/TZZ5/Bz88Pbm5uaNmyJbZt24aSkhJ8+OGHaNasGTp37owQleVEdRes5ORkvPHGG3Bzc4OzszN69OjBK/
p8+/ZtjBkzBi4uLmjZsiXee+89ZGdnc/t/+
+039OrVC46OjnjqqafwyiuvoKREe6FlEiDGhQSIgBCqQR+JSoNYIsWdh1SMkCCIJ5/
w+GxOgMSk13wfh93NRz9fKZy7PYRdywI0HyZFP18pLtwxvX+6qWiQAMnNBZYvB958E5g9G1i2DPD3V/
47e7Zy+/LlRhEhugQIAPTp0wdjx44FAMjlcnh7e2P48OG4du0aIiIi0L9/f/j4+HD9/
f390axZM7z99tu4ffs2Lly4gNatW2PJkiVcHx8fH4hEIgQEBCA2NhZ79uyBlZUVJBIJ12fUqFEYP348IiMj
ERsbi6+++gpPP/00cquv/
8KFCxCJRNi9ezcSEhIgkUjQsWNHBAQEAFBOnkUiEUJCQpCSkoIrV65g27ZtWq+xtLQUX331FXr27ImMjAxk
ZGSgtFQpphmGQcuWLbFz504kJCQgJSUFlZWVWL58OSIjI5GYmIj9+/fD2dkZhw8f5t1TkUiETz/
9FPfu3cNff/
0FZ2dnbgyRkZGwsbHBgQMHkJycjOvXr2P9+vW8e+Tq6oqVK1ciNjYWK1euhI2NDcaOHYtt27YhNjYWs2fPx
tNPP43Hj5UPPNUFyLhx4/Dqq6/i1q1bSEhIwF9//YXz588DUAq8Fi1a4Ouvv8a9e/dw/
fp1vPrqq3j55ZcBAOnp6bC1tYVYLEZSUhJu3bqFoKAgFBdrT6VNAsS4kAAREEI16FN3MiCWSBGRQMUICYJ4
8vn7ZjonQFSLsEYm5UIskWKXJAMHjpXhm0PKPv/
GPLl1khokQIKDlSJjyRKl8FBvS5Yo9wcHN+qYAf0CZOrUqejevTsAQCKRwMbGBqmpqdz+u3fvgmEYXL16FY
BSgDg7O/NWPBYsWIDBgwdzf/v4+GD48OG88wwcOJALNA8LC4NIJEJ5eTmvT+fOnRFcff2vvPIKVq9ezdu/
b98+tGnTBgCwdu1adOnSxWCXKV0uWAzDYP78+bW+fu7cubwVDF9fX3h6ekImq4kHfeeddzB16lQAwJEjRyA
SiXj3SRX1eySTyeDi4oL333+f25aRkQGGYXD58mUAmgKkd+/
enCBTZ+XKlXjttdd429LS0sAwDKRSKaKiosAwDJKTk2u9doAEiLEhASIghGrQ7NPAU3cyzD0UgiAIo7Pvcj
InQE7crkmTGh6n/C48ez+L9/
fx6AfmGqrRqbcAycxUulnNnq1dfLBt9mxlv0aOCdEnQKZMmYIePXoAANavX4+OHTtq9HFzc8OePXsAKCfyb
H8WsViMTp06cX/7+Phgzpw5vD4TJkzARx99BADYtGkTrK2t4eLiwmvW1tZYuHAhAMDDwwOOjo68/
Y6OjmAYBo8fP0Zqaio6dOiA9u3bY9asWTh69KjeWBZ9AmT//v0a2zdt2oR+/
frBw8MDLi4usLOzw8CBA7n9vr6+eP3113mv+fzzz7kVhqKiIvTu3RseHh547733sH//fm4lQ9c9euaZZ/
Djjz9yfysUCjAMgz/+
+AOApgDZvn07bG1tMXToUCxfvhw3b97kXjt58mTY2dlp3GOGYRASEgKZTIZXXnkFrq6umDx5MrZt24Y8PUV
8SIAYFxIgAkKoBn3nobIY4brTscijQHSCIJ5wtl9I4ATIwSsp3Paz97MglkgRHqf0KU/
Krq6TdNmwJ6qWSL0FSGioMtaDdbvS1ZYtU/Y7d65Rx61PgPTu3Rvjxo0DYLgAUZ/IBwYGwtPTk/
vbx8cHfn5+vD4TJ06Er68vAOCHH35Au3btEBcXp9HYGAVHR0esWbNGax82c1dpaSn+/
PNPzJs3D61bt8aQIUN0rojoEyDHjh3jbTt48CAcHR0RFBSE69evIy4uDp988gnv9druqZ+fH89draqqCqdP
n8aCBQvg5eWFZ599lhMP2u6Rp6cnAgMDdY5PWxre1NRUbNmyBW+99Rbs7OywYcMGAMCYMWPw9ttva71/
bJyHQqHAxYsXsXz5cvTu3RstWrRAYmKi1vtHAsS4kAAREEI16EqZHDvCEiGWSBGZZJyAQYIgCKEQFBrHCZD
NofFILyjlbWO/
B3NLKp74Okn1FiAnTigDzvWJD7ZNnqzs34jUFoS+c+dOAPpdsCIjIwE0jgBhz5OUlKRzzEOHDsWMGTMMvsb
79+
+DYRhERUVp3b9q1Sr06tVLY7s2AfLZZ59h5MiRvG2vvPJKnQWIKiUlJbC1tcWRI0cANJ4AUWXx4sXo3bs3A
GDJkiXo2rWrwRnOZDIZ2rVrh7Vr12rdTwLEuJAAERBCNujz0kcQS6Q4J31k7qEQBEEYDYVCgcDTUk5saGs3
05SToYoqObetrPLJrJNkySsgutLwvvHGG1wcg0KhgLe3N0aMGIGoqChcuXJFaxB6QwWIQqHA8OHD0adPH5w
6dQpJSUkIDw/
HkiVLOKFz8uRJ2NraIiAgAHfu3EFMTAwOHjyIpUuXAlBmttqxYwdu376NhIQEfPPNN3ByckJOjvb4zF9+
+QUuLi6Ijo5GdnY2F3+iTYCsX78eIpEIJ0+ehFQqxTfffAORSFQnAfLXX39h/
fr1iI6ORnJyMjZv3gxra2vcuXNH5z2qqwDx8/
PDyZMnkZiYiKioKAwePBhTpkwBADx8+BAtWrTA5MmTcfXqVcTHx+PkyZP48MMPIZPJEBERgVWrViEyMhIpK
Sn49ddfYW9vz8u6pQoJEONCAkRACNmgryXnavhDEwRBPGmUVcr0ig+xRIp7GTXf0VvOxUMskSKryLIK9RmK
yWJAsrIaddzqhQhbtGiBUaNGYefOnRqFCA1Nw6tKXQUIoIyRmDdvHtq2bQs7Ozt06NAB06dP562+nDx5EkO
HDoWTkxNEIhEGDRrEZZk6duwYBg8eDJFIBBcXF7zwwgv4999/
dd6D8vJyTJo0CW5ubhppeNUFSHl5OT788EM0b94cbm5umD17NhYvXlwnARIWFgYfHx+4u7vDyckJzz//
PC+LVmMIkM8++wydO3eGg4MDWrRogffff58nwGJjY/HWW2/
Bzc0NTk5O6NatG+bPnw+FQoGYmBiMHj0aLVq0gIODA7p06YKNGzfqvH8kQIwLCRABIWSDvvuwEGKJFL9fSz
P3UAiCIIxGYVklxBIp1v8bq1OAJDyqSdt5+GoqxBIp7j4U3vd2Y2CpWbAIoqGQADEuJEAEhJANuikEWxIEQ
TwqKodYIsWWc/EIi83WKkDS8moy+4RWB6aH3m/cJ/hCwVLrgBBEQyEBYlxIgAgIIRt0VlEZxBIpgs/
Hm3soBEEQRuNBfinEEil2XkxEpUyO9IJSXEvOxYnbNbVBVN2t2NXhw1dT9RzVcmn0SuiTJ5ukEjpBNBQSIM
aFBIiAELJBF5dXQSyRIvC0FHK5wtzDIQiCaFSSsksQcisdMelKQfFLRApvf8HjSk6AqKYjZ1dMNoc+mQ9nG
ixAWDIzlYHmJ04o/23kmA+CaGxIgBgXEiACQsgGLZMruB/
fxxWGpbgjCIKwFNTdrH5Ti3dTKBTYdTERwefjUSWrCWIuqo4ZWXc6FgrFk/
dwptEECEFYGCRAjAsJEAEhdIPeqpLt5WZaPqJSdFcQJQiCsCTUBcgfNx5q9JHJFaio4mdQUs2apSpMnhRIg
BBNFRIgxoUEiIAQukEfuJICsUTKpeQVS6QoLNNegZUgCMKSUBcg+wxMuKG6OqytFkha3mMcj36A49EPkFVo
eZN4EiBEU4UEiHEhASIghG7Q/9xK53yd2R/
cxOwScw+LIAiiQSgUinoLEABcyl5tD2R2Xkzkjnk8+kFjDtskkAAhmiokQIwLCRAdnD9/
Hm+88QbatGmjtWiPOmyxHPWWkZFh8DmFbtDhcZopKa8lUwYTgiAsG9WK5mwK3gf5pQa/
nn0ok6sSnA5oFjW0xDTmJECIpgoJEONCAkQHISEhWLp0KY4ePVonASKVSpGRkcE19Yqr+hC6Qd9+UKAhQE7
eMVxgEQRBCBG2+KBYIkVyTt1XdbdfSIBYIkWmmotVau5j3vdlUGhcYw3ZZJAAMQ55eXkICAhAenq6uYfCY9
euXQgJCTHrGJKSkrBy5UoUFxfX3tmIkAAxLiRADKAuAiQ/P7/
e5xG6QaflPdYQIAeupNT+QoIgCAFzIfZRg+oc7Q5PglgiRWruY972qJQ8iCVSHIlK0xsnImRIgDQ+CoUC48
ePx6JFi0x+bn9/f/Tp00frvt9//
x3du3dHXp7xE8zomleVl5djwIAB2LJli9HHUBskQIwLCRADqIsA8fT0ROvWrTFq1ChcvHixTucRukFXyeTY
eEbp68z+4G4OjcflhBxcp4xYBEFYIFmFZZw42HMpqV7H+CUiRWtM3Kk7GRBLpAiPz8aW6iyC2cXljTBq02G
pAsTX15dzhba1tUXLli0xatQo/
Pzzz3XyTDAGa9aswfTp082StlmXAImLi0O3bt2QnGwaN0Fd86rZs2djyZIlJhlDbZAAMS4kQAzAEAFy//
59bN26FdeuXUN4eDg+
+ugj2NraIioqSudrysvLUVhYyLW0tDTBG3RhWSXOSR8ho6BMYzWEChQSBGFpxGUV8WI/
6sPhyFSIJVJIM4sAAAWllYjNLMLhq8rt9zIKsT8i2SITd1iyABkzZgwyMjLw4MEDREVFYdWqVWjWrBnGjh2
LqqqmWc9K3wqIKTFkXmVuSIAYFxIgBlDfD8qLL76I9957T+d+f39/rYHrlmLQbF0QS3UtIAiCUI9tqw/
Hrj+AWCLF7QcFAIAN1Vmx2JZRUIY/
bjyEWCK1uNViSxYgEydO1Nh+5swZMAyD7du3c9tSUlIwYcIEuLi4wNXVFe+88w4yMzO5/eykfe/
evfD09IRIJMLUqVNRVFTE9fHx8cG8efOwYMECuLu7o1WrVvD39+edOz8/
HzNnzoSHhwdcXV3x8ssv48aNG7w+x48fR9++feHg4IBOnTohICCAE0sKhQL+/
v7o0KED7O3t0aZNG8ybN0/vffj+++/
RsmVLNGvWDDNmzMCiRYs0BMj27dvRrVs3ODg4oGvXrggKCuLtT0tLw7vvvgt3d3c4Ozujf//
+iIiI4PZv3rwZXl5esLOzQ5cuXbB3717e62NjYzFixAg4ODige/
fukEgkGvOq1NRUvPPOO2jevDnc3d0xYcIEJCUlGTzOiooKzJ07F61bt4aDgwOeeeYZrF69Wu+9qQ0SIMaFB
IgB1FeA/Pe//8ULL7ygc78lroCocrC6Lgjb8h9X1P4igiAIAXE1qaau0dHrabW/QAt/
3VSKi+jUfFTK5Bqrw2WVMlxOyIFYIsU/
t4QVdFwbjSlApFIgJASIjW2EgdWCLgECAH369MHYsWMBAHK5HN7e3hg+fDiuXbuGiIgI9O/fHz4+Plx/
f39/NGvWDG+//
TZu376NCxcuoHXr1jxXIR8fH4hEIgQEBCA2NhZ79uyBlZUVJBIJ12fUqFEYP348IiMjERsbi6+++gpPP/
00cnOV2SQvXLgAkUiE3bt3IyEhARKJBB07dkRAQAAA4LfffoNIJEJISAhSUlJw5coVbNu2Tec9OHz4MBwcH
LBjxw7cv38fS5cuhaurK0+A7N+/
H23atMGRI0eQmJiII0eO4KmnnsLu3bsBAMXFxfDy8sKIESMQFhaGuLg4HD58GJcuXQIAHD16FHZ2dggKCoJ
UKsXatWthY2ODs2fPcve3V69eeOWVV3Djxg2cP38effv25c2rKisr0b17d8yYMQO3bt1CTEwMpk2bhq5du6
KiosKgcf7000/
o0KEDLly4gOTkZISFheHAgQO1mYleSIAYFxIgBlBfATJq1Ci89dZbBve3NINm64KwTT0DDEEQhNAJvZ8FsU
SKTWfjUFxeP7eck9WxHleTcjWSdWytdutiM2JtO59gFt//
+tIYAiQ3Fxg9GmCYmjZ6NGDMWGd9AmTq1Kno3r07AEAikcDGxgapqanc/
rt374JhGFy9ehWAUoA4OzvzVjwWLFiAwYMHc3/7+Phg+PDhvPMMHDiQCzQPCwuDSCRCeTk/
Bqhz584IDg4GALzyyisaT+337duHNm3aAADWrl2LLl26oLLSsALAQ4YMwZw5c3jbBg8ezBMgnTt31pior1y
5EkOGDAEABAcHw9XVlRNJ6gwdOhQff/wxb9s777yD119/HQBw6tQp2Nra4uHDh9z+EydO8OZV+/
btQ9euXXmfi4qKCjg5OeHUqVMGjXPevHkYOXJko362SIAYFxIgOiguLkZ0dDSio6PBMAzEYjGio6ORkqLM+
rR48WK8//77XP/AwEAcP34ccXFxuH37Nvz8/GBtbY1///3X4HNamkGHx/
PrgqTkPK79RQRBEAIipPpBSkNqGp29pxQx4XHZiFRZURFLpDh0VfmbUSmTcwULCx4bNoEUAo0hQEaPBmxs+
ALExka53VjoEyBTpkxBjx49AADr169Hx44dNfq4ublhz549AJQChO3PIhaL0alTJ+5vHx8fjcn+hAkT8NFH
HwEANm3aBGtra7i4uPCatbU1Fi5cCADw8PCAo6Mjb7+joyMYhsHjx4+RmpqKDh06oH379pg1axaOHj2qN5Z
F9RpY5s+fzwmQkpISMAwDJycn3jkdHBzQsmVLAMqg8BdffFHnOdzd3blVCJZ169Zx90b1/
ywFBQU8AfLf//4XNjY2GvfGysoKmzdvNmicUVFReOqpp/
Dcc89h3rx5nHBpCCRAjAsJEB3oKizo6+sLQPnlprpEu2bNGnTu3BmOjo546qmn8NJLL3FLkIZiaQYd/
6iY90Mbm1lU+4sIgiAExG/XlClyY9Lr/73LpvE9J32EM/
cyddZK2ndZGYie8Mi89Q3qQkMFiFTKFx7qzVjuWPoESO/evTFu3DgAhgsQ9biJwMBAeHp6cn/
7+PjAz8+P12fixIncnOGHH35Au3btEBcXp9Gys7MBAI6OjlizZo3WPmzmrtLSUvz555+YN28eWrdujSFDhu
hcEalNgGRmZoJhGOzfv1/
jfImJiQCAL7/80ugC5NNPP8WgQYO0XndBQYFB4wSUc6hDhw5h1qxZaN68OSZNmqRz3IZAAsS4kAAREJZm0M
XlVbwf2ltpBeYeEkEQRJ3Yeymp3gUIWdj4jtN3M7lgc7ZFJORw/
djVlqtJ9V9tMTUNFSAhIfoFiLFq3tUWhL5z504A+l2wIiMjATSOAGHPox5YrcrQoUMxY8YMg6/x/
v37YBhGZ7ZNbS5YL7zwAu9a2rZti2+//
VbnOXbv3g2RSFRnFyxW4LEuWKoFF0+ePMkTINu2bYO7u7veuU9t41SHPYeucRsCCRDjQgJEQFiiQav+0EZa
0I8qQRBEYVklV9voUVH963NcS1YWHAy5la6RnEOqsjIcUS1UTtzO0HM0YWHJKyC60vC+8cYbkMmUWRsVCgW
8vb0xYsQIREVF4cqVK1qD0BsqQBQKBYYPH44+ffrg1KlTSEpKQnh4OJYsWcIJnZMnT8LW1hYBAQG4c+cOYm
JicPDgQSxduhSAskr5jh07cPv2bSQkJOCbb76Bk5MTcnJyoI1Dhw7B0dERO3fuhFQqxfLlyzWC0Ldv3w4nJ
yesX78eUqkUt27dws6dO7F27VoAyliMLl26YMSIEbh48SISEhLw+++/
c0Hox44dg52dHTZv3ozY2FguCD00NBSAMgi9R48eePXVV3Hjxg1cuHAB/
fv35wmQx48f47nnnsNLL72ECxcuIDExEaGhoZg3bx7S0tIMGufatWtx4MAB3Lt3D1KpFDNnzkTr1q0bVPOF
BIhxIQEiICzRoG+m5XM/
tBfjss09HIIgCINh3aUOXElpUPDqnYcFXMXz7RcSeAIkSyU5B1tz5JeIlMYYvkmw5BgQ1UKELVq0wKhRo7B
z506NSamhaXhVqasAAYCioiLMmzcPbdu2hZ2dHTp06IDp06fzVl9OnjyJoUOHwsnJCSKRCIMGDeIyXR07dg
yDBw+GSCSCi4sLXnjhhVrjTFetWgUPDw80a9YMvr6+WLhwoca1/PLLL/
D29oa9vT3c3d3x4osv4ujRo9z+5ORkTJo0CSKRCM7OzhgwYACuXLnC7a8tDa9UKsXw4cNhb2+PLl26aKyAA
EBGRgY+
+OADeHh4wMHBAV5eXvj444958yF949y2bRu8vb3h4uICkUiEV155BdevX9d7b2qDBIhxIQEiICzVoC/
FK5/q/
RuTWXtngmgiFJZV4vaDAlTJzFt1mdDN8egHjeI+yma42nkxkQs0Z1t5VU19pNySCi7jlqVkwmoMAZKXZ/
osWATRUEiAGBcSIALCUg06KiXPIvPbE4Qx2XY+ocHZlQjj8nt1APq9jIZ95xaUVmrU/
kjKLkFqLj8zoEyuqMmEVWoZmbAasw5IbKzp6oAQREMhAWJcSIAICEs1a
FX3A1WqZHLEZhYhu7j+vtUEYamwE9Hfr9WvuB1hfNh4jbishmWlkssVWHe6ZuVjS3XtD22wQe+J2fUPejcl
lloJnSAaCgkQ40ICREBYqkEnZpdALJFif0QybzvrmiWWSJFRQD9eRNOhoqqmGjatDAqXvdVpcRuSAYvl57B
E7j0/fDVVZ7+/
bza87ogpIQFCNFVIgBgXEiACwlINOrOwDGKJFNsvJPC27w5PogB1okmSUVDG2f7fN0mACBVWNDzML23wsdh
6IrXVFGELuJ6+axkxcyRAiKYKCRDjQgJEQFiqQReWKf2f1/8bywVWssGWbLOkrC8E0VBYt0SxRIrDkbqfhh
PmJfh8vDJTVVHDJ9dxWUXYHZ6E49EPIJPrDjC/
karMHPjnjYcNPqcpIAFCNFVIgBgXEiACwlINukpW425SVqnM+HI1KRdiiZRzcRBLpJQNiLB45HIFHuSXIre
kQm8/VffD3eFJphkcUWc2nY2DWCJF/
mP972djcj9DmYr3VwsRpuwkrLS04atEBGFJlJaWkgAxIiRABIQlGzT7Q85OzNjgzhup+dhgYVlfCEKVSpkc
idklqJTJER6ndJ9ZdzoWRWW67VlyN5MTIEGhcSYcLWEoCoUCgaeV71FxeZXJzpucU8I9nLEEZDIZYmJidBa
7I4gnlZycHMTExHBFK1Wx5PmaUCABIiAs2aB3XVT6Uv918yFk8pof9sKySuyo9rNOL6AnaIQmcrkC+Y8rBF
sXgRUTp+9m4khUjZ9/Ss5jna85ej2N54JIq3/CQ9vKrSnQFTMnZNLT0zkRUlpairKyMmrUnthWWlrKiY/
0dO0xfJY8XxMKJEAEhCUbNCtA2PSSqjEhNakui8w9TEKAsNWopZnCtA9VIaFq5/
oCjVVdD1khTgiL0goZ9/7I9cRsNDYFj5UxcxvPxEImVyCzsEyw4ptFoVBwIoQatabS0tPTdX42LXm+JhRIg
AgISzboLefiuR/ziASl//
vPYYkAgD9uPOTcsQhCHdZuWHsRGqpCQrXKdWSS7jSqm0Pjea+jNNTCQzV5hikpq5RpfFeevZ9l0jHUF5lMZ
van09SomaJpc7tSxZLna0KBBIiAsGSDvpdRyKt7oJr9h33CHR6fjUdF5fg5LBF3H1reNRLGgbUbobqkqFe4
Zts56SOt/
StVXHvYNK8JjxpW6I5ofHKKyyGWSLE5VHfRQGOgUNQULVQVtLRKRhCWgyXP14QCCRABYekGfez6A2VwZXWl
3xO3lb6Tl6uf8p2+m4lDV1O4H1yCkMsVnD0EnzftRNBQdAkQbQUGFQplPAvrYsN+Jm4/
KDDDyAl9mDMWY2v1ijGbBpgNShe6KxZBEEosfb4mBEiACAhLN+iQ6pUPtoXFKosP3kpT1kQ4Hv0Aey4lkQA
hOIrLqwSZLaq4vAqn7mTgYX6pTgGinkY1p7gcG8/
EcgXpdoQl4tSdDIglUlxJtIyq102JtLzHXFyPqVF1WVVtJSbMxkUQRP2x9PmaECABIiAs3aBZVyu2RVfHfC
RVB6XvuZTErY6IJVIUlVWikrIDNWnSC/gTfFNmI9LH2ftZOoVHZHWNG/WJ66+Rqbx++yOSERabbVE+/
k0JNlnG/gjTp8NlE3Oot9Rc3ZnVCIIQDpY+XxMCJEAEhKUb9MXqGglsi8tS+r2zwZ7rTsfyVkDW/
6t0USGES1xWEbIKjRdALc0s4tlMY1Skrg8KhQKXE3JwMy0fCoUC284naJ0gSu5m6owdYNNNs+33a2mISsmD
WCLF3ze1p3IkzEdste0dvmr6goBxWcUaYlX1oQ1BEMLG0udrQoAEiICwdINmnwyzLbN64qpQKLhChRtUgi7
JFUuYyOUK3H5QwFVsNuZ7dL16gs62xOwSo51LH5ejyzBnsxTfHJJqrMqotgf5pZzb2LrTsZzPvlyu4AUUs6
KDTc5gKVWvmxJ3HipdQ49eTzPL+Q+riEZS8gAAIABJREFUrJidkz5SrpTdo5UygrAELH2+JgRIgAgISzdoN
taDbY8ravyZf4nQ7nIglpg2Bz9RO6oZzVTjeYzxPoWrrZrdSjNtsHZuLjB6NGDXohDNh0nRfJgUwyc/
wuo/pdh3ORn/xmRy8SmsoK6oqslyVVGldCFMzX2scc/
+jcnktu8OTzLpdRG1Y+7VqePRDzhbiUlXfuZ+iUgxy1gIgqgblj5fEwIkQASEpRu0qjsNW4SQ5cTtDJ0CpJ
gCLwVFqI74h5tpje8ecvouP24oPD670c+hj9GjARsbwLHTI06ANB+QiH6+yifjMrkC15LzkF5Qyr1GNY0qa
7vq1yGWSHExTpl2WiyRYss5YWb4asqEx2dzQtEcsOKWtSP2/
xSIThDCx9Lna0KABIiAsHSDTs4p4X5E1YvK3UzL1ylAzOX3T2hHPZsZ2y7EPkJJeRXS8hovUJYtUsnGXEju
mm4yKJUCDKNsLr3SagRIddslydD5WrbQYG5JBQBgd7gytol1NRRLpLiWnMtNLANPSynFqsA4e08ptMPjTCt
6WYrKKrH9QgJ3fjYO5HBkKq0KE4TAsfT5mhAgASIgLN2gMwrKuMnXoat8V4K8kgqdAiTJTH7/
hHZUa7XwVifisrmJdnJO47xnh68q/
eDZehmm9McPCakRIK79EzUEyNpfdE9M2YDz9IJSKBQKLraJTbsrlihrf8hU6pwIJcMXoYQtmHotOc9sY1AV
pbEqK8iUDYsghI2lz9eEAAkQASEog87MBEJDgRMnlP9m1v5kuqxSxv2AnrrDf3qsUCiw/
YLyKfeGf2NxP6OIq5dw5yEVaRMS7GrEvYxCXIrP4d5TVTejP2881HxhPWxm18VEzl1JLFEWsTQVqisgokHx
GgLkeJjuieney8mcECtSyfKWklMTC8JmgWNXRfKqV0salXrcc0LJkSjl98/
dh3X8vjXiPf+zekUwIiGn0Y5JEETjI6j5moVCAkQH58+fxxtvvIE2bdqAYRgcO3as1teEhoaib9+
+sLe3R+fOnbFr1646nVMQBp2bCwQHA7NmAW+/
DUyapPx31izl9lz9BdVKK2S4kZqvNa4jp7gc0an53ETsxG3lE8jIJCrSJhSqZDUB1qUVyif2V6uzm7GTI7a
l5FQ/pW2AzQSFxlVP1os4FyaTuSrl5mJ0j1TYWMnQfEgsmg+TwnVgAtyH30O/N6/
i3n3dmavYDEaxmUVcQbudFxNRqXL/4h8pBcjP1aslD/
NLdR6vPmNvyOeUqEmMkVD9PtWKCe45mxXOXJm5CIIwDEHM1ywcEiA6CAkJwdKlS3H06FGDBEhiYiKcnZ3x5
ZdfIiYmBhs3boSNjQ1Onjxp8DnNbtC5ucDy5cCbbwKzZwPLlgH+/sp/Z89Wbl+
+vNEmN+erU0+ekz5qlOMRDSf/sdJVbuOZmiQCUpV6CaoC5HBkaoNsRlXssKsIqsLHqFSPO+/
16Xitw21u1cOx0yP0ez0Mqz/
8HqnLvtNp62wGo9sPCrh0rkeilJPGc9JH2B+RzGXIOlBddC7e0ImugWM31ef0SWVHXYShie55VmEZJ8RlFA
dCEILF7PO1JwASIAZgiABZuHAhevbsyds2depUjB492uDzmN2gg4OVP6RLlih/XNXbkiXK/
cHBjXK6G6nKwPTj0VSMUCioPs1nYVPJsi50bAsKjcOBn/
bhzPR59bIZdhWBrafBun5lGrHwIYeKrZctD8A3X+zFnE9/w83PNkC8JBjixVtQ8PYUnbYeohI/
wGZTOq0jgP7o9TROrDT22E3xOX1SqZNrnInuuUKhwJZzygQHjZnsgSCIxsXs87UnABIgBmCIABkxYgT8/
Px423bu3AmRSGTwecxq0JmZSleC2bO1/8CybfZsZb9G8Ht+kF/
KTWwJYcAWHzysUjiPTSWr0Y5FQTzvfxDPF0Ox3L9Wm8mKT8WBKylIy3uMskoZAk/
z44XY4HdpZpFxL1LN1guXfwvxkmCsX7oV8PdH+vLvELfse722fuaeMh7mUnwOF3iuy2+fdTW8ltwIKxJm+J
w+iajWn6l1xc3E95wVt+bKzkUQRO2QAGk4JEAMwBAB8txzz2H16tW8bf/88w8YhkFpqfYl/
vLychQWFnItLS3NfAYdGqr0Z2ZdC3S1ZcuU/c6da/ApVYPWKUOQMLiWrPRB/
+dWTXG2EpUaBby27RTEs1ZC/
PVWlC0PqNVmArdLIJZIEXw+nov5UC3Qx07Urxo7JkjN1rOXr4R4STC2LN1isK2HxSonsKH3s2pd4WDrqlyI
bQRXQzN8Tp801O251pS3Jr7nbBzIXze1JHogCEIQkABpOCRADMBYAsTf3x8Mw2g0sxj0iRPKoEp9P7Bsmzx
Z2b8RYN16yN1AGGiLy5HJFdxqBa9t/gfij5WT95zlK/XajGLyZGX/6teyWaTO3svizmOywnBqtp6+/
DuIlwRjx9LNBtv6lcRcbvWGvRZd6aTZitu/RuoOaq/
v2E31OX2SYJMqiCVSnLlngK2Z+J6rxlwRBCFMSIA0HBIgBmAsF6ymvgIC1ATzRqc2fpVtou7ochdiMzmxKx
jqKyCpy1bptZmMd96DePspnoBZdzoW2cXl3Dmiq2OCtKb4bUzUbD152WqIlwRj79JNBtv6rbQCLn6J9dlXv
RZVClUC7AvLKht17LQCUjcUCgV2Vqd+Njgmx8T3nI3D2nUxsfbOBEGYBRIgDYcEiAEYGoTeq1cv3rb/
+7//s5wg9Lr6OWdl6TmY4bD1H4z+1JswCLY2y70Mvg2yQlEskXLpS1VjQGKW/cCzk/
LlAUhctloZGzJ7Ns7P/
hriY9d5AkRddLLxJ42yUqAPFVsvXx6AdUuDIV4SjENLNxps64nZJRBLpNhzKckgN8JfqwPuQ+837HNT8TAd
CjN8Tp8U2Dotm87GcVnKasXE34251UVbg0LjGnQcgiCMBwmQhkMCRAfFxcWIjo5GdHQ0GIaBWCxGdHQ0UlK
UFb4XL16M999/n+vPpuFdsGAB7t27h6CgIMtLw2uG7DrspFO9cjphHthK5+qVmC/EPuIm2n+o1gP5/
gDEM7/FpsVBqFIJRA/7Zi3ES4Lx79c/AW+
+iR0/7ueJj72XkzXOzU4OTVKMsNrWr339vTLr1ZJgHPlmg8G2rh6Yv+HfWL31S5JzSrh+VTI5bqbl49j1Bw
g+H48sA7N+5ZZUYNPZOJwQ76EsWPXk75vphrteqWLC70bV2LgqmYEiiSAIk2L2+doTAAkQHYSGhmqNz/
D19QUA+Pr6wsfHR+M13t7esLe3h5eXl+UVIjRDfYGc4nLuiaTJCtAROtkcqt2diK11IZZIuSw9YokU4j9uK
CfwM7/FvbkLOZsRf70V4vliiGd+i+JlAcp+6jVE1MgqKuNcvIxOta1f+r/ZynF+vRXHv1lvsK2XVsh41/
NzmH53GYVCgQ3/xnKuP6qvVU9Dnf+4AnFZxRqfh9+rV6fEf9xAwbIVVAekjlTJ5Fhf/
R5kFdUx1bMJvxsVCgU3zsNXUxGTThMcghAaZp+vPQGQABEQgjBo9Wq/
kycbtcKyaoBziZbq6YTpkMsV3KT4cQX/vVCNYzgnfcSbQIv/uAHx9wdw+dNFnM3s/
WiJ0j3r+wOc+Fh3OpZ7zbHrmrVf2GKEbF0Qo5Obi8j1u5TjnLUSBz762mBbVxUUhq7gsbEH6i1EJeMYAG67
6iqUQqHg6law9zxn83aTfU6fBApKKw1ardKJCb8b1WvuEAQhLAQxX7NwSIAICEEZdGamMpjyxAnlv0b0JWe
Dmg11RSGMA5ueNPC09tSkD/JL8ffNdG7VSj0o/
VyElLOZLTslGjEfqpOqf9Qm3QBQqVIZ3VRpmcNis5WxLNtPITj4nzrZumpgviHFNNnCi+pNPS6E3R6pko64
okqu8bpL8Tkm/
ZxaOmzdodpWq2rFBPd8f0Qy772m1WGCEBaCmq9ZKCRABERTNWg2qDnhUbG5h9Kkya4WFlvO1e4CpZrJ6lpy
Lu9JfpVMc7IslkixPyIZofezsPFMrM7q06zrybrTsYYHCTeAf2My9a7K6ENVUEh0VEFXhee6ptJUX6sqNG6
m1QTpq65A8QQIYTCWlN6WLW5pakFOEIRhNNX5WmNCAkRANFWDZjMsqU64CNOTmqsMAlctDqgL1eDrmPRCiC
VS/H4tDQA/
4PpSfA7X9+h15X59gbWqk66olLxGuS59sEHJ607H1jlFLpuyWCyR4qIBVatVXdeyCsu4//99s2Y1KK86A5L
654GNj1FtJ25n1Gm8TR22Hovq/
RYqFVVyPMgv5dxTc3SkeCYIwjw01flaY0ICREA0VYNmn0KHx9c+iSOMB/
eE2IA0uOwkeNPZOE5w7L2crOEqpBpXciQqzeDjiiVSHLxi/
MxobGB3fQJ9w6tTSIslUlxLrl0snblXs9qiUCi4wH5WmAE1IpB1wcotqUBq7mNu+6azcQgKjTP4fSJqYDO5
qRbZFDp7q9M8J+doL3JJEIR5aKrztcaEBIiAaKoGHZGQY7AbC2E86lIIkJ0kbw6N557Obz0Xz3uyz06s2b8
NmTCfvZfF9TdkJaahsO5/iTqqmOtDNZuVIQLmevUTeDaoOC6rmPubraJ+92Eht01V4LArSYcjU/
GwOpZh+4WEOo+5KcO6wKkX2RQyR6KUAvnOQwOLJhIEYRKa6nytMSEBIiCaqkGzEznVJ8GE6WEnuYYUhWRXD
sLjslGsErzO1nURS6TIrY7zYP82JFBbLldw9UBMMcFmA8kf5pfW+bWqqxVJBgiYKpkcF+Oy8aD6XKqvF0uk
3H1km2p8ChuU/
MeNh7z7TXUiDOfwVWXMjnqRTSFzsjoWJCKB4n0IQkg01flaY0ICREA0VYNOyq5x4SHMBxv4akhwc1mlDAmP
iiGTKyBXSaV89n6WRnzCnYcF/9/
enUe3UZ97A1cwsQOEONCEHYct5PbA7XbBJc19yelJD+FSXnjLpRToLWmhoWFp4balCYTEL7QUbss7kIVA2B
zCko1mgSZO5MSOkzi2Eyfe4jgj75b3Vd4lW5rv+8d4xpIt2bJH0oyk7+ecORB5LP08eeT8Hs3v9zzYlFmpJ
iTjCWUnaGU5k79jc2frHd4Y3jiJCm6NnaP3dbgf7pvc1x2SN+cfONMASZLUfi2sHOcfp0tSr2E47ac4amlR
31dEZBzROl8LJCYgBhKtAT2R6ksUeN32QUiSpK43L5tENbIPh+4kKL0usjR8YhuqfiDuidPIvif+fr+SINj
6JraBHfDccO7tePdw2ajHMob2L+wYugP18bEK7DpdC6eXssk0rMHWry4ZDKeStlyeSmRM0TpfCyQmIAYSrQ
HdPzDcVZpLSkJL2XOgVCITzJNrCKmsVVeOcw1dkx5TqOJBaUy35qDFa98Tf1gauyZdva1nxJIr5fBVrlcwi
8ipkPcvjGwGaWmc/
PWOBsr+G3+WARqJUrnLW98cItJPtM7XAokJiIFEa0C7d5W29U78k2SaPOUOgHJ8OMkmbcrSK+WYzJ4Khfud
hT5H8PofKNW7PjleGbTXGIt748Vkty7pSnUsb4eS7Iw8R2QCMqb0ofg8YgmfCljA8P64cEuciCJdtM7XAok
JiIFEc0Arm4FrNUxcaeKUxn/
KUVw3udjLH6qgpWVJkjtlvb7W5xmLUvVrjx9Vv4JBkoYTrbP1nWjq7EeDrX/
U5vQ9+XX4PLsab6da1L0mI8+ZzLK5aKL0ewlFb5lAUoo6bGfJZSJDieb5WqAwATGQaA5oZcOtlqU7NHFr3R
KQzRruBIycEGtdOvXe0P6HliBuGE4zwKfiasLmdudv5Ob0koZOSJLk0Q175P4Rvm/
GplTACrc7ReXNcqnmz7OD3xOHiPwXzfO1QGECYiDRHNB71Rr94fUJZbhT7jQIZm1lkJXSsCu3iPjtu6WwWL
SNS7kjVm8L3h2xnaflfStFtfr1WLD1DqDB5lnJyj25eDvV4pF4KNyXb+n9M4QDpTiCtb1X76FMiJLYh6InD
hH5L5rna4HCBMRAojmglU214bZGO5y5773RuhSptVXC95aIiF8gHyYTsHgx0D7JfHJzltz3oro1eBPGTZmV
QX+NybAPOtW/
l7GSQvcE5HSYLS0KJUkaLsHb0Tvxcst6Uu6GsekkkbFE83wtUJiAGEg0B3RORRsEs4j9ZxrGP5kCwj7o9Jj
Efl0w+QRk8WLgkv/lmYDExMiPT8bWE3KH8tKm4OxtkCQJ69PkHiDtk+gBEmxtPQ4U1drQPUZFMve/
uxOV4dPdO9Tcq6oNhFmVPaUnzoZ0lignMpJonq8FChMQA4nmgGa1l9BrG7GPYLLlZEURMJmgJh9KAqIck1m
OpZT1PVsfnPdCOE9KFe5/
d5mlLXoPx7CUOF+fFvzGloGm9MRZc1DjmkYiCqhonq8FChMQA4nmgC4b2mz5RU41+gecYdUsLFzVdvR5JB+
T7YWxb5+caMRebkP8AhGxV3R4JCD79k38Ob/Kr9OUFI2nqUte2hLOzS/
dO6UfFrl00Zdw3kfhniiz2SSRcUTzfC1QmIAYSDQHdJ3bZPjtVAsyy/
iJbrAFqsKOcgfEZAKmTB30SD4mewckpWi4GV8weoEoP/
tn2VUBf+5Q6XM41X0sqeyU7dPZernZ5o7cyRdZ0IvTrSeOt2IERKSPaJ6vBQoTEAOJ5oDu6PVcDiSYRb2HF
PFKGgI3MVu8WN7z4Z54aNkDsmfoDkiwSqcqfUvCfclfbpW8dyqliJ2yfQn3a6T06unsZ5NWIqOI5vlaoDAB
MZBoDuiRG6KZgARfgTVwjfja2+Vkwz0B0VIFy9LYpcZBVnmr5vGNpPQAST/XFPDnDqVA/
h1GKqXCXkaYLlPbkC73xKlpM1a1NqJoFs3ztUBhAmIg0RzQ7l2hlU2X3AcSPNnlreq1TikKXOUxi0Xe86G1
DwgwXBltX2FgP7kuber2aPIXzorr5LtY/
zgVfsuLQiXcewy5/17k70QiY4jm+VqgMAExkGgP6JF3QL7Kr5v0xmjybWSn7bQSY94FUBKFQHeBdv/
ZbX3hvayltKkLK7eIWPlRdUCSvki0fWizfrh2i3eP154xyjITUehE+3wtEJiAGEi0B3R+TYda/
Ug5uOwg8E5Wtnlc42MGLeHa2m1Xy6dq+eS33taHPfl1aO22wzE43EFc6/Pqra0N+OH/
7kH8AhHTv1OledlbpEoe6oIerr9Ljlpa1Jht6uzXezhEBM7XAoEJiIEwoGXuk+O8muCUYY1mypp45Thp0CZ
2TpeEt1PlDbhdk9yAK0kSPjhSDsEs4v2Mco9iB3UdfQEecWgtXgzEzuxD/AIRF/9bheaN/5HKyA0n/
fVZdhUEs4iy5uA05iSiieF8TTsmIGNYv3495syZg7i4OCQmJiInJ8fnucnJyTCZTB5HXFzchF6PAS1znxwf
YGf0gNtXWO9xjYPVayMQtH56Xd3aOyqhFcwiPjhSHuCRhpZS+jjmon45Abm9XHPp40jkXtzCPhi+ZWx359U
a/r1KFE04X9OOCYgPW7duRWxsLD7+
+GMUFxdj6dKlmDlzJpqavK+XT05OxowZM9DQ0KAejY0Tq83PgJa5V0D6NCt8+zQY1Xa3BnZG34itTLzyazr
QP+DE4AS7lh+xeN7tMRc3RkRcKc0fz5vmQPwCETPuKNXc/
DEStYdxF3R3h0oa2fGeyEA4X9OOCYgPiYmJeOaZZ9Q/
u1wuXHXVVXj99de9np+cnIz4+HhNr8mAHtYytP7/vTDuVG1USvM65Sg38LKOjKHlYl/
l12F9WumEqz1tyan2+FnfSS+NiKpRavPHGCfiF4iIXyDCNMXFOyAjKF3Qk49V6D0UTZSqdbwjTGQMnK9pxw
TEC4fDgZiYGOzatcvj8cceewz33Xef1+9JTk5GTEwMEhIScM011+C++
+7DmTNnxnwdu92Ozs5O9bBarQzoIV39A2pX9HDeKGxEyiRcOaztxt2cW1RrG1Udzd94GHS61D0kyp0U5Qh0
aV89yM0fJcT/wIL4BSKmxA5wD8gISrPN7Sdr9B6KJmfqbBGROBNFCiYg2jEB8aKurg4m
kwnHjx/3ePyFF15AYmKi1+85fvw4PvnkE+Tl5eHw4cO49957MWPGDFitvv/
BSEpKGrVvhAEtc69W5Bic2LIb8m3A6Ro1oTdydaBu+yDeSvUcr79r+W29chK77pAFWW59TwSziLQwb0AIDD
d/nJFYhvgFIs670M4qWCPkVrVDMIvYG+YJZ1VrDwSziM3HK/
UeChGBCUggMAHxYjIJyEgDAwO48cYb8fLLL/
s8h3dAfJMk7RWQaDRlTfy6Q5aw6YWx87TVI3no6PWvmlFtRx8Es4iPjlaMupPydUHkdA7/2+5KPL1BRMYp4
yaSelGW8B0O0y7oCqUk9Tvp4b2XhShSMAHRjgmIF5NZguXNgw8+iIcfftjv8xnQnt49XAbBLKKl2673UCKG
OLTB/
4ucajR32Q1990PR3uPAgTMNavJQ62f5XKWYwdYT1Shv7vZIQE5XR85tgm0n5KIClsbwbLQXTPvULujGLDXt
r/6B4WpeAxMsxEBEgcf5mnZMQHxITEzEs88+q/7Z5XLh6quv9rkJfSSn04l58+bhv//7v/
1+TQa0p4+HSrD6O+Gk8SlVoQ6VTKxCmxFsPSFvKC9t6vJrH8jp6nb1boeyGVmZjLpckbOvaM9Q806WaB1t2
1DFNyNXevOHJEkR0c+EKFJwvqYdExAftm7diri4OGzatAlnz57Fk08+iZkzZ6qldX/
xi19gxYoV6vmvvPIKDhw4gPLycpw6dQoPP/
wwpk2bhuLiYr9fkwHt6fPsasNXaQo3O3Ll5UxFtTa9hzJhykQ7s6wFHxwpxxHL2MtqjpXKHaTTSprgGHThv
cNl2JJTHaLRho5ydyinIrw/
5Q+GD49GzocY4d7RnSiScL6mHROQMaxbtw4JCQmIjY1FYmIisrOz1a8tXLgQS5YsUf/8/
PPPq+defvnluOeee3D69OkJvR4D2tOXQ5Pls/W8HoHyfobcFbzB1q/3UCbs4NnGURvox7J/
xMTcMeiKqDsfCuWuVnoEbKwPJJdreB9ZZwTsI9vB34dEhsH5mnZMQAyEAe3p6wL5E+81By0TbkBHo7lcklp
Rqts+qPdwJiyzrGVCJXmVzevheLdnIk5UtqnXIxwTy2BxL+UdCYlnShHvdBEZBedr2jEBMRAGtCela7VgFp
FXw/
XtWnXbByGYRbyVKoblhMxbT5Beh+9E6tOsKghmERUtPSEcZeg1dfWrvV3eO1zGstVD6oaqoH1wpFzvoQSEk
mj+syC8SwoTRQLO17RjAmIgDGhPygZSZd0/adPU2Q/BLOL9jPCckNXb+kYlIE1dvj/x/
+BI+C43m6j+AaeahETCfodAUCq+bTsR3k0IFUovEKWyWxn3xhHphvM17ZiAGAgD2tNJt6UlkdA4Tm9KKdrP
s8NzI7Z90DkqARmrQIHS68TWG/7r//2hdHvn3UJZToX8+yOlKDLuGPQ5PON/
7UGL3kMiilqcr2nHBMRAGNCeBp0ufJFTHXGN4/RSaJWXMO3Oq9V7KJM2MgEptHrf3zHo1vG9f8C/
zunhTqn6lVocfiWWg0EpQpBd3qr3UAJmU2al33ugiCh4OF/
TjgmIgTCgR3NvJkfaHC9rDfsJakpRvfrpr2AW8WlWFapaR+/
xcN+AHC2TNPcmkwRsGfrwQoygBo3NXXa18SR7ghDph/M17ZiAGAgDejRl3X+kbCTVk1LG9nhZ+H4i3D/
gRL2tD1nlrR6fBLtvqpckCRmiXJp2Y0aZjqMNreYuOwSziA3p0fMz+yJJkronprnLrvdwAk5Jrs41RE5yRR
ROOF/TjgmIgTCgR+sc+iR7zcHo+SQ7WL4aauSXHwF7BEZWxOpzDC+zKm3qUh//
5HilfoMMsf6B4T0C0V4Jq9cxXPFtIAJLeCt3Ak9WsiQvkR44X9OOCYiBMKBHc7okrBlabtPRy+UGWihLNyJ
hSUplS49HAuIeG6lu5ZujKQEBoH7q39IdeZ/
6T4RS8S1S74Cx+SSRvjhf044JiIEwoL3bekJeblBcx+uihbKBtaatV+
+haKYsN1KOxs7hUrufZ1dHbaWgzVHS+2Q8SoK6OatK76EERW5VOwSziL2FkVHhiyjccL6mHRMQA2FAe6d82
rcj18plWBpsSC+DYBbRGgGfjrsvNxLMIvYV1sPpkuBySXg71RK1CYhSijcSltlpUVzXCcEs4stcq95DCYpz
DUM9Tk5GRo8TonDD+Zp2TEAMhAHtXXVrLzuia+R0SX51Dw8XkiR5JCCCWcT+Mw1q9StlM3ZpU/
gvN5uItHNNEMwijlqiu3GncodgX4TeIbC2y78TPz5WofdQiKIS52vaMQExEAa0bztyrRDMIsxhXEJWTz324
U257hWjwtnIBETpeq5UTYvGu2Unhpp37j/
ToPdQdHXU0hLReyTaexwQzCLWp5XqPRSiqMT5mnZMQAyEAe2bUvVo5+nIXFIRbMqeifcOR86mXKWviftxql
r+5HtLlPbCUN4n4dxsUgtJknCmzobtJ+WCCzkVkVklyjE43GjTPhgdjTaJjITzNe2YgBgIA9q3sTaVdvQ6I
mJfQzApDR03R1hVKGXJkXJsG5p4fl1Qp/
fQdFHa1B3VCdjI6mhFtTa9hxQ0Hxwph2AWUWiN3J+RyKg4X9OOCYiBMKB9a+n23mTNPuhUNxvzk0DvXC4JH
x+rgGAW8VV+ZE3MleaKI4+0CF16M57ajr6o3huQW9XmEQdlzd16DylolLt9n0ZopS8iI+N8TTsmIAbCgPbN
veqRe2Ox/JoO9fFI7HgcCJ1uG7NtfQN6Dyeg9hXWe01AorVBW9vQ3oB30qNzb8Cx0haPOGjq6h//
m8JUR6/8d73uEJu0EoUa52vaMQExEAa0b5IkYd2h0Q0Jt+QM93yojPLeB764b8yONJllLV4TkLP10fke6nN
Edzc/C+vdAAAgAElEQVT0/
WcaIJhF7Mmvw5m6yF6aNOh04a1U+e+6xx7+le2Iwgnna9oxATEQBvTYkoeWEVW3yo30uocqO0XDem8typrl
fQGfZ0fevgDHoAtp55rUn1E5IqHZ4mS43Motr08rRf9AdC1L3HnaGlW/C5R9IPW2Pr2HQhRVOF/
TjgmIgTCgx7Ynv06tdAQMV/
xRjuzyVp1HaEyF1sivjCRJEtanlaqx4H6XLNq4vycOlURX2WqlE3y03A1Vii6UNPDfDKJQ4nxNOyYgBsKAH
ptSdnX/
mQY4Bl1qh3Tl+OBIucf+EJJllbdGRQ+V9zPKve4Tijbu74lIq3o2nncPl0X83g93KUUNEV1umMioOF/
TjgmIgTCgx1ba1KVOrJS1z4JZ9Jh48i7IaIdK5EpRmaWR3R3bPQ6iWUrR8Mb89WmlUbNB2em2/
KzXER17IpQ9UAfPev9wobajDx8erUBpU+RWAyPSA+dr2jEBMRAG9NhsvQMen+4qx67Tter/fxJln/
j646uhpWt5NR16DyWolPXw0Z6ADDhdajUswSxGzT6QaKwKdXqoFK+vvjfKHaFof08QBRrna9oxATEQBvTYJ
EnCxoyyUQlISUOn+v+bMiv1HqbhbD0hVwqzNHbpPZSgUnqdcLIli6blSC6XhBOVcg8Qb81KI5Xyu2/7yRqv
X3f/
PUlEgcP5mnZMQAyEAT2+mrZerDlo8fiHtcHWD1uffHdkzUELXK7o+PTTX9FSKcfaLsdGblW73kMxhM+yqwL
SjM/
WO4APj1YYep+Be0EKX3cDIlFVa8+Ye32YgBAFB+dr2jEBGcP69esxZ84cxMXFITExETk5OWOev337dsybNw
9xcXG49dZbsXfv3gm9HgPaP/
ZBp7ohXTCL6OwfgCRJWHtwdJ+QaOd0SVHVK8DJ5FO1J0BL73IqhruLN3Ua827Kh0eH734di/
C9Tu6auuQePxszykZ9zX3PnGAW+cEMUQBxvqYdExAftm7ditjYWHz88ccoLi7G0qVLMXPmTDQ1NXk9PzMzE
zExMfjb3/6Gs2fP4uWXX8bUqVNRVFTk92syoP2nrH0WzCIGhyoebT5eGVUlOP2h7JtZezB61sWTLO1cEwSz
iKMW7xPy9h4H7IPj7w9RihgYudqS+z6w3CpjjjEYuvrl9/
fbqRZ09Q+oSYYkSR7Jh2AW0W0fREu3Hd1R8EEEUbBxvqYdExAfEhMT8cwzz6h/drlcuOqqq/
D66697Pf+hhx7Cj3/8Y4/Hvv/97+M3v/
mN369pqICWJMDRY9jjXE0D1qbkY21KvvrYP7LOYW1KPsSaRt3HZ5TD2tiCtSn5+DSjWPex8AjtcVK0Ym1KP
g7ml4/6WmV9M9am5GP/6bJxn2dXtqi+144UV+n+c3k7vjx+Th1jX3en7uMJ1THQ16X+3GtT8mHOk/
+uOzs7PB5fm5KPhpYWbMsswdqUfJQ2GuDfGKIwZqj5WphiAuKFw+FATEwMdu3a5fH4Y489hvvuu8/
r91x77bV46623PB5bvXo1vvWtb/
l8Hbvdjs7OTvWwWq3GCWhHD5A0gwcPHjx4RNjR0dGu978wRGGNCYh2TEC8qKurg8lkwvHjxz0ef+GFF5CYm
Oj1e6ZOnYovvvjC47F33nkHl112mc/
XSUpKgslkGnUYIqCZgPDgwYNHRB6SnX1BiLRgAqIdExAvQpWAGPoOiMGXYHk7jhRXYW1KPo6dNeYykVAfnZ
0dWL+/AGtT8lFR16T7eHiE9mhsbcXalHx8nHZGXYbz5fFzsNk8l+c4ert8PkdHR7vHudszS3T/
udwPyd7tMb7+nuhZfqUcyrIq9yWpyu/CI8VVOFNZ7/H1f2Sdk3+/
E9GkMQHRjgmIF6FagjUSA1qbrHK5Mpa52HtX4GhT2dLD5oxRzH2DsrIReedpKxps/
R6bk8eqGlfb0edx7sfHKgDIfTeOlbagqrUnVD+OV/0DTo/
xRWOhhdyqtlHXQCnBXGi1qZWylOOw2Kz3kInCHudr2jEB8SExMRHPPvus+meXy4Wrr756zE3o9957r8dj8+
fPD99N6GEor6Yj6voAjOVcQ9eYTcoosjldoysh/
bOgHmXN3R6P1Xb47g+jlHJ9J70UglnEhnS53Gtx3XDzTz21dNujvtfFgNPl0YTT0tilVr7rczjhdEnq35+R
SykThRPO17RjAuLD1q1bERcXh02bNuHs2bN48sknMXPmTDQ2yp+u/+IXv8CKFSvU8zMzM3H+
+efjzTffRElJCZKSkliGN8TO1suToi9zrXoPxRAKrHJCtiefCVm0UrqhK8eBMw0eTfuUCasv+UNJ/
bYTNR79JNz78Oh510FpxCeYRWRGUf+PkSRpuN+PcqSdGy4ZX93ai3WHLEgpatBxlESRg/
M17ZiAjGHdunVISEhAbGwsEhMTkZ2drX5t4cKFWLJkicf527dvx80334zY2FjccsstbEQYYuVun+y2dtv1H
o7uTlS2qZNOik57C+s9JqUpRfXILm/1eGysRoWZZS3qskbl/
F7HoEdzwl6Hfn0lztTZ1KVl0W592vBdjvcOl6n9kRSDTldULlEjCgbO17RjAmIgDGht6tzWq39wpFzv4eju
qKWFa77JI9nYk1+nNihUjkMlvvdMpQ4lHsfLWtVlPC3ddmSIzer3N+q0pKfHPqiOYT+TbHxwpFy9HrvzavU
eDlFE43xNOyYgBsKA1qaV68E9HDwrTx6zylv1Hgrp6KOjw/
sDduRa8c8C+a7IP05ZIZhFvJ9R7vOT8T35dRDMIgqsHdh2Ul6Gdaq6HSlFw3dWMnRKcI9YhpMgX93eo8nm4
5Xq9TgWxcvRiEKB8zXtmIAYCANaG/
dPRAWzCPugU+8h6UqZaJ6ubtd7KKSjxs7hKkhf5FRjS041BLOI4rpOddmOt43J7hu8S5u6cLq6Xd0PoiQvy
lFv872RPVgOnGlQX/94GZNs9306JQ38N4QomDhf044JiIEwoLVT1qwLZhENtuiu9qJMEovrGE/
RrqatV73boZTltfUO4PNsORkpbx7dmC7dbalWZ/+AWtZXMIujNrfrkeR+NXR3RjCL6LHrtw/
FKNwTEO6BIwouzte0YwJiIAzowFCWipytj+7r+MXQJ91lXiaXFF1G9v7YlFkJAPgy1+rzvaIss3KvLrX1RL
XH8/
izjyRYlPgubfJdxSuauP99cLM5UXBxvqYdExADYUAHhtlt42w0au22q43IBLMIa3uv3kMinY3cH6WUaP26o
M5nJaxdp2shmEUU1drUx05Weja9U/
4c6tLXA04X1hy08E6nm2Ol8t3ftJKm8U8mIk04X9OOCYiBMKADQykzGq3lZ5U7QMrR3MXlGNGu0235lHtSk
epWXreixbOr+RYvdxgqWob7bqxPK1Urz4W66pz7cqNuLr8CADgGXahu7eXdD6IQ4HxNOyYgBsKADoziuk6s
3CJi9cdWWCx6jyb03LsiC2YRXf0Deg+JdNY/
4PSICaV0rnslqZGV45KH4qimbfgOWnuPQz3306wq9DqGCz84XaGZ+A46XR5jdoXodYmIFJyvaccExEAY0Nq
1tQE//
N+9iF8g4uLvVcBkAhYvBtqjqBDUJ27lONcdsvATUYLTJXlM2geGmtS5NxQcmYAoG83d76C5P8+2EzVwuf25
zxGaqnNNXcP7WXaEeOkXERHA+VogMAExEAa0dosXA+dfOID4BSLi51tgMkmIiZEfjxbuCQgbMpLCW0wUWDs
8EpDU4kYUWm2QJEmtljXyDpp7AgIA6w4NV9UKtj6HUy0H/
Fl2FZNrItIF52vaMQExEAa0NqIImEyAaYpLTkAWiJgydVB+zISoWY7lXiJVqXZElFLUgM1ZVWjrcaiPnWvo
8lrVyn3JlnK3RKF0RM+paAMAbMyQ462pK7ibwQedLrznFtsHz4a+8hYREcD5WiAwATEQBrQ2+/
ZBTTYuvr0c8QtExFzcpz62b5/eIwy+kevjd+fV6j0kMrBKt03l7kdVq/z42oOjs/
b2HgdOVbdjcCgxUfaKBLvaWpvb/
hPBzP42RKQfzte0YwJiIAxobdQ7ICbgolusiF8gIvZyW1TdAenoHZ6kfZZdFZJlMRS+6m19XhOQoxa5pOv7
GeMv4VOaGY6sohVoSjNFwSxi/5kGLr8iIt1wvqYdExADYUBrt3gxEBMDTLu+GfELREy7oSmq9oAoE0ru/
SB/NHb2e01AlGPz8cpxn2P7UNnncw3BbQhY0tAp7z05WRPU1yEiGg/
na9oxATEQBrR27e1ysjH1Mpu6D+T7j9SguiE67gQoS2o+zarSeygUBpwuCZvdihaMPPyZ7O/
OkxsWFlpt456rRW6VXLFrX2F9UF+HiGg8nK9pxwTEQBjQgZOd34+nN4h4easYVd2BlU3F2/
kpMflJkjxL9G49Ua3+/578unG/
P6WoHoJZRG6VvCndPugMyvKoDFHuWXJYbA74cxMRTQTna9oxATEQBnTguEb0PYiWBCS/
psPviSORwv29cqhkuDv6gTMN436vcn5mWQtq2nrxVqqI7PLWgI9xX6FnokNEpBfO17RjAmIgDOjA+vDocEf
wtHPRkYAojeX8mTgSKZT3yfq0UmSWtah/
zvDjboOyYT39XJNakndkU8NA2JFrhWAWcbaevx+JSF+cr2nHBMRAGNCBVdsxXOEnWtaNc5kKTcZn2VVqEnF
qqNGfe6+Psbgnve53UpyuwC3DkiRJTW5qO/
oC9rxERJPB+Zp2TEAMhAEdeMV1cuWczVlVcAy6xv+GMGculpfDBGMJDEWurv4BFFptGHC6cLa+U00iCqwd4
35v3tCyPyWJUY5AVsVq7barfUkGnZH/PiYiY+N8TTsmIAbCgA68CrdGaztPW/
UeTtB9XVAHwSwir2b8iSORN+7vGbFx/CTiTJ3NZxWt/
gFnQMak7G3akRv572EiMj7O17RjAmIgDOjAG9nnoNs+iLqOvoBNjIxGWSdf0sAYoslpsA2/
Z6pbx+9uPrKZ4ZdDMSiYRTR29gdkTEqpX97ZIyIj4HxNOyYgBsKADjxb34DH5OifBfXqcpFIpCyDCXZXaop
cHb0O9f3S5EcCIUkSPnHrJdJg61e7o5c1d2sez4DThbUHLRDMIpq77Jqfj4hIK87XtGMCYiAM6MBzDLp8Lg
+JRErlrzpu1KVJ6h9wqu+Rth6HX99T2dKDz7Or1aV/
gWxOWNPWC8Es4oMj5UHpL0JENFGcr2nHBMSLtrY2PProo7j44osRHx+Pxx9/HN3dY3+St3DhQphMJo/
jN7/5zYRelwEdeCObrI1cny5JEkqbuiNiz8SA04W3UoeXmhFNhiRJWHdIvuMwMMkN36lDxRCOl2lfMqVsiu
f+DyIyCs7XtGMC4sXdd9+Nb3/728jOzsbRo0dx00034ZFHHhnzexYuXIilS5eioaFBPSYamAzo4GjusuN4W
euoBOSIpdmjb0Frd3gv71D2u7x7uIyfFJMm9kGnpn1SSi+Rg2cbNY9FKQu8N0pKaROR8XG+ph0TkBHOnj0L
k8mEkydPqo+lpKRgypQpqKvz3V164cKFeO655zS9NgM6eNp6HD7vhChHTdv4G26NrKjWxk+KyRAKrHLVqt1
5tZqf61hpS1Q1EyUi4+N8TTsmICN89NFHmDlzpsdjg4ODiImJwc6dO31+38KFCzFr1ix84xvfwC233IIVK1
agt3diE1oGdPCMtRdEOSx+lBw1svRzTWxCSIZQ2tQNwSzii5xqzc/
F3jZEZDScr2nHBGSE1157DTfffPOox2fPno0NGzb4/L6NGzdi//79KCwsxGeffYarr74aP/
nJT8Z8Lbvdjs7OTvWwWq0M6CAaLwHJD/
N9IHvy6yLi56DwV9chl+b98GiFpudR7ur52xSRiCgUmIBoFzUJyPLly0dtEh95lJSUTDoBGenQoUMwmUwoK
yvzeU5SUpLXcTCgg2OzW6nQzVlVeDvV4pGABGLDrJ6+yJFLn5Y2aS99SqSF0rn83cO+f//5w/
39WdoU3ncoiShyMAHRLmoSkObmZpSUlIx5OByOSS/BGqmnpwcmkwn79+/
3eQ7vgISW2NiFrwvq0NHrQK9jUJ0kKUcgNszq6YMj5WofBiI9dfXL/
XfWHLRMuiDCyAp2tSwtTUQGwQREu6hJQPylbELPzc1VHztw4MC4m9BHOnbsGEwmEwoKCvz+HgZ06Fnbe9UJ
zlf5/v/9Go0kSeodna7+Ab2HQ1HOvZfI4ARL+UqShEGna1QTUX97khARBRvna9oxAfHi7rvvxne/
+13k5OTg2LFjmDt3rkcZ3traWsybNw85OTkAgLKyMrz66qvIzc1FZWUl9uzZgxtuuAF33nnnhF6XAa0PS2M
XBLOIrSe0b5jVS499EIJZxFupIlwuluAlfblcw3cveh0T60lzorINb6WKSCtpUp/
j3cNlk+5JQkQUaJyvaccExIu2tjY88sgjmD59OmbMmIFf/
epXHo0IKysrYTKZkJ6eDgCoqanBnXfeiUsvvRRxcXG46aab8MILL7APSJhQ7oJ8fEzbhlm91Hb04auhDegb
M7StuScKlPVppRDMIjp6/
b9z4a1x6K7TtZp6khARBRrna9oxATEQBrQ+bL3yUo+1Gtar68l9svZZdpXewyECALyfIe9Jaur0f0+S+5JI
5WD5XSIyGs7XtGMCYiAMaH0MOod7hPQ5wu+TVvfJWiAavxEFwqbMygk3+Dw91PXc/
ShvZlU3IjIWzte0YwJiIAxo/bx3uEz+tLYr/CpIuU/
W2ISQjEIpC102gQQiQ2welYCwqAIRGQ3na9oxATEQBrR+PsuugmAWUdHSo/dQJsx9spbHJoRkEF/
mWiGYRZyt9//32T8L6iGYRXxdUKfGdDguiySiyMb5mnZMQAyEAa2f3Xm1EMwiCq02vYcyISM37VaGYQJFkU
kpjLAj1+p3ErFFbabZhdKm7gntHyEiChXO17RjAmIgDGj9HCpphGAWkVnWovdQJmTAbf/KRCsOEQXT/
jMNE+5irmxcb2TiQUQGxvmadkxADIQBrZ+cijYIZhEpRQ16D2VCeh2DHgmIkz1AyCD+ccqqxuXewvpxz3e6
JLyVOrneIUREocT5mnZMQAyEAa2fcw1yM8J
tJ2r0HsqEuHeLrrf16T0cIpWyn0Mwi9h8vHLc8zv75VheE6blsIkoenC+ph0TEANhQOunsbM/
LBv5tXTb1U7RREZi6xvAztPDd0Ecg2N3Mm/qCs/
3IBFFH87XtGMCYiAMaP30Dzj9nigZSb2tD4JZxIdHw7OLO0U2SZKw5qAFglmErW/scro1bXITwk/
8uFtCRKQnzte0YwJiIAxofb071Aukucuu91D8Vt3a6/
cSFyI9+NsR3dIYnssgiSj6cL6mHRMQA2FA6+sLtxKg4aKsuRuCWcQXOdV6D4XIq83H5Y7oVa1jl4gutNogm
EXszqsN0ciIiCaH8zXtmIAYCANaX/
sK5U2zJyvb9B6K30oaOtVeC0RGtP1kDQSziHMNYyf2JyrlSnT7z4RXJToiij6cr2nHBMRAGND6yixrgWAWk
VrcqPdQ/
MZPjcnolIaEeTUdY553xNIMwSzisNgcopEREU0O52vaMQExEAa0vs7UyZP5L8PobkJuVTsEs4h9fvRZINJD
arHc5DOrvHXM88xD52WPcx4Rkd44X9OOCYiBMKD1VdsRfhWlsstbIZhFmMPorg1Fl6MW+c5i2rmmMc9T7pT
kj3OnhIhIb5yvaccExEAY0Prqsctdxd9KDZ+O4sqylfRxJndEesmtkvd2pBSNfZfO370iRER643xNOyYgBs
KA1pckSXg7Ve5Z0NU/ds8Co9h/
pgGCWURORfhsnKfoUlQrL23ceXrspY2f+Fkti4hIb5yvaccExEAY0PrbmFHmV88Co/
jHKbnT9Jk6m95DIfKqfKhU9KdZVT7P6XM48Vaq3Ai0xz4YwtEREU0c52vaMQExEAa0/
jZnVYXNp7DK3Y9wGS9Fp9ZuOwSziPVppZAk70sbS5u62AWdiMIG52vaMQExEAa0/r7Mle8onK037t9B/
4ATmaUtavIhmEW0dIdP93aKLoNOl3p3o9fh/
e5GhijvZTpUwmIKRGR8nK9pxwTEQBjQ+ts71IzwVHW73kPx6bPsKo/
kQzCL6B9w6j0sIp8+OFIOwSyipq0XWeWtoxJm5W7eiTBqAkpE0YvzNe2YgBgIA1p/
aeeaIJhFHCtt0XsoXnX0OkYlH4JZ9Lm0hcgIlApXyn9H7vXYM1SCt8DKErxEZHycr2nHBMRAGNAB0tgIpKc
DKSnyfxv9X9aRpXdfjXHGXt3a6zUBITIypcmg+5GXX6bG+vZPzRB2nWIJXiIKC5yvaccExEAY0Bq1tQEbNw
K//jXwwAPAf/6n/N9f/
1p+vG385R0F1g4IZhF78utCMGA3fo69pKFz9ESOjdvI4KztbonznnwIr3+BzGUr1Fj/9FcvQvjtm6hc/
6Ff71MiIj1xvqYdExAv/vKXv2D+/
Pm44IILEB8f79f3SJKEVatW4YorrsC0adOwaNEiWCyWCb0uA1qDtjZg9Wrg//
wf4KmngFWrgKQk+b9PPSU/
vnr1uJMbS6NcjWfrierQjBvwa+zSqtWoqajD8bJWj+Rjd15t6MZJpMG2EzVy8vHSRghPvIrU3yapsf7hS+9
AeF5A/YOP+vU+JSLSE+dr2jEB8WL16tUQBAG///3v/U5A3njjDcTHx2P37t0oKCjAfffdh+uvvx79/
f73k2BAa7BxozyBf+klefI+8njpJfnrGzeO+TTKJ7XJxyqCP2aFH2M/
99CvILz+xai7H0ctxtyrQjRSTkWbHMNPvAphxbv46uU1aoy/s/JdCC9tRNuLq/
16nxIR6YnzNe2YgIwhOTnZrwREkiRcccUV+Pvf/
64+ZrPZEBcXhy1btvj9egzoSWpslJcqPfWU9wm8cjz1lHzeGHtC2nrkTd7vpJeGYuR+j337716D8Ns3Iew6
BcEs4stcKw6VNMI+yOpXFB7qS2vkGH5egPDSRmxbuQ5ISoK0OglvrdwI4aWN6Fn9il/
vUyIiPXG+ph0TkDH4m4CUl5fDZDIhLy/P4/E777wTv/
vd73x+n91uR2dnp3pYrVYG9GSkp8tryZWlS76OVavk8w4f9vlUfQ6nenfB6QpBZSk/x/7lS2sg/
PrPED44AMEsIp/7PijcpKfjzMO/xtGVf4fw0kYkr3wHSEqCffX/lZdlvbQRg6uT/
HqfEhHpiQmIdkxAxuBvApKZmQmTyYT6+nqPx3/605/
ioYce8vl9SUlJMJlMow4G9ASlpMibtsdKPpTjwQfl832QJAlvp1ogmEV0u5UJ1XvsH67cAGHpXyBs2AvBLE
JsZLUgCjNDsd66+s8QXtqIDSvfBZKS0Ln6VQgvbcTale/5/
T4lItITExDtoiYBWb58udfJvvtRUlLi8T3BTkB4ByRAAngHBADeO1wGwSyiqcv//TuT5sfY7av/L4QX3/
O4A1LT1hv8sREF0lCs976cpN7xcK5OwslV8h2RjUMJCe+AEJHRMQHRLmoSkObmZpSUlIx5OBwOj+8J9hKsk
RjQkzTRPSBNTWM+3ebjlRDMIqpbQzDJ92Pspateh/C8gPXP/
g+EXachmEXY+gaCPzaiQBqKdddTT6l7PmxDdz+UYyLvUyIivXC+pl3UJCCTMdFN6G++
+ab6WGdnJzehh1KAqmABwI5cKwSziJKGEP09+Bh70ar/Qf6qv2H/
i29CeOJVpL+1Ca3d9tAkRkTBMBTr761YD+GljRBXva4mH7tfXjOh9ykRkV44X9OOCYgX1dXVyMvLwyuvvIL
p06cjLy8PeXl56O7uVs+ZN28edu7cqf75jTfewMyZM7Fnzx4UFhbi/
vvvZxneUApQHxAA+GdBPQSziNPV7cEfN+B17P3KsqvnBax5Qt6kW1nGnh8U5oZi/
ZNfvgjheQEZK9+UE5AX30P/U89M6H1KRKQXzte0YwLixZIlS7zuEUlPT1fPMZlMSE5OVv+sNCK8/
PLLERcXh0WLFkEUxQm9LgNao5HdxB98cMKd0AEg/VwTBLOI/
WcagjxgNyPGbn14ibzn47dvyr0T9uSjo9cx/vMQGV1bG7a/
+SmE376Jbb9cDmHpX7D7sT9O+H1KRKQXzte0YwJiIAzoAGlslDewpqTI/
53gWvJ6Wx8Es4g1By2hqYTlbmjs+dv2yRvOh/Z8CGYRjkFXaMdCFCRfF9RB2HUKq/
9fGp5+OR2fvXuEez6IKGxwvqYdExADYUAbx6dZVRDMIiw6lbs9VNLo0fF8fVqIGiMShcDuE4343hIR8QvkI
/aqdixeDLSHaNUjEZEWnK9pxwTEQBjQxrH/TAMEs4js8lZdXn/
biRqPBOTjYxW6jIMoGP79P1txyf8aTkDOn9mDmBhg8WK9R0ZEND7O17RjAmIgDGjjOFnZBsEsYl9h/
fgnB5gkSXgnvdQjAXk/ozzk4yAKBlEEYq/
sUJOPGd8vg2mKBJMJMJkAi0XvERIRjY3zNe2YgBgIA9o4ypu7dbvz0NU/
AMEsqh3Zlf8nigT79gFTZ3WpCcgFNzaqyYfJJH+diMjIOF/TjgmIgTCgjcPWN+Cx/
+Lg2UZIkhSS10470YOnN4j4+
+5KbMqUmyL+45Q1JK9NFGyiCJwf36smIOddaPdIQHgHhIiMjvM17ZiAGAgD2lhOVLbhrdThZVAt3fagvl5b
m7wGPu7aVsQvEHHhvHr86J4B7D3VjK5+dj6nyHHX3S7M+G4VLrhh+O4H94AQUbjgfE07JiAGwoA2nqrWHjU
BsbYHtwP54sVATIyEi2+rQPwCEVNnd3JSRhGpvV2Oa/
c7H6yCRUThgvM17ZiAGAgD2pi25FRDMIsobeoO2muI4tCnwDN6hzfmnufishSKaBaLvOeD8U1E4YTzNe2Yg
BgIA9qYdp2uhWAWUVRrC9pr7NsnJxrTrmuWN+bObeDGXCIiIgPifE07JjSlVY4AABX7SURBVCAGwoA2ppSi
eghmEblVbUF7DeUOyPTvVMnLr2Z1cWMuERGRAXG+ph0TEANhQBtT2rkmCGYRx0pbgvo6dy2WMHOBBfELREy
JG+DGXCIiIgPifE07JiAGwoA2puNlrRDMIg6VNAb1dRqbnfjeErk0qbL/
gxtziYiIjIXzNe2YgBgIA9qYTlW3QzCL2BvkruhK75GkbRbs3Stx2RUREZEBcb6mHRMQA2FAG1NxXWdImgE
2dfZDMIt4P6M8qK9DREREk8f5mnZMQAyEAW1M5c3dEMwiPs+uDurrKD1HNh+vDOrrEBER0eRxvqYdExADYU
AbU11HHwSziA+OBPfOxLmGLghmEdtP1gT1dYiIiGjyOF/TjgmIgTCgjal/
wIk1By0QzCJauu1Be528mg4IZhFf5dcF7TWIiIhIG87XtGMCYiAMaOPanSc3I8wMYinerHK52lZqcXCrbRE
REdHkcb6mHRMQA2FAG1eBVb47set0bdBeI32o38hRS3D7jRAREdHkcb6mHRMQA2FAG1d1ay8EswjBLMJc3A
hJkgL+GkrH9ZOVweu4TkRERNpwvqYdExADYUAbV2f/gJqACGYRtt6BgL/
G1hPVEMwiShr4909ERGRUnK9pxwTEQBjQxiVJkkcCUtPWG/
DnX59WGvSN7kRERKQN52vaMQExEAa0sbknIEW1toA+t3KH5e1UC5yuwC/
vIiIiosDgfE07JiAGwoA2tiOWZjUBOSw2w9YXuGVYFS1sQkhERBQOOF/TjgmIF3/5y18wf/
58XHDBBYiPj/
fre5YsWQKTyeRxLF68eEKvy4A2NkmSkFPR5nEnJFDLpY6XySV49xXWB+T5iIiIKDg4X9OOCYgXq1evhiAI+
P3vfz+hBOTuu+9GQ0ODerS3t0/
odRnQxmdp7PJIQDLLtJXMlSQJnf0D2H6yBoJZRIG1I0AjJSIiomDgfE07JiBjSE5OnlACcv/
992t6PQa08TV19nskIDkV2krm5lZ53lFp73EEaKREREQUDJyvaccEZAwTTUDi4+Mxe/
Zs3HzzzVi2bBlaW1vH/B673Y7Ozk71sFqtDGiD6x9weiQMJzT27HB/
rvcOlwWlvwgREREFDhMQ7ZiAjGEiCciWLVuwZ88eFBYWYteuXfjmN7+J22+/
HU6n0+f3JCUljdo3woA2Pvek4YiledLP0zWit8g/
TlkDOEoiIiIKBiYg2kVNArJ8+XKvk333o6SkxON7JpKAjFReXg6TyYSDBw/
6PId3QMKTe9JgLm6c9POUNnnuJ8kQJ5/
MEBERUWgwAdEuahKQ5uZmlJSUjHk4HJ7r77UkIAAwa9YsvPfee36fz4AOD+5Jw1f5dZN+nkKrzeO5ssvHXr
JHRERE+uN8TbuoSUAmQ0sCYrVaMWXKFOzZs8fv72FAh4e9hfVq0rDtZA0AoL3HgZ2nrRPqkH6icngD+ob0M
nTbB4M1ZCIiIgoQzte0YwLiRXV1NfLy8vDKK69g+vTpyMvLQ15eHrq7u9Vz5s2bh507dwIAuru78cc//
hFZWVmorKzEwYMH8b3vfQ9z586F3e5/
nwgGdHiwDzpx4EyDmjy0dtvxTnopBLOIj45W+P08GWKz2tTQxe7nREREYYHzNe2YgHjhramgyWRCenq6eo7
JZEJycjIAoK+vD3fddRdmz56NqVOnYs6cOVi6dCkaGye2P4ABHT5GluNVjvVppX4/
h5LEaC3lS0RERKHD+Zp2TEAMhAEdPmx9A14TEMEsoqy5e/
wnALAnv47NB4mIiMIM52vaMQExEAZ0+JAkCfsK67G3sB4bM8pGJSG2voFxn2PbCbn7udjYFYIRExERUSBwv
qYdExADYUCHJ1vvAOo6+jwSkNKm8e+CfHK8EoJZnNDGdSIiItIX52vaMQExEAZ0eHNPQLL8KKmr3Dlp6uoP
weiIiIgoEDhf044JiIEwoMPbRPqDSJKEt1MtEMwiOvvHX65FRERExsD5mnZMQAyEAR3eSpu68VaqnIBsyqz
0ed7Z+k6cre+EYBbxVqqIAacrdIMkIiIiTThf044JiIEwoMNfc5cdglnEe4fLvH69tKk7YJ3UiYiIKPQ4X9
OOCYiBMKDDX7d9EIJZxNupFkjS6OaC5uJGjwSkqrVHh1ESERHRZHG+ph0TEANhQIe/
QadLTS76B5yjvv5FTrVHAuLtHCIiIjIuzte0YwJiIAzoyLDukLy5vKPX4fF4S7d9VL8QIiIiCi+cr2nHBMR
AGNCR4YMj5RDMItanlXrc4UgdsfyKCQgREVH44XxNOyYgBsKAjgyfZlWpCUZuVTsAz83nWeWt2Hy8kg0IiY
iIwhDna9oxATEQBnRkcN/nkVvVDlvfgMddjy72/
SAiIgpbnK9pxwTEQBjQkUFZgqUkILUdfR4JiLfqWERERBQeOF/
TjgmIgTCgI4PSjFAwi8gsa0FZczf3fRAREUUIzte0YwJiIAzoyHCisk1NNtJKmlBUa2PfDyIiogjB+Zp2TE
AMhAEdGVwuCXsL6yGYRaQU1SO3qk39fyIiIgpvnK9pxwTEQBjQkUO567HrdC2OWlrkuyHnmvQeFhEREWnE+
Zp2TEAMhAEdOUqbuiCYRWw9Ua32/8gqb9V7WERERKQR52vaMQExEAZ05Khp64VgFrEpsxJf5ddBMIvIr+nQ
e1hERESkEedr2jEBMRAGdORo6uof1fX8XEOX3sMiIiIijThf044JiIEwoCNHZ//
AqASkupWdz4mIiMId52vaMQExEAZ05HC6JGzMKPNIQGx97IBOREQU7jhf044JiIEwoCNL/
4ATJyrbsD6tFAVW7v8gIiKKBJyvaccEZITKyko8/vjjuO666zBt2jTccMMNWL16NRwOx5jf19/
fj6effhqXXnopLrroIjzwwANobGyc0GszoCOTJEl6D4GIiIgChPM17ZiAjJCSkoJf/
vKXOHDgAMrLy7Fnzx5cdtll+MMf/
jDm9y1btgzXXnstDh06hNzcXNxxxx34wQ9+MKHXZkATERERGRvna9oxAfHD3/72N1x//
fU+v26z2TB16lTs2LFDfaykpAQmkwlZWVl+vw4DmoiIiMjYOF/TjgmIH1auXIl/+7d/8/
n1Q4cOwWQyoaPDc51/QkICBEHw+3UY0ERERETGxvmadkxAxlFaWooZM2bg/fff93nO559/
jtjY2FGP33777fjTn/7k8/
vsdjs6OzvVw2q1MqCJiIiIDIwJiHZRk4AsX74cJpNpzKOkpMTje2pra3HjjTfiiSeeGPO5J5uAJCUleR0HA
5qIiIjImJiAaBc1CUhzczNKSkrGPNwrXdXV1WHu3Ln4xS9+AZfLNeZzT3YJFu+AEBEREYUXJiDaRU0CMhG1
tbWYO3cuHn74YTidznHPVzahf/
nll+pj586d4yZ0IiIiogjD+Zp2TEBGqK2txU033YRFixahtrYWDQ0N6uF+zrx585CTk6M+tmzZMiQkJCAtL
Q25ubmYP38+5s+fP6HXZkATERERGRvna9oxARkhOTnZ5x4RRWVlJUwmE9LT09XHlEaEl1xyCS688EL85Cc/
8Uha/
MGAJiIiIjI2zte0YwJiIAxoIiIiImPjfE07JiAGwoAmIiIiMjbO17RjAmIgNpsNJpMJVqvVozoWDx48ePDg
wYMHD2McStVSm82m99QxbDEBMRAloHnw4MGDBw8ePHgY+ygvL9d76hi2mIAYiMvlgtVqhc1m0z27d8/
weUeG14jXiNdI74PXiNeI14jXyChHTU0NTKbR/d/
If0xAyKfOTq5xHA+v0fh4jcbHazQ+XqPx8RqNj9dofLxG4+M10o4JCPnEN9j4eI3Gx2s0Pl6j8fEajY/
XaHy8RuPjNRofr5F2TEDIJ77BxsdrND5eo/HxGo2P12h8vEbj4zUaH6/
R+HiNtGMCQj7Z7XYkJSXBbrfrPRTD4jUaH6/R+HiNxsdrND5eo/
HxGo2P12h8vEbaMQEhIiIiIqKQYQJCREREREQhwwSEiIiIiIhChgkIERERERGFDBMQIiIiIiIKGSYg5NP69
esxZ84cxMXFITExETk5OXoPKWQyMjJw77334sorr4TJZMKuXbs8vi5JElatWoUrrrgC06ZNw6JFi2CxWDzO
aWtrw6OPPoqLL74Y8fHxePzxx9Hd3R3KHyNo/vrXv+K2227D9OnTMXv2bNx///04d+6cxzn9/
f14+umncemll+Kiiy7CAw88gMbGRo9zqqurcc899+CCCy7A7Nmz8cc//hGDg4Oh/FGCZsOGDfjXf/
1XXHzxxbj44otxxx13YN++ferXo/36ePP666/
DZDLhueeeUx+L9uuUlJQEk8nkccybN0/9erRfH0VtbS1+/vOf49JLL8W0adNw66234uTJk+rXo/
139pw5c0bFkclkwtNPPw2AcQQATqcTL7/8Mq677jpMmzYNN9xwA1599VVIkqSeE+1xFEhMQMirrVu3IjY2F
h9//
DGKi4uxdOlSzJw5E01NTXoPLST27duHlStXYufOnV4TkDfeeAPx8fHYvXs3CgoKcN999+H6669Hf3+/
es7dd9+Nb3/728jOzsbRo0dx00034ZFHHgn1jxIUixcvRnJyMs6cOYP8/
Hzcc889SEhIQE9Pj3rOsmXLcO211+LQoUPIzc3FHXfcgR/84Afq151OJ2699Vb86Ec/
Ql5eHvbt24dZs2bhxRdf1ONHCrivvvoKe/fuhcVigSiKeOmllzB16lScOXMGAK/
PSCdOnMB1112Hb33rWx4JSLRfp6SkJNxyyy1oaGhQj5aWFvXr0X59AKC9vR1z5szBL3/5S+Tk5KCiogIHDh
xAWVmZek60/85ubm72iKHU1FSYTCakp6cDYBwBwGuvvYZvfOMb+Oc//
4nKykrs2LED06dPx5o1a9Rzoj2OAokJCHmVmJiIZ555Rv2zy+XCVVddhddff13HUeljZAIiSRKuuOIK/
P3vf1cfs9lsiIuLw5YtWwAAZ8+ehclk8vgELiUlBVOmTEFdXV3oBh8izc3NMJlMyMjIACBfj6lTp2LHjh3q
OSUlJTCZTMjKygIgJ3nnnXeex6ds7777LmbMmAGHwxHaHyBELrnkEnz44Ye8PiN0d3dj7ty5SE1NxcKFC9U
EhNdJTkC+/e1ve/0ar49s+fLl+Pd//3efX+fv7NGee+453HjjjZAkiXE05Mc//jEef/xxj8ceeOAB/
PznPwfAOAo0JiA0isPhQExMzKhP/R977DHcd999Oo1KPyMTkPLycphMJuTl5Xmcd+edd+J3v/
sdAOCjjz7CzJkzPb4+ODiImJgY7Ny5M/
iDDrHS0lKYTCYUFRUBAA4dOgSTyYSOjg6P8xISEiAIAgBg1apVoyZWFRUVMJlMOH36dGgGHiJOpxNbtmxBb
GwsiouLeX1GeOyxx/D8888DgEcCwuskJyAXXnghrrzySlx//fV49NFHUV1dDYDXR/HNb34Tzz//
PB588EHMnj0b3/nOd/D++++rX+fvbE8OhwPf+MY38NprrwFgHClee+01zJkzB6IoAgDy8/
Nx2WWX4bPPPgPAOAo0JiA0Sl1dHUwmE44fP+7x+AsvvIDExESdRqWfkQlIZmYmTCYT6uvrPc776U9/
ioceegiA/Ivs5ptvHvVcs2fPxoYNG4I74BBzuVz48Y9/jAULFqiPff7554iNjR117u23344//
elPAIClS5firrvu8vh6b28vTCaTx16JcFZYWIiLLroIMTExiI+Px969ewHw+rjbsmULbr31VnUJg3sCwusk
f/K8fft2FBQUYP/+/Zg/fz4SEhLQ1dXF6zMkLi4OcXFxePHFF3H69Gls3LgR06ZNw6ZNmwDwd/
ZI27ZtQ0xMjPqJPONI5nK5sHz5ckyZMgXnn38+pkyZgr/+9a/
q1xlHgcUEhEZhAuKJCcjYli1bhjlz5sBqtaqP8R80mcPhQGlpKXJzc7FixQrMmjULxcXFvD5DampqcNlll6
GgoEB9jAnI2Do6OjBjxgx8+OGHvD5Dpk6divnz53s89tvf/hZ33HEHAP7OHumuu+7Cvffeq/
6ZcSTbsmULrrnmGmzZsgWFhYXYvHkzLr30UiayQcIEhEbhEixPXILl2zPPPINrrrkGFRUVHo/
zlr53ixYtwpNPPsnrM2TXrl0wmUyIiYlRD5PJhClTpiAmJgYHDx
7kdfLitttuw4oVKxhHQxISEvDEE094PLZhwwZcddVVAPg7211VVRXOO+887N69W32McSS75pprsH79eo/
H/vznP6tV5xhHgcUEhLxKTEzEs88+q/7Z5XLh6quv5iZ0DG9Ee/
PNN9XHOjs7vW5Ey83NVc85cOBAxGxEkyQJzzzzDK666qpRJQiB4c2xX375pfrYuXPnvG5qdK+stnHjRsyYM
QN2uz34P4QOfvjDH2LJkiW8PkO6urpQVFTkcdx22234r//
6LxQVFfE6edHd3Y1LLrkEa9as4fUZ8sgjj4zahP7888+rd0X4O3tYUlISrrjiCo/
yuYwj2aWXXjrqLsVf//pXzJ07FwDjKNCYgJBXW7duRVxcHDZt2oSzZ8/
iySefxMyZM0fVBY9U3d3dyMvLQ15eHkwmEwRBQF5enrr584033sDMmTOxZ88eFBYW4v777/
daiu+73/0ucnJycOzYMcydOzdiSvE99dRTiI+Px+HDhz1KO/b19annLFu2DAkJCUhLS0Nubi7mz5/
vsUxCKet41113IT8/H/v378fs2bMjpqzjihUrkJGRgcrKShQWFmLFihWYMmUKzGYzAF4fX9yXYAG8Tn/
4wx9w+PBhVFZWIjMzEz/
60Y8wa9YsNDc3A+D1AeQSzueffz5ee+01lJaW4vPPP8eFF16obh4G+DsbkD9ITEhIwPLly0d9jXEELFmyBF
dffbVahnfnzp2YNWuWugwNYBwFEhMQ8mndunVISEhAbGwsEhMTkZ2drfeQQiY9Pd1r06YlS5YAGG5GdPnll
yMuLg6LFi1SK2co2tra8Mgjj2D69OmYMWMGfvWrX0VMMyJv18ZkMiE5OVk9R2lsdckll+DCCy/
ET37yEzQ0NHg8T1VVFf7jP/4DF1xwAWbNmoU//
OEPEdPY6vHHH8ecOXMQGxuL2bNnY9GiRWryAfD6+DIyAYn26/Szn/0MV155JWJjY3H11VfjZz/7mUd/
i2i/Poqvv/4at956K+Li4vAv//
IvHlWwAP7OBuRP4k0m06ifG2AcAfId2eeeew4JCQlqI8KVK1d6lBlmHAUOExAiIiIiIgoZJiBERERERBQyT
ECIiIiIiChkmIAQEREREVHIMAEhIiIiIqKQYQJCREREREQhwwSEiIiIiIhChgkIERERERGFDBMQIiIiIiIK
GSYgREREREQUMkxAiIiIiIgoZJiAEBERERFRyDABISIiIiKikGECQkREREREIcMEhIiIiIiIQoYJCBERERE
RhQwTECIiIiIiChkmIEREREREFDJMQIiIiIiIKGSYgBARERERUcgwASEiIiIiopBhAkJERERERCHDBISIiI
iIiELm/wM74uF+OnlpSAAAAABJRU5ErkJggg==\" width=\"800\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"correl_noisy = si.correlate(sig_noisy, waveform, mode=\"valid\") / norm_w\n",
"# valid : on ne prend que les valeurs de la corrélation pour lesquelles le
support de l'onde\n",
"# est inclus dans le signal\n",
"\n",
"plot_correl(correl_noisy, data, T)\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Cas d'un canal non idéal : le trajet direct entre les antennes est perturbé
par des réflexions sur différents objets. La réponse du canal est modélisée par une
somme d'impulsions de Dirac : la première modélise le trajet direct, les suivantes
des réflexions. (On suppose que le temps de trajet est connu, et on fait commencer
la RI au trajet direct)."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"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 = $('<div/>');\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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all '
+\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\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 = $('<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 = $('<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 = $('<canvas/>');\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 = $('<div/>');\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 = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all
' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\
n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt ===
mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then
trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\
n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id:
this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format =
format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\
n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL ||
window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21)
== \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message
type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \",
msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type +
\"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-
in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from
http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the
document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-
home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-
arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-
right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan
axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"],
[\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"],
[\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-
save\", \"download\"]];\n",
"\n",
"mpl.extensions =
[\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm)
{\n",
" // Create a \"websocket\"-like object which calls the given IPython
comm\n",
" // object with the appropriate methods. Currently this is a non binary\
n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage
function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a
real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id +
\"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in
FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' +
width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\"
width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\"
title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></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 = $('<span class=\"mpl-message\" style=\"text-
align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline
pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\"
title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove
icon-large\"></i></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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 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"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img
src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAGQCAYAAABWJQQ0AAAgAElEQVR
4nO3deXxU9bnH8RMik4ACAUEkkYRFXAoKVBw3NHW50IIF67V61UK8VpAKLWjFoIhxA0QE0bAUtUhFSlwuuA
QEUZEqCIqGRVBZxYiyqBBQSCDJ9/4R5mSGTCAanPMc83m/
XvMHw4T55fDUPh8ykzgCAAAAgBhxvD4AAAAAgJqDAAEAAAAQMwQIAAAAgJghQAAAAADEDAECAAAAIGYIEAA
AAAAxQ4AAAAAAiBkCBAAAAEDMECAAAAAAYoYAAQAAABAzBAgAAACAmCFAAAAAAMQMAQIAAAAgZggQAAAAAD
FDgAAAAACIGQIEAAAAQMwQIAAAAABihgABAAAAEDMECAAAAICYIUAAAAAAxAwBAgAAACBmCBAAAAAAMUOAA
AAAAIgZAgQAAABAzBAgADy3efNmZWVlaeXKlV4fBQAA/MwIEACe2r9/v8455xz94Q9/
UElJidfHiZlNmzbJcRw9/fTTXh/lsBYsWCDHcbRgwYIf9XFpaWnKyMj4Wc70czr03D/
18/+xYvU8ljiOo6ysLK+PAcADBAiAanv66aflOI57i4+PV3JysjIyMvTll18e9mMHDRqk888/
X3v37o3RaW0gQGwiQGKHAAFqLgIEQLWFAuT+++/XtGnT9OSTT+rPf/6z4uPj1bp1a+3bty/
qx+3cuVP33Xefvvnmmxif2HulpaXat2+fiouLvT7KYf3UxbiwsFD79+//
eQ71MyJAYocAAWouAgRAtYUC5IMPPoi4PzMzU47j6LnnnvPoZKiumrYYEyCxQ4AANRcBAqDaKguQ3NxcOY6
jESNGVPiYOXPmqHPnzqpbt66OO+44devWTR9//
HHEYzIyMnTsscdqw4YN6tKli+rWratmzZrpvvvuU2lpacRjv//
+e91222066aSTFAgEdMopp2j06NEVHuc4jvr3769Zs2apbdu2CgQC+tWvfqXXXnst4nG7d+/
WwIEDlZaWpkAgoCZNmuiyyy7Thx9+GPG4JUuWqGvXrqpfv77q1Kmjiy66SO++++4Rr1m0l2CFPt/
Nmzere/
fuOvbYY5WcnKzx48dLklauXKmLL75YdevWVWpqqqZPnx7xZ4b+HhYuXKi+ffuqUaNGqlevnnr16qXvvvuuw
nWItvxVZQFfu3atrrzySjVt2lQJCQlKSUnRNddco127dlX650jShg0bdNVVV6lhw4aqU6eOzjnnHOXm5kY8
JvR8zz33nB588EGlpKQoISFBl1xyidatWxfx2PT0dLVt21arV6/
Wb37zG9WpU0fJyckaNWpUhc+rsLBQ99xzj1q3bq1AIKCTTjpJgwcPVmFh4Y/+/KWf/
vcuSfn5+erZs6fq1q2rJk2aaNCgQZo7d26F56nsZWzp6elKT0+v0nNNmzZNZ599turUqaOkpCRdeOGFmjdv
nvv7L730krp166ZmzZopEAioVatWuv/+
+yt8Za6q17qoqEjDhg3Tr3/9a9WvX19169ZV586d9dZbb1U4GwEC1FwECIBqqyxAxo8fL8dxNGnSpIj7n3n
mGcXFxem3v/2tsrOzNWrUKLVo0UJJSUnatGmT+7iMjAwlJiaqTZs26tWrl8aPH6/
LL79cjuNo2LBh7uNKS0t1ySWXKC4uTjfddJPGjx+v3//+93IcR4MGDYp4bsdx1L59ezVr1kwPPPCAxo0bp1
atWqlu3boRLwW77rrrFAgEdNttt+mpp57SqFGj9Pvf/
17PPvus+5g333xTgUBA5513nsaMGaNHH31UZ555pgKBgJYuXXrYa1ZZgCQmJupXv/
qV+vXrpwkTJuj88893H5ecnKzBgwcrOztbbdu2VXx8vDZu3Fjh7+GMM87QhRdeqMcff1z9+/
dXrVq1dNFFF0XE2E8NkKKiIrVs2VLJycl68MEH9dRTT+m++
+7T2Wefrc8//7zSP2fr1q1q2rSp6tWrp6FDh2rs2LFq3769atWqpZkzZ1Z4vo4dO+qss87So48+qnvvvVd1
69ZVMBiMOGt6erqSk5PVvHlzDRw4UBMnTtQll1wix3E0Z84c93ElJSVuwA4aNEiTJ0/
WgAEDdMwxx6hnz54/6vOXqvf3vnfvXp1yyilKTEzUHXfcoXHjxumss87SmWeeedQD5N5775XjODr//
PM1evRoPfbYY7ruuuuUmZnpPuaKK67Q1VdfrdGjR2vSpEn64x//
KMdxdPvtt1d4zqpc6x07dqhZs2a67bbbNGnSJD388MM69dRTVbt2beXl5UX8mQQIUHMRIACqLbT4vvHGG9q
xY4fy8/
P14osvqkmTJkpISFB+fr772D179igpKUl9+vSJ+DO2bt2qBg0aRNyfkZEhx3H017/+1b2vtLRU3bt3VyAQ0
I4dOySV/Suu4zh68MEHI/7Mq666SnFxcVq/fr17n+M4CgQCEfetWLFCjuMoOzvbva9Bgwbq379/
pZ9zaWmp2rRpo65du0Ys9nv37lXLli31X//1X4e9ZpUFyKFfMdq5c6fq1KmjuLg45eTkuPd/
+umnFRa40N/DWWedFfH+i4cffliO4+jll1+OuA4/JUDy8vLkOI5eeOGFw35+h/
45gwYNkuM4euedd9z79uzZo5YtW6pFixbud0ALPd/
pp5+uoqIi97GPPfaYHMfRqlWr3PvS09PlOI6eeeYZ976ioiKdeOKJ+u///m/3vmnTpqlWrVoRzy1J//
jHP+Q4jhYtWlTlz7+6f+/jxo2T4zh6/vnn3ft++OEHnXzyyUc1QNatW6datWpF/
e5yh577UDfffLPq1q0b8dWhql7r4uLiiL83qWyGmzZtqhtvvDHifgIEqLkIEADVduh3wQrdWrRoEfFyD0ma
OXOmHMfRW2+9pR07dkTcunTpopNPPtl9bGgh/+yzzyL+jNdee02O42jGjBmSpL59+yo+Pl67d+
+OeNx7771XISwcx1G3bt0qfA7169fXrbfe6v46LS1NnTp10pYtW6J+zh999JEcx9G//vWvCp/
HTTfdpISEhMN+W+HDBcj27dsjHtuhQwcdd9xxFV5OlpSUpF69erm/Dv09TJ48OeJxe/
bs0THHHKObb7454jr8lADZuHGjHMfRTTfdpB9++KHSz+/
QP+eUU06p8BUMSRo5cmREWISe7+GHH454XOh6h0dUenp61OvSo0cPdezYMeLXbdu2rfD3tHbt2grheqTPv7
p/7126dFGzZs0qnDkUiUcrQEaPHi3HcSp81eFwdu/
erR07dujZZ5+V4zhavnx5xHNW5VqHKykp0bfffqsdO3aoe/fu6tChQ8TvEyBAzUWAAKi20OI7YcIEzZ8/
Xy+++KK6deum4447Tm+//XbEY0eNGhU1VkK3+vXru4/NyMhQrVq1dODAgYg/
Y8OGDXIcRyNHjpQkde3aVc2bN69wrl27dlV4OYnjOOrXr1+Fx6alpemGG25wf/
3cc88pMTFRtWrV0tlnn62srCxt2LAh4vcP93k4jlPhfRfhDvcSrEOlp6frtNNOi3rmyy+/
3P116O8h2uvtmzdvrq5du0Zch5/6HpDbbrtNjuOoTp066tKli8aPHx/x/
o9of05CQkJELIWEvnoVei9I6PnCv9ojlV+vqVOnuvdVdl0yMjLUokUL99enn376Yf+e/va3v1X586/u3/
upp56qCy+8sML9L7/88lENkH79+qlWrVoVvhpxqI8//
lhXXHGF6tevX+HzWLhwYcRzVuVaS9LUqVN1xhlnqHbt2hF/
XsuWLSMeR4AANRcBAqDaor0HpLi4WOeee66Sk5O1Z88e9/7Qv3hPmzZN8+fPr3ALX8B+rgCJ9tKqaMveV19
9pQkTJrhvGE5MTHRf7z5jxgw5jqPRo0dH/Tzmz59/2G9De7g3oR8q9AbgaGfu3r27+
+ujESAnnXRSld6EvXLlSj3wwAO68MILVatWLaWkpES81K66AXLoS7yiXa/
KrktGRobS0tLcX5966qk644wzKv17+vTTTys996Gff3X/3n9MgLRo0SJqgHTu3PmoBMjOnTt1/
PHHq2XLlho3bpxeffVVzZ8/3/1HgvCzVPVaT5s2TY7j6IorrtAzzzyjuXPnav78+brkkksiHicRIEBNRoAA
qLbK3oQeWt5CoSBJzz//vBzHqfDSrGiq+xKsJUuWRH0JVlUDJNy2bduUkpKiCy64QJL0/
vvvR325U1X9nAFSlZdgNWzYUAMHDox4XFFRkeLj43/0t6FdtGiRHMfR0KFDI85WlZdgPfTQQ1FfgnU0A6Rb
t25KSUmp8PKhaI4UINX9e+/
SpYuSk5Or9BKsjh07VniTvFQWk0fjJVizZs2q8JUOSXriiSd+coD07NlTrVq1qvD5nX/+
+QQIABcBAqDaKgsQSQoGg2ratKn7wwgLCgpUv359paenR/2X4vD3PxzuTei1a9d2Hxv6V/RDv93vNddcE/
VN6EcKkOLi4govKZKks88+W506dZJU9vr21q1bq02bNhFf4Yn2eUTzcwZIZW9Cf+mll9z7OnXqVOG1+9nZ2
XIc57ALeEFBQYWvSO3evVu1atWK+EpTZW9CX7x4sXvf999/r1atWkV9E/rRDJCpU6dWGg179+7V999/
X+m5D/38q/v3/mPehH7VVVepadOmEV/FePXVV+U4zlF5E/orr7wix3EiXiZZVFSkDh06/
OQAufLKK9WqVauI51yyZIni4uIIEAAuAgRAtR0uQF544QU5TuS34p0+fbpq1aqldu3a6cEHH9TkyZM1dOhQ
dejQISIOwr8Nb+/evTVhwgT32/
Dedddd7uNKSkp08cUXKy4uTn379nVfNuU40b8N75ECZOfOnTr22GOVkZGhsWPH6oknntDVV18tx3E0ZswY9
2MWLFigxMREpaamKisrS0888YSysrJ00UUXRbw3I5qfM0BC34Y3OztbAwYMUK1atdS5c+eIf5UOfQeoK6+8
UpMmTVK/fv3UsmVLNW7c+LAL+KxZs5SSkqJBgwZp4sSJevzxx3X22Werdu3aeu+996JeT6n82/
A2aNBAw4YN06OPPqoOHTooLi4u6rfhPZoBUlJSom7duikuLk7/8z//
o+zsbI0bN079+vVTo0aNIua2Ku+Bqc7feyg2EhMTlZmZedhvwxv62SAXX3yxJk2apNtvv10nnniiWrduXaV
vwzts2DA5Ttm34X3kkUeUnZ2t3r17a8iQIZKkb775Rg0bNlRaWprGjBmjsWPHqmPHjmrfvv1PDpApU6bIcR
z16NFDkydP1pAhQ5SUlKS2bdsSIABcBAiAajtcgIT+xbh169YRP9xswYIF6tq1qxo0aKDExES1bt1aN9xwg
5YtW+Y+JrSQh/
8gwqZNmyorK6vCv+ru2bNHt956q5KTk1W7dm21adPmsD+I8FDhi2dRUZEGDx6s9u3bq169ejr22GPVvn17T
Zw4scLH5eXl6corr9Txxx+vhIQEpaWl6eqrr9abb7552Gv2cwZI6AcRNmzYUMcdd5yuv/
56ffvttxEfW1JSoszMTDVu3Fh169ZV165dtX79+ip9F6wbb7xRrVu3VmJioho1aqSLL75Yb7zxRqXXMyT0g
wiTkpKUmJioYDBY6Q8iPJoBIkn79+/
XqFGj1LZtWyUkJKhhw4Y666yzdN9996mgoKDSc1f2ErSf+vcuSZs3b1aPHj1Ut25dNW7cWAMHDoz6gwglac
yYMe4PY7zgggu0bNmyH/WDCKdMmaKOHTu6n3N6errmz5/v/
v6iRYt07rnnuj9Y8I477tC8efN+coCUlpZqxIgRSktLU0JCgjp27Kjc3NyofycECFBzESAAzKpsIUd0hwtB
AACsIEAAmEWA/
DgECADADwgQAGYRID8OAQIA8AMCBIBZBMiPQ4AAAPyAAAEAAAAQMwQIAAAAgJghQAAAAADEDAFiSElJifLz
87Vr1y4VFBRw48aNGzdu3LhxM3bbtWuX8vPzK/w8KlQdAWJIfn6+HMfhxo0bN27cuHHjZvyWn5/
v9eroWwSIIbt27XIH2uu658aNGzdu3Lhx41bxFvoH4127dnm9OvoWAWJIQUGBHMdRQUGB10cBAABAFOxr1U
eAGMJAAwAA2Ma+Vn0EiCEMNAAAgG3sa9VHgBjCQAMAANjGvlZ9BIghDDQAAIBt7GvVR4AYwkADAADYxr5Wf
QSIIQw0AACAbexr1UeAVGLhwoW6/PLL1axZMzmOo1mzZh3xYxYsWKCOHTsqEAiodevWevrpp3/
UczLQAAAAtrGvVR8BUok5c+Zo6NChmjlzZpUCZOPGjapbt65uu+02rVmzRtnZ2YqPj9fcuXOr/
JwMNAAAgG3sa9VHgFRBVQLkjjvuUNu2bSPuu+aaa9S1a9cqPw8DDQAAYBv7WvURIFVQlQC58MILNXDgwIj7
pkyZovr161f5eawNdOGBYv1QdEBFB0q8PgoAAIAJ1vY1PyJAqqAqAdKmTRuNGDEi4r7Zs2fLcRzt3bs36sc
UFhaqoKDAveXn55sa6HteWqW0zFyNmfep10cBAAAwgQCpPgKkCn6uAMnKypLjOBVuVgY6FCCPECAAAACSCJ
CjgQCpgp/rJVjWvwKS9fLHSsvM1ei5BAgAAIBEgBwNBEgVVPVN6O3atYu479prr/X1m9AJEAAAgEjW9jU/
IkAqsWfPHuXl5SkvL0+O42js2LHKy8vT5s2bJUlDhgxRr1693MeHvg3v4MGD9cknn2jChAm+/
za8oQB5eO4nXh8FAADABGv7mh8RIJVYsGBB1PdnZGRkSJIyMjKUnp5e4WM6dOigQCCgVq1a+f4HEd77SlmA
jHqNAAEAAJDs7Wt+RIAYYm2g73tlNQECAAAQxtq+5kcEiCHWBjoUIA8RIAAAAJLs7Wt+RIAYYm2g73+1LEB
GziFAAAAAJHv7mh8RIIZYG+gHCBAAAIAI1vY1PyJADLE20KEAGTFnjddHAQAAMMHavuZHBIgh1gb6wdyDAT
KbAAEAAJDs7Wt+RIAYYm2gh89eQ4AAAACEsbav+REBYoi1gQ4FyHACBAAAQJK9fc2PCBBDrA30iIMB8mDua
q+PAgAAYIK1fc2PCBBDrA30iDkECAAAQDhr+5ofESCGWBvoUIA88CoBAgAAINnb1/
yIADHE2kCPnPOJ0jJzdT8BAgAAIMnevuZHBIgh1gb6odcIEAAAgHDW9jU/
IkAMsTbQoQC57xUCBAAAQLK3r/
kRAWKItYEedTBA7n3lY6+PAgAAYIK1fc2PCBBDrA30w3MJEAAAgHDW9jU/
IkAMsTbQoQDJepkAAQAAkOzta35EgBhibaBHz/2UAAEAAAhjbV/zIwLEEGsD/
cg8AgQAACCctX3NjwgQQ6wNdChA7nlplddHAQAAMMHavuZHBIgh1gZ6zMEAGUaAAAAASLK3r/
kRAWKItYEe8/pnBAgAAEAYa/
uaHxEghlgb6FCA3D2LAAEAAJDs7Wt+RIAYYm2gxx4MkKGzVnp9FAAAABOs7Wt+RIAYYm2gH51PgAAAAISzt
q/
5EQFiiLWBDgXIXTMJEAAAAMnevuZHBIgh1gZ63Py1SsvM1Z0ECAAAgCR7+5ofESCGWBvox94gQAAAAMJZ29
f8iAAxxNpAhwJkyP8RIAAAAJK9fc2PCBBDrA30426ArPD6KAAAACZY29f8iAAxxNpAZ79JgAAAAISztq/
5EQFiiLWBDgVI5osECAAAgGRvX/MjAsQQawM9/
q11SsvM1R0vECAAAACSvX3NjwgQQ6wNNAECAAAQydq+5kcEiCHWBjoUIINfWO71UQAAAEywtq/
5EQFiiLWBnrCgLEBuf54AAQAAkOzta35EgBhibaAnLlhPgAAAAISxtq/
5EQFiiLWBDgXI3wkQAAAASfb2NT8iQAyxNtCT3i4LkNueI0AAAAAke/
uaHxEghlgb6H8QIAAAABGs7Wt+RIAYYm2gQwFy63N5Xh8FAADABGv7mh8RIIZYG+jJCw8GSA4BAgAAINnb1
/yIADHE2kA/sXADAQIAABDG2r7mRwSIIdYGOhQggwgQAAAASfb2NT8iQAyxNtBP/
qcsQAbO+MjrowAAAJhgbV/zIwLEEGsDTYAAAABEsrav+REBYoi1gQ4FyN8IEAAAAEn29jU/IkAOY/
z48UpLS1NCQoKCwaCWLl162Mc/+uijOuWUU5SYmKiTTjpJgwYN0r59+6r8fNYG+ql3NiotM1d//
TcBAgAAINnb1/yIAKlETk6OAoGApkyZotWrV6tPnz5KSkrStm3boj5+
+vTpSkhI0PTp07Vp0ybNmzdPzZo106233lrl57Q20P8kQAAAACJY29f8iACpRDAYVP/+/
d1fl5SUKDk5WSNHjoz6+P79+
+uSSy6JuO+2227TBRdcUOXntDbQoQAZQIAAAABIsrev+REBEkVRUZHi4+M1a9asiPt79+6tHj16RP2Y6dOn
q0GDBu7LtDZs2KDTTjtNw4cPr/R5CgsLVVBQ4N7y8/NNDfSUd8sCpP/
0D70+CgAAgAkESPURIFFs2bJFjuNo8eLFEfcPHjxYwWCw0o977LHHVLt2bR1zzDFyHEf9+vU77PNkZWXJcZ
wKNysD/TQBAgAAEIEAqT4CJIqfEiALFixQ06ZN9eSTT2rlypWaOXOmmjdvrvvvv7/
S57H+FZBQgNxCgAAAAEgiQI4GAiSKn/ISrM6dO+v222+PuG/
atGmqU6eOSkpKqvS81gZ66qJNZQHyLAECAAAg2dvX/IgAqUQwGNSAAQPcX5eUlCglJaXSN6H/+te/
1h133BFx37///W/VqVNHxcXFVXpOawP9r8UECAAAQDhr+5ofESCVyMnJUUJCgqZOnao1a9aob9+
+SkpK0tatWyVJvXr10pAhQ9zHZ2VlqV69epoxY4Y2btyo119/
Xa1bt9bVV19d5ee0NtChAPnLs8u8PgoAAIAJ1vY1PyJADiM7O1upqakKBAIKBoNasmSJ+3vp6enKyMhwf33
gwAHde++9at26tRITE9W8eXPdcsst2rlzZ5Wfz9pAP3MwQPpNI0AAAAAke/
uaHxEghlgb6Gfe+5wAAQAACGNtX/
MjAsQQawMdCpCbnyFAAAAAJHv7mh8RIIZYG+hpBwOk7zMfeH0UAAAAE6zta35EgBhibaCfXUKAAAAAhLO2r
/kRAWKItYEOBUiffxEgAAAAkr19zY8IEEOsDfT0JZuVlpmrmwgQAAAASfb2NT8iQAyxNtD/
XkqAAAAAhLO2r/kRAWKItYEOBcifpxIgAAAAkr19zY8IEEOsDfQMN0De9/ooAAAAJljb1/
yIADHE2kDnvE+AAAAAhLO2r/kRAWKItYEOBciNTxMgAAAAkr19zY8IEEOsDfRz73+htMxc/
S8BAgAAIMnevuZHBIgh1gb6uQ8IEAAAgHDW9jU/
IkAMsTbQoQC5YcpSr48CAABggrV9zY8IEEOsDfTzBwMkgwABAACQZG9f8yMCxBBrA/
3CsnwCBAAAIIy1fc2PCBBDrA10KEB6/5MAAQAAkOzta35EgBhibaBfPBggvQgQAAAASfb2NT8iQAyxNtD/
9yEBAgAAEM7avuZHBIgh1gY6FCB/
emqJ10cBAAAwwdq+5kcEiCHWBnrmRwQIAABAOGv7mh8RIIZYG+hZH31JgAAAAISxtq/
5EQFiiLWBDgXI9U8SIAAAAJK9fc2PCBBDrA30S3llAXLdk+95fRQAAAATrO1rfkSAGGJtoAkQAACASNb2NT
8iQAyxNtChALn2CQIEAABAsrev+REBYoi1gX55+RalZebqfyYTIAAAAJK9fc2PCBBDrA30KwQIAABABGv7m
h8RIIZYG+hQgFwzebHXRwEAADDB2r7mRwSIIdYG+tUVZQFy9T8IEAAAAMnevuZHBIgh1gY6d8VXBAgAAEAY
a/uaHxEghlgb6FCA/JEAAQAAkGRvX/MjAsQQawM9e+XBAJlEgAAAAEj29jU/
IkAMsTbQcwgQAACACNb2NT8iQAyxNtChALlq0i
KvjwIAAGCCtX3NjwgQQ6wN9GurygLkvycSIAAAAJK9fc2PCBBDrA30a6u+JkAAAADCWNvX/
IgAMcTaQIcC5EoCBAAAQJK9fc2PCBBDrA303I/LAuQPE971+igAAAAmWNvX/
IgAMcTaQM8jQAAAACJY29f8iAAxxNpAhwLkCgIEAABAkr19zY8IEEOsDfTrq7cqLTNXPccTIAAAAJK9fc2P
CBBDrA30fAIEAAAggrV9zY8IEEOsDXQoQHoQIAAAAJLs7Wt+RIAYYm2g31hzMECy3/
H6KAAAACZY29f8iAA5jPHjxystLU0JCQkKBoNaunTpYR+/
c+dO3XLLLTrxxBMVCATUpk0bzZ49u8rPZ22g3/yEAAEAAAhnbV/
zIwKkEjk5OQoEApoyZYpWr16tPn36KCkpSdu2bYv6+KKiInXq1EndunXTu+++q02bNuntt9/W8uXLq/
yc1gY6FCC/J0AAAAAk2dvX/IgAqUQwGFT//v3dX5eUlCg5OVkjR46M+vhJkyapVatW2r9//09+TmsD/
dYn25SWmavLHydAAAAAJHv7mh8RIFEUFRUpPj5es2bNiri/d+/
e6tGjR9SP+d3vfqfrr79effr00QknnKC2bdtq+PDhKi4urvLzWhvotz4lQAAAAMJZ29f8iACJYsuWLXIcR4
sXL464f/DgwQoGg1E/5tRTT1VCQoJuvPFGLVu2TDk5OWrUqJHuvffeSp+nsLBQBQUF7i0/P9/
UQIcCpPvj//
H6KAAAACYQINVHgETxUwKkTZs2at68ecRXPMaMGaMTTzyx0ufJysqS4zgVblYGesHBAOn2GAECAAAgESBHA
wESxU95CdZFF12kSy+9NOK+OXPmyHEcFRUVRf0Y618Befuz7QQIAABAGAKk+giQSgSDQQ0YMMD9dUlJiVJS
Uip9E/qdd96ptLQ0lZSUuPeNGzdOzZo1q/JzWhvoUID8bhwBAgAAINnb1/
yIAKlETk6OEhISNHXqVK1Zs0Z9+/ZVUlKStm7dKknq1ZcQebYAACAASURBVKuXhgwZ4j7+iy+
+UL169TRgwAB99tlnys3N1QknnKAHH3ywys9pbaAXHgyQ3xIgAAAAkuzta35EgBxGdna2UlNTFQgEFAwGtW
TJEvf30tPTlZGREfH4xYsX65xzzlFCQoJatWrl+++C9Z+1BAgAAEA4a/
uaHxEghlgb6FCAdH10oddHAQAAMMHavuZHBIgh1gb6nbU7CBAAAIAw1vY1PyJADLE20O+uI0AAAADCWdvX/
IgAMcTaQIcCpMtYAgQAAECyt6/5EQFiiLWBXnQwQP5r7NteHwUAAMAEa/
uaHxEghlgb6EXrCRAAAIBw1vY1PyJADLE20KEAuWwMAQIAACDZ29f8iAAxxNpAL17/
jdIyc3UpAQIAACDJ3r7mRwSIIdYG+r0NBAgAAEA4a/
uaHxEghlgb6FCAXPLIAq+PAgAAYIK1fc2PCBBDrA30koMBcjEBAgAAIMnevuZHBIgh1gZ66cZvCRAAAIAw1
vY1PyJADLE20G6AjF7g9VEAAABMsLav+REBYoi1gX5/U1mA/IYAAQAAkGRvX/
MjAsQQawP9AQECAAAQwdq+5kcEiCHWBjoUIOkPv+X1UQAAAEywtq/
5EQFiiLWBXvZ5WYBcRIAAAABIsrev+REBYoi1gV72+XcECAAAQBhr+5ofESCGWBvoDzeXBciFowgQAAAAyd
6+5kcEiCHWBjoUIJ1Hven1UQAAAEywtq/5EQFiiLWB/ogAAQAAiGBtX/
MjAsQQawOd98VOpWXm6oKHCBAvlJSUen0EAABwCGv7mh8RIIZYG+hQgJw/kgCJtew316rj/a/r82++9/
ooAAAgjLV9zY8IEEOsDfRyAsQzaZm5SsvMVb9py7w+CgAACGNtX/
MjAsQQawO9Ip8A8UooQP7yLAECAIAl1vY1PyJADLE20KEAOW/
EG14fpcYhQAAAsMnavuZHBIgh1gZ6Zf4uAsQjBAgAADZZ29f8iAAxxNpAr/qyLEDOJUBijgABAMAma/
uaHxEghlgb6FCAnDOcAIk1AgQAAJus7Wt+RIAYYm2gCRDvECAAANhkbV/zIwLEEGsD/fGWsgAJDp/
v9VFqHAIEAACbrO1rfkSAGGJtoEMBcvaDBEisESAAANhkbV/
zIwLEEGsDvXpLAQHiEQIEAACbrO1rfkSAGGJtoNd8VRYgnQiQmCNAAACwydq+5kcEiCHWBjoUIGc9QIDEGg
ECAIBN1vY1PyJADLE20J98TYB4hQABAMAma/uaHxEghlgb6E+/
3n0wQF73+ig1DgECAIBN1vY1PyJADLE20KEA+fX9BEisESAAANhkbV/zIwLEEGsD/
dlWAsQrBAgAADZZ29f8iAAxxNpArz0YIB0JkJgjQAAAsMnavuZHBIgh1gY6FCAd7pvn9VFqHAIEAACbrO1r
fkSAGGJtoNdtI0C8QoAAAGCTtX3NjwgQQ6wN9Lpte5SWmav2BEjMESAAANhkbV/
zIwLEEGsDHQqQM+8lQGKNAAEAwCZr+5ofESCGWBvo9dsJEK8QIAAA2GRtX/
MjAsQQawO94WCAnJE11+uj1DgECAAANlnb1/yIADmM8ePHKy0tTQkJCQoGg1q6dGmVPm7GjBlyHEc9e/
b8Uc9nbaBDAdKOAIk5AgQAAJus7Wt+RIBUIicnR4FAQFOmTNHq1avVp08fJSUladu2bYf9uE2bNiklJUUXX
nih7wNk447vCRCPECAAANhkbV/zIwKkEsFgUP3793d/
XVJSouTkZI0cObLSjykuLtb555+vp556ShkZGb4PkE2hALmHAIk1AgQAAJus7Wt+RIBEUVRUpPj4eM2aNSv
i/
t69e6tHjx6Vftw999yjK664QpJ+UQHSlgCJOQIEAACbrO1rfkSARLFlyxY5jqPFixdH3D948GAFg8GoH/
POO+8oJSVFO3bskFS1ACksLFRBQYF7y8/
PNzXQn39DgHiFAAEAwCYCpPoIkCh+bIDs3r1bLVq00Jw5c9z7qhIgWVlZchynws3KQG/
+5gelZebqV8Ne8/
ooNQ4BAgCATQRI9REgUfzYl2Dl5eXJcRzFx8e7t7i4OMXFxSk+Pl7r16+P+jzWvwISCpDTCZCYI0AAALCJA
Kk+AqQSwWBQAwYMcH9dUlKilJSUqG9C37dvn1atWhVx69mzpy655BKtWrVKRUVFVXpOawP9xbcEiFcIEAAA
bLK2r/kRAVKJnJwcJSQkaOrUqVqzZo369u2rpKQkbd26VZLUq1cvDRkypNKP/
yW8CT0UIKfdTYDEGgECAIBN1vY1PyJADiM7O1upqakKBAIKBoNasmSJ+3vp6enKyMio9GN/
SQFy6t1zjvxgHFUECAAANlnb1/
yIADHE2kDnf0eAeIUAAQDAJmv7mh8RIIZYG+gvd+5VWmauThlKgMQaAQIAgE3W9jU/
IkAMsTbQoQBpQ4DEHAECAIBN1vY1PyJADLE20FsIEM8QIAAA2GRtX/
MjAsQQawP91a6DAXIXARJrBAgAADZZ29f8iAAxxNpAhwLk5Ltme32UGocAAQDAJmv7mh8RIIZYG+ivd+0jQ
DxCgAAAYJO1fc2PCBBDrA301oKyAGl9JwESawQIAAA2WdvX/IgAMcTaQIcCpBUBEnMECAAANlnb1/
yIADHE2kBvI0A8Q4AAAGCTtX3NjwgQQ6wN9LbdZQHSckiu10epcQgQAABssrav+REBYoi1gQ4FSAsCJOYIE
AAAbLK2r/
kRAWKItYHevruQAPGIxQB5b8M32rZ7n9fHAADAU9b2NT8iQAyxNtA79hS6izBiy1qAvP3Zdr4lMwAAsrev+
REBYoi1gSZAvGMtQO57ZTWzAACA7O1rfkSAGGJtoL8hQDxRWlpKgAAAYJS1fc2PCBBDrA30t98XuUtnaWmp
18epMUpKCBAAAKyytq/5EQFiiLWBDg+QkhICJFaKCRAAAMyytq/5EQFiiLWB/
o4A8cT+4hICBAAAo6zta35EgBhibaB3/
lAeIMUESMwUHSBAAACwytq+5kcEiCHWBjo8QA4Ul3h9nBqj8EAxAQIAgFHW9jU/
IkAMsTbQu37YT4B4YN9+AgQAAKus7Wt+RIAYYm2gd+0tD5D9BEjM7C0iQAAAsMravuZHBIgh1gY6PECKDhA
gsfJD0QECBAAAo6zta35EgBhibaAL9hEgXthTSIAAAGCVtX3NjwgQQ6wN9O6wACk8UOz1cWqM8OtOgAAAYI
u1fc2PCBBDrA10+CK8bz8BEisFBAgAAGZZ29f8iAAxxNpAh78UiACJnfDvPkaAAABgi7V9zY8IEEOsDfT3B
Ignwn/+CgECAIAt1vY1PyJADLE20OEBsreIAImV774nQAAAsMravuZHBIgh1gY6/
NvBEiCx882eQgIEAACjrO1rfkSAGGJtoMN/
IN4PRQe8Pk6NsSMsQPpNI0AAALDE2r7mRwSIIdYGOjxAvi8kQGJl2+597nW/
+RkCBAAAS6zta35EgBhibaD37SdAvLCtoDxA+j7zgdfHkUSAAAAQYm1f8yMCxBBrAx0eIHsIkJjZGhYgN/
2LAAEAwBJr+5ofESCGWBvo8ADZvW+/
18epMb7atde97n+eSoAAAGCJtX3NjwgQQ6wNdOEBAsQLW3aGB8j7Xh9HEgECAECItX3NjwgQQ6wNdNGBEnf
pLCBAYubLsAD536cJEAAALLG2r/kRAWKItYEOD5BdewmQWPni2x/
c637DlKVeH0cSAQIAQIi1fc2PCBBDrA30/mICxAvhAZJhMEBKS0u9Pg4AAJ6xtq/
5EQFiiLWBPhAeID8QILGy+ZvyAOn1T3sBUlxCgAAAai5r+5ofESCGWBvo8ADZ+UOR18epMTbt+N697n96ao
nXx5EUGSD7i0u8Pg4AAJ6xtq/
5EQFiiLWBLi4pJUA8sNF4gBQeKPb6OAAAeMbavuZHBIgh1ga6JCxAvvueAImVDdv3uNf9uiff8/
o4kiIDZN9+AgQAUHNZ29f8iAAxxNpAhwfItwRIzKzbVh4g1z5hL0B+KDrg9XEAAPCMtX3NjwgQQ6wNdGkpA
eKFddt2u9f9fybbC5A9hQQIAKDmsrav+REBYojFgQ4tnd/
sKfT6KDXG2q3lAXL1PxZ7fRxJkQHCD6UEANRkFvc1vyFADmP8+PFKS0tTQkKCgsGgli6t/
FuiPvHEE+rcubOSkpKUlJSkSy+99LCPj8biQIeWzh0ESMx8+nV5gPzRYIDwLZkBADWZxX3NbwiQSuTk5CgQ
CGjKlClavXq1+vTpo6SkJG3bti3q46+77jpNmDBBeXl5+uSTT3TDDTeoQYMG+vLLL6v8nBYHmgCJvU+
+LigPkEn2AoRvSAAAqMks7mt+Q4BUIhgMqn///u6vS0pKlJycrJEjR1bp44uLi1WvXj3961//
qvJzWhzoFkPKls7tuwmQWFnzVXmA/PfERV4fR5J07ysf83I8AABkc1/zGwIkiqKiIsXHx2vWrFkR9/
fu3Vs9evSo0p+xe/duJSYm6tVXX630MYWFhSooKHBv+fn55gY6FCDbdu/z+ig1xsdbdrnL/
pVGAiTr5fIAIUYBADUZAVJ9BEgUW7ZskeM4Wrw48uUvgwcPVjAYrNKf8Ze//
EWtWrXSvn2VL+5ZWVlyHKfCzdJAtyRAYm7Vl+UB8ocJ73p9HEnSPS+tcs+0rYBZAADUXARI9REgUVQ3QEaO
HKmGDRtqxYoVh32cH74C0urO2SydMRYeID3H2wiQu2eVB8jXu5gFAEDNRYBUHwESRXVegjV69Gg1aNBAH3z
wwY9+XosDHQqQrQRIzKzI3+ku+z2MBMhdM1e6Z9qyc6/XxwEAwDMW9zW/
IUAqEQwGNWDAAPfXJSUlSklJOeyb0EeNGqX69evrvfd+2g+PszjQrQmQmFv+RViAZL/
j9XEkSUP+rzxA8r/
7wevjAADgGYv7mt8QIJXIyclRQkKCpk6dqjVr1qhv375KSkrS1q1bJUm9evXSkCFD3Mc/
9NBDCgQCevHFF/
X111+7tz179lT5OS0O9Ml3zeZlNzGWFxYglz9uI0AyX1zhnumLbwkQAEDNZXFf8xsC5DCys7OVmpqqQCCgY
DCoJUuWuL+Xnp6ujIwM99dpaWlR31CelZVV5eezONChAPlqFy+7iZUPN3/nLvvdH/
+P18eRJA1+Ybl7ps+/
+d7r4wAA4BmL+5rfECCGWBzoNnfNIUBibNnn5QHS7TEbAfL358sDZOMOAgQAUHNZ3Nf8hgAxxOJAtxk6hzc
ex9iyz791l/
3fjrMRILc+l+eeaf32qr+sEACAXxqL+5rfECCGWBzoUIB8SYDEzPubygOk66MLvT6OJGlQTnmArNu22+vjA
ADgGYv7mt8QIIZYHOhTCJCYW7rRXoD8bcZH7pk+20qAAABqLov7mt8QIIZYHOhT757Dt16NsSUbvnGX/
f8a+7bXx5EkDfh3eYB88rWd+QQAINYs7mt+Q4AYYnGgQwHCt16NncXrywPksjE2AuSW6R+6Z1q9xc58AgAQ
axb3Nb8hQAyxONCn3f0aARJji9bvcJf9S40EyF+eXeaeadWXu7w+DgAAnrG4r/
kNAWKIxYE+fRgBEmuL1pUHyMWPLPD6OJKkm58pD5CV+QQIAKDmsriv+Q0BYojFgQ4FyOZvCJBYeWdtWICMX
uD1cSRJff71gXum5V/s9Po4AAB4xuK+5jcEiCEWB/pXBEjM/WftdnfZ/
42RAPnz1PIA+Wjzd14fBwAAz1jc1/yGADHE4kC3vWeu0jJz9fk3/
PTrWFn4WXmAXPTwW14fR5J049Pvu2da9jkBAgCouSzua35DgBhicaBDAbJpBwESKws+3eYu+xeOshEgN0xZ
6p7pg03fen0cAAA8Y3Ff8xsCxBCLA92OAIm5t8ICpPOoN70+jiSp9z/LA2TpRgIEAFBzWdzX/
IYAMcTiQLfLKguQjQRIzLz1SXmAnD/SRoD86akl7pne2/
CN18cBAMAzFvc1vyFADLE40KEA2bB9j9dHqTHeWLPVXIBc/
2R5gCxav8Pr4wAA4BmL+5rfECCGWBzoMwiQmJu/
ujxAzhvxhtfHkSRd+8R77pneXUeAAABqLov7mt8QIIZYHOgz752ntMxcrSdAYub1sAA5Z7iNALlm8mL3TP9
Zu93r4wAA4BmL+5rfECCGWBzoUICs20aAxMrcj792l/3g8PleH0eS9Md/
lAfI258RIACAmsvivuY3BIghFge6/
X0ESKy9tqo8QM5+0EaAXDVpkXumtz7d5vVxAADwjMV9zW8IEEMsDnQHN0B2e32UGuO1VV+5y/
5ZD9gIkCsnlgfIm59s9fo4AAB4xuK+5jcEiCEWBzoUIGu3EiCxMntleIC87vVxJElXTHjXPdP81QQIAKDms
riv+Q0BYojFge54/+sESIzlrigPkF/fbyNAeowvD5B5H3/
t9XEAAPCMxX3NbwgQQywO9K8PBshnBEjMvLpii7vsd7hvntfHkST9Pvsd90yvrSJAAAA1l8V9zW8IEEMsDn
QoQD79mgCJlZeXlwdIeyMB0v3x/
7hnmrPyK6+PAwCAZyzua35DgBhicaDPeqAsQD752s6ZfuleyvvSXfbPvNdGgPxuXHmA5K4gQAAANZfFfc1v
CBBDLA70WQ/MJ0BiLDxA2mXN9fo4kqSujy50z/TK8i1eHwcAAM9Y3Nf8hgAxxOJAhwJkzVd2zvRLN/Oj/
PIAucdGgHQZWx4gL+V96fVxAADwjMV9zW8IEEMsDnSnB8sCZPUWO2f6pfu/
D8sDpK2RALlszNvumWZ9RIAAAGoui/ua3xAghlgc6LMJkJh7cVl5gJw+7DWvjyNJuuSRBe6Z/u/
DfK+PAwCAZyzua35DgBhicaBDAfLxll1eH6XGeP6DL9xl/
7S7bQTIb0aXB8jzH3zh9XEAAPCMxX3NbwgQQywOdHB4WYCs+pIAiZXnwgLk1LvneH0cSdJFD7/
lnum59wkQAEDNZXFf8xsCxBCLA33O8DcIkBh77v3yAGkz1EaAdB71pnumGUs3e30cAAA8Y3Ff8xsCxBCLA0
2AxN6MpZvLA+QuGwFy/
sjyAJm+hAABANRcFvc1vyFADLE40OeOKAuQlfkESKz8OyxATr5rttfHkSSdd3AO0jJzNe29z70+DgAAnrG4
r/kNAWKIxYE+jwCJuelLygOk1Z02AiT0lbC0zFw9s3iT18cBAMAzFvc1vyFADLE40KEAWZG/
0+uj1BjT3vvcXfZbDsn1+jiSyr8bWlpmrqYu2uT1cQAA8IzFfc1vCBBDLA506LX/
y78gQGLlmbAAaWEkQM56oDxApry70evjAADgGYv7mt8QIIZYHGgCJPaeWbzJXfbTMm0EyK/
vf909z1PvECAAgJrL4r7mNwSIIRYHOhQgeQRIzExdFBkgpaWlXh9JHe6b557nyf9s8Po4AAB4xuK+5jcEiC
EWB/
qCh8oC5KPN33l9lBrj6Xc3RgRISYn3AXLmveUBMnnheq+PAwCAZyzua35DgBhicaBDP4COAImdf74TGSAHi
ku8PpLaZc11zzPpbQIEAFBzWdzX/
IYAMcTiQIcC5EMCJGaeOiRA9hsIkLb3lAfIhAXrvD4OAACesbiv+Q0BYojFgb5w1FtKy8zVss8JkFh58j8b
IgKk6ID3AXL6sNfc84x/iwABANRcFvc1vyFADLE40Bc9TIDE2hMLIwNk3/5ir4+kU+
+e457n8TfWen0cAAA8Y3Ff8xsCxBCLA10eIN96fZQaY/
LC9eYCpM3Q8gAZN58AAQDUXBb3Nb8hQAyxONDpBwPkg00ESKz84+3IANlb5H2AnHzXbPc8Y1//
zOvjAADgGYv7mt8QIIcxfvx4paWlKSEhQcFgUEuXLj3s459//nmdeuqpSkhIULt27TR79uwf9XwWB/
o3oxcQIDE2cUFkgHxfeMDrI6nVneUBMmbep14fBwAAz1jc1/
yGAKlETk6OAoGApkyZotWrV6tPnz5KSkrStm3boj5+0aJFio+P18MPP6w1a9bo7rvvVu3atbVq1aoqP6fFg
Q4FyPsESMxMWLAuIkD2GAiQFkPKzzN6LgECAKi5LO5rfkOAVCIYDKp///
7ur0tKSpScnKyRI0dGffzVV1+t7t27R9x3zjnn6Oabb67yc1oc6IsPBsh/
1m7XD0UHuMXg9uj8zyICZFvBPs/PFH6eB3NX/+iPt/
A+FgAAjgaL+5rfECBRFBUVKT4+XrNmzYq4v3fv3urRo0fUj2nevLkeffTRiPvuuecenXnmmZU+T2FhoQoKC
txbfn6+uYG++JEFEcsnN24/5XbLsx96PcoAABwVBEj1ESBRbNmyRY7jaPHixRH3Dx48WMFgMOrH1K5dW//
+978j7pswYYJOOOGESp8nKytLjuNUuFka6KyXP/Z8ea2Jt9Zh77mwdAt/M/
qPuREgAIBfCgKk+giQKGIVIH74Cogk7S0q9vwlQDXtVnigWKWlpZ6fI/xWWlqqwgM/
bRZ4CRYA4JeCAKk+AiSKWL0E61AMNAAAgG3sa9VHgFQiGAxqwIAB7q9LSkqUkpJy2DehX3755RH3nXfeeb5
/EzoAAADKsa9VHwFSiZycHCUkJGjq1Klas2aN+vbtq6SkJG3dulWS1KtXLw0ZMsR9/
KJFi3TMMcfokUce0SeffKKsrKxfxLfhBQAAQDn2teojQA4jOztbqampCgQCCgaDWrJkift76enpysjIiHj8
888/
r1NOOUWBQEBt27b9RfwgQgAAAJRjX6s+AsQQBhoAAMA29rXqI0AMYaABAABsY1+rPgLEEAYaAADANva16iN
ADGGgAQAAbGNfqz4CxBAGGgAAwDb2teojQAxhoAEAAGxjX6s+AsQQBhoAAMA29rXqI0AM2bVrlxzHUX5+vg
oKCrhx48aNGzdu3LgZu+Xn58txHO3atcvr1dG3CBBDQgPNjRs3bty4cePGzfZtw4YNXq+OvkWAGFJSUqL8/
Hzt2rXL87oPL3y+IsM14hpxjby+cY24RlwjrpGV2xdffCHHcbRz506vV
0ffIkBQqYICXuN4JFyjI+MaHRnX6Mi4RkfGNToyrtGRcY2OjGtUfQQIKsX/
wI6Ma3RkXKMj4xodGdfoyLhGR8Y1OjKu0ZFxjaqPAEGl+B/
YkXGNjoxrdGRcoyPjGh0Z1+jIuEZHxjU6Mq5R9REgqFRhYaGysrJUWFjo9VHM4hodGdfoyLhGR8Y1OjKu0Z
FxjY6Ma3RkXKPqI0AAAAAAxAwBAgAAACBmCBAAAAAAMUOAAAAAAIgZAgQAAABAzBAgqNT48eOVlpamhIQEB
YNBLV261OsjxczChQt1+eWXq1mzZnIcR7NmzYr4/dLSUg0bNkwnnniiEhMTdemll2rt2rURj/
n222913XXXqV69emrQoIFuvPFG7dmzJ5afxs9mxIgR6tSpk4477jg1adJEPXv21KeffhrxmH379umWW25Ro
0aNdOyxx+rKK6/U1q1bIx6zefNmdevWTXXq1FGTJk10+
+2368CBA7H8VH42EydO1BlnnKF69eqpXr16OvfcczVnzhz392v69Ylm5MiRchxHAwcOdO+r6dcpKytLjuNE
3E499VT392v69Qn58ssvdf3116tRo0ZKTExUu3bt9MEHH7i/X9P/
m52WllZhjhzH0S233CKJOZKk4uJi3X333WrRooUSExPVqlUr3X///
SotLXUfU9Pn6GgiQBBVTk6OAoGApkyZotWrV6tPnz5KSkrStm3bvD5aTMyZM0dDhw7VzJkzowbIQw89pAYN
Guill17SihUr1KNHD7Vs2VL79u1zH/Pb3/5W7du315IlS/TOO+/
o5JNP1rXXXhvrT+Vn0bVrVz399NP6+OOPtXz5cnXr1k2pqan6/
vvv3cf069dPzZs315tvvqlly5bp3HPP1fnnn+/+fnFxsdq1a6fLLrtMeXl5mjNnjho3bqw777zTi0/
pqHvllVc0e/ZsrV27Vp999pnuuusu1a5dWx9//LEkrs+h3n//
fbVo0UJnnnlmRIDU9OuUlZWltm3b6uuvv3ZvO3bscH+/pl8fSfruu+
+UlpamG264QUuXLtXGjRs1b948rV+/
3n1MTf9v9vbt2yNmaP78+XIcRwsWLJDEHEnS8OHDdfzxxys3N1ebNm3SCy+8oOOOO06PPfaY+5iaPkdHEwG
CqILBoPr37+/+uqSkRMnJyRo5cqSHp/LGoQFSWlqqE088UaNHj3bv27VrlxISEjRjxgxJ0po1a+Q4TsS/
wL322muKi4vTli1bYnf4GNm+fbscx9HChQsllV2P2rVr64UXXnAf88knn8hxHL333nuSyiKvVq1aEf/
KNmnSJNWvX19FRUWx/QRipGHDhnrqqae4PofYs2eP2rRpo/
nz5ys9Pd0NEK5TWYC0b98+6u9xfcpkZmaqc+fOlf4+/82uaODAgWrdurVKS0uZo4O6d+
+uG2+8MeK+K6+8Utdff70k5uhoI0BQQVFRkeLj4yv8q3/
v3r3Vo0cPj07lnUMDZMOGDXIcR3l5eRGPu+iii/S3v/1NkvTPf/5TSUlJEb9/4MABxcfHa+bMmT//
oWNs3bp1chxHq1atkiS9+eabchxHO3fujHhcamqqxo4dK0kaNmxYhcVq48aNchxHH330UWwOHiPFxcWaMWO
GAoGAVq9ezfU5RO/
evTVo0CBJiggQrlNZgNStW1fNmjVTy5Ytdd1112nz5s2SuD4hp59+ugYNGqSrrrpKTZo0UYcOHfTEE0+4v8
9/syMVFRXp+OOP1/
DhwyUxRyHDhw9XWlqaPvvsM0nS8uXLdcIJJ+jZZ5+VxBwdbQQIKtiyZYscx9HixYsj7h88eLCCwaBHp/
LOoQGyaNEiOY6jr776KuJxf/
zjH3X11VdLKvsP2SmnnFLhz2rSpIkmTpz48x44xkpKStS9e3ddcMEF7n3Tp09XIBCo8Nizzz5bd9xxhySpT
58+6tKlS8Tv//DDD3IcJ+K9En62cuVKHXvssYqPiLC86QAABTFJREFUj1eDBg00e/
ZsSVyfcDNmzFC7du3clzCEBwjXqexfnp9//
nmtWLFCc+fO1XnnnafU1FTt3r2b63NQQkKCEhISdOedd+qjjz7S5MmTlZiYqKlTp0riv9mHeu655xQfH+/
+izxzVKakpESZmZmKi4vTMccco7i4OI0YMcL9febo6CJAUAEBEokAObx+/
fopLS1N+fn57n38H1qZoqIirVu3TsuWLdOQIUPUuHFjrV69mutz0BdffKETTjhBK1ascO8jQA5v586dql+/
vp566imuz0G1a9fWeeedF3HfX//6V5177rmS+G/2obp06aLLL7/c/
TVzVGbGjBk66aSTNGPGDK1cuVLPPPOMGjVqRMj+TAgQVMBLsCLxEqzK9e/fXyeddJI2btwYcT9f0o/
u0ksvVd++fbk+B82aNUuO4yg+Pt69OY6juLg4xcfH64033uA6RdGpUycNGTKEOTooNTVVf/
7znyPumzhxopKTkyXx3+xwn3/+uWrVqqWXXnrJvY85KnPSSSdp/
PjxEfc98MAD7nedY46OLgIEUQWDQQ0YMMD9dUlJiVJSUngTusrfiPbII4+49xUUFER9I9qyZcvcx8ybN+8X
80a00tJS9e/fX8nJyRW+BaFU/ubYF1980b3v008/jfqmxvDvrDZ58mTVr19fhYWFP/
8n4YGLL75YGRkZXJ+Ddu/erVWrVkXcOnXqpD/
96U9atWoV1ymKPXv2qGHDhnrssce4Pgdde+21Fd6EPmjQIPerIvw3u1xWVpZOPPHEiG+fyxyVadSoUYWvUo
wYMUJt2rSRxBwdbQQIosrJyVFCQoKmTp2qNWvWqG/fvkpKSqrwfcF/
qfbs2aO8vDzl5eXJcRyNHTtWeXl57ps/H3roISUlJenll1/
WypUr1bNnz6jfiq9jx45aunSp3n33XbVp0+YX8634/vKXv6hBgwZ6+
+23I7614969e93H9OvXT6mpqXrrrbe0bNkynXfeeREvkwh9W8cuXbpo+fLlmjt3rpo0afKL+baOQ4YM0cKF
C7Vp0yatXLlSQ4YMUVxcnF5//XVJXJ/KhL8ES+I6/f3vf9fbb7+tTZs2adGiRbrsssvUuHFjbd+
+XRLXRyr7Fs7HHHOMhg8frnXr1mn69OmqW7eu++Zhif9mS2X/kJiamqrMzMwKv8ccSRkZGUpJSXG/De/
MmTPVuHFj92VoEnN0NBEgqFR2drZSU1MVCAQUDAa1ZMkSr48UMwsWLIj6Q5syMjIklf8woqZNmyohIUGXXn
qp+50zQr799ltde+21Ou6441S/fn397//+7y/mhxFFuzaO4+jpp592HxP6wVYNGzZU3bp19Yc//EFff/
11xJ/z+eef63e/+53q1Kmjxo0b6+9///
sv5gdb3XjjjUpLS1MgEFCTJk106aWXuvEhcX0qc2iA1PTrdM0116hZs2YKBAJKSUnRNddcE/
HzLWr69Ql59dVX1a5dOyUkJOi0006L+C5YEv/
Nlsr+Jd5xnAqft8QcSWVfkR04cKBSU1PdH0Q4dOjQiG8zzBwdPQQIAAAAgJghQAAAAADEDAECAAAAIGYIEA
AAAAAxQ4AAAAAAiBkCBAAAAEDMECAAAAAAYoYAAQAAABAzBAgAAACAmCFAAAAAAMQMAQIAAAAgZggQAAAAA
DFDgAAAAACIGQIEAAAAQMwQIAAAAABihgABAAAAEDMECAAAAICYIUAAAAAAxAwBAgAAACBmCBAAAAAAMUOA
AAAAAIgZAgQAAABAzBAgAAAAAGLm/wFHBRVk+8QWmgAAAABJRU5ErkJggg==\" width=\"800\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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 = $('<div/>');\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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all '
+\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\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 = $('<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 = $('<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 = $('<canvas/>');\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 = $('<div/>');\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 = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all
' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\
n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt ===
mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then
trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\
n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id:
this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format =
format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\
n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL ||
window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21)
== \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message
type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \",
msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type +
\"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-
in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from
http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the
document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-
home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-
arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-
right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan
axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"],
[\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"],
[\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-
save\", \"download\"]];\n",
"\n",
"mpl.extensions =
[\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm)
{\n",
" // Create a \"websocket\"-like object which calls the given IPython
comm\n",
" // object with the appropriate methods. Currently this is a non binary\
n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage
function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a
real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id +
\"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in
FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' +
width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\"
width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\"
title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></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 = $('<span class=\"mpl-message\" style=\"text-
align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline
pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\"
title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove
icon-large\"></i></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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 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"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img
src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAGQCAYAAABWJQQ0AAAgAElEQVR
4nOzdZ3wUVd/
G8VGEIDbEDsoIiCAgAgoqChELqPAg9nKr2NFbvbFPqKEjvXekqjQFxCGUQEILhBp6Cz2EJCSQAiE91/
Nidjcbsgm7zGbPnOz1/Xz2hdkF/oYDnF+yc0YBERERERGRjyiiByAiIiIiIv/
BACEiIiIiIp9hgBARERERkc8wQIiIiIiIyGcYIERERERE5DMMECIiIiIi8hkGCBERERER+QwDhIiIiIiIfI
YBQkREREREPsMAISIiIiIin2GAEBERERGRzzBAiIiIiIjIZxggRERERETkMwwQIiIiIiLyGQYIERERERH5D
AOEiIiIiIh8hgFCREREREQ+wwAhIiIiIiKfYYAQEREREZHPMECIiIiIiMhnGCBEREREROQzDBAiIiIiIvIZ
BggREREREfkMA4SIiIiIiHyGAUJERHQFKSkp6N27N9atWyd6FCIi6TFAiKgQVVXRsWNH0WMAAI4fPw5FUTB
9+nTRo/g1RVEQHBwsegyPBQYGIjAw8IqvCw8Ph6IoCA8PL/Y1r7/+Op544glcunTpqmZx59coKwIDA1G/
fn2f/nru/D4TkXUwQIj8xO7du/
H666+jevXqCAgIQNWqVfH8889j9OjRhV7HAKHL+XuAjBw5ErVr10ZiYuJVz8IAKd1fz/
n3OTY2FsHBwYiKivLZDETkGQYIkR+IiIhAhQoV8MADD6Bv376YMmUKevbsidatW6NWrVqFXpuZmYns7GxBk
xbGALEGWQMkKysLWVlZV3xdSXGQlZWF/v374+jRo6ZmYYCUnst/n7du3cq/
N4gsjgFC5Adefvll3HHHHUhOTi7yXEJCgoCJ3GMmQC5evOj9gfyUrAHiLl/
EAQPEPRkZGcjLyzP16zNAiKyPAULkB+rUqYNnnnnGrde6egvWrl270LJlS1SsWBHVqlVD3759MW3aNCiKgu
PHjxf6sW3btsX69evRtGlTBAQEoEaNGpg5c2ahn+/
cuXP48ccf0aBBA9xwww246aab8OKLL2Lnzp2FXudugEyfPh2KomDNmjX46quvcMcdd6By5cqO50+fPo2PP/
4Yd955JypUqIB69erht99+K/
LzZGRkIDg4GLVr10ZAQADuvvtuvPrqqzhy5AiA4jeR3vhOzezZs9G0aVNcf/
31qFy5Mlq0aIEVK1Y4nl+8eDFefvll3HPPPahQoQJq1qyJPn36IDc3t9DPY9/87du3D8888wyuv/
56VK1aFYMGDSr0uqysLPTo0QNNmjTBzTffjEqVKuHpp59GWFhYkdncCRD752bevHno168fqlWrhoCAADz77
LOIjo4u8vr58+ejSZMmqFixIm677Tb85z//wenTpwu9pmPHjrjhhhtw+vRpvPLKK7jhhhtw+
+2348cffyzy/+2Kq7dgxcTE4JVXXkGlSpVwxx134LvvvsPy5ctd/
r5GRkaiTZs2uPnmm3H99dejZcuW2LBhQ6HXnDhxAl999RUefPBBVKxYEVWqVMEbb7xR6M+F8+fnagNkzpw5
aNKkCW688UbcdNNNaNCgAUaOHOl43t0/U578Ph0+fBivvfYa7rrrLgQEBKBatWp4+
+23kZKSUuKs9jW4bds2PPnkk6hYsSLuv/9+TJgwweUsc+bMQbdu3VC1alVcc801SE5ORnBwMBSl6BbF/
mfd+fPr/Pts/zkvfzBGiKyFAULkB1q3bo2bbroJe/
bsueJrLw+Q06dPo0qVKrjtttvQu3dvDB06FHXr1sUjjzziMkDq1KmDu+66C127dsXYsWPRpEkTXHPNNdi7d
6/
jdVu3bkWtWrUQFBSESZMmoU+fPqhWrRpuueUWxMbGOl7naYDUq1cPgYGBGDNmDH799VcAQHx8PO69917cd9
996NOnDyZMmID27dtDURSMGDHC8XPk5ubiueeeg6IoeOeddzB27FgMHDgQzz77LBYvXgyg9AKkV69eUBQFz
Zs3x5AhQzBq1Ci899570DTN8ZoOHTrgrbfewpAhQzBhwgS8+eabUBQFP/
30U6GfKzAwEFWrVsV9992Hzp07Y/
z48Xj22WehKApCQkIcr0tMTMQ999yDH374ARMmTMDgwYNRp04dlC9fvsh75z0JkMaNG+PRRx/
FiBEj0KtXL1SqVAnNmjUr9Fr771fTpk0xYsQIBAUF4frrr8f9999f6Lt0HTt2RMWKFVG/
fn188sknmDBhAl5//XUoioLx48df8fN6eYBcunTJEQq//PILRo4ciUcffRQNGzYs8vu6evVqVKhQAU8+
+SSGDRuGESNGoGHDhqhQoQI2b97seN2CBQvwyCOPoGfPnpg8eTK6du2KW2+9FaqqIj09vcjn52oCZOXKlVA
UBc899xzGjRuHcePG4ZtvvsGbb77peI27f6bc/
X3KyspCjRo1ULVqVfTr1w9Tp05F79690bRpU5w4ceKKn/
eqVavizjvvxDfffIPRo0fj6aefhqIohcLfPku9evXQqFEjDB8+HAMHDkR6evpVB0h8fDz69OkDRVHwxRdfY
Pbs2Zg9e7bpt9ARkXcxQIj8wMqVK1GuXDmUK1cOTz75JH755ResWLHC5bUelwfIt99+i2uuuabQpvTcuXOo
UqWKywBRFKXQUaVnz55FQEAAfvzxR8fHMjMzi7zN4vjx4wgICECfPn0KfcyTAHn66aeLfGX8008/
xT333IOkpKRCH3/nnXdwyy23OE41sn9HZ/jw4UV+/vz8fAClEyDR0dG49tpr8eqrrxb5nNh/XQAuT1/
q1KkTKlWqhMzMTMfHAgMDoSgKZs2a5fhYVlYW7r77brz+
+uuOj+Xm5ha5PiI5ORl33XUXPvnkk0If9yRAHnrooUI/
76hRo6AoiiN+s7Ozceedd6JBgwbIyMhwvE7XdSiKgp49ezo+1rFjRyiKUmhNAHBsnq/k8gAZOXIkFEXB/
PnzHR9LT0/HAw88UOj3NT8/H7Vr10abNm2K/B7UqFEDL7zwQqGPXW7Tpk1Ffg/MBEjnzp1x8803l/
hdH3f/TLn7+xQVFQVFUbBgwQKP57WvwWHDhjk+lpWVhUaNGuHOO+90/
L1jn6VmzZpFPo9XGyAA34JFJAMGCJGf2LJlC1599VVUqlTJ8baEO+64A//880+h110eILVr10bz5s2L/
HzffvutywCpV69ekdc2bNgQr776qsu5cnNzkZSUhMTERDRs2BAdOnRwPOdpgFz+Vq/8/
HxUrlwZX3zxBRITEws97D/G/paatm3b4vbbb0dOTk6xv05pBMiQIUOgKIpHJ/akpaUhMTERv//
+OxRFKfQ2m8DAQNx4442FNs4A0L59ezRu3Njlz5eXl4dz584hMTERbdu2RaNGjQo970mADB48uNDHd+zYAU
VRHOts48aNxX4Ho27duoXCwh4gZ8+eLfS6//3vf7j11ltLnAcoujFt3bo17rnnniKfm8GDBxf6fbXPPHPmz
CLr5rPPPkNAQIDL6xSys7Mda7ly5cr47rvvinx+riZAgoODUa5cOSxbtsyt15f0Z8rd36djx45BURR89tln
hb6T447AwEBcd911Ra7DmjBhAhRFwaZNmwrN0rt3b5f/
zwwQorKLAULkZ7KysrBlyxZ06dIFFStWRPny5bFv3z7H85cHSIUKFfDhhx8W+XnsXzG9PEBefPHFIq8NDAw
sdA1KXl4ehg8fjgceeADlypUr9F7tVq1aOV7naYBcfpO4hIQEl+8Hd34sXLgQgLH5feqpp0r8dUojQL788k
tce+21Vzytae/evejQoQNuvvnmIv8Pa9eudbwuMDAQdevWLfLjO3bsiPvvv7/Qx2bMmIGHH34Y5cuXL/
Tz1ahRo9DrPAmQuXPnFvq4/
XMzY8YMAMa1DIqiYPXq1UV+jg4dOuD2228vNHPFihWLvK64zenlLt+Y1qlTBy1atCjyun/+
+afQ7+u8efOuuG7Onz8PwPgOSI8ePXDvvffimmuuKfSajz/
+uMjn52oCJCEhAQ899BAURUG1atXw8ccfF4kRd/9Mufv7BAA//
PADFEXB9ddfj9atW2Ps2LFXvP4DMD7v1atXL/Lx1atXQ1GMaz6cZ3H+TpEdA4SobGOAEPkx+z/
mvXr1cnzMbIC0bdu2yGsv3yD07dsXiqLgk08+wZw5c7BixQqEhoaifv36hV7naYBs3bq10Mfj4uKgKAref/
99hIaGunzYTwFzJ0DWrFnjchN55MiRUg2Q5ORk3HbbbahRowZGjhyJf//
9F6GhoRg0aFCReYo7gahjx45QVdXx37Nnz4aiKOjQoQNmzZqF5cuXIzQ0FM8++2yh1wGeBcjlb9m5/
PfQ0wC54YYbiryutAPEPuOQIUOKXTf2txF9+umnuPbaa/
HDDz9gwYIFWLlyJUJDQ3HbbbcV+nNk9iL0rKwsLFmyBF999RXuv/
9+KIpS6M+lu3+m3P19stu9ezf69u2LFi1a4Nprr0W1atUQExNT4qyeBoirt3nZr4u63NSpUxkgRGUAA4TIj
+3ZsweKoqBTp06Oj5l9C5Y7AfLII48U+qqsXbVq1bwaILm5ubjpppvw7rvvlvjjgYK3YJV0D5Rdu3ZBURQs
WrSo0MftG6vSegvWokWLinynAwAmT5581QHyyiuvoGbNmkXejtS8efNSDZCS3oL10EMPFXkLljcDpHXr1qh
ateoV34K1ZcsWKIqCSZMmXfHXuOWWWwp9pwMwTlMrV66cVwPEWV5eHjp16gRFURwnV7n7Z8rTAHEWEREBRV
HQrVu3Eufz9C1YrgLE/
gWOy48O79GjxxUDZNu2bQwQIotjgBD5gbCwsCKbLgCOr6A7X3h9eYB88803Hl2E7k6ANGnSpMixwPPnz4ei
KF4NEAD46KOPUKFCBZcngDlfW+DORegpKSkoV64cvv/+
+0LP209mKq2L0JcsWQJFMY4ZtrNf1Hu1AfLaa6+hZs2ahX7NyMhIXHPNNaUaIPaL0Bs2bFjo4vmQkBAoStG
L0L0ZIO5ehJ6Xl4datWqhdu3auHDhQpGf13ndVKlSBR999FGh5+1B460AufwABQAYN24cFEVxnC7n7p8pd3
+fUlNTi1wPlZaWhmuvvbbIyWuXK+ki9DvuuKPIReiuAsR+KIHzNWoXL15E9erVrxggBw4cgKIUPuWOiKyFA
ULkB+rXr48aNWrghx9+wOTJkzF27Fi89957KFeuXJGjTy8PkFOnTqFy5cq4/fbbCx3Da9/8Oh/
J6W6A9OzZE4qi4KOPPsLkyZPx7bffokqVKqhZs6bXAyQ+Ph6qqqJSpUro3LkzJk2ahIEDB+LNN98sdCFzbm
4unnnmGSiKcQzvuHHjMHjwYLRu3dpxDC9gnJ513XXX4YcffsC4cePw0ksv4dFHHy0yp332y+
+p4or9q7rNmzfH0KFDMWbMGHz44YcICgoCYGxA7Ue7Dhs2DMOHD0fjxo0dRyFfTYDYg6t9+/
aYNGkSgoKCULlyZdSvX79UAwQo+P16/
PHHMXLkSHTp0gWVKlVyeQyvNwPEHhsVK1aEpmklHsMbHh6OihUronr16ggODsbkyZMRHByMli1bol27do7X
ffjhhyhXrpxjbX300Ue499573XoLlv1jV/
rcdujQAS1btkSvXr0wdepU9OjRA5UrV0ajRo0cAenunyl3f58WLVqEatWq4bvvvsP48eMxevRoNG3aFOXLl
3d8B6Okz7v9GN5vv/0WY8aMcRzDO3ny5CvOAhihWr16ddx++
+0YNGgQhg4dinr16jn+rJUUINnZ2ahcuTLq1KmDqVOnYs6cOTh27FiJMxORbzFAiPzAsmXL8Mknn6Bu3bq4
8cYbUaFCBTzwwAP49ttvi9wJ3dWNCKOiotCiRQsEBATg3nvvxcCBAzF69GgoioL4+PhCP9adAMnMzMSPP/
6Ie+65B9dffz2eeuopbNq0qcjrvBEggHER79dff4377rsP5cuXx913343nnnuu0GYIMC4o7tatG2rUqAFFU
XDdddfhjTfeKHQPgcTERLz+
+uuoVKkSbr31VnTq1Al79+4tMqf97W32iLiSadOmoXHjxggICMCtt96KwMBAhIaGOp6PiIjAE0884bixoP0
o5asNkPz8fAwYMACqqiIgIACNGzeGrutFXgd4P0AA40Jv+/
9vlSpVSrwR4eWuNkAA4OTJk2jfvj0qVaqE22+/
HZ07dy72RoRRUVF47bXXcNtttyEgIACqquKtt94qdP1KcnIyPv74Y9x++
+248cYb0aZNGxw8eLDInyNXAfLvv/9CURRMnDixxP+Pv/
76C61bt3bcSLN69ero1KkT4uLiHK9x98+Uu79Px44dwyeffIJatWo5brDYqlUrrFq1qsRZAdc3IlRVFWPHj
i30upICBAC2b9+Oxx9/3PH/PHz4cLcuQgeM63rq1auH6667jm/
HIrIgBggRXZXOnTujYsWKbt2RWkazZ89269qR4owbNw433HBDoUAjcvbzzz/
j3nvvLfRWNCIif8AAIaIruvwmYUlJSahSpQqef/55QROVvpSUFJQvX/
6qN4dvvPEGunTp4uWpqCx57LHH3LrQnYiorGGAENEVPfLII+jcuTMmTpyI3r17o3r16rjuuuuKnMpUFuzfv
x8jR47EL7/8AkVR3LrvAREREbmPAUJEV9SlSxfUrl0b119/
PSpVqoSnn3660PUJZcmOHTsc7+fv2rWr6HGIiIjKHAYIERERERH5DAOEiIiIiIh8hgFCREREREQ+wwCxkLy
8PMTExCAlJQWpqal88MEHH3zwwQcffFjskZKSgpiYGMeNQMlzDBALiYmJgaIofPDBBx988MEHH3xY/
BETEyN66ygtBoiFpKSkOBa06Lrngw8++OCDDz744KPow/
4FYx7TfvUYIBaSmpoKRVGQmpoqehQiIiIicoH7NfMYIBbCBU1ERERkbdyvmccAsRAuaCIiIiJr437NPAaIh
XBBExEREVkb92vmMUAshAuaiIiIyNq4XzOPAWIhXNBERERE1sb9mnkMEAvhgiYiIiKyNu7XzGOAWAgXNBER
EZG1cb9mHgPEQrigiYiIiKyN+zXzGCAWwgVNREREZG3cr5nHALEQLmiSXVZOHnJy80SPQRaQm5eP9KycYh+
XsnJFj2hKRnZuif9/Vn3k5uWL/tQRSY/
7NfMYIBbCBU0yCzuYgNrdQtCkz0rEpWSIHocESknPRrP+oVA1vcSH9tcu0aNelV+XHbji/
5tVH037heL8xSzRn0IiqXG/
Zh4DxEK4oElmzpuy1QfiRY9DAm0+ds6tzXDzgatFj3pV2o1eLzwkzDw2HU0S/
Skkkhr3a+YxQCyEC5pkNjCkIEBW7WeA+LONR5KgajpaDQl3+TYge6A8OWCV6FGvStvR66BqOpbtiRP+lipP
Hq2GhkPVdGw8wgAhMoP7NfMYIBbCBU0yGxCy3xEgK/
cxQPzZhuhEqJqOF4avcfn8rphkqJqOJyQNkJdHGQESfjBB9CgeeWH4GqiajojoRNGjEEmN+zXzGCAWwgVNM
huwtCBAlu+NEz0OCbT20Fmomo42I9a6fH53TApUTcfj/
eUMkJdGGgGy5tBZ0aN4pM2ItVA1HesPM0CIzOB+zTwGiIVwQZPM+jsFyLI9Z0SPQwKFHUyAqul4edQ6l8/
vOW0ESLP+oT6ezDtetAXIWskCRNa5iayG+zXzGCAWwgVNMuun73MEyNLdDBB/tmp/PFRNx/+NWe/
yeXuANO0nZ4DYv5Ow7rBcG3lZ3zpGZDXcr5nHALEQLmiSWd9/CwLk312xoschgVbuMwLklbEbXD6/
N9YIkMckDxDZ3spkP70r7AADhMgM7tfMY4BYCBc0yayPU4D8s5MB4s+W7YmDqul4dZzrANkXmwpV0/
FoXzkDpPVwI0A2SHYxd/sx63lKHZEXcL9mHgPEQrigSWa9lxQEyOKo06LHIYGW7j4DVdPxxoQIl8/
vP2MPkJU+nsw7ZD1N6pWxG3hKHZEXcL9mHgPEQrigSWa9lux1BMjCHTGixyGBluyMharpeGviRpfPH4gzAq
RJHzkD5PlhtgA5IleAdBi3gafUEXkB92vmMUAshAuaZBb8T0GA/
L2dAeLPFkedhqrpeHfyJpfPH4xLg6rpaCxpgDxnCxDZbuj32vgIxw0Uiejqcb9mHgPEQrigSWbOAbJgGwPE
n/
29PQaqpuP9qZEunz8UbwRIo94rfDyZdzxru6P4pqNyBcgbE4wACeEpdUSmcL9mHgPEQrigSWY9F+9xBMi8r
adEj0MCLdhmBMiHv212+fxhW4A8ImmAtLIFSKRkAfLmxI1QNR36LgYIkRncr5nHALEQLmiSWQ+nAJm75aTo
cUigeVtOQdV0fDTNdYBEJxgB0rCXpAEyxAiQzcfOiR7FI29PMgJkCU+pIzKF+zXzGCAWwgVNMuu+qCBA/
tzMAPFnf24+CVXT8emMLS6fj064AFXT8XDwch9P5h3P2AJky3G5AuTdyZt4Sh2RF3C/
Zh4DxEK4oElm3RbtdgTI75EnRI9DAs3edAKqpuPzmVtdPn/krBEgDSQNkMDBYVA1HVslC5D/
TImEqulYtIMBQmQG92vmMUAshAuaZNZ1YUGAzNrEAPFnMzceh6rp+HL2NpfPH5U8QFraAmTbCbkC5P2pkTy
ljsgLuF8zjwFiIVzQJLMuTgEyc+Nx0eOQQNM2HIOq6fjvH9tdPn8s8aIRID3lDJAWg+wBcl70KB758LfNPK
WOyAu4XzOPAWIhXNAkM+cAmb7hmOhxSKCp640A+fbPHS6fP24LkPqSB8j2k3IFSMdpm3lKHZEXcL9mHgPEQ
rigSWZBfxcEyDQGiF+bvPYoVE1H5zklB0i9Hst8PJl3PD1otZQB8vH0LUaAbGGAEJnB/
Zp5DBAL4YImmQX9vcsRIFPXM0D82YQ1R6BqOr6fF+Xy+RNJRoA8JGmAPPWrESA7JAuQT2cYATKHp9QRmcL9
mnkMEAvhgiaZaX8VBMiUdUdFj0MCjQ2Lhqrp+Gn+TpfPn0xKh6rpqNtdzgBpPtAIkKhTyaJH8chnM7dC1XT
8EckAITKD+zXzGCAWwgVNMvtlQUGATFp7RPQ4JNDoVYehajq0v3a5fP7UOSNA6nQP8fFk3mEPkJ2SBcgXs4
wAmc1T6ohM4X7NPAaIhXBBk8x+XrDTESAT1jBA/
NmI0ENQNR1dFu52+bw9QB7sJmeAPDlgFVRNx64YuQLky9nbjGOyeUodkSncr5nHALEQLmiS2U/
zCwJkXHi06HFIoGErjQDpvmiPy+djzhsBUlvSAHnCFiC7Y1JEj+KR//
6+HaqmY0bEcdGjEEmN+zXzGCAWwgVNMvvRKUDGhjFA/
NmQ5Qehajp6LnYdIKeTLxkB0lXOAHm8vxEge07LFSBf/
7Gdp9QReQH3a+YxQCyEC5pk9sO8ggAZveqw6HFIoF+XHYCq6ei1ZK/
L52NtAfJA16U+nsw7mvUPlTJAvv1zB0+pI/
IC7tfMY4BYCBc0yez7eVGOABkZygDxZwOW7oeq6ej77z6Xz59JMQKkVhc5A6RpPyNA9sbKFSD/
m7ODp9QReQH3a+YxQIqxdu1atGvXDvfccw8URcGiRYtKfH14eDgURSnyiIuLc/vX5IImmX0/
tyBARoQeEj0OCdT3331QNR0Dlu53+XxcSgZUTUdNSQPkMVuA7IuV6+/q72x/
RievZYAQmcH9mnkMkGKEhISgW7duWLhwoUcBcujQIcTFxTkeeXl5bv+aXNAks+
+cAmTYSgaIP+u1ZC9UTcevyw64fD4+1QiQGkG6jyfzjkf7GgGy/4xcf1fbv0s5kafUEZnC/
Zp5DBA3eBIgyclXfywjFzTJrLPt7R2qpmPoioOixyGBgv8xAmTIctfrIMEWIPdLGyAroWo6DsTJ9Xe1/
aCI8eEMECIzuF8zjwHiBk8CRFVV3H333Xj++eexYcMGj34dLmiS2f+cAmTwctdf+Sb/0H
3RHuM7YcWEaEJahmOtyKhJHyNADsaliR7FI/
Z79fCUOiJzuF8zjwHiBncC5ODBg5g4cSK2bduGiIgIfPzxx7juuuuwffv2Yn9MZmYmUlNTHY+YmBguaJKW/
YSdkt56Q/6hy8LdJV4LdDYtU+oAaWwLkEPxcgWI9tcuqJqOMat5SASRGQwQ8xggbnAnQFxp2bIl3n///
WKfDw4OdnnhOhc0yegbpwAZEOL64mPyD/
aNbnHHMSdekDtAGvVeAVXTcViyAAn62wjDUTwmm8gUBoh5DBA3XG2A/
PTTT3jiiSeKfZ7fAaGyxH6TM1XT0b+Y04/IP/w0v+S3+iQ5BUh+fr6PpzPvEVuARCfIFSBdr/
CdKSJyDwPEPAaIG642QJ5//nm8+uqrbr+eC5pk9l+nACnu/g/kH+ynLU0o5rSlcxezHGslL0+
+AGnYyx4gF0SP4hHHtTk8pY7IFO7XzGOAFOPChQuIiopCVFQUFEXB8OHDERUVhZMnTwIAgoKC8MEHHzheP2
LECCxevBjR0dHYs2cPOnfujGuvvRarVq1y+9fkgiaZ/ff3ggDpvYQB4s/
sJ6IVd7+J804BkithgDwcvByqpuPIWbkCpOfiPTyljsgLuF8zjwFSjOJuLNixY0cAQMeOHREYGOh4/
aBBg1CrVi1UrFgRVapUwTPPPIOwsDCPfk0uaJKZc4AE/7NX9DgkkP1Agqnrj7l8Pjm9IEByct2/
V5JV2APkqGQBYj8emafUEZnD/
Zp5DBAL4YImmX31+zYGCAEoeDvetA1XDpBsCQOkgaQBYr9B5CCeUkdkCvdr5jFALIQLmmT25eyCAOmxeI/
ocUgg+1qYufG4y+dT0rMdayUrR8IA6WkEyLHEi6JH8Uiff/dB1XQMDGGAEJnB/
Zp5DBAL4YImmXWaVRAg3RbtFj0OCfT5zK1QNR2zN51w+XzKpYIAyczJ9fF05tW3BchxyQKkn24EyACeUkdk
Cvdr5jFALIQLmmT2xaytjk1ll4UMEH/
26YwtUDUdf9zWe28AACAASURBVG4+6fL51IyCAMnIli9A6vVYBlXTcSJJrgAZsHQ/
VE1HP52HRBCZwf2aeQwQC+GCJpnZv+qtajqC/
t4lehwS6KNpm6FqOuZtOeXy+TTJA+QhW4CcTEoXPYpHBoYcgKrp6MNjsolM4X7NPAaIhXBBk8w+cwqQXxYw
QPzZh78ZAbJgW4zL5y9k5jjWyqUs+QKkbncjQE6dkytABi0zAqTXEh4SQWQG92vmMUAshAuaZPbpjIIA+Wn
+TtHjkEDvT42Equn4e7vrALnoFCDpWTk+ns68Ot1DpAyQIcsP8pQ6Ii/gfs08BoiFcEGTzOzv+1c1HT/
MY4D4s3cnb4Kq6Vgcddrl8+lZBQFyMVO+AHmwmxEgMeflCpBhKw7ylDoiL+B+zTwGiIVwQZPMPpleECDfz4
0SPQ4J9NbEjVA1HUt2xrp8/
lJWrmOtXJAwQGrbAuR08iXRo3hk2MpDPKWOyAu4XzOPAWIhXNAks4+dAuQ7Bohfe2NCBFRNx9LdZ1w+n5Fd
ECBpGdk+ns682l2NAImVLEBGhBoB0pWn1BGZwv2aeQwQC+GCJpnZTz5SNR3/
m7ND9Dgk0KvjNkDVdCzbE+fyeecASZUwQB7ouhSqpuNMilwBMmrVYdspdQwQIjO4XzOPAWIhXNAks45OAfL
NnwwQf/bKWCNAVu6Ld/
l8Zk5BgKRcki9AanUxAiQuJUP0KB4Zs9oIEO0vnlJHZAb3a+YxQCyEC5pkZj96VdV0/
PeP7aLHIYH+b8x6qJqOVftdB0hWTp7UAVLTFiDxqXIFyNiwaKiajp8X8JAIIjO4XzOPAWIhXNAksw+cAuSr
37eJHocEennUOqiajrCDCS6fz851CpB0+QKkRpAxe4JkATI+/
AhUTcePPCabyBTu18xjgFgIFzTJzH7vB1XT0WkWA8SftRmxFqqmY+2hsy6fz3EKkOT0LB9PZ9799gBJkytA
Jq4xAuT7eTwkgsgM7tfMY4BYCBc0ycw5QD6fuVX0OCTQC8PXQNV0bIhOdPl8bl6+Y62cvyhfgNhnP5uWKXo
Uj0xee5Sn1BF5Afdr5jFALIQLmmT2nykFAfLpDAaIP3t2aDhUTcfGI0kun89zCpBzEgdI4gW5AmTKuqM8pY
7IC7hfM48BYiFc0CQz5wD5ZPoW0eOQQK2GGAGy+dg5l8/
n5xcESJJkm3gA0s4+df0xnlJH5AXcr5nHALEQLmiS2XtTNjk2Zh8zQPxay8FhUDUdW49fOUBk+y6CzPE0bY
MRIF/zlDoiU7hfM48BYiFc0CSzdycXBEjHaZtFj0MCPfXraqiaju0nzxf7Glmvo5D57WMzIo4bx2T/
zgAhMoP7NfMYIBbCBU0ye2dSQYB88BsDxJ89OWAVVE3HzlPJxb7GvlZkO0lK5gvoZ200AuTL2TyljsgM7tf
MY4BYCBc0yeztSRsdG7P3p0aKHocEatY/FKqmY8/
plGJfc7+k99KQ+Qjh2ZtOQNV0fDGLh0QQmcH9mnkMEAvhgiaZvTWxIEDem7JJ9Dgk0KN9jQDZF1v832X2m/
nJdjdxmW+i+EfkSaiajs94TDaRKdyvmccAsRAuaJLZm04B8s4kBog/
a9JnJVRNx8G4tGJfU7PLUqiajrgUuQIkK8cpQC7JFSBzNp+0HZPNQyKIzOB+zTwGiIVwQZPM3pxQECBvTdw
oehwS6JHeK6BqOg7HFx8gtWwBciblkg8nMy8zJ9exzlMz5AqQeVtO8ZQ6Ii/
gfs08BoiFcEGTzN6YEOHYmL05gQHizxoEL4eq6Thy9kKxr3mgqxEgsclyBUhGdkGApEkWIPO3nuIpdURewP
2aeQwQC+GCJpm9Pr4gQF4fHyF6HL+Sn5+PE0kXEZ2QZolH3e7LoGo6jideLHbm2l1DoGo6TkscIBcyc0SP4
5EF22J4Sh2RF3C/
Zh4DxEK4oElmrzkFyGsMEJ8avPyA43Nvpcepc+nFzly7mxEgMeeLf40VXcoqCJCLkgXI39tjeEodkRdwv2Y
eA8RCuKBJZq+O2+DYmHUYt0H0OH7lo2mboWo66nZfhkd6r7DE44PfNiMvL7/
YmR+0BUhJkWJF6Vk5jnWeniVXgCzacRqqpuM/
UxggRGZwv2YeA8RCuKBJZh2cAqT9WAaIL334mxEgf22LET2K2+p0lzNALmYWBMilrFzR43hkcZQRIO9O5il
1RGZwv2YeA8RCuKBJZq+MLQiQ/xuzXvQ4fuX9qZFQNR1/
b5cnQOzXicgWIBecAiQjW64AWbIzFqqm4+1JPCSCyAzu18xjgFgIFzTJrL1TgLQdvU70OH7FHiCLdpwWPYr
bHuphBMjJJLkCJC0jW9oA0XedMU6p4zHZRKZwv2YeA8RCuKBJZu3HrHdszF4ayQDxpfembIKq6VgcJU+A1L
MFyImk4k/
KsqJUpwDJzJErQEJ2GwHyxgQeEkFkBvdr5jFALIQLmmT2f04B0mbEWtHj+JV3JhkBsmRnrOhR3Fa/5/
IrHtVrRSmXCgIkKydP9DgeWbYnjqfUEXkB92vmMUAshAuaZNZudEGAtB7OAPGltyYad6HXd50RPYrbGtgC5
JhsAZJeECDZuXIFyIq9cTyljsgLuF8zjwFiIVzQJLO2o9c5NmbPD1sjehy/
8uYEI0BCdksUILa7pR8t4W7pVpScnuVY5zmSBUjovnieUkfkBdyvmccAsRAuaJKZc4A8OzRc9Dh+xX4X+mV
74kSP4raHbQFyROIAyS3hPidWtGp/PE+pI/
IC7tfMY4BYCBc0yezlUQUB0ooB4lP2m0Cu2CtfgEQnyBUg5y/KGyBhBxKgajrajWaAEJnB/
Zp5DBAL4YImmb00siBAnhkSLnocv2K/
B0vovnjRo7itYa8VtgBJEz2KR845BUhJd3q3ovCDRoC8PIqn1BGZwf2aeQwQC+GCJpm96BQgLQeHiR7Hr9i
PQF61X54AeaS3ESCH4+UKkKQLmY51np8vV4CsPXQWqqbjRR6TTWQK92vmMUCKsXbtWrRr1w733HMPFEXBok
WLrvhjwsPD0bhxY1SoUAG1atXC9OnTPfo1uaBJZm1GrHVszJ4etFr0OH7FfgRy2IEE0aO4rZEtQA5JFiCJT
gEim/WHE3lMNpEXcL9mHgOkGCEhIejWrRsWLlzoVoAcO3YMlSpVwg8//ID9+/
djzJgxKFeuHJYvX+72r8kFTTJzDpDmAxkgvmQ/
ACD8oDwB0rjPSqiajoNxcgXI2TR5AyQi2giQF4bzlDoiM7hfM48B4gZ3AuSXX35B/
fr1C33s7bffRps2bdz+dbigSWathxcEyJMDVokex6/
Yr79Ze+is6FHc1sQWIAfi5Pr7LiEtA6qm4/4g+QJk45EkqJqO53hMNpEp3K+ZxwBxgzsB0qJFC3Tu3LnQx6
ZNm4abb7652B+TmZmJ1NRUxyMmJsZSC/rPzSfx2cytUj5+nL8T8akZoj+FfuWF4WscAfJ4fwaIL9m/
+7T+cKLoUdz2aF8jQPafscbfd+5KSDUCpIaEARJ5NImn1BF5AQPEPAaIG9wJkNq1a2PAgAGFPrZ06VIoioJ
Lly65/
DHBwcFQFKXIwyoLOvifvY4NpYyPKeuOiv4U+pXnhxUESNN+oaLH8Sv27z5FRMsUIKFQNR37Yq3x95274m0B
UrPLUtGjeGzL8XM8pY7ICxgg5jFA3FBaAWL174BsO3EOf24+Kd3jNdtN2caFR4v+FPqV55wC5NG+DBBfssf
fxiNJokdx22P9jADZG5siehSPxKUYAVJLwgDZagsQnlJHZA4DxDwGiBtK6y1Yl+OC9o6fF+yEqukYG8YA8a
Vnh4Y7BchK0eP4FfvnPvKoPAHSVNIAOZNyCaqm44Gu8gXIthPnoWo6WgxigBCZwf2aeQwQN7h7EXqDBg0Kf
ezdd9/lRegC/LJgFwNEgFZOAdK4DwPEl1oNMT73W46fEz2K25r1NwJkz2m5AiQ22QiQ2l1DRI/
isR0njQB56leeUkdkBvdr5jFAinHhwgVERUUhKioKiqJg+PDhiIqKwsmTJwEAQUFB+OCDDxyvtx/D+/
PPP+PAgQMYN24cj+EVRPvLCJAxqw+LHsWv2DfBqqbjkd4rRI/
jVwIHh0HVdGyVKEAe779KygA5bQ+QbvIFyM5TyTwmm8gLuF8zjwFSjPDwcJcXiHfs2BEA0LFjRwQGBhb5MY
0aNUKFChVQs2ZN3ohQkKC/
jQAZvYoB4kvPOAXIw8HuhzeZ19IWINtOnBc9itueGGAEyO4YuQIk5nw6VE3HgxIGyO6YFKiajid4TDaRKdy
vmccAsRAuaO8I+ns3VE3HKAaIT9m/
Cq9qOhr0ZID40tODVkPVdOw4KU+APGkLkF0xyaJH8cipc0aA1OkuX4DsOW0ESLP+PCSCyAzu18xjgFgIF7R
3dFloBMjIUAaIL7V0CpB6PZaJHsevNB9oBMjOU/
Js5mWcGSgIkLrd5Vvj+2JToWo6HuMx2USmcL9mHgPEQrigvaOrLUBGhB4SPYpfaTGoIEBk3JzJ7EkJ385kD
5AoyQLkZJIRIA9JGNkH4lJ5Sh2RF3C/Zh4DxEK4oL2j2yIjQIavZID4kv1tQLK+P15mMl7Q/
dSv8r1tDABOJF2U9rt8h+LTeEodkRdwv2YeA8RCuKC9o/uiPVA1HcMYID7lHCAyHlEqM/
s9NWS6q7h9vWyXNEDqS3id02FbgPCUOiJzuF8zjwFiIVzQ3tFjsS1AVhwUPYpfsX9FW9abtMns0b5GgByIk
+fvDnuAyHRyFwAcT5Q3QKITLkDVdDTsxQAhMoP7NfMYIBbCBe0dDBAx7O/
pVzUdNbswQHypSZ+VUDUdh+LTRI/
iNvs1Q9tOyHPvEgA4ZgsQGU96O3rWCJAGPCabyBTu18xjgFgIF7R39LQFyFAGiE85B8j9QbrocfxKo94roG
o6ohPkCZCWEt48EZB7Ey/zd2+IrIT7NfMYIBbCBe0dwf/sharpGLKcAeJL9pOY7I/8/HzRI/
mNRxwBckH0KG6z3zdmi2QBcsQWIDLebFPmE7yIrIT7NfMYIBbCBe0d9gAZvPyA6FH8yhOXBci2E+ew/
eR54Y9dMcnIyc0T/
ekpVQ8HL4eq6Th6Vp4AeWZIOFRNx+ZjcgWIzNdR2O9homo68vL4BQJviU5Ic+vvopT0bNGjkpdwv2YeA8RC
uKC9o9cSI0AGLWOA+JL9KFgrPn5esFP0p6dUNehpBMjxxIuiR3FbK1uARB5NEj2KR6IT5D1JKjb5kuPPRJ9
/94kep0xYtOO0238PPdYvFNll/Ish/oL7NfMYIBbCBe0dvZfsg6rp+JUB4lPN+hsnMbUdvQ4tBoVZ4mE/
Her18RGiPz2lql6PZVA1HSeT0kWP4rZWQ40A2SRZgNiPsm0kYYDk5+c7NsMfT98iepwyYeiKg45DCYr7e8j
5iPLzF7NEj0xewP2aeQwQC+GC9o4+/
xoBMjCEAeJL9ntR7I21zs3wVuyNg6rp6DBug+hRSlXd7kaAnDonT4A8awuQjUfkChDZb+a3YFsMVE1Hx2mb
RY9SJgxadgCqpqPXkr3FvsY5/
M6mZfpwOiot3K+ZxwCxEC5o7+hrC5ABIftFj+JXHrPgzfBW7Y+HquloP2a96FFK1YPdQqBqOk4nXxI9itue
G7ZGygA5GGcESBNJA+QvW4B88BsDxBsGhOyHqunoe4W3tNXqshSqpiMuJcNHk1Fp4n7NPAaIhXBBe0c/
3RYgSxkgvmR/
u9P+M9ZZv2EHE6BqOtqNLtsBUrurESBnUuQJkOdtARJxJFH0KB45EJcKVdPxaF85A2ThDiNA3p8aKXqUMqH
/0v1u/XtT2/ZFgpjz8nyXkorH/Zp5DBAL4YL2Dvs/CP0ZID71aF/
jZnhWuhv3mkNnoWo6Xhq5TvQopcr+1dX4VHm+uvrCcFuARMsVIPvP2AMkVPQoV2VxlHHR9H+mMEC8wd23/
D4k4XVaVDzu18xjgFgIF7R3DLAFSD+dp7z4kv1u3AfjrHMzvPWHE6FqOtqMWCt6lFJVI8h4f3lCmjwB0nr4
Wqiajg2SBci+2FTHiUYy+mdnLFRNx7uTN4kepUxw99j3BhIelU3F437NPAaIhXBBe4e778kl72psC5BD8dY
JkIgjRoA8P2yN6FFKlYwXuLYZYQTI+sNyBcje2BSomo6mkgbIv7uMAHl70kbRo5QJPRbvgarpGLai5BvfNr
LdLPSwhf5+pKvH/Zp5DBAL4YL2joEhB3jOvQBW/
Ac28mgSVE1Hq6HhokcpNc4n7CRdkC9A1h0+K3oUj+w5bQRIs/
5yBsjS3WegajrenMgA8YauC3dD1XSMCD1U4uvsb1G10jVydPW4XzOPAWIhXNDe8avtWMTeSxggvvSILUCiE
6wTIFuPn4Oq6QgcHCZ6lFKTl1cQIDLdY+DFkeugajrWHpIzQB7vv0r0KFdl2R4jQN6YULbvjeMrQX/
vgqrpGL3qcImvs98nac9p6xxTTleP+zXzGCAWwgXtHe6cy07e17CXPUCs8x7n7SfPQ9V0tBhUdgMkJzfPES
Ap6dmix3HbS7YAWSNZgOyOMQLkiQFyBshy271xXivjN+f0lV8WGAEyNiy6xNc1H2jcjHDnqWQfTUalifs18
xggFsIF7R2DlxsBEvwPA8SXHrZdZHnEQhdZRp1KhqrpaD5wtehRSk1WTkGApGbIEyAvjzICJPxgguhRPLIr
xlhTT0oaICv3xfvFzTl95cf5O6FqOsaHHynxdS0GhUHVdGw7cd5Hk1Fp4n7NPAaIhXBBe8eQ5QcZIAJY8ZQ
X2b9a7Y6M7FxHgFzIzBE9jtvajjYCJEyyANkpedQ6bs45lgHiDd/PjYKq6Zi0tuQAaTUkHKqmY/
Oxcz6ajEoT92vmMUAshAvaO+wB0nPxHtGj+BV7gBxLvCh6FAfZTyxyx6WsggBJz5InQNqNXm8EyAEGiC+tP
mAEyP+NKds35/SV/
83ZAVXTMWXd0RJf95ykN94k17hfM48BYiFc0N4xdAUDRIQGPa0XILLftdodFzNzHAGSkZ0rehy32QNk9YF4
0aN4RPa39YUdTICq6Wg3mgHiDV//
sR2qpmPahmMlvk7WY6fJNe7XzGOAWAgXtHcMswVIDwaIT9W3BchxCwXI4fg0qJqORr1XiB6l1KRlZDsCJDN
HngD5vzFGgKzaL1eA7LAdbPDUr3IGyJpDZ6FqOl4etU70KGXCV79vg6rpmLnxeImvk/
WaJ3KN+zXzGCAWwgXtHcNWHoKq6ei+iAHiS/
V6LIOq6TiRZJ0AOXL2AlRNR8NeZTdAUi4VBEhWTp7ocdzW3hYgofvkChD7yWpPD5IzQNYdNgLkxZEMEG/
oNMsIkNmbTpT4uvaSBje5xv2aeQwQC+GC9o7htgDptmi36FH8ykO2ADmZlC56FIdjiRehajoa9FwuepRSk5
JeECA5uRIFyNgNUDUdKyULkG0n5D7aeUN0IlRNR5sRa0WPUiZ8NnMrVE3HH5EnS3zdq+OM9b58b5yPJqPSx
P2aeQwQC+GC9o4RoUaAdF3IAPGlut2NADl1zjoBcjIpHaqm46Eey0SPUmrOX8xyBEheXr7ocdz2ii1AVki2
Idt2wri5ZUtJb24ZccQIkBeGrxE9SpnwyfQtUDUdc7eUHCBvTIiAqulYuvuMjyaj0sT9mnkMEAvhgvaOkaG
HoWo6ujBAfKpO9xDLBUjMeSNAHuwWInqUUpN0IdMRIPn58gRIB0m/
Irz1uBEggZIGyKajSVA1Hc8NY4B4Q8dpm6FqOuZvPVXi696etBGqpmPJzlgfTUalifs18xggFsIF7R2jVhk
BEvQ3A8SXHuxmBEjMeesEyJmUS1A1HQ90XSp6lFJzNs0IkPuDdNGjeETWt6RssQXIM0PCRY9yVTYfM+ZvNT
Rc9ChlwvtTI6FqOv7eHlPi6/4zxXjdoh2nfTQZlSbu18xjgFgIF7R3jHYEyC7Ro/
iV2rYAOZ18SfQoDgmpGVA1HTUk25x7wv7/
WLOLXJH12njjLSnL9sgVII4NvKQBslXygLKa96ZsgqrpWBxVclh8+JvxnZIF20oOFZID92vmMUAshAvaO8a
sNgJE+4sB4ku1uxoBEmuhAEl0entSWRWXkiHld3ledwSIXO+Jj7S9hUnW7yDIfg2L1bwzaZNbb6362M1rRU
gO3K+ZxwCxEC5o7xgbFg1V0/HLAgaILz3QdSlUTceZFOsEyDlJL9D2RGyy8Taz2pJd52K/
KDdEsoty7ddQPCtpgNiPEZb1FC+reXOicW2HvqvkdezuaVkkB+7XzGOAWAgXtHfYA+TnBTtFj+JXanUxAiQ
uJUP0KA7OR9RmS3RErSfsF9rX6S5XgLw5YaOUpwJtPCL3Rdz2O7nLeiNFq3H3O3lfzjbuFzLrCjcsJDlwv2
YeA8RCuKC9Y1y4ESA/
zWeA+FJNW4DEp1onQJzvEp6RLc9dwj1x6pwRIHW7y3XUsLtfObYa+zG2z0saILtijABpPpAB4g3209yudJz
0139sh6rpmLbhmI8mo9LE/Zp5DBAL4YL2jvHhR6BqOn5kgPhUjSBjo59goQBJz8pxBEh6Vo7ocUqF/
V4n9SS718lbtgD5d5dcx5JGRMt9H409p1OgajqeGLBK9Chlgrt3OO88ZwdUTceUdUd9NBmVJu7XzGOAWAgX
tHdMWGMEyA/zGCC+dL89QNKsEyAZ2bmOAEnLyBY9Tqk4Lund3mW9L4L9TuKth8t5J/
G9sUaANOsfKnqUMqHt6HVQNR1hBxNKfN3386KgajomrDnio8moNHG/
Zh4DxEK4oL1joi1Avp8XJXoUv2Lf6J9NyxQ9ikN2bp5jrpRLZTNAjp69AFXT8XCwXAFiPz3oH8kCZP1hI0D
ajJAzQPafSYWq6XisHwPEG14aaQTI2kNnS3zdzwt2QtV0jA2L9tFkVJq4XzOPAVKCsWPHQlVVBAQEoFmzZt
i8eXOxr50+fToURSn0CAgI8OjX44L2jklrbQEylwHiS/aNfuIF6wRIbl6+Y67zF7NEj
1MqohOMAHmk9wrRo3jk3cnu3T/
BatYdPit1gByMS4Oq6Xi070rRo5QJbUasharpWH84scTXBf29G6qmY9Sqwz6ajEoT92vmMUCKMXfuXFSoUA
HTpk3Dvn378Pnnn6Ny5cpISHD9bdbp06fj5ptvRlxcnOMRH1/ye0IvxwXtHfYA+Y4B4jP5+QUb/
SQLBYjzXFYKI286HG9sKBv3kWtD6e4N3Kxm7SEjQF4cuU70KFdF1vViVc8PWwNV0xFxpOQA6b5oD1RNx7CV
h3w0GZUm7tfMY4AUo1mzZvj6668d/52Xl4eqVati4MCBLl8/
ffp03HLLLaZ+TS5o75i89ihUTUfnOTtEj+I3nDf65yz2nQYrXhzvTbJ+Rfs/
UyKhajoW7ZAzQF6SNECiE9Kk/I6ZVbUaGg5V0xF5NKnE1wX/sxeqpmPw8gM+moxKE/
dr5jFAXMjKykK5cuWwaNGiQh//8MMP0b59e5c/Zvr06ShXrhyqV6+Oe+
+9F+3bt8fevXs9+nW5oL1jyjojQP7HAPGZvDzrBogVb5DoTbK+p98eIAt3xIgexSNrJA+QI7Zrhhr2YoB4Q
+DgMKiajq3Hz5X4uj7/7oOq6RgYwgApC7hfM48B4kJsbCwURcHGjRsLffznn39Gs2bNXP6YjRs3YubMmYiK
isKaNWvQrl073HzzzYiJKf4f18zMTKSmpjoeMTExXNBewADxPStfa/
FgtxComo6Y8+miRykVsp5q9P5UI0D+3i5XgIQfTICq6Xh5lJwBcsx+appkhxZY1dODVkPVdGw/
eb7E1w1Yuh+qpqOfvs9Hk1FpYoCYxwBx4WoC5HLZ2dmoVasWunfvXuxrgoODi1y4zgVt3tT1x6BqOr79kwH
iKzlOp00lp1srQB7qsQyqpuPUubIZILLe18EeIH9tkytAwmwB0na0nAFyIskIkPqSHdtsVc0HGgGy81Ryia
8btOwAVE1HryWevTOCrIkBYh4DxIWreQuWK2+88QbeeeedYp/
nd0BKx2+2APmGAeIzhY67TbfWcbcNei6Hquk4nnhR9CilYneMESBPShYgH/
y2GaqmY4FsAXLACJB2o9eLHuWqnDpn3LjyIcluXGlVTwxYBVXTsed0SomvG7biIFRNR4/
Fe3w0GZUmBoh5DJBiNGvWDN98843jv/Py8lCtWrViL0K/XG5uLurUqYPvv//
e7V+TC9o7pm0wAuTrP7aLHsVvZOVY934bDwcbAXLk7AXRo5SKnaeSoWo6mg9cLXoUj3xoC5D5W0+JHsUjqw
/EQ9V0/
N8YOQMk5rwRIHW6h4gepUxo2i8UqqZjb2zJATIi9BBUTUeXhbt9NBmVJu7XzGOAFGPu3LkICAjAjBkzsH//
fnzxxReoXLmy42jdDz74AEFBQY7X9+7dGytWrMDRo0exfft2vPPOO6hYsSL27XP//Z5c0N4x3RYg/
2WA+ExmTsEdx1MtdsfxRr1XQNV0HI5PEz1Kqdhx8jxUTcfTg+QKkI7T5AyQVfuNAGkvaYDEJl+Cqumo3Y0B
4g2P9l0JVdNxIK7kf7fHrD4MVdOh/
bXLR5NRaeJ+zTwGSAnGjBmD6tWro0KFCmjWrBkiIyMdzwUGBqJjx46O//
7uu+8cr73rrrvw8ssvY8cOz94CxAXtHTMijhsB8jsDxFcysgsCJM1iAeLuBkFW204YAdJycJjoUTzykS1A5
kkWIKH7bAEydoPoUa5KXEoGVE3HA12Xih6lTHD3Cxzjw437U/
04f6ePJqPSxP2aeQwQC+GC9o6ZG40A+er3baJH8RvOAXIhM0f0OIW4+xYJWW09fg6qpuOZIeGiR/
HIx9O3GAGyRa4AWWkLkFckDZCEVCNAanZhgHiDu2/xtN+fijfILRu4XzOPAWIhXNDeMcsWIF/
OZoD4yqWsggC5aLEAsV8kujumbAbI5mNGgLQaGi56FI98YguQuVtOih7FIyv2xkHVOq5sPQAAIABJREFUdH
QYJ2eAnE3LhKrpuD9IFz1KmVDfzUMueDhK2cL9mnkMEAvhgvaOWZtOQNV0dJrFAPGV9KwcR4CkZ1krQNw9J
lNWm44mQdV0PDdsjehRPPLpDCNA5myWK0CW2wLkVUkDJPFCpuPPKpnn7jHf9rcG8zvzZQP3a+YxQCyEC9o7
ZtsC5ItZW0WP4jcuZhYEyKWsXNHjFOLujcJkFXEkEaqm44XhsgXIVqiajj8lC5Ble4wAeW18hOhRrsq5i1m
OP6v5+fmix5Geuzc65b9LZQv3a+YxQCyEC9o7fo80/qL/fCb/
oveVC04BkpFtrQAJHBwGVdOx9fg50aOUig3RRoC0GbFW9Cge+WymESB/
RMoWIGegajpelzRAktMLAiQ3jwFi1gNdl0LVdJxJuVTi6+ZsPglV0/HpjC0+moxKE/
dr5jFALIQL2jv+iDT+ov+MAeIzaRnZlg2QVkPDoWo6Io8miR6lVKw7fFbKAPncFiC/
R54QPYpHQnYbAfLGBDkDJOVSwZ/
V7Nw80eNIr0aQ8blMSM0o8XXzt56CqunoOG2zjyaj0sT9mnkMEAvhgvaOPx1faWKA+EqqU4Bk5lgrQJ4ftg
aqpiPiSKLoUUrF2kNGgLw0cp3oUTzyxSwjQGZvkitAltoC5M0JG0WPclXSLPxnVTb5+fmOz2XihcwSX/
v39hiomo73p0aW+DqSA/dr5jFALIQL2jv4rW7fc/
6qalaOtb6q2mbEWqiajvWHy2aAhB9MgKrpaDtargDpNGsbVE3HLMkCRN9lC5CJcgbIRQu/
XVI2uXkFAXL+YlaJr10cdRqqpuPdyZt8NB2VJu7XzGOAWAgXtHfYA+ST6QwQX0lJt+7bOl4auQ6qpmPtobO
iRykVYQeMAPk/ye7M/eVsW4BsPC56FI/
8uysWqqbjLUkDxPnIbKudWCeb7Nw8x+cy5VLJN2CVPVypMO7XzGOAWAgXtHfM3WIEyMcMEJ9xvrA1x2IB0n
a0ESBhBxNEj1IqVu2X887cX/
1uBMhMyQJkyU4jQN6eJOdG0so3DZWN8+cyLaPkAJH99DQqjPs18xggFsIF7R3zthgX+33Ei/
185vxF656s037MeqiajlX740WPUirsd+aW7cZ4//19O1RNx4yI46JH8cg/
tgB5Z5Kcb6XJyin4qn3qFTbNVDJP7n8UavtzWrf7Mrw8ap0lHm9O3Ij9Z7jfuBrcr5nHALEQLmjvmMfTRnz
OOUDyLBYgHcZtgKrpWLE3TvQopcJ+YzzZvrL63z+MAJm+4ZjoUTxiDxBZ38tf6G1D6QwQMzw5/
e9gXJrjtVZ6DAjZ76PPVtnC/Zp5DBAL4YL2Dvtxhx/
+xgDxlXMWDpDXx0dA1XQs23NG9Cilwn5fCtmOhbUHyDTJAkT2i4mdL5xOTi/
5wmkqmafXvh2OT8OaQ2ct8fjmzx1QNR29luz1wWeq7OF+zTwGiIVwQXvHgm0xDBAfS7qQ6fiH2Gp3V35z4k
aomg59V9kMEMexsJJd3Pq1LUB+Wy9ngLw3Rc4AcT469twVTm6ikln5Cy9XMnzlIaiajm6LdoseRUrcr5nHA
LEQLmjv+MsWIB8wQHwm0SlArOadSZugajqW7IwVPUqpkPVUJvtXYKdKFiCLdhgB8p8p8t7Pwf5n9Ur3rqCS
WfnvvSsZGxYNVdOh/bVL9ChS4n7NPAaIhXBBewdv+OR7Z9Os+w/
xe1OMAFkcdVr0KKViiaQXRX8raYAs3CH/3y+Ou3enlXz3bipZQmoGVE1HjSDr/
b13JZPWHoGq6fh+XpToUaTE/Zp5DBAL4YL2jrKwQZBNQprxD/H9FvyH+P2pkVA1HX9vjxE9SqmQ9S1B/
5tjBMiUdUdFj+KRsvAFjlpdlkLVdMSnMkDMOJNyCaqm44GuS0WP4rHf1h+Dqun45s8dokeREvdr5jFALIQL
2jvKwlskZGPlrwR2nLYZqqZj/
tZTokcpFfb1LtuGuLOkAVIW3uJZu2sIVE3HmZRLokeRWsz5dKiajge7hYgexWOzNp2Aqun4cvY20aNIifs1
8xggFsIF7R2yfkVYZvG2AKnZxXpfCfxk+haomo65W06KHqVU2L8iL9uG+Lu5UVA1HZPXyhUgZeGQiwe7GQF
yOpkBYsbJJCNAHuqxTPQoHrPfsPfTGbxh79Xgfs08BoiFcEF7h+zHZMooLsUIkFoWDJDPZm6Fqun4I7JsBo
h9QyzbfW++twXIpLVHRI/ikfll4D5Ddbsvg6rpOHUuXfQoUjuWeBGqpqNBz+WiR/
FYWfhOnkjcr5nHALEQLmjvkP1OxTKy8nuhO83aBlXTMXvTCdGjlAr7jTc/ni7XVzK/n2cEyMQ1cgWI/
fP9kcQB8lAPI0BOJjFAzDhy9gJUTUfDXitEj+Ix2W+oKRr3a+YxQCyEC9o77KcCvT1JrmNJZRabbARI7a7W
ey/0V78bATJz43HRo5QKWd9K8cO8nVA1HRNkC5Atcgafs/
o9l0PVdJxIuih6FKkdjjfubt6ot3wBIusNTK2C+zXzGCAWwgXtHbLeF0Fmp+0BYsGLMb+W9I7b7vpzsxEgn
83cKnoUj/w43wiQ8eFyBYg9+D6ROEAaBBsBciyRAWLGgbhUqJqOR/
uuFD2Kx0L3xUPVdLQfu0H0KFLifs08BoiFcEF7h75LzjtDy8zKp8HIetyru36PNE6z+VyyAPnJFiDjwqNFj
+KROZvl/
I6Ts4a9VkDVdBw5e0H0KFLbG5sCVdPRtF+o6FE8tubQWaiajpdHrRM9ipS4XzOPAWIhXNDesXS3LUAmMEB8
5dQ5I0DqdLdegMh6sbO7ZtuO0+w0S67jNH9eYATI2DC5AuRPR4DIFXzOGvU2AiQ6IU30KFLbHWMEyBMDVok
exWMRRxKhajpeGL5G9ChS4n7NPAaIhXBBe4c9QPjeVt+xB0jd7tY7jlLWt/q4a9bG41A1HV/9LleA/
LJgl5QB8keknG95c9akz0qomo5D8QwQM6JOJUPVdDQfuFr0KB7bcvwcVE3HM0PCRY8iJe7XzGOAWAgXtHeE
2ALk9fEMEF+x8nn49o3uN3/uwL+7Ysvcw/5Wpv/+sV30p9oj2l/G78uY1YdFj+IRWd/
y5uzRvqFQNR0H4uT7t+Z08iXhf+bsjzGrD0PVdLQYFCb60+Ixezw99at88WQF3K+ZxwCxEC5o77Cf7vEaA8
RnTiQZ5+HXs2CAdF+0B6qml/nHd3OjRH+qPRL0txEgo1fJFSD2t7x9MUveAGnazwiQfbHy/
Vvz1K+rhf9Zu/
zx7NBw0Z8Wj9mvX2nWX77rV6yA+zXzGCAWwgXtHcv2xEHVdLw6jqd7+Mpx2w256lvwhlx7Y1Pw0bTNeHvSx
jL7+OC3zdh24rzoT7VHgv7eDVXTMUqyAJkl6TU3zh7vvwqqpmPP6RTRo3isVpeljr/
fRf+5e3vSRrwzaRMWR50W/
Wnx2CHbEcKN+8h3gpcVcL9mHgPEQrigvWP5XiNAOjBAfOa4xHcEJjG6LDQCZGSonAHy5Wx5A+SJAUaA7I6R
L0BqBBnfdUhIzRA9itQcd3EP5t/ZV4P7NfMYIBbCBe0dK2wB8grPN/
eZYwwQ8lBXW4CMCD0kehSPyHrRv7PmA423Me2KSRY9isfsb3s6m5YpehSp2Y9Ot+LJhTLgfs08BoiFcEF7x
0rbDZYYIL5z9OwFfjWNPGIPkOEr5QqQmWUgQOzXUUSdkitA8vPzHQGSdIEBYkZ8agZUTUfNLktFjyIl7tfM
Y4BYCBe0d/
AOr753xBYgDzNAyE3dFskZIDMijAD57+9ynTrmrMWgMKiaju0n5bpuKDevIEDOX8wSPY7Uzl3Mcnwu8/
LyRY8jHe7XzGOAWAgXtHes2m8LkDHrRY/
iN6ITjABp2GuF6FFIEvbTyYZJFiDTNxwzAkSyY4+dBQ42AmTbiXOiR/
FITm6eY9OcnM4AMSMtI9vxuczMyRU9jnS4XzOPAWIhXNDesfqAESD/
xwDxmegE40SVR3ozQMg9PRbbAmTFQdGjeGSaLUC+ljhAWg0Jh6rp2HJcrgDJyikIkJRL2aLHkVpGdq7jc3k
hM0f0ONLhfs08BoiFcEF7R9iBBKiajnajGSC+cth2pGMjBgi5qactQIZKFiC/rTcC5Js/
d4ge5ao9O9QIkMijSaJH8YjzpjktgwFihvPb2fjdJM9xv2YeA8RCuKC9I+ygESBtR68TPYrf4Jny5Kngf/
ZC1XQMWS5XgEy1Bci3EgfI88PWQNV0bDwiV4BcyioIkIv8qr1pjiON03iksae4XzOPAWIhXNDeEW4LkJdHM
UB85WCcESBNGCDkJnuADF5+QPQoHpmy7ihUTcf/
5sgbIK2Hr4Wq6YiIThQ9ikcuZuY4AuRSFq9bMKt2txComo7TyZdEjyId7tfMY4BYCBe0d6w5dBaqpuOlkQw
QXzkQlwpV0/FoXwYIuafXEiNABi2TM0A6SxwgbUYYAbL+sFwB4nzhdEY2A8Ss+j2XQ9V0nEi6KHoU6XC/
Zh4DxEK4oL1jrS1AXmSA+Mz+M/
YACRU9Ckmi95J9UDUdv0oWIJPXGgHy3dwo0aNctRdHroOq6Vh76KzoUTyScqkgQLJy8kSPI71GvVdA1XREJ
6SJHkU63K+ZxwApwdixY6GqKgICAtCsWTNs3ry5xNfPnz8fderUQUBAABo0aIClSz27wQ8XtHesO2wESJsR
a0WP4jf2xRoB8lg/Bgi5p8+/RoAMDJErQCatPQJV0/G9xAHy8igjQNZIFiDJ6QX3rsjJZYCY9Vi/
UKiajn2x3HN4ivs18xggxZg7dy4qVKiAadOmYd++ffj8889RuXJlJCQkuHx9REQEypUrh8GDB2P//
v3o3r07ypcvjz179rj9a3JBe8f6w4kMEB/
bG5sCVdPRlAFCbuprC5ABIftFj+KRiWtsATJP3gBpN3o9VE1H2EHX/
55ZFW+e513NB66GqunYFZMsehTpcL9mHgOkGM2aNcPXX3/
t+O+8vDxUrVoVAwcOdPn6t956C23bti30sccffxydOnVy+9fkgvYOe4C0Hs4A8ZU9p40AadafAULu6afbAm
SpXAEywRYgP8zbKXqUq9Z+jBEgqw/Eix7FI0kXMh0Bkp/
PADFL1htSWgH3a+YxQFzIyspCuXLlsGjRokIf//DDD9G+fXuXP+a+++7DiBEjCn2sZ8+eaNiwYbG/
TmZmJlJTUx2PmJgYLmgv2BBtBMgLw9eIHsVv2APk8f6rRI9Ckui/dD9UTUd/yQJkfLgRID/
OlzdAXhm7AaqmI3SfXAFyNq0gQMi852zHMTftF4oWg8L84uGtNc8AMY8B4kJsbCwURcHGjRsLffznn39Gs2
bNXP6Y8uXL488//
yz0sXHjxuHOO+8s9tcJDg6GoihFHlzQ5kTYAuT5YQwQX9kdYwTIEwMYIOSeAbYA6afvEz2KR8aFR0PVdPwk
cYC8Os4IkBV740SP4pGE1Ayomo4aQQwQb+g0a5sj6PzlsTjqtFc+dwwQ8xggLvgqQPgdkNIRccQIkOcYID6
zKyYZqqbjSQYIuWlAiBEgff+VK0DGhhkB8vMCeQPk9fERUDUdy/
bIFSBxKUaA1Ori2QEv5FpWTh6iTiVj+8nzfvM4d9E7d31ngJjHAHHBV2/
BuhwXtHdsPJIEVdPx7NBw0aP4jZ2njABpPnC16FFIEgNDDkDVdPSRNEB+WbBL9ChX7c0JG6FqOkJ2nxE9ik
diky9B1XTU7hoiehTyc9yvmccAKUazZs3wzTffOP47Ly8P1apVK/
Ei9Hbt2hX62JNPPsmL0AXYdNQIkFYMEJ+JYoCQh35dZgRI7yVyBciY1Yehajq0v+QNkLcmGgGi75IrQGLOp
0PVdDzYjQFCYnG/
Zh4DpBhz585FQEAAZsyYgf379+OLL75A5cqVER9vXMD0wQcfICgoyPH6iIgIXHfddRg6dCgOHDiA4OBgHsM
rSKQ9QIaEix7Fb9gD5KlfGSDknkG2AOm1ZK/
oUTxiD5Cgv+UNkLcnGQGyZGes6FE8cuqcESB1uy8TPQr5Oe7XzGOAlGDMmDGoXr06KlSogGbNmiEyMtLxXG
BgIDp27Fjo9fPnz8eDDz6IChUqoH79+rwRoSCbj52Dqul4hgHiMztOnmeAkEdkDZDRq+QPkHcnb4Kq6fhHs
gA5kXQRqqajXg8GCInF/
Zp5DBAL4YL2ji3HGSC+tt0WIE8PYoCQewYvNwIk+B+5AmSUI0B2ix7lqv1nSqRXTwTyleOJRoA06Llc9Cjk
57hfM48BYiFc0N6x1RYggYPDRI/
iN7adMAKkxSB+zsk9Q5YflDJARoYaAdJlobwB8v5UI0AW7ogRPYpHjp69YARIMAOExOJ+zTwGiIVwQXvHth
NGgLRkgPgMP+fkqaErjADpudj96+SsYEToIaiajq4SB8iHv22Gqun4a5tcARKdYARIw14rRI9Cfo77NfMYI
BbCBe0d/Gq87/G7TuSpYbYA6SFZgAxfaQRIt0XyBshH04wAmb/
1lOhRPHI4Pg2qpqNRbwYIicX9mnkMEAvhgvYOXo/
ge7zuhjw1zLaR775IrgCRdW5nn0zfAlXTMW+LXAFyMM4IkCZ9Vooehfwc92vmMUAshAvaO3gik+/
ZTx7j0cfkLlm/kyDrd26cfTpjK1RNx5zNJ0WP4pH9Z1Khajoe7RsqehTyc9yvmccAsRAuaO/
gTfF8L5I3fyQPyXothazXrjj7fKYRIH9EyhUge2NToGo6mvZjgJBY3K+ZxwCxEC5o79jJAPE5+93nn2WAkJ
tkPU1K1tO7nH0xywiQ/2/v3sOjKs+9jy9ECSonERTFnSUKWrdYdFfZYruhffHy/
OKrrVrUVyqtSqWKh+qKIqYegliUakGUCqIIBsVy0AUEkPMxEAgJhxACCSEcg5GEcEiE5Lf/
mGQgYZiAa2XWmuH7ua7nDyZPzJ3nuk3uX2Zmrc+XbvG6lFOyZlsggPx30ndel4LTHPOacwQQH6Gh3ZFREAg
gXQbySypSlmwKBJDu787zuhREiWi9n0a03r/kWH0+T5Np2RoTZQGEn+3wC+Y15wggPkJDu6P6l9SN/
JJyTWVlpeZlF+qL1PyQ6017nUzL1s0EEJyk6juK3/
fhkhP2lR9Xr6orSEXbHdyP9eTYlTItW099scrz86xey/OK6qybZ7fhF8xrzhFAfISGdkdmAU/
Tu636pQ91rTveX+B1qYgSH83bdFI95dc1cNp6r4/wJ3t2fLrn51d7XZpga1fJobB1r+IKh/
AJ5jXnCCA+QkO7o3pY7pzEGxXdMmvdLpmWrWsSU/Snz1aEXI+PWaE5Wbu9LhVRYmfxIT335eoT9pOfV7/
kVcrds9/rI/zJ1mwr1pPjVnp+jtWrw8vTZFq21u8I/
7uPezzBL5jXnCOA+AgN7Y7qAMKVUtwzfc0OmZat3w5f7HUpAGLMDW/
OkmnZWrOtOOw+bngKv2Bec44A4iM0tDuqL9V4PQHENVNWb5dp2fr9iKVelwIgxtw48DuZlq2Mgr1h93G/
IfgF85pzBBAfoaHdsW47N6ty29dpBTItWw+PXOZ1KQBizE1vzZZp2VqV/
0PYfVzuG37BvOYcAcRHaGh3HL1b7kyvS4kZ45fny7Rs9R693OtSAMSY/
3l7jkzLVtqW8FfCWrxpD1fbgy8wrzlHAPERGtodWTsDAeS/
XieAuGXM0i0yLVtPjEnzuhQAMebXg+fKtGyl5oYPIItyAgHkliHzI1QZEBrzmnMEEB+hod2xYec+mZat6wg
grhm1MFemZavvuJVelwIgxvyfdwIBZOnm78PuW7gxEEBu/
QcBBN5iXnOOAOIjNLQ7sncRQNw2Yn7gng3Pjk/3uhQAMebmd+fJtGwtztkTdt/87EKZlq3b3+N+Q/
AW85pzBBAfoaHdsbEqgFz72gyvS4kZw+bkyLRsvTghw+tSAMSYW/8xX6Zla8HGwrD75m7YLdOydec/
CSDwFvOacwQQH6Gh3ZGzOxBAOhFAXDNkZrZMy9bLEzO9LgVAjLn9vQUyLVtzN4S/
kemcrEAAueufCyNUGRAa85pzBBAfoaHd
kbO7VKZl6+d/I4C45e8pWTItW4lT1npdCoAYc9c/
F8q0bM3O2hV233frd8m0bPUYSgCBt5jXnCOA+AgN7Y5NhYEAck1iitelxIykqetlWraSpq73uhQAMabHsEU
yLVsz14UPIDPXBQLI3cMWRagyIDTmNecIID5CQ7tjc1UA6UgAcU3ilLUyLVtvT8/
yuhQAMeaeDwIBJGXtzrD7UtbulGnZuucDAgi8xbzmHAHER2hod+Tu2R8IIK8SQNzSf1KmTMvWkJnZXpcCIM
b8dvhimZataZk7wu6bvmaHTMvWb4cvjlBlQGjMa84RQHyEhnZHXlUAuZoA4poXJ2TItGwNm5PjdSkAYsx9H
y2Radn6NmN72H1TMwMB5L4Pl0SoMiA05jXnCCA+QkO7ozqA/
OeA6V6XEjOeHZ8u07L10bxNXpcCIMb8fsRSmZatyenbwu6zMwIB5P6PCCDwFvOacwQQH6Gh3bHl+0AAuYoA
4pq/fLFKpmVr1MJcr0sBEGMe+niZTMvWxFUFYfd9s3q7TMvW70csjVBlQGjMa84RQHyEhnZH/
vcHZFq2fvYKAcQtT4xJk2nZGrN0i9elAIgx/
39UqkzL1oS08AFkcvo2mZatBz8mgMBbzGvOEUB8hIZ2x9aiQAC58pVpXpcSM3qPXi7TspWcmu91KQBizB8+
CQSQL1dsDbtv0qpAAHno42URqgwIjXnNOQKIj9DQ7qgOIFf0J4C4pfovlF/X8RdKADhVJ/
sHjn+vLJBp2Xp4JAEE3mJec44A4iM0tDsKfggEkA4EENdUv0l0yurwV6kBgFP1p89WyLRsjV0W/
iWeE9ICAeSRUakRqgwIjXnNOQKIj9DQ7ti292AggLxMAHHLyV6nHwBOVfA9Zkvywu77csVWmZatP3xCAIG3
mNecI4D4CA3tju1VAaT9y1O9LiVm9BgWuFPxrHW7vC4FQIx5cuxKmZat0YvCX2Vv/
PJ8mZat3qOXR6gyIDTmNecIID5CQ7tjR3EggFz+EgHELbe/
t0CmZWtedqHXpQCIMdWX+R5Zx2W+k1MDAeSPn66IUGVAaMxrzhFAfISGdsfO4kMyLVuXEUBcc/
O782Rathbn7PG6FAAxpl9yIIB8vGBz2H3jlgUCyGOfEUDgLeY15wggPkJDu2NXSSCAtEuwvS4lZvx68FyZl
q3leUVelwIgxjw7Pl2mZeujeZvC7vt86RaZlq0nxqRFqDIgNOY15wggPkJDu2M3AcR1N701W6ZlK33rXq9L
ARBjnv9qtUzL1gdzc8LuG7MkT6Zl689jCSDwFvOacwQQH6Gh3bF7XyCAXEoAcc0Nb86Sadlas63Y61IAxJg
XJ2TItGwNnb0x7L5PFwcCyJNjV0aoMiA05jXnCCAhFBUV6cEHH1TTpk3VvHlz9e7dW6WlpWE/
p1u3bjIMo8Z64oknTunr0tDuKNxXJtOyZVoEELdc9/
pMmZat7F37vC4FQIxJ+HemTMvWe7PCB5BPFuXKtGz1HUcAgbeY15wjgIRw2223qVOnTlq2bJkWLlyo9u3bq
2fPnmE/
p1u3bnrssce0c+fO4DrVxqSh3bGnlADito6vpsi0bOXu2e91KQBiTP9JgQDy7szssPtGLgwEkKe+WBWhyoD
QmNecI4DUsn79ehmGoRUrjl5lY/r06WrQoIG2bz/
xXaC7deumfv36OfraNLQ7vj8mgFRWVnpdTky4ov80mZatrUUHvC4FQIx5dfIamZatd2ZsCLvv4wWbZVq2+i
UTQOAt5jXnCCC1jBo1Si1atKjx2OHDh9WwYUNNnDjxhJ/
XrVs3tWrVSueff76uvvpqJSQk6MCBUxvWaGh3FO0vDwaQioroDCDb9x7UyIW5GjF/
ky9Wu4TAee4qOeT10QCIMX/7Zq1My9bb07PC7vvX/
EAAeXZ8eoQqA0JjXnOOAFJLUlKSrrjiiuMeb926tYYPH37CzxsxYoRSUlKUmZmpsWPHqm3btrrnnnvCfq2y
sjKVlJQEV0FBAQ3tgmMDyJEoDSCPj1kR/B78si5NsFVy6EevjwZAjHn923UyLVsDp60Pu+
+jeZtkWrae+3J1hCoDQiOAOHfaBBDLso57k3jtlZWV9ZMDSG2zZ8+WYRjatOnE1zVPTEwMWQcN7cwPxwSQw
0cqvC7nJ/ndh4tlWrbu/2iJnv0y3Rdr3LJ8r48FQAxKmrpepmXrTXtd2H3D5wYCyF+/
IoDAWwQQ506bAFJYWKisrKywq7y8/Ce/BKu2/fv3yzAMpaSknHAPz4DUj70HjgaQH6M0gPy/
DxbJtGzNXLfL61IAoF69NS1LpmXrtW/
CB5Bhc3JkWrZenJARocqA0Aggzp02AeRkVb8JPS3t6I2OZsyYUeeb0GtbtGiRDMNQRsbJ/
6Ckod1RfODHYAApPxydAeT/Dl0o07I1O4sAAiC2/T0lEEASp6wNu2/o7I0yLVsJ/
yaAwFvMa84RQEK47bbbdN111yk1NVWLFi1Shw4dalyGd9u2bbryyiuVmpoqSdq0aZNef/
11paWlKS8vT1OmTNFll12mrl27ntLXpaHdUXzwaAApO3zE63J+kjveXyDTsjUvu9DrUgCgXr07Y4NMy9Yrk
9aE3ff+d4EA8tLEzAhVBoTGvOYcASSEoqIi9ezZU02aNFGzZs306KOP1rgRYV5engzD0Ny5cyVJW7duVdeu
XdWyZUvFxcWpffv2euGFF7gPiEdKDh0NIId+jM4Acus/5su0bC3K2eN1KQBQr/
4xK1umZevlOoLFye4D6hvzmnMEEB+hod2xLwYCSPd358m0bC3d/
L3XpQBAvap+ZqOul1a9OzP7pJ4pAeob85pzBBAfoaHdUVp2OBhADpZHZwD59eC5Mi1bK/
KKvC4FAOpV9ZvLX5gQ/upW71S9VOvVyQQQeIt5zTl68LhhAAAVX0lEQVQCiI/
Q0O7Yf0wAOVB+2OtyfpJfvT1bpmVrZf4PXpcCAPWq+vK6dd3fY3DKhpN6szpQ35jXnCOA+AgN7Y4D5UcDyP
6y6AwgN70VCCAZBXu9LgUA6tWI+YEA8kwddzh/e/rJXa4XqG/
Ma84RQHyEhnbHwfIjwQBSGqUBpHPSLJmWrbXbi70uBQDq1ccLNsu0bD31xaqw+6rvF/
LGtwQQeIt5zTkCiI/Q0O449OPRALLv0I9el/OT/
OKNmTItWxt27vO6FACoV58sypVp2eo7bmXYfQOr7pieNHV9hCoDQmNec44A4iM0tDtiIYB0em2GTMtWzu7S
ujcDQBT7dHGeTMvWn8emhd33pr1OpmVr4DQCCLzFvOYcAcRHaGh3lB0+GkBKojSAdExMkWnZyt2z3+tSAKB
ejVm6RaZl6/ExK8Lue/
3bQAAZND0rQpUBoTGvOUcA8REa2h3lhyuCAaT4YHQGkKsGTJdp2dpadMDrUgCgXo1bli/
TsvXHT8MHkL99s1amZettAgg8xrzmHAHER2hod/x45JgAciA6A0iH/tNkWra27z3odSkAUK/
GLw8EkEdHLw+7L3FKIIAMTtkQocqA0JjXnCOA+AgN7Y7DxwSQvQfKvS7nJ7nspakyLVu7Sw55XQoA1KuvVm
yVadl6ZFRq2H2vTl4j07L17gwCCLzFvOYcAcRHaGh3HBtAftgffQGksrIyWP+e0jKvywGAevXvlQUyLVsPj
1wWdt8rkwIBZMjM7AhVBoTGvOYcAcRHaGh3HKk4OsAXRWEAObb+aH0GBwBO1qRV22Rath78eGnYfS9PzJRp
2Xpv1sYIVQaExrzmHAHER2hod1QcM8B/H4XPIBx7Fa9ovYwwAJysKau3y7RsPTBiSdh9Cf8OBJB/
fkcAgbeY15wjgPgIDe2OaH8J04Hyw8H6D5Yf8bocAKhXdsYOmZat+z4MH0CsrzNkWraGzcmJUGVAaMxrzhF
AfISGdk/1AF+4L/
oCSMmhH4P1lx+u8LocAKhX09cEAsi9wxeH3ffChNUyLVsfzCWAwFvMa84RQHyEhnZP9QC/e1/0XUXqh/
3lwfqPVFR6XQ4A1KsZa3fKtGzdPWxR2H3PfxUIIB/
O2xShyoDQmNecI4D4CA3tnksT7Ki9jO2e0rJgAKmsJIAAiG3frd8l07LVY+jCsPue/
TJdpmXrIwIIPMa85hwBxEdoaPe0qwogu6IwgOwqOSTTsnX5S1O9LgUA6t2crN0yLVt3/nNB2H3PjA8EkH/
N3xyhyoDQmNecI4D4CA3tnuob+e0sjr4Asm3vQZmWrSv6T/O6FACod/
OyC2Vatm57L3wA6Ze8SqZl6+MFBBB4i3nNOQKIj9DQ7rm8KoDsKD7odSmnLP/
7AzItW1cNmO51KQBQ7xZu3CPTsnXLkPlh9z31RSCAjFqYG6HKgNCY15wjgPgIDe2e9i8HAsj2vdEXQHL37J
dp2eqYmOJ1KQBQ7xZvCgSQ7u/
OC7uv77iVMi1boxcRQOAt5jXnCCA+QkO7p8PL02RatrZFYQDJ2b1PpmXr2tdmeF0KANS7ZZu/
l2nZ+s3guWH3PTk2EEA+W5IXkbqAE2Fec44A4iM0tHs69A8EkIIfDnhdyinL2lki07L1izdmeV0KANS7FXl
FMi1b3f4+J+y+Pp+nybRsjVm6JUKVAaExrzlHAPERGto9V1QFkK1F0RdA1mwrlmnZ+u+k77wuBQDqXdqWH2
Ratn719uyw+x4fs0KmZWvsMgIIvMW85hwBxEdoaPdc+Ur0BpDVW/fKtGzd9Fb4X8YAEAvST/
Jn3p8+CwSQL1LzI1QZEBrzmnMEEB+hod3zs1emR20AWZkf+Gvg/7wd/uUIABALMgsCz/pe/
WqK3pmx4YTr14PnyrRsJRNA4DHmNecIID5CQ7vnqgGBAJL/ffQFkOVVr4eu6w2ZABALqq/
8d7Lrm9XbvS4ZpznmNecIID5CQ7unOoBs+X6/16WcsiWbAleEubmOS1ICQKz4fOkWJU5ZW+caOnujDpYf8b
pcnOaY15wjgPgIDe2e/6wKIHl7oi+AVN+U69Z/
hL8pFwAAiDzmNecIID5CQ7vn6ldTZFq2cqMwgMzLLpRp2brj/
QVelwIAAGphXnOOAOIjNLR7OlYFkM2FpV6XcspmZ+2SadnqMXSh16UAAIBamNecI4D4CA3tno6JgQCyKQoD
yIy1O2Vatu75YJHXpQAAgFqY15wjgPgIDe2ea6oCSM7u6Asg0zJ3yLRs3ffhEq9LAQAAtTCvOUcA8REa2j0
//9uMqgCyz+tSTtk3q7fLtGw9MIIAAgCA3zCvOUcA8REa2j2dXgsEkI27oi+ATE7fJtOy9dDHy7wuBQAA1M
K85hwBxEdoaPdcWxVAsqMwgHydViDTsvXIqFSvSwEAALUwrzlHAPERGto9170+U6Zla8PO6AsgXy7fKtOy1
Xv0cq9LAQAAtTCvOUcA8REa2j3/VRVAsnZG31mOW5Yv07L12GcrvC4FAADUwrzmHAHER2ho9/
zijUAAWb8j+s5yzJI8mZatPp+neV0KAACohXnNOQJICG++
+aa6dOmis88+W82bNz+pz6msrNSAAQPUpk0bNW7cWN27d9fGjRtP6evS0O75xRuzZFq21m2PvrMcvShXpmW
r77iVXpcCAABqYV5zjgASwquvvqohQ4boueeeO+kAMmjQIDVv3lyTJ09WRkaGevTooXbt2unQoUMn/
XVpaPdc/2YggKzdXux1Kafs4wWbZVq2+iWv8roUAABQC/
OacwSQMEaPHn1SAaSyslJt2rTR4MGDg48VFxcrLi5OycnJJ/
31aGj33FAVQNK2FOlA+eGoWkNnb5Rp2Xruy9VeHyMAAKiFec05AkgYJxtANm/
eLMMwlJ6eXuPxrl276umnnz7h55WVlamkpCS4CgoKaGiXdE4KBJBoXi9MIIAAAOA3BBDnCCBhnGwAWbx4sQ
zD0I4dO2o8ft999+n+++8/4eclJibKMIzjFg3t3F+/
Wu15gHCyLn9pqiat2ub1MQIAgFoIIM6dNgHEsqyQw/6xKysrq8bn1HcA4RmQ+nWw/
IjnL6f6qavs8BGvjw8AAIRAAHHutAkghYWFysrKCrvKy8trfE59vwSrNhoaAADA35jXnDttAshPcapvQn/
nnXeCj5WUlPAmdAAAgBjDvOYcASSE/
Px8paen67XXXlOTJk2Unp6u9PR0lZaWBvdceeWVmjhxYvDfgwYNUosWLTRlyhRlZmbq7rvv5jK8AAAAMYZ5
zTkCSAi9evUK+R6RuXPnBvcYhqHRo0cH/119I8ILL7xQcXFx6t69u7Kzs0/p69LQAAAA/
sa85hwBxEdoaAAAAH9jXnOOAOIjNDQAAIC/Ma85RwDxERoaAADA35jXnCOA+AgNDQAA4G/
Ma84RQHyEhgYAAPA35jXnCCA+QkMDAAD4G/OacwQQH6GhAQAA/
I15zTkCiI8UFxfLMAwVFBSopKSExWKxWCwWi+WzVVBQIMMwVFxc7PXoGLUIID5S3dAsFovFYrFYLH+vzZs3
ez06Ri0CiI9UVFSooKBAxcXFnqf7YxM+z8hwRpwRZ+T14ow4I86IM/
LL2rp1qwzD0N69e70eHaMWAQQnVFLCaxzrwhnVjTOqG2dUN86obpxR3TijunFGdeOMnCOA4IT4H6xunFHdO
KO6cUZ144zqxhnVjTOqG2dUN87IOQIIToj/
werGGdWNM6obZ1Q3zqhunFHdOKO6cUZ144ycI4DghMrKypSYmKiysjKvS/
EtzqhunFHdOKO6cUZ144zqxhnVjTOqG2fkHAEEAAAAQMQQQAAAAABEDAEEAAAAQMQQQAAAAABEDAEEAAAAQ
MQQQHBCw4YNk2maiouLU+fOnZWamup1SREzf/
583XXXXbroootkGIYmTZpU4+OVlZUaMGCA2rRpo8aNG6t79+7auHFjjT1FRUV68MEH1bRpUzVv3ly9e/
dWaWlpJL+NejNw4EBdf/31atKkiVq3bq27775bGzZsqLHn0KFDevLJJ9WyZUude+65uvfee7Vr164ae/
Lz83XHHXfo7LPPVuvWrfXXv/
5Vhw8fjuS3Um+GDx+ua665Rk2bNlXTpk114403atq0acGPn+7nE8pbb70lwzDUr1+/
4GOn+zklJibKMIwa68orrwx+/HQ/n2rbtm3TQw89pJYtW6px48bq2LGjVqxYEfz46f4z2zTN4/
rIMAw9+eSTkugjSTpy5IheeeUVXXrppWrcuLEuu+wyvf7666qsrAzuOd37yE0EEIQ0fvx4NWrUSJ988onWr
Vunxx57TC1atNDu3bu9Li0ipk2bpv79+2vixIkhA8igQYPUvHlzTZ48WRkZGerRo4fatWunQ4cOBffcdttt
6tSpk5YtW6aFCxeqffv26tmzZ6S/lXpx6623avTo0Vq7dq1Wr16tO+64Q/Hx8dq/f39wT58+ffQf//
Efmj17ttLS0nTjjTfqpptuCn78yJEj6tixo26+
+Walp6dr2rRpatWqlV566SUvviXXffPNN5o6dao2btyo7OxsvfzyyzrrrLO0du1aSZxPbcuXL9ell16qn//
85zUCyOl+TomJibr66qu1c+fO4NqzZ0/w46f7+UjSDz/8INM09Yc//
EGpqanKzc3VjBkztGnTpuCe0/1ndmFhYY0emjVrlgzD0Ny5cyXRR5KUlJSk888/
X7ZtKy8vTxMmTFCTJk30/vvvB/ec7n3kJgIIQurcubP69u0b/
HdFRYUuvvhivfXWWx5W5Y3aAaSyslJt2rTR4MGDg48VFxcrLi5OycnJkqT169fLMIwaf4GbPn26GjRooO3b
t0eu+AgpLCyUYRiaP3+
+pMB5nHXWWZowYUJwT1ZWlgzD0NKlSyUFQt4ZZ5xR469sH374oZo1a6by8vLIfgMRct5552nkyJGcTy2lpa
Xq0KGDZs2apW7dugUDCOcUCCCdOnUK+THOJ8CyLP3qV7864cf5mX28fv366fLLL1dlZSV9VOXOO+9U7969a
zx277336qGHHpJEH7mNAILjlJeXq2HDhsf91f+RRx5Rjx49PKrKO7UDyObNm2UYhtLT02vs69q1q55+
+mlJ0qhRo9SiRYsaHz98+LAaNmyoiRMn1n/
REZaTkyPDMLRmzRpJ0uzZs2UYhvbu3VtjX3x8vIYMGSJJGjBgwHGDVW5urgzD0KpVqyJTeIQcOXJEycnJat
SokdatW8f51PLII4/
omWeekaQaAYRzCgSQc845RxdddJHatWunBx98UPn5+ZI4n2pXXXWVnnnmGf3ud79T69atde211+pf//
pX8OP8zK6pvLxc559/
vpKSkiTRR9WSkpJkmqays7MlSatXr9YFF1ygsWPHSqKP3EYAwXG2b98uwzC0ZMmSGo+/
8MIL6ty5s0dVead2AFm8eLEMw9COHTtq7Lvvvvt0//33Swr8ILviiiuO+2+1bt1aw4cPr9+CI6yiokJ33nm
nfvnLXwYfGzdunBo1anTc3htuuEEvvviiJOmxxx7TLbfcUuPjBw4ckGEYNd4rEc0yMzN17rnnqmHDhmrevL
mmTp0qifM5VnJysjp27Bh8CcOxAYRzCvzl+auvvlJGRoZSUlLUpUsXxcfHa9+
+fZxPlbi4OMXFxemll17SqlWrNGLECDVu3FiffvqpJH5m1/bll1+qYcOGwb/
I00cBFRUVsixLDRo00JlnnqkGDRpo4MCBwY/
TR+4igOA4BJCaCCDh9enTR6ZpqqCgIPgYv9ACysvLlZOTo7S0NCUkJKhVq1Zat24d51Nl69atuuCCC5SRkR
F8jAAS3t69e9WsWTONHDmS86ly1llnqUuXLjUee+qpp3TjjTdK4md2bbfccovuuuuu4L/
po4Dk5GRdcsklSk5OVmZmpsaMGaOWLVsSZOsJAQTH4SVYNfESrBPr27evLrnkEuXm5tZ4nKf0Q+vevbsef/
xxzqfKpEmTZBiGGjZsGFyGYahBgwZq2LChvvvuO84phOuvv14JCQn0UZX4+Hj98Y9/
rPHY8OHDdfHFF0viZ/axtmzZojPOOEOTJ08OPkYfBVxyySUaNmxYjcfeeOON4FXn6CN3EUAQUufOnfWXv/
wl+O+Kigq1bduWN6Hr6BvR3nnnneBjJSUlId+IlpaWFtwzY8aMmHkjWmVlpfr27auLL774uEsQSkffHPv11
18HH9uwYUPINzUee2W1ESNGqFmzZiorK6v/b8IDv/nNb9SrVy/Op8q+ffu0Zs2aGuv666/Xww8/
rDVr1nBOIZSWluq8887T+++/z/lU6dmz53FvQn/mmWeCz4rwM/
uoxMREtWnTpsblc+mjgJYtWx73LMXAgQPVoUMHSfSR2wggCGn8+PGKi4vTp59+qvXr1+vxxx9XixYtjrsue
KwqLS1Venq60tPTZRiGhgwZovT09OCbPwcNGqQWLVpoypQpyszM1N133x3yUnzXXXedUlNTtWjRInXo0CFm
LsX35z//
Wc2bN9e8efNqXNrx4MGDwT19+vRRfHy85syZo7S0NHXp0qXGyySqL+t4yy23aPXq1UpJSVHr1q1j5rKOCQk
Jmj9/
vvLy8pSZmamEhAQ1aNBAM2fOlMT5nMixL8GSOKfnn39e8+bNU15enhYvXqybb75ZrVq1UmFhoSTORwpcwvn
MM89UUlKScnJyNG7cOJ1zzjnBNw9L/MyWAn9IjI+Pl2VZx32MPpJ69eqltm3bBi/
DO3HiRLVq1Sr4MjSJPnITAQQnNHToUMXHx6tRo0bq3Lmzli1b5nVJETN37tyQN23q1auXpKM3I7rwwgsVFx
en7t27B6+cUa2oqEg9e/
ZUkyZN1KxZMz366KMxczOiUGdjGIZGjx4d3FN9Y6vzzjtP55xzju655x7t3Lmzxn9ny5Ytuv3223X22WerV
atWev7552Pmxla9e/
eWaZpq1KiRWrdure7duwfDh8T5nEjtAHK6n9MDDzygiy66SI0aNVLbtm31wAMP1Li/xel+PtW+/
fZbdezYUXFxcfrZz35W4ypYEj+zpcBf4g3DOO77lugjKfCMbL9+/RQfHx+8EWH//
v1rXGaYPnIPAQQAAABAxBBAAAAAAEQMAQQAAAB
AxBBAAAAAAEQMAQQAAABAxBBAAAAAAEQMAQQAAABAxBBAAAAAAEQMAQQAAABAxBBAAAAAAEQMAQQAAABAxB
BAAAAAAEQMAQQAAABAxBBAAAAAAEQMAQQAAABAxBBAAAAAAEQMAQQAAABAxBBAAAAAAEQMAQQAAABAxBBAA
AAAAEQMAQQAAABAxBBAAAAAAEQMAQQAAABAxPwv2LeUvFtTuYsAAAAASUVORK5CYII=\"
width=\"800\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"IR = np.zeros([200])\n",
"IR[0] = 1;\n",
"IR[130] = 1/2;\n",
"IR[180] = 1/3;\n",
"\n",
"plt.figure()\n",
"plt.plot(IR)\n",
"plt.title(\"Réponse impulsionnelle du canal\")\n",
"plt.xlim(XLIMS)\n",
"\n",
"\n",
"sigma = 1\n",
"\n",
"sig_ir = si.convolve(sig,IR)\n",
"plt.figure()\n",
"plt.plot(sig_ir)\n",
"plt.xlim(XLIMS)\n",
"\n",
"\n",
"plt.title(\"Signal reçu, canal non idéal, sans bruit\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On décode le signal. Les amplitudes des réflexions sont assez faibles pour que
la condition de la question 3 soit respectée. Le décodage est possible."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"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 = $('<div/>');\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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all '
+\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\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 = $('<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 = $('<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 = $('<canvas/>');\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 = $('<div/>');\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 = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all
' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\
n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt ===
mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then
trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\
n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id:
this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format =
format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\
n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL ||
window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21)
== \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message
type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \",
msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type +
\"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-
in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from
http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the
document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-
home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-
arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-
right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan
axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"],
[\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"],
[\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-
save\", \"download\"]];\n",
"\n",
"mpl.extensions =
[\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm)
{\n",
" // Create a \"websocket\"-like object which calls the given IPython
comm\n",
" // object with the appropriate methods. Currently this is a non binary\
n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage
function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a
real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id +
\"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in
FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' +
width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\"
width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\"
title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></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 = $('<span class=\"mpl-message\" style=\"text-
align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline
pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\"
title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove
icon-large\"></i></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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 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"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img
src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAGQCAYAAABWJQQ0AAAgAElEQVR
4nOzdd3xT5eIG8NO9aFq0bLBQlI2ULcs6UEAEVFD84agiegVEUC/jotLi4IpeUhAKMmQroALOggEsW/
amcFpKF7SFDkqhO8nz+yPkSJqkTZsmOWmf7+dzPsrJyTlvTl/K+
+S8QwAREREREZGdCI4uABERERER1R0MIEREREREZDcMIEREREREZDcMIEREREREZDcMIEREREREZDcMIERE
REREZDcMIEREREREZDcMIEREREREZDcMIEREREREZDcMIEREREREZDcMIEREREREZDcMIEREREREZDcMIER
EREREZDcMIEREREREZDcMIEREREREZDcMIEREREREZDcMIEREREREZDcMIEREREREZDcMIEREREREZDcMIE
REREREZDcMIEREREREZDcMIEREREREZDcMIEREREREZDcMIEREREREZDcMIERk0p49ezB79mzk5eU5uihER
ERUizCAEJGR5ORk1K9fH0ql0ui1sLAwhIWF1ej1IiIiIAj8dWRL4eHhCA4OdnQxJMHBwQgPD3d0MWTv1q1b
eOONN9CoUSMIgoDJkyc7ukg2JbffBbb4fUdEDCBEDnfp0iW89dZbaNWqFby8vODv74++ffti/
vz5KCwstHt5SktL0bt3b7z33nsmX6/uP8gFBQWIiIhAbGys0Wtya3RY4/
z584iIiEBSUpKji2KAAUQeoqOjsWrVKouP/89//
gM3NzdERkZi3bp1OHbsmO0KJwOmfhcEBwcjIiLCIeVhACGyjdrxLz6Rk/r999/
h4+ODwMBAvPvuu1i2bBkWLVqEF198ER4eHnjzzTftXqaTJ08iKioKWq3W5OvV/
Qc5KysLgiCYbEiUlZWhqKioyueUox9//
BGCIJgMWo5UWlqK4uJiRxdDUlcDSMeOHav096d3797o16+f7QokMwwgRHUDAwiRg1y+fBn16tVDu3btkJ6e
bvR6QkIC5s+fb/V1tFqt2ScpGo2myg1/
WwSQ2qQqAaSin01tV90AUlZWhpKSkpovkJ1UNYC0atUKQ4cOrbHry/
3+MYAQ1Q0MIEQO8vbbb0MQBBw4cMCi48vKyvDJJ58gJCQEnp6eCA4Oxn/+8x+jb7WDg4MxdOhQbN+
+Hd27d4eXlxeioqIAAIIgYOLEiVi/fj06dOgAd3d3bN26FYAujERFRaFDhw7w8vJCw4YN8dZbbyE3N9fg/
OX/QS4pKcHHH3+Mbt26QaFQwNfXF/3798dff/
0lHZOUlARBEIw2faPCVKOjqp9337596NmzJ7y8vNCqVSusWbPGovtq6ee25DqrVq0y+Tn1YaSinw0ArFu3D
t26dYO3tzfq16+P0aNHIzU1tdLPkJ+fj8mTJyM4OBienp5o0KABBg4ciOPHj0vHmOqClZ2djZdffhn+/
v4ICAjAq6++ilOnTkEQBINuQuHh4fDz88OVK1cwYsQI+Pn5ISgoCB988AHUarXBOb/
66iv06dMH99xzD7y9vdGtWzf8+OOPRmW2JIDo681XX32FqKgohISEwNXVFSdPngQAFBcXY9asWWjdujU8PT
3RvHlzTJ061eSTnnXr1qFnz57SE8cBAwbgzz//
lF43F44tDUqW1KPg4GCjumGucRsbG2uyLum79l27dg1jx45Fw4YN4eXlhQcffBCrV6+2+P7pz79p0yZERka
iadOmqFevHkaOHIm8vDwUFxdj8uTJaNCgAfz8/PDaa6+Zva/VqbMAsG/
fPvTo0QNeXl4ICQnBN998Y3EASUxMxKhRo1C/fn34+Pigd+/
e+P33303ew02bNuGzzz5Ds2bN4OXlhcceewwJCQlG5Vm6dClCQkLg7e2Nnj17Yu/
evSYDSFXqHRGZxgBC5CDNmjVDSEiIxceHh4dDEASMGjUK0dHRePXVVyEIAp555hmD44KDg3H//
fejfv36mDFjBr755hupASwIAtq3b48GDRpg9uzZiI6Olhpz48aNg7u7O95880188803mD59Ovz8/
NCzZ0+UlpZK5y//D3JWVhaaNGmC999/
H0uWLMGXX36Jtm3bwsPDQzr37du3sWTJEgiCgGeffRbr1q3DunXrcPr0aQCmA0hVPm/
btm3RqFEjzJw5E4sWLUK3bt3g4uKCc+fOVXpfLf3cllwnMTER7777LgRBwMyZM6XPmZmZWenP5rPPPoOLiw
tGjx6NxYsXY/bs2QgKCkLLli1x48aNCj/
DmDFj4Onpiffffx8rVqzA3LlzMWzYMKxfv97gft4dQDQaDfr06QM3Nze88847WLRoEZ544gl06dLFZADx9v
ZGx44dMXbsWCxZsgQjR46EIAhYvHixQVmaN2+OCRMmYNGiRVAqlejVqxcEQTBqHFYlgHTo0AEhISH44osvE
BUVhZSUFGg0Gjz55JPw9fXFlClTsHTpUrzzzjtwd3fHiBEjDM4TGRkJQRDQt29ffPXVV1iwYAHGjBmD6dOn
S8dYG0AsqUdbt25F8+bN0a5dO6luqFQqk+fLzMzEunXrEBQUhNDQUOn427dvo7CwEO3bt4eHhwfee+89fP3
11xgwYAAEQTB4alrR/dM3zkNDQ9GnTx98/
fXXePfdd+Hi4oIXX3wRY8aMwZAhQxAdHY1XXnkFgiBg9uzZBmW0ps6eOXMGPj4+uO+++/Df//
4Xn376KRo1aoQHH3yw0gCSmZmJRo0awd/fHx9++CGUSiW6dOkCV1dXbNmyRTpO/
xm7du2K7t27IyoqCpGRkfD19UWvXr0MrrFixQqpjnz99deYMmUKAgMDERISYvD7rir1jojMYwAhcoCbN29C
EASL/8HSfys9btw4g/3//ve/IQiCwdMG/bes27dvNzqPIAhwdXXF+fPnDfbv27cPgiDgu+++M9i/fft2o/
3lA4harTbq0nHjxg00atQIY8eOlfZV1AWrfACpzufdu3evtO/
69evw8vLCBx98YHSt6n5uS69TURcscz+b5ORkuLm54fPPPzfYf/
bsWbi7uxvtLy8gIAATJ06s8JjyAWTz5s1GDVaNRoPHHnvMZAARBAGffPKJwTn1Dbu7le9SVlpaik6dOuGxx
x4z2F+VAKJQKHD9+nWD19atWwdXV1fs27fPYP8333xj8GQxISEBrq6uePbZZ6HRaAyOvXuckzUBpCr1qKpd
sPRPze42f/58CIJgEDBLS0vRp08f1KtXD/n5+QAqvn/6xnmnTp0Mgvb//d//
wcXFBUOGDDE4vk+fPgb1x9o6+8wzz8Db2xspKSnSvri4OLi5uVU6IcWUKVMgCILBz/
7WrVto1aoVWrZsKf2c9Z+xffv2Br+jFixYAEEQcPbsWQC6e9ewYUOEhoYaHLds2TKjp1SW1jsiqhgDCJEDp
KWlQRAEvPzyyxYdP2fOHAiCgLi4OIP9GRkZEATBoAEcHByMVq1amTyPIAh49NFHjfa/+
+67CAgIwPXr15GVlWWw1atXzyAIVNQnWqPRICcnB1lZWRg6dChCQ0Ol16oSQKr6eTt06GB0zgcffBDPPvus
yXJW53Nbep3KAoipn41SqYSLiwsSEhKMytG+fXsMHDiwws8RHByMHj164OrVq2aPKR9A3nzzTXh4eKCgoMD
gOH0wMRVAyjdi3333XdSvX9/sNXNzc5GVlYXx48cjMDDQqMyWBpDXX3/
d6LXhw4ejY8eORvcrPj4egiDgs88+A6DrEiYIgvQ0zhxrAkhV6lFNBJAnn3wSjRs3NgpUGzZsgCAI+O233w
BUfP/0jfMvv/zSYL8+3JTvNjdlyhS4urqirKwMgHV1Vq1Ww8fHBy++
+KLRa0899VSlAaRNmzZGTzAA4L///
a9BsDD3GU+cOAFBEPDLL78AAA4ePAhBEPDNN98YHFdaWoqAgACDn5el9Y6IKsYAQuQAVX0C8q9//
Quurq4G31TqBQYGYtSoUdKfg4ODjb5t1hMEweCphN6QIUNM9jfXb8OHD5eONRVAVq9ejc6dO8PDw8PgfXc3
tqsSQKr6eQcPHmx0XFhYGB555BGT96E6n9vS61QWQEz9bMaPH19hOR588MEKP8emTZvg7e0NV1dX9OzZExE
REUhMTDQ4pnwAefLJJ3HfffcZnev06dNmu2CVZ6rr3G+//
YbevXvDy8vL4DO4uLgY3QtLA0j5Jy8A0L59+wrv2bvvvgtAN9bK1dW10oHX1gSQqtSjmgggbdu2xYABA4yO
1T85XLRoEYCK75++cb5x40aD/fpxTIcOHTLYr/9ZZ2dnA7Cuzuq/
SPj444+NXnvvvfcqDSBeXl545ZVXjPb//PPPEIR/
uvuZ+4z6+6IfM6MPbrt27TI6Z9euXQ1+XpbWOyKqGAMIkYM0bdoUrVu3tuhYfYNc/
+3j3Uw1yM3NmiMIgsmuOoMGDULDhg2xY8cOk9upU6ekY8sHkHXr1kEQdGMz1q5di+3bt2PHjh147LHHDBq8
1Qkg1nxeS2avqcrntvQ6lQUQU+f417/+BRcXF+neld/+/
vvvCj8HAKSnpyM6OhojRoyAr68vvL29ERMTI71ubQDx8/
MzOrb8z23v3r1wcXFBWFgYvv32W8TExGDHjh0YM2aMUaOyqoPQy2vbti06d+5s9md38eJFANYHkObNm1daz
qrUI0cEEFP3T984L/+kQx9Ajh49arBf/
7POysoCYF2dtXcAKf8Z9fdFX8erEkAsrXdEVDEGECIHeeuttyAIAg4ePFjpsea6JGVmZprsklTVADJhwgS4
ublZNCVs+Qb3iBEjEBISYrRuSN++fQ0avNnZ2VZ3warK57UkgFTlc1t6nZ9+
+qnKAeTLL7+EIAgQRbHSclji2rVraNasmcH6EdZ2wbIkgEyePBk+Pj5GswHZIoA89dRTaNasmdn1avQs7YJ
Vv359o1XGS0pK4ObmVmk5q1KPOnXqZLMuWBs3bjTZBcsWAcSaOmurLlhffPGFyS5YlQWQirpgBQYGGvy8LK
13RFQxBhAiB7l06RL8/PzQoUMHaZak8q/rBwjrv9l86623DI6ZNm0aBMF4UHZVA8ju3bshCAL+85//
GL1WVlZmMKNN+Qb3c889h5CQEIPG0KFDh+Di4mLQ4C0sLIQgCEaNPMD8IHRrPq8lAaQqn9vS62zbtg2CIEj
TG9/N3DkuXboENzc3jBkzxqhho9VqpW4vpqjVauTl5Rnt79mzJ3r06CH9uXwA0QclSwehWxJA3n//
ffj6+hqEmqSkJPj6+tZ4AFm9ejUEQcDSpUuNXissLMTt27cBWD4IvUePHujatavB6wsXLoQgCJWWsyr1qHf
v3ujSpUuF57tbRYPQv//+e4Pr9OvXz+QgdFsEEGvqLFAzg9Dv/
vLm9u3bCAkJMTkIvbIAUlpaigYNGlg0CN3SekdEFWMAIXKgX375RZo/f/
LkyVi+fDmio6Px0ksvwdPT06ABrh8I/
MILLyA6Olr6s6lpaasaQABdlwpBEDBkyBBERUVh0aJFmDx5Mpo2bWrwD3j5BvfKlSulfu5Lly7FjBkzEBgY
iI4dOxo0eAGgQ4cOaNy4MaKjo7Fhwwbpm8qKpuGt7ue1dAExSz+3pdfJyMiAm5sbHnroIaxevRobNmzAtWv
XKjwH8M8A2r59++LLL7/
EkiVLMG3aNDzwwAMmG5B6N27cgJ+fH8LDw6FUKrFs2TK88MILEAQB8+bNk44rH0DUajV69eplMA3vk08+id
DQUIP+8fr3WhJAdu3aBUEQMGDAACxZsgSzZ89Gw4YNzU6tak0A0Wg0eOqpp6RpYxcuXIj58+fj7bffxj333
GPQgP7444+le/u///
0PCxcuxKuvvooZM2ZIx+hnMXruueewZMkSvP3222jVqhWCgoIsmobX0no0YcIEuLi44NNPP8WGDRtMdvspf
5/K1xn9NLyenp744IMPsHDhQoSFhRkFSlsGEKD6dRbQdfXz9vbGfffdhy++
+AKfffaZ2Wl4y9NPwxsQEICPP/4YUVFRCA0NhYuLi8lpeCsLIIBuDRBBENCvXz98/
fXXeO+998xOw2tpvSMi8xhAiBwsPj4eb775Jlq2bAlPT0/4+/
ujX79+WLhwoUFXlrKyMsyePRutWrWCh4cHWrRoUeHCfKZUFEAA3Td+3bt3h4+PD/z9/
dG5c2dMmzbNYKX28g1urVaLOXPmIDg4GF5eXujatSt+//
13kwvfHTx4EN27d4enp6dBdyxzCxFa83mrsoKxJZ+7KtdZvnw5QkJCpG9zyy9EaM7mzZvRv39/+Pn5wc/
PD+3atcPEiRMr7OZSUlKCqVOnokuXLvD394efnx+6dOlitD6HqZ9HVlYWxowZIy1E+Nprr+HAgQNGA3ctDS
AA8O233+KBBx6Al5cX2rVrh1WrVpldXM6aAALovrmeO3cuOnbsCC8vL9SvXx/
du3fH7NmzcfPmTYNjV65cia5du0qDhcPCwrBjxw7pdY1Gg+nTpyMoKAi+vr4YNGgQLl26ZFE59SypR5mZmR
g6dCj8/f2Nvl03xVyduXbtGl5//
XUEBQXB09MTnTt3NmhQA7YPIED16qzenj17pN8HFS1EaIp+IcLAwEB4e3ujV69eZhcitCSAAMDixYvRqlUr
eHl5oUePHmYXIqxKvSMi0xhAiIhIsnXrVgiCgP379zu6KDaRlJSE+++/
v9JB6UREZDsMIEREdVT5QdNqtRqPPfYYFAqFRQOqnVVoaGilXZ+IiMh2GECIiOqoN954A2PGjMHChQvxv//
9D3379oUgCJgzZ46ji2YTERERWLhwIfz8/
KRF6IiIyP4YQIiI6qjvvvsO3bp1g0KhgKenJzp06ICFCxc6ulg2o+/
fP3jwYKOxREREZD8MICbMmTMHPXr0QL169dCgQQOMGDHCosWFfvjhB7Rt2xZeXl7o1KkT/
vjjDzuUloiIiIjIeTCAmDBo0CCsWrUK586dw6lTp/DUU0/
hvvvuq3B+7wMHDsDNzQ1ffvkl4uLi8NFHH8HDw0OaZpSIiIiIiBhALHL9+nUIgoA9e/
aYPeaFF14wmiqxd+/e+Ne//
mXr4hEREREROQ0GEAskJCRAEIQKn2a0aNECUVFRBvtmzZqFBx980Ox7iouLcfPmTWm7ceMGEhMTkZeXZ7Cf
Gzdu3Lhx48aNmzy2vLw8pKWlQaPR1Fhbs65hAKmERqPB0KFD0a9fvwqP8/
DwwPfff2+wLzo6Gg0bNjT7Hv2CS9y4cePGjRs3btyca0tLS6uRtmZdxABSibfffhvBwcGVVrLqBJDyT0BSU
1OlCu3odM+NGzdu3Lhx48bNeEtLS4MgCMjLy6uRtmZdxABSgYkTJ6J58+a4fPlypcdWpwtWeTdv3oQgCLh5
82aVy0pEREREtsf2mvUYQEzQarWYOHEimjZtivj4eIve88ILL+Dpp5822NenT58qDUJnhSYiIiKSN7bXrMc
AYsL48eMREBCA3bt3IyMjQ9oKCwulY1555RXMmDFD+vOBAwfg7u6O//
3vf7hw4QIiIiKqPA0vKzQRERGRvLG9Zj0GEBPMDTZatWqVdExYWBjCw8MN3vfDDz+gTZs28PT0RMeOHau8E
CErNBEREZG8sb1mPQYQGWGFJiIiuVKr1SgqKuLGrdZvarW6wr8LbK9ZjwFERlihiYhIbrRaLdLT0xEXF8eN
W53Z0tPTodVqTf6dYHvNegwgMsIKTUREcqMPH9nZ2SgsLHT4t9PcuNlyKywsRHZ2thRCTGF7zXoMIDLCCk1
ERHKiVqul8EFUl+hDiKnuWGyvWY8BREZYoYmISE6KiooQFxdnMAskUV1QWFiIuLg4FBUVGb3G9pr1GEBkhB
WaiIjkRB9ATDXCiGqziuo+22vWYwCREVZoIiL5E0UgJgawcJ1ap8YAUn25ubmIjIw0O46A5I0BxLYYQGSEF
ZqISL5ycoBBgwBB+GcbNAjIzXV0yWyHAaR6tFothg0bhunTpxvsj4iIQJcuXaw+f02dh8xjALEtBhAZYYUm
IpKvQYMANzfDAOLmpttfWzl7AMnIyMA777yDVq1awdPTE82bN8fTTz+NnTt32vS6c+fOxUsvvWQ0jWt1goM
gCNi6davBvlu3bnFiABtjALEtBhAZYYUmIpInUfwndHg0uAnfdlfh4q6W9tXW7ljOHECSkpLQtGlTdOjQAT
/
99BNEUcS5c+cwb948tG3btlrnLCkpqdL+8moqgJDtMYDYFgOIjLBCExHJU0yMPoBo4d8zEQH9RHi3vC4FkJ
gYR5fQNpw5gAwZMgTNmjXD7du3jV67ceMGACAlJQXDhw+Hn58f/
P398fzzzyMzM1M6Th8Yli9fjpYtW8LFxQUAEBYWhokTJ2Ly5Mm499578cgjj0jnfeONNxAUFAR/
f388+uijOHXqlNH59I4cOYKBAwfi3nvvhUKhwMMPP4zjx49LrwcHB0MQBGkLDg42eR6NRoPZs2ejWbNm8PT
0RJcuXbBt2zbp9aSkJAiCgM2bN+ORRx6Bj48PHnzwQRw8eNCaW1yrMYDYFgOIjLBCExHJk/
4JiKt3CQL6iQjoJ0LxUIL0FKSuPAHRarUoKdM4ZDO3KrUpOTk5cHFxwZw5c8weo9FoEBoaiv79+
+PYsWM4dOgQunfvjrCwMOmYiIgI+Pn5YfDgwThx4gROnz4NQBdA6tWrh6lTp+LixYu4ePEiAGDgwIEYNmwY
jh49ivj4eHzwwQe49957kZOTI53v7uCwa9curFu3DhcuXEBcXBzeeOMNNGrUCPn5+QCA69evQxAErFq1Chk
ZGbh+/brJ8yiVSigUCmzYsAEXL17EtGnT4OHhgfg7FVMfQNq1a4fff/
8doihi1KhRCA4ORllZmcX3tS5hALEtBhAZYYUmIpKvQYMA7yZ5UgAJ6CfCt2VWnRoDUlKmgVIlOmQrKdNYX
O7Dhw9DEARs2bLF7DEqlQpubm5ITU2V9p0/
fx6CIODIkSMAdA19Dw8PqeGvFxYWhq5duxrs27dvHxQKBYqLiw32t27dGkuXLpXOV1EXLI1GA39/f/
z222/
SPlNdsMqfp2nTpvj8888NjunZsycmTJgA4J8AsmLFCqPPeuHCBbPlqcsYQGyLAURGWKGJiOQrNxfo+0IGAv
qJ8O+WhIB+Inq9lFSnZsFylgBy6NChSgPIggUL0LJlS6P9gYGBWLNmDQBdQ//++
+83OiYsLAzjxo0z2Ldo0SK4urrCz8/PYHN1dcW0adOk890dHDIzMzFu3Djcf//
9UCgU8PPzg4uLC6Kjo6VjKgsg+rbD7t27DY6ZMmUKHn30UQD/BBB9sAJ00wQLgoA9e/
aYvUd1GQOIbTGAyAgrNBGRvK3cfxkfbRSx7Ieb+GijrmFcUFJ7u7DU5i5YlgYQU08swsLCMHnyZIN9X3zxB
Zo1a4aEhASjLSsry+T5Bg0ahB49euCPP/
7AuXPnkJCQgKCgIERFRUnH1GQAOXnypPT6jRs3IAgCYmNjzd6juowBxLYYQGSEFZqISL7yi0qhVImI2iGiu
EyNtQeToFSJSLiW7+ii2YwzD0IfPHhwhYPQK+qCdfToUQBVCyD68yUlJZktU/
nz1atXD2vXrpX+nJqaCkEQDAKIh4cHfvrppwrPY64L1sSJEwEwgFQHA4htMYDICCs0EZF8XczIh1IlYv2hZ
ADArguZUKpExF685uCS2Y4zB5DExEQ0btxYmoY3Pj4ecXFxWLBgAdq1awetVovQ0FAMGDAAx48fx+HDh00O
Qrc0gGi1WvTv3x9dunTBn3/+iaSkJBw4cAAzZ840G2i6du2KJ554AnFxcTh06BAGDBgAHx8fgwDywAMPYPz
48cjIyEDunf5+5c8TFRUFhUKBjRs34uLFi5g+fbrJQegMIJZjALEtBhAZYYUmIpKv8oGjfCCpjZw5gABAen
o6Jk6ciODgYHh6eqJZs2YYPny41Oi2dBre8kwFEADIz8/
HpEmT0LRpU3h4eKBFixZ46aWXpKcs5c934sQJ9OjRA97e3njggQ
fw448/Ijg42CCA/Prrr7j//
vvh7u5e4TS8kZGRaNasGTw8PMxOw8sAYjkGENtiAJERVmgiIvkq3+XqVnGZ1CWrqFTt4NLZhrMHEKLqYgCx
LQYQGWGFJiKSp8IStTQb092DzlfuvwylSsTlLONxBrUBAwjVVQwgtsUAIiOs0ERE8pRw7RaUKhFrDiYZ7P/
zXAaUKhH74rMcUzAbYwChuooBxLYYQGSEFZqISJ52i9ehVInYGZdpsP/
c1TwoVSI2HklxUMlsiwGE6ioGENtiAJERVmgiInn67lAKlCoRFzIMfz/
nFeim5l2wMx6lassXynMWDCBUVzGA2BYDiIywQhMRyU9xmRrzd8RDqRJxs6jU4DWtVovlexOhVIlIzSlwUA
lthwGE6ioGENtiAJERVmgiIvlJzr4NpUrEt/sum3z9jzPpUKpE/
J2YbeeS2R4DCNVVDCC2xQAiI6zQRETycyAhC0qViG1nM0y+fir1BpQqET8dS7NzyWyPAYTqKgYQ22IAkRFW
aCIi+dl0NBVKlYizV/
JMvp51qxhKlYiFu+Kh1mjtXDrbYgCxjdzcXERGRiI9Pd3RRSEzGEBsiwFERlihiYjkpUytwYKduvEfubdLT
B6j1WqxZPclKFUi0vMK7VxC22IAqXlarRbDhg3D9OnTHV0U2YuNjYUgCLhx44bdr80AYlsMIDLCCk1EJC9p
uQVQqkQs3XMJWq35pxu/
nLoKpUrE0aQcO5bO9pw1gISHh0MQBAiCAHd3dzRs2BADBw7Et99+C43GsbOVzZ07Fy+99FKF9akmREREoEu
XLja9hq2VlJQgIyPD5vfKFAYQ22IAkRFWaCIieTmUmA2lSsTvpyvuKnMsORdKlYifT16xU8nso8YCSGYmEB
sLbNum+29mZmXvsEp4eDgGDx6MjIwMXLlyBcePH8fnn3+OevXqYciQISgrK6v8JE7O0gBSWlpa6TF1EQOIb
TGAyAgrNBGRvGw+ngalSsTJ1Iq7gGTeLIJSJSI6NgGaWjQOxOnWv5UAACAASURBVOoAkpMDLF0KjBsHPPcc
MHKk7r/jxun259jmiVF4eDhGjBhhtH/Xrl0QBAHLly+X9qWkpGD48OHw8/ODv78/nn/
+eWTeFZD0Dfm1a9ciODgYCoUCo0ePRn5+vnRMWFgYJk2ahKlTp6J+/
fpo1KgRIiIiDK5948YNvPHGGwgKCoK/
vz8effRRnDp1yuCYn3/+GV27doWXlxdatWqFyMhIKSxptVpERESgRYsW8PT0RJMmTTBp0iSTn3/
VqlXSEyD9tmrVKgCAIAhYvHgxhg0bBl9fX0RERECtVmPs2LFo2bIlvL290aZNG8yfP9/kPf3qq6/
QuHFj3HPPPZgwYYJBgImOjsb9998PLy8vNGzYECNHjjS4R+
+88w4mT56MwMBANGzYEMuWLcPt27fx2muvoV69emjdujViYmKk95TvgpWcnIynn34agYGB8PX1RYcOHfDHH
39Ix589exaDBw+Gn58fGjZsiJdffhlZWVnS6z/++CM6deoEb29v3HPPPXj88cdx+/Ztk/
eQAcS2GEBkhBWaiEg+NBotFv2VAKVKxPX8YouPvZbvXN2VKmJVAMnJAWbNAp55Bhg/
Hvj4YyAiQvff8eN1+2fNskkIMRdAAKBLly4YMmQIAECj0SA0NBT9+/
fHsWPHcOjQIXTv3h1hYWHS8REREahXrx6ee+45nD17Fnv37kXjxo0xc+ZM6ZiwsDAoFApERkYiPj4ea9asg
YuLC1QqlXTMwIEDMWzYMBw9ehTx8fH44IMPcO+99yLnzuffu3cvFAoFVq9ejcTERKhUKrRs2RKRkZEAdI1n
hUKBmJgYpKSk4PDhw1i2bJnJz1hYWIgPPvgAHTt2REZGBjIyMlBYqBufJAgCGjZsiJUrVyIxMREpKSkoLS3
FrFmzcPToUVy+fBnr16+Hr68vNm3aZHBPFQoF3n77bVy4cAG//
fYbfH19pTIcPXoUbm5u+P7775GcnIwTJ05gwYIFBvfI398fn376KeLj4/Hpp5/Czc0NQ4YMwbJlyxAfH4/
x48fj3nvvRUGBbk2d8gFk6NCheOKJJ3DmzBkkJibit99+w549ewDoAl6DBg3wn//
8BxcuXMCJEyfwxBNP4NFHHwUApKenw93dHUqlEklJSThz5gyio6Nx69Ytk/
eQAcS2GEBkhBWaiEg+MvL+eaphSR/0LSd0T0tOpOTaoXT2YVUAWbpUFzJmztQFj/
LbzJm615curdEyAxUHkNGjR6N9+/YAAJVKBTc3N6Smpkqvnz9/
HoIg4MiRIwB0AcTX19fgicfUqVPRu3dv6c9hYWHo37+/wXV69uwpDTTft28fFAoFiosNg2zr1q2x9M7nf/
zxxzFnzhyD19etW4cmTZoAAObNm4c2bdpY3GXKXBcsQRAwZcqUSt8/ceJEgycY4eHhCA4OhlqtlvY9//
zzGD16NABg8+bNUCgUBvfpbuXvkVqthp+fH1555RVpX0ZGBgRBwN9//
w3AOIB07txZCmTlffrpp3jyyScN9qWlpUEQBIiiiOPHj0MQBCQnJ1f62QEGEFtjAJERVmgiIvmo6rgO/
XiR305ftXHJ7KfaASQzU9fNavx40+FDv40frzuuhseEVBRAXnjhBXTo0AEAsGDBArRs2dLomMDAQKxZswaA
riGvP15PqVSiVatW0p/DwsIwYcIEg2OGDx+O119/HQCwaNEiuLq6ws/
Pz2BzdXXFtGnTAABBQUHw9vY2eN3b2xuCIKCgoACpqalo0aIFmjdvjnHjxmHLli0VjmWpKICsX7/
eaP+iRYvQrVs3BAUFwc/PDx4eHujZs6f0enh4OJ566imD97z77rvSE4b8/Hx07twZQUFBePnll7F+/
XrpSYa5e3Tffffhyy+/lP6s1WohCAJ+
+eUXAMYBZPny5XB3d0ffvn0xa9YsnD59WnrvqFGj4OHhYXSPBUFATEwM1Go1Hn/
8cfj7+2PUqFFYtmwZcnPNf1nAAGJbDCAywgpNRCQfVZ3ZytIZs5xJtQNIbKxurIe+25W57eOPdcft3l2j5a
4ogHTu3BlDhw4FYHkAKd+Qj4qKQnBwsPTnsLAwTJ482eCYESNGIDw8HADwxRdfoFmzZkhISDDa9GMUvL29M
XfuXJPH6GfuKiwsxK+//
opJkyahcePG6NOnj9knIhUFkK1btxrs27BhA7y9vREdHY0TJ04gISEBb731lsH7Td3TyZMnG3RXKysrw44d
OzB16lSEhITg/vvvl8KDqXsUHByMqKgos+UzNQ1vamoqlixZgmeffRYeHh74+uuvAQCDBw/Gc889Z/
L+6cd5aLVa7N+/
H7NmzULnzp3RoEEDXL582eT9YwCxLQYQGWGFJiKSB61Wi8WxVVvbo0ytwdeVrBnibKodQLZt0w04ryh86Ld
Ro3TH16DKBqGvXLkSQMVdsI4ePQqgZgKI/jpJSUlmy9y3b1+MHTvW4s948eJFCIKA48ePm3z9888/
R6dOnYz2mwog77zzDh577DGDfY8//niVA8jdbt+
+DXd3d2zevBlAzQWQu82YMQOdO3cGAMycORNt27a1eIYztVqNZs2aYd68eSZfZwCxLQYQGWGFJiKSh+qubl
7ZqunOxpmfgJibhvfpp5+WxjFotVqEhoZiwIABOH78OA4fPmxyELq1AUSr1aJ///7o0qUL/
vzzTyQlJeHAgQOYOXOmFHS2b98Od3d3REZG4ty5c4iLi8OGDRvw4YcfAtDNbLVixQqcPXsWiYmJ+Oijj+Dj
44Ps7GyT9+C7776Dn58fTp48iaysLGn8iakAsmDBAigUCmzfvh2iKOKjjz6CQqGoUgD57bffsGDBApw8eRL
JyclYvHgxXF1dce7cObP3qKoBZPLkydi+fTsuX76M48ePo3fv3njhhRcAAFevXkWDBg0watQoHDlyBJcuXc
L27dvx2muvQa1W49ChQ/
j8889x9OhRpKSk4IcffoCnp6fBrFt3YwCxLQYQGWGFJiKSh1OpN6BUifjpWFqV3ncgIQtKlYhtZzNsVDL7s
tsYkGvXarTc5RcibNCgAQYOHIiVK1caLURo6TS8d6tqAAF0YyQmTZqEpk2bwsPDAy1atMBLL71k8PRl+/
bt6Nu3L3x8fKBQKNCrVy9plqmtW7eid+/
eUCgU8PPzw0MPPYSdO3eavQfFxcUYOXIkAgMDjabhLR9AiouL8dprryEgIACBgYEYP348ZsyYUaUAsm/
fPoSFhaF+/
frw8fHBgw8+aDCLVk0EkHfeeQetW7eGl5cXGjRogFdeecUggMXHx+PZZ59FYGAgfHx80K5dO0yZMgVarRZx
cXEYNGgQGjRoAC8vL7Rp0wYLFy40e/8YQGyLAcSMPXv24Omnn0aTJk1M/mUtT/
+XpPyWkWH5P0Ks0ERE8vDHmXQoVSL+TjT97bI5ydm3oVSJWLHPdL9yZ+Oss2ARWYsBxLYYQMyIiYnBhx9+i
C1btlQpgIiiKM25nZGRYfRNS0VYoYmIHE+r1WLZnkQoVSJScwoqf8NdisvUmL9DNw7kZpHzrzDtrOuAEFmL
AcS2GEAsUJUAYm6glCVYoYmIHO9GQQmUKhELdsajVG35l0h63x9OgVIlIi7d+X+X1/
hK6KNG2WUldCJrMYDYFgOIBaoSQIKDg9G4cWMMHDgQ+/fvr/A9xcXFuHnzprTpF8xhhSYicpyzV/
KgVInYdCS18oNN2CNeh1IlYsf5ml3bwhGsDiB6mZm6gebbtun+W8NjPohqGgOIbTGAWMCSAHLx4kV88803O
HbsGA4cOIDXX38d7u7uZqfHA3QD20yNG2GFJiJynD/PZUCpErE/Iata7790/
RaUKhGrDyTVbMEcoMYCCJGTYQCxLQYQC1gSQEx5+OGH8fLLL5t9nU9AiIjkZ+X+y1CqRCRl3a7W+wtL1FCq
RChVIgpKLFuTQK4YQKiuYgCxLQYQC1Q3gPz73//
GQw89ZPHxrNBERI6VX1QKpUpE1A4RxWXqap9n7cEkKFUiEq7l12Dp7I8BhOoqBhDbYgCxQHUDyMCBA/
Hss89afDwrNBGRY13MyIdSJWL9oWSrzrPrQiaUKhGxF517rAMDCNVVDCC2xQBixq1bt3Dy5EmcPHkSgiBAq
VTi5MmTSElJAQDMmDEDr7zyinR8VFQUfv75ZyQkJODs2bOYPHkyXF1dK1wkqDxWaCIix6qp4FBTQcbRGECo
rmIAsS0GEDPMLSyoX9U0PDxcWv0TAObOnYvWrVvD29sb99xzDx555BH89ddfVbomKzQRkWPVVNepW8VlUle
uotLqd+VyNAYQ28jNzUVkZCTS09MdXRQDq1atQkxMjEPLkJSUhE8//
RS3bt1yaDkYQGyLAURGWKGJiBynpgeP6wezX67mYHY5YACpeVqtFsOGDcP06dPtfu2IiAh06dLF5Gs//
fQT2rdvj9zcXJuXw1zX9uLiYvTo0QNLliyxeRkqwwBiWwwgMsIKTUTkOAnXdNPnrjmYVCPn00/nuy+
+etP5yoGzBpDw8HCp54K7uzsaNmyIgQMH4ttvv4VGU/
XFJWvS3Llz8dJLL0Gr1dr92uYCSEJCAtq1a4fkZPt0GTQXQMaPH4+ZM2fapQyVYQCxLQYQGWGFJiJynN13F
hDcGVczCwieu6pb0HDjkZQaOZ8jOHMAGTx4MDIyMnDlyhUcP34cn3/+OerVq4chQ4agrMy5p0euroqegNhT
dSf3sScGENtiAJERVmgiIsf57lAKlCoRFzJq5ndwXoFuSt8FO+NRqnbst+7V5cwBZMSIEUb7d+3aBUEQsHz
5cmlfSkoKhg8fDj8/P/j7++P5559HZuY/IVTfaF+7di2Cg4OhUCgwevRo5Of/M04oLCwMkyZNwtSpU1G/
fn00atQIERERBte+ceMG3njjDQQFBcHf3x+PPvooTp06ZXDMzz//
jK5du8LLywutWrVCZGSkFJa0Wi0iIiLQokULeHp6okmTJpg0aVKF9+G///
0vGjZsiHr16mHs2LGYPn26UQBZvnw52rVrBy8vL7Rt2xbR0dEGr6elpeHFF19E/
fr14evri+7du+PQoUPS64sXL0ZISAg8PDzQpk0brF271uD98fHxGDBgALy8vNC+fXuoVCqjAJKamornn38e
AQEBqF+/
PoYPH46kpCSLy1lSUoKJEyeicePG8PLywn333Yc5c+ZUeG8qwwBiWwwgMsIKTUTkGMVlaszfEQ+lSsTNotI
aOadWq8WyPYlQqkSk5hTUyDntrSYDiCgCMTFAfHwNFKwS5gIIAHTp0gVDhgwBAGg0GoSGhqJ///
44duwYDh06hO7duxtMMhMREYF69erhueeew9mzZ7F37140btzYoKtQWFgYFAoFIiMjER8fjzVr1sDFxQUql
Uo6ZuDAgRg2bBiOHj2K+Ph4fPDBB7j33nuRk5MDANi7dy8UCgVWr16NxMREqFQqtGzZEpGRkQCAH3/8EQqF
AjExMUhJScHhw4exbNkys/
dg06ZN8PLywooVK3Dx4kV8+OGH8Pf3Nwgg69evR5MmTbB582ZcvnwZmzdvxj333IPVq1cD0M0IGhISggEDB
mDfvn1ISEjApk2bcPDgQQDAli1b4OHhgejoaIiiiHnz5sHNzU2ahEej0aBTp054/
PHHcerUKezZswddu3Y1CCClpaVo3749xo4dizNnziAuLg5jxoxB27ZtUVJSYlE5v/
rqK7Ro0QJ79+5FcnIy9u3bh++//
76yalIhBhDbYgCREVZoIiLHSM6+DaVKxIp9l2v0vH+cSYdSJeLvxOwaPa+91EQAyckBBg0CBOGfbdAgwJZj
nSsKIKNHj0b79u0BACqVCm5ubkhNTZVeP3/+PARBwJEjRwDoAoivr6/BE4+pU6eid+/e0p/DwsLQv39/
g+v07NlTGmi+b98+KBQKFBcXGxzTunVrLF26FADw+OOPG31rv27dOjRp0gQAMG/
ePLRp0walpZYF5D59+mDChAkG+3r37m0QQFq3bm3UUP/000/
Rp08fAMDSpUvh7+8vhaTy+vbtizfffNNg3/PPP4+nnnoKAPDnn3/
C3d0dV69elV7ftm2bQQBZt24d2rZtazAmpqSkBD4+Pvjzzz8tKuekSZPw2GOP1ei4GgYQ22IAkRFWaCIixz
iQkAWlSsS2sxk1et5TqTegVIn46VhajZ7XXmoigAwaBLi5GQYQNzfdflupKIC88MIL6NChAwBgwYIFaNmyp
dExgYGBWLNmDQBdANEfr6dUKtGqVSvpz2FhYUaN/eHDh+P1118HACxatAiurq7w8/
Mz2FxdXTFt2jQAQFBQELy9vQ1e9/
b2hiAIKCgoQGpqKlq0aIHmzZtj3Lhx2LJlS4VjWe7+DHpTpkyRAsjt27chCAJ8fHwMrunl5YWGDRsC0A0Kf
/jhh81eo379+tJTCL358+dL9+bu/9fLy8szCCD//ve/
4ebmZnRvXFxcsHjxYovKefz4cdxzzz144IEHMGnSJCm4WIMBxLYYQGSEFZqIyDE2HU2FUiXi7JW8Gj1v1q1
iKFUiFu6Kh1pj/
1mPrGVtABFFw+BRfrNVd6yKAkjnzp0xdOhQAJYHkPLjJqKiohAcHCz9OSwsDJMnTzY4ZsSIEdLaYV988QWa
NWuGhIQEoy0rSzdLmre3N+bOnWvyGP3MXYWFhfj1118xadIkNG7cGH369DH7RKSyAJKZmQlBELB+/
Xqj612+rHsS+P7779s8gLz99tvo1auXyc+dl5dnUTkBXRtq48aNGDduHAICAjBy5Eiz5bYEA4htMYDICCs0
EZH9lak1+HqnbvxH7u2SGj23VqvFkt2XoFSJSM8rrNFz24O1ASQmpuIAYqs17yobhL5y5UoAFXfBOnr0KIC
aCSD665QfWH23vn37YuzYsRZ/xosXL0IQBBw/
ftzk66a6YD300EMGn6Vp06b45JNPzF5j9erVUCgUVe6CpQ94+i5Ydy+4uH37doMAsmzZMtSvX7/
Ctk9l5SxPfw1z5bYEA4htMYDICCs0EZH9peUWQKkSsXTPJZuszfDLqatQqkQcTap+Y8hRnPkJiLlpeJ9+
+mmo1brV6bVaLUJDQzFgwAAcP34chw8fNjkI3doAotVq0b9/f3Tp0gV//
vknkpKScODAAcycOVMKOtu3b4e7uzsiIyNx7tw5xMXFYcOGDfjwww8B6FYpX7FiBc6ePYvExER89NFH8PHx
QXa26fFFGzduhLe3N1auXAlRFDFr1iyjQejLly+Hj48PFixYAFEUcebMGaxcuRLz5s0DoBuL0aZNGwwYMAD
79+9HYmIifvrpJ2kQ+tatW+Hh4YHFixcjPj5eGoQeGxsLQDcIvUOHDnjiiSdw6tQp7N27F927dzcIIAUFBX
jggQfwyCOPYO/
evbh8+TJiY2MxadIkpKWlWVTOefPm4fvvv8eFCxcgiiLeeOMNNG7c2Ko1XxhAbIsBREZYoYmI7O9QYjaUKh
G/n06v/OBqOJacC6VKxM8nr9jk/
LbkzGNA7l6IsEGDBhg4cCBWrlxp1Ci1dBreu1U1gABAfn4+Jk2ahKZNm8LDwwMtWrTASy+9ZPD0Zfv27ejb
ty98fHygUCjQq1cvaaarrVu3onfv3lAoFPDz88NDDz2EnTt3VngfPv/8cwQFBaFevXoIDw/
HtGnTjD7Ld999h9DQUHh6eqJ+/
fp4+OGHsWXLFun15ORkjBw5EgqFAr6+vujRowcOHz4svV7ZNLyiKKJ///
7w9PREmzZtjJ6AAEBGRgZeffVVBAUFwcvLCyEhIXjzzTcN2kMVlXPZsmUIDQ2Fn58fFAoFHn/
8cZw4caLCe1MZBhDbYgCREVZoIiL723w8DUqViJOpN2xy/
sybRVCqRETHJkDjZONAaiKA5ObafxYsImsxgNgWA4iMsEITEdmXRqPFor8SoFSJuJ5fXPkbrLzGtXznWtCv
JtcBiY+33zogRNZiALEtBhAZYYUmIrKvu59O2GL8h96WE7qnLCdSnOtrf2ddCZ3IWgwgtsUAIiOs0ERUVfZ
cXbo2stf4DFuPM7EVBhCqqxhAbIsBREZYoYnIUo5YXbo2stcMVbaeactWGECormIAsS0GEBlhhSYiS+lnFn
IPKICrX5FdZhaqbbRaLRbH2meNDluuNWJLDCBUVzGA2BYDiIywQhORJfRrK7j6lCCgn4iAfiK8g7MgCFqbr
q1Q29h7lXJbrbZuS/
pGWGGh8y2iSGSNwsJCBhAbYgCREVZoIrKEfnVpr2Y5UgAJ6CfCs1GeTVeXrm1Opd6AUiXip2NpdrnegYQsK
FUitp3NsMv1aoJarUZcXJzZxe6Iaqvs7GzExcVJi1beje016zGAyAgrNBFZQv8ExK9TKgL6iVD0uoSAfiL8
OqfyCUgV/
HEmHUqViL8T7dO4Ts6+DaVKxIp9l+1yvZqSnp4uhZDCwkIUFRVx41Zrt8LCQil8pKebnjSC7TXrMYDICCs0
EVnqicFqBPaPR0A/
EW7+hQjoJ6L+ABEDnyp1dNGcglarxbI9iVCqRKTmFNjlmsVlaszfoRsHcrPIeX5OWq1WCiHcuNWVLT093ey
EEWyvWY8BREZYoYnIUkfj89EtXIR/
tyTd05COaegWLkJ1il1lLHGjoARKlYgFO+NRqtbY7brfH06BUiUiLt35fs+r1WqHfzvNjZs9NlPdru7G9pr
1GEBkhBWaiCz157kMKFUivvvrOmJigG1/34RSJWLV/
stONc2ro5y7mgelSsSmI6l2ve4e8TqUKhE7zmfa9bpEVHPYXrMeA4iMsEITkSW0Wi2W7tFNH5uSres+VFKm
wcJduu49GXmcMrUy+gC3PyHLrtdNuHYLSpWINQeT7HpdIqo5bK9ZjwFERlihicgS124WQakSseivBJTd1X0
o5s6g6r8uXHNg6ZzDyv2XoVSJuJx1267XLSxRQ6kSoVSJKCgps+u1iahmsL1mPQYQGWGFJiJLHErMhlIl4p
dTVw32J2XpZllasvuSXda1cFb5RaVQqkRE7RBRVFpxX29bWHswC
UqViIRr+Xa/NhFZj+016zGAyAgrNBFZYuMR3UDmM2mGC9ppNP90zUq8fstBpZO/
ixn5UKpErD+U7JDr77qQCaVKROxFPqkickZsr1mPAURGWKGJqDKFJWpE7dB14ck3MZVr7MVrUKpE/
H7a9Pz15PgA4OgARETWYXvNegwgMsIKTUSViUvXzXa17m/
TjVf9+JCvd8Y7pHuRM3B0F6hbxWUO7QJGRNZhe816DCAywgpNRJXRDzQ3N3uTVqvFmjsN7LNX8kweU5fJZR
C4owbBE5H12F6zHgOIjLBCE1FFNBotFsfqxnhcuVFo9rgjSTlQqkT8cNS+a1w4A7lMg6ufBnhfvH2nASYi6
7G9Zj0GEBlhhSaiily9UQilSkR0bAI0FcxydfPOLE9KlYibJsaJ1GW77ywEuDPOsQsB6hdC3HgkxaHlIKKq
Y3vNegwgMsIKTUQVOZCQBaVKxB9nKh9g/
sPRVChVIo4k5dihZM7j+8O6GcQuZDj292xegS4kLtgZj9K71nIhIvlje816DCAywgpNRBVZfygZSpWI81cr
/x1x9kqe1NVIq+WaIABQXKbG/
B3xsngypNVqsWxPIpQqEak5BQ4tCxFVDdtr1mMAkRFWaCIy5+6ZkywZPF1UqsbXO3WN7Ws3i+xQQvlLztYt
1Lhi32VHFwUA8MedCQX+Tsx2dFGIqArYXrMeA4iMsEITkTn6JxrfH7Z8zMDvp9O54N1d9F3Ytp3NcHRRAAC
nUm9AqRLx07E0RxeFiKqA7TXrMYDICCs0EZnz2+mrUKpEHLxk+bflidd1Mz4t3XOpwkHrdcWmO+Ni5DI9cd
atYihVIhbuioeaPx8ip8H2mvUYQGREVhU6MxOIjQW2bdP9N9OxM8aQE3DWOuME5VZrtFj0VwKUKhEZeXd1p
6qk7GqNFkt266btTarj602UqTVSl7Tc2yXVP1EN1het9p+fT3qe+WmViUheZNVec1IMIGbs2bMHTz/
9NJo0aQJBELB169ZK3xMbG4uuXbvC09MTrVu3xqpVq6p0TVlU6JwcYOlSYNw44LnngJEjdf8dN063P4cz6l
A5zlpnnKjcqTkFUKpEfLP7km5AeRXK/
teFa1CqRMRYMHNWbZaWWyA9DarWoHwb1ZdfTumebB3lbGVETkMW7TUnxwBiRkxMDD788ENs2bLFogBy+fJl
+Pr64v3330dcXBwWLlwINzc3bN++3eJrOrxC5+QAs2YBzzwDjB8PccJ8xIxZh/
gJUcD48br9s2bJqmFGDlauzuDjj4GICN1/5VxnnKzce+6sXbH9XEaVy56RVyR18ykuUzv2gzjQocRsKFUif
j9djSBmw/
pyLDkXSpWIn09eqXq5iMghHN5eqwUYQCxgSQCZNm0aOnbsaLBv9OjRGDRokMXXcXiFXroUeOYZ5Lz3KQa1T
oAgQNoGtU5A7nuf6P6hXbrUMeUj+blTZzBzpq5BVn6bOVOedcbJyr3mYBKUKhFiZn6Vy67VarFq/2WLp+
+trTYfT4NSJeJk6o2qv9mG9SXzZpFFi0sSkXw4vL1WCzCAWMCSADJgwABMnjzZYN/
KlSuhUCgsvo5DK3Rmpq4rwfjxGNQ6AW4uGghuargH3oarVyncXDQY1DpB923fuHGy7CdPdnZXnTHZKNNvcq
szTlbuvELdgnXzd8Sj6Ep6tcr+951v/
+vqbEuau8bQXM8vrtqbbVxf7i7btXxOl0zkDBhArMcAYgFLAsgDDzyAOXPmGOz7448/
IAgCCgtNDy4sLi7GzZs3pS0tLc1xFTo2FnjuOYgT5ktPPXzbXUVAPxFezXKkffETonT9nnfvtn8ZSV7u1Bm
pO4q57eOP5VVnnKzc+qlaNx1NrXbZ9atuR+0Qcau48jVEapu7nzJUefyHHeqLVU9niMjuGECsxwBiAVsFkI
iICAiCYLQ5pEJv2waMHImYMeuksOHZNBcB/
UT4dbgi7YsZiva+0gAAIABJREFUsw4YNUp3PNVtd+pMhY0y/
SanOuNk5f755BUoVSKOJOVYVfZNR3RT0B5Llse4FnuyapyFHeqLVeNTiMjuGECsxwBiAVt1wZL7ExA3vyIE
9BOheCgBgqDlExAy5GRPEiROVO4ytQYLd8X/
03XIirKfTtM9SVn7d7IDPoljWTXTlB3qi9UzdBGRXTGAWI8BxAKWDkLv1KmTwb7/+7//
c55B6KbGgAhaKB5KQEA/
ER71CgzHgFzjysp1XlX7xsulzjhRuZOybkOpErF8b6KuYWpF2YtK1ViwM7564yCcmFarxeJYK9basEN9qbE
1SojILhhArMcAYsatW7dw8uRJnDx5EoIgQKlU4uTJk0hJSQEAzJgxA6+88op0vH4a3qlTp+LChQuIjo52vm
l478z0kvveJ9IsWH4driCgn4iHe57hLFhkzMlmk5I4Sbn/uqhbw2PH+bsGNltR9l/vPAnYG3/
dPh9ABmpktXE71Be5rdJOROY5vL1WCzCAmBEbG2tyfEZ4eDgAIDw8HGFhYUbvCQ0NhaenJ0JCQpxvIcJyc9
3HT4jC1699j4+mrMFvkz6R3doIJANOtp6GxAnKrdFosWKfbvrchGu3aqTsCdfyoVSJWLYnsc5M+aofxG/
VDGB2qC8HErKgVInYdjaj+uUkIrtweHutFmAAkRFZVOhyq/1eHf0qlOM+xTfvfAHtN/
JaHZpkovwK0aNGyXZFcQMyL/eFjJtQqkQs2X0JJWUawxerWfYytUbqjpSSXWCHT+F4f5xJh1Il4u/
EbOtOZOP6kpyt6263Yt9l68pJRDYni/
aak2MAkRFZVejMTGD3bqhjYvD1ChWUW08gh32TqSJ36gy2bdP9Vy5jPiojw3JrtVqsvbP44KGKGs7VKPvOu
Mx/
VlWv5bRaLZbtSYRSJSI1p4YCl43qS3GZGvN36MaB3CwqrZFzEpFtyKq95qQYQGRErhX6hzt9k8+ksW8ykT0
kXLsFpUrEor8SUFSqrtFzX7lRKJ27VK2p/A1O7EZBCZQqEQt2xjvFZ/
3+cAqUKhFx6fL6N4CIDMm1veZMGEBkRK4V+sAlfd9kzlFPZGtarRbfHdI1RA8kZNnk/N/
eGVtyIUNev2tq2rmrebpFHI+kOrooFtkjXjeedICIZEeu7TVnwgAiI3Kt0CnZBdJUoERkW/
qpdxfuikdhSc0+/dDTf6mw9UQ1FuZzIn+ey4BSJWK/
DYKcLeiffK05mOToohBRBeTaXnMmDCAyItcKXVKmkfom5xWybzKRrWi1WmnF8t2i7abKzb2t65o0f0c8bhe
X2ew6jrZyv+5Jz+Ws244uikUKS9RQqkQoVSIKSmrvz4XI2cm1veZMGEBkRM4VesOdvsnnr8qvbES1RWpOgT
Rm4ZaNg4H+7/
TxlFybXsdRbhWXQakSEbVDrPFxNLakn3wg4Vq+o4tCRGbIub3mLBhAZETOFXpvvK5vsop9k4lsZvPxNChVI
nZdsP3fs5N31sf47lCKza/
lCBczdGuerD+U7OiiVMmuC7pZymIvOn42NiIyTc7tNWfBACIjcq7Qidd1fZNX7ecc9US2kJFXJHWLskdXx8
KSf6Z9zb5VbPPr2ZuzNuSdNTgR1SVybq85CwYQGZFzhS4qVSNqh65vcm3uM07kKD+fvGL39Tn013SWQdpV4
axdmZy16xhRXSLn9pqzYACREblX6HV/J0OpEhGf6Vz/oBPJ3bX8IqnRmWvHBT/FzHxphjutVmu369qasw/
mdrbB80R1jdzba86AAURG5F6h/7p4DUqViL+crEsDkdz9fjodSpWIP87Yd62dUrUGi/
5KqNmVwmXA2aez1U8fvC++9j2ZIqoN5N5ecwYMIDIi9wqt/7Z03d/sm0xUU3Jul0jdG6/
n238shup8Zq2bYEK/oN/OOOf8TPoFFDceqZ0TBBA5O7m315wBA4iMyL1C32bfZKIat/3Ot90/
n3TMooD6qX8X/ZWAMrXGIWWoad/
fmWLYWVd6zysolaZjLq0lPxOi2kTu7TVnwAAiI85QoVfd6ZuceP2Wo4tC5PTyCkulmagy8oocUgatVovlex
OhVIkQa8H4ruKyf2b3ulnknAunarVaLNuTWOu6xhHVFs7QXpM7BhAZcYYKre+usTfedqs0E9UVO+N0f582H
09zaDn2J2Q59ClMTUrOvg2lSsSKfc49ZfgfZ3Tjgv5OzHZ0UYioHGdor8kdA4iMOEOFPn/
1JpQqERsOs28yGRNFICYGiI93dEnkL7+oFAt26r6pT8t17Lfc2beKpTVInHHWqLsduBOmtp2133TGtnDqzk
KRPx1zbDglImPO0F6TOwYQGXGGCp1XWCo1VErK2DeZdHJygEGDAEH4Zxs0CMjNdXTJ5Gv3nYHSm46mOrooA
ID1h3TTbJ9MveHoolhl09FUKFUizl7Jc3RRrJJ1JxQu3BUPtab2TJFMVBs4Q3tN7hhAZMQZKvTd/
cXZN5n0Bg0C3NwAQdBKAcTNTbefjBWUlGHhLt3TjySZrPVwPCXX6Z9ulqk1+PrOUyV7rqdiC1qtFotjL0Gp
EpGeV+jo4hDRXZyhvSZ3DCAy4iwVettZXd/
kg5fYN5l03a4EVw28Q64hoE88PBrcNHgSwu5YxvRjLr47lCKbBQBvF5dJg7edtfGelqub0Wvpnkuyua/
W+OXUVShVIo4m5Ti6KER0F2dpr8kZA4iMOEuFPpOmm6P+R/
ZNJgDfbS2Ef7fLCOgnIqCfCL9OqQYBJCbG0SWUl6JStbT4X8I1ec0mt+VEGpQqEQcuOecCeIcSs6FUifj9t
H0XdLSVY8m5tWZyAKLaxFnaa3LGACIjzlKh9QNWv97Jvsl1mVqjxYGELHy0URc8FL0u6UJI33gIbmo+ATFD
30heezBJdt/
SX8jQTTLx7b7LsiubJTYfT6sV41j0Mm8WQakSER2bAA1/1xLJhrO01+SMAURGnKVCa7VaLNmt65t89Qb7Jt
dF2beKpUHLSpWIPi+kw81LDf9uSQjoJ8Lj3nyOATGhpEwj9euX4yJ5pWqN9HTmipP93dZotFLZHbGivC3c/
Zmu5TtmnRgiMuYs7TU5YwCREWeq0L/e6Zt8hH2T6xStVovjKbnSQN/
FsZcgZuYjN1cXNrxbXUdAPxE+92dwFiwTjiXnQKkSsWr/
Zdl+o61fmX1nXKaji1Ildz8tcManN+bUtqc6RLWBM7XX5IoBREacqULrZ8zZeoJ9k+uKm0Wl+PFYmvTUY8u
JNNwqNlwzYs+xAkxYLOKzny5xmuZyStUaLN1zSfZTxKZkF0jhskztPD/
D2jpeoraNayGqDZypvSZXDCAy4kwV+tqdbxsX/
cW+yXVBXmGp1HVo4a54nE67YfJbZrXmn2maVeed6xt0Wzt5Z2G55XsTZT12SqPRYtmexDuD5PMdXRyL1dYZ
o2rbzF5EtYEztdfkigFERpypQhv0Tb7Jvsm1nX516bUHkyqdojU1pwBRO3RPScRM52nA2tLdweyUE3Sl2Ru
vWyTx11NXHV0Ui9w9Lq22rZlRm9Y2IaotnKm9JlcMIDLibBV664krUKpEHE9hR//
aTKvVYsW+y1CqRFzMsCxQ6Ne5iI5NQF5hqY1LKH9nr+RJ32I7Q7em6/
m6me4W7IxHUana0cWpVG1fNby2rO5OVFs4W3tNjhhAZMTZKvSRJN2A2t9OO8e3pFQ9+i4gi/
5KQKmFjWe1RosNh1OgVInYdCS1TnfT02i0WLlfF+COJTtP96C1f+tmOTudJv8nNqfudG/7qZauTaR/
ArntbIaji0JEcL72mhwxgMiIs1XoqzcKoVSJ+GY3+ybXZjvOZ0KpEvHnuao1fvIKSqVues66sF1N0K+tsTj
WuQbm62fs2nQk1dFFqdQfZ9KhVIn4OzHb0UWxieTs21CqRKzYd9nRRSEiOF97TY4YQGTE2Sq0+v/bu/
PoOKozb/
xlBJYBYxliE7bYIYQw84YJybyMBuJ58ZlDDmYSfmTCEBLIBE+YQAIkgUyGwUkAn5BheSf82njBYAzYmMVb4
oXFMi1bkhfJki1rtSxXq7W29rW19l7f94/
qKrltyVp6qVtV3885dUCtlvqqfNV6nqp7nyei6GuTe7g22ZJC4Qhey1WTiKae4Sl/
vRZ8r8iW4emd+tebnaIo2FRQD4dTRqHJguMBX1Dfy+MdFncZnaKMbpqfzhw1A38ojFez1ffafp+4/
xZEdmG2eE1ETEAEYsYJvS26NrnCw7XJVuRqH9ArN033LpfWV2L9wVpT7CdIpJqOQX35mhl/
9j9Hyy6LfGfBOxzU96tMdomgGX0YXdJ4stU8fx+IrMqM8ZpomIAIxIwTOt+trU1mjXor0kqbHnJNfwmVPxT
W90B8VNZim+V6iqLgg0I1aDxcY84laFUt/XrjRFH/
3U60eE2zVCweB+ROUzaIJLIiM8ZromECIhAzTmitadn6g7VGD4USbCQQxsroEruuQX9c36u936d/
L7vcLavvGtIrMw0HQhN/gYD8oTBW71f/3dq8Ypbb/
ix6hy2eJNkMtLtp7xbUGz0UItszY7wmGiYgAjHjhA6EIvraZJZbtRatstD7hQ0J+X7apubV+13ojjOhEZ2i
KNh6VF2emCd3Gj2cuOyJbvDOqe4weihj0u6u1XUNGT2UpBoJhOFwqntyzJrQElmFGeM10TABEYhZJ7RWbrW
qxVzjpnPbcrQxWjo2MX1eFEXBX46rewo2HWkwRT+M6WrqGdb3JQz6zR0sandyXs9zC9djY9Af0oscmHGPzV
RpBQ3M1KGeyIrMGq+JhAmIQMw6obWuyc4qrk22ir7hgB7YDSUwgB7yh/
BGtGO1qFfUE0FLtKywXj8SUbDugPpvVts5aPRwYpxqG0joXTrR7a9WS2LnnrLu7w6RGZg1XhMJExCBmHVC1
3YO6htVyRoK3N1wOGXsKEl8Y7e66BV1h1OGW7CANhHavD44nDJezXZZZlli7qkOOJwyPikXq9iE3QJyuyVc
RKIya7wmEiYgAjHrhPYFw3q/
gEReLSdjKMpo5+5klfzMi1b0eT3PbfolSmfaVdoMh1PG3ik2bhRZR7+aVK3a5xJqqZPdliTZbckZkajMGq+
JhAnIOaxZswYLFy5Eeno6MjMzUVRUNO5zN2zYAEmSYo709PQpvZ6ZJ/
R7RxrgcMpwtdsjELAyrcP9mpyapHXuDoUjeL9QnTPbiz2ICLa3YLo6Bnx6gGil5pyKouDdaLBf2SxGFTO7b
sq2y6Z7IpGZOV4TBROQcWzZsgUzZ87EO++8g6qqKjz88MOYO3cuOjrGvtW/
YcMGzJkzB21tbfrR3j619d9mntA51eoSjRybLIWwMm1ZS1Zlcq/
g9wwF9BKvR+t7kvpaqfJJuVox6tMKsZYqJUJRnVrFbNsxMfpt2LUsrV3KDhOJzMzxmiiYgIwjMzMTjz/
+uP5xJBLBVVddhZdeemnM52/YsAEZGRlxvaaZJ7Qc7Zj93hGuTTazcETB2lx1w3FDd/KvsFY2e/
X9Eq3ekaS/
XjL1DAX0pYidA9YrM9zvC+p3HPp9xu9tsWtjPrs0XiQSmZnjNVEwARlDIBBAWloadu7cGfP4gw8+iLvvvnv
Mr9mwYQPS0tKwYMECXHPNNbj77rtx4sSJc76O3+9Hf3+/fng8HtNO6CGuTbYE7arymwdqU7IsSlEU/
a7B24fq4A+Zd+7sjV6Z3lXabPRQkmbbsSZh7lh9GC3/
nax9SqLSKtSt3OdC0MKlrIlExgQkfkxAxtDS0gJJklBQUBDz+FNPPYXMzMwxv6agoADvvvsuSktLkZeXh7v
uugtz5syBxzN+FaHly5eftW/
EzBN6Q3RtsmilOmnyPi5vgcMp40AKm+f5gmG8dUidO3sqWqEo5tsP4h0J6g05Re0YngjaHat3C+oN/
Xfyh8L6+RbhbkwqKYqCNw/
UwuGU0dQzbPRwiGyJCUj8mICMYToJyJmCwSCuu+46PPPMM+M+x0p3QADAWaXuHTjoMnfnZ7vyBcNYuU8N6j
oGUhtEt/SN6AGlGRta7jupzv2/HE982WKR+IJhrNLmSL9xiVZDt1rK+a1D9iz9/Wm0O/
2R2m6jh0JkS0xA4scEZAzTWYI1lnvvvRc//OEPJ/18s0/
oqpZ+OJwyNhc1Gj0UmoYKj1fvUm6EI7XdevWtvmHzVJAa8AX1xM3Ta/
0r0tqSOSN7b+TXdKWkUIKoypr64HDK+HOxtRNeIlGZPV4TAROQcWRmZuIXv/iF/
nEkEsHVV1897ib0M4XDYdxwww349a9/PenXNPuE9o4E9Q3FySrfSsmzNbq+/5hB6/
sjEUUfwweFjQibpDSv1tPELpuC3dHGo+sOuA0rn6zNE1FKAqda16AfDqeM1ftdpvk9IbISs8drImACMo4tW
7YgPT0dGzduxMmTJ/HII49g7ty5emndH//4x1i2bJn+/D/84Q/47LPPUFtbi+PHj+OHP/
whZs2ahaqqqkm/ptkntKIoWH+Qa5PNSEseV2TLGDBwTX2/L6hX4TLDUr7hQEgvJVxvk74M4YiC1/
Pchv3MoXBEXwbWa6FeK1OhKKPV6sxePc7sRgJh1HcNIcSCALZi9nhNBExAzmH16tVYsGABZs6ciczMTBQWF
uqfW7x4MZYuXap//OSTT+rP/fznP49vf/
vbKCkpmdLrWWFCZ1WqyzMK3FybbCaF0eVPIizpqOkY0Mu9pqIUcDwOR5cCfVDYaMrN89Ol9f3ZY0C/E0/
vsH4Hxk7n/Ey7y1oMvWNpZ/
5QGCdb+7GrtFnfu7b3hD2XA9qVFeI1ozEBEYgVJrS2j2C7AIEsTY6iKNiYr3a5PtEixpIWbVP3ugNuYbtc+
4JhrMmpgcMpo6bDXpXfWr0j+hKgVJdO1pLlT8qt1+xxKoobei1f9lkkwXAErvYBfFzeot+BO/
Pg3Sj7sEK8ZjQmIAKxwoTujq5NXrWPa5PNos3rMyyYHE8wHMG7BWpStLOkWcgr3VogvMngkrRGUBRFL7ud6
qplO0o8cDhllDb1pfR1RdPer/
7evpZbY7v5lyrhiIK6riFkVbbpFxu0Y8PhOhS4u9E96Nd7AH1YZK87oXZmhXjNaExABGKFCa0oo+vDW/
p4NcgMck4Zt5zmXDoH/
PqVxuONvUYPJ0YgFNHX4Fe3mff3NR5HDFi2F4koeiBoxW7zU8FzkRyRiIKmnmFkV7Xrv+Pasf5gLQ66OtHR
74tJNIb8If3fwoxlxGnqrBCvGY0JiECsMqE/
iq5NFqFbMp1bOKLgjWjCWCfgJurSaLnRlftchvadOFNxQ49+FdSoSlBG8w6PFi4Y9KdmmRyv+sf6y3HeDUo
ERVHQ6h1B7qkOvcmjdryR50ZOdQda+kbOOeeO1ffoy0ZFuZNMyWOVeM1ITEAEYpUJfbyxV186Q2KrjZZUfS
PPuJKq56IoCnaVNsPhlLExv16I8s7BcATrDrhtXQZWs/
WoWg63uCE1Fxu47yEW98NMn6Io6Bzw43BNF94+VBeTdLyWWwNnVTsau4cn/
b4YCkfwTnRZ4iFXV5JHT0azSrxmJCYgArHKhO6IXqVck1MjZFBLo7SOykY2lZvISCCsX5V0VrUbPRz9rsz6
g7W23+dU7ulLafNKVn6KxYpgU9c7FMCR2m59j5l2rMmpwZ6KVrg7B6f9e631yFm5z2WqZqo0dVaJ14zEBEQ
gVpnQp69NFmnZDMXyh8L6Hot2wf+dmnqGsSJbDRTk9gHDxhGOjPa64bIXtRKY1gU+2fsQTt9fxmpDKvZEmZ
x+XxDFDT14v7AhJulYtc+Fj8paILcPJOTuqqIo+rK43WUtCRg5icoq8ZqRmIAIxEoTemdJs5Cbh2lUZbNXX
9pkhqunWs+N13Jr4B0xplmids7WHXAjyMZjAEb3fCW7cSS7f4/
N7l3hxzMcCKG0qU9fJqgdr2a7sKPEgxMtXviCid+r0T3o13uDNHazIa9VWSleMwoTEIFYaUIfjW7I+7icV4
FEtb1YvVJXVGeO5SzhiILNRY1wOGVsOdqY8uV9kYiir/FO1Z4HM9AaR755oDap/yZl0aVvIjTLFEl+NDHP
qmQjPF8wjMpmL/
5y3KPfMdUKJWw91oRyT19K+gpplQXfLajnMmSLslK8ZhQmIAKx0oRu6RvRNzeb4eq63Qz4gvofaKPuJkyHd
zioL+/Ld6d2o2d1Wz8cThlrc91CbIYXRSg8WpI4mVd8tf1KR2q7k/
YaZtTQPQSHU8Zbh+qMHoohAqEITrUNYFdps74cUDs+LGpEcUMvBnypfY/
zBcP6ckEu1bQmK8VrRmECIhArTehwRNHXJvdwbbJwtDtUW481GT2UKdMSgRXZMjy9qVnioCgKNkU3rRYyAD
6L1rl+74nkXIVXlNG9N009XNZyOn8orC/
56U9xoG2UUDiCmo5BfFrRitX7Y5OOTQX1KKztNnwTuFagYW2uGyMBluW1GivFa0ZhAiIQq03obdG1yRUerk
0WyenBtFnXjWudh9cfrE3KOu4z1XQM6pVyUvF6ZtMcveO5JqcmKXtjtJ4jK/
e5uPdmDB9GlybaoSnmkdpuvJYb25X8ncN1yK/
pQtegOA0ZIxEFm46om973VxtfvY8Sy2rxmhGYgAjEahM6362tTWaNepF0DPj0CjBmDab9obC+H+OjspakLv
NTFAUfFKoB3uEa1vcfi6Ioei+FZATBJ1q8+t4fOlue3AmHU8a+k9YOdIf8oZiu5HlyJ9q8PmGX+Tb1DOt3a
9mt3lqsFq8ZgQmIQKw2oRu7h/U/
FCQOLVgxe4GA9n6fvuY7mXfZ6ruG9OpLqdjAalbaBYdkNCD9LHrHiw3exqbdoXu3oN7ooSRVVYu6/
PK9Iw3CJh1n+rhcrRK3vdhjmjHTxKwWrxmBCYhArDahA6GIvjbZTBudrSwSUfQu3u7OQaOHE7fihh49OehO
wvILRVH0Mp55cnLLzJpd71BAL3M65E9soqbd7arrGkro97WKkUBYvzNg5SRZK0SQb6I7kd6RoL4fsqbDuB5
GlFhWi9eMwAREIFac0FrZ1KoW6/xMZqZVzHk9z22JXgqnN/7adKQBoQTvD9CWUKzc58JggoNqK9J+3xPZ/
2cwuuxmRbZs2iWDqaDt67JqkBuJKPrej5Y+czWi1Eolv3WoLuHvUWQMK8ZrqcYERCBWnNAHXepyH2eVtdcm
m0VWZavlNkUO+UN4I1ryMqe6I6HfW0turL62PlFKo706PihM3F6NU21qn5H3CxsS9j2taH+1Woks91Rifwd
E4ekd1qtKma23RiAU0au4HZA7uRTLAqwYr6UaExCBWHFC13YO6t22yViBUEQvWdnqNdcVxInURfdpJHJpWZ
vXpy8p4hLCyRkJjJaETdSSOKsH1oli9UTtkEu9i7CnwpxFTbTy4VozTbuUTLYqK8ZrqcYERCBWnNC+YFhve
JfodeE0NSdb+/WSlVa8Aqdtrn89z52Q5VK7SpuT2tvCqrTzlqiKYVZfWpQoA76gpZeqaSVtT7aa8+
+joigoa+rTLwK9lluDk639lnwvtgMrxmupxgREIFad0O9F/3C42hlAGElbTlTgtmYjvVA4gvcLG/SKM/
Es09BKFa/IZiPNqZLbB/Tqd/EGV3bZXJ0oWinkZHakN8LpyZXZm/r1DgX0vi0Op4xPyltN/
zPZkVXjtVRiAiIQq07onOoOdX0+l1AYZtAf0u9EGd0hOJl6hgL6Fcaj9T3T/
j6flLfqwQFNTTAcwZqcmoR0LXd32qO8bKJ8VKaWfC1uSFwRABFUeNQ+MJuLrNEHJhJRcKS2W1+uuO6AmxXe
TMaq8VoqMQERiFUntHZF9L0j1lybbAbFDb22aeRW2ezV925MZ69Lz1BAT9bYPGx6nFXtCSk+ccAmDfYS5Uh
ttyWXDe6OJlaFtda6e9ve78O70SWG2jwPhFglywysGq+lEhMQgVh1Qg+xjKbhtGVwZU19Rg8l6RRF0e9gvH
2oDv7QxHNOloE9ewCXC9gbbXq3qzTxDfXsQitf/
EaeO65lWNpSFbOu+081rSGhlTaih067o9bR7zN6OAkXDEeQe6pDT0LeOVxnujLDdmTVeC2VmIAIxMoTekO0
kVitBZrfmU3XoF/
vZWGXtca+YBhvRdfD76loHTcI7ukBliwBJEk9ZqQH8b8fdOHFj2S0ea0X7KRKKBzRm69Ndw+NPzRaUYsVgy
bHOxzUf9fNVqp2PI3dw/
oyJStv2G7qGdZL9a7IVos4WKFXk1VZOV5LFSYgArHyhNaWZBx0sZt0qmnlK3eXtRg9lJRq6RvRA9jxGmEuW
QKkpY0mIBde145L/
4+MW37oSfForWfbMbWDfIXHO62v15pmvnWoLsEjsy5FUfS7BV0JKoNsNK263WcWW1Y2Fl8wjKzKNv1uyHtH
Gizz72g1Vo7XUoUJiECsPKGrWvottYnQLBRF0a+q2bEKmbYmfk1ODT6taI051u9txUU3xB4Z33QhY5GMtDn
DcLmMHr255bvVxDercnob+bXu0VmV1g88E2nLUXXZWnWbNf6ObMyvt937l6t9AK9Hm6uu3OdCcUOPZe5oWY
WV47VUYQIiECtPaO9IUN8YzE12qaOtxX8ttwahsP3OeySiYGv0SvyZx2NrZWQsOvu4+G+aIEkK9uwxevTmp
i2dWX+wdlpfr/27VTZP7w6KXe07qd5tPuRKTB8WI/UNB/S/
G3bbPzjkD+k9dRxOGVuPNbEhqkCsHK+lChMQgVh5Qp9+JT7e0pw0eZ9FN1Rnx1mNyMx8wTDKmvpwvLE35th
1qBczrzrjuLIPM2aGIEngHZA4BUIRfQncVAOn0/eQ9LIPy5SUe/
rgcMrYWWL+IgqlTerPsu1Yk9FDMYSiKKhs9urL6tbk1KCy2WvpvTBmYeV4LVWYgAjE6hM6q7LV0o3wRHN6P
wZPL5O+sZy5B0SS1I+XLDF6ZNawOVrFarw9OOPx9Npj43EytPSNxHXnSSQ7S9Q7AMfi6OljBd5N9m8UAAAg
AElEQVThILYeHb2Tu7ushY05DWb1eC0VmIAIxOoTWrsyt72YG3xT4VTbgL6Jl0Hc2Hp7Y6tgSZL6ca+1+rg
Z5qCrc1r9QIrqetgIcpr8odHu8Wauehc87S4YN2Kry0mP1vdgZfScvJHnRk0Hq0oaxerxWiowARGI1Sd0d7
Qc7Kp9LpYXTAFt/
XB+jfnXgiebyzXaB4QSpzbayXzD4alVstpR4oHDKaPUBn1rkuHtaAlqMy931ebO+oO1vIByms4BPzZF+zpp
1cEm0+uIEsvq8VoqMAERiNUntKIoemUPNlpKruFASF9/P90+DETx8gXDelf5If/
kloxEIqOlZDsG2ItlOrTO4ccbzXsrb391u94dnGKFwhEcdHXqv1tvHaozdbJpRlaP11KBCYhA7DChP4r+YT
xq8zW9yVbS2AuHU8aHLHtMBtOu1k62jGp7v0+v3MbSo9OjlUA2a+8MRVH0RqJuNq8dl6d3WL/
btSJbxgG505bVDo1gh3gt2ZiACMQOE/
p4NDC2QoUWkX0Y3fxbYuIroGQNOdUdcDhl5JzqmNTzixvU94hdpXyPmK6aDnX/1weF5rwAcfpyXZZtPzd/
KKw3+nU4ZWwqqOedwxSwQ7yWbExABGKHCd0Rvbq5JodXN5OlZ2i0dj4rpZDR5PYBvavzZGjLh+xe+SgeWv+
MVftcpnyfLW5QixDsKGHBkslydw7ijdOaFxbVsXlhMtkhXks2JiACscOEjlnf3c+rNMmgdZDmFWQSwZA/
pC8RmaiZ3On7xFq93Cc2XYoy+j7bbcIKUtuLPbyDOw3DgZC+zNnhlLHlaCP6hrkHMBnsEK8lGxMQgdhlQmu
13fnHJfFOXzt9qm1ya+6Jkm3DYXVO1k6wnr8ruvRm9X5WyouX1oPFbO8D/lBYL6DB4HnqFEVBVUt/
TPPCck8fK4klmF3itWRiAiIQu0zoo/Xq7fWPy1uMHorlaA3c1uTUIMjNiCQIbY36QVfnOZ9XFu18/
Wf2CopbdvScHzZZGW5t/
8pUSzdTLO9IUL+TpO27HJxkJTqamF3itWRiAnIOa9aswcKFC5Geno7MzEwUFRWd8/
nbtm3DDTfcgPT0dNx444349NNPp/R6dpnQWqfeN/
LY5TjRtKDDrNVvyJqqWvrhcMrYPEFVtk8rWuFwyjhS252ikVmXlsyZbSmmlqzmTrJoAY1PURQcb+zVGzquz
XVDnmQ1Ojo3u8RrycQEZBxbtmzBzJkz8c4776CqqgoPP/ww5s6di46Osd8U8/PzkZaWhv/5n//
ByZMn8cwzz+CCCy5AZWXlpF/
TLhM6HFH0N0T2qEicUDiC13JrTN+AjKzHOxLUCyOMV9VIURSsP1jL+ZsgzdELPesP1ho9lElTFAVvHlDnQE
P3kNHDsYzuQT/eLxxtXphV2Trhfiw6N7vEa8nEBGQcmZmZePzxx/WPI5EIrrrqKrz00ktjPv+++
+7Dd77znZjH/v7v/x4/+9nPJv2adprQ2441weGUUeHxGj0Uy3BFqw2xczCJ5vTkorF77OTCOxzUK/
hw+WD8fMGwHnCaJdjsGPDpe4DYzyKxwhEF+TVdevPC9Qdrx/1dpInZKV5LFiYgYwgEAkhLS8POnTtjHn/
wwQdx9913j/k1X/jCF7BixYqYx5577jl87Wtfm/
TrCjWhFQUIDCXtOFLdiFVZZXCWupP6OnY6PimuwaqsMuSfbDR8LDx4nHl8VuLGqqwyHKkee35WNbRiVVYZt
hdUGz5Wqxwb86qwKqsMnvYuw8cymeOY7MGqrDJ8fMxl+FiserR1deG9A+q80P4GHz7ZMOWjtc/
eyYtQ8ZpJMQEZQ0tLCyRJQkFBQczjTz31FDIzM8f8mgsuuAAffvhhzGOvvfYaLr/88nFfx+/3o7+/
Xz88Ho84EzowBCyfw4MHDx48ePDgEXNU1rUaHaUYiglI/
JiAjCFVCcjy5cshSdJZhxATmgkIDx48ePDgwWOMo63LXNXVEo0JSPyYgIwhVUuwhL4DkuQlWAgMYVt+NVZl
leFkQ5vht6XNfmwvUM9lSU2z4WPhwWOsQ/
EPYv3+SqzKKkNrZ+ySoMEBL1ZllWH13jL4hvoNH6tVjhpPO1ZllWFrvvjL2k41tWFVVhk+PFhl+Fh4TOKw+
T5DJiDxYwIyjszMTPziF7/
QP45EIrj66qvPuQn9rrvuinns1ltv5Sb0czjo6oTDKcNZ1W70UEytbzigd5pmnXcSmdal+Wh9T8zjp9rUAg
rvFzYYNDJr6h0K6Ju6I4I3dsyqbJ1UrxgiEdgtXksGJiDj2LJlC9LT07Fx40acPHkSjzzyCObOnYv2djVY/
vGPf4xly5bpz8/Pz8f555+PV155BdXV1Vi+fDnL8E6gtnMQDqeMjfn1Rg/
F1Arc3XA4ZewoYfM2Etvxxl69Kdrp9lez90MyRCIKVu8Xv+R5JKLg9Tw3HE4Znl57b24mc7BbvJYMTEDOYf
Xq1ViwYAFmzpyJzMxMFBYW6p9bvHgxli5dGvP8bdu24Stf+QpmzpyJr371q2xEOAFfMKyXBBzilftpURQF7
xyug8Mp42SrPeYNmVdHv1pmdU1OTcwV+U0F9XA4ZdR0sElaon1Y1AiHUxa2AV3fcABbjqpjfC23BmHB79QQ
AfaL15KBCYhA7DihNx1RmyO5BP3jKLpW74ge0I3X4I1IFJGIgjU5arPMjn4fgNh+FcMBXohINK2zeH6NWJu
GFUVBuadPv0OzJqcGNR2DRg+LaFLsGK8lGhMQgdhxQudUd8DhlJHDpRfToi1dyapsM3ooRJOys6QZDqeM44
29AAB3dCnmuwX1xg7Mokqb+uBwythV2jzxk1Nk0B/CjhKPnnhuL/
ag3xc0elhEk2bHeC3RmIAIxI4TWo52737vCDefTlU4omBtrrpuuqF7yOjhEE1KUV0PHE4ZH5W1AAAOyGoxi
mwWo0gKT+8wHE4Zbx2qM3ooANT3fO19a9U+F4439kKxeUUlMh87xmuJxgREIHac0EP+kF7ByRcMGz0cU6np
UK8cv3mgVvgKN0Sa5j512eDreW4oiqLvUeAepuQ4fYmbke+xvmAYeypa9bG8X9iA7kG/
YeMhiocd47VEYwIiELtO6A3RTdS1nVz/OxUfl6slTQ/
ILFtJ5hEKR7Bqn7ruv83rw6vZ6v9zCU7yrD9Ya2iFqYbuIX0Mr2a7kO/
u4mZzMjW7xmuJxAREIHad0NomSdZ/
nzxfMKwHcR0DPqOHQzQl2441weGU9SRalOVBVrWrVN13U9rUl9LXDYYj+j4/
h1PGhsN1aPWOpHQMRMlg13gtkZiACMSuE7qqpR8Op4zNRY1GD8U0KjxeOJwyNhXUc/
00mU6+u0tfeskiCsl3uKYr5fts2rw+bMyv15OP/dXtrNRHlmHXeC2RmIAIxK4T2jsS1G/
NB8P8AzUZW6NXkI+d0VGayAwau9WN0b/fLOOxtTI+LfAaPSRL04p9pOIiTziioMDdrS+te/
NALeq7WCSDrMWu8VoiMQERiF0ntKIo+vrgph52wZ2IlrCtyJYxwHXzZELtnRH87wddyFgkI2ORjPNmBbBkC
dDba/TIrKlnKACHU8bq/a6k3jHtGQrgg8JG/
a7HpxWtLC5ClmTXeC2RmIAIxM4TOqtSrY5S4O42eijCK6zt1mvnE5nRkiXAJV9vRMYiGXMy3ZAkBWlp6uOU
eJGIou8Z6xsOJPz7K4qCksZe/TXW5rpxqo3NZcm67ByvJQoTEIHYeUKXe/
oYVE+Coij6uuoTLVy2QuYjy4AkAbO+2ImMRTIuuqEVkgT9cLmMHqE1aXcmXO2JTQz6fUH8uXi0qeBfjnt4Z
5Ysz87xWqIwARGInSd096Bfb0zF8ozja+/36Usp/CEubSDz2bNHTTRmnB/
GrGs7cN6sQEwCsmeP0SO0ps9OtMHhlJHv7krI91MUBSdb+/
Fabo3+nlTW1MeiGGQLdo7XEoUJiEDsPKEVRcHreWp33JY+lmkcT86pDn1tNZEZaXdAxjt4ByQ5jjf2wuGUs
TvagT4eI4GwXkJZ29zeO5T4pV1EorJzvJYoTEAEYvcJ/
VGZ+gftKCs7jSkcUfBGNEmrY1UZMrElS4C0tNjEg3tAkqupR6089nacPVfquoaw7oBbr1xYWNuNCO9ak83Y
PV5LBCYgArH7hNau0O0saTZ6KEKq6xqCwynjjTw3/+CTqfX2qsnG6QkIq2Ally8Y1u9YTGf5ZiAUQXa0aaz
DKePdgnq097MJKtmT3eO1RGACIhC7T+iO6P6GNTk1DLDH8GmFWiks51SH0UMhSgiXS93zwWVXqaGVO5/
qMteWvhG8c7hOTz5yT3WwZxPZmt3jtURgAiIQu0/
oSETBmhx1Q2MHr6zF8IfCeolLXnUkounYWdIMh1NGWVPfpJ4fjig45OrSO9avP1jLXk1EYLyWCExABMIJPf
oHsqSRazFOd6LFC4dTxsb8elaZIaJpOeTqgsMpY9/
J9gmf2zXox3tHGvS7HlmVbWwqSBTFeC1+TEAEwgkNHK3vgcMp4+Py+Cu1WMn2aJ39wlo2aiSi6TnVNgCHU8
aWo43jPicSUVDc0IOV0Tuur+e5E947hMjsGK/FjwmIQDihgea+EX2jNa/
0qwZ8QX0JhHeEDb6IaHq0fktrcmrG7LfkHQ5i67Em/
a7HrtJmDPlDBoyUSGyM1+LHBEQgnNBAKBzR9zr0sK48AOBY9K7Q1mNNRg+FiExMUUZLeZ++l0NRFFQ2e/
U9eGtyalDZ7OVFIKJxMF6LHxMQgXBCq7ZFr8BVeLxGD8VwiqJgU0E9zwcRJURWpdoR/
aCrEwAwHAhhV2mzftdj69EmeId5p5XoXBivxY8JiEA4oVX57q7opkd2+
+4YUEsTr9rn4gZQIoqbtg9kU0E9ajoG9TsiK/
e5cLS+hyXQiSaB8Vr8mIAIhBNa1dg9rJd8tLsDcic35RNRwviCYX1PmXZsOtKAzgG/0UMjMg3Ga/
FjAiIQTmhVIBTBq9ku22+6jkQUvHlAbRzm7hw0ejhEZBFbj6rLXFdkq0uxQmwqSDQljNfixwREIJzQozYXN
cLhlFHVYt9z0dA9pJfBHKtiDRHRdDT1DGN3WQs8vWwqSDQdjNfixwREIJzQow661KVHzqqJG2ZZlbZZdH+1
fc8BERGRaBivxY8JiEA4oUfVdg7qnb/
tKBCK6CUxW70jRg+HiIiIohivxY8JiEA4oUedvlHSjo2wTrb2w+GU8c7hOtbiJyIiEgjjtfgxAREIJ3SsTU
ca4HDKcLUPGD2UlNPq8he4u40eChEREZ2G8Vr8mIAIhBM6Vk51BxxOGTmnOoweSsqtP6hWv2rp4/
IrIiIikTBeix8TEIFwQseS29WGWe8daTB6KCnlC4b1+vxsPkhERCQWxmvxYwIiEE7oWEP+kF6r3k6BeHPfC
BsxEhERCYrxWvyYgAiEE/psGw7XweGUUWujRnzlnj44nDJ2lHiMHgoRERGdgfFa/
JiACIQT+mzOqnY4nGq3Xrt4b18HHlsr48Mc+/
zMREREZsF4LX5MQATCCX22qha1HO3mokajh5J0PT3AkiXAxTd6kLFIxgWXe7FkCdDba/
TIiIiISMN4LX5MQATCCX0270gQDqeMV7NdCIYjRg8nqZYsAdLSgDmZbmQskpE224e0NPVxIiIiEgPjtfgxA
REIJ/
TZFEXRS9I29QwbPZykkWVAkoAZF4SQsUhGxiIZ0nkRSJL6uMtl9AiJiIgIYLyWCExAxtDT04MHHngAl1xyC
TIyMvDQQw9hcPDcm6AXL14MSZJijp/97GdTel1O6LHtqWi1fFO+PXvURCP9mh5kLJJxyd/
W68mHJKmfJyIiIuMxXosfE5Ax3HnnnbjppptQWFiIQ4cO4ctf/jLuv//+c37N4sWL8fDDD6OtrU0/
pjoxOaHHplWF2l5s3apQsgzMmBnCnFtq1P0f8/tjEhDeASEiIhID47X4MQE5w8mTJyFJEo4dO6Y/
lpWVhRkzZqClpWXcr1u8eDGeeOKJuF6bE3ps3YN+OJwyVu1zIRxRjB5O0nzzvjZc+n9kzP5aIyRJgSSBe0C
IiIgEw3gtfkxAzvD2229j7ty5MY+FQiGkpaVhx44d437d4sWLMW/ePHzuc5/
DV7/6VSxbtgzDw1Pbs8AJPTZFUfB6nhsOp4yWvhGjh5MUrd4RvPiRjL9dqm4+1+58sAoWERGRWBivxY8JyB
leeOEFfOUrXznr8fnz52Pt2rXjft26deuwd+9eVFRU4P3338fVV1+N733ve+d8Lb/fj/
7+fv3weDyc0OP4qKwFDqeMo/U9Rg8l4RRFwYdFjXA4Zew90QaXS93zwWVXRERE4mECEj/bJCBPP/
30WZvEzzyqq6unnYCcaf/+/ZAkCW63e9znLF+
+fMxxcEKf7XhjLxxOGTtLmo0eSsJpvU7W5NRg0B8yejhERER0DkxA4mebBKSzsxPV1dXnPAKBwLSXYJ1paG
gIkiRh79694z6Hd0Amr6PfpwfpEQvtA/GHwnjzgFpm+JgF7+4QERFZDROQ+NkmAZksbRN6cXGx/
thnn3024Sb0Mx0+fBiSJKG8vHzSX8MJPb5IRMGanBo4nDI6+n1GDydhDrm64HDKeOdwHUIWb7RIRERkBYzX
4scEZAx33nknvvGNb6CoqAiHDx/G9ddfH1OGt7m5GTfccAOKiooAAG63G88//
zyKi4tRX1+P3bt340tf+hJuu+22Kb0uJ/
S57SxphsMpo6TRGruy+4YDWLnPBYdThrvz3H1miIiISAyM1+LHBGQMPT09uP/++zF79mzMmTMHP/
nJT2IaEdbX10OSJOTm5gIAmpqacNttt+Gyyy5Deno6vvzlL+Opp55iH5AEO1rfA4dTxsflk78TJbLd0Y31f
znugaJYZ1kZERGRlTFeix8TEIFwQp9bc98IHE4Zb+S5TR+wN3YPw+GU8Wq2C92DfqOHQ0RERJPEeC1+TEAE
wgl9bqFwBKuiS5Z6hgJGD2faIhEFmwrq4XDKyDnVYfRwiIiIaAoYr8WPCYhAOKEntu1YExxOGRUer9FDmbb
Spj44nDJez3PDFwwbPRwiIiKaAsZr8WMCIhBO6Inlu9WqUVmVrUYPZVpGAmG
szVW7upd7+oweDhEREU0R47X4MQERCCf0xLS9E+sP1ho9lGnZX90Oh1PGpiMNlupnQkREZBeM1+LHBEQgnN
ATC4QieDVb3QfiHQkaPZwp0bq5O5wymnqGjR4OERERTQPjtfgxAREIJ/
TkbC5qhMMpo6rFPOepwuPVk498d5fRwyEiIqJpYrwWPyYgAuGEnpyDrk44nDKyq9qNHsqkVLX0Y0W2mnwcd
HWavoQwERGRnTFeix8TEIFwQk9ObecgHE4ZG/
PrjR7KhE61DejJR86pDiYfREREJsd4LX5MQATCCT05vmBYD+qH/
CGjhzOumo5Bfb9KdlU7kw8iIiILYLwWPyYgAuGEnrxNRxrgcMpwtQ8YPZQx1XUNYWW0aWJWZRuTDyIiIotg
vBY/JiAC4YSevJzqDmE7iTf1DOsd2z8pb2W5XSIiIgthvBY/
JiAC4YSePLl9AA6njPeONBg9lBjNfSNYvV9NPnaVNiPM5IOIiMhSGK/FjwmIQDihJ2/
IH4LDKWNFtgxfMGz0cAAAbV4f1uTUwOGUsaPEg1A4YvSQiIiIKMEYr8WPCYhAOKGnZsPhOjicMmo7B40eCj
r6fXgtV00+thd7EGTyQUREZEmM1+LHBEQgnNBT46xq13trGKlr0I/
X89xwOGVsPdqEQIjJBxERkVUxXosfExCBcEJPTVVLPxxOGZuLGg0bQ+9QAOsOqMnHB4WNwiwHIyIiouRgvB
Y/
JiAC4YSeGu9IEA6njFezXYYsefIOB7H+YK2+GZ7JBxERkfUxXosfExCBcEJPjaIoegLQ1DOc0tfu9wXx1iF
1D8q7BfUYDojbEJGIiIgSh/Fa/JiACIQTeur2VLTC4ZRR4O5O2WsO+kN4J7oB/
p3DdRgUuBs7ERERJRbjtfgxAREIJ/
TUlXv69MpTqTAcCOHdgno4nDLeOlSHfl8wJa9LREREYmC8Fj8mIALhhJ667kE/HE4Zq/
a5kt70zxcM470jDXA4Zaw/
WAvvMJMPIiIiu2G8Fj8mIALhhJ46RVH0ErgtfSNJex1fMIwPixrhcMpYd8CN3qFA0l6LiIiIxMV4LX5MQAT
CCT09H5W1wOGUcbS+JynfPxCKYOvRJjicMl7Pc6Nr0J+U1yEiIiLxMV6LHxMQgXBCT8/xxl44nDJ2ljQn/
HsHwxFsL/bA4ZTxWm4NOvp9CX8NIiIiMg/Ga/
FjAiIQTujp6ej3weGUsSanBpEE7gMJhSPYUeLRv3erN3lLvIiIiMgcGK/
FjwmIQDihpycSUbAmpwYOp4yOgcTcoQhHFOyOLu1avd+F5iTuLyEiIiLzYLwWPyYgAuGEnr6dJc1wOGWUNP
bG/b0iEQWflLfq1bUau1Pb5JCIiIjExXgtfkxABMIJPX1FdT1wOGV8XN4S1/
dRFAVZlW1wOGWs3OdCXddQgkZIREREVsB4LX5MQATCCT19zX0jcDhlvJHnhqJMbx+IoijIrmqHwynj1WwXa
joGEjxKIiIiMjvGa/
FjAiIQTujpC4UjWLXPBYdTRs80enQoioKcUx1wOGWsyJZxqo3JBxEREZ2N8Vr8mIAIhBM6PtuOqb06KjzeK
X2doig46OqEwynD4ZRxomVqX09ERET2wXgtfkxABMIJHZ98dxccThlZla1T+roCd7eefJR7+pI0OiIiIrIC
xmvxYwIiEE7o+DR2D8PhlLH+YO2kv+ZofY+efBxPQAUtIiIisjbGa/
FjAiIQTuj4BEIRvJqt7gPxjgQnfL7WQd3hlHG0vicFIyQiIiKzY7wWPyYgAuGEjt/
mokY4nDKqWs59Dss9fXryke/uStHoiIiIyOwYr8WPCYhAOKHjp20mz65qH/
c5J1q8evJx0NU57bK9REREZD+M1+LHBEQgnNDxq+0chGPncWzc6ASysoDcXKB9NBk51TaAFdlq8pFzqkO85
KO9XR3zGGMnshTOdSIyKcZr8WMCIhBO6Dj19MD3+jqs+OWf4PjpHzF07w+Ae+4BfvpTYN061Lia9T0i2VXt
YiUfPT3AunXqWO+5B/iXf4kZO3q4R4UsgnOdiEyO8Vr8mICM4b//
+79x66234sILL0RGRsakvkZRFDz77LO44oorMGvWLNx++
+1wuVxTel1O6Dj09ADPPQf88z9j069ewu+f3IS3H/wArsdWAI8+irrvP4iVv3sDjt1lyKpsEy/
5iI4djz4KPPsssHy5+t9HH1Uff+45BmZkfpzrRGQBjNfixwRkDM899xwcDgf+4z/
+Y9IJyMsvv4yMjAzs2rUL5eXluPvuu3HttdfC5/NN+nU5oeOwbh3wz/+Mnl//EYsWlSJjkYxZX+qAJAH/
+LUq/N/fvAnHvz+PT/7/
dxGJCJR8APrY8bvfqcHYmcfvfqd+ft06Q4dJFDfOdSKyAMZr8WMCcg4bNmyYVAKiKAquuOIK/
OlPf9If83q9SE9Px+bNmyf9epzQ09Teri7fePRRLLmuBunzvMhYJGP21xuQNmcYc2+V8bf/3xHs/uXzCP/
0p2KtNT9t7GMGZNrx6KPq80QaO9FUcK4TkUUwXosfE5BzmGwCUltbC0mSUFpaGvP4bbfdhl/
96lfjfp3f70d/f79+eDweTujpyM0F7rkH8mOvQpKAGReEkLFIRsYiGXNudSFjkYyL/
5cH1Y+tUNea5+UZPeJR0bHrS1HGO559VryxE00F5zoRWQQTkPgxATmHySYg+fn5kCQJra2tMY9///
vfx3333Tfu1y1fvhySJJ11cEJPUVYW8C//
gj0PvAdJAiQJmH1To56EXHyjB9J5Eex54D3g3nvV54siOvZzBmTaIdrYiaaCc52ILIIJSPxsk4A8/
fTTYwb7px/
V1dUxX5PsBIR3QBLkjDsgkgRIaWGkzRlG2iUjkCQFkgR1Q7poV1Z5VZjsgnOdiCyCCUj8bJOAdHZ2orq6+p
xHIBCI+ZpkL8E6Eyf0NJ2xByRtRmQ0EZGAtBkRLLmuZnRteUeH0SMeNdV18SKNnWgqONeJyCIYr8XPNgnId
Ex1E/orr7yiP9bf389N6KkUra7T+
+vnseS6mpgEZMl1Nej99fPiVtdhZSCyC851IrIAxmvxYwIyhsbGRpSWluIPf/
gDZs+ejdLSUpSWlmJwcFB/zg033IAdO3boH7/88suYO3cudu/ejYqKCnz3u99lGd5UOqO/
gOuxFdjzwHt6HxCh+wuwNwLZBec6EVkA47X4MQEZw9KlS8fcI5Kbm6s/R5IkbNiwQf9Ya0T4+c9/
Hunp6bj99tshy/KUXpcTOk5ndli+917zdFg289iJpoJznYhMjvFa/JiACIQTOkHa29UNrFlZ6n/
NtJbczGMnmgrOdSIyKcZr8WMCIhBOaCIiIiKxMV6LHxMQgXBCExEREYmN8Vr8mIAIhBOaiIiISGyM1+LHBE
QgnNBEREREYmO8Fj8mIALhhCYiIiISG+O1+DEBEQgnNBEREZHYGK/
FjwmIQDihiYiIiMTGeC1+TEAEwglNREREJDbGa/FjAiIQTmgiIiIisTFeix8TEIFwQhMRERGJjfFa/
JiACMTr9UKSJHg8HvT39/
PgwYMHDx48ePAQ7PB4PJAkCV6v1+jQ0bSYgAhEm9A8ePDgwYMHDx48xD5qa2uNDh1NiwmIQCKRCDweD7xer
+HZ/ekZPu/I8BzxHPEcGX3wHPEc8RzxHIlyNDU1QZIk9PX1GR06mhYTEBpXfz/XOE6E52hiPEcT4zmaGM/
RxHiOJsZzNDGeo4nxHMWPCQiNi79gE+M5mhjP0cR4jibGczQxnqOJ8RxNjOdoYjxH8WMCQuPiL9jEeI4mxn
M0MZ6jifEcTYznaGI8RxPjOZoYz1H8mIDQuPx+P5YvXw6/37rpo0IAAAqjSURBVG/
0UITFczQxnqOJ8RxNjOdoYjxHE+M5mhjP0cR4juLHBISIiIiIiFKGCQgREREREaUMExAiIiIiIkoZJiBERE
RERJQyTECIiIiIiChlmIDQuNasWYOFCxciPT0dmZmZKCoqMnpIKXPgwAHcdddduPLKKyFJEnbu3BnzeUVR8
Oyzz+KKK67ArFmzcPvtt8PlcsU8p6enBw888AAuueQSZGRk4KGHHsLg4GAqf4ykefHFF3HzzTdj9uzZmD9/
Pr773e/i1KlTMc/x+Xx47LHHcNlll+Hiiy/GPffcg/b29pjnNDY24tvf/jYuvPBCzJ8/H//5n/
+JUCiUyh8ladauXYu/+Zu/wSWXXIJLLrkEt9xyC/bs2aN/3u7nZywvvfQSJEnCE088oT9m9/
O0fPlySJIUc9xwww365+1+fjTNzc340Y9+hMsuuwyzZs3CjTfeiGPHjumft/
t79sKFC8+aR5Ik4bHHHgPAeQQA4XAYzzzzDL74xS9i1qxZ+NKXvoTnn38eiqLoz7H7PEokJiA0pi1btmDmz
Jl45513UFVVhYcffhhz585FR0eH0UNLiT179uD3v/
89duzYMWYC8vLLLyMjIwO7du1CeXk57r77blx77bXw+Xz6c+68807cdNNNKCwsxKFDh/DlL38Z999/f6p/
lKRYsmQJNmzYgBMnTqCsrAzf/va3sWDBAgwNDenP+fnPf44vfOEL2L9/
P4qLi3HLLbfgm9/8pv75cDiMG2+8Ed/61rdQWlqKPXv2YN68efjtb39rxI+UcB999BE+/
fRTuFwuyLKM3/3ud7jgggtw4sQJADw/Zzp69Ci+
+MUv4mtf+1pMAmL387R8+XJ89atfRVtbm350dXXpn7f7+QGA3t5eLFy4EP/2b/
+GoqIi1NXV4bPPPoPb7dafY/f37M7Ozpg5lJ2dDUmSkJubC4DzCABeeOEFfO5zn8Mnn3yC+vp6bN+
+HbNnz8bKlSv159h9HiUSExAaU2ZmJh5//HH940gkgquuugovvfSSgaMyxpkJiKIouOKKK/CnP/
1Jf8zr9SI9PR2bN28GAJw8eRKSJMVcgcvKysKMGTPQ0tKSusGnSGdnJyRJwoEDBwCo5+OCCy7A9u3b9edUV
1dDkiQcOXIEgJrknXfeeTFX2V5//
XXMmTMHgUAgtT9Ailx66aV46623eH7OMDg4iOuvvx7Z2dlYvHixnoDwPKkJyE033TTm53h+VE8//TT+4R/
+YdzP8z37bE888QSuu+46KIrCeRT1ne98Bw899FDMY/fccw9+9KMfAeA8SjQmIHSWQCCAtLS0s676P/
jgg7j77rsNGpVxzkxAamtrIUkSSktLY55322234Ve/
+hUA4O2338bcuXNjPh8KhZCWloYdO3Ykf9ApVlNTA0mSUFlZCQDYv38/
JElCX19fzPMWLFgAh8MBAHj22WfPCqzq6uogSRJKSkpSM/
AUCYfD2Lx5M2bOnImqqiqenzM8+OCDePLJJwEgJgHheVITkIsuughXXnklrr32WjzwwANobGwEwPOj+eu//
ms8+eSTuPfeezF//nx8/etfx5tvvql/nu/ZsQKBAD73uc/
hhRdeAMB5pHnhhRewcOFCyLIMACgrK8Pll1+O999/
HwDnUaIxAaGztLS0QJIkFBQUxDz+1FNPITMz06BRGefMBCQ/Px+SJKG1tTXmed///
vdx3333AVDfyL7yla+c9b3mz5+PtWvXJnfAKRaJRPCd73wHixYt0h/74IMPMHPmzLOe+3d/93f4r//
6LwDAww8/
jDvuuCPm88PDw5AkKWavhJlVVFTg4osvRlpaGjIyMvDpp58C4Pk53ebNm3HjjTfqSxhOT0B4ntQrz9u2bUN
5eTn27t2LW2+9FQsWLMDAwADPT1R6ejrS09Px29/+FiUlJVi3bh1mzZqFjRs3AuB79pm2bt2KtLQ0/
Yo855EqEong6aefxowZM3D++edjxowZePHFF/XPcx4lFhMQOgsTkFhMQM7t5z//ORYuXAiPx6M/
xj9oqkAggJqaGhQXF2PZsmWYN28eqqqqeH6impqacPnll6O8vFx/
jAnIufX19WHOnDl46623eH6iLrjgAtx6660xj/3yl7/ELbfcAoDv2We64447cNddd+kfcx6pNm/
ejGuuuQabN29GRUUFNm3ahMsuu4yJbJIwAaGzcAlWLC7BGt/jjz+Oa665BnV1dTGP85b+2G6//
XY88sgjPD9RO3fuhCRJSEtL0w9JkjBjxgykpaVh3759PE9juPnmm7Fs2TLOo6gFCxbg3//932MeW7t2La66
6ioAfM8+XUNDA8477zzs2rVLf4zzSHXNNddgzZo1MY/
98Y9/1KvOcR4lFhMQGlNmZiZ+8Ytf6B9HIhFcffXV3ISO0Y1or7zyiv5Yf3//
mBvRiouL9ed89tlnltmIpigKHn/8cVx11VVnlSAERjfH/
vnPf9YfO3Xq1JibGk+vrLZu3TrMmTMHfr8/+T+EAf7xH/
8RS5cu5fmJGhgYQGVlZcxx880341//9V9RWVnJ8zSGwcFBXHrppVi5ciXPT9T9999/1ib0J598Ur8rwvfsU
cuXL8cVV1wRUz6X80h12WWXnXWX4sUXX8T1118PgPMo0ZiA0Ji2bNmC9PR0bNy4ESdPnsQjjzyCuXPnnlUX
3KoGBwdRWlqK0tJSSJIEh8OB0tJSffPnyy+/
jLlz52L37t2oqKjAd7/73TFL8X3jG99AUVERDh8+jOuvv94ypfgeffRRZGRkIC8vL6a048jIiP6cn//
851iwYAFycnJQXFyMW2+9NWaZhFbW8Y477kBZWRn27t2L+fPnW6as47Jly3DgwAHU19ejoqICy5Ytw4wZM+
B0OgHw/Izn9CVYAM/Tb37zG+Tl5aG+vh75+fn41re+hXnz5qGzsxMAzw+glnA+//
zz8cILL6CmpgYffPABLrroIn3zMMD3bEC9kLhgwQI8/
fTTZ32O8whYunQprr76ar0M744dOzBv3jx9GRrAeZRITEBoXKtXr8aCBQswc+ZMZGZmorCw0OghpUxubu6Y
TZuWLl0KYLQZ0ec//3mkp6fj9ttv1ytnaHp6enD//
fdj9uzZmDNnDn7yk59YphnRWOdGkiRs2LBBf47W2OrSSy/
FRRddhO9973toa2uL+T4NDQ34p3/6J1x44YWYN28efvOb31imsdVDDz2EhQsXYubMmZg/fz5uv/
12PfkAeH7Gc2YCYvfz9IMf/ABXXnklZs6ciauvvho/+MEPYvpb2P38aD7++GPceOONSE9Px1/91V/
FVMEC+J4NqFfiJUk66+cGOI8A9Y7sE088gQULFuiNCH//+9/
HlBnmPEocJiBERERERJQyTECIiIiIiChlmIAQEREREVHKMAEhIiIiIqKUYQJCREREREQpwwSEiIiIiIhShg
kIERERERGlDBMQIiIiIiJKGSYgRERERESUMkxAiIiIiIgoZZiAEBERERFRyjABISIiIiKilGECQkREREREK
cMEhIiIiIiIUoYJCBERERERpQwTECIiIiIiShkmIERERERElDJMQIiIiIiIKGWYgBARERERUcowASEiIiIi
opRhAkJERERERCnDBISIiIiIiFKGCQgREREREaXM/wPbgT3nfEYG0QAAAABJRU5ErkJggg==\"
width=\"800\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"correl_ir = si.correlate(sig_ir, waveform, mode=\"valid\") / norm_w\n",
"# valid : on ne prend que les valeurs de la corrélation pour lesquelles le
support de l'onde\n",
"# est inclus dans le signal\n",
"\n",
"plot_correl(correl_ir, data, T)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dans le cas de réflexions plus importantes telles que la condition ne soit
plus respectée, le décodage simple utilisé ici ne fonctionne plus : le septième bit
n'est pas bien décodé.\n",
"\n",
"Il devient alors nécessaire d'utiliser des techniques plus sophistiquées
d'*égalisation de canal* (estimation de la réponse du canal, et prise en compte de
la réponse dans le décodage)."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"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 = $('<div/>');\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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all '
+\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\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 = $('<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 = $('<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 = $('<canvas/>');\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 = $('<div/>');\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 = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all
' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\
n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt ===
mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then
trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\
n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id:
this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format =
format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\
n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL ||
window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21)
== \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message
type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \",
msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type +
\"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-
in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from
http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the
document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-
home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-
arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-
right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan
axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"],
[\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"],
[\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-
save\", \"download\"]];\n",
"\n",
"mpl.extensions =
[\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm)
{\n",
" // Create a \"websocket\"-like object which calls the given IPython
comm\n",
" // object with the appropriate methods. Currently this is a non binary\
n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage
function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a
real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id +
\"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in
FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' +
width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\"
width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\"
title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></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 = $('<span class=\"mpl-message\" style=\"text-
align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline
pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\"
title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove
icon-large\"></i></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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 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"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img
src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAGQCAYAAABWJQQ0AAAgAElEQVR
4nOzdeXxU9b3/8QORJKBAsKISlGERtQUXqo67uS4/
aNGi9VqteiFeWygVWtCKQVHjBoiIqIAUtYgLJS4XXMImKlIFQZGw74sYkU0kISwJZPL+/
RHmJEMSEshkzueQ1/
PxmD8ymZz5zsm39vMiszgCAAAAgBhxvF4AAAAAgNqDAAEAAAAQMwQIAAAAgJghQAAAAADEDAECAAAAIGYIE
AAAAAAxQ4AAAAAAiBkCBAAAAEDMECAAAAAAYoYAAQAAABAzBAgAAACAmCFAAAAAAMQMAQIAAAAgZggQAAAA
ADFDgAAAAACIGQIEAAAAQMwQIAAAAABihgABAAAAEDMECAAAAICYIUAAAAAAxAwBAgAAACBmCBAAAAAAMUO
AAAAAAIgZAgQAAABAzBAgADy3ceNGpaena/HixV4vBQAA1DACBICn9u/fr4svvli///
3vFQqFvF5OzGzYsEGO4+i1117zeimHNXPmTDmOo5kzZx7RzwUCAaWmptbImmrSoes+2sd/
pGJ1P5Y4jqP09HSvlwHAAwQIgGp77bXX5DiOe4mLi1NycrJSU1P1ww8/HPZn+/
btq8suu0x79+6N0WptIEBsIkBihwABai8CBEC1hQPkiSee0JtvvqlXXnlFf/
rTnxQXF6c2bdpo37595f7czp079fjjj+unn36K8Yq9V1RUpH379qmwsNDrpRzW0Q7G+fn52r9/
f80sqgYRILFDgAC1FwECoNrCAfLNN99EXJ+WlibHcfT22297tDJUV20bjAmQ2CFAgNqLAAFQbRUFSGZmphz
H0aBBg8r8zJQpU3TFFVeoQYMGOuGEE9S5c2ctXbo04japqak6/
vjjtW7dOnXs2FENGjRQs2bN9Pjjj6uoqCjitrt379Z9992n0047TfHx8TrzzDM1dOjQMrdzHEe9evXSpEmT
1K5dO8XHx+tXv/
qVpk6dGnG7Xbt2qU+fPgoEAoqPj1fTpk113XXX6dtvv4243dy5c9WpUyc1atRI9evX11VXXaUvv/
yy0nNW3lOwwo9348aNuv7663X88ccrOTlZI0eOlCQtXrxYV199tRo0aKAWLVpo/PjxEccM/
x5mzZqlHj166MQTT1TDhg3VtWtX/fzzz2XOQ3nDX1UG8NWrV+vmm2/
WKaecooSEBDVv3ly33XabcnJyKjyOJK1bt0633HKLmjRpovr16+viiy9WZmZmxG3C9/f222/
rqaeeUvPmzZWQkKBrrrlGa9asibhtSkqK2rVrp2XLlum//uu/
VL9+fSUnJ2vIkCFlHld+fr4effRRtWnTRvHx8TrttNPUr18/5efnH/
Hjl47+9y5J2dnZuvHGG9WgQQM1bdpUffv21bRp08rcT0VPY0tJSVFKSkqV7uvNN9/
URRddpPr16yspKUlXXnmlpk+f7n7//
fffV+fOndWsWTPFx8erdevWeuKJJ8r8Za6q57qgoECPPPKIfv3rX6tRo0Zq0KCBrrjiCn322Wdl1kaAALUX
AQKg2ioKkJEjR8pxHI0ePTri+jfeeEN16tTRb37zG40YMUJDhgxRy5YtlZSUpA0bNri3S01NVWJiotq2bau
uXbtq5MiRuuGGG+Q4jh555BH3dkVFRbrmmmtUp04d/fnPf9bIkSP1u9/9To7jqG/
fvhH37TiOzjvvPDVr1kxPPvmknn/+ebVu3VoNGjSIeCrYHXfcofj4eN1333169dVXNWTIEP3ud7/
TW2+95d7m008/VXx8vC699FINGzZMw4cP17nnnqv4+HjNmzfvsOesogBJTEzUr371K/
Xs2VOjRo3SZZdd5t4uOTlZ/fr104gRI9SuXTvFxcVp/
fr1ZX4P55xzjq688kq9+OKL6tWrl+rWraurrroqIsaONkAKCgrUqlUrJScn66mnntKrr76qxx9/XBdddJG+
++67Co+zZcsWnXLKKWrYsKEGDBig5557Tuedd57q1q2riRMnlrm/
Dh066IILLtDw4cP12GOPqUGDBgoGgxFrTUlJUXJysk4//
XT16dNHL730kq655ho5jqMpU6a4twuFQm7A9u3bV2PGjFHv3r113HHH6cYbbzyixy9V7/
e+d+9enXnmmUpMTNQDDzyg559/
XhdccIHOPffcqAfIY489JsdxdNlll2no0KF64YUXdMcddygtLc29zU033aRbb71VQ4cO1ejRo/WHP/
xBjuPo/
vvvL3OfVTnX27dvV7NmzXTfffdp9OjReuaZZ3TWWWepXr16ysrKijgmAQLUXgQIgGoLD76ffPKJtm/
fruzsbL333ntq2rSpEhISlJ2d7d42Ly9PSUlJ6t69e8QxtmzZosaNG0dcn5qaKsdx9Le//
c29rqioSNdff73i4+O1fft2ScX/
ius4jp566qmIY95yyy2qU6eO1q5d617nOI7i4+Mjrlu0aJEcx9GIESPc6xo3bqxevXpV+JiLiorUtm1bder
UKWKw37t3r1q1aqX/9//+32HPWUUBcuhfjHbu3Kn69eurTp06ysjIcK9fuXJlmQEu/
Hu44IILIl5/8cwzz8hxHH3wwQcR5+FoAiQrK0uO4+jdd9897OM79Dh9+/
aV4zj64osv3Ovy8vLUqlUrtWzZ0n0HtPD9/
fKXv1RBQYF72xdeeEGO42jJkiXudSkpKXIcR2+88YZ7XUFBgU499VT993//t3vdm2+
+qbp160bctyT985//lOM4mj17dpUff3V/
788//7wcx9E777zjXrdnzx6dccYZUQ2QNWvWqG7duuW+u9yh6z7UX/
7yFzVo0CDir0NVPdeFhYURvzepeA+fcsopuvvuuyOuJ0CA2osAAVBth74LVvjSsmXLiKd7SNLEiRPlOI4++
+wzbd+
+PeLSsWNHnXHGGe5twwP5qlWrIo4xdepUOY6jCRMmSJJ69OihuLg47dq1K+J2X331VZmwcBxHnTt3LvMYGj
VqpHvvvdf9OhAI6MILL9SmTZvKfcwLFiyQ4zh6/fXXyzyOP//
5z0pISDjs2wofLkC2bdsWcdvzzz9fJ5xwQpmnkyUlJalr167u1+Hfw5gxYyJul5eXp+OOO05/+ctfIs7D0Q
TI+vXr5TiO/
vznP2vPnj0VPr5Dj3PmmWeW+QuGJA0ePDgiLML398wzz0TcLny+S0dUSkpKueelS5cu6tChQ8TX7dq1K/
N7Wr16dZlwrezxV/f33rFjRzVr1qzMmsORGK0AGTp0qBzHKfNXh8PZtWuXtm/
frrfeekuO42jhwoUR91mVc11aKBTSjh07tH37dl1//fU6//zzI75PgAC1FwECoNrCg+
+oUaM0Y8YMvffee+rcubNOOOEEff755xG3HTJkSLmxEr40atTIvW1qaqrq1q2rAwcORBxj3bp1chxHgwcPl
iR16tRJp59+epl15eTklHk6ieM46tmzZ5nbBgIB3XXXXe7Xb7/9thITE1W3bl1ddNFFSk9P17p16yK+f7jH
4ThOmdddlHa4p2AdKiUlRWeffXa5a77hhhvcr8O/h/
Keb3/66aerU6dOEefhaF8Dct9998lxHNWvX18dO3bUyJEjI17/Ud5xEhISImIpLPzXq/BrQcL3V/
qvPVLJ+Ro3bpx7XUXnJTU1VS1btnS//uUvf3nY39Pf//73Kj/+6v7ezzrrLF155ZVlrv/ggw+iGiA9e/
ZU3bp1y/w14lBLly7VTTfdpEaNGpV5HLNmzYq4z6qca0kaN26czjnnHNWrVy/
ieK1atYq4HQEC1F4ECIBqK+81IIWFhbrkkkuUnJysvLw89/rwv3i/+eabmjFjRplL6QGspgKkvKdWlTfs/
fjjjxo1apT7guHExET3+e4TJkyQ4zgaOnRouY9jxowZh30b2sO9CP1Q4RcAl7fm66+/
3v06GgFy2mmnVelF2IsXL9aTTz6pK6+8UnXr1lXz5s0jnmpX3QA59Cle5Z2vis5LamqqAoGA+/
VZZ52lc845p8Lf08qVKytc96GPv7q/9yMJkJYtW5YbIFdccUVUAmTnzp36xS9+oVatWun555/
XRx99pBkzZrj/SFB6LVU912++
+aYcx9FNN92kN954Q9OmTdOMGTN0zTXXRNxOIkCA2owAAVBtFb0IPTy8hUNBkt555x05jlPmqVnlqe5TsOb
OnVvuU7CqGiClbd26Vc2bN9fll18uSfr666/
LfbpTVdVkgFTlKVhNmjRRnz59Im5XUFCguLi4I34b2tmzZ8txHA0YMCBibVV5CtbTTz9d7lOwohkgnTt3Vv
Pmzcs8fag8lQVIdX/vHTt2VHJycpWegtWhQ4cyL5KXimMyGk/BmjRpUpm/dEjSyy+/
fNQBcuONN6p169ZlHt9ll11GgABwESAAqq2iAJGkYDCoU045xf0wwtzcXDVq1EgpKSnl/ktx6dc/
HO5F6PXq1XNvG/
5X9EPf7ve2224r90XolQVIYWFhmacUSdJFF12kCy+8UFLx89vbtGmjtm3bRvyFp7zHUZ6aDJCKXoT+/
vvvu9ddeOGFZZ67P2LECDmOc9gBPDc3t8xfpHbt2qW6detG/
KWpohehz5kzx71u9+7dat26dbkvQo9mgIwbN67CaNi7d692795d4boPffzV/
b0fyYvQb7nlFp1yyikRf8X46KOP5DhOVF6E/
uGHH8pxnIinSRYUFOj8888/6gC5+eab1bp164j7nDt3rurUqUOAAHARIACq7XAB8u6778pxIt+Kd/
z48apbt67at2+vp556SmPGjNGAAQN0/
vnnR8RB6bfh7datm0aNGuW+De9DDz3k3i4UCunqq69WnTp11KNHD/dpU45T/tvwVhYgO3fu1PHHH6/
U1FQ999xzevnll3XrrbfKcRwNGzbM/ZmZM2cqMTFRLVq0UHp6ul5+
+WWlp6frqquuinhtRnlqMkDCb8M7YsQI9e7dW3Xr1tUVV1wR8a/
S4XeAuvnmmzV69Gj17NlTrVq10kknnXTYAXzSpElq3ry5+vbtq5deekkvvviiLrroItWrV09fffVVuedTKn
kb3saNG+uRRx7R8OHDdf7556tOnTrlvg1vNAMkFAqpc+fOqlOnjv74xz9qxIgRev7559WzZ0+deOKJEfu2K
q+Bqc7vPRwbiYmJSktLO+zb8IY/G+Tqq6/W6NGjdf/99+vUU09VmzZtqvQ2vI888ogcp/
hteJ999lmNGDFC3bp1U//+/SVJP/
30k5o0aaJAIKBhw4bpueeeU4cOHXTeeecddYCMHTtWjuOoS5cuGjNmjPr376+kpCS1a9eOAAHgIkAAVNvhA
iT8L8Zt2rSJ+HCzmTNnqlOnTmrcuLESExPVpk0b3XXXXZo/f757m/
BAXvqDCE855RSlp6eX+VfdvLw83XvvvUpOTla9evXUtm3bw34Q4aFKD54FBQXq16+fzjvvPDVs2FDHH3+8z
jvvPL300ktlfi4rK0s333yzfvGLXyghIUGBQEC33nqrPv3008Oes5oMkPAHETZp0kQnnHCC7rzzTu3YsSPi
Z0OhkNLS0nTSSSepQYMG6tSpk9auXVuld8G6++671aZNGyUmJurEE0/U1VdfrU8++aTC8xkW/
iDCpKQkJSYmKhgMVvhBhNEMEEnav3+/
hgwZonbt2ikhIUFNmjTRBRdcoMcff1y5ubkVrruip6Ad7e9dkjZu3KguXbqoQYMGOumkk9SnT59yP4hQkoY
NG+Z+GOPll1+u+fPnH9EHEY4dO1YdOnRwH3NKSopmzJjhfn/
27Nm65JJL3A8WfOCBBzR9+vSjDpCioiINGjRIgUBACQkJ6tChgzIzM8v9nRAgQO1FgAAwq6KBHOU7XAgCAG
AFAQLALALkyBAgAAA/IEAAmEWAHBkCBADgBwQIALMIkCNDgAAA/
IAAAQAAABAzBAgAAACAmCFAAAAAAMQMAWJIKBRSdna2cnJylJuby4ULFy5cuHDhwsXYJScnR9nZ2WU+jwpV
R4AYkp2dLcdxuHDhwoULFy5cuBi/ZGdnez06+hYBYkhOTo67ob2uey5cuHDhwoULFy5lL+F/
MM7JyfF6dPQtAsSQ3NxcOY6j3Nxcr5cCAACAcjCvVR8BYggbGgAAwDbmteojQAxhQwMAANjGvFZ9BIghbGg
AAADbmNeqjwAxhA0NAABgG/
Na9REghrChAQAAbGNeqz4CxBA2NAAAgG3Ma9VHgFRg1qxZuuGGG9SsWTM5jqNJkyZV+jMzZ85Uhw4dFB8fr
zZt2ui11147ovtkQwMAANjGvFZ9BEgFpkyZogEDBmjixIlVCpD169erQYMGuu++
+7R8+XKNGDFCcXFxmjZtWpXvkw0NAABgG/
Na9REgVVCVAHnggQfUrl27iOtuu+02derUqcr3w4YGAACwjXmt+giQKqhKgFx55ZXq06dPxHVjx45Vo0aNq
nw/1jZ0/oFC7Sk4oIIDIa+XAgAAYIK1ec2PCJAqqEqAtG3bVoMGDYq4bvLkyXIcR3v37i33Z/
Lz85Wbm+tesrOzTW3oR99fokBapoZNX+n1UgAAAEwgQKqPAKmCmgqQ9PR0OY5T5mJlQ4cD5FkCBAAAQBIBE
g0ESBXU1FOwrP8FJP2DpQqkZWroNAIEAABAIkCigQCpgqq+CL19+/YR191++
+2+fhE6AQIAABDJ2rzmRwRIBfLy8pSVlaWsrCw5jqPnnntOWVlZ2rhxoySpf//
+6tq1q3v78Nvw9uvXTytWrNCoUaN8/
za84QB5ZtoKr5cCAABggrV5zY8IkArMnDmz3NdnpKamSpJSU1OVkpJS5mfOP/98xcfHq3Xr1r7/
IMLHPiwOkCFTCRAAAADJ3rzmRwSIIdY29OMfLiNAAAAASrE2r/
kRAWKItQ0dDpCnCRAAAABJ9uY1PyJADLG2oZ/
4qDhABk8hQAAAACR785ofESCGWNvQTxIgAAAAEazNa35EgBhibUOHA2TQlOVeLwUAAMAEa/
OaHxEghljb0E9lHgyQyQQIAACAZG9e8yMCxBBrG3rg5OUECAAAQCnW5jU/
IkAMsbahwwEykAABAACQZG9e8yMCxBBrG3rQwQB5KnOZ10sBAAAwwdq85kcEiCHWNvSgKQQIAABAadbmNT8
iQAyxtqHDAfLkRwQIAACAZG9e8yMCxBBrG3rwlBUKpGXqCQIEAABAkr15zY8IEEOsbeinpxIgAAAApVmb1/
yIADHE2oYOB8jjHxIgAAAAkr15zY8IEEOsbeghBwPksQ+Xer0UAAAAE6zNa35EgBhibUM/
M40AAQAAKM3avOZHBIgh1jZ0OEDSPyBAAAAAJHvzmh8RIIZY29BDp60kQAAAAEqxNq/5EQFiiLUN/
ex0AgQAAKA0a/
OaHxEghljb0OEAefT9JV4vBQAAwARr85ofESCGWNvQww4GyCMECAAAgCR785ofESCGWNvQwz5eRYAAAACUY
m1e8yMCxBBrGzocIA9PIkAAAAAke/
OaHxEghljb0M8dDJABkxZ7vRQAAAATrM1rfkSAGGJtQw+fQYAAAACUZm1e8yMCxBBrGzocIA9NJEAAAAAke
/OaHxEghljb0M/PWK1AWqYeJEAAAAAk2ZvX/IgAMcTahn7hEwIEAACgNGvzmh8RIIZY29DhAOn/
fwQIAACAZG9e8yMCxBBrG/
pFN0AWeb0UAAAAE6zNa35EgBhibUOP+JQAAQAAKM3avOZHBIgh1jZ0OEDS3iNAAAAAJHvzmh8RIIZY29AjP
1ujQFqmHniXAAEAAJDszWt+RIAYYm1DEyAAAACRrM1rfkSAGGJtQ4cDpN+7C71eCgAAgAnW5jU/
IkAMsbahR80sDpD73yFAAAAAJHvzmh8RIIZY29AvzVxLgAAAAJRibV7zIwLEEGsbOhwg/yBAAAAAJNmb1/
yIADHE2oYe/XlxgNz3NgECAAAg2ZvX/
IgAMcTahv4nAQIAABDB2rzmRwSIIdY2dDhA7n07y+ulAAAAmGBtXvMjAsQQaxt6zKyDAZJBgAAAAEj25jU/
IkAMsbahX561jgABAAAoxdq85kcEiCHWNnQ4QPoSIAAAAJLszWt+RIAYYm1Dv/
Kf4gDpM2GB10sBAAAwwdq85kcEiCHWNjQBAgAAEMnavOZHBIgh1jZ0OED+ToAAAABIsjev+REBchgjR45UI
BBQQkKCgsGg5s2bd9jbDx8+XGeeeaYSExN12mmnqW/fvtq3b1+V78/ahn71i/UKpGXqb/
8mQAAAACR785ofESAVyMjIUHx8vMaOHatly5ape/fuSkpK0tatW8u9/
fjx45WQkKDx48drw4YNmj59upo1a6Z77723yvdpbUP/
iwABAACIYG1e8yMCpALBYFC9evVyvw6FQkpOTtbgwYPLvX2vXr10zTXXRFx333336fLLL6/
yfVrb0OEA6U2AAAAASLI3r/kRAVKOgoICxcXFadKkSRHXd+vWTV26dCn3Z8aPH6/
GjRu7T9Nat26dzj77bA0cOLDC+8nPz1dubq57yc7ONrWhx35ZHCC9xn/
r9VIAAABMIECqjwApx6ZNm+Q4jubMmRNxfb9+/
RQMBiv8uRdeeEH16tXTcccdJ8dx1LNnz8PeT3p6uhzHKXOxsqFfI0AAAAAiECDVR4CU42gCZObMmTrllFP0
yiuvaPHixZo4caJOP/10PfHEExXej/W/
gIQD5B4CBAAAQBIBEg0ESDmO5ilYV1xxhe6///6I6958803Vr19foVCoSvdrbUOPm72hOEDeIkAAAAAke/
OaHxEgFQgGg+rdu7f7dSgUUvPmzSt8Efqvf/1rPfDAAxHX/fvf/
1b9+vVVWFhYpfu0tqFfn0OAAAAAlGZtXvMjAqQCGRkZSkhI0Lhx47R8+XL16NFDSUlJ2rJliySpa9eu6t+/
v3v79PR0NWzYUBMmTND69ev18ccfq02bNrr11lurfJ/
WNnQ4QP761nyvlwIAAGCCtXnNjwiQwxgxYoRatGih+Ph4BYNBzZ071/1eSkqKUlNT3a8PHDigxx57TG3atF
FiYqJOP/103XPPPdq5c2eV78/ahn7jYID0fJMAAQAAkOzNa35EgBhibUO/
8dV3BAgAAEAp1uY1PyJADLG2ocMB8pc3CBAAAADJ3rzmRwSIIdY29JsHA6THG994vRQAAAATrM1rfkSAGGJ
tQ781lwABAAAozdq85kcEiCHWNnQ4QLq/
ToAAAABI9uY1PyJADLG2ocfP3ahAWqb+TIAAAABIsjev+REBYoi1Df3veQQIAABAadbmNT8iQAyxtqHDAfK
ncQQIAACAZG9e8yMCxBBrG3qCGyBfe70UAAAAE6zNa35EgBhibUNnfE2AAAAAlGZtXvMjAsQQaxs6HCB3v0
aAAAAASPbmNT8iQAyxtqHf/
vp7BdIy9b8ECAAAgCR785ofESCGWNvQb39DgAAAAJRmbV7zIwLEEGsbOhwgd42d5/VSAAAATLA2r/
kRAWKItQ39zsEASSVAAAAAJNmb1/
yIADHE2oZ+d342AQIAAFCKtXnNjwgQQ6xt6HCAdPsXAQIAACDZm9f8iAAxxNqGfu9ggHQlQAAAACTZm9f8i
AAxxNqG/r9vCRAAAIDSrM1rfkSAGGJtQ4cD5H9enev1UgAAAEywNq/
5EQFiiLUNPXEBAQIAAFCatXnNjwgQQ6xt6EkLfiBAAAAASrE2r/
kRAWKItQ0dDpA7XyFAAAAAJHvzmh8RIIZY29DvZxUHyB2vfOX1UgAAAEywNq/
5EQFiiLUNTYAAAABEsjav+REBYoi1DR0OkNtfJkAAAAAke/
OaHxEghljb0B8s3KRAWqb+OIYAAQAAkOzNa35EgBhibUN/
SIAAAABEsDav+REBYoi1DR0OkNvGzPF6KQAAACZYm9f8iAAxxNqG/mhRcYDc+k8CBAAAQLI3r/
kRAWKItQ2duehHAgQAAKAUa/
OaHxEghljb0OEA+QMBAgAAIMnevOZHBIgh1jb05MUHA2Q0AQIAACDZm9f8iAAxxNqGnkKAAA
AARLA2r/kRAWKItQ0dDpBbRs/2eikAAAAmWJvX/IgAMcTahp66pDhA/
vslAgQAAECyN6/5EQFiiLUNPXXJZgIEAACgFGvzmh8RIIZY29DhALmZAAEAAJBkb17zIwLEEGsbetrS4gD5
/
agvvV4KAACACdbmNT8iQAyxtqGnEyAAAAARrM1rfkSAGGJtQ4cD5CYCBAAAQJK9ec2PCBBDrG3oj5dtUSAt
UzeOJEAAAAAke/OaHxEghljb0DMIEAAAgAjW5jU/IkAMsbahwwHShQABAACQZG9e8yMCxBBrG/
qT5QcDZMQXXi8FAADABGvzmh8RIIcxcuRIBQIBJSQkKBgMat68eYe9/
c6dO3XPPffo1FNPVXx8vNq2bavJkydX+f6sbehPVxAgAAAApVmb1/
yIAKlARkaG4uPjNXbsWC1btkzdu3dXUlKStm7dWu7tCwoKdOGFF6pz58768ssvtWHDBn3++edauHBhle/
T2oYOB8jvCBAAAABJ9uY1PyJAKhAMBtWrVy/361AopOTkZA0ePLjc248ePVqtW7fW/v37j/
o+rW3oz1ZsVSAtUze8SIAAAABI9uY1PyJAylFQUKC4uDhNmjQp4vpu3bqpS5cu5f7Mb3/7W915553q3r27T
j75ZLVr104DBw5UYWFhle/
X2ob+bCUBAgAAUJq1ec2PCJBybNq0SY7jaM6cORHX9+vXT8FgsNyfOeuss5SQkKC7775b8+fPV0ZGhk488U
Q99thjFd5Pfn6+cnNz3Ut2drapDR0OkOtf/I/
XSwEAADCBAKk+AqQcRxMgbdu21emnnx7xF49hw4bp1FNPrfB+0tPT5ThOmYuVDT3zYIB0foEAAQAAkAiQaC
BAynE0T8G66qqrdO2110ZcN2XKFDmOo4KCgnJ/xvpfQD5ftY0AAQAAKIUAqT4CpALBYFC9e/
d2vw6FQmrevHmFL0J/8MEHFQgEFAqF3Ouef/
55NWvWrMr3aW1DhwPkt88TIAAAAJK9ec2PCJAKZGRkKCEhQcW16bIAACAASURBVOPGjdPy5cvVo0cPJSUla
cuWLZKkrl27qn///u7tv//+ezVs2FC9e/fWqlWrlJmZqZNPPllPPfVUle/T2oaedTBAfkOAAAAASLI3r/
kRAXIYI0aMUIsWLRQfH69gMKi5c+e630tJSVFqamrE7efMmaOLL75YCQkJat26te/fBes/
qwkQAACA0qzNa35EgBhibUOHA6TT8FleLwUAAMAEa/
OaHxEghljb0F+s3k6AAAAAlGJtXvMjAsQQaxv6yzUECAAAQGnW5jU/IkAMsbahwwHS8TkCBAAAQLI3r/
kRAWKItQ09+2CA/L/
nPvd6KQAAACZYm9f8iAAxxNqGnr2WAAEAACjN2rzmRwSIIdY2dDhArhtGgAAAAEj25jU/
IkAMsbah56z9SYG0TF1LgAAAAEiyN6/5EQFiiLUN/dU6AgQAAKA0a/
OaHxEghljb0OEAuebZmV4vBQAAwARr85ofESCGWNvQcw8GyNUECAAAgCR785ofESCGWNvQ89bvIEAAAABKs
Tav+REBYoi1De0GyNCZXi8FAADABGvzmh8RIIZY29BfbygOkP8iQAAAACTZm9f8iAAxxNqG/
oYAAQAAiGBtXvMjAsQQaxs6HCApz3zm9VIAAABMsDav+REBYoi1DT3/
u+IAuYoAAQAAkGRvXvMjAsQQaxt6/nc/EyAAAAClWJvX/
IgAMcTahv52Y3GAXDmEAAEAAJDszWt+RIAYYm1DhwPkiiGfer0UAAAAE6zNa35EgBhibUMvIEAAAAAiWJvX
/IgAMcTahs76fqcCaZm6/Gk7ARIKFamoqMjrZQAAgFrK2rzmRwSIIdY2dDhALhtsI0AOFIbUafgspY6d5/
VSAABALWVtXvMjAsQQaxt6obEACa8nkJbp9VIAAEAtZW1e8yMCxBBrG3pRNgECAABQmrV5zY8IEEOsbehwg
Fw66BOvlyKJAAEAAN6zNq/
5EQFiiLUNvTg7x2yA8EJ0AADgBWvzmh8RIIZY29BLfigOkEsMBkgoRIAAAIDYszav+REBYoi1DR0OkIsH2g
uQQgIEAAB4wNq85kcEiCHWNrTlADlQGPJ6OQAAoBayNq/
5EQFiiLUNvXRTcYAEB87weimSIgOk4AABAgAAYs/avOZHBIgh1jZ0OEAuespegOQfKPR6OQAAoBayNq/
5EQFiiLUNvWxTrtkA2befAAEAALFnbV7zIwLEEGsbevmPxQFyocEA2VtAgAAAgNizNq/
5EQFiiLUNHQ6QC560FyB7Cg54vRwAAFALWZvX/
IgAMcTahl6x2W6A7M4nQAAAQOxZm9f8iAAxxNqGXrl518EA+djrpUiKDJBd+/Z7vRwAAFALWZvX/
IgAMcTahg4HyK+fsBcguQQIAADwgLV5zY8IEEOsbehVW+wGSM5eAgQAAMSetXnNjwgQQ6xt6NUHA6SDwQDZ
uafA6+UAAIBayNq85kcEiCHWNnQ4QM5/fLrXS5EUGSA/7yZAAABA7Fmb1/
yIADHE2oZes9VugOwgQAAAgAeszWt+RIAYYm1Dr9map0Baps4zGCDb8/
K9Xg4AAKiFrM1rfkSAGGJtQ4cD5NzHbARIVqkA2baLAAEAALFnbV7zIwLEEGsbeu02WwGyYOPPboBs3bXP6
+UAAIBayNq85kcEiCHWNvS6gwFyTvo0r5ciSZr/
XUmAbMklQAAAQOxZm9f8iAA5jJEjRyoQCCghIUHBYFDz5s2r0s9NmDBBjuPoxhtvPKL7s7ahwwHS3kyA7HA
DZHMOAQIAAGLP2rzmRwRIBTIyMhQfH6+xY8dq2bJl6t69u5KSkrR169bD/
tyGDRvUvHlzXXnllb4PkPXbd5sKkG82lATIjzl7vV4OAACohazNa35EgFQgGAyqV69e7tehUEjJyckaPHhw
hT9TWFioyy67TK+++qpSU1N9HyAbwgHyqI0Ambe+JEB+2EmAAACA2LM2r/
kRAVKOgoICxcXFadKkSRHXd+vWTV26dKnw5x599FHddNNNknRMBUg7IwEyd91PboBk/
7zH6+UAAIBayNq85kcESDk2bdokx3E0Z86ciOv79eunYDBY7s988cUXat68ubZv3y6pagGSn5+v3Nxc95Kd
nW1qQ3/3k60A+apUgHy/gwABAACxR4BUHwFSjiMNkF27dqlly5aaMmWKe11VAiQ9PV2O45S5WNnQG3/
ao0Bapn71yFSvlyJJmr12uxsgG38iQAAAQOwRINVHgJTjSJ+ClZWVJcdxFBcX517q1KmjOnXqKC4uTmvXri
33fqz/BSQcIL+0EiBrSgLku592e70cAABQCxEg1UeAVCAYDKp3797u16FQSM2bNy/
3Rej79u3TkiVLIi433nijrrnmGi1ZskQFBQVVuk9rG/
r7HbYC5MtSAbJhOwECAABiz9q85kcESAUyMjKUkJCgcePGafny5erRo4eSkpK0ZcsWSVLXrl3Vv3//Cn/
+WHgRejhAzn7YRoD8Z/
U2N0DWbcvzejkAAKAWsjav+REBchgjRoxQixYtFB8fr2AwqLlz57rfS0lJUWpqaoU/
eywFyFkPT6n8xjEwa1VJgKwlQAAAgAeszWt+RIAYYm1DZ/9sK0A+LxUga7YSIAAAIPaszWt+RIAYYm1D/
7BzrwJpmTpzgI0A+WzlVjdAVm/Z5fVyAABALWRtXvMjAsQQaxs6HCBtrQTIipIAWUWAAAAAD1ib1/
yIADHE2obeZCxAPl2xxQ2QlZsJEAAAEHvW5jU/
IkAMsbahf8w5GCAP2QiQGctKAmT5jzbOEQAAqF2szWt+RIAYYm1DhwPkjIcme70USdLHpQJk2SYb5wgAANQ
u1uY1PyJADLG2oTfn7DMVINOXbnYDZOmmHK+XAwAAaiFr85ofESCGWNvQW3KLA6TNgzYCZOqSkgBZ8gMBAg
AAYs/avOZHBIgh1jZ0OEBamwmQH90AWZxNgAAAgNizNq/
5EQFiiLUNvdVYgExZXBIgi7J3er0cAABQC1mb1/yIADHE2obeuqs4QFr1z/
R6KZKkzEUlAZL1PQECAABiz9q85kcEiCHWNnQ4QFoaCZCPFm1yA2TBxp+9Xg4AAKiFrM1rfkSAGGJtQ2/
blW8qQD5cWBIg3xoJkN35BzRr1TbtLwxV6ziFoSJ9sXq7cvbuj9LKAABATbA2r/kRAWKItQ29PS/
fHfgteD/rB3c987/b4fVyJEl/HPOVAmmZGjZ9ZbWO868v1iuQlqlOw2dFaWUAAKAmWJvX/
IgAMcTahrYcIN9ssBEg4fVc+NSMah3ndyO+MHWuAQBA+azNa35EgBhibUP/ZCxAJi0oCZCvCRAAAOABa/
OaHxEghljb0Dt2F7hDcVFRkdfL0f99m+2uZ+66n7xejiQCBACA2sbavOZHBIgh1jZ06QAJhbwPkPfmlwTIV
wQIAADwgLV5zY8IEEOsbeifjQXIu6UCZM5aAgQAAMSetXnNjwgQQ6xt6J17SgKk0ECAvP3N9+56Zq/
Z7vVyJBEgAADUNtbmNT8iQAyxtqFLB8iBan7ORTS8/
XVJgHxJgAAAAA9Ym9f8iAAxxNqGztmz31SAZHy90V3PF6sJEAAAEHvW5jU/IkAMsbahc/
aWBEh1P+k7Gv49ryRAZq3a5vVyJBEgAADUNtbmNT8iQAyxtqFLB0jBAe8DZPzckgD5nAABAAAesDav+REBY
oi1DZ27z1aAvDX3O3c9M1du9Xo5kggQAABqG2vzmh8RIIZY29C7SgVI/
oFCr5ejN74qCZDPVhAgAAAg9qzNa35EgBhibUOXDpB9+w0EyJwN7no+XbHF6+VIIkAAAKhtrM1rfkSAGGJt
Q+flHzAVIK+XCpBPlhMgAAAg9qzNa35EgBhibUPvNhYgr3253l3Px8sIEAAAEHvW5jU/
IkAMsbahSwfI3gLvA2RsqQCZvnSz18uRRIAAAFDbWJvX/IgAMcTaht5TYCtA/
vVFSYBMI0AAAIAHrM1rfkSAGGJtQ+8tKHSH4j0FB7xejl75zzp3PVOX/Oj1ciQRIAAA1DbW5jU/
IkAMsbahSwfI7nxbATJlMQECAABiz9q85kcEiCHWNvS+/
bYC5OVZJQEymQABAAAesDav+REBYoi1DV06QPIMBMg/P1/
rruejRZu8Xo4kAgQAgNrG2rzmRwSIIdY2dOkA2bVvv9fL0ehSAfLhQgKkJoRCRZ7ePwAA1lmb1/
yIADHE2obOP2ArQF6aWRIgHxAgUTd58Y9qnz5Nn6/
a5tkaAACwztq85kcEiCHWNnTBgZA7FOcaCJCRn61x1/
N+1g9eL0fSsRUg4fv3+q8wAABYZm1e8yMCxBBrG7p0gOTstRUgkxYQINFGgAAAUDlr85ofESCGWNvQ+wttB
ciIT1e765m4INvr5UgiQAAAqG2szWt+RIAYYm1DHygdIHu8D5AXPikJkPfmEyDRRoAAAFA5a/
OaHxEghljb0KUDZOeeAq+Xo+dnlATIuwRI1BEgAABUztq85kcEiCHWNnRhqMhUgAyfscpdzzvffO/
1ciQRIAAA1DbW5jU/
IkAMsbahQ6UC5Ofd3gfIsI9LAuTtrwmQaCNAAAConLV5zY8IEEOsbejSAbLDQoBMX+muJ+PrjV4vRxIBAgB
AbWNtXvMjAsQQaxu6qMhWgDxbKkAmzCNAoo0AAQCgctbmNT8iQAyxuKHDA+lPefleL0XPTFvhrmf8XAIk2g
gQAAAqZ3Fe8xsC5DBGjhypQCCghIQEBYNBzZs3r8Lbvvzyy7riiiuUlJSkpKQkXXvttYe9fXksbujwQLrdQ
IAMmVoSIG/N/c7r5UgiQAAAqG0szmt+Q4BUICMjQ/
Hx8Ro7dqyWLVum7t27KykpSVu3bi339nfccYdGjRqlrKwsrVixQnfddZcaN26sH36o+id2W9zQlgLk6VIB8
uZXBEi0ESAAAFTO4rzmNwRIBYLBoHr16uV+HQqFlJycrMGDB1fp5wsLC9WwYUO9/vrrVb5Pixu6Zf/
igXTbLu8DZNCU5e6A/MacDV4vRxIBUpmCAyHtzj+gggOhqB0TAAAvWZzX/
IYAKUdBQYHi4uI0adKkiOu7deumLl26VOkYu3btUmJioj766KMKb5Ofn6/
c3Fz3kp2dbW5DhwNk6659Xi9FgyaXBMjrBEjU1USAvD5ngwJpmer55vyoHRMAAC8RINVHgJRj06ZNchxHc+
bMibi+X79+CgaDVTrGX//6V7Vu3Vr79lU8uKenp8txnDIXSxu6laEAGVgqQMbN3uD1ciQRIJUZ+
+V6BdIydc/4b6N2TAAAvESAVB8BUo7qBsjgwYPVpEkTLVq06LC388NfQFo/
OLk4QHK9D5AnP1rmDshjv1zv9XIkESCVeeU/
6xRIy9TfJyyI2jEBAPASAVJ9BEg5qvMUrKFDh6px48b65ptvjvh+LW7ocIBsMRAgT5QKkH99QYBEW00EyD8
/
X6tAWqbuzciK2jEBAPCSxXnNbwiQCgSDQfXu3dv9OhQKqXnz5od9EfqQIUPUqFEjffXVV0d1nxY3dBtDAfL
4hyUB8uoxHCBFRUVRWt2RqYkAGTVzjQJpmfrHOwujdkwAALxkcV7zGwKkAhkZGUpISNC4ceO0fPly9ejRQ0
lJSdqyZYskqWvXrurfv797+6efflrx8fF67733tHnzZveSl5dX5fu0uKHPeKg4QDbneB8g6R8sdQfkV/
6zzuvlSKqZACkMHTsBMuLT1QqkZSrtvcM/HREAAL+wOK/
5DQFyGCNGjFCLFi0UHx+vYDCouXPnut9LSUlRamqq+3UgECj3BeXp6elVvj+LGzocID/
m7PV6KREB8vKsYzdA9hd685a1NREgw2esUiAtUw9OXBy1YwIA4CWL85rfECCGWNzQbR+aYiZAHn1/
iTsgj5m11uvlSKqZAMk/
UBil1R2ZmgiQYdNXKpCWqYcnLYnaMQEA8JLFec1vCBBDLG7otgOKA2TTTu8D5OFJJQEy+vNjN0D27T92AuS
ZacWfXp/+wdKoHRMAAC9ZnNf8hgAxxOKGDgfIDwYCZMCkxe6A/
NLMYzdA9hQciNLqjkxNBEj40+uf+GhZ1I4JAICXLM5rfkOAGGJxQ59pKEAemlgSIKNmrvF6OZJqJkDy8o+d
AHkqs/idywZOXh61YwIA4CWL85rfECCGWNzQZz1cHCDZP+/xeinq/38lATLyM+8DpKioqEYCJHff/
iit8MjURICE3zr56akronZMAAC8ZHFe8xsCxBCLGzocIN/
vsBAgi9wBecSnq71ejgpDNRMgOXuOnQAJv3HA0Gkro3ZMAAC8ZHFe8xsCxBCLG/
rsh6eaCZC090oC5MVPvA+Q/
YWhGgmQn3cXRGmFR6YmAiT8up1hH6+K2jEBAPCSxXnNbwgQQyxu6F8+YidA+r270B2Qn5/
hfYDkHyiMWoDc8GJJgPyUlx+lFR6ZmgiQ8NPmXjAQjAAARIPFec1vCBBDLG7ocIBs/Mn7ALn/
nZIAGT7D+39R37c/egFy/Yv/cY+1bdexEyAPvLvIzGt2AACIBovzmt8QIIZY3NC/MhQg/
ygVIM8ZeErPnoIDUQuQ3z5fEiBbc/
dFaYVHpiYC5L63F5p622QAAKrL4rzmNwSIIRY3dLtHpymQlqnvftrt9VJ079tZ7oA8bLr3L2rOy49egHQaP
ss91uacYydA+mYU/85enrUuascEAMBLFuc1vyFADLG4ocMBsmG7gQDJKAmQZw0ESO6+/
VELkI7PlQSIV586XxMB8rd/
L1AgLVOvfrE+ascEAMBLFuc1vyFADLG4odsbCpC+pQLEwtu65uyJXoBcN+xz91hefeZKTQTIPW99q0Bapl7
7kgABABwbLM5rfkOAGGJxQ7dPLw6Q9QYC5O8TFrgD8hADH2z38+6CqAXINc/OdI/l1TuO1USA/
OWN+QqkZeqNr76L2jEBAPCSxXnNbwgQQyxu6HCArNuW5/VS3KfzWPlk7Z/
y8t31XPBk9QLk6qElAeLV621qIkD+/Po3CqRlavzcjVE7JgAAXrI4r/
kNAWKIxQ19jqEA6V0qQAZP8T5Atu0qHSAfV+tYKc985h7Lq7821USA/
O9rXyuQlqmMrwkQAMCxweK85jcEiCEWN/
S5j01XIC1Taw0EyD3jv3UH5EGTl3u9HG3N3eeup8MT1QuQK4eUBIhX57omAqTbv+YpkJapd+dnR+2YAAB4y
eK85jcEiCEWN3Q4QNZsNRAgb5UEyEADAbI5pyRAznt8erWOdfnTn7rHWrN1V5RWeGRqIkD+59W5CqRlauIC
AgQAcGywOK/5DQFiiMUNfd7jdgLkr2/
NdwfkpzKXeb0cbdq5113POenTqnWsywaXBMiqLcdOgPxxzFcKpGXq/awfonZMAAC8ZHFe8xsCxBCLG/
p8N0C8GYpLC7+jUiAtU0985H2AZP+8x11P+0erFyCXDPrEPdaKzd78/
msiQP7wzzkKpGUqc9GPUTsmAABesjiv+Q0BYojFDR0OkNUe/at8aT3e+MYdkB//
0PsA+X5HSYD86pGp1TpWcOAM91jLNh07AfLfL81WIC1TU5cQIACAY4PFec1vCBBDLG7oDk98bCZAur9eEiC
PfbjU6+Xou592u+s5+
+HqBciFT5UEyJIfcqK0wqoLhYpqJEBuHPmlAmmZmr50c9SOCQCAlyzOa35DgBhicUP/
+mCAePW6hNL+NK4kQNI/
8D5A1m8vCZAzB0yp1rEuePJj91iLs2MfIAcKQzUSIL8b8YUCaZn6dMWWqB0TAAAvWZzX/
IYAMcTihg4HyMrNFgLka3dAfvT9JV4vR2u35bnraftQ9QIk/JemQFqmFn6/M0orrLr8A4U1EiCdX/
iPAmmZmrlya9SOCQCAlyzOa35DgBhicUOH/
2XeqxdGl3b3ayUB8oiBAFmzdZe7njYPTq7WscLvNhZIy9SCjT9HaYVVt7egZgKk0/
BZCqRl6j+rt0XtmAAAeMnivOY3BIghFjf0BU/OMBMgd42d5w7IAyYt9no5WrWlJEBa9a/
e0B7+xPlAWqbmfxf7ANmdf6BGAuS6YZ8rkJap2Wu3R+2YAAB4yeK85jcEiCEWN3Q4QJb/
6P2aUksFyEMTvQ+QFZtzoza0t3+0JEC+2bAjSiusutx9+2skQK5+dqYCaZmau+6nqB0TAAAvWZzX/
IYAMcTihg6/O5NXbw1bWrd/
lQTIgwYCZNmmyAApKio66mP96pGp7nHmrY99gOzcUxDxWEKho38spV31zGeeRRUAADXB4rzmNwSIIRY39EW
GAuR/Xp3rDsj9/2+R18vRkh9yIob2wmoM7Wc/
XBIgX3nw14IduyMD5EBhKCrHvfzpTz17XQsAADXB4rzmNwSIIRY3dDhAlm6K/
VvDHqp0gKS9532ALMreGTG0Fxw4+qG97YAp7nFmr4n96yW27cqPeCz5BwqjctxLD37C+6Ls2L+zFwAANcHi
vOY3BIghFjd0+BO6vfhwvEPd+UpJgDzwrvcBkvV9ZIDs23/0Q/sZD012j/
PF6tgHyJbcfRGPZW9BdAIkHLAW9g8AANFgcV7zGwLEEIsb+uKBn5gZIG9/+St3QL7/
nYVeL0ffbvw5akN76wdLAmTWqti/Ze2POXsjHsvu/
ANROa6lt3EGACAaLM5rfkOAGGJxQ1sKkD+OKQmQfxgIkPnf7Yja0N6yf8lxvPjQvuyf90Q8ltx9+6Ny3PMP
fr7J6i3ef5AlAADRYHFe8xsCxBCLG/qSg8/
hX5ztfYDcNmaOOyDf97b3AfL1hsgA2XWUQ3tRUVHEcT5bEfsA2fhTZIDs3FMQleO2P/
j5Jmu35UXleAAAeM3ivOY3BIghFjf0pYYC5A//
LAmQezOyvF6O5q77KWJoz9l7dAESCkUGyCfLt0R5pZXbsH13xBp27I5OgITfXnjD9t1ROR4AAF6zOK/
5DQFiiMUNbeldjP4wuiRA+hoIkDlrf4rKXw0OFIYijvPxstgHyNpteRFr2LYrPyrHPevh4nf3+n7HnqgcDw
AAr1mc1/yGADHE4oa+b
HDx5zgs/
N77ALll9Gx3QO4zYYHXy9HsNduj8leDggORATJt6eYor7Ryq7fsiljDltx9UTlu24eKA2TTzr1ROR4AAF6z
OK/5DQFiiMUNbSlAbn6pJED+9m/vA+SL1ZEBsj3v6P5qsG9/YcRxpi75McorrdzKzZEB8mNOdIKhVf/
oBg0AAF6zOK/
5DQFiiMUNHQ6QLAMB8vtRX7oDcm8DATJr1baIoX3rrqMbsvcWRAbI5MWxD5Blm3Ij1pD9c/
WfMlX6xfVHG2cAAFhjcV7zGwLEEIsb+vKniwNkwcafvV6KbioVIL3Gf+v1cjRz5daoPG1pd/
6BiON8tGhTlFdauSU/
5ESsYeNP1Q+QwlIvrv85Si9qBwDAaxbnNb8hQAyxuKGvGGInQLqMLAmQe97yPkA+WxEZIEf7tKVd+/
ZHHOeDhbEPkEXZkZ/qHo13rco/UPKXnaN9hzAAAKyxOK/5DQFiiMUNHQ6Qby0EyIgv3IH2r2/
N93o5+mT5loih/YejfKF1zt7IAHk/
64cor7RyCw75VPdofG5H6aeWReuT1QEA8JrFec1vCBBDLG7oK4d8pkBapuZ/532A/K5UgPR80/
sA+XhZZIAc7VvN7txTEHGciQuyo7zSyh36qe7R+OTyvFJPLdu3vzAKqwQAwHsW5zW/
IUAMsbihr3rGToBc/+J/
3IG2xxvfeL0cTVu6OSqvm9ixOzJA3psf+wA59FPdV26ufoDk7Cn5y07BgVAUVgkAgPcszmt+Q4AYYnFDlwT
IDq+Xos4vlARI99e9D5CpS36MyusmtuflRxznnW++j/JKK/fVIZ/
qvmxT9fdg6bAKhYqisEoAALxncV7zGwLEEIsbOuVggHyzwfsA+e3zJQHyZwMBMnlxZICsO8rXTWzdtS/
iOG9/
HfsAOfRDFZf8kFPtY27bVRJWAAAcKyzOa35DgBzGyJEjFQgElJCQoGAwqHnz5h329u+8847OOussJSQkqH3
79po8efIR3Z/FDf1fQ2eaCZBOw2e5A+2fxn3t9XL00aJNEUP7mq1HFyBbciMDZMK8jVFeaeUO/VDFRdnV/
9yXzTnFj6v1g0f2vwMAACyzOK/
5DQFSgYyMDMXHx2vs2LFatmyZunfvrqSkJG3durXc28+ePVtxcXF65plntHz5cj388MOqV6+elixZUuX7tL
ihwwHytbEAufs17wPkg4WRAXK0L9z+MWdvxHHGz419gHx+yIcqRuNtl3/
YWfy42g6YEoUVAgBgg8V5zW8IkAoEg0H16tXL/ToUCik5OVmDBw8u9/a33nqrrr/+
+ojrLr74Yv3lL3+p8n1a3NBXHwyQ/6zepj0FBzy9XDfsc3dA7vqveZ6v5+1vvo8Y2rO+33lUx1mzNS/
iOP/
6Yn3MH8vUJZEvqP9yzfZqH3PVll0KpGXq7Iener2NAQCIGovzmt8QIOUoKChQXFycJk2aFHF9t27d1KVLl3
J/5vTTT9fw4cMjrnv00Ud17rnnVng/+fn5ys3NdS/
Z2dnmNvTVz86MGEy5cDnSS7tHp3m9jQEAiBoCpPoIkHJs2rRJjuNozpw5Edf369dPwWCw3J+pV6+e/
v3vf0dcN2rUKJ188skV3k96erocxylzsbSh0z9Y6vkAa/
nSsn90j9cqysezcLHwqfUAAEQLAVJ9BEg5YhUgfvgLiFT8idZeP90pfCkMFWl/YcjzdYQv4Q/
Yi8axioqKtG+/d+c6/Fii/fsGAOBYQoBUHwFSjlg9BetQbGgAAADbmNeqjwCpQDAYVO/
evd2vQ6GQmjdvftgXod9www0R11166aW+fxE6AAAASjCvVR8BUoGMjAwlJCRo3LhxWr58uXr06KGkpCRt2b
JFktS1a1f179/
fvf3s2bN13HHH6dlnn9WKFSuUnp5+TLwNLwAAAEowr1UfAXIYI0aMUIsWLRQfH69gMKi5c+e630tJSVFqam
rE7d955x2dzVKmVwAAC79JREFUeeaZio+PV7t27Y6JDyIEAABACea16iNADGFDAwAA2Ma8Vn0EiCFsaAAAA
NuY16qPADGEDQ0AAGAb81r1ESCGsKEBAABsY16rPgLEEDY0AACAbcxr1UeAGMKGBgAAsI15rfoIEEPY0AAA
ALYxr1UfAWJITk6OHMdRdna2cnNzuXDhwoULFy5cuBi7ZGdny3Ec5eTkeD06+hYBYkh4Q3PhwoULFy5cuHC
xfVm3bp3Xo6NvESCGhEIhZWdnKycnx/O6L134/EWGc8Q54hx5feEccY44R5wjK5fvv/
9ejuNo586dXo+OvkWAoEK5uTzHsTKco8pxjirHOaoc56hynKPKcY4qxzmqHOeo+ggQVIj/
gVWOc1Q5zlHlOEeV4xxVjnNUOc5R5ThHleMcVR8BggrxP7DKcY4qxzmqHOeocpyjynGOKsc5qhznqHKco+o
jQFCh/
Px8paenKz8/3+ulmMU5qhznqHKco8pxjirHOaoc56hynKPKcY6qjwABAAAAEDMECAAAAICYIUAAAAAAxAwB
AgAAACBmCBAAAAAAMUOAoEIjR45UIBBQQkKCgsGg5s2b5/
WSYmbWrFm64YYb1KxZMzmOo0mTJkV8v6ioSI888ohOPfVUJSYm6tprr9Xq1asjbrNjxw7dcccdatiwoRo3b
qy7775beXl5sXwYNWbQoEG68MILdcIJJ6hp06a68cYbtXLlyojb7Nu3T/fcc49OPPFEHX/
88br55pu1ZcuWiNts3LhRnTt3Vv369dW0aVPdf//
9OnDgQCwfSo156aWXdM4556hhw4Zq2LChLrnkEk2ZMsX9fm0/
P+UZPHiwHMdRnz593Otq+3lKT0+X4zgRl7POOsv9fm0/P2E//PCD7rzzTp144olKTExU+/
bt9c0337jfr+3/zQ4EAmX2keM4uueeeySxjySpsLBQDz/
8sFq2bKnExES1bt1aTzzxhIqKitzb1PZ9FE0ECMqVkZGh+Ph4jR07VsuWLVP37t2VlJSkrVu3er20mJgyZY
oGDBigiRMnlhsgTz/9tBo3bqz3339fixYtUpcuXdSqVSvt27fPvc1vfvMbnXfeeZo7d66+
+OILnXHGGbr99ttj/VBqRKdOnfTaa69p6dKlWrhwoTp37qwWLVpo9+7d7m169uyp008/XZ9+
+qnmz5+vSy65RJdddpn7/
cLCQrVv317XXXedsrKyNGXKFJ100kl68MEHvXhIUffhhx9q8uTJWr16tVatWqWHHnpI9erV09KlSyVxfg71
9ddfq2XLljr33HMjAqS2n6f09HS1a9dOmzdvdi/bt293v1/bz48k/fzzzwoEArrrrrs0b948rV+/
XtOnT9fatWvd29T2/2Zv27YtYg/NmDFDjuNo5syZkthHkjRw4ED94he/
UGZmpjZs2KB3331XJ5xwgl544QX3NrV9H0UTAYJyBYNB9erVy/
06FAopOTlZgwcP9nBV3jg0QIqKinTqqadq6NCh7nU5OTlKSEjQhAkTJEnLly+X4zgR/
wI3depU1alTR5s2bYrd4mNk27ZtchxHs2bNklR8PurVq6d3333Xvc2KFSvkOI6++uorScWRV7du3Yh/
ZRs9erQaNWqkgoKC2D6AGGnSpIleffVVzs8h8vLy1LZtW82YMUMpKSlugHCeigPkvPPOK/
d7nJ9iaWlpuuKKKyr8Pv/NLqtPnz5q06aNioqK2EcHXX/
99br77rsjrrv55pt15513SmIfRRsBgjIKCgoUFxdX5l/
9u3Xrpi5duni0Ku8cGiDr1q2T4zjKysqKuN1VV12lv//975Kkf/3rX0pKSor4/oEDBxQXF6eJEyfW/
KJjbM2aNXIcR0uWLJEkffrpp3IcRzt37oy4XYsWLfTcc89Jkh555JEyg9X69evlOI4WLFgQm4XHSGFhoSZM
mKD4+HgtW7aM83OIbt26qW/fvpIUESCcp+IAadCggZo1a6ZWrVrpjjvu0MaNGyVxfsJ++ctfqm/
fvrrlllvUtGlTnX/++Xr55Zfd7/
Pf7EgFBQX6xS9+oYEDB0piH4UNHDhQgUBAq1atkiQtXLhQJ598st566y1J7KNoI0BQxqZNm+Q4jubMmRNxf
b9+/RQMBj1alXcODZDZs2fLcRz9+OOPEbf7wx/+oFtvvVVS8X/IzjzzzDLHatq0qV566aWaXXCMhUIhXX/
99br88svd68aPH6/4+Pgyt73ooov0wAMPSJK6d++ujh07Rnx/z549chwn4rUSfrZ48WIdf/
zxiouLU+PGjTV58mRJnJ/
SJkyYoPbt27tPYSgdIJyn4n95fuedd7Ro0SJNmzZNl156qVq0aKFdu3Zxfg5KSEhQQkKCHnzwQS1YsEBjxo
xRYmKixo0bJ4n/Zh/q7bffVlxcnPsv8uyjYqFQSGlpaapTp46OO+441alTR4MGDXK/
zz6KLgIEZRAgkQiQw+vZs6cCgYCys7Pd6/g/tGIFBQVas2aN5s+fr/79++ukk07SsmXLOD8Hff/
99zr55JO1aNEi9zoC5PB27typRo0a6dVXX+X8HFSvXj1deumlEdf97W9/0yWXXCKJ/
2YfqmPHjrrhhhvcr9lHxSZMmKDTTjtNEyZM0OLFi/XGG2/
oxBNPJGRrCAGCMngKViSeglWxXr166bTTTtP69esjrudP+uW79tpr1aNHD87PQZMmTZLjOIqLi3MvjuOoTp
06iouL0yeffMJ5KseFF16o/v37s48OatGihf70pz9FXPfSSy8pOTlZEv/
NLu27775T3bp19f7777vXsY+KnXbaaRo5cmTEdU8+
+aT7rnPso+giQFCuYDCo3r17u1+HQiE1b96cF6Gr5IVozz77rHtdbm5uuS9Emz9/
vnub6dOnHzMvRCsqKlKvXr2UnJxc5i0IpZIXx7733nvudStXriz3RY2l31ltzJgxatSokfLz82v+QXjg6qu
vVmpqKufnoF27dmnJkiURlwsvvFD/8z//
oyVLlnCeypGXl6cmTZrohRde4PwcdPvtt5d5EXrfvn3dv4rw3+wS6enpOvXUUyPePpd9VOzEE08s81eKQYM
GqW3btpLYR9FGgKBcGRkZSkhI0Lhx47R8+XL16NFDSUlJZd4X/FiVl5enrKwsZWVlyXEcPffcc8rKynJf/
Pn0008rKSlJH3zwgRYvXqwbb7yx3Lfi69Chg+bNm6cvv/xSbdu2PWbeiu+vf/2rGjdurM8//
zzirR337t3r3qZnz55q0aKFPvvsM82fP1+XXnppxNMkwm/
r2LFjRy1cuFDTpk1T06ZNj5m3dezfv79mzZqlDRs2aPHixerfv7/q1Kmjjz/
+WBLnpyKln4IlcZ7+8Y9/6PPPP9eGDRs0e/
ZsXXfddTrppJO0bds2SZwfqfgtnI877jgNHDhQa9as0fjx49WgQQP3xcMS/
82Wiv8hsUWLFkpLSyvzPfaRlJqaqubNm7tvwztx4kSddNJJ7tPQJPZRNBEgqNCIESPUokULxcfHKxgMau7c
uV4vKWZmzpxZ7oc2paamSir5MKJTTjlFCQkJuvbaa913zgjbsWOHbr/9dp1wwglq1KiR/vd///
eY+TCi8s6N4zh67bXX3NuEP9iqSZMmatCggX7/+99r8+bNEcf57rvv9Nvf/lb169fXSSedpH/84x/
HzAdb3X333QoEAoqPj1fTpk117bXXuvEhcX4qcmiA1PbzdNttt6lZs2aKj49X8+bNddttt0V8vkVtPz9hH3
30kdq3b6+EhASdffbZEe+CJfHfbKn4X+IdxynzuCX2kVT8F9k+ffqoRYsW7gcRDhgwIOJthtlH0UOAAAAAA
IgZAgQAAABAzBAgAAAAAGKGAAEAAAAQMwQIAAAAgJghQAAAAADEDAECAAAAIGYIEAAAAAAxQ4AAAAD8//
brWAAAAABgkL/
1LHaVRcBGQAAAgI2AAAAAGwEBAAA2AgIAAGwEBAAA2AgIAACwERAAAGAjIAAAwEZAAACAjYAAAAAbAQEAAD
YCAgAAbAQEAADYCAgAALAJiroNx+icZi4AAAAASUVORK5CYII=\" width=\"800\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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 = $('<div/>');\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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all '
+\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\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 = $('<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 = $('<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 = $('<canvas/>');\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 = $('<div/>');\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 = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all
' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\
n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt ===
mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then
trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\
n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id:
this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format =
format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\
n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL ||
window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21)
== \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message
type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \",
msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type +
\"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-
in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from
http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the
document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-
home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-
arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-
right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan
axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"],
[\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"],
[\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-
save\", \"download\"]];\n",
"\n",
"mpl.extensions =
[\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm)
{\n",
" // Create a \"websocket\"-like object which calls the given IPython
comm\n",
" // object with the appropriate methods. Currently this is a non binary\
n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage
function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a
real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id +
\"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in
FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' +
width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\"
width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\"
title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></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 = $('<span class=\"mpl-message\" style=\"text-
align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline
pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\"
title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove
icon-large\"></i></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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 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"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img
src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAGQCAYAAABWJQQ0AAAgAElEQVR
4nOzdd3hUVf4/8FEUEBvWXcHlCIoFWBVRdsWCFVz1h32/
ruuKYkV0UVy9FCF0pBcp0rs0KeIFAgFCL6GE0CGBAKGFAGmE9Lx/
f9y5k0xmcmcmt8y9yfv1PPd5dObOzMnMSTjvueecjwtEREREREQWcYW7AUREREREVHkwgBARERERkWUYQIi
IiIiIyDIMIEREREREZBkGECIiIiIisgwDCBERERERWYYBhIiIiIiILMMAQkRERERElmEAISIiIiIiyzCAEB
ERERGRZRhAiIiIiIjIMgwgRERERERkGQYQIiIiIiKyDAMIERERERFZhgGEiIiIiIgswwBCRERERESWYQAhI
iIiIiLLMIAQEREREZFlGECIiIiIiMgyDCBERERERGQZBhAiIiIiIrIMAwgREREREVmGAYSIiIiIiCzDAEJE
RERERJZhACEiIgogLS0NPXr0wLp168LdFCIix2MAISIvQgi0bt063M0AACQmJsLlcmHy5Mnhbkql5nK5EBE
REe5mhKx58+Zo3rx5wPOio6PhcrkQHR1d5jlvvfUW/v73v+Py5cvlakswr1FRNG/
eHA0bNrT09YL5nInIPhhAiCqJ3bt346233kKdOnVQrVo11KpVCy+88AJGjBjhdR4DCJVW2QPIsGHDUL9+fa
SkpJS7LQwg5r5eyc/
51KlTiIiIQGxsrGVtIKLQMIAQVQIbN25E1apVcc8996BXr14YP348unXrhhYtWuDuu+/
2OjcnJwd5eXlhaqk3BhB7cGoAyc3NRW5ubsDztMJBbm4u+vTpgyNHjuhqCwOIeUp/
ztu2bePfDSKbYwAhqgRefvll3HbbbUhNTfW5Lzk5OQwtCo6eAHLp0iXjG1RJOTWABMuKcMAAEpzs7GwUFhb
qen0GECL7YwAhqgTuu+8+PPPMM0Gd628KVlxcHJ5+
+mlUr14dtWvXRq9evTBp0iS4XC4kJiZ6PfaVV17B+vXr8dhjj6FatWqoW7cupk6d6vV8Fy5cwHfffYdGjRr
h2muvxfXXX4+XXnoJu3bt8jov2AAyefJkuFwurFmzBm3btsVtt92GmjVreu4/efIkPvroI9x++
+2oWrUqGjRogIkTJ/o8T3Z2NiIiIlC/fn1Uq1YNf/7zn/
HGG28gISEBQNmDSCOu1EyfPh2PPfYYrrnmGtSsWRNPPfUUli9f7rl/
0aJFePnll3HHHXegatWqqFevHnr27ImCggKv51EHf/v27cMzzzyDa665BrVq1UL//
v29zsvNzUXXrl3xyCOP4IYbbkCNGjXw5JNPYvXq1T5tCyaAqO/NnDlz0Lt3b9SuXRvVqlXDc889h/j4eJ/
z586di0ceeQTVq1fHLbfcgn//+984efKk1zmtW7fGtddei5MnT+K1117Dtddei1tvvRXfffedz8/
tj78pWElJSXjttddQo0YN3Hbbbfjmm28QGRnp93PdsmULWrZsiRtuuAHXXHMNnn76aWzYsMHrnGPHjqFt27
a49957Ub16ddx88814++23vX4vSr4/5Q0gs2bNwiOPPILrrrsO119/PRo1aoRhw4Z57g/
2dyqUz+nw4cN488038ac//QnVqlVD7dq18X//
939IS0vTbKvaB7dv347HH38c1atXx1133YUxY8b4bcusWbPQpUsX1KpVC1dccQVSU1MREREBl8t3iKL+rpd
8f0t+zupzlj4YRojshQGEqBJo0aIFrr/+euzZsyfguaUDyMmTJ3HzzTfjlltuQY8ePTBo0CDcf//
9eOihh/
wGkPvuuw9/+tOf0LlzZ4wcORKPPPIIrrjiCuzdu9dz3rZt23D33XejY8eOGDt2LHr27InatWvjxhtvxKlTp
zznhRpAGjRogObNm+Pnn3/GTz/9BAA4e/Ys7rzzTvzlL39Bz549MWbMGLRq1QoulwtDhw71PEdBQQGef/
55uFwuvPvuuxg5ciT69euH5557DosWLQJgXgDp3r07XC4XmjVrhoEDB2L48OF47733IEmS55zXX38d//
znPzFw4ECMGTMG77zzDlwuF/73v/95PVfz5s1Rq1Yt/
OUvf0H79u0xevRoPPfcc3C5XFi6dKnnvJSUFNxxxx3o0KEDxowZgwEDBuC++
+7D1Vdf7TN3PpQA0rhxYzRp0gRDhw5F9+7dUaNGDTRt2tTrXPXzeuyxxzB06FB07NgR11xzDe666y6vq3St
W7dG9erV0bBhQ7Rp0wZjxozBW2+9BZfLhdGjRwd8X0sHkMuXL3uCwg8//
IBhw4ahSZMmePDBB30+11WrVqFq1ap4/
PHHMXjwYAwdOhQPPvggqlatiq1bt3rOmzdvHh566CF069YN48aNQ+fOnXHTTTdBCIGsrCyf96c8AWTFihVw
uVx4/
vnnMWrUKIwaNQpfffUV3nnnHc85wf5OBfs55ebmom7duqhVqxZ69+6NCRMmoEePHnjsscdw7NixgO97rVq1
cPvtt+Orr77CiBEj8OSTT8LlcnkFf7UtDRo0wMMPP4whQ4agX79+yMrKKncAOXv2LHr27AmXy4XPPvsM06d
Px/Tp03VPoSMiYzGAEFUCK1asQJUqVVClShU8/vjj+OGHH7B8+XK/az1KB5Cvv/
4aV1xxhdeg9MKFC7j55pv9BhCXy+W1Vem5c+dQrVo1fPfdd57bcnJyfKZZJCYmolq1aujZs6fXbaEEkCeff
NLnm/GPP/
4Yd9xxB86fP+91+7vvvosbb7zRs6uRekVnyJAhPs9fVFQEwJwAEh8fjyuvvBJvvPGGz3uivi4Av7svff755
6hRowZycnI8tzVv3hwulwvTpk3z3Jabm4s///nPeOuttzy3FRQU+KyPSE1NxZ/+9Ce0adPG6/
ZQAsgDDzzg9bzDhw+Hy+XyhN+8vDzcfvvtaNSoEbKzsz3nybIMl8uFbt26eW5r3bo1XC6XV58A4Bk8B1I6g
AwbNgwulwtz58713JaVlYV77rnH63MtKipC/fr10bJlS5/
PoG7dunjxxRe9bitt8+bNPp+BngDSvn173HDDDZpXfYL9nQr2c4qNjYXL5cK8efNCbq/
aBwcPHuy5LTc3Fw8//DBuv/12z98dtS316tXzeR/
LG0AATsEicgIGEKJKIiYmBm+88QZq1KjhmZZw22234ffff/c6r3QAqV+/Ppo1a+bzfF9//
bXfANKgQQOfcx988EG88cYbfttVUFCA8+fPIyUlBQ8++CBef/
11z32hBpDSU72KiopQs2ZNfPbZZ0hJSfE61MeoU2peeeUV3HrrrcjPzy/
zdcwIIAMHDoTL5Qppx56MjAykpKRgxowZcLlcXtNsmjdvjuuuu85r4AwArVq1QuPGjf0+X2FhIS5cuICUlB
S88sorePjhh73uDyWADBgwwOv2nTt3wuVyefrZpk2byryCcf/
993sFCzWAnDt3zuu8//73v7jppps02wP4DkxbtGiBO+64w+e9GTBggNfnqrZ56tSpPv3mk08+QbVq1fyuU8
jLy/P05Zo1a+Kbb77xeX/KE0AiIiJQpUoVLFu2LKjztX6ngv2cjh49CpfLhU8+
+cTrSk4wmjdvjquuuspnHdaYMWPgcrmwefNmr7b06NHD78/
MAEJUcTGAEFUyubm5iImJQadOnVC9enVcffXV2Ldvn+f+0gGkatWq+OCDD3yeR/
3GtHQAeemll3zObd68udcalMLCQgwZMgT33HMPqlSp4jVX+9lnn/
WcF2oAKV0kLjk52e988JLHggULACiD3yeeeELzdcwIIF988QWuvPLKgLs17d27F6+//
jpuuOEGn59h7dq1nvOaN2+O+++/3+fxrVu3xl133eV125QpU/DXv/
4VV199tdfz1a1b1+u8UALI7NmzvW5X35spU6YAUNYyuFwurFq1yuc5Xn/
9ddx6661eba5evbrPeWUNTksrPTC977778NRTT/mc9/
vvv3t9rnPmzAnYby5evAhAuQLStWtX3Hnnnbjiiiu8zvnoo4983p/
yBJDk5GQ88MADcLlcqF27Nj766COfMBLs71SwnxMAdOjQAS6XC9dccw1atGiBkSNHBlz/
ASjve506dXxuX7VqFVwuZc1HybaUvFKkYgAhqtgYQIgqMfUf8+7du3tu0xtAXnnlFZ9zSw8QevXqBZfLhTZ
t2mDWrFlYvnw5oqKi0LBhQ6/zQg0g27Zt87r9zJkzcLlceP/
99xEVFeX3UHcBCyaArFmzxu8gMiEhwdQAkpqailtuuQV169bFsGHD8McffyAqKgr9+/
f3aU9ZOxC1bt0aQgjP/0+fPh0ulwuvv/
46pk2bhsjISERFReG5557zOg8ILYCUnrJT+jMMNYBce+21PueZHUDUNg4cOLDMfqNOI/
r4449x5ZVXokOHDpg3bx5WrFiBqKgo3HLLLV6/R3oXoefm5mLx4sVo27Yt7rrrLrhcLq/fy2B/
p4L9nFS7d+9Gr1698NRTT+HKK69E7dq1kZSUpNnWUAOIv2le6rqo0iZMmMAAQlQBMIAQVWJ79uyBy+XC559
/7rlN7xSsYALIQw895PWtrKp27dqGBpCCggJcf/31+Ne//
qX5eKB4CpZWDZS4uDi4XC4sXLjQ63Z1YGXWFKyFCxf6XOkAgHHjxpU7gLz22muoV6+ez3SkZs2amRpAtKZg
PfDAAz5TsIwMIC1atECtWrUCTsGKiYmBy+XC2LFjA77GjTfe6HWlA1B2U6tSpYqhAaSkwsJCfP7553C5XJ6
dq4L9nQo1gJS0ceNGuFwudOnSRbN9oU7B8hdA1C84Sm8d3rVr14ABZPv27QwgRDbHAEJUCaxevdpn0AXA8w
16yYXXpQPIV199FdIi9GACyCOPPOKzLfDcuXPhcrkMDSAA8OGHH6Jq1ap+dwArubYgmEXoaWlpqFKlCr799
luv+9WdmcxahL548WK4XMo2wyp1UW95A8ibb76JevXqeb3mli1bcMUVV5gaQNRF6A8+
+KDX4vmlS5fC5fJdhG5kAAl2EXphYSHuvvtu1K9fH5mZmT7PW7Lf3Hzzzfjwww+97lcDjVEBpPQGCgAwatQ
ouFwuz+5ywf5OBfs5paen+6yHysjIwJVXXumz81ppWovQb7vtNp9F6P4CiLopQck1apcuXUKdOnUCBpADBw
7A5fLe5Y6I7IUBhKgSaNiwIerWrYsOHTpg3LhxGDlyJN577z1UqVLFZ+vT0gHkxIkTqFmzJm699VavbXjVw
W/JLTmDDSDdunWDy+XChx9+iHHjxuHrr7/
GzTffjHr16hkeQM6ePQshBGrUqIH27dtj7Nix6NevH9555x2vhcwFBQV45pln4HIp2/
COGjUKAwYMQIsWLTzb8ALK7llXXXUVOnTogFGjRuEf//gHmjRp4tNOte2la6r4o36r26xZMwwaNAg///
wzPvjgA3Ts2BGAMgBVt3YdPHgwhgwZgsaNG3u2Qi5PAFEDV6tWrTB27Fh07NgRNWvWRMOGDU0NIEDx5/
W3v/0Nw4YNQ6dOnVCjRg2/2/
AaGUDUsFG9enVIkqS5DW90dDSqV6+OOnXqICIiAuPGjUNERASefvppvPrqq57zPvjgA1SpUsXTtz788EPce
eedQU3BUm8L9N6+/
vrrePrpp9G9e3dMmDABXbt2Rc2aNfHwww97AmSwv1PBfk4LFy5E7dq18c0332D06NEYMWIEHnvsMVx99dWe
Kxha77u6De/XX3+Nn3/+2bMN77hx4wK2BVCCap06dXDrrbeif//
+GDRoEBo0aOD5XdMKIHl5eahZsybuu+8+TJgwAbNmzcLRo0c120xE1mIAIaoEli1bhjZt2uD+++/
Hddddh6pVq+Kee+7B119/7VMJ3V8hwtjYWDz11FOoVq0a7rzzTvTr1w8jRoyAy+XC2bNnvR4bTADJycnBd9
99hzvuuAPXXHMNnnjiCWzevNnnPCMCCKAs4m3Xrh3+8pe/4Oqrr8af//xnPP/
8816DIUBZUNylSxfUrVsXLpcLV111Fd5++22vGgIpKSl46623UKNGDdx00034/
PPPsXfvXp92qtPb1BARyKRJk9C4cWNUq1YNN910E5o3b46oqCjP/Rs3bsTf//
53T2FBdSvl8gaQoqIi9O3bF0IIVKtWDY0bN4Ysyz7nAcYHEEBZ6K3+vDfffLNmIcLSyhtAAOD48eNo1aoVa
tSogVtvvRXt27cvsxBhbGws3nzzTdxyyy2oVq0ahBD45z//
6bV+JTU1FR999BFuvfVWXHfddWjZsiUOHjzo83vkL4D88ccfcLlc+OWXXzR/jt9+
+w0tWrTwFNKsU6cOPv/8c5w5c8ZzTrC/U8F+TkePHkWbNm1w9913ewosPvvss1i5cqVmWwH/
hQiFEBg5cqTXeVoBBAB27NiBv/
3tb56feciQIUEtQgeUdT0NGjTAVVddxelYRDbEAEJE5dK+fXtUr149qIrUTjR9+vSg1o6UZdSoUbj22mu9A
hpRSd9//
z3uvPNOr6loRESVAQMIEQVUukjY+fPncfPNN+OFF14IU4vMl5aWhquvvrrcg8O3334bnTp1MrhVVJE8+uij
QS10JyKqaBhAiCighx56CO3bt8cvv/
yCHj16oE6dOrjqqqt8dmWqCPbv349hw4bhhx9+gMvlCqruAREREQWPAYSIAurUqRPq16+Pa665BjVq1MCTT
z7ptT6hItm5c6dnPn/
nzp3D3RwiIqIKhwGEiIiIiIgswwBCRERERESWYQAhIiIiIiLLMIDYSGFhIZKSkpCWlob09HQePHjw4MGDBw
8eNjvS0tKQlJTkKQRKoWMAsZGkpCS4XC4ePHjw4MGDBw8eNj+SkpLCPXR0LAYQG0lLS/
N06HCnex48ePDgwYMHDx6+h/
qFMbdpLz8GEBtJT0+Hy+VCenp6uJtCRERERH5wvKYfA4iNsEMTERER2RvHa/
oxgNgIOzQRERGRvXG8ph8DiI2wQxMRERHZG8dr+jGA2Ag7NBEREZG9cbymHwOIjbBDExEREdkbx2v6MYDYC
Ds0ERERkb1xvKYfA4iNsEMTERER2RvHa/
oxgNgIOzQRERGRvXG8ph8DiI2wQxMRERHZG8dr+jGA2Ag7NBE5SW5+IbJy88t1XM4tCHfziYjKheM1/
RhAbIQdmoicYvWBZNTvshRCkst9SL/FhfvHICIKGcdr+jGA2Ag7NBE5Rd8l+3WFDyHJaNZvVbh/
DCKikHG8ph8DiI2wQxORU/RYvA9CktHrj30hT7+KSbwAIcl4vO/
KcP8YREQh43hNPwYQG2GHJiKn+HHhHghJxuDlB0N+7J6TaRCSjL8zgBCRA3G8ph8DiI2wQxORU3ScHwchyR
ix8nDIj917SgkgTftEmdAyIiJzcbymHwOIjbBDE5FTdJizC0KSMTo6IeTH7juVDiHJeKw3AwgROQ/Ha/
oxgNgIOzQROcV/
Z+2EkGSMX3ck5MfuP60EkEcZQIjIgThe048BxEbYoYnIKdrO2A4hyZi6KTHkxx48kwEhyWjSa4XxDSMiMhn
Ha/
oxgNgIOzQROcUnU7dBSDJmbjke8mMPnVUCyCM9GUCIyHk4XtOPAcRG2KGJyClaT9oKIcmYu+1EyI897A4gD
/dYbkLLiIjMxfGafgwgNsIOTURO8e/xWyAkGQt3ngz5sfHJmRCSjIcYQIjIgThe048BxEB9+/
bFo48+iuuuuw633XYbXnvtNRw8GPwe+ezQROQU7/
yyCUKSIcedDvmxCeeUAPJgdwYQInIejtf0YwAxUMuWLTF58mTs3bsXu3btwssvv4w6derg0qVLQT2eHZqIn
OKNURsgJBmRe8+E/
NijKZcgJBmNIiJNaBkRkbk4XtOPAcRE586dg8vlwtq1a4M6nx2aiJzi1RHrISQZqw8kh/
zYRDWAdGMAISLn4XhNPwYQE8XHx8PlcmHPnj1Bnc8OTURO0XLoWghJxrrD50J+7LHzSgBpyABCRA7E8Zp+D
CAmKSwsxCuvvIInnniizHNycnKQnp7uOZKSktihicgRnhsUDSHJ2HzkfMiPPXEhC0KS8UDXZSa0jIjIXAwg
+jGAmOSLL76AEAJJSUllnhMREQGXy+VzsEMTkd09PWA1hCRj+7ELIT9WDSD3/8gAQkTOwwCiHwOICdq1a4c
777wTR48e1TyPV0CIyKke77sSQpIRl5Qa8mOTLioB5N4uS01oGRGRuRhA9GMAMVBRURHatWuHWrVq4fDhwy
E/nh2aiJzi0d5REJKMfadC/3t1KvUyhCSjPgOIIU6nXUazfqtwT+clZR4fTNyKoqKicDeVqELgeE0/
BhADtW3bFjfeeCPWrFmDM2fOeI7Lly8H9Xh2aCJyiod6LIeQZMQnZ4T82NNp7gDSmQHECHLcaQhJDnikXc4
Ld1OJKgSO1/RjADGQv/UcLpcLkydPDurx7NBE5BQNu0VCSDKOnQ+uzlFJZ9OzISQZd3daYkLLKp/
fd52CkGS8MWoDzqRlex3q1SYhybhwKTfcTSWqEDhe048BxEbYoYnIKep3WQohyTiZGtwV3pKS3QGkHgOIIR
buPAkhyXhv/Ga/99/VUQkgyRnZFreMqGLieE0/
BhAbYYcmIqeoq2NQm5yhBJC7OsomtKzymb8jCUKS8f6ELX7vv6fzEghJxum00MMiEfnieE0/
BhAbYYcmIicoKCzyTOu5WI5pPSmZOZ7Hk35zt52AkGR8MHGr3/
vv+1G5WnXiQpbFLSOqmDhe048BxEbYoYnICbLzCjwBIjMnP+THny8RQLgzk36zY45DSDI+mhzj9/5G7vU6i
Smhr9chIl8cr+nHAGIj7NBE5AQZ2XmeAJGdVxDy4y9cyvU8vrCQAUSvmVuUAPLxlG1+7y/
esSzT4pYRVUwcr+nHAGIj7NBE5AQXSwSIgnIEiNQsfY8nb9M3H4OQZHw2zX8AadJrBYQk4+CZ0LdMJiJfHK
/pxwBiI+zQROQE6i5Wdcu5iDwtq/gKSn5BocGtq3ymbkqEkGS0nbHd7/1N+yhFI/
eeSrO4ZUQVE8dr+jGA2Ag7NBE5wUl3bYl7y1nJPL3EFK7cfAYQvSZtOAohyfhy5g6/9zfrtwpCkhGXlGpxy
4gqJo7X9GMAsRF2aCJygsSUSxCSjIbdIsv1+JJrSHLyQ19DQt7GrzsCIcn4+tedfu9/
qv9qCEnG9mMXLW4ZUcXE8Zp+DCA2wg5NRE4Qn5wBIcl4uMfycj0+Mydf1yJ28jZurRJAvpkd6/
f+ZwdGQ0gyth69YHHLiComjtf0YwCxEXZoInKCfafSISQZj/
aOKtfjs3KLA8jlXAYQvcasSYCQZHSYs8vv/
S8MXgMhydiYkGJxy4gqJo7X9GMAsRF2aCJygrikVAhJRrN+q8r1+Mu5xXVEsnJDryNC3kaujoeQZPxvrv8A
8tKwdRCSjHWHz1ncMqKKieM1/RhAbIQdmoiCdS4jBwfPZITlWLAzCUKS0XzA6nK1XW8hQ/
I2YuVhCEmG9Fuc3/tfHbEeQpKx+mCyxS0jqpg4XtOPAcRG2KGJKBh7TqahXqclnkF8uI7nB68pV/
tz8osDSEZ2nsHvTuUzLEoJIJ0W7PZ7/2sjN0BIMqL2nbW4ZUQVE8dr+jGA2Ag7NBEFQ70CcU/
nJXik54qwHE16ReGXNQnlan9ufqEngKRdZgDRa/
CKQxCSjB8X7vF7/1ujN0JIMpbtOWNxy4gqJo7X9GMAsRF2aCIKxtxtJyAkGR9O2hruppRLfkGJAJLFAKLXw
MiDEJKMbov8B5B//rIJQpIhx522uGVEFRPHa/
oxgNgIOzQRBWPW1uMQkoyPp2wLd1PKpaCwyBNAUrNyw90cx/tp2QEISUb3xXv93v/
e+M0QkoxFsSctbhlRxcTxmn4MIDbCDk1EwZi2+RiEJOPzadvD3ZRyKSwRQC5cYgDRq++S/
RCSjF5/7PN7/38mboWQZPy2PcnilhFVTByv6ccAYiPs0EQUjMkbjk
JIMr6cuSPcTSmXoqLiAHI+MyfczXG83vI+CElG3yX7/d7/0eQYCEnGnJgTFreMqGLieE0/
BhAbYYcmomCMX6dUvv7vrJ3hbkq5qQEkxYEBJDk9G7NjjmPmFnOPWVuP40xadsD29FisBJB+Sw/4vf/
TqdsgJBkztxw3+q0gqpQ4XtOPAcRG2KGJKBi/
uCtffzsnNtxNKbe7OioBJDkj8ADbblpP2mrZVsfvjd8csD0Rv+
+FkGQMiPQfQNrO2A4hyZi2KdHgd4KocuJ4TT8GEBthhyaiYKiVr3+Y57/
wnBOodUyS050XQF4ZoVQWf33UBnwydZsph7p17otDAtda+XHhHghJxuDlB/3e/
9WvOyEkGZM2HDX6rSCqlDhe048BxEbYoYkoGMNXaheec4K73QEkmClGdvPycCWArDl0zrTX2Hr0AoQk49lB
0QHP7bxgN4QkY2jUIb/3fzM7FkKSMX7dEYNbSVQ5cbymHwOIjbBDE1Ew1MJzXcuo+
+AE9TsvhZBknE67HO6mhOylYUoAWXfYvACy/dhFCEnG0wNWBzy34/w4CEnG8JWH/
d7/3dxdEJKMMeUsHElE3jhe048BxEbYoYkoGAMites+OEH9LkoAOZXqvADScuhaCEnG+sMppr3GrhOpEJKM
Zv1WBTz3+3lKwBi5Ot7v/dJvSkD5eZX/gEJEoeF4TT8GEBthhyaiYKh1H3rL/
us+OMG97gCSdDEr3E0JWYshSgDZEG9eANlzMg1CktG0T1TAczvMUQLI6Gj/
VzgCTdEiotBwvKYfA4iNsEMTUTB6/qG97aoT3P/
jMghJxokLzgsgLw5ZAyHJ2JhgXgA5cCYdQpLRpNeKgOd+617jMXat/wDSbZGySH1QGYvUiSg0HK/
pxwBiI+zQga0+kIxhUYcDHpM3HEVWbn64m0tkCnXb1YGRzh1QPtBVCSDHzzsvgLwwWAkgmxLOm/
Ya8cmZEJKMh3osD3juf2ft1FxkrgbWn5Y5N7AS2QnHa/
oxgNgIO7S2tKw8z0P0uA4AACAASURBVNadwRwzthwLd5OJTNFloTKlZsgK506paeAOIMfOXwp3U0L23KBoC
EnGliPmBZDElEsQkoxG3SIDnttu5g4IScbE9f632VWn7PUpo1I6EYWG4zX9GEBshB1a24kLWRCSjHqdlqDz
gt1lHs+6Bwejov0vyCRyOnXXIycvKm7ULRJCkpGY4rwAov6N2Xr0gmmvof69u//HZQHPVQsNTtmY6Pf+/
suUTQt6LHbumiEiO+F4TT8GEBthh9Z25FxmUN8IBtoRhsjp/
jdXe9GxEzSKUALIkXOZ4W5KyJ4dqASQmETzAsjptMsQkox7Oi8JeO7n09yVzjf7v+o7ePlBCElGNwdv20xk
Jxyv6ccAYiPs0NoOnc2AkGQ07qm9KJNbTlJFpy46HrfWuYXlHuy+HEKSkeDAANJ8wGoIScb2Y+YFkOSMbAh
Jxl0d5YDnfjJ1m+a002FRSuHKzg4uXElkJxyv6ccAYiPs0NrUbSkf6629LaU6PWVEGUW5iJzu6193as75d4
KHeigBJD7ZeQHkaU8AuWjaa1y4lOtZz1ZYWKR5bpvJMRCSjFlbj/
u9f+TqeAhJhvRbnBlNJap0OF7TjwHERtihtcUGWZirk3vP+2FRDCBUMalz/
qduSgx3U8rtYXcAOXw2I9xNCdmT/VdBSDJ2HDcvgKRdzvMEkNz8Qs1zW0/aCiHJmLPthN/
7x6xJgJBkdJizy4ymElU6HK/pxwBiI+zQ2mISL0BIMpoPWK15HotuUUX3aYApN07wSM8VEJKMQw4MIE/
8pASQ2BOppr1GVm6+J4Bczi3QPPc/E5UA8tv2JL/
3j193BEKS0X7WTjOaSlTpcLymHwOIjbBDa9uYkAIhyXhh8BrN8yrCFqVEWtQpN7Nj/
E+5cYImvZQAcuCM8/7eNeunBJBdJgaQnPwCTwDJyM7TPPff47dASDIW7jzp9/7JG45CSDLazdxhRlOJKh2O
1/RjALERdmhtaw6dg5BkvDRsneZ5Xd1Vfwez6i9VUB+4v/GeV8Y33k7QpFcUhCRj/2nn/
b17vO9KCEnG7qQ0016joLDIE0BSs3I1z3137GYIScaiWP8BZNrmYxCSjC+mbzejqUSVDsdr+jGA2Ag7tLaV
+89CSDJa/bxe87xu7gAyiAGEKij1G++yBpxO8FhvJYDsO+W8v3d/dweQPSfNCyBFRcUB5FxGjua57/
yyCUKS8UfcKb/3/7r1OIQk45Op28xoKlGlw/GafgwgNsIOrW3ZntMQkow3R2/UPC/
i970QkowBkQcsahmRtf5vrPaA0wma9okyfRBvFqvafnenJRCSjDNp2ZrnvT1mI4QkY+nu037vn7PtBIQk46
PJMWY0k6jS4XhNPwYQG2GH1rZ41ykIScb/jd2keV73xUoA6b+MAYQqJnXAuWyP/
wGnE1hxFcEsVl29ubfLUghJRtLFLM3z3hi1AUKSEbn3jN/75+9IgpBk/
GfiVjOaSVTpcLymHwOIjbBDa1P/EX1/
whbN83os3gchyfiJAYQqqNfdA84V+86Guynlpq6jiEsybyG3WR7tbc36lQZdl0FIMo6dv6R5XquR2v1hUex
JCEnGe+M3m9FMokqH4zX9GEBshB1a25yY4KYR9PpDCSB9l+63qGVE1np1xHoIScbqA8nhbkq5WbGTlFms2s
Er2Grxan9YdcB/AJHjlOmr7/
yiffWYiILD8Zp+DCA2wg6tbbp7J5dPAyyk7C27A8gSBhCqmF4atg5CkrH20LlwN6XcrKilYRarapgE+zovD
1f6Q/RB/4F02Z4zngXtn07dhpx87boiRKSN4zX9GEBshB1am7qX/ZcB9rLvs2Q/
hCSjDwMIVVAvDlkDIcnYGJ8S7qaUmxXVxM3S2B0MzK7iHuxak5ZD10JIMtYd9h9I959O9wQQIcnYevSCGc0
lqjQ4XtOPAcRG2KG1jVsbXDXfvkuVANLrj30WtYzIWs8OioaQZGw5cj7cTSm3pweshpBkbD/
mvADyUA9lalR8svbUKL2CXSejBtINGoE0PjnTE0A2Jjg3uBLZAcdr+jGA2Ag7tLZR0fEQkoz/zd2leV6/
pQcgJBk9GUCognLy4F3V3PMzOO/
b+GDXZugV7FWi59yBdFOCdiBVr5SsP8wAQqQHx2v6MYDYCDu0tmFRhyEkGR3n79Y876dlSgDpvnivRS0jsp
aTF3CrnhmoDJpjEp0XQBpFREJIMo6YHECCfY+edZ8XaGrVP9xrh9Y4eO0QkR1wvKYfA4iNsENrG7T8IIQko
9uiPZrnDYhUAkjE7wwgVDH9rY9za2io1GlkTlyP0KibEkASU7S3x9Xr+cFrgrqy8XSQV5Mqwu5pRHbA8Zp+
DCA2wg6tTV3bEWhq1cDIgwwgVKE16RVlyTawZlKnDW124DqWhu4AEqg+h17BTplSdxQLNFVLrReycr9z68c
Q2QHHa/
oxgNgIO7S2nu76Hv2WahcYHOy+UtI1wJUSIqcqXgRt7i5MZgr22307esBdIPD4ee0K5Xq9MkJ7e12Vulg90
JQ8tYDl8jIqphNRcDhe048BxEbYobV1XbQHQpIxaPlBzfMGrzgEIcn4cSEDCFVM6hSgoyZPATKTZythB+7I
dP+PSgA5ccHcABLsFYumfaKCmpL31uiNEJKMZXtOG9lMokqH4zX9GEBshB1aW8f5uyEkGcNXHtY8b4g7gHR
ZqL1YnciprBoAm6nFkLUBt461q3u7LIWQZCRdNPf9f9MTGLSvWDwaZL2Qd37ZBCHJkOMYQIj04HhNPwYQG2
GH1vbd3F0QkoxR0fGa56m7ZXVawABCFVP9zsoA+FTq5XA3pdycvCVs/S7WvP/
BBga1YnqgNUHvjt0MIclYvOuUkc0kqnQ4XtOPAcRG2KG1tZ+1E0KSMX7dEc3zhq8MbrteIqeq21EpKJeckR
3uppTbS+4tYcuq3m1nagA8nWZuAPnXOCUwLIo9qXmeuiYoUGX298YH93xEpI3jNf0YQGyEHVrblzN2QEgyp
mxM1DxvhDuASL/
FWdMwIgsVFhZ5KlpfuJQb7uaUm5NrUtzdaQmEJONMmrkB8P0JWyAkGfN3JGmep9YlCVQYMdjnIyJtHK/
pxwBiI+zQ2j6dug1CkjFjyzHN80auViqm/
zCPAYQqnryCQk8ASbucF+7mlFuwOzzZUT13AElONzeAfDQ5BkKSMWfbCc3zGgZZl6T1pK0Qkoy5AZ6PiLRx
vKYfA4iNsENr+9D9j2egf4zVAPL9vF0WtYzIOtl5BZ4AciknP9zNKTcnF8WzagrcJ+4vXX7delzzPHVTgkD
bArdxB5rZMdrPR0TaOF7TjwHERtihtanTBxbs1J4+MDo6AUKS8d1cBhCyn8LCIl1HenaeJ4Bk5xWE+8cpt/
/3sxJAVh1wXlE89f0/
l5Fj6ut8MX07hCRj2mbtq771g9yV6+MpwQUaItLG8Zp+DCAGWrt2LV599VXccccdcLlcWLhwYUiPZ4fW9k/
3jjB/xGnv4DJmjRJAOsxhACF7WbbntGcLVyOO/
ILCcP9I5ebUqtxFRcVrcM5nmhtA2s1U1r1N2nBU8zx1TUqgRfGfTVMCyPQAgYaItHG8ph8DiIGWLl2KLl26
YMGCBQwgJgh2T/xf3AHk2zmxFrWMKDidFuw2LHy8PWYjioqKwv0jldtr7gCyYp+zAoiVmwAEu/
OfZ0pYgDUpbWcoV1Smbko0sJVElQ/Ha/oxgJiEAcR4wU7ZGLf2CIQk45vZDCBkLz/
Mi4OQZAyMPIiLl3J1HYWFzg0fAPDGKCWALN+r/
YWC3RSUCCCpWeYGkA5zlNpHY9YklHlOySsygaaEBXtFhYi0cbymHwOISYIJIDk5OUhPT/
ccSUlJturQC3eexHdzd9nmeLC7stf92gDbdo5fpwSQ9rN2WvROEQUnmAFlZRHsFU27yS+5C1mWubuQqYF15
Oqyi68WhHBF5utflSsqE9YzgBDpwQCiHwOISYIJIBEREXC5XD6HXTp0xO97DZsuYuSx52SaZrvVAPL1rwwg
ZC/
BTqmpDN7yBBDtKt92k5tv3TbInd1T9oZFHQ6uPQEC0TezYyEkGePWsv8R6cEAoh8DiEkqwhWQ9YdTMGZNgq
0OOe50wHnvE9cfhZBkfMUAQjajToGZzCkweGeMsqnE0t3OCiA5+cXbIGdkmxtAui3aAyHJGLz8YJnnlNyWO
VB7eAWOyBgMIPoxgJiEa0DCZ9IGJYC0m7kj3E0h8hLstqqVwTvuXe3kOGcFkJID/
kyT67D0WLzPs54tJvGC32P94RRPewLVhfl+3q6AU7qMkp1XgG0l2rkt8YKjt40mKonjNf0YQEzCABI+UzYm
QkgyvpzBAEL2Emxhucog2G217eZyrnWFIPsu3R/S9NRAA3zpN2VNyc+ryp7SZZT/TNzq075/
jdts+usSWYHjNf0YQAyUmZmJ2NhYxMbGwuVyYciQIYiNjcXx48ENNtihjTF1kxJA2s7YHu6mEHn5cJIyKJu
z7US4mxJ2747dDCHJWLzLWQEkKzffM6C+nGvuN/pxSal4dcR6PDswOuAR8fvegM/
XKYg1JUZ5sv8qCEnG431Xolk/5b//1mel6a9LZAWO1/
RjADFQdHS030XlrVu3Durx7NDGmOYOIF9MZwAhe3l/whYIScb8HUnhbkrY/WucEkAWxZ4Md1NCkpmTH/
QVB7v5caF7TcmKQ6a/
1uN9V0JIMuKSUnHwTAaEJKNJrxWmvy6RFThe048BxEbYoY0xffMxCEnGZ9O2hbspRF6cOug2w7/
Hb3Hke5GRnecJIDn5zgog6qL2gZFlL2o3ymO9oyAkGXtPpSHhXCaEJOOvEZGmvy6RFThe048BxEbYoY0xY4
sSQD6dygBC9qIuvF7isJ2fzKBeDVqw01lXg9JLBJDc/
MJwNyck3RcrW6v3X3bA9Nd6pOcKCEnGwTMZOHEhC0KS8UDXZaa/
LpEVOF7TjwHERtihjTFzy3EIScbHUxhAyF7U4nuRDqv+bQanTkdLyyoOIHkFzgogvf5QdtXqu3S/
6a+lFo5NOJeJ02mXISQZ93ReYvrrElmB4zX9GEBshB3aGLO2qgEkJtxNIfLSauQGCEnGyv1nw92UsPvAvUv
Sb9udFUBSs3I9AaSgULsmkd30XaLsqtVb3mf6azXsFgkhyTh2/
hJSMnM871mgOk5ETsDxmn4MIDbCDm2M2TFKAGkzmQGE7OWVEesgJBnRB5PD3ZSwa+3eEWyuw3YEu3CpOIAU
OiyA9Ft6AEKS0WOx+QHkvh+XQkgyki5mOfqqEZE/HK/
pxwBiI+zQxpiz7QSEJOPDSVvD3RQiLy2HroWQZKw/nBLupoSdU7ckPu/gb/MHRCoBJJgte/
W6u9MSCEnGmbRsS7cuJrICx2v6MYDYCDu0Mea6A0hrBhCymecHr4GQZGxKOB/
upoRdm8kxEJKM2THOKspYcjqR0wxefhBCktF10R5TX6eoqMjzHp3LyEFufqHn/
9Mu55n62kRW4HhNPwYQG2GHNsa87UkQkowPJjKAkL08MzAaQpIRk3gh3E0Ju4+nKAFklsOqwidnZENIMu7q
6LwAMjTqEIQko/OC3aa+TkFhcQC5eCnXK5CkZOaY+tpEVuB4TT8GEBthhzbG/B1KAHl/
wpZwN4XCqKioCJ9O3YaG3SLLdTTptQLLDd6tSq0OvfP4RUOf14k+mboNQpLxq9MCSLoSQOp1ct6OTsNXHoa
QZHScH2fq6+TkF3gCR3q2csWj5JQsIqfjeE0/
BhAbYYc2xoKdDCDkXa+hvMe3c2INbZNaHXp3Upqhz+tEn7oDyIwtx8LdlJCcdQeQux0YQEaujoeQZPwwz9w
A4m/Nx/0/LoOQZJy4kGXqaxNZgeM1/
RhAbIQd2hgLd56EkGS8N35zuJtCYXSxxG5FCecycez8paAPda58u5k7DG2TWh163yn+jn82TQkg0zc7K4A4
uabF6OgECEnGd3N3mfo6/oo1NopQtuU9ci7T1NcmsgLHa/
oxgNgIO7QxFsUqAeRf4xhAKjM9tQembz4GIcn4dKqxxSwbu6tDHzqbYejzOtEX07dDSDKmOSyAnEpVAkj9L
kvD3ZSQjV2rBJBvZxt7Za+0i362Ki5ZGZ3I6The048BxEbYoY3x+65TEJKMd8cygFRmehYLzzFpJ7W/
ur8FTuC3wGg7QwkgUzclhrspIUm6mAUhybjXgQFk/LojEJKM/
87aaerr+Pvda9pHufq35ySnH5LzcbymHwOIjbBDG+OPOCWA/
POXTeFuCoXRmbTyLxY26ypag67LPNWhK7svZ+yAkGRM2ZgY7qaE5MQFJYDc96PzAsjE9UchJBlf/
WpuAPE3Te2Jn7gBA1UcHK/
pxwBiI+zQxpDjTkNIMt5hAKnUTqpTZTqHPlBculvpQ2+P2Whom+7tUlwdurJrN1MJIJM2HA13U0KiBpAHui
4Ld1NCNmVjIoQk48sZxq5tKs1fSOMW1FSRcLymHwOIjbBDG2OJe/D4zhgGkMpMzzfVK/
efhZBktPp5vaFtUrciPZvOrUi/
+nUnhCRj4npnBZBj5y9BSDIaODCATHOvbfp82nZTXycxRXmPGnaL9Nz24hClCOfG+BRTX5vIChyv6ccAYiP
s0MZYtkcJIG+NNvbba3IWPQPFdYfPQUgyWg5da1h7WIzN239nKQFkgsMCiDq4blRicO0UM7YoAeQTgzdXKC
0+ORNCkvFQj+We214evg5CkrHm0DlTX5vIChyv6ccAYiPs0MZYtucMhCTjTQaQSu3IucxyDxS3HDkPIcl4d
lC0Ye0pWR06NSvXsOd1qvbuADJ+3ZFwNyUknn4V4bwAMmvrcQhJRpvJMaa+zsEzGRCSjCa9VnhuazVyA4Qk
I2rfWVNfm8gKHK/
pxwBiI+zQxojcqwSQ10dtCHdTKIzik5VB0IPdlwc+uZSdxy9CSDKe+GmVYe3JziuuDp3hrg5dmX0zOxZCkj
FurbMCSII7gPzVgQFE3d3tQ4N3dytt76k0CElG0z5RntveHrMRQpKxbM9pU1+byAocr+nHAGIj7NDGWLFPm
b//2kgGkMpM/Ra2cc8VgU8uRR1APdY7KvDJQbqU41sdujL7do4SQH5Zk+C5LTMnHxG/
70W7mTvCcvRYvA9Zufma7fY3vcgpftueBCHJ+M9EcwPIrhOpEJKMZv2KA/
y7YzdDSDJ+33UqpOeKT87Ad3N3lfmZzdp63OjmEwXE8Zp+DCA2wg5tjCh3AGnFAFKp7T+d7p4GEnqIUK+eG
DnITLvsWx26MuswZxeEJGNMiQCibn8cziPQN/SHzyp942EHBpAFO5UA8u/xW0x9ne3HlCuIT/
Vf7bntPxO3QkgyftueFNJzdVqwW/PzqtdpCXLyGejJWhyv6ccAYiPs0MZYdUAJIP/P4B2MyFn2nCz/
VQx1AbuRW61e8FMdujL7bq4SQEZHFwcQtQJ9y6FrMWnDUUuPZwcp28Qu2Kk9QD50tvxX1sJNDXhmF2ndevS
CsoZqYLTntjaTYyAkGbNjQrtioU7V+3TqNq/
PSy2qKCQZaZc5pZGsxfGafgwgNsIObYzVB5IhJBmvjmAAqczikpRpIH/
vuzLkx6qF1O4uRxHDsqjVoeuWozJ7RfT9PCWAjFwd77lNLZTXbqa5dSr8Ub+hnxfgG3p/
C6ydwqoirRsTUiAkGS8MXuO57fNp2yEkGdM2HwvpudTtmkvXiykssanDuQzuKkfW4nhNPwYQG2GHNsbqg0o
AeWXEunA3hcJIXUhech56sM5n5hh+tUINNeUpjFgR/
TAvzieAjFmTACHJ+HZOrOXt+XCSEkDmbDuheZ6eqX3hZlaBzdLUbaxfGlb8N7i8hSe/
mO4OLpsSfe67p7NSV+dU6mW9TSYKCcdr+jGA2Ag7tDHWHFL+8fvHMAaQyszfPPRgZWQXr9fIzjNmfrlaGPH
+H51XwM4MHecrAeTnVYc9tw1feRhCktFxfpzl7fl4ijJFKNCi5n2n0g3foMAq6hblb5i8Q6D6JVDJq9Dfuq
dSjV2boPFIX59M3QYhyZi5xfdzadB1GYQkIzHlku42E4WC4zX9GEBshB3aGGsP+X77RpVPTKIyD735gNADS
E5+8Za56QZtmXvUwQXszNBxvrK4ePjK4gAyaPlBCElGt0V7LG+POtCdsUV7ipC6tqjkFrNOscKiDTqi/
OxE6G/
KXTA+cq8dmRPje2Xq4R7LISQZh85m6G4zUSg4XtOPAcRG2KGNsf5wimchK1Vem3UUEzSjarkZO2s5mbq70b
Co4gDSd8l+CElGb3mf5e3xrFHwM9WnJDWA/K1P6GuLws2qDTqW7VGmer1VohhsZ/
fnPTTqUEjPpbV7VtM+URCSjD0n03S3mSgUHK/pxwBiI+zQxtgQrwSQFkMYQCqzjfG+C2FDUb/
zUkPnlx84o64dcN7iZTN0WagMSIesKB6QRvy+F0KSMSDygOXt+XKGskZhcoA1CruTlADyeDk2Nwi3aPfUqJ
eHm3t12N9id/WzHRh5MKTnem+8Uj9kUexJn/ue7L8KQpKx/dhF3W0mCgXHa/oxgNgIO7Qx1IHni0PKN/
CkikHvlbCG3SINnV/u5Kk7Zvhx4R4IScbgEgHE31URq6i7LU1crx1A/
BXZcwp1eqrZV4fV7X7fG1+83W9veR+EJKPvkv0hPdc/f9kEIcmQ43zrszzn3jp5U8J53W0mCgXHa/
oxgNgIO7QxNiUoU2+eL+c331Qx6N2MoHHPFYbOL3fywNUMXRe5A8jy4m/E1dogo6JDWydghP/
OUgLI+HVHNM+LdX+OT/zkvM9xg0VfzqgV1z8oUXH9p2UHICQZPRaHNr3urdEbISQZy/
ac8bnvpWHrICQZaw6d091molBwvKYfA4iNsEMbQ537/1w55v5TxaHWgynvdsx/
67PS0Pnl6q5cT5djUXxF5G9Kzte/BhcCzKDu0vTLGu1dmna4t3d+sr/
zAohVX87MiTkBIcloMznGc9vgFYc8V0Xm70jyHL/vOqVZS
LDVyA0QkoyofWfLvG+Fn/vs7lJOPuS4017vhRlHTOKFcP+oFRLHa/
oxgNgIO7QxtuhYfEwVh7oTT6tyLrg1en65pzo0+yUA/
+s9gl0IboZgr77o2d453PxVKDfDzC3HISSlerlqdHSCZ2OH0sd3c3eV+VyvjFCucqw+mOxz3ztjlOlZS3b7
Ts+yu55/7Cvz/TD6iE/ODPePW+FwvKYfA4iNsEMbQ91+9RmT/
5Ele1u+V6l58Ho5ax4YPb+ca5O89VisDMB+WlYcQNQtV2fHaNfiMIO/woj+bD9W/
u2dw22b+2+j2Vfhpm1KhJBktJ2x3XPbydTLaDdzB/
4zcavnaDl0LYQk4/0JW8p8LvWcdYd9p1mpC9QX7vRdoG53bWds91yNKvmeGHk0cq9ji/
YT3kgfjtf0YwCxEXZoY2zTUf+BKg5/W4GGwuj55axP4039Brjf0uIA8u/
xWyAkGQt2+m65aja1MGLJuiT+OPkLDnX6mNnrVyauPwohyfjq152a58lxp312yyrthcFrICQZGxNSfO7zVK
/3UyPE7tTCl78GKHypR/
H6GeddIbI7jtf0YwCxEXZoYzh5igQZRx3cvDOm7MGNFq255+WhrkkpWR26MuvlDiB9lxbviqROqfG345HZ1
DoVJbcF9seqaUxmsGojhHFrj0BIMr6ZHat5XqT7KuWbGl8SPDtQuRLpby3DZ9OU4pHTNmsXj7Sj9ycoYdtf
fROjX2P+DusDfUXH8Zp+DCA2wg5tDCcvEiXj/
L5LqUXwf2PLF0DUwfBjvaPw7MBo3YdaNO01k6tQO0Ufd9HBPiW2ZX0tjIuK1V25Bi3XrlOxxcGbXFhVRFFd
76G1tgMoDuVahRGf6r8aQpKx47jvWix16+QJAbZO1mvOthN4fvCakH/
n3xy9EScuZPl9TnV74cW7TpnWbjWgTXdgQLM7jtf0YwCxEXZoY+y0aJoB2Zu/
WgShUKfkGH0E+la4svBX9fwf7mlv4ZizHmwRRCdv8733lBJAHu1tbi2an1cdhpBkdJwfp3neusOBpyU266d
sBhGXlOpzX4c5ysYBo6O1dy7T69UR68v9+z5lY6Lf53xjlBK2I/f6bi9slG/
cO7uNW2v9rnIVHcdr+jGA2Ag7tDFYb4EAYP6OpIALXLXkFxRix/GLiEm8YNix/
dhF5BUUGvyTOlPfpUoA6fVHcQB5XmO+v9nURfEl16T4szHBuZsJHDiTDiHJeKTnClNfZ2iUsuVul4W7Nc9T
t0zXCnOP9VauHO495bsddsf51hSubDFEWQg/cf3RoH/
XW7vXp4wpY1tnrd29jBLOwp4VHcdr+jGA2Ag7tDHikpQA8nhfc6cZkL3N3abUIihZDI3sw19hOnW6zfZj1t
cuUCt19wlQqVst5tdiiLnVxM1w+GwGhCTj4R7LTX2dQcsPQkgyIn7fq3leMDuKPeIuCHrwjG9BUH+1ZMygr
kPZejT4fhlo8P/iEHfYjjcvbPtbZ0XG4HhNPwYQG2GHNsbuJGWawd8ZQCq12TFKLYKPShRDI/
vo7w4g3RcXD1LV4o+7k4wp/hgK9YpMzz+0K3WvP6wEkJZDnRdAEs5lQkgy/
hoRaerr9Ft6IKj3Uv2ySOtq9YPdl0NI/mtZ+FtHZAa1JtBOP+tQytJ9sRKO+i/
zf0Wt+QAlbG8zsVDgYHcQ7Lpoj2mvUVlxvKYfA4iNsEMbQ11o2bSPufOcyd7UYmgfT9kW+GSy3MBI32/
JG2t82202f4HIn2DWLdjV0ZRLEJKMht3MDSDq1aS+AYLBvlPpno0eytLQXcsiMeWSz33+
+pAZ1GC852TwwThQCHu878oy17YYJdjNACh0HK/
pxwBiI+zQxlAXWmr9o0bWyc4rwMVLuaYel3MLfF53+uZjEJKMz6YxgNiROk2nW4lvZ9XB5lE/
g02zqYPZbgG+LV7jrufyDwcGkOPnsyAkGff9uNTU30d1H4N/
jQAAIABJREFU+lFZ3/6r4pMDTwm778elEJKMpIu+u0kNX6kudtdea6JXk16hB2N1HUznBf7bpj7ngTPm/
Xs/ZaNSEPLLGTtMe43KiuM1/
RhAbIQd2hj7TyvfqjXpxQASbjuOX8S9XZaasptUyaN+l6U+C5enuqsxfzF9exmto3DyNz2kfmelr5xMvWx9
e1YEt3A6+qCydezLw50XQJIuZpn+u1jyGBxgS+NE9xWZRhpXZO7pvARCknEmLdvnPvUb/g5zzP2G/
68RSjBOOOc7Dawsga4+NHI/
55EQnjNUc9zr4D6cxHVwRuN4TT8GEBthhzaGutNLk17m7vRCgY1dm2DZYGfk6niv1560QanG/
OVMfvtnR0NKDfiLioo8n+W5jBzL2zMsKrhv051cUDK/
oFDXlrKhHA27RWJTwnnN9pxMvQwhybi3y9Iyz7mrY9l9YkKQFdf1eqDrMghJLrOmhz+BqsGrX8yE8pyh+iN
OqYWkVWmeyofjNf0YQGyEHdoYB88ol/XN3mqSAlO/
5e6ycDcKC4tMOdTpHkOjvCtYj1+nVGP+2uTBCZVP6SkqOfkFnsFrWlae5e1Ra1dIv2nXrlh14CyEpF08z86
Kisz5PSx9FBUVBWxLcno2hCSjbkfZ7/0FhcWh9OKlXJ/
7p1k0zVK9CnM6Lfgrc+oatE+n+ratqKjIE6yS032v7BjF6X3Vzjhe048BxEbYoY1h1VaTFJhaW+GnAHPB9S
irgNy4tUoAYeE/eyp9xSEzJ98z2PS3psdso6LjISQZ/
wuwYHflfmVQ14oV7XW7eCnX85kXFPoGlpKhND3bN5TOiVGmGJm5013JK3MpmcFfmfttu1KH6D9+tgHPKyj0
PGdqlm+wMoqTi2baHcdr+jGA2Ag7tDHUhY0PMYCE3ffzdvmdHmWksnbcGbNGmf717RwGEDsa4V5A3GLIWvR
YvA+d3VeyyhqMmi3Y/rJinxJAXmMA0S0jO8/zmWfn+YbOrNziUJqVm+9z/
8KdJyEkZRvfHov3GXb8uvW45zVKhoVQrsxpTX8K9HMZhUV5zcPxmn4MIDbCDm2M+GRlr/
sHuzOAhFvbGdshJBlTNiaa9hplbZ86cnVw32hTeEx2r9EpfTQyuUZFWdQrZu1naU/ZW773DIQk4/
VRDCB6ZecVX+HIzPEdiKeXCCi5+YU+96s7kplxqDuxXc4tbmMoYSFKI6imZhVf+ckv8P25jKLOBnig6zJM2
nDUsGNR7EnkmdhuJ+B4TT8GEBthhzbGEXexrXANZKjY+xO2QEgyftueZNprqLsX/bjQe/
tU9Rv2QHP6KTwysvMwZk0Cflp2wOswszK0FnVBc6A1Q5HuAPLm6I0WtaziCrTGo+QUrUI/
V8XyCwoxZWOiTx/
Sc6i7U6lFB9Mua4egsmjViwm09sUo6uuYcSzZfdrUttsdx2v6MYDYCDu0MY4GsbUjWeONURsgJBmRe8+Y9h
plLR5W1xh0KmMffqKSJge5a9qyPachJBlvMYAYoq66GDvDdzH2uYwcCEnGXSYP1Et6blA0hCR7dvA6n5njG
XQHs7BetfXoBQhJxrMDo33uO3GhuB6L2cavO4J2M3cYdjzxk1IVfvy6I6a33c44XtOPAcRG2KGNcey8EkAa
dF0W7qZUei8OWQMhyaZ+q63O3S9dCyDYug5EQPB1Y5buVgLI22MYQIxQv0vZtV/OpCnf4N/
TeYll7Xl5+DoISUb0wWSvNtzdKbQ2aK2/SHBfpf+rA6/Sdy5j18HKhuM1/
RhAbIQd2hhqtd8HGEDC7vG+KyEkGXFJqaa9RllTZ4KtbE0EANPdW7r62za1JDlOCSDvsLaCIRp2U6Y8HTt/
yec+K68UqEpftVXbcP+Pof17om4H768elZOL5fZduh9CktHrj33hbkpYcbymHwOIjbBDG6O8/2CQ8RqVo4J
wqNRvrtvO8P7m+qcyFqcT+fPrVqVuw8dTtAMIi7sZ66EeyyEkGfHJGT73qZXSG1o4nfbdsZshJBm/
7zoFoPxrCrWqvDt5d6pg6+VUdByv6ccAYiPs0MZIuqgEEK3qumS+oqKi4vndJhbbKmvgyG/
qKBTB1pRYvEsJIO+O3WxRyyq2R3tHQUgy9p/2/
XcvHDsatp60FUKSMWfbCQDAobPlK2x7Ou1ymdPHYhKV9SHNB6w2pM1WmhTkWqmKjuM1/
RhAbIQd2hgnU5U//PUZQMLKqr3u525TBo6tJ3kX/FLrg/QpVR+EyB+1H33gp3BcSYtildoT/
xrHAGIErWmaWtOYzPL5NGXr8GmbjwEA9pxMg5BkNO0T2nQprSKLG+JTICQZLw5xXoHAsv7eVjYcr+nHAGIj
7NDGOKUGkM4MIFZKzcrFyNXxnu0s1QrldTuGtntMqNQB4XvjvQeEahX2fkvNq8JOFcf8HUrl6vcnbNE8r6z
+RuXz9IDVEJKM7ccu+ty391T5Bv96/
HfWTq9dnmLd06We+Cm06VIlv4C5nOtdZHH1gWQIScYrI3y36LU77gKn4HhNPwYQG2GHNkZ5dy0hfdTCf6WP
R3ubO3goa1GwGoAGRDKAUGDBXtlQq28HCioUHHXb281HzvvcF5dk/
VqJ7+ftgpBkjFwdD6B4utQzfrbT1ZJfooJ6apZ3jRO1lswbDixmuf6wcvWm5dC14W5KWHG8ph8DiI2wQxvj
rLv4Uj0GEEv1W6os+n55+Dr0WLzPc5hdWK6sytRdF+2BkGQMXn7Q1NenikFd2/F/
Y7UXlwd7pYSC03LoWghJxvrDvn8nth+7CCHJeKq/dWslflzo/
XdjY0L5p0vd3WkJhCRj8a5TWH84xXMMWn4wqL5mRzuPX3TsAnojcbymHwOIwUaOHAkhBKpVq4amTZti69bg
50myQxsjOSPb8uJVBPRdEp5F36sPKtMZXh2x3ut27ldPofBcSRujPSj8bbsSQP4TYK0IBefVEeshJBmrDyT
73KdVzM8s6tqxvu61Y2sOKRXN/
+Gnonkg6i6AZR1OXEcRn5xh+cYAdsTxmn4MIAaaPXs2qlatikmTJmHfvn349NNPUbNmTSQn+/
5h9Ycd2hhq9VwhMYBYqY87gFi96LusKQEd58dBSDKGrzxsaXvImdS57W8GmNvORbjGUutuLHfX3ShJvfrww
mDrFmur9YMifle27165/yyEJKPVyNCnS42OTkDLoWv9Hq+OWI+V+88a3XzTlZzibObaPrvjeE0/
BhADNW3aFO3atfP8f2FhIWrVqoV+/
foF9Xh2aGOkZBYHkMr8B9Jqpb85tMqWI+chJBnPDYr2ur30XG4iLepUvtcCDDTnuAPIhwwghnjnl00Qkgw5
7rTPfesOn7N8vcGIlUqdi47zlToXXHTtLTOneHF9dl5B4AdUUByv6ccAYpDc3FxUqVIFCxcu9Lr9gw8+QKt
Wrfw+JicnB+np6Z4jKSmJHdoAF0psf1hYyABilZ5/
hGfXqbLmiX83Vwkgo6MTLG0POZPnm+6f12uep9YLaROgXggF59/
jt0BIMhbFnvS5r6zplWYauzYBQpLxzexYAKz7UlphYZHn39e/
9VmJZv1WOerwd6WtPBhA9GMAMcipU6fgcrmwaZP3/OHvv/8eTZs29fuYiIgIuFwun4MdWh+t/
dfJPOq2tz8tszaA7E5Stup8vO9Kr9u/nR0LIckYu5YBhAILdmvUWZ7ClwwgRlAL/811F/
4rKWrf2aCuShlp6qZECElG2xnbAXDTAX9eGrZOc22LnQ9/
Qbc8GED0YwAxSHkCCK+AmCM1qziA5BcUhrs5lUb3xcq2t/
0tDiD7T6dDSDKa9PLe7rf0fv5EWtTFxi8FWGz8qyeAbLOoZRXbJ1O3QUgyft163Oe+ZXvOWD79aXbMca8rX
Lzi5etybgHiklIdeVy8lBv4BwwCA4h+DCAGKc8UrNLYoY2RdjnPE0By8xlArKLW3RgYae22t/
HJmX53ZWk3cweEJGPi+qOWtoecSd3MoMUQ7fUGM7Ycg5BkfDqVAcQIbWcolcc/mhyDYVGHvY4v3b/D//
zFuu1q1Tov/x6vXPGYvln5vD+bxs+binG8ph8DiIGaNm2Kr776yvP/
hYWFqF27NhehWyw9uziA5ORX3kVyVuvmrrsxyOK6G8fOX4KQZDTouszr9i9nKIOXKRsTLW0POVOwOy5xQGq
sH+bFBZw2Y+XVh6W7vRedT95wFEKS0W7mDsvaQPbH8Zp+DCAGmj17NqpVq4YpU6Zg//
79+Oyzz1CzZk2cPRvcVnvs0MbgLh3h4SngtcLauhunUi9DSDLqd17qdfvn05RvVqdtPmZpe8iZNrt3U3u21
G5qpU1zB5DPp223pmEVXGLKJfRYvA+dF+z2e0T8vhf7T1v3b6K6Fkhd+D5u7RGvRelEAMdrRmAAMdjPP/
+MOnXqoGrVqmjatCm2bAl+4Ro7tDEulQggl3MZQKzSZaFS+G+IxQGkZOHJktsuq3PLZ2xhAKHAYhKVonfNB
2hX3S69SJkqlo3x3pXPR0XHQ0gyvp+3K8wtIzvheE0/
BhAbYYc2RlZucQDJys0Pd3MqjXBVHi9r04E2k2MgJBmz/CxuJSpN3c75yf6rNM+bslEJIF/
O4JScimj7MSWIPu0OosOilLognRfsDnPLyE44XtOPAcRG2KGNkZ1X4BmQZuYwgFil43wlgFhdebysKXfq9p
5z/
GzvSVRa7IlUCElGs37aAYRrAiq2PSfTPH9P7um8BHU7Kv+tVkYnAjheMwIDiI2wQxujZADJyM4Ld3MqjY7z
lcWkIywOIDn5xZ93eonP+z8TlQDy2/
YkS9tDzhSXpASQv5eqJ1PaxPVKAPnq150WtYyslJmTjya9orwWwd/
V0bj6EVQxcLymHwOIjbBDG6OsASmZS/pNCSA/
r7I2gJSszHuhxB7vaoXlBTsZQCgw9Zvvx3pHaZ43wR1AvmYAqbCy8wpwJi3bc6RmGVM7gioOjtf0YwCxEXZ
oY+QVFHoGpGlZ5gaQ4+ezNHdwKXlEH0w2tS3h9v28XRCSjJGr4y1/7XqdlkBIMs6mZ3tue3fsZkMr31LFVl
zQcoXmeePXKbsitZ/FAEJUWXG8ph8DiI2wQxsjv0QAMfubK3XdQzBHoG9Wne5/
c5UAMira+gBy349LISQZSRezPLe988smCEnGH3GnLG8POc+hsxkQkozGPbUDCLdlJSKO1/
RjALERdmhjlDUlxwxaVXzVo/
vivX4L5VU0HeYoAWTMmgTLX7tRt0gIScbRlEue294esxFCkrF092nL20POE5+sBJAHuy/XPG/
s2gQISca3DCBElRbHa/
oxgNgIO7QxioqKA8j5zBxTX0vd6nV2TNlbvZ64kAUhybjvx6VlnlMRfDsnFkKS8UsYAkjjnis8VzviklIRl
5SKlkPXQkgylu05Y3l7yHmOnMuEkGQ06haped6YNUoA6TCHdSGIKiuO1/
RjALERdmjjqAEkxeQAoi50Xriz7HUGJ9VK3V0qeACZrQSQsWutDyBN+0T5THlTj6h9Zy1vDznPsfOXICQZD
wS4Ujk6Wgkg381lACGqrDhe048BxEbYoY1zl3vv9uSM7MAn6/
DW6MDTfE6nKQHk7k5LTG1LuLWftRNCkjF+3RHLX3vk6ng067fK53hz9EbTNyKgiiHYK5UjV7MyNlFlx/
GafgwgNsIObRy1eFRyurkB5NUR6yEkGasPlL3DVXJ6tmcv+Yrsv2EMIER6nVKvVHYOLoD8MC/
OopYRkd1wvKYfA4iNsEMbx9+2rGZ4ccgaCEnGxviUMs9JyczxTAcqKioytT3h9NWvSgCZuP5ouJtCFLIzac
oXBfUCXKn8edVhCEmG9BsDCFFlxfGafgwgNsIObZx7OisB5HTaZVNf5+kBqyEkGduPXSjznIuXcj0BpKCw4
gaQdjN3QEgyJm1gACHnSc7I9vyeahm+UgkgHefvtqhlRGQ3HK/
pxwBiI+zQxqnfWakLcSrV3ACiLn7eczKtzHPSsvI8A5vc/
EJT2xNOX7oDyGQGEHKg80FeqRwWpQSQTgsYQIgqK47X9GMAsRF2aOPc28W3MJ0ZHuqxHEKSEZ+cUeY5GdnF
ASQ7r8DU9oSTWhNl6qbEcDeFKGSpWcVXKvMLyv6iYGjUIQhJRmcGEKJKi+M1/
RhAbIQd2jhqZewTF8wNIPf/uCzg62Tl5nsGNlm5+aa2J5y+mK4EkGkMIORAaZeLvyjIyS/
7i4LBK5QA8uPCPRa2jojshOM1/RhAbIQd2jjBBAO9ioqKirf71Vjsnp1X4BnYZGRX3C1hP5/
mDiCbj4W7KUQhy8wp/qLgcq5GAFl+EEKS0XURAwhRZcXxmn4MIDbCDm2cBl2VAHLs/
CXTXiM3v9AzYEm7XHaw8DqvAtek+HTqNghJxowtDCDkPJdzi78oyMwp+0rlwEglgET8vtfC1hGRnXC8ph8D
iI2wQxunYbdICElGYop5ASTYtR0FhUWe8y5cyjWtPeH2iTuAzNxyPNxNIQpZTn5xAEnXuFI5IPIAAwhRJcf
xmn4MIDbCDm2cRu4AcuRcpmmvEWx9j6Ki4gCSkpljWnvC7eMpMRCSjFlbGUDIefIKiq9UPtxjOR7pucLvoa
4v676YAYSosuJ4TT8GEBthhzbOXyOUAJJgYgBJupgFIcm4t4t25WTAusrs4dRmshJAZscwgJDzFBUV4fnBa
zwhJNDBfk5UeXG8ph8DiI2wQxvnwe7q9rjmBZCEc5kQkoy/
RkQGPNeqwojh9JE7gMyJORHuphCVS3ZeAQ6eyQh4mL27HhHZG8dr+jGA2Ag7tHEedtfnOHy27Poceu07lQ4
hyXi0d1TAc+tbVJcknFpP2gohyZi7jQGEiIgqLo7X9GMAsRF2aOM07rkCQpJxyMQAsuP4RQhJxhM/
rQp4rhXbAofbBxOVADJve1K4m0JERGQajtf0YwCxEXZo4zziDiAHz5gXQDYlnIeQZDw/eE3Ac63YlSvc/
uMOIPN3MIAQEVHFxfGafgwgNsIObZwmvaIgJBn7T5v3XkYfTIaQZLw8fF3Ac61YFB9u70/
YAiHJWLCTAYSI/
n97dx4eRZ3ncbwRIagIiOB4TQrEOKPioCuyoI6Og4sO+uDqjqOoIw6uriPjMcM4BSJmUS5FcVBEQRR0ZYPH
cmhxHyHcSCQkHAFiCJBwBUMC4UggyWf/6KSkTUOD1V1dKd6v5/k9z6S68/PXv/nafj/
prirAv+jXnCOAeAgFHT3tBwYDyJqCElVWVsVkzFizQ4Zp6d53F0dcTzsXzkmJt4c/
CAaQyasK4r0UAABihn7NOQKIh1DQ0XNDdQBxY3Qfsyzietz4Sli8dR+zTIZpaUoGAQQA4F/
0a84RQDyEgo6eZ1NWuRZA3p67KeJ6aj6RWbfdv//
fPjg6GECmrt4e76UAABAz9GvOEUA8hIKOnqqqKhUfLNfeA7Ed+w4fOan1/
OugufZXwvzqgdFLZZiWviKAAAB8jH7NOQKIh1DQ/
tVpcDCArN5WHO+lxMz97wcDiJW5I95LAQAgZujXnCOAeAgF7V83DZ0nw7S0auveeC8lZu5/
LxhApmURQAAA/kW/5hwBxEMoaP+65fX5MkxL6VuK4r2UmPmPUUtkmJZmrCGAAAD8i37NOQKIh1DQ/
nXbsFQZpqUVm/0bQO6zA8jOeC8FAICYoV9zjgDiIRS0f/32jWAAWfrd9/FeSszc++5iGaalmWsJIAAA/
6Jfc44A4iEUtH/92/AFMkxLS3L2xHspMXPPyGAAmb1uV7yXAgBAzNCvOUcA8RAK2r/
ueCtNhmlp4abCeC8lZrpVB5A5BBAAgI/RrzlHAPEQCtq/
uo5YKMO0lLphd7yXEjPd3lkkw7Q0L5sAAgDwL/o15wggHkJB+9fdb/u/Oa95jfOz/
RuyAACgX3OOAOIhFLR/nQ5fT7rr7eCnPPN9/CkPAAD0a84RQDyEgvav0+EKUb/7ZzCALNjo3/
NcAACgX3OOAOIhFLR//f694D0ypvv4LuF3VgeQNAIIAMDH6NecI4B4CAXtX/e/
v1SGaenrzO3xXkrMnA5X+gIAgH7NOQKIh1DQ/vXg6GUyTEtT
V/s3gHQZHgwgi318rxMAAOjXnCOAeAgF7V8Pf7Bchmlp8qqCeC8lZk6Hmy0CAEC/5hwBxEMoaP/
644crZJiWvkzPj/dSYub2N4MBZOl338d7KQAAxAz9mnMEEA+hoP2rx0fBAPLZym3xXkrM/
PaNVBmmpWW5BBAAgH/RrzlHAPEQCtq/eo77RoZpaeI3W+O9lJi5rTqALCeAAAB8jH7NOQKIh1DQ/
vWfH6+UYVqasNy/AeQ3w4IB5Ju8ongvBQCAmKFfc44A4iEUtH/
91yfpMkxLnyzbEvbxIxWVmpJRoI8Wb3ZtTMko0JGKyqi9xltfny/
DtLSSAAIA8DH6NecIIB5CQfvX059+K8O09PHSvLCPT8vaIcO0XB9WZvRujHhLdQBJ37I3anMCAOA19GvOEU
A8hIL2r14TggHko8Wbwz4+bvFmGaalToPnqteEb2M+Og2ee8JA9FPc/No8Gaalb7cSQAAA/kW/
5hwBxEMoaP96NmWVDNPSBwtzwz7+/oLvZJiW/vpZhivreeZ/
g+v5cFH4QPRT3DQ0GEBWEUAAAD5Gv+YcAcRDKGj/+uvEDBmmpdFp34V9/
J9zNskwLfWdlOWJ9fwUNw4JBpDV24qjNicAAF5Dv+YcAcRDKGj/6v35ahmmpfcWhG/
4X5uRLcO09N9frXVlPX+vXs+7qTlRm7Pma12Z+QQQAIB/0a85RwDxEArav174Itjwj5wfvuF/
5et1MkxLQ6Znu7KePv+XKcO09PbcTVGbs2N1AMnKL4nanAAAeA39mnMEEA+hoP0rUsPfb3KWDNPSW3M2urK
emn/e8NnR++d1GDRHhmlpTQEBBADgX/
RrzhFAomTgwIHq1KmTzjrrLDVt2vQnzUFB+9eLk04cMGq+ojUqNXrnZJxI8tS1MkxLw2ZuiNqcNwwMBpC12
wkgAAD/ol9zjgASJS+//LKGDx+uv/3tbwQQ1NJ/yhoZpqU3j/OJw19icFWqE3k1Bl/
5al8dQNbvoH4BAP5Fv+YcASTKxo0bRwBBLZE+cXji45UyTEufLg9/p/
RoGzx9vQzT0kBrXdTmvP7V2TJMS9k7qV8AgH/
RrzlHAIkyAgjCGfBV8BOHoTPCf+Lw6IcrZJiWvkzPd2U9r8+M/lW3/uWVYADZsHN/
1OYEAMBr6NecI4BE2akEkLKyMu3bt88e+fn5FLRPDbSCAWTwtPVhH//
D+0tlmJa+ztzuynrenL1RhmnppclrojbntQNmyTAtbdpFAAEA+BcBxDkCyAmYpqlAIHDCkZ0d+hftUwkgyc
nJYeekoP0n0lee7hm5WIZpafa6Xa6sZ8Tc4I0P+/
xf9G582K46gOTsJoAAAPyLAOIcAeQECgsLlZ2dfcJRXl4e8jt8AoJwhlbfaHDAV+EDyJ3/
XCjDtLRwU6Er6xk5P0eGaemFL1ZHbc5f/
XdNACmN2pwAAHgNAcQ5AkiUcQ4Iwhk2c4MM01Ly1PDnXNz2RqoM09KKzUWurOf9Bd/
JMC399bOMqM3ZNnmmDNNSbiEBBADgX/RrzhFAomTr1q3KyMjQgAED1LhxY2VkZCgjI0OlpSffjFHQ/
hXpnIsbh8yTYVpava3YlfWMXbRZhmnp2ZRVUZuz7cvBALJ5z4GozQkAgNfQrzlHAImSHj16hD2fIzU19aTn
oKD9659zgudcvDgp/DkXNZewdesKUuOX5MkwLT094duozXl1dQDZ8j0BBADgX/
RrzhFAPISC9q+37ZO+M8M+XvPpQZ5Lnx78z7ItMkxL//VJetTmvLL/
DBmmpa3fH4zanAAAeA39mnMEEA+hoP0r0knfSS9Ol2Fa2lFyyJX1pKzYKsO09Pj4lVGb85cvBQPItiICCAD
Av+jXnCOAeAgF7V/vVZ/0/bfPageQisoqGaYlw7RUdKA8zG9H3+crt8kwLfX4aEXU5ryiXzBE5e8lgAAA/
It+zTkCiIdQ0P41Ji03eNWpibWvOnWovMIOIAfLj7qynkmr8mWYlh4ZuzxqcyZVB5CCYnc+xQEAIB7o15wj
gHgIBe1fHyzMPe5Vp4oPltsB5GhFpSvrmbp6uwzT0oOjl0VtTre/RgYAQDzQrzlHAPEQCtq/
PlocvOztVf1n6LZhqSHj16/
Nl2FaatN3mmvrmZa1Q4Zp6f73lkZtzjZ9p8kwLe0sORy1OQEA8Br6NecIIB5CQftX6obd9qccxxtdhqe5tp
5Za3fKMC3d++7iqM15WXUA2bWPAAIA8C/
6NecIIB5CQftbzu5SfZNXdNxRWubO+R+SNC97lwzTUrd3FkVtztZ9gkFq934CCADAv+jXnCOAeAgFDbcs2F
gow7TUdcTCqM1Z80lO4f6yqM0JAIDX0K85RwDxEAoablmcs0eGaemOt6Lzta+qqh8uJbynlAACAPAv+jXnC
CAeQkHDLctyv5dhWur85gL7WFVVlXJ271dmfvEpjQ0796syDvcyAQAgHujXnCOAeAgFDbeszCuSYVq69fX5
9rHxS/Iinih/
vDF89kb7f+8lgAAAfIx+zTkCiIdQ0HDLqq17ZZiWbho6zz5mfpkpw7TUNnmmbhwy76TGNckzZZiWnv70Wzu
AlBw8EsdXBgBAbNGvOUcA8RAKGm7Jyi+RYVrqOHiufeyZ/
10lw7T0wcLck57n46XBT03+8+OVPwSQQwQQAIB/0a85RwDxEAoablm/
Y58M01L7gXPsY4+PD4aICcu3nvQ8ny7fIsO01OOjFXYA2XeYAAIA8C/
6NecIIB5CQcMtm3btl2Fauu6V2faxhz5YJsO0NHlVwUnPM/GbrTJMy/
5dw7RcvZ8JAABuo19zjgDiIRQ03JJbWCrDtHRN8kz72L+/u1iGaWnm2p0nPc8X6fkyTEv3v7/
UDiAHCCAAAB+jX3OOAOIhFDTcsvX7gzJMS1f1n2Efu+NKV9OlAAARqElEQVStNBmmpYWbCk96nikZBTJMS/
dWhxfDtHSovCIWSwYAwBPo15wjgHgIBQ23FBQfkmFauqLfdPvYr1+bL8O0lL6l6KTn+TpzuwzT0t1vL7IDy
OEjBBAAgH/RrzlHAPEQChpu2bXvsAzT0mV9p9nHrn91jgzT0rrtJ19/
M9bssO+oTgABAJwO6NecI4B4CAUNt+wpLbMDQ1VVlSTpqv4zZJiW8vYcOOl5Zq/
bJcO09Ns3Uu35yo9WxmrZAADEHf2acwQQD6Gg4Zbig+V2YDhaUamqqiq16hP8efe+wyc9z/zs3TJMy/
76lmFaOlJBAAEA+Bf9mnMEEA+hoOGW0rKjIV+ZOnykwv55/
yncxyNtY6EM01KnwXNDAg0AAH5Fv+YcAcRDKGi45djAcaDsqIoO/
PCJSEVl1UnPsyRnjwzTss8fMUxLlafw+wAA1DX0a84RQDyEgoZbjlRU2oGh5NAR5e8NXpY36ZirYp2MFZuL
ZJiW2g2YVeucEgAA/Ih+zTkCiIdQ0HBLZWWVHRiKDpTbd0ZvN2DWKc2TvmWvDNPS1S/
PtOcDAMDP6NecI4B4CAUNN7WuOel8/2Gt3lZsn8txKmp+L6nfdBmmpVZ9CCAAAH+jX3OOAOIhFDTclPRiMD
RMySjQBwtz7cvpnoo1BSUyTMsOM60JIAAAn6Nfc44A4iEUNNxUc9+PY0e3dxad0hzZO/eF/
H6bY25sCACAH9GvOUcA8RAKGm4aOT9Hd7yVZo+uIxZqSkbBKc2Rs3t/SAC5/
EUCCADA3+jXnCOAeAgFjbpm854DIQHkVK+iBQBAXUO/
5hwBxEMoaNQ124oOhgSQKwggAACfo19zjgDiIRQ06podJYdCAsgvXiKAAAD8jX7NOQKIh1DQqGt27z8cEkC
u7D8j3ksCACCm6NecI4B4CAWNuqboQHlIALmKAAIA8Dn6NecIIB5CQaOuKTl0JCSAXP3yzHgvCQCAmKJfc4
4A4iEUNOqaA2VHQwJI22QCCADA3+jXnCOAeAgFjbqm7GhFSAC5hgACAPA5+jXnCCAeQkGjrqmorAoJIO0Gz
Ir3kgAAiCn6NecIIB5CQaOuqaoKDSDXEkAAAD5Hv+YcAcRDKGjURW36TrMDyHWvzI73cgAAiCn6NecIIB5C
QaMuuqLfdDuAXP8qAQQA4G/0a84RQDyEgkZddFX/
GccEkDnxXg4AADFFv+YcAcRDKGjURdckz7QDyA0DCSAAAH+jX3OOAOIhFDTqon95ZbYdQDoMIoAAAPyNfs0
5AoiHUNCoi24YOMcOIP86aG68lwMAQEzRrzlHAPEQChp1UafBc+0A0mkwAQQA4G/
0a84RQDyEgkZddPNr8+wAcuOQefFeDgAAMUW/
5hwBxEMoaNRFvxmWSgABAJw26NecI4B4CAWNuqjzmwvsAHLzawQQAIC/
0a85RwDxEAoaddEdb6XZAeTXr82P93IAAIgp+jXnCCAeQkGjLrrr7YV2ALn1dQIIAMDf6NecI4B4CAWNuqj
byMV2APnNsNR4LwcAgJiiX3OOAOIhFDTqovtGLbEDyG0EEACAz9GvOUcA8RAKGnXR/
e8vtQPIb99IjfdyAACIKfo15wggHkJBoy7qPmaZHUA6v7kg3ssBACCm6NecI4B4CAWNuuiRscvtAHI7AQQA
4HP0a84RQDyEgkZdNCYtV636BAPIgK/
WxXs5AADEFP2acwSQKMjLy1PPnj3VqlUrNWrUSJdddplefvlllZeXn9I8FDTqqsNHKnSovCLeywAAIObo15
wjgETBjBkz9Nhjj2nWrFnKzc3V1KlTdcEFF6h3796nNA8FDQAA4G30a84RQGLk9ddfV+vWrU/
pdyhoAAAAb6Nfc44AEiP9+vXT9ddff0q/Q0EDAAB4G/2acwSQGMjJyVGTJk00ZsyYEz6vrKxM+/
bts0d+fj4FDQAA4GEEEOcIICdgmqYCgcAJR3Z2dsjvFBQUqE2bNnr88ccjzp+cnBx2TgoaAADAmwggzhFAT
qCwsFDZ2dknHMde6Wr79u1KSkrSH//4R1VWVkacn09AAAAA6hYCiHMEkCgpKChQUlKSHnzwQVVU/
LTLkVLQAAAA3ka/
5hwBJAoKCgp0+eWXq3PnziooKNDOnTvtcSooaAAAAG+jX3OOABIF48aNO+45IqeCggYAAPA2+jXnCCAeQkE
DAAB4G/
2acwQQD6GgAQAAvI1+zTkCiIeUlJQoEAgoPz8/5OpYDAaDwWAwGAxvjJqrlpaUlMS7dayzCCAeUlPQDAaDw
WAwGAxvj9zc3Hi3jnUWAcRDKisrlZ+fr5KSkrin+2MTPp/
IsEfsEXsU78EesUfsEXvklbFt2zYFAgEVFxfHu3WsswggOK59+/
iOYyTsUWTsUWTsUWTsUWTsUWTsUWTsUWTskXMEEBwX/
4JFxh5Fxh5Fxh5Fxh5Fxh5Fxh5Fxh5Fxh45RwDBcfEvWGTsUWTsUWTsUWTsUWTsUWTsUWTsUWTskXMEEBxX
WVmZkpOTVVZWFu+leBZ7FBl7FBl7FBl7FBl7FBl7FBl7FBl75BwBBAAAAIBrCCAAAAAAXEMAAQAAAOAaAgg
AAAAA1xBAAAAAALiGAILjGjlypAzDUEJCgjp06KAVK1bEe0muSUtL0913362LLrpIgUBAkydPDnm8qqpK/
fv314UXXqhGjRqpc+fO2rRpU8hzioqK9NBDD+ncc89V06ZN1bNnT5WWlrr5MmJm8ODBat+
+vRo3bqyWLVvqnnvu0YYNG0Kec/
jwYT399NNq3ry5zjnnHN13333atWtXyHO2bt2qrl276qyzzlLLli3197//
XUePHnXzpcTMqFGjdM011+jcc8/Vueeeq44dO2r69On246f7/oQzZMgQBQIBPffcc/
ax032fkpOTFQgEQsYvfvEL+/HTfX9qFBQU6OGHH1bz5s3VqFEjtW3bVitXrrQfP93fsw3DqFVHgUBATz/
9tCTqSJIqKir00ksvqVWrVmrUqJEuu+wyvfLKK6qqqrKfc7rXUTQRQBDWxIkT1bBhQ3300Udat26dnnjiCT
Vr1ky7d+
+O99JcMX36dPXr10+TJk0KG0CGDh2qpk2basqUKcrMzFS3bt3UunVrHT582H7OnXfeqXbt2mn58uVatGiRL
r/8cnXv3t3tlxITd9xxh8aNG6e1a9dq9erV6tq1qxITE3XgwAH7OU899ZR+/
vOfa968eUpPT1fHjh1144032o9XVFSobdu2uv3225WRkaHp06erRYsW6tu3bzxeUtR99dVXmjZtmjZt2qSN
GzfqxRdfVIMGDbR27VpJ7M+PffPNN2rVqpV+9atfhQSQ032fkpOTdfXVV2vnzp322LNnj/346b4/
krR3714ZhqHHHntMK1as0ObNmzVr1ix999139nNO9/fswsLCkBqaM2eOAoGAUlNTJVFHkjRo0CCdf/
75sixLeXl5+uKLL9S4cWONGDHCfs7pXkfRRABBWB06dFCvXr3snysrK3XxxRdryJAhcVxVfPw4gFRVVenCC
y/UsGHD7GMlJSVKSEhQSkqKJGn9+vUKBAIhf4GbMWOG6tWrp+3bt7u3eJcUFhYqEAgoLS1NUnA/GjRooC++
+MJ+TnZ2tgKBgJYtWyYpGPLOOOOMkL+yvffee2rSpInKy8vdfQEuOe+88zR27Fj250dKS0uVlJSkOXPm6NZ
bb7UDCPsUDCDt2rUL+xj7E2Sapm6+
+ebjPs57dm3PPfec2rRpo6qqKuqo2l133aWePXuGHLvvvvv08MMPS6KOoo0AglrKy8tVv379Wn/1f/
TRR9WtW7c4rSp+fhxAcnNzFQgElJGREfK8W265Rc8+
+6wk6cMPP1SzZs1CHj969Kjq16+vSZMmxX7RLsvJyVEgENCaNWskSfPmzVMgEFBxcXHI8xITEzV8+HBJUv/
+/
Ws1Vps3b1YgENCqVavcWbhLKioqlJKSooYNG2rdunXsz488+uijev755yUpJICwT8EAcvbZZ+uiiy5S69at
9dBDD2nr1q2S2J8aV155pZ5//nn9/ve/V8uWLXXttddqzJgx9uO8Z4cqLy/
X+eefr0GDBkmijmoMGjRIhmFo48aNkqTVq1frggsu0KeffiqJOoo2Aghq2b59uwKBgJYuXRpy/
IUXXlCHDh3itKr4+XEAWbJkiQKBgHbs2BHyvPvvv19/+MMfJAXfyK644opac7Vs2VKjRo2K7YJdVllZqbvu
uks33XSTfWzChAlq2LBhrefecMMN+sc//
iFJeuKJJ9SlS5eQxw8ePKhAIBByrkRdlpWVpXPOOUf169dX06ZNNW3aNEnsz7FSUlLUtm1b+ysMxwYQ9in4
l+fPP/9cmZmZmjlzpjp16qTExETt37+f/amWkJCghIQE9e3bV6tWrdLo0aPVqFEjjR8/XhLv2T/
22WefqX79+vZf5KmjoMrKSpmmqXr16unMM89UvXr1NHjwYPtx6ii6CCCohQASigByYk899ZQMw1B+fr59jP
+gBZWXlysnJ0fp6enq06ePWrRooXXr1rE/
1bZt26YLLrhAmZmZ9jECyIkVFxerSZMmGjt2LPtTrUGDBurUqVPIsWeeeUYdO3aUxHv2j3Xp0kV33323/
TN1FJSSkqJLL71UKSkpysrK0ieffKLmzZsTZGOEAIJa+ApWKL6CdXy9evXSpZdeqs2bN4cc5yP98Dp37qwn
n3yS/ak2efJkBQIB1a9f3x6BQED16tVT/fr1NXfuXPYpjPbt26tPnz7UUbXExEQ9/vjjIcdGjRqliy+
+WBLv2cfasmWLzjjjDE2ZMsU+Rh0FXXrppRo5cmTIsVdffdW+6hx1FF0EEITVoUMH/eUvf7F/
rqys1CWXXMJJ6PrhRLQ33njDPrZv376wJ6Klp6fbz5k1a5ZvTkSrqqpSr169dPHFF9e6BKH0w8mxX375pX1
sw4YNYU9qPPbKaqNHj1aTJk1UVlYW+xcRB7fddpt69OjB/lTbv3+/
1qxZEzLat2+vRx55RGvWrGGfwigtLdV5552nESNGsD/
VunfvXusk9Oeff97+VIT37B8kJyfrwgsvDLl8LnUU1Lx581qfUgwePFhJSUmSqKNoI4AgrIkTJyohIUHjx4
/X+vXr9eSTT6pZs2a1rgvuV6WlpcrIyFBGRoYCgYCGDx+ujIwM+
+TPoUOHqlmzZpo6daqysrJ0zz33hL0U33XXXacVK1Zo8eLFSkpK8s2l+P785z+radOmWrBgQcilHQ8dOmQ/
56mnnlJiYqLmz5+v9PR0derUKeRrEjWXdezSpYtWr16tmTNnqmXLlr65rGOfPn2UlpamvLw8ZWVlqU+fPqp
Xr55mz54tif05nmO/
giWxT71799aCBQuUl5enJUuW6Pbbb1eLFi1UWFgoif2RgpdwPvPMMzVo0CDl5ORowoQJOvvss+2ThyXes6X
gHxITExNlmmatx6gjqUePHrrkkkvsy/
BOmjRJLVq0sL+GJlFH0UQAwXG98847SkxMVMOGDdWhQwctX7483ktyTWpqatibNvXo0UPSDzcj+tnPfqaEh
AR17tzZvnJGjaKiInXv3l2NGzdWkyZN9Kc//
ck3NyMKtzeBQEDjxo2zn1NzY6vzzjtPZ599tu69917t3LkzZJ4tW7bod7/7nc466yy1aNFCvXv39s2NrXr2
7CnDMNSwYUO1bNlSnTt3tsOHxP4cz48DyOm+Tw888IAuuugiNWzYUJdccokeeOCBkPtbnO77U+Prr79W27Z
tlZCQoF/+8pchV8GSeM+Wgn+JDwQCtV63RB1JwU9kn3vuOSUmJto3IuzXr1/
IZYapo+ghgAAAAABwDQEEAAAAgGsIIAAAAABcQwABAAAA4BoCCAAAAADXEEAAAAAAuIYAAgAAAMA1BBAAAA
AAriGAAAAAAHANAQQAAACAawggAAAAAFxDAAEAAADgGgIIAAAAANcQQAAAAAC4hgACAAAAwDUEEAAAAACuI
YAAAAAAcA0BBAAAAIBrCCAAAAAAXEMAAQAAAOAaAggAAAAA1xBAAAAAALiGAAIAAADANf8Pka8MA5ejKBoA
AAAASUVORK5CYII=\" width=\"800\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"IR2 = np.zeros([200])\n",
"IR2[0] = 1;\n",
"IR2[50] = 1/2;\n",
"IR2[100] = 1/3;\n",
"IR2[125] = 1/3;\n",
"IR2[170] = 1/4;\n",
"IR2[199] = 1/5;\n",
"\n",
"\n",
"plt.figure()\n",
"plt.plot(IR2)\n",
"plt.title(\"Réponse impulsionnelle du canal\")\n",
"plt.xlim(XLIMS)\n",
"\n",
"sig_ir2 = si.convolve(sig,IR2)\n",
"plt.figure()\n",
"plt.plot(sig_ir2)\n",
"\n",
"plt.title(\"Signal reçu, canal non idéal, sans bruit\");\n",
"plt.xlim(XLIMS);\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"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 = $('<div/>');\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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all '
+\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\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 = $('<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 = $('<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 = $('<canvas/>');\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 = $('<div/>');\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 = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all
' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\
n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt ===
mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then
trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\
n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id:
this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format =
format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\
n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL ||
window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21)
== \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message
type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \",
msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type +
\"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-
in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from
http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the
document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-
home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-
arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-
right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan
axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"],
[\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"],
[\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-
save\", \"download\"]];\n",
"\n",
"mpl.extensions =
[\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm)
{\n",
" // Create a \"websocket\"-like object which calls the given IPython
comm\n",
" // object with the appropriate methods. Currently this is a non binary\
n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage
function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a
real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id +
\"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in
FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' +
width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\"
width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\"
title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></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 = $('<span class=\"mpl-message\" style=\"text-
align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline
pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\"
title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove
icon-large\"></i></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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 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"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img
src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAGQCAYAAABWJQQ0AAAgAElEQVR
4nOzdd3xT5eIG8NO9aApaNlgoykaKLFnWgRZEQAXFH6hVRK+ICOpliELLVbmil5RVtmwFlOEsEMAyBMsoq1
BIdym0hQ5KKaUjyfP7I+TQNEmbjjQn6fP9fM5HOTlJ3py+lPfJuwQQERERERHVEcHaBSAiIiIiovqDAYSIi
IiIiOoMAwgREREREdUZBhAiIiIiIqozDCBERERERFRnGECIiIiIiKjOMIAQEREREVGdYQAhIiIiIqI6wwBC
RERERER1hgGEiIiIiIjqDAMIERERERHVGQYQIiIiIiKqMwwgRERERERUZxhAiIiIiIiozjCAEBERERFRnWE
AISIiIiKiOsMAQkREREREdYYBhIiIiIiI6gwDCBERERER1RkGECIiIiIiqjMMIEREREREVGcYQIiIiIiIqM
4wgBARERERUZ1hACEiIiIiojrDAEJERh06dAhz585FXl6etYtCREREdoQBhIgMpKSkoFGjRpDL5QaPBQYGI
jAwsFbfLyQkBILAX0eWFBwcDD8/P2sXQ+Tn54fg4GBrF0Pybt+
+jXfeeQdNmzaFIAiYMmWKtYtkUVL7XWCJ33dExABCZHUJCQl477330LZtW7i5ucHb2xv9+/
fHwoULUVhYWOflKSkpQd++ffHxxx8bfby6/
yDfuXMHISEhiIyMNHhMao2Omrh48SJCQkKQnJxs7aLoYQCRhvDwcKxbt87s6z/
77DM4OTkhNDQUmzZtwqlTpyxXOAkw9rvAz88PISEhVikPAwiRZdjHv/hENuqPP/6Ah4cHGjZsiI8+
+girVq3C0qVL8dprr8HFxQXvvvtunZfpzJkzCAsLg0ajMfp4df9BzsrKgiAIRhsSpaWluHv3bpVfU4p+/
vlnCIJgNGhZU0lJCYqKiqxdDFF9DSBdunSp0t+fvn37YsCAAZYrkMQwgBDVDwwgRFaSlJSEBg0aoGPHjkhP
Tzd4PD4+HgsXLqzx+2g0GpM9KWq1usoNf0sEEHtSlQBS0c/
G3lU3gJSWlqK4uLj2C1RHqhpA2rZti2HDhtXa+0v9/jGAENUPDCBEVvL+++9DEAQcPXrUrOtLS0vxn//
8B/7+/nB1dYWfnx8+++wzg2+1/fz8MGzYMOzZswc9e/
aEm5sbwsLCAACCIGDSpEnYvHkzOnfuDGdnZ+zatQuANoyEhYWhc+fOcHNzQ5MmTfDee+8hNzdX7/XL/
4NcXFyM2bNn47HHHoNMJoOnpycGDhyIv/76S7wmOTkZgiAYHLpGhbFGR1U/
75EjR9C7d2+4ubmhbdu22LBhg1n31dzPbc77rFu3zujn1IWRin42ALBp0yY89thjcHd3R6NGjTBmzBhcuXK
l0s+Qn5+PKVOmwM/
PD66urmjcuDEGDx6M6Oho8RpjQ7Cys7Px+uuvw9vbGz4+PnjzzTdx9uxZCIKgN0woODgYXl5euHr1KkaOHA
kvLy/4+vri008/hUql0nvN7777Dv369cMDDzwAd3d3PPbYY/j5558NymxOANHVm++++w5hYWHw9/
eHo6Mjzpw5AwAoKirCnDlz0K5dO7i6uqJVq1aYNm2a0Z6eTZs2oXfv3mKP46BBg7B3717xcVPh2NygZE498
vPzM6gbphq3kZGRRuuSbmjf9evXMX78eDRp0gRubm549NFHsX79erPvn+71t23bhtDQULRo0QINGjTAqFGj
kJeXh6KiIkyZMgWNGzeGl5cX3nrrLZP3tTp1FgCOHDmCXr16wc3NDf7+/
lixYoXZASQxMRGjR49Go0aN4OHhgb59++KPP/
4weg+3bduGr776Ci1btoSbmxuefvppxMfHG5Rn5cqV8Pf3h7u7O3r37o3Dhw8bDSBVqXdEZBwDCJGVtGzZE
v7+/mZfHxwcDEEQMHr0aISHh+PNN9+EIAh48cUX9a7z8/PDww8/
jEaNGmHmzJlYsWKF2AAWBAGdOnVC48aNMXfuXISHh4uNuQkTJsDZ2RnvvvsuVqxYgRkzZsDLywu9e/
dGSUmJ+Prl/
0HOyspC8+bN8cknn2D58uX49ttv0aFDB7i4uIivXVBQgOXLl0MQBLz00kvYtGkTNm3ahHPnzgEwHkCq8nk7
dOiApk2bYtasWVi6dCkee+wxODg44MKFC5XeV3M/tznvk5iYiI8++giCIGDWrFni58zMzKz0Z/PVV1/
BwcEBY8aMwbJlyzB37lz4+vqiTZs2uHnzZoWfYezYsXB1dcUnn3yCNWvWYP78+Rg+fDg2b96sdz/
LBhC1Wo1+/frByckJH374IZYuXYpnn30W3bt3NxpA3N3d0aVLF4wfPx7Lly/
HqFGjIAgCli1bpleWVq1a4YMPPsDSpUshl8vRp08fCIJg0DisSgDp3Lkz/
P398c033yAsLAypqalQq9V47rnn4OnpialTp2LlypX48MMP4ezsjJEjR+q9TmhoKARBQP/+/
fHdd99h0aJFGDt2LGbMmCFeU9MAYk492rVrF1q1aoWOHTuKdUOhUBh9vczMTGzatAm+vr4ICAgQry8oKEBh
YSE6deoEFxcXfPzxx1i8eDEGDRoEQRD0ek0run+6xnlAQAD69euHxYsX46OPPoKDgwNee+01jB07FkOHDkV
4eDjeeOMNCIKAuXPn6pWxJnX2/Pnz8PDwwEMPPYT//ve/
+PLLL9G0aVM8+uijlQaQzMxMNG3aFN7e3vj8888hl8vRvXt3ODo6YufOneJ1us/
Yo0cP9OzZE2FhYQgNDYWnpyf69Omj9x5r1qwR68jixYsxdepUNGzYEP7+/nq/
76pS74jINAYQIiu4desWBEEw+x8s3bfSEyZM0Dv/73//G4Ig6PU26L5l3bNnj8HrCIIAR0dHXLx4Ue/
8kSNHIAgCfvjhB73ze/
bsMThfPoCoVCqDIR03b95E06ZNMX78ePFcRUOwygeQ6nzew4cPi+du3LgBNzc3fPrppwbvVd3Pbe77VDQEy
9TPJiUlBU5OTvj666/1zsfExMDZ2dngfHk+Pj6YNGlShdeUDyA7duwwaLCq1Wo8/fTTRgOIIAj4z3/+o/
eauoZdWeWHlJWUlKBr1654+umn9c5XJYDIZDLcuHFD77FNmzbB0dERR44c0Tu/
YsUKvZ7F+Ph4ODo64qWXXoJarda7tuw8p5oEkKrUo6oOwdL1mpW1cOFCCIKgFzBLSkrQr18/
NGjQAPn5+QAqvn+6xnnXrl31gvb//d//wcHBAUOHDtW7vl+/
fnr1p6Z19sUXX4S7uztSU1PFc7GxsXBycqp0QYqpU6dCEAS9n/
3t27fRtm1btGnTRvw56z5jp06d9H5HLVq0CIIgICYmBoD23jVp0gQBAQF6161atcqgl8rcekdEFWMAIbKCt
LQ0CIKA119/3azr582bB0EQEBsbq3c+IyMDgiDoNYD9/PzQtm1bo68jCAKeeuopg/
MfffQRfHx8cOPGDWRlZekdDRo00AsCFY2JVqvVyMnJQVZWFoYNG4aAgADxsaoEkKp+3s6dOxu85qOPPoqXX
nrJaDmr87nNfZ/KAoixn41cLoeDgwPi4+MNytGpUycMHjy4ws/
h5+eHXr164dq1ayavKR9A3n33Xbi4uODOnTt61+mCibEAUr4R+9FHH6FRo0Ym3zM3NxdZWVmYOHEiGjZsaF
BmcwPI22+/
bfDYiBEj0KVLF4P7FRcXB0EQ8NVXXwHQDgkTBEHsjTOlJgGkKvWoNgLIc889h2bNmhkEqi1btkAQBPz++
+8AKr5/usb5t99+q3deF27KD5ubOnUqHB0dUVpaCqBmdValUsHDwwOvvfaawWPPP/
98pQGkffv2Bj0YAPDf//5XL1iY+oynT5+GIAj49ddfAQDHjh2DIAhYsWKF3nUlJSXw8fHR+3mZW+
+IqGIMIERWUNUekH/9619wdHTU+6ZSp2HDhhg9erT4Zz8/
P4Nvm3UEQdDrldAZOnSo0fHmumPEiBHitcYCyPr169GtWze4uLjoPa9sY7sqAaSqn3fIkCEG1wUGBuLJJ58
0eh+q87nNfZ/
KAoixn83EiRMrLMejjz5a4efYtm0b3N3d4ejoiN69eyMkJASJiYl615QPIM899xweeughg9c6d+6cySFY5R
kbOvf777+jb9++cHNz0/
sMDg4OBvfC3ABSvucFADp16lThPfvoo48AaOdaOTo6VjrxuiYBpCr1qDYCSIcOHTBo0CCDa3U9h0uXLgVQ8
f3TNc63bt2qd143jykqKkrvvO5nnZ2dDaBmdVb3RcLs2bMNHvv4448rDSBubm544403DM7/8ssvEIT7w/
1MfUbdfdHNmdEFtwMHDhi8Zo8ePfR+XubWOyKqGAMIkZW0aNEC7dq1M+taXYNc9+1jWcYa5KZWzREEwehQn
aCgIDRp0gT79u0zepw9e1a8tnwA2bRpEwRBOzdj48aN2LNnD/
bt24enn35ar8FbnQBSk89rzuo1Vfnc5r5PZQHE2Gv861//goODg3jvyh///
PNPhZ8DANLT0xEeHo6RI0fC09MT7u7uiIiIEB+vaQDx8vIyuLb8z+3w4cNwcHBAYGAgvv/
+e0RERGDfvn0YO3asQaOyqpPQy+vQoQO6detm8md3+fJlADUPIK1ataq0nFWpR9YIIMbun65xXr6nQxdATp
48qXde97POysoCULM6W9cBpPxn1N0XXR2vSgAxt94RUcUYQIis5L333oMgCDh27Fil15oakpSZmWl0SFJVA
8gHH3wAJycns5aELd/gHjlyJPz9/Q32Denfv79egzc7O7vGQ7Cq8nnNCSBV+dzmvs/27durHEC+/
fZbCIIApVJZaTnMcf36dbRs2VJv/4iaDsEyJ4BMmTIFHh4eBqsBWSKAPP/882jZsqXJ/
Wp0zB2C1ahRI4NdxouLi+Hk5FRpOatSj7p27WqxIVhbt241OgTLEgGkJnXWUkOwvvnmG6NDsCoLIBUNwWrY
sKHez8vcekdEFWMAIbKShIQEeHl5oXPnzuIqSeUf100Q1n2z+d577+ldM336dAiC4aTsqgaQgwcPQhAEfPb
ZZwaPlZaW6q1oU77B/fLLL8Pf31+vMRQVFQUHBwe9Bm9hYSEEQTBo5AGmJ6HX5POaE0Cq8rnNfZ/
du3dDEARxeeOyTL1GQkICnJycMHbsWIOGjUajEYe9GKNSqZCXl2dwvnfv3ujVq5f45/
IBRBeUzJ2Ebk4A+eSTT+Dp6akXapKTk+Hp6VnrAWT9+vUQBAErV640eKywsBAFBQUAzJ+E3qtXL/
To0UPv8SVLlkAQhErLWZV61LdvX3Tv3r3C1yuroknoP/74o977DBgwwOgkdEsEkJrUWaB2JqGX/
fKmoKAA/v7+RiehVxZASkpK0LhxY7MmoZtb74ioYgwgRFb066+/
iuvnT5kyBatXr0Z4eDjGjRsHV1dXvQa4biLwq6+
+ivDwcPHPxpalrWoAAbRDKgRBwNChQxEWFoalS5diypQpaNGihd4/4OUb3GvXrhXHua9cuRIzZ85Ew4YN0a
VLF70GLwB07twZzZo1Q3h4OLZs2SJ+U1nRMrzV/bzmbiBm7uc2930yMjLg5OSExx9/HOvXr8eWLVtw/
fr1Cl8DuD+Btn///
vj222+xfPlyTJ8+HY888ojRBqTOzZs34eXlheDgYMjlcqxatQqvvvoqBEHAggULxOvKBxCVSoU+ffroLcP7
3HPPISAgQG98vO655gSQAwcOQBAEDBo0CMuXL8fcuXPRpEkTk0ur1iSAqNVqPP/88+KysUuWLMHChQvx/
vvv44EHHtBrQM+ePVu8t//73/+wZMkSvPnmm5g5c6Z4jW4Vo5dffhnLly/H+++/
j7Zt28LX19esZXjNrUcffPABHBwc8OWXX2LLli1Gh/2Uv0/
l64xuGV5XV1d8+umnWLJkCQIDAw0CpSUDCFD9Ogtoh/
q5u7vjoYcewjfffIOvvvrK5DK85emW4fXx8cHs2bMRFhaGgIAAODg4GF2Gt7IAAmj3ABEEAQMGDMDixYvx8
ccfm1yG19x6R0SmMYAQWVlcXBzeffddtGnTBq6urvD29saAAQOwZMkSvaEspaWlmDt3Ltq2bQsXFxe0bt26
wo35jKkogADab/x69uwJDw8PeHt7o1u3bpg+fbreTu3lG9wajQbz5s2Dn58f3Nzc0KNHD/
zxxx9GN747duwYevbsCVdXV73hWKY2IqzJ563KDsbmfO6qvM/
q1avh7+8vfptbfiNCU3bs2IGBAwfCy8sLXl5e6NixIyZNmlThMJfi4mJMmzYN3bt3h7e3N7y8vNC9e3eD/
TmM/TyysrIwduxYcSPCt956C0ePHjWYuGtuAAGA77//
Ho888gjc3NzQsWNHrFu3zuTmcjUJIID2m+v58+ejS5cucHNzQ6NGjdCzZ0/
MnTsXt27d0rt27dq16NGjhzhZODAwEPv27RMfV6vVmDFjBnx9feHp6YmgoCAkJCSYVU4dc+pRZmYmhg0bBm
9vb4Nv140xVWeuX7+Ot99+G76+vnB1dUW3bt30GtSA5QMIUL06q3Po0CHx90FFGxEao9uIsGHDhnB3d0efP
n1MbkRoTgABgGXLlqFt27Zwc3NDr169TG5EWJV6R0TGMYAQEZFo165dEAQBf//
9t7WLYhHJycl4+OGHK52UTkRElsMAQkRUT5WfNK1SqfD0009DJpOZNaHaVgUEBFQ69ImIiCyHAYSIqJ5655
13MHbsWCxZsgT/+9//0L9/fwiCgHnz5lm7aBYREhKCJUuWwMvLS9yEjoiI6h4DCBFRPfXDDz/
gscceg0wmg6urKzp37owlS5ZYu1gWoxvfP2TIEIO5REREVHcYQIiIiIiIqM4wgBARERERUZ1hACEiIiIioj
rDACIharUaaWlpyMvLw61bt3jw4MGDBw8ePHhI7MjLy0NaWhrUarW1m442iwFEQtLS0sRNsnjw4MGDBw8eP
HhI90hLS7N209FmMYAYMW/ePPTq1QsNGjRA48aNMXLkSFy+fLnS5/3000/o0KED3Nzc0LVrV/
z5559Vet+8vDyxQls73fPgwYMHDx48ePAwPHRfGOfl5VW3qVnvMYAYERQUhHXr1uHChQs4e/Ysnn/
+eTz00EMoKCgw+ZyjR4/CyckJ3377LWJjY/HFF1/AxcUFMTExZr/
vrVu3IAgCbt26VRsfg4iIiIhqGdtrNccAYoYbN25AEAQcOnTI5DWvvvoqhg0bpneub9+++Ne//
mX2+7BCExEREUkb22s1xwBihvj4eAiCUGFvRuvWrREWFqZ3bs6cOXj00UfNfh9WaCIiIiJpY3ut5hhAKqFW
qzFs2DAMGDCgwutcXFzw448/6p0LDw9HkyZNTD6nqKjI6JhCVmgiIiIiaWIAqTkGkEq8//778PPzq3Slg+o
EkJCQEKOrKrBCExGR1KhUKty9e5cHD7s/
VCpVhX8XGEBqjgGkApMmTUKrVq2QlJRU6bXVGYLFHhAiIpI6jUaD9PR0xMbG8uBRb4709HRoNBqjfycYQGq
OAcQIjUaDSZMmoUWLFoiLizPrOa+++ipeeOEFvXP9+vXjJHQiIrJpuvCRnZ2NwsJCq387zYOHJY/
CwkJkZ2eLIcQYttdqjgHEiIkTJ8LHxwcHDx5ERkaGeBQWForXvPHGG5g5c6b456NHj8LZ2Rn/+9//
cOnSJYSEhHAZXiIismkqlUoMH0T1iS6EGBuOxfZazTGAGGFqx8t169aJ1wQGBiI4OFjveT/
99BPat28PV1dXdOnSpcobEbJCExGRlNy9exexsbF6X8AR1QeFhYWIjY3F3bt3DR5je63mGEAkhBWaiIikRB
dAjDXCiOxZRXWf7bWaYwCREFZoIqoqpRKIiADMnK5GVCUMINWXm5uL0NBQk/
MISNoYQCyLAURCWKGJyFw5OUBQECAI94+gICA319olI3vCAFI9Go0Gw4cPx4wZM/TOh4SEoHv37jV+/
dp6HTKNAcSyGEAkhBWaiMwVFAQ4OekHECcn7Xmi2mLrASQjIwMffvgh2rZtC1dXV7Rq1QovvPAC9u/
fb9H3nT9/
PsaNG2ewjGt1goMgCNi1a5feudu3b3NhAAtjALEsBhAJYYUmInMoldrA4eCsgmena3Brna0XRDgci2qLLQe
Q5ORktGjRAp07d8b27duhVCpx4cIFLFiwAB06dKjWaxYXF1fpfHm1FUDI8hhALIsBREJYoYnIHBER2vDRIC
AFPgOU8BmghINLqRhAIiKsXUKyF7YcQIYOHYqWLVuioKDA4LGbN28CAFJTUzFixAh4eXnB29sbr7zyCjIzM
8XrdIFh9erVaNOmDRwcHABoV8KcNGkSpkyZggcffBBPPvmk+LrvvPMOfH194e3tjaeeegpnz541eD2dEydO
YPDgwXjwwQchk8nwxBNPIDo6Wnzcz89PbzVOPz8/
o6+jVqsxd+5ctGzZEq6urujevTt2794tPp6cnAxBELBjxw48+eST8PDwwKOPPopjx47V5BbbNQYQy2IAkRB
WaCIyR8xF/
fDhM0AJ12Y32QNCta58I0yj0aC4VG2Vw9Su1Mbk5OTAwcEB8+bNM3mNWq1GQEAABg4ciFOnTiEqKgo9e/
ZEYGCgeE1ISAi8vLwwZMgQnD59GufOnQOgDSANGjTAtGnTcPnyZVy+fBkAMHjwYAwfPhwnT55EXFwcPv30U
zz44IPIyckRX69scDhw4AA2bdqES5cuITY2Fu+88w6aNm2K/
Px8AMCNGzfEbQAyMjJw48YNo68jl8shk8mwZcsWXL58GdOnT4eLi4u4mbIugHTs2BF//
PEHlEolRo8eDT8/P5SWlpp9X+sTBhDLYgCREFZoIjLHP4nZeCxYCZ+
+CfBolwmfAUp4db3COSBU68o3wopL1ZArlFY5ikvVZpf7+PHjEAQBO3fuNHmNQqGAk5MTrly5Ip67ePEiBE
HAiRMnAEDcVFjX8NcJDAxEjx499M4dOXIEMpkMRUVFeufbtWuHlStXiq9X0RAstVoNb29v/
P777+I5Y0Owyr9OixYt8PXXX+td07t3b3zwwQcA7geQNWvWGHzWS5cumSxPfcYAYlkMIBLCCk1ElVGpNVh5
KAHzflPiyZH5cHArEXtBnh1aylWwqFbZagCJioqqNIAsWrQIbdq0MTjfsGFDbNiwAYC2of/
www8bXBMYGIgJEybonVu6dCkcHR3h5eWldzg6OmL69Oni65UNDpmZmZgwYQIefvhhyGQyeHl5wcHBAeHh4e
I1lQUQXdvh4MGDetdMnToVTz31FID7AUQXrADtMsGCIODQoUMm71F9xgBiWQwgEsIKTUSVuZRxC3KFEqsOJ
UKl1iAuDpj1fSq+2KrE2Ss3rV08sjP2PATL3ABirMciMDAQU6ZM0Tv3zTffoGXLloiPjzc4srKyjL5eUFAQ
evXqhT///BMXLlxAfHw8fH19ERYWJl5TmwHkzJkz4uM3b96EIAiIjIw0eY/
qMwYQy2IAkRBWaCKqzJbjqZArlIhKvL8E56mUHMgVSvx08koFzySqOluehD5kyJAKJ6FXNATr5MmTAKoWQH
Svl5ycbLJM5V+vQYMG2Lhxo/jnK1euQBAEvQDi4uKC7du3V/
g6poZgTZo0CQADSHUwgFgWA4iEsEITUUXS8wohVyixaH8c7hTfnziaV1gCuUKJsH1KFBRxQinVHlsOIImJi
WjWrJm4DG9cXBxiY2OxaNEidOzYERqNBgEBARg0aBCio6Nx/
Phxo5PQzQ0gGo0GAwcORPfu3bF3714kJyfj6NGjmDVrlslA06NHDzz77LOIjY1FVFQUBg0aBA8PD70A8sgj
j2DixInIyMhA7r0xluVfJywsDDKZDFu3bsXly5cxY8YMo5PQGUDMxwBiWQwgEsIKTUQV2R2TDrlCid0xGQa
P6XpGznAYFtUiWw4gAJCeno5JkybBz88Prq6uaNmyJUaMGCE2us1dhrc8YwEEAPLz8z
F58mS0aNECLi4uaN26NcaNGyf2spR/vdOnT6NXr15wd3fHI488gp9//hl+fn56AeS3337Dww8/
DGdn5wqX4Q0NDUXLli3h4uJichleBhDzMYBYFgOIhLBCE5Ept4tKsWh/
HOQKJTJvGf6DeColl8OwqNbZegAhqi4GEMtiAJEQVmgiMuVYQjbkCiW2nkg1+vitu/
eHYd3mMCyqJQwgVF8xgFgWA4iEsEITkTGlKjVWHkqAXKHE5Yx8k9dxGBbVNgYQqq8YQCyLAURCWKGJyJjYd
P2ld03RDcPaxmFYVEsYQKi+YgCxLAYQCWGFJqLyNBoNfogyXHrXGA7DotrGAEL1FQOIZTGASAgrNBGVp1t6
d3G5pXdN4TAsqk0MIFRfMYBYFgOIhLBCE1F5Eee1S+/
uuWC49K4xHIZFtYkBhOorBhDLYgCREFZoIirrdlEpFu7TLr173cjSu8aUHYaVW1Bs4RKSvWMAofqKAcSyGE
AkhBWaiMo6mpCl7c04UbXejF/
OXIVcocT+2MzKLyaqAAOIZeTm5iI0NBTp6enWLgqZwABiWQwgEsIKTUQ6pSo1VhzULr2rzDS99K4xabl3qj
RvhMgUBpDap9FoMHz4cMyYMcPaRZG8yMhICIKAmzfrfk4bA4hlMYBICCs0EelcvKZdenf14YqX3jVGo9Hgx
3uT0Y8mZFmohFQf2GoACQ4OhiAIEAQBzs7OaNKkCQYPHozvv/
8earXaqmWbP38+xo0bB42man+vqyokJATdu3e36HtYWnFxMTIyMix+r4xhALEsBhAJYYUmIkB/
6d3jSTnVeg1lZj7kCiWWH0xAicq6DS6yXbUWQDIzgchIYPdu7X8zLTs8MDg4GEOGDEFGRgauXr2K6OhofP3
112jQoAGGDh2K0lL77xk0N4CUlJTUQWlsDwOIZTGASAgrNBEBwLWb95feLSxWVes11GoNvj+SxCV5qUZqHE
BycoCVK4EJE4CXXwZGjdL+d8IE7fmc6gXsygQHB2PkyJEG5w8cODxKUo4AACAASURBVABBELB69WrxXGpqK
kaMGAEvLy94e3vjlVdeQWaZgKRryG/
cuBF+fn6QyWQYM2YM8vPvD40MDAzE5MmTMW3aNDRq1AhNmzZFSEiI3nvfvHkT77zzDnx9feHt7Y2nnnoKZ8
+e1bvml19+QY8ePeDm5oa2bdsiNDRUDEsajQYhISFo3bo1XF1d0bx5c0yePNno51+3bp3YA6Q71q1bBwAQB
AHLli3D8OHD4enpiZCQEKhUKowfPx5t2rSBu7s72rdvj4ULFxq9p9999x2aNWuGBx54AB988IFegAkPD8fD
Dz8MNzc3NGnSBKNGjdK7Rx9+
+CGmTJmChg0bokmTJli1ahUKCgrw1ltvoUGDBmjXrh0iIiLE55QfgpWSkoIXXngBDRs2hKenJzp37ow///
xTvD4mJgZDhgyBl5cXmjRpgtdffx1ZWfd7gX/++Wd07doV7u7ueOCBB/
DMM8+goKDA6D1kALEsBhAJYYUmIgD4897Su3vNXHrXlDNXbkKuUOL7I0lQV3EYFxFQwwCSkwPMmQO8+CIwc
SIwezYQEqL978SJ2vNz5lgkhJgKIADQvXt3DB06FACgVqsREBCAgQMH4tSpU4iKikLPnj0RGBgoXh8SEoIG
DRrg5ZdfRkxMDA4fPoxmzZph1qxZ4jWBgYGQyWQIDQ1FXFwcNmzYAAcHBygUCvGawYMHY/
jw4Th58iTi4uLw6aef4sEHH0TOvc9/+PBhyGQyrF+/
HomJiVAoFGjTpg1CQ0MBaBvPMpkMERERSE1NxfHjx7Fq1Sqjn7GwsBCffvopunTpgoyMDGRkZKCwsBCANoA
0adIEa9euRWJiIlJTU1FSUoI5c+bg5MmTSEpKwubNm+Hp6Ylt27bp3VOZTIb3338fly5dwu+//
w5PT0+xDCdPnoSTkxN+/
PFHpKSk4PTp01i0aJHePfL29saXX36JuLg4fPnll3BycsLQoUOxatUqxMXFYeLEiXjwwQdx584dAIYBZNiw
YXj22Wdx/
vx5JCYm4vfff8ehQ4cAaANe48aN8dlnn+HSpUs4ffo0nn32WTz11FMAgPT0dDg7O0MulyM5ORnnz59HeHg4
bt++bfQeMoBYFgOIhLBCE1H+3ZL7S+/m12zYS3GpGssitRPZ46o4kZ0IqGEAWblSGzJmzdIGj/
LHrFnax1eurNUyAxUHkDFjxqBTp04AAIVCAScnJ1y5cn+luYsXL0IQBJw4cQKANoB4enrq9XhMmzYNffv2F
f8cGBiIgQMH6r1P7969xYnmR44cgUwmQ1FRkd417dq1w8p7n/
+ZZ57BvHnz9B7ftGkTmjdvDgBYsGAB2rdvb/aQKVNDsARBwNSpUyt9/qRJk/
R6MIKDg+Hn5weV6n6v7CuvvIIxY8YAAHbs2AGZTKZ3n8oqf49UKhW8vLzwxhtviOcyMjIgCAL+
+ecfAIYBpFu3bmIgK+/LL7/
Ec889p3cuLS0NgiBAqVQiOjoagiAgJSWl0s8OMIBYGgOIhLBCE9HR+Kxa3UhQt5Tvj8dTrTKRk2xbtQNIZq
Z2mNXEicbDh+6YOFF7XS3PCakogLz66qvo3LkzAGDRokVo06aNwTUNGzbEhg0bAGgb8rrrdeRyOdq2bSv+O
TAwEB988IHeNSNGjMDbb78NAFi6dCkcHR3h5eWldzg6OmL69OkAAF9fX7i7u+s97u7uDkEQcOfOHVy5cgWt
W7dGq1atMGHCBOzcubPCuSwVBZDNmzcbnF+6dCkee+wx+Pr6wsvLCy4uLujdu7f4eHBwMJ5//
nm953z00UdiD0N+fj66desGX19fvP7669i8ebPYk2HqHj300EP49ttvxT9rNBoIgoBff/
0VgGEAWb16NZydndG/f3/
MmTMH586dE587evRouLi4GNxjQRAQEREBlUqFZ555Bt7e3hg9ejRWrVqF3Nxck/
ePAcSyGEAkhBWaqH4rVamx/
GDt9ljcKS7F4v3aHpW03DuVP4GojGoHkMhI7VwP3bArU8fs2drrDh6s1XJXFEC6deuGYcOGATA/
gJRvyIeFhcHPz0/8c2BgIKZMmaJ3zciRIxEcHAwA+Oabb9CyZUvEx8cbHLo5Cu7u7pg/
f77Ra3QrdxUWFuK3337D5MmT0axZM/
Tr189kj0hFAWTXrl1657Zs2QJ3d3eEh4fj9OnTiI+Px3vvvaf3fGP3dMqUKXrD1UpLS7Fv3z5MmzYN/
v7+ePjhh8XwYOwe+fn5ISwszGT5jC3De+XKFSxfvhwvvfQSXFxcsHjxYgDAkCFD8PLLLxu9f7p5HhqNBn//
/TfmzJmDbt26oXHjxkhKSjJ6/
xhALIsBREJYoYnqtwvX8sSld2tzzsa+i5mQK5T45czVWntNqh+qHUB279ZOOK8ofOiO0aO119eiyiahr127
FkDFQ7BOnjwJoHYCiO59kpOTTZa5f//+GD9+vNmf8fLlyxAEAdHR0UYf//
rrr9G1a1eD88YCyIcffoinn35a79wzzzxT5QBSVkFBAZydnbFjxw4AtRdAypo5cya6desGAJg1axY6dOhg9
gpnKpUKLVu2xIIFC4w+zgBiWQwgEsIKTVR/
aTQabI5KgVyhxInk2p2Um1tQjLB9SsgVSuQUFNfqa5N9s+UeEFPL8L7wwgviPAaNRoOAgAAMGjQI0dHROH7
8uNFJ6DUNIBqNBgMHDkT37t2xd+9eJCcn4+jRo5g1a5YYdPbs2QNnZ2eEhobiwoULiI2NxZYtW/
D5558D0K5stWbNGsTExCAxMRFffPEFPDw8kJ2dbfQe/PDDD/
Dy8sKZM2eQlZUlzj8xFkAWLVoEmUyGPXv2QKlU4osvvoBMJqtSAPn999+xaNEinDlzBikpKVi2bBkcHR1x4
cIFk/
eoqgFkypQp2LNnD5KSkhAdHY2+ffvi1VdfBQBcu3YNjRs3xujRo3HixAkkJCRgz549eOutt6BSqRAVFYWvv
/
4aJ0+eRGpqKn766Se4urrqrbpVFgOIZTGASAgrNFH9dbUWlt6tyK9nr0GuUEJx0bL7L5B9qbM5INev12q5y
29E2LhxYwwePBhr16412IjQ3GV4y6pqAAG0cyQmT56MFi1awMXFBa1bt8a4ceP0el/27NmD/
v37w8PDAzKZDH369BFXmdq1axf69u0LmUwGLy8vPP7449i/f7/
Je1BUVIRRo0ahYcOGBsvwlg8gRUVFeOutt+Dj44OGDRti4sSJmDlzZpUCyJEjRxAYGIhGjRrBw8MDjz76qN
4qWrURQD788EO0a9cObm5uaNy4Md544w29ABYXF4eXXnoJDRs2hIeHBzp27IipU6dCo9EgNjYWQUFBaNy4M
dzc3NC+fXssWbLE5P1jALEsBhAJYYUmqr/
+OJdu0YCgCziL9sehoMj+N2Gj2mGrq2AR1RQDiGUxgEgIKzRR/XSrzNK7N/KLKn9CNW09od1d/
Wh8VuUXE8F29wEhqikGEMtiAJEQVmii+unve0vv/lRLS+
+aEn89H3KFEssiE1Bcqq78CVTv1fpO6KNH18lO6EQ1xQBiWQwgEsIKTVT/
lJRZejf+umU3C1SrNVj7dxLkCiVOp5pe/54qplQCERFAXJy1S2J5NQ4gOpmZ2onmu3dr/
1vLcz6IahsDiGUxgJhw6NAhvPDCC2jevLnRCVvl6SZKlT8yMjLMfk9WaKL6J+aqdundNUeSanXpXVPOpd2s
0/ezJzk5QFAQIAj3j6AgoIK9zGxerQUQIhvDAGJZDCAmRERE4PPPP8fOnTurFECUSiUyMjLEo/
xqGxVhhSaqXzQaDTb9o11692QtL71rStkel8sZlu1xsTdBQYCTk34AcXLSnrdXDCBUXzGAWBYDiBmqEkBMb
ZZjDlZoovrl4rVbkCuUWHIgDndLan/pXVOOJWRDrlDih6hUaDTsBTGHUnk/
dLg0vgXPDukQnFTiOXsdjsUAQvUVA4hlMYCYoSoBxM/PD82aNcPgwYPx999/V/
icoqIi3Lp1SzzS0tJYoYnqiezbRVhyQLvy1T+JxjcSs5TCYhUW79e+95WcO3X63rYqIkIXQDSQ9UmAzwAl3
FrmiAHExF5mNo8BhOorBhDLYgAxgzkB5PLly1ixYgVOnTqFo0eP4u2334azszOio6NNPickJMTovBFWaCL7
VlyqxoZjyZArlNh+Ks0qczEOXMqEXKHErtNX6/
y9bZGuB8TJuxA+A5TwGaBEgx7JEAQNe0CI7BADiGUxgJjBnABizBNPPIHXX3/d5OPsASGqn/
ZcyIBcocTKQwlW2xTw5p1ihO1TQq5QIuu25fYesSdBQYBn2ywxgPgMUMLVp5BzQKjKcnNzERoaivT0dGsXR
c+6desQYeXuvOTkZHz55Ze4ffu2VcvBAGJZDCBmqG4A+fe//43HH3/c7OtZoYns34Vr2lWvwvZZf/
jT7+euQa5QYu8F81frq89yc4E+Y5PhM0ApDsMa8EomV8GiKtFoNBg+fDhmzJhR5+8dEhKC7t27G31s+/
bt6NSpE3LroEKbalcVFRWhV69eWL58ucXLUBkGEMtiADFDdQPI4MGD8dJLL5l9PSs0kX2z5rwPY9LzCiFXK
LFofxxuW6knxpbk3SmBXKHE7G1xWPNzPr7YqkR4ZDxKVfa7qaOtBpDg4GBxWLOzszOaNGmCwYMH4/vvv6/
S6pSWMH/+fIwbN84qC0CYCiDx8fHo2LEjUlJS6qQcptpVEydOxKxZs+qkDJVhALEsBhATbt+
+jTNnzuDMmTMQBAFyuRxnzpxBamoqAGDmzJl44403xOvDwsLwyy+/ID4+HjExMZgyZQocHR2xf/
9+s9+TFZrIvul6HKw178OYbSeuQK5Q4khclrWLInmnU3PFHes1Gg1WH060+
+WMbTmADBkyBBkZGbh69Sqio6Px9ddfo0GDBhg6dChKS+tn4K6oB6QuVfeL3brEAGJZDCAmmNpYMDg4GID2
l1tgYKB4/fz589GuXTu4u7vjgQcewJNPPom//vqrSu/JCk1kvwqLVVh0b+Wp6/
nSacwl3LgNuUL7TX5Rad0tBWyLtp9Kg1yhxKkU7Z4tR+OzIFcosfN0mpVLZjm2HEBGjhxpcP7AgQMQBAGrV
68Wz6WmpmLEiBHw8vKCt7c3XnnlFWRmZoqP6xrtGzduhJ+fH2QyGcaMGYP8/
PvBMzAwEJMnT8a0adPQqFEjNG3aFCEhIXrvffPmTbzzzjvw9fWFt7c3nnrqKZw9e1bvml9+
+QU9evSAm5sb2rZti9DQUDEsaTQahISEoHXr1nB1dUXz5s0xefLkCu/Df//
7XzRp0gQNGjTA+PHjMWPGDIMAsnr1anTs2BFubm7o0KEDwsPD9R5PS0vDa6+9hkaNGsHT0xM9e/
ZEVFSU+PiyZcvg7+8PFxcXtG/
fHhs3btR7flxcHAYNGgQ3Nzd06tQJCoXCIIBcuXIFr7zyCnx8fNCoUSOMGDECycnJZpezuLgYkyZNQrNmze
Dm5oaHHnoI8+bNq/DeVIYBxLIYQCSEFZrIfp25ot2BfNM/
dTPEwVwajQbrjybfa1jb8WSGGipVqcUAmVNQDEA7kV83nyf/
bomVS2gZtRlAlErtcsV1sWKYqQACAN27d8fQoUMBAGq1GgEBARg4cCBOnTqFqKgo9OzZU+8LxpCQEDRo0AA
vv/
wyYmJicPjwYTRr1kxvqFBgYCBkMhlCQ0MRFxeHDRs2wMHBAQqFQrxm8ODBGD58OE6ePIm4uDh8+umnePDBB
5GTow20hw8fhkwmw/
r165GYmAiFQoE2bdogNDQUAPDzzz9DJpMhIiICqampOH78OFatWmXyHmzbtg1ubm5Ys2YNLl++jM8//
xze3t56AWTz5s1o3rw5duzYgaSkJOzYsQMPPPAA1q9fD0A7GsTf3x+DBg3CkSNHEB8fj23btuHYsWMAgJ07
d8LFxQXh4eFQKpVYsGABnJycxC9g1Wo1unbtimeeeQZnz57FoUOH0KNHD70AUlJSgk6dOmH8+PE4f/
48YmNjMXbsWHTo0AHFxcVmlfO7775D69atcfjwYaSkpODIkSP48ccfK6smFWIAsSwGEAlhhSayXz9EpUKuU
OJ0qvQa+efTtBPjVx9OhEoiQ8Ok5tpN7XyZFQcT9Mbu64awnaijnezrWm0EkJwc7QpiZXeQDwqCRSfvVxRA
xowZg06dOgEAFAoFnJyccOXKFfHxixcvQhAEnDhxAoA2gHh6eur1eEybNg19+/YV/xwYGIiBAwfqvU/
v3r3FieZHjhyBTCZDUZH+inPt2rXDypUrAQDPPPOMwbf2mzZtQvPmzQEACxYsQPv27VFSYl7Y7devHz744A
O9c3379tULIO3atTNoqH/55Zfo168fAGDlypXw9vYWQ1J5/
fv3x7vvvqt37pVXXsHzzz8PANi7dy+cnZ1x7do18fHdu3frBZBNmzahQ4cOen+viouL4eHhgb1795pVzsmT
J+Ppp5+u1Xk1DCCWxQAiIazQRPbpRn6RONm7sFh6w5xKVWqsOJgAuUKJSxn8/
WNM9L35H7+c0d83JeaqNrytP5psl7vK10YACQoCnJz0A4iTEyy6fHFFAeTVV19F586dAQCLFi1CmzZtDK5p
2LAhNmzYAEAbQHTX68jlcrRt21b8c2BgoEFjf8SIEXj77bcBAEuXLoWjoyO8vLz0DkdHR0yfPh0A4OvrC3d
3d73H3d3dIQgC7ty5gytXrqB169Zo1aoVJkyYgJ07d1Y4l6XsZ9CZOnWqGEAKCgogCAI8PDz03tPNzQ1Nmj
QBoJ0U/sQTT5h8j0aNGom9EDoLFy4U703Z/9fJy8vTCyD//ve/
4eTkZHBvHBwcsGzZMrPKGR0djQceeACPPPIIJk+eLAaXmmAAsSwGEAlhhSayT4eUNyBXKPHb2WuVX2wlUYn
Z4hAxe2xI19Sf59MhVygRVW71sqJSlbiyWXpeoZVKZzk1DSC6DRxNHZYajlVRAOnWrRuGDRsGwPwAUn7eRF
hYGPz8/MQ/BwYGYsqUKXrXjBw5Upw3+s0336Bly5aIj483OLKytAtAuLu7Y/78+Uav0a3cVVhYiN9+
+w2TJ09Gs2bN0K9fP5M9IpUFkMzMTAiCgM2bNxu8X1JSEgDgk08+sXgAef/
999GnTx+jnzsvL8+scgLaNtTWrVsxYcIE+Pj4YNSoUSbLbQ4GEMtiAJEQVmgi+6NSa8TehYQb1t1YqyKFxf
cb0qnZ1t2fRIq+P5Jk8t7sjtFuLLnvYqaRZ9q2mgaQiIiKA4il9ryrbBL62rVrAVQ8BOvkyZMAaieA6N6n/
MTqsvr374/x48eb/RkvX74MQRAQHR1t9HFjQ7Aef/xxvc/SokUL/Oc//
zH5HuvXr4dMJqvyECxdwNMNwSq74eKePXv0AsiqVavQqFGjCts+lZWzPN17mCq3ORhALIsBREJYoYnsj26V
qRUHEyQ/
v+Kvy9ftflWn6rhTXCpONr9bYjiE7krOHcgVSiz9Kx4ldrYniC33gJhahveFF16ASqX9OWo0GgQEBGDQoEG
Ijo7G8ePHjU5Cr2kA0Wg0GDhwILp37469e/
ciOTkZR48exaxZs8Sgs2fPHjg7OyM0NBQXLlxAbGwstmzZgs8//xyAdpfyNWvWICYmBomJifjiiy/
g4eGB7Gzjewpt3boV7u7uWLt2LZRKJebMmWMwCX316tXw8PDAokWLoFQqcf78eaxduxYLFiwAoJ2L0b59ew
waNAh///
03EhMTsX37dnES+q5du+Di4oJly5YhLi5OnIQeGRkJQDsJvXPnznj22Wdx9uxZHD58GD179tQLIHfu3MEjj
zyCJ598EocPH0ZSUhIiIyMxefJkpKWlmVXOBQsW4Mcff8SlS5egVCrxzjvvoFmzZjXa84UBxLIYQCSEFZrI
/vx2Vrv3x0HlDWsXpVJ5d0oQtk8JuUKJG/
lFlT+hnki8FyI3HEs2+rhGo8Gaez0k9jaHxpbngJTdiLBx48YYPHgw1q5da9AoNXcZ3rKqGkAAID8/
H5MnT0aLFi3g4uKC1q1bY9y4cXq9L3v27EH//v3h4eEBmUyGPn36iCtd7dq1C3379oVMJoOXlxcef/
zxSvca+/rrr+Hr64sGDRogODgY06dPN/gsP/
zwAwICAuDq6opGjRrhiSeewM6dO8XHU1JSMGrUKMhkMnh6eqJXr144fvy4+Hhly/AqlUoMHDgQrq6uaN+
+vUEPCABkZGTgzTffhK+vL9zc3ODv7493331Xrz1UUTlXrVqFgIAAeHl5QSaT4ZlnnsHp06crvDeVYQCxLA
YQCWGFJrIvZff+sJUG/R/
ntHMddsdkWLsokqHb72PPBdP35GiC9pod0fbVe1QbASQ3t+5XwSKqKQYQy2IAkRBWaCL7ots5e3OUtPb+qE
hG3l3IFUos3Bdnt3tbVNWOaO0GhOfSbpq8puyeILfs6L7V5j4gcXF1tw8IUU0xgFgWA4iEsEIT2ZfNUSmS3
fujIj+d1O5tccgGho1ZmkajQXhkvHYH+1sVN8K33btvx5PsZ08QW90JnaimGEAsiwFEQlihiezH9fy7kt77
oyK6OQ9L/4o3Oum6Pskp0PZsLDkQV+kiAheuafcEWfd3kt0sZcwAQvUVA4hlMYBICCs0kf04eG/vj9/
PSXfvD1M0Gg02HEuGXKHEqRT7+Ta/OnShYtuJK5VeW1yqxtK/
tL0l127ax54gDCBUXzGAWBYDiISwQhPZh7J7fyRKeO+Piuh2+F59OFHyywdb0oFLmVVaxWzPBfvaE4QBhOo
rBhDLYgCREFZoIvsQf107hGnloQSobbTxXqpSY+UhbYi6eK3+/
k7SzeNRZuabdb297Qmia4QVFtpHjw6RuQoLCxlALIgBREJYoYnsw6/39v6w9Uncx5NyIFcosfGfFLuZ01AV
JSo1Fu7TLqOcV2jeylYajUbcNT023fZ/
l6tUKsTGxprc7I7IXmVnZyM2NlbctLIsttdqjgFEQlihiWzfneJSsdGadds29v4w5W6JSpzTkJxVY
O3i1LmrNwvFnqyqBLBjCdmQK5TYfso+9gRJT08XQ0hhYSHu3r3Lg4fdHoWFhWL4SE9PN/
p3gu21mmMAkRBWaCLbF31v748folKtXZRaEXn5ul01pqviVIr2Z/nLmatVel7enRK72hNEo9GIIYQHj/
pypKenm/zige21mmMAkRBWaCLbt+kf7ZyBM1dMb1pnS/
IKS8Qencr2wbA3ul3hq7Ovh24vlahE+xm6pFKprP7tNA8edXEYG3ZVFttrNccAIiGs0ES2rezeH/
a0f0bEeW1DfHeM8eEI9mrNvbkcqdl3qvzci9duQa5QYq0d7QlCRFpsr9UcA4iEsEIT2TbdcKU/ztlXQ/
36LW2wWrgvzi6GFJmjoKhUHEZVVFr1MFl2T5CrdrInCBFpsb1WcwwgEsIKTWS7VGoNlt/b+yPJDids/
3wqrUr7Ydi6hHu7wW84llzt19h7b08QhZ3sCUJEWmyv1RwDiISwQhPZrvjr+ZArlFh1KNFm9/6oSHJWgbi/
hT0NLzPl7/
gsyBVK7L2QUe3XSMu9vydIcant7wlCRFpsr9UcA4iEsEIT2a5fzlyFXKHE4Tj77CHQaDTYeCwZcoUSJ5KrP
inb1my/1+NzLq36iwmU3ROkPm/
mSGRv2F6rOQYQCWGFJrJNBUX39/7ItvG9Pypy4Vqe2MtTage7fJui0WjE+RvX82u28tc/
ido9QX6uh8sYE9krttdqjgFEQlihiWyTbr+IH4/bx94fpqjUGqw6lAi5QokL1/
KsXRyLyb5dBLlCiSUH4mo8nC6vULsnSFV2UyciaWN7reYYQCSEFZrI9mg0Gmy8t/
fHWTvZ+6MiJ5NzIFcosfFYst0uLxtzVdvTs+3klVp5Pd0E/n/
saE8QovqM7bWaYwCREFZoItujW6J2sZ3t/
WHK3RKVODzJHlf7AoD9sZmQK5Q4VEsrfun2BPn+CPcEIbIHbK/VHAOIhEitQiuVQEQEEBdn7ZIQSddf9/b+
+PO8fe39UZFDyht2Pa9Bt5t9XGZ+rbxe2T1B0nKrvqkhEUmL1NprtogBREKkUqFzcoCgIEAQ7h9BQUBurlW
LRSQ5pSo1lkVq9/5IttPeAGNu3S0RJ91n3qrZJG2pKVGpxc9Wm5suKi5m1nhZXyKSBqm012wZA4iESKVCBw
UBTk6A4KiGi28+HFxL4OSkPU9E99n73h8V2R2TDrlCiX12tsmebu+OVYcSa3W41NWbhdwThMhOSKW9ZssYQ
CREChVaqbzf6+HZ6Sp8Bijh1ipHPMfhWET36fb+OBKXZe2i1LnUbG1DfcXBBLsKX6dStJPsfz17rVZfV6PR
YO3f3BOEyB5Iob1m6xhAJEQKFToi4n4AcW2aB58BSjQISBHPRURYrWhEklJ274+cgmJrF6fOqdQahEdq5zV
cvVlo7eLUmt/PXbPYZotR9/
YE+amWVtciIuuQQnvN1jGASIgUKnTZHhAHZxV8+sfBZ4ASju7F7AEhKkP3TfkWO9/7oyK6YVi1tVqUFKw+r
N3n5EpO7U8Wv3W3BGH77u0Jcod7ghDZKim012wdA4iESKVCi3NABMCrcxp8Bijh4ZfNOSBE92g0Gmw8lgy5
Qolzafa/94cpcZnaOTBr/
7aP5WVvF5VCrlAibJ8SRaWWWVJ5+709QY4lcE8QIlsllfaaLWMAkRCpVOjc3PurYOmGYfUZm8JVsIjuyaxn
e3+YUlSqwuL92mFoWbeLrF2cGou/
flvcZNFSYtO5JwiRrZNKe82WMYBIiKQqdGYm4jZF4Ze5JzB7wV+Q74pGbj0c505VkJkJREYCu3dr/
5tpI6sjVaPcf13S7v0RYe29PyRwz3UT8aPsYJfvI3FZkCuUUFS0slcN73mJ6v6eIJYY5kVEliep9pqNYgAx
4dChQ3jhhRfQvHlzCIKAXbt2VfqcyMhI9OjRA66urmjXrh3WrVtXpfeURIXOyQFWrgQmTABe+7ST0QAAIAB
JREFUfhkYNQo7g6dBPvl/iFq4Tvs4UVlG6gxefln755UrpVtnqlnusnt/
pGRbae8PCd3zmKt5kCuU+CHK9ufC/HxveNT5tDzDB2vxnu+7tyfIHu4JQmSTJNFes3EMICZERETg888/
x86dO80KIElJSfD09MQnn3yC2NhYLFmyBE5OTtizZ4/Z72n1Cp2TA8yZA7z4IjBxIjB7NhASgpjP/
wv5VDk2vvWZ9nGpNiip7pmoM5g9W/
vnF1+UZp2pQbl18x5WH7bS3h8Su+d3ikvFidW1uXFfXdJoNLhwLU8cTnYjv9xwslq+59e4JwiRTbN6e80OM
ICYwZwAMn36dHTp0kXv3JgxYxBUhZnbVq/QK1dq/
yGdNUv7j+u94+6cUCz8fCXkM5cjZ9QY7XVEgMk6Ix6zZmkfl1qdqUG5dUOO/
o630t4fErzn205cgVyhxJkrtjchP/
9uCXad1v5M5Qoltp9KM5ybUcv3XKPRYN29PUEuXDPS20JEkmb19podYAAxgzkBZNCgQZgyZYreubVr10Imk
5n9Plat0JmZ2qEEEyca/Qd25xeLIZ+1ElEffq69zlbG95PlVFJnxGPiRGnVmRqU+3bR/W/
7rTInSqL3XLck8fZTaXXyfrVBo9Eg5mqeuJfJov1xOJGcY9irZaF7fjwph3uCENkoBpCaYwAxgzkB5JFHHs
G8efP0zv35558QBAGFhcY36SoqKsKtW7fEIy0tzXoVOjJSO55ZN7Sg3BEzez7ks1Zi46wl2usOHqz7MpK0V
FJnxGP2bGnVmRqU+2SyttG49YSV5jtI9J7fvFMMuUKJhftsY1WwW3dLsPN0mtjr8ePxVGSbWsXLQvc8n3uC
ENksBpCaYwAxg6UCSEhICARBMDisUqF379ZOqjTxj6s4DGvWSuS8Ok57PdVvldQZvWP0aOnUmWqWW6PRYMO
9vT+MTlKWcNnrgm5flIvXpPsPsq7XQ7cK1eL9cThprNejLAve8x3R2hB0NMFKw/
mIqFoYQGqOAcQMlhqCZUs9IOIwrM9WIGrsROl8m03WI9Fv4ytVzXJn5Gn3/
lhywIrf8kv4nh9N0C5h+9vZa3X2nlVx626J2ODX7WBvstejLAve80sZ2j1B1nBPECKbwgBScwwgZjB3EnrX
rl31zv3f//2f7UxCN2Occ8zs+drVsCZ9BVy/XvdlJGmp6th4qdSZapb7wCXt0qm7Y6y494eE7/n1W/
cDWolKWis7le/
1OJVSSa9HWRa85yUqtTgHhXuCENkOBpCaYwAx4fbt2zhz5gzOnDkDQRAgl8tx5swZpKZqx37PnDkTb7zxhn
i9bhneadOm4dKlSwgPD7e9ZXgrWenl7mdfYOE7cyH/74/
I4aaEBEhyRSazVLHcpWUaiqnZVm4oSvSeazQarD6cCLlCiYQbt+v0vSuSmn1H7PXYeiK1er+7LHjP98fqgi
33BCGyFVZvr9kBBhATIiMjjc7PCA4OBgAEBwcjMDDQ4DkBAQFwdXWFv7+/
7W1EaMZa97s+XwT5r2fxjx3seky1QGJ7UpitiuVWWnvvjxqUvS79dVm7Q/xeiWywp9FosPVEqlimav/
sLHjP0/MKxZ6jolLpT+AnIgm01+wAA4iESKJCl9/td/Rovd1+Y2K16/1v/
CfFemUkaamkzkgufOhUody6fSKOWmvvj/
Ikes+v5Gh7G5YfTLB+UAOQkl0gDru6XVRasxez0D3XaDRYf1Q7gT/
mKvcEIbIFkmiv2TgGEAmRVIXOzNROpty9W/vfe+Oa75aosOjebsFmTeCk+sNEnZG8Sspt9b0/
KiKxe65Sa7AsMgFyhRJpudYdqla29yPyci3eFwvc8xP3lnfexj1BiGyCpNprNooBREJspULrvg3mMCyqD8T
G4Qk2Ds3x5/
l0yBVKRFn590PZ3o+CmvZ+WFjZPUFu3pFYyCUiA7bSXpMyBhAJsZUKfeFannYY1rFkaxeFyKI4PKbqdLuiW
3M5Xo1Ggy3Htb0fB5U3rFaOqtBtjCiZYX5EZJKttNekjAFEQmylQnMYFtUXnCBcdbp5IN8fSbJaGZKzCsSf
m9R7P3QuZ9xf6IB7ghBJm62016SMAURCbKlCcxgW1Qf3l0i14t4fNuZuiUpc9tYaGzbaYu8HILGlnomoQrb
UXpMqBhAJsaUKzWFYZO+4SVz1rTmSZLX7Zou9HzqS2OySiCplS+01qWIAkRBbqtAchkX2jkNiqu+3s9cgVy
hxKiW3Tt/XVns/dDLy7u8mb43eIyIyjy2116SKAURCbK1C/
3JGOwzrWAKHYZF90Wg02HZSu+fN0QROCq6qfxKzrfJNvi33fgDaerfhGBc9IJI6W2uvSREDiITYWoXmMCyy
V0lZ95dwvXW3xNrFsTmJN25DrlBiQx3+bijb+3HIBns/
dE5y2WciybO19poUMYBIiK1VaA7DInukVmuw8Z8Um2/IWtPtolLIFUqE7VOiRKWuk/
dMsvHeDx1Jb3xJRABsr70mRQwgEmKLFZrDsMjeXLx2C3KFEuGR8RyHX00ajQYrDmp3RE/PK6yT9/vRDno/
dHSrDHJPECJpssX2mtQwgEiILVZoXWOtLodaEFlKqUotruB0IjnH2sWxabqN9c5euWnx9yrb+3Gn2HZ7P3S
UmfcXQFCruQACkdTYYntNahhAJMQWK3TZYVhZHIZFNi46NRdyhRKrDiXW2dAhe/
V3fBbkCiX2Xcy06PvYW+8HoA3CyyK1PUgp2QXWLg4RlWOL7TWpYQCREFut0ByGRbZOqQR+/
UOFL7drG33n07gCUU3F3fsW/
4eoVIu+j731fuj8dek65AolIs5zTxAiqbHV9pqUMIBIiK1WaA7DIluVkwMEBQGCALg/
lAWfAUr0GZeM7BwOe6mpm3eKIVcosWh/
HFQWGkZUtvfjcJx99H7oZN66K67ExrlIRNJiq+01KWEAkRBbrdAchkW2KigIcHICHFxKIesXB58BSrg1zkd
QkLVLZvs0Gg2W/qXdSf5GvmV+L+iW+7W33g9Ae/823tsTZPH+OCw5cP/
441w6hwgSWZGtttekhAFEQmy5QuuGYXHTNrIVSqW250MQAA//
TPgMUKLBo6kQBA0EAYiLs3YJbd9P9zZzvHCt9oe0aTQa/
BBln70fOjFXtXstGTt+PpXGEEJkJbbcXpMKBhAJseUKXXYYlkbD4SskfRER2vDh6F4Mn/
7a3g8n2R0xlEREWLuEti/ysnYew1+Xr9f6a9tz70dZBUWlyCssEY/
krAKxZ4khhMg6bLm9JhUMIBJiyxWaw7DI1uh6QDw7pMNngBJena+K4YM9ILVD98XEtpO1u6t3fej9qMi1m4
UMIURWZMvtNalgAJEQW6/QHIZFtubpYXfRaJASPgOUcPS6C0HQzgnhHJDakXW7CHKFEkv/iq/
VntH60vtRkfIhpLiUIYSorth6e00KGEAkxNYrdGy69tvO9Uc5DIuk73ZRKb6PTMVjwUp4tE8Xez6CgoDcXG
uXzj6o1RosvtczmltQXCuvWd97P8piCCGyDltvr0kBA4iE2HqF5jAssgV3S1Q4EpeFJQfixBWGomNKEBHBY
VeWoFsmV5mZXyuvp+v9WPpXfL3t/
SirbAjZeyHD2sUhqhdsvb0mBQwgEmIPFZrDsEiqSlRqnEzOEXeYliuU2HoiFel5hdYuml3bH5sJuUKJI3E1
/51QtvejNl7PXiTf24xxWWQCe5+J6oA9tNesjQFEQuyhQnMYFkmNWq3B+bQ8rDqUKAaPjceSkXDjNutoHTi
XdhNyhRI7otNq/FoJZXo/Cou5OZ+OWn1/
z5Xr+XetXRwiu2cP7TVrYwCREHuo0EWlKnHMt6U2HyMyV3JWAdb9nSQGjzVHknDx2i2oLbQzNxnKyNPu6L3
iYM2+nddoNNgclcLeDxN2ndb2PkencgITkaXZQ3vN2hhAJMReKjSHYZEU5N8tEeckLT+YgOjUXJRyudI6V6
JSY+E+7c8h/25JtV+HvR8VO5mcA7lCiV/PXrN2UYjsnr2016yJAURC7KVCcxgWScE/
idmQK5TYcjwVRaVssFrTxmPJkCuUSLhxu1rPZ+9H5XQ9TeGR8ezhI7Iwe2mvWRMDiITYS4XmMCyyNrVag9W
HtXM+YtNt+++TPdgdkwG5Qol/
ErOr9Xz2flRObx7ILc4DIbIke2mvWRMDiITYU4X+9ew17TCseH5bSXUvqcyqQBx2ZX3RqbnVHh5Utvfjb/
4+qZBuHsipFM4DIbIke2qvWQsDiITYU4XWDcNa93cSh2FRnfvtXgCOvHzd2kUhAFdy7kCuUGL14cQqPzf+O
ns/zKWbB/LLmavWLgqRXbOn9pq1MIBIiD1VaA7DImu5XVQqTnrmhpjScLdEJa5EVpUQodFosOkf9n6YK/
MW54EQ1QV7aq9ZCwOIhNhbheYwLLKG40k54iaDJB1r7y2HnJp9x+znsPejajgPhKhu2Ft7zRoYQCTE3ir0p
QwOw6K6pdFo8P0RbUP3wrU8axeHyvj9nPYLiZPJOWZdz96P6tEtg855IESWY2/
tNWtgAJEQe6vQZYdhcXdeqgup2XfEb8yLSzn5XEp0PVMR59PNup69H9VzKoXzQIgszd7aa9bAACIh9lihOQ
yL6tIf59IhVyhx4FKmtYtC5STfW5ls/dHkSq/9//
buPTqq+twb+MZIggokIiiCDbVVaV9pPe1rc6ScV1YXXeJRF7Yea4ueyqktVounek6PBwQhr/
agrOq7kavGCyBeAmK5qNx2CCFCQgKR3EjCntwzuSeTTK4zk5nZ3/
ePSTYMmZDLnpm9Z+b7Weu3XJnZyfzYPpk8z/
xul45+8L1jdLgOhCjwwjFfCzYWIAYSjgHNaVgULD0Op3ryOUfcjKfb7oQoyVifIg87OsXRj7HjOhCiwAvHf
C3YWIBcwebNmzFr1izExMQgISEB2dnZQ167fft2CILg1WJiYkb1euEY0JyGRcEyMPXkkywuPjeqd9M9h0PW
tvcOeQ1HP7TjOhCiwArHfC3YWIAMYdeuXYiOjsa2bdtQVFSEpUuXIi4uDk1Nvs8V2L59OyZPnoyGhga1NTa
ObhpIuAb0wJkMXEhKgaIoCnZkVEKUZBSYufjcqAYS49ya9iGvKW3qVEc/bH0c/
RgLrgMhCqxwzdeCiQXIEBISErBs2TL1a7fbjRkzZuD111/3ef327dsRGxur6TXDNaA5DYsCzdx2cfG53cmk
1agySlsgSjKOnm/w+TxHP/yD60CIAitc87VgYgHig8PhQFRUFPbt2+f1+JNPPolFixb5/
J7t27cjKioK8fHxuOWWW7Bo0SKcP39+VK8brgHNaVgUaIcLPYvPpSIuPjeygdGNj05X+Xy+vLmLox9+cOk6
kEauAyHyu3DN14KJBYgPdXV1EAQBmZmZXo+/
+OKLSEhI8Pk9mZmZ+PDDD5Gbm4sTJ07goYcewuTJk2E2m4d8Hbvdjo6ODrWZzeawDWhOw6JAabDasD7Fc8p
2g5XJlpFZe/
sgSjI2HDPB5eOT+YGzQk7IzTr0LrxcXAcysnNXiGjkWIBoxwLEh7EUIJfr6+vDd7/7Xbz88stDXpOYmDho4
Xq4BvSFBs8nn9s4DYv8yOlyY2emZ+3H4cKRnS9B+lEUBVvTynzu0GTr40ipP3EdCFHgsADRjgWID2OZguXL
o48+it/
85jdDPh9JIyAOp5vJBfldRplnTcE7J8q4XWuI2JNjhijJKKz13iygsNYKUZKxM7OSH1L4wcA6kM3HuQ6EyN
9YgGjHAmQICQkJeO6559Sv3W43Zs6cOeQi9Mu5XC7Mnj0b//Ef/
zHi1wz3gOY0LPKnpk4b3krxFLVyY6fe3aERSpebIUoyjpd47yg4UJicqeSUIX9wuxVsSeM6EKJACPd8LRhY
gAxh165diImJwY4dO1BcXIynn34acXFx6ta6v/3tb7FixQr1+ldeeQVHjx5FeXk5vvnmG/zmN7/
BhAkTUFRUNOLXDPeA5jQs8he3W8HHWZ7dkr7Iq2M8hZCBXfF2nbl4XkunrU9dx2Pt7dOxd+GF60CIAiPc87
VgYAFyBZs2bUJ8fDyio6ORkJCArKws9bn58+djyZIl6tcvvPCCeu1NN92EBx54AOfOnRvV64V7QHtNw+Inc
qTBmUrP/PataWXotjv17g6NQmuXHaIkY1OqSZ0adLb//
+fuszU69y685FS1cR0IUQCEe74WDCxADCQSAnpgGtZJE6dh0ci43QqaO+0orLXieEkTkrOr1alX5+t46GCo
cbsVbEr1/P+zdDsAADv7z/
7gIZL+1cR1IEQBEQn5WqCxADGQSAhoTsOiK7m02EgtaURydrU6anZ5O1hQzxgKUbvOVEOUZJQ0dKC5065uz
cuzP/
yL60CIAiMS8rVAYwFiIJEQ0JyGRQNcbgVNnbYRFRubj5di99kanJCbUVzfAUu3g8VHCEstaYQoyUiXm3HS1
KKu5SH/
4zoQIv+LhHwt0FiAGEikBPTAYWOchhU5Li82Ph2m2Pisv9goaWCxEY4Gttzdk2PGe1+XQ5RkmLiTWUBwHQi
R/
0VKvhZILEAMJFICWm70TMP64CSnYYW79h4HPjtbM2yxkd5fbLSx2IgIA2sTXt4l409bZby6pxROl1vvboUl
rgMh8r9IydcCiQWIgURKQDucbnURKqdhhS+ny42P+hcXi5KMLWml2JNjRrrcjAsNnSw2IlhTixv/
+0kTYufJiJ0n45rbGrFwIdDWpnfPws+l60AarHy/HQuXW0GnjdtD00WRkq8FEgsQA4mkgOY0rPB3ov/
AubdPlKG5085ig1QLFwKTf1ylFiBRk3sQFeV5nPxvYB3IWR+HPLrdCgrMVqTLzcitaUdFSzcs3Q6OSPVzON
1IzvZsmvBJVjXOVbehx8GtvyNdJOVrgcICxEAiKaA5DSu8VbV2qyMf5c1deneHDESWAUEArrmtAbHzZEz6S
TkEQYEgeB43mfTuYfgZWAey60y11/tta5cdn/
Yn15e39Sky3vu6HLvP1uDI+QacLm9FcX0H6tp70W13RsT7ttutqMXbpe2tFBP259ZCbuxkoRahIilfCxQWI
AYSSQF96TQsbg8ZPmQZ2PelE2v/XgZRkpFa0qh3l8hgDh3yFBpXT+lC7DwZ0TPa1OJDEDzPk39Ze/
vU99vsCgvcbgVnKi3Y0L82a0taKVJLGnEgrw47T1dh8/
FSn0XJpW1Tqgk7MyuxP7cWaReacK66DeXNXWjtsqMvDJJyRVGQUuTZrW3jMRMqWrqRW9M+qGDbklaKlKJGm
Nt6RlWU9TicqG3vjYhCLhxFUr4WKCxADCTSAprTsMKHxeKZPiMICq79fi1i58lIeKISTS2hn4iQfw2MgAgC
IES5vEY/OAISOAM7j61PkdWDH0VJxr5ztYPWNyiKgh6HE/XWXpQ0dCCrvBVHzzfgs7M1eO/
rcqxPuXJxIkoy3k0vx4G8OjicofkekFXeqt6v0ibvUdzWLjtOlbaoO7gNtA9OViCjrAXtPY5BP09RPGccZZ
W3Ijm7Wr2HX+XXcxQlBEVavhYILEAMJNICmtOwwsfChUBUFBA9vd0zr3+uCeMn2Tmnn3waiJdLCw+uAQksR
VFwuLDB65P783XWMb33Ol1utHU7UNnSjbyadqTLzfgirw4f+Rg98bXuxOjO11nV/
ufWtA95naIoqLH04Mj5hkH/
7l1nqpHXv6YmtaRxULEyUNyIkozPztbwEM4QE2n5WiCwADGQSAtoTsMKDwOfaF91jR2xc02DptXwE226XFv
bwIjZxcZdsALP4XTji7w6HCyoD9iuToqioNfhwtlKC0RJRlJ6WUh8wq8oCsxtPdh37uKaj9GMzve53Chp6M
Dec+YhR4g2HvOsHSkwW9Fp60N1a49auOw8XYUuOxe3h4pIy9cCgQWIgURiQH+VXw9RkvG1qVnvrtAYDczpn
3BrE2LnybjuTrPXtBrO6aehmEye+GCRGn5cbkX91L/
AbB3zz2nqsOGkqSWgBVNpU5e609XAyMTxkqYxj8x32Z3IqbLgo9NVeP9kBVKKGlHe3OVzbUxThw1J
6Z41c+99XQ5L9+DpW2Q8kZiv+RsLEAOJxIAemIb1PqdhhayBEZDrflCD2Hkyxt9o5Zx+IsI31Z7dt7adqhj
TIYimxk71ENMPMyv9Ok3J5VZQWGvFjoxKrxGKY8WNPtdwBJK1pw/bT1VAlGRsTStDXXtvUF+fRi8S8zV/
YwFiIJEY0JyGFR7uW6ggbm4pYufJuOo6G+f0ExEcTje2pnk+3ZcbO0f8fYqiIKfKok5leivF8zdi99kazdO
57E4XcqoseDf94pqMLWmlOFXagm4dp0D1OJzqDlubUk3cvtzgIjFf8zcWIAYSqQHNaVihr7q+Dz9eIiP2py
YI4xTO6SciAEBmmWc3qY+zqkY0yu12K0gtaVSLg+MlTWjqsKlrJb7Krx/
TaHm33YlTpS3qqfADO3XlVFlgdxpjAbjD6VbXoLyVYkJh7dinrlFgRWq+5k8sQAwkUgPa1D8N6930crjGME
xP+itt6oIoyfh/
B6o4p5+IVL0OlzrKXdXafcVrL03A16fIyKlqU4uNGkuPem7JCXnkH1a19zhwrLhRncolSjJ2ZFSisNZqyMX
xLreCI+cv7laWVd7K6ckGFKn5mj+xADGQSA1ol1tRF+GVNETWvz1cnO7fM/
9wYYPeXSEig0m70ARRkrEnxzzkNZ22PnzUfz7JxmMmlDYNnrJVXN+hJubfVF95eLWpw4aDBfVeO1IlZ1ejt
KnT8Am9oijIKG1R+32suHFMa2gocCI1X/
MnFiAGEskBPZDAJmdX690VGoMv8jyHSuZUcc4VEXnrsPWp6zjOVbehrr0X3XanWgg0d9rVHbPeOVGGeuvQi
7DP9G/
vuz5l8LoSRVFQ3dqDv39j9tr+dt+5WtRYRndSuRHk1rSrBdSBvLqwOGE+XERyvuYvLEAMJJIDutvuVIfXG6
xcjB5qPjjp2cGlxtKjd1eIyIAunVY00DalmrAzs1Jd37EjoxLWnitvt6soF9eIbDxmgrmtB263ArmxE59kX
dxK960UEw4V1KOpM7T/npgaO9W/jbvP8MBCo4jkfM1fWIAYSKQH9MApvYcL6/XuCo2C3elS/
+jzjyMR+dJtdyK1pBF7csx4/2TFoMP6RnMauNut4ED/qOuWtFJs69/
CdqCoOV7SBGtvYM4N0UONpUddPP9hZiU6AnQmCo1cpOdr/
sACxEAiPaAbrDaIkowNx0y6bodIo1Pb3qseokVENBIut4L2HgeqWrtR3tw16g1I+lxur8MDt6aVIaOsBT2O
8Pzb0dxpV7cOfu/
rcrR02fXuUkSL9HzNH1iAGAgDGth1xvMHJbOsVe+u0Ajl1rRDlGTsz63VuytEFEF6HS6kljTim+o2OJzhvz
6iw9anHpy4Ja0U5jZOedUL8zXtWIAYCAMauNDg2ZI3Kb2MW/KGCKnIMx87o7RF764QEYW1XodL/
aBuqN3CKPCYr2nHAsRAGNCeYfmBYebi+si9D6FkZ6bnEzn+ISQiCrw+lxv7cy+el5Jvbte7SxGH+Zp2LEAM
hAHtkdW/
Je+n3JLX8HodFxeg9zq4AJ2IKBjcbgUpRRdPjM8obQm5bYZDGfM17ViAGAgD2qPHcXFL3ivtB0/6K23yTJn
bmVmpd1eIiCKKoijILGtVi5Cj5xt4YGGQMF/TjgWIgTCgLxrYM/5QAbfkNbLj/
Sccp5Y06t0VIqKIVGC2qtsa78+t5YGFQcB8TTsWIAbCgL6oscOmHibVxS15Deuj01UQpcEnEhMRUfCUNnVh
Y//
MgeTsak6JDTDma9qxADEQBrS33WdqPHNby7i7khHZ+lzqp248t4WISF+17b3YmlZ28VT5MDqM0WiYr2nHAs
RAGNDe5EbP+oJ3TpTBySFlwylr7lL/
0BERkf5au+x472vPTpLvppejqdOmd5fCEvM17ViAGAgD2pvLrahvpEV1vCdGc0JuhijJSCni+g8iIqPotPW
p26NvPl6K8uYu7pDlZ8zXtGMBYiAM6MGyKywQJRmfZFXzDdRgPsnyHIZV0sB4JSIyElufC7vP1qg7ZH2YWY
lvqttg6+PaEH9gvqYdCxADYUAP1uNwqgvr6tq5Ja9RXLr+g5sEEBEZj9PlxvGSJmxKNamFyMZjJhwubEBte
y8/1NOA+Zp2LEAMhAHt29H+LXkPcktew6ho6YYoydh2qkLvrhAR0RXY+lzIq2nHzv5dCzkqoh3zNe1YgBgI
A9q3pku25O20cVcPI/ja5Fn/IXH9BxFRSFAUBQ1WG6SiRh+jIvUwt/
VwVGSEmK9pxwLEQBjQQxuYy5pRyi15jeDT7GpuDkBEFKLsThfyze3qWU4DbUdGJXKq2niOyDCYr2nHAuQKN
m/
ejFmzZiEmJgYJCQnIzs6+4vWfffYZZs+ejZiYGMyZMwcHDx4c1esxoIdm4pa8hmF3uvBWiufTsw6OSBERha
xLR0U2Hy9VC5ENx0w4VFCPGgtHRXxhvqYdC5Ah7Nq1C9HR0di2bRuKioqwdOlSxMXFoampyef1GRkZiIqKw
t/+9jcUFxfj5Zdfxvjx41FYWDji12RAD819yZa85+usencnolX2r/94/
yTXfxARhYuBUZGPszgqMhzma9qxABlCQkICli1bpn7tdrsxY8YMvP766z6vf+yxx/Dggw96PfaP//
iP+OMf/zji1zRUQCsK4Og2VMsxmbHxcB52nSrRvS+R3DJLqrHxcB5S8sp17wsbGxsbm/
9bY2srUvMr8E5KATYezsPGw3nYcjQfR8+VwdzYAsUd2TMRDJWvhSgWID44HA5ERUVh3759Xo8/+eSTWLRok
c/v+da3voX169d7PbZmzRr88Ic/
HPJ17HY7Ojo61GY2m40T0I5uIHEyGxsbGxsbG5tXyyyp1jtL0RULEO1YgPhQV1cHQRCQmZnp9fiLL76IhIQ
En98zfvznz10XAAAgAElEQVR4fPrpp16PbdmyBTfeeOOQr5OYmAhBEAY1QwQ0CxA2NjY2NjY2H62xtVXvLE
VXLEC0YwHiQ7AKEEOPgBhwChYc3TiYU4qNh/NwrtSse18isdU0tGDj4TxsTzsPxd6le3/
Y2NjY2ILbHD2dnhwhgrEA0Y4FiA/
BmoJ1OQb08LLKWyFKMg4X8lBCPWSUtvD+ExFRRGO+ph0LkCEkJCTgueeeU792u92YOXPmFRehP/
TQQ16PzZ07N3QXoRtUeXMXREnGzsxKvbsSkQbOYyms5U5kREQUmZivaccCZAi7du1CTEwMduzYgeLiYjz99
NOIi4tDY6Pn5Off/va3WLFihXp9RkYGrr76arz55psoKSlBYmIit+ENgE5bn3oqeh/
PAwmqPpcbG455zv9o63bo3R0iIiJdMF/
TjgXIFWzatAnx8fGIjo5GQkICsrKy1Ofmz5+PJUuWeF3/2Wef4Y477kB0dDTuvPNOHkQYAIqi4J0TZRAlGQ
1Wm97diSg1lh6Ikox308t5MBUREUUs5mvasQAxEAb0yPz9GzNESUaBmdOAgimzzLP+5mAB138QEVHkYr6mH
QsQA2FAj8zXpmaIkoxjxY16dyWi7MnxFH755na9u0JERKQb5mvasQAxEAb0yFxo6IQoyUjOjuyDkILJ6XJj
Y//6j9Yuu97dISIi0g3zNe1YgBgIA3pkLN0OiJKMTakmuN1cixAMte29ECUZ75wo4/
oPIiKKaMzXtGMBYiAM6JFxuxVsSuWn8cE0cP7Kl/
l1eneFiIhIV8zXtGMBYiAM6JFLzq6GKMkoaeC9CobP+9d/5NZw/
QcREUU25mvasQAxEAb0yKWWNEKUZHxtata7K2HPdcmIUwtHnIiIKMIxX9OOBYiBMKBHrsBshSjJ+DzHrHdX
wl5d//qPt7n+g4iIiPmaH7AAMRAG9Mg1WG1MioPkTKUFoiTjizyu/
yAiImK+ph0LEANhQI+c0+XGWymeaUGdtj69uxPWdp+pgSjJ+Ka6Te+uEBER6Y75mnYsQAyEAT06OzMrIUoy
ypu79O5K2BrYfnfDMRM6WOgRERExX/MDFiAGwoAencOF9RAlGafLW/
XuStjae86z+1VKEU+dJyIiApiv+QMLEANhQI9OTlUb1yYEUGOHZ53NWykmWHs4+kFERAQwX/
MHFiAGwoAenRpLD0RJxgcnK/
TuSlg6kFcHUZJxuLBB764QEREZBvM17ViAGAgDenRsfS6IkgxRkmHrc+ndnbDS3GmHKMlYn8LT5omIiC7Ff
E07FiAGwoAevfdPVkCUZNRYevTuSlg5WOBZX/
NVfr3eXSEiIjIU5mvasQAxEAb06A1ME+IWsf5j6XZgfYpnZKm5k6MfREREl2K+ph0LEANhQI9eZlkr1yn42
ZHzDRAlGftza/
XuChERkeEwX9OOBYiBMKBHr6y5C6IkY+fpKr27EhasvX3qAY8NVpve3SEiIjIc5mvasQAxEAb06HXY+tStY
p0ut97dCXnHihshSjL+/
o1Z764QEREZEvM17ViAGAgDevQURcHWtDKIkozGDn5ir0WnrQ8bjnlGP8xtXNRPRETkC/
M17ViAGAgDemz25HhO6y6sterdlZB2qrQFoiRj99kavbtCRERkWMzXtGMBYiAM6LFJl5shSjKOlzTp3ZWQt
vN0FURJRkkD44+IiGgozNe0YwFiIAzosSmu7/B8cn+Gn9yPVWf/
Wpr1KTJ6HTzUkYiIaCjM17RjAWIgDOixaenynNq9+XgpFEXRuzshqbDWClGSkZxdrXdXiIiIDI35mnYsQAy
EAT02breCjf2Lp9u6HXp3JyR9le85+TyzrFXvrhARERka8zXtWIAYCAN67D7NroYoyZAbO/
XuSshxuxVsSSuFKMmot/
bq3R0iIiJDY76mHQsQA2FAj11Kkef8ipOmFr27EnLq2nshSjK2ppXB7eYUNiIioithvqYdCxADYUCPXb65H
aIkY+85HqA3Whllnu13DxbU690VIiIiw2O+ph0LEANhQI9dvdXzKX5SepneXQk5A9PXztfxHBUiIqLhMF/
TjgWIgTCgx67P5cb6FBmiJKPL7tS7OyGjx+HkfSMiIhoF5mvasQAxEAa0Nh9mVkKUZFS0dOvdlZBR0uA5Q+
Wj01V6d4WIiCgkMF/TjgWIgTCgtTlU4NlKNrvCondXQsbhwgYu3iciIhoF5mvasQAxEAa0NmcrLRAlGV/
m1+ndlZCgKAqS0ssgSjJqLD16d4eIiCgkMF/
TjgWIgTCgtalu7YEoydh2qkLvroSEpg6beoK8i9vvEhERjQjzNe1YgBgIA1qbXocLouRZUG13uvTujuFlV3
hGjPbn1urdFSIiopDBfE07FiA+WCwWPP7445g0aRJiY2Px1FNPoaur64rfM3/+fAiC4NX++Mc/
jup1GdDavfd1OURJhrmNU4qGs/tsDURJRl5Nu95dISIiChnM17RjAeLD/
fffj7vuugtZWVk4efIkbrvtNixevPiK3zN//
nwsXboUDQ0NahttYDKgtdufWwtRknGuuk3vrhhae49D3X7X2tund3eIiIhCBvM17ViAXKa4uBiCIODs2bPq
Y4cPH8a4ceNQVzf04ub58+fj+eef1/
TaDGjtBk71Pnq+Qe+uGNrxkiaIkox95zj9ioiIaDSYr2nHAuQyH3zwAeLi4rweczqdiIqKwt69e4f8vvnz5
2Pq1Km44YYbcOedd2LFihXo6RndNCAGtHalTV0QJRk7ea7FkGx9LmxKNUGUZFS3cqoaERHRaDBf044FyGXW
rl2LO+64Y9Dj06ZNw9atW4f8vqSkJBw5cgQFBQX4+OOPMXPmTPzyl7+84mvZ7XZ0dHSozWw2M6A16rI7IUo
y1qfIcDjdenfHkAYWn390ugqKwt2viIiIRoMFiHYRU4AsX7580CLxy1tJScmYC5DLpaamQhAElJWVDXlNYm
Kiz34woLUZWIjOsy0Gc7kVvJvuuT9FdYwzIiKi0WIBol3EFCDNzc0oKSm5YnM4HGOegnW57u5uCIKAI0eOD
HkNR0AC48v8OqxKlrEx2QKTSe/
eGMv5OitESca76eU8+4OIiGgMWIBoFzEFyEgNLELPyclRHzt69Oiwi9Avd+rUKQiCgPz8/BF/
DwNaO4sF+D+PWBA7T8a136uDIAALFwJt3BQLiqJg5+kqiJKMM5UWvbtDREQUkpivaccCxIf7778fP/
rRj5CdnY1Tp07h9ttv99qGt7a2FrNnz0Z2djYAoKysDK++
+ipycnJQWVmJAwcO4Dvf+Q7uvffeUb0uA1q7hQuB6Ot7EDtPxqSflEMQgKgoz+ORbuCk+M3HS2Hr40GNRER
EY8F8TTsWID5YLBYsXrwYEydOxOTJk/
G73/3O6yDCyspKCIKAtLQ0AEBNTQ3uvfdeTJkyBTExMbjtttvw4osv8hyQIJNlQBAA4So3Yn9qQuw8GeOnd
UAQFAgCIn461t5zZoiSjOMXmvTuChERUchivqYdCxADYUBrc+hQfwEiANd+rw6x82R1Kta48U4cOqR3D/
XT0mVXdwez9vDgQSIiorFivqYdCxADYUBro46ACIAwTkHMt1rVkZDJCWU4mtUZsdvOHj3fAFGS8WX+yNcxE
RER0WDM17RjAWIgDGjtFi70rPkYKESuus6GyT+uwo+XyBAlGV/
k1aHb7tS7m0HVbXdiwzHPwYN17b16d4eIiCikMV/
TjgWIgTCgtWtr8xQh6kiIANy3UIGU14q3UjxJ+Na0MpQ0dETMaEhGaQtEScauM9V6d4WIiCjkMV/
TjgWIgTCg/cdk8qwJuXTheVOnDR/1b0MrSjIORMBoSJ/LjbdPlEGUZJgaO/
XuDhERUchjvqYdCxADYUAHnsut4HR5qzolaWtaGYrrw3c0JK+mHaIk44OTFXDz4EEiIiLNmK9pxwLEQBjQw
dPcacfHWd6jIV1hNhqiKAq2n6qAKMk4V82TGImIiPyB+Zp2LEAMhAEdXC63gqwwHg0pbeqCKMnYklYKh9Ot
d3eIiIjCAvM17ViAGAgDWh+Xj4bsz60Ni9GQ3WdrIEoyTppa9O4KERFR2GC+ph0LEANhQOvn8tGQLWmlKKo
L3dGQBqsNoiTjrRQTOm08eJCIiMhfmK9pxwLEQBjQ+mvpsuOTrOqQHw05WFAPUZJxuLBB764QERGFFeZr2r
EAMRAGtDG43QqyKywhOxrSYetTzzxp6rTp3R0iIqKwwnxNOxYgBsKANhZfoyGhMJ3phNwMUZLxeY5Z764QE
RGFHeZr2rEAMRAGtPG43QrOVHqPhpyvsxp2NMTW58Lm46UQJRkVLd16d4eIiCjsMF/
TjgWIgTCgjau1y45Psy+Ohuw7Z8zRkJwqC0RJxoeZlYYtkoiIiEIZ8zXtWIAYCAPa2HyNhhTWGmc0xOVW8N
7X5RAlGYW1Vr27Q0REFJaYr2nHAsRAGNChwddoiK3PpXe3UNLQAVGS8c6JMjhdPHiQiIgoEJivaccCxEAY0
KHD7VZwttKCjf2jIXof9qcoirpg/
nR5q659ISIiCmfM17RjAWIgDOjQIzd2QpRkvJteDrdbv6lYNZYeiJKMjcdM6HGE3rklREREoYL5mnYsQAyE
AR16XG4Fb58ogyjJqNRx16n9ubUQJRnHiht16wMREVEkYL6mHQsQA2FAh6bjF5ogSjK+yq/
X5fXbuh3qehRLt0OXPhAREUUK5mvasQAxEAZ0aGrqsEGUZGw4ZtJlMfqx4kb1oEQiIiIKLOZr2rEAMRAGdG
hSFAU7T1dBlGTk1bQH9bV7HS51IXyNpSeor01ERBSJmK9pxwLEQBjQoSunqg2iJOPT7Oqgvu7p8laIkoxPs
qoNcx4JERFROGO+ph0LEANhQIeuHocTb6V4RiJau+xBeU2ny413+hfAlzQwZoiIiIKB+Zp2LEAMhAEd2g7k
1UGUZHxtag7K6xXWWiFKMt77uhwuHbcAJiIiiiTM17RjAWIgDOjQVtrUBVGSkZReFvAzQRRFwYeZlRAlGTl
VloC+FhEREV3EfE07FiAGwoAObS63ok6JqgjwmSAVLd0QJRmbj5fqsvMWERFRpGK+ph0LEANhQIe+tP4zQb
7Mrwvo63yeY4YoyTghB2e6FxEREXkwX9OOBYiBMKBDX3OnHaIk460UE6w9fQF5jaZO28XX6A3MaxAREZFvz
Ne0YwFiIAzo8PD3bzyjE8dLmgLy8w8XNkCUZBws0OfkdSIiokjGfE07FiAGwoAOD9WtPRAlGZtSTeh1+Hd9
RqetT93ut8Fq8+vPJiIiouExX9OOBYiBMKDDg6Io+CSrGqIkI7Os1a8/+6SpBaIkY/fZGr/
+XCIiIhoZ5mvasQAxEAZ0+JAbOyFKMt4+UQaH0+2Xn+lwurElrRSiJKO0qcsvP5OIiIhGh/
madixADIQBHT7cbgUfnKyAKMnIrWn3y888V90GUZKx7VQFFIUHDxIREemB+Zp2LEAMhAHtJ42NQFoacPiw5
7+Njbp0I6+mHaIk4/2TFSM/mHCIvl9a0OT5qaAh0pVBfk+JiEaL+Zp2LEAMhAGtkcUCJCUBf/gD8MgjwL/
8i+e/f/iD53FLcE8M73O51YMJSxqG+X86TN9Nsmdnra1pZehz+WdKF5EuDPZ7SkQ0WszXtGMB4sP//M//
YO7cubjmmmsQGxs7ou9RFAWrV6/G9OnTMWHCBCxYsAAmk2lUr8uA1sBiAdasAX7xC+DZZ4HVq4HERM9/
n33W8/iaNUFPbrLKWyFKMj46XTX0tKkR9H3Xqo0QD+Qho7QlqP0n8iuD/
p4SEY0G8zXtWID4sGbNGoiiiP/8z/8ccQGybt06xMbGYv/+/
cjPz8eiRYtw6623wmYb+VapDGgNkpI8ycvKlZ6E5vK2cqXn+aSkoHbL1ufC5uOeheNVrd2+Lxqm71UvvQLx
969iw7pP0W13Bq/
zRP5m0N9TIqLRYL6mHQuQK9i+ffuIChBFUTB9+nS88cYb6mNWqxUxMTFITk4e8esxoMeosdEzfePZZ30nNQ
Pt2Wc91wV5rnnahSaIkozPc8yDnxym78qaRHy0ajPEF0SkPbuS8+QpdBn895SIaKSYr2nHAuQKRlqAlJeXQ
xAE5Obmej1+77334s9//
vOQ32e329HR0aE2s9nMgB6LtDTPHPKB6RxDtdWrPdedOBHU7nVccnhgRUs3nJeu4Rim70Wr10FcmYQtK7ei
919+FfS+E/mNwX9PiYhGigWIdixArmCkBUhGRgYEQUB9fb3X47/61a/
w2GOPDfl9iYmJEARhUGNAj9Lhw56FrFdKagbao496rg92FwsbIEoyREnGWykm7MioxBd5dcj49BAuLP49mt
f8Fc413n11rknEe6u2QlyZhDOr39Ct70R+EQK/p0REI8ECRLuIKUCWL1/uM9m/
tJWUlHh9T6ALEI6A+EkIfLJq7enDnhyzepCg2t49CvEPf4X40jt4a1USvln9N7W/Z1e/
AXFlEt5btRV9L6/
hp8IU2kLg95SIaCRYgGgXMQVIc3MzSkpKrtgcDofX9wR6CtblGNBjNNq55U1NunVVURR02Z2oau3GN9VtSM
m4gF3L/ootz78JcWUSNq96B7Y1/
xe9a17BllVvQ1yZhPOr1xmi70SahNDvKRHRlTBf0y5iCpCxGO0i9DfffFN9rKOjg4vQgymUd9dJSoLyi1/
gwxUbIa5Mwt4/J+HNp5Lx8n/
sxM5Vm+F+ycB9JxqNUP49JSLqx3xNOxYgPlRXVyM3NxevvPIKJk6ciNzcXOTm5qKrq0u9Zvbs2di7d6/69b
p16xAXF4cDBw6goKAADz/
8MLfhDaZQPl+gv+8ZjzyHHz9wEpMTyhD7UxNi58n42fdz0fbAE8btO9FohPLvKRFRP+Zr2rEA8WHJkiU+14
ikpaWp1wiCgO3bt6tfDxxEeNNNNyEmJgYLFiyALMujel0GtEaXn7D86KOhc8KyxYL77qxGbEIpYufJiJ0n4
7o7zYga58TC/1Vj7L4TjUYo/
54SEYH5mj+wADEQBrSfNDZ6FrAePuz5bwjMJZdlQBCAmJkWtQCJus4GQfA8bjLp3UMiPwvB31MiIoD5mj+w
ADEQBnTkOnTIU2gIV7lx7ff
qEHOLRS0+BMHzPBEREemP+Zp2LEAMhAEduQZGQIZqHAEhIiIyBuZr2rEAMRAGdGRbuBCIivIuPKKiPI8TER
GRMTBf044FiIEwoCNbW5un2Li0AFm40PM4ERERGQPzNe1YgBgIA5oAz3SrQ4c47YqIiMiImK9pxwLEQBjQR
ERERMbGfE07FiAGwoAmIiIiMjbma9qxADEQBjQRERGRsTFf044FiIEwoImIiIiMjfmadixADIQBTURERGRs
zNe0YwFiIAxoIiIiImNjvqYdCxADYUATERERGRvzNe1YgBgIA5qIiIjI2JivaccCxEAY0ERERETGxnxNOxY
gBsKAJiIiIjI25mvasQAxEKvVCkEQYDab0dHRwcbGxsbGxsbGZrBmNpshCAKsVqveqWPIYgFiIAMBzcbGxs
bGxsbGZuxWXl6ud+oYsliAGIjb7YbZbIbVatW9ur+0wueIDO8R7xHvkd6N94j3iPeI98goraamBoIgoL29X
e/UMWSxAKEhdXRwjuNweI+Gx3s0PN6j4fEeDY/
3aHi8R8PjPRoe75F2LEBoSPwFGx7v0fB4j4bHezQ83qPh8R4Nj/doeLxHw+M90o4FCA2Jv2DD4z0aHu/
R8HiPhsd7NDzeo+HxHg2P92h4vEfasQChIdntdiQmJsJut+vdFcPiPRoe79HweI+Gx3s0PN6j4fEeDY/
3aHi8R9qxACEiIiIioqBhAUJEREREREHDAoSIiIiIiIKGBQgREREREQUNCxAiIiIiIgoaFiA0pM2bN2PWrF
mIiYlBQkICsrOz9e5S0KSnp+Ohhx7CzTffDEEQsG/fPq/
nFUXB6tWrMX36dEyYMAELFiyAyWTyusZiseDxxx/HpEmTEBsbi6eeegpdXV3B/
GcEzGuvvYa7774bEydOxLRp0/Dwww/jwoULXtfYbDb86U9/
wpQpU3DdddfhkUceQWNjo9c11dXVeOCBB3DNNddg2rRp+K//+i84nc5g/
lMCZuvWrfjBD36ASZMmYdKkSbjnnntw6NAh9flIvz++vP766xAEAc8//7z6WKTfp8TERAiC4NVmz56tPh/
p92dAbW0tnnjiCUyZMgUTJkzAnDlzcPbsWfX5SH/PnjVr1qA4EgQBf/rTnwAwjgDA5XLh5Zdfxre//
W1MmDAB3/nOd/
Dqq69CURT1mkiPI39iAUI+7dq1C9HR0di2bRuKioqwdOlSxMXFoampSe+uBcWhQ4ewatUq7N2712cBsm7dO
sTGxmL//v3Iz8/HokWLcOutt8Jms6nX3H///bjrrruQlZWFkydP4rbbbsPixYuD/U8JiIULF2L79u04f/
488vLy8MADDyA+Ph7d3d3qNc888wy+9a1vITU1FTk5Objnnnvw05/+VH3e5XJhzpw5+PnPf47c3FwcOnQIU
6dOxUsvvaTHP8nvvvjiCxw8eBAmkwmyLGPlypUYP348zp8/D4D353JnzpzBt7/9bfzwhz/0KkAi/
T4lJibizjvvRENDg9paWlrU5yP9/gBAW1sbZs2ahX/
7t39DdnY2KioqcPToUZSVlanXRPp7dnNzs1cMpaSkQBAEpKWlAWAcAcDatWtxww034KuvvkJlZSX27NmDiR
MnYsOGDeo1kR5H/sQChHxKSEjAsmXL1K/dbjdmzJiB119/
Xcde6ePyAkRRFEyfPh1vvPGG+pjVakVMTAySk5MBAMXFxRAEwesTuMOHD2PcuHGoq6sLXueDpLm5GYIgID0
9HYDnfowfPx579uxRrykpKYEgCDh9+jQAT5F31VVXeX3K9vbbb2Py5MlwOBzB/
QcEyfXXX4/333+f9+cyXV1duP3225GSkoL58+erBQjvk6cAueuuu3w+x/vjsXz5cvzTP/3TkM/
zPXuw559/Ht/97nehKArjqN+DDz6Ip556yuuxRx55BE888QQAxpG/sQChQRwOB6KiogZ96v/
kk09i0aJFOvVKP5cXIOXl5RAEAbm5uV7X3Xvvvfjzn/
8MAPjggw8QFxfn9bzT6URUVBT27t0b+E4HWWlpKQRBQGFhIQAgNTUVgiCgvb3d67r4+HiIoggAWL169aDEq
qKiAoIg4Ny5c8HpeJC4XC4kJycjOjoaRUVFvD+XefLJJ/
HCCy8AgFcBwvvkKUCuvfZa3Hzzzbj11lvx+OOPo7q6GgDvz4Dvf//7eOGFF/Doo49i2rRp+Id/+Ae8+
+676vN8z/bmcDhwww03YO3atQAYRwPWrl2LWbNmQZZlAEBeXh5uvPFGfPzxxwAYR/
7GAoQGqaurgyAIyMzM9Hr8xRdfREJCgk690s/lBUhGRgYEQUB9fb3Xdb/61a/
w2GOPAfC8kd1xxx2Dfta0adOwdevWwHY4yNxuNx588EHMmzdPfeyTTz5BdHT0oGt/8pOf4L//
+78BAEuXLsV9993n9XxPTw8EQfBaKxHKCgoKcN111yEqKgqxsbE4ePAgAN6fSyUnJ2POnDnqFIZLCxDeJ88
nz5999hny8/Nx5MgRzJ07F/
Hx8ejs7OT96RcTE4OYmBi89NJLOHfuHJKSkjBhwgTs2LEDAN+zL7d7925ERUWpn8gzjjzcbjeWL1+OcePG4
eqrr8a4cePw2muvqc8zjvyLBQgNwgLEGwuQK3vmmWcwa9YsmM1m9TH+QfNwOBwoLS1FTk4OVqxYgalTp6Ko
qIj3p19NTQ1uvPFG5Ofnq4+xALmy9vZ2TJ48Ge+//z7vT7/x48dj7ty5Xo/9+7//O+655x4AfM+
+3H333YeHHnpI/
Zpx5JGcnIxbbrkFycnJKCgowM6dOzFlyhQWsgHCAoQG4RQsb5yCNbRly5bhlltuQUVFhdfjHNL3bcGCBXj6
6ad5f/rt27cPgiAgKipKbYIgYNy4cYiKisKxY8d4n3y4++67sWLFCsZRv/
j4ePz+97/3emzr1q2YMWMGAL5nX6qqqgpXXXUV9u/frz7GOPK45ZZbsHnzZq/H/vrXv6q7zjGO/
IsFCPmUkJCA5557Tv3a7XZj5syZXISOiwvR3nzzTfWxjo4OnwvRcnJy1GuOHj0aNgvRFEXBsmXLMGPGjEFb
EAIXF8d+/vnn6mMXLlzwuajx0p3VkpKSMHnyZNjt9sD/I3Tws5/9DEuWLOH96dfZ2YnCwkKvdvfdd+Nf//
VfUVhYyPvkQ1dXF66//nps2LCB96ff4sWLBy1Cf+GFF9RREb5nX5SYmIjp06d7bZ/
LOPKYMmXKoFGK1157DbfffjsAxpG/sQAhn3bt2oWYmBjs2LEDxcXFePrppxEXFzdoX/
Bw1dXVhdzcXOTm5kIQBIiiiNzcXHXx57p16xAXF4cDBw6goKAADz/
8sM+t+H70ox8hOzsbp06dwu233x42W/E9++yziI2NxYkTJ7y2duzt7VWveeaZZxAfH4/
jx48jJycHc+fO9ZomMbCt43333Ye8vDwcOXIE06ZNC5ttHVesWIH09HRUVlaioKAAK1aswLhx4yBJEgDen6
FcOgUL4H36y1/+ghMnTqCyshIZGRn4+c9/jqlTp6K5uRkA7w/
g2cL56quvxtq1a1FaWopPPvkE1157rbp4GOB7NuD5IDE+Ph7Lly8f9BzjCFiyZAlmzpypbsO7d+9eTJ06VZ
2GBjCO/
IkFCA1p06ZNiI+PR3R0NBISEpCVlaV3l4ImLS3N56FNS5YsAXDxMKKbbroJMTExWLBggbpzxgCLxYLFixdj
4sSJmDx5Mn73u9+FzWFEvu6NIAjYvn27es3AwVbXX389rr32Wvzyl79EQ0OD18+pqqrCP//
zP+Oaa67B1KlT8Ze//CVsDrZ66qmnMGvWLERHR2PatGlYsGCBWnwAvD9DubwAifT79Otf//
b3GRQAAAEpSURBVBo333wzoqOjMXPmTPz617/2Ot8i0u/PgC+//
BJz5sxBTEwMvve973ntggXwPRvwfBIvCMKgfzfAOAI8I7LPP/
884uPj1YMIV61a5bXNMOPIf1iAEBERERFR0LAAISIiIiKioGEBQkREREREQcMChIiIiIiIgoYFCBERERERB
Q0LECIiIiIiChoWIEREREREFDQsQIiIiIiIKGhYgBARERERUdCwACEiIiIioqBhAUJEREREREHDAoSIiIiI
iIKGBQgREREREQUNCxAiIiIiIgoaFiBERERERBQ0LECIiIiIiChoWIAQEREREVHQsAAhIiIiIqKgYQFCRER
ERERBwwKEiIiIiIiChgUIEREREREFDQsQIiIiIiIKGhYgREREREQUNP8fkRVvLHlHzhwAAAAASUVORK5CYI
I=\" width=\"800\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"correl_ir2 = si.correlate(sig_ir2, waveform, mode=\"valid\") / norm_w\n",
"# valid : on ne prend que les valeurs de la corrélation pour lesquelles le
support de l'onde\n",
"# est inclus dans le signal\n",
"\n",
"plot_correl(correl_ir2, data, T)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.9"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

You might also like