{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "5112eac5",
   "metadata": {},
   "source": [
    "# Second TP, sur les méthodes de gradient accélérées et les opérateurs proximaux\n",
    "\n",
    "Ce TP comporte deux exercices : \n",
    "- l'**exercice 1** porte sur les méthodes de gradient et gradient accéléré pour des fonctionnelles non uniformément convexes ; \n",
    "- l'**exercice 2** porte sur les méthodes de gradient adaptées aux fonctionnelles non régulières. \n",
    "\n",
    "Dans la suite, on utilisera le plus possible la librairie Numpy pour la manipulation des vecteurs, matrices, Scipy.stats pour résoudre des problèmes de moindres carrés... et Matplotlib pour la visualisation des résultats. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "1d0dcb37",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import numpy.linalg as npl\n",
    "import matplotlib.pyplot as plt\n",
    "import scipy.stats\n",
    "%matplotlib notebook"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "281c7ea8",
   "metadata": {},
   "source": [
    "# Exercice 1\n",
    "\n",
    "## Descente de gradient pour une fonctionnelle non uniformément convexe\n",
    "\n",
    "On rappelle que la méthode de gradient à pas fixe $\\alpha$ pour une fonctionnelle $f: \\mathbb{R^n} \\longrightarrow \\mathbb{R}$ consiste en le calcul des itérés :\n",
    "$$\n",
    "x_{k+1} = x_k - \\alpha \\nabla f(x_k), \\quad k \\in \\mathbb{N}\n",
    "$$\n",
    "pour un $x_0$ donné.\n",
    "\n",
    "Un critère d'arrêt classique que la norme $l_2$ du gradient soit inférieure à une tolérance donnée (on limite également le nombre d'itérations total pour éviter les boucles infinies). Un autre critère d'arrêt consiste à tester la norme de la différence entre deux éléments successifs : ces deux critères sont les mêmes au coefficient multiplicatif $\\alpha$ près. \n",
    "\n",
    "On pourra considérer ici des fonctions de $\\mathbb{R}$ dans $\\mathbb{R}$ pour simplifier, non uniformément convexes au voisinage de leur minimum : par exemple $f(x) = x^4$, $f(x) = x^8$... L'idée de l'exercice est de vérifier que la convergence est plus lente que pour une fonctionnelle uniformément convexe. À la fin de cet exercice on testera la méthode accélérée de Nesterov, qui s'écrit \n",
    "$$\n",
    "\\begin{array}{l}\n",
    "y_k = x_k + \\frac{k-1}{k+2}(x_k - x_{k-1}), \\\\\n",
    "x_{k+1} = y_k - \\alpha \\nabla f(y_k)\n",
    "\\end{array}\n",
    "$$\n",
    "pour $k \\geq 2$. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "1fc93658",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Définir la fonction f\n",
    "def f(x):\n",
    "    #return x**4\n",
    "    return x**8\n",
    "    #return x**12\n",
    "    #return x**2\n",
    "    #return np.exp(-1./(np.abs(x)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "bf1972fd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "/* global mpl */\n",
       "window.mpl = {};\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(\n",
       "            '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",
       "\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 = document.createElement('div');\n",
       "    this.root.setAttribute('style', 'display: inline-block');\n",
       "    this._root_extra_style(this.root);\n",
       "\n",
       "    parent_element.appendChild(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 (fig.ratio !== 1) {\n",
       "            fig.send_message('set_device_pixel_ratio', {\n",
       "                device_pixel_ratio: fig.ratio,\n",
       "            });\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 = document.createElement('div');\n",
       "    titlebar.classList =\n",
       "        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
       "    var titletext = document.createElement('div');\n",
       "    titletext.classList = 'ui-dialog-title';\n",
       "    titletext.setAttribute(\n",
       "        'style',\n",
       "        'width: 100%; text-align: center; padding: 3px;'\n",
       "    );\n",
       "    titlebar.appendChild(titletext);\n",
       "    this.root.appendChild(titlebar);\n",
       "    this.header = titletext;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function () {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = (this.canvas_div = document.createElement('div'));\n",
       "    canvas_div.setAttribute(\n",
       "        'style',\n",
       "        'border: 1px solid #ddd;' +\n",
       "            'box-sizing: content-box;' +\n",
       "            'clear: both;' +\n",
       "            'min-height: 1px;' +\n",
       "            'min-width: 1px;' +\n",
       "            'outline: 0;' +\n",
       "            'overflow: hidden;' +\n",
       "            'position: relative;' +\n",
       "            'resize: both;'\n",
       "    );\n",
       "\n",
       "    function on_keyboard_event_closure(name) {\n",
       "        return function (event) {\n",
       "            return fig.key_event(event, name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    canvas_div.addEventListener(\n",
       "        'keydown',\n",
       "        on_keyboard_event_closure('key_press')\n",
       "    );\n",
       "    canvas_div.addEventListener(\n",
       "        'keyup',\n",
       "        on_keyboard_event_closure('key_release')\n",
       "    );\n",
       "\n",
       "    this._canvas_extra_style(canvas_div);\n",
       "    this.root.appendChild(canvas_div);\n",
       "\n",
       "    var canvas = (this.canvas = document.createElement('canvas'));\n",
       "    canvas.classList.add('mpl-canvas');\n",
       "    canvas.setAttribute('style', 'box-sizing: content-box;');\n",
       "\n",
       "    this.context = canvas.getContext('2d');\n",
       "\n",
       "    var backingStore =\n",
       "        this.context.backingStorePixelRatio ||\n",
       "        this.context.webkitBackingStorePixelRatio ||\n",
       "        this.context.mozBackingStorePixelRatio ||\n",
       "        this.context.msBackingStorePixelRatio ||\n",
       "        this.context.oBackingStorePixelRatio ||\n",
       "        this.context.backingStorePixelRatio ||\n",
       "        1;\n",
       "\n",
       "    this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
       "        'canvas'\n",
       "    ));\n",
       "    rubberband_canvas.setAttribute(\n",
       "        'style',\n",
       "        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
       "    );\n",
       "\n",
       "    // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
       "    if (this.ResizeObserver === undefined) {\n",
       "        if (window.ResizeObserver !== undefined) {\n",
       "            this.ResizeObserver = window.ResizeObserver;\n",
       "        } else {\n",
       "            var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
       "            this.ResizeObserver = obs.ResizeObserver;\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
       "        var nentries = entries.length;\n",
       "        for (var i = 0; i < nentries; i++) {\n",
       "            var entry = entries[i];\n",
       "            var width, height;\n",
       "            if (entry.contentBoxSize) {\n",
       "                if (entry.contentBoxSize instanceof Array) {\n",
       "                    // Chrome 84 implements new version of spec.\n",
       "                    width = entry.contentBoxSize[0].inlineSize;\n",
       "                    height = entry.contentBoxSize[0].blockSize;\n",
       "                } else {\n",
       "                    // Firefox implements old version of spec.\n",
       "                    width = entry.contentBoxSize.inlineSize;\n",
       "                    height = entry.contentBoxSize.blockSize;\n",
       "                }\n",
       "            } else {\n",
       "                // Chrome <84 implements even older version of spec.\n",
       "                width = entry.contentRect.width;\n",
       "                height = entry.contentRect.height;\n",
       "            }\n",
       "\n",
       "            // Keep the size of the canvas and rubber band canvas in sync with\n",
       "            // the canvas container.\n",
       "            if (entry.devicePixelContentBoxSize) {\n",
       "                // Chrome 84 implements new version of spec.\n",
       "                canvas.setAttribute(\n",
       "                    'width',\n",
       "                    entry.devicePixelContentBoxSize[0].inlineSize\n",
       "                );\n",
       "                canvas.setAttribute(\n",
       "                    'height',\n",
       "                    entry.devicePixelContentBoxSize[0].blockSize\n",
       "                );\n",
       "            } else {\n",
       "                canvas.setAttribute('width', width * fig.ratio);\n",
       "                canvas.setAttribute('height', height * fig.ratio);\n",
       "            }\n",
       "            canvas.setAttribute(\n",
       "                'style',\n",
       "                'width: ' + width + 'px; height: ' + height + 'px;'\n",
       "            );\n",
       "\n",
       "            rubberband_canvas.setAttribute('width', width);\n",
       "            rubberband_canvas.setAttribute('height', height);\n",
       "\n",
       "            // And update the size in Python. We ignore the initial 0/0 size\n",
       "            // that occurs as the element is placed into the DOM, which should\n",
       "            // otherwise not happen due to the minimum size styling.\n",
       "            if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
       "                fig.request_resize(width, height);\n",
       "            }\n",
       "        }\n",
       "    });\n",
       "    this.resizeObserverInstance.observe(canvas_div);\n",
       "\n",
       "    function on_mouse_event_closure(name) {\n",
       "        return function (event) {\n",
       "            return fig.mouse_event(event, name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mousedown',\n",
       "        on_mouse_event_closure('button_press')\n",
       "    );\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mouseup',\n",
       "        on_mouse_event_closure('button_release')\n",
       "    );\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'dblclick',\n",
       "        on_mouse_event_closure('dblclick')\n",
       "    );\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mousemove',\n",
       "        on_mouse_event_closure('motion_notify')\n",
       "    );\n",
       "\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mouseenter',\n",
       "        on_mouse_event_closure('figure_enter')\n",
       "    );\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mouseleave',\n",
       "        on_mouse_event_closure('figure_leave')\n",
       "    );\n",
       "\n",
       "    canvas_div.addEventListener('wheel', function (event) {\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        on_mouse_event_closure('scroll')(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.appendChild(canvas);\n",
       "    canvas_div.appendChild(rubberband_canvas);\n",
       "\n",
       "    this.rubberband_context = rubberband_canvas.getContext('2d');\n",
       "    this.rubberband_context.strokeStyle = '#000000';\n",
       "\n",
       "    this._resize_canvas = function (width, height, forward) {\n",
       "        if (forward) {\n",
       "            canvas_div.style.width = width + 'px';\n",
       "            canvas_div.style.height = height + 'px';\n",
       "        }\n",
       "    };\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
       "        event.preventDefault();\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 toolbar = document.createElement('div');\n",
       "    toolbar.classList = 'mpl-toolbar';\n",
       "    this.root.appendChild(toolbar);\n",
       "\n",
       "    function on_click_closure(name) {\n",
       "        return function (_event) {\n",
       "            return fig.toolbar_button_onclick(name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    function on_mouseover_closure(tooltip) {\n",
       "        return function (event) {\n",
       "            if (!event.currentTarget.disabled) {\n",
       "                return fig.toolbar_button_onmouseover(tooltip);\n",
       "            }\n",
       "        };\n",
       "    }\n",
       "\n",
       "    fig.buttons = {};\n",
       "    var buttonGroup = document.createElement('div');\n",
       "    buttonGroup.classList = 'mpl-button-group';\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",
       "            /* Instead of a spacer, we start a new button group. */\n",
       "            if (buttonGroup.hasChildNodes()) {\n",
       "                toolbar.appendChild(buttonGroup);\n",
       "            }\n",
       "            buttonGroup = document.createElement('div');\n",
       "            buttonGroup.classList = 'mpl-button-group';\n",
       "            continue;\n",
       "        }\n",
       "\n",
       "        var button = (fig.buttons[name] = document.createElement('button'));\n",
       "        button.classList = 'mpl-widget';\n",
       "        button.setAttribute('role', 'button');\n",
       "        button.setAttribute('aria-disabled', 'false');\n",
       "        button.addEventListener('click', on_click_closure(method_name));\n",
       "        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
       "\n",
       "        var icon_img = document.createElement('img');\n",
       "        icon_img.src = '_images/' + image + '.png';\n",
       "        icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
       "        icon_img.alt = tooltip;\n",
       "        button.appendChild(icon_img);\n",
       "\n",
       "        buttonGroup.appendChild(button);\n",
       "    }\n",
       "\n",
       "    if (buttonGroup.hasChildNodes()) {\n",
       "        toolbar.appendChild(buttonGroup);\n",
       "    }\n",
       "\n",
       "    var fmt_picker = document.createElement('select');\n",
       "    fmt_picker.classList = 'mpl-widget';\n",
       "    toolbar.appendChild(fmt_picker);\n",
       "    this.format_dropdown = fmt_picker;\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = document.createElement('option');\n",
       "        option.selected = fmt === mpl.default_extension;\n",
       "        option.innerHTML = fmt;\n",
       "        fmt_picker.appendChild(option);\n",
       "    }\n",
       "\n",
       "    var status_bar = document.createElement('span');\n",
       "    status_bar.classList = 'mpl-message';\n",
       "    toolbar.appendChild(status_bar);\n",
       "    this.message = status_bar;\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",
       "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",
       "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], msg['forward']);\n",
       "        fig.send_message('refresh', {});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
       "    var x0 = msg['x0'] / fig.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
       "    var x1 = msg['x1'] / fig.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / fig.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,\n",
       "        0,\n",
       "        fig.canvas.width / fig.ratio,\n",
       "        fig.canvas.height / fig.ratio\n",
       "    );\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",
       "    fig.rubberband_canvas.style.cursor = msg['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.handle_history_buttons = function (fig, msg) {\n",
       "    for (var key in msg) {\n",
       "        if (!(key in fig.buttons)) {\n",
       "            continue;\n",
       "        }\n",
       "        fig.buttons[key].disabled = !msg[key];\n",
       "        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
       "    if (msg['mode'] === 'PAN') {\n",
       "        fig.buttons['Pan'].classList.add('active');\n",
       "        fig.buttons['Zoom'].classList.remove('active');\n",
       "    } else if (msg['mode'] === 'ZOOM') {\n",
       "        fig.buttons['Pan'].classList.remove('active');\n",
       "        fig.buttons['Zoom'].classList.add('active');\n",
       "    } else {\n",
       "        fig.buttons['Pan'].classList.remove('active');\n",
       "        fig.buttons['Zoom'].classList.remove('active');\n",
       "    }\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",
       "            var img = evt.data;\n",
       "            if (img.type !== 'image/png') {\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",
       "                img.type = 'image/png';\n",
       "            }\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",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                img\n",
       "            );\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        } else if (\n",
       "            typeof evt.data === 'string' &&\n",
       "            evt.data.slice(0, 21) === 'data:image/png;base64'\n",
       "        ) {\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(\n",
       "                \"No handler for the '\" + msg_type + \"' message type: \",\n",
       "                msg\n",
       "            );\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(\n",
       "                    \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
       "                    e,\n",
       "                    e.stack,\n",
       "                    msg\n",
       "                );\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "};\n",
       "\n",
       "// from https://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",
       "    }\n",
       "    if (e.target) {\n",
       "        targ = e.target;\n",
       "    } else if (e.srcElement) {\n",
       "        targ = e.srcElement;\n",
       "    }\n",
       "    if (targ.nodeType === 3) {\n",
       "        // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "    }\n",
       "\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    var boundingRect = targ.getBoundingClientRect();\n",
       "    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
       "    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\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",
       " * https://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",
       "        }\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",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * this.ratio;\n",
       "    var y = canvas_pos.y * this.ratio;\n",
       "\n",
       "    this.send_message(name, {\n",
       "        x: x,\n",
       "        y: y,\n",
       "        button: event.button,\n",
       "        step: event.step,\n",
       "        guiEvent: simpleKeys(event),\n",
       "    });\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",
       "    // Prevent repeat events\n",
       "    if (name === 'key_press') {\n",
       "        if (event.key === this._key) {\n",
       "            return;\n",
       "        } else {\n",
       "            this._key = event.key;\n",
       "        }\n",
       "    }\n",
       "    if (name === 'key_release') {\n",
       "        this._key = null;\n",
       "    }\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.key !== 'Control') {\n",
       "        value += 'ctrl+';\n",
       "    }\n",
       "    else if (event.altKey && event.key !== 'Alt') {\n",
       "        value += 'alt+';\n",
       "    }\n",
       "    else if (event.shiftKey && event.key !== 'Shift') {\n",
       "        value += 'shift+';\n",
       "    }\n",
       "\n",
       "    value += 'k' + event.key;\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, { key: value, 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",
       "\n",
       "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
       "// prettier-ignore\n",
       "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\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\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";/* global mpl */\n",
       "\n",
       "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.binaryType = comm.kernel.ws.binaryType;\n",
       "    ws.readyState = comm.kernel.ws.readyState;\n",
       "    function updateReadyState(_event) {\n",
       "        if (comm.kernel.ws) {\n",
       "            ws.readyState = comm.kernel.ws.readyState;\n",
       "        } else {\n",
       "            ws.readyState = 3; // Closed state.\n",
       "        }\n",
       "    }\n",
       "    comm.kernel.ws.addEventListener('open', updateReadyState);\n",
       "    comm.kernel.ws.addEventListener('close', updateReadyState);\n",
       "    comm.kernel.ws.addEventListener('error', updateReadyState);\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",
       "        var data = msg['content']['data'];\n",
       "        if (data['blob'] !== undefined) {\n",
       "            data = {\n",
       "                data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
       "            };\n",
       "        }\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(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 = document.getElementById(id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm);\n",
       "\n",
       "    function ondownload(figure, _format) {\n",
       "        window.open(figure.canvas.toDataURL());\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\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;\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",
       "    fig.cell_info[0].output_area.element.on(\n",
       "        'cleared',\n",
       "        { fig: fig },\n",
       "        fig._remove_fig_handler\n",
       "    );\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
       "    var width = fig.canvas.width / fig.ratio;\n",
       "    fig.cell_info[0].output_area.element.off(\n",
       "        'cleared',\n",
       "        fig._remove_fig_handler\n",
       "    );\n",
       "    fig.resizeObserverInstance.unobserve(fig.canvas_div);\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.innerHTML =\n",
       "        '<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 / this.ratio;\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] =\n",
       "        '<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 () {\n",
       "        fig.push_to_output();\n",
       "    }, 1000);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function () {\n",
       "    var fig = this;\n",
       "\n",
       "    var toolbar = document.createElement('div');\n",
       "    toolbar.classList = 'btn-toolbar';\n",
       "    this.root.appendChild(toolbar);\n",
       "\n",
       "    function on_click_closure(name) {\n",
       "        return function (_event) {\n",
       "            return fig.toolbar_button_onclick(name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    function on_mouseover_closure(tooltip) {\n",
       "        return function (event) {\n",
       "            if (!event.currentTarget.disabled) {\n",
       "                return fig.toolbar_button_onmouseover(tooltip);\n",
       "            }\n",
       "        };\n",
       "    }\n",
       "\n",
       "    fig.buttons = {};\n",
       "    var buttonGroup = document.createElement('div');\n",
       "    buttonGroup.classList = 'btn-group';\n",
       "    var button;\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",
       "            /* Instead of a spacer, we start a new button group. */\n",
       "            if (buttonGroup.hasChildNodes()) {\n",
       "                toolbar.appendChild(buttonGroup);\n",
       "            }\n",
       "            buttonGroup = document.createElement('div');\n",
       "            buttonGroup.classList = 'btn-group';\n",
       "            continue;\n",
       "        }\n",
       "\n",
       "        button = fig.buttons[name] = document.createElement('button');\n",
       "        button.classList = 'btn btn-default';\n",
       "        button.href = '#';\n",
       "        button.title = name;\n",
       "        button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
       "        button.addEventListener('click', on_click_closure(method_name));\n",
       "        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
       "        buttonGroup.appendChild(button);\n",
       "    }\n",
       "\n",
       "    if (buttonGroup.hasChildNodes()) {\n",
       "        toolbar.appendChild(buttonGroup);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = document.createElement('span');\n",
       "    status_bar.classList = 'mpl-message pull-right';\n",
       "    toolbar.appendChild(status_bar);\n",
       "    this.message = status_bar;\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = document.createElement('div');\n",
       "    buttongrp.classList = 'btn-group inline pull-right';\n",
       "    button = document.createElement('button');\n",
       "    button.classList = 'btn btn-mini btn-primary';\n",
       "    button.href = '#';\n",
       "    button.title = 'Stop Interaction';\n",
       "    button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
       "    button.addEventListener('click', function (_evt) {\n",
       "        fig.handle_close(fig, {});\n",
       "    });\n",
       "    button.addEventListener(\n",
       "        'mouseover',\n",
       "        on_mouseover_closure('Stop Interaction')\n",
       "    );\n",
       "    buttongrp.appendChild(button);\n",
       "    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
       "    titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
       "    var fig = event.data.fig;\n",
       "    if (event.target !== this) {\n",
       "        // Ignore bubbled events from children.\n",
       "        return;\n",
       "    }\n",
       "    fig.close_ws(fig, {});\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function (el) {\n",
       "    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
       "    // this is important to make the div 'focusable\n",
       "    el.setAttribute('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",
       "    } else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which === 13) {\n",
       "        this.canvas_div.blur();\n",
       "        // select the cell after this one\n",
       "        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
       "        IPython.notebook.select(index + 1);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "};\n",
       "\n",
       "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(\n",
       "        'matplotlib',\n",
       "        mpl.mpl_figure_comm\n",
       "    );\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4Xux9B5gWRdb1gWFAchpylpyz5DgkcVcQdgFxRVHAxQiSFCRJElGMKGAABAET4ILkMOSc0yA555zT8HW/foMwDEx3V92uemtuP88+/v9H3Vv3nHu660y/3dUJ7lgH+GAGmAFmgBlgBpgBZoAZiDcMJGADGG96zUCZAWaAGWAGmAFmgBkIMMAGkIXADDADzAAzwAwwA8xAPGOADWA8azjDZQaYAWaAGWAGmAFmgA0ga4AZYAaYAWaAGWAGmIF4xgAbwHjWcIbLDDADzAAzwAwwA8wAG0DWADPADDADzAAzwAwwA/GMATaA8azhDJcZYAaYAWaAGWAGmAE2gKwBZoAZYAaYAWaAGWAG4hkDbADjWcMZLjPADDADzAAzwAwwA2wAWQPMADPADDADzAAzwAzEMwbYAMazhjNcZoAZYAaYAWaAGWAG2ACyBpgBZoAZYAaYAWaAGYhnDLABjGcNZ7jMADPADDADzAAzwAywAWQNMAPMADPADDADzAAzEM8YYAMYzxrOcJkBZoAZYAaYAWaAGWADyBpgBpgBZoAZYAaYAWYgnjHABjCeNZzhMgPMADPADDADzAAzwAaQNcAMMAPMADPADDADzEA8Y4ANYDxrOMNlBpgBZoAZYAaYAWaADSBrgBlgBpgBZoAZYAaYgXjGABvAeNZwhssMMAPMADPADDADzAAbQNYAM8AMMAPMADPADDAD8YwBNoDxrOEMlxlgBpgBZoAZYAaYATaArAFmgBlgBpgBZoAZYAbiGQNsAONZwxkuM8AMMAPMADPADDADbABZA8wAM8AMMAPMADPADMQzBtgAxrOGM1xmgBlgBpgBZoAZYAbYALIGmAFmgBlgBpgBZoAZiGcMsAGMZw1nuMwAM8AMMAPMADPADLABZA0wA8wAM8AMMAPMADMQzxhgAxjPGs5wmQFmgBlgBpgBZoAZYAPIGmAGmAFmgBlgBpgBZiCeMcAGMJ41nOEyA8wAM8AMMAPMADPABpA1wAwwA8wAM8AMMAPMQDxjgA1gPGs4w2UGmAFmgBlgBpgBZoANIGuAGWAGmAFmgBlgBpiBeMYAG8B41nCGywwwA8wAM8AMMAPMABtA1gAzwAwwA8wAM8AMMAPxjAE2gPGs4QyXGWAGmAFmgBlgBpgBNoCsAWaAGWAGmAFmgBlgBuIZA2wA41nDGS4zwAwwA8wAM8AMMANsAFkDzAAzwAwwA8wAM8AMxDMG2ADGs4YzXGaAGWAGmAFmgBlgBtgAsgaYAWaAGWAGmAFmgBmIZwywAYxnDWe4zAAzwAwwA8wAM8AMsAFkDTADzAAzwAwwA8wAMxDPGGADGM8aznCZAWaAGWAGmAFmgBlgA8gaYAaYAWaAGWAGmAFmIJ4xwAYwnjWc4TIDzAAzwAwwA8wAM8AGkDXADDADzAAzwAwwA8xAPGOADWA8azjDZQaYAWaAGWAGmAFmgA0ga4AZYAaYAWaAGWAGmIF4xgAbwHjWcIbLDDADzAAzwAwwA8wAG0DWADPADDADzAAzwAwwA/GMATaA8azhDJcZYAaYAWaAGWAGmAE2gKwBZoAZYAaYAWaAGWAG4hkDbAAFGh4VFYUjR44gZcqUSJAggUAmDmUGmAFmgBlgBpgBvxi4c+cOLl68iKxZsyJhwoR+TavVPGwABdpx6NAh5MiRQyADhzIDzAAzwAwwA8yAKgYOHjyI7Nmzq5pe6bxsAAXoP3/+PNKkSQNbQKlSpRLI9GDozZs3MXv2bNSrVw+hoaFSc+uQjPHp0AWxGriHYvypjja9fza/pmNkfN7PogsXLgRu4Jw7dw6pU6f2niiII9kACjTPFpAtHNsIUhjA6dOno2HDhsYaQMYnID4NQu3Fh3uoQSM8lmB6/6INIGvUo0A0CKPUKOX6rQF1jkpgA+iIptgHUQqIUvgCkKWFMj5pVCpLxD1URr2UiU3vHxtAKTJRmoRSo5Trt1LSXEzOBtAFWTGHUgqIUvgCkKWFMj5pVCpLxD1URr2UiU3vHxtAKTJRmoRSo5Trt1LSXEzOBtAFWWwABciKEUp5Ysur0nsm0/Hx4updG7pEskZ16YT3OkzvISU+NoAAG0Dv5x4oBUQpfAHI0kIZnzQqlSXiHiqjXsrEpveP/0iRIhOlSSg1Srl+KyXNxeRsAF2QxXcABcjiO4DyyNMkE+XFWQeIjE+HLojVwD0U4091NGX/2ADyHUAhfVMKiFL4QqAlBTM+SUQqTMM9VEi+hKlN7x/fAZQgEsUpKDVKuX4rps3x9HwH0DFVDw6kFBCl8AUgSwtlfNKoVJaIe6iMeikTm94/NoBSZKI0CaVGKddvpaS5mJwNoAuyYg6lFBCl8AUgSwtlfNKoVJaIe6iMeikTm94/NoBSZKI0CaVGKddvpaS5mJwNoAuy2AAKkBUjlPLEllel90ym4+PF1bs2dIlkjerSCe91mN5DSnxsAPkZQO9nnhVJKSBK4QuBlhTM+CQRqTAN91Ah+RKmNr1//EeKBJEoTkGpUcr1WzFtjqfnO4COqXpwIKWAKIUvAFlaKOOTRqWyRNxDZdRLmdj0/rEBlCITpUkoNUq5fislzcXkbABdkBVzKKWAKIUvAFlaKOOTRqWyRNxDZdRLmdj0/rEBlCITpUkoNUq5fislzcXkbABdkOWXAZy55Sj+2HQEqS4fRp8Xn0RoaKhAlXqGUp7YOiA2HR8vrjqoTKwG1qgYfzpEm97DiSv34ZfFm9G6Tmn8o1R2qZSzAeRnAIUERSWgz+buxCdz/0TljFEY80YDNoBCXVITbPqFmQ2gGl3JnJU1KpNNNblM72G3XzfgpzWH8VbtvOhYr5BUkqnWb6lFEifjO4ACBFMJaNyK/XhvyhYUTxuFSW+zARRokbJQ0y/MbACVSUvaxKxRaVQqS2R6D18evQrzIk/i/acLo1Xlx6XyTLV+Sy2SOBkbQAGCqQRk/wT833HrkCflHczuWp/vAAr0SFWo6RdmNoCqlCVvXtaoPC5VZTK9h42HLcGGg+cx7NmSeKok/wQsW2dsAAUYpTKAq/edwb+HL0dYkjtY/h4bQIEWKQs1/cLMBlCZtKRNzBqVRqWyRKb3sNrg+Th49ip+avsEKuTNIJVnqvVbapHEyYLSAA4aNAiTJk1CZGQkkiZNisqVK2Pw4MEoWLDgXbpefPFFjBkz5j76KlSogBUrVtz9v12/fh2dO3fGhAkTcPXqVYSHh+Orr75C9uzO/tKgEtDeU5dR66MIJAm5gy192AASnwMk6U2/MLMBJJGNr0lZo77STTKZ6T0s0msmrty4jbkdqiJf5tRSOaRav6UWSZwsKA1ggwYN0KJFC5QvXx63bt1Cjx49sHnzZmzbtg3JkycPUGYbwOPHj2PUqFF3KUycODHSpUt39//fvn17TJ06FaNHj0b69OnRqVMnnDlzBmvXrkVISEic1FMJ6MK1myjRZ3Zg/s29wpEy2WNx1hJsA0y/cJmOjw1gsJ1xD9bLGuUe6szAlRu3UKTXrECJ69+rjbQpkkotl2r9llokcbKgNIAxOTl58iQyZsyIhQsXonr16ncN4Llz5zBlypRYKTx//jwyZMiAsWPHonnz5oExR44cQY4cOTB9+nTUr18/TuqpBHTnzh0UeG8Gbt6+g4WdqiFXhlRx1hJsA0xffEzHxwYw2M44NoC8nVZwafbgmSuo9uEChCa4g61968G+gSPzoFq/ZdZIncsIA7hr1y7kz58/cBewWLFidw2gbf5s0aRJkwY1atTAgAEDAkbRPubPnx/4yde+45c2bdq7PJcsWRKNGzdG3759H+De/snY/l/0YQvINoynTp1CqlRyTVq1IQtx7MJ1/PRyWZTJnZ5aB77ntw3SnDlzULduXWNfcjEZX7QBNBkja9T3y4L0CbmH0in1LeGGg+fw75GrkDbxHSx9p7b0dcJev8PCwmDfDJK9fvtGkuBEQW8A7btljRo1wtmzZ7F48eK7dPz0009IkSIFcuXKhb1796Jnz56Bn4vtn3eTJEmC8ePHo3Xr1vcZOju4Xr16yJMnD0aMGPEAtX369InVGNq5kiVLJtiK+8M/2hSCg5cToF2h2yia9o7U3JyMGWAGmAFmgBnQmYEtZxLgmx0hyJn8DjqVuC291CtXrqBly5ZsAKUz62PC1157DX/88QeWLFnyyJc3jh49GjCDEydORJMmTR5qAO07Unnz5sXw4cOV3gF8acwaLN51Bv2fLoTm5XP6yKg/U/Ff5v7wTDkL95CSXfrcpveP71LTa4hyhp/XHEKP37ehSJoo/PpmON8BJCA7qO8AvvHGG4Fn/BYtWhS4axfXYf9M3KZNG3Tr1s3TT8Ax81M+Q9Dxp/WYvP4IOtfNj9fDC8QFLej+3fRn5EzHF7242s/LNmzYUPrFWQdBm95D0/GxRnU4i7zXMGzBLgyZtQMVMkRh3JvyP4hAuX57R+1vZFAaQPtnX9v8TZ48GREREYHn/+I6Tp8+jWzZsmHkyJFo1apV4Lav/RLIuHHj0KxZs0C4fZfQ3gJG9Usgdi39p23Ft0v2oXXlXOj99F/PNZp0mL74mI6PF9fgPxtZo9xDnRnoO3UrRi3dhzpZo/B1ezaAFL0KSgP46quvBn7C/f333+/b+y916tSBfQEvXboE+3m9pk2bIkuWLNi3bx+6d++OAwcOYPv27UiZMmWAS3sbmGnTpgW2gbG3h7H3BLSNouptYOzahkfsxAcz/8TTJbLg85ZlKHqvNKfpi4/p+NgAKj19pEzOGpVCo9IkJvfwjQnrMXXjETTOdRtD2jwp/VcGvgMIBKUBTJAgQawnnb3nn73/n72ps/0m7/r162FvBWObwFq1aqFfv36Bt3ajj2vXrqFLly4BM3nvRtD3jnnU2U0poF9W70eX37agSt70+LFtRaUXGYrJTb5wxQdzFB8wskYpznx/c3IP/eVb5mwtv1mBZbtP4/l8t9HrBTaAMrmNzhWUBpCCCC85KQ3g/G1H8dIP61Aoc0rM7PDX3oYmHXxhDv5ucg+Du4em94//SAlufdb/ZBF2HL+IVwvfRseWbAApuskGUIBVSgO4Yf9pNP56BTKkSIzV79UVqFLPUNMXH9Px8eKq53nlpirWqBu29Bxrcg/L9puD05dvoGuJW2j7b/kvmlGu33qq5cGq2AAKdIpSQIdOX0TVIYsQkjABdvZ/Egmt/5p0mHzhig/mKD5gZI0G/xWHexicPbwddQf5ekyH9b4n+pW9hRaN2QBSdJINoACrlAbw8tXrKNp3bqC69T3rIm1yuZ/BEYAtJZQvzFJoVJqEe6iUfuHJTe8f/5EiLBFlCU5evI7yA+bCftz/4wq38M+n2ABSNIMNoACrlAbQvjiX7DMLV24nwNy3qyNfxr/eXDblMH3xMR0fL67BfyayRrmHujIQeewCGny6GGmThaJPyaske41Srt+68hqzLjaAAp2iFJB9ca4yYBZOXEuACdZbwJWst4FNOkxffEzHxwYw+M9G1ij3UFcGlu46hee+XYn8GZPj9bzn2QASNYoNoACx1AawwYezsPtiAnzZsjT+USKrQKX6hZq++JiOjw2gfueU24pYo24Z02+8qT38fcNhvDVxAyrmSYtnM59kA0gkPTaAAsRSG8B/fzITG84kRN+ni+KFyrkFKtUv1NQLVzTTpuNjA6jfOeW2ItaoW8b0G29qD79bshf9pm3DU8Uzo16KQ2wAiaTHBlCAWGoD2PrLmVhyPCHerJ0Pb9crKFCpfqGmXrjYAOqnNa8VsUa9MqdPHPdQn164qeTDmZH4KmI3WlXMibIJ9rABdEOei7FsAF2QFXMotQF8Y8QMzDwUgmefyIlBTYoLVKpfKF+Y9euJ24q4h24Z02u86f3ju9R66c1NNV1/3Yif1xxCx/B8yH0lkg2gG/JcjGUD6IIsvw1g9+9n4Je9IahXJBNGtionUKl+oaYvPqbj48VVv3PKbUWsUbeM6Tfe1B6+PHo15kWewIBGRZDixCY2gETSYwMoQCz1HcBBY2fg+z9DUDZXWvzWvrJApfqFmnrhimbadHxsAPU7p9xWxBp1y5h+403tYaMvl2DjofMY3rIUru9dwwaQSHpsAAWIpTaAX0ycjs+3JkLOdMmwqGstgUr1CzX1wsUGUD+tea2INeqVOX3iuIf69MJNJVU+mI/D567i53ZP4OjmZWwA3ZDnYiwbQBdk+f0T8JjfpqP/hkRIljgE295vIFCpfqF8YdavJ24r4h66ZUyv8ab3j+9S66U3p9Xcsb7/VrjXTFy7GYX5b1fF5uURbACdkudyHBtAl4TdO5z6DuDkqdPRdVWiwJRb+9ZH8iR//b9NOExffEzHx4tr8J+FrFHuoY4MXLp+C8V6zwqUtrFnbUTMnc0GkKhRbAAFiKU2gNOnT8e7a5Pgyo3biOhcE7nDkgtUq1eo6YuP6fjYAOp1PnmphjXqhTW9Ykzs4f7Tl1FjSETgl6+NPcNhr4MNG/K3gCmUxwZQgFU/DODHO1LiwJmr+OW/lVA+dzqBavUKNfHCdS/DpuNjA6jX+eSlGtaoF9b0ijGxh2v3n0XTr5chR7qkmN+xGhtAQsmxARQg1w8D+MPhMKw9cA5fPVcGDYtnEahWr1ATL1xsAPXSmGg1rFFRBtXHcw/V98BtBbO2HsMrY9eiVI40+MV6CYTvALpl0Pl4NoDOuXpgpB8GcPr5rJi17YRxn4PjC7OA8DQJ5R5q0giPZZjeP75L7VEYisPGrtiPnlO2BPa/HfZsSTaAhP1gAyhArh8GcHVUHoxbeRCv18qHzvXN+Ryc6YuP6fh4cRW4cGgSyhrVpBECZZjYw6Fz/sTn83biuQo50ecfhdgACugjrlA2gHEx9Ih/98MA7k1WCJ/O24Xm5XJg8L9KCFSrV6iJFy7+CVgvjYlWwxoVZVB9PPdQfQ/cVvDupE2YsOogOtYpgFdr5GYD6JZAF+PZALogK+ZQPwzgpYwl0OP3bahdKCO+f7G8QLV6hfKFWa9+eKmGe+iFNX1iTO8f36XWR2tuKmkzZjXmbj+Bgc8Ux7/LZGED6IY8l2PZALok7N7hfhjAx/KWxyvj1qN4ttSY+kZVgWr1CjV98TEdHy+uep1PXqphjXphTa8YE3sY/Rm4b1qVQ8386dgAEkqODaAAuX4YwBwlq6DJ8JXInOoxrOgeLlCtXqEmXrjuZdh0fGwA9TqfvFTDGvXCml4xJvaw0qB5OHr+Gn5/rQqKZE7OBpBQcmwABcj1wwCWrlIb1T9ahEQJE+DP/k8iofVfEw4TL1xsAE1Q5t8YWKPB30/uYXD1MCrqDgr2nIGbt+9g2Tu1kSF5IjaAhC1kAyhArh8GsE69Bijad26gynU96yJd8sQCFesTyhdmfXrhtRLuoVfm9IgzvX98l1oPnbmp4szlGyjTb04gxL7hkeDObTaAbgh0OZYNoEvC7h3uhwG0P4HzxKAFOHvlJmZ1qI6CmVMKVKxPqOmLj+n4eHHV51zyWglr1Ctz+sSZ1sMdxy6i/qeLkDZZKNb3qgdKfJTrtz4KeXQlbAAFOkUpoHuF/9SXy/Dn8UsY93IFVM0fJlCxPqGUJ7YOKE3HxwZQB5WJ1cAaFeNPh2jTerhk5yn857uVKJApBWZ3rMEGkFhkbAAFCPbLAL44Zi2W7jqNT5qXxDOlswtUrE+oaReumMyajo8NoD7nktdKWKNemdMnzrQeTlp3CG//vBFV84VhXJsKbACJpcYGUIBgvwxgl9+2YMqGI+jesBDaVc8rULE+oaZduNgAhuojLkmVsEYlEakwDfdQIfkeph6xcDcGzYi0bnRks254lGID6IFDNyFsAN2wFWOsXwbww9k78c3ivWhbLQ96PFVEoGJ9QvnCrE8vvFbCPfTKnB5xpveP71LroTM3VfSbtg3fLdmLV6o/jncbFmYD6IY8D2PZAHogLTrELwM4avkBDJweicalsuLTFqUFKtYn1PTFx3R8vLjqcy55rYQ16pU5feJM6+GbE9bjfxuP4L2nCqNNtcfZABJLjQ2gAMF+GcBpW46j408bUSVfevzYpqJAxfqEmnbhisms6fjYAOpzLnmthDXqlTl94kzrYYuRy7Fizxl81qIUGpXKxgaQWGpsAAUI9ssArtx3/r43owRK1ibUtAsXG0B+BlCbk8thIaafg/xHikMhaDQs/OMI7D55GePbVkDlvGFsAIl7wwZQgGC/DOCe09fu2xtJoGRtQk1ffEzHx4urNqeS50JYo56p0ybQtB6W6DMLF67dwty3qyNfxpRsAImVxgZQgGC/DOClG3dQ+p7d0RMnSihQtR6hpl24+A4g3wHU48xyXoXp5yD/keJcCzqMvHbzNgr1nBkoZWPvekidNJQNIHFj2AAKEOyXAQwJSXT3+4jL362NLKmTClStR6jpi4/p+Hhx1eM8EqmCNSrCnh6xJvXw4JkrqPbhAtg3OHb0a4AECRKwASSWGRtAAYL9MoChoaGoNGgejp6/hv+9XgUlsqcRqFqPUJMuXLExajo+NoB6nEciVbBGRdjTI9akHq7dfxZNv16GbGmSYuk7tQMEU+KjXL/1UEfcVbABjJujh46gFFBM4T/95RJsOnQe371QDuGFMwlUrUco5YmtA0LT8VFfnLmH9AywRuk5pp7BpB7O3HIM/x23FqVzpsHkV6uwAaQWj5WfDaAAyX4awJdHr8a8yBP4oElxtHgip0DVeoSadOHiO4ANYd+lNu1gjQZ/R7mHwdPDsSv2o+eULahXJBNGtirHBtCH1rEBFCDZTwP4zm+bMHH1QXSqWwBvhOcXqFqPUL4w69EHkSq4hyLsqY81vX98l1q9xtxUMHT2Dnw+fxeeq5ATA54pzgbQDXkex7IB9EicHeanAfzYOjm+sE6O/1TMif6N/zo5gvkwffExHR8vrsF89v1VO2uUe6gTA+9O2oQJqw6iY50CeKvOXzc5KDVKuX7rxOujamEDKNApSgHFFH707fG61u3xb/7/9rhA6cpDKU9s5eCIL1w64KO+OOuAkTWqQxfEauAeivHnZ3T0Y04Drbt/La27gNTXGMr120/eROZiAyjAHqWAYl64Zm89hnZj16Jk9tT4/fWqAlXrEcoXZj36IFIF91CEPfWxpveP2kCo7yDtHTK/8UW/6PitdYOjjnWjg7p/lOu339x5nY8NoFfmrDhKAcW8OG86dA5Pf7kUmVM9hhXdwwWq1iPU9MXHdHzUF2cdVGp6D03HxxrV4SxyXkPFgfNw7MI1/P5aFZTM8ddWZ5QapVy/naNWO5INoAD/lAKKKfzj1olRwTpBQhImwJ/9nwz8N5gPyhNbB15Mx0d9ceYe0jPAGqXnmHoGU3oYFXUHBd6bgVvWf5dZewBmtfYCpL7GUK7f1H2XlZ8NoACTlAKKeWLfuh0VOEGs8wOreoQjY8rHBCpXH2rKhethTJqOj/rirF6htHcfGJ8/DJh+HpqC79Sl6yjXf6719Q8EbnCEhvz1uVNKfJTrtz/qFp+FDaAAh5QCik34TwyYixMXr2Oq9QxgcetZwGA+KE9sHXgxHR/1xZl7SM8Aa5SeY+oZTOnhlsPn8Y8vliAsRRKsea/OXdoo8VGu39R9l5WfDaAAk5QCik34/7ROkM3WiXLvQ7IC5SsNpTyxlQL7/8lNx8cGUAeVidXAGhXjT4doU3o4P/I4Xhq9BkWzpsIfb1ZjA+iTuNgAChDttwFsM2YN5m4/bm2SWczaLDOXQOXqQ025cD2MSdPxsQFUfw6JVsAaFWVQfbwpPRy/8gC6T96M8EIZ8d2L5dkA+iQtNoACRPttAHtYJ8iP1onypvUlkLetL4IE82HKhYsN4HQ0bMifggvGc9H0c5D/SAkeVX4y5098Nm8nnrU+czrI+txp9EGpUcr1O1iYZwMo0ClKAcUm/M+tE2SodaK0KJ8DHzQtIVC5+lDKE1s9OtqHl3XAx4urLl3wXofp5yBr1Ls2/I6M/tTpvV8Boe4f5frtN39e52MD6JU5K45SQLFdnH9afQDdftuMmgUzYHTrJwQqVx9q+uJjOj7qi7N6hZpv4lmjOqhMrAZTevjiqFWI2HESH1h3/1pYdwH5DqCYLpxGswF0ylQs4/w2gAt2nEDrUatROEsqzHjr7wdlBSAoCzXlwvUwAk3HxwZQ2akjbWLWqDQqlSUypYdPfrYY249ewKjW5VGrYEY2gD4pig2gANF+G0D7BLFPlPTJE2Ntz7oClasPNeXCxQaQnwFUfzZ5q8D0c5D/SPGmCxVRZfrNwZnLNzDdegO4iPUmMN8B9KcLQWkABw0ahEmTJiEyMhJJkyZF5cqVMXjwYBQsWPAua3fu3EHfvn0xcuRInD17FhUqVMCwYcNQtGjRu2OuX7+Ozp07Y8KECbh69SrCw8Px1VdfIXv27I7Y99sA2ieIfaLYh71ZZuJEf22WGYyH6YuP6fh4cQ3Gs+7+mlmj3EMdGLh+6zYKvjczUMo668ZGOusGBxtAfzoTlAawQYMGaNGiBcqXL49bt26hR48e2Lx5M7Zt24bkyZMHmLMN4YABAzB69GgUKFAA/fv3x6JFi7Bjxw6kTJkyMKZ9+/aYOnVqYEz69OnRqVMnnDlzBmvXrkVISEicHfDbANqm1v4ayM3bd7DU+lxOtv//XE6chWo4wPTFx3R8bAA1PKlclsQadUmYhsNN6OHBM1dQ7cMFSGx9/WNH/wbW10D+/swpJT7K9VtDqcRaUlAawJhITp48iYwZM2LhwoWoXr06bKOUNWtWdOjQAd26dQsMt+/2ZcqUKWAMX3nlFZw/fx4ZMmTA2LFj0bx588CYI0eOIEeOHJg+fTrq168fZw8pBfQw4Vf5YD4On7uKSa9WRpmcaeOsUdcBlCe2DphNx8cGUAeVidXAGhXjT4doE3q4dv8ZNP16ObKnTYol3WrfRyslPsr1WwdtOKnBCAO4a9cu5M+fP3AXsFixYtizZw/y5s2LdevWof6FyYUAACAASURBVHTp0nd5aNSoEdKkSYMxY8Zg/vz5gZ987Tt+adP+baRKliyJxo0bB34+juugFNDDhN/kq6VYd+Acvn6uDJ4sniWuErX9d8oTWwfQpuNjA6iDysRqYI2K8adDtAk9/GPTUbw2fh3K5UqLX9tXZgPoo7CC3gDad/tsY2c/57d48eIAdcuWLUOVKlVw+PDhwJ3A6KNdu3bYv38/Zs2ahfHjx6N169aBO4P3HvXq1UOePHkwYsSIB9pgj713vG0A7TuGp06dQqpUfz+4KqN/9ok9Z84c1K1bF6GhoXdTvjFxI2ZuPY6eTxVCq4p/vy4vY04/czwMn581UM5lOr5oAxibRil59TO36T00HR9r1M+zxftco5btx8AZO/Bk0Uz4vEXJBwwg1TXGXr/DwsICvwbKXr+9s+FvZNAbwNdeew1//PEHlixZcvfljWgDaP+kmyXL33fJ2rZti4MHD2LmzJkPNYC24bLvHg4fPvyBTvTp0yfWO4O2mUyWLJkvnfttb0IsOpYQdbJG4Z+5onyZkydhBpgBZoAZYAYoGPh9f0LMP5IQNbJEoUlu/9a0K1euoGXLlmwAKZrqR8433ngDU6ZMCbzcYd+1iz6ofgLW4Q7giEV78dGcnXimVBZ82PTvT+b4wbfMOUy/+2A6Pr67IvNsUJOLNaqGd5mzmtDDt3/ZhKmbjqFr/fxoW/XvdZz6GsN3AIGgvANo/+xrm7/JkycjIiIi8PzfvUf0SyAdO3ZE165dA/9048aNwIsiMV8CGTduHJo1axYYc/To0cBdRJ1fApm07hDe/nkjquYLw7g2FWReS3zNZcKzK48izHR80Rdn+1zhbwH7eupIm4w1Ko1KZYlM6GGLkcuxYs8ZfNaiFBqVynYfl5T4KJ/hVyYIlxMHpQF89dVXAz/h/v777/ft/Zc6derAvoD2YRs9e7/AUaNGBQziwIEDA2Yx5jYw06ZNC2wDky5dusCegKdPn9Z2Gxgb19Jdp/DctyuRL2MKzH27hst26zOc8sTWAaXp+NgA6qAysRpYo2L86RBtQg9rfRSBvacuY0LbiqiUNz0bQB+FFZQG8N59gu7lyjZ7L774YuD/FL0RtP0yx70bQdtvCUcf165dQ5cuXQJm8t6NoO0XO5wclH9BPOzE3nXiEuoMXYiUjyXC5j5xb1XjBIeKMSZcuB7Fm+n42ACqOGvkzskalcunimzB3kN7nS7aexau3LiNBZ1rIk/YX/v4Rh+U+CjXbxVa8DJnUBpAL0ApYigF9DDhX7x2E8X7zA7A2fZ+fSRLnIgCGnlOyhObvHgHE5iOjw2gAxFoPoQ1qnmDHJQX7D28YK1nJR6xnlHio1y/HbROiyFsAAXaQCmghwn/3r+YIqy/mHLH+ItJAI6voZQntq9AHjKZ6fjYAOqgMrEaWKNi/OkQHew93Hn8Iup+suihv2hR4qNcv3XQhpMa2AA6YekhYygF9CjhRz8zMbFdRVR8/P5nJgTg+BpKeWL7CoQNIL8EooPgPNRg+jnIf6R4EIXPIUt2nsJ/vluJ/NYz7XNieaadUqOU67fPNHqejg2gZ+oASgE9SvjPjlyB5XtO49PmpdC49P1vTQnA8TWU8sT2FQgbQDaAOgjOQw2mn4NsAD2IwueQX9ceQudfHr6rBaVGKddvn2n0PB0bQM/UqTOAb/+8AZPWHUa3BoXQvmZeAQTqQilPbHWo/p7ZdHy8uOqgMrEaWKNi/OkQHew9HLZgF4bM2oGmZbLj42b3fwWE+hrDBjBI9wHU4cSza6AU0KNO7CGzIjFswW60qpQL7zf6+61mXXhxUkewX7jiwmg6PuqLc1z8+vHvpvfQdHysUT/OErE5ev2+BT8s349XrRsZXa0bGjEPSo1Srt9irPgXzXcABbimFNCjhD9uxX68N2UL6hTOhG9fKCeAQF0o5YmtDhXfAdSBe1k1sEZlMakuD/dQHfdOZm73wxrM3nbcupFR1LqhkZsNoBPSJI5hAyhApioDOG/7cbw8Zg2KZUuFaW9UE0CgLpQvzOq4lzUz91AWk2rymN4/vgOoRlduZn36yyXYdOg8RjxfFvWLZmYD6IY8CWPZAAqQqMoAbjtyAQ0/X4z0yRNjbc+6AgjUhZq++JiOjxdXdeeOrJlZo7KYVJcn2HtYrv9cnLp0HVNfr4ri2VOzAfRZSmwABQhXZQDPXr6B0v3mBCqP7NcAj4WGCKBQExrsF664WDMdHxvAuBSg/7+zRvXvUVwVBnMPr9+6jYLvzQxAXPNeHYSlSMIGMK6GS/53NoAChKoygPZm0IV7zcS1m1FY2KUmcqW///M5ApB8Cw3mC5cTkkzHxwbQiQr0HsMa1bs/TqoL5h4eOH0F1YcsQOJECbHDupER2ydeKfFRrt9OeqfDGDaAAl2gFFBcwg/2zaDjwifQFi1CTcfHBlALmQkVwRoVok+L4GDu4QprL9sW1p62udIns25k1IqVT0p8lOu3FuJwUAQbQAckPWwIpYDiEn7Lb1Zg2e7T+KR5STxTOrsACjWhceFTU5W8WU3HxwZQnlZUZWKNqmJe3rzB3MPJ6w+h408bra9ZpcPEdpXYAMqTheNMbAAdU/XgQJUGMHoz6C71C+K1WvkEUKgJDeYLlxPGTMfHBtCJCvQewxrVuz9OqgvmHkZvAt3E+prVUOurVrEdlPgo128nvdNhDBtAgS5QCigu4X9k7Z7+pbWL+vMVc6Ff4+DbDDoufAJt0SLUdHxsALWQmVARrFEh+rQIDuYevjdlM8atOIDXrRsYna0bGWwA/ZcUG0ABzlUawB9X7kePyfZm0BmtzaDLC6BQExrMFy4njJmOjw2gExXoPYY1qnd/nFQXzD18efRqzIs8gQHPFMNzFXKxAXTScMlj2AAKEKrSAM6PPI6XRq9B0ayp8MebwbcZdDBfuJxIxnR8bACdqEDvMaxRvfvjpLpg7uGTny3G9qMXMOrF8qhVKCMbQCcNlzyGDaAAoSoNoH3i2CdQOmsz6HVBuBl0MF+4nEjGdHxsAJ2oQO8xrFG9++OkumDuYan3Z+PclZuY2aEaCmVOxQbQScMlj2EDKECoSgN47soNlHo/eDeDDuYLlxPJmI6PDaATFeg9hjWqd3+cVBesPbx643ZgL1v72Ni7HlInDWUD6KThksewARQgVKUBtDeDLtJrFq7evI2IzjWROyy4NoMO1guXU7mYjo8NoFMl6DuONapvb5xWFqw93H3yEsI/XojkiUOwpW/9WDeBpr7GUK7fTvunehwbQIEOUArIyYld+6MI7Dl1GePbVkDlvGECSPwPdYLP/6rkzWg6PuqLs7xOeM9keg9Nx8ca9a596sglO0/hP9+tRL6MKTD37RoPnY5So5TrNzV/svKzARRgklJAToT/3LcrsHTXaQxtVhJNygTXZtBO8Am0Rnmo6fh4cVUuMeECWKPCFCpPEKw9/HnNQXT9dROq5Q/D2JcrsAFUpCQ2gALEqzaAnX7eiN/WHUIwbgYdrBcup3IxHR8bQKdK0Hcca1Tf3jitLFh7+Nncnfhk7p9oXi4HBv+rBBtApw2XPI4NoAChqg3gx7N34Iv5u/CfijnRv3FxAST+hwbrhcspU6bjYwPoVAn6jmON6tsbp5UFaw/f+W0TJq4+iA518lv/K8AG0GnDJY9jAyhAqGoDOH7lAXSfvBnh1h5K31l7KQXTEawXLqccm46PDaBTJeg7jjWqb2+cVhasPWz1/Sos+vMkPmxaAs3K52AD6LThksexARQgVLUBXGDtot7a2k29cJZUmPFWcG0GHawXLqdyMR0fG0CnStB3HGtU3944rSxYe1h36ELsPHHJev7vCes5wAxsAJ02XPI4NoAChKo2gJHHLqDBp4uRJlkoNvSqJ4DE/9BgvXA5Zcp0fGwAnSpB33GsUX1747SyYO1hsd6zcOn6rcAbwPabwA87KPFRrt9O+6d6HBtAgQ5QCsiJ8M9fvYmSfWcHEGx7vz6SJU4kgMbfUCf4/K1I7mym42MDKFcvKrKxRlWwLnfOYOzhhWs3UaKPs3WLEh/l+i23y3TZ2AAKcEspIKfCL279JXXR+ktqTsfqyJ8ppQAaf0Od4vO3KnmzmY6PDaA8rajKxBpVxby8eYOxhzuOXUT9TxcFvv5hfwXkUQclPsr1W16HaTOxARTgl1JAToXfwDqRIq0TalRr64PaBWP/oLYARLJQp/jICiBObDo+NoDEAvIhPWvUB5KJpwjGHi7YYT27Pmq19f3flNZ3gKuzASTWyKPSswEUIF8HA9hmzGrM3X7C2gammLUdTC4BNP6GBuOFyw1DpuNjA+hGDXqOZY3q2Rc3VQVjD6N3r6ht7V7xfRy7V1Dio1y/3fRQ5Vg2gALsUwrIqfB7/74FY5bvR/uaedGtQSEBNP6GOsXnb1XyZjMdHxtAeVpRlYk1qop5efMGYw+HzIrEsAW78bx1w6KfdePiUQclPsr1W16HaTOxARTgl1JAToU/ctFuDJweiX+WzIovni0tgMbfUKf4/K1K3mym42MDKE8rqjKxRlUxL2/eYOxhh4nrMWXDEbzzZCH8t0ZeNoDy5OA6ExtA15T9HaCDAZy++She/XEdyuRMg0mvVhFA429oMF643DBkOj42gG7UoOdY1qiefXFTVTD28F9fL8Oa/WfxZcvS+EeJrGwA3TRc8lg2gAKE6mAANx48h0bDliJTqiRY2b2OABp/Q4PxwuWGIdPxsQF0owY9x7JG9eyLm6qCsYcVB87DsQvXMOW1KiiVIw0bQDcNlzyWDaAAoToYwFOXrqNc/7lIkADY0e9JJE6UUACRf6HBeOFyw47p+NgAulGDnmNZo3r2xU1VwdbDG7eiULDnDNy5A6zuUQcZUiZhA+im4ZLHsgEUIFQHA3jHOpMK95qJazejsLBLTeRKn1wAkX+hwXbhcsuM6fjYALpVhH7jWaP69cRtRcHWw/2nL6PGkAgksW5URPZrYN24sO5cPOKgxEe5frvto6rxbAAFmKcUkBvh1/44AntOXsaPbSqgSr4wAUT+hbrB519V8mYyHR8bQHlaUZWJNaqKeXnzBlsPl+46hee+XYm8GZJjXqeacRJBiY9y/Y4TmCYD2AAKNIJSQG6E3+r7VVj050l82LQEmpXPIYDIv1A3+PyrSt5MpuNjAyhPK6oysUZVMS9v3mDr4c+rD6Lrb5tQvUAG/PDSE3ESQYmPcv2OE5gmA9gACjSCUkBuhP/upM2YsOoA3gzPj7frFhBA5F+oG3z+VSVvJtPxsQGUpxVVmVijqpiXN2+w9XDo7B34fP4utKyQEwOfKR4nEZT4KNfvOIFpMoANoEAjKAXkRvjDFuzCkFk70LRMdnzcrKQAIv9C3eDzryp5M5mOjw2gPK2oysQaVcW8vHmDrYdv/7QBk9YfRtcGBfFqzXxxEkGJj3L9jhOYJgPYAAo0glJAboQ/xTqhOlgnVsXH02Fiu0oCiPwLdYPPv6rkzWQ6PjaA8rSiKhNrVBXz8uYNth42G74cq/adwefWRwuetj5eENdBiY9y/Y4Lly7/zgZQoBOUAnIj/DXWCfUv68TKnjYplnSrLYDIv1A3+PyrSt5MpuNjAyhPK6oysUZVMS9v3mDrYZUP5uPwuav4rX1llM2VNk4iKPFRrt9xAtNkABtAgUZQCsiN8I+ev4pKg+YjUcIE2NH/SYRY/9X9cINPdyyx1Wc6PjaAwajK+2tmjXIP/WTg5m1rD8D3ZiDK2gNwVfdwZEz1WJzTU2qUcv2OE5gmA9gACjSCUkBuhH/bOqPsE+uW9d9l79RG1jRJBVD5E+oGnz8VyZ3FdHxsAOXqRUU21qgK1uXOGUw9PHjmCqp9uCDwsYLI9xsgoYMbFZT4KNdvuV2my8YGUIBbSgG5FX61D+fj4Jmr+OW/lVA+dzoBVP6EusXnT1XyZjEdHxtAeVpRlYk1qop5efMGUw+X7z6NZ79ZgTxhybGgc01HJFDio1y/HYHTYBAbQIEmUArIrfBbjFyOFXvO4JPmJfFM6ewCqPwJdYvPn6rkzWI6PjaA8rSiKhNrVBXz8uYNph7+suYguvy6CdXyh2HsyxUckUCJj3L9dgROg0FsAAWaQCkgt8Lv/MtG/Lr2EDrXK4DXa+cXQOVPqFt8/lQlbxbT8bEBlKcVVZlYo6qYlzdvMPXwkzl/4rN5O/HsEzkwqEkJRyRQ4qNcvx2B02AQG0CBJlAKyK3wvZxcAtCFQ93iE57Q5wSm42MD6LOgCKZjjRKQ6nPKYOqhl5sUlPgo12+fZeB5OjaAnqkDKAXkVvjRt9erWt8CHmd9E1j3wy0+3fHErM90fGwAg02RD9bLGuUe+slA9GNKnzYvhcalszmamlKjlOu3I3AaDGIDKNAESgG5Ff7KPafRfOQK5EqfDAu71BJA5U+oW3z+VCVvFtPxsQGUpxVVmVijqpiXN28w9bDq4Pk4dPYqfrVeVCzn8EVFSnyU67e8DtNmYgMowC+lgNwK/969ACP7NUCikIQCyOhD3eKjr0juDKbjYwMoVy8qsrFGVbAud85g6eEtaw/AQj1nBrYqW/5ubWRJ7WyrMkp8lOu33C7TZWMDKMAtpYDcCj/KOrEK9ZqJG7eisLhrLeRIl0wAGX2oW3z0FcmdwXR8bADl6kVFNtaoCtblzhksPbS//mF/BSQ0JAEi+zn/WAElPsr1W26X6bKxARTgllJAXoQf/nEEdp+8jB+tZwCrWM8C6nx4wacznpi1mY6PDWAwqTH2Wlmj3EO/GPCyByD1NYZy/faLV9F52AAKMEgpIC8X59ajVmHBjpPWK/bFrVftcwogow/1go++KnkzmI6P+uIsrxPeM5neQ9PxsUa9a1925E+rD6Dbb5tRvUAG/PDSE47TU2qUcv12DFDxQDaAAg2gFJAX4ff+fQvGLN+P9jXzoluDQgLI6EO94KOvSt4MpuPjxVWeVlRlYo2qYl7evMHSww9nRuKriN14vmIu9GtczDEBlPgo12/HABUPDEoDuGjRIgwZMgRr167F0aNHMXnyZDRu3PgulS+++CLGjBlzH7UVKlTAihUr7v7frl+/js6dO2PChAm4evUqwsPD8dVXXyF7dudf0aAUkBfhf7t4D/r/sR1PlciCYS3LKJbWo6f3gk9rQDGKMx0fG8BgUmPstbJGuYd+MfD6+HWYtukoejQsjLbVH3c8LaVGKddvxwAVDwxKAzhjxgwsXboUZcqUQdOmTWM1gMePH8eoUaPu0ps4cWKkS/f3N3Lbt2+PqVOnYvTo0UifPj06deqEM2fOBExlSEiIo7ZQCsiL8GdvPYZ2Y9eiRPbU+N/rVR1hUDXICz5VtXqZ13R8bAC9qEKvGNaoXv3wUk2w9PDpL5dg06HzGPF8WdQvmtkxVEp8lOu3Y4CKBwalAbyXswQJEsRqAM+dO4cpU6bESu/58+eRIUMGjB07Fs2bNw+MOXLkCHLkyIHp06ejfv36jtpCKSAvwo88dgENPl2MNMlCsaFXPUcYVA3ygk9VrV7mNR0fG0AvqtArhjWqVz+8VBMsPSz1/mycu3ITMztUQ6HMqRxDpcRHuX47Bqh4oLEG0DZ/9l2/NGnSoEaNGhgwYAAyZswYoHv+/PmBn3ztO35p06a924KSJUsGfkru27evo7ZQCsiL8C9fv4WivWcFat/Yux5SJw11hEPFIC/4VNTpdU7T8bEB9KoMfeJYo/r0wmslwdDD81dvomTf2QGIW/vWR/IkiRzDpcRHuX47Bqh4oJEG8KeffkKKFCmQK1cu7N27Fz179sStW7cCP+8mSZIE48ePR+vWrWE/B3jvUa9ePeTJkwcjRoyItS32+HtjbAHZdw1PnTqFVKmc/1XjpOe28OfMmYO6desiNNS5kas0OAKnLt3AlPYVUTSr3Jqc1O10jFd8TvOrHmc6vmgD6EWjqnvjdH7Te2g6PtaoU6XTjtty+AKeGb4CYSkSY3m3mq4mo9SovX6HhYXB/kVQ9vrtCqTCwUYawJh82i+K2GZw4sSJaNKkyUMNoG228ubNi+HDh8fakj59+sR6d9A2lMmS6bHx8iebQ7DvUgK0LnAbpdLfUSgtnpoZYAaYAWYgvjOw/nQCjP4zBLlT3EHH4re1oePKlSto2bIlG0BtOuKhkNieAYwtTf78+dGmTRt069bN80/AwXAHsNMvm/E/622rLvXyo121PB4Y9SeE8i87fxA8ehbT8fHdFR1UJlYDa1SMPx2ig6GHIxbtxUdzdqJRySz46F/FXdFGiY/vAALx4g7g6dOnkS1bNowcORKtWrUKOH77JZBx48ahWbNmAUHadwntLWCC+SUQG8fQ2Tvw+fxdaFkhJwY+4+5kc3VmCg6mfLZDsDQp4abjizaA9vnSsGFDV48pSCHYhySm99B0fKxRH04SB1O8O2kTJqw6iLfC86Nj3QIOIv4eQqlRfgYwSA3gpUuXsGvXroBKSpcujaFDh6JWrVqBbV7s/9k/1drbw2TJkgX79u1D9+7dceDAAWzfvh0pU6YMxNnbwEybNi2wDYwdY+8JaBvFYN4Gxsb1y5qD6PLrJlTLH4axL1dwdbL5OZjyxPYTx8PmMh0fL646qEysBtaoGH86RAdDD1t+swLLdp/Gx/8uiaZlne+zS32NYQMYpAYwIiIiYPhiHi+88AK+/vrrwJu869evh70VjG0C7bH9+vULvLARfVy7dg1dunQJPA9470bQ946J6wSnFJDXE3vlntNoPnIFcqVPhoVdHuQoLkx+/btXfH7VJzqP6fioL86i/MuIN72HpuNjjco4C8RzVPlgPg6fu4pf/1sJ5XL/vRevk8yUGqVcv51g02FM0P8ErJJESgF5Ff7R81dRadB8JEqYAJH9GiBRSEKVFD10bq/4tAQTS1Gm4+PFNViU+PA6WaPcQ2oGbtyKQqGeMxBlvY+4qns4MqZ6zNWUlBqlXL9dgVQ4mA2gAPmUAvIq/CjrTCvUaybsE29x11rIkU6Pt5Nj0uwVn0C7fA01HR8bQF/lRDIZa5SEVl+T6t7Dvacuo9ZHEUgaGoJt79eH/dKmm4MSH+X67QajyrFsAAXYpxSQiPDDP47A7pOX8WObCqiSL0wAIV2oCD66quRlNh0fG0B5WlGViTWqinl58+rew4V/nsQL369CwUwpMatjddfAKfFRrt+ugSoKYAMoQDylgESE33rUKizYcTLwFrD9NrCOhwg+HfHEtzucbACDQYWPrtH0c5A1ql6jY5fvQ8/ft6JO4Uz49oVyrgui1Cjl+u0aqKIANoACxFMKSET4ff63FaOX7UO76o+je8PCAgjpQkXw0VUlL7Pp+HhxlacVVZlYo6qYlzev7j3sP20bvl2yFy9XzYOe/yjiGjglPsr12zVQRQFsAAWIpxSQiPB/sP7q6mX91VW3SCZ808r9X10ClDgOFcHneBKFA03HxwZQobgkTc0alUSkwjS697DdD2swe9tx9H26KF6onNs1U5T4KNdv10AVBbABFCCeUkAiwl9kPXfRynruIn/GFJjzdg0BhHShIvjoqpKX2XR8bADlaUVVJtaoKublzat7Dxt8ugiRxy5iVOvyqFUwo2vglPgo12/XQBUFsAEUIJ5SQCLCP3jmCqp9uACJrS1gtltbwYRYW8Lodojg0w1LbPWYjo8NYDCo8NE1ska5h5QM2DtSFOk9E9duRiGic03kDkvuejpKjVKu366BKgpgAyhAPKWARIR/2zrxCve0toK5re9WMCL4BFrmW6jp+NgA+iYlsolYo2TU+pZY5x4esTZ/rmxtAi2yJy0lPsr12zcBCE7EBlCAQEoBiQq/ztCF2HXiEn546QlUL5BBACVNqCg+mqrkZTUdHxtAeVpRlYk1qop5efPq3MOlu07huW9X4vEMyTG/U01PoCnxUa7fnsAqCGIDKEA6pYBEhd/Wevh2jvXw7fuNiqJVpdwCKGlCRfHRVCUvq+n42ADK04qqTKxRVczLm1fnHo5dsR89p2yxtoDJaG0BU94TaEp8lOu3J7AKgtgACpBOKSBR4Q+cvh0jF+1B6yq50fufRQVQ0oSK4qOpSl5W0/GxAZSnFVWZWKOqmJc3r849fH/qNny/dC/aVsuDHk+53wKG+hpDuX7L6zBtJjaAAvxSCkj0xB6/8gC6T96MmgUzYHTrJwRQ0oSK4qOpSl5W0/FRX5zldcJ7JtN7aDo+1qh37cuIlPFBAkqNUq7fMvjzIwcbQAGWKQUkKvzlu0/j2W9WIHf6ZIjoUksAJU2oKD6aquRlNR0fL67ytKIqE2tUFfPy5tW5hzWHLMC+01cwoW1FVMqb3hNoSnyU67cnsAqC2AAKkE4pIFHhHzt/DRUHzQtsARNpbQUTam0Jo9Mhik8nLLHVYjo+NoC6KzDu+lijcXOk+whde3jjVhQK95oJe0eKld3DkSnVY56opMRHuX57AqsgiA2gAOmUAhIV/p071h5MvWbh6s3b1htYNaw3sVIIIJUfKopPfkVyM5qOjw2gXL2oyMYaVcG63Dl17eHuk5cQ/vFCJEscgq196yNBAm970VLio1y/5XaZLhsbQAFuKQUkQ/hPfrYY249ewPcvlkPtQpkEkMoPlYFPflXyMpqOjw2gPK2oysQaVcW8vHl17eFcaweKNtZOFEWypML0t6p5BkyJj3L99gzY50A2gAKEUwpIhvBf/XEtpm8+FvgIt/0xbp0OGfh0whOzFtPxsQHUWX3OamONOuNJ51G69vAbaweKAdZOFE+VyIJhLct4ppASH+X67Rmwz4FsAAUIpxSQDOF/ODMSX0Xsxn8q5kT/xsUFkMoPlYFPflXyMpqOjw2gPK2oysQaVcW8vHl17aG9A4W9E8UbtfOhU72CngFT4qNcvz0D9jmQDaAA4ZQCkiH8X9YcRJdfN6FqvjCMa1NBAKn8UBn45FclL6Pp+NgAytOKqkysUVXMy5tX1x4+O3IFlu85jaHNSqJJmeyeAVPiPuHv4QAAIABJREFUo1y/PQP2OZANoADhlAKSIfw1+87gX8OXI1uapFj6Tm0BpPJDZeCTX5W8jKbjYwMoTyuqMrFGVTEvb15de1hx4Dwcu3ANk1+tjNI503oGTImPcv32DNjnQDaAAoRTCkiG8E9duo5y/edab2AB299vgMdCQwTQyg2VgU9uRXKzmY6PDaBcvajIxhpVwbrcOXXs4eXrt1C096wA0A296iJNssSeQVPio1y/PQP2OZANoADhlAKSIXx7K5iSfWfjwrVbmGG9iVXYeiNLl0MGPl2wxFaH6fjYAOqsPme1sUad8aTzKB17uPXIeTz1+RKkS54Y63rWFaKPEh/l+i0E2sdgNoACZFMKSJbwm3y1FOsOnMOXLUvjHyWyCqCVGyoLn9yq5GUzHR8bQHlaUZWJNaqKeXnz6tjDaZuO4PXx61E2V1r81r6yEFhKfJTrtxBoH4PZAAqQTSkgWcLv8stG/LL2EDrUyW/9r4AAWrmhsvDJrUpeNtPxsQGUpxVVmVijqpiXN6+OPfxi3k58POdP/Ktsdnz075JCYCnxUa7fQqB9DGYDKEA2pYBkCX/Ewt0YNCPSuvuXxboL6H0/JgGaYg2VhU92XbLymY6PDaAspajLwxpVx72smXXs4VsT1+P3DUfQpX5BvFYrnxBUSnyU67cQaB+D2QAKkE0pIFnCn7f9OF4eswaFMqfEzA7VBdDKDZWFT25V8rKZjo8NoDytqMrEGlXFvLx5dezhU58vxtYjFzDy+bKoVzSzEFhKfJTrtxBoH4PZAAqQTSkgWcLff/oyagyJQOJECQNvAock9PZNRgGa+A5gaKhs+rTIJ0ujWoCJpQjGp2tnnNfFPXTOlYyRUVHWN+h7z8S1m1FY0Lkm8oQlF0pL2T/K9VsItI/BbAAFyKYUkCzh37ZOyMK9ZuLGrSgs7FITudKLnZACdN0XKgufrHpk5zEdH98BlK0Y//OxRv3nXPaMuvXw4JkrqPbhgsANh2196yNRSEIhyJT4KNdvIdA+BrMBFCCbUkAyhd/g00WIPHYR371QDuGFMwkglhcqE5+8quRlMh0fG0B5WlGViTWqinl58+rWw/mRx/HSaHmPHFHio1y/5XWYNhMbQAF+KQUkU/ivj1+HaZuO4t0nC+GVGnkFEMsLlYlPXlXyMpmOjw2gPK2oysQaVcW8vHl166Hslw4p8VGu3/I6TJuJDaAAv5QCkin8T+f+iU/n7sS/rdfyhwi+li9A132hMvHJqklmHtPxsQGUqRY1uVijaniXOatuPZS97RglPsr1W2aPKXOxARRgl1JAMoUfvTFnmZxpMOnVKgKI5YXKxCevKnmZTMfHBlCeVlRlYo2qYl7evLr1sPGwpdhw8ByGWVuOPWVtPSZ6UOKjXL9FcfsVzwZQgGlKAckU/vajF/DkZ4uR6rFE2Ni7nvVtYPVvAsvEJ9BCslDT8bEBJJOOb4lZo75RTTaRTj20Pz1aos9sXLS+BTzL2nKsoLX1mOhBiY9y/RbF7Vc8G0ABpikFJFP4127eRhHrTWDrhWCs6hGOjCkfE0AtJ1QmPjkVyc1iOj42gHL1oiIba1QF63Ln1KmHx85fQ8VB8wJbjW17vz6SJAoRBkuJj3L9FgbuUwI2gAJEUwpItvBrDFmA/aevYHzbCqicN0wAtZxQ2fjkVCUvi+n42ADK04qqTKxRVczLm1enHi7eeRLPf7cKj2dIjvmdakoBSYmPcv2WAt6HJGwABUimFJBs4b88ejXmRZ5Av0ZF8Xyl3AKo5YTKxienKnlZTMfHBlCeVlRlYo2qYl7evDr1cNTSveg7dRvqFcmEka3KSQFJiY9y/ZYC3ockbAAFSKYUkGzhD5q+HSMW7cELlXKhb6NiAqjlhMrGJ6cqeVlMx8cGUJ5WVGVijapiXt68OvWw++TNGL/ygPX937zWd4ALSQFJiY9y/ZYC3ockbAAFSKYUkGzh/7zmILr+uglV8qXHj20qCqCWEyobn5yq5GUxHR8bQHlaUZWJNaqKeXnz6tTDZiOWY9XeM/ikeUk8Uzq7FJCU+CjXbyngfUjCBlCAZEoByRb++gNn8cxXyxCWIgnWvFdHALWcUNn45FQlL4vp+NgAytOKqkysUVXMy5tXpx6W6TcHZy7fwLQ3qqJYttRSQFLio1y/pYD3IQkbQAGSKQUkW/iXrVfzi/aeFUC71jKA6S0jqPKQjU8lltjmNh0fG0DdFOe+Htaoe850i9Clh6cvXUfZ/nMD9NhvACdLnEgKVZT4KNdvKeB9SMIGUIBkSgFRCL+69ZHuA9bHunV4E5gCn0ArpYeajo8NoHTJ+J6QNeo75dIn1KWHK/acRouRK5AtTVIsfae2NJyU+CjXb2kEECdiAyhAMKWAKITf9oc1mLPtOHr/swhaV8kjgFw8lAKfeFXyMpiOjw2gPK2oysQaVcW8vHl16eGYZfvQ+39bEV4oI757sbw0gJT4KNdvaQQQJ2IDKEAwpYAohP/x7B34Yv4utCifAx80LSGAXDyUAp94VfIymI6PDaA8rajKxBpVxby8eXXp4buTNmPCKrlvAFNfYyjXb3kdps3EBlCAX0oBUZzY0d8ELpUjDaa8pvabwBT4BFopPdR0fNQXZ+kN8ZDQ9B6ajo816kH0HkOe+Wop1h84hy+eLY1/lszqMcuDYZQapVy/pRFAnIgNoADBlAKiEP6uExdRZ+gi6wHdEGzpUx8JrU/2qDoo8KnCEtu8puPjxVUntXmrhTXqjTedonToYZT1jdHifWbh8o3bmNOxOvJnEv8GcDTHlPgo12+dNPKoWtgACnSKUkAUwr91O8r6JvAs3LD+u6hLLeRMn0wAvVgoBT6xiuRGm46PDaBcvajIxhpVwbrcOXXo4QHrE6PVrU+NJg5JGHgDOJH1X1kHJT7K9VsWfuo8bAAFGKYUEJXwn/xsMbYfvYCRz5dFvaKZBdCLhVLhE6tKXrTp+NgAytOKqkysUVXMy5tXhx7O2noMr4xdiyJZUmH6W9XkgbMyUeKjXL+lkkCYjA2gALmUAqISfsefNmDy+sPoVLcA3gjPL4BeLJQKn1hV8qJNx8cGUJ5WVGVijapiXt68OvTw83k7MXTOn2hSJhuGNislDxwbQKlcxpaMDaAAxcFoAIcv3I0PZkTiqRJZMKxlGQH0YqE6XLjEEDw62nR8bAAp1eNPbtaoPzxTzqJDD1/9cS2mbz6GHg0Lo231x6XCpcRHuX5LJYEwGRtAAXIpBUQl/AU7TqD1qNXIlzEF5r5dQwC9WCgVPrGq5EWbjo8NoDytqMrEGlXFvLx5dehh7Y8jsOfkZfzw0hOoXiCDPHB8B1Aql3wHUDKdwWgAj56/ikqD5iPEegPYfmA3SaIQyaw4S6fDhctZpd5GmY6PDaA3XegUxRrVqRvealHdw6vWm79Fe8+E9SIwVvUIR8aUj3kD8pAoSnyU67dUEgiT8R1AAXIpBUQl/Dt37qBk39m4cO0W/nizKopmlfPRbrc0UuFzWwfVeNPxsQGkUo5/eVmj/nFNNZPqHm46dA5Pf7kU6ZMnxhrrG/MJEsjdWowSH+X6TdVv2XnZAAowSikgSuE3G74cq/adsR7YLWk9uJtdgAHvoZT4vFclL9J0fGwA5WlFVSbWqCrm5c2ruoc/rzmIrr9uQuW86a1vzFeUB+z/M1Hio1y/pRNBlJANoACxlAKiFH7PKVswdsV+tLMe2O1uPbir4qDEpwJPzDlNx8cGUAeVidXAGhXjT4do1T18f+o2fL90L16yvi3fy/rGvOyDEh/l+i2bB6p8bAAFmKUUEKXwJ1rfbHzH+nZjlXzp8WMb+X+1OaGUEp+T+anHmI6PDSC1gujzs0bpOaaeQXUPn/t2BZbuOo0PrW/LN7O+MS/7oMRHuX7L5oEqX1AawEWLFmHIkCFYu3Ytjh49ismTJ6Nx48Z3ObKfc+vbty9GjhyJs2fPokKFChg2bBiKFi16d8z169fRuXNnTJgwAVevXkV4eDi++uorZM/u/CdRSgFRCn/zofP455dLkCZZKNb3rCv9uQ0nYqXE52R+6jGm42MDSK0g+vysUXqOqWdQ2UN7nS3Xfy5OX76B/71eBSWyp5EOlxIf5fotnQiihEFpAGfMmIGlS5eiTJkyaNq06QMGcPDgwRgwYABGjx6NAgUKoH///rBN444dO5Ay5V/fKWzfvj2mTp0aGJM+fXp06tQJZ86cCZjKkBBnb8ZSCohS+NdvWW9uWZ+Eu2W9urWkWy1kT+v/J+Eo8RGdK67Smo6PDaArOWg5mDWqZVtcFaWyh8fOX0PFQfMCO0ps7Vsfj4U6WzfdAKTER7l+u8GocmxQGsB7CbPfOrr3DqD9V0nWrFnRoUMHdOvWLTDUvtuXKVMm2MbwlVdewfnz55EhQwaMHTsWzZs3D4w5cuQIcuTIgenTp6N+/fqOekIpIErh2+CiPwk3wvokXH0Fn4SjxueogYSDTMfHBpBQPD6lZo36RDThNCp7OHfbcbT5YQ0KZU6JmR2qk6CkxEe5fpOQQZDUOAO4Z88e5M2bF+vWrUPp0qXvUtaoUSOkSZMGY8aMwfz58wM/+dp3/NKmTXt3TMmSJQM/Jds/H8d22EbS/l/0YQvINo2nTp1CqlSppLbHFv6cOXNQt25dhIaGSs1tJ+s2aQsmrT+C12s+jrfC80nPH1dCanxxzU/976bjizaAlBql7lFc+U3voen4WKNxKVzs37+YvxufL9iNZ0pnxYdNiokle0g0pUbt9TssLCxwQ0j2+k1CBkFS4wzgsmXLUKVKFRw+fDhwJzD6aNeuHfbv349Zs2Zh/PjxaN269X1mzh5Xr1495MmTByNGjIiV6j59+sRqDu18yZL5/zOqiB4WHU2A3/aFoFjaKLQtFCWSimOZAWaAGWAG4hkD30QmxJazCdEk923UyGLtBB1kx5UrV9CyZUs2gEHWt/vKjfkTcLQBtH/SzZIly92xbdu2xcGDBzFz5syHGkD7bpt993D48OGxUmLSHcA1+8/i2W9XI1OqJFjSxf9PwlH+ZaeDnk3Hx3dXdFCZWA2sUTH+dIhW2cOqQxbi+IXrmNCmPMrl+vuXNJm8UOLjO4CAcXcAKX8CjilsymcIKJ99sHFcun4LxfvMgvXIJNZaO7inT5FE5nkbZy5qfHEWQDzAdHzRBtB+ZrZhw4YkjykQtyjO9Kb30HR8rNE4Je55wMmL11F+wFxrBwlgc5/6SJEkkedcjwqk1Cjl+k1CBkFS4wxg9EsgHTt2RNeuXQOU3bhxAxkzZnzgJZBx48ahWbNmgTH2djL2FjDx5SUQG3Ptj6yPeJ+i+Yh3XFqlPLHjmtuPfzcdHy+ufqiIdg7WKC2/fmRX1cOIHSfw4qjVeDxDcszvVJMMKiU+NoBBegfw0qVL2LVrV0B09oseQ4cORa1atZAuXTrkzJkzYPQGDRqEUaNGIX/+/Bg4cCAiIiIe2AZm2rRpgW1g7Dh7T8DTp0/Hi21gos/W18evw7RNR9G1QUG8WtPfF0EoT2yyq5GLxKbjYwPoQgyaDmWNatoYF2Wp6uGwBbswZNYOPF0yKz5/9u+XLV2U7mgoJT42gEFqAG0zZxu+mMcLL7wQMHTRG0HbL3PcuxF0sWJ/v6l07do1dOnSJfA84L0bQdtv9To9KAVEKfxofMMX7sYHMyLxVIksGNayjFPYUsb5gU9KoR6TmI6PDaBHYWgUxhrVqBkeS1HVw/+OXYuZW4+hh/Up0bbWJ0WpDkp8lOs3FR+y8wb9T8CyCXGTj1JAlMKPxrh450k8/90q5AlLjgWda7qBLjzWD3zCRQokMB0fG0ABcWgSyhrVpBECZajqYdXB83Ho7FWMb1sBlfOGCSB4dCglPsr1m4wQyYnZAAoQSikgSuFHQz5jfcKnTL85gf/v5j71kPIx+fsNPoxeP/AJtFY41HR8bACFJaI8AWtUeQuEC1DRw3NXbqDU+3+tGxt710PqpHTrBiU+yvVbuLE+JWADKEA0pYAohX8v5MrWp3yOWJ/0mdiuIio+nl6ADXehfuFzV5W80abjYwMoTyuqMrFGVTEvb14VPVy66xSe+3YlcqZLhkVdH3wUSx46gBIf5fotkwPKXGwABdilFBCl8O+FHP0sR/eGhdCuel4BNtyF+oXPXVXyRpuOjw2gPK2oysQaVcW8vHlV9HCE9ez4IOvZ8YbFM+Or58rKAxNLJkp8lOs3KSkSk7MBFCCTUkCUwr8XcvSLIH6czPfO6xc+gfYKhZqOjw2gkDy0CGaNatEGoSJU9DB694gu9QvitVq0u0dQ4qNcv4Wa6mMwG0ABsikFRCn8eyEv330az36zAtnSJMXSd2oLsOEu1C987qqSN9p0fGwA5WlFVSbWqCrm5c2roofRL4CMe7kCquanewGE+hpDuX7L6zBtJjaAAvxSCsivE/veL4Ks6hGOjCkfE2DEeahf+JxXJHek6fioL85yu+Etm+k9NB0fa9Sb7h8VderSdZTr/9cXQOwXQFIRvzhIqVHK9Vs+8zQZ2QAK8EopIErhx4Rc75OF+PP4JXzTqhzqFskkwIjzUD/xOa9K3kjT8fHiKk8rqjKxRlUxL29ev3s4d9txtPlhDfJlTIG5b9N/Q54SH+X6La/DtJnYAArwSykgSuHHhNz11434ec0hvG49z9HZeq7Dj8NPfH7giTmH6fjYAKpQldw5WaNy+VSRze8efmR9/eNL6ysg/yqbHR/9uyQ5ZEp8lOs3OTGSJmADKEAkpYAohR8T8o8r96PH5C2oZj3PMdZ6rsOPw098fuBhA0i3F5iK/rHBVcW63Hn5OiOXz/9Y278ssbaBGfBMMTxXIZfc5LFko+wf5fpNToykCdgAChBJKSBK4ceEvOXwefzjiyXWRtCJsLFXPSRMaD3gQXz4iY8YSqzpTcfHBkmFquTOyRqVy6eKbH72MCrqDkr2nY2L12/hjzeromjW1OSQKfFRrt/kxEiagA2gAJGUAqIU/gN3q25HoVjvWbh+KwrzOtVA3gwpBFhxFuonPmcVyR1lOj42gHL1oiIba1QF63Ln9LOHO49fRN1PFiFpaEjgy1GJQhLKBcN3AMn5jDkBG0AByk0xgDYF//p6GdbsP4uhzUqiSZnsAqw4C/XzwuWsIrmjTMfHBlCuXlRkY42qYF3unH728Oc1B9H11014Inc6/PzfSnKBPCQbJT7K9dsXciRMwgZQgERKAVEKPzbI/aZtw3dL9qJVpVx4v1ExAVachfqNz1lV8kaZjo8NoDytqMrEGlXFvLx5/exh98mbMX7lAbxS/XG827CwPBCPyESJj3L99oUcCZOwARQgkVJAlMKPDfL/Nh7BmxPWo2T21Pj99aoCrDgL9Rufs6rkjTIdHxtAeVpRlYk1qop5efP62cOGny3GtqMX8PVzZfBk8SzyQLAB9IXL2CZhAyhAvUkG8OCZK6j24QIksl4A2dynPpImDhFgJu5QPy9ccVcjf4Tp+NgAyteM3xlZo34zLn8+v3p49cZtFOszC7etF0GWv1sbWVInlQ8mloyU+CjXb1/IkTAJG0ABEikFRCn82CDfuXMHFQbOw4mL1zGxXUVUfDy9ADNxh/qNL+6K5I4wHR8bQLl6UZGNNaqCdblz+tXDVXvPoNmI5ciUKglWdq8jFwTfAfSNz5gTsQEUoN4kA2jT8NqP6/DH5qMI9o98C7RUWqhfF2ZpBXtIZDpGxudBFJqFcA/lNOTriN0YPDMSDYpmxvDny8pJ6iALZf8o128H0LQYwgZQoA2UAqIU/sMgj1q6F32nbkPNghkwuvUTAszEHaoCX9xVyRthOj6+AyhPK6oysUZVMS9vXr96+NLo1ZgfeQLvPVUYbao9Lg9AHJko8VGu374RJDgRG0ABAikFRCn8h0G+d0PoDdaG0CGEG0KrwCfQatehpuNjA+haEtoFsEa1a4nrgvzoob0BdKn3Z+PCtVv43+tVUCJ7Gtd1eg2gxEe5fnvF63ccG0ABxikFRCn8h0G+ZW0Ibe/0ftl64HfGW9VQOEsqAXYeHaoCHxmYWBKbjo8NoJ9qopmLNUrDq59Z/ehh5LELaPDpYiSzXgzc1NufDaCjOaTER7l++6kBkbnYAAqwRykgSuE/CvLz363E4p2n0K9RUTxfKbcAO2wAp0+fjoYNGyI01Lzv5LIBJDs1fEus6hrjG0BrItMx+oFv7PJ96Pn7VlTNF4Zxbfz5VjwbQH/OEjaAAjybaAA/nfsnPp27E41KZcVnLUoLsMMGkA0gmXx8SezH4uoLkIdMYjo+/iNFjrresPaHnWrtE9uxTgG8VSe/nKQOs1BqlHL9dghP+TA2gAItoBQQpfAfBXnprlN47tuVyJYmKZa+U1uAHTaAbADJ5ONLYlXnoC/g4sHdMTaA4kqytwerNGg+jl24hvFtK6By3jDxpC4yUJ6DlOu3C4hKh7IBFKCfUkCUwn8U5MvXb6GE9RygveGnbQBtI0hxqMJHgSW2nKbj48XVLyXRzcMapePWr8zUPfT7AwExeaPER7l++9V/0XnYAAowSCkgSuHHBfnpL5dg06Hz1k/ApayfgrPFNdzTv6vE56lgl0Gm42MD6FIQGg5njWrYFJclUfdw0rpDePvnjSiVIw2mvFbFZXXiwynxUa7f4sj9ycAGUIBnSgFRCj8uyO9bewF+b+0J+J+KOdG/cfG4hnv6d5X4PBXsMsh0fGwAXQpCw+GsUQ2b4rIk6h6+O2kTJqw6iHbVH0f3hoVdVic+nBIf5fotjtyfDGwABXimFBCl8OOCPHPLMfx33Frky5gCc9+uEddwT/+uEp+ngl0GmY6PDaBLQWg4nDWqYVNclkTdw/CPI7D75GV806oc6hbJ5LI68eGU+CjXb3Hk/mRgAyjAM6WAKIUfF+RzV26gdL85sJ7/xaru4ciY6rG4Qlz/u0p8rov1EGA6PjaAHkShWQhrVLOGeCiHsoenLl1Huf5zA1Wt61kX6ZIn9lChWAglPsr1Wwy1f9FsAAW4phQQpfCdQP7HF4ux5fAFsucAVeNzwoHIGNPxsQEUUYcesaxRPfogUgVlD+2tX+wtYAplTomZHaqLlOk5lhIf5frtGbDPgWwABQinFBCl8J1AHjh9O0Yu2oMW5XPgg6YlnIS4GqMan6tiPQw2HR8bQA+i0CyENapZQzyUQ9nD6Of/Xq6aBz3/UcRDdeIhlPgo129x5P5kYAMowDOlgCiF7wTyAuvD362tD4DnTJcMi7rWchLiaoxqfK6K9TDYdHxsAD2IQrMQ1qhmDfFQDmUPq3+4AAfOXMH3L5ZD7UL+P/9HfY2hXL89tFJJCBtAAdopBUR5YjuBfMnaD9D+LrC9H+BiywDmsIygzEM1PplYYstlOj7qizN1f5zkN72HpuNjjTpReexj7t3/b4P1/d8USRJ5TyYQSalRyvVbALKvoWwABeimFBCl8J1CbvLVUqw7cA4f/qsEmpXL4TTM0Tgd8Dkq1OMg0/Hx4upRGBqFsUY1aobHUqh6OHHVAbwzaTPK5kqL39pX9lideBgVPrsyyvVbHLk/GdgACvBMKSBK4TuF/NGsHfhywS48UzobPmleymmYo3E64HNUqMdBpuNjA+hRGBqFsUY1aobHUqh6GP393zdr58Pb9Qp6rE48jAofG8C/esMGUECjphvAZdZ3gVta3wXOlCoJVrwbjgQJEgiwdX8o5YktrUiBRKbjYwMoIA5NQlmjmjRCoAyKHtrf/y0/YC5OXbqBie0qouLj6QUqFAulwBddEeX6LYbav2g2gAJcUwqIUvhOIV+7eTvwXeAbt6Iwr1MN5M2QwmlonON0wBdnkQIDTMfHBlBAHJqEskY1aYRAGRQ9jDx2AQ0+XYzHQhNio/X8X5JEIQIVioVS4GMD+HdP2AAK6NN0A2hT8+zIFVi+5zT6Pl0UL1TOLcDW/aGUJ7a0IgUSmY6PDaCAODQJZY1q0giBMih6+N2Sveg3bRuq5Q/D2JcrCFQnHkqBjw0gG0BxZVoZ4oMB/DpiNwbPjER4oYz47sXyUnhj8yCNRqWJKC/OSoH9/+SMT4cuiNXAPXTP38vW9l/zrG3A3nmyEP5bI6/7BBIjKPtHuX5LpIA0Fd8BFKCXUkCUwncDeduRC2j4+WIkDQ3B+l51rZ8F5PwcoAs+N1y4GWs6PjbxbtSg51jWqJ59cVOV7B5ev3UbpfrOwVXr8Z9pb1RFsWyp3ZQjfaxsfPcWSLl+SyeCKCEbQAFiKQVEKXw3kO0HgisMnIcTF69jnPVzQFXrZwEZhy74ZGCJLYfp+NgAUinHv7ysUf+4pppJdg8X7zyJ579bhYwpk2Cl9R14mS/+eeFANj42gPd3gQ2gF1X+f0x8MIA21C6/bMQvaw+hbbU86PGUnE8CUZ7YAi2VFmo6PjaA0qSiLBFrVBn10iaW3cP3p27D90v3Wvu+Zrf2fy0prU6viWTjYwPIBtCrFh+Iiy8GcNqmI3h9/HoUyJQCszvWkMIf5YktpUDBJKbjYwMoKBANwlmjGjRBsATZPaz9UQT2nLqMr58rgyeLZxGsTjxcNj42gGwAxVUZz+4Anr9yE6X7zYb1VTgse6c2sqZJKswh5YktXJyEBKbjYwMoQSSKU7BGFTdAwvQye7jPMn41LQOYKGECrLOe9071WKiECsVSyMQXsxLKGzhiqP2L5p+ABbimFBCl8L1Abvr1MqzdfxaDmhTHs0/k9JLivhjd8AkDipHAdHxsAGUrxv98rFH/OZc9o8wejrZ++u1j/QRcydr4eYK1AbQOh0x8bAAf7CgbQAGVxycD+MW8nfh4zp+oWyQTvmlVToC1v0IpT2zh4iQkMB0f91CCSBSnYI0qboCE6WX28IXvV2HhnyfRvWEhtKuudvuXaGpk4mMDyAZQwin3d4r4ZACjt4Oxd4ff0Kue8HYwlCe21CZ7TGY6PjaAHoWhURhrVKNmeCxFVg+v3riNku//9dUKFoRcAAAgAElEQVSnOR2rI3+mlB4rkhsmC19sVVGu33JZoMvGdwAFuKUUEKXwvUC2t4OpOngBDp+7im+tO4B1rDuBIodu+ESwxBZrOj42gLIV438+1qj/nMueUVYP50cex0uj1yCb9Xz3km61lG//wncAZSsl9nxsAAV4jk8G0Kapz/+2YvSyfWheLgcG/6uEAHP8E7AQeZoEy1p8NIHzQBmMT9fOOK+Le+iMq+6TN2P8ygP4T8Wc6N+4uLMgH0ZR9o9y/faBGilTsAEUoJFSQJTC9wp5yc5T+M93KxGWIjFWda+DhNbbYl4PHfF5xcJ3ABsiNFT9G4My+8d3OGWzqSYfX2fi5v22tb2Dvdn/qUvXrW//PmF9AzhD3EE+jaDsH+X67RM9wtOwARSgkFJAlML3Cvnm7SiU6TcHF6/dwm/tK6NsrrReU/FLIJ6Z0ydQR43KZIfxyWRTTS7uYdy8r953Bv8evtza9iUR1vasi9CQhHEH+TSCsn+U67dP9AhPwwZQgEJKAVEKXwAy3piwHlM3HkH7mnnRrUEhz6l0xecZUIxA0/HxHTJZSlGXhzWqjntZM8voYb9p2/Ddkr1oUjobhjYvJas0KXlk4HtYIZTrtxTwPiRhAyhAMqWAKIUvABn/s8zfm5YJfDxDcsx7u4bnh4V1xSfCzb2xpuNjAyhLKerysEbVcS9rZtEe3vty34jny6J+0cyySpOSRxTfo4qgXL+lgPchCRtAAZIpBUQpfAHI1s+/N1G231zcsH4OntWhOgpm9rZdgK74RLhhAyiLPT3ysEb16INIFdzDR7O35fB5/OOLJUgaGoJ11s+/SROHiNAtPZayf5Trt3QiiBKyARQgllJAlMIXgBwIbTNmDeZuP443a+fD2/UKekqnMz5PgGIEmY6P7wDKUInaHKxRtfzLmF20hx/N2oEvF+zCk8Uy4+v/lJVRktQcovj4DuCj22GsAezTpw/69u17H/pMmTLh2LFjgf+bfevb/veRI0fi7NmzqFChAoYNG4aiRYs6FnB8NYCT1x9Cx582Iq/1M/Bcjz8DU57YjhtIONB0fGwACcXjU2rWqE9EE04j2sM6Qxdi14lL+KxFKTQqlY2wUm+pRfGxAYzHBvDXX3/F3Llz7zIQEhKCDBn+esV98ODBGDBgAEaPHo0CBQqgf//+WLRoEXbs2IGUKZ39rBlfDWDgZ+D+1s/A1q7xMztUQ6HMqVyf3ZQntutiCAJMx8cGkEA0PqdkjfpMOMF0Ij3cefwi6n6yyHrrN0Hg7d9Uj+m3lZMIvrjoply/45pbl383+g7glClTsGHDhge4tu/+Zc2aFR06dEC3bt0C/379+nXYdwhtY/jKK6846g+lgCiF7whcHINEfwbWHZ8oR6bjYwMoqhD18axR9T0QrUCkhx/P3oEv5u9C7UIZ8f2L5UVLIYkXwRdXQZTrd1xz6/LvRhvAIUOGIHXq1EiSJEngJ96BAwfi8ccfx549e5A3b16sW7cOpUuXvtuLRo0aIU2aNBgzZoyj/lAKiFL4jsDFMWjK+sPo8NMGz28D645PlCPT8bEBFFWI+njWqPoeiFbgtYf2TZAaQyJw4MwVbX/+pb7GUK7fon31K95YAzhjxgxcuXIl8PPu8ePHAz/xRkZGYuvWrYGfeatUqYLDhw8H7gRGH+3atcP+/fsxa9asWPm37xLa/4s+bAHlyJEDp06dQqpU7n8GfVST7RN7zpw5qFvX2phTw68s2JtBVxwcEfgZeEr7iiia1R1+3fGJnoCm44u+OOusUe7hoxlgjYoqRH281x6uP3AOzb5ZhWTWW7/Lu9Ww/ptIPZhYKvCKzwkYe/0OCwvD+fPnpa/fTubXYYyxBjAmuZcvXw7c9evatSsqVqwYMIBHjhxBlixZ7g5t27YtDh48iJkzZ8bam9heLLEHjh8/HsmSJdOhn77WMGpHQmw4kxA1s0ThmdxRvs7NkzEDzAAzwAx4Y+DXvQmx+FhClA2LQqv88fPabd8gatmyJRtAbxIKvij7blq+fPnQpUsXTz8B8x3A+3s+b/sJ/Hf8hsC3gRd3ro5ELj4hRPmXnQ7KNB0f3wHUQWViNbBGxfjTIdpLD+1PelYdshBnLt/Et8+XRo0C+nz7NyanXvA57QvfAQTizR1A27zZdwDtn3l79uwZ+Om3Y8eOgTuC9nHjxg1kzJiRXwJxevbYnFk//1YcNM+6kNzA6NblUbNgRsfRXp9dcTyB4oGm44s2gNOnT0fDhg21fExBVAKm99B0fKzR2M+ABTtOoPWo1UifPDFWdg939Ye76DnlNp5So/wMoMEGsHPnzvjnP/+JnDlz4sSJE4FnABcuXIjNmzcjV65cAaM3aNAgjBo1Cvnz5w+8IBIREcHbwLg8Q3v/vgVjlu+39pDKaj1M/PcLNXGloTyx45rbj383HR8vrn6oiHYO1igtv35k99LDDhPXY8qGI3ihUi70bVTMjzI9z+EFn9PJ2AAabABbtGgR2NfPfkHD3vvPfu6vX79+KFKkSEAf0RtBjxgx4r6NoIsVc35CUAqIUvhOTxAn4zYcPIfGw5bisdCEWPNeXaRI4uxh4mDB54SD2MaYjo8NoFdl6BPHGtWnF14rcdtDew/XJwbMw9Wbt/Fb+8oomyut16l9iXOLz01RlOu3mzpUjo03PwFTkEwpIErhy+TCNtLhHy/EnlOX8WHTEmhW/v/auw4wK6qz/bGF3gSk1wBSFWkiHWxRsEuIGrHEXiJG/e0+wcQSsCYqRY1d1BAFNSrBhKKAgtKkiop0kCpSd1nY/3wDd1127907M+d8M2dm33me+2y5p71l5nxz5pwzjVwVHxV8rsAkSRR3fAgA/TrDnnzwqD1a+G2JVw3fmLWK7h2/SOstTn7b6iefV3xe6pDsv720I8y0CAA12Jc0kKTxNSAnzTpq6vc0fOIy6ti4Oo2/oaer4qOEzxWgIonijg8BoB9X2JUHHrVLDz+t8arhWU9Pp4XrdtC9A9rQ1X1+5afKQPN4xeelcZL9t5d2hJkWAaAG+5IGkjS+BuSkWTfvzKHuajFI3sF816+GixI+P3zFHR8CQD+usCsPPGqXHn5a40XDRSrwO1MFgPzqty/uPplqVi7np8pA83jB57Vhkv2317aElR4BoAbzkgaSNL4G5JRZr399Dn28aCNd3qMpDTu7XdoqooYvLSCMAHqlyPr08Kj1EqVtIDT8haL7Jyyi175YRQOPq0fPXtwpLXc2JJDUT7L/toE7N21AAOiGpRRpJA0kaXwNyCmzTlu+mS57cbZ6oXgWzb73FLUoJLPEaqKGzytncceHEUCvjrAvPTxqnyZeW+RWw725B+iEh/9L/Aan16/sRr1a1vJaVSjp3eLz0zjJ/ttPe8LIgwBQg3VJA0kaXwNyyqwH1ePf3iOm0Lqf9tLjv+lAF3RuiAAwxnvkIQCUOIuCLTNq1xg/7MQdo1t8/5qzlm4ft4Aa1ahA027vTxkZZfzQGXget/j8NEyy//bTnjDyIADUYF3SQJLG14BcYtZnJn9Lj01aTsc3qk4Tbix5MUgU8XnhLe74EAB6cYOdaeFRO3Xx0io3GvJODbxV14K1O+j2046hm05q6aWKUNO6wee3gZL9t982BZ0PAaAG45IGkjS+BuQSs/JikJ5/nUy56lVD42/ooVYFp95jKor4vPAWd3wIAL24wc608KidunhplRsN56zaTheMmkllszJo5l0nqVd32r/4I8GBG3xe+CqcVrL/9tumoPMhANRgXNJAksbXgJw2623/XEDvzF1LZ3eoT3+/KPWbQaKKLy0BhxPEHR8CQLdOsDcdPGqvNm5b5kbDG8fOpQ+/3kCDuzSkEYM6uC3ainRu8PltqGT/7bdNQedDAKjBuKSBJI2vATlt1sRWA1lqjsn0O0+iutXKJ80TVXxpCUAA6JYi69PBo9ZLlLaBpV1DnpPdR83NPqDmaH88tDe1qVc1LWc2JZDUT7L/tonDktqCAFBDKUkDSRpfA7KrrINHf06zV26jm/q3oNt/3QoBYHa2K96ilijKHnXDNfC5YcnuNKVdw0c+Xkpjpq2gHs1r0tirT7RbrCStk9RPsv+OCtEIADWUkjSQpPE1ILvK+tHCDXTDG3OpesVsZ85JxbLF3w8cZXxuSIg7PuYg7hiBz43T7U5TmjXck5tHJz78P/pZbf3ywqVd6JS2dewWCwFg4PogANSgHAFgcvLy1CKQk5+YRqu27qH7z2xLV/ZqVixhab4wa1jOqqzQ0Co5PDcm7vqV9puUl2b8QA98sISa1KxIU27rF5mtXwobWdKjkv2355MxpAwIADWIlzSQpPE1ILvOOnbWarpn/EKqW7U8TbujH5XLOnJj6KjjS0dE3PGV9s41nf5R+B4ejYJKJbcxlYY5eQeo74iptPHnffTQee3pd92aRBKspEcl+++okI0AUEMpSQNJGl8DsuusfAHqPXwKbVJbwwy/4Fj6bdfGR+SNOr50RMQdHwLAdA6w/3t41H6N0rUwlYavq1e+3ade/VZPLcKb+n/Fb8DTlWvL95Ieley/beEvXTsQAKZjqITvJQ0kaXwNyJ6yPv/pCnroo6XUrFYl+u+tfSmz0O7zccBXEhlxx4cA0NOpYGVieNRKWTw1KpmG+9UUnH6PTnXeyjTsrLZ0ec/iU3A8VRJiYkmPSvbfIVLmqWoEgJ7oOjKxpIEkja8B2VPW3Tl51HP4ZPppz356YnAHOr/TL6+HiwM+BID76aMYv+4OHvV0uluZuDRq+M+v1tAd//ra2fB5+p39076X3UrhDjdKUj/J/ttmTgu3DQGghlKSBpI0vgZkz1lHTv2ORkz8hhrXqEj/u60vZWdmOGXEBV8qQuKODxp6PhWsywCPWieJ5wYV1ZAX4J2iFuCtVAvw7hnQmq7p09xzmTZlkPSoZP9tE4cltQUBoIZSkgaSNL4GZM9ZeSuCPmoy8pZdOUdMRo4LPgSAH9GAAQMoO4Z7HcKjnk936zKUNg3fmLWK7h2/iGpUKkuf3dGfKpUrvgWXdSKV0CBJ/ST776hwjABQQylJA0kaXwOyr6yJ7Qh4RTBPSC6fnYkRQF9M2pUpTh5Nxizw2eU3P60pTRruzy9DfdXcP34n+5/U3L8rIjz3L6G1pH6S/bcfr4aRBwGgBuuSBpI0vgZkX1l5RXB/dWFav2Mf3XVGa7qub3MEgL6YtCtTnDyKABBvq7Hr7HLXmsLn4KhPV9ITnyx3ptvworuyWYem20T5kLzGSPbfUeEcAaCGUpIGkjS+BmTfWf81Zy3dPm4BVVaPJKbc3o+ql8/AAgLfbNqRMW4eLcoq8NnhM51WlBYNu/U5mU5+cjrtzj1Af7+oI53dob4ObdbkldRPsv+2hsA0DUEAqKGUpIEkja8B2XfWg+pl5OeOnEFfr91BF3ZtRH85uw0CQN9s2pExbh5FAGiHr0y2orR49MuDzej1WWvo2AbV6L0be0byrR9Bj8JL9t8mPSxZFgJADXYlDRTHC9dXK7fRoNGfU5kyRBOuP5FWzpuOBQQa/gs7axw9WphT4AvbYfr1lwYNnxv3ET2+MIvUPTaNvbob9WheS584S0qQ1E+y/7aEvrTNQACYlqLUCSQNJGl8DcjaWf/w5jz6YMF6OqHpUXRx3c00cCBWkGqTGlIBcfVogk7gC8lYBquNu4Y5Obn060cn0cpdZWjgcfXo2Ys7GWQv/KIk9ZPsv8Nnzl0LEAC64ylpKkkDSRpfA7J2Vt6d/qTHplJO3kH6XYsDNOyyM7CFiDar4RQQV48iAAzHTxK1xt2jY7/4ge6ZsIQqlc1U+6z2o7rq1W9xOiT1k+y/o6IBAkANpSQNJGl8DchGsiY2h66YlU+T+aJ1VGUj5dpUSJz1Q4Bkk9P8twUe9c+dDTm3786lkx6fStvVm5buPv0YurZfSxuaZbQNkh6V7L+NkiBYGAJADXIlDSRpfA3IRrLyuyrPfno6Ld24kwYeW5ee/V1nI+XaVEic9UMAaJPT/LcFHvXPnQ05b317Pr07bx3Vq5BP/7vzVKpYvpwNzTLaBkmPSvbfRkkQLAwBoAa5kgaSNL4GZGNZ563cSuerBSH5VIb+cVkXOrlNHWNl21BQ3PVjjuOOEfhsOJP02hBXDScu2kjXvT6HMtSCuqHt8uiG32IutVenSPbfXtsSVnoEgBrMSxoorheuwqNH146cSJM3ZFDtKuVo4i19nNcXxeWIu34IAKPvVHg0mhpuVa/VPO3JT2mregR8be9m1DbvW+ym4ENKyf7bR3NCyYIAUIN2SQPF/eLM+CZ88BGNWlGNVmzZTae2rUPPDemstohRt7QxOOKuHwLA6JsUHo2ehvn5+XTDG3PpYzUC2KpOFXrnum70v0kTEQD6kFKy//bRnFCyIADUoF3SQHG/OCfwNe3Yi34zZjblqnmBD57bni45sYmGIvZkjbt+CADt8ZrflsCjfpkLL9/YWavpnvELKUs9+52gNnxuVbsiNtT3KYdk/+2zSYFnQwCoQbmkgeJ+cS6M75Uv1tCDHy6lcurdle/f1Ita1a2ioYodWeOuHwJAO3ym0wp4VIe94PMuWreDzh81k3LVFlp3nt6aru+Hd6rrqCDZf+u0K8i8CAA12JY0UNwvzoXxZWZm0eUvf0mfLt9MzWpVcu5sq1WI9svp464fAkCNC4clWeFRS4Rw0Yyf9+2nM/8+nVZv20Mnt65Nz1/axXndW9w1lMQn2X+7kNSKJAgANWSQNJCk8TUgG8taFB9PbD77mRnEG0X3a3W0WhnclTJ5iVtEj7jrhwAwosYs1Gx4NBoa8nvUr1Urfj9Z8iM1qF6BPry5F1WveGjBXNw1lMQn2X9Hw1lECAA1lJI0kKTxNSAby5oMHz/iGDR6Ju3bf5BuUI837lCPOaJ6xF0/dD5RdeYv7YZHo6HhIx8tpTGfrqCymRk07rru1KFR9YKGx11DSXyS/Xc0nIUAUEsnSQNJGl8LtKHMqfC9N38dDX1rvlPLiEHH0eAujQzVGGwxcdcPAWCwfpKoDR6VYNVsmW/OXk13v7vQKfRvFx5P5xzf4IgK4q6hJD7J/tusC+RKwwigBreSBpI0vgZkY1lLwjdi4jIaOfV75xEwbw0TxU2i464fAkBjp0JoBcGjoVHvqmKeE/17NTc6Tz0CvuWUlupzTLF8cddQEp9k/+1KYAsSIQDUEEHSQJLG14BsLGtJ+Hivq9vHfU3vzF1L5bMz6I2rulHnJjWM1R1EQXHXDwFgEC6SrQMeleVXp/RZK7bSZS/NdqbDnNexAT0xuEPSPVLjrqEkPsn+W0f7IPMiANRgW9JAksbXgGwsazp8/L7ga179iqZ8s5mqlM+iV39/AnVsfJSx+qULSodPuv4gyo87RuALwkWydURRw7mrt9OQF2bR7twD1F8tiBszpAuVVVtkJTuiiM+L4pL4JPtvLxjDTIsAUIN9SQNJGl8DsrGsbvDtyc2jy1/8kmav3EaVy2XRK7/vGpmRQDf4jJEZUkFxxwh8IRnLYLVR05CDv8tenE079+VRzxY1nd0QymdnpmQkavi8SiuJT7L/9oozrPQIADWYlzSQpPE1IBvL6hYfB4E8D+aLFduoYtlM54LYvXlNY+2QKsgtPqn6gyg37hiBLwgXydYRJQ15zt+1r82hvfsPUNemR6kb3hPUNS+rRIKihM+P0pL4JPtvP1jDyIMAUIN1SQNJGl8DsrGsXvDtVY9CrlaPg6d/t8XZCuHR3xxXbDWcsYYZKsgLPkNVBl5M3DECX+CWMl5hVDT899fr6Y9vz6f9B/Kpd8ta6rFv57TBH5MVFXx+hZXEJ9l/+8UbdD4EgBqMSxpI0vgakI1l9Ypvn7orvu2fC+jDhRucNtx26jF000ktkk6MNtZIjYK84tOoKrSscccIfKFZy1jFtmvImzz/ffK39NR/v3UwDzyuHj05+PiUc/6KEmM7Pl0hJfFJ9t+6uIPKjwBQg2lJA0kaXwOysax+8PHFcrjaIoY3ReVjwLF1afgFx6lFIva9Ns4PPmPkBlRQ3DECX0BGEqzGZg135+Q5N7UTF290GLiiZ1O6b2BbT29AshmfCVkl8Un23yawB1EGAkANliUNJGl8DcjGsurge2PWKhr2/mLncQm/O3jUJZ2odd2qxtpmoiAdfCbqD6KMuGMEviBcJFuHrRryW49ufmserdi825nW8uC57WlwV++b3tuKz5Sqkvgk+29T+KXLQQCowbCkgSSNrwHZWFZdfLxa7qY35tL6HfucxyX/d1or+n2vZp7uno2BSVKQLj7JtpkqO+4Ygc+UU8IrxzYN+SnGizN+oBETv6FctdVVnarlaOTvOqvdDfxtcWUbPtNKS+KT7L9N8yBVHgJADWYlDSRpfA3IxrKawLdtd656hDLf2SuQD145N2JQB2dUMOzDBL6wMaSrP+4YgS+dA+z/3iYNl/+4k+5Rr3X7atV2h7hT29ahEWoKy1GVyvom0iZ8vkGUkFESn2T/LcGFRJkIADVYlTSQpPE1IBvLagofvzXkrS/X0IP/XuJsnMqPU67q3Yxu7N+CKqm9A8M6TOELq/1u6o07RuBz4wK709igIS9ge2byd2ru8vfOtBXezuruAW3okm6NtRex2YBP0gGS+CT7b0lOTJaNAFCDTUkDSRpfA7KxrKbxrdm2h+6dsIh4Ly0+6lYtT3ec3srZLobfKRz0YRpf0O13U1/cMQKfGxfYnSZMDfPUI953566jJz5ZTht/3ucQdUqbOvTnc9pR/eoVjBAXJj4jANIUIolPsv8OghsTdSAA1GBR0kCSxteAbCyrBD4eDfzv0k30538vpjXb9jptbX50JRqqXqI+8Nh6gQaCEviMkW+ooLhjBD5DRgmxmDA0PKDm+U1ctFFt7bKcvt20y0HfQAV895/Zhn7drq72qF9hOsPAF6Sckvgk++8gOdKpCwGgBnuSBpI0vgZkY1kl8fEjF55oPWbaCtqxd39BIHh5z2Z0QacGrjZY1QUqiU+3babyxx0j8JlySnjlBKkhX3f+NWctPf/ZClq1dY8DunrFbLpJTUe55MQmJb7SzS9DQeLz20adfJL4JPtvHcxB5kUAqMG2pIEkja8B2VjWIPDt3LefXp6x0rkg/6zerclH1fJZ9Fu13cKgzo2oVd0qxvAULSgIfGKNd1lw3DECn0sjWJwsCA2XbfyZ3pq9hsbPW1dww8mB36Xdm9KVameCahXk9ikNAl+Y8krik+y/w+TMS90IAL2wVSStpIEkja8B2VjWIPFxIMh35i/PXFlwZ85A2tWvSud1bEBnHlef6lYrbwwbFxQkPqMN91BY3DECnwczWJpUSsO12/c4j3k/+HoDLVjzUwF6ftTLi9D4JjPde3xNUCaFz0TbTJQhiU+y/zaBPYgyEABqsCxpIEnja0A2ljUMfDw3Z8qyTfTPr9aorWM2OSvyEkf7BlXp5NZ16OQ2tal9/WqUoblwJAx8xsRxWVDcMQKfSyNYnMyUhnzt4M2b+X3kk9SbOxas3VGAOjuzjLOly2+7NqZeLWphrrFBP5jSL1mTJPtvgxSIFoUAUINeSQNJGl8DsrGsYePbrvYQ5Bew82ObeeoOXq0fKThqqH25uqiNWU9oVoO6NatJbepVoSy1vYyXI2x8XtrqN23cMQKfX2fYk8+vhjl5B2jZhp00X10bPv9+K838fkvBNBJGx/eHXZvWoDPa16UzO9SnWpXLhQLaL75QGuujUkl8kv23D6ihZCn1AeDIkSPp0UcfpQ0bNlC7du3oqaeeot69e7sSQ9JAksZ3BU44kU34Nu/McUYEJ6sVxJ99u9nZT7DwUU69aaR1varUVn34sXFb9WleqzJVU/N8Uh024ZOSMu4YgU/KOcGV60ZD3lD+O7Valz88n48f6S5VwR+/qaPwUUXNH+7RvCb1PaY2ndauTmhBX+E2ucEXHNvma5LEJ9l/m2dCpsRSHQC+/fbbNGTIEOIgsGfPnjRmzBh64YUXaMmSJdS4ceO0jEsaSNL4aYEFkMBWfLl5B2mhetTz5cptNPuHbc7PnYcXkBSl5SgVADapWcl580hT9bPhURXUq53KO693qlEhkz6b/AkNHDiAsrPlJoEHIFWpDXJt9agpzeOOj3lijOM/+IiO796XNu3Ko3U/7VGffbT+p720Wu0d+r0K+raqADDZwed3h0bVnacBPdWj3WMbVPP8JMCUVqX1RlPSo5L9t7Tupsov1QFgt27dqFOnTjRq1KgCPtu0aUPnnnsuPfLII2k5ljSQpPHTAgsgQVTw8bs7V27dTUs2/EyL1x/6LFO/b1KjhumOshn5VK96JapRuayzErC6+vBP51Px0P8qq7eVVFBvBqiQffhTNsPZLsL5W/2/fFam9nzEdO30+31UNAS+5AzYrB/v6Zmnzr0cdUPGN2X84ceye9VWK7vUDdmunEOf3erDN2i7c9T/c/bTtt37VUCXo37m0tZd6qN+37f/yJG8ZGzw4o0WtStTS/U5TgV9xzesTo1qVDC6Z59fH5aUz2YNTeCVxCfZf5vAHkQZpTYAzM3NpYoVK9K4cePovPPOK+B66NChNH/+fJo2bVox/nNycog/iYMN1KhRI9qyZQtVrVrVqF5s/E8++YROPfXUWI4gRR0fdzyr1WbTHBzynl8r1WjCxh059KPa8Z+Dw8S2MyZMUVY9gs5Wk474jSb8yVbzEQt+P/y/LP6pJqNnZWSoz6F0/JNSvASlTJIvyqRMmxwFd9Jbt26hmjVrHRGkJivbKSFJ+ane0ZK6LclzJEufumx3b4bJzz9ImzZtojq161CZIouCvJbtBacX/lLQWiBYwdTWQnNc8+nQHwcOHqQff/yRait8Gco3rGfiSPxWeG4sf1dSGi5XFUkHVaYD6sM3T7zO6tDPxN/qd05T6H/qVxXscYB3ONhTCfj3onXrnEt8Q9Wgenn1Bg7+VKD6atU//2yuRu9/dQuMsqAAABFuSURBVHTFQFbs6rQ/Vd6oX0fTcSKJj/vvWrVq0Y4dO4z33+lw2fJ9qQ0A169fTw0aNKAZM2ZQjx49CvR4+OGH6ZVXXqFvvvmmmEbDhg2jBx54oNj/x44d6wSTOMBAggGeRviz2oP6J/V0aff+MrRX/b1HbUW4J6+M83Ov8ztRzsEyaq6RelSlOsXcwx81yEH7890FKWAcDJQGBjLK5FOWOiXUADmVz1Qf9Zrvcvx7Vv7hn+p39Xel7HyqrGZcVFbfV078rv7mtKluKkoDf8BYnIE9e/bQxRdfjACwNJojEQDOnDmTunfvXkDBQw89RK+99hotW7asGC0YATTnFMk7O3Ot9F+SLj7eduLQI6+D6hHWAedx2AE1nMIjJc7v6lPw0/k//+/Qd3nq78T3RREUGgg68qskwy2p0iaSHjhwgBYtXkTt27WnjBSrpFON4iQrO/WIT/HUJspNjIQVJqJwuYxv6dKlxNNCMjJV1FGMzOQMecGWPK1+uYWbmgh8ErcUZQ7/46DCx9e5Nm1aq9HjzF8GaAtFSr/kOVRiYnSyeJmHvs9QX/DoM9ehBqSd3xP/462V+H+HfibSqTTqd15lz4utyqqfPOLt/F7ob7/v89Y9D/1fAYLJCXz+ecYIoDqf1ZB+yj7BP7X25/TzCLgoKsk5BJJzH2xQB/hsUEGvDdBQj7+wc8ddP+Y37hiBz/9ZJNl/+29VsDlLbQDINPMikM6dOzurgBNH27Zt6ZxzzsEiEGEf4sIlTHAAxUPDAEgWrCLu+iEAFDRPQEVLehQBYCkeAWT/JraBGT16tPMY+LnnnqPnn3+eFi9eTE2aNElrcUkDSRo/LbAAEgBfACQLVwENhQkWLj7u+iEAFDZQAMVLelSy/w6AGiNVlOoRQGaQR/9GjBjhbATdvn17evLJJ6lPnz6uyJU0kKTxXYETTgR8wgQHUDw0DIBkwSrirh8CQEHzBFS0pEcl+++A6NGuptQHgDoMShpI0vg6mE3lBT5TTIZXDjQMj3sTNcddPwSAJlwSbhmSHpXsv8NlzX3tCADdc1UspaSBJI2vAdlYVuAzRmVoBUHD0Kg3UnHc9UMAaMQmoRYi6VHJ/jtU0jxUjgDQA1lFk0oaSNL4GpCNZQU+Y1SGVhA0DI16IxXHXT8EgEZsEmohkh6V7L9DJc1D5QgAPZCFAFCDrCJZJU9sc630X1Lc8aFz9e8NW3LCo7Yo4b8dcddQEh8CwFK+Ctj/aXcop6SBJI2vi9tEfuAzwWK4ZUDDcPnXrT3u+uEmRdch4eeX9Khk/x0+c+5agBFAdzwlTSVpIEnja0A2lhX4jFEZWkHQMDTqjVQcd/0QABqxSaiFSHpUsv8OlTQPlSMA9EBW0aSSBpI0vgZkY1mBzxiVoRUEDUOj3kjFcdcPAaARm4RaiKRHJfvvUEnzUDkCQA9kIQDUIKtIVskT21wr/ZcUd3zoXP17w5ac8KgtSvhvR9w1lMSHABBzAP2feSqnpIEkja8F2lBm4DNEZIjFQMMQyTdQddz1w02KAZOEXISkRyX775Bpc109RgBdU1U8oaSBJI2vAdlYVuAzRmVoBUHD0Kg3UnHc9UMAaMQmoRYi6VHJ/jtU0jxUjgDQA1lFk+7YsYOqV69Oa9asoapVq2qUVDwrG3/SpEl02mmnUXZ2ttGybSgM+GxQQa8N0FCPv7Bzx12/RACI62jYTvNfv6RHOQBs1KgR/fTTT1StWjX/jYxwTgSAGuKtXbvWMRAOMAAGwAAYAANgIHoM8ABOw4YNo9dwAy1GAKhB4sGDB2n9+vVUpUoVKlOmjEZJxbMm7k4kRheNNtRnYcDnkziLskFDi8Tw0ZS468eUxB0j8Pkw/uEs+fn5tHPnTqpfvz5lZGT4LyjCOREAWipe3OcnAJ+lxvPQLGjogSwLk8Zdv0QAyI/3eLqO6Wk6Nkgadw3jji9sDyEADFuBFPXH3fjAZ6nxPDQLGnogy8KkcdcPAaCFpvPYpNLgUY+UGE2OANAoneYKi7vxgc+cV8IqCRqGxbyZeuOuHwJAMz4Js5TS4NEw+UUAGCb7JdSdk5NDjzzyCN19991Urlw5S1vpv1nA5587W3JCQ1uU8NeOuOvHrMQdI/D58z5yHWIAASCcAAbAABgAA2AADICBUsYAAsBSJjjgggEwAAbAABgAA2AAASA8AAbAABgAA2AADICBUsYAAsBSJjjgggEwAAbAABgAA2AAASA8AAbAABgAA2AADICBUsYAAkALBF+5ciX95S9/ocmTJ9PGjRudnckvueQSuvfee6ls2bIpW8g7mT/wwAP03HPP0fbt26lbt2707LPPUrt27SxAVbwJDz30EH344Yc0f/58Bxe/gzHdcfnll9Mrr7xyRDLG+cUXX6TLGvj3fvBFSUP22M0330zvv/++w+3ZZ59NTz/9tPM+7FSH7fqNHDmSHn30UdqwYYNz3jz11FPUu3fvlHimTZtGt956Ky1evNg5T++44w667rrrAvea2wq94Js6dSr179+/WNFLly6l1q1bu60ysHSffvqpo92cOXMc/caPH0/nnntuifVHTT+vGKOkIe9y8e6779KyZcuoQoUK1KNHDxo+fDi1atUqVhoGdkL4qAgBoA/STGeZOHEivf3223TRRRdRixYtaNGiRXT11VfTkCFD6LHHHktZHZ8sHHS8/PLLdMwxx9CDDz5IfMH45ptvnNfT2Xb86U9/coIFfofyP/7xD9cB4I8//kgvvfRSARwOHmvUqGEbPPKDL0oannHGGY52fMPBxzXXXENNmzalDz74oMQA0Fb9+Jzjc4yDpJ49e9KYMWPohRdeoCVLllDjxo2LYfrhhx+offv2zrl57bXX0owZM+iGG26gN998ky644ALr/OgVXyJ44OtH4bdmHH300ZSZmWkdvo8//tjRoFOnTg7/6QLAqOnHhHvFGCUNTz/9dLrwwgupa9eulJeX5wx4LFy40Dn/KlWqlNRvUdTQuhOnUIMQAFqqDt/Zjho1ilasWJG0hTxyxCMQt9xyC915551OGt4Tqk6dOs5dFHdQth4csHK73Y4AcroJEybYCqdYu9zii5KGPArUtm1bZ+SVR2D54N+7d+/u3MGnumvnEUBb9WMcHDzweZY42rRp44wi8ehE0YPPMx79ZC4SB4/+LViwgD7//HPr/OkVXyJ44JHekkZ1rQOqGsTvYk8XAEZNv6I8u8EYZQ03b95MtWvXJh6l7dOnT1KbRV1D284dBIC2KXK4Pffddx/xyOBXX32VtIUcGDZv3pzmzp1LHTt2LEhzzjnnOBfvoo9NbYLpNkDiNnMAwcEfj/oxrr59+zqjnnyhsPVwiy9KGr744ovOo8+iQTtr8uSTT9IVV1yRVA5b9cvNzaWKFSvSuHHj6Lzzzito+9ChQ50pCtwJFT24U+Jz7W9/+1vBVxx0DB48mPbs2UPZ2dnWWNIPvkTwwKO6+/btcwJ+vg4leyxsDdDDDXETHEVJv2T8usEYZQ2/++47atmypTMKyCPtyY6oa2jdeaNGIfJta1Rpb8/333/vjEw8/vjjdNVVVyWlY+bMmc5jq3Xr1jkjgYmDH8utWrWK/vOf/1hLo9sAiQHwY6zKlStTkyZNiIf/77//fudxAc/7sfUNKW7xRUnDhx9+2JlqsHz58iN8xVMPOPjjN9YkO2zVb/369dSgQQPnESLPPUocjJNvnvgxaNGDsXJAe8899xR8ldCQy6tXr54155wffIyZp5B07tzZeZrw2muv0ejRo4mDilQjMrYAdhMcRUk/vwFgVDXkMIQHL3j0+bPPPktpq6hraMv5kmgHRgAFFRk2bJizSKOk48svv6QuXboUJOELN49y8YfnI6U6UnU8PD9pzZo1zuhhEIcfjG4DpGTt58neHAy+9dZbdP7554tDlMRng4Zu8U2aNClpYMR37FdeeSXdddddrrQIWr9UjUoESKwBP8ZOHDy6zIEPP9ZOFgAWDXY5gOzVq5ezCKFu3bquOAgikR98ydp11llnOY9XEwt/gmi7nzrcBoBR0c9vABhVDW+88UZngeD06dOpYcOGJQaAUdbQj7cl8yAAFGR3y5YtxJ+SDn7cUr58eScJX7T5cQvP3eEgKSMjI2VWWx4fesXIgHQCQM7PQQePjCbmPgpK6OjnRUMv+GzQ0C2+sWPH+noEnEybIPVL5Q0/j0ij9PjJD75kXHFA/Prrrx8x71HyfPNbtpsAMEr6mQwAbdfwD3/4gzPNh0efmzVrVqIFoq6hX39L5UMAKMWsx3L5US4Hf/z4hS+46VbdJRYQ/PGPf3S2ouCDL/o8Ny5Oi0CK0rh161bn0R2vRL300ks9shxMcrcBbpQ0TCwCmTVrFp1wwgkOkfz7iSeeWOIiEJv14xstPt94FXDi4Hlv/Cgq1SIQXvHMqxQTx/XXX+/MGbR1EYgXfMnOjkGDBtG2bducLapsPtwEgHzDGCX9ivLtBmOUNOTrHwd/PI+WpxnwjWG6I+oapsMX9PcIAINmPEl9ice+vPXEq6++ekTwV/ixEu/FxR1TYtI6B3r8N2+RwicPz1/iE8nWbWBWr17tdCb8OIlXOSfmevDWNzzPj4/CGHft2kX8iJK3eOD5VbxfIs+/4nI4ILFtqxuv+BhvlDTkbWDYq7xdCh8835QfxxfeBiZK+iW2SeF5bvwYmG8qnn/+eWePP8bF8xr5xozPST4SW1DwCnueasFBH68Ctn0bGLf4eA9EfiLB+yHyzSTfiP71r3+ld955J5DpFl4vxXx94IUDfPDinCeeeMK5ieYtovhaGnX9GJdXjFHSkLdQ4icL77333hG7CFSrVs3ZF5CPOGjo1ddBpkcAGCTbKeriEaNUqygLr9HhO0AO9ngiOh+JTYS5Qy68EXSqFVRhQ022KTC3acqUKdSvXz+neYUx7t2719mSY968ec7qUw4C+QLPm2Y3atQobDjF6veKL2oacvBedCPoZ5555ogtQ6KmH4/+jRgxwpnDx+cNr2hOLHhgPfmmg2+qEgevDuZR98RG0DwiYftG0G7xcToOgjno5Q6YA0HugAcMGGDducYNSrXp8WWXXeZMM4mDfl4xRklDvlYkOwr3cXHQ0MqT53CjEADarA7aBgbAABgAA2AADIABAQYQAAqQiiLBABgAA2AADIABMGAzAwgAbVYHbQMDYAAMgAEwAAbAgAADCAAFSEWRYAAMgAEwAAbAABiwmQEEgDarg7aBATAABsAAGAADYECAAQSAAqSiSDAABsAAGAADYAAM2MwAAkCb1UHbwAAYAANgAAyAATAgwAACQAFSUSQYAANgAAyAATAABmxmAAGgzeqgbWAADIABMAAGwAAYEGAAAaAAqSgSDIABMAAGwAAYAAM2M4AA0GZ10DYwAAbAABgAA2AADAgwgABQgFQUCQbAABgAA2AADIABmxlAAGizOmgbGAADYAAMgAEwAAYEGEAAKEAqigQDYAAMgAEwAAbAgM0MIAC0WR20DQyAATAABsAAGAADAgwgABQgFUWCATAABsAAGAADYMBmBhAA2qwO2gYGwAAYAANgAAyAAQEGEAAKkIoiwQAYAANgAAyAATBgMwMIAG1WB20DA2AADIABMAAGwIAAAwgABUhFkWAADIABMAAGwAAYsJkBBIA2q4O2gQEwAAbAABgAA2BAgAEEgAKkokgwAAbAABgAA2AADNjMAAJAm9VB28AAGAADYAAMgAEwIMAAAkABUlEkGAADYAAMgAEwAAZsZgABoM3qoG1gAAyAATAABsAAGBBgAAGgAKkoEgyAATAABsAAGAADNjOAANBmddA2MAAGwAAYAANgAAwIMIAAUIBUFAkGwAAYAANgAAyAAZsZQABoszpoGxgAA2AADIABMAAGBBhAAChAKooEA2AADIABMAAGwIDNDCAAtFkdtA0MgAEwAAbAABgAAwIMIAAUIBVFggEwAAbAABgAA2DAZgb+H87RcQ42EO7PAAAAAElFTkSuQmCC\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Représenter la fonction sur l'intervalle [-2,2]\n",
    "plt.figure()\n",
    "X = np.linspace(-2,2,1000)\n",
    "plt.plot(-X,f(-X))\n",
    "plt.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "d1a4c255",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Définir le gradient de f\n",
    "def grad_f(x):\n",
    "    #return 4*x**3\n",
    "    return 8*x**7\n",
    "    #return 12*x**11\n",
    "    #return 2*x\n",
    "    #return np.exp(-1./(np.abs(x)))/x/np.sign(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "41190576",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "/* global mpl */\n",
       "window.mpl = {};\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(\n",
       "            '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",
       "\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 = document.createElement('div');\n",
       "    this.root.setAttribute('style', 'display: inline-block');\n",
       "    this._root_extra_style(this.root);\n",
       "\n",
       "    parent_element.appendChild(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 (fig.ratio !== 1) {\n",
       "            fig.send_message('set_device_pixel_ratio', {\n",
       "                device_pixel_ratio: fig.ratio,\n",
       "            });\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 = document.createElement('div');\n",
       "    titlebar.classList =\n",
       "        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
       "    var titletext = document.createElement('div');\n",
       "    titletext.classList = 'ui-dialog-title';\n",
       "    titletext.setAttribute(\n",
       "        'style',\n",
       "        'width: 100%; text-align: center; padding: 3px;'\n",
       "    );\n",
       "    titlebar.appendChild(titletext);\n",
       "    this.root.appendChild(titlebar);\n",
       "    this.header = titletext;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function () {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = (this.canvas_div = document.createElement('div'));\n",
       "    canvas_div.setAttribute(\n",
       "        'style',\n",
       "        'border: 1px solid #ddd;' +\n",
       "            'box-sizing: content-box;' +\n",
       "            'clear: both;' +\n",
       "            'min-height: 1px;' +\n",
       "            'min-width: 1px;' +\n",
       "            'outline: 0;' +\n",
       "            'overflow: hidden;' +\n",
       "            'position: relative;' +\n",
       "            'resize: both;'\n",
       "    );\n",
       "\n",
       "    function on_keyboard_event_closure(name) {\n",
       "        return function (event) {\n",
       "            return fig.key_event(event, name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    canvas_div.addEventListener(\n",
       "        'keydown',\n",
       "        on_keyboard_event_closure('key_press')\n",
       "    );\n",
       "    canvas_div.addEventListener(\n",
       "        'keyup',\n",
       "        on_keyboard_event_closure('key_release')\n",
       "    );\n",
       "\n",
       "    this._canvas_extra_style(canvas_div);\n",
       "    this.root.appendChild(canvas_div);\n",
       "\n",
       "    var canvas = (this.canvas = document.createElement('canvas'));\n",
       "    canvas.classList.add('mpl-canvas');\n",
       "    canvas.setAttribute('style', 'box-sizing: content-box;');\n",
       "\n",
       "    this.context = canvas.getContext('2d');\n",
       "\n",
       "    var backingStore =\n",
       "        this.context.backingStorePixelRatio ||\n",
       "        this.context.webkitBackingStorePixelRatio ||\n",
       "        this.context.mozBackingStorePixelRatio ||\n",
       "        this.context.msBackingStorePixelRatio ||\n",
       "        this.context.oBackingStorePixelRatio ||\n",
       "        this.context.backingStorePixelRatio ||\n",
       "        1;\n",
       "\n",
       "    this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
       "        'canvas'\n",
       "    ));\n",
       "    rubberband_canvas.setAttribute(\n",
       "        'style',\n",
       "        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
       "    );\n",
       "\n",
       "    // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
       "    if (this.ResizeObserver === undefined) {\n",
       "        if (window.ResizeObserver !== undefined) {\n",
       "            this.ResizeObserver = window.ResizeObserver;\n",
       "        } else {\n",
       "            var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
       "            this.ResizeObserver = obs.ResizeObserver;\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
       "        var nentries = entries.length;\n",
       "        for (var i = 0; i < nentries; i++) {\n",
       "            var entry = entries[i];\n",
       "            var width, height;\n",
       "            if (entry.contentBoxSize) {\n",
       "                if (entry.contentBoxSize instanceof Array) {\n",
       "                    // Chrome 84 implements new version of spec.\n",
       "                    width = entry.contentBoxSize[0].inlineSize;\n",
       "                    height = entry.contentBoxSize[0].blockSize;\n",
       "                } else {\n",
       "                    // Firefox implements old version of spec.\n",
       "                    width = entry.contentBoxSize.inlineSize;\n",
       "                    height = entry.contentBoxSize.blockSize;\n",
       "                }\n",
       "            } else {\n",
       "                // Chrome <84 implements even older version of spec.\n",
       "                width = entry.contentRect.width;\n",
       "                height = entry.contentRect.height;\n",
       "            }\n",
       "\n",
       "            // Keep the size of the canvas and rubber band canvas in sync with\n",
       "            // the canvas container.\n",
       "            if (entry.devicePixelContentBoxSize) {\n",
       "                // Chrome 84 implements new version of spec.\n",
       "                canvas.setAttribute(\n",
       "                    'width',\n",
       "                    entry.devicePixelContentBoxSize[0].inlineSize\n",
       "                );\n",
       "                canvas.setAttribute(\n",
       "                    'height',\n",
       "                    entry.devicePixelContentBoxSize[0].blockSize\n",
       "                );\n",
       "            } else {\n",
       "                canvas.setAttribute('width', width * fig.ratio);\n",
       "                canvas.setAttribute('height', height * fig.ratio);\n",
       "            }\n",
       "            canvas.setAttribute(\n",
       "                'style',\n",
       "                'width: ' + width + 'px; height: ' + height + 'px;'\n",
       "            );\n",
       "\n",
       "            rubberband_canvas.setAttribute('width', width);\n",
       "            rubberband_canvas.setAttribute('height', height);\n",
       "\n",
       "            // And update the size in Python. We ignore the initial 0/0 size\n",
       "            // that occurs as the element is placed into the DOM, which should\n",
       "            // otherwise not happen due to the minimum size styling.\n",
       "            if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
       "                fig.request_resize(width, height);\n",
       "            }\n",
       "        }\n",
       "    });\n",
       "    this.resizeObserverInstance.observe(canvas_div);\n",
       "\n",
       "    function on_mouse_event_closure(name) {\n",
       "        return function (event) {\n",
       "            return fig.mouse_event(event, name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mousedown',\n",
       "        on_mouse_event_closure('button_press')\n",
       "    );\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mouseup',\n",
       "        on_mouse_event_closure('button_release')\n",
       "    );\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'dblclick',\n",
       "        on_mouse_event_closure('dblclick')\n",
       "    );\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mousemove',\n",
       "        on_mouse_event_closure('motion_notify')\n",
       "    );\n",
       "\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mouseenter',\n",
       "        on_mouse_event_closure('figure_enter')\n",
       "    );\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mouseleave',\n",
       "        on_mouse_event_closure('figure_leave')\n",
       "    );\n",
       "\n",
       "    canvas_div.addEventListener('wheel', function (event) {\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        on_mouse_event_closure('scroll')(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.appendChild(canvas);\n",
       "    canvas_div.appendChild(rubberband_canvas);\n",
       "\n",
       "    this.rubberband_context = rubberband_canvas.getContext('2d');\n",
       "    this.rubberband_context.strokeStyle = '#000000';\n",
       "\n",
       "    this._resize_canvas = function (width, height, forward) {\n",
       "        if (forward) {\n",
       "            canvas_div.style.width = width + 'px';\n",
       "            canvas_div.style.height = height + 'px';\n",
       "        }\n",
       "    };\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
       "        event.preventDefault();\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 toolbar = document.createElement('div');\n",
       "    toolbar.classList = 'mpl-toolbar';\n",
       "    this.root.appendChild(toolbar);\n",
       "\n",
       "    function on_click_closure(name) {\n",
       "        return function (_event) {\n",
       "            return fig.toolbar_button_onclick(name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    function on_mouseover_closure(tooltip) {\n",
       "        return function (event) {\n",
       "            if (!event.currentTarget.disabled) {\n",
       "                return fig.toolbar_button_onmouseover(tooltip);\n",
       "            }\n",
       "        };\n",
       "    }\n",
       "\n",
       "    fig.buttons = {};\n",
       "    var buttonGroup = document.createElement('div');\n",
       "    buttonGroup.classList = 'mpl-button-group';\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",
       "            /* Instead of a spacer, we start a new button group. */\n",
       "            if (buttonGroup.hasChildNodes()) {\n",
       "                toolbar.appendChild(buttonGroup);\n",
       "            }\n",
       "            buttonGroup = document.createElement('div');\n",
       "            buttonGroup.classList = 'mpl-button-group';\n",
       "            continue;\n",
       "        }\n",
       "\n",
       "        var button = (fig.buttons[name] = document.createElement('button'));\n",
       "        button.classList = 'mpl-widget';\n",
       "        button.setAttribute('role', 'button');\n",
       "        button.setAttribute('aria-disabled', 'false');\n",
       "        button.addEventListener('click', on_click_closure(method_name));\n",
       "        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
       "\n",
       "        var icon_img = document.createElement('img');\n",
       "        icon_img.src = '_images/' + image + '.png';\n",
       "        icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
       "        icon_img.alt = tooltip;\n",
       "        button.appendChild(icon_img);\n",
       "\n",
       "        buttonGroup.appendChild(button);\n",
       "    }\n",
       "\n",
       "    if (buttonGroup.hasChildNodes()) {\n",
       "        toolbar.appendChild(buttonGroup);\n",
       "    }\n",
       "\n",
       "    var fmt_picker = document.createElement('select');\n",
       "    fmt_picker.classList = 'mpl-widget';\n",
       "    toolbar.appendChild(fmt_picker);\n",
       "    this.format_dropdown = fmt_picker;\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = document.createElement('option');\n",
       "        option.selected = fmt === mpl.default_extension;\n",
       "        option.innerHTML = fmt;\n",
       "        fmt_picker.appendChild(option);\n",
       "    }\n",
       "\n",
       "    var status_bar = document.createElement('span');\n",
       "    status_bar.classList = 'mpl-message';\n",
       "    toolbar.appendChild(status_bar);\n",
       "    this.message = status_bar;\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",
       "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",
       "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], msg['forward']);\n",
       "        fig.send_message('refresh', {});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
       "    var x0 = msg['x0'] / fig.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
       "    var x1 = msg['x1'] / fig.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / fig.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,\n",
       "        0,\n",
       "        fig.canvas.width / fig.ratio,\n",
       "        fig.canvas.height / fig.ratio\n",
       "    );\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",
       "    fig.rubberband_canvas.style.cursor = msg['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.handle_history_buttons = function (fig, msg) {\n",
       "    for (var key in msg) {\n",
       "        if (!(key in fig.buttons)) {\n",
       "            continue;\n",
       "        }\n",
       "        fig.buttons[key].disabled = !msg[key];\n",
       "        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
       "    if (msg['mode'] === 'PAN') {\n",
       "        fig.buttons['Pan'].classList.add('active');\n",
       "        fig.buttons['Zoom'].classList.remove('active');\n",
       "    } else if (msg['mode'] === 'ZOOM') {\n",
       "        fig.buttons['Pan'].classList.remove('active');\n",
       "        fig.buttons['Zoom'].classList.add('active');\n",
       "    } else {\n",
       "        fig.buttons['Pan'].classList.remove('active');\n",
       "        fig.buttons['Zoom'].classList.remove('active');\n",
       "    }\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",
       "            var img = evt.data;\n",
       "            if (img.type !== 'image/png') {\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",
       "                img.type = 'image/png';\n",
       "            }\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",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                img\n",
       "            );\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        } else if (\n",
       "            typeof evt.data === 'string' &&\n",
       "            evt.data.slice(0, 21) === 'data:image/png;base64'\n",
       "        ) {\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(\n",
       "                \"No handler for the '\" + msg_type + \"' message type: \",\n",
       "                msg\n",
       "            );\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(\n",
       "                    \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
       "                    e,\n",
       "                    e.stack,\n",
       "                    msg\n",
       "                );\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "};\n",
       "\n",
       "// from https://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",
       "    }\n",
       "    if (e.target) {\n",
       "        targ = e.target;\n",
       "    } else if (e.srcElement) {\n",
       "        targ = e.srcElement;\n",
       "    }\n",
       "    if (targ.nodeType === 3) {\n",
       "        // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "    }\n",
       "\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    var boundingRect = targ.getBoundingClientRect();\n",
       "    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
       "    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\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",
       " * https://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",
       "        }\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",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * this.ratio;\n",
       "    var y = canvas_pos.y * this.ratio;\n",
       "\n",
       "    this.send_message(name, {\n",
       "        x: x,\n",
       "        y: y,\n",
       "        button: event.button,\n",
       "        step: event.step,\n",
       "        guiEvent: simpleKeys(event),\n",
       "    });\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",
       "    // Prevent repeat events\n",
       "    if (name === 'key_press') {\n",
       "        if (event.key === this._key) {\n",
       "            return;\n",
       "        } else {\n",
       "            this._key = event.key;\n",
       "        }\n",
       "    }\n",
       "    if (name === 'key_release') {\n",
       "        this._key = null;\n",
       "    }\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.key !== 'Control') {\n",
       "        value += 'ctrl+';\n",
       "    }\n",
       "    else if (event.altKey && event.key !== 'Alt') {\n",
       "        value += 'alt+';\n",
       "    }\n",
       "    else if (event.shiftKey && event.key !== 'Shift') {\n",
       "        value += 'shift+';\n",
       "    }\n",
       "\n",
       "    value += 'k' + event.key;\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, { key: value, 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",
       "\n",
       "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
       "// prettier-ignore\n",
       "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\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\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";/* global mpl */\n",
       "\n",
       "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.binaryType = comm.kernel.ws.binaryType;\n",
       "    ws.readyState = comm.kernel.ws.readyState;\n",
       "    function updateReadyState(_event) {\n",
       "        if (comm.kernel.ws) {\n",
       "            ws.readyState = comm.kernel.ws.readyState;\n",
       "        } else {\n",
       "            ws.readyState = 3; // Closed state.\n",
       "        }\n",
       "    }\n",
       "    comm.kernel.ws.addEventListener('open', updateReadyState);\n",
       "    comm.kernel.ws.addEventListener('close', updateReadyState);\n",
       "    comm.kernel.ws.addEventListener('error', updateReadyState);\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",
       "        var data = msg['content']['data'];\n",
       "        if (data['blob'] !== undefined) {\n",
       "            data = {\n",
       "                data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
       "            };\n",
       "        }\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(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 = document.getElementById(id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm);\n",
       "\n",
       "    function ondownload(figure, _format) {\n",
       "        window.open(figure.canvas.toDataURL());\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\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;\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",
       "    fig.cell_info[0].output_area.element.on(\n",
       "        'cleared',\n",
       "        { fig: fig },\n",
       "        fig._remove_fig_handler\n",
       "    );\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
       "    var width = fig.canvas.width / fig.ratio;\n",
       "    fig.cell_info[0].output_area.element.off(\n",
       "        'cleared',\n",
       "        fig._remove_fig_handler\n",
       "    );\n",
       "    fig.resizeObserverInstance.unobserve(fig.canvas_div);\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.innerHTML =\n",
       "        '<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 / this.ratio;\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] =\n",
       "        '<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 () {\n",
       "        fig.push_to_output();\n",
       "    }, 1000);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function () {\n",
       "    var fig = this;\n",
       "\n",
       "    var toolbar = document.createElement('div');\n",
       "    toolbar.classList = 'btn-toolbar';\n",
       "    this.root.appendChild(toolbar);\n",
       "\n",
       "    function on_click_closure(name) {\n",
       "        return function (_event) {\n",
       "            return fig.toolbar_button_onclick(name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    function on_mouseover_closure(tooltip) {\n",
       "        return function (event) {\n",
       "            if (!event.currentTarget.disabled) {\n",
       "                return fig.toolbar_button_onmouseover(tooltip);\n",
       "            }\n",
       "        };\n",
       "    }\n",
       "\n",
       "    fig.buttons = {};\n",
       "    var buttonGroup = document.createElement('div');\n",
       "    buttonGroup.classList = 'btn-group';\n",
       "    var button;\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",
       "            /* Instead of a spacer, we start a new button group. */\n",
       "            if (buttonGroup.hasChildNodes()) {\n",
       "                toolbar.appendChild(buttonGroup);\n",
       "            }\n",
       "            buttonGroup = document.createElement('div');\n",
       "            buttonGroup.classList = 'btn-group';\n",
       "            continue;\n",
       "        }\n",
       "\n",
       "        button = fig.buttons[name] = document.createElement('button');\n",
       "        button.classList = 'btn btn-default';\n",
       "        button.href = '#';\n",
       "        button.title = name;\n",
       "        button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
       "        button.addEventListener('click', on_click_closure(method_name));\n",
       "        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
       "        buttonGroup.appendChild(button);\n",
       "    }\n",
       "\n",
       "    if (buttonGroup.hasChildNodes()) {\n",
       "        toolbar.appendChild(buttonGroup);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = document.createElement('span');\n",
       "    status_bar.classList = 'mpl-message pull-right';\n",
       "    toolbar.appendChild(status_bar);\n",
       "    this.message = status_bar;\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = document.createElement('div');\n",
       "    buttongrp.classList = 'btn-group inline pull-right';\n",
       "    button = document.createElement('button');\n",
       "    button.classList = 'btn btn-mini btn-primary';\n",
       "    button.href = '#';\n",
       "    button.title = 'Stop Interaction';\n",
       "    button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
       "    button.addEventListener('click', function (_evt) {\n",
       "        fig.handle_close(fig, {});\n",
       "    });\n",
       "    button.addEventListener(\n",
       "        'mouseover',\n",
       "        on_mouseover_closure('Stop Interaction')\n",
       "    );\n",
       "    buttongrp.appendChild(button);\n",
       "    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
       "    titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
       "    var fig = event.data.fig;\n",
       "    if (event.target !== this) {\n",
       "        // Ignore bubbled events from children.\n",
       "        return;\n",
       "    }\n",
       "    fig.close_ws(fig, {});\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function (el) {\n",
       "    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
       "    // this is important to make the div 'focusable\n",
       "    el.setAttribute('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",
       "    } else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which === 13) {\n",
       "        this.canvas_div.blur();\n",
       "        // select the cell after this one\n",
       "        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
       "        IPython.notebook.select(index + 1);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "};\n",
       "\n",
       "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(\n",
       "        'matplotlib',\n",
       "        mpl.mpl_figure_comm\n",
       "    );\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuxdB3wVVfY+SQi9V+kgRQUUKUoV6azYsCu7tr+L2DvYVgUVWcXeYV0bKrpWFFGKCCq9i9JEkN57SwJJ/jODL4YUMjP3nLn33XxvNz+E3HPu/crkfpl5My8h03kRXmAADIABMAAGwAAYAAOFhoEEBMBCozWAggEwAAbAABgAA2DAYwABEEYAA2AADIABMAAGwEAhYwABsJAJDrhgAAyAATAABsAAGEAAhAfAABgAA2AADIABMFDIGEAALGSCAy4YAANgAAyAATAABhAA4QEwAAbAABgAA2AADBQyBhAAC5nggAsGwAAYAANgAAyAAQRAeAAMgAEwAAbAABgAA4WMAQTAQiY44IIBMAAGwAAYAANgAAEQHgADYAAMgAEwAAbAQCFjAAGwkAkOuGAADIABMAAGwAAYQACEB8AAGAADYAAMgAEwUMgYQAAsZIIDLhgAA2AADIABMAAGEADhATAABsAAGAADYAAMFDIGEAALmeCACwbAABgAA2AADIABBEB4AAyAATAABsAAGAADhYwBBMBCJjjgggEwAAbAABgAA2AAARAeAANgAAyAATAABsBAIWMAAbCQCQ64YAAMgAEwAAbAABhAAIQHwAAYAANgAAyAATBQyBhAACxkggMuGAADYAAMgAEwAAYQAOEBMAAGwAAYAANgAAwUMgYQAAuZ4IALBsAAGAADYAAMgAEEQHgADIABMAAGwAAYAAOFjAEEwEImOOCCATAABsAAGAADYAABEB4AA2AADIABMAAGwEAhYwABsJAJDrhgAAyAATAABsAAGEAAhAfAABgAA2AADIABMFDIGEAALGSCAy4YAANgAAyAATAABhAA4QEwAAbAABgAA2AADBQyBhAAC5nggAsGwAAYAANgAAyAAQRAeAAMgAEwAAbAABgAA4WMAQTAQiY44IIBMAAGwAAYAANgAAEQHgADYAAMgAEwAAbAQCFjAAGwkAkOuGAADIABMAAGwAAYQACEB8AAGAADYAAMgAEwUMgYQAAsZIIDLhgAA2AADIABMAAGEADhATAABsAAGAADYAAMFDIGEAALmeCACwbAABgAA2AADIABBEB4AAyAATAABsAAGAADhYwBBMBCJjjgggEwAAbAABgAA2AAARAeAANgAAyAATAA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VZ577jl7+OGHbdSoUbbeeuvZpEmT7Oijj7ZDDjnErrrqqo7d6WSR6Rg7dqxtsMEGdtFFF5kuGJ9++mn4eTpv5bzzzgtmQb+hfNddd+U2gD/88IPdc88988KReVxxxRW9hWdl4quThiNHjgza6YFD5ZhjjrG1117bnn766QENoFf9dM7pHJNJ2nHHHe22226zO++80z7++GNbc801+8X01Vdf2WabbRbOzWOPPdZeffVVO+GEE+zBBx+0/fff310+Fo0vMw+6fvT91YyVVlrJFl10UXfxPfvss0GDLbbYIvBfkAGsm34CXjTGOmk4YsQIO+igg2zrrbe2f//9N0x4fPjhh+H8W3rppdvmWx01dHfi9BkQBtCpOnqyveWWW+zLL79sO0LNHGkG4pRTTrHTTz89HKM9oVZZZZXwFKUblNciw6px550B1HFPPPGE13D6jStvfHXSULNAm2yySZh51Qysiv6+/fbbhyf4Tk/tmgH0qp/ikHnQeZaVjTfeOMwiaXaiteg80+ynWGRFs38ffPCBvf766+7ys2h8mXnQTO9As7ruAp0zIP0W+4IMYN30a+WcJ8Y6a/jjjz/ayiuvbJql3WWXXdqmWd019HbuYAC9KTJ3POecc45pZvDtt99uO0IZw3XXXdfeffdd23zzzecds/fee4eLd+trU09h5jVIGrMMhMyfZv0U16677hpmPXWh8FryxlcnDe++++7w6rPVtEuTa6+91o444oi2cnjV759//rGlllrKHnnkEdt3333njX306NFhiYJuQq1FNyWda9dff/28f5LpOPDAA+2PP/6wwYMHu0nJMvFl5kGzun/99Vcw/LoOtXst7CbQuQPJY47qpF87vnlirLOGn3/+ua2//vphFlAz7e1K3TV0d97MmYWY7W1QC/t4vvjiizAzcfXVV9tRRx3VFsdrr70WXltNmzYtzARmRa/lvvnmG3v++efdYsxrkBSAXmMts8wyttZaa5mm/88999zwukDrfrz+Qkre+Oqk4SWXXBKWGnz22Wfz5ZWWHsj86Rdr2hWv+k2fPt3WWGON8ApRa4+yojj18KTXoK1FscrQnnXWWfP+KdNQ7a222mpuzrky8SlmLSHZcsstw9uE++67z2699VaTqeg0I+Ml4DzmqE76lTWAddVQNkSTF5p9fuWVVzqmVd019HK+ZONgBjChIueff374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\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Représenter le gradient de f sur l'intervalle [-2,2]\n",
    "plt.figure()\n",
    "X = np.linspace(-2,2,1000)\n",
    "plt.plot(-X,grad_f(-X))\n",
    "plt.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "b54981c1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Mettre en œuvre la méthode du gradient\n",
    "# %load http://math.univ-lyon1.fr/homes-www/lagoutiere/Enseignement/M2_SMSD/TP_2/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "71dab1e1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Tester la méthode en partant de x0 = 1 avec une tolérance 10^{⁻14} et un pas 0.2\n",
    "# %load http://math.univ-lyon1.fr/homes-www/lagoutiere/Enseignement/M2_SMSD/TP_2/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8f0d4754",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Avec scipy.stats.linregress évaluer numériquement l'ordre de convergence : évaluer le nombre a pour lequel \n",
    "# l'erreur est en 1/k^a à l'étape k (asymptotiquement). \n",
    "# On pourra évaluer l'erreur |x_k - 0| ou |f(x_k) - f(0)|, au choix. \n",
    "# %load http://math.univ-lyon1.fr/homes-www/lagoutiere/Enseignement/M2_SMSD/TP_2/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "ffb76458",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Représenter, en échelle logarithmique, f(x_k) en fonction de k. \n",
    "# %load http://math.univ-lyon1.fr/homes-www/lagoutiere/Enseignement/M2_SMSD/TP_2/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "e9f20721",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Mettre en œuvre la méthode de gradient accéléré de Nesterov. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "a5ef723f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# %load http://math.univ-lyon1.fr/homes-www/lagoutiere/Enseignement/M2_SMSD/TP_2/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "1953f4ac",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# %load http://math.univ-lyon1.fr/homes-www/lagoutiere/Enseignement/M2_SMSD/TP_2/"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e6ff28d5",
   "metadata": {},
   "source": [
    "# Exercice 2\n",
    "\n",
    "## Descente de gradient pour une fonctionnelle non régulière\n",
    "\n",
    "Ici on se propose d'observer le comportement d'algorithmes pour des fonctionnelles non régulières (typiquement lipschitziennes mais pas de classe $\\mathcal{C}^1$). \\\n",
    "Dans cet exercice nous allons utiliser l'opérateur proximal pour l'exemple typique d'une telle fonctionnelle : la norme $|| \\cdot ||_1$. Rappelons que la méthode de gradient modifiée qui utilise cet opérateur proximal est \n",
    "$$\n",
    "x_{k+1} = prox_{\\alpha || \\cdot ||_1}(x_k), \\quad k \\in \\mathbb{N}, \n",
    "$$ \n",
    "où l'opérateur $prox_g$ d'une fonction $g$ est défini par \n",
    "$$\n",
    "prox_{g}(x) = argmin_{y \\in \\mathbb{R}^d} g(y) + \\frac{|| x - y ||_2^2}{2}\n",
    "$$\n",
    "pour $g : \\mathbb{R}^d \\longrightarrow \\mathbb{R}$ donnée (en python notre fonction associée sera $prox_{g}(x,\\alpha)$ et prendra les deux variables $x$ et $\\alpha$). \n",
    "\n",
    "**Remarque** Il est important de comprendre en quoi l'algorithme du gradient proximal est un algorithme de gradient implicite. \n",
    "\n",
    "Enfin nous allons considérer un problème où il s'agira de minimiser $f(x) = g(x) + \\epsilon|| x ||_1$ où $g$ est convexe et régulière et $\\epsilon$ est un paramètre de pénalisation devant être positif et petit. Pour cela nous utiliserons l'algorithme de splitting explicite-implicite (« forward-backward ») suivant : \n",
    "$$\n",
    "\\begin{array}{l}\n",
    "x_{k+1/2} = x_k - \\alpha \\nabla g(x_k), \\\\\n",
    "x_{k+1} = prox_{\\epsilon \\alpha|| \\cdot ||_1} (x_{k+1/2})\n",
    "\\end{array}\n",
    "$$ \n",
    "pour $k \\in \\mathbb{N}$ ($\\alpha$ est le pas de la méthode). \n",
    "\n",
    "**Remarque** Cet algorithme combine donc deux méthode : une méthode de splitting et une méthode proximale. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3a9abb15",
   "metadata": {},
   "source": [
    "## Question 1\n",
    "\n",
    "Observer le comportement du gradient à pas fixe, \n",
    "du gradient accéléré de Nesterov (pourquoi pas !) puis du gradient à pas variable 1/k\n",
    "pour la fonctionnelle $|\\cdot |$ en dimension 1. \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "980e01e2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Définir la fonction | |, son gradient, et mettre en œuvre les trois \n",
    "# algorithmes évoqués ci-dessus (et les tester avec un pas 0,4, une tolérance 10^{-6} et x_0 = \\pi. \n",
    "# Gradient pour la norme L1, pas régulière... \n",
    "# %load http://math.univ-lyon1.fr/homes-www/lagoutiere/Enseignement/M2_SMSD/TP_2/"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "942c9e6f",
   "metadata": {},
   "source": [
    "## Question 2\n",
    "Calculer l'opérateur proximal pour la fonction $\\alpha|\\cdot |$, pour $\\alpha \\in \\mathbb{R}_+^*$ (dans la suite $\\alpha$ sera la pas de la méthode). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "f586b032",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Opérateur proximal pour (x,alpha) --> alpha |x|. \n",
    "# %load http://math.univ-lyon1.fr/homes-www/lagoutiere/Enseignement/M2_SMSD/TP_2/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "eafdee6b",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# Représenter l'opérateur proximal, pour alpha = 0,5 par exemple. \n",
    "# %load http://math.univ-lyon1.fr/homes-www/lagoutiere/Enseignement/M2_SMSD/TP_2/"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f2140147",
   "metadata": {},
   "source": [
    "## Question 3\n",
    "On généralise à la dimension quelconque. On remplace la fonction $|\\cdot |$ par la norme $l^1$. On va : \n",
    "- définir l'opérateur proximal associé à $\\alpha || \\cdot ||_1$ ; \n",
    "- mettre en œuvre la méthode du gradient modifié utilisant cet opérateur proximal ; \n",
    "- vérifier qu'elle fonctionne (mais garder en mémoire qu'on a triché : l'opérateur proximal est calculable seulement dans les cas où le minimum de la fonction est connu !) ; \n",
    "- mettre en œuvre la méthode de splitting pour minimiser $x \\longmapsto \\epsilon || x ||_1 + ||Ax - b||_2^2$ où \n",
    "$$\n",
    "\\epsilon > 0 \\text{ est petit,}\\quad \n",
    "A = \\left(\\begin{array}{cccc}\n",
    "1 & 0 & 0 & 0 \\\\\n",
    "0 & 1 & 0 & 0\\\\\n",
    "0 & 0 & 1 & 0\\\\\n",
    "\\end{array}\\right)\n",
    "\\quad \\text{et} \\quad \n",
    "b = \\left(\\begin{array}{c}\n",
    "1\\\\\n",
    "1\\\\\n",
    "1\n",
    "\\end{array}\\right). \n",
    "$$\n",
    "### Important : réfléchir à ce problème de minimisation et comprendre à quoi il correspond. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "68674122",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Définir l'opérateur proximal. \n",
    "# %load http://math.univ-lyon1.fr/homes-www/lagoutiere/Enseignement/M2_SMSD/TP_2/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "c6e69a1e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Mettre en œuvre l'algorithme de gradient modifié avec l'opérateur proximal. \n",
    "# %load http://math.univ-lyon1.fr/homes-www/lagoutiere/Enseignement/M2_SMSD/TP_2/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "b59a5a99",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Tester ce dernier. \n",
    "# %load http://math.univ-lyon1.fr/homes-www/lagoutiere/Enseignement/M2_SMSD/TP_2/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "cc51fe0e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Définir la fonction h et son gradient (ci-dessous elle est notée mc, pour moindres carrés). \n",
    "# Définir la fonction norme l^1 et son gradient. \n",
    "# Mettre en œuvre le gradient avec splitting (sans opérateur proximal : il n'y a pas de raison que ça converge). \n",
    "# Mettre en œuvre le gradient modifié avec l'opérateur proximal et le splitting. \n",
    "# Cette fonction prendra un argument supplémentaire : epsilon. \n",
    "# On peut ensuite s'amuser à mettre en œuvre le même algorithme mais accéléré avec la méthode de Nesterov. \n",
    "# Tester le tout (avec par exemple eps = 0.01, un pas 0.1...) ! \n",
    "# Tester aussi la méthode du gradient pour la fonction h seule (sans la partie singulière). \n",
    "# %load http://math.univ-lyon1.fr/homes-www/lagoutiere/Enseignement/M2_SMSD/TP_2/"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.7.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
