{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <center> R4.04 Méthodes d'optimisation <br> TP3b - Interpolation polynomiale : detection et correction d'erreurs </center>\n",
    "<center> 2025/2026- Thibault Godin & Gauthier Quillan </center>\n",
    "<center> IUT de Vannes, BUT Informatique </center>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Le but de ce TP est de présenter une seconde applications de l'interpolation polynôminale :  un exemple jouet de protocole de _correction d'erreurs_."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import random\n",
    "\n",
    "# Affichage graphique\n",
    "\n",
    "#%matplotlib notebook \n",
    "# enable interactivity of plots\n",
    "# attention a bien fermer les fenetres plt après chaque visualisalgèbreation\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "import itertools\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "from mpl_toolkits.mplot3d import Axes3D \n",
    "import matplotlib.colors as mcolors\n",
    "\n",
    "names_col = list(mcolors.XKCD_COLORS)\n",
    "\n",
    "import time\n",
    "\n",
    "from collections import Counter\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "On rappelle le théorème central de l'interpolation :\n",
    "\n",
    "\n",
    "<div class=\"alert alert-block alert-info\"><b>Théorème</b> \n",
    "    \n",
    "    \n",
    "Soient $n$ points $(x_1,y_1), ..., (x_n,y_n)$ de $\\mathbb{R}^2$ \n",
    "\n",
    "    \n",
    "Alors il existe un unique polynôme $P_{(x_1,y_1), ..., (x_n,y_n)}$ de degré inférieur ou égal à $n-1$  tel que $P_{(x_1,y_1), ..., (x_n,y_n)}(x_i) = y_i$\n",
    "   \n",
    "</div>\n",
    "\n",
    "Les fonctions suivantes permettent de faire une interpolation polynomiale par la méthode de Lagrange (voir TP3a). Plus précisément, à partir des coordonnées `X` et `Y` des noeuds d'interpolation, `pol_Lagrange(varX,X,Y)` calcule le polynome $P$ passant par tout les noeuds d'interpolation et renvoie $P(varX)$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "def pol_li(varX,i,X,Y):\n",
    "    li=1\n",
    "    for j in range(len(X)):\n",
    "        if i!=j:\n",
    "            li=li*((varX-X[j])/(X[i]-X[j]))\n",
    "    return Y[i]*li\n",
    "\n",
    "\n",
    "\n",
    "def pol_Lagrange(varX,X,Y):\n",
    "    l=0\n",
    "    for i in range(len(X)):\n",
    "        l=l+pol_li(varX,i,X,Y)\n",
    "        \n",
    "    return np.round(l)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Suréchantillonage et introduction aux codes de Reed-Solomon\n",
    "\n",
    "\n",
    "Le but de cette partie est de vous donner un protocole de correction d'erreur qui peut-être vu comme une (grosse) simplification des codes de Reed-Solomon.\n",
    "\n",
    "Le principe est le suivant :\n",
    "\n",
    "On veut transmettre un message de $k$ lettres (nombres entiers) $m_0,...,m_{k-1} $ sur un canal bruité.\n",
    "\n",
    "Pour cela, on va transmettre les $k$ lettres plus $t$ lettres supplémentaires $r_0,...,r_{t-1}$, construites comme suit :\n",
    "- on calcule le polynôme d'interpolation $P=P_{(0,m_0),...,(k-1,m_{k-1})}$ \n",
    "- $r_i = P(k+i)$\n",
    "    \n",
    "    \n",
    "On transmet le vecteur $[m_0,...,m_{k-1},r_0,...,r_{t-1}]$\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**question 1**\n",
    "\n",
    "1. Écrire une fonction `lettreSup(t,xm,m)` calculant `r` les $t$ lettres supplémentaires ainsi que `xr` leur indice (les $t$ abscisses des lettres supplémentaires).\n",
    "2. Compléter la légende de la représentation graphique  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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aVDLQXrjzjesLofPbwD5wu09Trfeeqvmzp2r3377TZK0ceNGLVmyRPfcc48kKTExUcnJyYqLi3O+Jzg4WDExMVq+fLkkafny5SpVqpQzNElSXFycPDw8tHLlSmebli1bOkOTJMXHxyshIUHHjx93tsm5n+w22fu5UEZGhtLS0lweAADgyrYdoccJQNHn9skh+vfvr7S0NNWsWVOenp6y2+1655131KVLF0lScnKyJCk0NNTlfaGhoc51ycnJCgkJcS3Uy0tlypRxaRMdHX3RNrLXlS5dWsnJyVfcz4WGDBmiN96w/i9lAAAUFsYY51C92uVrW1wNAOQft/c4ffvttxo/frwmTJigdevWady4cfr3v/+tcePGuXtXbjdgwAClpqY6H/v27bO6JAAACrT9afuVlpEmT5unqpetbnU5AJBv3N7j9Morr6h///7q3LmzJKlu3bras2ePhgwZom7duiksLEySdOjQIYWHhzvfd+jQITVo0ECSFBYWppSUFJftZmZm6tixY873h4WF6dChQy5tsl/n1iZ7/YV8fX3l6+t7LYcNAECxlN3bVK1sNfl4+uTSGgAKL7f3OJ0+fVoeHq6b9fT0lMPhkCRFR0crLCxMc+fOda5PS0vTypUrFRsbK0mKjY3ViRMntHbtWmebefPmyeFwKCYmxtlm0aJFOn/+vLPNnDlzVKNGDZUuXdrZJud+sttk7wcAAFyf7KnI65Tn+iYARZvbg9P999+vd955RzNnztTu3bs1depU/ec//9EDDzwgSbLZbOrbt6/efvttTZ8+XZs3b1bXrl0VERGh9u3bS5Jq1aqlNm3a6JlnntGqVau0dOlS9erVS507d1ZERIQk6dFHH5WPj4+6d++urVu3atKkSRo5cqT69evnrKVPnz6aPXu23n//fe3YsUODBw/WmjVr1KtXL3cfNgAAxZJzKnKCE4Aizu1D9T788EMNHDhQf//735WSkqKIiAg999xzGjRokLPNP/7xD506dUrPPvusTpw4odtuu02zZ8+Wn5+fs8348ePVq1cvtWrVSh4eHurYsaNGjRrlXB8cHKxffvlFPXv2VOPGjVWuXDkNGjTI5V5Pt956qyZMmKDXXntN//znP1WtWjVNmzZNN998s7sPGwCAYmlLSta9EZkYAkBR5/b7OBUl3AcCAIDLcxiHAocE6vT509rec7tqlqtp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2t5++2117dpVJUuWVFRUlKZPn67Dhw+rXbt2KlmypOrVq6c1a9Zc9XbfffddPfXUUwoMDFTFihX12WefOddHR0dLkho2bCibzaY77rhDkrR69WrdfffdKleunIKDg3X77bdr3bp1LvvOOVQv+7xMmjRJt99+u/z8/DR+/HhJ0hdffKFatWrJz89PNWvW1JgxY5zbOHfunHr16qXw8HD5+fkpKipKQ4YMueK5LMoITgAAwDlMr2kEN77N1ZQpUqdO0v79rssPHMhafoPCU69evbR8+XJNnDhRmzZt0oMPPqg2bdpo586duvXWWzVixAgFBQUpKSlJSUlJevnllzVlyhRVqFBBb775pnN5ttOnT2vYsGH64osvtHXrVoWEhFxxH5LUs2dPZWRkaNGiRdq8ebOGDRumkiVLXrLeNWvWqHfv3nrzzTeVkJCg2bNnq2XLlld93AMHDlTHjh21ceNGdenSRZ07d9b27dtd2rzyyit66aWXtH79esXGxur+++/X0aNHL7m9Xbt2qU2bNurYsaM2bdqkSZMmacmSJerVq5dLuw8++EDNmzfX+vXr1bZtWz3++OPq2rWrHnvsMa1bt05VqlRR165dlX2nn7xu9/3331eTJk20fv16/f3vf1ePHj2UkJAgSc4esF9//VVJSUma8uf31smTJ9WtWzctWbJEK1asULVq1XTvvffq5MmTVzx3/fv3V58+fbR9+3bFx8dr/PjxGjRokN555x1t375d7777rgYOHKhx48ZJkkaNGqXp06fr22+/VUJCgsaPH69KlSrl4V+piDK4rNTUVCPJpKamWl0KAAD5qvsP3Y0Gy/Sf09/qUq7blT6/z5w5Y7Zt22bOnDlzbRvPzDSmQgVjpEs/bDZjIiOz2rnZ7bffbvr06WOMMWbPnj3G09PTHDhwwKVNq1atzIABA4wxxnz55ZcmODj4ou1ERUWZDz74wGXZl19+aSSZDRs2OJflZR9169Y1gwcPzlP933//vQkKCjJpaWmXXH+puurXr29ef/1152tJ5vnnn3dpExMTY3r06GGMMSYxMdFIMkOHDnWuP3/+vKlQoYIZNmyYMcaY+fPnG0nm+PHjxhhjunfvbp599lmXbS5evNh4eHg4v0+ioqLMY4895lyflJRkJJmBAwc6ly1fvtxIMklJSde8XYfDYUJCQszHH3/scjzr16+/5DnLZrfbTWBgoPnxxx9dztXUqVNdtjNixAiX91WpUsVMmDDBZdlbb71lYmNjjTHGvPDCC+auu+4yDofjivsvzK7mZwJ/UgIAAH9NDMGMele2ePHFPU05GSPt25fV7s9hVflh8+bNstvtql69usvyjIwMlS1b9pq26ePjo3r16l3VPnr37q0ePXrol19+UVxcnDp27OiyjZzuvvtuRUVFqXLlymrTpo3atGmjBx54QCVKlLiqOmNjYy96feHkCTnbeHl5qUmTJhf1SmXbuHGjNm3a5By6JknGGDkcDiUmJqpWrVqS5HJcoaGhkqS6detetCwlJUVhYWHXtF2bzaawsDClpKRc8RwcOnRIr732mhYsWKCUlBTZ7XadPn1ae/fuveL7ck56cerUKe3atUvdu3fXM88841yemZmp4OBgSdITTzyhu+++WzVq1FCbNm103333qXXr1lfcR1FGcAIAoJg7cfaEth3eJkm6pcItFldTwOUY2uaWdtcoPT1dnp6eWrt2rTwvmJDickPlcuPv7++85imv+3j66acVHx+vmTNn6pdfftGQIUP0/vvv64UXXrho+4GBgVq3bp0WLFigX375RYMGDdLgwYO1evVqlSpVSh4eHs5hbtnOnz9/TcdyNdLT0/Xcc8+pd+/eF62rWLGi8+ucEylkn6dLLXM4HNe83eztZG/jcrp166ajR49q5MiRioqKkq+vr2JjY3Xu3Lkrvi8gIMD5dXp6uiTp888/V0yM6w2vs/+9GzVqpMTERM2aNUu//vqrHnroIcXFxblcV1acEJwAACjmlu1bJokb3+ZJeLh7212jhg0bym63KyUlRS1atLhkGx8fH9nt9jwvv5Z9SFJkZKSef/55Pf/88xowYIA+//zzSwYnKav3Jy4uTnFxcXr99ddVqlQpzZs3Tx06dFD58uVdrrlKS0tTYmLiRdtYsWKFunbt6vK6YcOGF7XJvn4qMzNTa9euvejaomyNGjXStm3bVLVq1cufjGvgju36+PhI0kX/XkuXLtWYMWN07733SpL27dunI0eOXNW2Q0NDFRERoT/++ENdunS5bLugoCA9/PDDevjhh9WpUye1adNGx44dU5kyZa7yaAo/ghMAAMXc4j2LJUktoi7/yzH+1KKFVKFC1kQQF/SOSJJstqz1Vwga7lC9enV16dJFXbt21fvvv6+GDRvq8OHDmjt3rurVq6e2bduqUqVKSk9P19y5c1W/fn2VKFFCJUqUUKVKlbRo0SJ17txZvr6+Kleu3DXvo2/fvrrnnntUvXp1HT9+XPPnz3cOQbvQjBkz9Mcff6hly5YqXbq0fvrpJzkcDtWoUUOSdNddd2ns2LG6//77VapUKQ0aNOiini5Jmjx5spo0aaLbbrtN48eP16pVq/Tf//7Xpc1HH32katWqqVatWvrggw90/PhxPfXUU5es69VXX9Utt9yiXr166emnn1ZAQIC2bdumOXPmaPTo0Vfzz+L27YaEhMjf31+zZ89WhQoV5Ofnp+DgYFWrVk3/+9//1KRJE6WlpemVV16Rv7//Vdf4xhtvqHfv3goODlabNm2UkZGhNWvW6Pjx4+rXr5/+85//KDw8XA0bNpSHh4cmT56ssLCwS94frDhgVj0AAIq5xXuzglPLilc/w1mx4+kpjRyZ9XWOYW0ur0eMuCH3c/ryyy/VtWtXvfTSS6pRo4bat2+v1atXO4eB3XrrrXr++ef18MMPq3z58ho+fLgk6c0339Tu3btVpUoVlS9f/rr2Ybfb1bNnT9WqVUtt2rRR9erVXaazzqlUqVKaMmWK7rrrLtWqVUuffPKJvvnmG9WpU0eSNGDAAN1+++2677771LZtW7Vv315VqlS5aDtvvPGGJk6cqHr16umrr77SN998o9q1a7u0GTp0qIYOHar69etryZIlmj59+mUDYr169bRw4UL99ttvatGihRo2bKhBgwYpIiLiiucmN+7YrpeXl0aNGqVPP/1UERERateunSTpv//9r44fP65GjRrp8ccfV+/evRUScvW9xU8//bS++OILffnll6pbt65uv/12jR071jkNemBgoIYPH64mTZqoadOm2r17t3766adidX+vnGzmwsGkcEpLS1NwcLBSU1MVFBRkdTkAALjdmfNnVGpYKZ2zn9POF3aqahn3DleywpU+v8+ePavExERFR0fLz8/v2ncyZYrUp4/rRBGRkVmhqUOHa98urshms2nq1Klq3779Jdfv3r1b0dHRWr9+vRo0aHBDa0PhdDU/ExiqBwBAMbbqwCqds59TWMkwVSl98V/3cRkdOkjt2mXNnpeUlHVNU4sWN6SnCYA1CE4AABRjzmF6US1dZlRDHnh65uuU4wAKFoITAADFWHZwalGRiSFQ8OV2hUmlSpVybQNcq+J5ZRcAAFCmI9M5FTnBCQCujOAEAEAxtTF5o9LPpSvYN1g3h9xsdTkAUKARnAAAKKYW7VkkSbqt4m3y9GBSAwC4EoITAADFFNc3AUDeEZwAACiGjDFasneJJKlFFMEJAHJDcAIAoBhKOJqgw6cPy8/LT00imlhdDgDkiw0bNui9995TZmbmdW+L4AQAQDGUfX3TLRVukY+nj8XVoDB44okn1L59+xuyL5vNpmnTpt2QfV3JjTxmK1SqVEkjRoywuozrsnv3btlsNm3YsOGidceOHVPHjh1Vq1YteXld/12YuI8TAADFENc3AVi9erUCAgLy3H7BggW68847dfz4cZUqVSr/CnMDY4y6du2qV199Vffdd59btklwAgCgmDHGaMHuBZKkllEtrS0G+ercuXPy8aFHEZdWvnx5S/ZrjJHdbndLL9Dl2Gw2zZgxw63bZKgeAADFzO/Hftf+tP3y8fTRrZG3Wl0O8ujkyZPq0qWLAgICFB4erg8++EB33HGH+vbt62xTqVIlvfXWW+ratauCgoL07LPPSpJeffVVVa9eXSVKlFDlypU1cOBAnT9/3vm+wYMHq0GDBvr0008VGRmpEiVK6KGHHlJqaupFdfz73/9WeHi4ypYtq549e7psJyMjQy+//LJuuukmBQQEKCYmRgsWLLjice3cuVMtW7aUn5+fateurTlz5risX7BggWw2m06cOOFctmHDBtlsNu3evfuy27XZbPr44491zz33yN/fX5UrV9Z3333n0mbz5s2666675O/vr7Jly+rZZ59Venr6Jbf31VdfqWzZssrIyHBZ3r59ez3++OOS/jqP//vf/1SpUiUFBwerc+fOOnnypMs56t27t0JCQuTn56fbbrtNq1evvuh4f/75ZzVs2FD+/v666667lJKSolmzZqlWrVoKCgrSo48+qtOnTzvf53A4NGTIEEVHR8vf31/169e/6HgvdOFQPZvNpi+++EIPPPCASpQooWrVqmn69OmSsobE3XnnnZKk0qVLy2az6YknnsjTvrOPadasWWrcuLF8fX21ZMmSPH3fORwOvfnmm6pQoYJ8fX3VoEEDzZ49+4rHtWXLFt1zzz0qWbKkQkND9fjjj+vIkSNXfE9eEJwAAChm5iXOkyTFVohVCe8SFldjPWOMTp07ZcnDGJPnOvv166elS5dq+vTpmjNnjhYvXqx169Zd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dOlSl97XnBo1aqTvv/9elSpVcvusfUwOAQBAMTJvd1ZwuqsSw/QKk8DAQHXr1k2vvPKK5s+fr61bt6p79+7y8PBwGSZ2KdWqVdPevXs1ceJE7dq1S6NGjdLUqVMvaufn56du3bpp48aNWrx4sXr37q2HHnrIOUwvN9WrV1eXLl3UtWtXTZkyRYmJiVq1apWGDBlyUa9Mtri4OFWvXt1lvzkDniRVrVpVkZGRGjx4sHbu3KmZM2fmubds8uTJ+r//+z/99ttvev3117Vq1Srn5A9dunRxHvOWLVs0f/58vfDCC3r88ccvOUwv26OPPqr9+/fr888/d5kUIi8CAgLUo0cPvfLKK5o9e7a2bdumZ555RqdPn1b37t2vals5BQYG6uWXX9aLL76ocePGadeuXVq3bp0+/PBDjRs37pq3e6GoqCjnNN+HDx9Wenr6de87t++7V155RcOGDdOkSZOUkJCg/v37a8OGDerTp88lt9ezZ08dO3ZMjzzyiFavXq1du3bp559/1pNPPukS+K4FwQkAgGIi05HpvH8T1zcVPv/5z38UGxur++67T3FxcWrevLlq1aolPz+/K77vb3/7m1588UX16tVLDRo00LJly5yz7eVUtWpVdejQQffee69at26tevXqacyYMVdV45dffqmuXbvqpZdeUo0aNdS+fXuXXrILeXh4aOrUqTpz5oyaNWump59+Wu+8845LG29vb33zzTfasWOH6tWrp2HDhuntt9/OUz1vvPGGJk6cqHr16umrr77SN998o9q1a0uSSpQooZ9//lnHjh1T06ZN1alTJ7Vq1UqjR4++4jaDg4PVsWNHlSxZUu3bt89THTkNHTpUHTt21OOPP65GjRrp999/188//+zsTbtWb731lgYOHKghQ4aoVq1aatOmjWbOnKno6Ojr2m5ON910k9544w31799foaGhzhB6PfvO7fuud+/e6tevn1566SXVrVtXs2fP1vTp01WtWrVLbi+7h8put6t169aqW7eu+vbtq1KlSjmHfV4rmzFXMQ9mMZOWlqbg4GClpqZedAElAACFzaoDqxTzRYxK+ZXSkVeOyNPDM/c3FUJX+vw+e/asEhMTFR0dnWvgKOhOnTqlm266Se+///519VZIWVNfT5s2Lc9D4AoDm82mqVOnXlO4yU2rVq1Up04djRo1yu3bLk4Kwvfd1fxM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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "k=7\n",
    "t=3\n",
    "\n",
    "xm=np.arange(k) \n",
    "m=random.sample(range(-100, 100), k)\n",
    "\n",
    "def lettreSup(t, xm, m):\n",
    "\n",
    "    return -1\n",
    "\n",
    "xr,r = lettreSup(t, xm, m)\n",
    "\n",
    "\n",
    "#tracé\n",
    "plt.scatter(xm,m, color='blue', label = \"lettres du message\")\n",
    "plt.scatter(xr,r, color='red', label = \"lettres supplémentaires\")\n",
    "\n",
    "xcont=np.linspace(-.25,k+t-0.75,500)\n",
    "plt.plot(xcont,pol_Lagrange(xcont,xm,m), color='green', label =\"graphe du polynome interpolé\")\n",
    "plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La détection d'erreur se fait en évaluant tous les polynômes $Q_S$ interpolant un sous-ensemble $S$ de taille $k$ : $S \\subset \\{(0,m_0),...,(k-1,m_{k-1}),(k,r_0),...,(k+t-1,r_{t-1})\\}$\n",
    "\n",
    "\n",
    "Si toutes les valeurs $Q_s(i) , i \\in \\{0,...,k+t-1\\}$ s'accordent, alors il n'y a (très très probablement) pas d'erreur.\n",
    "\n",
    "\n",
    "**question 2**\n",
    "\n",
    "1. Écrire une fonction `detectErreur(k,yt)` où k est le nombre de lettres du message et `yt` est la liste complète des lettres ($[m_0,...,m_{k-1},r_0,...,r_{t-1}]$). Cette fonction renvoie `True` s'il y a une erreur dans le message et `False` s'il n'y a (très très probablement) pas d'erreur.\n",
    "\n",
    "_Astuce python_ : on pourra utiliser `list_s= list(itertools.combinations(...))` pour construire les sous-ensembles.\n",
    "\n",
    "2. Compléter la légende de la représentation graphique"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Erreur de transmission : False\n",
      "[  -7   -4    5    1    6    0   -9  238 1627 6200]\n",
      "[  -7    0    5    1    0    0   -9  238 1627 6200]\n",
      "Erreur de transmission : True\n"
     ]
    }
   ],
   "source": [
    "k = 7\n",
    "t = 3\n",
    "xm = np.arange(k)\n",
    "m = random.sample(range(-10, 10), k)\n",
    "_,r = lettreSup(t, xm, m)\n",
    "yt = m+r\n",
    "yt = np.asarray(yt)\n",
    "\n",
    "def detectErreur(k, yt):\n",
    "\n",
    "    res=[]\n",
    "\n",
    "    erreur = False\n",
    "\n",
    "    return erreur\n",
    "\n",
    "print(\"Erreur de transmission :\", detectErreur(k, yt))\n",
    "\n",
    "#Rajout d'erreurs\n",
    "yError = yt.copy()\n",
    "print(yError)\n",
    "yError[1] = 0\n",
    "yError[4] = 0 \n",
    "print(yError)\n",
    "print(\"Erreur de transmission :\", detectErreur(k, yError))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-7.0, 0.0, 5.0, 1.0, 0.0, 0.0, -9.0, 0.0, 175.0, 908.0]\n",
      "[2261.0, 668.0, 131.0, 1.0, 0.0, 0.0, -9.0, 238.0, 1627.0, 6200.0]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6wAAAGdCAYAAAAWgv5lAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAACDJUlEQVR4nOzdeXxMZ///8dfMZN9tCSFEraHUWkKVlopavpTuKrRatBRFF7+2Wt1009L2pr27hPbWVhdardZStabW2LdQYo+dRJBt5vz+GBkGQQgny/v5eMwjM+dcc857TpbJZ67rXMdiGIaBiIiIiIiISAFjNTuAiIiIiIiIyMWoYBUREREREZECSQWriIiIiIiIFEgqWEVERERERKRAUsEqIiIiIiIiBZIKVhERERERESmQVLCKiIiIiIhIgaSCVURERERERAokD7MDXC8Oh4N9+/YRGBiIxWIxO46IiIhcAcMwOHHiBOHh4Vit+lxdRKS4K7IF6759+4iIiDA7hoiIiFyF3bt3U6FCBbNjiIiIyYpswRoYGAg43/CCgoJMTiMiIiJXIjU1lYiICNf7uIiIFG9FtmDNGQYcFBSkglVERKSQ0ek8IiICmnRJRERERERECigVrCIiIiIiIlIgqWAVERERERGRAkkFq4iIiIiIiBRIKlhFRERERESkQFLBKiIiIiIiIgWSClYREREREREpkFSwioiIiIiISIGkglVEREREREQKJBWsIiIiIiIiUiCpYBUREREREZECSQWriIiIiIiIFEgeZgcQERGRwmXy+skcOHmAmCox1Chdw+w4IiJShKmHVURERPIkbeT/4+jzg9iw9Dezo4iISBGnHlYRERHJk3Z/7aT8cVgzKMDsKCIiUsSph1VERESuWNbpk5RLsQMQVqepyWlERKSoU8EqIiIiVyx541KsBpzyhNCb6pgdR0REijgVrCIiInLFDm9YDkByKS+sVpvJaUREpKhTwSoiIiJXbE2kL80egy8eq292FBERKQbyVLDa7XZefvllKleujK+vL1WqVOH111/HMAxXG8MwGDFiBOXKlcPX15c2bdqwdetWt+0cPXqU7t27ExQUREhICL179yYtLc2tzdq1a2nRogU+Pj5ERETw7rvvXsPLFBERkfyQmLmPxRUhrXljs6OIiEgxkKeC9Z133mH8+PF88sknbNq0iXfeeYd3332X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5ALJa//BZkCaF5Sr3sDsOCIiUkypYBUREZEL7N+yknQb7Cnjg9VqMzuOiIgUUypYRURE5ALLawTg/yK8+codZkcREZFiTAWriIiIXODfo//isEJYpVpmRxERkWJMBauIiIhcYOtR5zVYq5asanISEREpzjzMDiAiIiIFzzNvzaO7ARVaB5kdRUREijEVrCIiIuLGfvoULTekYTNgV2g1s+OIiEgxpiHBIiIi4mbvmkXYDDjhBRWq6pI2IiJiHhWsIiIi4ubgmngA9oTpkjYiImIuFawiIiLi5uTGNQAcq1Da5CQiIlLcqWAVERERN5atzhmCM2+qZHISEREp7lSwioiIiBv/nckAeFaPMjmJiIgUdypYRURExM3JrJNkWSGkTmOzo4iISDGny9qIiIiIy4mME7TsnomHHQ7d1dXsOCIiUsyph1VERERcthzZAkDJoFBCAjTpkoiImEsFq4iIiLgkHkkEoEapGiYnERERUcEqIiIi5yj1nziW/hd6JxhmRxEREdE5rCIiInJWwPot3LoPThtBZkcRERFRD6uIiIicVXLXIQB8b65vchIREREVrCIiInKGYbdTcf9pAErXb25yGhERERWsIiIicsb+xAT8syDLChH1WpodR0RERAWriIiIOCUnzANgd2lPPH38zA0jIiKCClYRERE5I23tCgAORpQ0OYmIiIiTClYREREBYP/pw2wtCSerRZodRUREBNBlbUREROSMr5p6MbMMfN6xt9lRREREAPWwioiIyBmJRxIBqFG6pslJREREnFSwioiICKczT7Hz2A4Aqpeqbm4YERGRM1SwioiICHsW/M6hd+HP7z0I9Q81O46IiAigglVERESAo6v+odRpKJvtg8ViMTuOiIgIoIJVREREgMyN6wA4XqmsyUlERETOUsEqIiIieG7dBkB29aomJxERETlLBauIiIhQYtdBAPxvrm9yEhERkbN0HVYREZHizG7HMW8uEftPAxDWoIXJgURERM5SD6uIiEhxNWUKREay75678MuCTCtUvO9x53IREZECQAWriIhIcTRlCtx7L+zZw/YSMLMKJISDx95k53IVrSIiUgCoYBURESlu7HYYNAgMA4Dl5aFdD/gwGtcyBg92thMRETGRClYREZHiZuFC2LPH9XBjGefXWofOLDAM2L3b2U5ERMREKlhFRESKm+Rkt4c7Qpxf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G7YB4NW0uclJRM663BlokZGRl20jIsWTzrwWEREpIjJOnaDarpMARLTR+ZgiIlL4qYdVRESkiNiweSEHKkP141Zuqt/K7DgiIiLXTD2sIiIiRcSirH9p/wgMGns3Fl2+QkREigC9m4mIiBQRS/cuBaBJ+SYmJxEREckfKlhFRESKiM2J8QA0qaCCVUREigadwyoiIlIEHN6fxLIXd7IvEAL71TA7joiISL5QD6uIiEgR8O/Mb7EZYPXwICSsktlxJJ9NmDCBkJAQs2PcUL169aJLly4FYruRkZGMGTMm37OIyOWph1VERKQIODn/LwB216pAeZOziFwPvXr1IjIykldfffWatjN27Ng8X/N1+fLl+Pv7X9N+ReTqqGAVEREpAgJWrgcgq0ljk5OIFEx2ux2LxUJwcHCen1umTJnrkEhEroSGBIuIiBRyDns21bccAaBMm84mp5HztWrVigEDBjBgwACCg4MpXbo0L7/8slsv37Fjx4iNjaVEiRL4+flx9913s3Xr1otub8eOHVitVlasWOG2fMyYMVSqVAmHw8G8efOwWCzMmTOHRo0a4efnR7NmzUhMTHR7zvjx46lSpQpeXl7UqFGDb775xm29xWLhs88+o2PHjvj5+REVFcXixYv5999/adWqFf7+/jRr1oxt27a5Pe/XX3+lQYMG+Pj4cNNNNzFy5Eiys7NzPUZ2u50hQ4YQEhJCqVKleO655y7bC3q5Y5YzjHratGnUqlULb29vdu3adcGQ4BMnTtC9e3f8/f0pV64cH374Ia1atWLw4MGuNucPCbZYLHzxxRfcc889+Pn5Ua1aNaZNm+aWb/369dx9990EBAQQFhZGjx49OHz48CVfk4hcSAWriIhIIbdj2SxKnDY45QlV7+hqdpwbxjAMTmaeNOWW1yGlEydOxMPDg2XLljF27Fg++OADvvjiC9f6Xr16sWLFCqZNm8bixYsxDIP27duTlZV1wbYiIyNp06YNcXFxbsvj4uLo1asX1nOuwfviiy8yevRoVqxYgYeHB4899phr3dSpUxk0aBBDhw5l/fr19O3bl0cffZS5c+e6bff1118nNjaW1atXU7NmTR5++GH69u3L8OHDWbFiBYZhMGDAAFf7hQsXEhsby6BBg9i4cSOfffYZEyZM4M0338z1+IwePZoJEybw1VdfsWjRIo4ePcrUqVMveUyv5JidOnWKd955hy+++IINGzYQGhp6wXaGDBlCfHw806ZNY/bs2SxcuJCVK1dect8AI0eO5P7772ft2rW0b9+e7t27c/ToUQCOHz/OnXfeSf369VmxYgUzZszgwIED3H///ZfdroicxyiiUlJSDMBISUkxO4qIiMh1tejV3oYBxqrqQWZHuWaXev8+ffq0sXHjRuP06dOGYRhGWkaawauYckvLSLvi19SyZUsjKirKcDgcrmXPP/+8ERUVZRiGYWzZssUAjPj4eNf6w4cPG76+vsYPP/xgGIZhxMXFGcHBwa71kydPNkqUKGGkp6cbhmEYCQkJhsViMZKSkgzDMIy5c+cagPHXX3+5njN9+nQDcB2/Zs2aGU888YRb1vvuu89o37696zFgvPTSS67HixcvNgDjyy+/dC377rvvDB8fH9fj1q1bG2+99Zbbdr/55hujXLlyuR6jcuXKGe+++67rcVZWllGhQgWjc+fOF21/pccMMFavXu323J49e7q2m5qaanh6eho//vija/3x48cNPz8/Y9CgQa5llSpVMj788EPX4/OPS1pamgEYf/75p2EYhvH6668bbdu2ddvv7t27DcBITEzM9TiIFCfn/03PjXpYRURECrn4wGN8fCtsv6uR2VEkF02bNsVisbgeR0dHs3XrVux2O5s2bcLDw4MmTc5eP7dUqVLUqFGDTZs2XXR7Xbp0wWazuXohJ0yYwB133EFkZKRbu7p167rulytXDoCDBw8CsGnTJpo3b+7Wvnnz5hfs89xthIWFAVCnTh23Zenp6aSmpgKwZs0aXnvtNQICAly3J554guTkZE6dOnXBa0lJSSE5Odnt9Xt4eNCoUe4/z1d6zLy8vNzyn2/79u1kZWVx6623upYFBwdTo8blLw117nb9/f0JCgpyHds1a9Ywd+5ct2NQs2ZNgAuGT4vIpV3TpEtvv/02w4cPZ9CgQa5x/enp6QwdOpTvv/+ejIwMYmJiGDdunOsPHMCuXbt48sknXb/IPXv2ZNSoUXh4nI0zb948hgwZwoYNG4iIiOCll16iV69e1xJXRESkSPrOfzur28MP9/YzO8oN5efpR9rwNNP2bSYvLy9iY2OJi4uja9eufPvtt4wdO/aCdp6enq77OQWzw+HI074uto1LbTctLY2RI0fSteuFw9N9fHzytO9r5evr6/ZBQX469xiA8ziceww6derEO++8c8Hzcj44EJErc9UF6/Lly/nss88u+NTqmWeeYfr06fz4448EBwczYMAAunbtSnx8POA8qb5Dhw6ULVuWf/75h+TkZGJjY/H09OStt94CICkpiQ4dOtCvXz8mTZrEnDlzePzxxylXrhwxMTHX8HJFRESKltSMVNYeWAtA84rNL9O6aLFYLPh7FY5LjSxdutTt8ZIlS6hWrRo2m42oqCiys7NZunQpzZo1A+DIkSMkJiZSq1atXLf5+OOPc/PNNzNu3Diys7MvWiBeSlRUFPHx8fTs2dO1LD4+/pL7vBINGjQgMTGRqlWrXlH74OBgypUrx9KlS7n99tsByM7OJiEhgQYNGuSa/WqO2fluuukmPD09Wb58ORUrVgScPb5btmxxZbkaDRo04OeffyYyMtKtQ0ZE8u6qhgSnpaXRvXt3Pv/8c0qUKOFanpKSwpdffskHH3zAnXfeScOGDYmLi+Off/5hyZIlAMyaNYuNGzfyv//9j3r16nH33Xfz+uuv85///IfMzEwAPv30UypXrszo0aOJiopiwIAB3HvvvXz44Yf58JJFRESKjjX/TKXZDgc1/SoRHhhudhzJxa5duxgyZAiJiYl89913fPzxxwwaNAiAatWq0blzZ5544gkWLVrEmjVreOSRRyhfvjydO+c+63NUVBRNmzbl+eef56GHHsLX1zdPmZ599lkmTJjA+PHj2bp1Kx988AFTpkxh2LBh1/RaR4wYwddff83IkSPZsGEDmzZt4vvvv+ell17K9TmDBg3i7bff5pdffmHz5s089dRTHD9+PNf2V3vMzhcYGEjPnj159tlnmTt3Lhs2bKB3795YrdZr6pnt378/R48e5aGHHmL58uVs27aNmTNn8uijj2K32696uyLF0VUVrP3796dDhw60adPGbXlCQgJZWVluy2vWrEnFihVZvHgxAIsXL6ZOnTpuQ4RjYmJITU1lw4YNrjbnbzsmJsa1jYvJyMggNTXV7SYiIlLUZU/4ioVx8MV0TUtRkMXGxnL69GluvfVW+vfvz6BBg+jTp49rfVxcHA0bNqRjx45ER0djGAZ//PHHBcNOz9e7d28yMzPdZv+9Ul26dGHs2LG8//771K5dm88++4y4uDhatWqV522dKyYmht9//51Zs2bRuHFjmjZtyocffkilSpVyfc7QoUPp0aMHPXv2JDo6msDAQO65555L7udqj9n5PvjgA6Kjo+nYsSNt2rShefPmREVFXdPw5fDwcOLj47Hb7bRt25Y6deowePBgQkJC3GZxFpHLy/MYhe+//56VK1eyfPnyC9bt378fLy8vQkJC3JaHhYWxf/9+V5tzi9Wc9TnrLtUmNTWV06dPX/QTxFGjRjFy5Mi8vhwREZFCLWDlegAc50w+IwWPp6cnY8aMYfz48RddX6JECb7++utcn9+rV6+LzuWxd+9e6tSpQ+PGjd2Wt2rV6oJL79SrV++CZU8++SRPPvlkrvs9v31kZOQFyy62r5iYmDydxuXh4cGYMWPcrnV6OVd7zCZMmOD2ODAwkEmTJrkenzx5kpEjR7p9oLBjxw6355z/eoELeoSrVavGlClTcn8BInJF8vQRz+7duxk0aBCTJk264SfNX87w4cNJSUlx3Xbv3m12JBERkesqKyuD6lud130Mb9vN5DRyI6WlpbF+/Xo++eQTnn76abPjFGqrVq3iu+++Y9u2baxcuZLu3bsD5GlosYhcP3kqWBMSEjh48CANGjTAw8MDDw8P5s+fz0cffYSHhwdhYWFkZmZe8AnTgQMHKFu2LABly5blwIEDF6zPWXepNkFBQbmen+Ht7U1QUJDbTUREpChLXDiV4AxI84LKt/+f2XHkBhowYAANGzakVatWVzUcWNy9//773HLLLbRp04aTJ0+ycOFCSpcubXYsESGPQ4Jbt27NunXr3JY9+uij1KxZk+eff56IiAg8PT2ZM2cO3bo5P+lNTExk165dREdHA87rjr355pscPHiQ0NBQAGbPnk1QUJBrVrfo6Gj++OMPt/3Mnj3btQ0RERGB/bOncjOwrWopbvH0MjuO5GLevHn5vs0JEyZcMLRVrk79+vVJSEgwO4aI5CJPBWtgYCA333yz2zJ/f39KlSrlWt67d2+GDBlCyZIlCQoK4umnnyY6OpqmTZsC0LZtW2rVqkWPHj1499132b9/Py+99BL9+/fH29sbgH79+vHJJ5/w3HPP8dhjj/H333/zww8/MH369Px4zSIiIkWCx2LnpVLSGtYxOYmIiMj1ke8Xhvrwww+xWq1069aNjIwMYmJiGDdunGu9zWbj999/58knnyQ6Ohp/f3969uzJa6+95mpTuXJlpk+fzjPPPMPYsWOpUKECX3zxha7BKiIicoZhGFRetweAoDYdTU4jIiJyfViMi01zVgSkpqYSHBxMSkqKzmcVEZEiZ/vRbTzwQlXu3G1j5LfJ+JQoY3akfHGp9+/09HSSkpKoXLlygZv8UURE8uZK/6bnew+riIiIXH+Ldsezojx4Nrm1yBSrIiIi59OVi0VERAqh+F3xANxW8TaTk4iIiFw/KlhFREQKoQb/mUKP1XB7yQZmRxGRXEybNo3JkyebHUOkUFPBKiIiUsgc25lI35mH+foXaFqmvtlx5AaYMGECISEhZscosPL7+OzYsQOLxcLq1auvaTtNmzbl5Zdfvi6XNsovvXr1okuXLgVuW3JjWSwWfvnlF+DiP//x8fHUqVMHT09PunTpwrx587BYLBw/fvy6Z9M5rCIiIoXMtt8m0gjYUs6L6hVrmB1HRHIRGhrK77//Trdu3ZgzZw6hoaGmZdmxYweVK1dm1apV1KtXz7V87NixFNE5WOUqRUREkJycTOnSpV3LhgwZQr169fjzzz8JCAjAz8+P5ORkgoODr3seFawiIiKFzKk5MwHYW68K1U3OIiKXVr16ddatW2dqhszMzFzXXa7gyMzMxMvLK78jSQFms9koW7as27Jt27bRr18/KlSo4Fp2fpvrRUOCRURECpnQhE0AeN7R2uQkciVatWrFgAEDGDBgAMHBwZQuXZqXX37ZrVfr2LFjxMbGUqJECfz8/Lj77rvZunXrRbe3Y8cOrFYrK1ascFs+ZswYKlWqhMPhcA3XmzNnDo0aNcLPz49mzZqRmJjo9pzx48dTpUoVvLy8qFGjBt98843beovFwmeffUbHjh3x8/MjKiqKxYsX8++//9KqVSv8/f1p1qwZ27Ztc3ver7/+SoMGDfDx8eGmm25i5MiRZGdnX/I4ffXVV9SuXRtvb2/KlSvHgAEDXOs++OAD6tSpg7+/PxERETz11FOkpaVdcnu//fYbjRs3xsfHh9KlS3PPPfe4va6c4Y85QkJCmDBhQq7bW79+PXfffTcBAQGEhYXRo0cPDh8+nGv7I0eO8NBDD1G+fHn8/PyoU6cO33333SUz5wxt/uWXX6hWrRo+Pj7ExMSwe/duV5tt27bRuXNnwsLCCAgIoHHjxvz1119u24mMjOT1118nNjaWoKAg+vTpQ+XKlQGoX78+FouFVq1aARcO4835eR08eDClS5cmJibmolntdjtDhgwhJCSEUqVK8dxzz13QUxsZGcmYMWPcltWrV49XX30112OQk+ett94iLCyMkJAQXnvtNbKzs3n22WcpWbIkFSpUIC4uzu15u3fv5v777yckJISSJUvSuXNnduzY4Vo/b948br31Vvz9/QkJCaF58+bs3LkTgDVr1nDHHXcQGBhIUFAQDRs2dP1+Xcn38cSJE3Tv3h1/f3/KlSvHhx9+SKtWrRg8eLCrTUZGBsOGDaN8+fL4+/vTpEmTyw4Vv9rfv8v9Xm/dupXbb78dHx8fatWqxezZs93WnzskOOf+kSNHeOyxx7BYLEyYMOGiQ4IXLVpEixYt8PX1JSIigoEDB3Ly5MlLvsYroYJVRESkEDl+YCfV95wGoGrnR01OYzLDgJMnzbnlcQjlxIkT8fDwYNmyZYwdO5YPPviAL774wrW+V69erFixgmnTprF48WIMw6B9+/ZkZWVdsK3IyEjatGlzwT/scXFx9OrVC6v17L93L774IqNHj2bFihV4eHjw2GOPudZNnTqVQYMGMXToUNavX0/fvn159NFHmTt3rtt2cwqf1atXU7NmTR5++GH69u3L8OHDWbFiBYZhuBWXCxcuJDY2lkGDBrFx40Y+++wzJkyYwJtvvpnr8Rk/fjz9+/enT58+rFu3jmnTplG1alXXeqvVykcffcSGDRuYOHEif//9N88991yu25s+fTr33HMP7du3Z9WqVcyZM4dbb7011/aXc/z4ce68807q16/PihUrmDFjBgcOHOD+++/P9Tnp6ek0bNiQ6dOns379evr06UOPHj1YtmzZJfd16tQp3nzzTb7++mvi4+M5fvw4Dz74oGt9Wloa7du3Z86cOaxatYp27drRqVMndu3a5bad999/n1tuuYVVq1bx8ssvu/b7119/kZyczJQpU3LNMHHiRLy8vIiPj+fTTz+9aJvRo0czYcIEvvrqKxYtWsTRo0eZOnXqJV/blfr777/Zt28fCxYs4IMPPuCVV16hY8eOlChRgqVLl9KvXz/69u3Lnj17AMjKyiImJobAwEAWLlxIfHw8AQEBtGvXjszMTLKzs+nSpQstW7Zk7dq1LF68mD59+mCxWADo3r07FSpUYPny5SQkJPDCCy/g6ekJXNn3cciQIcTHxzNt2jRmz57NwoULWblypdtrGjBgAIsXL+b7779n7dq13HfffbRr1y7XD6Zy5PX373K/1w6Hg65du+Ll5cXSpUv59NNPef7553Pdf87w4KCgIMaMGUNycjIPPPDABe22bdtGu3bt6NatG2vXrmXy5MksWrTILdtVM4qolJQUAzBSUlLMjiIiIpJvlnw2wjDASCrjaXaU6+JS79+nT582Nm7caJw+fdq5IC3NMJyl442/paVd8Wtq2bKlERUVZTgcDtey559/3oiKijIMwzC2bNliAEZ8fLxr/eHDhw1fX1/jhx9+MAzDMOLi4ozg4GDX+smTJxslSpQw0tPTDcMwjISEBMNisRhJSUmGYRjG3LlzDcD466+/XM+ZPn26AbiOX7NmzYwnnnjCLet9991ntG/f3vUYMF566SXX48WLFxuA8eWXX7qWfffdd4aPj4/rcevWrY233nrLbbvffPONUa5cuVyPUXh4uPHiiy/muv58P/74o1GqVCnX4/OPT3R0tNG9e/dcnw8YU6dOdVsWHBxsxMXFGYZhGElJSQZgrFq1yjAMw3j99deNtm3burXfvXu3ARiJiYlXnLtDhw7G0KFDc10fFxdnAMaSJUtcyzZt2mQAxtKlS3N9Xu3atY2PP/7Y9bhSpUpGly5d3Nqc/5py9OzZ0+jcubPrccuWLY369etf9rWUK1fOePfdd12Ps7KyjAoVKrhtq1KlSsaHH37o9rxbbrnFeOWVV3Ldbs+ePY1KlSoZdrvdtaxGjRpGixYtXI+zs7MNf39/47vvvjMMw/nzVaNGDbffsYyMDMPX19eYOXOmceTIEQMw5s2bd9F9BgYGGhMmTLjsa85x7vcxNTXV8PT0NH788UfX+uPHjxt+fn7GoEGDDMMwjJ07dxo2m83Yu3ev23Zat25tDB8+PNf9XM3v3+V+r2fOnGl4eHi4Zfnzzz/dficu9rNy7u+HYZz9G3Ps2DHDMAyjd+/eRp8+fdz2u3DhQsNqtZ79m32eC/6m50I9rCIiIoXIoWXOT8n31LvJ5CSSF02bNnX15gBER0ezdetW7HY7mzZtwsPDgyZNmrjWlypViho1arBp06aLbq9Lly7YbDZXj9aECRO44447iIyMdGtXt25d1/1y5coBcPDgQQA2bdpE8+bN3do3b978gn2eu42wsDAA6tSp47YsPT2d1NRUwDm88rXXXiMgIMB1e+KJJ0hOTubUqVMXvJaDBw+yb98+WrfOfYj7X3/9RevWrSlfvjyBgYH06NGDI0eOXHR7AKtXr77k9vJqzZo1zJ071+011axZE+CC4Zg57HY7r7/+OnXq1KFkyZIEBAQwc+bMC3pCz+fh4UHjxo1dj2vWrElISIjr+5KWlsawYcOIiooiJCSEgIAANm3adMF2GzVqdNWvt2HDhpdcn5KSQnJystvPrIeHxzXt81y1a9d2GykQFhbm9jNns9koVaqU62d5zZo1/PvvvwQGBrq+PyVLliQ9PZ1t27ZRsmRJevXqRUxMDJ06dWLs2LEkJye7tjdkyBAef/xx2rRpw9tvv+32Pb3c93H79u1kZWW59eAHBwdTo8bZCfHWrVuH3W6nevXqbj9D8+fPz/XnJ0def/8u93u9adMmIiIiCA8Pd62Pjo6+ZIYrsWbNGiZMmOD2+mJiYnA4HCQlJV3TtjXpkoiISCEyonEavUvA523zYZhVYefnB5c5j/G67ttEXl5exMbGEhcXR9euXfn2228ZO3bsBe1yhjUCroLZ4XDkaV8X28altpuWlsbIkSPp2rXrBdvy8fG5YJmvr+8l979jxw46duzIk08+yZtvvknJkiVZtGgRvXv3JjMzE7+LfC8ut02LxXLB+ZYXG36dIy0tjU6dOvHOO+9csC7ng4Dzvffee4wdO5YxY8a4zr8dPHjwJSdAuhLDhg1j9uzZvP/++1StWhVfX1/uvffeC7br7+9/1fu4lueey2q15uk45zj35wuc36+LLTv3Z65hw4ZMmjTpgm2VKVMGcA6ZHzhwIDNmzGDy5Mm89NJLzJ49m6ZNm/Lqq6/y8MMPM336dP78809eeeUVvv/+e+655558+T6mpaVhs9lISEjAZrO5rQsICLjiY3Elv39mSUtLo2/fvgwcOPCCdRUrVrymbatgFRERKSSOnT7G6v2rMQKgcdNuZscxn8UC+fSP9fW2dOlSt8dLliyhWrVq2Gw2oqKiyM7OZunSpTRr1gxwTvSSmJhIrVq1ct3m448/zs0338y4cePIzs6+aIF4KVFRUcTHx9OzZ0/Xsvj4+Evu80o0aNCAxMREt3NQLyUwMJDIyEjmzJnDHXfcccH6hIQEHA4Ho0ePdvW6/fDDD5fcZt26dZkzZw6PPnrx87zLlCnj1sO2devWXHtrwfmafv75ZyIjI/HwuLJ/n+Pj4+ncuTOPPPII4CwotmzZctnjm52dzYoVK1w9domJiRw/fpyoqCjXdnv16uWaRCotLc1tcqHc5Mz0a7fbryj/pQQHB1OuXDmWLl3K7bff7sqdkJBAgwYNXO3OP86pqanX3Nt2MQ0aNGDy5MmEhoYSFBSUa7v69etTv359hg8fTnR0NN9++y1NmzYFnLM5V69enWeeeYaHHnqIuLg47rnnnst+H2+66SY8PT1Zvny5qzBLSUlhy5YtrmNTv3597HY7Bw8epEWLFvn++s91ud/rqKgodu/eTXJysuvDliVLllzzfhs0aMDGjRuv+Pc+LzQkWEREpJBYsHMBBgY1S9ekXODFe3WkYNq1axdDhgwhMTGR7777jo8//phBgwYBUK1aNTp37swTTzzBokWLWLNmDY888gjly5enc+fOuW4zKiqKpk2b8vzzz/PQQw9dtlfxfM8++ywTJkxg/PjxbN26lQ8++IApU6YwbNiwa3qtI0aM4Ouvv2bkyJFs2LCBTZs28f333/PSSy/l+pxXX32V0aNH89FHH7F161ZWrlzJxx9/DEDVqlXJysri448/Zvv27XzzzTe5TgSU45VXXuG7777jlVdeYdOmTaxbt86td/TOO+/kk08+YdWqVaxYsYJ+/fpd0IN3rv79+3P06FEeeughli9fzrZt25g5cyaPPvporgVgtWrVmD17Nv/88w+bNm2ib9++HDhw4JK5wdl79vTTT7N06VISEhLo1asXTZs2dRWw1apVY8qUKaxevZo1a9bw8MMPX1HvWmhoKL6+vq4Jo1JSUi77nEsZNGgQb7/9Nr/88gubN2/mqaeecpsxFpzH+ZtvvmHhwoWsW7eOnj17XtDDmB+6d+9O6dKl6dy5MwsXLiQpKYl58+YxcOBA9uzZQ1JSEsOHD2fx4sXs3LmTWbNmsXXrVqKiojh9+jQDBgxg3rx57Ny5k/j4eJYvX+76gOBy38fAwEB69uzJs88+y9y5c9mwYQO9e/fGarW6ej+rV69O9+7diY2NZcqUKSQlJbFs2TJGjRrF9OnT8/VYXO73uk2bNlSvXp2ePXuyZs0aFi5cyIsvvnjN+33++ef5559/GDBgAKtXr2br1q38+uuv+TLpkgpWERGRQsL7zbeZPREGHKxsdhTJo9jYWE6fPs2tt95K//79GTRoEH369HGtj4uLo2HDhnTs2JHo6GgMw+CPP/64ZBEFuIbFnjv775Xq0qULY8eO5f3336d27dp89tlnxMXFuS53crViYmL4/fffmTVrFo0bN6Zp06Z8+OGHVKpUKdfn9OzZkzFjxjBu3Dhq165Nx44dXbOn3nLLLXzwwQe888473HzzzUyaNIlRo0ZdMkOrVq348ccfmTZtGvXq1ePOO+90m9V19OjRRERE0KJFCx5++GGGDRt20aHFOcLDw4mPj8dut9O2bVvq1KnD4MGDCQkJcTvX8lwvvfQSDRo0ICYmhlatWlG2bFm3y8fkxs/Pj+eff56HH36Y5s2bExAQwOTJk13rP/jgA0qUKEGzZs3o1KkTMTExbr2aufHw8OCjjz7is88+Izw8/JIfhlyJoUOH0qNHD3r27El0dDSBgYFulw4CGD58OC1btqRjx4506NCBLl26UKVKlWva78X4+fmxYMECKlasSNeuXYmKiqJ3796kp6cTFBSEn58fmzdvplu3blSvXp0+ffrQv39/+vbti81m48iRI8TGxlK9enXuv/9+7r77bkaOHAlc2ffxgw8+IDo6mo4dO9KmTRuaN29OVFSU2xD4uLg4YmNjGTp0KDVq1KBLly5uvbL55XK/11arlalTp7r+Hj3++OOXnMH7StWtW5f58+ezZcsWWrRoQf369RkxYoTbubJXy2KcP7C8iEhNTSU4OJiUlJRLDg0QEREpLDZE+lF752mWvtWfJsM/MTvOdXGp9+/09HSSkpKoXLnyRc+FLKhatWpFvXr1LrgeZX54/fXX+fHHH1m7dm2+b1tuvAkTJjB48OALeiqlcDl58iTly5dn9OjR9O7d2+w4BdaV/k3XOawiIiKFwLG924ja6bz+6k33PmFyGjFbznmLn3zyCW+88YbZcUSKtVWrVrF582ZuvfVWUlJSeO211wCuuRdbnDQkWEREpBDY8vN/sQLbwrwoU+0Ws+OIyQYMGEDDhg1p1arVVQ0HFpH89f7773PLLbfQpk0bTp48ycKFCyldurTZsYoEDQkWEREpBBZ2rEuL6euY3+FmWv6+zuw4101RHBIsIiIXutK/6ephFRERKQQqrNgCgGfbdiYnERERuXFUsIqIiBRwh7euofKBDOwWqN61z+WfICIiUkRo0iUREZECbsmGmdiqQmlrAI0rVDM7joiIyA2jHlYREZEC7ic20v4R+PmTp8yOIiIickOpYBURESnADMNg1rZZALStGmNyGhERkRtLBauIiEgBtnHLP1j2JePr4UvziOZmxxEREbmhVLCKiIgUYMmfj2bvB/DrzJJ4e3ibHUeuk1atWjF48GCzY4iIFDgqWEVERAown/nxAPjVusXkJHItevXqRZcuXcyOISJS6KhgFRERKaBOnz7BzesPAhDepYfJaURERG48FawiIiIF1PpfPyckHY76WYlsc6/ZcSSfnDx5ktjYWAICAihXrhyjR4++oE1GRgbDhg2jfPny+Pv706RJE+bNm+daP2HCBEJCQvj999+pUaMGfn5+3HvvvZw6dYqJEycSGRlJiRIlGDhwIHa7/Qa+OhGR/KXrsIqIiBRQqb/8AEBio0iiPfSWnauTJ3NfZ7OBj8+VtbVawdf38m39/fOW7zzPPvss8+fP59dffyU0NJT/9//+HytXrqRevXquNgMGDGDjxo18//33hIeHM3XqVNq1a8e6deuoVs15Ld5Tp07x0Ucf8f3333PixAm6du3KPffcQ0hICH/88Qfbt2+nW7duNG/enAceeOCaMouImEXvfiIiIgVU+fg1zjvt2pkbpKALCMh9Xfv2MH362cehoXDq1MXbtmwJ5/RiEhkJhw9f2M4wriYlAGlpaXz55Zf873//o3Xr1gBMnDiRChUquNrs2rWLuLg4du3aRXh4OADDhg1jxowZxMXF8dZbbwGQlZXF+PHjqVKlCgD33nsv33zzDQcOHCAgIIBatWpxxx13MHfuXBWsIlJoqWAVEREpgA5sXU3NPek4gOoPP212HMkn27ZtIzMzkyZNmriWlSxZkho1arger1u3DrvdTvXq1d2em5GRQalSpVyP/fz8XMUqQFhYGJGRkQScU8CHhYVx8ODB6/FSRERuCBWsIiIiBdDfR1Yw9V5onV6OvpVqmh2nYEtLy32dzeb++FLFm/W8qT127LjqSNciLS0Nm81GQkICtvPyn1uMenp6uq2zWCwXXeZwOK5fWBGR60wFq4iISAH0+765/HgzVGne0+woBV9ezim9Xm2vUJUqVfD09GTp0qVUrFgRgGPHjrFlyxZatmwJQP369bHb7Rw8eJAWLVrkewYRkcJEBauIiEgBk+3IZsa/MwDoUL2DyWkkPwUEBNC7d2+effZZSpUqRWhoKC+++CLWc3p3q1evTvfu3YmNjWX06NHUr1+fQ4cOMWfOHOrWrUuHDvqZEJHiQwXr1TAMOHECgoLMTiIiIkXQupnf8NSMo8yvG0TTCk3NjiP57L333iMtLY1OnToRGBjI0KFDSUlJcWsTFxfHG2+8wdChQ9m7dy+lS5emadOmdOzY0aTUIiLmsBjGNUx1V4ClpqYSHBxMSkoKQflZWP7xBwwcCM2bw8SJ+bddERGRM/5+uBl3freYxc0rEb1oh9lxbqhLvX+np6eTlJRE5cqV8Tn3UjUiIlLoXOnfdGuua+TiSpSAbdvgxx8hNdXsNCIiUgSVXbTKeefuu80NIiIiYjIVrHnVtCnUrAmnT8MPP5idRkREiphdm5dRa3c6ADW7DzI5jYiIiLlUsOaVxQKPPea8/9VX5mYREZEiZ8u3HwGwOTKAEpG6nI2IiBRvKlivRo8ezuu6LV4MmzaZnUZERIoQ3z9mA3DkDk22JCIiooL1apQtC+3bO+9PmGBqFBERKTrSUg5Rb+1BAMo90s/kNCIiIuZTwXq1coYFf/01ZGebm0VERIqEFX99Q5YV9pbwoHKre8yOU2A5HA6zI4iIyDW60r/lug7r1erQAZ58Eh54wDk8WERE5BpN8txE22dhRMWHeMmqz5TP5+XlhdVqZd++fZQpUwYvLy8sFovZsUREJA8MwyAzM5NDhw5htVrx8vK6ZHsVrFfL0xPGjTM7hYiIFBEOw8H0rdPJ8oBb73zE7DgFktVqpXLlyiQnJ7Nv3z6z44iIyDXw8/OjYsWKWC/zAa0KVhERkQJgZdJikk8k4+/lT8tKLc2OU2B5eXlRsWJFsrOzsdvtZscREZGrYLPZ8PDwuKJRMipYr9XWrTB2LFSpAs88Y3YaEREppE7+v2H8Owt+f6Q23h7eZscp0CwWC56ennh6epodRURErjOdIHOtli2D//wHPvhAky+JiMhVMQyDiLkJVDkGjSrqcjYiIiI5VLBeq3vvhdKlYc8e+P13s9OIiEgh9O/i6dx0MItMG9Tp+azZcURERAoMFazXytsbHn/ceV+TMImIyFXY+fVHAKyvVYagMhVMTiMiIlJwqGDND337gsUCs2fDli1mpxERkUKmzOx4ADI6xJicREREpGBRwZofIiOd12UFGD/e1CgiIlK47NjwD3W2nwKg5mPPmZxGRESkYFHBml+eesr5NS4OTp40N4uIiBQa/37xLlZgQ9VgSlSrY3YcERGRAkWXtckvMTHQtCnccQdkZZmdRkRECon/BWxjayOo2a4Ttc0OIyIiUsCoYM0vViv884/zXFYREZErsCd1DxM91vN1Rwt7h7xrdhwREZECR0OC85OKVRERyYNfNv8CQLOIZpQLLGduGBERkQJIBWt+MwyYMQPee8/sJCIiUsBZPxhDs13QtUYXs6OIiIgUSBoSnN/WrYO77wYPD3joIaig6+mJiMiFDmxczlOTt9EP2DfsdrPjiIiIFEjqYc1vdetCy5aQnQ0ff2x2GhERKaA2f/YmAGuqB1Eh6laT04iIiBRMKlivh6FDnV8/+wzS0szNIiIiBVKp3/4CIPX/YkxOIiIiUnCpYL0eOnSAatUgJQW++srsNCIiUsDsXD2fm5NOYrdArX4vmx1HRESkwFLBej1YrfDMM877Y8aA3W5qHBERKVj+/WwUAOtqlqBMlTompxERESm4VLBeLz17QsmSkJQEv/xidhoRESlAyv82H4BT93Q0OYmIiEjBpoL1evHzgyefhDp1nPdFRESAjRsX4HcinUwb1O4/0uw4IiIiBZoK1uvp5ZdhzRrnZW5ERESAb/b9SeRgeHbUHQSHVzY7joiISIGm67BeT97eZicQEZECxO6w883abzCs0KLDU2bHERERKfDUw3ojnDoFY8fC6tVmJxERERMtTJjKgeN7KeFTgk7VO5kdR0REpMBTwXojDB0KgwfD66+bnUREREzkMexZ9o6G947fireHRuGIiIhcjgrWG+Hpp51fp0yBDRvMzSIiIqZIObSH+ot3EHoKops9YHYcERGRQkEF641QqxZ06+a8P2qUuVlERMQUq8eNwD8LdoR6EdWhp9lxRERECgUVrDfKiy86v373Hfz7r7lZRETkhvP/fgoAu/+vFRar3n5FRESuRJ7eMUeNGkXjxo0JDAwkNDSULl26kJiY6NYmPT2d/v37U6pUKQICAujWrRsHDhxwa7Nr1y46dOiAn58foaGhPPvss2RnZ7u1mTdvHg0aNMDb25uqVasyYcKEq3uFBUX9+tChAzgc6mUVESlmdqxdQIPNKQBUH/SayWlEREQKjzwVrPPnz6d///4sWbKE2bNnk5WVRdu2bTl58qSrzTPPPMNvv/3Gjz/+yPz589m3bx9du3Z1rbfb7XTo0IHMzEz++ecfJk6cyIQJExgxYoSrTVJSEh06dOCOO+5g9erVDB48mMcff5yZM2fmw0s20UsvOb9OnKheVhGRYmT7By9jBdbWLEHYzU3MjiMiIlJoWAzDMK72yYcOHSI0NJT58+dz++23k5KSQpkyZfj222+59957Adi8eTNRUVEsXryYpk2b8ueff9KxY0f27dtHWFgYAJ9++inPP/88hw4dwsvLi+eff57p06ezfv16174efPBBjh8/zowZM64oW2pqKsHBwaSkpBAUFHS1LzH/dejgvD7re+9BlSpmpxERkevMYc8mubQP5Y/bWfz2AKKf/9jsSAVagX3/FhERU1zTSTQpKc7hTSVLlgQgISGBrKws2rRp42pTs2ZNKlasyOLFiwFYvHgxderUcRWrADExMaSmprLhzAy6ixcvdttGTpucbRRqU6c6ZwtWsSoiUiz8teNv2j5sZ+ztXtQf8IbZcURERAoVj6t9osPhYPDgwTRv3pybb74ZgP379+Pl5UVISIhb27CwMPbv3+9qc26xmrM+Z92l2qSmpnL69Gl8fX0vyJORkUFGRobrcWpq6tW+tOvLy8vsBCIicgONXzGejaGw7YW++PgHmx1HRESkULnqHtb+/fuzfv16vv/++/zMc9VGjRpFcHCw6xYREWF2pEvbtQv69IFVq8xOIiIi18me1D38lvgbAP0a9TM5jYiISOFzVQXrgAED+P3335k7dy4VKlRwLS9btiyZmZkcP37crf2BAwcoW7asq835swbnPL5cm6CgoIv2rgIMHz6clJQU12337t1X89JunJdfhs8/d34VEZEiafPQnnz9o53eRn1qlalldhwREZFCJ08Fq2EYDBgwgKlTp/L3339TuXJlt/UNGzbE09OTOXPmuJYlJiaya9cuoqOjAYiOjmbdunUcPHjQ1Wb27NkEBQVRq1YtV5tzt5HTJmcbF+Pt7U1QUJDbrUB76SWw2WD6dPjnH7PTiIhIPsvOTKfWj/N4eD085tfc7DgiIiKFUp4K1v79+/O///2Pb7/9lsDAQPbv38/+/fs5ffo0AMHBwfTu3ZshQ4Ywd+5cEhISePTRR4mOjqZp06YAtG3bllq1atGjRw/WrFnDzJkzeemll+jfvz/e3t4A9OvXj+3bt/Pcc8+xefNmxo0bxw8//MAzzzyTzy/fRNWqwaOPOu8PGwZXP1mziIgUQCu+fJ3wFAdH/Cw07P+m2XFEREQKpTxd1sZisVx0eVxcHL169QIgPT2doUOH8t1335GRkUFMTAzjxo1zDfcF2LlzJ08++STz5s3D39+fnj178vbbb+PhcXYOqHnz5vHMM8+wceNGKlSowMsvv+zax5UoFNPi79vnLFxPnYIffoD77jM7kYiI5JOl9cvQZPVhFtx7K7f/uNTsOIVGoXj/FhGRG+aarsNakBWaN7yRI+HVV6FyZdi0yXmNVhERKdR2JvxNRKPWWIHdy/4ionFrsyMVGoXm/VtERG6Ia7oOq+SDYcMgPBySkuDTT81OIyIi+WDXm89hBZbXLa1iVURE5Bpc9XVYJZ/4+8M778D69ZCHIc8iIlIwnTyyn1v+SAAg++n+JqcREREp3FSwFgSPPGJ2AhERySffrJ/E1pbQeZcfzXu9aHYcERGRQk1DggsahwOOHjU7hYiIXAW7w857a8bxQTNY//V72Dw8zY4kIiJSqKmHtSBJTITHHgMvL/j7b8hlVmYRESlg7HZYuJBft/zK9mPbKelbkp639DQ7lYiISKGngrUg8faGlSshPR2+/x4eesjsRCIicjlTpsCgQbBnD0ZNeLA2VM3KxL/qTOja1ex0IiIihZqGBBckkZHw4pnznYYOhdRUU+OIiMhlTJkC994Le/awLhS6bYavp8KAOWnO5VOmmJ1QRESkUFPBWtAMGwZVq0JyMrz2mtlpREQkN3a7s2f1zOXMT545XXVpeQg7eabN4MHOdiIiInJVVLAWND4+8NFHzvtjxjgvdyMiIgXPwoWwZw8AewLh1r3OxaE5xaphwO7dznYiIiJyVVSwFkR33w1dujg/le/XzzlzsIiIFCzJya67O4Odb6iLK0D18yd6P6ediIiI5I0K1oJq7Fjw94fTp+HwYbPTiIjI+cqVAyDZHxrvcy7yyc69nYiIiOSdCtaCqmJFWLAAli6F0FCz04iIyPlatIAKFdhcBrwcsDoM6u8/Z73FAhERznYiIiJyVVSwFmQNGoCHrjwkIlIg2Wzsf/9VRkfDgorgOPfS2TnX0R4zBmw2M9KJiIgUCSpYC4P0dHj5ZZg82ewkIiJyjtElNjO9BjzX0cu9d7VCBfjpJ12HVURE5Bqp+64w+OwzeOMNKFECbr9d50OJiBQAh08dZvyK8QC8/PSPWO4Lck6wVK6ccxiwelZFRESumcUwzlxArohJTU0lODiYlJQUgoKCzI5zbbKyoEkTWLUKOnSA3347O9xMRERMMfvRlvyTtIC/u9Rl3qDVWPR3OV8UqfdvERG5ZhoSXBh4esLXX4OXF0yfDnFxZicSESnWjiRtpNmkBbwyH9727qhiVURE5DpRwVpY3HwzvP668/7gwbB9u6lxRESKs/VDHsE/C9ZF+tGk72tmxxERESmyVLAWJkOHQvPmcOIEPPIIZF/sgn8iInI97V67iCa/rwIgc8SLWK06V1VEROR6UcFamNhsMGkSBAfDunXOm4iI3FC7nu6BTzasiipBg54vmB1HRESkSNMswYVNpUrOy9tUrQpVqpidRkSkWEmcMYnmC3YA4P3BWCxWfe4rIiJyPalgLYxiYsxOICJSLJ14bjAAC1tUokW7HuaGERERKQb00XBhN2eO83xWu93sJCIiRdrcpLl0a32Yb+pZiPh4otlxzLV8OTzzDGRmmp1ERESKOPWwFmZHj0KXLpCWBtWqwSuvmJ1IRKRIynZkM3jmYHaFwJI3nqTHLS3NjmSeo0fhvvtg507w84M33zQ7kYiIFGHqYS3MSpaEceOc90eOhFmzzM0jIlJETZj5LmsPrKWETwlG3jHS7DjmcTigZ09nsXrTTfDcc2YnEhGRIk4Fa2HXowf07QuGAQ8/DLt2mZ1IRKRIObhjI926vci3P8H7TV6mtF9psyOZZ/Ro+P138PaGn35yzlovIiJyHalgLQrGjIEGDeDIEejUyXmdVhERyRcbn+hMidPQ8LgvPZs9ZXYc8yxcCMOHO+9/9BHUr29uHhERKRZUsBYFPj4wZQqEhcHatdC9uyZhEhHJB6t//YxWf/0LQPZHY7B5eZucyCQHD8KDDzrfW7p3hyeeMDuRiIgUEypYi4pKleDXX53DtEqXVsEqInKNsrMy8Bz4DAD/3FmNWvf0MTmRSTIyoGtX2LcPoqLg00/BYjE7lYiIFBOaJbgoadIEVq2CmjX1z4SIyDWKf/4hWu46TYqPhRpf/GJ2HHMYBjz1FMTHO89XnToVAgLMTiUiIsWIeliLmqios8Wq3Q5btpibR0SkENq/bgmNPpkKwJrBD1Gqci2TE5lk7Fj46iuwWmHyZKhRw+xEIiJSzKhgLarS0pzXaG3SBNatMzuNiEihYRgGo38awnEfWFk9kOavTzA7kjlmzYKhQ533338fYmLMzSMiIsWSCtaiymaDY8fg+HHnPxk7dpidSESkUPh6zde8b11MvYGeBEyeis3D0+xIN966dXD//c7rrj76KAwebHYiEREpplSwFlW+vvDbb3DzzZCcDHfd5ZzlUUREcrU3dS+DZgwCYGi716her7XJiUywaxe0awcpKdCiBYwfr3kRRETENCpYi7ISJWDmTIiMhH//df4DkppqdioRkQLJsNvZ0aYhXZak0LhcI4Y1G2Z2pBvv6FHne8W+fVC79tnZ50VEREyigrWoCw93nodUpoxzBuH27eHECbNTiYgUOAuefYDmyw8w7g/45ta38bAWs4n0T5+GTp1g0yaoUAH+/NP5waeIiIiJVLAWB9WqOXtaQ0Jg9WrYvNnsRCIiBcqWhb9y68c/A7Bs0H3UKG5DgbOz4aGH4J9/nO8VM2ZARITZqURERHQd1mKjfn2YPRvS06FxY7PTiIgUGKePH4YHH8A3GxLqlqblO9+bHenGstuhd++zw3+nTXMOBxYRESkAVLAWJ40auT9etw4qV9ZF4EWk+DIM1nRtRtN9GRwMsFJpyt9YrMVo8FFOsfr1187Z5b/7zjnRkoiISAFRjN6Vxc3GjdCqFdx5Jxw+bHYaERFTLBnxGE3nbiXbAjs+fZvSVeqYHenGcTjgiSdg4sSzxeo995idSkRExI0K1uLq5EnnZQqWL3d+mr5rl9mJRERuqPUH1zNjySQcwN9PtOHW7s+aHenGcTigTx+Ii3MWq99+C/fdZ3YqERGRC6hgLa4aN4aFC50zQW7eDM2bO2eGFBEpBlIzUrn3h3sZeVsWA1+9ldbj/jQ70o1jt0PfvvDll2C1wv/+B/ffb3YqERGRi1LBWpxFRTlnhKxZE/bscfa0LllidioRkesqOyuD2G+6kngkkfKB5Xll2O/YbMVkSofMTOjeHb74wlmsfvMNPPig2alERERypYK1uIuIcPa0Nm4MR444z2uNjzc7lYjIdWEYBgvubczIl+ZQ9aQPvzz4C2X8y5gd68Y4edJ5ndXJk8HT03nO6sMPm51KRETkkorJR8pySaVLw99/Oz91P3z4wtmERUSKiPlDunLntHUA/K/CQBqFF5O/d0ePQocOzlE0fn4wdSq0bWt2KhERkctSwSpOAQEwZQqkpTmvwwfO85wyM8HX19xsIiL5YNknw7l9zC8ALHiqA7cPfMfcQDfKli3QsSNs3QolS8L06dC0qdmpREREroiGBMtZNhsEB599/P/+n/O81qQk8zKJiOSD1b9+Rp1n3sYKzL+7Fi0+nmZ2pBtjzhxo0sRZrFasCAsWqFgVEZFCRQWrXNyhQ/DVV5CQAPXrO4ePiYgUQol/TabSQ0/imw3L6oXSbOoKLNZi8Pb36acQEwPHj0N0tPMyZrVrm51KREQkT4rBO7ZclTJlYMUK5yfzKSnQtSsMGgQZGWYnExG5YlsPbyGtdw9KnDZYVyWQm/9eh6d3ET/NITMTnn4annzSeWpH9+7OeQpCQ81OJiIikmcqWCV3lSo5h48NHep8/NFHzuu1/vuvublERK7A1iNbuePrO+ncLYs/G4UQEb8OvxJFvGhLSnKeyvHJJ87Hb77pvHSNj4+5uURERK6SCla5NC8veP99+O0352QdCQnOS99kZpqdTEQkV1t2JNBqYiv2nthLcNVaNJi7mZCwSmbHur5+/tl5CseyZRASAr/84pyLwGIxO5mIiMhVU8EqV6ZjR1i9Gu64A956y1nIiogUQP/O+I4SdW6l+eJ91C5Tm7k95xIWEGZ2rOsnPR0GDIB773WewtG0qfPvdefOZicTERG5ZrqsjVy5iAj46y/3T+unT4fEROf5rTabedlERIDVk0ZT5bFhBGbCC6v8iPhqDmX8i/Aw4M2b4aGHnAUqwHPPwRtvgKenqbFERETyi3pYJW+s1rMFa0oKPPGE8xzXFi2c/ziJiJgk/sMhRPV0FqsrooKJ/GcjZQKLaM9qdja8/TbUq+csVkuXhj//hHfeUbEqIiJFigpWuXpBQTByJAQGwuLFULcuDBkCx46ZnUxEihHD4WB+/45ED/kQbzssblKem5fvpGRoET1ndeVK52Vqhg93ztzerp2zaG3XzuxkIiIi+U4Fq1w9i8XZw7p+PXToAFlZ8OGHULUqfPyx87GIyHV0KiON+XdVo+W46ViBhR3qcOvC7fj4B5sdLf8dOwb9+0OjRs7LjoWEQFwc/PEHlC9vdjoREZHrQgWrXLuKFeH332HGDOdF6Y8ehYEDnf9QiYhcJ0nHkmg+oQVLM7Zjt8C8od247bc12DyL2KRwDgdMmAA1asC4cWAYzvNWN26EXr00C7CIiBRpmnRJ8k9MDLRuDV98AWvWOIes5UhKgsqVzcsmIkXKzPW/8vAfj3H09FH2dSrNXc++QavOfc2Olf/WroWnnoL4eOfjqCj4z3+cM7aLiIgUA+phlfzl4QH9+sH48WeX7dnj7Bm44w7nLMOGYV4+ESnUTqceZUGX+pSM6ULaiaM0Cm/Ein4raVDUitXdu6FvX2jQwFms+vs7J1TKubyYiIhIMaGCVa6/RYucX+fNg7vucl4j8NdfncPcRESu0Lopn5JcrRy3/7qaxvvgE0sHFj66kIjgCLOj5Z/kZHj6aedcAP/9L9jtzuurbtrkvGSNroEtIiLFjApWuf4efBC2bXOe1+rrC8uWQZcuzlmFJ01yXp5BRMRud36w9d13zq92OwAnjx1kfpf61O72JDcdzGR/kJVln43gidd+x8fDx9TI+SY5GYYNg5tugk8+gcxMZ0/qwoXw44/O62CLiIgUQxbDKJrjM1NTUwkODiYlJYWgoCCz40iOgwdh7FjnP2SpqRAQAHv3Oi+RIyLF15QpMGiQ8xSCHBUqkPBgS0rHTabSEecHWwtbV6PO1zMJCS8i58QnJcH778OXXzovUQPQrBm8/jrceae52Uyi928RETmXeljlxgoNhTffhJ07nV+feeZssWoYzn9Yp09Xr6tIcTJlinPY6znF6sYy0PH2PRyaOolKR7LZG2JjxVdv0OKvLYW/WHU4YOZM+L//gypVnDP/ZmQ4C9U//3SeRlFMi1UREZHzqYdVCo6lS53nt4LzmoI9ezpv1aubm0tErh+7HSIjXcXqIT94uzmMjQa7FW5JhrFzPKm/cCtBZSuZm/VaHT0K33zjLFC3bDm7PCYGhg+H22/XJWrQ+7eIiLhTD6sUHGFhzh7WUqWcw4Tfess5u3CDBvDuu85zvESkaFm4EPbsYb8/zKsEPtlw03FnsdplE/zwE7T8N4ugzUlmJ706djvMmuU8l79cORg82FmsBgU5/94lJjqvYd2ypYpVERGRi9B1WKXgiIyEMWOcl26YNg3i4pz/6K1a5bw1bOj8hw/g9Gnw8dE/eCKF3PYlf7K3Ity6F1rtdC5rsRPmfwW37zqnYWH6wMpud16K5scf4eef3bPfcgv06QM9ekBgoHkZRURECgkVrFLweHvDffc5b4cPO89vmznT2QOR49lnnee6duwInTo5h9L5FJHZQkWKOMMwWD3tv2S8OZJblydz05nla8IgwwaN9l1k+E/Oh1UFVVaWs7f455+df7P27z+7rkQJ6N4dHnsM6tc3L6OIiEghpHNYpXCKioLNm88+9vZ2Tlhyxx3OW/Pm6n0VKWD2pu5l4pqJxK2O48Gp//L6XOfypRFW/DIc1Dl4kSdZLFChgnM2XZvthua9rH37nMN5//gDZs92znyeIyTEefmu++6D1q2df6Pkiuj9W0REzqUeVimcEhLgr7/g99+dPa379sHcuc5btWruE5osWuScuCk01Ly8IsXU0d1bWf/Z6wRM+Y13ah/nh5udy39q7EdbWwXKvfIeTQ5mO2cJtuCcLTxHzodOY8YUjGJ1507n35NFi5y9qRs2uK8vXdo58+999zln+fXyMieniIhIEaKCVQonPz/nP4b/93/Of3ATE88WrFWqnG2XlQVt2zrPea1UCZo0gVtvdd5uvtk5VE9E8o3hcJD412T2//gVJectpfa2E9x+pgZ92AH7O9zOY/Ueo1utbgR4BZx94k8/XfQ6rIwZA1273tDXADj/dmzYAIsXO4vTRYtg9273NhYLNG4M7dvD3XdDo0Zg1VyGIiIi+UlDgq8ju935f05ysvP0qxYtCkYnwZUqzPlzsh9fv4e7RrfDb+dGLBf7UX/iCfjvf533HQ5Ytgxq1Tp7bViTFIVjXxizQ+HOb0Z2wzDYenQr83fMZ9G2ubzVdzLljzvc2iRW8CG5YyuqPvkiFereVrBeADiH8m7e7JzcbeVK523dOue1Uc9lszlnLW/RAm67zXkrU+b65ytmCsL7t4iIFBwFuof1P//5D++99x779+/nlltu4eOPP+bWW281O9YVmTLl4p0FY8ea01mQV4U5v3v2CsB6aoan8t8+K2jhtdRZlCYkOHtLypc/+8SdOyE62nm/TBmoXNk5c3HOrVkz5wyfNzS/U+E89k6FJTsU7vw3IrvhcJC8fgm75/3K6eX/4L8+kSOZqdx9/9nCrr8fBJ+CDXXKktH2Tqo8PIAaN0dT40p2YLNBq1b5E/Z8J07Av//C1q1nv+bcDl7s5FmcH1w1bny2QG3aFPz9r08+ERERuagC28M6efJkYmNj+fTTT2nSpAljxozhxx9/JDExkdArOBfxen1CaxgGlstM5jNlivN0rPOPbM7TfvqpYP/zW5jz5yl7aqqzRydnWPCSJdCtm/N82It5+WV47TXn/a1bneeplSnjvIWGut+vU8d9aPL1yF/AFObsULjz52d2wzA4mrKfpFN72XJkC1uObKH2p1OotmI7lfadpMRp9/ZZVgh90ZO6N0XTslJL2lmr07DR/+Htf4N6xjIynDPyJief/Zpzy3m8Zw8cOHDp7YSGQr16zh7UnFvlyhriawL1sIqIyLkKbMHapEkTGjduzCeffAKAw+EgIiKCp59+mhdeeOGyz79eb3gj4mJZsOEPSoaUo1SJ8pQpFUHpEuUJDg6jRGAZSviG8lDnUhzYURKy/CHLDxxnO7JvyISXDoezEHM4Ln8/O9t5O7Pcnmmn7V12Dh/MxGbNxGrJwmbNxGbNwGZNx8OaTulS2bz7bjYW7Nizs3DYs3EYdhzZ2c77DjsORzZGth3DcGDYszHs2ZCVjeGw4zAczpvDgZ1zhg6e+0GAxeq+2LXO4pyYBbBgwbA4v4Lzn/Wvv7GQdpIzj89uwzjTJjDAQq9eYLGd8zxLzj3AasV2OgPvo6n4HE3B+2iq83YslUNNbuZ4nWrO7WzbTa2Pv8/1W7CnQwuS726BYQHf/Ueo8dG32P19cXh7OW+eHhjeXti9PDleryYpDWuTbbHy8agMGh5cQ7rFkwyLJ+kWL9ItHs6vVk+yQgJ58kU/rBbn99l2Kh3DasWwWXFYnPkdFrAY4LA6HxsYYBhYsrLBMDAwXMOjDYeBYcH5fC9PDMPAYbdjPXkKu5GN4XCcOZYGhuEAA7I9bWT5OSeTMewO/A8fx5Ht4OefHGScdGDFwILza5rNi90+wWAxCPA3GNp4FxhnfgYNA6vhzGoB0gN8OFS1nOv7UnnFv3hkOc5895zfaywWsFjICPIj+ebKZ34+LESs3IYt237mZ8OCYbU4t2O1kunnw9E6VbBZbFitVkLX78Ar047FasVitWKz2DBsnkz8nxcHT/ixzqOG83fWsHJTVjIeDgO7xYOAYC/eescHb18fPL388PD1wyukFB5WD+eHWBYLeHg4bzabs9CxODPkev/cZTbb2efabFc8y7Xd7hwAcG7P6jlr8fc6QLWIfUyeeJBjlUpxIvMEJzJO4Bu/FNuGTTiSk/E8cAi/w8cpceQkpY9n4ZsFAf8Pcn6Fvv8RHjgzv1CmDbaF+3CoRgSO+vUo1fwuqt71AL5+efw763A4i81Tp5y9n+ffUlMvvjxn3cGDzmL06NEr32fp0s5J2apVg6pV3e8HB+ctv1w3KlhFRORcBbJgzczMxM/Pj59++okuXbq4lvfs2ZPjx4/z66+/XvCcjIwMMs453yg1NZWIiIh8f8Obe1sF7ojfe8k2dovz5rCA3XrmqwXsFgvZFit2iwUPDws2iwUrzsLpzL/XzkLizD/xYDi/Gob7Oueqi6wHq92BrcB9R0Xkatgt5/6+4/qwxvUrboEjfjYyDecHFcEZdnztDuffAnB+IHDO9laFQZYNsq1Q9SiEnsp93xvL2rD6+OJr8yYwA7wdVmy+/nj5BmC1Wp2fEOW8feTcv9hjw3B+KJaR4X7Lysqno4RzNt6yZZ3nveZ8zbmVLQvh4c4RDyEh+bdPuW5UsIqIyLkK5Dmshw8fxm63ExYW5rY8LCyMzedee/Mco0aNYuTIkdc9W3TNNmRtngYZGVgzMrFlZV/QxmZwtmi0n7vGOH+BqewW53A+u9X5D+zFiuycx3ZLThsLdosFi9UCtrO9Xg6rxdX7ZVgtGGfu5yy326zO+1YLYMFqsWAxLK7h1TkFOud8yXlg4exii3HOcsO9aWaGwck0533LRZ6fI8APPL0M135dtUBun924/um/WL7cn+da7jDwyXRgszt7Nq0OZ8+izQCrw+Ckt5UMLxuWLAPbKQdhp7OxGjh7Kg3O3AerYXDE24OUIA88bOCZ5SDicObFMwMpfjaOBXthMcBmd1DhUEaubU/4nm1rdRiUP5Sea9tTPjZSgn3OHAuDsEOncu46D43l7NE6ZbNxxMvH9dwKGaecPwJccBjJ9rRxMvDstSoDj592fr/P/QE4w26zcDLg7CVDAlMzsDou/n2w2yyk+Xu6PuQJTMu6sO2Z8HaLhaO+OT3zBqVOO/AwOOdnwPnVgvN34pDf2U2UOg2e7nMNnd08Z4vPvHygdEHbizwOTbNzpX9X6l9mVOy5au23A2lnbjkOXfkG8sLHBwIDz96CgtwfX+wWGnq2IC1ZUtddFhERKaIKZMF6NYYPH86QIUNcj3N6WPObzxcT4ItzFjgckJkJ6emQnU38Qgf3drVjxY7Ndgqbx0msniexeZzEZjuFh8dJPGxpDBicToXKGZy2p5Oe7fya5cjGcmaYoMVidRZ3ljO9r+c8tlpsYD2z7Ly2xpkhiRYPD7w8ffHw9MLD5oWnpzdWmwc2Ty88PLzwsHniafXE28MbL5sX3jZvvD28Wb7Ek3u7eoDdAwybc2ikwwPsnpxbBs6de/3mRrla8+bBXXdcvl1BzA7O/HdcLn86zP3znPwOh7OnKmd4t/1s4RLs40Owr+/ZdqfOdKdZzn64kPM40GYj0NPT+dgwnO0v1hbwO3PLNfu5RVX2mdsZlzr2noDvpV+9mytt6wn4XKaNK78BnMy9XU5+uz2bjMxTeGMn25GN3bBz6NBB7CfTsGecJjv9FPasTLIz08nOTMeOg+O1q2B32LEbdgKXr8Hz0FHsDgcOw47dYXeNorBg4WCTm7EZFiyGQUjiTnyOpzmL5jPDva2GxTmkGkjwrMJ/xjo/mLkpcz8lstPJyg7idHYw6fYQ0jNLkmn48cF7cEvt7LM/KznO/R6f8zNxxY+vpI2HB3h7O29eXs6vPj5nbzk/eyIiIiLnKTJDgs9n1pCinPPJ9u69cAIUuEHnsF6Dwpy/MGeHwp2/MGeHwp2/MGcXuRgNCRYRkXMVyOkPvby8aNiwIXPmzHEtczgczJkzh+icy44UUDab8zIScOEItZzHY8YU3H8cC3P+wpwdCnf+wpwdCnf+wpxdRERE5HIKZMEKMGTIED7//HMmTpzIpk2bePLJJzl58iSPPvqo2dEuq2tX52Ukzr3EJzh7OQrypTFyFOb8hTk7FO78hTk7FO78hTm7iIiIyKUUyCHBOT755BPee+899u/fT7169fjoo49o0qTJFT23IAwpstth4ULnlRfKlXNee74w9XIU5vyFOTsU7vyFOTsU7vyFObtIjoLw/i0iIgVHgS5Yr4Xe8ERERAofvX+LiMi5CuyQYBERERERESneVLCKiIiIiIhIgaSCVURERERERAokFawiIiIiIiJSIKlgFRERERERkQJJBauIiIiIiIgUSCpYRUREREREpEBSwSoiIiIiIiIFkgpWERERERERKZA8zA5wvRiGAUBqaqrJSURERORK5bxv57yPi4hI8VZkC9YTJ04AEBERYXISERERyasTJ04QHBxsdgwRETGZxSiiH2E6HA727dtHYGAgFovFtBypqalERESwe/dugoKCTMtRHOnYm0fH3jw69ubRsc8fhmFw4sQJwsPDsVp15pKISHFXZHtYrVYrFSpUMDuGS1BQkP6BMYmOvXl07M2jY28eHftrp55VERHJoY8uRUREREREpEBSwSoiIiIiIiIFkgrW68zb25tXXnkFb29vs6MUOzr25tGxN4+OvXl07EVERPJfkZ10SURERERERAo39bCKiIiIiIhIgaSCVURERERERAokFawiIiIiIiJSIKlgFRERERERkQJJBet19p///IfIyEh8fHxo0qQJy5YtMztSkTdq1CgaN25MYGAgoaGhdOnShcTERLNjFTtvv/02FouFwYMHmx2l2Ni7dy+PPPIIpUqVwtfXlzp16rBixQqzYxV5drudl19+mcqVK+Pr60uVKlV4/fXX0ZyGIiIi104F63U0efJkhgwZwiuvvMLKlSu55ZZbiImJ4eDBg2ZHK9Lmz59P//79WbJkCbNnzyYrK4u2bdty8uRJs6MVG8uXL+ezzz6jbt26ZkcpNo4dO0bz5s3x9PTkzz//ZOPGjYwePZoSJUqYHa3Ie+eddxg/fjyffPIJmzZt4p133uH/t3c3IVG1ARiGn5yPQRERMpwaMnFXqeDP2KCCCLqRahVF4sIUWo1/DQSToCt/wCAkBxUj2phEEKK4iwk0JVDMEV2EgRBt1NykFRjMsZ0gfbsY3+M59wWzeVc3w8DwcHg5AwMDGhoaMp0GAMCpx2ttkigYDKqsrEzRaFSSZFmWcnJy1NraqkgkYrjOPb59+6bs7GzNzs6qqqrKdI7j/fjxQyUlJRoeHlZPT4+Kioo0ODhoOsvxIpGIFhYW9P79e9MprnPjxg35fD49f/786OzWrVtKS0vT+Pi4wTIAAE4/nrAmye/fv7W8vKza2tqjs5SUFNXW1urDhw8Gy9zn+/fvkqSzZ88aLnGHUCik69evH/vtI/mmp6cVCAR0+/ZtZWdnq7i4WM+ePTOd5QoVFRWKxWLa2NiQJK2urmp+fl51dXWGywAAOP3+Mx3gVLu7u0okEvL5fMfOfT6fPn36ZKjKfSzLUkdHhyorK1VQUGA6x/FevXqljx8/amlpyXSK62xubmpkZEThcFidnZ1aWlpSW1ubvF6vGhsbTec5WiQS0d7eni5fviyPx6NEIqHe3l41NDSYTgMA4NRjsMLRQqGQ1tfXNT8/bzrF8b5+/ar29na9fftWqamppnNcx7IsBQIB9fX1SZKKi4u1vr6u0dFRBmuSvX79Wi9fvtTExITy8/MVj8fV0dEhv9/Pdw8AwD9isCbJuXPn5PF4tL29fex8e3tb58+fN1TlLi0tLZqZmdHc3JwuXrxoOsfxlpeXtbOzo5KSkqOzRCKhubk5RaNRHRwcyOPxGCx0tgsXLujq1avHzq5cuaI3b94YKnKPhw8fKhKJ6O7du5KkwsJCffnyRf39/QxWAAD+EXdYk8Tr9aq0tFSxWOzozLIsxWIxlZeXGyxzvsPDQ7W0tGhyclLv3r1TXl6e6SRXqKmp0dramuLx+NEnEAiooaFB8XicsZpklZWVf72+aWNjQ7m5uYaK3OPXr19KSTn+d+rxeGRZlqEiAACcgyesSRQOh9XY2KhAIKBr165pcHBQP3/+VFNTk+k0RwuFQpqYmNDU1JQyMjK0tbUlScrMzFRaWprhOufKyMj4655wenq6srKyuD98Ah48eKCKigr19fXpzp07Wlxc1NjYmMbGxkynOd7NmzfV29urS5cuKT8/XysrK3ry5Imam5tNpwEAcOrxWpski0ajevz4sba2tlRUVKSnT58qGAyaznK0M2fO/O/5ixcvdO/evZONcbnq6mpea3OCZmZm9OjRI33+/Fl5eXkKh8O6f/++6SzH29/fV1dXlyYnJ7WzsyO/36/6+np1d3fL6/WazgMA4FRjsAIAAAAAbIk7rAAAAAAAW2KwAgAAAABsicEKAAAAALAlBisAAAAAwJYYrAAAAAAAW2KwAgAAAABsicEKAAAAALAlBisAAAAAwJYYrAAAAAAAW2KwAgAAAABsicEKAAAAALAlBisAAAAAwJb+APbPNqpFB0C0AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Représentation graphique : LN\n",
    "xcont=np.linspace(-.25,len(yt)-0.75,500)\n",
    "plt.scatter(xm,m, color='blue', label = \"lettres du message\")\n",
    "plt.scatter(xr,r, color='red', label = \"lettres supplémentaires\")\n",
    "plt.plot(xcont,pol_Lagrange(xcont,xm,m), color='green', label =\"polynome d'origine\")\n",
    "\n",
    "error, res = detectErreur(k, yError)\n",
    "if(error):\n",
    "    xt = np.arange(len(yt))\n",
    "    list_s= list(itertools.combinations(xt, k))\n",
    "    s0 = res[0]\n",
    "    print(s0)\n",
    "    s1 = res[-1]\n",
    "    print(s1)\n",
    "    plt.plot(xcont,pol_Lagrange(xcont,xt,s0), color='red', label =\"polynome calcule à partir du message modifie\")\n",
    "    plt.plot(xcont,pol_Lagrange(xcont,xt,s1), color='red', linestyle = '--', label = \"Idem\")\n",
    "\n",
    "plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La correction d'erreurs est plus subtile.\n",
    "\n",
    "**question 3**\n",
    "\n",
    "Observer ce qui se passe quand on a 1 erreur de transmission. Proposer une fonction de correction en cas d'erreur\n",
    "\n",
    "\n",
    "_python_ on pourra utiliser `sub= list(itertools.combinations(...))` pour construire les sous-ensembles et `from collections import Counter` pour compter les valeurs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Message avec erreur : [   -77      0    -50    -78     75    -72     67   5572  31255 108709]\n",
      "Message initial :  [   -77     91    -50    -78     75    -72     67   5572  31255 108709]\n",
      "Message corrigé :  [-77.0, 91.0, -50.0, -78.0, 75.0, -72.0, 67.0, 5572.0, 31255.0, 108709.0]\n"
     ]
    }
   ],
   "source": [
    "def correctErreur(k, yt):\n",
    "\n",
    "        return yt\n",
    "\n",
    "    \n",
    "    \n",
    "k = 7\n",
    "t = 3\n",
    "xm = np.arange(k)\n",
    "m = random.sample(range(-100, 100), k)\n",
    "_,r = lettreSup(t, xm, m)\n",
    "yt = m+r\n",
    "yt = np.asarray(yt)\n",
    "correctErreur(k,yt)\n",
    "\n",
    "yError = yt.copy()\n",
    "yError[1] = 0\n",
    "print(\"Message avec erreur :\", yError)\n",
    "print(\"Message initial : \", yt)\n",
    "print(\"Message corrigé : \", correctErreur(k,yError))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Extensions suggérées :\n",
    "\n",
    "#### Corrections d'erreur dans le cas où on a $t$ erreurs exactement\n",
    "Faire de la correction d'erreur dans le cas où il y a autant d'erreurs que de lettres ajoutées en fin de message.\n",
    "\n",
    "\n",
    "#### corps finis\n",
    "\n",
    "Les fonctions présentées sont normalement implémentées sur des corps finis ($\\mathbb{Z} / \\mathbb{pZ}$, comme vu en crypto).\n",
    "\n",
    "Adapter vos fonctions et présenter des exemples. Justifier l'iteret de travailler sur ces corps finis\n",
    "\n",
    "#### codes de Reed-Solomon\n",
    "\n",
    "Comprendre et implémenter (une version éventuellement simplifiée) des \n",
    "[bonne référence](http://www.fa17.eecs70.org/static/notes/n9.html)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
