diff --git a/Cryptographie/1_monoalphabetique.ipynb b/Cryptographie/1_monoalphabetique.ipynb
index 216292d9d5afb505be6a015191a15081c6a62a4e..8cd32ad4ce2f568c9517b949cc7c1c6e9c427a86 100644
--- a/Cryptographie/1_monoalphabetique.ipynb
+++ b/Cryptographie/1_monoalphabetique.ipynb
@@ -3,17 +3,35 @@
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": "<div style=\"padding:20px;background-color:papayawhip;\" > \n<h3 style=\"color:chocolate\"> <i class=\"fa fa-info\" aria-hidden=\"true\"> </i> &nbsp; Remarque introductive &nbsp;  <i class=\"fa fa-info\" aria-hidden=\"true\"></h3> \n<p> Ce fichier est fait pour être lu sur le site <a href=\"https://notebook.basthon.fr/\"><img src='https://notebook.basthon.fr/assets/efede5218c9087496f16.png' style=\"border: 0; display:inline; margin: 0 5px; height:30px\" alt=\"Basthon\"/></a>. <br>\n    \nSi vous l'avez ouvert avec un autre programme, comme Jupyter notebook, vous riquez de rencontrer quelques bugs. <br>\nVeuillez cliquez sur <a href=\"https://notebook.basthon.fr/\">ce lien</a> et y charger ce fichier à l'aide du bouton \"Ouvrir\"  &nbsp; <i class=\"fa fa-folder\" aria-hidden=\"true\"> </i>\n</p> </div>    "
+   "source": [
+    "<div style=\"padding:20px;background-color:papayawhip;\" > \n",
+    "<h3 style=\"color:chocolate\"> <i class=\"fa fa-info\" aria-hidden=\"true\"> </i> &nbsp; Remarque introductive &nbsp;  <i class=\"fa fa-info\" aria-hidden=\"true\"></h3> \n",
+    "<p> Ce fichier est fait pour être lu sur le site <a href=\"https://notebook.basthon.fr/\"><img src='https://notebook.basthon.fr/assets/efede5218c9087496f16.png' style=\"border: 0; display:inline; margin: 0 5px; height:30px\" alt=\"Basthon\"/></a>. <br>\n",
+    "    \n",
+    "Si vous l'avez ouvert avec un autre programme, comme Jupyter notebook, vous riquez de rencontrer quelques bugs. <br>\n",
+    "Veuillez cliquez sur <a href=\"https://notebook.basthon.fr/\">ce lien</a> et y charger ce fichier à l'aide du bouton \"Ouvrir\"  &nbsp; <i class=\"fa fa-folder\" aria-hidden=\"true\"> </i>\n",
+    "</p> </div>    "
+   ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": "# Chiffrement symétrique - Le chiffrement monoalphabétique\n\nLe but de ce travail pratique est de déchiffrer un message qui a été chiffré avec un chiffrement monoalphabétique en adaptant un programme déjà créé.\n"
+   "source": [
+    "# Chiffrement symétrique - Le chiffrement monoalphabétique\n",
+    "\n",
+    "Le but de ce travail pratique est de déchiffrer un message qui a été chiffré avec un chiffrement monoalphabétique en adaptant un programme déjà créé.\n"
+   ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 1 </h3> \n\nLe programme suivant permet de déchiffrer un message selon le principe du chiffrement monoalphabétique, en connaissant la clé de chiffrement. \n\nLisez-le en essayant de le comprendre, puis testez-le."
+   "source": [
+    "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 1 </h3> \n",
+    "\n",
+    "Le programme suivant permet de déchiffrer un message selon le principe du chiffrement monoalphabétique, en connaissant la clé de chiffrement. \n",
+    "\n",
+    "Lisez-le en essayant de le comprendre, puis testez-le."
+   ]
   },
   {
    "cell_type": "code",
@@ -22,12 +40,51 @@
     "trusted": false
    },
    "outputs": [],
-   "source": "# Texte à déchiffrer\ntexte_chiffre = \"\"\"WI RUWWIAI VXVBUPFX TUOV VUOQSXMI OPI NUPPI SPPII\"\"\"\n\n# Alphabet MAJUSCULE uniquement pour simplifier\nliste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n# Pour chaque lettre, correspond une lettre dans liste_alphabet\nliste_chiffree = \"SNRFIYAQXLKWBPUZCHVMOTGJDE\"\n\n# texte_dechiffree contiendra la chaine de caractère donc le texte déchiffré\ntexte_dechiffre = \"\"\n\n\n# Parcours caractère par caractère le fichier ouvert.\nfor lettre in texte_chiffre:\n\n    # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n    if lettre.isalpha():           \n        # Recherche la position (index) de la lettre à déchiffrer dans la liste_chiffree.\n        index = liste_chiffree.index(lettre)\n        \n        # On utilise cet index pour trouver la lettre dans liste_alphabet.\n        lettre_dechiffre = liste_alphabet[index]\n                \n        # On ajoute le caractère déchiffré à la suite du texte déjà déchiffré.\n        texte_dechiffre = texte_dechiffre + lettre_dechiffre\n    else:\n        # la lettre n'est pas un caractère alphabétique mais peut-être une ponctuation\n        texte_dechiffre = texte_dechiffre + lettre\n\n# On affiche le texte dechiffre\nprint(texte_chiffre)\nprint(texte_dechiffre)\n\n"
+   "source": [
+    "# Texte à déchiffrer\n",
+    "texte_chiffre = \"\"\"WI RUWWIAI VXVBUPFX TUOV VUOQSXMI OPI NUPPI SPPII\"\"\"\n",
+    "\n",
+    "# Alphabet MAJUSCULE uniquement pour simplifier\n",
+    "liste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n",
+    "\n",
+    "# Pour chaque lettre, correspond une lettre dans liste_alphabet\n",
+    "liste_chiffree = \"SNRFIYAQXLKWBPUZCHVMOTGJDE\"\n",
+    "\n",
+    "# texte_dechiffree contiendra la chaine de caractère donc le texte déchiffré\n",
+    "texte_dechiffre = \"\"\n",
+    "\n",
+    "\n",
+    "# Parcours caractère par caractère le fichier ouvert.\n",
+    "for lettre in texte_chiffre:\n",
+    "\n",
+    "    # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n",
+    "    if lettre.isalpha():           \n",
+    "        # Recherche la position (index) de la lettre à déchiffrer dans la liste_chiffree.\n",
+    "        index = liste_chiffree.index(lettre)\n",
+    "        \n",
+    "        # On utilise cet index pour trouver la lettre dans liste_alphabet.\n",
+    "        lettre_dechiffre = liste_alphabet[index]\n",
+    "                \n",
+    "        # On ajoute le caractère déchiffré à la suite du texte déjà déchiffré.\n",
+    "        texte_dechiffre = texte_dechiffre + lettre_dechiffre\n",
+    "    else:\n",
+    "        # la lettre n'est pas un caractère alphabétique mais peut-être une ponctuation\n",
+    "        texte_dechiffre = texte_dechiffre + lettre\n",
+    "\n",
+    "# On affiche le texte dechiffre\n",
+    "print(texte_chiffre)\n",
+    "print(texte_dechiffre)\n",
+    "\n"
+   ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": "On veut maintenant déchiffrer le message suivant `JI KXJIEOI IWIFEIJ TI OIK IKNVOIK XEYXEXK D'IYYFVXI` qui a été chiffré avec la clé `VMOTIYAQXLGJDESNRFKWBPUZCH`.\n\nReprenez le programme précédent et adaptez-le pour déchiffrer ce message."
+   "source": [
+    "On veut maintenant déchiffrer le message suivant `JI KXJIEOI IWIFEIJ TI OIK IKNVOIK XEYXEXK D'IYYFVXI` qui a été chiffré avec la clé `VMOTIYAQXLGJDESNRFKWBPUZCH`.\n",
+    "\n",
+    "Reprenez le programme précédent et adaptez-le pour déchiffrer ce message."
+   ]
   },
   {
    "cell_type": "code",
@@ -36,7 +93,7 @@
     "trusted": false
    },
    "outputs": [],
-   "source": ""
+   "source": []
   },
   {
    "cell_type": "markdown",
@@ -45,12 +102,23 @@
      "breakpoint"
     ]
    },
-   "source": "#### Ctrl+enter pour continuer ..........."
+   "source": [
+    "#### Ctrl+enter pour continuer ..........."
+   ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 2</h3> \n\nOn aimerait maintenant déchiffrer un message chiffré avec le chiffrement monoalhabétique, mais dont on ne connaît pas la clef.\n\n**Comment procéder pour trouver la clé ?**\nOn peut compter les occurrences (répétition) de chaque lettre dans le message chiffré et les comparer à celles de la langue française pour essayer de retrouver la correspondance.\n\nC'est ce que fait le programme suivant. Lisez-le en essayant de le comprendre, puis testez-le.\n"
+   "source": [
+    "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 2</h3> \n",
+    "\n",
+    "On aimerait maintenant déchiffrer un message chiffré avec le chiffrement monoalhabétique, mais dont on ne connaît pas la clef.\n",
+    "\n",
+    "**Comment procéder pour trouver la clé ?**\n",
+    "On peut compter les occurrences (répétition) de chaque lettre dans le message chiffré et les comparer à celles de la langue française pour essayer de retrouver la correspondance.\n",
+    "\n",
+    "C'est ce que fait le programme suivant. Lisez-le en essayant de le comprendre, puis testez-le.\n"
+   ]
   },
   {
    "cell_type": "code",
@@ -59,12 +127,62 @@
     "trusted": false
    },
    "outputs": [],
-   "source": "# Texte à déchiffrer\ntexte_chiffre = \"\"\"WI RUWWIAI VXVBUPFX TUOV VUOQSXMI OPI NUPPI SPPII\"\"\"\n\n# Alphabet\nliste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n# Liste des occurrences\nliste_occurrence = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n\n# Contiendra le texte déchifré\ntexte_dechiffre = \"\"\n\n# Parcours caractère par caractère le fichier\nfor lettre in texte_chiffre:\n    \n    # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n    if lettre.isalpha():\n        \n        # Recherche la position (index) de la lettre (conversion en minuscule)\n        # à déchiffrer dans la liste_alphabet.\n        index = liste_alphabet.index(lettre)\n        \n        # Incrémenter l'occurence de la lettre correspondante\n        liste_occurrence[index] = liste_occurrence[index] + 1\n\n# Afficher les occurrences de chaque lettres\nfor i in range(26):\n    print(liste_alphabet[i], \":\",liste_occurrence[i])"
+   "source": [
+    "# Texte à déchiffrer\n",
+    "texte_chiffre = \"\"\"WI RUWWIAI VXVBUPFX TUOV VUOQSXMI OPI NUPPI SPPII\"\"\"\n",
+    "\n",
+    "# Alphabet\n",
+    "liste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n",
+    "\n",
+    "# Liste des occurrences\n",
+    "liste_occurrence = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
+    "\n",
+    "# Parcours caractère par caractère le fichier\n",
+    "for lettre in texte_chiffre:\n",
+    "    \n",
+    "    # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n",
+    "    if lettre.isalpha():\n",
+    "        \n",
+    "        # Recherche la position (index) de la lettre (conversion en minuscule)\n",
+    "        # à déchiffrer dans la liste_alphabet.\n",
+    "        index = liste_alphabet.index(lettre)\n",
+    "        \n",
+    "        # Incrémenter l'occurence de la lettre correspondante\n",
+    "        liste_occurrence[index] = liste_occurrence[index] + 1\n",
+    "\n",
+    "# Afficher les occurrences de chaque lettres\n",
+    "for i in range(26):\n",
+    "    print(liste_alphabet[i], \":\",liste_occurrence[i])"
+   ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": "Vous avez maintenant intercepté le message suivant dont vous ne connaissez pas la clé : \n```\nPGY VGPNGDGY YITJMYYGZD MIYYA GZ NMPGIT PGY MIDTGY QMIPEAY WMT APY GZQMQGZD \nWEZDTG PGY QGTUMAZY BGY PIDDGY JTGYOIG FEITZMPAGTGY YEAD OI APY PGY TGJEIYYGZD \nBG PGIT JTEJTG DGTTADEATG YEAD OI APY GZNMVAYYGZD WGPIA BG PGITY GZZGUAY ETQGDETAX \nGDMAD WVGH PGY VGPNGDGY PG JTGUAGT JMT YM ZMAYYMZWG GD JMT YGY TAWVGYYGY YEIY PG \nWEZYIPMD BG U UGYYMPM GD BG U JAYEZ WGD VEUUG JEIYYG JMT P MURADAEZ WEZFITM MNGW \nPM ZERPGYYG GD GZQMQGM PGY VMRADMZDY M YETDAT BI JMCY MNGW DEIDGY PGITY LETWGY \nAP PGIT BAD OIG P GUJETDMZD JMT PG WEITMQG YIT DEIY PGY JGIJPGY BG PM QMIPG APY \nPM YEIUGDDTMAGZD MAYGUGZD DEID GZDAGTG M PGIT GUJATG AP GID B MIDMZD UEAZY BG \nJGAZG M PGY JGTYIMBGT OIG PGY VGPNGDGY YEZD BG DEIDGY JMTDY TGYYGTTGY JMT PM \nZMDITG BGY PAGIX B IZ WEDG JMT PG TVAZ LPGING DTGY PMTQG GD DTGY JTELEZB OIA \nYGJMTG PGIT DGTTADEATG BG PM QGTUMZAG B IZ MIDTG JMT PG FITM VMIDG UEZDMQZG \nOIA Y GPGNG GZDTG PM YGOIMZAG GD P VGPNGDAG B IZ DTEAYAGUG WEDG JMT PG PMW \nPGUMZ GD PG TVEZG OIA YGJMTG WGDDG BGTZAGTG BG ZEDTG JTENAZWG AP TGYIPDMAD \nBG WGDDG JEYADAEZ OI APY ZG JEINMAGZD ZA Y GDGZBTG MI PEAZ ZA JETDGT LMWAPGUGZD \nPM QIGTTG WVGH PGITY NEAYAZY GD W GDMAD IZG WMIYG BG NANG MLLPAWDAEZ JEIT BGY \nVEUUGY RGPPAOIGIX PGIT JEJIPMDAEZ ZEURTGIYG GD PM QPEATG OI APY MWOIGTMAGZD BMZY \nPM QIGTTG JMT PGIT WEITMQG PGIT LMAYMAGZD TGQMTBGT WEUUG GDTEADGY BGY PAUADGY \nOIA MNMAGZD BGIX WGZD OIMTMZDG UAPPGY BG PEZQ YIT WGZD OIMDTG NAZQDY UAPPGY BG PMTQG\n```\n\nReprenez le programme précédent et adaptez-le pour compter les occurrences de chaque lettre de ce message."
+   "source": [
+    "Vous avez maintenant intercepté le message suivant dont vous ne connaissez pas la clé : \n",
+    "```\n",
+    "PGY VGPNGDGY YITJMYYGZD MIYYA GZ NMPGIT PGY MIDTGY QMIPEAY WMT APY GZQMQGZD \n",
+    "WEZDTG PGY QGTUMAZY BGY PIDDGY JTGYOIG FEITZMPAGTGY YEAD OI APY PGY TGJEIYYGZD \n",
+    "BG PGIT JTEJTG DGTTADEATG YEAD OI APY GZNMVAYYGZD WGPIA BG PGITY GZZGUAY ETQGDETAX \n",
+    "GDMAD WVGH PGY VGPNGDGY PG JTGUAGT JMT YM ZMAYYMZWG GD JMT YGY TAWVGYYGY YEIY PG \n",
+    "WEZYIPMD BG U UGYYMPM GD BG U JAYEZ WGD VEUUG JEIYYG JMT P MURADAEZ WEZFITM MNGW \n",
+    "PM ZERPGYYG GD GZQMQGM PGY VMRADMZDY M YETDAT BI JMCY MNGW DEIDGY PGITY LETWGY \n",
+    "AP PGIT BAD OIG P GUJETDMZD JMT PG WEITMQG YIT DEIY PGY JGIJPGY BG PM QMIPG APY \n",
+    "PM YEIUGDDTMAGZD MAYGUGZD DEID GZDAGTG M PGIT GUJATG AP GID B MIDMZD UEAZY BG \n",
+    "JGAZG M PGY JGTYIMBGT OIG PGY VGPNGDGY YEZD BG DEIDGY JMTDY TGYYGTTGY JMT PM \n",
+    "ZMDITG BGY PAGIX B IZ WEDG JMT PG TVAZ LPGING DTGY PMTQG GD DTGY JTELEZB OIA \n",
+    "YGJMTG PGIT DGTTADEATG BG PM QGTUMZAG B IZ MIDTG JMT PG FITM VMIDG UEZDMQZG \n",
+    "OIA Y GPGNG GZDTG PM YGOIMZAG GD P VGPNGDAG B IZ DTEAYAGUG WEDG JMT PG PMW \n",
+    "PGUMZ GD PG TVEZG OIA YGJMTG WGDDG BGTZAGTG BG ZEDTG JTENAZWG AP TGYIPDMAD \n",
+    "BG WGDDG JEYADAEZ OI APY ZG JEINMAGZD ZA Y GDGZBTG MI PEAZ ZA JETDGT LMWAPGUGZD \n",
+    "PM QIGTTG WVGH PGITY NEAYAZY GD W GDMAD IZG WMIYG BG NANG MLLPAWDAEZ JEIT BGY \n",
+    "VEUUGY RGPPAOIGIX PGIT JEJIPMDAEZ ZEURTGIYG GD PM QPEATG OI APY MWOIGTMAGZD BMZY \n",
+    "PM QIGTTG JMT PGIT WEITMQG PGIT LMAYMAGZD TGQMTBGT WEUUG GDTEADGY BGY PAUADGY \n",
+    "OIA MNMAGZD BGIX WGZD OIMTMZDG UAPPGY BG PEZQ YIT WGZD OIMDTG NAZQDY UAPPGY BG PMTQG\n",
+    "```\n",
+    "\n",
+    "Reprenez le programme précédent et adaptez-le pour compter les occurrences de chaque lettre de ce message."
+   ]
   },
   {
    "cell_type": "code",
@@ -73,7 +191,7 @@
     "trusted": false
    },
    "outputs": [],
-   "source": ""
+   "source": []
   },
   {
    "cell_type": "markdown",
@@ -82,12 +200,60 @@
      "breakpoint"
     ]
    },
-   "source": "#### Ctrl+enter pour continuer ..........."
+   "source": [
+    "#### Ctrl+enter pour continuer ..........."
+   ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 3</h3> \n\nOn peut maintenant comparer ces occurrences avec celles de la langue française, fournies ici dans l’histogramme et le tableau suivants :\n\n\n![](https://gitedu.hesge.ch/info_sismondi/activites-2in-do/-/raw/main/Cryptographie/images/histo_fr.png?inline=false)\n\n| Rang | Caractère | Pourcentage | \n| :--------------- |:---------------:| -----:| \n| 1 | E | 12.10% |\n| 2 | S | 7.11% |\n| 3 | R | 6.59% |\n| 4 | T | 6.51% |\n| 5 | A | 6.39% |\n| 6 | L | 6.07% |\n| 7 | I | 5.92% |\n| 8 | U | 5.02% |\n| 9 | O | 4.96% |\n| 10 | N | 4.49% |\n| 11 | D | 3.67% |\n| 12 | C | 3.18% |\n| 13 | M | 2.62% |\n| 14 | P | 2.49% |\n| 15 | G | 1.23% |\n| 16 | B | 1.14% |\n| 17 | V | 1.11% |\n| 18 | H | 1.11% |\n| 19 | F | 1.11% |\n| 20 | Q | 0.65% |\n| 21 | Y | 0.46% |\n| 22 | X | 0.38% |\n| 23 | J | 0.34% |\n| 24 | K | 0.29% |\n| 25 | W | 0.17% |\n| 26 | Z | 0.15% |\n\n\nOn constate que la lettre la plus utilisée est le E, ensuite S, ensuite R, etc…\n\nEn se basant sur cette liste vous pouvez trouver la clé de chiffrage : \n1. Sur une feuille de papier, en partant du résultat de l'exercice 2, associez la lettre la plus utilisée de l'alphabet à celle la plus utilisée dans le texte, puis la 2ème plus utilisée, et ainsi de suite jusqu'à la moins utilisée. Cela vous donne une première correspondance.\n2. Copiez le programme de l'exercice 1.\n3. Utilisez comme clef de base l'alphabet non modifié `\"ABCDE...\"` car pour l’instant vous ne connaissez pas la clé.\n4. Remplacez chaque lettre dans la clef par son équivalent chiffré.\n\n"
+   "source": [
+    "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 3</h3> \n",
+    "\n",
+    "On peut maintenant comparer ces occurrences avec celles de la langue française, fournies ici dans l’histogramme et le tableau suivants :\n",
+    "\n",
+    "\n",
+    "![](https://gitedu.hesge.ch/info_sismondi/activites-2in-do/-/raw/main/Cryptographie/images/histo_fr.png?inline=false)\n",
+    "\n",
+    "| Rang | Caractère | Pourcentage | \n",
+    "| :--------------- |:---------------:| -----:| \n",
+    "| 1 | E | 12.10% |\n",
+    "| 2 | S | 7.11% |\n",
+    "| 3 | R | 6.59% |\n",
+    "| 4 | T | 6.51% |\n",
+    "| 5 | A | 6.39% |\n",
+    "| 6 | L | 6.07% |\n",
+    "| 7 | I | 5.92% |\n",
+    "| 8 | U | 5.02% |\n",
+    "| 9 | O | 4.96% |\n",
+    "| 10 | N | 4.49% |\n",
+    "| 11 | D | 3.67% |\n",
+    "| 12 | C | 3.18% |\n",
+    "| 13 | M | 2.62% |\n",
+    "| 14 | P | 2.49% |\n",
+    "| 15 | G | 1.23% |\n",
+    "| 16 | B | 1.14% |\n",
+    "| 17 | V | 1.11% |\n",
+    "| 18 | H | 1.11% |\n",
+    "| 19 | F | 1.11% |\n",
+    "| 20 | Q | 0.65% |\n",
+    "| 21 | Y | 0.46% |\n",
+    "| 22 | X | 0.38% |\n",
+    "| 23 | J | 0.34% |\n",
+    "| 24 | K | 0.29% |\n",
+    "| 25 | W | 0.17% |\n",
+    "| 26 | Z | 0.15% |\n",
+    "\n",
+    "\n",
+    "On constate que la lettre la plus utilisée est le E, ensuite S, ensuite R, etc…\n",
+    "\n",
+    "En se basant sur cette liste vous pouvez trouver la clé de chiffrage : \n",
+    "1. Sur une feuille de papier, en partant du résultat de l'exercice 2, associez la lettre la plus utilisée de l'alphabet à celle la plus utilisée dans le texte, puis la 2ème plus utilisée, et ainsi de suite jusqu'à la moins utilisée. Cela vous donne une première correspondance.\n",
+    "2. Copiez le programme de l'exercice 1.\n",
+    "3. Utilisez comme clef de base l'alphabet non modifié `\"ABCDE...\"` car pour l’instant vous ne connaissez pas la clé.\n",
+    "4. Remplacez chaque lettre dans la clef par son équivalent chiffré.\n",
+    "\n"
+   ]
   },
   {
    "cell_type": "code",
@@ -96,12 +262,18 @@
     "trusted": false
    },
    "outputs": [],
-   "source": ""
+   "source": []
   },
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": "Cela vous donne déjà une première clef approximative. À partir de là, par tentatives successives : \n\n1. Exécutez le programme, puis\n2. modifiez votre clef en inversant la position des lettres. Attention de toujours garder 26 lettres différentes.\n3. Continuez à tâtons avec les mots que vous reconnaissez, par exemple s'il vous semble reconnaitre un déterminant ou une double lettre, vous pouvez adapter votre clé pour que faire coincider le message déchiffré."
+   "source": [
+    "Cela vous donne déjà une première clef approximative. À partir de là, par tentatives successives : \n",
+    "\n",
+    "1. Exécutez le programme, puis\n",
+    "2. modifiez votre clef en inversant la position des lettres. Attention de toujours garder 26 lettres différentes.\n",
+    "3. Continuez à tâtons avec les mots que vous reconnaissez, par exemple s'il vous semble reconnaitre un déterminant ou une double lettre, vous pouvez adapter votre clé pour que faire coincider le message déchiffré."
+   ]
   },
   {
    "cell_type": "code",
@@ -111,7 +283,7 @@
     "trusted": false
    },
    "outputs": [],
-   "source": ""
+   "source": []
   }
  ],
  "metadata": {
diff --git a/Cryptographie/1_monoalphabetique_correction.ipynb b/Cryptographie/1_monoalphabetique_correction.ipynb
index fa81c60116a15a2c2cbe6226974ff2c097ccbb8f..46450a81b7f2338eea67e3b6cf48bc865829b561 100644
--- a/Cryptographie/1_monoalphabetique_correction.ipynb
+++ b/Cryptographie/1_monoalphabetique_correction.ipynb
@@ -3,17 +3,35 @@
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": "<div style=\"padding:20px;background-color:papayawhip;\" > \n<h3 style=\"color:chocolate\"> <i class=\"fa fa-info\" aria-hidden=\"true\"> </i> &nbsp; Remarque introductive &nbsp;  <i class=\"fa fa-info\" aria-hidden=\"true\"></h3> \n<p> Ce fichier est fait pour être lu sur le site <a href=\"https://notebook.basthon.fr/\"><img src='https://notebook.basthon.fr/assets/efede5218c9087496f16.png' style=\"border: 0; display:inline; margin: 0 5px; height:30px\" alt=\"Basthon\"/></a>. <br>\n    \nSi vous l'avez ouvert avec un autre programme, comme Jupyter notebook, vous riquez de rencontrer quelques bugs. <br>\nVeuillez cliquez sur <a href=\"https://notebook.basthon.fr/\">ce lien</a> et y charger ce fichier à l'aide du bouton \"Ouvrir\"  &nbsp; <i class=\"fa fa-folder\" aria-hidden=\"true\"> </i>\n</p> </div>    "
+   "source": [
+    "<div style=\"padding:20px;background-color:papayawhip;\" > \n",
+    "<h3 style=\"color:chocolate\"> <i class=\"fa fa-info\" aria-hidden=\"true\"> </i> &nbsp; Remarque introductive &nbsp;  <i class=\"fa fa-info\" aria-hidden=\"true\"></h3> \n",
+    "<p> Ce fichier est fait pour être lu sur le site <a href=\"https://notebook.basthon.fr/\"><img src='https://notebook.basthon.fr/assets/efede5218c9087496f16.png' style=\"border: 0; display:inline; margin: 0 5px; height:30px\" alt=\"Basthon\"/></a>. <br>\n",
+    "    \n",
+    "Si vous l'avez ouvert avec un autre programme, comme Jupyter notebook, vous riquez de rencontrer quelques bugs. <br>\n",
+    "Veuillez cliquez sur <a href=\"https://notebook.basthon.fr/\">ce lien</a> et y charger ce fichier à l'aide du bouton \"Ouvrir\"  &nbsp; <i class=\"fa fa-folder\" aria-hidden=\"true\"> </i>\n",
+    "</p> </div>    "
+   ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": "# Chiffrement symétrique - Le chiffrement monoalphabétique - Correction\n\nLe but de ce travail pratique est de déchiffrer un message qui a été chiffré avec un chiffrement monoalphabétique en adaptant un programme déjà créé.\n"
+   "source": [
+    "# Chiffrement symétrique - Le chiffrement monoalphabétique - Correction\n",
+    "\n",
+    "Le but de ce travail pratique est de déchiffrer un message qui a été chiffré avec un chiffrement monoalphabétique en adaptant un programme déjà créé.\n"
+   ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 1 </h3> \n\nLe programme suivant permet de déchiffrer un message codé selon le principe monoalphabétique, en connaissant la clé de chiffrement. \n\nLisez-le en essayant de le comprendre, puis testez-le."
+   "source": [
+    "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 1 </h3> \n",
+    "\n",
+    "Le programme suivant permet de déchiffrer un message codé selon le principe monoalphabétique, en connaissant la clé de chiffrement. \n",
+    "\n",
+    "Lisez-le en essayant de le comprendre, puis testez-le."
+   ]
   },
   {
    "cell_type": "code",
@@ -25,15 +43,57 @@
     {
      "name": "stdout",
      "output_type": "stream",
-     "text": "WI RUWWIAI VXVBUPFX TUOV VUOQSXMI OPI NUPPI SPPII\nLE COLLEGE SISMONDI VOUS SOUHAITE UNE BONNE ANNEE\n"
+     "text": [
+      "WI RUWWIAI VXVBUPFX TUOV VUOQSXMI OPI NUPPI SPPII\n",
+      "LE COLLEGE SISMONDI VOUS SOUHAITE UNE BONNE ANNEE\n"
+     ]
     }
    ],
-   "source": "# Texte à déchiffrer\ntexte_chiffre = \"\"\"WI RUWWIAI VXVBUPFX TUOV VUOQSXMI OPI NUPPI SPPII\"\"\"\n\n# Alphabet MAJUSCULE uniquement pour simplifier\nliste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n# Pour chaque lettre, correspond une lettre dans liste_alphabet\nliste_chiffree = \"SNRFIYAQXLKWBPUZCHVMOTGJDE\"\n\n# texte_dechiffree contiendra la chaine de caractère donc le texte déchiffré\ntexte_dechiffre = \"\"\n\n\n# Parcours caractère par caractère le fichier ouvert.\nfor lettre in texte_chiffre:\n\n    # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n    if lettre.isalpha():           \n        # Recherche la position (index) de la lettre à décoder dans la liste_chiffree.\n        index = liste_chiffree.index(lettre)\n        \n        # On utilise cet index pour trouver la lettre dans liste_alphabet.\n        lettre_decodee = liste_alphabet[index]\n                \n        # On ajoute le caractère déchiffré à la suite du texte déjà déchiffré.\n        texte_dechiffre = texte_dechiffre + lettre_decodee\n    else:\n        # la lettre n'est pas un caractère alphabétique mais peut-être une ponctuation\n        texte_dechiffre = texte_dechiffre + lettre\n\n# On affiche le texte decodé\nprint(texte_chiffre)\nprint(texte_dechiffre)\n\n"
+   "source": [
+    "# Texte à déchiffrer\n",
+    "texte_chiffre = \"\"\"WI RUWWIAI VXVBUPFX TUOV VUOQSXMI OPI NUPPI SPPII\"\"\"\n",
+    "\n",
+    "# Alphabet MAJUSCULE uniquement pour simplifier\n",
+    "liste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n",
+    "\n",
+    "# Pour chaque lettre, correspond une lettre dans liste_alphabet\n",
+    "liste_chiffree = \"SNRFIYAQXLKWBPUZCHVMOTGJDE\"\n",
+    "\n",
+    "# texte_dechiffree contiendra la chaine de caractère donc le texte déchiffré\n",
+    "texte_dechiffre = \"\"\n",
+    "\n",
+    "\n",
+    "# Parcours caractère par caractère le fichier ouvert.\n",
+    "for lettre in texte_chiffre:\n",
+    "\n",
+    "    # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n",
+    "    if lettre.isalpha():           \n",
+    "        # Recherche la position (index) de la lettre à décoder dans la liste_chiffree.\n",
+    "        index = liste_chiffree.index(lettre)\n",
+    "        \n",
+    "        # On utilise cet index pour trouver la lettre dans liste_alphabet.\n",
+    "        lettre_decodee = liste_alphabet[index]\n",
+    "                \n",
+    "        # On ajoute le caractère déchiffré à la suite du texte déjà déchiffré.\n",
+    "        texte_dechiffre = texte_dechiffre + lettre_decodee\n",
+    "    else:\n",
+    "        # la lettre n'est pas un caractère alphabétique mais peut-être une ponctuation\n",
+    "        texte_dechiffre = texte_dechiffre + lettre\n",
+    "\n",
+    "# On affiche le texte decodé\n",
+    "print(texte_chiffre)\n",
+    "print(texte_dechiffre)\n",
+    "\n"
+   ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": "On veut maintenant déchiffrer le message suivant `JI KXJIEOI IWIFEIJ TI OIK IKNVOIK XEYXEXK D'IYYFVXI` qui a été codé avec la clé `VMOTIYAQXLGJDESNRFKWBPUZCH`.\n\nReprenez le code précédent et adaptez-le pour décoder ce message."
+   "source": [
+    "On veut maintenant déchiffrer le message suivant `JI KXJIEOI IWIFEIJ TI OIK IKNVOIK XEYXEXK D'IYYFVXI` qui a été codé avec la clé `VMOTIYAQXLGJDESNRFKWBPUZCH`.\n",
+    "\n",
+    "Reprenez le code précédent et adaptez-le pour décoder ce message."
+   ]
   },
   {
    "cell_type": "code",
@@ -45,10 +105,48 @@
     {
      "name": "stdout",
      "output_type": "stream",
-     "text": "JI KXJIEOI IWIFEIJ TI OIK IKNVOIK XEYXEXK D'IYYFVXI\nLE SILENCE ETERNEL DE CES ESPACES INFINIS M'EFFRAIE\n"
+     "text": [
+      "JI KXJIEOI IWIFEIJ TI OIK IKNVOIK XEYXEXK D'IYYFVXI\n",
+      "LE SILENCE ETERNEL DE CES ESPACES INFINIS M'EFFRAIE\n"
+     ]
     }
    ],
-   "source": "############ Correction ################\n# Texte à déchiffrer\ntexte_chiffre = \"\"\"JI KXJIEOI IWIFEIJ TI OIK IKNVOIK XEYXEXK D'IYYFVXI\"\"\"\n\n# Alphabet MAJUSCULE uniquement pour simplifier\nliste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n# Pour chaque lettre, correspond une lettre dans liste_alphabet\nliste_chiffree = \"SNRFIYAQXLKWBPUZCHVMOTGJDE\"\n\n# texte_dechiffree contiendra la chaine de caractère donc le texte déchiffré\ntexte_dechiffre = \"\"\n\n\n# Parcours caractère par caractère le fichier ouvert.\nfor lettre in texte_chiffre:\n\n    # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n    if lettre.isalpha():           \n        # Recherche la position (index) de la lettre à décoder dans la liste_chiffree.\n        index = liste_chiffree.index(lettre)\n        \n        # On utilise cet index pour trouver la lettre dans liste_alphabet.\n        lettre_decodee = liste_alphabet[index]\n                \n        # On ajoute le caractère déchiffré à la suite du texte déjà déchiffré.\n        texte_dechiffre = texte_dechiffre + lettre_decodee\n    else:\n        # la lettre n'est pas un caractère alphabétique mais peut-être une ponctuation\n        texte_dechiffre = texte_dechiffre + lettre\n\n# On affiche le texte decodé\nprint(texte_chiffre)\nprint(texte_dechiffre)\n"
+   "source": [
+    "############ Correction ################\n",
+    "# Texte à déchiffrer\n",
+    "texte_chiffre = \"\"\"JI KXJIEOI IWIFEIJ TI OIK IKNVOIK XEYXEXK D'IYYFVXI\"\"\"\n",
+    "\n",
+    "# Alphabet MAJUSCULE uniquement pour simplifier\n",
+    "liste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n",
+    "\n",
+    "# Pour chaque lettre, correspond une lettre dans liste_alphabet\n",
+    "liste_chiffree = \"SNRFIYAQXLKWBPUZCHVMOTGJDE\"\n",
+    "\n",
+    "# texte_dechiffree contiendra la chaine de caractère donc le texte déchiffré\n",
+    "texte_dechiffre = \"\"\n",
+    "\n",
+    "\n",
+    "# Parcours caractère par caractère le fichier ouvert.\n",
+    "for lettre in texte_chiffre:\n",
+    "\n",
+    "    # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n",
+    "    if lettre.isalpha():           \n",
+    "        # Recherche la position (index) de la lettre à décoder dans la liste_chiffree.\n",
+    "        index = liste_chiffree.index(lettre)\n",
+    "        \n",
+    "        # On utilise cet index pour trouver la lettre dans liste_alphabet.\n",
+    "        lettre_decodee = liste_alphabet[index]\n",
+    "                \n",
+    "        # On ajoute le caractère déchiffré à la suite du texte déjà déchiffré.\n",
+    "        texte_dechiffre = texte_dechiffre + lettre_decodee\n",
+    "    else:\n",
+    "        # la lettre n'est pas un caractère alphabétique mais peut-être une ponctuation\n",
+    "        texte_dechiffre = texte_dechiffre + lettre\n",
+    "\n",
+    "# On affiche le texte decodé\n",
+    "print(texte_chiffre)\n",
+    "print(texte_dechiffre)\n"
+   ]
   },
   {
    "cell_type": "markdown",
@@ -57,12 +155,23 @@
      "breakpoint"
     ]
    },
-   "source": "#### Ctrl+enter pour continuer ..........."
+   "source": [
+    "#### Ctrl+enter pour continuer ..........."
+   ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 2</h3> \n\nOn aimerait maintenant déchiffrer un message chiffré avec le chiffrement monoalhabétique, mais dont on ne connaît pas la clef.\n\n**Comment procéder pour trouver la clé ?**\nOn peut compter les occurrences (répétition) de chaque lettre dans le message chiffré et les comparer à celles de la langue française pour essayer de retrouver la correspondance.\n\nC'est ce que fait le code suivant. Lisez-le en essayant de le comprendre, puis testez-le.\n"
+   "source": [
+    "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 2</h3> \n",
+    "\n",
+    "On aimerait maintenant déchiffrer un message chiffré avec le chiffrement monoalhabétique, mais dont on ne connaît pas la clef.\n",
+    "\n",
+    "**Comment procéder pour trouver la clé ?**\n",
+    "On peut compter les occurrences (répétition) de chaque lettre dans le message chiffré et les comparer à celles de la langue française pour essayer de retrouver la correspondance.\n",
+    "\n",
+    "C'est ce que fait le code suivant. Lisez-le en essayant de le comprendre, puis testez-le.\n"
+   ]
   },
   {
    "cell_type": "code",
@@ -74,15 +183,92 @@
     {
      "name": "stdout",
      "output_type": "stream",
-     "text": "A : 1\nB : 1\nC : 0\nD : 0\nE : 0\nF : 1\nG : 0\nH : 0\nI : 8\nJ : 0\nK : 0\nL : 0\nM : 1\nN : 1\nO : 3\nP : 6\nQ : 1\nR : 1\nS : 2\nT : 1\nU : 5\nV : 4\nW : 3\nX : 3\nY : 0\nZ : 0\n"
+     "text": [
+      "A : 1\n",
+      "B : 1\n",
+      "C : 0\n",
+      "D : 0\n",
+      "E : 0\n",
+      "F : 1\n",
+      "G : 0\n",
+      "H : 0\n",
+      "I : 8\n",
+      "J : 0\n",
+      "K : 0\n",
+      "L : 0\n",
+      "M : 1\n",
+      "N : 1\n",
+      "O : 3\n",
+      "P : 6\n",
+      "Q : 1\n",
+      "R : 1\n",
+      "S : 2\n",
+      "T : 1\n",
+      "U : 5\n",
+      "V : 4\n",
+      "W : 3\n",
+      "X : 3\n",
+      "Y : 0\n",
+      "Z : 0\n"
+     ]
     }
    ],
-   "source": "# Texte à déchiffrer\ntexte_chiffre = \"\"\"WI RUWWIAI VXVBUPFX TUOV VUOQSXMI OPI NUPPI SPPII\"\"\"\n\n# Alphabet\nliste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n# Liste des occurrences\nliste_occurrence = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n\n# Contiendra le texte déchifré\ntexte_dechiffre = \"\"\n\n# Parcours caractère par caractère le fichier\nfor lettre in texte_chiffre:\n    \n    # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n    if lettre.isalpha():\n        \n        # Recherche la position (index) de la lettre (conversion en minuscule)\n        # à décoder dans la liste_alphabet.\n        index = liste_alphabet.index(lettre)\n        \n        # Incrémenter l'occurence de la lettre correspondante\n        liste_occurrence[index] = liste_occurrence[index] + 1\n\n# Afficher les occurrences de chaque lettres\nfor i in range(26):\n    print(liste_alphabet[i], \":\",liste_occurrence[i])"
+   "source": [
+    "# Texte à déchiffrer\n",
+    "texte_chiffre = \"\"\"WI RUWWIAI VXVBUPFX TUOV VUOQSXMI OPI NUPPI SPPII\"\"\"\n",
+    "\n",
+    "# Alphabet\n",
+    "liste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n",
+    "\n",
+    "# Liste des occurrences\n",
+    "liste_occurrence = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
+    "\n",
+    "# Parcours caractère par caractère le fichier\n",
+    "for lettre in texte_chiffre:\n",
+    "    \n",
+    "    # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n",
+    "    if lettre.isalpha():\n",
+    "        \n",
+    "        # Recherche la position (index) de la lettre (conversion en minuscule)\n",
+    "        # à décoder dans la liste_alphabet.\n",
+    "        index = liste_alphabet.index(lettre)\n",
+    "        \n",
+    "        # Incrémenter l'occurence de la lettre correspondante\n",
+    "        liste_occurrence[index] = liste_occurrence[index] + 1\n",
+    "\n",
+    "# Afficher les occurrences de chaque lettres\n",
+    "for i in range(26):\n",
+    "    print(liste_alphabet[i], \":\",liste_occurrence[i])"
+   ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": "Vous avez maintenant intercepté le message suivant dont vous ne connaissez pas la clé : \n```\nPGY VGPNGDGY YITJMYYGZD MIYYA GZ NMPGIT PGY MIDTGY QMIPEAY WMT APY GZQMQGZD \nWEZDTG PGY QGTUMAZY BGY PIDDGY JTGYOIG FEITZMPAGTGY YEAD OI APY PGY TGJEIYYGZD \nBG PGIT JTEJTG DGTTADEATG YEAD OI APY GZNMVAYYGZD WGPIA BG PGITY GZZGUAY ETQGDETAX \nGDMAD WVGH PGY VGPNGDGY PG JTGUAGT JMT YM ZMAYYMZWG GD JMT YGY TAWVGYYGY YEIY PG \nWEZYIPMD BG U UGYYMPM GD BG U JAYEZ WGD VEUUG JEIYYG JMT P MURADAEZ WEZFITM MNGW \nPM ZERPGYYG GD GZQMQGM PGY VMRADMZDY M YETDAT BI JMCY MNGW DEIDGY PGITY LETWGY \nAP PGIT BAD OIG P GUJETDMZD JMT PG WEITMQG YIT DEIY PGY JGIJPGY BG PM QMIPG APY \nPM YEIUGDDTMAGZD MAYGUGZD DEID GZDAGTG M PGIT GUJATG AP GID B MIDMZD UEAZY BG \nJGAZG M PGY JGTYIMBGT OIG PGY VGPNGDGY YEZD BG DEIDGY JMTDY TGYYGTTGY JMT PM \nZMDITG BGY PAGIX B IZ WEDG JMT PG TVAZ LPGING DTGY PMTQG GD DTGY JTELEZB OIA \nYGJMTG PGIT DGTTADEATG BG PM QGTUMZAG B IZ MIDTG JMT PG FITM VMIDG UEZDMQZG \nOIA Y GPGNG GZDTG PM YGOIMZAG GD P VGPNGDAG B IZ DTEAYAGUG WEDG JMT PG PMW \nPGUMZ GD PG TVEZG OIA YGJMTG WGDDG BGTZAGTG BG ZEDTG JTENAZWG AP TGYIPDMAD \nBG WGDDG JEYADAEZ OI APY ZG JEINMAGZD ZA Y GDGZBTG MI PEAZ ZA JETDGT LMWAPGUGZD \nPM QIGTTG WVGH PGITY NEAYAZY GD W GDMAD IZG WMIYG BG NANG MLLPAWDAEZ JEIT BGY \nVEUUGY RGPPAOIGIX PGIT JEJIPMDAEZ ZEURTGIYG GD PM QPEATG OI APY MWOIGTMAGZD BMZY \nPM QIGTTG JMT PGIT WEITMQG PGIT LMAYMAGZD TGQMTBGT WEUUG GDTEADGY BGY PAUADGY \nOIA MNMAGZD BGIX WGZD OIMTMZDG UAPPGY BG PEZQ YIT WGZD OIMDTG NAZQDY UAPPGY BG PMTQG\n```\n\nReprenez le code précédent et adaptez-le pour compter les occurrences de chaque lettre de ce message."
+   "source": [
+    "Vous avez maintenant intercepté le message suivant dont vous ne connaissez pas la clé : \n",
+    "```\n",
+    "PGY VGPNGDGY YITJMYYGZD MIYYA GZ NMPGIT PGY MIDTGY QMIPEAY WMT APY GZQMQGZD \n",
+    "WEZDTG PGY QGTUMAZY BGY PIDDGY JTGYOIG FEITZMPAGTGY YEAD OI APY PGY TGJEIYYGZD \n",
+    "BG PGIT JTEJTG DGTTADEATG YEAD OI APY GZNMVAYYGZD WGPIA BG PGITY GZZGUAY ETQGDETAX \n",
+    "GDMAD WVGH PGY VGPNGDGY PG JTGUAGT JMT YM ZMAYYMZWG GD JMT YGY TAWVGYYGY YEIY PG \n",
+    "WEZYIPMD BG U UGYYMPM GD BG U JAYEZ WGD VEUUG JEIYYG JMT P MURADAEZ WEZFITM MNGW \n",
+    "PM ZERPGYYG GD GZQMQGM PGY VMRADMZDY M YETDAT BI JMCY MNGW DEIDGY PGITY LETWGY \n",
+    "AP PGIT BAD OIG P GUJETDMZD JMT PG WEITMQG YIT DEIY PGY JGIJPGY BG PM QMIPG APY \n",
+    "PM YEIUGDDTMAGZD MAYGUGZD DEID GZDAGTG M PGIT GUJATG AP GID B MIDMZD UEAZY BG \n",
+    "JGAZG M PGY JGTYIMBGT OIG PGY VGPNGDGY YEZD BG DEIDGY JMTDY TGYYGTTGY JMT PM \n",
+    "ZMDITG BGY PAGIX B IZ WEDG JMT PG TVAZ LPGING DTGY PMTQG GD DTGY JTELEZB OIA \n",
+    "YGJMTG PGIT DGTTADEATG BG PM QGTUMZAG B IZ MIDTG JMT PG FITM VMIDG UEZDMQZG \n",
+    "OIA Y GPGNG GZDTG PM YGOIMZAG GD P VGPNGDAG B IZ DTEAYAGUG WEDG JMT PG PMW \n",
+    "PGUMZ GD PG TVEZG OIA YGJMTG WGDDG BGTZAGTG BG ZEDTG JTENAZWG AP TGYIPDMAD \n",
+    "BG WGDDG JEYADAEZ OI APY ZG JEINMAGZD ZA Y GDGZBTG MI PEAZ ZA JETDGT LMWAPGUGZD \n",
+    "PM QIGTTG WVGH PGITY NEAYAZY GD W GDMAD IZG WMIYG BG NANG MLLPAWDAEZ JEIT BGY \n",
+    "VEUUGY RGPPAOIGIX PGIT JEJIPMDAEZ ZEURTGIYG GD PM QPEATG OI APY MWOIGTMAGZD BMZY \n",
+    "PM QIGTTG JMT PGIT WEITMQG PGIT LMAYMAGZD TGQMTBGT WEUUG GDTEADGY BGY PAUADGY \n",
+    "OIA MNMAGZD BGIX WGZD OIMTMZDG UAPPGY BG PEZQ YIT WGZD OIMDTG NAZQDY UAPPGY BG PMTQG\n",
+    "```\n",
+    "\n",
+    "Reprenez le code précédent et adaptez-le pour compter les occurrences de chaque lettre de ce message."
+   ]
   },
   {
    "cell_type": "code",
@@ -94,10 +280,81 @@
     {
      "name": "stdout",
      "output_type": "stream",
-     "text": "A : 79\nB : 30\nC : 1\nD : 92\nE : 56\nF : 3\nG : 215\nH : 2\nI : 75\nJ : 35\nK : 0\nL : 7\nM : 89\nN : 17\nO : 16\nP : 82\nQ : 20\nR : 5\nS : 0\nT : 97\nU : 27\nV : 14\nW : 29\nX : 4\nY : 102\nZ : 67\n"
+     "text": [
+      "A : 79\n",
+      "B : 30\n",
+      "C : 1\n",
+      "D : 92\n",
+      "E : 56\n",
+      "F : 3\n",
+      "G : 215\n",
+      "H : 2\n",
+      "I : 75\n",
+      "J : 35\n",
+      "K : 0\n",
+      "L : 7\n",
+      "M : 89\n",
+      "N : 17\n",
+      "O : 16\n",
+      "P : 82\n",
+      "Q : 20\n",
+      "R : 5\n",
+      "S : 0\n",
+      "T : 97\n",
+      "U : 27\n",
+      "V : 14\n",
+      "W : 29\n",
+      "X : 4\n",
+      "Y : 102\n",
+      "Z : 67\n"
+     ]
     }
    ],
-   "source": "############ Correction ################\n# Texte à déchiffrer\ntexte_chiffre = \"\"\"PGY VGPNGDGY YITJMYYGZD MIYYA GZ NMPGIT PGY MIDTGY QMIPEAY WMT APY GZQMQGZD \nWEZDTG PGY QGTUMAZY BGY PIDDGY JTGYOIG FEITZMPAGTGY YEAD OI APY PGY TGJEIYYGZD \nBG PGIT JTEJTG DGTTADEATG YEAD OI APY GZNMVAYYGZD WGPIA BG PGITY GZZGUAY ETQGDETAX \nGDMAD WVGH PGY VGPNGDGY PG JTGUAGT JMT YM ZMAYYMZWG GD JMT YGY TAWVGYYGY YEIY PG \nWEZYIPMD BG U UGYYMPM GD BG U JAYEZ WGD VEUUG JEIYYG JMT P MURADAEZ WEZFITM MNGW \nPM ZERPGYYG GD GZQMQGM PGY VMRADMZDY M YETDAT BI JMCY MNGW DEIDGY PGITY LETWGY \nAP PGIT BAD OIG P GUJETDMZD JMT PG WEITMQG YIT DEIY PGY JGIJPGY BG PM QMIPG APY \nPM YEIUGDDTMAGZD MAYGUGZD DEID GZDAGTG M PGIT GUJATG AP GID B MIDMZD UEAZY BG \nJGAZG M PGY JGTYIMBGT OIG PGY VGPNGDGY YEZD BG DEIDGY JMTDY TGYYGTTGY JMT PM \nZMDITG BGY PAGIX B IZ WEDG JMT PG TVAZ LPGING DTGY PMTQG GD DTGY JTELEZB OIA \nYGJMTG PGIT DGTTADEATG BG PM QGTUMZAG B IZ MIDTG JMT PG FITM VMIDG UEZDMQZG \nOIA Y GPGNG GZDTG PM YGOIMZAG GD P VGPNGDAG B IZ DTEAYAGUG WEDG JMT PG PMW \nPGUMZ GD PG TVEZG OIA YGJMTG WGDDG BGTZAGTG BG ZEDTG JTENAZWG AP TGYIPDMAD \nBG WGDDG JEYADAEZ OI APY ZG JEINMAGZD ZA Y GDGZBTG MI PEAZ ZA JETDGT LMWAPGUGZD \nPM QIGTTG WVGH PGITY NEAYAZY GD W GDMAD IZG WMIYG BG NANG MLLPAWDAEZ JEIT BGY \nVEUUGY RGPPAOIGIX PGIT JEJIPMDAEZ ZEURTGIYG GD PM QPEATG OI APY MWOIGTMAGZD BMZY \nPM QIGTTG JMT PGIT WEITMQG PGIT LMAYMAGZD TGQMTBGT WEUUG GDTEADGY BGY PAUADGY \nOIA MNMAGZD BGIX WGZD OIMTMZDG UAPPGY BG PEZQ YIT WGZD OIMDTG NAZQDY UAPPGY BG PMTQG\"\"\"\n\n# Alphabet\nliste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n# Liste des occurrences\nliste_occurrence = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n\n# Contiendra le texte déchifré\ntexte_dechiffre = \"\"\n\n# Parcours caractère par caractère le fichier\nfor lettre in texte_chiffre:\n    \n    # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n    if lettre.isalpha():\n        \n        # Recherche la position (index) de la lettre (conversion en minuscule)\n        # à décoder dans la liste_alphabet.\n        index = liste_alphabet.index(lettre)\n        \n        # Incrémenter l'occurence de la lettre correspondante\n        liste_occurrence[index] = liste_occurrence[index] + 1\n\n# Afficher les occurrences de chaque lettres\nfor i in range(26):\n    print(liste_alphabet[i], \":\",liste_occurrence[i])"
+   "source": [
+    "############ Correction ################\n",
+    "# Texte à déchiffrer\n",
+    "texte_chiffre = \"\"\"PGY VGPNGDGY YITJMYYGZD MIYYA GZ NMPGIT PGY MIDTGY QMIPEAY WMT APY GZQMQGZD \n",
+    "WEZDTG PGY QGTUMAZY BGY PIDDGY JTGYOIG FEITZMPAGTGY YEAD OI APY PGY TGJEIYYGZD \n",
+    "BG PGIT JTEJTG DGTTADEATG YEAD OI APY GZNMVAYYGZD WGPIA BG PGITY GZZGUAY ETQGDETAX \n",
+    "GDMAD WVGH PGY VGPNGDGY PG JTGUAGT JMT YM ZMAYYMZWG GD JMT YGY TAWVGYYGY YEIY PG \n",
+    "WEZYIPMD BG U UGYYMPM GD BG U JAYEZ WGD VEUUG JEIYYG JMT P MURADAEZ WEZFITM MNGW \n",
+    "PM ZERPGYYG GD GZQMQGM PGY VMRADMZDY M YETDAT BI JMCY MNGW DEIDGY PGITY LETWGY \n",
+    "AP PGIT BAD OIG P GUJETDMZD JMT PG WEITMQG YIT DEIY PGY JGIJPGY BG PM QMIPG APY \n",
+    "PM YEIUGDDTMAGZD MAYGUGZD DEID GZDAGTG M PGIT GUJATG AP GID B MIDMZD UEAZY BG \n",
+    "JGAZG M PGY JGTYIMBGT OIG PGY VGPNGDGY YEZD BG DEIDGY JMTDY TGYYGTTGY JMT PM \n",
+    "ZMDITG BGY PAGIX B IZ WEDG JMT PG TVAZ LPGING DTGY PMTQG GD DTGY JTELEZB OIA \n",
+    "YGJMTG PGIT DGTTADEATG BG PM QGTUMZAG B IZ MIDTG JMT PG FITM VMIDG UEZDMQZG \n",
+    "OIA Y GPGNG GZDTG PM YGOIMZAG GD P VGPNGDAG B IZ DTEAYAGUG WEDG JMT PG PMW \n",
+    "PGUMZ GD PG TVEZG OIA YGJMTG WGDDG BGTZAGTG BG ZEDTG JTENAZWG AP TGYIPDMAD \n",
+    "BG WGDDG JEYADAEZ OI APY ZG JEINMAGZD ZA Y GDGZBTG MI PEAZ ZA JETDGT LMWAPGUGZD \n",
+    "PM QIGTTG WVGH PGITY NEAYAZY GD W GDMAD IZG WMIYG BG NANG MLLPAWDAEZ JEIT BGY \n",
+    "VEUUGY RGPPAOIGIX PGIT JEJIPMDAEZ ZEURTGIYG GD PM QPEATG OI APY MWOIGTMAGZD BMZY \n",
+    "PM QIGTTG JMT PGIT WEITMQG PGIT LMAYMAGZD TGQMTBGT WEUUG GDTEADGY BGY PAUADGY \n",
+    "OIA MNMAGZD BGIX WGZD OIMTMZDG UAPPGY BG PEZQ YIT WGZD OIMDTG NAZQDY UAPPGY BG PMTQG\"\"\"\n",
+    "\n",
+    "# Alphabet\n",
+    "liste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n",
+    "\n",
+    "# Liste des occurrences\n",
+    "liste_occurrence = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
+    "\n",
+    "# Parcours caractère par caractère le fichier\n",
+    "for lettre in texte_chiffre:\n",
+    "    \n",
+    "    # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n",
+    "    if lettre.isalpha():\n",
+    "        \n",
+    "        # Recherche la position (index) de la lettre (conversion en minuscule)\n",
+    "        # à décoder dans la liste_alphabet.\n",
+    "        index = liste_alphabet.index(lettre)\n",
+    "        \n",
+    "        # Incrémenter l'occurence de la lettre correspondante\n",
+    "        liste_occurrence[index] = liste_occurrence[index] + 1\n",
+    "\n",
+    "# Afficher les occurrences de chaque lettres\n",
+    "for i in range(26):\n",
+    "    print(liste_alphabet[i], \":\",liste_occurrence[i])"
+   ]
   },
   {
    "cell_type": "markdown",
@@ -106,12 +363,60 @@
      "breakpoint"
     ]
    },
-   "source": "#### Ctrl+enter pour continuer ..........."
+   "source": [
+    "#### Ctrl+enter pour continuer ..........."
+   ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 3</h3> \n\nOn peut maintenant comparer ces occurrences avec celles de la langue française, fournies ici dans l’histogramme et le tableau suivants :\n\n\n![](https://gitedu.hesge.ch/info_sismondi/activites-2in-do/-/raw/main/Cryptographie/images/histo_fr.png?inline=false)\n\n| Rang | Caractère | Pourcentage | \n| :--------------- |:---------------:| -----:| \n| 1 | E | 12.10% |\n| 2 | S | 7.11% |\n| 3 | R | 6.59% |\n| 4 | T | 6.51% |\n| 5 | A | 6.39% |\n| 6 | L | 6.07% |\n| 7 | I | 5.92% |\n| 8 | U | 5.02% |\n| 9 | O | 4.96% |\n| 10 | N | 4.49% |\n| 11 | D | 3.67% |\n| 12 | C | 3.18% |\n| 13 | M | 2.62% |\n| 14 | P | 2.49% |\n| 15 | G | 1.23% |\n| 16 | B | 1.14% |\n| 17 | V | 1.11% |\n| 18 | H | 1.11% |\n| 19 | F | 1.11% |\n| 20 | Q | 0.65% |\n| 21 | Y | 0.46% |\n| 22 | X | 0.38% |\n| 23 | J | 0.34% |\n| 24 | K | 0.29% |\n| 25 | W | 0.17% |\n| 26 | Z | 0.15% |\n\n\nOn constate que la lettre la plus utilisée est le E, ensuite S, ensuite R, etc…\n\nEn se basant sur cette liste vous pouvez trouver la clé de chiffrage : \n1. Sur une feuille de papier, en partant du résultat de l'exercice 2, associez la lettre la plus utilisée de l'alphabet à celle la plus utilisée dans le texte, puis la 2ème plus utilisée, et ainsi de suite jusqu'à la moins utilisée. Cela vous donne une première correspondance.\n2. Copiez le code de l'exercice 1.\n3. Utilisez comme clef de base l'alphabet non modifié `\"ABCDE...\"` car pour l’instant vous ne connaissez pas la clé.\n4. Remplacez chaque lettre dans la clef par son équivalent chiffré.\n\n"
+   "source": [
+    "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 3</h3> \n",
+    "\n",
+    "On peut maintenant comparer ces occurrences avec celles de la langue française, fournies ici dans l’histogramme et le tableau suivants :\n",
+    "\n",
+    "\n",
+    "![](https://gitedu.hesge.ch/info_sismondi/activites-2in-do/-/raw/main/Cryptographie/images/histo_fr.png?inline=false)\n",
+    "\n",
+    "| Rang | Caractère | Pourcentage | \n",
+    "| :--------------- |:---------------:| -----:| \n",
+    "| 1 | E | 12.10% |\n",
+    "| 2 | S | 7.11% |\n",
+    "| 3 | R | 6.59% |\n",
+    "| 4 | T | 6.51% |\n",
+    "| 5 | A | 6.39% |\n",
+    "| 6 | L | 6.07% |\n",
+    "| 7 | I | 5.92% |\n",
+    "| 8 | U | 5.02% |\n",
+    "| 9 | O | 4.96% |\n",
+    "| 10 | N | 4.49% |\n",
+    "| 11 | D | 3.67% |\n",
+    "| 12 | C | 3.18% |\n",
+    "| 13 | M | 2.62% |\n",
+    "| 14 | P | 2.49% |\n",
+    "| 15 | G | 1.23% |\n",
+    "| 16 | B | 1.14% |\n",
+    "| 17 | V | 1.11% |\n",
+    "| 18 | H | 1.11% |\n",
+    "| 19 | F | 1.11% |\n",
+    "| 20 | Q | 0.65% |\n",
+    "| 21 | Y | 0.46% |\n",
+    "| 22 | X | 0.38% |\n",
+    "| 23 | J | 0.34% |\n",
+    "| 24 | K | 0.29% |\n",
+    "| 25 | W | 0.17% |\n",
+    "| 26 | Z | 0.15% |\n",
+    "\n",
+    "\n",
+    "On constate que la lettre la plus utilisée est le E, ensuite S, ensuite R, etc…\n",
+    "\n",
+    "En se basant sur cette liste vous pouvez trouver la clé de chiffrage : \n",
+    "1. Sur une feuille de papier, en partant du résultat de l'exercice 2, associez la lettre la plus utilisée de l'alphabet à celle la plus utilisée dans le texte, puis la 2ème plus utilisée, et ainsi de suite jusqu'à la moins utilisée. Cela vous donne une première correspondance.\n",
+    "2. Copiez le code de l'exercice 1.\n",
+    "3. Utilisez comme clef de base l'alphabet non modifié `\"ABCDE...\"` car pour l’instant vous ne connaissez pas la clé.\n",
+    "4. Remplacez chaque lettre dans la clef par son équivalent chiffré.\n",
+    "\n"
+   ]
   },
   {
    "cell_type": "code",
@@ -120,12 +425,70 @@
     "trusted": true
    },
    "outputs": [],
-   "source": ""
+   "source": [
+    "############ Correction ################\n",
+    "\n",
+    "# Texte à déchiffrer\n",
+    "texte_chiffre = \"\"\"PGY VGPNGDGY YITJMYYGZD MIYYA GZ NMPGIT PGY MIDTGY QMIPEAY WMT APY GZQMQGZD \n",
+    "WEZDTG PGY QGTUMAZY BGY PIDDGY JTGYOIG FEITZMPAGTGY YEAD OI APY PGY TGJEIYYGZD \n",
+    "BG PGIT JTEJTG DGTTADEATG YEAD OI APY GZNMVAYYGZD WGPIA BG PGITY GZZGUAY ETQGDETAX \n",
+    "GDMAD WVGH PGY VGPNGDGY PG JTGUAGT JMT YM ZMAYYMZWG GD JMT YGY TAWVGYYGY YEIY PG \n",
+    "WEZYIPMD BG U UGYYMPM GD BG U JAYEZ WGD VEUUG JEIYYG JMT P MURADAEZ WEZFITM MNGW \n",
+    "PM ZERPGYYG GD GZQMQGM PGY VMRADMZDY M YETDAT BI JMCY MNGW DEIDGY PGITY LETWGY \n",
+    "AP PGIT BAD OIG P GUJETDMZD JMT PG WEITMQG YIT DEIY PGY JGIJPGY BG PM QMIPG APY \n",
+    "PM YEIUGDDTMAGZD MAYGUGZD DEID GZDAGTG M PGIT GUJATG AP GID B MIDMZD UEAZY BG \n",
+    "JGAZG M PGY JGTYIMBGT OIG PGY VGPNGDGY YEZD BG DEIDGY JMTDY TGYYGTTGY JMT PM \n",
+    "ZMDITG BGY PAGIX B IZ WEDG JMT PG TVAZ LPGING DTGY PMTQG GD DTGY JTELEZB OIA \n",
+    "YGJMTG PGIT DGTTADEATG BG PM QGTUMZAG B IZ MIDTG JMT PG FITM VMIDG UEZDMQZG \n",
+    "OIA Y GPGNG GZDTG PM YGOIMZAG GD P VGPNGDAG B IZ DTEAYAGUG WEDG JMT PG PMW \n",
+    "PGUMZ GD PG TVEZG OIA YGJMTG WGDDG BGTZAGTG BG ZEDTG JTENAZWG AP TGYIPDMAD \n",
+    "BG WGDDG JEYADAEZ OI APY ZG JEINMAGZD ZA Y GDGZBTG MI PEAZ ZA JETDGT LMWAPGUGZD \n",
+    "PM QIGTTG WVGH PGITY NEAYAZY GD W GDMAD IZG WMIYG BG NANG MLLPAWDAEZ JEIT BGY \n",
+    "VEUUGY RGPPAOIGIX PGIT JEJIPMDAEZ ZEURTGIYG GD PM QPEATG OI APY MWOIGTMAGZD BMZY \n",
+    "PM QIGTTG JMT PGIT WEITMQG PGIT LMAYMAGZD TGQMTBGT WEUUG GDTEADGY BGY PAUADGY \n",
+    "OIA MNMAGZD BGIX WGZD OIMTMZDG UAPPGY BG PEZQ YIT WGZD OIMDTG NAZQDY UAPPGY BG PMTQG\"\"\"\n",
+    "\n",
+    "# Alphabet MAJUSCULE uniquement pour simplifier\n",
+    "liste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n",
+    "\n",
+    "# Pour chaque lettre, correspond une lettre dans liste_alphabet\n",
+    "liste_chiffree = \"MNBJGLQVAHCPWEZURTYDIOKFXS\"\n",
+    "\n",
+    "# texte_dechiffree contiendra la chaine de caractère donc le texte déchiffré\n",
+    "texte_dechiffre = \"\"\n",
+    "\n",
+    "\n",
+    "# Parcours caractère par caractère le fichier ouvert.\n",
+    "for lettre in texte_chiffre:\n",
+    "\n",
+    "    # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n",
+    "    if lettre.isalpha():           \n",
+    "        # Recherche la position (index) de la lettre à décoder dans la liste_chiffree.\n",
+    "        index = liste_chiffree.index(lettre)\n",
+    "        \n",
+    "        # On utilise cet index pour trouver la lettre dans liste_alphabet.\n",
+    "        lettre_decodee = liste_alphabet[index]\n",
+    "                \n",
+    "        # On ajoute le caractère déchiffré à la suite du texte déjà déchiffré.\n",
+    "        texte_dechiffre = texte_dechiffre + lettre_decodee\n",
+    "    else:\n",
+    "        # la lettre n'est pas un caractère alphabétique mais peut-être une ponctuation\n",
+    "        texte_dechiffre = texte_dechiffre + lettre\n",
+    "\n",
+    "# On affiche le texte decodé\n",
+    "print(texte_dechiffre)"
+   ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": "Cela vous donne déjà une première clef approximative. À partir de là, par tentatives successives : \n\n1. Exécutez le code, puis\n2. modifiez votre clef en inversant la position des lettres. Attention de toujours garder 26 lettres différentes.\n3. Continuez à tâtons avec les mots que vous reconnaissez, par exemple s'il vous semble reconnaitre un déterminant ou une double lettre, vous pouvez adapter votre clé pour que faire coincider le message déchiffré."
+   "source": [
+    "Cela vous donne déjà une première clef approximative. À partir de là, par tentatives successives : \n",
+    "\n",
+    "1. Exécutez le code, puis\n",
+    "2. modifiez votre clef en inversant la position des lettres. Attention de toujours garder 26 lettres différentes.\n",
+    "3. Continuez à tâtons avec les mots que vous reconnaissez, par exemple s'il vous semble reconnaitre un déterminant ou une double lettre, vous pouvez adapter votre clé pour que faire coincider le message déchiffré."
+   ]
   },
   {
    "cell_type": "code",
@@ -138,10 +501,81 @@
     {
      "name": "stdout",
      "output_type": "stream",
-     "text": "LES HELVETES SURPASSENT AUSSI EN VALEUR LES AUTRES GAULOIS CAR ILS ENGAGENT \nCONTRE LES GERMAINS DES LUTTES PRESQUE JOURNALIERES SOIT QU ILS LES REPOUSSENT \nDE LEUR PROPRE TERRITOIRE SOIT QU ILS ENVAHISSENT CELUI DE LEURS ENNEMIS ORGETORIX \nETAIT CHEZ LES HELVETES LE PREMIER PAR SA NAISSANCE ET PAR SES RICHESSES SOUS LE \nCONSULAT DE M MESSALA ET DE M PISON CET HOMME POUSSE PAR L AMBITION CONJURA AVEC \nLA NOBLESSE ET ENGAGEA LES HABITANTS A SORTIR DU PAYS AVEC TOUTES LEURS FORCES \nIL LEUR DIT QUE L EMPORTANT PAR LE COURAGE SUR TOUS LES PEUPLES DE LA GAULE ILS \nLA SOUMETTRAIENT AISEMENT TOUT ENTIERE A LEUR EMPIRE IL EUT D AUTANT MOINS DE \nPEINE A LES PERSUADER QUE LES HELVETES SONT DE TOUTES PARTS RESSERRES PAR LA \nNATURE DES LIEUX D UN COTE PAR LE RHIN FLEUVE TRES LARGE ET TRES PROFOND QUI \nSEPARE LEUR TERRITOIRE DE LA GERMANIE D UN AUTRE PAR LE JURA HAUTE MONTAGNE \nQUI S ELEVE ENTRE LA SEQUANIE ET L HELVETIE D UN TROISIEME COTE PAR LE LAC \nLEMAN ET LE RHONE QUI SEPARE CETTE DERNIERE DE NOTRE PROVINCE IL RESULTAIT \nDE CETTE POSITION QU ILS NE POUVAIENT NI S ETENDRE AU LOIN NI PORTER FACILEMENT \nLA GUERRE CHEZ LEURS VOISINS ET C ETAIT UNE CAUSE DE VIVE AFFLICTION POUR DES \nHOMMES BELLIQUEUX LEUR POPULATION NOMBREUSE ET LA GLOIRE QU ILS ACQUERAIENT DANS \nLA GUERRE PAR LEUR COURAGE LEUR FAISAIENT REGARDER COMME ETROITES DES LIMITES \nQUI AVAIENT DEUX CENT QUARANTE MILLES DE LONG SUR CENT QUATRE VINGTS MILLES DE LARGE\n"
+     "text": [
+      "LES HELVETES SURPASSENT AUSSI EN VALEUR LES AUTRES GAULOIS CAR ILS ENGAGENT \n",
+      "CONTRE LES GERMAINS DES LUTTES PRESQUE JOURNALIERES SOIT QU ILS LES REPOUSSENT \n",
+      "DE LEUR PROPRE TERRITOIRE SOIT QU ILS ENVAHISSENT CELUI DE LEURS ENNEMIS ORGETORIX \n",
+      "ETAIT CHEZ LES HELVETES LE PREMIER PAR SA NAISSANCE ET PAR SES RICHESSES SOUS LE \n",
+      "CONSULAT DE M MESSALA ET DE M PISON CET HOMME POUSSE PAR L AMBITION CONJURA AVEC \n",
+      "LA NOBLESSE ET ENGAGEA LES HABITANTS A SORTIR DU PAYS AVEC TOUTES LEURS FORCES \n",
+      "IL LEUR DIT QUE L EMPORTANT PAR LE COURAGE SUR TOUS LES PEUPLES DE LA GAULE ILS \n",
+      "LA SOUMETTRAIENT AISEMENT TOUT ENTIERE A LEUR EMPIRE IL EUT D AUTANT MOINS DE \n",
+      "PEINE A LES PERSUADER QUE LES HELVETES SONT DE TOUTES PARTS RESSERRES PAR LA \n",
+      "NATURE DES LIEUX D UN COTE PAR LE RHIN FLEUVE TRES LARGE ET TRES PROFOND QUI \n",
+      "SEPARE LEUR TERRITOIRE DE LA GERMANIE D UN AUTRE PAR LE JURA HAUTE MONTAGNE \n",
+      "QUI S ELEVE ENTRE LA SEQUANIE ET L HELVETIE D UN TROISIEME COTE PAR LE LAC \n",
+      "LEMAN ET LE RHONE QUI SEPARE CETTE DERNIERE DE NOTRE PROVINCE IL RESULTAIT \n",
+      "DE CETTE POSITION QU ILS NE POUVAIENT NI S ETENDRE AU LOIN NI PORTER FACILEMENT \n",
+      "LA GUERRE CHEZ LEURS VOISINS ET C ETAIT UNE CAUSE DE VIVE AFFLICTION POUR DES \n",
+      "HOMMES BELLIQUEUX LEUR POPULATION NOMBREUSE ET LA GLOIRE QU ILS ACQUERAIENT DANS \n",
+      "LA GUERRE PAR LEUR COURAGE LEUR FAISAIENT REGARDER COMME ETROITES DES LIMITES \n",
+      "QUI AVAIENT DEUX CENT QUARANTE MILLES DE LONG SUR CENT QUATRE VINGTS MILLES DE LARGE\n"
+     ]
     }
    ],
-   "source": "############ Correction ################\n\n# Texte à déchiffrer\ntexte_chiffre = \"\"\"PGY VGPNGDGY YITJMYYGZD MIYYA GZ NMPGIT PGY MIDTGY QMIPEAY WMT APY GZQMQGZD \nWEZDTG PGY QGTUMAZY BGY PIDDGY JTGYOIG FEITZMPAGTGY YEAD OI APY PGY TGJEIYYGZD \nBG PGIT JTEJTG DGTTADEATG YEAD OI APY GZNMVAYYGZD WGPIA BG PGITY GZZGUAY ETQGDETAX \nGDMAD WVGH PGY VGPNGDGY PG JTGUAGT JMT YM ZMAYYMZWG GD JMT YGY TAWVGYYGY YEIY PG \nWEZYIPMD BG U UGYYMPM GD BG U JAYEZ WGD VEUUG JEIYYG JMT P MURADAEZ WEZFITM MNGW \nPM ZERPGYYG GD GZQMQGM PGY VMRADMZDY M YETDAT BI JMCY MNGW DEIDGY PGITY LETWGY \nAP PGIT BAD OIG P GUJETDMZD JMT PG WEITMQG YIT DEIY PGY JGIJPGY BG PM QMIPG APY \nPM YEIUGDDTMAGZD MAYGUGZD DEID GZDAGTG M PGIT GUJATG AP GID B MIDMZD UEAZY BG \nJGAZG M PGY JGTYIMBGT OIG PGY VGPNGDGY YEZD BG DEIDGY JMTDY TGYYGTTGY JMT PM \nZMDITG BGY PAGIX B IZ WEDG JMT PG TVAZ LPGING DTGY PMTQG GD DTGY JTELEZB OIA \nYGJMTG PGIT DGTTADEATG BG PM QGTUMZAG B IZ MIDTG JMT PG FITM VMIDG UEZDMQZG \nOIA Y GPGNG GZDTG PM YGOIMZAG GD P VGPNGDAG B IZ DTEAYAGUG WEDG JMT PG PMW \nPGUMZ GD PG TVEZG OIA YGJMTG WGDDG BGTZAGTG BG ZEDTG JTENAZWG AP TGYIPDMAD \nBG WGDDG JEYADAEZ OI APY ZG JEINMAGZD ZA Y GDGZBTG MI PEAZ ZA JETDGT LMWAPGUGZD \nPM QIGTTG WVGH PGITY NEAYAZY GD W GDMAD IZG WMIYG BG NANG MLLPAWDAEZ JEIT BGY \nVEUUGY RGPPAOIGIX PGIT JEJIPMDAEZ ZEURTGIYG GD PM QPEATG OI APY MWOIGTMAGZD BMZY \nPM QIGTTG JMT PGIT WEITMQG PGIT LMAYMAGZD TGQMTBGT WEUUG GDTEADGY BGY PAUADGY \nOIA MNMAGZD BGIX WGZD OIMTMZDG UAPPGY BG PEZQ YIT WGZD OIMDTG NAZQDY UAPPGY BG PMTQG\"\"\"\n\n# Alphabet MAJUSCULE uniquement pour simplifier\nliste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n# Pour chaque lettre, correspond une lettre dans liste_alphabet\nliste_chiffree = \"MRWBGLQVAFSPUZEJOTYDINKXCH\"\n\n# texte_dechiffree contiendra la chaine de caractère donc le texte déchiffré\ntexte_dechiffre = \"\"\n\n\n# Parcours caractère par caractère le fichier ouvert.\nfor lettre in texte_chiffre:\n\n    # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n    if lettre.isalpha():           \n        # Recherche la position (index) de la lettre à décoder dans la liste_chiffree.\n        index = liste_chiffree.index(lettre)\n        \n        # On utilise cet index pour trouver la lettre dans liste_alphabet.\n        lettre_decodee = liste_alphabet[index]\n                \n        # On ajoute le caractère déchiffré à la suite du texte déjà déchiffré.\n        texte_dechiffre = texte_dechiffre + lettre_decodee\n    else:\n        # la lettre n'est pas un caractère alphabétique mais peut-être une ponctuation\n        texte_dechiffre = texte_dechiffre + lettre\n\n# On affiche le texte decodé\nprint(texte_dechiffre)"
+   "source": [
+    "############ Correction ################\n",
+    "\n",
+    "# Texte à déchiffrer\n",
+    "texte_chiffre = \"\"\"PGY VGPNGDGY YITJMYYGZD MIYYA GZ NMPGIT PGY MIDTGY QMIPEAY WMT APY GZQMQGZD \n",
+    "WEZDTG PGY QGTUMAZY BGY PIDDGY JTGYOIG FEITZMPAGTGY YEAD OI APY PGY TGJEIYYGZD \n",
+    "BG PGIT JTEJTG DGTTADEATG YEAD OI APY GZNMVAYYGZD WGPIA BG PGITY GZZGUAY ETQGDETAX \n",
+    "GDMAD WVGH PGY VGPNGDGY PG JTGUAGT JMT YM ZMAYYMZWG GD JMT YGY TAWVGYYGY YEIY PG \n",
+    "WEZYIPMD BG U UGYYMPM GD BG U JAYEZ WGD VEUUG JEIYYG JMT P MURADAEZ WEZFITM MNGW \n",
+    "PM ZERPGYYG GD GZQMQGM PGY VMRADMZDY M YETDAT BI JMCY MNGW DEIDGY PGITY LETWGY \n",
+    "AP PGIT BAD OIG P GUJETDMZD JMT PG WEITMQG YIT DEIY PGY JGIJPGY BG PM QMIPG APY \n",
+    "PM YEIUGDDTMAGZD MAYGUGZD DEID GZDAGTG M PGIT GUJATG AP GID B MIDMZD UEAZY BG \n",
+    "JGAZG M PGY JGTYIMBGT OIG PGY VGPNGDGY YEZD BG DEIDGY JMTDY TGYYGTTGY JMT PM \n",
+    "ZMDITG BGY PAGIX B IZ WEDG JMT PG TVAZ LPGING DTGY PMTQG GD DTGY JTELEZB OIA \n",
+    "YGJMTG PGIT DGTTADEATG BG PM QGTUMZAG B IZ MIDTG JMT PG FITM VMIDG UEZDMQZG \n",
+    "OIA Y GPGNG GZDTG PM YGOIMZAG GD P VGPNGDAG B IZ DTEAYAGUG WEDG JMT PG PMW \n",
+    "PGUMZ GD PG TVEZG OIA YGJMTG WGDDG BGTZAGTG BG ZEDTG JTENAZWG AP TGYIPDMAD \n",
+    "BG WGDDG JEYADAEZ OI APY ZG JEINMAGZD ZA Y GDGZBTG MI PEAZ ZA JETDGT LMWAPGUGZD \n",
+    "PM QIGTTG WVGH PGITY NEAYAZY GD W GDMAD IZG WMIYG BG NANG MLLPAWDAEZ JEIT BGY \n",
+    "VEUUGY RGPPAOIGIX PGIT JEJIPMDAEZ ZEURTGIYG GD PM QPEATG OI APY MWOIGTMAGZD BMZY \n",
+    "PM QIGTTG JMT PGIT WEITMQG PGIT LMAYMAGZD TGQMTBGT WEUUG GDTEADGY BGY PAUADGY \n",
+    "OIA MNMAGZD BGIX WGZD OIMTMZDG UAPPGY BG PEZQ YIT WGZD OIMDTG NAZQDY UAPPGY BG PMTQG\"\"\"\n",
+    "\n",
+    "# Alphabet MAJUSCULE uniquement pour simplifier\n",
+    "liste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n",
+    "\n",
+    "# Pour chaque lettre, correspond une lettre dans liste_alphabet\n",
+    "liste_chiffree = \"MRWBGLQVAFSPUZEJOTYDINKXCH\"\n",
+    "\n",
+    "# texte_dechiffree contiendra la chaine de caractère donc le texte déchiffré\n",
+    "texte_dechiffre = \"\"\n",
+    "\n",
+    "\n",
+    "# Parcours caractère par caractère le fichier ouvert.\n",
+    "for lettre in texte_chiffre:\n",
+    "\n",
+    "    # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n",
+    "    if lettre.isalpha():           \n",
+    "        # Recherche la position (index) de la lettre à décoder dans la liste_chiffree.\n",
+    "        index = liste_chiffree.index(lettre)\n",
+    "        \n",
+    "        # On utilise cet index pour trouver la lettre dans liste_alphabet.\n",
+    "        lettre_decodee = liste_alphabet[index]\n",
+    "                \n",
+    "        # On ajoute le caractère déchiffré à la suite du texte déjà déchiffré.\n",
+    "        texte_dechiffre = texte_dechiffre + lettre_decodee\n",
+    "    else:\n",
+    "        # la lettre n'est pas un caractère alphabétique mais peut-être une ponctuation\n",
+    "        texte_dechiffre = texte_dechiffre + lettre\n",
+    "\n",
+    "# On affiche le texte decodé\n",
+    "print(texte_dechiffre)"
+   ]
   }
  ],
  "metadata": {
diff --git a/Cryptographie/readme.md b/Cryptographie/readme.md
index df861dbdcc2259c8c49913102dd08cfb3f5dc051..a9d864f1f28f539a7e95ee526b939eb4cb8fc3e7 100644
--- a/Cryptographie/readme.md
+++ b/Cryptographie/readme.md
@@ -14,7 +14,7 @@
 
 ### Cours 2 - TP Attaque par occurence + Vigenère
 
-* TP Attaque par occurence - [Énoncé](https://notebook.basthon.fr/?extensions=linenumbers%2Cromd%2Csequenced&ipynb=eJzdWuty28YVfpUtM62kRKJEylZi2nEHEmEEtCBBEkiKDD32ClyKa4MAgotiOc5MXqP_Ov3RVv3Rl-Cb9En6nV2AN8mK7d5mqoQm9uDsuZ-zZ3f5U8UXQZBWGt__VJmIjA95xiuNn37eVPCX2XUsKo3KhCdvhtGPYWWzkkZ54hPsyVBesTS7DsS3g0rMh0MZXjbqO_Hbxxfcf3OZRHk43PKjIEoaMY_5Nf9xLOPHgwp7ygbhk_HubK7G8ccRHngmBpWn7IlkfsDTFG9HnI34lgxHEabyRPKtsRwORYhXWZJr7G35lP0uvEjjx-xUQNYfcsFkmCXRMPczeSXKl59G98n2eFfJGj9lB4KNpD-WImEizTBTZiyGJdj0b1kiWJCzFINAsFRmgj3hbJyIEUiNsyxOG9vbYZSJiyh6U73gaTaOwuoo2SYWcnLJ0sT_du0-RAgssnRbjMRQPKzXvvEf7Xzz9YNHe6PaXjUOL9dmlryIkqFIGmznMRvKNA74dUOGgQzFYwarXMoQr9hDeIiNhbwcZ41duIvUDzLM3tccB5VtqM6fVtmTi-TpIGT4G4Rnkl1FecqCNX4l3rEovxJJxvDsszxkPCcrxEl0mfDJRGwyP8IXa-XxdQaTlUptahqJhIPesaFgiQj9CI4CDkABPim7yC_TkndH5DIIgOsHeg5Z-aOt68MxUoSkDBMZu2b-GFYAL3_uzekfSSUJWYY5u4jyLArZoHKcXyUygWXKyLkVOKMogKnvDUlEznZMj0iUp2TFys-bn5pkX7CDsRyNEjERYcbS68n0JlPmY1vsUECh-ctJFEY8iMf8AjiEMggHIXAu8oxMDZ2zhF9xGcBPXCGoUCbNpzcFoYScORFpyi8FPCIZZyA2vSkY4aH0-L2cmUBIDHmccbwF8iwwiNVrmNwHqelNdRB-hklul45M8OB20eHv8kToenPLezHiTgYfVVDMtyLxJaxXY2VBUGad65Tm8ooUjUUCTe4xaCoCRFdAcyX4xyrm7jXkJlkSGRJyCRLACDg0gRuGS76vaqFkKt5tBcr6xPGaJgAREKRjjFwbJqAY5zJlGVyvkKurHiAj4N2w0hjxIBUrDvGjoViOT0-8RcWDTxeUHoQZQV8WY_YtUor-69rstN3t2obNOued_bb77Jx57eMO67SPT87OHZsduzY7arv49wz_2HoaKfcFM5RhYGDHaLXPDtqHJmxLRlKmU8U4lZM4kCNJEgQSWrzk5SQSwdg_aJrPrO_s1vND5-jYPTk989qd7nmvX_JwiQqqBMVwILIsUaUsSUQaR-EQ_EowG_IQxXCJR8mz0FqrfXZ0-szuGSfnh8-7-267f_Bdxzn2rFbTLHlqUw3FbBpVREnO4srdY44CrhzOE-5n078S9yj0ya9q7tzy05vS8jNype3DQkGe-NAxXSQW82RxGMyLo67ySNNRlJSKy5AtObdBhKm6fYG1NwNtCHuVcAlngLOehESjUkNlY85nuWKs82r13YamJEcFs6pMFdb6RoPN_zRSydIfIz_HgkwVR1h9JVJsXYZD8XZDBT8vBV8O0cKBnC37rDonrmjAfCsICryuaW7MsReFOg5ZnknMo6qbFYRUgKIlIZMuSHVHHC3IoJGWvLmM-70i_mI-4wPy8NdY2nQpWIiiedyodZBTKctUVZoF1utFs6mSXdK9HWirkK9uya9nC9SVxqKAc3OEaxQoMU_vDZYJyiHKbZ5t6faL8hIJ6mc5J_9_jow6PchSI4p-sZBdc-GpbmfrS-G_sQydIW8QQVRK8Vb4OQn1EnkXZpVGmAfBZgXeiPOM2u4Xn74CQsorKE9mQLqHqswvRDYkn604xdL0qmWz5-ct2zy2md21n5l2i3motvZzZj8_6tD3udk7N8-fs-aa3es965zbr-5pAMpl6BUVM13eqKRRsSvL3KsqWeBU0LqDxi1YXDFjEPKnN0Mq3EgQ1SropUtlyaIy_kyZf3Gl-hxfVDJ-SfDKRSL4mziCuSsvPqZrwx87yJLgK2gIJZRWqqyHOYbV-Z_S6QPkloPif97_1OftD6WJnIiEdkEfCMKFtmcldO7qWhc7HpXcWOAyhkoeCt3-TP-uq4IKPDFSsfXllwe0y6DFP4lUOCW3qqyK0t9_-aWSmSqGaoUylSUpi3w_T2gPgud1SBiTEBQgG7rBWugDikItbmuFACZaRJcnekdBDgWoWH54eAkyo4SH079wWhSUkKpDo3WIdkGLEs_aDQ65lKIHqij61JELvfUM7ug_q-zzGsCiCb8jdz6QL_em4EIy_W_bxM_sAA9pEoy2FBwlrTkI1L7f2WT_tv9faO4HC63fSnf3K83dJ7Z2v9bSzVuI_2xbd3cD9Qld3TrKAzInJQSE_QQVNvXzYLE1--L-1u-Otmu59ZshfETrZ4e0tZ3osh-sqYBR8bIk9GKOZ2Kh3VuJsqK7m0ly-81XrFaEvW5bbte11UKWatdL8jpK0qVYr--VftCdzGqH-WITHm8MKpu3hXix8RkLWIfOgNQp0sLaQQ94HVOvcUcDo9YDdXhUrgjYEIPCbE3AtAY88erVq0HoWj3Wsdwjq4mHnu21nF7P6jeZg87GYFafHTmuZXuM8By76eHrxLFd0-ixruMxw-0B6cQ5oTmDsGv2gaKQTyyv7Rj9HtvHwLWbRL-F6ce2xdBTeX3HNSwi1zONJrorRYomYsNn2lqIQbhPxMC-5ZmYzJqW5xlN08Dj4jSrf-R0DD2na7m2wYp59KpvtSGs6Z1YTdMzzkHUajqY2-1Y37El9V2LJGxDLNaCbj2H9R1Qdfpdi1lNDSMBDUzt9ZTotpqlFO_ZrtMkxm3WxmvHdWiSGreMntmHZE3WMdttcFEKKoIuc9qnRtOg92b_me05zDmyuiCJ-X3z1CVOREhb2dESO5ji9JtwCWTwmobH9m2QO-jpyU3T1vqQBQ5Nr4vBIDRcbct9ZTgYiFntFmaDkBbFgggQ4MSiQCAi2iEty27RN9nUUd63lNWViDBB22o2PcdQUWP0rDY9kAQQuUkuZo7mC27kOIhh4eU-hROxbps6SkCvZRl9jU5cvZ7t7MMXStalMEWU0YRCTcjepLCBoTxPj0nQQdh3mjYYqgA0LPscPG0yc9Mq9fU6Rp8dQrojUKO5roM4IXOrEaLu0OzvQwID5HoWZhXxuBCIhVko3PuGpXmoTCmZKKd2AEIoQHLnpE-6Ek2Ep2uBtaWzBta0jm1FBRK4hcIlzaaHpDNg3iUNXEfFigXmahLpZIKBIq8FRtw1SUyvr7wBefumEs8zjwyKbXgE2tquSguVc3pKy-zpyCzSrK8i90i7uq_Eb1r9ffKwzVAS-gSkiILTDp2u4epYUHFyYpNzyqSjuDwidfpEg3WZTkkbHLqoPErIIwOWcQ4PXaOrhABrT_lyEKos6rFTy3UNRAc8q4uE2aIcJOS-2T71LFunDrF3la8KRZwuZhUhu-_0e0siasOCXJkManCI0NYTPOvE8SguuyqXLfJL0yrqnNFWz9q9TmGqfZKwS0_wroeYRyAYbplSZv9E5VuJQK6BX04Q0wtYFJdFyf7MneKHmvnb3bu4tZP8jza8H7ksfmiD-f-9k9xd2knGK0cZs42Uv-JUtX28f2u1yUbUqkpgSF8Wjd4_fvnDGJ1LGVJqv8YyfhEInpcNRsoa-oj0N9-_WC-vlS4lPJ1XxyJFzPjjbbosfJnKFHvWodzmdLUIjHSrLsOtYbS9tZ3wH7dJk-2D5DpWDGM029tygqBLt5UQL0cJ3dn9Xt_LfauiSJ0VvWen0Ia9ZwfzXvq9OpD24Xrqhd4zwmpsLf-x96uQxntWftOEGiaa-NTq1drOb9l7gtUxPsPn62qtVoB2MTzFZ6_68FEBeoChp0El1kMMDQXaLbH2MDxUoJ2vC9DXGNr4PKw-qhegbzBsK9BOCXqE4TE-D6qP9gpQbQfjIwV7UNKvkQJNfHareyWDGilwoGC1b0oYaeDgU6_ulSxqpIKrYHN6pINFBqnWd0sYKbGvYLUHJYy06GhYqX6N1PhuBUZ6PFuG1UmPE3x2qnsPSxjp0VOwB6W-ddLjXMF2Sz3qpEdLw0pZ6qTHcwWrl3rUSY-ugtVKu9RJj76Gab5FkqFkpBnP9BHCfCNC26sATbU-rp7e6CtBpIdJN0_6NPhs_niKx8z_xy9_JqpmyFLBLri6l6J7WR80hd6p6FY9pkONd7eOY2Z3VxTU1LTXquwsT9Qp7khf-BJOzGNsVNUNGOqBukoc5gzrQZoHUEWVgDUxO53aZChLkS9pBblHPzVrdiZQntXchVic96idcXFoAqz69K-0LC3hbqqlSYbYGg9FcYb-Ok9_yNf0qfoEdX0BvcoOBKDKRNjXhMX5dSImUmX9rROgOmZEsVxdG5cNUAPibpW19cXDu-IGng7LCBFuWlI8xHZ5Eg3lSNIpbnEwglVkUHlFm3m9zlDllBQ3v7r3Au8HVfrtRRxwn5jfcXSmT-7UkUQK7tObH6j0BrSyL9wu_DdOoz5jqVz1WHEzsuI40o_H8NBblHz64UmVTX9R0SvVQV8w_eOmMkBGJZ0QUoSLj8UtVc8NtSYiHcy3aHvybMXjOgpVPGjf4f1VlJWckShSnYUUF8WzgxM6zSo2_1VmZMRcg1kW5a_VmdElp1-OUP0oEBnoj6Y3CbUdqQ6tg6LteEdpk03_lKGmlGe6KSTCIkpO1z_xEPNA0SrDfYgOpMeaDDROKiZYg2eo-iKHLItGZyJVLxDlysTDKCfM8kZ2sbjojjCZ2QHhrGK3OCpV6USX7cPli5HFK61_IeBSP4lQPhBx1PBsfnwAvlim80YkoQjSWPg0Kn678zLkE8J2r-k3LVig12V8rTE3IJ5qfqALMGKFAVgxQ493Kz9DgvBiFCWIxkrjwXzwEvaNkkqj_vM_AeZ90jU) - [Corrigé](https://notebook.basthon.fr/?ipynb=eJztXOty20aWfpVepmZtJzIlUjeLcTwFERAEGjeBACkydNkQCUpIQAABQMVy7Kq8xv6bmh-74_2xL6E3mSfZ73QDIikpTuTJViW1lE0BaPS5X_rgoKmfauMgivJa69ufarOg8Cd-4ddaP33Y4OOvi6s0qLVqMz_7fpL8GNc2ankyz8Y09nwSXrK8uIqCb0a11J9Mwvi81dxK33595o-_P8-SeTx5Ok6iJGulfupf-T9ehOnXoxp7wUbx84vtG1gxZ3yR4MQvglHtBXsesnHk5znuTn029Z-G8TQBqJ-F_tOLcDIJYtwqsrmYvRm-YP8en-Xp18wJwOsP84CFcZElk_m4CC-D6ubD8D7fvNjmvKYvWDtg03B8EQYZC_ICkGHBUmiCXf93kQUsmrMcF1HA8rAI2HOfXWTBFKguiiLNW5ubcVIEZ0nyff3Mz4uLJK5Ps00iEc7OWZ6Nv3n0qYlgOCjyzWAaTILdZuPZ-GDr2f7Owd60sVdP4_NHN5o8S7JJkLXY1tdsEuZp5F-1wjgK4-BrBq2chzFusV1YiF0E4flF0dqGuUj8qAD0oaA4qm1CdP9FnT0_y16MYoafUdwN2WUyz1n0yL8M3rFkfhlkBcP5mM1j5s9JC2mWnGf-bBZssHGCA-vM06sCKquE2hA4shAGescmAcuCeJzAUJiDoQifnJ3Nz_OKdi-Yh1GEueNIwJCWf7N2xzBMGMQkDAsKdsXGF9ACaI0X1rz-G4kUgpfJnJ0l8yKJ2ahmzS-zMINmKs-54zjTJIKqP-mS8JzNlE4RKC9Ii7UPGw8Nsi9Y-yKcTrNgFsQFy69m1x8Lrj72lOkBBFrcnCVx4kfphX-GOeWUdpJlAUIAVsU_AJzNC9I7FFBk_qUfRjCaL2aTX5Marj-WWDOy7CzIc_88gHlC5jNgvv5YUsVJZf5PsxHAPyZ-Wvi4i8k3XkKkvoP-x0B1_bE-ij9DP3fzSBH40d0M5L-bZ4FIPndMmcIJw-g3ZRflbZCNQ2ivwarswNW6kCmfh5ckaBpkkOQTCh0nuMHyIILDRYQhBBdpcFd_G6RAREnsh4AE6siHAICdrNi_LngJ8-Dd04grnQhdEQAmRkRwliLeJhkwpvMwZwUszifXbyueZMe9Sa019aM8uGUHcB6s-qgbvEXWgymXZB3FBY2-Lq_ZNwgr-tfXmOP1-5qksd5p79Czj06Z61k91vOsk-6poTHL1pjp2fjdxS9NgJFwXzCJKwZ6NaSO1217ugKVkpK46_GEnIezNAqnIXEQhZDitV8BEQvSYVtWjtRjrfNSN0zLPnG6rtfrnw6GFQ2bsCBTkOtGQVFkPJ0hjvI0iSegVw2ziR8jIa7QqGiWUguxu6ZzpA2kk1P9Zf_Q9obt455huWpHViqaQlWT4AaMsmJIxvK5uS98JHFucD_zx8X1P4h6Eo_Jrhx2ofnrj5Xmb9BVuo9LAf1sDBnzZWSpny1fRosEKTI9onOaZJXgYcxWjNsixJThvsD6WwA3mL3M_BDGAGUBhPiiDEPZYkFnNVE89uv1d08EpnBaEquHOZ_1-EmLLX7EpIrk-AJheRGQqtIEKzDyHXscxpPg7RPu_H7FeOmicOCstJ7PVg1WX2DmCKC7WxP48GOB8Mli9jJHVszmRQg4yrRFiYh7J2oS0ucSS_c40RIPYhKZEjwHN8xUM7_lqF8t5v8CN_53WNlEFlhyoIXL8GXQp-RV8IXwxqe-Ww5qnqQrvHd97PbIV7e4F7ABEkprmb2FKuJH5CGpn3_SS2bIg0iv8-KpqL0oIBGZ42Lui4Xu4RyKuCA9Tcntg6WwCnieHsWUn4vHK17_ZHX0Bu0TQocEGbwNxnNi6TXCLS5qre3mRg12SOeFqLfFeZVWczDizwBH6HD98EQZIx22LV1XVIV1ta5hmTJgLa_LupZ3LGmuwjxTYYeWid8Sfimcz9ifCfoTMFT78OrhqzA0dwmDkGmQe2K-5iytetBmtepVy-ObjsZennY0xdKY1teOFK3DXEikvWTaS7NHx1NlcKqcvmTyI20wOOqdam9WixC-fvIKpFoQ31BaFYmWkiul3SrhvqmTUZyAVkCUkXw5nNCqCzavP05o9UCg8jJFrJ88Wm9yxfhGgn91rVz6WarO2Be3fsgfH7KqfoY61-vqel1dr6vrdfXPtK7et6ruPGRR_Zw8SctqV9MVs60wxVUcU9GZjJVW6TKla0t01MwjzdS6zHikHB05kvabFtZa4Z8Tz7Uz8Ph9mkDk2qvf0hPga0eRRV8hOcPneQDwxBbPcVlf_PyJHqibi-dp8pdwFmTUY_uFimL5OXqlGRHd1xNZfpbmXo4UXzDksjgQD9bX_yPCgxcSwZTXCl9-2aYeFi1_WcJrhOxOquFVx1-__JLzTKHDH7ILXvLkLBmP5xl1uHD-GBymxAR57hPx6L60EpbZKrgrFdIc4SK8fib6VWRCDJUJ2I_PgWaa-fH1f_mUGTmT_NmfkjH12JY5vllwffDFBW3z7DCmFk8gGptVdVQWa3X2eV2Fuw2dP3xf4TNLG52AoJAVm1e4FkPA9u3WBvvd_r8S1NtLNc2tsuVXqpYH1iy_VqssFsj_23rl_uLgAeXKY0Q9AiKnCXDpGRJnPp5Hy2XHF5-oae6pJ1ZrmpsJv6Gm0WLqf85EKo8ecW_hzrLC8XLcFsFSHXPLxcrC5YaTu3e-Yo3S58WafDdX3U5OubB7SCZHmjkPHjf3KiOIhfp28fRqA-ZujWobd5l49eS-NfzZQ9ZwibVIhkNxaOOwNYplcVDE4UjcU8XVsThoODwbxR1x9VIcdHEwBIApDhYO26PYxmFvFJ-IQUccujg0R7ErrjwcdkdxD4edUdwXcKfiMBCoh-Lwuzxo9-j1CX8Bs7Qw0glup_RUfM-jNl_s-HuXarkLc6TzxYIHsBZc8s2bNxBZHbCeapuqjJOB5naMwUAdysxAMSQxdchMw1Y1l9E8Q5NdHE4MzVakAesbLpPsASadGCcEA30oQ0zhk09U1zOk4YAd4sLWZMLfAbilqQxlmDs0bEkldANFklGQcVQEiOc5RRNMwOaEDOQ7rgJgJquuK8mKhNNlMHVoGj1JwPRVW5NYCUe3hqoHZhX3RJUVVzoFUlU2ANvvqcdsRXxbJQ49sMU6kG1gsKEBrMawrzJVFmPEoATQwYCzrnEoLvhAsw2ZCHvMw23DNgiIX3ekgTIEZzLrKZ4HKlxAjtBmhudIskT3leGR5hrMMNU-UAJ-qDg2USJEQsuG4NgAiDGUYRLw4MqSyw41oGsPBLCsaEIe0oCuuH1cjGLJFro85IqDgpjqdQANRIIVFSyAgROVHIGQCIN0VK1DR9Kpwa2vcq1zFqECT5Vl15C410gD1aMT4gAsy2RiZgi6oEaGAxsqbh6SOxFpTxFeAnwdVRqK6UTVHWjGIWzBeV1xU3gZAZRigneZ3AaKcl1xTYwiEA1ZA0HugJKqnYKmRmqW1UpetycNmQ7uTGAjWNuAn5C6-RW8TleGh-BAArqBCqjSH5ccsVQLuftQUgUNHikVEW7UHobgCuDcOBmSrIQT7mmrIK2KqIE2VUvjWMCBXQpc4ZRdBJ0E9a5IYBvcV1QQ50AkkwICHL1gGH4nE5vukFsD_A4Vzp6rmBL5NiwCaTWbhwWPOQHSUQbCM8swG3LPNYWph5x9WR0ekoU1hpQwpEHyKBhNN_qSLXyB-8mJRsapgo780iRxhoSD9ZkISQ0U-sg8nElTgmYMXbelPmcCpF1uS2RfiqIBc1TbluAdsKxIEkqHYpAmDxXPcVVNhA6Rt7mtSkGMPqBKlz00hoMVFoViga4KBn6hw7UFgKueGC75ZZ_Hskp2kdUyz0kePxfmNUpVHRKHfTqDdV34PBxBsquQUoYnPN6qCWQa2OUEPr00i_yyTNkPb2v-0kPK3aeS4I_f-VyvWOsVa71irVes9Yr1J1ix1i2Xdctl3XL5Q7Rcdh703oR6LvsHoumyvSW6Lg3RdTloirbL7p7ou2yLvkuzsSs6L03RednfFa2X7d2V3su-6L08OyibL_ui-9LYE-2XZ03Rf2luiQbMrmjAbIkGzMG-6MA090ULplH2YJoHogmzI5owja2maMPs7a_fyzzwvcz2ynuZ9NYuj5vXEuNbDs1fxnz6RcUGm1K6CjEjHIdlvP_z5_-4gANXuyn52w9W-GdR4M-rjlbOWuKV-799--pxtQX4PMSTyLx-EeR4UhlfbNLG7td5mM8Qv-GmT9vAMSN_2gzjp5Nk8-lm5v-4SZJstrOrlBNMkXA3wxkedfJNzsTraUb7q_8q9lB_w59y-Oae98yBNOw9ay_y6Xu-wWEM01Pz7T2jWa2nqz_s_e2R1ntWHQmgAUAFn0az3tj6C3tPY01cd_HZrzca5dA2Lh189uq7B-XQDi5dMVTN2sWlxIe2q1l7uNT50NZ-ObSPSw2f3fpBsxx6hkuPD21VQwe4tPDZqR_slUONLVybfGynwt8gAWR8tut7FYEGCdDmY41n1RhJYODTrO9VJBokgs3HFvhIBpUUUm9uV2MkxCEfa-xUYyRFT4xV4jdIjONbYyTH0epYk-Q4wWervrdbjZEcAz62U8nbJDlO-dh2JUeT5OiIsYqXJsnxko81KzmaJEefjzUqvTRJjqEYE3TLIEPKyAu_EC_kFusRLbHRPC93QFx_FDu2ER4K7RAWWwy6i1MHp8X4nz__J2FVYpYH7Mzn-4dpD_0YOAOxYInecEqvCN_debl5s8eYnJq6xI06684zvjlgKjbn05zUT1Gs8J3KyAd8p_dkzrDI5vMIovAU8Ci4ede7wZCWknFILYtPyMehburC6s3nfRPLt6e8OirfQ2JW8_ofyCGrczd4QySMUR6JN5xQwHfz_If5I7FVY4Z0vzS9ztoBRrmKJkkcl9sismAW8qi_8z61CYgkDZeaMauyNzBnu848sY3lXflFCXrrTBNhoRWZY1RLs2QSTkPa3lbWxVhARrU3VMuJJYaSZkgu86t9ftDeqdNXZNLIHxPxe95Bi1fgvCLNQf364w-UdSNqJS3tVvlX3-3eV5HE8yharkk-4_3IbWOVO21u2Yzk89M0S94i29P3g-rs-mfuuCF_Yx5d_22DK6CgbE4TcnjKGOtazs9bfDlEJChvUa3Oi4Wxhe9xLxBmw63LpKiIIjxCXgWX2_hvSmZ6jikrvzqTCqIrhhlK-u_408K5T9_toaxRTmTAP73-mFGxkQuvapfFxjsKluL67wUySbUvIgdHWDrJ3uJLOMHCR4S0MAgcA0HxKIzEnDyYYeW9mSp2BZFSUd6ggicpkjnXLiopmlnt61tOKaL7mN3oAZ7M3bbcbsCDiL77MFndKbq8O-pXfA0OMM4SpAYMUDHzu3Ui173IdS9y3Ytc9yLXvcj_H73IP9f2d8PpH6r6SU866treUOlY7kDWzJen7eP19vf19vf19vc_2_b3xUb3e_u12w_p1-pKlx0rek9xcdL1HFvqdhUTJabX7WpMMVlP0pHVGc2TPNfBQZU83dK6rC05TNO7mKRKKsGM4rZlYgqfrCqOIWlmF_VCl-meS_htgJ94CutYnmNKuqYQuq6FNHzicVQE6Ci25QkmRrFMyEDediwAM1dxHM21NJwugylmTzrWBExb0T2NlXB0y1QMMGs5quJajkaVKApSwLaPsWKtiI9sDiIG2MKS4rCuhBUBWCWxn1-MEYMaQLtdzrrHobjgXU-XqH5DJWXgtqRLBMSvba1rmeDMZceWYYAKF5Aj1JlkHGquRvcts4OqlEk9pQ2UgDetQ50oESKhZUlwLAFEMl2YBDw4ruYw2QO6QVcAu5Yn5CENHFkOffNgFGu60KXMFQcFMcWwAQ1EghX6UiAYoC8FYporhIPVFM-mI-lU4tZXuNY5i1CBobgufZWBvEbrKgadEAdg2SUTM0nQBTUyHNhQcFMmdyLShiW8hMoB1DliOlF1uljWYQvO64qbwssIoBQTvLvkNlCU44hrYnQUm5LrgSB3QE3xTkHTIzW7SiWvc6yZ7Ajc9YCNYHUJfkLq5lfwuiPLlMGBRn_ZQgFU6Y9Ljliqhdzd1BRBg0dKRYQb9RhDcAVwLqkmyUo44Z66AtKKiBpoUznxOBZwoJcCVzhdB0GnQb0rEugS9xUFxDkQyWSBAEcvGIbfucSmY3JrgF_T4uw5Vk8j34ZFIK2n87DgMSdAbKsrPLMMM5N7bk-Y2uTso5iVycIeQ0owaZA8CkY7ktqaLnyB-4nqkXGqoCO_7JE4JuFgbSZCkr502kbm4Uz2NGhGOjrStTZnAqQdbstRzKOoyw4VXdfgHbCsSBKWTTFIk03LOHQUT4QOkde5rUpBpDagSpeVJbO7wqJQLNBVwcAvjuDaAsBRVMkhv2zzWFbILq5S5jnN4OfCvFKpKpk4bNMZrOvA5-EIml6FlIWCm-KtmkCmgV1U-PTSLPLL-99JvdpY6Xh8H6D6ifI0GNNV-dddXpdQ9hX91RO2jeokvRIzaQ3hr1z8c5qR8hkLOuJ6u_bhA4bOUIPNfPFVquri9SyMk6zWan74X9sNENY)
+* TP Attaque par occurence - [Énoncé](https://notebook.basthon.fr/?extensions=linenumbers%2Cromd%2Csequenced&ipynb=eJztWuty28YVfpUtPa2kRKJEylZi-pKBRBgGLUiQBJIiTY-9Apfi2iCA4KJYjjOT1-i_TH-0UX_0JfgmeZJ-ZxfgRXIU22lm2pkqoYk9OHvu5-zZXX5f8UUQpJXG8-8rE5HxIc94pfH9D-sK_jK7jEWlUZnw5M0w-i6srFfSKE98gj0cyguWZpeBeDSoxHw4lOF5o74Vv31wxv0350mUh8MNPwqipBHzmF_y78YyfjCosMdsED4cb8_mahx_HOGBZ2JQecweSuYHPE3xdsTZiG_IcBRhKk8k3xjL4VCEeJUlucbelI_ZX8KzNH7AjgVk_TYXTIZZEg1zP5MXonz5aXQfbo63lazxY7Yn2Ej6YykSJtIMM2XGYliCTf-ZJYIFOUsxCARLZSbYQ87GiRiB1DjL4rSxuRlGmTiLojfVM55m4yisjpJNYiEn5yxN_EcrtyFCYJGlm2IkhuJevfa1f3_r66_u3t8Z1XaqcXi-MrPkWZQMRdJgWw_YUKZxwC8bMgxkKB4wWOVchnjF7sFDbCzk-ThrbMNdpH6QYfau5jiobEJ1_rjKHp4ljwchw98gPJHsIspTFqzwC_GORfmFSDKGZ5_lIeM5WSFOovOETyZinfkRvlgrjy8zmKxUal3TSCQc9I4NBUtE6EdwFHAACvBJ2Vl-npa8OyKXQQBcP9BzyMofbV0fjpEiJGWYyNgl88ewAnj5c29OfyKVJGQZ5uwsyrMoZIPKYX6RyASWKSPnRuCMogCmvjUkETmbMT0iUR6TFSs_rH9qkt1he2M5GiViIsKMpZeT6VWmzMc22L6AQvOXkyiMeBCP-RlwCGUQDkLgnOUZmRo6Zwm_4DKAn7hCUKFMmk-vCkIJOXMi0pSfC3hEMs5AbHpVMMJD6fFbOTOBkBjyOON4C-RZYBCr1zC5D1LTq-og_AyT3CwdmeDBzaLD3-WJ0PXmhvdixJ0MPqqgmG9F4ktYr8bKgqDMOtcpzeUFKRqLBJrcYtBUBIiugOZK8I9VzN1qyHWyJDIk5BIkgBFwaAI3DJd8X9VCyVS82wiU9YnjJU0AIiBIxxi5NkxAMc5lyjK4XiFXr3uAjIB3w0pjxINUXHOIHw3Fcnx64i0qHny6oPQgzAj6shizR0gp-q9rs-N2t2sbNuucdnbb7pNT5rUPO6zTPjw6OXVsduja7KDt4t8T_GPraaTcHWYow8DAjtFqn-y1903YloykTKeKcSoncSBHkiQIJLR4yctJJIKxu9c0n1hP7dazfefg0D06PvHane5pr1_ycIkKqgTFcCCyLFGlLElEGkfhEPxKMBvyEMVwiUfJs9Baq31ycPzE7hlHp_vPurtuu7_3tOMcelaraZY8tamGYjaNKqIkZ3Hl7jFHAVcO5wn3s-nPxD0KffKrmju3_PSqtPyMXGn7sFCQJz50TBeJxTxZHAbz4qirPNJ0FCWl4jJkS85tEGGqbnew9magDWEvEi7hDHDWk5BoVGqobMz5LFeMVV6tvlvTlOSoYFaVqcJaXWuw-Z9GKln6Y-TnWJCp4girr0SKrcpwKN6uqeDnpeDLIVo4kLNln1XnxBUNmO8aggKvapprc-xFoQ5DlmcS86jqZgUhFaBoScikC1J9II4WZNBIS95cxn2uiL-Yz_gVefhrLG26FCxE0Txu1DrIqZRlqirNAuv1otlUyS7p3gy065Avb8ivZwvUlcaigHNzhCsUKDFPbw2WCcohym2ebej2i_ISCepnOSf_f46MOj3IUiOKfrGQXXPhqW5nq0vhv7YMnSGvEUFUSvFW-DkJ9RJ5F2aVRpgHwXoF3ojzjNruF5--AkLKCyhPZkC6h6rML0Q2JJ-tOMXS9Kpls2enLds8tJndtZ-Ydot5qLb2M2Y_O-jQ96nZOzVPn7Hmit3rPemc2q9uaQDKZegVFTNd3qikUbEry9yrKlngWNC6g8YtWFwxYxDyp1dDKtxIENUq6KVLZcmiMv5Mmd-5Un2OLyoZPyd45SwR_E0cwdyVFx_TteGP7WVJ8CU0hBJKK1XWwxzD6vzvf6j_qc_bH0oTOREJ7YJ-JQgX2p5rofOhrnWx41HJjQUuY6jkodDtz_RfuiqowBMjFVtffLFHuwxa_JNIhVNyo8qqKP3miy-UzFQxVCuUqSxJWeT7eUJ7EDyvQsKYhKAAWdMN1kIfUBRqcVMrBDDRIro80TsKciFAxfLDw3OQGSU8nP6D06KghFQdGq1DtAtalHjWbnDIpRTdU0XRp45c6K1n8IH-s8o-rwG82YT_17eAn9nd7dMkGGTJ8SWtOQjUnm-ts__Y_y8-o_X6rZZrvsT_sW3XhxucT-i6VpG-iOyUEBCWE1TA1M-Dxdbpzu2t2QfaouXWbIbwEa2ZHdLWc6LLcrCinK58viT0Yg5mYqEduxYpRfc1k-Tmmy9ZrQhd3VbcrDvXC02qXS_J6ygZ52K1vlP6QXca1zvAF-vweGNQWb8pxIu1P6gF6dA5jjoJWqj_9IDXMfULH2hCVE1XB0BlVcemFhRmdR3TGvDWq1evBqFr9VjHcg-sJh56ttdyej2r32QOuhODWX124LiW7THCc-ymh68jx3ZNo8e6jscMtwekI-eI5gzCrtkHikI-sry2Y_R7bBcD124S_RamH9oWQ1_k9R3XsIhczzSa6JAUKZqITZtpayEG4S4RA_uWZ2Iya1qeZzRNA4-L06z-gdMx9Jyu5doGK-bRq77VhrCmd2Q1Tc84BVGr6WBut2M9ZUvquxZJ2IZYrAXdeg7rO6Dq9LsWs5oaRgIamNrrKdFtNUsp3rNdp0mM26yN147r0CQ1bhk9sw_JmqxjttvgohRUBF3mtI-NpkHvzf4T23OYc2B1QRLz--axS5yIkLayoyV2MMXpN-ESyOA1DY_t2iC319OTm6at9SEL7JteF4NBaLjalrvKcDAQs9otzAYhLYoFESDAkUWBQES0Q1qW3aJvsqmjvG8pqysRYYK21Wx6jqGixuhZbXogCSByk1zMHM0X3MhxEMPCy10KJ2LdNnWUgF7LMvoanbh6PdvZhS-UrEthiiijCYWakL1JYQNDeZ4ek6CDsO80bTBUAWhY9il42mTmplXq63WMPtuHdAegRnNdB3FC5lYjRN2-2d-FBAbI9SzMKuJxIRALs1C49w1L81CZUjJRTu0AhFCA5M5Rn3QlmghP1wJrS2cNrGkd2ooKJHALhUuaTQ9JZ8C8Sxq4jooVC8zVJNLJBANFXguMuGuSmF5feQPy9k0lnmceGBTb8Ai0tV2VFirn9JSW2dORWaRZX0XugXZ1X4nftPq75GGboST0CUgRBaftO13D1bGg4uTIJueUSUdxeUDq9IkG6zKdkjY4dFF5lJAHBizj7O-7RlcJAdae8uUgVFnUY8eW6xqIDnhWFwmzRTlIyH2zfexZtk4dYu8qXxWKOF3MKkJ21-n3lkTUhgW5MhnUYB-hrSd41pHjUVx2VS5b5JemVdQ5o62etXudwlS7JGGXnuBdDzGPQDDcMqXM_pHKtxKBXAO_HCGmF7AoLouS_Zm7vV9ryG924OL_u8H_mt3g9tJuML52HDHbDPnXnKq2gLdvj9bZiNpZCQzpy6IZ_OXHv47R3ZQhpfZcLONngeB52WCkrKGPOf_0_MVqeTV0LhETeXUsUsSMP96kC7-XqUyx7xzKTU7Xg8BIN-oy3BhGmxubCf9ukzTZ3EsuY8UwRkO-KScIunRTCfFylNC92zf6bu2Rijd13vOeHUMb9p7tzfvt9-pQ2YfrqRd6zwirsbH8x95fhzTes_KbJtQw0cSnVq_Wtv7M3hOsjvEJPl9Va7UCtI3hMT471Xv3C9BdDD0NKrHuYWgo0HaJtYPhvgJtfVWAvsLQxude9X69AH2NYVuBtkrQfQwP8blbvb9TgGpbGB8o2N2Sfo0UaOKzXd0pGdRIgT0Fq31dwkgDB596dadkUSMVXAWb0yMdLDJItb5dwkiJXQWr3S1hpEVHw0r1a6TG02sw0uPJMqxOehzhs1XduVfCSI-egt0t9a2THqcKtl3qUSc9WhpWylInPZ4pWL3Uo056dBWsVtqlTnr0NUzzLZIMJSPNeKaPAeabFdqCBWiq9ZHz9Epf6yE9TLo90ie6J_PHYzxm_i8__p2omiFLBTvj6m6J7lZ90BR6N6Nb9ZgOJt7dOFKZ3T9RUFPTXquykzxRJ7EjfWlLODGPsZlVt1ioB-o6cJgzrAdpHkAVVQJWxOyEaZ2hLEW-pBXkFv3UrNnevzxv-RBicWajds_FwQew6tOfaVlawl1XS5MMsX0eiuIc_HWefpuv6JPxCcr9AnqV7QlAlYmwrwmLM-hETKTK-hunOHXMiGJ5fW1cNkANiNtV1taXB--KW3Q68CJEuGlJ8RBb6kk0lCNJJ7HFAQhWkUHlFW349TpDlVNS3Pzm3gu871bp9xNxwH1i_oHjL336po4tUnCfXn1LpTeglX3hhuD3nij9QXvW6x4rbjeuOY704zE89BYln348UmXTH1X0SnVYF0x_WlcGyKikE0KKcPGxuKXquaHWRKSD-RZtT55d87iOQhUP2nd4fxFlJWckilTnJcVl7-xwhU6tigOCKjMyYq7BLIvy1-pc6ZzTrz-ofhSIDPRH06uE2o5Uh9Ze0Xa8o7TJpn_LUFPKc9kUEmERJafrn2mIeaBoleEVRAfSY0UGGicVE6zBM1R9GUOWRaMzkaoXiHJl4mGUE2Z5q7pYXHRHmMzsgHBWsVscd6p0ogvz4fLlxuK11I2AS_0kQlFAxFEbs_5HBOCL9SWOb0QSiiCNhU-j4vc3L0M-IYruJf0uBQv0qowvNSYdzajmB7oAI1YYgBUz9Hi78gNkDc9GUYJorDTuzgcvYd8oqTTqP_wbvCG7SA) - [Corrigé](https://notebook.basthon.fr/?ipynb=eJztXOty20aWfpVepnZtZ2RKpGzZVhJPgUQLAk1cCAKUyNBlQyQkISFBBgA9tsepmtfYf1P7Y3e8P_Yl9CbzJPud0wAvkuKxPJmqzQ6V0AAafe6nTzc-NPnHyiiaTLLK4fd_rEyjPByHeVg5_OPPO9z-Kn83jyqHlWmY_jie_SGp7FSy2SIdUdu34_iNyPJ3k-i7YWUejsdxcnFY35u__eYsHP14kc4WyfjhaDaZpYfzcB6-C_9wGc-_GVbEczFMvr3cX9KqPqPLGU7CPBpWnotvYzGahFmGu-ehOA8fxsn5DKRhGocPL-PxOEpwK08Xqvdu_Fz8W3KWzb8RXgRdf1pEIk7ydDZejPL4TVTevBvfb3cv91nX-XPRjMR5PLqMo1REWQ7KOBdzeEJc_XeeRmKyEBkuJpHI4jwS34biMo3Oweoyz-fZ4e5uMsujs9nsx-pZmOWXs6R6nu6SiHh6IbJ09N29T3WEwlGe7Ubn0Th6XK89HT3be_rk0bOD89pBdZ5c3Ft68myWjqP0UOx9I8ZxNp-E7w7jZBIn0TcCXrmIE9wSjxEhcRnFF5f54T7CReZPclA3lMRhZRemh8-r4tuz9PkwEfgbJt1YvJktMjG5F76J3ovZ4k2U5gLnI7FIRLggL8zT2UUaTqfRjhjNcBCtxfxdDpeVRu0oHmmMAL0X40ikUTKaIVDog6YJPpk4W1xkpexetIgnE_QdTRQNefmzvTtCYOIoIWNElIt3YnQJL0DWaBXNqz-TSTF0GS_E2WyRzxIxrDiLN2mcwjNl5txInPPZBK7-ZEoic3bndIqB8py8WPl5566D7CvRvIzPz9NoGiW5yN5Nrz7m7D7xULQjGLS6OZ0ls3AyvwzP0Kfo0pylaYQhgKjiPxCcLXLyOxyQp-GbMJ4gaKHqTXlNbrj6WHBNKbLTKMvCiwjhiUUowPnqYyEVJ2X4P61GhPwYh_M8xF10XmYJifoB_h-B1dXH6jD5Av_crCN5FE5uVqDw_SKNVPG5Eco5kjCefFZ1kW-jdBTDezVRVgd268qmbBG_IUPnUQpLPuHQ0Qw3RBZNkHAT4hBDi3l003875ECMkiSMQQnWkxAGgHa8Ef-q0iXOovcPJ-x0EvSOCNBxQgKnc4y3cQqO80WciRwR587V644n23FvXDk8DydZdC0O0DzazFE_eouqh1Cu2TpMcmp9VVyL7zCs6L8TU3jByYmpmaJ32msE7tGp8AOnJ3qB0-meWqZwXFPYgYt_u_jHVGRk3FdCY8fAr5bWCrrNoC3hUnISpx4X5CyezifxeUwaTGJY8SosiUgFrdHU5ZFxbLZetC3bcTte1w96J6f9QSnDJS6oFJS6kyjPUy5nGEfZfJaMIa9sFuMwQUHckFHKLKxWZndt78jsa53T9ouThhsMmsc9y_GNli5LmcpV42hJRlUxpmCFHO7LEEWcAx6m4Si_-gtJnyUjiivTrjx_9bH0_JJd6fukMDBMR7AxW2c2D9P1y8mqQKpKj9F5PktLw-NEbAT3kBhThfsK828O3lD2TRrGCAYkKyKML6owVC1WcjYLxf2wWn3_QHGKzwth1TjjXvcfHIrVn-pUihxdYlheRuSq-QwzMOqduB8n4-jtA07-sFS8SFEkcFpELxSbAauuODMD-O5aB26-rxg-WPVe18hJxCKPQUeVNi8YcXZiTUL-XFPpliRa00F1olBC52ipTNnze2b9ctX_F7QJf8DMpqrAWgKtUoanwZCKV84T4TKnflgf1FykS743c-x6y--uaa9oIxSUw3X1Vq5I7lGGzMPsk1kyRR1EeV3kD9XaiwYkRuYoX4Rqoru7hmpckJ_OKe2jtWEVcZ0eJlSf8_sbWf9gs3XJ9gGxQ4GM3kajBan0CsMtySuH-_WdCuIwX-Rqva3Oy7KaQZFwCjpih-u7F8oE5bDptNvSkKJrdi3H1kHrBF3RdYJjzfSlCGwpGo6NfzX8I1nPJJwq-WMoVPn55d1nYXjuDQJCoUHtSXjOWZv14M1y1iunx9ctU7w4bZnSMYV5Yh5JsyV8WGS-EOYLu0fHU9k_lacvhH7P7PePeqfm681FCM-fvAIpJ8TXVFZVoaXiSmW3LLivqxQUL6IZEMtIng7HNOtCzauPY5o9MFB5maLmTx6ty1oxWlrw986Va39rqzPx1bU_yse7zKpf4M7tvLqdV7fz6nZe_S3Nq7fNqo_uMql-SZ2kabVrtqXdlEL60rNlW-iYaWVXyK6r0dG0j0zb7Arrnjw68jTzsybWSh5ekM6VM-j443wGkysvPwcT4LkjTye_Q3FGzvMA4MKWLHBZXf39hh6o66vnacqXeBqlhLH9wopi_Tl6A4yY3IaJrD9Lc5ajxOcCtSyJ1IP11f-o4cELieic1wpff90kDIumv3TGa4T0RqnhVcfvv_6adaahww_ZOS95MjEbjRYpIVw4vw8N56QEZe4D9ei-NhMW1Sq6aRXKHPEivmGq8CoKIZqKAhwmF2BznobJ1X-FVBlZSX72p2JMGNu6xssJN4RebGiTq8OIIJ5IAZvl6qhYrFXFl6EKNwGd1VqJcuH_HqzwhSubNhHBHxshL3mtmsDt-70d8av9__ILlh1_a7mxmuP-sUuO2-f3O6w47mPgIqcz6oCsnKL2ZaPFZH3l8NUnliW3LAk2lyXLDp-xLDETgjCnqhpP7nHEOeAbGq8PvTxaW4pcS5Ni7bHU5Oad34lakbdqWr1Zbq7Xl0zFPaaQo1JcRPfrB2UQ1Fx7ff3zcgfhPhxWdm4q8fLBbdNw7S7TsCYOyYaGOjRx2BsmujpIdThS9wx1dawOJg5Ph0lLXb1Qh7Y6WIrAVgcHh_1h4uJwMEw6qtFThy4O9WHiq6sAh8fDpIfDo2FyouhO1aGvWA_U4Vd5Vu7RGxB-h7I2t9EJbs_pwfaWp2Wer_jVSTljxRkq8mrOAtkhUvL169cw2eiLnuHaho6Tvum3rH7fGOjCwnpGE8ZA2JZrmL6gfpap-zh0LNOVWl-cWL7Q3D46dawO0cAfcoAu3Llj-IGlDfqigQvX1Il_C-SOaQispPyB5WoGsetLTceailkRIR7JpKmUQMyJGcS3fAlioRu-r-lSw-k6mTGwrZ6maE4M19REQUe3BkYAZaXfMXTpa6dgaugWaE96xrHYMN81SMMAaokWbOtbYmCBqzU4MYShqzZSUANpv8-qm0zFhvdN19JJcCAC3LZci4j4uqX15QCa6aIngwBS2EBm6Aor8DRdo_tycGT6lrBs4wQsQT-QnkuSiJHysqU0tkBiDXSEBDr4uuaLhgl2zb4i1qWp7CEPtKV_gothornKlw12HBwkjKAFajBSqhhQAQp0DEoEYqIC0jLMFh3JpxZH32Cvs4pwQWDoum9pnDVa3wjohDSAyjqFWFhKLqRR4KCGgZsNSicSHUiVJeDXMrSB6k5S_b5pNRAL1nUjTZFlRFCYCd11Shs4yvfVNSmKgWjpJgRyAmqGeQqZJrlZN0p7_Z42EG1oZ4Mb0boW8oTczVfIurYcNKCBBnZ9A1RFPq4lYuEWSveBZigZPFJKIRzUHpqQCtDc6gzIVuKJ9HQNiDbUqIE3DcdkLtDALQwueeo-Bp0G925Y4FqcKwaEMxHZJCGA2SuFkXc6qekPOBrQdyBZPV_aGuU2IgJrTZeHBY85RdKSfZWZxTAbcObaKtQDVl83Bg2KsClQEgbUSBmFoLWtE81VucB50jEpOOWgo7y0yZwB8RAnQg1JExJOUHlYSVuDZ6x229VOWAmI9jmWqL40ivrCM1xXQ3YgsqpIyBaNQeo8kIHnG6YaOiTe5VgVhlgnoCpStmEN-hsqKseCXTkY-KKN1FYEvtGxfMrLEx7LBsVFN4o6pwV8rsJrFa5qkIYndIbo-sh5JILmlkNKDjo83soOFBrEpYOcXutFeVmU7Lsjk7_0nHHzwSL6PPDycxbk_yDscjthbSes7YS1nbC2E9ZvYMLaoiZb1GSLmvxqqMmddgQQavLkmYJN9vcUblJTuMmzugJOHh8o5GRfISf12mOFndQVdvLksQJP9h9voCdPFHry9FkBnzxR-EntQAEoT-sKQanvKQjlsYJQ9hSE8uyJwlDqTxSIUitQlPozBaM8UjBKba-ugJSDJ9uXI3d8ObK_8XJkfm2rxfLdwOhaPvMbkU-_LdgR51StYvSIR3Ex3P_6p3-_RP6WWxr5FYTIw7NJFC5KTCoTh-q99798__J-uQ_3IsazxKJ6GWV41hhd7tLu6ldZnE0xfOPdkPZio0f2sB4nD8ez3Ye7afiHXbJkt5m-m7PAOertbjzFw0q2y0q8Ok9pk_Pv1Ubm73iTBe-w-SA8WCM-iOaqnH7gXQYjhJ7gsw-Ceh0-3PwTH663HH4Q5ZEIaiCU-NTq1drev4oP1FbHdRefJ9VarWjax6WHz0H18bOi6REufdVU9nqMS42b9steB7hsc9Pek6LpCS5NfB5Xn9WLpqe4DLhpr2x6hksHn0fVZwdFU20P1za3PSr518gAHZ_96kEpoEYGNLmt9rRsIwssfOrVg1JEjUxwuW3Fj2wwyCHV-n7ZRkY0uK32qGwjK3qqrTS_RmYcX2sjO4422-pkRwefverB47KN7Ohz26PS3jrZccpt-6UddbKjpdpKXepkxwtuq5d21MmOE26rlX6pkx0D1abkFoMMJSPLw1y9FVtNRzTDThZZsQ3h6qPaNo3hIWmbrnrP312dejjNR3_9038SV5mILBJnIW_ipY3sI_CM1Hyl0N05vad7f-MN43KjLyU14by1quguUn5Df652yFOfeTjHWoW3C6Me8Hbr8UJgjs0WE5jCJeBetHzhuiNQlmajmECHT9jHVMulXfn68baOxStMXhwVLwPRq371F9SQzb47DGnECVZH6jUjHPDDIvtpcU_tl5ii3K91r4pmhFZ20XiWJMXehDSaxjzqb7zUrINiNo_X4JRN22vos18VgdpL8r74tgK9-qWOiNCGzQkWS9PZOD6PaY9ZsbTFBDKsvKalnJpiqGjGlDJ_E6mH7EdV-p7KfBKOSPgtL4LVe2hekGaQfvXxJ6q6EwKD1raM_L0vWD8bz9kiOltEZ4vobBGdLaLzz4Ho_La2AVt2o2W0Oz3tuOmi3CFGfd10XhyddrfbgLfbgLfbgH9r24BXG35v_RLNXRCztuyKY9luSB8n3cDTtW5XOlhhBt2uKaSDZUsbRV1QPy3wPRwMLWjzVl7NE2a7i06GZhDNMEFBQxfubGARpZlOl3cBtwOf-Osg7wVSnNqB52htUxK7ro0q3AuYFRF6UrcDpcQwaRIziNc9G8TCl55n-raJ03Uy6TS0Y1PRWLIdmKKgo1uOdKGs7RnStz2TJgmsR0FrHcuW2DAfxRxCXKgldNjW1YSjgavmWLStWbWRgiZIu11WPWAqNrwbtLEghGCs93Bba2tExNe62bUdaOaLY9t1IYUNZIZtzIwd0zfpvu2cYlEqtIakZRToHbvTJknESHlZUxprINEcHyGBDp5veqIZgN2LriL27UDZQx44sj0LF8PEbCtfNtlxcJCQrg5qMFKqSKgABei7UejmK-MQNRnodCSfahx9yV5nFeECV_o-7eimrDG70qUT0gAq-xRioSm5kEaBgxoSN5uUTiTatVWWgB9Wlo7qTlK9bqA1EQvWdSNNkWVEUJgJ3X1KGzjK89Q1KYrFgOYHntqGjlwL-pAZkJt9WdrrHZuOOIJ2DXAj2raGPCF38xWy7sh2mtDApC_4S1AV-biWiIVbKN0dUyoZPFJKIRzUYzQhFaC5ZjhkK_FEerYlREs1auBN2QuYCzRoFwaXPH0Pg86EezcsaGucKxLCmYhssiGA2SuFkXc-qek5HA3o69isnmc3TMptRATWBm0eFjzmFIlud1VmFsPM4cxtqFA7rL4vnSZFOBAoCQ41UkYhaEeaZbZVLnCeGAEFpxx0lJcNMschHnj0UEMygAQLlYeVbJjwjHZ01MbijZSAaI9jOUx4FHVFR7bbJrIj6BdFwtZpDFJnx8bCSgZq6JD4NseqMESzQFWkbFNzuhsqKseCXTkY-OIIqa0IPGloHuWlxWNZUlx8WdQ50-VzFV6tcFWTNLToDNH1kPNIBLNdDinbMXi8lR0oNIiLgZxe60V5-Svtr7wOFRWz7DXEiNCVcD5PZ2_jaUg_EVIVV39i2CzmTfOTqz_v8KotJyyZOmSYvkejKMv4_JDB-FpVyLeYvjH5L6EmhXwxBqVAI9x6M8tLoVGC9Qq9giu-yb9cUNGL0OK1U1VoOclVzQIrvh94QXkR0s97EGZZdBTgf371MaVXHZnCtJrFq473tObIr_4jnyVZ-dWIDBrlGSOa6nc4ohVCpazFbIvlfSSye_FE9cmi6dkkWnZVKwJyah6l05jfP8wW7F1EjHqWa_p1QFPtXkqXfsCKiJdrxTcOGMKjnz8Yb35ZdH1l9De-dokEGKWzyWQLfW2hry30tYW-ttDXFvr6Z4C-vJMGQ19HXTcYyJZD0Jf94rR5vIW-ttDXFvr6_wV9PfoS7KtXYl8uYV_2EvuyRe9W7Msx8UhWYl82oTI2Pzarp-oC-7I00yYQY4l9uSDvBFK0nMCzl9iXgzLcWce-XCdQShAaoh49Xc9xl9iXw9jXGpm0ewr7sulBk7AvfYl92ba0oKxD2JfjmadL7Kt5jBlrw3xUcwixCPtyFfZlM_alvtKv2hj7apbYl1NiXzBcYV8QjLXkCvvia9fsOjY088WxY1mQwgYywzYexBumb9J9x24x9tWTTfU0bjuNFfZlr2NfINFshX05jH3pAdj1u4rYd9axL8drbmBfOjuOsS_LBTUYKVXod4HWsC-nwL5cGbgKjboN-3ICq8C-bIV9WXRCGkDlTezLctewL52xL3S1HJUltBzAOqfEvlzGvnTEorPCvoo0RZYRQWGmew37ckvsy1bYl15gX6eQGZCbfVna6x2bNmNfvVuxL2TdkWPr0EBhX-417IsTUS-xL0uzTalkKOyrENJaYV8WNNcMm2ztlNgXREt7iX11AuZSYl89xr6Yp-85hH1ZcsOCtsa5IiF8iX05EMDslcJNBWRJz-ZoQF-FUMO6nkm5fQ370ksS1-mqzCyGmc2Z21OhtgvsizFpwr4QRmqkjGLsq2m2VS6sA0vFoKO87JE5NmNfzRL7goQmY1_QoWf2CuyryUpAtMexHCY8irqiQdgXsgORVUXCcRn7QmfbsRqb2BfHqjBEa3YU9kV5pNmb2JdbYl_lYFjHvuwC-6K8bPJYlhQXhmA5zawC-yL_a4WrdNKwSWcdwr4IubQUqkW549gK-yo7UGgQF8K-1nr9Mvb1cmcD8fgxwupnks2jEV0VP_D6qqBy39EPn4p9rE7m71RPmkN4w2d4QT3m3GMlR13vV37-GU1nWINNQ_VrKuXFq2mczNLKYf3n_wUtF7wB)
 * Présentation Vigenère
 * Bonus : exemple cassage vigenère : [Notebook](https://notebook.basthon.fr/?extensions=sequenced%2Clinenumbers&kernel=python3&ipynb=eJztWltv28iS_itcBQe2JrKP7MRxYowHoKim1DJv4lVSHBg0RcdMKFLDi-dkBnnaP7JYLHDGs8Cel8UCi92noz-2Vd2kRMmXyTws9mUzmJDqrqqu-rqqurqYX1pBGMd56-z9L61FWPhzv_BbZ7987bDxq-LLMmydtRZ-9nme_pS0Oq08LbMAx14Ikp_noTAPBTf6GCarX7PwMnnxQhDbgnQb3dxkYSbEoVCEfynC1tfOlvxWkZV5Ec5bZ_ASgtQgS-MYf9_4cR7uLB-k83B76aBeoEz4AoJ_Fwa4XDWzVitErS6TeXgj_FiGV_Mwv1r4n8o8KOMw32e8ncKPYPGr6zgNzk_aZ5eJAH9eCFm4WMZ-EILYXAj8zA8KkJYLfhCESVGGeUfIy-UyixacJMyXQA3PQoh9YZkmQVH6RZQmG4HJXRqFoDTq6UcJUzMOiwLFbtTi9BXFuXDZgv_YUHTeRTlFBOszY9PFskAh-VrKvBQWYZ77HwH5zE_ymzRbhJybA3XOn4dx-lOY7bf5FFAJgRBVYFYIsBVvhHenwvfnQprN94M2vh0dHzcIGpq-PIe3bJ9THrw6bm-owhgEsQX2L1urf_z7v1y2OvgiVM-___Nlq_2k1MuWWCPwmLD7Wsiv9cu_1i-_PS-WPCf232ohf3teCH1OyL_XQv7jeSH6c0L-uxbyX_XLfz4vzXlE2jlOAOtfL1s7nFus0jZrHp4x100TASi44y39fO155SYwhLjclhsJB-AtDV96eX605VmNuPuhK_jJXIj-1IzF82qwmuRqvj84-iD8A6oqPLCEU7w8Z3Ootv8pLQsecDw6hSItcxatl63GUkC9CXAuMwuLMksqkZhCeBK5q5LKfhVlnSCG_7MvgMYmc4Q3NyEEP8Y2BGfgxxiOYQJhBjkBEgILe18AVsgg2W5-gclKOJeXQMx265zAstv53t5O3FYMDTw-C1XQxuH75E9xmOBb-0P74M3J1iZw3R8AybMouESt_37Q-dzecY1vYTpociVrF1jDy3g4vpDZwrwA_FkWOmd5ryWyxO6DhRm6mwY2QW4F1OZhlkQwCKBlsEfCnf8RjpLLhBQsIbKfDMw5bH_OefwsW_1WhBxyTlFz1AxZGtyGWY6nBaOCs291j4JW90s88JKCc_xYRhAVhbD6J-GTv_CjnCfkEFaBIc4lXCPH4WXCjIiSmyiBwyJhy11nJWwa0t6FSZRVNCDjjhHspaAMSL8P0IN_5icpo1NCAY4lDMMvOdMC6WB6AcF5iDAyQXPmU8Xt6n6e-XFtf5lEP6KRC9Dc_5g0rE_SCIwO4sp6iG841RZ-wRAM0gCpLxO9ZILnkX_NTrxEWMIWZByegEHHTqZcSErYfhRfm3UTxYwXIjLb0ka4S79gIK13DoQsooQtvIxLOC-bxNdpkoOqnV28YLP2dgG7S8uY034bZlBMBFEYC3mEGwd0ezjiJz4MMeHLMJuXnSepwcIbPwLBe7flIoqjYnX_kPZjFj0uOnlUdE3OZJcgG5Rf-tk8TSALHe6iUMI-QnyghXcsV-d7AIifFWEcPsSsom5CFmQ-oPztkDHcaeHHsE1IBPsHxRG4HIOB5AHoXK8rZ9Hcx1DuxSnkUqDHrA51HiZJrq7qZx9TZBizOXQk8BvmClp6Fy6uM_RUyOAZY0iQB5xQ9aMNj496RyzjF8JNufAhnWBNBuXR4hozLvKPSsz9zZU4Jsjjl0IWZbV-OzPX8er-Ua683EHyFhf-FiRbvMDD0wCPtZ5JFPzNkiAWqzD6ZOnabdeEdfY93xxRawnskLKh0gZqqFeTYn-Lp43bCQV2-JcwKPF8ugIzkqJ1dtppgT3LsuAXBP5eV-U5AOovgA1lwe-eSjXVHBuWM50adCgaiqvL1LRlOjEsSmxdJabrUkJcb9CbTA3bobpLaH8sT6UedYlMDcNmNJ7hOJTTUEujrts3FerJo7FiuZ4-Nr2-TCaGM5zaBpk4vT6xbYlqhjuVNNM1JJw3Z0Z_Zo5HRJ0ArS5brqzBujJRJaanOzP0i-EM1iJ9eUrksWE4rmlbEhVVcyL2DK_nzmjfkehk5JqK5w50eTRQnOlQ6klcZ5eoPeCfgA7KEOyQL4aGLquSbRuz_pTC05po7lhxRkOjLw-QZuY6tE9mRFXBRn2gAi7w23aRfgpr9XWFmPKIDGTbMAagojzSZi71EEtZnzmyrFqj3oQiPn3gmYyIp8sDQx65NtBNp6Ph1JBks2_MXNTZk1WQ6yB2E81QJoYo0YGhGLMRYD2WCBmbEmCrGvaFYWgzOkVsXDKwZcmzAceeq5hajxDPBpzGrqu7iCuMjVyjP7II8noDUyXqdDoZSSpp8g-pCvPTad8EqhFgOaBToqBtMDajnj27kEYjRx5JI8W9ABsGRCKyOZUpt99zTUIUc2Y5QKOqsF-e1gNfUt2mbczXats0ywSMnrGNuOB2pmHL4Dvgh5pMYD9nEw_31r3AdUEbh3g9y5jpDu25pqnLkmEQd2aDH0169GIGfqfoDviqp3rgw1NDpROJwlPxJBn1JKCXa056sF89MvR6gPiIUNBjJGumSWR3Qix3jD4wc0ca2G8YtUy0GfZKcakqybtjlsH04b4LeI6meu27_SmBNV0PfEFxBmRkg33A48l90IfFduIveNDOIYpbXz_sXMi_5cL_Qui1-aU_a9y0WT1zmTwY32oMdNZ5r1zXfHCsx1_8eHnrX6_uCzzcO0IEN252zH9c3Sere6xcmPx4D_JSHOV-XT0XYXBb1TLzPTxGv_BWxA2UXTCaBCzlw0AWYkED_7OyOi2im_xQcNMoiNitYAFL36asxCkzdlKwYgPN4AadYW48OoSKtQ-kYQaVCZoJ51iaQL3I6lBey6_uhTMA4jusbiU_xiwNhHtRMo-CkFdRq78lQTRn2p0JylNT-1RqM6wCJgXkYp2VhYnPb_1Jys5BLI_8qLow1Nd_FFFUuMDtf92AqUBHWezExDM3ugNA2X0ua4gtUjjNGyIPBYOXX7uCfF6phMz0DpYBkgCI4fELB-zqPg7vgAo3c7klwAdyv4C6LGRlBMPLBnOxvgfRsOtgAnY0KoB5BcrhZarAycqK88YGsOllmucRnvD7aBEcZuBM4FMwfYRl9nG33eFG1-X0Ni4J1FppueR4BmB8Y4mw3gxkRUOXDUU426EgwZ3Yz5hwKFBW93kZF1hAV60pvHDEzB4Istp1a1FrfUCNAMqXbMeIuEl5A566-iteOdBL5nthchdlEBfdTvf0tL1BlTJnuImec1gneQRJDNZlls7LiAUsLr27p2gP1HZZyJUA6mu8E_Bo9bFMT_j-XibHGD1CnyGfPYI8V-Imjfil6w7rM8Ds5-raXkQLv3FpfsSM39lW1D1iwGPpd8AI8g7uXoDZKMX7yxIqUp_f5nBVcKVo66K-uoc4aG4IlOY1iD5jaer1qlNZUaI7FBma1lgbLIaFq93ctO5g7Tm7qPG1c9hPlPSmA-4XHHa2eDZERx3hdUc4rYnC4gm6445w0hHecjrclldsW0SeO9fOvFFzJ9w2E511f4Nv0ePpl9_RGzkTxrHU59byGrjKFTVXAUHUx6y1zhXYM6mdvcN2n3PvkT1edKflXeVxDySRhF1K_Rj3tYpnzn2HN1wQUe3SEoX8zD2NO2jF9zEU-LHDkgtCwaQ85hwI6GsGqBkGAHcRATxZI87M1f0SwWA-CtEShHle5lt5pAG9fxMl1en1UBj23uLVrwWPrxMeXaDxbtP96cBaxw03L_z5gDWs-YY9lNMMpihB9KqTaGPHfKseYIpJ6NL3hY8ZFc5yJIwKdietNm3OckfO8lj1C0IR4rQjwP0NAozdkjEXZwW70MHFpeTIs64Z3iUx5vAiu60ouBFIS9G6HNsuaYYphKXcZcgXX91_rIuLGz_AyzrGQMOkw-e_WfzuJ4p5yDtrf-gTRRTs84Zj3UsEOh5POVzs3nc_fHf8ZtMUZE09Tr7TDuSjjf7cRs77qj__5uQDduqqdlxVipwL3cPuRlYSobANb_PDAGcACUn03X4SHRy1txp7fP7P-wlMwlx700GtE-UVXEr5PXTTOMU-QPJ4mq_x26qaorpo4gLyEK713IgKphTboDJ-U-K_P296qT_dRqzqKZAIb_Ofvz_uNiyE87fAJkzzAwwX8XKrrf1pI3Ij9pPwPdueLft2Jb-svsW8__Rhm-ATTn3ejDErwDcqxvYPzNAtvD_X8G71axvAwihvhFdJcN1KOBSUzVneaEMnmJGqdv8inWMdUX-ZgoOwai4flsslfkZqb2Y2qnMoYOyHd01gkejgXKg9eU31_ZuTHaqXG6p1vzjbh5l2bS04pZ-te_Hz32nBz7-l3f4HeuxPdLzn7R2d1z1uVBnD6f8oyiuFNmRrGOPwqi7hqs5SM0xrPesWVR0OjWhCpT6jUnBcAwqPcT8XVI8G0eeXfyyMgP6xQGrqspnG0av6UylHuQ6vxlcO7J1eQf0CFEfd6k8DbzB6vjH6-M2uioy_mVV3Pee88uBq6c68vU235RmV59Q9uy060CR6TpONNoCIf53vN3wl-vDnJhoHt1FepB8zf7EIYW5npeiGy_l-jc1TK1W4sfeHJOughNhpRFS8_o5cE7x8c7ITT3H4_1_j_re_xjV8gOWkw-7b1x34-6j7Bh-vuq_w8froLTyOTo_Z4NHRMXscn-Kj-479On3F-Lqvjtije4KPN1326_gd4zs9YsJOjivRnPLdO0Z5whjedt8yyi4TfXLKdXl1zGXyFV6f8IW67HF0_GHrm-KL-qOiZU2c8cSkZCRa075n9G3VNTyPUGnoDVxRH6um5dG-YQ80cTro0bE31I2JJTlUVe3ehBDTpUMCxOL0wjJlr0-9gWl6dDK0RWKZE1uVpvbgYuyOLa9vDS1vQoa6SizJpBPgxW6qNVFVOqT98QTEw0Lj8ZRankFNVx2bQ2syoUN7SlRxQIZkAmsMJwNQctS3Bu7Q602tycAYexfexcwazyjxjPHEmRkenU2MnjWY2fpUndljYzwdDGbOhWS5ojkcWzMPlJwNJtZ05Iy8SZ9MhsQBoytRdDgkM1jIGVCGy4WkElXCde2BN56qA9rDN4aBCjqDCeKM9gd9cTwe2DOiTge6Kg9H1qRPHXijUs8a0p7hjtcfM-p_e3K19rN1lXf-WFl4mUSbcvH8vK4h-BeMy9YTPY1kz2c1y7IUVr9hpbO-hK7uw8sWSG1Ey1pWLag-Bbe6JJet9XFYFzrsJHzm2Gw35WOsN_4NzhUEJPYcdz_VsOzFitUt7ibPk59q3v6RTzXPWyu8vkzYR6hEdImkiCox-46mm31Dd8w-MTVKTJuYpkg1Vxw4hNh9YrE3q0-AklhIKJpIpNQzSMTfTF0aEtMaOwQmVdEELkO0LKLZxB47VNfskaiK1FKIpBPHRIoezqMyVJOpRlWg7ZOe6UBUuUSjJtOTuDiswwq2pDs2mSnExkmFGIpoG-IUlqQwqRCVEg1ZQG1JtId9U1S4zo5GQS1LBR3EgcaV1nRqWpLClZZ0FaJCtMFQSZeQRndASp-KPRBBNAOgQYMkZqQGa1maA2FscQ1lqgD1CFZqLOfqU6BgIAKPSjUQbiig6oakp2uWvmUmYrc209UdRX_OUEeTKFEsCjiOHfghaqJiAYWBO_uAgCqySG1l6KhUoXZzemDSXQHatgBOgRIcG2wwRLOvaxppqs5cCWhcUM6GDQA3UR4S1LZJpggAPLuJqKRCyRi_rVkSaGSi-ri3DtNeNmlfVGCHdK0PVCL8rSgE3BEVAPca6DYbBRbYIAu3HL_tmfB0LJORaeidGnglJxRBGaoR0EN2VBGmiG2bwAISgGUE9iuklokmAaHomNQku2M9ZXvEcjaGD1HwE4Y__knnQ2erX_E5zDDVLcMAf1XUyy_FbZq8AvZ5lC9j_8tVNWGwCQFnWFsF6oU1eevrV1jumvdRWmevNz-wxkuz1tnx1_8BchDZlg) (MS-VN-Duck.ai)