From 92ae3192f1ac20bfefacbefa7c2d68f843553e80 Mon Sep 17 00:00:00 2001 From: Neil Smith Date: Sun, 27 Mar 2016 13:39:39 +0100 Subject: [PATCH] Deleted unnecessary files --- SIGNED.md | 130 -- affine_break_parameter_trials.csv | 10 - caesar_break_parameter_trials.csv | 10 - challenge6.ipynb | 1141 ------------------ challenge7.ipynb | 321 ----- cipher.py | 1056 ---------------- cipherbreak.py | 603 --------- find_best_affine_break_parameters.py | 85 -- find_best_caesar_break_parameters.py | 80 -- find_wikipedia_titles.py | 35 - language_models.py | 177 --- lettercount.py | 13 - make-cracking-dictionary.py | 19 - norms.py | 189 --- plot-caesar-parameters.ipynb | 207 ---- segment.py | 30 - unknown-word-probability-investigation.ipynb | 203 ---- 17 files changed, 4309 deletions(-) delete mode 100644 SIGNED.md delete mode 100644 affine_break_parameter_trials.csv delete mode 100644 caesar_break_parameter_trials.csv delete mode 100644 challenge6.ipynb delete mode 100644 challenge7.ipynb delete mode 100644 cipher.py delete mode 100644 cipherbreak.py delete mode 100644 find_best_affine_break_parameters.py delete mode 100644 find_best_caesar_break_parameters.py delete mode 100644 find_wikipedia_titles.py delete mode 100644 language_models.py delete mode 100644 lettercount.py delete mode 100644 make-cracking-dictionary.py delete mode 100644 norms.py delete mode 100644 plot-caesar-parameters.ipynb delete mode 100644 segment.py delete mode 100644 unknown-word-probability-investigation.ipynb diff --git a/SIGNED.md b/SIGNED.md deleted file mode 100644 index d07ec2a..0000000 --- a/SIGNED.md +++ /dev/null @@ -1,130 +0,0 @@ -##### Signed by https://keybase.io/neilnjae -``` ------BEGIN PGP SIGNATURE----- -Version: GnuPG v2 - -iQIcBAABCAAGBQJWjpkcAAoJEJPB2e07PgbqyX4QAIMe/BAgFiLDcxDXp6IUQvd8 -TSkZitbbe4WVSiGZ2rsS/LbuHeJr7WGBnUYACp1AeMeJqE62mPl0xbForExH7rRS -PWF9qw8H+Ie6Cu6KeF9hPbAje+24pntjUT/49slb3zNwcmPP3IytA20w50T6Arw7 -aDq7pZ8IUfWnxTR6ZeWLWDo1rRjNMumQ4CmjcP24HElEm84IJJE9sBpd1uqGDHzW -q12wajgwO8jANVdAAxXHye3QieEINzvkCNBShhIwE1/oxYs0Gl94UwSVtHuAFqxv -oul5THS9WFdDCafhgqQkjJC0iOgk9VY833TGIBYzHVA4ktPJmxVvjiDa2aG9vybZ -JJ5MUriSjnf/K65KJl/5mt9bZtskteS5xP0njzjv2579vD2qiqTsX7h8WgYmTjKe -ZxyICi/c5fg2188J0qyr0AUYX9blF3ixlGnovZqXbGa1hIjW2HgZUUrTrvkhyLw5 -RwH5B98LIsmVyI0ZNAQejkyHweUYscwyBS0SZDmu5r+23FJ4wlLNUHi2ThK0ep7e -2ix7QQ3qKsaISDcl6xxARSnBPqScJVHwb8cxI47KeBkVwE48zqaw6BfxjF7IskeN -ypU/7vjy5XjgwxnTanjYZr8LfnpO84I6qMibL1SRz6YgUkzml6Yp+Nq3viBuv1nh -6rhe8Q/XLCg5I3VvegZt -=Ry9+ ------END PGP SIGNATURE----- - -``` - - - -### Begin signed statement - -#### Expect - -``` -size exec file contents - ./ -384 .gitignore a93de2ae5c2a47a38599751d1f914566569dfa09dd1778e207117db6c71421dd -18025 LICENSE a01259a1b522cf0de95824f9860613b453153eebac468e96196d5d7dba84786c -61 README.md 277247b410300ee16477b12ca54ad878d81c8061f6134e2e1cadccaf299de3a3 -469 affine_break_parameter_trials.csv 1a9d635d0af2f41fc6f1e83ae87d6372034259321ba288a11fb024e98ed52f4f|dd9c840434de596a30c84e79de26a9824b36c217a84876c2aab0579b76999735 -6488666 big.txt fa066c7d40f0f201ac4144e652aa62430e58a6b3805ec70650f678da5804e87b -514 caesar_break_parameter_trials.csv 6586223bcc00e06e3ff79d107202d6c29ef962a6dd544add00610c5907407e85|1cb7cc77831ef3ef4f994a9ea77e82a841b38acdde45ede9cedbe7a54f1e8e46 -135303 challenge6.ipynb 5b37a8b10db4c8d9831827a2acdffdcdb65369557d15b3e08a900ee8e088da73 -75506 challenge7.ipynb ee9a99fa7a9845ad7db77199927fe8ad1d05a6b0272e50d8175e874e7a3e4cdf -318 cipher-training.sublime-project 58e5d5b4e54fb29abecaef2d41266e3355adccb8b6a70bd595e509bd07c16587 -42922 cipher.py 58637b8946b4fb973b19a374a2066a896d86c928dacaa1ccd2252e6f8bb6e810 -28908 cipherbreak.py 0fb22645ddce4e04c7e441a1f7bdc0e4a397a3c9b2cfb3098bcb213e79a361c9 -11564 count_1edit.txt 3bf563ef032ba151ec1a4b2d1f33f50c49f4a47e4dc5b8152394bc5b63f57655|b5fbacbebcc25f5011ce97bc9ac967a09c50eef28b4aa98379a6c426df6ac08b -223 count_1l.txt 335388d457db6ef1da05d8b55ab879e9be7d4e021085efc8d9dfeac0e4a79aa9 -4956241 count_1w.txt 51df159fd3de12b20e403c108f526e96dbd723d9cabdd5f17955cdc16059e690 -9270 count_2l.txt bc2895f800189070c193907cd8bca956ad65fed2e25c14300d4bb5b6a243ba99 -5566017 count_2w.txt 781c0596c3eea532d30bef9f3dba1d5137d652f00376260822c761a7584dfb8c -220441 count_3l.txt 8702c95530c7d0d182ab94dc03ed7681fcf969819f6db011a58de31411dc6365 -320508 count_big.txt 3ba257fba1934bd138413d8274e79b56c5992431a27692fd562929aa43ec01a3 -3355 find_best_affine_break_parameters.py 6b11004bb93ac26ec7d42d33504e758edbaf9d55365ae2e4ca2fca7589263f25 -3027 find_best_caesar_break_parameters.py 0347d80309179d937a88fd1c8684490a513ccd086366c5a0dd55b8a2fe5c565f -1236 find_wikipedia_titles.py f040bf855dfec7fff9d8e5eba2fb509179bc53bc02a20b26b7fc61fef983aa45 -5645 language_models.py bfd5b60cdef8af20cdb061b24a1691f569984be3be333782c3d76e3370e16d14 -368 lettercount.py ed36497d62cf75b91994055e4a18848b2fabe5ce793cd76a77fabfc94d81d4f3 -592 make-cracking-dictionary.py 71791e64e4853cd9ca292cb436bbe8c72dd60f509811174df93ed2067683d5c1 -7077 norms.py a657a36c1741e6f3a513386b318fcc99e6b11f98ec64a48284b47462ff2acf30 -8411 norms.pyc ac7a18765c7bcc27e406d8f38d943408097b3384a271502185d53482e6ec0da7|002b186e716cec64869a00bd2d72e16614931e696daa0cf3529d634a0f270e42 -112847 plot-caesar-parameters.ipynb 639459b4b2e434f9f0852c012ed9a8a8d87bd1cb6c2d65ca5abfdb0e42c3dea6 -881 segment.py 94d257cc6151861ef3d3033c4d2d03d8c121b0a982344abf400f65fd507fed28 -4538523 shakespeare.txt 6f9c770efced5c3d87efa6197cd3091b982341372e36c6357f865df91ddecde6 -592309 sherlock-holmes.txt 0027de6f4110440ea51d67a2f3af3484898c630808f13b1d4db108e6283e67a3|2034ee1ebdec47e839607124d22b674d4614e1cc6209d758f7b6e99e69ae8e08 - slides/ -2493 affine-break.html e2ffcbe50ceefb51638a54163829f9eec880a43a900cb7d0e945ce2df153f036 -6441 affine-encipher.html 4f239d2d9e0ef1f5080d1ab3cbb7c876ea1997e5b6f2b6ba0ff5099297006d8c -3320 aims.html a45e8f4b0cc2987656a1b008351e089dcdc2a717aa1b6aa540bf4e8a4435fe17 -6835 alternative-plaintext-scoring.html c313d095c04faa6dae6c57fc20dd5b94f08746c4e8352c73178f335328a8a02d -7831 c1a_frequency_histogram.png a79cdaebf4db843aae7e302c2cb3c4606908465f5d6aed702c5c33d591780561|13ea628dccda1a22116fce7fc348b0977b451ba76f671184e45dcad239db6dd6 -8116 caesar-break.html 786312aa2d85b655d084af45120abb937d65137f19cb9f8e7635107569cbbc94 -3793 caesar-encipher.html 66d4b2d96571a9d7edb10f79d176327efbc3923af2e19c7f61800eea376716e3 -7860 caesarwheel1.gif fd5a9d2d8ef261b0b7ec4536fc56a27ebec94ac91ff2ca136b74d5c066f3ecce|4c536ee4df63c73c2e5e213ca1f96c2fea0bc058efe991f78fd304ff215e6fcd -8200 english_frequency_histogram.png c4a1afec62d2fcda15824f71df3c997088c4a952ee5fe0bc6fa753ede08b2098|6eabd4ebdc616722c9fe3a419e8ca5fc309452120e5023b2e5cb783b9d6d2df8 -9192 fast-good-cheap.gif 4bc052364a91f4c7f98d5ac4e5ac6abd3a3968cabc7f892eb7c3b987adf9e793|4359cbb234f29ca93ff2fa8dd931ce95dab97cd723788937c5d5d259f913afb7 -2714 further-work.html 66339213b16c1a98e4afc5c1ec4878bb4839c43ae963e56dd4be624fc60b8895 -31180 gcd.svg d5b93a7fe870742df02c201d8e12172f2a67798376c54761281c0a660160e753 -2870 index.html f6c2cbaaaeb43db84e9e1bbd2654c31103e22ae3bdf683bfe6d6719a074c9024 -5312 keyword-break.html 3217d573ee8ce0ce73e57d23122dec2de39088d006eb0af16d14405361e99d6c -5456 keyword-encipher.html d8d54fc7ebc88b52bade6c3da2ba81bceb110beeb1a82ff5ffd3fa2593ecdab8 -2989 pocket-enigma-break.html aff9bd947680764ebc7fbf7e62cee948f290b1b81f4c2c2f819734ed24c34da1 -6195 pocket-enigma-encipher.html d930d9149da4ca6766343524aa7df77a64bceaa5264f97bad48574bf0f46e69b -108903 pocket-enigma-small.jpg df9796ce51dbd5b86c1c1ec8a3a6806a77a67025c4dd4400676d24ae53b02cfe|395240459ad459032cab96c25d7ad682faaf7e4e2d9c58f64175ce5eb5467235 -409764 pocket-enigma.jpg aeb79ca953b7fac863340d71f675a50029687aa97bae8af4068927414aeec96c|0fd2d5b1683451ecee1a6501c4ccfa311293e15bcdb063314776493e5746a04b -3460 transposition-break.html 5d3df37e584ac2b0cf2a6b49cc9276bf0964cf4290bda35e808467c12224b2ea -5758 transposition-encipher.html 2c1c3e64dc875de00a481eefe782fd1a812a9035a10a27e993ccf9414e087762 -52398 typingmonkeylarge.jpg 04eba431d38b1d9b5a89065c6a6571e28cddb7052ade379b532d4475ab99cf4a|1357b8bbc859ae4487dac3e431463a2df0ac46851baf24e2811a70bc3b11100c -15756 vector-dot-product.svg 7dbdf0245ee01f8c920518164ef88f3978312a85ef0e9b6c7771c5a053227d26 -9845 vector-subtraction.svg 25bf3a4c46253c529f9fe801c350e26f34401e8176496b1de2041b329cd8f1d8 -8918 word-segmentation.html f39cb54c31412c00c5bdeadcc235f261663596293ecb639921d6dc79ac1fafa8 -451530 spell-errors.txt a4abe6ce6c24280f9a8d0485cbf78ddd2e58279ca01293692630a08ba4b13407 -45378 unknown-word-probability-investigation.ipynb a866c807557980091a284bec04ad49a22c3ff14554ea6dca3edd71157318d52a -3291641 war-and-peace.txt 3ed0f41cfdf660846878943bad5b9d575bcae1e4a92ee9a7f43d3c9dba2af344|6799e48d3fd0a6f4c40b9951ec86de6da81f0b9cd36e413490ac511542ca54d3 -868202 words.txt aa77abbcba3c6dee1306d93adcedc2b2ccb8a4e0344a39d0676732ff58ebd5e5 -868384 words_2013.txt 57faa4841fe28dd82a5da4488b6381c194df6e1ecc04e61fb9f60e842bbca18c -``` - -#### Ignore - -``` -/SIGNED.md -``` - -#### Presets - -``` -git # ignore .git and anything as described by .gitignore files -``` - - - -### End signed statement - -
- -#### Notes - -With keybase you can sign any directory's contents, whether it's a git repo, -source code distribution, or a personal documents folder. It aims to replace the drudgery of: - - 1. comparing a zipped file to a detached statement - 2. downloading a public key - 3. confirming it is in fact the author's by reviewing public statements they've made, using it - -All in one simple command: - -```bash -keybase dir verify -``` - -There are lots of options, including assertions for automating your checks. - -For more info, check out https://keybase.io/docs/command_line/code_signing \ No newline at end of file diff --git a/affine_break_parameter_trials.csv b/affine_break_parameter_trials.csv deleted file mode 100644 index 75f3f16..0000000 --- a/affine_break_parameter_trials.csv +++ /dev/null @@ -1,10 +0,0 @@ -"name",500,250,100,50,20 -"Pletters",2442,2425,2550,2461,2067 -"cosine_similarity + euclidean_scaled",2487,2492,2513,2455,1731 -"cosine_similarity + normalised",2503,2573,2454,2435,1680 -"l1 + euclidean_scaled",2495,2477,2506,2419,1812 -"l1 + normalised",2488,2521,2465,2466,1895 -"l2 + euclidean_scaled",2524,2467,2529,2470,1763 -"l2 + normalised",2566,2545,2481,2433,1756 -"l3 + euclidean_scaled",2444,2458,2560,2426,1582 -"l3 + normalised",2476,2524,2463,2354,1433 diff --git a/caesar_break_parameter_trials.csv b/caesar_break_parameter_trials.csv deleted file mode 100644 index a414d22..0000000 --- a/caesar_break_parameter_trials.csv +++ /dev/null @@ -1,10 +0,0 @@ -"name",100,50,30,20,10,5 -"Pletters",4995,4997,4971,4893,4092,2401 -"cosine_similarity + euclidean_scaled",4997,4980,4915,4671,3590,2174 -"cosine_similarity + normalised",4999,4993,4931,4660,3559,2207 -"l1 + euclidean_scaled",4997,4995,4950,4761,3751,2175 -"l1 + normalised",4999,4993,4950,4770,3662,2188 -"l2 + euclidean_scaled",4997,4991,4914,4664,3579,2209 -"l2 + normalised",4998,4988,4915,4637,3536,2195 -"l3 + euclidean_scaled",4997,4979,4822,4477,3243,1978 -"l3 + normalised",4999,4959,4774,4351,2966,1949 diff --git a/challenge6.ipynb b/challenge6.ipynb deleted file mode 100644 index ca4e493..0000000 --- a/challenge6.ipynb +++ /dev/null @@ -1,1141 +0,0 @@ -{ - "metadata": { - "name": "" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ - { - "cells": [ - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%matplotlib inline\n", - "import matplotlib.pyplot as plt\n", - "\n", - "from cipherbreak import *\n", - "with open('2013/mona-lisa-words.txt') as f:\n", - " mlwords = [line.rstrip() for line in f]\n", - "mltrans = collections.defaultdict(list)\n", - "for word in mlwords:\n", - " mltrans[transpositions_of(word)] += [word]\n", - "c6a = open('2013/6a.ciphertext').read()\n", - "c6b = open('2013/6b.ciphertext').read()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c1a = open('2013/1a.ciphertext').read()\n", - "c1b = open('2013/1b.ciphertext').read()\n", - "c2a = open('2013/2a.ciphertext').read()\n", - "c2b = open('2013/2b.ciphertext').read()\n", - "c3a = open('2013/3a.ciphertext').read()\n", - "c3b = open('2013/3b.ciphertext').read()\n", - "c4a = open('2013/4a.ciphertext').read()\n", - "c4b = open('2013/4b.ciphertext').read()\n", - "c5a = open('2013/5a.ciphertext').read()\n", - "c5b = open('2013/5b.ciphertext').read()\n", - "\n", - "p1a = caesar_decipher(c1a, 8)\n", - "p1b = caesar_decipher(c1b, 14)\n", - "p2a = affine_decipher(c2a, 3, 3, True)\n", - "p2b = caesar_decipher(c2b, 6)\n", - "p3a = affine_decipher(c3a, 7, 8, True)\n", - "p3b = keyword_decipher(c3b, 'louvigny', 2)\n", - "p4a = keyword_decipher(c4a, 'montal', 2)\n", - "p4b = keyword_decipher(c4b, 'salvation', 2)\n", - "p5a = keyword_decipher(c5a, 'alfredo', 2)\n", - "p5b = vigenere_decipher(sanitise(c5b), 'florence')" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 3 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plot_frequency_histogram(frequencies(sanitise(c6a)))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stderr", - "text": [ - "/usr/local/lib/python3.3/dist-packages/matplotlib/figure.py:372: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n", - " \"matplotlib is currently using a non-GUI backend, \"\n" - ] - }, - { - "metadata": {}, - "output_type": "display_data", - "png": "iVBORw0KGgoAAAANSUhEUgAAAaIAAAEkCAYAAABt4jWqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGwxJREFUeJzt3X9wFPX9x/HX8sOCkJMkkI0FvoZRQggEcvwcxMhhTHB0\noIAStUqvUnG002nHaSUwtiX2hx4jtgXrj2pb1DqlQ/kjRrRUfvQYwSKVX9VBpK2kCE1O8XIQfmqS\n/f5BiVJJbnPJ3efu8nzM3JCEfe++b7PZV3b3sxvLcRxHAAAY0sN0AwCA7o0gAgAYRRABAIwiiAAA\nRhFEAACjCCIAgFFRg+i9996T1+ttfV122WVauXKlwuGwysrKlJ+fr/LyckUikUT0CwBIM1ZH7iNq\naWnR4MGDtWPHDj3++OMaOHCgFi1apGXLlqmhoUGBQCCevQIA0lCHTs1t3LhRV111lYYOHaqamhr5\n/X5Jkt/vV3V1dVwaBACktw4F0R/+8AfdfvvtkqRQKCTbtiVJtm0rFAp1fXcAgLTn+tTcJ598osGD\nB2vfvn0aNGiQMjMz1dDQ0Pr/WVlZCofDcWsUAJCeermd8E9/+pPGjx+vQYMGSTp3FFRfX6/c3FzV\n1dUpJyfnCzXFxcXau3dv13ULAEhZY8eO1Z49e77wdden5lavXt16Wk6SZs2apeeff16S9Pzzz2v2\n7NlfqNm7d68cx+nWr6VLl8a9JhHLoIYaaqjp7KutAxNXQXTy5Elt3LhRc+fObf3a4sWLtWHDBuXn\n52vz5s1avHix20wDAKCVq1Nz/fr109GjRy/4WlZWljZu3BiXpgAA3UfPqqqqqnjN/KGHHlIcZ58y\n8vLy4l6TiGVQQw011HRGW5nQoRtaO8qyLMVx9gCAFNJWJvCsOQCAUQQRAMAogggAYBRBBAAwiiAC\nABhFEAEAjCKIAABGEUQAAKMIIgCAUQQRAMAogggAYBRBBAAwiiACABhFEAEAjCKIAABGEUQAAKMI\nIgCAUQQRAMAogggAYBRBBAAwiiACABhFEAEAjCKIAABGEUQAUpLHkyXLsqK+PJ4s060iCstxHCdu\nM7csxXH2ALoxy7Ikudm/sB9KFm1lAkdEAACjXAVRJBLRLbfcopEjR6qwsFBvvvmmwuGwysrKlJ+f\nr/LyckUikXj3CgBIQ66C6Dvf+Y5uvPFGvfvuu/r73/+ugoICBQIBlZWV6cCBAyotLVUgEIh3rwCA\nNBT1GtGxY8fk9Xr1/vvvX/D1goICbdmyRbZtq76+Xj6fT/v3779w5lwjAhAnXCNKPTFfIzp48KAG\nDRqku+66S+PGjdPChQt18uRJhUIh2bYtSbJtW6FQqOu7BgCkvahB1NTUpF27dumb3/ymdu3apX79\n+n3hNNz5YZIAAHRUr2gTDBkyREOGDNHEiRMlSbfccoseeeQR5ebmqr6+Xrm5uaqrq1NOTs5F66uq\nqlo/9vl88vl8XdI4ACC5BYNBBYPBqNO5uo/o2muv1a9//Wvl5+erqqpKp06dkiRlZ2ersrJSgUBA\nkUjkokdKnJsFEA9cI0o9bWWCqyDau3ev7r77bn3yySe68sortWrVKjU3N6uiokKHDh1SXl6e1qxZ\nowEDBrhaKAB0FkGUejoVRF29UADoLIIo9fBkBQBAUiKIAABGEUQAAKMIIoPcPsaeR9kDSGcMVjDI\n/cVWiQuuwIUYrJB6GKwAAEhKBBEAwCiCCABgFEEEADCKIAIAGEUQAQCMIogAAEYRRAAAowgiAIBR\nBBEAwCiCCABgFEEEADCKIAIAGEUQAQCMIogAAEYRRAAAowgiAIBRBBEAwCiCCABgFEEEADCKIAIA\nGEUQAQCMIogAAEb1cjNRXl6ePB6Pevbsqd69e2vHjh0Kh8O69dZb9e9//1t5eXlas2aNBgwYEO9+\nAQBpxtURkWVZCgaD2r17t3bs2CFJCgQCKisr04EDB1RaWqpAIBDXRgEA6cn1qTnHcS74vKamRn6/\nX5Lk9/tVXV3dtZ0BALoF10dE119/vSZMmKBnn31WkhQKhWTbtiTJtm2FQqH4dQkASFuurhFt27ZN\nl19+uT766COVlZWpoKDggv+3LEuWZcWlQQBAenMVRJdffrkkadCgQZozZ4527Ngh27ZVX1+v3Nxc\n1dXVKScn56K1VVVVrR/7fD75fL5ONw0gMTyeLDU2NkSdLiMjU8ePhxPQEVJJMBhUMBiMOp3l/O/F\nn/9x6tQpNTc3KyMjQydPnlR5ebmWLl2qjRs3Kjs7W5WVlQoEAopEIl8YsGBZ1heuLeEz544i3a4f\n1iUSz/02mvjtM5l7w8W1lQlRg+jgwYOaM2eOJKmpqUl33HGHlixZonA4rIqKCh06dKjN4dsEUfsI\nIiS7ZN7ZJ3NvuLiYgygeC8U5BBGSXTLv7JO5N1xcW5nAkxUAAEYRRAAAowgiAIBRBBHQTXg8Wa33\n/LX38niyTLeKbobBCgYxWAGJFMvF/WQeEJDMveHiGKwAAEhKBBEAwCiCCABgFEEEADCKIAIAGEUQ\nAQCMIogAAEYRRAAAowgiAIBRBBEAwCiCCABgFEEEADCKIAIAGEUQAQCMIogAAEYRRAAAowgiAIBR\nBBEAwCiCCABgFEEEADCKIAKAFOTxZMmyLFcvjyfLdLvtshzHceI2c8tSHGef8izLkuR2/bAu0Tnu\nt7fPtrVYahIlmXtLhFTcf7SVCRwRAQCMchVEzc3N8nq9mjlzpiQpHA6rrKxM+fn5Ki8vVyQSiWuT\nAID05SqIVqxYocLCwv8eCkqBQEBlZWU6cOCASktLFQgE4tokACB9RQ2iw4cP69VXX9Xdd9/dem6v\npqZGfr9fkuT3+1VdXR3fLgEAaStqEN1///169NFH1aPHZ5OGQiHZti1Jsm1boVAofh0CANJau0G0\nbt065eTkyOv1tjni4vzwQAAAYtGrvf984403VFNTo1dffVVnzpzR8ePHNX/+fNm2rfr6euXm5qqu\nrk45OTltzqOqqqr1Y5/PJ5/P11W9AwCSWDAYVDAYjDqd6/uItmzZouXLl+vll1/WokWLlJ2drcrK\nSgUCAUUikYsOWOA+oval4n0ASF3cR5ReUnH/0SX3EZ0/Bbd48WJt2LBB+fn52rx5sxYvXtw1XQIA\nuh2erGBQKv5Gg9TFEVFsPJ4sNTY2RJ0uIyNTx4+HY67pqFTcf7SVCQSRQam4ISF1EUSJW04iekvF\n/QeP+AEAJCWCCABgFEEEADCKIAIAGEUQAQCMIogAAEYRRAAAowgiAIBRBBEAwCiCCABgFEEEADCK\nIAIAGEUQAQCMIogAAEYRRAAAowgiAIBRBBEAwCiCCABgFEEEADCKIAIAGEUQAQCMIohSjMeTJcuy\nXL08nizT7QJIIsm6/7Acx3HiNnPLUhxnn/Isy5Lkdv2cW5ex1ABSR7a3z7abWGoSJVG9Jet6S8X9\nR1uZwBERAMAogggAYBRBBAAwiiACABjVbhCdOXNGkydPVnFxsQoLC7VkyRJJUjgcVllZmfLz81Ve\nXq5IJJKQZgEA6SfqqLlTp07p0ksvVVNTk6655hotX75cNTU1GjhwoBYtWqRly5apoaFBgUDgizNn\n1Fy7UnHUC1JXso7+ihWj5lJv/xHzqLlLL71UkvTJJ5+oublZmZmZqqmpkd/vlyT5/X5VV1d3abMA\ngO4jahC1tLSouLhYtm1r+vTpGjVqlEKhkGzbliTZtq1QKBT3RgEA6alXtAl69OihPXv26NixY5ox\nY4b+8pe/XPD/5+/CBQAgFlGD6LzLLrtMN910k3bu3CnbtlVfX6/c3FzV1dUpJyenzbqqqqrWj30+\nn3w+X2f6BQCkiGAwqGAwGHW6dgcrHD16VL169dKAAQN0+vRpzZgxQ0uXLtWf//xnZWdnq7KyUoFA\nQJFIhMEKMUjFi41IXcl60T1WDFZIvf1HW5nQ7hFRXV2d/H6/Wlpa1NLSovnz56u0tFRer1cVFRX6\nzW9+o7y8PK1Zs6ZLmwUAdB889NSgVPyNBqkrWX+zjxVHRKm3/+ChpwCApEQQAQCMIogAAEYRRAAA\nowgiAIBRBBEAwCiCCABgFEHUDXg8Wa3PBIz28niyTLcLoJtx/aw5pK7Gxga5vYmtsZEH2AJILI6I\nAABGEUQAAKMIIgCAUQQRAMAogggAYBRBBAAwiiACABhFEAEAjCKIAABGEUQAAKMIIgCAUQQRAMAo\ngggAYBRBBAAwiiACABhFEAEAjCKIAABGEUQAAKMIIgCAUVGD6IMPPtD06dM1atQojR49WitXrpQk\nhcNhlZWVKT8/X+Xl5YpEInFvFgCQfizHcZz2Jqivr1d9fb2Ki4t14sQJjR8/XtXV1Vq1apUGDhyo\nRYsWadmyZWpoaFAgELhw5palKLPv1izLkuR2/Zxbl4mqQfpxvx18tg3EUpMoieotWddbKu4L2sqE\nqEdEubm5Ki4uliT1799fI0eO1JEjR1RTUyO/3y9J8vv9qq6u7tKGAQDdQ4euEdXW1mr37t2aPHmy\nQqGQbNuWJNm2rVAoFJcGAQDpzXUQnThxQjfffLNWrFihjIyMC/7Psqz/HvIBANAxvdxM9Omnn+rm\nm2/W/PnzNXv2bEnnjoLq6+uVm5ururo65eTkXLS2qqqq9WOfzyefz9fpppE+PJ4sNTY2uJo2IyNT\nx4+H49xR57h9P6nwXoDOCgaDCgaDUaeLOljBcRz5/X5lZ2fr5z//eevXFy1apOzsbFVWVioQCCgS\niTBYoYMYrBDbOkhm6XZxP93eT6KWw2CFNubYRiZEDaKtW7fq2muv1ZgxY1pPvz3yyCOaNGmSKioq\ndOjQIeXl5WnNmjUaMGCAq4XiHIKIIEqkZN2hxoogSr19QcxBFI+F4hyCiCBKpGTdocaKIEq9fUHM\nw7cBAIgngggAYBRBBAAwiiACABhFEAEAjCKIAABGEUQAAKMIIgDGeTxZrc+sbO/l8WSZbjVuuvM6\n4IZWg7ihlRtaEylZb8ykt9hqUnFfwA2tAICkRBABAIwiiAAARhFEAACjCCIAgFEEEbqF7jw0Fp9h\nO0hOrv5UOJDqzv357uhDURsbrfg3A2PYDpITR0QAAKMIIgCAUQQRAMAogggAYBRBBAAwiiACABhF\nEOGi3N5vwT0XADqL+4hwUW7vtzg3LfdcAIgdR0QAAKMIIgCAUQQRAMAogggAYFTUIFqwYIFs21ZR\nUVHr18LhsMrKypSfn6/y8nJFIpG4NgkASF9Rg+iuu+7S+vXrL/haIBBQWVmZDhw4oNLSUgUCgbg1\nmCoY7pw4PMofSC+W4zhRx+jW1tZq5syZevvttyVJBQUF2rJli2zbVn19vXw+n/bv3//FmVuWXMw+\nLViWJbfDnaVz6yXdamIR394+6yuWmlgkajmxSLf11t1rkvnnus05tpEJMV0jCoVCsm1bkmTbtkKh\nUOe6AwB0W50erHD+NAgAALGI6ckK50/J5ebmqq6uTjk5OW1OW1VV1fqxz+eTz+eLZZFAwnk8Wf99\nwkT7MjIydfx4OAEdAaklGAwqGAxGnS6ma0SLFi1Sdna2KisrFQgEFIlELjpggWtEbU6d9Nd7uEaU\n3NdUYpHM7yeZvz/JWpPMP9dtzrGNTIgaRLfffru2bNmio0ePyrZt/ehHP9JXvvIVVVRU6NChQ8rL\ny9OaNWs0YMAA1wtNR8kcEMm8wRJEiZPM7yeZvz/JWpPMP9dtzjHWIIrHQtNRMgdEMm+wBFHiJPP7\nSebvT7LWJPPPdZtz7MpRcwAAdBWCCABgFEEEADCKIAIAGEUQAQCMIogAAEYRRAAAowgiIAXxpzCQ\nTmJ61hwAs849Ay/6zYaNjTyQGMmPIyIAgFEEEQDAKIIIAGAUQQQAMIogAgAYRRABAIwiiAAARhFE\nAACjCCIAgFEEEQDAKIIIAGAUQQQAMIogAgAYRRABAIwiiAAARhFEAACjCCJ0Gbd/NZS/HHqhdPtr\nq+n2fhB/luM40f/MY6wztyzFcfZJxbIsufmLmf+dWo7jUBP3ms+2P2qoSbeaRP28daW2MoEjIgCA\nUZ0KovXr16ugoEDDhw/XsmXLuqonAEA3EnMQNTc361vf+pbWr1+vffv2afXq1Xr33Xe7src0EUxA\nTSKWQQ011FATHzEH0Y4dO3TVVVcpLy9PvXv31m233aaXXnqpK3tLE8EE1CRiGdRQQw018RFzEB05\nckRDhw5t/XzIkCE6cuRIlzQFAOg+Yg6ic6MvAADoJCdGf/3rX50ZM2a0fv7www87gUDggmnGjh3r\n6NxYQV68ePHi1c1fY8eOvWiexHwfUVNTk0aMGKFNmzbpy1/+siZNmqTVq1dr5MiRscwOANBN9Yq5\nsFcv/fKXv9SMGTPU3Nysb3zjG4QQAKDD4vpkBQAAouHJCkmitrZWRUVFCV9uVVWVHnvssbjNf+XK\nlSosLNT8+fPjMv/OrLepU6cmpK5///4xLQfxdezYMT311FOm24AIom4v3qMfn3rqKW3cuFG/+93v\n4rqcWGzbti0hdYwwjZ3jOHF7XmVDQ4OefPLJuMwbHUMQxcmcOXM0YcIEjR49Ws8++6yrmqamJt15\n550qLCzUvHnzdPr06ag1L7zwgsaOHavi4mJ97Wtfc7Wcn/70pxoxYoRKSkr03nvvuap58cUXNXny\nZHm9Xt17771qaWmJWnPvvffq/fff1w033KBf/OIXrpbz4x//WAUFBSopKdFXv/pVV0drzc3Nuuee\nezR69GjNmDFDZ86ccbWsWI9U4nGEU1tbq4KCAt11110aMWKE7rjjDr322muaOnWq8vPz9be//a3d\n2pEjR3Z4HfzsZz9TUVGRioqKtGLFCtc9dmQb/fy25vb7WVtbqxEjRsjv96uoqEiHDx+OWnPy5End\ndNNNKi4uVlFRkdasWRO1ZvHixfrXv/4lr9eryspKV319/uh7+fLleuihh9qtWbJkyQVhF+0MxKOP\nPqrHH39cknT//fertLRUkrR582bdeeedbdYtXbr0gu/hgw8+qJUrV7bb269+9St5vV55vV4NGzZM\n1113XbvTx1Wsw7fRvnA47DiO45w6dcoZPXq08/HHH7c7/cGDBx3Lspw33njDcRzHWbBggbN8+fJ2\na9555x0nPz+/dd7nl9met956yykqKnJOnz7tHD9+3Lnqqqucxx57rN2affv2OTNnznSampocx3Gc\n++67z3nhhReiLstxHCcvLy/qez9vx44dTnFxsXP27FmnsbHRGT58eNTeDh486PTq1cvZu3ev4ziO\nU1FR4bz44ouulte/f39X03W2zs3059/HO++847S0tDjjx493FixY4DiO47z00kvO7Nmzo9Z2ZB2c\n3w5OnTrlnDhxwhk1apSze/fuqD12ZBuNZVs7v5wePXo4b775ZtRpz1u7dq2zcOHC1s+PHTsWtaa2\nttYZPXq062UcPHjwgumXL1/uVFVVtVuze/duZ9q0aa2fFxYWOocPH25z+u3btzvz5s1zHMdxrrnm\nGmfy5MnOp59+6lRVVTnPPPNMm3W1tbXOuHHjHMdxnObmZufKK690tT9wHMf59NNPnZKSEmfdunWu\npo8HjojiZMWKFSouLtaUKVN0+PBh/eMf/4haM3ToUE2ZMkWSdOedd2rr1q3tTr9582ZVVFQoK+vc\n33XJzMyMuozXX39dc+fOVZ8+fZSRkaFZs2ZFPfWxadMm7dy5UxMmTJDX69XmzZt18ODBqMvqqG3b\ntmn27Nm65JJL1L9/f82cOdPVaZlhw4ZpzJgxkqTx48ertra2y3tLhGHDhmnUqFGyLEujRo3S9ddf\nL0kaPXp01PfU0XWwdetWzZ07V3379lW/fv00d+5cvf7661F77Mg2Gsu2dt4VV1yhSZMmuZpWksaM\nGaMNGzZo8eLF2rp1qzweT9Qat710RnFxsT788EPV1dVp7969yszM1ODBg9ucfty4cdq5c6caGxvV\np08fTZkyRW+99Za2bt2qkpKSNuuuuOIKZWdna8+ePXrttdc0btw4V/sDSfr2t7+t0tJS3XTTTR1+\nf10l5uHbaFswGNSmTZu0fft29enTR9OnT9fZs2ej1n3+WoLT+rdD2p++oz9M/1vjtt7v9+vhhx/u\n0LI6KtbevvSlL7V+3LNnT1enNJPR599Hjx49dMkll7R+3NTU5LrWzTq42Lp2cy2rI9torN9PSerX\nr5/raSVp+PDh2r17t1555RV9//vfV2lpqX7wgx90aB7R9OrV64JT0m63s3nz5mnt2rWqr6/Xbbfd\n1u60vXv31rBhw/Tcc8/p6quv1pgxY7R582b985//VEFBQbu1d999t1atWqVQKKQFCxa46u25557T\nBx98YPxaGUdEcXD8+HFlZmaqT58+2r9/v7Zv3+6q7tChQ63T/v73v2/3NyBJuu666/THP/5R4XBY\nklr/bc+1116r6upqnTlzRo2NjVq3bl3UHVBpaanWrl2rjz76qHU5hw4dcvOWOmTq1Kl6+eWXdfbs\nWZ04cUKvvPIKF/rjpKSkRNXV1Tp9+rROnjyp6urqqNub1LFtNJZtLVZ1dXXq06eP7rjjDn3ve9/T\nrl27otZkZGSosbHR9TJs29aHH36ocDiss2fPat26da7qbr31Vq1evVpr167VvHnzok5fUlKi5cuX\na9q0aSopKdHTTz+tcePGRa2bM2eO1q9fr7feekszZsyIOv3OnTv12GOPJcVAIo6I4uCGG27Q008/\nrcLCQo0YMaL1VEZ7LMvSiBEj9MQTT2jBggUaNWqU7rvvvnZrCgsL9eCDD2ratGnq2bOnxo0bp9/+\n9rft1ni9Xt16660aO3ascnJyXJ3+GDlypH7yk5+ovLxcLS0t6t27t5588kn93//9n6v35daECRM0\na9YsjRkzRrZtq6ioSJdddlmHl+F2mbHuFDtaF2s/n//czdFxR5bp9Xr19a9/vfX7v3DhQo0dOzZq\njx3ZRv93W5s4caLro6KOruO3335bDzzwQOuRpJth2dnZ2Zo6daqKiop04403Rv2bar1799YPf/hD\nTZo0SYMHD1ZhYaGrPgsLC3XixAkNGTJEtm1Hnb6kpEQPP/ywpkyZor59+6pv376ufkno3bu3rrvu\nOmVmZrrq64knnlBDQ4OmT58uSZo4caKeeeaZqHXxwA2tSConT55Uv379dOrUKU2bNk3PPvusiouL\nTbfV6uOPP07p61CdUVtbq5kzZ+rtt9+Oqf6hhx5S//799d3vfreLO4MktbS0aPz48Vq7dq2uvPJK\n0+10CKfmkFTuueceeb1ejR8/XrfccktShdB//vMfXX311XrggQdMt2JMZ0+tcao1Pvbt26fhw4fr\n+uuvT7kQkjgiAgAYxhERAMAogggAYBRBBAAwiiACABhFEAEAjCKIAABG/T+xw3Fhb8rTYQAAAABJ\nRU5ErkJggg==\n", - "text": [ - "" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c6af = frequencies(sanitise(c6a))\n", - "plot_frequency_histogram(c6af, sort_key=lambda l: c6af[l])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "display_data", - "png": "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\n", - "text": [ - "" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plot_frequency_histogram(normalised_english_counts, sort_key=lambda l: normalised_english_counts[l])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "display_data", - "png": "iVBORw0KGgoAAAANSUhEUgAAAawAAAEkCAYAAABzKwUZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHx5JREFUeJzt3X9QVXX+x/HXNSgLpNQxG++lUCF+KF5QkFHXpGwXtXTM\ntJg03aQidx23xmprahNn+1ZMuptGP7CZtXHb3B/ujrjKMq26d0ZLl0zsx6CNFtQFw9rMwF8E18/3\nD4siL+deEMSPPB8zZ7zH8z6f+zmHw33xOefce13GGCMAAM5zvbq7AwAAhIPAAgBYgcACAFiBwAIA\nWIHAAgBYgcACAFghZGCVlZUpKSlJCQkJKiwsPGP5vn37NGbMGPXu3VvLly8/Y3kgEFB6erqmTp3a\nOT0GAPRIEU4LA4GAFi5cqM2bN8vtdiszM1PTpk1TcnJyS03//v31/PPPa/369UHbWLFihVJSUtTQ\n0NC5PQcA9CiOI6zy8nLFx8crLi5OkZGRys3NVUlJSauaAQMGKCMjQ5GRkWesX1NTo9LSUt19993i\n/ckAgLPhGFi1tbWKjY1tmfd4PKqtrQ278QceeEDPPvusevXiUhkA4Ow4JonL5epwwxs3btSVV16p\n9PR0RlcAgLPmeA3L7XbL7/e3zPv9fnk8nrAafuutt7RhwwaVlpbq5MmTqq+v19y5c7VmzZpWdWlp\naXr33Xc70HUAwIXG6/Vqz549wRcaB01NTWbIkCGmqqrKNDY2Gq/XayorK4PWLlmyxCxbtizoMp/P\nZ26++eagy0J0wXpLliyh9jzqB7Xtrz1f+kFtx+tt4pQJjiOsiIgIFRUVKScnR4FAQHl5eUpOTlZx\ncbEkKT8/X3V1dcrMzFR9fb169eqlFStWqLKyUtHR0a3aOpvTiwAAOAaWJE2ePFmTJ09u9X/5+fkt\nj6+66qpWpw2DmTBhgiZMmNDBLgIAIF1UUFBQ0J0dWLp0qbq5C10uLi6O2vOoH9S2v/Z86Qe1Ha+3\nhVMmuL49Z9htXC4XdxECACQ5ZwJvkAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHA\nAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIA\nWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYIazAKisrU1JSkhISElRYWHjG8n37\n9mnMmDHq3bu3li9f3vL/fr9f119/vYYNG6bhw4dr5cqVnddzAECP4jLGGKeCQCCgxMREbd68WW63\nW5mZmVq7dq2Sk5Nbar744gt98sknWr9+vfr27avFixdLkurq6lRXV6e0tDQdPXpUo0aN0vr161ut\n63K5FKILAIAewikTQo6wysvLFR8fr7i4OEVGRio3N1clJSWtagYMGKCMjAxFRka2+v+rrrpKaWlp\nkqTo6GglJyfr4MGDHd0OAEAPFjKwamtrFRsb2zLv8XhUW1vb7ieqrq5WRUWFsrKy2r0uAPRUMTH9\n5HK5HKeYmH7d3c1zIiJUgcvlOusnOXr0qGbOnKkVK1YoOjr6rNsDgJ6ioeErSc6XTRoazv512gYh\nA8vtdsvv97fM+/1+eTyesJ+gqalJt956q+bMmaPp06cHrSkoKGh5nJ2drezs7LDbBwDYy+fzyefz\nhVUb8qaL5uZmJSYmasuWLRo0aJBGjx59xk0X3ykoKFCfPn1abrowxmjevHnq37+/fv/73wfvADdd\nAECbTp/lCvUaeeG8jjplQsjAkqR//etfuv/++xUIBJSXl6dHH31UxcXFkqT8/HzV1dUpMzNT9fX1\n6tWrl/r06aPKykrt2bNH1113nUaMGNFyavHpp5/WpEmTwuocAPR0BNYPloUTWF2JwAKAthFY3+OT\nLgAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAA\nAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABW\nILAAAFYgsAAAViCwAABWILAAAFYgsAAAVggZWGVlZUpKSlJCQoIKCwvPWL5v3z6NGTNGvXv31vLl\ny9u1LgAA4XIZY0xbCwOBgBITE7V582a53W5lZmZq7dq1Sk5Obqn54osv9Mknn2j9+vXq27evFi9e\nHPa6kuRyueTQBQDo0Vwul6RQr5EXzuuoUyY4jrDKy8sVHx+vuLg4RUZGKjc3VyUlJa1qBgwYoIyM\nDEVGRrZ7XQAAwuUYWLW1tYqNjW2Z93g8qq2tDavhs1kXAIAfcwys00PRjjmbdQEA+LEIp4Vut1t+\nv79l3u/3y+PxhNVwe9YtKChoeZydna3s7OywngMAYDefzyefzxdWreNNF83NzUpMTNSWLVs0aNAg\n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\n1CkzatQoM3/+fGOMMSUlJWb69OlntP/dz+47y5YtMwUFBY7bGM6x095js6qqyvTq1cv897//Ddn2\nunXrzD333NMy//XXXzu2GxERYd59911jjDG33Xabee2118669jvh7Atjvj8Ojh8/boYPH97msfTd\nfjt+/Lg5evSoGTZsmKmoqGiz3erq6lY/v7ZUVlaaqVOnmubmZmOMMQsWLDBr1qwJq+8XCkZYXWzR\nokWaOHGibrrppqDLt23bphkzZqh3797q06ePpk2b1qmnUp544gm98cYb2rVrlx5++GHH2s8//1zT\np0/X66+/7njNIC0tTZ9//rk+++wzvfvuu+rbt6/cbneb9bGxsRozZowkac6cOdq+fftZ17755pua\nPn26Lr74YkVHR2vq1Kmdtt+2bt2q2267Tf36nX6Td9++fYPWXXPNNerfv7/27NmjN954QyNHjgxa\n+91otaGhQb1799aYMWO0a9cubd++XePHjz+jfvDgwRo2bJhcLpeGDRumG2+8UZI0fPhwVVdXd8o2\nhqMjx+Y111yj0aNHh2x7xIgR+ve//61HHnlE27dvV0xMjGP94MGDNWLECEnSqFGjHPdDe2rbY8WK\nFUpLS9OYMWNUU1Oj/fv3B63bvn27ZsyYoUsvvVRRUVGaMWOGtm3b1ma74R63W7Zs0TvvvKOMjAyl\np6dr69atqqqq6tC22MrxtnacnVdffVV+v9/x/LTL5Wp1wHZmWEnS//73Px07dkyBQEAnTpzQZZdd\n1mbtFVdcoWuuuUbbtm1TUlKSY7uzZs3SunXrVFdXp9zcXMfaH177MMY4XgsJt7Yr99uP23Zy9913\na/Xq1Tp06JDmz58ftCYyMlKDBw/Wq6++qrFjx2rEiBHaunWrDhw4EHQ/X3LJJS2Pe/XqpYsvvrjl\ncXNz8xn1ERERrU4NOZ1GbY+O7OOoqKiw2k5ISFBFRYU2bdqkxx9/XBMnTtRvfvObNut/uE8uuugi\nx21sT224fD6ftmzZop07d6p37966/vrr1djYGLQ22H7ryDXDYObNm6ennnqqU9qyESOsLvLOO+9o\n+fLlIS/wX3fddVq/fr1OnjyphoYGbdy4sdMObun0e+WefPJJ3XHHHSHPj1988cX6xz/+oTVr1gR9\nk/cP3X777Vq7dq3WrVunWbNmOdZ++umn2rlzpyTp9ddfDzqqaG/tuHHj9M9//lONjY06evSoNm3a\n1Gn77YYbbtDf/vY3HT58WJJa/g3mlltuUVlZmXbt2qWcnJw268aPH69ly5ZpwoQJGj9+vF5++WWN\nHDmyU/o7cOBAff755zp8+LAaGxu1cePGTmm3K4/Nzz77TL1799bs2bP14IMPavfu3Z3Sblepr69X\n37591bt3b+3bt6/lGA1m/PjxWr9+vU6cOKFjx45p/fr1jsd8nz591NDQELIPEydO1Lp16/TFF19I\nOn1cfvrpp+3fGIsxwuoiL7zwgr766itdf/31kqTMzEytWrXqjLr09HTdfvvt8nq9uvLKK5WZmRn2\nX/ehXjzWrFmjSy65RLm5uTp16pTGjh0rn8+n7OzsNtu77LLLtHHjRv30pz9Vnz59dPPNNwetTUlJ\n0dGjR+XxeDRw4EDHPiYmJuqFF17Q/PnzNWzYMC1YsKDN+nBrMzIyNG3aNI0YMUIDBw5UamqqLr/8\n8rZ3hsK/yy0lJUWPPfaYJkyYoIsuukgjR47UH/7wh6C1kZGRuuGGG9S3b1/H9sePH6+nnnpKY8aM\n0aWXXqpLL720zRexH7fzw/lgzxEZGaknnnhCo0ePltvtVkpKSshtDWdf/PjYDOdUX7j7+P3339dD\nDz3UMoIMdVu30z45m9pwlkvSpEmT9PLLLyslJUWJiYktp62DSU9P189//vOW/XXPPffI6/W2Wd+/\nf3+NGzdOqampmjJlSpvfHZicnKwnn3xSP/vZz3Tq1ClFRkbqxRdf1NVXXx2y/xcK3jh8nlm6dKmi\no6O1ePFix7ovv/yyU8/Pnw+qq6s1depUvf/++2HVHzt2TFFRUTp+/LgmTJigV155RWlpaV3cy9ZO\nnTqlUaNGad26dRo6dOg5fW6gp+GU4Hko1F98Bw8e1NixY/XQQw+dox6dO+055XTvvfcqPT1do0aN\n0syZM895WFVWViohIUE33ngjYQWcA4ywAABWYIQFALACgQUAsAKBBQCwAoEFALACgQUAsAKBBQCw\nwv8DbMnA/BWkp54AAAAASUVORK5CYII=\n", - "text": [ - "" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c6bf = frequencies(sanitise(c6b))\n", - "plot_frequency_histogram(c6bf, sort_key=lambda l: c6bf[l])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "display_data", - "png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEkCAYAAAB6wKVjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGGFJREFUeJzt3XtQlNf9x/HPKhiNQIPpuLZgxYkIrqywanDUUFFEM01l\niKl4TWgwSWPb6bTNpTYXhTZVMtVONY25ODbBOtFap0Vrpg6N/jajtha1as1Qq22kEUSMQSOi8cbz\n+4OyUdkbuitn4f2a2RF2v3ues/us++E8l/PYLMuyBACAYbp1dAcAAPCGgAIAGImAAgAYiYACABiJ\ngAIAGImAAgAYyW9AHTt2TOPHj9fQoUOVlpam5cuXS5IaGhqUm5urwYMHa9KkSTpz5oznOYsXL1Zy\ncrJSU1NVUVER3t4DADotm7/zoE6cOKETJ04oIyND586d04gRI1ReXq633npLX/ziF/Xss8/q5Zdf\n1unTp1VaWqqqqirNmjVLu3fvVm1trSZOnKjDhw+rWzcGagCA9vGbHP369VNGRoYkKSYmRkOGDFFt\nba02bdqkwsJCSVJhYaHKy8slSRs3btTMmTMVHR2tpKQkDRo0SJWVlWF+CQCAzijooU11dbX27dun\nUaNGqb6+Xna7XZJkt9tVX18vSTp+/LgSExM9z0lMTFRtbW2IuwwA6AqCCqhz587poYce0rJlyxQb\nG3vdYzabTTabzedz/T0GAIAvUYEKLl++rIceekgPP/yw8vPzJbWMmk6cOKF+/fqprq5Offv2lSQl\nJCTo2LFjnufW1NQoISGhTZsZGRk6cOBAqF4DACCCpaena//+/W3u9zuCsixLc+fOlcPh0Pe//33P\n/Xl5eSorK5MklZWVeYIrLy9P69at06VLl3T06FEdOXJEmZmZbdo9cOCALMvqlLeFCxeGpTacbVPL\n+oj0WlP6YUJtJN58DVj8jqB27typNWvWaNiwYXK5XJJaDiOfP3++CgoKtGrVKiUlJWn9+vWSJIfD\noYKCAjkcDkVFRWnFihVs4gMA3BS/AXXfffepubnZ62Pvvfee1/ufe+45Pffcc7feMwBAl9a9uLi4\n+HYvtKSkRB2w2NsmKSkpLLXhbJva9tea0g9qzeqHCbWRxlcm+D1RN1xsNps6YLEAAAP5ygSmeAAA\nGImAAgAYiYACABiJgAIAw8TF9fHM0uPrFhfXp6O7GXYcJAEAhmk5fzTQd2Tn+R7lIAkAQEQhoAAA\nRiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYi\noAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAA\nAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABG\nIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKg\nAABGIqAAAEYKGFBFRUWy2+1yOp2e+4qLi5WYmCiXyyWXy6U//elPnscWL16s5ORkpaamqqKiIjy9\nBgB0ejbLsix/Bdu3b1dMTIweeeQRHTx4UJJUUlKi2NhY/fCHP7yutqqqSrNmzdLu3btVW1uriRMn\n6vDhw+rW7foctNlsCrBYAOiybDabpEDfkZ3ne9RXJgQcQWVlZSk+Pr7N/d4a27hxo2bOnKno6Ggl\nJSVp0KBBqqysvMkuAwC6spveB/XKK68oPT1dc+fO1ZkzZyRJx48fV2JioqcmMTFRtbW1t95LAECX\nE3UzT5o3b54WLFggSXrxxRf11FNPadWqVV5rW4aqbRUXF3t+zs7OVnZ29s10BQAQYdxut9xud8C6\nmwqovn37en5+7LHHNGXKFElSQkKCjh075nmspqZGCQkJXtu4NqAAAF3HjYOSkpISr3U3tYmvrq7O\n8/Mf/vAHzxF+eXl5WrdunS5duqSjR4/qyJEjyszMvJlFAECnEhfXRzabzectLq5PR3fROAFHUDNn\nztT777+vU6dOqX///iopKZHb7db+/ftls9k0cOBAvfHGG5Ikh8OhgoICORwORUVFacWKFT438QFA\nV9LYeFr+jsxrbOS78kYBDzMPy0I5zBxAFxP40PHPvxc5zLwFM0kAAIxEQAEAjERAAQCMREABAIxE\nQAEAjERAAQCMREABAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCMREAB\nAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCM\nREABAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCMREABwE2Ii+sjm83m9xYX16ejuxnRbJZlWbd9\noTabOmCxABAyNptNUqDvsc+/6wLXt6f2+vpI5ysTGEEBAIxEQAEAjERAAQCMREABAIxEQAEAjERA\nAQCMREABAIxEQAEAjERAAcD/MDuEWZhJAgD+pz0zODCTROgwkwQAIKIQUAA6NTbbRS4CCkDEaU/o\nNDaeVsvmMt+3lhqYhn1QACJOuPYVsQ+qY7APCoDR2BSHG0V1dAcAQLp2U5y/Gtvt6QyMwAgKAGAk\nAgoAYCQCCgBgJAIKAGAkAgoAYKSAAVVUVCS73S6n0+m5r6GhQbm5uRo8eLAmTZqkM2fOeB5bvHix\nkpOTlZqaqoqKivD0GgDQ6QUMqEcffVRbtmy57r7S0lLl5ubq8OHDysnJUWlpqSSpqqpKv/3tb1VV\nVaUtW7bo29/+tpqbm8PTcwBApxYwoLKyshQfH3/dfZs2bVJhYaEkqbCwUOXl5ZKkjRs3aubMmYqO\njlZSUpIGDRqkysrKMHQbANDZ3dQ+qPr6etntdkmS3W5XfX29JOn48eNKTEz01CUmJqq2tjYE3QQA\ndDW3PJNE6xQk/h73pri42PNzdna2srOzb7UrAIAI4Ha75Xa7A9bdVEDZ7XadOHFC/fr1U11dnfr2\n7StJSkhI0LFjxzx1NTU1SkhI8NrGtQEFAOg6bhyUlJSUeK27qU18eXl5KisrkySVlZUpPz/fc/+6\ndet06dIlHT16VEeOHFFmZubNLAIA0MUFHEHNnDlT77//vk6dOqX+/fvrJz/5iebPn6+CggKtWrVK\nSUlJWr9+vSTJ4XCooKBADodDUVFRWrFihd/NfwAA+ML1oAAYwYTrNnE9qI7B9aAAABGFgAIAGImA\nAgAYiYACEDZcxh23gku+AwgbLuOOW8EICgBgJAIKAGAkAgoAYCQCCgBgJAIKAGAkAgoAYCQCCgBg\nJAIKAGAkAgoAYCQCCgBgJAIKQLswvx5uF+biA9AuzK+H24URFADASAQUAMBIBBQAwEgEFADASAQU\nAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADA\nSAQUAMBIBBQALuMOI3HJdwBcxh1GYgQFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADAS\nAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQVEiPZe9TZQPVfI\nhelslmX5v4xmOBZqs6kDFgtENJvNpkBXvZU+/78VuL49tZ/XU9v+Wil866Mz8JUJjKAAAEYioAAA\nRoq6lScnJSUpLi5O3bt3V3R0tCorK9XQ0KDp06frv//9r5KSkrR+/XrdddddoeovAKCLuKURlM1m\nk9vt1r59+1RZWSlJKi0tVW5urg4fPqycnByVlpaGpKMAgK7lljfx3bhja9OmTSosLJQkFRYWqry8\n/FYXAQDogm55BDVx4kSNHDlSK1eulCTV19fLbrdLkux2u+rr62+9lwCALueW9kHt3LlTX/rSl/Tx\nxx8rNzdXqamp1z3eer6FN8XFxZ6fs7OzlZ2dfStdAQBECLfbLbfbHbAuZOdBlZSUKCYmRitXrpTb\n7Va/fv1UV1en8ePH69ChQ9cvlPOgAEktJ9M2Np72WxMbG6+zZxuMOe+GWs6DCrWQnwd1/vx5NTY2\nSpKamppUUVEhp9OpvLw8lZWVSZLKysqUn59/s4sAOr2WcLL83gIFGNBZ3fQmvvr6ej344IOSpCtX\nrmj27NmaNGmSRo4cqYKCAq1atcpzmDkAAO3FVEdAB4rETUrUmrU+OgOmOgIARBQCCgBgJAIKAGAk\nAgoAYCQCCgBgJAIKCLH2XvkWgHe3NNURgLY+P/nWX433KcAAfI4RFADASAQUAMBIBBQAwEgEFADA\nSAQUAMBIBBQAwEgEFADASAQUuqz2nFDLybfA7ceJuuiy2nNCLSffArcfIygAgJEIKACAkQgoAICR\nCCgAgJEIKBiPo+2AromAQodoT5B8fgSd71tLTftqAZiNw8zRIThsG0AgjKAAAEYioAAARiKgAABG\nIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioBAygebXY5JWAO3BXHwImUDz6zG3\nHoD2YAQFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFnwJNXcT0\nRQDCiamO4FOgqYtaapi+CEB4MIICABiJgAIAGImA6mLYrwQgUrAPqothvxKASMEICgBgJAIKAGAk\nAgoAYCQCCgBgJAIKAGCksATUli1blJqaquTkZL388svhWASuwaHjADqjkAfU1atX9d3vfldbtmxR\nVVWV1q5dq3/+85+hXoyx3G63z8faEyTtqf380PFrb/933e8tNT573Z5XSG3Y26a2/bXhbDvSajuP\n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\nSUVORK5CYII=\n", - "text": [ - "" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plot_frequency_histogram(c6bf)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "display_data", - "png": "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\nW7duVVVVldatW6d//etfoZ6Nwdxhqg3ntLtObfv+aLSmh9bWm13bccstXLXhnLb32s9PU7j+8Zcb\nfr9a0/4e3O7ga7uSkAdUZWWlhgwZoqSkJEVHR2vWrFnatGlTqGdjMHeYasM57a5Te+sfjRd08x8R\n3380WtNDa+vNru245Rau2nBOu/NrCagQqaur08CBAz2/JyYmqq6uLtSzAQB0cSEPKJuNM+8BoD1u\n3uRaUlLSPfdvWSH2t7/9zZo6darn98WLF1ulpaU31KSnp9+84ZYHDx48eHTTR3p6utc8sVmWZSmE\nLl++rJSUFG3btk1f/vKXlZmZqXXr1mnYsGGhnA0AoIsL+cVio6Ki9Ktf/UpTp07VlStXNH/+fMIJ\nANBqIR9BAQAQClxJohPU1NTI6XSGfT7FxcVatmxZyKa3YsUKORwOPfjggyGbZluWxfjx40Na35Ye\nYmJiWlWP1vnkk0/06quvdnYb6GQEVBcW6iMqX331Vb377rv6zW9+E9LpttauXbvCWh8Mjla9lWVZ\nCtUGmdOnT2vlypUhmRYiFwEVQvfff79Gjx6ttLQ0rVq1ym/t5cuXNW/ePDkcDs2YMUPnz5/3Wbtm\nzRqlp6crIyNDDz30kN/p/uxnP1NKSoqysrL073//22/t2rVrNWbMGLlcLj3++ONqaWnxWfv444/r\ngw8+0L333qtf/vKXfqcrST/96U+VmpqqrKwszZkzx+9I7sqVK3rssceUlpamqVOn6rPPPvM77daO\nXlpT/8EHH2jkyJHat29fq+Zxs5qaGqWmpurhhx9WSkqK5s6dq4qKCo0fP15Dhw7Vnj17bqkfNmxY\n0MvhF7/4hZxOp5xOp5YvXx5UL8Gub9evQ4G+u5qaGqWkpKiwsFBOp1O1tbVe65qbm3XfffcpIyND\nTqdTGzZs8NvzwoUL9d///lcul0s/+tGP/M7/+tHv0qVLVVJS4rX2xz/+8Q2h52sLw89//nO9/PLL\nkqQf/OAHysnJkSRt375d8+bNu6V+z549Sk9P14ULF9Tc3Ky0tDRVVVV57eGFF1644ft69tlntWLF\nCp+f7/XXX5fL5ZLL5dLgwYM1adIkn7VdUqgPM+/OGhsbLcuyrHPnzllpaWnWxx9/7LWuurrastls\n1l//+lfLsiyrqKjIWrp0qdfa999/3xo6dKhnWtfm4c3evXstp9NpnT9/3vr000+tIUOGWMuWLfNa\nW1VVZU2bNs26fPmyZVmWtWDBAmvNmjV+P19SUpLPz3S9yspKKyMjw7pw4YLV1NRkJScn++yjurra\nioqKsg4ePGhZlmUVFBRYa9eu9Tv9mJiYgD20pr66utpKS0uzDh8+bLlcLuuf//xnSKYZFRVlvf/+\n+1ZLS4s1atQoq6ioyLIsy9q0aZOVn5/vtT6Y5XDtez537px19uxZa/jw4db+/fv99hLs+taadeja\ntHv06GH9/e9/970wLMvauHGj9eijj3p+/+STT/zW19TUWGlpaX5rrs3/+rqlS5daxcXFXmv3799v\nTZgwwfO7w+Gwamtrb6nbvXu3NWPGDMuyLOuee+6xxowZY126dMkqLi623njjDa/Tfu6556wnn3zS\n+s53vnPLaTU3f66RI0dalmVZV65cse666y6//6avuXTpkpWVlWVt2bIlYG1XwggqhJYvX66MjAyN\nHTtWtbW1Onr0qM/agQMHauzYsZKkefPmaefOnV7rtm/froKCAvXrd/WkvPj4eJ/T3LFjh6ZPn67e\nvXsrNjZWeXl5Pje5bNu2Tfv27dPo0aPlcrm0fft2VVdXB/tR/dq1a5fy8/PVq1cvxcTEaNq0aX43\n/QwePFgjRoyQJI0aNUo1NTUh6aM1Tp48qfz8fL399tsh2z84ePBgDR8+XDabTcOHD9fkyZMlSWlp\naV4/Y7DLYefOnZo+fbr69Omjvn37avr06dqxY4ffXoJd31qzDl0zaNAgZWZm+q0ZMWKE/vznP2vh\nwoXauXOn4uLi/NYHmmdbZGRk6OTJk6qvr9fBgwcVHx+vhISEW+qujaCbmprUu3dvjR07Vnv37tXO\nnTuVlZXlddqLFi1SRUWF9u7dq6efftpnD4MGDdKdd96pAwcOqKKiQiNHjvT7b/qa733ve8rJydF9\n990X/AfuAkJ+mHl35Xa7tW3bNu3evVu9e/fWxIkTdeHCBZ/11+/DsCzL5z4Nm80W9D/Wm2sDva+w\nsFCLFy8Oatqt0do+brvtNs/PPXv29Lv5KVzuuOMODRo0SDt27FBqampIpnn95+rRo4d69erl+fny\n5ct+6/0tB2/LN9A+sbaub8Gse3379g1Yk5ycrP379+udd97Rc889p5ycHD3//PMB3xdIVFTUDZum\nA607M2bM0MaNG3XixAnNmjXLa010dLQGDx6st956S+PGjdOIESO0fft2/ec///G5bpw6dUrNzc26\ncuWKzp8/r9tvv91nD4888ojefPNNNTQ0qKioKOBnfOutt3Ts2LFuuU+OEVSIfPrpp4qPj1fv3r11\n+PBh7d6922/9hx9+6Kl5++23ff6f2aRJk/S73/1OjY2NkuT5rzdf/epXVV5ers8++0xNTU3asmWL\nzz9EOTk52rhxoz766CPPdD/88MOAnzMY48eP1x//+EdduHBBZ8+e1TvvvGP8QQW9evXS73//e61Z\ns0br1q3r7Hb8ysrKUnl5uc6fP6/m5maVl5f7XH+uCXZ9a8061Br19fXq3bu35s6dqyeffFL/+Mc/\n/NbHxsaqqakp4HTtdrtOnjypxsZGXbhwQVu2bPFbP3PmTK1bt04bN27UjBkzfNZlZWVp6dKlmjBh\ngrKysvTaa69p5MiRPuu/9a1v6cUXX9ScOXP87jOTru6r3rp1q/bu3aupU6f6rd23b5+WLVvW6Qcm\ndRZGUCFy77336rXXXpPD4VBKSopnc4o3NptNKSkpeuWVV1RUVKThw4drwYIFXmsdDoeeffZZTZgw\nQT179tTIkSP161//2muty+XSzJkzlZ6erv79+/vd7DJs2DC9+OKLmjJlilpaWhQdHa2VK1fqK1/5\nit++gzF69Gjl5eVpxIgRstvtcjqd+sIXvhD0dFszGghGMPU2m0233367tmzZotzcXMXGxurrX/96\nu6fp63dv7w92ObhcLn3zm9/0fL+PPvqo0tPT/fYS7Pp28zp09913BxxFBbMsDh06pKeeesozkgx0\nCPmdd96p8ePHy+l06mtf+5rP+8pFR0dr0aJFyszMVEJCghwOh99+HA6Hzp49q8TERNntdp91WVlZ\nWrx4scaOHas+ffqoT58+PkN9zZo1uu222zRr1iy1tLRo3Lhxcrvdys7O9tnzpEmTFB8fH3DZvfLK\nKzp9+rQmTpwoSbr77rv1xhtv+H1PV8KJugiL5uZm9e3bV+fOndOECRO0atUqZWRkdHgfH3/8caft\n1zJFTU2Npk2bpkOHDrX6vSUlJYqJidETTzwRhs66p5aWFo0aNUobN27UXXfd1dntGI1NfAiLxx57\nTC6XS6NGjdI3vvGNTgmn48ePa9y4cXrqqac6fN6mac9mOtM3z0aSqqoqJScna/LkyYRTEBhBAQCM\nxAgKAGAkAgoAYCQCCgBgJAIKAGAkAgoAYCQCCgBgpP8D+njZv7/d4VMAAAAASUVORK5CYII=\n", - "text": [ - "" - ] - } - ], - "prompt_number": 8 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plot_frequency_histogram(normalised_english_counts)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "display_data", - "png": "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\nMEAjR45s8cIJ6Uzo9OrVq+mii1DX5aKLrsVFFwDCiVMmOM6wIiIiVFhYqNzcXAUCAc2bN0/Jyckq\nKiqSJOXn5+vQoUPKzMxUbW2tevTooRUrVqiiokLR0dEtrgsAQHs4zrAuSAPMsLoUMywA4aTdl7UD\nABAuCCwAgBUILACAFQgsAIAVCCwAgBUILACAFQgsAIAVCCwAgBUILACAFQgsAIAVCCwAgBUILACA\nFQgsAIAVCCwAgBUILACAFQgsAGEnJqaPXC6X4y0mpk9Xt4kLjA9wvMjxAY4IR7wuL158gCMAwHoE\nFgDACgQWAMAKBBYAwAoEFgDACgQWAMAKBBYAwAoEFgDACgQWAMAKBBYAwAoEFgDACkEDq7S0VElJ\nSUpISNDSpUtbrFm4cKESEhLk9XpVXl7e9P1nnnlGQ4YMUVpamu68807V19efv84BABcVx8AKBAJa\nsGCBSktLVVFRobVr12rv3r3NakpKSnTgwAHt379fq1at0vz58yVJVVVVevXVV7V792598MEHCgQC\n+vOf/9x5IwEAdGuOgVVWVqb4+HjFxcUpMjJSeXl5Ki4ublazYcMGzZkzR5KUlZWlo0eP6vDhw4qJ\niVFkZKROnDihxsZGnThxQm63u/NGAgDo1hwDq6amRrGxsU3LHo9HNTU1IdX06dNHixYt0rXXXqsB\nAwboqquu0k033XSe2wcAXCwcA+vMZ9IE19Jnl3z88cd6/vnnVVVVpYMHD+rYsWP605/+1L4uAZyD\nDznExSbC6U632y2/39+07Pf75fF4HGuqq6vldrvl8/k0evRo9e3bV5I0bdo0vf3225o5c+Y5j1NQ\nUND0dU5OjnJyctozFuCiUlf3tYJ9yGFdXWi/dAJdxefzyefzhVZsHDQ0NJhBgwaZyspKU19fb7xe\nr6moqGhWs2nTJjNx4kRjjDE7duwwWVlZxhhjysvLzZAhQ8yJEyfM6dOnzezZs01hYeE5jxGkBXQy\nSUYyQW48R+GoOz933XlscOb0vDrOsCIiIlRYWKjc3FwFAgHNmzdPycnJKioqkiTl5+dr0qRJKikp\nUXx8vKKiorR69WpJUnp6umbPnq0RI0aoR48eGjZsmO677752JTAAAK7vEq3rGnC5WjwHZqOYmD7f\nHaZpXa9evVVbe+QCdRTcmfOUwfZ/93mOupPu/Nx157HBmVMmEFjnkY0/ZDb2jDO683PXnccGZ06Z\nwFszAQCsQGABAKxAYAEArEBgAQCsQGABAKxAYAEArEBgAQCsQGABAKxAYAEArEBgAQCsQGABAKxA\nYAEArEBgAQCsQGABAKxAYAEArEBgAQCsQGABAKxAYAEArEBgwSoxMX3kcrkcbzExfbq6TQCdgMCC\nVerqvpZkHG9nauxEIAOtI7DQ5fhP+nvdPZCBjojo6gaA7/+TdqpxXZhmAIQtZlgAACsQWAAuCA79\noqM4JAjgguDQLzqKGRYAwAoEFgDACkEDq7S0VElJSUpISNDSpUtbrFm4cKESEhLk9XpVXl7e9P2j\nR49q+vTpSk5OVkpKinbu3Hn+OgcAXFQcAysQCGjBggUqLS1VRUWF1q5dq7179zarKSkp0YEDB7R/\n/36tWrVK8+fPb7rvV7/6lSZNmqS9e/fq/fffV3JycueMAgDQ7TkGVllZmeLj4xUXF6fIyEjl5eWp\nuLi4Wc2GDRs0Z84cSVJWVpaOHj2qw4cP65tvvtG2bds0d+5cSVJERISuvPLKThoGAKC7cwysmpoa\nxcbGNi17PB7V1NQEramurlZlZaX69eunu+++W8OGDdO9996rEydOnOf2AQAXC8fAcrlCu8TUmOaX\nqrpcLjU2Nmr37t36xS9+od27dysqKkrPPvts+zsFAFzUHP8Oy+12y+/3Ny37/X55PB7Hmurqarnd\nbhlj5PF4lJmZKUmaPn16q4FVUFDQ9HVOTo5ycnLaOg4AXSAmpk/Q9zbs1au3amuPXKCOYBufzyef\nzxdasXHQ0NBgBg0aZCorK019fb3xer2moqKiWc2mTZvMxIkTjTHG7Nixw2RlZTXdl52dbT766CNj\njDGLFy82jzzyyDmPEaQFq0gykglyC6/xhkPPbekhHPrtTLbti87qNxzGhq7h9Lw6zrAiIiJUWFio\n3NxcBQIBzZs3T8nJySoqKpIk5efna9KkSSopKVF8fLyioqK0evXqpvVfeOEFzZw5U99++60GDx7c\n7D4AANrC9V2idV0DLtc558BsdeacX7CxhNd4w6HntvQQDv12Jtv2RWf1Gw5jQ9dwygTe6QIAYAUC\nCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsA\nYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAF\n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\nrY7prLKyMpOenm7q6+tNXV2dSUhIaLWHyspKExERYd577z1jjDG33367ef311x23Hx0d7Xh/e9ap\nrKw0qampZt++fSYjI8O8//77Hdrm2XF9+OGH5vTp02b48OFm7ty5xhhjiouLzdSpU1tdJ5R9cfZ5\nPnHihDl27JgZMmSIKS8vb7WXUF9rbXn9nN12jx49zH//+99Wa85at26duffee5uWv/nmm1Zrq6qq\nTGpqatBtnu3hh7XLli0zBQUF59SVl5ebsWPHNi2npKSY6urqFre5c+dOM2PGDGOMMT/5yU9MVlaW\naWhoMAUFBWbVqlUtrvPEE0+Yhx56yPzyl79s8c95zqqqqjLDhg0zxhgTCATM4MGDHX+mjTGmoaHB\nZGdnm40bNzrWdUfMsDrRihUrlJ6erlGjRqm6ulr79+9vtTY2NlajRo2SJM2aNUvbt29vsW7r1q26\n/fbb1afPmT8U7N27d6vb3LZtm6ZNm6aePXuqV69emjJlSquHabZs2aJ3331XI0aMUEZGhrZu3arK\nyspQh9qqt956S1OnTtWll16q6OhoTZ482fFQ0cCBAzV06FBJ0vDhw1VVVdXhHtrjiy++0NSpU/XG\nG2+cl/OLAwcO1JAhQ+RyuTRkyBDddNNNkqTU1NRWxxjqvti+fbumTZumyy+/XFFRUZo2bZq2bdvW\nai+hvtba8vo567rrrtPIkSMdayRp6NCh+ve//61HH31U27dvV0xMTKu1wR6zPdLT0/XFF1/o888/\n13vvvafevXvL7Xa3WHt2hl1XV6eePXtq1KhR2rVrl7Zv367s7OwW13nyySf15ptvateuXXrkkUda\n7eO6665T3759tWfPHr355psaNmyY48+0dObNxsePH6+bb7459AF3E46XtaP9fD6ftmzZop07d6pn\nz54aN26c6uvrW63/4TkQY0yr50RcLlfIP8A/rg223pw5c/T000+HtO1QtbWHyy67rOnrSy65xPFw\nVWe66qqrdN1112nbtm1KSkrq8PZ+OK4ePXro0ksvbfq6sbEx6DpO+6Klfex0Tq29r7VQXndRUVFB\nayQpISFB5eXl2rRpk5544gmNHz9ev/nNb0Ja10lERESzQ9lOr58ZM2Zo3bp1OnTokPLy8lqti4yM\n1MCBA/Xaa69p9OjRGjp0qLZu3aoDBw60+tr43//+p+PHjysQCOjkyZO64oorWt3+Pffco9WrV+vw\n4cOaO3eu4/hee+01+f3+i/acHjOsTlJbW6vevXurZ8+e2rdvn3bu3OlY/9lnnzXVvPHGG63+5nbj\njTfqb3/7m44cOSJJTf+25IYbbtD69et16tQp1dXVaePGja3+5zR+/HitW7dOX375ZdN2P/vss6Dj\nDGbMmDH65z//qfr6eh07dkybNm2y4gKFSy+9VP/4xz+0Zs2aFv/gPZxkZ2dr/fr1OnnypI4fP671\n69e3+vqRQn+tteX101aff/65evbsqZkzZ+qhhx7S7t27W63t1auX6urqQtpu//799cUXX+jIkSOq\nr6/Xxo0bW6294447tHbtWq1bt04zZsxw3G52draWLVumsWPHKjs7W6+88oqGDRvWan1+fr6eeuop\n3XnnnUHPu916660qLS3Vrl27lJub22rdu+++q+XLl3fpRU5djRlWJ5kwYYJeeeUVpaSkKDExsekQ\nTEtcLpcSExP14osvau7cuRoyZIjmz5/fYm1KSooef/xxjR07VpdccomGDRumP/zhDy3WZmRk6I47\n7pDX69XVV1/teKgmOTlZTz31lH72s5/p9OnTioyM1EsvvaRrr73Wse9gRowYoSlTpmjo0KHq37+/\n0tLSdOWVV4a8zWCP0Z7/QENZx+Vy6YorrtDGjRv105/+VL169dItt9zS7m06jctphhPKY2RkZOjn\nP/950/N77733yuv1ttpLqK+1H79+MjMzg86yQn0+PvjgAz388MNNs02ny9b79u2rMWPGKC0tTZMm\nTXL8bL3IyEg9+eSTGjlypNxut1JSUlrtKSUlRceOHZPH41H//v0d+83OztbTTz+tUaNG6fLLL9fl\nl1/eatCvWbNGl112mfLy8nT69GmNHj1aPp9POTk5rfZ84403qnfv3o7778UXX9TXX3+tcePGSZIy\nMzO1atUqx767G/5wGJ3u+PHjioqK0okTJzR27Fi9+uqrSk9P75Jevvrqqy49N9bVqqqqNHnyZH3w\nwQdtXnfJkiWKjo7WokWLOqGzi9fp06c1fPhwrVu3ToMHD+7qdsIahwTR6e677z5lZGRo+PDhmj59\nepeF1cGDBzV69Gg9/PDDXfL44aIjh/VsOJxrk4qKCiUkJOimm24irELADAsAYAVmWAAAKxBYAAAr\nEFgAACsQWAAAKxBYAAArEFgAACv8P5ZWvQDqsWNNAAAAAElFTkSuQmCC\n", - "text": [ - "" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c6a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 10, - "text": [ - "'CPYYL GVVIR PDDVU BCSUP QOWPW SYBYP ODBCS PBBPR CSIOZ PTSTV HYVTW PYOZC OGCRV TTPUI BVGVS YOUGZ ZSRYS BPYLY SHSYY OUGBV BCSWP OUBOU GPUIR DSPYD LTSUB OVUOU GZPYP ZSSTZ DONSB CSLNU SJPAV EBBCS ZRPTV EYHYO SUIDL ZZVHH ORSYJ PZWDP UUOUG BVWED DBCSL WORNS IEWCS YBYPO DBCSU OGCBP HBSYZ CSJSU BTOZZ OUGAE BLVER PUYSP IPAVE BBCPB OUBCS OYYSW VYBZB ODDUV MVLVU GSBBO UGPRR SZZBV BCSVY OGOUP DTOZZ TVUPO UBCSG PDDSY LPUIO PTASG OUUOU GBVBC OUNJS TOGCB USSIB VYVDD VEBPA DPRNA PGMVA LVEJP UBBVI VOBVY ZCPDD OALBC SJPLO JPZZE YWYOZ SIALB COZYS WVYBB CSVBC SYWPW SYZJS CPFSH YVTBC SUPQO ZPBBC OZDSF SDPYS SURYL WBSIE ZOUGA OHOIV YWDPL HPOYZ BLDSR OWCSY ZBCOZ VUSOZ UBTPL ASBCS ROWCS YRDSY NJPZV HHIEB LBCPB IPLJS GVBDE RNL\\n'" - ] - } - ], - "prompt_number": 10 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "len(sanitise(c6b))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 11, - "text": [ - "1573" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c6as = sanitise(c6a)" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 12 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "frequencies(ngrams(c6as, 2))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 13, - "text": [ - "Counter({'bc': 21, 'cs': 20, 'ou': 15, 'sy': 12, 'oz': 10, 'ug': 10, 'ub': 8, 'bv': 8, 'su': 7, 'bb': 7, 'zz': 6, 'yo': 6, 'dd': 6, 'ys': 6, 'py': 6, 'pu': 6, 'jp': 6, 've': 6, 'vy': 6, 'cp': 5, 'co': 5, 'si': 5, 'yz': 5, 'ds': 5, 'po': 5, 'bo': 5, 'eb': 5, 'vb': 5, 'vu': 5, 'sb': 4, 'zb': 4, 'yb': 4, 'dp': 4, 'pl': 4, 'pd': 4, 'pb': 4, 'pz': 4, 'bp': 4, 'js': 4, 'wp': 4, 'og': 4, 'up': 4, 'uo': 4, 'ui': 4, 'yl': 4, 'tv': 3, 'to': 3, 'lv': 3, 'lb': 3, 'yv': 3, 'sj': 3, 'sg': 3, 'sp': 3, 'sr': 3, 'ss': 3, 'sw': 3, 'zs': 3, 'zv': 3, 'zc': 3, 'al': 3, 'yw': 3, 'rn': 3, 'rp': 3, 'db': 3, 'us': 3, 'yy': 3, 'yp': 3, 'st': 3, 'ie': 3, 'gv': 3, 'gp': 3, 'zp': 3, 'gb': 3, 'gc': 3, 'pa': 3, 'pt': 3, 'pr': 3, 'bl': 3, 'wc': 3, 'ow': 3, 'od': 3, 'vh': 3, 'vt': 3, 'hy': 3, 'tp': 2, 'ts': 2, 'cb': 2, 'lw': 2, 'fs': 2, 'sh': 2, 'sl': 2, 'so': 2, 'sz': 2, 'sv': 2, 'zo': 2, 'ro': 2, 'wv': 2, 'rd': 2, 'ry': 2, 'rs': 2, 'dl': 2, 'do': 2, 'dv': 2, 'ir': 2, 'ip': 2, 'qo': 2, 'io': 2, 'ib': 2, 'gz': 2, 'ga': 2, 'av': 2, 'go': 2, 'pw': 2, 'pq': 2, 'by': 2, 'bs': 2, 'bt': 2, 'wd': 2, 'oy': 2, 'or': 2, 'ws': 2, 'iv': 2, 'zd': 2, 'ey': 2, 'er': 2, 'ns': 2, 'vi': 2, 'nj': 2, 'ho': 2, 'uu': 2, 'hh': 2, 'mv': 2, 'as': 2, 'tz': 1, 'tt': 1, 'tw': 1, 'ta': 1, 'tb': 1, 'lp': 1, 'lt': 1, 'ly': 1, 'lz': 1, 'la': 1, 'ld': 1, 'lg': 1, 'lh': 1, 'lj': 1, 'cr': 1, 'lo': 1, 'ln': 1, 'wb': 1, 'sc': 1, 'sd': 1, 'sf': 1, 'na': 1, 'zr': 1, 'ap': 1, 'wo': 1, 'zw': 1, 'zu': 1, 'zt': 1, 'zy': 1, 'ad': 1, 'ae': 1, 'zj': 1, 'ao': 1, 'rc': 1, 'hb': 1, 'rr': 1, 'rv': 1, 'yj': 1, 'yh': 1, 'yn': 1, 'hi': 1, 'de': 1, 'yd': 1, 'yr': 1, 'du': 1, 'dt': 1, 'nl': 1, 'gm': 1, 'wy': 1, 'ia': 1, 'id': 1, 'gs': 1, 'pi': 1, 'ph': 1, 'pg': 1, 'pf': 1, 'bz': 1, 'bu': 1, 'bi': 1, 'bd': 1, 'we': 1, 'ov': 1, 'op': 1, 'os': 1, 'on': 1, 'oi': 1, 'oj': 1, 'oa': 1, 'ob': 1, 'ej': 1, 'ze': 1, 'ed': 1, 'ez': 1, 'ew': 1, 'vg': 1, 'vd': 1, 'va': 1, 'vo': 1, 'oh': 1, 'nu': 1, 'vl': 1, 'vw': 1, 'vv': 1, 'vs': 1, 'uy': 1, 'uv': 1, 'ur': 1, 'un': 1, 'hp': 1, 'hs': 1, 'vm': 1})" - ] - } - ], - "prompt_number": 13 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "' '.join(segment(letters(c6a).translate(''.maketrans({'B':'t', 'C':'h', 'S':'e', 'O':'i', 'U':'n', 'G':'g', 'A':'b', 'V':'o', 'N':'k', 'J':'w', 'T':'m', 'I':'d', 'P':'a', 'W':'p', 'R':'c', 'Y':'r', 'L':'y', 'D':'l', 'H':'f', 'Z':'s', 'Q':'z', 'E':'u', 'F':'v', 'M':'j'}))))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 14, - "text": [ - "'harry good call on the nazi paper trail the attached is a memo from paris high command to goering s secretary referring to the painting and clearly mentioning sara seems like they knew about the scam our friendly ss officer was planning to pull they picked up her trail the night after she went missing but you can read about that in their report still no joy on getting access to the original miss mona in the gallery and i am beginning to think we might need to rollout a black bag job you want to do it or shall i by the way i was surprised by this report the other papers we have from the nazis at this level are encrypted using bifid or playfair style ciphers this one isnt maybe the cipher clerk was off duty that day we got lucky'" - ] - } - ], - "prompt_number": 14 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "trans={'B':'t', 'C':'h', 'S':'e', 'O':'i', 'U':'n', 'G':'g', 'A':'b', 'V':'o', 'N':'k', 'J':'w', 'T':'m', 'I':'d', 'P':'a', 'W':'p', 'R':'c', 'Y':'r', 'L':'y', 'D':'l', 'H':'f', 'Z':'s', 'Q':'z', 'E':'u', 'F':'v', 'M':'j'}" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 15 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "''.join(sorted(trans.keys(), key=lambda k: trans[k]))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 16, - "text": [ - "'PARISHGCOMNDTUVWYZBEFJLQ'" - ] - } - ], - "prompt_number": 16 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "' '.join(segment(keyword_decipher(c6as, 'parishighcommand', 2)))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 17, - "text": [ - "'harry good call on the nazi paper trail the attached is a memo from paris high command to goering s secretary referring to the painting and clearly mentioning sara seems like they knew about the scam our friendly ss officer was planning to pull they picked up her trail the night after she went missing but you can read about that in their report still no joy on getting access to the original miss mona in the gallery and i am beginning to think we might need to rollout a black bag job you want to do it or shall i by the way i was surprised by this report the other papers we have from the nazis at this level are encrypted using bifid or playfair style ciphers this one isnt maybe the cipher clerk was off duty that day we got lucky'" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c6bs = sanitise(c6b)" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 18 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "len(c6bs)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 19, - "text": [ - "1573" - ] - } - ], - "prompt_number": 19 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "from itertools import permutations" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 20 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "list(permutations(range(4)))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 21, - "text": [ - "[(0, 1, 2, 3),\n", - " (0, 1, 3, 2),\n", - " (0, 2, 1, 3),\n", - " (0, 2, 3, 1),\n", - " (0, 3, 1, 2),\n", - " (0, 3, 2, 1),\n", - " (1, 0, 2, 3),\n", - " (1, 0, 3, 2),\n", - " (1, 2, 0, 3),\n", - " (1, 2, 3, 0),\n", - " (1, 3, 0, 2),\n", - " (1, 3, 2, 0),\n", - " (2, 0, 1, 3),\n", - " (2, 0, 3, 1),\n", - " (2, 1, 0, 3),\n", - " (2, 1, 3, 0),\n", - " (2, 3, 0, 1),\n", - " (2, 3, 1, 0),\n", - " (3, 0, 1, 2),\n", - " (3, 0, 2, 1),\n", - " (3, 1, 0, 2),\n", - " (3, 1, 2, 0),\n", - " (3, 2, 0, 1),\n", - " (3, 2, 1, 0)]" - ] - } - ], - "prompt_number": 21 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "[column_transposition_decipher(c6bs, p, fillvalue=' ') for p in permutations(range(4))]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 22, - "text": [ - "['hithhnfrferteaofftnasltyorrreqthimserulrhfsetaeeiuiwsihbnrrtsioiienirhmrpytdtoeircitalnbrpnhtohorliewtshtesposotoynuwhredhhcpicmnootahashtijeanetofrneusragmxurttowleatbrtepptraaesenethhrisnrststrnfldoghaumgseseakuntiahyttnyuntnnvhigwlewfiapasrelfaiebapcmcplahethtolhwsuladseuveaeotaeutateefehlbhtrshgatliaceehtrnhgaasietufnnpurehrelittmudyinnuegicouendeeiahsuelhtnoahtieainyfdniauoenatiyefohedaluaroeryhuraeraterahiaongtwiswsaitbultaomxletoreototonaoortgbcvaipnleewfyrtaeoaduwwetrrtnlrpfpaiellrimntrowieqrecuarndotafnroteletpenrpmshnddetdewhefoypedennsneegtateeanesertgdlueosrburowhdgbrpahenyttekrertrrhnfnedoltswsianiypothmouoctyeieeponhkrnntairlteeiuremnitaphoeaohhnouumtkvsenedeeoidpwkiegtiiiosenhuufanbeuithraerhieehuayasrusiwgadsisitrlgfphiltwiisihesurmromaceisoilvdeoelusairideotnfiesobntsapofgsodrtfirpltanetrlyiosotyoessfntpheaigeaoraieitdmtaaegrhyasrrcfelrtleeanehvehivmhnassieroixlmpsjttesofbmrhndiochecnbttncompusesoehtenetfienootnwooteeriltoigdosmehoifmlroeffdtuesoflerwiiyqdbzottnrfantdigontalaepdsheamnthlpsnbtuoahaalplemnpdrshvnaiaelnhcaliskacdoaedtjghoieadgwayndetenhegeeueoeednoryyrfctemttwntgdetasuoootfwymihrgrhoesinrraofretfenpoyaissesstnhhayeulhiwpcteatuapeanlueelwahaoeluresnbiieasaeteagcdcsorepsroenselvosedudsitlteittfseoesnlnginoernteieiwwlwhteirsiilhtdsrndesrfhrntlgrsuasedadoytasadutenwitcnametertpoesytotocnyutsogcmudlpadleadotefdsbfeleahaxrsonidtieiprashicdcshipbielslnalhorfrentatoraiemklagretmrdcwsnaynwsvnuldorekutnnoutiiunnhvnieilohltefnaeatuifttacetlnnrbhbeglosnaonmifkoaronsnvnfretrcfthdetpswsucpercwtpoawfhdayisooagoaelndfigngrtebltllgfo ',\n", - " 'hihthnrffetreafoftanslytorrreqhtimesrurlhfestaeeiuwisibhnrtrsiioieinrhrmpydttoierctialbnrphntoohrleiwthstepsostooyunwherdhchpimcnotoahsahtjieaentorfnesuramgxutrtolweabtrtpeptaraeesnehthrsinrtsstnrflodghuamgessekaunitahtytnuyntnnvhgiwlwefipaaserlfiaebpacmpclaehthotlhswuldasevueaoetauetaetefhelbthrsghatilaceehtnrhgaasiteufnnpuerhrleitmtudiynneugiocuedneeaihseulhntoathieianydfniuaoeantieyfoehdaulareoryuhrareatreahaiontgwiwssatibutlaoxmleotretootnoaorotgcbvapinleewfrytaoeadwuwertrtlnrppfailelrmintorwiqereucardnotfanrtoeltepernpmhsndedtdweheofypdeensnnegetaeteaensetrgduleorsbuorwhgdbrapheynttkeretrrrnhfndeolstwsainipyotmhoucotyieeeopnhrknnatirtleeuirenmitpahoaeohnhoumutksvendeeeiodpkwietgiioisehnuuafnbueitrhaehrieheuaaysrsuiwagdssiitlrgfhpilwtiiisheusrmormaecisiolvedoeulsariidoetnifesbontaspogfsordtfriplatnertlyoisoytoessfnptheiageoaraeiitmdtaeagryhasrrcflerteleaenhvheivhmnassieorixmlpstjteosfbrmhnidocehcntbtnocmpsueseohtneetifenootnowoteeritloidgosemhofimlorefdftuseofelrwiiyqbdzottnrafntidgotnaleapdhseanmthplsntbuohaaapllenmpdsrhvanialenhacliksacodaetdjgohiedagwyandteenehgeueeoeednroyyfrctmettnwtgedtausootofwmyihgrrheosirnraforeftenopyasisesstnhhayuelhwipcetataupenalueelwhaaoleursenbiieaasetaegccdsoerpsoreneslvsoeddusilttetitfesoenslnignorentieeiwwlwtheisriihltdrsndserfrhntglrsauseaddotyasdautnewictnaemtetrposeyttoocynutosgcumdlapdlaedoetfdbsfeelahxarsnoiditeirpasihcdschibpiesllnlahofrretnatroaimeklgaremtrdwcsnyanwvsnudlorkeutnnouitiunnhvineiolhletfneaatiuftatceltnnbrhbgelonsaomnifokarnosnnvfrterctfhdtepsswuceprctwpowafhadyiosoaogaenldfgingtrebtlllfgo ',\n", - " 'htihhfnrfreteoaffntastlyorrretqhismerlurhsfeteaeiiuwshibnrrtsoiiineirmhrptydteoirictanlbrnphthoorilewsthtsepoostonyuwrhedhhcpcimnootaahshitjenaetfornuesrgamxruttwoletabretpprtaaseentehhirsnsrtsrtnfdlogahumsgesaekutniayhttynunntnvihgwelwfaiparselafieabpccmplhaettholwhsualdsueveeaoteauttaeeefhlhbtrhsgaltiaecehrtnhagaseitunfnprueherlittmuydinunegciounedeieahuselthnohatiaeinfydnaiuoneatyiefhoedlauaorerhyurearaetraihaogntwsiwsiatblutamoxlteoroetootnaoortbgcviapnelewyfrteaoaudwwterrntlrfppaeillirmnrtoweiqrceuanrdoatfnorteeltpnerpsmhnddetedwhfeoyepdennsneegttaeenaesretglduesorbruowdhgbprahneytetkrretrhrnfendotlswisanyipohtmooucteyiepeonkhrntnailrteieurmeniatpheoaohhnouumtvkseendeoeidwpkigetiiiosnehufuanebuihtrarehieehuyaasursigwadissirtlgpfhitlwisiihseurrmomcaeiosildveoleusiariedotfnieosbnstapfogsdortifrptlanterliyostoyosesftnphaeigaeoriaeidtmtaaeghryarsrceflrlteenaehevhimvhnsasireoilxmpjsttseofmbrhdniohcecbnttcnomupseosehetneftieonotwnooeterlitogidomsehiofmrloeffdteusolferiwiydqbztotnfrandtignotaalepsdhemantlhpsbntuaohalaplmenprdshnvaiealnchalsikadcoadetjhgoiaedgawynedtehnegeeueeoedonryryfcetmtwtntdgetsauoootfywmirhgrohesnirroafrtefepnoyiasssesthnhaeyulihwptceautapaenleuelawhaeoluersnibiesaaeetagdccsroeprsoesnelovseuddstiltiettsfeosenlgnineornetiewiwlhwterisilihtsdrnedsrhfrnltgrusasdeadyotaasduetnwticnmaetretpeosyottoncyustogmcudpladeladtoefsdbfleeaahxrosnitdiepirahsiccdshpibileslanlhrofrnetaotraeimkalgrtemrcdwsanynswvnludoerkuntnotuiinunhnvieliohtlefaneautifttactelnrnbhebglsonanomikfoaornsvnnfertrfcthedtpwssupcerwctpaowfdhaysioogaoalendifgnrgtelbtlglfo ',\n", - " 'hhithrnffterefaofatnsyltorrrehqtiemsrrulhefsteaeiwuisbihntrrsiioiienrrhmpdyttioertciablnrhpntoohreliwhtstpesotsoouynwehrdchhpmicntooashahjtieeantrofnseurmagxturtlowebatrptepatraeesnhethsrintrssntrfoldguhamegsskeauintathytunynntnvghiwwlefpiaaesrlifaepbacpmcleahtohtlshwudlasveueoaetuaeteatehfeltbhrgshaitlaecehntrhagastieunfnpeurhlreimttuidynenugoicudeneaeihesulnhtotahiieandyfnuiaoaenteiyfeohdualaeroruyhrraearteaahiotngwwisstaibtulaxomloetrteoontoarootcgbvpainelewrfytoaeawduwretrltnrppfalielmrinotrwqieruecadrnoftantroetleprenphmsneddtwdehoefydpeesnnngeeteateeanstergudlerosbourwghdbarphyentkterterrnrhfdneosltwasinpiyomthocuotiyeeoepnrhknantitrleueirnemiptahaoeonhhomuutskvedneeieodkpwitegioiishenuaufnubeirthaheriheeuaayssruiawgdssiiltrghfpiwltiiishuesromrmeaciisolevdouelsraiiodetinfebsonatspgofsrodtrfipaltnretloyisyotosesfpnthieagoeareaiimtdteaagyrharsrclferetleeanhhveihvmnsasioerimxlptsjtoesfrbmhindoechctnbtoncmspueesohnteeitfeonotonwoetertilodigoesmhfoimolredfftsueoeflriwiybqdztotnarfnitdgtonaelaphdsenamtphlstnbuhoaapallnempsdrhavnilaenahclkisaocdatedjoghideagywantdeeenhgueeeeoedrnoyfyrcmtetntwtegdtuasotoofmwyighrrehosrinrfaorfeteonpysaissesthnhauyelwhipectaatupnealeuelhwaaloeusrenibieaaseategccdseorposreenslsvoedduslittteitefsoneslingnroeniteewiwltwhesirihiltrdsnsderrfhngtlrasusaeddtoyadsauntewcitneamtterpsoeyttooycnuotsgucmdalpdaledeotfbdsfeelaxharnsoiidteripaishcsdchbipiselllnahforrtenartoamiekglarmetrwdcsynanvwsndulokreuntnoiutinunhivneoilheltfenaaitufattcletnbnrhgbelnosamoniofkanrosnnvftrertcfhtdepsswuecprtcwpwoafahdyoisooaganeldgfintgretbllflgo ',\n", - " 'hthihfrnfrteeofafnatstylorrrethqisemrlruhsefteeaiiwushbinrtrsoiiiniermrhptdyteioritcanblrnhpthoorielwshttspeootsonuywrehdhchpcminotoaashhijteneatfronusergmaxrtutwloetbareptprataseenthehisrnstrsrntfdolgauhmsegsakeutinaythtyunnnntvighwewlfapiareslaifeapbccpmlheattohlwshuadlsuveeeoateuatteaeehflhtbrhgsalitaeechrnthaagsetiunnfpreuhelritmtuyidnuengcoiundeeiaehuesltnhohtaiaienfdynauionaetyeifheodluaaoerrhuyreraaertaiahogtnwswisitabltuamxoltoeroteoontaorotbcgvipaneelwyrfteoaauwdwtrernltrfppaelilimrnrotweqircueandroaftnotreetlpnrepshmndedtewdhfoeyedpensnnegetteaeneasrtegludesrobrouwdghbparhnyetektrrterhnrfednotslwiasnypiohmtoocuteiyepoenkrhntaniltreiuermneiaptheaoohnhoumutvskeedneoiedwkpigteiioisnheufauneubihrtarheieheuyaasusrigawdissirltgphfitwlisiihsuerrommceaioisldevoluesiraieodtfineobsnsatpfgosdrotirfptalntrelioystyoosseftpnhaiegaoerieaidmttaeaghyrarrscelfrleteneahehvimhvnssairoeilmxpjtstsoefmrbhdinoheccbtntconmuspeoeshentefiteoontwonoeetrltiogdiomeshifomrolefdftesuolefriiwydbqzttonfarnditgntoaaelpshdemnatlphsbtnuahoalpalmneprsdhnavielancahlskiadocadtejhogiadegaywnetdehengeueeeeodornyrfycemttwnttdegtsuaootofymwirghroehsnrirofartfeeponyisasssethhnaeuyliwhptecauatpaneleeulahwaelouesrniibesaaeeatgdccsreoprosesenlosveuddstlititetsefosnelginneroneitewwilhtwersiilhitsrdnesdrhrfnlgtruassdaedytoaadsuentwtcinmeatrtepesoyottonycusotgmucdpaldealdteofsbdfleeaaxhronsitidepriahisccsdhpbiilselalnhrfornteaortaemikaglrtmercwdsaynnsvwnlduoekrunntotiuinnuhniveloihtelfaenauitftatctlenrbnhegblsnoanmoikofaonrsvnnfetrrftchetdpwssupecrwtcpawofdahysoiogoaalnedigfnrtgeltblgflo ',\n", - " 'hhtihrfnftreefoafantsytlorrrehtqiesmrrluhesfteeaiwiusbhintrrsioiiinerrmhpdtytieorticabnlrhnptohoreilwhsttpseotosounywerhdchhpmcintooasahhjiteenatrfonsuermgaxtrutlwoebtarpetpartaesenhtehsirntsrsnrtfodlguahmesgskaeuitnatyhtuynnnntvgihwwelfpaiaersliafepabcpcmlehatothlswhudalsvueeoeatueatetaeheflthbrghsailtaeechnrthaagsteiunnfperuhlerimttuiydneungociudneeaieheuslnthothaiiaendfynuaioaneteyifehodulaaeorruhyrreaaretaaihotgnwwsistiabtluaxmolotertoeonotarootcbgvpianeelwryftoeaawudwrterlntrpfpaleilmirnortwqeiruceadnrofatntoretelprnephsmneddtwedhofeydepesnnngeetetaeenastreguldersoboruwgdhbaprhynetketrtrernhrfdenostlwaisnpyiomhtocoutieyeopenrkhnatnitlreuiernmeipathaeoonhhomuutsvkedeneioedkwpitgeioiishneuafunuebirhtahreiheeuayassuriagwdsisilrtghpfiwtliisihuserormmecaiiosledvoulesriaioedtifnebosnastpgfosrdotrifpatlnrteloiysytoossefptnhiaegoaereiaimdtteaagyhrarrsclefrelteenahhevihmvnssaioreimlxptjstosefrmbhidnoehcctbntocnmsupeeoshneteifteoontownoeetrtliodgioemshfiomorledfftseuoelfriiwybdqzttonafrnidtgtnoaealphsdenmatplhstbnuhaoaplalnmepsrdhanvileanachlksiaodcatdejohgidaegyawntedeehngueeeeeodronyfrycmettnwttedgtusaotoofmywigrhreohsrnirfoarfteeopnysiasssethhnaueylwihpetcaautpnaeleeulhawaleouserniibeasaeaetgcdcseroporseesnlsovedudsltittietesfonselignnreonietewwilthwesriihlitrsdnsedrrhfngltraussadedtyoadasunetwctinemattrepseoytotoyncuostgumcdapldaeldetofbsdfeleaxahrnosiitderpiaihscscdhbpiislellanhfrortnearotameikgalrmterwcdsyannvswndluokerunntoituinnuhinveolihetlfeanaiutfattcltenbrnhgeblnsoamnoiokfanorsnvnfterrtfchtedpswsuepcrtwcpwaofadhyosioogaanledgifntrgetlblfglo ',\n", - " 'ihthnhfrefrtaeoftfnalstyrorrqethmiseurlrfhseateeuiiwishbrnrtisoieinihrmryptdoteicritlanbprnhotholrietwshetspsootyonuhwrehdhcipcmonothaasthijaeneotfrenusargmuxrtotwlaetbtreptpraeaseenthrhisrnsttsrnlfdohgaugmseesaknutihaytntyutnnnhviglwewifapsareflaibeapmccpalhehttohlwsluadesuvaeeoateuattefeehblhtsrhgtalicaeethrnghaaisetfunnuprerheltitmduyinnueigcoeundeeiashuehltnaohteiaiynfdinaueonaityeofheadluraoeyrhuarertaerhaianogtiwswasitubltoamxeltoerottoonoaorgtbcaviplneefwyrateodauwewtrtrnlprfpiaelrlimtnroiweqercurandtoafrnotleetepnrmpshdndedtewehfopyednensenegatteaeneesrtdgluoesrubrohwdgrbpaehnyttekerrtrrhnnfedlotsswiainyptohmuoocyteieepohnkrnntarilteeiuermntiapoheahohnuoumktvsneedeeoipdwkeigtiiioesnhuufabneutihrearheiehauyarsuswigasdistirlfgphlitwiisiehsumrroamcesioivldeeoluasirdieontfiseobtnsaopfgosdrftirlptaentrylioostyeossnftpehaiegaoarietidmataerghysarrfceltrleaenevhehvimhansseiroxilmspjtetsobfmrnhdicohencbtntcopmusseoethentefineoontwotoeeirltiogdsomeohiflmrofefdutesfolewriiqydbozttrnfatndiogntlaaedpshaemnhtlpnsbtouahaalpelmndprsvhnaaielhncailskcadoeadtgjhoeiadwgaydnetneheegeuoeeendoryyrftcemttwngtdeatsuoootwfymhirghroeisnrarofertfnepoayisesssnthhyaeuhliwcptetauaepanuleewlahoaelruesbniiaesateeacgdcosrespronesevlosdeudistletitftseeosnnlgionertneiiewwwlhtiersiilhdtsrdnesfrhrtnlgsruaesdaodytsaadtueniwtcanmeetrtopestyotconytusocgmuldpaldeaodtedfsbeflehaaxsronditiieprsahidccsihpbeilsnlalohrfernttaoriaemlkagertmdrcwnsaywnsvunldroektunnuotiuinnvhniielolhtenfaetauitftaectlnnrbbhegolsnoanmfikoraonnsvnrfetcrftdhetspwscupecrwtopawhfdaiysoaogoealnfdiggnrtbeltllgf o ',\n", - " 'ihhtnhrfeftraefotfanlsytrorrqehtmiesurrlfhesateeuiwiisbhrntrisioeiinhrrmypdtotiecrtilabnprhnotohlreitwhsetpssotoyounhwerhdchipmcontohasathjiaeenotrfensuarmguxtrotlwaebttrpetpareaesenhtrhsirntstsnrlfodhguagmeseskanuithatyntuytnnnhvgilwweifpasaerfliabepamcpcalehhtothlswludaesvuaeoeatueatetfeheblthsrghtailcaeethnrghaaistefunnuperrhletimtduiynneuigoceudneeaisheuhlntaotheiiayndfinuaeoaniteyofehadulraeoyruharretarehaainotgiwwsastiubtloaxmelotertotonooarogtcbavpilneefwryatoedawuewrttrlnprpfialerlmitnoriwqeerucradntofarntoleteeprnmphsdneddtweehofpydenesnengeatetaeenestrdguloersuborhwgdrbapehynttkeertrrrnhnfdelostswaiinpytomhuocoytieeeophnrknnatritleeuiernmtipaohaehonhuomuktsvnedeeeiopdkweitgiioieshnuuafbnuetirheahreiheauayrssuwiagsdsitilrfghpliwtiiisehusmroramecsiiovledeoulasridioentifsebotnasopgfosrdftrilpatenrtyloiosyteossnfptehiaegoaareitimdateargyhsarrfcletrelaeenvhhevihmansseiorximlsptjetosbfrmnhidcoehnctbntocpmsuseeothneteifneoontowtoeeirtliodgsoemohfilmorfedfutsefoelwriiqybdozttrnaftnidogtnlaeadphsaenmhtplnstbouhaaaplelnmdpsrvhanailehnacilkscaodeatdgjoheidawgyadnteneehegueoeeendroyyfrtcmettnwgtedatusootowfmyhigrhreoisrnarfoerftneopaysiesssnthhyauehlwicpettaauepnauleewlhaoalerusebniiaeasteaecgcdosersporneesvlsodeduisltettifteseonsnligonretnieiewwwlthiesriihldtrsdnsefrrhtnglsrauesadodtysadatuneiwctanemettropsetytocoyntuoscgumldapldaeodetdfbsefelhaxasrnodiitierpsaihdcscihbpeislnllaohfrertntaroiamelkgaermtdrwcnsyawnvsundlroketunnuoituinnvhinieollhetnfeataiutfatecltnnbrbhgeolnsoamnfiokranonsnvrftecrtfdhtespswcuepcrtwopwahfadiyosaoogeanlfdgigntrbetlllfg o ',\n", - " 'thihfhnrrfetoeafnftatslyrorrteqhsimelrurshfeetaeiiuwhsibrnrtosiinieimrhrtpydetoiirctnalbnrphhtooirleswthstepoostnoyurwhehdhccpimonotaahsihtjneaeftorunesgramrxutwtolteabertprptasaeetnehihrssnrtrstndfloaghusmgeasektuniyahtytnunntnivhgewlwafiprasealfiaebpccmphlaetthowlhsaulduseveeaoetauttaeeefhhlbthrsglatieacerhtnahgaesitnufnrpueehrltitmyudiunnecgionuedieeauhsetlhnhoataieifnydaniunoeaytiehfoeldauoarehryuerareatriahagontswiwisatlbutmaoxtleooretootnoaorbtgcivapenleywfretaouadwtwernrtlfrppeaililrmrntoewiqcreunardaotfonrteeltnperspmhdndeetdwfheoeypdnensenegttaeneaersetlgduseorrbuodwhgpbranheyettkrrethrrnefndtolsiwsayniphotmooucetyipeeoknhrtnnalirtieeumrenaitpehoahohnuoumvtkseendoeeiwdpkgietiiionsehfuuaenbuhitrraeheiehyuaausrsgiwaidssritlpgfhtilwsiiisheurrmocmaeoisidlveloeuisareidoftnioesbsntafpogdsoritfrtplatnerilyotsoysoestfnpaheiageoiraeditmataehgryrasrecfllrteneaeehvhmivhsnasrieolixmjpststeomfbrdhnihocebcntctnoumpsoeseehtnfetioenowtnoeotelritgoidmoseihofrmlofefdetuslofeirwidyqbtzotfnradntingotaalespdhmeanlthpbsntauohlaapmlenrpdsnhvaeialcnhaslikdacodaethjgoaiedagwyendtheneegeueeoeodnrryyfectmwttndtgestauoootyfwmrihgorhensiroraftrefpenoiyassseshtnheayuilhwtpceuataapeneluealwheaoleursinbiseaaeetadgccrsoerpsoseneolvsueddtsilitetstfesoenglnienorentiweiwhlwtreisliihstdrendshrfrlntgursadseaydotaasdeutntwicmnaerteteposoyttnocysutomgcupdlaedlatdoesfdblfeeaahxorsntidipeirhasiccdsphibliesalnlrhofnretoatreaimaklgtremcrdwasnysnwvlnudeorknutntouiniunnhvileiothleafneuatitftatcelrnnbehbgslonnaomkifooarnvsnnefrtfrctehdtwpsspucewrctapowdfhasyiogoaolaenidfgrngtlebtgllf o ',\n", - " 'hhitrhnftferfeaoaftnysltrorrheqteimsrrulehfsetaewiuibsihtnrrisioiienrrhmdpytitoetrcibalnhrpnotoherlihwtsptestosouoynewhrcdhhmpictnoosahajhtieeanrtofsneumragtxurltowbeatprteaptreaeshnetshritnrsnstrofldughaemgskseaiunttahyutnynntngvhiwwlepfiaeasrilfapebapcmcelahothtslhwdulavseuoeaeutaeetathefetlbhgrshiatleacenhtrahgatsienufnepurlhremittiudyennuogicduenaeeiehsunlhttoahiieadnyfuniaaoenetiyefohudalearouryhrraerateaahitongwwistsaitbulxaomolettreonotoraooctgbpvaienlerwfyotaewadurwetlrtnprpflaiemlriontrqwieurecdarnfotatnrotelerpenhpmsenddwtdeohefdypesenngneeetateeantserugdlreosoburgwhdabrpyhenkttetrernrrhdfnesoltawsipniymothcouoityeoeeprnhkannttirlueeinrempitaahoenohhmouustkvdeneieeokdpwtiegoiiihsenauufunberithhaerhieeauayssruaiwgsdsilitrhgfpwiltiiisuhesormremaciisoelvduoelrsaioideitnfbesoantsgpofrsodrtfiapltrnetolyiysotsoespfntiheaogeaeraimitdetaaygrhrasrlcfeertleeanhhvehivmsnasoiermixltpsjotesrfbmihndeochtcnbotncsmpueesonhteietfoenootnweotetrildoigeosmfhoiomlrdeffstueeoflirwibyqdtzotanrfintdtgonealahpdsneampthltsnbhuoapaalnlemspdrahvnliaeanhcklisoacdtaedojghdieaygwatndeeenhugeeeeoerdnofyyrmctenttwetgdutastooomfwygihrerhorsinfraofretoenpsyaisseshtnhuayewlhiepctaatunpeaeluehlwalaoesureinbiaeasaetecgcdesoropsreensslvodedulsittteietfsnoesilngrnoeinteweiwtlwhseirhiilrtdssnderrfhgntlarsuasedtdoydasanutecwitenamtterspoetytoyocnoutsugcmadlpadleedotbfdsefelxahanrsoiidtreipiashscdcbhipsielllnafhortrenratomaiegklamretwrdcysnavnwsdnulkorenutnioutniunihvnoeilehltefnaiatuafttlcetbnnrghbenlosmaonoifknaronsnvtfretrcfthdespsweucptrcwwpoaafhdoyisooagnaelgdfitngrteblfllg o ',\n", - " 'thhifhrnrfteoefanfattsylrorrtehqsiemlrrushefeteaiiwuhsbirntrosiiniiemrrhtpdyetioirtcnablnrhphtooirelswhtstpeootsnouyrwehhdchcpmiontoaashihjtneeaftrounsegrmarxtuwtlotebaerptrpatsaeetnheihsrsntrrsntdfolaguhsmegasketuinyathytunnnntivghewwlafpiraesalifaepbccpmhleattohwlshaudlusveeeoaetuatteaeehfhltbhrgslaiteaecrhntahagestinunfrpeuehlrtimtyuidunencgoinudeieaeuhestlnhhotaaiiefndyanuinoaeyteihfeolduaoaerhruyerraeartiaahgotnswwiistalbtumaxotloeorteoontoarobtcgivpaenelywrfetoauawdtwrenrltfrppealiilmrrnotewqicruenadraoftontreetlnpresphmdnedetwdfhoeeydpnesnengetteaneearstelgudserorboudwghpbarnhyeetktrrtehrnrefdntosliwasynpihomtoocuetiypeoeknrhtnanlitrieuemrneaiptehaohonhuomuvtskeednoeiewdkpgiteiioinshefuauenubhirtraheeiheyuaaussrgiawidssriltpghftiwlsiiishuerromcmeaoiisdlevloueisraeiodftinoebssnatfpgodsroitrftpaltnreiloytsyososetfpnahieagoeireadimtateahgyrrarseclflretneeaehhvmihvsnsarioelimxjptsstoemfrbdhinhoecbctnctonumspoeesehntfeitoeonwtoneoetlrtigodimoesihformolfedfetsuloefiriwdybqtztofnardnitngtoaaelsphdmenaltphbstnauholapamlnerpsdnhaveilacnahslkidaocdatehjogaideagywentdheenegueeeeoodrnryfyecmtwtntdtegstuaootoyfmwrighorehnsriorfatrfepeoniysasssehthneauyilwhtpecuaatapneeleualhwealoeusrinibseaaeeatdgccrseorposseenolsvueddtsliittestefsoneglinenroenitwewihltwresilihistrdensdhrrflngturasdsaeydtoaadseunttwcimneartteepsooyttnoycsuotmgucpdaledaltdeosfbdlfeeaaxhornstiidperihaisccsdphbiliseallnrhfonrteoarteamiakgltrmecrwdasynsnvwlndueokrnunttoiuninunhivleoithelafenuaittfattclernbnehgbslnonamokiofoanrvsnneftrfrtcehtdwpsspuecwrtcapwodfahsyoigooalaneidgfrntgletbglfl o ',\n", - " 'hhtirhfntfrefeoaafntystlrorrhetqeismrrluehsfeteawiiubshitnrrisoiiinerrmhdptyiteotricbanlhrnpothoerilhwstptsetoosuonyewrhcdhhmpcitnoosaahjhiteenartfosnuemrgatxrultwobetapretaprteasehnteshirtnsrnsrtofdlugahemsgksaeiutntayhutynnnntgvihwwelpfaiearsilafpeabpccmelhaotthslwhdualvsueoeeauteaettaheeftlhbgrhsialteaecnhrtahagtseinunfeprulhermittiuydenunogciduneaeieehusnlthtohaiiaednfyunaiaoneetyiefhoudlaeaorurhyrrearaetaaihtognwwsitsiatbluxamooltetroenootraooctbgpviaenelrwyfoteawaudrwtelrntprfplaeimlironrtqweiurcedanrfoattnorteelrpnehpsmenddwtedohfedyepsenngneeettaeenatsreugldresoobrugwdhabpryhnektettrrenrhrdfensotlawispnyimohtcoouiteyoepernkhantntilrueienrmepiataheonohhmouustvkdeenieoekdwptigeoiiihsneaufuunebrihtharehieeauyassuraigwsdislirthgpfwitliisiuhseorrmemcaiioseldvuolersiaoieditfnbeosanstgpforsdortifaptlrnteoliyystososepftnihaeogaeeriamidtetaayghrrarslceferlteenahhevhimvsnsaoiremilxtpjsotserfmbihdneohctcbnotcnsmupeeosnhetieftoeonotwneoettrlidogieomsfhioomrldeffsteueolfiriwbydqtztoanfrindttgnoeaalhpsdnemaptlhtsbnhuaopalanlmesprdahnvlieaanchklsioadctadeojhgdiaeygawtnedeehnugeeeeeordonfyrymcetntwtetdgutsatooomfywgirherohrsnifroafrteoepnsyiasssehthnuaeywliheptcaautnpaeeleuhlawlaeosuerinibaesaaeetcgdcesrooprseesnslovdeudlstittieetsfnoseilgnrneoinetwewitlhwserihilirtsdsnedrrhfgnltarusasdetdyodaasnuetcwtienmattrespeotyotyoncoustugmcadpladeledtobfsdeflexaahnrosiitdrepiiahssccdbhpisilellanfhrotrneraotmaeigkalmrtewrcdysanvnswdnlukoernuntiotuninuihnvoeliehtlefaniautafttlctebnrnghebnlsomanooikfnaornsvntfertrfcthedspwseupctrwcwpaoafdhoysiooganalegdiftnrgtelbflgl o ',\n", - " 'ithhnfhrerftaoeftnfaltsyrrorqtehmsieulrrfsheaeteuiiwihsbrrntiosieniihmrrytpdoeticirtlnabpnrhohtoliretswhestpsootynouhrwehhdcicpmoonthaastihjaneeoftreunsagrmurxtowtlatebterptrpaesaeetnhrihsrsnttrsnldfohagugsmeeaskntuihyatnytutnnnhivglewwiafpsraefalibaepmccpahlehttohwlslaudeusvaeeoaetuattefeehbhltshrgtlaiceaetrhngahaiestfnunurperehlttimdyuinuneicgoenudeieasuhehtlnahoteaiiyfndianuenoaiyteohfealduroaeyhruaerrtearhiaangotiswwaistulbtomaxetloeorttoonooargbtcaivplenefywraetoduawetwrtnrlpfrpiealrilmtrnoiewqecrurnadtaofrontleetenprmsphddnedetwefhopeydnneseengatteaneeerstdlguoserurbohdwgrpbaenhytetkerrtrhrnnefdltossiwaiynpthomuoocyetiepeohknrntnarliteieuemrntaipoehahhonuuomkvtsneedeoeipwdkegitiiioenshufuabenuthireraheeihayuarusswgiasidstrilfpghltiwisiieshumrroacmesoiivdleelouaisrdeionftisoebtsnaofpgodsrfitrltpaetnryilootsyesosntfpeahieagoairetdimaaterhgysrarfecltlreaneevehhvmihasnserioxlimsjptestobmfrndhichoenbctnctopumssoeetehntfeinoeonwtoteoeilrtigodsmoeoihflrmoffeduetsfloewiriqdybotztrfnatdniongtlaaedsphamenhltpnbstoauhalapemlndrpsvnhaaeilhcnaislkcdaoedatghjoeaidwagydentnheeeeguoeeenodryryftecmtwtngdteastuoootwyfmhrighoreinsraorfetrfnpeoaiysesssnhthyeauhilwctpetuaaeapnuelewalhoealreusbiniaseateeacdgcorsesrponseevolsdueditsleittfsteesonnglioenrteniiwewwhltiresilihdstrdensfhrrtlngsuraedsaoydtsaadteunitwcamneerttoepstoytcnoytsuocmgulpdaledaotdedsfbelfehaaxsorndtiiipershaidccsiphbelisnallorhfenrttoarieamlakgetrmdcrwnasywsnvulndreoktnunutoiuninvnhiileolthenafetuaittfaetclnrnbbehgoslnonamfkioroannvsnreftcfrtdehtswpscpuecwrtoapwhdfaisyoagooelanfidggrntbletlglf o ',\n", - " 'ihhtnrhfetfrafeotafnlystrrorqhetmeisurrlfehsaeteuwiiibshrtnriisoeiinhrrmydptoitectrilbanphrnoothlerithwseptsstooyuonhewrhcdhimpcotnohsaatjhiaeenortfesnuamrgutxroltwabettpretapreeasehntrshirtnstnsrlofdhugagemseksaniuthtaynutytnnnhgvilwweipfasearfilabpeampccaelhhotthslwlduaevsuaoeeauteaettfheebtlhsgrhtialceaetnhrgahaitsefnunueprrlhetmitdiuynenuiogceduneaeisehuhnltatoheiiaydnfiunaeaonietyoefhaudlreaoyurharretraehaaintogiwwsatsiutbloxameoltetrotnoooraogctbapvilenefrwyaotedwauerwttlrnpprfilaermlitonriqweeurcrdantfoartnolteeerpnmhpsdenddwteeohfpdyensenegneaettaeenetsrdugloresuobrhgwdrabpeyhntkteetrrrnrhndfelsotsawiipnytmohucooyiteeoephrnknantrtileueienrmtpiaoahehnohumoukstvndeeeieopkdwetigioiiehsnuaufbunetriheharehieaauyrssuwaigssditlirfhgplwitiiiseuhsmorraemcsiioveldeuolarsidoienitfsbeotansogpforsdfrtilapterntyolioystesosnpfteihaeogaaeritmidaetaryghsrarflceterlaeenvhhevhimasnseoirxmilstpjeotsbrfmnihdceohntcbnotcpsmuseeotnhetiefnoeonotwteoeitrlidogseomofhilomrfdefustefeolwiriqbydotztranftindotgnleaadhpsanemhptlntsbohuaapalenlmdsprvahnaliehanciklscoadetadgojhediawygadtneneeheugeoeeenrdoyfyrtmcetntwgetdautsotoowmfyhgirheroirsnafroefrtnoepasyiesssnhthyuaehwlicepttaauenpauelewhlaolaersuebiniaaestaeeccgdoesrsoprneesvsloddeuilstettifetsenosnilgornetineiwewwtlhiserihildrtsdsnefrrhtgnlsarueasdotdysdaatnueicwtaenmettrospettyocyontouscugmladpladeoedtdbfseeflhxaasnrodiitirepsiahdsccibhpesilnllaofhretrntraoimaelgkaemrtdwrcnysawvnsudnlrkoetnunuiotuninvihnioellehtnefatiautaftelctnbnrbgheonlsomanfoikrnaonnsvrtfectrfdthesspwceupctrwowpahafdioysaoogenalfgdigtnrbtellflg o ',\n", - " 'tihhfnhrreftoaefntfatlsyrrortqehsmielurrsfheeateiuiwhisbrrntoisineiimhrrtypdeotiicrtnlabnprhhotoilrestwhsetposotnyourhwehhdccipmoontahasithjnaeefotruensgarmruxtwotltaebetrprtpaseaetenhirhssrntrtsndlfoahgusgmeaesktnuiyhatyntuntnnihvgelwwaifprsaeafliabepcmcphalethtowhlsaluduesveaeoeatutateefehhblthsrgltaiecaerthnaghaeistnfunrupeerhlttimyduiunnecigoneudieeaushethlnhaotaeiifyndainuneoayitehofeladuoraehyruearretarihaagnotsiwwiastlubtmoaxtelooertotonooarbgtciavpelneyfwreatoudawtewrntrlfprpeialirlmrtnoeiwqcerunradatofornteletneprsmphddneedtwfehoepydnneseengtatenaeerestldgusoerrubodhwgprbanehyettkrerthrrnenfdtlosiswayinphtomouoceytipeeokhnrtnnalritieeumernatipeohahhonuuomvktsenedoeeiwpdkgeitiiioneshfuuaebnuhtirreaheeihyauaurssgwiaisdsrtilpfghtliwsiiisehurmrocameosiidvleleouiasrediofntiosebstnafopgdosriftrtlpatenriylotosyseostnfpaehiaegoiaredtimaatehrgyrsarefclltrenaeeevhhmvihsansreiolximjsptsetombfrdnhihcoebnctcntoupmsoseeethnfteioneowntoetoelirtgiodmsoeiohfrlmoffedeutslfoeiwridqybtoztfrnadtninogtalaesdphmaenlhtpbnstaouhlaapmelnrdpsnvhaeailchnasilkdcaodeathgjoaeidawgyednthneeeegueoeeondrryyfetcmwttndgtesatuoootywfmrhigohrenisroarfterfpneoiayssesshntheyauihlwtcpeutaaaepneuleawlheoalerusibnisaeaeteadcgcrosersposneeovlsudedtisliettsfteseongnlieonretniwiewhwltriesliihsdtrednshfrrltngusradesayodtasadetuntiwcmaneretteopsotytncoystuomcgupldaeldatodesdfblefeahaxosrntdiipierhsaicdcspihbleisanllrohfnertotareiamalkgtermcdrwansyswnvlunderokntuntuoinuinnvhilieotlheanfeutaittfateclrnnbebhgsolnnoamkfiooranvnsnerftfcrtedhtwspspcuewcrtaopwdhfasiyogaooleanifdgrgntlbetgllf o ',\n", - " 'hihtrnhftefrfaeoatfnylstrrorhqetemisrurlefhseatewuiibishtrnriisoieinrhrmdyptiotetcriblanhprnoothelrihtwspetstsoouyonehwrchdhmipctonoshaajthieaenrotfsenumargtuxrlotwbaetptreatpreeashentsrhitrnsntsrolfduhgaegmskesainutthayuntyntnnghviwlwepifaesariflapbeapmccealhohttshlwdluavesuoaeeuateeatthfeetblhgsrhitalecaenthraghatisenfuneuprlrhemtitiduyennuoigcdeunaeeieshunhlttaohieiadynfuinaaeoneityeofhuadleraouyrhrarertaeahaitnogwiwstasitublxoamoeltterontooroaocgtbpavielnerfwyoatewdaurewtltrnpprfliaemrliotnrqiweuercdranftoatrnotleerepnhmpsedndwdteoehfdpyesnengeneeatteaentesrudglroesoubrghwdarbpyehnktteterrnrrhdnfeslotaswipinymtohcuooiyteoeeprhnkannttrilueeinermptiaaohenhohmuousktvdneeieeokpdwteigoiiihesnauufubnertihhearheieaauysrsuawigssdiltirhfgpwlitiiisuehsomrreamcisioevldueolrasiodieintfbseoatnsgopfrosdrftialptrentoyliyostseospnftiehaoegaearimtideatayrghrsarlfceetrleaenhvhehvimsansoeirmxiltspjoetsrbfminhdecohtncbontcspmueseontheitefoneoontwetoetirldiogesomfohiolmrdfefsuteefoliwribqydtoztarnfitndtognelaahdpsnaemphtltnsbhouapaalnelmsdpravhnlaieahnckilsocadteadogjhdeiaywgatdneenehuegeeoeerndofyyrmtcenttwegtduatstooomwfyghirehrorisnfarofertonepsayisesshnthuyaewhliecptataunepaeulehwlaloaesrueibniaaesateeccgdeosrosprenessvloddeulisttetieftsneosinlgroneitnewiewtwlhsierhiilrdtssdnerfrhgtnlasruaesdtodydsaantueciwteanmtetrsopettyoyconotusucgmaldpaldeeodtbdfseeflxhaansroiditriepisahsdccbihpseillnlafohrternrtaomiaeglkamertwdrcynsavwnsdunlkroentuniuotnuinivhnoielelhtenfaitauatftlectbnnrgbhenolsmoanofiknraonnsvtrfetcrftdhesspwecuptcrwwopaahfdoiysoaognealgfditgnrtbelfllg o ',\n", - " 'thhifrhnrtfeofeanafttyslrrortheqseimlrrusehfeetaiwiuhbsirtnroisiniiemrrhtdpyeitoitrcnbalnhrphotoierlshwtspteotosnuoyrewhhcdhcmpiotnoasahijhtneeafrtousnegmrartxuwltotbeaeprtraptseaethneishrstnrrnstdoflaughsemgaksetiunytahyutnnnntigvhewwlapfireasailfapebcpcmhelatothwslhaduluvseeoeaeutatetaehefhtlbhgrsliateeacrnhtaahgetsinnufrepuelhrtmityiuduenncogindueiaeeuehstnlhhtoaaiiefdnyauninaoeyetihefoludaoearhuryerraeratiaahgtonswwiitsaltbumxaotoleotreonotoraobctgipvaeenlyrwfeotauwadtrwenlrtfprpelaiimlrronteqwicurendarafototnretelnrpeshpmdendewtdfoheedypnsenegnetetaneeartselugdsreorobudgwhpabrnyheekttrtrehnrredfntsoliawsypnihmotocoueitypoeekrnhtannltiriueemnreapiteahohnohumouvstkedenoieewkdpgtieioiinhsefauueunbhritrhaeehieyauaussrgaiwisdsrlitphgftwilsiiisuherormcemaoiisdelvluoeirsaeoidfitnobessantfgpodrsoirtftapltrneiolytysossoetpfnaiheaogeieradmitaetahygrrraselcflertneeaehhvmhivssnaroielmixjtpssotemrfbdihnheocbtcncotnusmpoeesenhtfietooenwotneeotltrigdoimeosifhoromlfdefestuleofiirwdbyqttzofanrdintntgoaealshpdmnealpthbtsnahuolpaamnlerspdnahveliacanhsklidoacdtaehojgadieaygwetndheeneugeeeeoordnrfyyemctwnttdetgsutaotooymfwrgihoerhnrsiofratfrepoenisyasssehhtneuayiwlhtepcuaatanpeeeluahlwelaoesuriinbsaeaeaetdcgcresoropsseenoslvudedtlsiittesetfsnoegilnernoeintwweihtlwrseilhiisrtdesndhrrflgntuarsdaseytdoadasenuttcwimenartteespootytnyocsoutmugcpadleadltedosbfdlefeaxahonrstiidpreihiascscdpbhilsieallnrfhontreoratemaiagkltmrecwrdaysnsvnwldnuekornnuttiounniunihvloeitehlaefnuiattafttlcerbnneghbsnlonmaokoifonarvnsnetfrftrcethdwspspeucwtrcawpodafhsoyigooalnaeigdfrtngltebgfll o ',\n", - " 'hthirfhntrfefoeaanftytslrrorhteqesimrlrueshfeetawiiubhsitrnriosiiniermrhdtpyietotircbnalhnrpohtoeirlhswtpstetoosunoyerwhchdhmcpitonosaahjihtenearftosunemgratrxulwtobteapertarptesaehtnesihrtsnrnrstodfluaghesmgkaseituntyahuytnnnntgivhwewlpafierasialfpaebpccmehlaotthswlhdaulvuseoeeauetaettaheefthlbghrsilateeacnrhtaahgtesinnuferpulehrmtitiyudeunnocgidnueaieeeuhsntlhthoaiaiedfnyuanianoeeytiehfouldaeoaruhryrerareataiahtgonwswitisatlbuxmaootletorenootroaocbtgpivaeenlrywfoetawuadrtwelnrtpfrpleaimilrorntqewiucrednarfaottonrteelrnpehspmedndwetdofhedeypsnengeneettaeneatrseulgdrseoorbugdwhapbrynheketttrrenhrrdefnstolaiwspynimhotcoouietyopeerknhatnntliruieenmrepaitaehonhohmuousvtkdeenioeekwdptgieoiiihnseafuuuenbrhithraeheieayuasusragiwsidslrithpgfwtilisiiusheorrmecmaioisedlvuloerisaoeidiftnboesasntgfpordsoritfatplrtneoilyytsossoeptfniaheoageeiramditeatayhgrrraslecfelrteneahehvhmivssnaoriemlixtjpsostermfbidhnehoctbcnoctnsumpeoesnehtifetooenowtneeottlridgoiemosfihoormldfefsetuelofiirwbdyqttzoafnridnttngoeaalhspdnmeaplthtbsnhauoplaanmlesrpdanhvleiaacnhksliodactdaeohjgdaieyagwtendehenuegeeeeorodnfryymectnwttedtgustatooomyfwgriheorhrnsiforaftreopensiyasssehhtnueaywilhetpcauatnapeeeluhalwleaoseuriinbaseaaeetcdgcersoorpsesensolvduedltsititeestfnsoeiglnrenoientwweithlwsreihliirstdsendrhrfglntaursadsetydodaasneutctwiemnatrtesepotoytynocosutumgcapdlaedletdobsfdelfexaahnorsitidrpeiihassccdbphislielalnfrhotnreroatmeaigaklmtrewcrdyasnvsnwdlnukeornnutitounniuinhvoleiethleafniuatatftltcebrnngehbnslomnaookifnoarnvsntefrtfrctehdswpsepuctwrcwapoadfhosyiogoanlaegidftrngtlebfgll o ',\n", - " 'ithhnfrhertfaofetnafltysrrroqthemseiulrrfsehaeetuiwiihbsrrtnioiseniihmrrytdpoeitcitrlnbapnhrohotliertshwesptsotoynuohrewhhcdicmpootnhasatijhaneeofrteusnagmrurtxowltatbeteprtrapeseaethnrishrstntrnsldofhauggsemeaksntiuhytanyuttnnnhigvlewwiapfsreafailbapemcpcahelhtothwslladueuvsaeoeaeutatetfehebhtlshgrtliaceeatrnhgaahietsfnnuureprelhttmidyiunuenicogendueiaesuehhtnlahtoeaiiyfdniaunenaoiyetohefaludroeayhuraerrterahiaangtoiswwaitsultbomxaetoleotrtonoooragbctaipvleenfyrwaeotduwaetrwtnlrpfprielarimltronieqwecurrndataforotnleteenrpmshpddendewtefohpedynnseeegnatetaneeertsdlugosreurobhdgwrpabenyhtektertrrhnrnedfltsosiawiypnthmouocoyeitepoehkrnntanrltieiueemnrtapioeahhhnouumokvstnedeeoiepwkdegtiiioienhsufaubeunthrierhaeehiayaurusswgaisisdtrlifphgltwiisiiesuhmroracemsoiivdeleluoairsdeoinfitsobetsanofgpodrsfirtltapetrnyiolotysessontpfeaiheaogaiertdmiaaetrhygsrrafelctleraneevehhvmhiassneroixlmisjtpesotbmrfndihcheonbtcncotpusmsoeetenhtfienooenwotteeoiltrigdosmeooifhlromffdeuestfleowiirqdbyottzrfantdinontglaeadshpamnehlptnbtsoahualpaemnldrspvnahaelihcanisklcdoaedtaghojeadiwaygdetnnheeeeugoeeenordyrfytemctwntgdetasutootowymfhrgihoerinrsaofretfrnpoeaisyesssnhhtyeuahiwlcteptuaaeanpueelwahloelaresubiinasaeteaecdcgoressropnseevosldudeitlseittfsetesnongiloernteiniwwewhtlirseilhidsrtdesnfhrrtlgnsuaredasoytdsadatenuitcwamenerttoesptotycnyotsoucmuglpadleadoteddsbfelefhaxasonrdtiiipreshiadcscipbhelsinallorfhentrtoraiemalagketmrdcwrnayswsvnuldnrekotnnuutiounnivnihiloeltehnaeftuiattafetlcnrbnbeghosnlonmafkoironanvnsretfcftrdethswspcpeucwtroawphdafisoyagooelnafigdgrtnbltelgfl o',\n", - " 'ihthnrfhetrfafoetanflytsrrroqhtemesiurlrfeshaeetuwiiibhsrtrniioseinihrmrydtpoietctirlbnaphnroohtleirthswepststooyunoherwhchdimcpotonhsaatjihaeneorftesunamgrutrxolwtabtetpertarpeesaehtnrsihrtsntnrslodfhuaggesmekasnituhtyanuyttnnnhgivlwewipafserafialbpaempccaehlhotthswlldauevusaoeeauetaettfheebthlsghrtilaceeatnrhgaahitesfnnuuerprlehtmtidiyuneuniocgednueaieseuhhntlathoeiaiydfniuaneanoieytoehfauldreoayuhrarertreahaiantgoiwswatisutlboxmaeotletortnoooroagcbtapivleenfrywaoetdwuaertwtlnrppfrilearmiltorniqeweucrrdnatfaortonlteeernpmhspdedndweteofhpdeynsneegenaettaeneetrsdulgorseuorbhgdwrapbeynhtketetrrrnhrndeflstosaiwipyntmhoucooyieteopehrknnatnrtlieuieenmrtpaioaehhnhoumuoksvtndeeeioepkwdetgiioiiehnsuafubuentrhiehraeheiaayursuswagissidtlrifhpglwtiiisieushmorraecmsioivedleuloarisdoeiniftsboetasnogfpordsfritlatpertnyoiloytsessonptfeiaheoagaeirtmdiaeatryhgsrraflectelraenevhehvhmiassneorixmlistjpeostbrmfnidhcehontbcnoctpsumseoetnehtifenooenowtteeoitlridgosemoofihlormfdfeusetfelowiirqbdyottzrafntidnotngleaadhspanmehpltntbsohauaplaenmldsrpvanhaleihacnikslcodaetdagohjedaiwyagdtenneheeuegoeeenrodyfrytmectnwtgedtaustotoowmyfhgriheorirnsaforeftrnopeasiyesssnhhtyueahwilcetptauaenapueelwhalolearseubiinaasetaeeccdgoerssorpnesevsolddueiltsetitfestensoniglorentieniwwewthlisreihlidrstdsenfrhrtglnsaureadsotydsdaatneuictwaemnetrtosepttoycynotosucumglapdlaedoetddbsfeelfhxaasnorditiirpesihadsccibpheslinlalofrhetnrtroaimealgakemtrdwcrnyaswvsnudlnrkeotnnuuitounnivinhiolelethneaftiuatatfeltcnbrnbgehonslomnafokirnoannvsrtefctfrdtehsswpcepuctwrowaphadfiosyaogoenlafgidgtrnbtlelfgl o',\n", - " 'tihhfnrhretfoafentaftlysrrrotqhesmeilurrsfeheaetiuwihibsrrtnoiisneiimhrrtydpeoitictrnlbanphrhootilersthwseptostonyuorhewhhcdcimpootnahsaitjhnaeefortuesngamrrutxwolttabeetprrtapseeatehnirshsrtnrtnsdlofahugsgemaekstniuyhtaynutntnnihgvelwwaipfrseaafilabpecmpchaelthotwhslalduuevseaoeeauttaetefhehbtlhsgrltiaeceartnhagaheitsnfnurueperlhttmiydiuunenciogneduieaeusehthnlhatoaeiifydnaiunneaoyiethoeflaudoreahyurearretraihaagntosiwwiatslutbmoxateoloetrotnooorabgctiapvelenyfrweaotudwaterwntlrfppreilairmlrtoneiqwceurnrdaatfoortneltenerpsmhpddenedwtfeohepdynnseeegntaetnaeeretsldugsoreruobdhgwprabneyhetktretrhrnrendftlsoisawyipnhtmooucoeyitpeoekhrntnanlrtiieuemenratpieoahhhnouumovkstendeoeiewpkdgetiiioinehsfuauebunhtrirehaeehiyaauurssgwaiissdrtlipfhgtlwisiiiseuhrmorcaemosiidvelleuoiarsedoifnitosbestanfogpdorsifrttlapterniyoltoyssesotnpfaeihaeogiaerdtmiaaethrygrsraeflclternaeeevhhmvhisasnreoilxmijstpseotmbrfdnihhceobntccnotupsmoseeetnhftieonoewnoteteolitrgidomseoiofhrlomffdeeustlfeoiwirdqbytotzfrandtinnotgaleasdhpmanelhptbntsaohulapamenlrdspnvahealichansikldcoadetahgojaediawygedtnhneeeeugeoeeonrdryfyetmcwtntdgetsautootoywmfrhgiohernirsoafrtefrpnoeiasysesshnhteyuaihwltceputaaaenpeuelawhleolaersuibinsaaeetaedccgroesrsopsneeovsluddetilsiettsfetsenognileornetinwiwehwtlriselihisdrtedsnhfrrltgnusardeasyotdasdaetnuticwmaenretteospottyncyostoumcugpladeladtoedsdbfleefahxaosnrtdiipirehsiacdscpibhlesianllrofhnetrotraeimaalgktemrcdwranysswvnludnerkontnutuionuninvihlioetlehanefutiattaftelcrnbnebghsonlnomakfoiornavnnsertffctredthwssppceuwctraowpdhafsioygaoolenaifgdrgtnlbteglfl o',\n", - " 'hithrnfhterffaoeatnfyltsrrrohqteemsirulrefsheaetwuiibihstrrniiosienirhmrdytpioettcirblnahpnroohtelirhtswpesttsoouynoehrwchhdmicptoonshaajtiheaneroftseunmagrturxlowtbatepteratrpeesahetnsrihtrsnntrsoldfuhagegsmkeasintuthyaunytntnnghivwlewpiafesraifalpbaepmcceahlohttshwldlauveusoaeeuaeteatthfeetbhlgshritlaeceantrhagahtiesnfnueurplrehmttiidyuenunoicgdenuaeieesuhnhtltahoieaidyfnuianaenoeiyteohfualderoauyhrraerrteaahiatngowiswtaistulbxomaoetlteorntoorooacgbtpaivelenrfywoaetwduaretwltnrppfrlieamrilotrnqiewuecrdrnaftaotrontleerenphmspeddnwdetoefhdpeysnnegeeneatteanetersudlgroseourbghdwarpbyenhktetterrnrhrdnefsltoasiwpiynmthocuooiyetoeperhknantntrliueienemrptaiaoehnhhomuuoskvtdneeieoekpwdtegioiiihensaufuubenrthiheraheeiaayusrusawgissidltrihfpgwltiiisiueshomrreacmisoievdlueloraisodeiinftbsoeatsngofprodsrfitaltpretnoyilyotssesopntfieahoeageairmtdieaatyrhgrsralfecetlreanehvehhvmisasnoerimxlitsjpoestrbmfindhechotnbconctspumesoentehitfeonoeonwteteotilrdigoesmofoiholrmdffesuetefloiwirbqdytotzarfnitdntongelaahdspnamephlttnbshoaupalanemlsdrpavnhlaeiahcnkislocdatedaoghjdeaiywagtdenenheueegeoeernodfyrymtecntwtegdtuasttooomwyfghriehorrinsfaorfetronpesaiysesshnhtuyeawhilectpatuaneapeuelhwalloeasreuibinaaseateeccdgeorsosrpensesvoldduelitsteitefstnesoinglroenitenwiwetwhlsirehilirdstsdenrfhrgtlnasuraedstoyddsaanteucitweamntertsoepttoyycnootsuucmgalpdaledeotdbdsfeelfxhaansoridtiripeishasdccbiphselilnalforhtenrrtoamieaglakmetrwdcrynasvwsndulnkreontnuiutonuniivnhoileelthenafituaattfletcbnrngbehnoslmonaofkinroannvstreftcfrtdehsswpecputcwrwoapahdfoisyoagonelagfidtgrntbleflgl o',\n", - " 'thihfrnhrtefofaenatftylsrrrothqesemilrursefheeatiwuihbisrtrnoiisnieimrhrtdypeiotitcrnblanhprhootielrshtwspetotsonuyorehwhchdcmipotonashaijthneaefrotusengmarrtuxwlottbaeeptrratpseeathenisrhstrnrntsdolfauhgsegmakestinuythayuntnntnighvewlwapifresaaiflapbecpmchealtohtwshladluuveseoaeeuatteatehfehtblhgsrlitaeecarnthaaghetisnnfureupelrhtmtiyiduuenncoigndeuiaeeueshtnhlhtaoaieifdynauinnaeoyeitheofluadoerahuyrerarertaiahagtnoswiwitasltubmxoatoeloterontooroabcgtipaveelnyrfweoatuwdatrewnltrfppreliaimrlrotneqiwcuerndraaftootrnetlenrepshmpdednewdtfoehedpynsneegenteatneaertesludgsroeroubdghwparbnyehekttrterhnrrednftsloiaswypinhmtoocuoeiytpoeekrhntannltriiueemneraptieaohhnhoumuovsktedneoieewkpdgteiioiinhesfauueubnhrtirheaeheiyaauusrsgawiissdrltiphfgtwlisiiisuehromrceamoisidevllueoiraseodifintobsesatnfgopdrosirfttalptrenioyltyossseotpnfaiehaoegieardmtiaeathyrgrrsaelfcletrneaeehvhmhvissanroeilmxijtspsoetmrbfdinhhecobtnccontuspmoeseenthfiteoonewonteetoltirgdiomesoifohrolmfdfeesutlefoiiwrdbqyttozfarnditnntogaelashdpmnaelphtbtnsahoulpaamnelrsdpnavhelaicahnskildocadteahogjadeiaywgetdnheneeuegeeoeorndrfyyemtcwnttdegtsuatotooymwfrghioehrnrisofartferponeisaysseshhnteuyaiwhltecpuataanepeeulahwleloaesruiibnsaaeeatedccgreosrospseneosvluddetlisitetseftsneoginleroneitnwwiehtwlrsielhiisrdtesdnhrfrlgtnuasrdaesytodadsaentutciwmeanrtetesopottynycosotumucgpaldealdteodsbdfleefaxhaonsrtidipriehisacsdcpbihlseialnlrfohnterortaemiaaglktmercwdraynssvwnldunekronntutiuonnuinivhloietelhaenfuitatatftlecrbnnegbhsnolnmoakofionravnnsetrfftcretdhwssppecuwtcrawopdahfsoiygoaolneaigfdrtgnltbegfll o',\n", - " 'htihrfnhtreffoaeantfytlsrrrohtqeesmirluresfheeatwiuibhistrrnioisineirmhrdtypieotticrbnlahnprohoteilrhstwpsettosounyoerhwchhdmciptoonsahajithenaerfotsuenmgartruxlwotbtaepetrartpeseahtensirhtsrnnrtsodlfuahgesgmkaesitnutyhauyntnntngihvwelwpaifersaiaflpabepcmcehalothtswhldaluvuesoeaeueatetathefethblghsriltaeecanrthaaghteisnnfueruplerhmttiiydueunnocigdneuaieeeushnthlthaoiaeidfynuainaneoeyitehofuladeorauhyrrearretaaihatgnowsiwtiastlubxmoaoteltoernotorooacbgtpiaveelnryfwoeatwudartewlntrpfprleiamirlortnqeiwucerdnrafatotorntelernephsmpeddnwedtofehdepysnnegeenetatenaetresuldgrsoeorubgdhwaprbynehketttrernhrrdenfstloaiswpyinmhtocouoieytopeerkhnatnntlriuieenmerpatiaeohnhhomuuosvktdeneioeekwpdtgeioiiihnesafuuuebnrhtihreaheeiayausursagwisisdlrtihpfgwtliisiiusehormrecamiosiedvluleoriasoediifntboseastngfoprdosriftatlprtenoiylytossseoptnfiaehoaegeiarmdtieaatyhrgrrsalefceltrenaehevhhmvissanoreimlxitjsposetrmbfidnhehcotbncocntsupmeosenethifteooneownteetotlirdgioemsofiohorlmdffeseutelfoiiwrbdqyttozafrnidtntnogealahsdpnmaeplhttbnshaouplaanmelsrdpanvhleaiachnksilodcatdeaohgjdaeiyawgtednehneueegeeoerondfryymetcnwttedgtusattooomywfgrhieohrrnisfoarfteropnesiaysseshhntueyawihletcpautanaepeeulhawlleoaseruiibnasaeaetecdcgerosorspesnesovldudeltistietesftnseoignlreonietnwwiethwlsriehliirsdtsednrhfrgltnausradestyoddasanetuctiwemantretseoptotyyncoostuumcgapldaeldetodbsdfelefxahanosritdirpieihsascdcbpihsleilanlfrohtnerrotameiagalkmterwcdryansvswndlunkeronntuituonnuiinvholieetlheanfiutaattfltecbrnngebhnsolmnoaokfinoranvnsterftfcrtedhswspepcutwcrwaopadhfosiyogaonleagifdtrgntlbefgll o']" - ] - } - ], - "prompt_number": 22 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c6bs" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 23, - "text": [ - "'hithhnfrferteaofftnasltyorrreqthimserulrhfsetaeeiuiwsihbnrrtsioiienirhmrpytdtoeircitalnbrpnhtohorliewtshtesposotoynuwhredhhcpicmnootahashtijeanetofrneusragmxurttowleatbrtepptraaesenethhrisnrststrnfldoghaumgseseakuntiahyttnyuntnnvhigwlewfiapasrelfaiebapcmcplahethtolhwsuladseuveaeotaeutateefehlbhtrshgatliaceehtrnhgaasietufnnpurehrelittmudyinnuegicouendeeiahsuelhtnoahtieainyfdniauoenatiyefohedaluaroeryhuraeraterahiaongtwiswsaitbultaomxletoreototonaoortgbcvaipnleewfyrtaeoaduwwetrrtnlrpfpaiellrimntrowieqrecuarndotafnroteletpenrpmshnddetdewhefoypedennsneegtateeanesertgdlueosrburowhdgbrpahenyttekrertrrhnfnedoltswsianiypothmouoctyeieeponhkrnntairlteeiuremnitaphoeaohhnouumtkvsenedeeoidpwkiegtiiiosenhuufanbeuithraerhieehuayasrusiwgadsisitrlgfphiltwiisihesurmromaceisoilvdeoelusairideotnfiesobntsapofgsodrtfirpltanetrlyiosotyoessfntpheaigeaoraieitdmtaaegrhyasrrcfelrtleeanehvehivmhnassieroixlmpsjttesofbmrhndiochecnbttncompusesoehtenetfienootnwooteeriltoigdosmehoifmlroeffdtuesoflerwiiyqdbzottnrfantdigontalaepdsheamnthlpsnbtuoahaalplemnpdrshvnaiaelnhcaliskacdoaedtjghoieadgwayndetenhegeeueoeednoryyrfctemttwntgdetasuoootfwymihrgrhoesinrraofretfenpoyaissesstnhhayeulhiwpcteatuapeanlueelwahaoeluresnbiieasaeteagcdcsorepsroenselvosedudsitlteittfseoesnlnginoernteieiwwlwhteirsiilhtdsrndesrfhrntlgrsuasedadoytasadutenwitcnametertpoesytotocnyutsogcmudlpadleadotefdsbfeleahaxrsonidtieiprashicdcshipbielslnalhorfrentatoraiemklagretmrdcwsnaynwsvnuldorekutnnoutiiunnhvnieilohltefnaeatuifttacetlnnrbhbeglosnaonmifkoaronsnvnfretrcfthdetpswsucpercwtpoawfhdayisooagoaelndfigngrtebltllgfo'" - ] - } - ], - "prompt_number": 23 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "''.join([c[0] for c in every_nth(c6bs, 3)])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 24, - "text": [ - "'hit'" - ] - } - ], - "prompt_number": 24 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c6bs.find('e', 13)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 25, - "text": [ - "28" - ] - } - ], - "prompt_number": 25 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "len(c6bs) / 978" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 26, - "text": [ - "1.6083844580777096" - ] - } - ], - "prompt_number": 26 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c6bs[55:60]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 27, - "text": [ - "'bnrrt'" - ] - } - ], - "prompt_number": 27 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "[(c6bs[0] + c6bs[i] + c6bs[2*i] + c6bs[3*i], i) for i in range(int(len(c6bs) / 3)) if c6bs[i] == 'e' and c6bs[2*i] == 'i' ]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 28, - "text": [ - "[('heih', 177), ('heit', 207), ('heip', 307), ('heil', 522)]" - ] - } - ], - "prompt_number": 28 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "[c for c in chunks(c6bs, 522)]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 29, - "text": [ - "['hithhnfrferteaofftnasltyorrreqthimserulrhfsetaeeiuiwsihbnrrtsioiienirhmrpytdtoeircitalnbrpnhtohorliewtshtesposotoynuwhredhhcpicmnootahashtijeanetofrneusragmxurttowleatbrtepptraaesenethhrisnrststrnfldoghaumgseseakuntiahyttnyuntnnvhigwlewfiapasrelfaiebapcmcplahethtolhwsuladseuveaeotaeutateefehlbhtrshgatliaceehtrnhgaasietufnnpurehrelittmudyinnuegicouendeeiahsuelhtnoahtieainyfdniauoenatiyefohedaluaroeryhuraeraterahiaongtwiswsaitbultaomxletoreototonaoortgbcvaipnleewfyrtaeoaduwwetrrtnlrpfpaiellrimntrowieqrecuarndotafnrotel',\n", - " 'etpenrpmshnddetdewhefoypedennsneegtateeanesertgdlueosrburowhdgbrpahenyttekrertrrhnfnedoltswsianiypothmouoctyeieeponhkrnntairlteeiuremnitaphoeaohhnouumtkvsenedeeoidpwkiegtiiiosenhuufanbeuithraerhieehuayasrusiwgadsisitrlgfphiltwiisihesurmromaceisoilvdeoelusairideotnfiesobntsapofgsodrtfirpltanetrlyiosotyoessfntpheaigeaoraieitdmtaaegrhyasrrcfelrtleeanehvehivmhnassieroixlmpsjttesofbmrhndiochecnbttncompusesoehtenetfienootnwooteeriltoigdosmehoifmlroeffdtuesoflerwiiyqdbzottnrfantdigontalaepdsheamnthlpsnbtuoahaalplemnpdrshvna',\n", - " 'iaelnhcaliskacdoaedtjghoieadgwayndetenhegeeueoeednoryyrfctemttwntgdetasuoootfwymihrgrhoesinrraofretfenpoyaissesstnhhayeulhiwpcteatuapeanlueelwahaoeluresnbiieasaeteagcdcsorepsroenselvosedudsitlteittfseoesnlnginoernteieiwwlwhteirsiilhtdsrndesrfhrntlgrsuasedadoytasadutenwitcnametertpoesytotocnyutsogcmudlpadleadotefdsbfeleahaxrsonidtieiprashicdcshipbielslnalhorfrentatoraiemklagretmrdcwsnaynwsvnuldorekutnnoutiiunnhvnieilohltefnaeatuifttacetlnnrbhbeglosnaonmifkoaronsnvnfretrcfthdetpswsucpercwtpoawfhdayisooagoaelndfigngrteb',\n", - " 'ltllgfo']" - ] - } - ], - "prompt_number": 29 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c6b" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 30, - "text": [ - "'HITHH NFRFE RTEAO FFTNA SLTYO RRREQ THIMS ERULR HFSET AEEIU IWSIH BNRRT SIOII ENIRH MRPYT DTOEI RCITA LNBRP NHTOH ORLIE WTSHT ESPOS OTOYN UWHRE DHHCP ICMNO OTAHA SHTIJ EANET OFRNE USRAG MXURT TOWLE ATBRT EPPTR AAESE NETHH RISNR STSTR NFLDO GHAUM GSESE AKUNT IAHYT TNYUN TNNVH IGWLE WFIAP ASREL FAIEB APCMC PLAHE THTOL HWSUL ADSEU VEAEO TAEUT ATEEF EHLBH TRSHG ATLIA CEEHT RNHGA ASIET UFNNP UREHR ELITT MUDYI NNUEG ICOUE NDEEI AHSUE LHTNO AHTIE AINYF DNIAU OENAT IYEFO HEDAL UAROE RYHUR AERAT ERAHI AONGT WISWS AITBU LTAOM XLETO REOTO TONAO ORTGB CVAIP NLEEW FYRTA EOADU WWETR RTNLR PFPAI ELLRI MNTRO WIEQR ECUAR NDOTA FNROT ELETP ENRPM SHNDD ETDEW HEFOY PEDEN NSNEE GTATE EANES ERTGD LUEOS RBURO WHDGB RPAHE NYTTE KRERT RRHNF NEDOL TSWSI ANIYP OTHMO UOCTY EIEEP ONHKR NNTAI RLTEE IUREM NITAP HOEAO HHNOU UMTKV SENED EEOID PWKIE GTIII OSENH UUFAN BEUIT HRAER HIEEH UAYAS RUSIW GADSI SITRL GFPHI LTWII SIHES URMRO MACEI SOILV DEOEL USAIR IDEOT NFIES OBNTS APOFG SODRT FIRPL TANET RLYIO SOTYO ESSFN TPHEA IGEAO RAIEI TDMTA AEGRH YASRR CFELR TLEEA NEHVE HIVMH NASSI EROIX LMPSJ TTESO FBMRH NDIOC HECNB TTNCO MPUSE SOEHT ENETF IENOO TNWOO TEERI LTOIG DOSME HOIFM LROEF FDTUE SOFLE RWIIY QDBZO TTNRF ANTDI GONTA LAEPD SHEAM NTHLP SNBTU OAHAA LPLEM NPDRS HVNAI AELNH CALIS KACDO AEDTJ GHOIE ADGWA YNDET ENHEG EEUEO EEDNO RYYRF CTEMT TWNTG DETAS UOOOT FWYMI HRGRH OESIN RRAOF RETFE NPOYA ISSES STNHH AYEUL HIWPC TEATU APEAN LUEEL WAHAO ELURE SNBII EASAE TEAGC DCSOR EPSRO ENSEL VOSED UDSIT LTEIT TFSEO ESNLN GINOE RNTEI EIWWL WHTEI RSIIL HTDSR NDESR FHRNT LGRSU ASEDA DOYTA SADUT ENWIT CNAME TERTP OESYT OTOCN YUTSO GCMUD LPADL EADOT EFDSB FELEA HAXRS ONIDT IEIPR ASHIC DCSHI PBIEL SLNAL HORFR ENTAT ORAIE MKLAG RETMR DCWSN AYNWS VNULD OREKU TNNOU TIIUN NHVNI EILOH LTEFN AEATU IFTTA CETLN NRBHB EGLOS NAONM IFKOA RONSN VNFRE TRCFT HDETP SWSUC PERCW TPOAW FHDAY ISOOA GOAEL NDFIG NGRTE BLTLL GFO\\n'" - ] - } - ], - "prompt_number": 30 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "[i for i in range(len(c6bs)) if c6bs[i] == 'q']" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 42, - "text": [ - "[29, 503, 985]" - ] - } - ], - "prompt_number": 42 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "''.join([c[0] for c in every_nth(c6bs, 11)])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 32, - "text": [ - "'hithhnfrfer'" - ] - } - ], - "prompt_number": 32 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "''.join([c[0] for c in every_nth(c6bs, 13)])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 33, - "text": [ - "'hithhnfrferte'" - ] - } - ], - "prompt_number": 33 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "''.join([c[0] for c in chunks(c6bs, 121)])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 34, - "text": [ - "'hhrnrnumeodti'" - ] - } - ], - "prompt_number": 34 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "''.join([c[0] for c in chunks(c6bs, 13)])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 35, - "text": [ - "'harrseehthoexttnsneitetghuydoihuouocttiuedeeerrsohiaeefhifsiitiohtreiehseiiszomhhihtdtoeentencsllilrdieodhpbrlakhntnsdwon'" - ] - } - ], - "prompt_number": 35 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "'l' in ''.join([c[0] for c in chunks(c6bs, 13)])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 36, - "text": [ - "True" - ] - } - ], - "prompt_number": 36 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "every_nth(c6bs, 11)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 38, - "text": [ - "['httmtbnoreohaegaasdetgrmlvtshtenenfiargurredrmcrpwnaegennckehmoinhutioddnrtegmranmmneieseetoetmaaoeoceyiesieaidnseewtrdtttmoaicnagariounanfcfor',\n", - " 'ieysaniepwthhtmtenoanwecheehtulueodyratleteupnuomhsnobkeitriotiibisrimeettrsetrnaprbseemfrtnaunecitettmnntwaoecsiorhdnaeeouthesatryeuhirostphat',\n", - " 'taoeerrintocaoxbsrgkyllpwaegrfieianeotwtogwwftatsenesrrdyynuekdoeeilsaoosflsaacesshtonrefwntmopldeeeeairpnpneasetentstdnrcdeaihloenknlfbnnhedee',\n", - " 'horrerhrhsypsfureshuueflsefanntgahifeeiatbfwprrehfesrpeopenravpsuewgicetaiyfoafhsjnteoihdiranadnoandmshrohcllsollsterlowtnlfxpihrtwuntthmvdralb',\n", - " 'hfruitmcthnihrrtntannwaauoethntihtaorrsoocyeaonlnoeebarloiteosweihgfhelnprinreevitdnholotiflthrhadhnturayhtuuarvtneingyipypdrrpoamsthetbinecynl',\n", - " 'nfrlusriotuctnteesuttfihlthlgpmcsiuhyawmtvrtiwdedygruhttteamhekntuapeiufopotagleetictttiuyaahascegeotogoaaeereeoelirdrttouassabrirvnvfaefftwidt',\n", - " 'fteriipthewmietpttminieeaaliauuoueoehhsxoatreiotdpttrersheinhnihhadhsssiflspirrhreooenofeqnelahadwgrworfiyaeetpsinesesacetdbosifednnnncgkrptsfl',\n", - " 'rnqhwoyaoshnjuophrganabtdebaardueaeduialniarletpeeagonrwmprineeurysiuoaegtohehtioscmnwimsdtpplvltaeynohrsetlsesetgiisusnsslfnhermcuoiaeloespoil',\n", - " 'fatfsitlrproeswthnshvpahsuhcseyelinaraieapetlqaetdtdwyhsooltodguaailriissateiylviohpeoglobddspnijyeyttoesuuwnardtiwiraaayoeeiilekwlueetoatwoogg',\n", - " 'eshsiidnloeoarlrrfeyhaptetteihinhnalaottononrrfndeelhtniuntauetfesstmlroonyataemxfeutodrfzisnlasgnurgfetelaabgoufnwlfsdmtgaldcsnlsdtialsrrsaanf',\n", - " 'rliehetbisdtnaeailstiscouareerndtytuenboolalienreneudtfaohepueiarriwrvibdeoidsehlbcsftoologhbeikhdefdwsfshphicedsolhheueocdetdltanoiltnnocuwggo']" - ] - } - ], - "prompt_number": 38 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "every_nth(c6bs, 143)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 64, - "text": [ - "['hetuehroera',\n", - " 'iteloirnnny',\n", - " 'toetsectptn',\n", - " 'hffarefaolw',\n", - " 'hreobhelygs',\n", - " 'nnhmuulaarv',\n", - " 'felxrareisn',\n", - " 'rubloytpsuu',\n", - " 'fshewaldsal',\n", - " 'ertthsesesd',\n", - " 'rarodrehseo',\n", - " 'tgsrguaesdr',\n", - " 'emhebsnatae',\n", - " 'axgoriemndk',\n", - " 'ouatpwhnhou',\n", - " 'frtoagvthyt',\n", - " 'ftlthaehatn',\n", - " 'ttioedhlyan',\n", - " 'noannsipeso',\n", - " 'awcayivsuau',\n", - " 'sleotsmnldt',\n", - " 'leeotihbhui',\n", - " 'tahretntiti',\n", - " 'ytttkrauweu',\n", - " 'obrgrlsopnn',\n", - " 'rrnbegsacwn',\n", - " 'rthcrfihtih',\n", - " 'regvtpeaetv',\n", - " 'epaarhraacn',\n", - " 'qpairioltni',\n", - " 'ttsphlipuae',\n", - " 'hrinntxlami',\n", - " 'iaelfwlepel',\n", - " 'matenimmeto',\n", - " 'seueeipnaeh',\n", - " 'esfwdsspnrl',\n", - " 'renfoijdltt',\n", - " 'unnylhtrupe',\n", - " 'leprtetseof',\n", - " 'rtutsseheen',\n", - " 'hhrawusvlsa',\n", - " 'fheesronwye',\n", - " 'srhoimfaata',\n", - " 'eiraarbihot',\n", - " 'tsednomaatu',\n", - " 'anluimreooi',\n", - " 'eriwyahlecf',\n", - " 'estwpcnnlnt',\n", - " 'itteoedhuyt',\n", - " 'usmttiicrua',\n", - " 'iturhsoaetc',\n", - " 'wrdrmoclsse',\n", - " 'snytoihinot',\n", - " 'ifinulesbgl',\n", - " 'hlnlovckicn',\n", - " 'bdnrcdnaimn',\n", - " 'nouptebceur',\n", - " 'rgefyotdadb',\n", - " 'rhgpeetoslh',\n", - " 'taiailnaapb',\n", - " 'sucieuceeae',\n", - " 'imoeesodtdg',\n", - " 'ogulpamtell',\n", - " 'iseloipjaeo',\n", - " 'ienrnruggas',\n", - " 'esdihishcdn',\n", - " 'neemkdeodoa',\n", - " 'iaenresicto',\n", - " 'rkitnooesen',\n", - " 'huarnteaofm',\n", - " 'mnhotnhdrdi',\n", - " 'rtswaftgesf',\n", - " 'piuiiiewpbk',\n", - " 'yaeerenasfo',\n", - " 'thlqlseyrea',\n", - " 'dyhrtotnolr',\n", - " 'ttteebfdeeo',\n", - " 'otncenienan',\n", - " 'enouitetshs',\n", - " 'iyaausneean',\n", - " 'ruhrraonlxv',\n", - " 'cntnepohvrn',\n", - " 'itidmoteosf',\n", - " 'tneonfngsor',\n", - " 'anatigweene',\n", - " 'lviatsoedit',\n", - " 'nhnfaoouudr',\n", - " 'biynpdtedtc',\n", - " 'rgfrhreosif',\n", - " 'pwdooteeiet',\n", - " 'nlntefretih',\n", - " 'heieaiidlpd',\n", - " 'twalorlntre',\n", - " 'ofuehptoeat',\n", - " 'hiothlorisp',\n", - " 'oaepntiyths',\n", - " 'rpneoagytiw',\n", - " 'laanundrfcs',\n", - " 'istrueofsdu',\n", - " 'eripmtscecc',\n", - " 'weymtrmtosp',\n", - " 'tleskleeehe',\n", - " 'sffhvyhmsir',\n", - " 'haonsiotnpc',\n", - " 'tihdeoitlbw',\n", - " 'eeednsfwnit',\n", - " 'sbdeeomngep',\n", - " 'paatdtltilo',\n", - " 'opldeyrgnsa',\n", - " 'scueeoodolw',\n", - " 'omawoeeeenf',\n", - " 'tcrhisftrah',\n", - " 'opoedsfanld',\n", - " 'ylefpfdstha',\n", - " 'narowntueoy',\n", - " 'uhyyktuoiri',\n", - " 'wehpipeoefs',\n", - " 'htueehsoiro',\n", - " 'rhrdgeotweo',\n", - " 'etaetaffwna',\n", - " 'doeniilwltg',\n", - " 'hlrnigeywao',\n", - " 'hhasiermhta',\n", - " 'cwtnoawitoe',\n", - " 'pseesoiherl',\n", - " 'iureeririan',\n", - " 'clagnaygrid',\n", - " 'mahthiqrsef',\n", - " 'ndiauedhimi',\n", - " 'osatuiboikg',\n", - " 'oeoeftzelln',\n", - " 'tuneadoshag',\n", - " 'avganmtitgr',\n", - " 'hetnbttndrt',\n", - " 'aaweeanrsee',\n", - " 'seisuarrrtb',\n", - " 'hoseiefanml',\n", - " 'ttwrtgaodrt',\n", - " 'iasthrnfedl',\n", - " 'jeagrhtrscl',\n", - " 'euidayderwg',\n", - " 'attleaitfsf',\n", - " 'nabursgfhno']" - ] - } - ], - "prompt_number": 64 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "[(q, u) for q in [i for i in range(len(c6bs)) if c6bs[i] == 'q'] for u in [i for i in range(len(c6bs)) if c6bs[i] == 'u'] if abs(q-u) < 13]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 44, - "text": [ - "[(29, 37), (503, 507), (985, 973)]" - ] - } - ], - "prompt_number": 44 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "every_nth(c6bs, 13)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 54, - "text": [ - "['harrseehthoexttnsneitetghuydoihuouocttiuedeeerrsohiaeefhifsiitiohtreiehseiiszomhhihtdtoeentencsllilrdieodhpbrlakhntnsdwon',\n", - " 'iorhiniterttuehfeywehueagrieaaernltvanmalddeoptwukuongaiwpuldsrsedrheseenlfoonnavsoenwtsnhelbdetnwhnotsgoarieayuvalanetog',\n", - " 'tfefhiroseaorphlaufbtvetaenehudagtoaelnreeeasarsorrhetneghrveapoamcvrocsotmftttankinonfiphawiclegwttycyctxaengntnenovtpar',\n", - " 'hfqsbrchpdhftprdkniaoeflahnitoaetatiortnttnnrhricnehdibeaimdopltitfeofnooolltahlaaehrtwnoataisviildltntmersltrwniannnpogt',\n", - " 'httenhiooharttioutaplaeisruaielrwoopaprdpdnebehatnmneiehdlretotygaehibbetirenllpicaeygyryyuheootnwsgaaoufshsaesnetrmfsaoe',\n", - " 'nnhtrmtrshsnorsgnnpchehaieehenuaimnndfooeessunnnytnoeiuustoonfaoealixmthngorrapladdgydmraeaaarstohrrsmtddoilttvoiubirwwab',\n", - " 'faiarralochewanhtnamwolcelgsaaatsxalupwtnwneryfieaiuooiaiwmefgneaervlrttwdewfeseeogereiaiuposeefetnsaeolsncnomnulihfesfel',\n", - " 'rsmetplitptularaivscstbetiiuitrewloewaiarherotnyiituistysialisesogtmmhneoofiapnmlawefthosleeapdsredudtcpbidarrutofbktuhlt',\n", - " 'flsesyneoiiseesuahrpuaheutceniorseoewiefpeetwteperamdehaiicueotsrrlhpncnosfindbnneaucarfshalesuenieauenafdcladlihteorcdnl',\n", - " 'eteiitbwycjrastmhiellethftolyyeaatrweeqnmfgghedoelptpnrstsessdrfahensdoetmdytstphdyetsgreinutrdotrsstrydetshicdiltgacpadl',\n", - " 'ryruodrtnmeatesgyglaaurtnmuhferhiotftlrrsotddkotpthkwharriiaorlniyeajimteetqdhudctnoeureswlreoseesreetullihoewoutalrfeyfg',\n", - " 'touiitpsunagbntstwfhdtsrnuetdfyitrgyrleohyalgrlhoeovkueulhsibtyteaastopfehudieorajdemohtspueaeisiifdnpteeeirmsrnecootriif',\n", - " 'erlwionhwonmreretlaesahnpdnnnohabebrrrctnptubetmneesiursgeornfipisnstcuiroebgaaslgeetooftcesgntneihawosaaipfknenfesnhcsgo']" - ] - } - ], - "prompt_number": 54 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "[''.join(transpose(l, (3, 11, 0, 1, 2, 4, 5, 6,7, 8, 9, 10, 12))) for l in chunks(c6bs, 13)]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 61, - "text": [ - "['hthithnfrfere',\n", - " 'foaoftnasltyr',\n", - " 'qurrethimserl',\n", - " 'sirhfetaeeiuw',\n", - " 'bisihnrrtsioi',\n", - " 'rtenihmrpytdo',\n", - " 'cpeiritalnbrn',\n", - " 'hshtoorliewth',\n", - " 'putesosotoynw',\n", - " 'dnhrehhcpicmo',\n", - " 'haotaashtijen',\n", - " 'fgetorneusram',\n", - " 'tbxurtowleatr',\n", - " 'pnteptraaesee',\n", - " 'rtthhisnrstsr',\n", - " 'dsnfloghaumge',\n", - " 'ktseauntiahyt',\n", - " 'nwnyutnnvhigl',\n", - " 'ifewfapasrela',\n", - " 'ahiebpcmcplae',\n", - " 'odthtlhwsulas',\n", - " 'eteuvaeotaeua',\n", - " 'fsteeehlbhtrh',\n", - " 'lrgatiaceehtn',\n", - " 'anhgasietufnp',\n", - " 'huurerelittmd',\n", - " 'neyinuegicoun',\n", - " 'itdeeahsuelhn',\n", - " 'tdoahieainyfn',\n", - " 'ofiauenatiyeo',\n", - " 'ayhedluaroerh',\n", - " 'eiurarateraha',\n", - " 'ttongwiswsaib',\n", - " 'arultomxletoe',\n", - " 'tgotoonaoortb',\n", - " 'iycvapnleewfr',\n", - " 'ortaeaduwwetr',\n", - " 'rltnlpfpaielr',\n", - " 'teimnrowieqrc',\n", - " 'nouardotafnrt',\n", - " 'thelepenrpmsn',\n", - " 'tyddedewhefop',\n", - " 'naedensneegtt',\n", - " 'nleeaesertgdu',\n", - " 'rgeosburowhdb',\n", - " 'hrrpaenytteke',\n", - " 'rlrtrhnfnedot',\n", - " 'ihswsaniypotm',\n", - " 'coouotyeieepn',\n", - " 'nehkrntairlte',\n", - " 'eoiurmnitaphe',\n", - " 'hvaohnouumtks',\n", - " 'dkeneeeoidpwi',\n", - " 'iuegtiiosenhu',\n", - " 'befaneuithrar',\n", - " 'euhiehuayasrs',\n", - " 'aliwgdsisitrg',\n", - " 'ihfphltwiisie',\n", - " 'mssurromaceio',\n", - " 'diilveoelusar',\n", - " 'obidetnfieson',\n", - " 'pttsaofgsodrf',\n", - " 'lyirptanetrli',\n", - " 'ttosoyoessfnp',\n", - " 'ieheageaoraii',\n", - " 'tatdmaaegrhys',\n", - " 'farrcelrtleen',\n", - " 'esehvhivmhnas',\n", - " 'otierixlmpsjt',\n", - " 'foesobmrhndic',\n", - " 'nphecbttncomu',\n", - " 'ofsesehteneti',\n", - " 'oeenotnwooter',\n", - " 'ohiltigdosmeo',\n", - " 'luifmroeffdte',\n", - " 'ldsoferwiiyqb',\n", - " 'tizotnrfantdg',\n", - " 'aeontlaepdsha',\n", - " 'homntlpsnbtua',\n", - " 'lrhaaplemnpds',\n", - " 'aahvniaelnhcl',\n", - " 'ajiskcdoaedtg',\n", - " 'edhoiadgwayne',\n", - " 'hetenegeeueoe',\n", - " 'rmdnoyyrfctet',\n", - " 'totwngdetasuo',\n", - " 'whotfymihrgro',\n", - " 'ntesirraofref',\n", - " 'osenpyaissest',\n", - " 'apnhhyeulhiwc',\n", - " 'tuteauapeanle',\n", - " 'aeelwhaoelurs',\n", - " 'ianbieasaeteg',\n", - " 'secdcorepsron',\n", - " 'viselosedudst',\n", - " 'isltettfseoen',\n", - " 'iilngnoerntee',\n", - " 'liiwwwhteirsi',\n", - " 'dflhtsrndesrh',\n", - " 'ldrntgrsuasea',\n", - " 'tndoyasadutew',\n", - " 'npitcameterto',\n", - " 'ttesyotocnyus',\n", - " 'meogcudlpadla',\n", - " 'eedotfdsbfela',\n", - " 'rehaxsonidtii',\n", - " 'siprahicdcshp',\n", - " 'lrbieslnalhof',\n", - " 'tmrenatoraiek',\n", - " 'rslagetmrdcwn',\n", - " 'wraynsvnuldoe',\n", - " 'nnkutnoutiiun',\n", - " 'iehvneilohltf',\n", - " 'acnaetuifttae',\n", - " 'notlnrbhbegls',\n", - " 'nonaomifkoarn',\n", - " 'ntsnvfretrcfh',\n", - " 'prdetswsucpec',\n", - " 'oiwtpawfhdays',\n", - " 'giooaoaelndfg',\n", - " 'tfngrebltllgo']" - ] - } - ], - "prompt_number": 61 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [], - "language": "python", - "metadata": {}, - "outputs": [] - } - ], - "metadata": {} - } - ] -} \ No newline at end of file diff --git a/challenge7.ipynb b/challenge7.ipynb deleted file mode 100644 index d7d18f4..0000000 --- a/challenge7.ipynb +++ /dev/null @@ -1,321 +0,0 @@ -{ - "metadata": { - "name": "" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ - { - "cells": [ - { - "cell_type": "code", - "collapsed": false, - "input": [ - "from cipherbreak import *\n", - "with open('2013/mona-lisa-words.txt') as f:\n", - " mlwords = [line.rstrip() for line in f]\n", - "mltrans = collections.defaultdict(list)\n", - "for word in mlwords:\n", - " mltrans[transpositions_of(word)] += [word]\n", - "c7a = open('2013/7a.ciphertext').read()\n", - "c7b = open('2013/7b.ciphertext').read()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c1a = open('2013/1a.ciphertext').read()\n", - "c1b = open('2013/1b.ciphertext').read()\n", - "c2a = open('2013/2a.ciphertext').read()\n", - "c2b = open('2013/2b.ciphertext').read()\n", - "c3a = open('2013/3a.ciphertext').read()\n", - "c3b = open('2013/3b.ciphertext').read()\n", - "c4a = open('2013/4a.ciphertext').read()\n", - "c4b = open('2013/4b.ciphertext').read()\n", - "c5a = open('2013/5a.ciphertext').read()\n", - "c5b = open('2013/5b.ciphertext').read()\n", - "\n", - "p1a = caesar_decipher(c1a, 8)\n", - "p1b = caesar_decipher(c1b, 14)\n", - "p2a = affine_decipher(c2a, 3, 3, True)\n", - "p2b = caesar_decipher(c2b, 6)\n", - "p3a = affine_decipher(c3a, 7, 8, True)\n", - "p3b = keyword_decipher(c3b, 'louvigny', 2)\n", - "p4a = keyword_decipher(c4a, 'montal', 2)\n", - "p4b = keyword_decipher(c4b, 'salvation', 2)\n", - "p5a = keyword_decipher(c5a, 'alfredo', 2)\n", - "p5b = vigenere_decipher(sanitise(c5b), 'florence')" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plot_frequency_histogram(frequencies(sanitise(c7a)))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stderr", - "text": [ - "/usr/local/lib/python3.3/dist-packages/matplotlib/figure.py:372: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n", - " \"matplotlib is currently using a non-GUI backend, \"\n" - ] - }, - { - "metadata": {}, - "output_type": "display_data", - "png": "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\n3n777S6nGT16dMDPxe9//3vl5OQoJydHy5Yt67aXQLe1b24/3b12tbW1GjVqlEpLS5WTk6O6ujqf\ntUePHtXll1+uvLw85eTkaNWqVT5rFy5cqE8++UT5+flasGCBz7qTPXxz9LtkyRItWrSoy9pf/epX\npwSfrz0MDz/8sP7whz9Ikm6//XYVFRVJkjZt2qTrr7/+tPq3335bubm5am9v19GjR5Wdna2ampou\ne7j//vtPeb3uuecePfbYYz7X709/+pPy8/OVn5+vESNG6JJLLvFZ2yeF8zTzWNfc3GxZlmW1tbVZ\n2dnZ1ueff95l3d69ey2bzWa98cYblmVZVllZmbVkyZIua99//30rMzPTO6+Ty+jKtm3brJycHOvY\nsWPW4cOHrZEjR1pLly7tsrampsaaPn26dfz4ccuyLOu2226zVqxY4Xf90tPTfa7TSdXV1VZeXp7V\n3t5utba2WhkZGT572Lt3rxUXF2ft3LnTsizLKikpsV544QW/8x80aJDfx0OZZu/evVZ2drb10Ucf\nWfn5+dZ7773Xo3meXK/333/f6uzstMaNG2eVlZVZlmVZa9assWbMmOFzmkCei5Ovc1tbm3XkyBFr\nzJgx1o4dO3z2Eui2Fsz2c3Le/fr1s9566y2fNSetXr3auvnmm72/Hzp0yGdtbW2tlZ2d3e08T/bw\nzdolS5ZY5eXlXdbu2LHDmjJlivd3h8Nh1dXVnVa3detWa9asWZZlWdb3v/99a8KECdZXX31llZeX\nW0899VSX87733nutO++80/rpT3962kdrvqm2ttYqKCiwLMuyOjo6rPPPP9/ve/qkr776yiosLLTW\nrVvXbW1fwggqjJYtW6a8vDxNnDhRdXV1+ve//+2zdtiwYZo4caIk6frrr9eWLVu6rNu0aZNKSko0\ndOhQSVJiYqLPeb722muaOXOmBgwYoMGDB+uKK67wudtl48aNeuedd3TBBRcoPz9fmzZt0t69ewNd\nVZ9ef/11zZgxQ/3799egQYM0ffp0v7t+RowYobFjx0qSxo0bp9ra2h73EIpPP/1UM2bM0IsvvhiW\n44MjRozQmDFjZLPZNGbMGE2dOlWSlJ2d7XMdA30utmzZopkzZ+qcc87RwIEDNXPmTL322ms+ewl0\nWwtm+zlp+PDhGj9+vN8aSRo7dqw2bNighQsXasuWLUpISPBZ290yQ5WXl6dPP/1UDQ0N2rlzpxIT\nE5Wamnpa3ckRdGtrqwYMGKCJEydq27Zt2rJliwoLC7uc93333af169dr27Ztmj9/vs8ehg8frqSk\nJL377rtav369CgoK/L6nT/r5z3+uoqIiXX755YGvcB8Q1tPMY5nH49HGjRu1detWDRgwQBdffLHa\n29t91n/zGIZlWT6PadhstoDfsP9b2910paWlWrx4cUDzDlSwPZx99tnen8866yy/u58iaciQIRo+\nfLhee+01ZWVl9Xh+31yvfv36qX///t6fjx8/3u00/p6Lrp5jf8fEQt3WAtnuBg4c2G2NJGVkZGjH\njh165ZVXdO+996qoqEi//vWvA5rWn7i4uFN2TXe3/cyaNUurV69WY2Ojrr322i5r4uPjNWLECD3/\n/POaNGmSxo4dq02bNunjjz/2uW189tlnOnr0qDo6OnTs2DGde+65Pnu46aab9Nxzz6mpqUllZWXd\nruPzzz+v/fv3x+RxOUZQYXL48GElJiZqwIAB+uijj7R161a/9fv27fPWvPjiiz7/Z3bJJZfo73//\nu5qbmyXJ+29XLrroIlVWVuqLL75Qa2ur1q1b5/OPUVFRkVavXq3//ve/3vnu27ev2/XszuTJk/Xy\nyy+rvb1dR44c0SuvvBIVJxT0799f//jHP7RixQqtXLmyt9vxq7CwUJWVlTp27JiOHj2qyspKn9uP\nFPi2Fsz2E6yGhgYNGDBA1113ne68805t377dZ+3gwYPV2toa0Hztdrs+/fRTNTc3q729XevWrfNb\nf80112jlypVavXq1Zs2a5bOusLBQS5Ys0ZQpU1RYWKgnn3xSBQUFPut/8pOf6IEHHtCcOXO6PW52\n5ZVXqqqqStu2bdO0adP81r7zzjtaunRpr56Y1JsYQYXJpZdeqieffFIOh0OjRo3y7lLpis1m06hR\no/T444+rrKxMY8aM0W233dZlrcPh0D333KMpU6borLPOUkFBgZ599tkua/Pz83XNNdcoNzdXycnJ\nfne9jB49Wg888ICKi4vV2dmp+Ph4LV++XN/97nf99t2dCy64QFdccYXGjh0ru92unJwcfetb3wp4\nnt0tI5Q/mIFMY7PZdO6552rdunVyuVwaPHiwfvjDH4Y8T3/r5W8EE8gy8vPzdeONN3pf35tvvlm5\nubk+ewl0W/vf7efCCy/sdhQV6Ouxa9cu3XXXXd7RpL/TyJOSkjR58mTl5OTosssu8/u9cvHx8brv\nvvs0fvx4paamyuFw+O3J4XDoyJEjSktLk91u91lXWFioxYsXa+LEiTrnnHN0zjnn+Az2FStW6Oyz\nz9a1116rzs5OTZo0SR6PR06n02fPl1xyiRITE7t9/h5//HEdPHhQF198sSTpwgsv1FNPPeV3mr6E\nD+oi7I4ePaqBAweqra1NU6ZM0dNPP628vLxe6eXzzz/v1WNbva22tlbTp0/Xrl27gp520aJFGjRo\nkO64444IdBa7Ojs7NW7cOK1evVrnn39+b7djNHbxIexuueUW5efna9y4cbr66qt7LZwOHDigSZMm\n6a677uqV5ZuiJ7vpomH3bDSpqalRRkaGpk6dSjgFgBEUAMBIjKAAAEYioAAARiKgAABGIqAAAEYi\noAAARiKgAABG+j/og6x5jaDpPwAAAABJRU5ErkJggg==\n", - "text": [ - "" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c7af = frequencies(sanitise(c7a))\n", - "plot_frequency_histogram(c7af, sort_key=lambda l: c7af[l])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "display_data", - "png": "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\nf14NDQ0qKSnxO253X4+uar31kZaWph07dujVV1/Vfffdp4KCAv3mN7/xOvYLL7yg/fv3+91H8u0e\n/Pn888919OhRtbW16dixYzr33HO7rIuKiuq0adrb6xYdHa0RI0bohRde0KRJkzR27Fht2rRJn3zy\nSZfrRk/X91mzZmn16tWqr6/Xdddd152nGBI9Wd9Csc57PB5t3LhRW7du1aBBg3TJJZeotbW11+P2\nJ8yggqCgoECrV6/Wf//7X0lSY2Oj9u3b57X+4osvVnl5ub788ks1Nzdr3bp1xu80HThwoP7xj39o\nxYoVWrlyZZ/0sG/fPm3dulWS9NJLL3X51/pJV111lSoqKrRt2zZNmzbN57iTJ0/WK6+8otbWVh05\nckSvvvqq19cjPz9f5eXlOnbsmI4ePary8nKvfdTV1WnQoEG6/vrrddddd2n79u1ee3j33Xe1dOnS\nbh0Ic+mll+rvf/+7GhsbJanjX29++tOf6sEHH9ScOXN87nex2+367LPP1NjYqNbWVq1bt85rbX5+\nvpYsWaIpU6YoPz9fTz31lPLy8rqs7en6fu2112rlypVavXq1Zs2a5fO59VRMTIyam5u7VduT9S0U\nDh8+rLi4OA0aNEgff/xxRy+RhBlUEIwePVoPPvigCgsL1d7erujoaC1fvlznn39+l/W5ubm69tpr\nlZ2drcTERF100UV+/2r359s137zu6/HdDUabzaZzzz1X69atk8vlUkxMjH70ox/1uBd/y/B136hR\no/TEE0+opKREY8aM0e233+61Pjo6Wpdeeqni4uL8Lv/CCy/UlVdeqbFjx8putysrK0vf+c53uqzN\nzc3VTTfd1LFZ9JZbblF2dnaXtbt27dLdd9/dMaP1dXjzE088oYMHD+qSSy6RJF100UV6+umnu6x1\nOBy69957NWXKFJ111lnKy8vTc88912XtihUrdPbZZ+u6665Te3u7Jk2aJI/HI6fTeVptdHS07r//\nfo0fP17JyclyOBw+g3rx4sWaOHGizjnnHJ1zzjle38C/vb7726TscDh05MgRpaSkyG63+6w9qbvr\nWEJCgiZPnqysrCxdfvnlPr+zrifrW0/X+e70e9lll+mpp56Sw+HQqFGjOjY3RhI+qGuARYsWaciQ\nIbrzzjv7upU+88UXXwR12317e7vGjRun1atX64ILLvBbf/ToUQ0ePFgtLS2aMmWKnnnmGeXk5ASl\nF/Q/1dXVmj59unbt2tXXrUQ0NvEZwvRNfKF04MABTZo0SXfffXdQxquqqlJaWpqmTp3arXCSpFtv\nvVW5ubkaN26crrnmGsIJEf07aQpmUAAAIzGDAgAYiYACABiJgAIAGImAAgAYiYACABiJgAIAGOn/\nARTQq3riH9t+AAAAAElFTkSuQmCC\n", - "text": [ - "" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plot_frequency_histogram(normalised_english_counts, sort_key=lambda l: normalised_english_counts[l])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "display_data", - "png": "iVBORw0KGgoAAAANSUhEUgAAAawAAAEkCAYAAABzKwUZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHx5JREFUeJzt3X9QVXX+x/HXNSgLpNQxG++lUCF+KF5QkFHXpGwXtXTM\ntJg03aQidx23xmprahNn+1ZMuptGP7CZtXHb3B/ujrjKMq26d0ZLl0zsx6CNFtQFw9rMwF8E18/3\nD4siL+deEMSPPB8zZ7zH8z6f+zmHw33xOefce13GGCMAAM5zvbq7AwAAhIPAAgBYgcACAFiBwAIA\nWIHAAgBYgcACAFghZGCVlZUpKSlJCQkJKiwsPGP5vn37NGbMGPXu3VvLly8/Y3kgEFB6erqmTp3a\nOT0GAPRIEU4LA4GAFi5cqM2bN8vtdiszM1PTpk1TcnJyS03//v31/PPPa/369UHbWLFihVJSUtTQ\n0NC5PQcA9CiOI6zy8nLFx8crLi5OkZGRys3NVUlJSauaAQMGKCMjQ5GRkWesX1NTo9LSUt19993i\n/ckAgLPhGFi1tbWKjY1tmfd4PKqtrQ278QceeEDPPvusevXiUhkA4Ow4JonL5epwwxs3btSVV16p\n9PR0RlcAgLPmeA3L7XbL7/e3zPv9fnk8nrAafuutt7RhwwaVlpbq5MmTqq+v19y5c7VmzZpWdWlp\naXr33Xc70HUAwIXG6/Vqz549wRcaB01NTWbIkCGmqqrKNDY2Gq/XayorK4PWLlmyxCxbtizoMp/P\nZ26++eagy0J0wXpLliyh9jzqB7Xtrz1f+kFtx+tt4pQJjiOsiIgIFRUVKScnR4FAQHl5eUpOTlZx\ncbEkKT8/X3V1dcrMzFR9fb169eqlFStWqLKyUtHR0a3aOpvTiwAAOAaWJE2ePFmTJ09u9X/5+fkt\nj6+66qpWpw2DmTBhgiZMmNDBLgIAIF1UUFBQ0J0dWLp0qbq5C10uLi6O2vOoH9S2v/Z86Qe1Ha+3\nhVMmuL49Z9htXC4XdxECACQ5ZwJvkAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHA\nAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIA\nWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYIazAKisrU1JSkhISElRYWHjG8n37\n9mnMmDHq3bu3li9f3vL/fr9f119/vYYNG6bhw4dr5cqVnddzAECP4jLGGKeCQCCgxMREbd68WW63\nW5mZmVq7dq2Sk5Nbar744gt98sknWr9+vfr27avFixdLkurq6lRXV6e0tDQdPXpUo0aN0vr161ut\n63K5FKILAIAewikTQo6wysvLFR8fr7i4OEVGRio3N1clJSWtagYMGKCMjAxFRka2+v+rrrpKaWlp\nkqTo6GglJyfr4MGDHd0OAEAPFjKwamtrFRsb2zLv8XhUW1vb7ieqrq5WRUWFsrKy2r0uAPRUMTH9\n5HK5HKeYmH7d3c1zIiJUgcvlOusnOXr0qGbOnKkVK1YoOjr6rNsDgJ6ioeErSc6XTRoazv512gYh\nA8vtdsvv97fM+/1+eTyesJ+gqalJt956q+bMmaPp06cHrSkoKGh5nJ2drezs7LDbBwDYy+fzyefz\nhVUb8qaL5uZmJSYmasuWLRo0aJBGjx59xk0X3ykoKFCfPn1abrowxmjevHnq37+/fv/73wfvADdd\nAECbTp/lCvUaeeG8jjplQsjAkqR//etfuv/++xUIBJSXl6dHH31UxcXFkqT8/HzV1dUpMzNT9fX1\n6tWrl/r06aPKykrt2bNH1113nUaMGNFyavHpp5/WpEmTwuocAPR0BNYPloUTWF2JwAKAthFY3+OT\nLgAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAA\nAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABW\nILAAAFYgsAAAViCwAABWILAAAFYgsAAAVggZWGVlZUpKSlJCQoIKCwvPWL5v3z6NGTNGvXv31vLl\ny9u1LgAA4XIZY0xbCwOBgBITE7V582a53W5lZmZq7dq1Sk5Obqn54osv9Mknn2j9+vXq27evFi9e\nHPa6kuRyueTQBQDo0Vwul6RQr5EXzuuoUyY4jrDKy8sVHx+vuLg4RUZGKjc3VyUlJa1qBgwYoIyM\nDEVGRrZ7XQAAwuUYWLW1tYqNjW2Z93g8qq2tDavhs1kXAIAfcwys00PRjjmbdQEA+LEIp4Vut1t+\nv79l3u/3y+PxhNVwe9YtKChoeZydna3s7OywngMAYDefzyefzxdWreNNF83NzUpMTNSWLVs0aNAg\n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\n1CkzatQoM3/+fGOMMSUlJWb69OlntP/dz+47y5YtMwUFBY7bGM6x095js6qqyvTq1cv897//Ddn2\nunXrzD333NMy//XXXzu2GxERYd59911jjDG33Xabee2118669jvh7Atjvj8Ojh8/boYPH97msfTd\nfjt+/Lg5evSoGTZsmKmoqGiz3erq6lY/v7ZUVlaaqVOnmubmZmOMMQsWLDBr1qwJq+8XCkZYXWzR\nokWaOHGibrrppqDLt23bphkzZqh3797q06ePpk2b1qmnUp544gm98cYb2rVrlx5++GHH2s8//1zT\np0/X66+/7njNIC0tTZ9//rk+++wzvfvuu+rbt6/cbneb9bGxsRozZowkac6cOdq+fftZ17755pua\nPn26Lr74YkVHR2vq1Kmdtt+2bt2q2267Tf36nX6Td9++fYPWXXPNNerfv7/27NmjN954QyNHjgxa\n+91otaGhQb1799aYMWO0a9cubd++XePHjz+jfvDgwRo2bJhcLpeGDRumG2+8UZI0fPhwVVdXd8o2\nhqMjx+Y111yj0aNHh2x7xIgR+ve//61HHnlE27dvV0xMjGP94MGDNWLECEnSqFGjHPdDe2rbY8WK\nFUpLS9OYMWNUU1Oj/fv3B63bvn27ZsyYoUsvvVRRUVGaMWOGtm3b1ma74R63W7Zs0TvvvKOMjAyl\np6dr69atqqqq6tC22MrxtnacnVdffVV+v9/x/LTL5Wp1wHZmWEnS//73Px07dkyBQEAnTpzQZZdd\n1mbtFVdcoWuuuUbbtm1TUlKSY7uzZs3SunXrVFdXp9zcXMfaH177MMY4XgsJt7Yr99uP23Zy9913\na/Xq1Tp06JDmz58ftCYyMlKDBw/Wq6++qrFjx2rEiBHaunWrDhw4EHQ/X3LJJS2Pe/XqpYsvvrjl\ncXNz8xn1ERERrU4NOZ1GbY+O7OOoqKiw2k5ISFBFRYU2bdqkxx9/XBMnTtRvfvObNut/uE8uuugi\nx21sT224fD6ftmzZop07d6p37966/vrr1djYGLQ22H7ryDXDYObNm6ennnqqU9qyESOsLvLOO+9o\n+fLlIS/wX3fddVq/fr1OnjyphoYGbdy4sdMObun0e+WefPJJ3XHHHSHPj1988cX6xz/+oTVr1gR9\nk/cP3X777Vq7dq3WrVunWbNmOdZ++umn2rlzpyTp9ddfDzqqaG/tuHHj9M9//lONjY06evSoNm3a\n1Gn77YYbbtDf/vY3HT58WJJa/g3mlltuUVlZmXbt2qWcnJw268aPH69ly5ZpwoQJGj9+vF5++WWN\nHDmyU/o7cOBAff755zp8+LAaGxu1cePGTmm3K4/Nzz77TL1799bs2bP14IMPavfu3Z3Sblepr69X\n37591bt3b+3bt6/lGA1m/PjxWr9+vU6cOKFjx45p/fr1jsd8nz591NDQELIPEydO1Lp16/TFF19I\nOn1cfvrpp+3fGIsxwuoiL7zwgr766itdf/31kqTMzEytWrXqjLr09HTdfvvt8nq9uvLKK5WZmRn2\nX/ehXjzWrFmjSy65RLm5uTp16pTGjh0rn8+n7OzsNtu77LLLtHHjRv30pz9Vnz59dPPNNwetTUlJ\n0dGjR+XxeDRw4EDHPiYmJuqFF17Q/PnzNWzYMC1YsKDN+nBrMzIyNG3aNI0YMUIDBw5UamqqLr/8\n8rZ3hsK/yy0lJUWPPfaYJkyYoIsuukgjR47UH/7wh6C1kZGRuuGGG9S3b1/H9sePH6+nnnpKY8aM\n0aWXXqpLL720zRexH7fzw/lgzxEZGaknnnhCo0ePltvtVkpKSshtDWdf/PjYDOdUX7j7+P3339dD\nDz3UMoIMdVu30z45m9pwlkvSpEmT9PLLLyslJUWJiYktp62DSU9P189//vOW/XXPPffI6/W2Wd+/\nf3+NGzdOqampmjJlSpvfHZicnKwnn3xSP/vZz3Tq1ClFRkbqxRdf1NVXXx2y/xcK3jh8nlm6dKmi\no6O1ePFix7ovv/yyU8/Pnw+qq6s1depUvf/++2HVHzt2TFFRUTp+/LgmTJigV155RWlpaV3cy9ZO\nnTqlUaNGad26dRo6dOg5fW6gp+GU4Hko1F98Bw8e1NixY/XQQw+dox6dO+055XTvvfcqPT1do0aN\n0syZM895WFVWViohIUE33ngjYQWcA4ywAABWYIQFALACgQUAsAKBBQCwAoEFALACgQUAsAKBBQCw\nwv8DbMnA/BWkp54AAAAASUVORK5CYII=\n", - "text": [ - "" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c7bf = frequencies(sanitise(c7b))\n", - "plot_frequency_histogram(c7bf, sort_key=lambda l: c7bf[l])" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "display_data", - "png": "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\nZWWllZWVZbW0tFjHjx+3UlJS/K7PMwJ9PTt27LCmTp1qWZZlfe9737NGjRplffXVV1ZJSYn1/PPP\n+3wt77//vtXW1mYNHz7cKi4utizLstavX29NmjTJ5zKTk5P9rsczznymm5ubrRMnTlhDhw61du/e\n7bOmqqrKKigosE6fPm1ZlmXde++91sqVK33WVFdXWzk5OZZlWVZra6s1cODAgP4vtHednlnWN/8v\nhAIjqIvgZz/7mfLy8nTjjTf6bfvaa69p8uTJ6tGjh3r37q2bbrrJ7+6dYcOGafPmzZo3b562b9+u\nmJgYn+2zsrL0ySefqK6uTnv27FFsbKwSExP99u3RRx/Vpk2btHPnTs2ZM8dv+zP69eun0aNHS5Jm\nzJih7du3+2wfzHuwdetWFRYWqm/fvpKk2NhYv/365JNPNGnSJL300kud/l3M4sWLlZWVpdGjR6um\npkb//Oc//db0799fI0eO7NR+tXfdSNKAAQM0bNgwSdLw4cNVXV3ts/3rr7+uSZMmqXv37urVq5cK\nCgoC3mUZqDMj4OPHj6tHjx4aPXq0du7cqe3btys3N/eCdQMGDNDQoUNls9k0dOhQjR8/XpKUnp7u\n93W1x/bt2zV58mRdccUV6tmzpyZPnqzXXnvNZ82WLVv0zjvvaMSIEcrOztbWrVt18OBBnzX9+/dX\nXFyc3n33XW3atEk5OTkB/V9o7zqVFPJ1KIX4MHP4t2LFCh0+fDjgfbU2m+2sFR/IhyAlJUW7d+/W\nK6+8okceeUR5eXn61a9+5bNm6tSpWrdunerr63XbbbcF1LdPP/1UJ0+eVGtrq06dOqUrr7wyoLpv\nfo9gWZbf7xWCeQ/+tyYQffr0Uf/+/fXaa68pLS0toJqoqKizdrMEsrvS4/Foy5Yt2rFjh3r06KHr\nrrtOLS0tfut69uwZUJ86or3rRpIuv/xy7/XLLrvM73sQzPpsr+joaA0YMEArVqzQmDFjNGzYMG3d\nulUff/yxz3X7zdfSrVs3de/e3Xv99OnTIevf+d6DQN7roqIiLViwoF3LuvPOO7V8+XI1NDSouLg4\noJr2rtPOwgiqC73zzjtatGhRu75Evfbaa1VeXq4vvvhCx48f18aNG/1+kOvq6tSjRw/dfvvteuCB\nB7Rr1y6/y7n11lu1evVqrVu3TlOnTg2obz/+8Y/1+OOPa/r06e3a53zo0CHt2LFDkvTSSy/5/ItW\nCu49uP766/XXv/5VjY2NkuT915fu3bvrb3/7m1auXKnVq1cH9Frsdrs++eQTNTY2qqWlRRs3bvRb\nc+zYMcXGxqpHjx766KOPvO+FCdq7boIxduxYvfzyy2ppadGJEyf0yiuvdMrBD7m5uVq4cKHGjRun\n3NxcPffcc8rJyQn5coKRm5ur8vJynTp1SidPnlR5ebnf9zovL0/r1q3Tv//9b0lff6YPHTrkd1k3\n33yzKioqtHPnTk2YMCEk/T+f3r176/jx4yF9TkZQXWjp0qX6/PPPdd1110mSrrnmGj3//PM+a7Kz\ns3XrrbcqMzNT8fHxuuaaa/z+xbl37149+OCD3r8AAzn00+Fw6MSJE0pKSpLdbvfbfuXKlbr88st1\n2223qa2tTWPGjJHH45HT6fRbO3jwYC1dulTFxcUaOnSo7r33Xp/t//c9CGQ3l8Ph0MMPP6xx48bp\nsssuU05Ojl588UWfNTabTVdeeaU2btwol8ul3r176wc/+IHPmujoaD366KMaOXKkEhMT5XA4/G5s\nb7jhBj333HNyOBwaPHiwd5eaP8FsxNtTY7PZ2r1uzrcMf8scMWKEbrrpJg0bNkx2u10ZGRn61re+\nFXAfA5Wbm6sFCxZo9OjRuuKKK3TFFVf4DQFfryWQkX6gsrOzdccdd3g/y3fddZcyMzN91gwZMkSP\nP/648vPz1dbWpujoaJWVlenqq6/2WRcdHa3rr79esbGxAfexvetUkuLi4jR27FhlZGRo4sSJITkf\nID/UvcTMnz9fvXr10v3333+xuxKU6upqFRQUaO/evRe7K7iITp48qZ49e6q5uVnjxo3TsmXLlJWV\ndbG7FZba2to0fPhwrVu3TgMHDrzY3WkXdvFdgkz+LUggLvX+o+PuvvtuZWdna/jw4ZoyZQrh1Emq\nqqqUkpKi8ePHX3LhJDGCAgAYihEUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASP8PW/f+Q9EK\neawAAAAASUVORK5CYII=\n", - "text": [ - "" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plot_frequency_histogram(c7bf)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "display_data", - "png": "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\nrClTplhHjhyxLMuybr31Vmvp0qVB+8rMzAx6v7+ptrbWKigosNrb260DBw5YWVlZQce2a9cuKyEh\nwdq2bZtlWZZVVlZmPf/880H76tevn+1x7dq1y8rNzbU+/PBDq7Cw0Hr33Xdt19rt59j9eO+996zO\nzk5r1KhRVkVFhWVZlrVy5Upr6tSpAetCuf/HtoG2tjbr4MGD1ogRI6ytW7cGHV+o22c429qxvnr1\n6mW9+eabQdtalmWtWLHCuummm7p+37dvn606v99v5ebm2mp7bFzfbL9w4UKrsrIyYM3WrVutCRMm\ndP3ucrms+vr6U7bftGmTNX36dMuyLOt73/ueNWbMGOurr76yKisrrSeffDJgX/fcc491xx13WD/9\n6U9P+NrPyfj9fquoqMiyLMvq6OiwLrjgAluvIZZlWV999ZVVXFxsrV692lb7YJhBRdnixYtVUFCg\nsWPHqr6+Xv/617+C1gwaNEhjx46VJF133XXauHFjwPbr169XWVmZBg4cKElKTk4O2serr76qadOm\nqU+fPurfv7+uuOKKoLtQ1q1bp7ffflsXXnihCgsLtX79eu3atStoX6F67bXXNHXqVPXu3Vv9+vXT\nlClTbO3eGTJkiEaOHClJGjVqlPx+f8TH9sknn2jq1Kl64YUXeuyzwiFDhmjEiBFyOBwaMWKEJk2a\nJEnKzc0NeJ9Cvf8bN27UtGnTdM4556hv376aNm2aXn311aDjC3X7DGdbO2bw4MEaPXq0rbYjR47U\n2rVrNW/ePG3cuFFJSUm26uyOpTsKCgr0ySefqLGxUdu2bVNycrLS09NP2f7Y7PzAgQPq06ePxo4d\nq82bN2vjxo0qLi4O2Ne9996rNWvWaPPmzZozZ07QsQ0ePFgpKSl65513tGbNGhUVFdl6DZGkn//8\n5yopKdHll19uq30wET3MHIH5fD6tW7dOmzZtUp8+fTRx4kS1t7cHrfvm5xWWZQX9/MLhcIT8n+x/\na+zWl5eXa8GCBSH1Fapwx3b22Wd3/XzWWWfZ2vUUqgEDBmjw4MF69dVXlZOTE/Hbl46/H7169VLv\n3r27fj5y5IitOjv3/2SPs53Pyrq7fYayrfbt29d226ysLG3dulUvv/yy7rnnHpWUlOjXv/617Xq7\nEhISjtu1bXc7mz59ulasWKGmpiZdc801AdsmJiZqyJAheu655zRu3DiNHDlS69ev10cffRR0u/v0\n00916NAhdXR06PDhwzr33HODju3GG2/Us88+q+bmZlVUVNi6P88995z27NkT0c/vmEFF0f79+5Wc\nnKw+ffroww8/1KZNm2zV7d69u6vtCy+8EPQd0yWXXKK//e1vamlpkaSufwO5+OKLVV1drS+++EIH\nDhzQ6tWrg77QlJSUaMWKFfrPf/7T1c/u3bvt3KWQjB8/Xi+99JLa29t18OBBvfzyy8YcZNC7d2/9\n/e9/19KlS7Vs2bLTPZxuKS4uVnV1tQ4fPqxDhw6puro66LYmhb59hrOthaOxsVF9+vTRtddeqzvu\nuENbtmyxVde/f38dOHDAdj9Op1OffPKJWlpa1N7ertWrV9uqu/rqq7Vs2TKtWLFC06dPD9q+uLhY\nCxcu1IQJE1RcXKwnnnhCRUVFQet+8pOf6P7779fMmTNtfaYmHf2svKamRps3b9bkyZODtn/77be1\naNGiiB/4xAwqii699FI98cQTcrlcGjZsWNdukUAcDoeGDRumxx57TBUVFRoxYoRuvfXWgDUul0t3\n3323JkyYoLPOOktFRUV65plnAtYUFhbq6quvVn5+vlJTU23tRhk+fLjuv/9+lZaWqrOzU4mJiVqy\nZInOP//8oPcpFBdeeKGuuOIKjRw5Uk6nU3l5efrWt74VtO5/+wl1NmCHw+HQueeeq9WrV8vj8ah/\n//76wQ9+ENF+At2PQLcT6v0vLCzUDTfc0PXc33TTTcrPzw86vlC3z//d1i666CLbs6hQHrft27fr\nzjvv7Jp12j10PCUlRePHj1deXp4uu+yyoOe1S0xM1L333qvRo0crPT1dLpfL1jhdLpcOHjyojIwM\nOZ3OoO2Li4u1YMECjR07Vuecc47OOeecoG8Gli5dqrPPPlvXXHONOjs7NW7cOPl8Prnd7qD36ZJL\nLlFycrKt+/LYY4/p888/18SJEyVJF110kZ588smgdcHwRV2cEQ4dOqS+ffuqra1NEyZM0FNPPaWC\ngoLTPay45/f7NWXKFG3fvj3s25g/f7769eun22+/PYIjQ3d0dnZq1KhRWrFihS644ILTNg528eGM\ncPPNN6uwsFCjRo3SVVddRTgZJBK750zZZQuprq5OWVlZmjRp0mkNJ4kZFADAUMygAABGIqAAAEYi\noAAARiKgAABGIqAAAEYioAAARvp/fPP9PvjmFnQAAAAASUVORK5CYII=\n", - "text": [ - "" - ] - } - ], - "prompt_number": 8 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plot_frequency_histogram(normalised_english_counts)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "display_data", - "png": "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\nMEAjR45s8cIJ6Uzo9OrVq+mii1DX5aKLrsVFFwDCiVMmOM6wIiIiVFhYqNzcXAUCAc2bN0/Jyckq\nKiqSJOXn5+vQoUPKzMxUbW2tevTooRUrVqiiokLR0dEtrgsAQHs4zrAuSAPMsLoUMywA4aTdl7UD\nABAuCCwAgBUILACAFQgsAIAVCCwAgBUILACAFQgsAIAVCCwAgBUILACAFQgsAIAVCCwAgBUILACA\nFQgsAIAVCCwAgBUILACAFQgsAGEnJqaPXC6X4y0mpk9Xt4kLjA9wvMjxAY4IR7wuL158gCMAwHoE\nFgDACgQWAMAKBBYAwAoEFgDACgQWAMAKBBYAwAoEFgDACgQWAMAKBBYAwAoEFgDACkEDq7S0VElJ\nSUpISNDSpUtbrFm4cKESEhLk9XpVXl7e9P1nnnlGQ4YMUVpamu68807V19efv84BABcVx8AKBAJa\nsGCBSktLVVFRobVr12rv3r3NakpKSnTgwAHt379fq1at0vz58yVJVVVVevXVV7V792598MEHCgQC\n+vOf/9x5IwEAdGuOgVVWVqb4+HjFxcUpMjJSeXl5Ki4ublazYcMGzZkzR5KUlZWlo0eP6vDhw4qJ\niVFkZKROnDihxsZGnThxQm63u/NGAgDo1hwDq6amRrGxsU3LHo9HNTU1IdX06dNHixYt0rXXXqsB\nAwboqquu0k033XSe2wcAXCwcA+vMZ9IE19Jnl3z88cd6/vnnVVVVpYMHD+rYsWP605/+1L4uAZyD\nDznExSbC6U632y2/39+07Pf75fF4HGuqq6vldrvl8/k0evRo9e3bV5I0bdo0vf3225o5c+Y5j1NQ\nUND0dU5OjnJyctozFuCiUlf3tYJ9yGFdXWi/dAJdxefzyefzhVZsHDQ0NJhBgwaZyspKU19fb7xe\nr6moqGhWs2nTJjNx4kRjjDE7duwwWVlZxhhjysvLzZAhQ8yJEyfM6dOnzezZs01hYeE5jxGkBXQy\nSUYyQW48R+GoOz933XlscOb0vDrOsCIiIlRYWKjc3FwFAgHNmzdPycnJKioqkiTl5+dr0qRJKikp\nUXx8vKKiorR69WpJUnp6umbPnq0RI0aoR48eGjZsmO677752JTAAAK7vEq3rGnC5WjwHZqOYmD7f\nHaZpXa9evVVbe+QCdRTcmfOUwfZ/93mOupPu/Nx157HBmVMmEFjnkY0/ZDb2jDO683PXnccGZ06Z\nwFszAQCsQGABAKxAYAEArEBgAQCsQGABAKxAYAEArEBgAQCsQGABAKxAYAEArEBgAQCsQGABAKxA\nYAEArEBgAQCsQGABAKxAYAEArEBgAQCsQGABAKxAYAEArEBgwSoxMX3kcrkcbzExfbq6TQCdgMCC\nVerqvpZkHG9nauxEIAOtI7DQ5fhP+nvdPZCBjojo6gaA7/+TdqpxXZhmAIQtZlgAACsQWAAuCA79\noqM4JAjgguDQLzqKGRYAwAoEFgDACkEDq7S0VElJSUpISNDSpUtbrFm4cKESEhLk9XpVXl7e9P2j\nR49q+vTpSk5OVkpKinbu3Hn+OgcAXFQcAysQCGjBggUqLS1VRUWF1q5dq7179zarKSkp0YEDB7R/\n/36tWrVK8+fPb7rvV7/6lSZNmqS9e/fq/fffV3JycueMAgDQ7TkGVllZmeLj4xUXF6fIyEjl5eWp\nuLi4Wc2GDRs0Z84cSVJWVpaOHj2qw4cP65tvvtG2bds0d+5cSVJERISuvPLKThoGAKC7cwysmpoa\nxcbGNi17PB7V1NQEramurlZlZaX69eunu+++W8OGDdO9996rEydOnOf2AQAXC8fAcrlCu8TUmOaX\nqrpcLjU2Nmr37t36xS9+od27dysqKkrPPvts+zsFAFzUHP8Oy+12y+/3Ny37/X55PB7Hmurqarnd\nbhlj5PF4lJmZKUmaPn16q4FVUFDQ9HVOTo5ycnLaOg4AXSAmpk/Q9zbs1au3amuPXKCOYBufzyef\nzxdasXHQ0NBgBg0aZCorK019fb3xer2moqKiWc2mTZvMxIkTjTHG7Nixw2RlZTXdl52dbT766CNj\njDGLFy82jzzyyDmPEaQFq0gykglyC6/xhkPPbekhHPrtTLbti87qNxzGhq7h9Lw6zrAiIiJUWFio\n3NxcBQIBzZs3T8nJySoqKpIk5efna9KkSSopKVF8fLyioqK0evXqpvVfeOEFzZw5U99++60GDx7c\n7D4AANrC9V2idV0DLtc558BsdeacX7CxhNd4w6HntvQQDv12Jtv2RWf1Gw5jQ9dwygTe6QIAYAUC\nCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsA\nYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAF\n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\nrY7prLKyMpOenm7q6+tNXV2dSUhIaLWHyspKExERYd577z1jjDG33367ef311x23Hx0d7Xh/e9ap\nrKw0qampZt++fSYjI8O8//77Hdrm2XF9+OGH5vTp02b48OFm7ty5xhhjiouLzdSpU1tdJ5R9cfZ5\nPnHihDl27JgZMmSIKS8vb7WXUF9rbXn9nN12jx49zH//+99Wa85at26duffee5uWv/nmm1Zrq6qq\nTGpqatBtnu3hh7XLli0zBQUF59SVl5ebsWPHNi2npKSY6urqFre5c+dOM2PGDGOMMT/5yU9MVlaW\naWhoMAUFBWbVqlUtrvPEE0+Yhx56yPzyl79s8c95zqqqqjLDhg0zxhgTCATM4MGDHX+mjTGmoaHB\nZGdnm40bNzrWdUfMsDrRihUrlJ6erlGjRqm6ulr79+9vtTY2NlajRo2SJM2aNUvbt29vsW7r1q26\n/fbb1afPmT8U7N27d6vb3LZtm6ZNm6aePXuqV69emjJlSquHabZs2aJ3331XI0aMUEZGhrZu3arK\nyspQh9qqt956S1OnTtWll16q6OhoTZ482fFQ0cCBAzV06FBJ0vDhw1VVVdXhHtrjiy++0NSpU/XG\nG2+cl/OLAwcO1JAhQ+RyuTRkyBDddNNNkqTU1NRWxxjqvti+fbumTZumyy+/XFFRUZo2bZq2bdvW\nai+hvtba8vo567rrrtPIkSMdayRp6NCh+ve//61HH31U27dvV0xMTKu1wR6zPdLT0/XFF1/o888/\n13vvvafevXvL7Xa3WHt2hl1XV6eePXtq1KhR2rVrl7Zv367s7OwW13nyySf15ptvateuXXrkkUda\n7eO6665T3759tWfPHr355psaNmyY48+0dObNxsePH6+bb7459AF3E46XtaP9fD6ftmzZop07d6pn\nz54aN26c6uvrW63/4TkQY0yr50RcLlfIP8A/rg223pw5c/T000+HtO1QtbWHyy67rOnrSy65xPFw\nVWe66qqrdN1112nbtm1KSkrq8PZ+OK4ePXro0ksvbfq6sbEx6DpO+6Klfex0Tq29r7VQXndRUVFB\nayQpISFB5eXl2rRpk5544gmNHz9ev/nNb0Ja10lERESzQ9lOr58ZM2Zo3bp1OnTokPLy8lqti4yM\n1MCBA/Xaa69p9OjRGjp0qLZu3aoDBw60+tr43//+p+PHjysQCOjkyZO64oorWt3+Pffco9WrV+vw\n4cOaO3eu4/hee+01+f3+i/acHjOsTlJbW6vevXurZ8+e2rdvn3bu3OlY/9lnnzXVvPHGG63+5nbj\njTfqb3/7m44cOSJJTf+25IYbbtD69et16tQp1dXVaePGja3+5zR+/HitW7dOX375ZdN2P/vss6Dj\nDGbMmDH65z//qfr6eh07dkybNm2y4gKFSy+9VP/4xz+0Zs2aFv/gPZxkZ2dr/fr1OnnypI4fP671\n69e3+vqRQn+tteX101aff/65evbsqZkzZ+qhhx7S7t27W63t1auX6urqQtpu//799cUXX+jIkSOq\nr6/Xxo0bW6294447tHbtWq1bt04zZsxw3G52draWLVumsWPHKjs7W6+88oqGDRvWan1+fr6eeuop\n3XnnnUHPu916660qLS3Vrl27lJub22rdu+++q+XLl3fpRU5djRlWJ5kwYYJeeeUVpaSkKDExsekQ\nTEtcLpcSExP14osvau7cuRoyZIjmz5/fYm1KSooef/xxjR07VpdccomGDRumP/zhDy3WZmRk6I47\n7pDX69XVV1/teKgmOTlZTz31lH72s5/p9OnTioyM1EsvvaRrr73Wse9gRowYoSlTpmjo0KHq37+/\n0tLSdOWVV4a8zWCP0Z7/QENZx+Vy6YorrtDGjRv105/+VL169dItt9zS7m06jctphhPKY2RkZOjn\nP/950/N77733yuv1ttpLqK+1H79+MjMzg86yQn0+PvjgAz388MNNs02ny9b79u2rMWPGKC0tTZMm\nTXL8bL3IyEg9+eSTGjlypNxut1JSUlrtKSUlRceOHZPH41H//v0d+83OztbTTz+tUaNG6fLLL9fl\nl1/eatCvWbNGl112mfLy8nT69GmNHj1aPp9POTk5rfZ84403qnfv3o7778UXX9TXX3+tcePGSZIy\nMzO1atUqx767G/5wGJ3u+PHjioqK0okTJzR27Fi9+uqrSk9P75Jevvrqqy49N9bVqqqqNHnyZH3w\nwQdtXnfJkiWKjo7WokWLOqGzi9fp06c1fPhwrVu3ToMHD+7qdsIahwTR6e677z5lZGRo+PDhmj59\nepeF1cGDBzV69Gg9/PDDXfL44aIjh/VsOJxrk4qKCiUkJOimm24irELADAsAYAVmWAAAKxBYAAAr\nEFgAACsQWAAAKxBYAAArEFgAACv8P5ZWvQDqsWNNAAAAAElFTkSuQmCC\n", - "text": [ - "" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "c7a" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 10, - "text": [ - "'WWPA, AWHCRH MDY IOT NJHGK HJWLSBALH HI AWL BBHLJT, X DTUI PC VC MGPSHN HCK AHXK AVL BCAXS PMILG JAVHPCN IPBL. PZ ESPUCLS AWL RYPAT DPZ SLAPKLGLS AD AWLXY NHGK DU UYXKPF PMILGUDVC, ADV AHIL UVG HCFDUT AD WGVRLHZ XA, PUS AWL QVPYS DPZ THHF IV SLIHRO UYDT IOT IPZT. LMJTSALCA XKTH IV BHZL IOT WPPCAXUV SDVZ SXRT WPYI VU AWL QVM IN AWL LHN - UD-VCL LHH NDPCN IV IBGU XA DCTY IV AVDR XM IOTF SPSU\u2019I RCVL PI DPZ IOTYT, HCK IOTF LLGL EYTAIF JUAPZLAF IV QL AVDRXUV MDY HVBLDUT AD ZBBVNAL P WPPCAXUV PC HCFLHN. \\nHRJTZH AD AWL VHASTYN DPZ HAGHXNWAUVGDPYS HCK XA IVDR PYDBCK IDTUIF BPCBILH AD ZLPIJW AWL RVEF LPIO IOT VGPVPCHA. P WPS AWL EHXUIPCN PTDUV H QBCJW VU YTWGVSBRAXVCZ XU IOT TJZTBB ZWVE HCK RHBWTK DBI MDY IOT UXNWA XU IOT NJHGKH\u2019 IPAWYDVB. AJYCZ DBI AWLN WGLULG AD BHL IOT KXYTJIVGZ\u2019 UHRPAPIPTZ JW DU IOT ADW USDVG. DXAW AWL CLL LMOXIXAXVC VELCPCN DU HHIBGKPF IOT WAHRL LHH IJZN LCVJNW AD ZAPE VJA UPGZI AWPCN PUS, HH HGYPUVLS, P BHSL HBGL X DPZ UPGZI PCAD AWL HODW. X UDD WHKL IOT ODUDBG VU OPCXUV IDBVOI AWL ROTHELHA TCTY LVGR QF SH KPCJX. VG UDA. \\nIOT E-GHN YTZJSIZ RHBL QHRR IOXZ BVGUXUV HCK, PZ NVJ ZJZELRATK, IOXZ XZ DUT VU ZPYP\u2019Z UHZLH. P PT IVAK XA XZ RSDZT AD WTYULRA, QBI, OXKSLC BCKTY IOT SPFTYH VU WPPCA, HOT ZRYXIQSTK P WXJIBGL DM IOT UPGX LPNAL TTQSTT XU ALPK. HOT ZXNCLS PI Z IVD. AWL ILRO VBNZ IOXUZ ZWL BHN OPCT BHLS H QPI VU VAK EPEL APZL P JGHNVC AD KTMPJT AWL QVPYS ITMDYT ZWL HAPYILS DDYZ VC PI. HCFLHN, AWHI STHKLH AWL FBTZIPDU DM LOTYT AWL WLAS IOT YTHA WPPCAXUV TXNWA QL. XA\u2019H OPYS AD ITSXLKL IOPA HOT STMI PI DXAW AWL HZ PUS P RHC\u2019A HLT OTY VVXUV VC AWL GBC DXAW PI ZIBRR JUSLG OTY RVPA. XA\u2019H UDA APZL HOT JDBAK GVAS XA JW. \\nX DDYZLS AWYDBVO HVBL BVGL DM IOT UPGX WPWTYH HCK UVJUS AWPH UDAT. HI STHHA XA ILASH BH DWLGL HOT DTUI. SDVZZ APZL IOT JXWWLG JALGR LHH IPJZ IN AWL LHN. P WHKL BVKLS VC AD CTUXJT AD AGF IV UPCK PUN AGHRL DM HHGH IOTYT, IJA X OPCT H ULTSXUV AWL HVABIPDU IV IOXZ BFHATYN PH IPJZ PC WPYXZ LOTYT PI HAS QLVHC. P ALUA IOT WPPCAXUV HI AWL EHGPH VUMXJT. TPFQL NVJ JDBAK PYGHCNT AD YTAJYC PI? PI ZWVJSS IT LPZXLG AD NTA XA XU IOPU XA LHH AD LMAGHRA XA. \\nPSA AWL QLHA, \\nWHGYN\\n'" - ] - } - ], - "prompt_number": 10 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "vigenere_frequency_break(sanitise(c7a))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 12, - "text": [ - "('hp', 0.03214089578198264)" - ] - } - ], - "prompt_number": 12 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "' '.join(segment(vigenere_decipher(sanitise(c7a), 'hp')))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 15, - "text": [ - "'phil thanks for the guard schedules at the museum i went in on friday and laid low until after closing time as planned the crate was delivered to their yard on friday afternoon too late for anyone to process it and the board was easy to detach from the base excellent idea to make the painting look like part of the box by the way no one was going to turn it over to look if they didnt know it was there and they were pretty unlikely to be looking for someone to smuggle a painting in anyway access to the gallery was straightforward and it took around twenty minutes to switch the copy with the original i hid the painting among a bunch of reproductions in the museum shop and camped out for the night in the guards bathroom turns out they prefer to use the directors facilities upon the top floor with the new exhibition opening on saturday the place was busy enough to slip out first thing and as arranged i made sure i was first into the shop i now have the honour of having bought the cheapest ever work by davinci or not the xray results came back this morning and as you suspected this is one of saras fake siam told it is close to perfect but hidden under the layers of paint she scribbled a picture of the nazi eagle emblem in leads he signed its too the tech guys think she may have used abit of old pipe like a crayon to deface the board before she started work on it anyway that leaves the question of where the hell the real painting might be its hard to believe that she left it with the ss and icant see her going on the run with it stuck under her coat its not like she could roll it up i worked through some more of the nazi papers and found this note atleast it tells us where she went looks like the cipher clerk was back by the way i have moved on to venice to try to find any trace of sara there but i have a feeling the solution to this mystery is back in paris where it all began i left the painting at the paris office maybe you could arrange to return it it should be easier to get it in than it was to extract it all the best harry'" - ] - } - ], - "prompt_number": 15 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "vigenere_frequency_break(sanitise(c7b))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 16, - "text": [ - "('aattuualptaaauaaaa', 0.10312795085805967)" - ] - } - ], - "prompt_number": 16 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "' '.join(segment(vigenere_decipher(sanitise(c7b),'aattuualptaaauaaaa' )))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 17, - "text": [ - "'ttmaqoehqveytelettkf vfantitlnhhttprnmews qrfwquefetnntmmohpun kit a murvsoegeomjsemwelpo yotkcoytmamvgijtrhtk pcrnydlmautreryrciti man rtxrnmzeatctythrycyb obmmisfdefehefyfnvws note neetztxkrqcavlennemh tmeemnnfvulnntneyfrt a ohtmohynxzxnzontunrg hubfooznoirdgkiztyqh eodatncnenpgyccwfmai masxprjmmtoktyiheouf jnteemaetxhkyutyaatk ausmmfuccthuyotxmltn tythhtootmnrnusztdsm mkoiyftfhharuianbwha eixyetfoatnboksfiheu ywcrthbfulmrsaetmlpu ymhtryamodjafttteaff ttnwmqtfzwbhntypttmt are dldnrkyhsacctyerfamm tgomtxzumtmtmtanskid jfpoxhothtoaixvidebb ooeryykftffteelratyh qyurtemtvgeutvsfrheo tcmhyalioyuemnefknco trqiitaonfouaywtmmoo that eu uhpyhnzxttontfaaxnsn of lioptnrtovvxzdiepexy not etielahfcariewfhwwh yiwlvmuudehtbbfvvawi ytkbozvrifacjsiwaagb let now oalfdorpballhktfqtku at hvnxwllfmodtqsluhycv lhiyytejglmrzfdemded dweicjqisrnvlmhudewl kb dgcmklhyhkjalxdosdtq in lfs gewambhlohuwejeltww tbjgeudeucklmxatceud same rpfmjtqmorshwzndcgkm zhieuzasrsoekzgbtbqh rktiwgcavlneuqrzhibj leljrlayqybgewqgrkth wlpiyshwfsillxicblls ebwhcyfkrvmhiomkotdo iwmfahyniseiszwfshlt cxrmaotikmnuachvqdov mmatibzhfoadvloawzke nqrcnrgbxrwfdkctsxxa iejzlnerryfidtbwhxbd hluhtfswwnclgdtwwdvk lhazobmargsgwwtopasg men rl on york rodr keewdeelujkdlellythc wexcfrqxagrdiyunehkn ikfruurtslqbdjrcvujp kxghfbldgmistthujsot bids iwcdsiajaqmanpigbcp zoxlurhnlgrtfifiguor gsm mntfcwavanbilwysatnl mvpnafbhzhwxnrzirhra'" - ] - } - ], - "prompt_number": 17 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "len(sanitise(c7b))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 18, - "text": [ - "1304" - ] - } - ], - "prompt_number": 18 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [], - "language": "python", - "metadata": {}, - "outputs": [] - } - ], - "metadata": {} - } - ] -} \ No newline at end of file diff --git a/cipher.py b/cipher.py deleted file mode 100644 index 266237a..0000000 --- a/cipher.py +++ /dev/null @@ -1,1056 +0,0 @@ -import string -import collections -import math -from enum import Enum -from itertools import zip_longest, cycle, chain, count -import numpy as np -from numpy import matrix -from numpy import linalg -from language_models import * - - -modular_division_table = [[0]*26 for _ in range(26)] -for a in range(26): - for b in range(26): - c = (a * b) % 26 - modular_division_table[b][c] = a - - -def every_nth(text, n, fillvalue=''): - """Returns n strings, each of which consists of every nth character, - starting with the 0th, 1st, 2nd, ... (n-1)th character - - >>> every_nth(string.ascii_lowercase, 5) - ['afkpuz', 'bglqv', 'chmrw', 'dinsx', 'ejoty'] - >>> every_nth(string.ascii_lowercase, 1) - ['abcdefghijklmnopqrstuvwxyz'] - >>> every_nth(string.ascii_lowercase, 26) # doctest: +NORMALIZE_WHITESPACE - ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] - >>> every_nth(string.ascii_lowercase, 5, fillvalue='!') - ['afkpuz', 'bglqv!', 'chmrw!', 'dinsx!', 'ejoty!'] - """ - split_text = chunks(text, n, fillvalue) - return [''.join(l) for l in zip_longest(*split_text, fillvalue=fillvalue)] - -def combine_every_nth(split_text): - """Reforms a text split into every_nth strings - - >>> combine_every_nth(every_nth(string.ascii_lowercase, 5)) - 'abcdefghijklmnopqrstuvwxyz' - >>> combine_every_nth(every_nth(string.ascii_lowercase, 1)) - 'abcdefghijklmnopqrstuvwxyz' - >>> combine_every_nth(every_nth(string.ascii_lowercase, 26)) - 'abcdefghijklmnopqrstuvwxyz' - """ - return ''.join([''.join(l) - for l in zip_longest(*split_text, fillvalue='')]) - -def chunks(text, n, fillvalue=None): - """Split a text into chunks of n characters - - >>> chunks('abcdefghi', 3) - ['abc', 'def', 'ghi'] - >>> chunks('abcdefghi', 4) - ['abcd', 'efgh', 'i'] - >>> chunks('abcdefghi', 4, fillvalue='!') - ['abcd', 'efgh', 'i!!!'] - """ - if fillvalue: - padding = fillvalue[0] * (n - len(text) % n) - else: - padding = '' - return [(text+padding)[i:i+n] for i in range(0, len(text), n)] - -def transpose(items, transposition): - """Moves items around according to the given transposition - - >>> transpose(['a', 'b', 'c', 'd'], (0,1,2,3)) - ['a', 'b', 'c', 'd'] - >>> transpose(['a', 'b', 'c', 'd'], (3,1,2,0)) - ['d', 'b', 'c', 'a'] - >>> transpose([10,11,12,13,14,15], (3,2,4,1,5,0)) - [13, 12, 14, 11, 15, 10] - """ - transposed = [''] * len(transposition) - for p, t in enumerate(transposition): - transposed[p] = items[t] - return transposed - -def untranspose(items, transposition): - """Undoes a transpose - - >>> untranspose(['a', 'b', 'c', 'd'], [0,1,2,3]) - ['a', 'b', 'c', 'd'] - >>> untranspose(['d', 'b', 'c', 'a'], [3,1,2,0]) - ['a', 'b', 'c', 'd'] - >>> untranspose([13, 12, 14, 11, 15, 10], [3,2,4,1,5,0]) - [10, 11, 12, 13, 14, 15] - """ - transposed = [''] * len(transposition) - for p, t in enumerate(transposition): - transposed[t] = items[p] - return transposed - -def deduplicate(text): - return list(collections.OrderedDict.fromkeys(text)) - - -def caesar_encipher_letter(accented_letter, shift): - """Encipher a letter, given a shift amount - - >>> caesar_encipher_letter('a', 1) - 'b' - >>> caesar_encipher_letter('a', 2) - 'c' - >>> caesar_encipher_letter('b', 2) - 'd' - >>> caesar_encipher_letter('x', 2) - 'z' - >>> caesar_encipher_letter('y', 2) - 'a' - >>> caesar_encipher_letter('z', 2) - 'b' - >>> caesar_encipher_letter('z', -1) - 'y' - >>> caesar_encipher_letter('a', -1) - 'z' - >>> caesar_encipher_letter('A', 1) - 'B' - >>> caesar_encipher_letter('é', 1) - 'f' - """ - letter = unaccent(accented_letter) - if letter in string.ascii_letters: - if letter in string.ascii_uppercase: - alphabet_start = ord('A') - else: - alphabet_start = ord('a') - return chr(((ord(letter) - alphabet_start + shift) % 26) + - alphabet_start) - else: - return letter - -def caesar_decipher_letter(letter, shift): - """Decipher a letter, given a shift amount - - >>> caesar_decipher_letter('b', 1) - 'a' - >>> caesar_decipher_letter('b', 2) - 'z' - """ - return caesar_encipher_letter(letter, -shift) - -def caesar_encipher(message, shift): - """Encipher a message with the Caesar cipher of given shift - - >>> caesar_encipher('abc', 1) - 'bcd' - >>> caesar_encipher('abc', 2) - 'cde' - >>> caesar_encipher('abcxyz', 2) - 'cdezab' - >>> caesar_encipher('ab cx yz', 2) - 'cd ez ab' - >>> caesar_encipher('Héllo World!', 2) - 'Jgnnq Yqtnf!' - """ - enciphered = [caesar_encipher_letter(l, shift) for l in message] - return ''.join(enciphered) - -def caesar_decipher(message, shift): - """Decipher a message with the Caesar cipher of given shift - - >>> caesar_decipher('bcd', 1) - 'abc' - >>> caesar_decipher('cde', 2) - 'abc' - >>> caesar_decipher('cd ez ab', 2) - 'ab cx yz' - >>> caesar_decipher('Jgnnq Yqtnf!', 2) - 'Hello World!' - """ - return caesar_encipher(message, -shift) - -def affine_encipher_letter(accented_letter, multiplier=1, adder=0, one_based=True): - """Encipher a letter, given a multiplier and adder - - >>> ''.join([affine_encipher_letter(l, 3, 5, True) \ - for l in string.ascii_uppercase]) - 'HKNQTWZCFILORUXADGJMPSVYBE' - >>> ''.join([affine_encipher_letter(l, 3, 5, False) \ - for l in string.ascii_uppercase]) - 'FILORUXADGJMPSVYBEHKNQTWZC' - """ - letter = unaccent(accented_letter) - if letter in string.ascii_letters: - if letter in string.ascii_uppercase: - alphabet_start = ord('A') - else: - alphabet_start = ord('a') - letter_number = ord(letter) - alphabet_start - if one_based: letter_number += 1 - cipher_number = (letter_number * multiplier + adder) % 26 - if one_based: cipher_number -= 1 - return chr(cipher_number % 26 + alphabet_start) - else: - return letter - -def affine_decipher_letter(letter, multiplier=1, adder=0, one_based=True): - """Encipher a letter, given a multiplier and adder - - >>> ''.join([affine_decipher_letter(l, 3, 5, True) \ - for l in 'HKNQTWZCFILORUXADGJMPSVYBE']) - 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' - >>> ''.join([affine_decipher_letter(l, 3, 5, False) \ - for l in 'FILORUXADGJMPSVYBEHKNQTWZC']) - 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' - """ - if letter in string.ascii_letters: - if letter in string.ascii_uppercase: - alphabet_start = ord('A') - else: - alphabet_start = ord('a') - cipher_number = ord(letter) - alphabet_start - if one_based: cipher_number += 1 - plaintext_number = ( - modular_division_table[multiplier] - [(cipher_number - adder) % 26]) - if one_based: plaintext_number -= 1 - return chr(plaintext_number % 26 + alphabet_start) - else: - return letter - -def affine_encipher(message, multiplier=1, adder=0, one_based=True): - """Encipher a message - - >>> affine_encipher('hours passed during which jerico tried every ' \ - 'trick he could think of', 15, 22, True) - 'lmyfu bkuusd dyfaxw claol psfaom jfasd snsfg jfaoe ls omytd jlaxe mh' - """ - enciphered = [affine_encipher_letter(l, multiplier, adder, one_based) - for l in message] - return ''.join(enciphered) - -def affine_decipher(message, multiplier=1, adder=0, one_based=True): - """Decipher a message - - >>> affine_decipher('lmyfu bkuusd dyfaxw claol psfaom jfasd snsfg ' \ - 'jfaoe ls omytd jlaxe mh', 15, 22, True) - 'hours passed during which jerico tried every trick he could think of' - """ - enciphered = [affine_decipher_letter(l, multiplier, adder, one_based) - for l in message] - return ''.join(enciphered) - - -class KeywordWrapAlphabet(Enum): - from_a = 1 - from_last = 2 - from_largest = 3 - - -def keyword_cipher_alphabet_of(keyword, wrap_alphabet=KeywordWrapAlphabet.from_a): - """Find the cipher alphabet given a keyword. - wrap_alphabet controls how the rest of the alphabet is added - after the keyword. - - >>> keyword_cipher_alphabet_of('bayes') - 'bayescdfghijklmnopqrtuvwxz' - >>> keyword_cipher_alphabet_of('bayes', KeywordWrapAlphabet.from_a) - 'bayescdfghijklmnopqrtuvwxz' - >>> keyword_cipher_alphabet_of('bayes', KeywordWrapAlphabet.from_last) - 'bayestuvwxzcdfghijklmnopqr' - >>> keyword_cipher_alphabet_of('bayes', KeywordWrapAlphabet.from_largest) - 'bayeszcdfghijklmnopqrtuvwx' - """ - if wrap_alphabet == KeywordWrapAlphabet.from_a: - cipher_alphabet = ''.join(deduplicate(sanitise(keyword) + - string.ascii_lowercase)) - else: - if wrap_alphabet == KeywordWrapAlphabet.from_last: - last_keyword_letter = deduplicate(sanitise(keyword))[-1] - else: - last_keyword_letter = sorted(sanitise(keyword))[-1] - last_keyword_position = string.ascii_lowercase.find( - last_keyword_letter) + 1 - cipher_alphabet = ''.join( - deduplicate(sanitise(keyword) + - string.ascii_lowercase[last_keyword_position:] + - string.ascii_lowercase)) - return cipher_alphabet - - -def keyword_encipher(message, keyword, wrap_alphabet=KeywordWrapAlphabet.from_a): - """Enciphers a message with a keyword substitution cipher. - wrap_alphabet controls how the rest of the alphabet is added - after the keyword. - 0 : from 'a' - 1 : from the last letter in the sanitised keyword - 2 : from the largest letter in the sanitised keyword - - >>> keyword_encipher('test message', 'bayes') - 'rsqr ksqqbds' - >>> keyword_encipher('test message', 'bayes', KeywordWrapAlphabet.from_a) - 'rsqr ksqqbds' - >>> keyword_encipher('test message', 'bayes', KeywordWrapAlphabet.from_last) - 'lskl dskkbus' - >>> keyword_encipher('test message', 'bayes', KeywordWrapAlphabet.from_largest) - 'qspq jsppbcs' - """ - cipher_alphabet = keyword_cipher_alphabet_of(keyword, wrap_alphabet) - cipher_translation = ''.maketrans(string.ascii_lowercase, cipher_alphabet) - return unaccent(message).lower().translate(cipher_translation) - -def keyword_decipher(message, keyword, wrap_alphabet=KeywordWrapAlphabet.from_a): - """Deciphers a message with a keyword substitution cipher. - wrap_alphabet controls how the rest of the alphabet is added - after the keyword. - 0 : from 'a' - 1 : from the last letter in the sanitised keyword - 2 : from the largest letter in the sanitised keyword - - >>> keyword_decipher('rsqr ksqqbds', 'bayes') - 'test message' - >>> keyword_decipher('rsqr ksqqbds', 'bayes', KeywordWrapAlphabet.from_a) - 'test message' - >>> keyword_decipher('lskl dskkbus', 'bayes', KeywordWrapAlphabet.from_last) - 'test message' - >>> keyword_decipher('qspq jsppbcs', 'bayes', KeywordWrapAlphabet.from_largest) - 'test message' - """ - cipher_alphabet = keyword_cipher_alphabet_of(keyword, wrap_alphabet) - cipher_translation = ''.maketrans(cipher_alphabet, string.ascii_lowercase) - return message.lower().translate(cipher_translation) - - -def vigenere_encipher(message, keyword): - """Vigenere encipher - - >>> vigenere_encipher('hello', 'abc') - 'hfnlp' - """ - shifts = [ord(l) - ord('a') for l in sanitise(keyword)] - pairs = zip(message, cycle(shifts)) - return ''.join([caesar_encipher_letter(l, k) for l, k in pairs]) - -def vigenere_decipher(message, keyword): - """Vigenere decipher - - >>> vigenere_decipher('hfnlp', 'abc') - 'hello' - """ - shifts = [ord(l) - ord('a') for l in sanitise(keyword)] - pairs = zip(message, cycle(shifts)) - return ''.join([caesar_decipher_letter(l, k) for l, k in pairs]) - -beaufort_encipher=vigenere_decipher -beaufort_decipher=vigenere_encipher - - -def transpositions_of(keyword): - """Finds the transpostions given by a keyword. For instance, the keyword - 'clever' rearranges to 'celrv', so the first column (0) stays first, the - second column (1) moves to third, the third column (2) moves to second, - and so on. - - If passed a tuple, assume it's already a transposition and just return it. - - >>> transpositions_of('clever') - (0, 2, 1, 4, 3) - >>> transpositions_of('fred') - (3, 2, 0, 1) - >>> transpositions_of((3, 2, 0, 1)) - (3, 2, 0, 1) - """ - if isinstance(keyword, tuple): - return keyword - else: - key = deduplicate(keyword) - transpositions = tuple(key.index(l) for l in sorted(key)) - return transpositions - -def pad(message_len, group_len, fillvalue): - padding_length = group_len - message_len % group_len - if padding_length == group_len: padding_length = 0 - padding = '' - for i in range(padding_length): - if callable(fillvalue): - padding += fillvalue() - else: - padding += fillvalue - return padding - -def column_transposition_encipher(message, keyword, fillvalue=' ', - fillcolumnwise=False, - emptycolumnwise=False): - """Enciphers using the column transposition cipher. - Message is padded to allow all rows to be the same length. - - >>> column_transposition_encipher('hellothere', 'abcdef', fillcolumnwise=True) - 'hlohr eltee ' - >>> column_transposition_encipher('hellothere', 'abcdef', fillcolumnwise=True, emptycolumnwise=True) - 'hellothere ' - >>> column_transposition_encipher('hellothere', 'abcdef') - 'hellothere ' - >>> column_transposition_encipher('hellothere', 'abcde') - 'hellothere' - >>> column_transposition_encipher('hellothere', 'abcde', fillcolumnwise=True, emptycolumnwise=True) - 'hellothere' - >>> column_transposition_encipher('hellothere', 'abcde', fillcolumnwise=True, emptycolumnwise=False) - 'hlohreltee' - >>> column_transposition_encipher('hellothere', 'abcde', fillcolumnwise=False, emptycolumnwise=True) - 'htehlelroe' - >>> column_transposition_encipher('hellothere', 'abcde', fillcolumnwise=False, emptycolumnwise=False) - 'hellothere' - >>> column_transposition_encipher('hellothere', 'clever', fillcolumnwise=True, emptycolumnwise=True) - 'heotllrehe' - >>> column_transposition_encipher('hellothere', 'clever', fillcolumnwise=True, emptycolumnwise=False) - 'holrhetlee' - >>> column_transposition_encipher('hellothere', 'clever', fillcolumnwise=False, emptycolumnwise=True) - 'htleehoelr' - >>> column_transposition_encipher('hellothere', 'clever', fillcolumnwise=False, emptycolumnwise=False) - 'hleolteher' - >>> column_transposition_encipher('hellothere', 'cleverly') - 'hleolthre e ' - >>> column_transposition_encipher('hellothere', 'cleverly', fillvalue='!') - 'hleolthre!e!' - >>> column_transposition_encipher('hellothere', 'cleverly', fillvalue=lambda: '*') - 'hleolthre*e*' - """ - transpositions = transpositions_of(keyword) - message += pad(len(message), len(transpositions), fillvalue) - if fillcolumnwise: - rows = every_nth(message, len(message) // len(transpositions)) - else: - rows = chunks(message, len(transpositions)) - transposed = [transpose(r, transpositions) for r in rows] - if emptycolumnwise: - return combine_every_nth(transposed) - else: - return ''.join(chain(*transposed)) - -def column_transposition_decipher(message, keyword, fillvalue=' ', - fillcolumnwise=False, - emptycolumnwise=False): - """Deciphers using the column transposition cipher. - Message is padded to allow all rows to be the same length. - - >>> column_transposition_decipher('hellothere', 'abcde', fillcolumnwise=True, emptycolumnwise=True) - 'hellothere' - >>> column_transposition_decipher('hlohreltee', 'abcde', fillcolumnwise=True, emptycolumnwise=False) - 'hellothere' - >>> column_transposition_decipher('htehlelroe', 'abcde', fillcolumnwise=False, emptycolumnwise=True) - 'hellothere' - >>> column_transposition_decipher('hellothere', 'abcde', fillcolumnwise=False, emptycolumnwise=False) - 'hellothere' - >>> column_transposition_decipher('heotllrehe', 'clever', fillcolumnwise=True, emptycolumnwise=True) - 'hellothere' - >>> column_transposition_decipher('holrhetlee', 'clever', fillcolumnwise=True, emptycolumnwise=False) - 'hellothere' - >>> column_transposition_decipher('htleehoelr', 'clever', fillcolumnwise=False, emptycolumnwise=True) - 'hellothere' - >>> column_transposition_decipher('hleolteher', 'clever', fillcolumnwise=False, emptycolumnwise=False) - 'hellothere' - """ - transpositions = transpositions_of(keyword) - message += pad(len(message), len(transpositions), fillvalue) - if emptycolumnwise: - rows = every_nth(message, len(message) // len(transpositions)) - else: - rows = chunks(message, len(transpositions)) - untransposed = [untranspose(r, transpositions) for r in rows] - if fillcolumnwise: - return combine_every_nth(untransposed) - else: - return ''.join(chain(*untransposed)) - -def scytale_encipher(message, rows, fillvalue=' '): - """Enciphers using the scytale transposition cipher. - Message is padded with spaces to allow all rows to be the same length. - - >>> scytale_encipher('thequickbrownfox', 3) - 'tcnhkfeboqrxuo iw ' - >>> scytale_encipher('thequickbrownfox', 4) - 'tubnhirfecooqkwx' - >>> scytale_encipher('thequickbrownfox', 5) - 'tubn hirf ecoo qkwx ' - >>> scytale_encipher('thequickbrownfox', 6) - 'tqcrnxhukof eibwo ' - >>> scytale_encipher('thequickbrownfox', 7) - 'tqcrnx hukof eibwo ' - """ - # transpositions = [i for i in range(math.ceil(len(message) / rows))] - # return column_transposition_encipher(message, transpositions, - # fillvalue=fillvalue, fillcolumnwise=False, emptycolumnwise=True) - transpositions = [i for i in range(rows)] - return column_transposition_encipher(message, transpositions, - fillvalue=fillvalue, fillcolumnwise=True, emptycolumnwise=False) - -def scytale_decipher(message, rows): - """Deciphers using the scytale transposition cipher. - Assumes the message is padded so that all rows are the same length. - - >>> scytale_decipher('tcnhkfeboqrxuo iw ', 3) - 'thequickbrownfox ' - >>> scytale_decipher('tubnhirfecooqkwx', 4) - 'thequickbrownfox' - >>> scytale_decipher('tubn hirf ecoo qkwx ', 5) - 'thequickbrownfox ' - >>> scytale_decipher('tqcrnxhukof eibwo ', 6) - 'thequickbrownfox ' - >>> scytale_decipher('tqcrnx hukof eibwo ', 7) - 'thequickbrownfox ' - """ - # transpositions = [i for i in range(math.ceil(len(message) / rows))] - # return column_transposition_decipher(message, transpositions, - # fillcolumnwise=False, emptycolumnwise=True) - transpositions = [i for i in range(rows)] - return column_transposition_decipher(message, transpositions, - fillcolumnwise=True, emptycolumnwise=False) - - -def railfence_encipher(message, height, fillvalue=''): - """Railfence cipher. - Works by splitting the text into sections, then reading across them to - generate the rows in the cipher. The rows are then combined to form the - ciphertext. - - Example: the plaintext "hellotherefriends", with a height of four, written - out in the railfence as - h h i - etere* - lorfns - l e d - (with the * showing the one character to finish the last section). - Each 'section' is two columns, but unfolded. In the example, the first - section is 'hellot'. - - >>> railfence_encipher('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 2, fillvalue='!') - 'hlohraateerishsslnpeefetotsigaleccpeselteevsmhatetiiaogicotxfretnrifneihr!' - >>> railfence_encipher('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 3, fillvalue='!') - 'horaersslpeeosglcpselteevsmhatetiiaogicotxfretnrifneihr!!lhateihsnefttiaece!' - >>> railfence_encipher('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 5, fillvalue='!') - 'hresleogcseeemhetaocofrnrner!!lhateihsnefttiaece!!ltvsatiigitxetifih!!oarspeslp!' - >>> railfence_encipher('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 10, fillvalue='!') - 'hepisehagitnr!!lernesge!!lmtocerh!!otiletap!!tseaorii!!hassfolc!!evtitffe!!rahsetec!!eixn!' - >>> railfence_encipher('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 3) - 'horaersslpeeosglcpselteevsmhatetiiaogicotxfretnrifneihrlhateihsnefttiaece' - >>> railfence_encipher('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 5) - 'hresleogcseeemhetaocofrnrnerlhateihsnefttiaeceltvsatiigitxetifihoarspeslp' - >>> railfence_encipher('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 7) - 'haspolsevsetgifrifrlatihnettaeelemtiocxernhorersleesgcptehaiaottneihesfic' - """ - sections = chunks(message, (height - 1) * 2, fillvalue=fillvalue) - n_sections = len(sections) - # Add the top row - rows = [''.join([s[0] for s in sections])] - # process the middle rows of the grid - for r in range(1, height-1): - rows += [''.join([s[r:r+1] + s[height*2-r-2:height*2-r-1] for s in sections])] - # process the bottom row - rows += [''.join([s[height - 1:height] for s in sections])] - # rows += [' '.join([s[height - 1] for s in sections])] - return ''.join(rows) - -def railfence_decipher(message, height, fillvalue=''): - """Railfence decipher. - Works by reconstructing the grid used to generate the ciphertext, then - unfolding the sections so the text can be concatenated together. - - Example: given the ciphertext 'hhieterelorfnsled' and a height of 4, first - work out that the second row has a character missing, find the rows of the - grid, then split the section into its two columns. - - 'hhieterelorfnsled' is split into - h h i - etere - lorfns - l e d - (spaces added for clarity), which is stored in 'rows'. This is then split - into 'down_rows' and 'up_rows': - - down_rows: - hhi - eee - lrn - led - - up_rows: - tr - ofs - - These are then zipped together (after the up_rows are reversed) to recover - the plaintext. - - Most of the procedure is about finding the correct lengths for each row then - splitting the ciphertext into those rows. - - >>> railfence_decipher('hlohraateerishsslnpeefetotsigaleccpeselteevsmhatetiiaogicotxfretnrifneihr!', 2).strip('!') - 'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers' - >>> railfence_decipher('horaersslpeeosglcpselteevsmhatetiiaogicotxfretnrifneihr!!lhateihsnefttiaece!', 3).strip('!') - 'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers' - >>> railfence_decipher('hresleogcseeemhetaocofrnrner!!lhateihsnefttiaece!!ltvsatiigitxetifih!!oarspeslp!', 5).strip('!') - 'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers' - >>> railfence_decipher('hepisehagitnr!!lernesge!!lmtocerh!!otiletap!!tseaorii!!hassfolc!!evtitffe!!rahsetec!!eixn!', 10).strip('!') - 'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers' - >>> railfence_decipher('horaersslpeeosglcpselteevsmhatetiiaogicotxfretnrifneihrlhateihsnefttiaece', 3) - 'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers' - >>> railfence_decipher('hresleogcseeemhetaocofrnrnerlhateihsnefttiaeceltvsatiigitxetifihoarspeslp', 5) - 'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers' - >>> railfence_decipher('haspolsevsetgifrifrlatihnettaeelemtiocxernhorersleesgcptehaiaottneihesfic', 7) - 'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers' - """ - # find the number and size of the sections, including how many characters - # are missing for a full grid - n_sections = math.ceil(len(message) / ((height - 1) * 2)) - padding_to_add = n_sections * (height - 1) * 2 - len(message) - # row_lengths are for the both up rows and down rows - row_lengths = [n_sections] * (height - 1) * 2 - for i in range((height - 1) * 2 - 1, (height - 1) * 2 - (padding_to_add + 1), -1): - row_lengths[i] -= 1 - # folded_rows are the combined row lengths in the middle of the railfence - folded_row_lengths = [row_lengths[0]] - for i in range(1, height-1): - folded_row_lengths += [row_lengths[i] + row_lengths[-i]] - folded_row_lengths += [row_lengths[height - 1]] - # find the rows that form the railfence grid - rows = [] - row_start = 0 - for i in folded_row_lengths: - rows += [message[row_start:row_start + i]] - row_start += i - # split the rows into the 'down_rows' (those that form the first column of - # a section) and the 'up_rows' (those that ofrm the second column of a - # section). - down_rows = [rows[0]] - up_rows = [] - for i in range(1, height-1): - down_rows += [''.join([c for n, c in enumerate(rows[i]) if n % 2 == 0])] - up_rows += [''.join([c for n, c in enumerate(rows[i]) if n % 2 == 1])] - down_rows += [rows[-1]] - up_rows.reverse() - return ''.join(c for r in zip_longest(*(down_rows + up_rows), fillvalue='') for c in r) - -def make_cadenus_keycolumn(doubled_letters = 'vw', start='a', reverse=False): - """Makes the key column for a Cadenus cipher (the column down between the - rows of letters) - - >>> make_cadenus_keycolumn()['a'] - 0 - >>> make_cadenus_keycolumn()['b'] - 1 - >>> make_cadenus_keycolumn()['c'] - 2 - >>> make_cadenus_keycolumn()['v'] - 21 - >>> make_cadenus_keycolumn()['w'] - 21 - >>> make_cadenus_keycolumn()['z'] - 24 - >>> make_cadenus_keycolumn(doubled_letters='ij', start='b', reverse=True)['a'] - 1 - >>> make_cadenus_keycolumn(doubled_letters='ij', start='b', reverse=True)['b'] - 0 - >>> make_cadenus_keycolumn(doubled_letters='ij', start='b', reverse=True)['c'] - 24 - >>> make_cadenus_keycolumn(doubled_letters='ij', start='b', reverse=True)['i'] - 18 - >>> make_cadenus_keycolumn(doubled_letters='ij', start='b', reverse=True)['j'] - 18 - >>> make_cadenus_keycolumn(doubled_letters='ij', start='b', reverse=True)['v'] - 6 - >>> make_cadenus_keycolumn(doubled_letters='ij', start='b', reverse=True)['z'] - 2 - """ - index_to_remove = string.ascii_lowercase.find(doubled_letters[0]) - short_alphabet = string.ascii_lowercase[:index_to_remove] + string.ascii_lowercase[index_to_remove+1:] - if reverse: - short_alphabet = ''.join(reversed(short_alphabet)) - start_pos = short_alphabet.find(start) - rotated_alphabet = short_alphabet[start_pos:] + short_alphabet[:start_pos] - keycolumn = {l: i for i, l in enumerate(rotated_alphabet)} - keycolumn[doubled_letters[0]] = keycolumn[doubled_letters[1]] - return keycolumn - -def cadenus_encipher(message, keyword, keycolumn, fillvalue='a'): - """Encipher with the Cadenus cipher - - >>> cadenus_encipher(sanitise('Whoever has made a voyage up the Hudson ' \ - 'must remember the Kaatskill mountains. ' \ - 'They are a dismembered branch of the great'), \ - 'wink', \ - make_cadenus_keycolumn(doubled_letters='vw', start='a', reverse=True)) - 'antodeleeeuhrsidrbhmhdrrhnimefmthgeaetakseomehetyaasuvoyegrastmmuuaeenabbtpchehtarorikswosmvaleatned' - >>> cadenus_encipher(sanitise('a severe limitation on the usefulness of ' \ - 'the cadenus is that every message must be ' \ - 'a multiple of twenty-five letters long'), \ - 'easy', \ - make_cadenus_keycolumn(doubled_letters='vw', start='a', reverse=True)) - 'systretomtattlusoatleeesfiyheasdfnmschbhneuvsnpmtofarenuseieeieltarlmentieetogevesitfaisltngeeuvowul' - """ - rows = chunks(message, len(message) // 25, fillvalue=fillvalue) - columns = zip(*rows) - rotated_columns = [col[start:] + col[:start] for start, col in zip([keycolumn[l] for l in keyword], columns)] - rotated_rows = zip(*rotated_columns) - transpositions = transpositions_of(keyword) - transposed = [transpose(r, transpositions) for r in rotated_rows] - return ''.join(chain(*transposed)) - -def cadenus_decipher(message, keyword, keycolumn, fillvalue='a'): - """ - >>> cadenus_decipher('antodeleeeuhrsidrbhmhdrrhnimefmthgeaetakseomehetyaa' \ - 'suvoyegrastmmuuaeenabbtpchehtarorikswosmvaleatned', \ - 'wink', \ - make_cadenus_keycolumn(reverse=True)) - 'whoeverhasmadeavoyageupthehudsonmustrememberthekaatskillmountainstheyareadismemberedbranchofthegreat' - >>> cadenus_decipher('systretomtattlusoatleeesfiyheasdfnmschbhneuvsnpmtof' \ - 'arenuseieeieltarlmentieetogevesitfaisltngeeuvowul', \ - 'easy', \ - make_cadenus_keycolumn(reverse=True)) - 'aseverelimitationontheusefulnessofthecadenusisthateverymessagemustbeamultipleoftwentyfiveletterslong' - """ - rows = chunks(message, len(message) // 25, fillvalue=fillvalue) - transpositions = transpositions_of(keyword) - untransposed_rows = [untranspose(r, transpositions) for r in rows] - columns = zip(*untransposed_rows) - rotated_columns = [col[-start:] + col[:-start] for start, col in zip([keycolumn[l] for l in keyword], columns)] - rotated_rows = zip(*rotated_columns) - # return rotated_columns - return ''.join(chain(*rotated_rows)) - - -def hill_encipher(matrix, message_letters, fillvalue='a'): - """Hill cipher - - >>> hill_encipher(np.matrix([[7,8], [11,11]]), 'hellothere') - 'drjiqzdrvx' - >>> hill_encipher(np.matrix([[6, 24, 1], [13, 16, 10], [20, 17, 15]]), \ - 'hello there') - 'tfjflpznvyac' - """ - n = len(matrix) - sanitised_message = sanitise(message_letters) - if len(sanitised_message) % n != 0: - padding = fillvalue[0] * (n - len(sanitised_message) % n) - else: - padding = '' - message = [ord(c) - ord('a') for c in sanitised_message + padding] - message_chunks = [message[i:i+n] for i in range(0, len(message), n)] - # message_chunks = chunks(message, len(matrix), fillvalue=None) - enciphered_chunks = [((matrix * np.matrix(c).T).T).tolist()[0] - for c in message_chunks] - return ''.join([chr(int(round(l)) % 26 + ord('a')) - for l in sum(enciphered_chunks, [])]) - -def hill_decipher(matrix, message, fillvalue='a'): - """Hill cipher - - >>> hill_decipher(np.matrix([[7,8], [11,11]]), 'drjiqzdrvx') - 'hellothere' - >>> hill_decipher(np.matrix([[6, 24, 1], [13, 16, 10], [20, 17, 15]]), \ - 'tfjflpznvyac') - 'hellothereaa' - """ - adjoint = linalg.det(matrix)*linalg.inv(matrix) - inverse_determinant = modular_division_table[int(round(linalg.det(matrix))) % 26][1] - inverse_matrix = (inverse_determinant * adjoint) % 26 - return hill_encipher(inverse_matrix, message, fillvalue) - - -# Where each piece of text ends up in the AMSCO transpositon cipher. -# 'index' shows where the slice appears in the plaintext, with the slice -# from 'start' to 'end' -AmscoSlice = collections.namedtuple('AmscoSlice', ['index', 'start', 'end']) - -class AmscoFillStyle(Enum): - continuous = 1 - same_each_row = 2 - reverse_each_row = 3 - -def amsco_transposition_positions(message, keyword, - fillpattern=(1, 2), - fillstyle=AmscoFillStyle.continuous, - fillcolumnwise=False, - emptycolumnwise=True): - """Creates the grid for the AMSCO transposition cipher. Each element in the - grid shows the index of that slice and the start and end positions of the - plaintext that go to make it up. - - >>> amsco_transposition_positions(string.ascii_lowercase, 'freddy', \ - fillpattern=(1, 2)) # doctest: +NORMALIZE_WHITESPACE - [[AmscoSlice(index=3, start=4, end=6), - AmscoSlice(index=2, start=3, end=4), - AmscoSlice(index=0, start=0, end=1), - AmscoSlice(index=1, start=1, end=3), - AmscoSlice(index=4, start=6, end=7)], - [AmscoSlice(index=8, start=12, end=13), - AmscoSlice(index=7, start=10, end=12), - AmscoSlice(index=5, start=7, end=9), - AmscoSlice(index=6, start=9, end=10), - AmscoSlice(index=9, start=13, end=15)], - [AmscoSlice(index=13, start=19, end=21), - AmscoSlice(index=12, start=18, end=19), - AmscoSlice(index=10, start=15, end=16), - AmscoSlice(index=11, start=16, end=18), - AmscoSlice(index=14, start=21, end=22)], - [AmscoSlice(index=18, start=27, end=28), - AmscoSlice(index=17, start=25, end=27), - AmscoSlice(index=15, start=22, end=24), - AmscoSlice(index=16, start=24, end=25), - AmscoSlice(index=19, start=28, end=30)]] - """ - transpositions = transpositions_of(keyword) - fill_iterator = cycle(fillpattern) - indices = count() - message_length = len(message) - - current_position = 0 - grid = [] - current_fillpattern = fillpattern - while current_position < message_length: - row = [] - if fillstyle == AmscoFillStyle.same_each_row: - fill_iterator = cycle(fillpattern) - if fillstyle == AmscoFillStyle.reverse_each_row: - fill_iterator = cycle(current_fillpattern) - for _ in range(len(transpositions)): - index = next(indices) - gap = next(fill_iterator) - row += [AmscoSlice(index, current_position, current_position + gap)] - current_position += gap - grid += [row] - if fillstyle == AmscoFillStyle.reverse_each_row: - current_fillpattern = list(reversed(current_fillpattern)) - return [transpose(r, transpositions) for r in grid] - -def amsco_transposition_encipher(message, keyword, - fillpattern=(1,2), fillstyle=AmscoFillStyle.reverse_each_row): - """AMSCO transposition encipher. - - >>> amsco_transposition_encipher('hellothere', 'abc', fillpattern=(1, 2)) - 'hoteelhler' - >>> amsco_transposition_encipher('hellothere', 'abc', fillpattern=(2, 1)) - 'hetelhelor' - >>> amsco_transposition_encipher('hellothere', 'acb', fillpattern=(1, 2)) - 'hotelerelh' - >>> amsco_transposition_encipher('hellothere', 'acb', fillpattern=(2, 1)) - 'hetelorlhe' - >>> amsco_transposition_encipher('hereissometexttoencipher', 'encode') - 'etecstthhomoerereenisxip' - >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(1, 2)) - 'hetcsoeisterereipexthomn' - >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(1, 2), fillstyle=AmscoFillStyle.continuous) - 'hecsoisttererteipexhomen' - >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(2, 1)) - 'heecisoosttrrtepeixhemen' - >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(1, 3, 2)) - 'hxtomephescieretoeisnter' - >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(1, 3, 2), fillstyle=AmscoFillStyle.continuous) - 'hxomeiphscerettoisenteer' - """ - grid = amsco_transposition_positions(message, keyword, - fillpattern=fillpattern, fillstyle=fillstyle) - ct_as_grid = [[message[s.start:s.end] for s in r] for r in grid] - return combine_every_nth(ct_as_grid) - - -def amsco_transposition_decipher(message, keyword, - fillpattern=(1,2), fillstyle=AmscoFillStyle.reverse_each_row): - """AMSCO transposition decipher - - >>> amsco_transposition_decipher('hoteelhler', 'abc', fillpattern=(1, 2)) - 'hellothere' - >>> amsco_transposition_decipher('hetelhelor', 'abc', fillpattern=(2, 1)) - 'hellothere' - >>> amsco_transposition_decipher('hotelerelh', 'acb', fillpattern=(1, 2)) - 'hellothere' - >>> amsco_transposition_decipher('hetelorlhe', 'acb', fillpattern=(2, 1)) - 'hellothere' - >>> amsco_transposition_decipher('etecstthhomoerereenisxip', 'encode') - 'hereissometexttoencipher' - >>> amsco_transposition_decipher('hetcsoeisterereipexthomn', 'cipher', fillpattern=(1, 2)) - 'hereissometexttoencipher' - >>> amsco_transposition_decipher('hecsoisttererteipexhomen', 'cipher', fillpattern=(1, 2), fillstyle=AmscoFillStyle.continuous) - 'hereissometexttoencipher' - >>> amsco_transposition_decipher('heecisoosttrrtepeixhemen', 'cipher', fillpattern=(2, 1)) - 'hereissometexttoencipher' - >>> amsco_transposition_decipher('hxtomephescieretoeisnter', 'cipher', fillpattern=(1, 3, 2)) - 'hereissometexttoencipher' - >>> amsco_transposition_decipher('hxomeiphscerettoisenteer', 'cipher', fillpattern=(1, 3, 2), fillstyle=AmscoFillStyle.continuous) - 'hereissometexttoencipher' - """ - - grid = amsco_transposition_positions(message, keyword, - fillpattern=fillpattern, fillstyle=fillstyle) - transposed_sections = [s for c in [l for l in zip(*grid)] for s in c] - plaintext_list = [''] * len(transposed_sections) - current_pos = 0 - for slice in transposed_sections: - plaintext_list[slice.index] = message[current_pos:current_pos-slice.start+slice.end][:len(message[slice.start:slice.end])] - current_pos += len(message[slice.start:slice.end]) - return ''.join(plaintext_list) - - -class PocketEnigma(object): - """A pocket enigma machine - The wheel is internally represented as a 26-element list self.wheel_map, - where wheel_map[i] == j shows that the position i places on from the arrow - maps to the position j places on. - """ - def __init__(self, wheel=1, position='a'): - """initialise the pocket enigma, including which wheel to use and the - starting position of the wheel. - - The wheel is either 1 or 2 (the predefined wheels) or a list of letter - pairs. - - The position is the letter pointed to by the arrow on the wheel. - - >>> pe.wheel_map - [25, 4, 23, 10, 1, 7, 9, 5, 12, 6, 3, 17, 8, 14, 13, 21, 19, 11, 20, 16, 18, 15, 24, 2, 22, 0] - >>> pe.position - 0 - """ - self.wheel1 = [('a', 'z'), ('b', 'e'), ('c', 'x'), ('d', 'k'), - ('f', 'h'), ('g', 'j'), ('i', 'm'), ('l', 'r'), ('n', 'o'), - ('p', 'v'), ('q', 't'), ('s', 'u'), ('w', 'y')] - self.wheel2 = [('a', 'c'), ('b', 'd'), ('e', 'w'), ('f', 'i'), - ('g', 'p'), ('h', 'm'), ('j', 'k'), ('l', 'n'), ('o', 'q'), - ('r', 'z'), ('s', 'u'), ('t', 'v'), ('x', 'y')] - if wheel == 1: - self.make_wheel_map(self.wheel1) - elif wheel == 2: - self.make_wheel_map(self.wheel2) - else: - self.validate_wheel_spec(wheel) - self.make_wheel_map(wheel) - if position in string.ascii_lowercase: - self.position = ord(position) - ord('a') - else: - self.position = position - - def make_wheel_map(self, wheel_spec): - """Expands a wheel specification from a list of letter-letter pairs - into a full wheel_map. - - >>> pe.make_wheel_map(pe.wheel2) - [2, 3, 0, 1, 22, 8, 15, 12, 5, 10, 9, 13, 7, 11, 16, 6, 14, 25, 20, 21, 18, 19, 4, 24, 23, 17] - """ - self.validate_wheel_spec(wheel_spec) - self.wheel_map = [0] * 26 - for p in wheel_spec: - self.wheel_map[ord(p[0]) - ord('a')] = ord(p[1]) - ord('a') - self.wheel_map[ord(p[1]) - ord('a')] = ord(p[0]) - ord('a') - return self.wheel_map - - def validate_wheel_spec(self, wheel_spec): - """Validates that a wheel specificaiton will turn into a valid wheel - map. - - >>> pe.validate_wheel_spec([]) - Traceback (most recent call last): - ... - ValueError: Wheel specification has 0 pairs, requires 13 - >>> pe.validate_wheel_spec([('a', 'b', 'c')]*13) - Traceback (most recent call last): - ... - ValueError: Not all mappings in wheel specificationhave two elements - >>> pe.validate_wheel_spec([('a', 'b')]*13) - Traceback (most recent call last): - ... - ValueError: Wheel specification does not contain 26 letters - """ - if len(wheel_spec) != 13: - raise ValueError("Wheel specification has {} pairs, requires 13". - format(len(wheel_spec))) - for p in wheel_spec: - if len(p) != 2: - raise ValueError("Not all mappings in wheel specification" - "have two elements") - if len(set([p[0] for p in wheel_spec] + - [p[1] for p in wheel_spec])) != 26: - raise ValueError("Wheel specification does not contain 26 letters") - - def encipher_letter(self, letter): - """Enciphers a single letter, by advancing the wheel before looking up - the letter on the wheel. - - >>> pe.set_position('f') - 5 - >>> pe.encipher_letter('k') - 'h' - """ - self.advance() - return self.lookup(letter) - decipher_letter = encipher_letter - - def lookup(self, letter): - """Look up what a letter enciphers to, without turning the wheel. - - >>> pe.set_position('f') - 5 - >>> ''.join([pe.lookup(l) for l in string.ascii_lowercase]) - 'udhbfejcpgmokrliwntsayqzvx' - >>> pe.lookup('A') - '' - """ - if letter in string.ascii_lowercase: - return chr( - (self.wheel_map[(ord(letter) - ord('a') - self.position) % 26] + - self.position) % 26 + - ord('a')) - else: - return '' - - def advance(self): - """Advances the wheel one position. - - >>> pe.set_position('f') - 5 - >>> pe.advance() - 6 - """ - self.position = (self.position + 1) % 26 - return self.position - - def encipher(self, message, starting_position=None): - """Enciphers a whole message. - - >>> pe.set_position('f') - 5 - >>> pe.encipher('helloworld') - 'kjsglcjoqc' - >>> pe.set_position('f') - 5 - >>> pe.encipher('kjsglcjoqc') - 'helloworld' - >>> pe.encipher('helloworld', starting_position = 'x') - 'egrekthnnf' - """ - if starting_position: - self.set_position(starting_position) - transformed = '' - for l in message: - transformed += self.encipher_letter(l) - return transformed - decipher = encipher - - def set_position(self, position): - """Sets the position of the wheel, by specifying the letter the arrow - points to. - - >>> pe.set_position('a') - 0 - >>> pe.set_position('m') - 12 - >>> pe.set_position('z') - 25 - """ - self.position = ord(position) - ord('a') - return self.position - - -if __name__ == "__main__": - import doctest - doctest.testmod(extraglobs={'pe': PocketEnigma(1, 'a')}) diff --git a/cipherbreak.py b/cipherbreak.py deleted file mode 100644 index 0ac8ae5..0000000 --- a/cipherbreak.py +++ /dev/null @@ -1,603 +0,0 @@ -"""A set of functions to break the ciphers give in ciphers.py. -""" - -import string -import collections -import norms -import logging -import random -import math -from itertools import starmap -from segment import segment -from multiprocessing import Pool - -import matplotlib.pyplot as plt - -logger = logging.getLogger(__name__) -logger.addHandler(logging.FileHandler('cipher.log')) -logger.setLevel(logging.WARNING) -#logger.setLevel(logging.INFO) -#logger.setLevel(logging.DEBUG) - -from cipher import * -from language_models import * - -# To time a run: -# -# import timeit -# c5a = open('2012/5a.ciphertext', 'r').read() -# timeit.timeit('keyword_break(c5a)', setup='gc.enable() ; from __main__ import c5a ; from cipher import keyword_break', number=1) -# timeit.repeat('keyword_break_mp(c5a, chunksize=500)', setup='gc.enable() ; from __main__ import c5a ; from cipher import keyword_break_mp', repeat=5, number=1) - -transpositions = collections.defaultdict(list) -for word in keywords: - transpositions[transpositions_of(word)] += [word] - -def frequencies(text): - """Count the number of occurrences of each character in text - - >>> sorted(frequencies('abcdefabc').items()) - [('a', 2), ('b', 2), ('c', 2), ('d', 1), ('e', 1), ('f', 1)] - >>> sorted(frequencies('the quick brown fox jumped over the lazy ' \ - 'dog').items()) # doctest: +NORMALIZE_WHITESPACE - [(' ', 8), ('a', 1), ('b', 1), ('c', 1), ('d', 2), ('e', 4), ('f', 1), - ('g', 1), ('h', 2), ('i', 1), ('j', 1), ('k', 1), ('l', 1), ('m', 1), - ('n', 1), ('o', 4), ('p', 1), ('q', 1), ('r', 2), ('t', 2), ('u', 2), - ('v', 1), ('w', 1), ('x', 1), ('y', 1), ('z', 1)] - >>> sorted(frequencies('The Quick BROWN fox jumped! over... the ' \ - '(9lazy) DOG').items()) # doctest: +NORMALIZE_WHITESPACE - [(' ', 8), ('!', 1), ('(', 1), (')', 1), ('.', 3), ('9', 1), ('B', 1), - ('D', 1), ('G', 1), ('N', 1), ('O', 2), ('Q', 1), ('R', 1), ('T', 1), - ('W', 1), ('a', 1), ('c', 1), ('d', 1), ('e', 4), ('f', 1), ('h', 2), - ('i', 1), ('j', 1), ('k', 1), ('l', 1), ('m', 1), ('o', 2), ('p', 1), - ('r', 1), ('t', 1), ('u', 2), ('v', 1), ('x', 1), ('y', 1), ('z', 1)] - >>> sorted(frequencies(sanitise('The Quick BROWN fox jumped! over... '\ - 'the (9lazy) DOG')).items()) # doctest: +NORMALIZE_WHITESPACE - [('a', 1), ('b', 1), ('c', 1), ('d', 2), ('e', 4), ('f', 1), ('g', 1), - ('h', 2), ('i', 1), ('j', 1), ('k', 1), ('l', 1), ('m', 1), ('n', 1), - ('o', 4), ('p', 1), ('q', 1), ('r', 2), ('t', 2), ('u', 2), ('v', 1), - ('w', 1), ('x', 1), ('y', 1), ('z', 1)] - >>> frequencies('abcdefabcdef')['x'] - 0 - """ - return collections.Counter(c for c in text) - - -def caesar_break(message, fitness=Pletters): - """Breaks a Caesar cipher using frequency analysis - - >>> caesar_break('ibxcsyorsaqcheyklxivoexlevmrimwxsfiqevvmihrsasrxliwyrh' \ - 'ecjsppsamrkwleppfmergefifvmhixscsymjcsyqeoixlm') # doctest: +ELLIPSIS - (4, -130.849989015...) - >>> caesar_break('wxwmaxdgheetgwuxztgptedbgznitgwwhpguxyhkxbmhvvtlbhgtee' \ - 'raxlmhiixweblmxgxwmhmaxybkbgztgwztsxwbgmxgmert') # doctest: +ELLIPSIS - (19, -128.82410410...) - >>> caesar_break('yltbbqnqnzvguvaxurorgenafsbezqvagbnornfgsbevpnaabjurer' \ - 'svaquvzyvxrnznazlybequrvfohgriraabjtbaruraprur') # doctest: +ELLIPSIS - (13, -126.25403935...) - """ - sanitised_message = sanitise(message) - best_shift = 0 - best_fit = float('-inf') - for shift in range(26): - plaintext = caesar_decipher(sanitised_message, shift) - fit = fitness(plaintext) - logger.debug('Caesar break attempt using key {0} gives fit of {1} ' - 'and decrypt starting: {2}'.format(shift, fit, - plaintext[:50])) - if fit > best_fit: - best_fit = fit - best_shift = shift - logger.info('Caesar break best fit: key {0} gives fit of {1} and ' - 'decrypt starting: {2}'.format(best_shift, best_fit, - caesar_decipher(sanitised_message, best_shift)[:50])) - return best_shift, best_fit - -def affine_break(message, fitness=Pletters): - """Breaks an affine cipher using frequency analysis - - >>> affine_break('lmyfu bkuusd dyfaxw claol psfaom jfasd snsfg jfaoe ls ' \ - 'omytd jlaxe mh jm bfmibj umis hfsul axubafkjamx. ls kffkxwsd jls ' \ - 'ofgbjmwfkiu olfmxmtmwaokttg jlsx ls kffkxwsd jlsi zg tsxwjl. jlsx ' \ - 'ls umfjsd jlsi zg hfsqysxog. ls dmmdtsd mx jls bats mh bkbsf. ls ' \ - 'bfmctsd kfmyxd jls lyj, mztanamyu xmc jm clm cku tmmeaxw kj lai ' \ - 'kxd clm ckuxj.') # doctest: +ELLIPSIS - ((15, 22, True), -340.601181913...) - """ - sanitised_message = sanitise(message) - best_multiplier = 0 - best_adder = 0 - best_one_based = True - best_fit = float("-inf") - for one_based in [True, False]: - for multiplier in [x for x in range(1, 26, 2) if x != 13]: - for adder in range(26): - plaintext = affine_decipher(sanitised_message, - multiplier, adder, one_based) - fit = fitness(plaintext) - logger.debug('Affine break attempt using key {0}x+{1} ({2}) ' - 'gives fit of {3} and decrypt starting: {4}'. - format(multiplier, adder, one_based, fit, - plaintext[:50])) - if fit > best_fit: - best_fit = fit - best_multiplier = multiplier - best_adder = adder - best_one_based = one_based - logger.info('Affine break best fit with key {0}x+{1} ({2}) gives fit of ' - '{3} and decrypt starting: {4}'.format( - best_multiplier, best_adder, best_one_based, best_fit, - affine_decipher(sanitised_message, best_multiplier, - best_adder, best_one_based)[:50])) - return (best_multiplier, best_adder, best_one_based), best_fit - -def keyword_break(message, wordlist=keywords, fitness=Pletters): - """Breaks a keyword substitution cipher using a dictionary and - frequency analysis. - - >>> keyword_break(keyword_encipher('this is a test message for the ' \ - 'keyword decipherment', 'elephant', KeywordWrapAlphabet.from_last), \ - wordlist=['cat', 'elephant', 'kangaroo']) # doctest: +ELLIPSIS - (('elephant', ), -52.834575011...) - """ - best_keyword = '' - best_wrap_alphabet = True - best_fit = float("-inf") - for wrap_alphabet in KeywordWrapAlphabet: - for keyword in wordlist: - plaintext = keyword_decipher(message, keyword, wrap_alphabet) - fit = fitness(plaintext) - logger.debug('Keyword break attempt using key {0} (wrap={1}) ' - 'gives fit of {2} and decrypt starting: {3}'.format( - keyword, wrap_alphabet, fit, - sanitise(plaintext)[:50])) - if fit > best_fit: - best_fit = fit - best_keyword = keyword - best_wrap_alphabet = wrap_alphabet - logger.info('Keyword break best fit with key {0} (wrap={1}) gives fit of ' - '{2} and decrypt starting: {3}'.format(best_keyword, - best_wrap_alphabet, best_fit, sanitise( - keyword_decipher(message, best_keyword, - best_wrap_alphabet))[:50])) - return (best_keyword, best_wrap_alphabet), best_fit - -def keyword_break_mp(message, wordlist=keywords, fitness=Pletters, - number_of_solutions=1, chunksize=500): - """Breaks a keyword substitution cipher using a dictionary and - frequency analysis - - >>> keyword_break_mp(keyword_encipher('this is a test message for the ' \ - 'keyword decipherment', 'elephant', KeywordWrapAlphabet.from_last), \ - wordlist=['cat', 'elephant', 'kangaroo']) # doctest: +ELLIPSIS - (('elephant', ), -52.834575011...) - >>> keyword_break_mp(keyword_encipher('this is a test message for the ' \ - 'keyword decipherment', 'elephant', KeywordWrapAlphabet.from_last), \ - wordlist=['cat', 'elephant', 'kangaroo'], \ - number_of_solutions=2) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE - [(('elephant', ), -52.834575011...), - (('elephant', ), -52.834575011...)] - """ - with Pool() as pool: - helper_args = [(message, word, wrap, fitness) - for word in wordlist - for wrap in KeywordWrapAlphabet] - # Gotcha: the helper function here needs to be defined at the top level - # (limitation of Pool.starmap) - breaks = pool.starmap(keyword_break_worker, helper_args, chunksize) - if number_of_solutions == 1: - return max(breaks, key=lambda k: k[1]) - else: - return sorted(breaks, key=lambda k: k[1], reverse=True)[:number_of_solutions] - -def keyword_break_worker(message, keyword, wrap_alphabet, fitness): - plaintext = keyword_decipher(message, keyword, wrap_alphabet) - fit = fitness(plaintext) - logger.debug('Keyword break attempt using key {0} (wrap={1}) gives fit of ' - '{2} and decrypt starting: {3}'.format(keyword, - wrap_alphabet, fit, sanitise(plaintext)[:50])) - return (keyword, wrap_alphabet), fit - -def monoalphabetic_break_hillclimbing(message, max_iterations=10000000, - alphabet=None, fitness=Pletters): - ciphertext = unaccent(message).lower() - if not alphabet: - alphabet = list(string.ascii_lowercase) - random.shuffle(alphabet) - alphabet = ''.join(alphabet) - return monoalphabetic_break_hillclimbing_worker(ciphertext, alphabet, - max_iterations, fitness) - -def monoalphabetic_break_hillclimbing_mp(message, workers=10, - max_iterations = 10000000, alphabet=None, fitness=Pletters, chunksize=1): - worker_args = [] - ciphertext = unaccent(message).lower() - for i in range(workers): - if alphabet: - this_alphabet = alphabet - else: - this_alphabet = list(string.ascii_lowercase) - random.shuffle(this_alphabet) - this_alphabet = ''.join(this_alphabet) - worker_args.append((ciphertext, this_alphabet, max_iterations, fitness)) - with Pool() as pool: - breaks = pool.starmap(monoalphabetic_break_hillclimbing_worker, - worker_args, chunksize) - return max(breaks, key=lambda k: k[1]) - -def monoalphabetic_break_hillclimbing_worker(message, alphabet, - max_iterations, fitness): - def swap(letters, i, j): - if i > j: - i, j = j, i - if i == j: - return letters - else: - return (letters[:i] + letters[j] + letters[i+1:j] + letters[i] + - letters[j+1:]) - best_alphabet = alphabet - best_fitness = float('-inf') - for i in range(max_iterations): - alphabet = swap(alphabet, random.randrange(26), random.randrange(26)) - cipher_translation = ''.maketrans(string.ascii_lowercase, alphabet) - plaintext = message.translate(cipher_translation) - if fitness(plaintext) > best_fitness: - best_fitness = fitness(plaintext) - best_alphabet = alphabet - print(i, best_alphabet, best_fitness, plaintext) - return best_alphabet, best_fitness - - -def vigenere_keyword_break_mp(message, wordlist=keywords, fitness=Pletters, - chunksize=500): - """Breaks a vigenere cipher using a dictionary and frequency analysis. - - >>> vigenere_keyword_break_mp(vigenere_encipher(sanitise('this is a test ' \ - 'message for the vigenere decipherment'), 'cat'), \ - wordlist=['cat', 'elephant', 'kangaroo']) # doctest: +ELLIPSIS - ('cat', -52.947271216...) - """ - with Pool() as pool: - helper_args = [(message, word, fitness) - for word in wordlist] - # Gotcha: the helper function here needs to be defined at the top level - # (limitation of Pool.starmap) - breaks = pool.starmap(vigenere_keyword_break_worker, helper_args, - chunksize) - return max(breaks, key=lambda k: k[1]) -vigenere_keyword_break = vigenere_keyword_break_mp - -def vigenere_keyword_break_worker(message, keyword, fitness): - plaintext = vigenere_decipher(message, keyword) - fit = fitness(plaintext) - logger.debug('Vigenere keyword break attempt using key {0} gives fit of ' - '{1} and decrypt starting: {2}'.format(keyword, - fit, sanitise(plaintext)[:50])) - return keyword, fit - - -def vigenere_frequency_break(message, max_key_length=20, fitness=Pletters): - """Breaks a Vigenere cipher with frequency analysis - - >>> vigenere_frequency_break(vigenere_encipher(sanitise("It is time to " \ - "run. She is ready and so am I. I stole Daniel's pocketbook this " \ - "afternoon when he left his jacket hanging on the easel in the " \ - "attic. I jump every time I hear a footstep on the stairs, " \ - "certain that the theft has been discovered and that I will " \ - "be caught. The SS officer visits less often now that he is " \ - "sure"), 'florence')) # doctest: +ELLIPSIS - ('florence', -307.5473096791...) - """ - def worker(message, key_length, fitness): - splits = every_nth(sanitised_message, key_length) - key = ''.join([chr(caesar_break(s)[0] + ord('a')) for s in splits]) - plaintext = vigenere_decipher(message, key) - fit = fitness(plaintext) - return key, fit - sanitised_message = sanitise(message) - results = starmap(worker, [(sanitised_message, i, fitness) - for i in range(1, max_key_length+1)]) - return max(results, key=lambda k: k[1]) - - -def beaufort_frequency_break(message, max_key_length=20, fitness=Pletters): - """Breaks a Beaufort cipher with frequency analysis - - >>> beaufort_frequency_break(beaufort_encipher(sanitise("It is time to " \ - "run. She is ready and so am I. I stole Daniel's pocketbook this " \ - "afternoon when he left his jacket hanging on the easel in the " \ - "attic. I jump every time I hear a footstep on the stairs, " \ - "certain that the theft has been discovered and that I will " \ - "be caught. The SS officer visits less often now " \ - "that he is sure"), 'florence')) # doctest: +ELLIPSIS - ('florence', -307.5473096791...) - """ - def worker(message, key_length, fitness): - splits = every_nth(sanitised_message, key_length) - key = ''.join([chr(-caesar_break(s)[0] % 26 + ord('a')) - for s in splits]) - plaintext = beaufort_decipher(message, key) - fit = fitness(plaintext) - return key, fit - sanitised_message = sanitise(message) - results = starmap(worker, [(sanitised_message, i, fitness) - for i in range(1, max_key_length+1)]) - return max(results, key=lambda k: k[1]) - - -def column_transposition_break_mp(message, translist=transpositions, - fitness=Pbigrams, chunksize=500): - """Breaks a column transposition cipher using a dictionary and - n-gram frequency analysis - - >>> column_transposition_break_mp(column_transposition_encipher(sanitise( \ - "It is a truth universally acknowledged, that a single man in \ - possession of a good fortune, must be in want of a wife. However \ - little known the feelings or views of such a man may be on his \ - first entering a neighbourhood, this truth is so well fixed in \ - the minds of the surrounding families, that he is considered the \ - rightful property of some one or other of their daughters."), \ - 'encipher'), \ - translist={(2, 0, 5, 3, 1, 4, 6): ['encipher'], \ - (5, 0, 6, 1, 3, 4, 2): ['fourteen'], \ - (6, 1, 0, 4, 5, 3, 2): ['keyword']}) # doctest: +ELLIPSIS - (((2, 0, 5, 3, 1, 4, 6), False, False), -709.4646722...) - >>> column_transposition_break_mp(column_transposition_encipher(sanitise( \ - "It is a truth universally acknowledged, that a single man in \ - possession of a good fortune, must be in want of a wife. However \ - little known the feelings or views of such a man may be on his \ - first entering a neighbourhood, this truth is so well fixed in \ - the minds of the surrounding families, that he is considered the \ - rightful property of some one or other of their daughters."), \ - 'encipher'), \ - translist={(2, 0, 5, 3, 1, 4, 6): ['encipher'], \ - (5, 0, 6, 1, 3, 4, 2): ['fourteen'], \ - (6, 1, 0, 4, 5, 3, 2): ['keyword']}, \ - fitness=Ptrigrams) # doctest: +ELLIPSIS - (((2, 0, 5, 3, 1, 4, 6), False, False), -997.0129085...) - """ - with Pool() as pool: - helper_args = [(message, trans, fillcolumnwise, emptycolumnwise, - fitness) - for trans in translist.keys() - for fillcolumnwise in [True, False] - for emptycolumnwise in [True, False]] - # Gotcha: the helper function here needs to be defined at the top level - # (limitation of Pool.starmap) - breaks = pool.starmap(column_transposition_break_worker, - helper_args, chunksize) - return max(breaks, key=lambda k: k[1]) -column_transposition_break = column_transposition_break_mp - -def column_transposition_break_worker(message, transposition, - fillcolumnwise, emptycolumnwise, fitness): - plaintext = column_transposition_decipher(message, transposition, - fillcolumnwise=fillcolumnwise, emptycolumnwise=emptycolumnwise) - fit = fitness(sanitise(plaintext)) - logger.debug('Column transposition break attempt using key {0} ' - 'gives fit of {1} and decrypt starting: {2}'.format( - transposition, fit, - sanitise(plaintext)[:50])) - return (transposition, fillcolumnwise, emptycolumnwise), fit - - -def scytale_break_mp(message, max_key_length=20, - fitness=Pbigrams, chunksize=500): - """Breaks a scytale cipher using a range of lengths and - n-gram frequency analysis - - >>> scytale_break_mp(scytale_encipher(sanitise( \ - "It is a truth universally acknowledged, that a single man in \ - possession of a good fortune, must be in want of a wife. However \ - little known the feelings or views of such a man may be on his \ - first entering a neighbourhood, this truth is so well fixed in \ - the minds of the surrounding families, that he is considered the \ - rightful property of some one or other of their daughters."), \ - 5)) # doctest: +ELLIPSIS - (5, -709.4646722...) - >>> scytale_break_mp(scytale_encipher(sanitise( \ - "It is a truth universally acknowledged, that a single man in \ - possession of a good fortune, must be in want of a wife. However \ - little known the feelings or views of such a man may be on his \ - first entering a neighbourhood, this truth is so well fixed in \ - the minds of the surrounding families, that he is considered the \ - rightful property of some one or other of their daughters."), \ - 5), \ - fitness=Ptrigrams) # doctest: +ELLIPSIS - (5, -997.0129085...) - """ - with Pool() as pool: - helper_args = [(message, trans, False, True, fitness) - for trans in - [[col for col in range(math.ceil(len(message)/rows))] - for rows in range(1,max_key_length+1)]] - # Gotcha: the helper function here needs to be defined at the top level - # (limitation of Pool.starmap) - breaks = pool.starmap(column_transposition_break_worker, - helper_args, chunksize) - best = max(breaks, key=lambda k: k[1]) - return math.trunc(len(message) / len(best[0][0])), best[1] -scytale_break = scytale_break_mp - - -def railfence_break(message, max_key_length=20, - fitness=Pletters, chunksize=500): - """Breaks a hill cipher using a matrix of given rank and letter frequencies - - - """ - - sanitised_message = sanitise(message) - results = starmap(worker, [(sanitised_message, i, fitness) - for i in range(2, max_key_length+1)]) - return max(results, key=lambda k: k[1]) - - -def railfence_break(message, max_key_length=20, - fitness=Pbigrams, chunksize=500): - """Breaks a railfence cipher using a range of lengths and - n-gram frequency analysis - - >>> railfence_break(railfence_encipher(sanitise( \ - "It is a truth universally acknowledged, that a single man in \ - possession of a good fortune, must be in want of a wife. However \ - little known the feelings or views of such a man may be on his \ - first entering a neighbourhood, this truth is so well fixed in \ - the minds of the surrounding families, that he is considered the \ - rightful property of some one or other of their daughters."), \ - 7)) # doctest: +ELLIPSIS - (7, -709.46467226...) - >>> railfence_break(railfence_encipher(sanitise( \ - "It is a truth universally acknowledged, that a single man in \ - possession of a good fortune, must be in want of a wife. However \ - little known the feelings or views of such a man may be on his \ - first entering a neighbourhood, this truth is so well fixed in \ - the minds of the surrounding families, that he is considered the \ - rightful property of some one or other of their daughters."), \ - 7), \ - fitness=Ptrigrams) # doctest: +ELLIPSIS - (7, -997.0129085...) - """ - def worker(message, height, fitness): - plaintext = railfence_decipher(message, height) - fit = fitness(plaintext) - return height, fit - - sanitised_message = sanitise(message) - results = starmap(worker, [(sanitised_message, i, fitness) - for i in range(2, max_key_length+1)]) - return max(results, key=lambda k: k[1]) - -def amsco_break(message, translist=transpositions, patterns = [(1, 2), (2, 1)], - fillstyles = [AmscoFillStyle.continuous, - AmscoFillStyle.same_each_row, - AmscoFillStyle.reverse_each_row], - fitness=Pbigrams, - chunksize=500): - """Breaks an AMSCO transposition cipher using a dictionary and - n-gram frequency analysis - - >>> amsco_break(amsco_transposition_encipher(sanitise( \ - "It is a truth universally acknowledged, that a single man in \ - possession of a good fortune, must be in want of a wife. However \ - little known the feelings or views of such a man may be on his \ - first entering a neighbourhood, this truth is so well fixed in \ - the minds of the surrounding families, that he is considered the \ - rightful property of some one or other of their daughters."), \ - 'encipher'), \ - translist={(2, 0, 5, 3, 1, 4, 6): ['encipher'], \ - (5, 0, 6, 1, 3, 4, 2): ['fourteen'], \ - (6, 1, 0, 4, 5, 3, 2): ['keyword']}, \ - patterns=[(1, 2)]) # doctest: +ELLIPSIS - (((2, 0, 5, 3, 1, 4, 6), (1, 2)), -709.4646722...) - >>> amsco_break(amsco_transposition_encipher(sanitise( \ - "It is a truth universally acknowledged, that a single man in \ - possession of a good fortune, must be in want of a wife. However \ - little known the feelings or views of such a man may be on his \ - first entering a neighbourhood, this truth is so well fixed in \ - the minds of the surrounding families, that he is considered the \ - rightful property of some one or other of their daughters."), \ - 'encipher', fillpattern=(2, 1)), \ - translist={(2, 0, 5, 3, 1, 4, 6): ['encipher'], \ - (5, 0, 6, 1, 3, 4, 2): ['fourteen'], \ - (6, 1, 0, 4, 5, 3, 2): ['keyword']}, \ - patterns=[(1, 2), (2, 1)], fitness=Ptrigrams) # doctest: +ELLIPSIS - (((2, 0, 5, 3, 1, 4, 6), (2, 1)), -997.0129085...) - """ - with Pool() as pool: - helper_args = [(message, trans, pattern, fillstyle, fitness) - for trans in translist.keys() - for pattern in patterns - for fillstyle in fillstyles] - # Gotcha: the helper function here needs to be defined at the top level - # (limitation of Pool.starmap) - breaks = pool.starmap(amsco_break_worker, helper_args, chunksize) - return max(breaks, key=lambda k: k[1]) - -def amsco_break_worker(message, transposition, - pattern, fillstyle, fitness): - plaintext = amsco_transposition_decipher(message, transposition, - fillpattern=pattern, fillstyle=fillstyle) - fit = fitness(sanitise(plaintext)) - logger.debug('AMSCO transposition break attempt using key {0} and pattern' - '{1} ({2}) gives fit of {3} and decrypt starting: ' - '{4}'.format( - transposition, pattern, fillstyle, fit, - sanitise(plaintext)[:50])) - return (transposition, pattern, fillstyle), fit - - -def hill_break(message, matrix_size=2, fitness=Pletters, - number_of_solutions=1, chunksize=500): - - all_matrices = [np.matrix(list(m)) - for m in itertools.product([list(r) - for r in itertools.product(range(26), repeat=matrix_size)], - repeat=matrix_size)] - valid_matrices = [m for m, d in - zip(all_matrices, (int(round(linalg.det(m))) for m in all_matrices)) - if d != 0 - if d % 2 != 0 - if d % 13 != 0 ] - with Pool() as pool: - helper_args = [(message, matrix, fitness) - for matrix in valid_matrices] - # Gotcha: the helper function here needs to be defined at the top level - # (limitation of Pool.starmap) - breaks = pool.starmap(hill_break_worker, helper_args, chunksize) - if number_of_solutions == 1: - return max(breaks, key=lambda k: k[1]) - else: - return sorted(breaks, key=lambda k: k[1], reverse=True)[:number_of_solutions] - -def hill_break_worker(message, matrix, fitness): - plaintext = hill_decipher(matrix, message) - fit = fitness(plaintext) - logger.debug('Hill cipher break attempt using key {0} gives fit of ' - '{1} and decrypt starting: {2}'.format(matrix, - fit, sanitise(plaintext)[:50])) - return matrix, fit - - -def pocket_enigma_break_by_crib(message, wheel_spec, crib, crib_position): - """Break a pocket enigma using a crib (some plaintext that's expected to - be in a certain position). Returns a list of possible starting wheel - positions that could produce the crib. - - >>> pocket_enigma_break_by_crib('kzpjlzmoga', 1, 'h', 0) - ['a', 'f', 'q'] - >>> pocket_enigma_break_by_crib('kzpjlzmoga', 1, 'he', 0) - ['a'] - >>> pocket_enigma_break_by_crib('kzpjlzmoga', 1, 'll', 2) - ['a'] - >>> pocket_enigma_break_by_crib('kzpjlzmoga', 1, 'l', 2) - ['a'] - >>> pocket_enigma_break_by_crib('kzpjlzmoga', 1, 'l', 3) - ['a', 'j', 'n'] - >>> pocket_enigma_break_by_crib('aaaaa', 1, 'l', 3) - [] - """ - pe = PocketEnigma(wheel=wheel_spec) - possible_positions = [] - for p in string.ascii_lowercase: - pe.set_position(p) - plaintext = pe.decipher(message) - if plaintext[crib_position:crib_position+len(crib)] == crib: - possible_positions += [p] - return possible_positions - - -def plot_frequency_histogram(freqs, sort_key=None): - x = range(len(freqs.keys())) - y = [freqs[l] for l in sorted(freqs.keys(), key=sort_key)] - f = plt.figure() - ax = f.add_axes([0.1, 0.1, 0.9, 0.9]) - ax.bar(x, y, align='center') - ax.set_xticks(x) - ax.set_xticklabels(sorted(freqs.keys(), key=sort_key)) - f.show() - - -if __name__ == "__main__": - import doctest - doctest.testmod() diff --git a/find_best_affine_break_parameters.py b/find_best_affine_break_parameters.py deleted file mode 100644 index e3d6bad..0000000 --- a/find_best_affine_break_parameters.py +++ /dev/null @@ -1,85 +0,0 @@ -import random -import collections -from cipher import * -from cipherbreak import * -import itertools -import csv - -corpus = sanitise(''.join([open('shakespeare.txt', 'r').read(), - open('sherlock-holmes.txt', 'r').read(), - open('war-and-peace.txt', 'r').read()])) -corpus_length = len(corpus) - -euclidean_scaled_english_counts = norms.euclidean_scale(english_counts) - -metrics = [{'func': norms.l1, 'invert': True, 'name': 'l1'}, - {'func': norms.l2, 'invert': True, 'name': 'l2'}, - {'func': norms.l3, 'invert': True, 'name': 'l3'}, - {'func': norms.cosine_similarity, 'invert': False, 'name': 'cosine_similarity'}] - # {'func': norms.harmonic_mean, 'invert': True, 'name': 'harmonic_mean'}, - # {'func': norms.geometric_mean, 'invert': True, 'name': 'geometric_mean'}] -scalings = [{'corpus_frequency': normalised_english_counts, - 'scaling': norms.normalise, - 'name': 'normalised'}, - {'corpus_frequency': euclidean_scaled_english_counts, - 'scaling': norms.euclidean_scale, - 'name': 'euclidean_scaled'}] -message_lengths = [2000, 1000, 500, 250, 100, 50, 20] - -trials = 5000 - -scores = {} - - -def make_frequency_compare_function(target_frequency, frequency_scaling, metric, invert): - def frequency_compare(text): - counts = frequency_scaling(frequencies(text)) - if invert: - score = -1 * metric(target_frequency, counts) - else: - score = metric(target_frequency, counts) - return score - return frequency_compare - -def scoring_functions(): - return [{'func': make_frequency_compare_function(s['corpus_frequency'], - s['scaling'], m['func'], m['invert']), - 'name': '{} + {}'.format(m['name'], s['name'])} - for m in metrics - for s in scalings] + [{'func': Pletters, 'name': 'Pletters'}] - -def eval_scores(): - [eval_one_score(f, l) - for f in scoring_functions() - for l in message_lengths] - -def eval_one_score(scoring_function, message_length): - print(scoring_function['name'], message_length, ': ', end='', flush=True) - if scoring_function['name'] not in scores: - scores[scoring_function['name']] = collections.defaultdict(int) - for _ in range(trials): - sample_start = random.randint(0, corpus_length - message_length) - sample = corpus[sample_start:(sample_start + message_length)] - multiplier = random.choice([x for x in range(1, 26, 2) if x != 13]) - adder = random.randint(0, 25) - one_based = random.choice([True, False]) - key = (multiplier, adder, one_based) - ciphertext = affine_encipher(sample, multiplier, adder, one_based) - found_key, _ = affine_break(ciphertext, scoring_function['func']) - if found_key == key: - scores[scoring_function['name']][message_length] += 1 - print(scores[scoring_function['name']][message_length], '/', trials) - return scores[scoring_function['name']][message_length] - -def show_results(): - with open('affine_break_parameter_trials.csv', 'w') as f: - writer = csv.DictWriter(f, ['name'] + message_lengths, - quoting=csv.QUOTE_NONNUMERIC) - writer.writeheader() - for scoring in sorted(scores.keys()): - scores[scoring]['name'] = scoring - writer.writerow(scores[scoring]) - -print('Starting...') -eval_scores() -show_results() diff --git a/find_best_caesar_break_parameters.py b/find_best_caesar_break_parameters.py deleted file mode 100644 index 7a550aa..0000000 --- a/find_best_caesar_break_parameters.py +++ /dev/null @@ -1,80 +0,0 @@ -import random -import collections -from cipher import * -from cipherbreak import * -import itertools -import csv - -corpus = sanitise(''.join([open('shakespeare.txt', 'r').read(), - open('sherlock-holmes.txt', 'r').read(), - open('war-and-peace.txt', 'r').read()])) -corpus_length = len(corpus) - -euclidean_scaled_english_counts = norms.euclidean_scale(english_counts) - -metrics = [{'func': norms.l1, 'invert': True, 'name': 'l1'}, - {'func': norms.l2, 'invert': True, 'name': 'l2'}, - {'func': norms.l3, 'invert': True, 'name': 'l3'}, - {'func': norms.cosine_similarity, 'invert': False, 'name': 'cosine_similarity'}] - # {'func': norms.harmonic_mean, 'invert': True, 'name': 'harmonic_mean'}, - # {'func': norms.geometric_mean, 'invert': True, 'name': 'geometric_mean'}] -scalings = [{'corpus_frequency': normalised_english_counts, - 'scaling': norms.normalise, - 'name': 'normalised'}, - {'corpus_frequency': euclidean_scaled_english_counts, - 'scaling': norms.euclidean_scale, - 'name': 'euclidean_scaled'}] -message_lengths = [100, 50, 30, 20, 10, 5] - -trials = 5000 - -scores = {} - - -def make_frequency_compare_function(target_frequency, frequency_scaling, metric, invert): - def frequency_compare(text): - counts = frequency_scaling(frequencies(text)) - if invert: - score = -1 * metric(target_frequency, counts) - else: - score = metric(target_frequency, counts) - return score - return frequency_compare - -def scoring_functions(): - return [{'func': make_frequency_compare_function(s['corpus_frequency'], - s['scaling'], m['func'], m['invert']), - 'name': '{} + {}'.format(m['name'], s['name'])} - for m in metrics - for s in scalings] + [{'func': Pletters, 'name': 'Pletters'}] - -def eval_scores(): - [eval_one_score(f, l) - for f in scoring_functions() - for l in message_lengths] - -def eval_one_score(scoring_function, message_length): - print(scoring_function['name'], message_length) - if scoring_function['name'] not in scores: - scores[scoring_function['name']] = collections.defaultdict(int) - for _ in range(trials): - sample_start = random.randint(0, corpus_length - message_length) - sample = corpus[sample_start:(sample_start + message_length)] - key = random.randint(1, 25) - ciphertext = caesar_encipher(sample, key) - found_key, _ = caesar_break(ciphertext, scoring_function['func']) - if found_key == key: - scores[scoring_function['name']][message_length] += 1 - return scores[scoring_function['name']][message_length] - -def show_results(): - with open('caesar_break_parameter_trials.csv', 'w') as f: - writer = csv.DictWriter(f, ['name'] + message_lengths, - quoting=csv.QUOTE_NONNUMERIC) - writer.writeheader() - for scoring in sorted(scores.keys()): - scores[scoring]['name'] = scoring - writer.writerow(scores[scoring]) - -eval_scores() -show_results() diff --git a/find_wikipedia_titles.py b/find_wikipedia_titles.py deleted file mode 100644 index 8d56124..0000000 --- a/find_wikipedia_titles.py +++ /dev/null @@ -1,35 +0,0 @@ -import urllib.request -import urllib.parse -import json -import time - -initial_request_url = "http://en.wikipedia.org/w/api.php?action=query&list=allpages&format=json&aplimit=10&apminsize=5000" -request_url = "http://en.wikipedia.org/w/api.php?action=query&list=allpages&format=json&aplimit=10&apminsize=5000&apcontinue={}" -titles_file = '/opt/sources/wp-titles.txt' - -def titles_of(result): - return [p['title'] for p in result['query']['allpages'] ] - -def next_title(result): - return result['query-continue']['allpages']['apcontinue'] - -def write_titles(titles): - with open(titles_file, 'a') as f: - print('\n'.join(titles), file=f) - -def request_again(start_title): - request = urllib.request.Request(request_url.format(urllib.parse.quote(start_title))) - request.add_header('User-Agent','neil.wpspider@njae.me.uk') - result = json.loads(urllib.request.urlopen(request).read().decode()) - return titles_of(result), next_title(result) - -f = open(titles_file, 'w') -f.close() - -result = json.loads(urllib.request.urlopen(initial_request_url).read().decode()) -n_title = next_title(result) -titles = titles_of(result) -while titles != []: - write_titles(titles) - time.sleep(0.5) - titles, n_title = request_again(n_title) diff --git a/language_models.py b/language_models.py deleted file mode 100644 index bf00875..0000000 --- a/language_models.py +++ /dev/null @@ -1,177 +0,0 @@ -"""Language-specific functions, including models of languages based on data of -its use. -""" - -import string -import random -import norms -import collections -import unicodedata -import itertools -from math import log10 -import os - -unaccent_specials = ''.maketrans({"’": "'"}) - -def letters(text): - """Remove all non-alphabetic characters from a text - >>> letters('The Quick') - 'TheQuick' - >>> letters('The Quick BROWN fox jumped! over... the (9lazy) DOG') - 'TheQuickBROWNfoxjumpedoverthelazyDOG' - """ - return ''.join([c for c in text if c in string.ascii_letters]) - -def unaccent(text): - """Remove all accents from letters. - It does this by converting the unicode string to decomposed compatability - form, dropping all the combining accents, then re-encoding the bytes. - - >>> unaccent('hello') - 'hello' - >>> unaccent('HELLO') - 'HELLO' - >>> unaccent('héllo') - 'hello' - >>> unaccent('héllö') - 'hello' - >>> unaccent('HÉLLÖ') - 'HELLO' - """ - translated_text = text.translate(unaccent_specials) - return unicodedata.normalize('NFKD', translated_text).\ - encode('ascii', 'ignore').\ - decode('utf-8') - -def sanitise(text): - """Remove all non-alphabetic characters and convert the text to lowercase - - >>> sanitise('The Quick') - 'thequick' - >>> sanitise('The Quick BROWN fox jumped! over... the (9lazy) DOG') - 'thequickbrownfoxjumpedoverthelazydog' - >>> sanitise('HÉLLÖ') - 'hello' - """ - # sanitised = [c.lower() for c in text if c in string.ascii_letters] - # return ''.join(sanitised) - return letters(unaccent(text)).lower() - - -def datafile(name, sep='\t'): - """Read key,value pairs from file. - """ - with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), name), 'r') as f: - for line in f: - splits = line.split(sep) - yield [splits[0], int(splits[1])] - -english_counts = collections.Counter(dict(datafile('count_1l.txt'))) -normalised_english_counts = norms.normalise(english_counts) - -english_bigram_counts = collections.Counter(dict(datafile('count_2l.txt'))) -normalised_english_bigram_counts = norms.normalise(english_bigram_counts) - -english_trigram_counts = collections.Counter(dict(datafile('count_3l.txt'))) -normalised_english_trigram_counts = norms.normalise(english_trigram_counts) - -with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'words.txt'), 'r') as f: - keywords = [line.rstrip() for line in f] - - -def weighted_choice(d): - """Generate random item from a dictionary of item counts - """ - target = random.uniform(0, sum(d.values())) - cuml = 0.0 - for (l, p) in d.items(): - cuml += p - if cuml > target: - return l - return None - -def random_english_letter(): - """Generate a random letter based on English letter counts - """ - return weighted_choice(normalised_english_counts) - - -def ngrams(text, n): - """Returns all n-grams of a text - - >>> ngrams(sanitise('the quick brown fox'), 2) # doctest: +NORMALIZE_WHITESPACE - ['th', 'he', 'eq', 'qu', 'ui', 'ic', 'ck', 'kb', 'br', 'ro', 'ow', 'wn', - 'nf', 'fo', 'ox'] - >>> ngrams(sanitise('the quick brown fox'), 4) # doctest: +NORMALIZE_WHITESPACE - ['theq', 'hequ', 'equi', 'quic', 'uick', 'ickb', 'ckbr', 'kbro', 'brow', - 'rown', 'ownf', 'wnfo', 'nfox'] - """ - return [text[i:i+n] for i in range(len(text)-n+1)] - - -class Pdist(dict): - """A probability distribution estimated from counts in datafile. - Values are stored and returned as log probabilities. - """ - def __init__(self, data=[], estimate_of_missing=None): - data1, data2 = itertools.tee(data) - self.total = sum([d[1] for d in data1]) - for key, count in data2: - self[key] = log10(count / self.total) - self.estimate_of_missing = estimate_of_missing or (lambda k, N: 1./N) - def __missing__(self, key): - return self.estimate_of_missing(key, self.total) - -def log_probability_of_unknown_word(key, N): - """Estimate the probability of an unknown word. - """ - return -log10(N * 10**((len(key) - 2) * 1.4)) - -Pw = Pdist(datafile('count_1w.txt'), log_probability_of_unknown_word) -Pw_wrong = Pdist(datafile('count_1w.txt'), lambda _k, N: log10(1/N)) -Pl = Pdist(datafile('count_1l.txt'), lambda _k, _N: 0) -P2l = Pdist(datafile('count_2l.txt'), lambda _k, _N: 0) -P3l = Pdist(datafile('count_3l.txt'), lambda _k, _N: 0) - -def Pwords(words): - """The Naive Bayes log probability of a sequence of words. - """ - return sum(Pw[w.lower()] for w in words) - -def Pwords_wrong(words): - """The Naive Bayes log probability of a sequence of words. - """ - return sum(Pw_wrong[w.lower()] for w in words) - -def Pletters(letters): - """The Naive Bayes log probability of a sequence of letters. - """ - return sum(Pl[l.lower()] for l in letters) - -def Pbigrams(letters): - """The Naive Bayes log probability of the bigrams formed from a sequence - of letters. - """ - return sum(P2l[p] for p in ngrams(letters, 2)) - -def Ptrigrams(letters): - """The Naive Bayes log probability of the trigrams formed from a sequence - of letters. - """ - return sum(P3l[p] for p in ngrams(letters, 3)) - - -def cosine_similarity_score(text): - """Finds the dissimilarity of a text to English, using the cosine distance - of the frequency distribution. - - >>> cosine_similarity_score('abcabc') # doctest: +ELLIPSIS - 0.26228882... - """ - return norms.cosine_similarity(english_counts, - collections.Counter(sanitise(text))) - - -if __name__ == "__main__": - import doctest - doctest.testmod() diff --git a/lettercount.py b/lettercount.py deleted file mode 100644 index 956eca1..0000000 --- a/lettercount.py +++ /dev/null @@ -1,13 +0,0 @@ -from language_models import sanitise -import collections - -corpora = ['shakespeare.txt', 'sherlock-holmes.txt', 'war-and-peace.txt'] -counts = collections.Counter() - -for corpus in corpora: - text = sanitise(open(corpus).read()) - counts.update(text) - -with open('count_1l.txt', 'w') as f: - for l, c in counts.most_common(): - f.write("{}\t{}\n".format(l, c)) diff --git a/make-cracking-dictionary.py b/make-cracking-dictionary.py deleted file mode 100644 index 37de917..0000000 --- a/make-cracking-dictionary.py +++ /dev/null @@ -1,19 +0,0 @@ -import language_models - -american = set(open('/usr/share/dict/american-english', 'r').readlines()) -british = set(open('/usr/share/dict/british-english', 'r').readlines()) -cracklib = set(open('/usr/share/dict/cracklib-small', 'r').readlines()) - -words = american | british | cracklib - -# sanitised_words = set() - -# for w in words: - # sanitised_words.add(language_models.sanitise(w)) - -sanitised_words = set(language_models.sanitise(w) for w in words) - -sanitised_words.discard('') - -with open('words.txt', 'w') as f: - f.write('\n'.join(sorted(sanitised_words, key=lambda w: (len(w), w)))) diff --git a/norms.py b/norms.py deleted file mode 100644 index 6645294..0000000 --- a/norms.py +++ /dev/null @@ -1,189 +0,0 @@ -import collections -from math import log10 - -def normalise(frequencies): - """Scale a set of frequencies so they sum to one - - >>> sorted(normalise({1: 1, 2: 0}).items()) - [(1, 1.0), (2, 0.0)] - >>> sorted(normalise({1: 1, 2: 1}).items()) - [(1, 0.5), (2, 0.5)] - >>> sorted(normalise({1: 1, 2: 1, 3: 1}).items()) # doctest: +ELLIPSIS - [(1, 0.333...), (2, 0.333...), (3, 0.333...)] - >>> sorted(normalise({1: 1, 2: 2, 3: 1}).items()) - [(1, 0.25), (2, 0.5), (3, 0.25)] - """ - length = sum(f for f in frequencies.values()) - return collections.defaultdict(int, ((k, v / length) - for (k, v) in frequencies.items())) - -def euclidean_scale(frequencies): - """Scale a set of frequencies so they have a unit euclidean length - - >>> sorted(euclidean_scale({1: 1, 2: 0}).items()) - [(1, 1.0), (2, 0.0)] - >>> sorted(euclidean_scale({1: 1, 2: 1}).items()) # doctest: +ELLIPSIS - [(1, 0.7071067...), (2, 0.7071067...)] - >>> sorted(euclidean_scale({1: 1, 2: 1, 3: 1}).items()) # doctest: +ELLIPSIS - [(1, 0.577350...), (2, 0.577350...), (3, 0.577350...)] - >>> sorted(euclidean_scale({1: 1, 2: 2, 3: 1}).items()) # doctest: +ELLIPSIS - [(1, 0.408248...), (2, 0.81649658...), (3, 0.408248...)] - """ - length = sum([f ** 2 for f in frequencies.values()]) ** 0.5 - return collections.defaultdict(int, ((k, v / length) - for (k, v) in frequencies.items())) - -def identity_scale(frequencies): - return frequencies - - -def l2(frequencies1, frequencies2): - """Finds the distances between two frequency profiles, expressed as dictionaries. - Assumes every key in frequencies1 is also in frequencies2 - - >>> l2({'a':1, 'b':1, 'c':1}, {'a':1, 'b':1, 'c':1}) - 0.0 - >>> l2({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1}) # doctest: +ELLIPSIS - 1.73205080... - >>> l2(normalise({'a':2, 'b':2, 'c':2}), normalise({'a':1, 'b':1, 'c':1})) - 0.0 - >>> l2({'a':0, 'b':2, 'c':0}, {'a':1, 'b':1, 'c':1}) # doctest: +ELLIPSIS - 1.732050807... - >>> l2(normalise({'a':0, 'b':2, 'c':0}), \ - normalise({'a':1, 'b':1, 'c':1})) # doctest: +ELLIPSIS - 0.81649658... - >>> l2({'a':0, 'b':1}, {'a':1, 'b':1}) - 1.0 - """ - total = 0 - for k in frequencies1: - total += (frequencies1[k] - frequencies2[k]) ** 2 - return total ** 0.5 -euclidean_distance = l2 - -def l1(frequencies1, frequencies2): - """Finds the distances between two frequency profiles, expressed as - dictionaries. Assumes every key in frequencies1 is also in frequencies2 - - >>> l1({'a':1, 'b':1, 'c':1}, {'a':1, 'b':1, 'c':1}) - 0 - >>> l1({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1}) - 3 - >>> l1(normalise({'a':2, 'b':2, 'c':2}), normalise({'a':1, 'b':1, 'c':1})) - 0.0 - >>> l1({'a':0, 'b':2, 'c':0}, {'a':1, 'b':1, 'c':1}) - 3 - >>> l1({'a':0, 'b':1}, {'a':1, 'b':1}) - 1 - """ - total = 0 - for k in frequencies1: - total += abs(frequencies1[k] - frequencies2[k]) - return total - -def l3(frequencies1, frequencies2): - """Finds the distances between two frequency profiles, expressed as - dictionaries. Assumes every key in frequencies1 is also in frequencies2 - - >>> l3({'a':1, 'b':1, 'c':1}, {'a':1, 'b':1, 'c':1}) - 0.0 - >>> l3({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1}) # doctest: +ELLIPSIS - 1.44224957... - >>> l3({'a':0, 'b':2, 'c':0}, {'a':1, 'b':1, 'c':1}) # doctest: +ELLIPSIS - 1.4422495703... - >>> l3(normalise({'a':0, 'b':2, 'c':0}), \ - normalise({'a':1, 'b':1, 'c':1})) # doctest: +ELLIPSIS - 0.718144896... - >>> l3({'a':0, 'b':1}, {'a':1, 'b':1}) - 1.0 - >>> l3(normalise({'a':0, 'b':1}), normalise({'a':1, 'b':1})) # doctest: +ELLIPSIS - 0.6299605249... - """ - total = 0 - for k in frequencies1: - total += abs(frequencies1[k] - frequencies2[k]) ** 3 - return total ** (1/3) - -def geometric_mean(frequencies1, frequencies2): - """Finds the geometric mean of the absolute differences between two frequency profiles, - expressed as dictionaries. - Assumes every key in frequencies1 is also in frequencies2 - - >>> geometric_mean({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1}) - 1 - >>> geometric_mean({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1}) - 1 - >>> geometric_mean({'a':2, 'b':2, 'c':2}, {'a':1, 'b':5, 'c':1}) - 3 - >>> geometric_mean(normalise({'a':2, 'b':2, 'c':2}), \ - normalise({'a':1, 'b':5, 'c':1})) # doctest: +ELLIPSIS - 0.01382140... - >>> geometric_mean(normalise({'a':2, 'b':2, 'c':2}), \ - normalise({'a':1, 'b':1, 'c':1})) # doctest: +ELLIPSIS - 0.0 - >>> geometric_mean(normalise({'a':2, 'b':2, 'c':2}), \ - normalise({'a':1, 'b':1, 'c':0})) # doctest: +ELLIPSIS - 0.009259259... - """ - total = 1 - for k in frequencies1: - total *= abs(frequencies1[k] - frequencies2[k]) - return total - -def harmonic_mean(frequencies1, frequencies2): - """Finds the harmonic mean of the absolute differences between two frequency profiles, - expressed as dictionaries. - Assumes every key in frequencies1 is also in frequencies2 - - >>> harmonic_mean({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1}) - 1.0 - >>> harmonic_mean({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1}) - 1.0 - >>> harmonic_mean({'a':2, 'b':2, 'c':2}, {'a':1, 'b':5, 'c':1}) # doctest: +ELLIPSIS - 1.285714285... - >>> harmonic_mean(normalise({'a':2, 'b':2, 'c':2}), \ - normalise({'a':1, 'b':5, 'c':1})) # doctest: +ELLIPSIS - 0.228571428571... - >>> harmonic_mean(normalise({'a':2, 'b':2, 'c':2}), \ - normalise({'a':1, 'b':1, 'c':1})) # doctest: +ELLIPSIS - 0 - >>> harmonic_mean(normalise({'a':2, 'b':2, 'c':2}), \ - normalise({'a':1, 'b':1, 'c':0})) # doctest: +ELLIPSIS - 0.2 - """ - total = 0 - for k in frequencies1: - if abs(frequencies1[k] - frequencies2[k]) == 0: - return 0 - total += 1 / abs(frequencies1[k] - frequencies2[k]) - return len(frequencies1) / total - - -def cosine_similarity(frequencies1, frequencies2): - """Finds the distances between two frequency profiles, expressed as dictionaries. - Assumes every key in frequencies1 is also in frequencies2 - - >>> cosine_similarity({'a':1, 'b':1, 'c':1}, {'a':1, 'b':1, 'c':1}) # doctest: +ELLIPSIS - 1.0000000000... - >>> cosine_similarity({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1}) # doctest: +ELLIPSIS - 1.0000000000... - >>> cosine_similarity({'a':0, 'b':2, 'c':0}, {'a':1, 'b':1, 'c':1}) # doctest: +ELLIPSIS - 0.5773502691... - >>> cosine_similarity({'a':0, 'b':1}, {'a':1, 'b':1}) # doctest: +ELLIPSIS - 0.7071067811... - """ - numerator = 0 - length1 = 0 - length2 = 0 - for k in frequencies1: - numerator += frequencies1[k] * frequencies2[k] - length1 += frequencies1[k]**2 - for k in frequencies2.keys(): - length2 += frequencies2[k]**2 - return numerator / (length1 ** 0.5 * length2 ** 0.5) - - - -if __name__ == "__main__": - import doctest - doctest.testmod() diff --git a/plot-caesar-parameters.ipynb b/plot-caesar-parameters.ipynb deleted file mode 100644 index 91f09ee..0000000 --- a/plot-caesar-parameters.ipynb +++ /dev/null @@ -1,207 +0,0 @@ -{ - "metadata": { - "name": "" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ - { - "cells": [ - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import csv\n", - "import matplotlib.pyplot as plt\n", - "%matplotlib inline" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "with open('caesar_break_parameter_trials.csv') as c:\n", - " results = [l for l in csv.DictReader(c, quoting=csv.QUOTE_NONNUMERIC)]\n", - "results" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 6, - "text": [ - "[{5.0: 2401.0,\n", - " 10.0: 4092.0,\n", - " 20.0: 4893.0,\n", - " 50.0: 4997.0,\n", - " 100.0: 4995.0,\n", - " 'name': 'Pletters',\n", - " 30.0: 4971.0},\n", - " {5.0: 2174.0,\n", - " 10.0: 3590.0,\n", - " 20.0: 4671.0,\n", - " 50.0: 4980.0,\n", - " 100.0: 4997.0,\n", - " 'name': 'cosine_similarity + euclidean_scaled',\n", - " 30.0: 4915.0},\n", - " {5.0: 2207.0,\n", - " 10.0: 3559.0,\n", - " 20.0: 4660.0,\n", - " 50.0: 4993.0,\n", - " 100.0: 4999.0,\n", - " 'name': 'cosine_similarity + normalised',\n", - " 30.0: 4931.0},\n", - " {5.0: 2175.0,\n", - " 10.0: 3751.0,\n", - " 20.0: 4761.0,\n", - " 50.0: 4995.0,\n", - " 100.0: 4997.0,\n", - " 'name': 'l1 + euclidean_scaled',\n", - " 30.0: 4950.0},\n", - " {5.0: 2188.0,\n", - " 10.0: 3662.0,\n", - " 20.0: 4770.0,\n", - " 50.0: 4993.0,\n", - " 100.0: 4999.0,\n", - " 'name': 'l1 + normalised',\n", - " 30.0: 4950.0},\n", - " {5.0: 2209.0,\n", - " 10.0: 3579.0,\n", - " 20.0: 4664.0,\n", - " 50.0: 4991.0,\n", - " 100.0: 4997.0,\n", - " 'name': 'l2 + euclidean_scaled',\n", - " 30.0: 4914.0},\n", - " {5.0: 2195.0,\n", - " 10.0: 3536.0,\n", - " 20.0: 4637.0,\n", - " 50.0: 4988.0,\n", - " 100.0: 4998.0,\n", - " 'name': 'l2 + normalised',\n", - " 30.0: 4915.0},\n", - " {5.0: 1978.0,\n", - " 10.0: 3243.0,\n", - " 20.0: 4477.0,\n", - " 50.0: 4979.0,\n", - " 100.0: 4997.0,\n", - " 'name': 'l3 + euclidean_scaled',\n", - " 30.0: 4822.0},\n", - " {5.0: 1949.0,\n", - " 10.0: 2966.0,\n", - " 20.0: 4351.0,\n", - " 50.0: 4959.0,\n", - " 100.0: 4999.0,\n", - " 'name': 'l3 + normalised',\n", - " 30.0: 4774.0}]" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for r in results:\n", - " plt.plot(sorted([k for k in r.keys() if k != 'name']), sorted([r[k] for k in r.keys() if k != 'name']))\n", - "plt.legend([r['name'] for r in results], loc='center', bbox_to_anchor=(2, 0.5))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 7, - "text": [ - "" - ] - }, - { - "metadata": {}, - "output_type": "display_data", - "png": "iVBORw0KGgoAAAANSUhEUgAAA0wAAAD9CAYAAACP4/f6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4FFXbwOHfbja9h/ROBIG8FBEISJEiIE0UpYWaD0QB\nRRAsiNJsoKivCoqIdAzNghEwogjyShXphJIE0gvpvZDd+f5YsmRJISghIM99XXuxM3Nm5pyZ3WGf\nnKZSFEVBCCGEEEIIIUQl6vrOgBBCCCGEEELcqSRgEkIIIYQQQohqSMAkhBBCCCGEENWQgEkIIYQQ\nQgghqiEBkxBCCCGEEEJUQwImIYQQQgghhKhGrQImf39/WrZsSevWrQkKCgIgMzOTXr16cf/999O7\nd2+ys7MN6RcsWEDjxo1p2rQpO3fuNKz/66+/aNGiBY0bN2bq1Km3uChCCCGEEEIIcWvVKmBSqVTs\n2bOHY8eOcfjwYQAWLlxIr169uHDhAo888ggLFy4EICIigk2bNhEREUF4eDiTJ0+mfKqnSZMmsWLF\nCiIjI4mMjCQ8PLyOiiWEEEIIIYQQ/1ytm+RdP79tWFgYY8eOBWDs2LFs3boVgB9++IHg4GBMTU3x\n9/enUaNGHDp0iOTkZPLy8gw1VGPGjDHsI4QQQgghhBB3olrXMPXs2ZO2bduyfPlyAFJTU3FzcwPA\nzc2N1NRUAJKSkvD29jbs6+3tTWJiYqX1Xl5eJCYm3rKCCCGEEEIIIcStpqlNon379uHh4UFaWhq9\nevWiadOmRttVKhUqleqWZOhWHUcIIe4l17cCEEIIIcStUauAycPDAwAXFxcGDRrE4cOHcXNzIyUl\nBXd3d5KTk3F1dQX0NUfx8fGGfRMSEvD29sbLy4uEhASj9V5eXlWeT/7jh3nz5jFv3rw6P4+iQHIy\nXLhQ+RUTAxYWYGZW+WVqqsPMUouFxRUszMuwML2CueYKZiZlmKrLMEWLKWVolDJMtTo0Oi2aMi2a\nMh2aUh2aKzpMS6++ShRMixXMShTMS8C8GMyLFUyvQKkZrGENg+3GUGZVTKl9GgU2yRSaJVOguUyh\nOp1CJZMCXS4FugIKyorJLy0hr/gKeYVa8gp05OdBfgFYWYKNtRorSxXmVqCxVNCaayhVNaJUF0hp\n2X8oK2pGaV5jijMbortiiZN3Oq6NkrENOI2ZfRaotKDWgqoM1Ip++epLMfpXh1JhHSotClfXoUVR\nlaFDd/W9FoUy/Xt06K6u06FFp+j/VShDq2jJ2JmMfe8GKIoWLVp0Shk6RYtW0aI1vC8zWi5TylCr\n1JioNGjUGsO/+vcmhvflL1OTyssmKhM0162v6lXV8f5pWhN11emWf7ScKa9MqfXx1Cr1v/YPMv/W\ncgkhhBB3ghsGTIWFhWi1WmxtbSkoKGDnzp3MnTuXgQMHsmbNGl599VXWrFnDE088AcDAgQMZMWIE\n06dPJzExkcjISIKCglCpVNjZ2XHo0CGCgoJYt24dL7zwQp0XUOhlZ1cdFEVGgqUlNGkC99+vf3V8\nSIc2O4nsXclooktQFyloinRoisAsV8GsGCyKQFFBiSWUmsMVSygzB60FaM10KGY6FFMdKk0ZKpNS\n1KpSTChGoytEU5ZDGUmUmsRTYpZCkSaTLIdC8tTF5KpKydNdIbtMS3aplpwiHbFJOn5jDbmpUJYI\n1tZgbQMW1qCxAhNrFRobU8xszTG3tcLSrgGe9k7YOLjg0MATlwZeWCiNKEz1ITvRlbR4R5JjbIiJ\ntiAlSY2vr4qWTeC++69g3/ACiuspcsy/5VLhKU5dPsXFgss0c26Gk417tT/eKwcDpnUSOKxMXsnk\nUZNv6ngmahPUqn/fDAJu1m4EugTWdzaEEEII8S93w4ApNTWVQYMGAVBWVsbIkSPp3bs3bdu2ZejQ\noaxYsQJ/f382b94MQGBgIEOHDiUwMBCNRsPnn39u+Ovn559/TkhICEVFRfTr148+ffrUYdHuPcXF\nEB1ddWBUUHAtILr/fhgwQP9v48bg6Kiv1TuzN41ja+JRfZBHsaMK044l+LSIxqI0F8vibKwKM7HO\nTcMmOwWbzCRU2WlkaAtJtbYi1cGUy9YaMswU0jUKGYqWzLIysot15BSXkVekI69AIS9fIT8fNBqw\ntgVLG7CwVmFuo8bcRoOFjTkWdnZY2dng4ehEEwdnrP+XzBNPP4mHmz/uTh44WjriYOGAg4UDduZ2\naNT6j3FWFpw/f63M5/fDHxcgKgocHK6VvU0TBee+iZQ5nSJNfYqIjFOcTD3JrxkX8FF8aEELWti3\n4OHGY2nh1oL7HO/DRG1Sz3dXL9w2nAfcH6jvbAghhBBC3DNUyh3W/k2lUkmTPGDPnj1069at0nqt\nFuLiqg6KkpPB3984MCp/eXjA9a12FEUh/kg2B1fHotmaQ5FGIe9xWx4MTOXBpTNZZ5XIL9Y6skuv\nkFtSRl6RlvxCHfn5Ogryoajoam2PLVjZqrC0UWNpo8HS1gxLO0ts7G2wtXfAztEZpwYeuLj44OHW\nCG/3Jrjau+Ng4YCtme0Ng5GK16K4WB8AGYKiCgFSSYlxTVmTJuDRMIdS+9NE5+tri06l6v81MzGj\nhWsLWri1oIVrC1q6tSTQJRArU6tbcwPrSHWfi3uRXItr5LkphBBC1B0JmO5QGRlw9qxxQHDhAly8\nCC4uVQdF/v76mpsbHvt0HgdWx1L6TSZXSnUkD7Ci2UhPepScRT17FpstzjMvJZ+SK9C2uzd2Dg44\nODrRoIE7Li7euLsF4OPRBD+P/+Bg5XrLm3vpdMZBYcVrkJwMDRsaB0X33w8N77tCtuY8py9fDYwu\n62uN0gvT+Y/LfwyBUXmQ5GrtekvzLER9kuemEEIIUXckYLoDHT0K3btDYGDloKhxY7D6G5Ug+dGF\nHFoTR87mdJSMMqL7mOM30oN+Pb2xPXCAK2/MZIfZMealFZF0WcWEaU8yb3ooGo3ZrS/gVenpVQdF\n0dHQoEHloOj++8HPTyGlMIGTqScNgdGp1FNEZkbia+9rFBS1cG1BgGPAHdOcToi6Is9NIYQQou5I\nwHSHKS2Fdu1gxgwYM+afHas4vpgT6xNI3ngZVVwpp3tqcBnmyoD+vnhaWsCff1I4+yX+pznE29kl\nnD6r5pkXhvDmzDWYm5vfkvIUFl5rQnd9bZlWey0YqhgUNW6sb+qXU5xj1Iyu/L2FxsKoKV0L1xYE\nugRiaWp5S/IsxN3mXn9uCiGEEHVJAqY7zFtvwYEDsH175T5HtVGaWsqFDUlcDE3B5HwxRx5WYzOk\nAX0e9+M/9jb6RCdPkjP7BY6b72Nhbhn7Dqp5euIw3pq9HGtr65s+p1YLsbGVA6Lz5yEtDQICKgdF\nTZqAs7O+jKXaUs6nnzc0oysPjDKLMvmP638q1Rq5WLvc/IUR4l/sXn9uCiGEEHVJAqY7yOnT+qZ4\nR4+Cj0/t97uSeYW4Lamc/zoJ9bEiDnUEZZAD3Z/0oYuLI+ryyOv8eVJnT+Si5V4+ytfx0y9qxoQM\n4+15S3BycqrxHIqiD36qCoouXgQ3t6qDIl9fMDEpP4ZCXE5cpVqjqMwo/Oz9KvUzCnAM+FcOhy3E\nrXYvPzeFEEKIuiYB0x2irAw6doSnn4ZnnqlF+twyUn9II2JdEroD+Rxpo5Az0JYOT3nTz8cFC/W1\nQEO5eJHYuSGkWf/BZ4UK3/2g4anBT/DOW5/g6elZ5fEVBbZsgR9/vBYkqdX6IOj6oOi++yr3q8ou\nzjYKik6mnuT05dNYmVoZmtGVB0bNnJtJczoh/oF79bkphBBC3A4SMN0hFi2C8HD49dfqm+JpC7Vk\nbMvg3PpESnbncqIlXOpnQashXgxu6IaTqalR+rK4GC68OZIiu/2sKoLQzWb07Pko777zEY0aNao2\nL0lJMHEiXLoE06dD06b64KhBg8ppS8pKOJd+zqiP0anLp8guzq5ydDpnK+d/cpmEEFW4V5+bQggh\nxO0gAdMd4MIFfe3S4cP6/j4V6Up0ZP6cSXRoMrk7MrnQTMVfvTXcP8SdYY09aGhZuWamMDGGiHeH\nonL8k81FKtZusOSBVh1ZsGARDzxQ/aSnigKrV8Orr8KkSfD662BmVr5NITYnttIADNFZ0fg7+BuC\nopZuLWnh1gJ/B39pTifEbXIvPjeFEEKI20UCpnqm00HXrjB4MEydem199p5sYlYnkf5DOvENVfzW\nAzwHuzL0P548aGODqopqqMyEKE5/OARrl+PsKFSzaoMdHu5NWbjwfbp06VJjPuLiYMIEfT+lVaug\nVSvYfWk3m85sMjSnszW3NRp8oYVrC5q5NMNCY3GrL4sQ4ibca89NIYQQ4naSgKmeLVkCGzbA3r3X\nBkfIOJLDoUePs2GECssnnXiylSc9HR3RVNNWLzb2FGc/G0oDj3PsKzRh1UYXFJUz7767gP79+1cZ\nXJXT6eDLL2H2bH3zu5deAo1G4f197/PJoU94tdOrtHJvRQvXFjSwqqJNnhCi3t1rz00hhBDidpKA\nqR7FxEDbtvDHH/p+QuW2DviTv5opvLqwDTYm1U+6euriAaJWjMLT5yInczWs/d6XxFSFt956i+Dg\nYNTqmpvERUfrB5koKoKVK/UT5RaUFjA+bDzRWdF8N/Q7fOxvYrg+IUS9uJeem0IIIcTtJp1M6omi\n6JvAvfyycbCUHpGHal8Bg2c0qTJYUhSF/53fSeh8b/L3dqS4QQJvf9uCuR+7EDx6BufOnWPkyJE1\nBktaLXz8MbRvD489Bvv26YOlmOwYOq3shLnGnL0heyVYEkIIIYQQ9zxNfWfgXrVyJWRlwYwZxut3\nzTtP/EhrHne3N1qvU3RsO7WZ9G1TaBKQjo2tJZ9/34Hw/VFMnx7Mxq0v1GrS2XPnYPx40Gj0E+Q2\nbqxf/9ul3xjx7Qhe6/waL7R/ocZmfEIIIYQQQtwrJGCqB4mJMHMm7NqlD1zKpV7Mxyo8nwERDxrW\nlWpLCT36JUW7Z9G8UR5WZjZsCuvF1z//xYQJXTm/avsNJ50F/TxPH36oH758/nz9KHhqtb7G6pND\nn7Dwj4WEPhVKj4Y96qLIQgghhBBC3JUkYLrNFEU/x9Fzz0HLlsbbwt86T/5gKx7ztiO3JJcVhz/C\n5Mj7PHBfERrFlp+2DWRp2D6GDLmPU6dWVzvp7PVOnYL/+z9wdIQjR8DfX7++6EoRE7dP5ETKCQ6M\nP0BDx4a3trBCCCGEEELc5SRgus1CQ/WDPXz7rfH6pMQCGnyTR+cTD5Kan0Loan/a+JdiW2DH7p8H\nsei73+je3ZqDBw/WOOlsRaWlsGCBfiS+BQv0TfHKW9rF58Tz5OYnuc/xPvaN24e12Y2b8wkhhBBC\nCHGvkYDpNkpN1Q/dvX37tQlhy/347jlM+1kxIMCO1esH0d6yhHO7xvHW1t8IDMzmp59+qnHS2ev9\n9ReMGwfe3nDsmP7fcn/E/cHQLUOZ2n4qr3R6RforCSGEEEIIUQ0JmG6jKVP0TePatjVeH5dWgMfX\neTywvzUZhRk0KPyNCW854OB7jjVr1vDwww/X+hzFxfDmm7Bihb7P0siR12qVAL448gVzds9h7aC1\n9GnU5xaVTAghhBBCiH8nCZhuk2+/hRMnYM2aytu+e/8crl2s8A20Z9XmxzixB5o++DDfbN16U7U/\nBw/qa5WaNdOfy9392raSshJeCH+BP+L+YN+4fTRu0PifF0oIIYQQQoh/OQmYboOMDH3t0pYtYGlp\nvC0qqwDfVXkE/fwA2UXZuGRvY9MOc3bsnlfrYKmwEGbP1veP+vRTGDzYuFYpOS+ZwVsG42rtysHx\nB7E1t72FpRNCCCGEEOLfSwKm2+DFF2HIEOjUqfK2TZ+co2krS7zbOLBq63DOH4bW7TrTunXrWh37\n99/1gzkEBelHw3N2Nt5+KOEQg7cMZsKDE3jj4TdQq2SuYiGEEPcmJycnsrKy6jsbQog7kKOjI5mZ\nmVVuk4Cpju3YAX/8oQ9mrnc6J59Gy/N4aENLCkoLcE7dzLytFny9dd4Nj5uXB6+9Bt9/D59/Do8/\nXjnNqmOreOXXV1gxcAUDmwz854URQggh7mJZWVkoilLf2RBC3IFqatklAVMdysnRz7m0ahVYVzFq\n99dLz9HR2wLPh51Y/dMEYk4r+DVqSefOnWs87i+/wIQJ0KMHnD6tn1+poivaK8zYOYOfo39mb8he\nmrk0u4WlEkIIIYQQ4t5Rq/ZZWq2W1q1b89hjjwEwb948vL29ad26Na1bt+ann34ypF2wYAGNGzem\nadOm7Ny507D+r7/+okWLFjRu3JipU6fe4mLcmV55Bfr0gUceqbztSE4uzZYX0HbufRSXFeMQu5LQ\nLRbMmje/2uNlZ8PTT+tfy5bBypWVg6W0gjR6retFdFY0h54+JMGSEEIIIYQQ/0CtAqZPPvmEwMBA\nQ1WVSqVi+vTpHDt2jGPHjtG3b18AIiIi2LRpExEREYSHhzN58mRD1fekSZNYsWIFkZGRREZGEh4e\nXkdFujPs2qVvjrdoUdXbV6+9gIuVGe59ndn8+0zOx+iwcQ7g0UcfrTL9tm3QogWYmuqb91WV7Gjy\nUdotb0cn306EDQ/DwcLhFpZICCGEEEKIe88NA6aEhAR27NjB008/bQh+FEWpsg3wDz/8QHBwMKam\npvj7+9OoUSMOHTpEcnIyeXl5BAUFATBmzBi2bt16i4ty5ygo0DeZ++ILsLevvP1/2dk88GUBrd4I\n4IruCtYXlvD11/rapevbT2ZkwOjRMHUqrF0LS5eCnV3lY4aeCuXR9Y+yqNci3unxDiZqkzoqnRBC\nCCGEEPeOG/ZhevHFF1m0aBG5ubmGdSqVisWLF7N27Vratm3Lhx9+iIODA0lJSXTo0MGQztvbm8TE\nRExNTfH29jas9/LyIjExsdpzzps3z/C+W7dudOvW7SaLVb9efx06d4b+/StvUxSFr7ZEMqpQg8dg\nVzYcmENampZSU28GDRpklPbbb/XDkQ8dCidPVt0PqkxXxmu7XuO7s9+xa8wuWrq1rKNSCSHuFHv2\n7GHPnj31nQ0hxG3QrVs3Ro8ezfjx4+s7K0Lcs2oMmLZt24arqyutW7c2+s950qRJzJkzB4DZs2cz\nY8YMVqxYccsyVTFgutvs2webN+sHY6jKL1lZBK0ootlrjdCqtJicfp+NayyYOWceJib6WiGtFkaO\nhGPH9HM3VTUcOUBmUSbDvxmOgsLhpw/TwKpBHZVKCHEnuf4PSfPnV9/3UQhxd/D39+fy5cuYmJhg\nbW1N3759WbJkCSqVqtbzMqrVaqKioggICAD0f1wZPXo08fHxdZl1If71amySt3//fsLCwmjYsCHB\nwcH89ttvjBkzBldXV8MX+Omnn+bw4cOAvuao4pcyISEBb29vvLy8SEhIMFrv5eVVR0WqP0VFMG4c\nLF4MTk6VtyuKwuc7omgap8ZzjDvf/vUR2XmlJBXaM3LkSEO6bdsgMhKOH68+WDqVeop2y9vR0q0l\nP438SYIlIYQQ4i6mUqnYtm0beXl5HD16lCNHjvD2228D3NRQ6Ldy2PSysrJbdiwh7mY1Bkzvvvsu\n8fHxXLp0iY0bN9KjRw/Wrl1LcnKyIc33339PixYtABg4cCAbN26ktLSUS5cuERkZSVBQEO7u7tjZ\n2XHo0CEURWHdunU88cQTdVuyejB/PrRsCU89VfX2HzIy6LaqhMYv+4EplP01j80rzHn59TcwNTU1\npFu8WD/ZraVl1cf5NuJbeqztwfxu8/mg9wdo1DI6vBBCCPFv4enpSd++fTldRXOVlStXEhgYiJOT\nE3369CEuLg6Ahx9+GIBWrVphZ2fH2rVr6devH0lJSdja2mJnZ0dKSgqKorBw4UIaNWqEs7Mzw4YN\nM0zmGxMTg1qtZuXKlfj5+dGzZ09KSkoYNWoUzs7OODo6EhQUxOXLl2/fxRDiDlDrX9qKohiqhF95\n5RVOnDiBSqWiYcOGLFu2DIDAwECGDh1KYGAgGo2Gzz//3LDP559/TkhICEVFRfTr148+ffrUQXHq\nz5Ej+vmWTp6sertWUVi8O5rXT4JXmCffH1/KlbIizlx2YFuFdskREfrmfEOGVD6GTtExZ/cc1p1c\nR/jIcNp4tqmj0gghhBDidiuvHYqPj2fHjh089dRT7N271/Bb6ocffmDBggVs27aNxo0bs2DBAoKD\ng9m3bx979+5FrVZz8uRJQ5M8Pz8/Ro0aZdT655NPPiEsLIy9e/fi4uLClClTeO655wgNDTWk2bt3\nL+fOnUOlUrF69Wpyc3NJSEjA3Nyc48ePY1ndX3SF+JdSKXfYlNcqlequm4W7tBTatoVXX9X3ParK\n16mpJE+I4qk2nvjP8WfNMju+/byUTsHzmPnaa4Z0kyeDszO8+abx/jnFOYz8biR5pXlsGbIFV2vX\nOiyREOJucjc+N4WoD7X5rtSyu9AN3exX0t/fn4yMDDQaDfb29gwYMIAPPviAvn37Mnr0aMaNG0ff\nvn0ZMmQI48aNA0Cn02Fra8u5c+fw8fGpVR+mwMBAlixZQo8ePQBITk7Gz8+P4uJi4uLiCAgI4OLF\ni/j7+wOwatUqvvrqK7744gtDiyIh/o1qej5IW65bYMEC8PODESOq3n5Fp+OTgxd57386vFd7sz1i\nLeaafA7E2rB+8mRDupwc2LABzpwx3v9c+jme2PgEPQN68t9H/4upiSlCCCGEuPXq628PKpWKH374\nwRDIVCU2NpapU6cyY8YMo/WJiYn4+PjU6jwxMTEMGjQItfparwyNRkNqaqphueKxygOu4cOHk52d\nzahRo3jnnXfQaOQnpLh31GriWlG9kydhyRL9nEvV/VVqdUoKT21S8H3aE42jhuQ/XuT7L0yZ9MI0\n7CtM1LR6tX5CWk/Pa/v+eP5HHl71MC93fJkl/ZZIsCSEEELco3x9ffnyyy/JysoyvAoKCoymdKmo\nqtH1fH19CQ8PNzpGYWEhHh4eVe6n0WiYM2cOZ86cYf/+/Wzbto21a9fe+sIJcQeTgOkfKCvTj4q3\nYAFUN+hfsU7Hx8djaP+TFu8Xvfnlwjc4WWTx6zlTpk6dakin0+kDrylTri4rOt76/S0mbZ9EWHAY\n4x+U+ReEEEKIe9nEiRN59913iYiIACAnJ4ctW7YYtru5uREdHW20nJGRYTSX5sSJE5k1a5ZhsIi0\ntDTCwsKqPeeePXs4deoUWq0WW1tbTE1NDdOgCHGvkPrUf+Cjj8DBAWqaS25ZUhKjt5rgMbQB5p7m\nRH/1PIdWahj79AScnZ0N6X7+GWxsoGNHfbA07JthJOQm8OeEP/Gw9aj+BEIIIYS4JzzxxBPk5+cz\nfPhwYmNjsbe3p3fv3gy5OlLUvHnzGDt2LEVFRSxfvpzBgwcTHBxMQEAAOp2OiIgIpk6diqIo9O7d\nm6SkJFxdXRk+fDgDBw4EKtdKpaSkMHHiRBISErCxsWH48OGMHj36tpddiPokgz78TefP6+dI+vNP\naNiw6jQFWi0tfjvIquEKQYfbcEj1GzkHB/B/z1hy8twFvL29DWn79YPBg/U1Vrsu7mLaz9M4MuEI\n5hrz21QiIcTd6m55bgpR3+S7IoSojgz6cItptfrAZt686oMlgE8TEpgQbobLo9ZY3mfJqVXPErHO\nhKeGBRsFS5GR+sDr22/1y6uOr+Lp1k9LsCSEEEIIIUQ9kz5Mf8Nnn4FarR8CvDrZZWUsiY6n09el\n+M705UDcbgKsEtnypxmvzJxZ6Xjjx+snqs0pzmHbhW2MbFnN+ORCCCGEEEKI20ZqmG7SxYv6OZL2\n79cHTdX5MD6eKb9b4djOFJuWNhxc8zRxG9X06juAxo0bG9Ll58O6dXD0qH5505lNPBLwCM5WztUc\nWQghhBBCCHG7SMB0ExQFJkzQT1B7//3Vp0srLeWL2AS+X6PBN/Q+jiYepKnVRd7bZ8XOP94wSrt2\nLXTtqp/HCfTN8V7v8nodlkIIIYQQQghRWxIw3YSvvoK8PHjxxZrTLYyL4+Ujdlj76bDvaM/u0PFk\nfqOiXccutGzZ0pBOUfRDiX/2mX75bNpZYrJj6NOoTx2WQgghhBBCCFFbEjDVUnw8zJoFu3dDTZNb\nJ5aUsCYpmbBVZvh91JjTqcf5j2kEz+6xZuP2uUZpd+0CExPo1k2/vPrEaka3HI1GLbdFCCGEEEKI\nO4H8Mq8FRYGJE+GFF6B585rTvh0by8yzjpiZF+PY25EVW3pRHKYiIPABHnroIaO0ixfD88+DSgVl\nujLWnVjHrjG76rAkQgghhBBCiJshAVMtrF8PCQlw3eB2lVwsKmLL5ctsX2mB72u+RGacp7nqKNN+\ntmFJqHHt0qVL8McfEBqqX/456md87X1p5tKsjkohhBBCCCGEuFkyrPgNpKTASy/BypVgalpz2vkx\nMbwR3wCytbg86cL3v4/n9C8q7DwD6Nmzp1HapUshJASsrfXLq46v4v8e+L+6KYQQQggh7jn9+vVj\n3bp19XJuW1tbYmJi/ta+zZs3Z+/evQDMmzeP0aNH/+18TJo0ibfffvtv73+niomJQa1Wo9PpgJrv\n9fVp/w38/f3Ztevvtcr6O/tKDdMNPP+8fo6kNm1qTne2oICfMjN5YaU1nq/6EpN7if+U7eeNbbbM\n/WweKpXKkLawEFatgoMH9cvphen8evFXVgxcUYclEUIIIcS9ZMeOHfV27ry8vL+97+nTpw3vK/5+\n+juWLl1qeL9nzx5Gjx5NfHz8Pzrmnag+73V9UKlUf/uz8Xf2lRqmGnzzDZw5A3Pm3DjtnJgY5mS5\nUnquCLdRbmz+37NcOgSlVq48/vjjRmlDQ6F9e7jvPv3y1ye/ZsD9A7C3sK+DUgghhBBC3J0URfnb\n+9ZljUpMTAwNGzass+OLO4sETNXIyIApU/RN8Swsak57NC+PfTk5dFlZjM8MH5KKkmhauIuN39jy\n2ty5qCvMcKso+sEepky5tr80xxNCCCFEfHw8Tz75JK6urjg7OzPl6o8FnU7H22+/jb+/P25ubowd\nO5bc3FwAiouLGTVqFM7Ozjg6OhIUFERaWhoA3bp1Y8UKfeuV1atX07lzZ15++WWcnJwICAggPDzc\ncO6cnBwplYbmAAAgAElEQVTGjx+Pp6cn3t7ezJ49+4YBR1RUFF27dsXBwQEXFxeGDx9u2KZWq7l4\n8SIAISEhTJ48mX79+mFra0uXLl1ISUlh6tSpODo60qxZM44fP27Y19/fn99++63Kcw4ZMgQPDw8c\nHBzo2rUrERERhm0hISFMmjSJfv36YWNjw+7duwkJCWH27NkUFhbSt29fkpKSsLW1xc7OjuTkZKys\nrMjMzDQc4+jRo7i6uqLVam98w2qppKSEl156CT8/P9zd3Zk0aRLFxcWA/r506dLFKH3Fa1dUVMSM\nGTPw9/fHwcGBLl26UFJSUukcFe+1VqvlpZdewsXFhfvuu4/t27cbpa3pXkdHR9OjRw+cnZ1xcXFh\n1KhR5OTkGPb19/fnww8/pFWrVjg4ODB8+PAq81NReno6AwYMwNHRkQYNGvDwww8bAuHqPvM3ykdF\niqKwcOFCGjVqhLOzM8OGDSMrK8uwfd26dfj5+eHs7My7775bY16rIwFTNaZNg+BguG5guyq9cekS\n8654kP9HLh4TPPh632RSzygkaW2NHh4A//sfFBdDr1765WPJx8guzqZ7w+51UAohhBBC3A20Wi0D\nBgygYcOGxMbGkpiYSHBwMKD/Ub1mzRr27NnDxYsXyc/P5/nnnwdgzZo15ObmkpCQQGZmJsuWLcPi\n6l96r296dPjwYZo2bUpGRgavvPIK48ePN2wLCQnBzMyM6Ohojh07xs6dO/nqq69qzPPs2bPp06cP\n2dnZJCYm8sILL1SbdsuWLbzzzjukp6djZmZGhw4daNeuHZmZmQwePJjp06cb0tbUXKp///5ERUWR\nlpbGgw8+yMiRI422b9iwgdmzZ5Ofn0/nzp0N18DKyorw8HA8PT3Jy8sjNzcXDw8PunfvzubNmw37\nr1u3juDgYExMTGos+82YOXMmUVFRnDhxgqioKBITE3nzzTdrte9LL73EsWPHOHDgAJmZmSxatKjK\n61PxXi9fvpzt27dz/Phxjhw5wjfffGO0z43u9euvv05ycjJnz54lPj6eefPmGZ1ny5Yt/Pzzz1y6\ndImTJ0+yevXqGsvw4Ycf4uPjQ3p6OpcvX2bBggWoVKoqP/MVfzfXlI+KPv30U8LCwti7dy/Jyck4\nOjry3HPPARAREcHkyZP5+uuvSUpKIiMjg4SEhBtd9sqUO8ydkKUff1SUgABFKSi4cdo/srMVvwMH\nlNNjI5RLb15SUvJSlG++Vis9G9ooS5curZR+8GBF+fTTa8tTdkxR5uyecwtzL4S419wJz00h7ga1\n+a4wj1vyuln79+9XXFxcFK1WW2lbjx49jH5TnD9/XjE1NVXKysqUlStXKh07dlROnjxZab9u3bop\nK1asUBRFUVatWqU0atTIsK2goEBRqVRKamqqkpKSopibmytFRUWG7aGhoUr37t1rzPOYMWOUZ555\nRklISKi0TaVSKdHR0YqiKEpISIjyzDPPGLYtXrxYCQwMNCyfPHlScXBwMCz7+/sru3btUhRFUebO\nnauMGjWqyvNnZWUpKpVKyc3NVRRFUcaOHauMHTvWKE1ISIjyxhtvKIqiKLt371a8vb2Ntm/cuFHp\n1KmToiiKUlZWpri7uyt//vlnjeVWFEW5dOmS4u/vf8N0Op1Osba2NlwLRdHf64YNGyqKor8vnTt3\nNtqn/NpptVrF0tKyynt76dIlRaVSGT4vFe919+7dlWXLlhnS7ty505D2Zu/1999/r7Ru3dqw7O/v\nr3z99deG5VdeeUWZOHFijddgzpw5yuOPP65ERUUZra/pM1+bfJR/Rpo1a2Z4ryiKkpSUZPh+zJ8/\nXwkODjZsKygoUMzMzIzSl6vp+SCDPlwnOxsmTYK1a8HKqua0iqLw+qVLzNd4khUWx/3R7fl4/2hc\n4xTO5JrzY0iIUfr4eP1ktVdrTCkpK2HD6Q0cfvpw3RRGCCGEEDdFmfv3+8z8E/Hx8fj5+Rk14y+X\nnJyMn5+fYdnX15eysjIuX75sGMRg+PDhZGdnM2rUKN555x00mso/8dzd3Q3vra7+yMnPzyc9PZ0r\nV67g4eFh2K7T6fD19a0xz++//z6zZ88mKCgIR0dHZsyYwf/9X9VdDFxdXQ3vLSwsjJYtLS3Jz8+v\n8Vygr4V7/fXX+eabb0hLSzNcq/T0dGxtbVGpVHh7e9/wOBU9/vjjTJo0iZiYGM6dO4e9vT1t27at\nMm1oaKih5kKn05Gfn4+joyOgr3k5efJkpfOnpaVRWFhImwqjhymKUqv+Venp6RQXF3Nfeaf3WkpO\nTsbHx8ewXPE+xsbG1nivU1NTmTp1Kn/88Qd5eXnodDqcnJyMjl/xc2RpaUlSUlKN+Xn55ZeZN28e\nvXv3BuCZZ57h1VdfrfEzX5t8lIuJiWHQoEFGx9FoNKSmppKcnGx0T6ysrGjQoEGN+a2KNMm7zpIl\n+uZy3WvRQu7XrCySS0rosLYEj6c9yLPIw+fyFr5bacX0mTMNVeLlvvgCRo4EOzv98o8XfqS5a3Ma\nOkqnQSGEEOJe5uPjQ1xcXJV9Zzw9PY2G6I6Li0Oj0eDm5oZGo2HOnDmcOXOG/fv3s23bNtauXXvT\n5zY3NycjI4OsrCyysrLIycnh1KlTNe7n5ubGl19+SWJiIsuWLWPy5MmGvjd1ITQ0lLCwMHbt2kVO\nTg6XLl0CbjwwRHlztKqasllYWDBkyBDWr1/P+vXrGTNmTLXHGTFihOH6nDx5El9fX8NyZmZmlcGa\ns7MzlpaWREREGNJmZ2cb+qBZW1tTWFhoSJ+SkmK0r4WFBVFRUTWW73oeHh7ExcUZliu+v9G9njVr\nFiYmJpw+fZqcnBzWrVtXY3BXm9HmbGxs+OCDD4iOjiYsLIyPPvqI3377DV9f32o/8zeTD19fX8LD\nww3lycrKorCwEE9PTzw8PIxGRSwsLCQjI+OGeb6eBEzXOXECHn30xunKa5fesvEhbX0q3i96s/rA\nyyhZCvsvm/Dss88apS8uhq++0g9TXk4GexBCCCEEQPv27fHw8GDmzJkUFhZSXFzM/v37AQgODua/\n//0vMTEx5OfnM2vWLIYPH45arWbPnj2cOnUKrVaLra0tpqamN93/xsPDg969ezN9+nTDX/Ojo6MN\ncyFVZ8uWLYb+IA4ODqhUqiprC24U0NRWfn4+5ubmODk5UVBQwKxZs254HkVRDOvd3NzIyMgwBCvl\nxowZw6pVqwgLC6v1nE+1LZNarWbChAlMmzbNMBhHYmIiO3fuBKBVq1acOXOGEydOUFxcbNRPR61W\nM27cOKZPn05ycjJarZYDBw5QWlpa4zmHDh3Kp59+SmJiIllZWSxcuNCw7Ub3Oj8/H2tra+zs7EhM\nTGTRokX/+Dps376dqKgoFEXBzs4OExMTTExMCAoKqvYzfzP5mDhxIrNmzTIEhmlpaYSFhQEwePBg\ntm3bxr59+ygtLWXOnDl/a/RECZiuc+4cNGly43RhGRmUKgptQotxHepKiVMJDRLXELbUguemvYit\nra1R+k2b4IEHrh07KS+J/fH7earZU3VQCiGEEELcTdRqNT/++CNRUVH4+vri4+NjGIxg3LhxjB49\nmocffpiAgACsrKxYvHgxoK+RGDJkCPb29gQGBtKtW7cqf/RXNfdMxeW1a9dSWlpKYGAgTk5ODBky\nxKi2oypHjhyhQ4cO2Nra8vjjj/Ppp5/i7+9f6djXn/tGeaku32PGjMHPzw8vLy+aN2/OQw89VKvj\nlq9r2rQpwcHBBAQE4OTkZChfp06dUKvVtGnTxqgp243Udi6f9957j0aNGtGhQwfs7e3p1asXFy5c\nAOD+++9nzpw59OzZkyZNmtClSxej437wwQe0aNGCdu3a0aBBA1577TVDkFLd+SdMmMCjjz5Kq1at\naNu2LU899VSt7/XcuXM5evQo9vb2PPbYY5X2reoa3Og6REZG0qtXL2xtbenYsSPPPfccXbt2rfEz\nfzP5mDp1KgMHDqR3797Y2dnx0EMPcfiwvrtLYGAgn332GSNGjMDT0xMnJ6ebuseGciq1CA21Wi1t\n27bF29ubH3/8kczMTIYNG0ZsbCz+/v5s3rwZBwcHABYsWMDKlSsxMTHh008/NbRX/OuvvwgJCaG4\nuJh+/frxySefVJ0hleqW/SXiZmm1YGOjH1K8pv5LOkXhgSNHeMfZF6d2UTx4+EG+jH8Zr8jPeOZF\nayJjYo3aRyoKtGsH8+bBgAH6de/98R6RmZF8NbDmEWiEEOJG6vO5KcTdRL4rojo9e/ZkxIgRjBs3\nrr6zIupJTc+HWtUwffLJJwQGBhoiu4ULFxqi40ceecRQ1RcREcGmTZuIiIggPDycyZMnG048adIk\nVqxYQWRkJJGRkUZj/98pYmPBze3Ggz1sunwZKxMTWm4qxvFRR3TeOqxiv2THp+aMe+bZSp3JDh6E\nrCzo21e/rCiKNMcTQgghhLgD/Pnnnxw9epRhw4bVd1bEHeqGAVNCQgI7duzg6aefNgQ/YWFhjB07\nFoCxY8eydetWAH744QeCg4MxNTXF39+fRo0acejQIZKTk8nLyyMoKAjQV6mW73MnOXcOmjatOU2Z\nojA3JoZ33P1I/DgR35m+rPlzPq6qK2y9aML0GTMq7bNkCTz3HJQ3KT6YcBAFhY4+HeugFEIIIYQQ\nt8bEiROxtbWt9Jo8eXJ9Z+2WGDt2LL169eLjjz/G2tq6vrNz13r33Xer/Jz079+/vrN2S9xwWPEX\nX3yRRYsWGXWQS01Nxc3NDdB3oEtNTQUgKSmJDh06GNJ5e3uTmJiIqamp0cghXl5eJCYmVnvOih3e\nunXrRrdu3WpdoH+iNv2X1qSk4G1uTtOtxWQG2aJppkEJ/YRfPjFj6IiReHp6GqVPSYEdO+Czz66t\nW3V8FSGtQmrd9lUIISras2cPe/bsqe9sCCHuAV988QVffPFFfWejzqxZs6a+s/CvMGvWrEqDcPyb\n1Bgwbdu2DVdXV1q3bl3tf8616ex1s6qbybeunTsHrVtXv71Ep+PNmBg23N+M+EXnaBbajHV/vYef\nRSlzz1txeMvMSvssWwbDhsHVLl4UXinkm4hvODWp5qE6hRCiOtf/IWn+/Pn1lxkhhBDiX67GgGn/\n/v2EhYWxY8cOiouLyc3NZfTo0bi5uZGSkoK7uzvJycmGyce8vLyMxjpPSEjA29sbLy8vw7CT5eu9\nvLzqqEh/3/nzEBxc/fYvk5JoYWPDfT+VkOxngWWQJflfv8fvSzX0eWwgAQEBRulLS/UB088/X1v3\n3dnvaO/dHi+7O6/8QgghhBBCCGM19mF69913iY+P59KlS2zcuJEePXqwbt06Bg4caKjCXLNmDU88\n8QQAAwcOZOPGjZSWlnLp0iUiIyMJCgrC3d0dOzs7Dh06hKIorFu3zrDPnaSmPkwFWi0L4uJ4y8+f\n2AWx+L7mS+ixT2hqU8S6M+bMfP31Svt8+62+iV+LFtfWyWAPQgghhBBC3D1u2IepovKmdzNnzmTo\n0KGsWLHCMKw46Mc6Hzp0KIGBgWg0Gj7//HPDPp9//jkhISEUFRXRr18/+vTpc4uL8s9kZkJREbi7\nV719SWIine3t8dldQoyFGtuetqSGvsnFlSZ0eLgbzZs3r7TP4sXw0kvXlmOyYziRcoKBTQbWUSmE\nEEIIIYQQt1Kt5mG6neprjoQDB2DqVLg6z5WRnLIyGh86xO8PPEBhj3P4vuzLL4024Rw3hQljbNn8\n8y+0b9/eaJ+//oJBg+DiRdBcDUvn75lPWmEaS/otuQ0lEkLcK2RuGSFqR74rQojq/ON5mO4F589X\n3xzvo/h4+jVogPuhUsqyy3B6womLp2dzdKkJjVu1rhQsgb52afLka8GSTtGx+sRqaY4nhBBCiNui\nX79+rFu3rl7ObWtrS0xMzN/at3nz5uzduxfQDwQ2evTov52PSZMm8fbbb//t/f/tunXrxooVKwD4\n+uuvefTRR2/5OdRqNRcvXrzlx72dbqpJ3r9Zdf2X0q9cYUliIkfatCFuygV8Z/qy9dxa2jtk8/yf\n9izdPLfSPmlpsHUrREVdW/d7zO/YmtnyoMeDdVgKIYQQQgi9HTt21Nu58/Ly/va+p0+fNrz/pyMx\nL1261PB+z549jB492miAsntdxdGuR44cyciRI+s5R3cmqWG6qro5mN6Li2OYqysNTl+h8HwhriNc\nOXXyVc6sVOPoG0D37t0r7bN8OTz5JDg7X1tXPtiDzL0khBBCCFE7/6QJpU6nu4U5MRYTE0PDhg3r\n7PhVURRFmpTWEwmYrqqqhimppISVycm84edH3II4fGb4sOPiFjrZp7F6nx2vz59fKQAqK4OlS2HK\nlGvrcktyCTsfxqiWo25DSYQQQghxN4qPj+fJJ5/E1dUVZ2dnplz9MaHT6Xj77bfx9/fHzc2NsWPH\nkpubC0BxcTGjRo3C2dkZR0dHgoKCSEtLA4ybW61evZrOnTvz8ssv4+TkREBAAOHh4YZz5+TkMH78\neDw9PfH29mb27Nk3DDiioqLo2rUrDg4OuLi4MHz4cMO2is2wQkJCmDx5Mv369cPW1pYuXbqQkpLC\n1KlTcXR0pFmzZhw/ftywr7+/P7/99luV5xwyZAgeHh44ODjQtWtXIiIiDNtCQkKYNGkS/fr1w8bG\nht27dxMSEsLs2bMpLCykb9++JCUlYWtri52dHcnJyVhZWZGZmWk4xtGjR3F1dUWr1d74htVSSEgI\nzz33HAMGDMDOzo4OHToYNVHbv38/7dq1w8HBgaCgIA4cOGDY1q1bN9544w06deqEjY0NFy9eRK1W\ns3TpUho3boydnR1z5swhOjqahx56CAcHB4YPH86VK1cAyM7OZsCAAbi6uuLk5MRjjz1GYmJilflc\nvXo1Xbp0AfTB2Ysvvoibmxv29va0bNmSM2fOAFBSUsJLL72En58f7u7uTJo0ieLiYsNxFi1aZPgc\nrVy58pZdx/okARNw5QrExkKjRsbr346NZZyHB/YXy8jZl4P7eHcOn5hB9AYTdI5u9O/fv9Kxtm4F\nPz/jCXA3n9lM94bdcbF2qeOSCCGEEOJupNVqGTBgAA0bNiQ2NpbExESCr04OuXr1atasWcOePXu4\nePEi+fn5PP/884B+epfc3FwSEhLIzMxk2bJlWFhYAMbNrQAOHz5M06ZNycjI4JVXXmH8+PGGbSEh\nIZiZmREdHc2xY8fYuXMnX331VY15nj17Nn369CE7O5vExEReeOGFatNu2bKFd955h/T0dMzMzOjQ\noQPt2rUjMzOTwYMHM336dEPamlrj9O/fn6ioKNLS0njwwQcrNSHbsGEDs2fPJj8/n86dOxuugZWV\nFeHh4Xh6epKXl0dubi4eHh50797dMNozwLp16wgODsbExKTGst+sTZs2MW/ePLKysmjUqBGvX52O\nJjMzk/79+zNt2jQyMzOZPn06/fv3Jysry7Dv+vXr+eqrr8jLy8PX1xeAnTt3cuzYMQ4ePMh7773H\nhAkT2LBhA3FxcZw6dYoNGzYA+mB7/PjxxMXFERcXh6WlpeGzU5OdO3fyv//9j8jISHJyctiyZQsN\nGjQA9KNlR0VFceLECaKiokhMTOTNN98EIDw8nA8//JBff/2VCxcu8Ouvv97S61hfJGBCP5KdtzeY\nm19bd6moiE2XL/Oqry/x78XjPcWb3ck/8bBdMut+s+O1uXNRqytfviVLjGuXQOZeEkIIIe4aKtWt\ned2kw4cPk5yczKJFi7C0tMTc3JyOHTsC+s74M2bMwN/fH2traxYsWMDGjRvRarWYmZmRkZFBZGQk\nKpWK1q1bY2trW+U5/Pz8GD9+PCqVijFjxpCcnMzly5dJTU3lp59+4r///S+Wlpa4uLgwbdo0Nm7c\nWGOezczMiImJITExETMzM0N+K19SFU8++SStW7fG3NycQYMGYW1tzahRo1CpVAwdOpRjx47V6jqF\nhIRgbW2Nqakpc+fO5cSJE0b9pZ544gkeeughAMyv/rArb8ZWVXO2MWPGsH79ekAftG7cuPEfDTJR\nlfLyt23bFhMTE0aOHGmoUdu+fTtNmjRh5MiRqNVqhg8fTtOmTQkLCzPsGxISQrNmzVCr1ZiamgLw\nyiuvYGNjQ2BgIC1atKBv3774+/tjZ2dH3759DdfTycmJQYMGYWFhgY2NDbNmzeL333+/YZ5NTU3J\ny8vj7Nmz6HQ6mjRpgru7O4qisHz5cj766CMcHBywsbHhtddeM3xWNm/ezLhx4wgMDMTKyor58+ff\n0mtZXyRgour+S/NjY3neywubJC3pYel4PufJ7mMvkPCDmlSNDUOGDKl0nJMnITJS33+p3Pn081zM\nukjfRn3ruBRCCCGE+McU5da8blJ8fDx+fn5V/jE2OTkZPz8/w7Kvry9lZWVcvnyZ0aNH8+ijjzJ8\n+HC8vLx49dVXKSsrq/Ic7hUmm7SysgIgPz+f2NhYrly5goeHB46Ojjg6OjJx4kRD077qvP/++yiK\nQlBQEM2bN2fVqlXVpnV1dTW8t7CwMFq2tLQkPz+/xnOBPqCZOXMmjRo1wt7e3tCHKD09HdAHFz4+\nPjc8TkWPP/44ERERxMTE8Msvv2Bvb0/btm2rTBsaGmq4Pq1atSIuLs6w7OTkREJCQrXncXNzM7yv\nWN6kpCRDrVE5Pz8/kpKSDMtVlen641V3/MLCQp599ln8/f2xt7ena9eu5OTk3LAvVI8ePXj++ed5\n7rnncHNz49lnnyUvL4+0tDQKCwtp06aNoex9+/Y13IPk5GSj/F5ftruVBExUHlL8bEEBOzIymO7j\nQ/wH8XhM8GB/9h66WsURut2OV2fPRqOpPMDgkiUwcSJcDf4BWH1iNaNajsLUxLRSeiGEEEII0P8o\njouLq7LvjKenp9EQ3XFxcWg0Gtzc3NBoNMyZM4czZ86wf/9+tm3bxtq1a2/63Obm5mRkZJCVlUVW\nVhY5OTmcOnWqxv3c3Nz48ssvSUxMZNmyZUyePLlOh48ODQ0lLCyMXbt2kZOTw6VLl4AbDwxR3sSv\nqqZ+FhYWDBkyhPXr17N+/XrGjBlT7XFGjBhhuD4nT57E19fXsJyZmYm3t/dNl8nLy4vY2FijdbGx\nsXh5eVXK/9/x4YcfcuHCBQ4fPkxOTg6///57rQePmDJlCkeOHCEiIoILFy6waNEiXFxcsLS0JCIi\nwlD27OxsQ586Dw8P4uLiDMeo+P5uJgETlQd8mBsTwwwfHywzdaR+nYrPiz6E/zWFjN1qzpZqqvwy\nZWbCli0wYcK1dWW6MtYcXyPN8YQQQghRo/bt2+Ph4cHMmTMpLCykuLiY/fv3AxAcHMx///tfYmJi\nyM/PZ9asWQwfPhy1Ws2ePXs4deoUWq0WW1tbTE1Nb7r/jYeHB71792b69Onk5eWh0+mIjo42zIVU\nnS1bthhqVRwcHFCpVFXWkN2qkd3y8/MxNzfHycmJgoICZs2adcPzVAwO3NzcyMjIMPy4LzdmzBhW\nrVpFWFhYrZvj3UyZakrbt29fLly4wIYNGygrK2PTpk2cO3eOAQMG3NS5Kqap+D4/Px9LS0vs7e3J\nzMysdRO5I0eOcOjQIa5cuYKVlRUWFhaYmJigUqmYMGEC06ZNM9RAJiYmsnPnTgCGDh3K6tWrOXv2\nLIWFhdIk79+kYpO8Y3l5/JGTw/NeXiR8koDrMFeOXvmTLuaRbP7GhhmvvWZoE1vRypXQvz9UqO1m\nZ/ROfOx9CHQJvE0lEUIIIcTdSK1W8+OPPxIVFYWvry8+Pj6GwQjGjRvH6NGjefjhhwkICMDKyorF\nixcDkJKSwpAhQ7C3tycwMJBu3bpV+aP/+gEgyteVW7t2LaWlpQQGBuLk5MSQIUNISUmpMc9Hjhyh\nQ4cO2Nra8vjjj/Ppp5/i7+9f6djXn/tGeaku32PGjMHPzw8vLy+aN2/OQw89VKvjlq9r2rQpwcHB\nBAQE4OTkZChfp06dUKvVtGnT5qaa9NW25qem8jZo0IBt27bx4Ycf4uzszAcffMC2bdtwcnKq9jxV\nnbe66zBt2jSKiopwdnamY8eO9O3bt1bXOjc3l2eeeQYnJyf8/f1xdnbm5ZdfBuC9996jUaNGdOjQ\nAXt7e3r16sWFCxcA6NOnD9OmTaNHjx7cf//9PPLII/+KKXVUyh02oLtKpbqtY8wrCjRooG+W5+IC\n06OicNRoeM3Rm4MBB2nzZxvePNGBNkfPMnmJNRfj47GxsTE6hlarH2Fv40Zo3/7a+iFbhvBIw0eY\n2HbibSuPEOLec7ufm0LcreS7IqrTs2dPRowYwbhx4+o7K6Ke1PR8uOdrmNLT9YPZlE8ye7qggDa2\ntiQtTaJB3wactTjDQyan+W69JVNefLFSsASwfbs+2KoYLGUUZvBL9C8Mbz68UnohhBBCCHFn+PPP\nPzl69CjDhg2r76yIO9Q9HzCV918qry2MKCykqdqShI8T8J3py5bDk9GdNeHndB3PXz9e+FWLF1ce\nSjz0VCj9GvfDwcKhjksghBBCCFE3Jk6ciK2tbaXX5MmT6ztrt8TYsWPp1asXH3/8MdbW1vWdHXGH\nuueb5C1fDgcO6PsgZZeV4XPgAGdPNCRrZxaq5XD+wAOEv2SJ05OTee/99yvtf/YsdO+un/i2Ytem\nB5c9yHs936PXfb1uW1mEEPcmaWYkRO3Id0UIUZ2ang+Vx8a+x1QcIS+ioID/mFmS8EECgRsDee/w\nYzyUYMK3KRBRYQbqipYs0Y+MVzFYOpFygvTCdHo07HEbSiCEEEIIIYSoK/d8wHT+PHTtqn8fUVhI\nv70mWDTUkNIohRZJ+/hlsRnBo0cbTfZWLicHQkPh9Gnj9auOr2LsA2MxUd/csJ5CCCGEEEKIO8s9\nHzBVrGE6U1BAxz+1uAZ7svTQ/9ExS836RDV/vfpqlfuuXg29e0OFucUo1ZYSeiqUA+MP1H3mhRBC\nCCGEEHXqnh70obgYEhKgYUP9ckRBAU4XtOQ2zKVx8S72fqRmwBNPGOYUqEin0zfHu36wh20XttHM\npTwb0aAAACAASURBVBn3Od1X9wUQQgghhBBC1Kl7uoYpKkofLJma6pfP5haguVDG5sJZtC9W83Kc\nKXu+eb3KfXfuBBsb6NTJeP2q46v4vwf+r45zLoQQQgghhLgd7ukapvPnrzXHyy4rwyq2DBM3EzxK\nwzi0SEXnHj1o1qxZlfuWDyVecfLilPwU/oj7g8GBg29D7sX/s3fnQVFdaePHv00LKkprAwqyNKCg\niIgQUeOuiaBBYxwxJi4savZxyqhvZpIYFdRRJz99UzGZjNExijJKpHRk1GhIJKj4RtAEUUNEXNiR\nBIILyE7//iDegLK0I4qB51NFVXffc+59bmvf6qfPOc8VQgghhBDiYWvTCVPt9Us/FhczPNuE/CeP\n4qhSsflqB95dtqzefpcuQUICzJhR9/UdSTv4g+sf6Gxy781thRBCCCEa4+joyJEjR1o6jAcWHBzM\n0qVLATh+/Diud75sNdG2Ndi2bRsjR4585H3Fw9XmE6Y+fWoe/3D7Nh5paioGRvHdh3r6eXszcODA\nevv9/e8wdy507Pjba3q9XqbjCSGEEOK/plKpUP06deX8+fOMHz+ebt26YWT0+/q6Vvs8Ro4cyYUL\nFwxqK8Tj6vf1CWxmd1fI013RY9o1hU+T2/Pu8uX19ikqgu3b4e4bXCdkJ1BRXcEI3YiHHLUQQggh\nWjsTExNefPFFtmzZct99g4ODCQsLewhRGe5+bhAsNxMWj7tGE6bS0lKGDBmCp6cnbm5uvPPOOwCE\nhIRgZ2eHl5cXXl5eHDp0SOmzZs0aXFxccHV1JTo6Wnn9u+++o3///ri4uLBgwYKHdDqG0+tr1jDd\nGWFKLi7GLKWUhMs3sLGybXBIdMcOGDUKHBzqvr71zFaCBwTLryRCCCGEeGC9e/dmzpw5uLm53Xff\n+/kucvLkSYYNG4ZWq8XT05OjR48q2+6eIhgSEkJAQIDyPC4uTumr0+nYvn37PfuPjY3F3t5eeZ6Y\nmMgTTzyBRqPhxRdfpLS0tE77AwcO4OnpiVarZfjw4Zw7d07ZtnbtWpydndFoNPTr1499+/Yp27Zt\n28aIESN46623MDc3p2fPnhw+fLjJ89+2bRu9evVCo9HQs2dPdu7cqWzbvHkzbm5uyvESExObjONu\nFy5cwMfHBwsLC1xdXYmMjFS2FRQUMHnyZLp06cKQIUO4fPlyk/GKltFolbwOHTrwzTffYGpqSmVl\nJSNGjCAuLg6VSsWiRYtYtGhRnfbJycl8/vnnJCcnk52dzbhx40hNTUWlUvH666+zZcsWBg8ejJ+f\nH4cPH2bChAkP9eQak5sLpqag1dY8v/xzMUbGaZz6FgID59Z7sdHra0qJf/RR3ddLKkrY/cNukl5L\negSRCyGEEOJhUcXGNst+9GPGNMt+/luGJE3Z2dlMmjSJ8PBwJkyYwNdff42/vz8pKSlYWFjcM12u\n9uP09HT8/PzYvHkz06ZN48aNG2RmZjZ6vPLycqZMmcKiRYuYP38++/btY8aMGbz99ttATTI1b948\nDhw4gLe3Nzt27GDy5MlcvHgRY2NjnJ2diYuLw9ramt27dzN79mwuX76MlZUVAAkJCcyZM4eCggI+\n/fRT5s2bR3Z2doPxFBcXs2DBAk6fPo2Liwt5eXkUFBQAEBkZSWhoKFFRUQwcOJDLly9j/GtZ5abi\nqL1/Hx8fVq1axZdffsnZs2fx8fHB3d2dvn378sc//hFTU1OuXbvGlStXGD9+PD179mzy3008ek1O\nyTM1NQVq/pNXVVWh/TXDqG/4NCoqihkzZmBsbIyjoyPOzs7Ex8eTm5vLrVu3GDx4MACBgYGNZuOP\nQu31S9crK+maWknloHNcSgHvcePq7RMTU1MVb+zYuq//+8K/GWQ7CPsu9vX2E0IIIcTvg37MmGb5\na9Fz0OsNmuYWHh6On5+f8gP2uHHj8Pb25uDBgw3u946dO3fi4+PDCy+8gFqtxtzcnAEDBjR6vJMn\nT1JZWcmCBQtQq9X4+/szaNAgZfumTZt49dVXGTRoECqVisDAQNq3b8+3334LwLRp07C2tgZg+vTp\nuLi4EB8fr/R3cHBg3rx5St/c3Fx++umnRmMyMjLi3LlzlJSUYGVlpYzo/fOf/+Qvf/mLsp69V69e\n6HQ6g+K448CBAzg5OREUFISRkRGenp5MnTqVyMhIqqqq2Lt3LytWrKBjx47069ePoKAgmZ74mGoy\nYaqursbT0xMrKyvGjh1Lv379APjoo48YMGAA8+bN4/r16wDk5ORgZ2en9LWzsyM7O/ue121tbRvN\n+ENCQpS/2Gb6pedud1fIezLTmGLdKTLzwb1//3r7fPQRzJ9ft5Q4yL2XhBCPVmxsbJ3rpBBCeHh4\noNVq0Wq17Nq1izfeeEN5Pn/+/Hr7pKenExkZqbTTarWcOHGCa9euNXm8zMzM+x4NycnJwdbWts5r\nDrXWOKSnp7N+/fo68WRlZZGbmwvA9u3b8fLyUradP39eGREClCQGfvvBv6ioqMF4OnXqxOeff87G\njRuxsbFh0qRJpKSkAJCVlUWvXr3q7ddUHLXPJz4+vs757Ny5k7y8PPLz86msrKwzXfFOQiYeP03e\nuNbIyIgzZ85w48YNxo8fT2xsLK+//jrLfi25vXTpUhYvXvxfLUpsyKP4AlD7Hkw/3L5Nv3Q1GbY/\n4NStM+3bt7+nfVoaHD8O4eF1X8+4kcH3ud+zf8b+hx6zEEIAjBkzhjG1fsEODQ1tuWCEEI+Fs2fP\nKo/nzJnD2LFjCQwMbLSPTqcjICCATZs21bu9U6dOFBcXK8+vXbumTMvT6XQkJCQ0uO/6pgT26NHj\nnh/M09PTcXZ2Vva5ZMkS3n333Xv6pqen88orrxATE8PQoUNRqVR4eXk98IiMr68vvr6+lJWVsWTJ\nEl5++WWOHTuGvb09ly5deqA4dDodo0ePrrOm/46qqiratWtHRkYGfX6d8pSRkfFA5yIeHoOr5HXp\n0oWJEydy+vRpunfvrsxrfemll5QPjK2tbZ35q1lZWdjZ2WFra0tWVlad1+/+heFRu7tCnu2lStJu\n/YJ3H/d623/yCQQFQee7brEUdiaMF/q9QId2HR5yxEIIIYRoS0pLSykvLwegrKyMsrIyg/sakkjM\nnj2b/fv3Ex0dTVVVFaWlpcTGxipJjaenJxEREVRWVnL69Gn27Nmj9J05cyZff/01kZGRVFZWUlBQ\nQFJSknLs+o4/dOhQ2rVrx4YNG6ioqGDv3r2cOnVK2f7yyy+zceNGEhIS0Ov1FBcXc/DgQYqKiigu\nLkalUmFpaUl1dTVbt27l/PnzBr8f9fnpp5+IioqiuLgYY2NjOnXqhFqtBuCll15i3bp1fP/99+j1\nei5dukRGRsZ9xTFx4kQuXrxIeHg4FRUVVFRUcOrUKS5cuIBarWbq1KmEhIRQUlJCcnIyYWFhUjzs\nMdVowpSfn69MtyspKeGrr77Cy8urzlDtv//9b/r/OoVt8uTJREREUF5eztWrV0lNTWXw4MFYW1uj\n0WiIj49Hr9ezY8cOpkyZ8hBPq2m11zAlFxXR6adsLl2uZvAo33va3r4Nn30Gf/xj3der9dVsS9rG\nXK+5jyBiIYQQQrQVaWlpmJqa4u7ujkqlomPHjvTt29fg/oZ88bazsyMqKorVq1fTvXt3dDod69ev\np7q6GoCVK1dy+fJltFotISEhzJo1S+mr0+n44osvWL9+PRYWFnh5eSmjXA0VizAxMWHv3r1s27YN\nCwsLdu/ejb+/v9Ju4MCBbN68mfnz52Nubo6Li4tSec/NzY3FixczdOhQrK2tOX/+PCNGjKhzjLvP\nuan3oLq6mg8++ABbW1ssLCw4fvw4//jHP4CadUpLlixh5syZaDQapk6dSmFh4X3FYWZmRnR0NBER\nEdja2tKjRw/eeecdJQn++OOPKSoqwtramrlz5zJ3rnyffFyp9I38BHHu3DmCgoKorq6murqagIAA\n3nrrLQIDAzlz5gwqlQonJyc+/fRTpTLI6tWr+eyzz2jXrh0ffvgh48ePB2rKigcHB1NSUoKfnx8b\nNmyoPyCV6qEveCsuhm7d4NYtUKvBY9//8b//OMKfkpfxWUQcQ4cPr9N+yxb497/hwIG6+zmadpT5\nh+Zz9rWz8ouAEKLFPIrrphCtgXxWhBANaez60GjC1BIexcXszBkIDISzZ2sq5E353//jf7L+l+f/\nEUX+9SI6deqktNXrwcsL/vY3+DX3UwTvC8bDyoNFQxchhBAtRb4ECmEY+awIIRrS2PXB4DVMrcnd\nFfIGZ7Yjw/h7bLUd6iRLAHFxUFICPj5193Gr7BZRKVHM9pj9iKIWQgghhBD3q3PnzpiZmd3zd+LE\niZYOTfxONFklrzWqvX7ph9u3cb1qRLL9NTydXe9p+9FHNWuXjO5KLXf/sJvRDqPp3qn7I4hYCCGE\nEEL8NxorLS6EIdrkCFPtkuLJxcV0yy7gclYFw0dOqNMuKwu+/hqCg+/dh9x7SQghhBBCiNavTSZM\ntafkXSgswtQkhcvnYeCEZ+q027gRZs4EjaZu/4sFF0n9JRU/F79HFLEQQgghhBCiJbS5KXnV1XDx\nIvTuXfP8+o/FVPQ7S2oieA4cqLQrLYXNm+Ho0Xv3se3MNmZ7zMZYbfyIohZCCCGEEEK0hDaXMGVm\nglYLZmZwo7IS89RKMs0S6G5mgqbWUNLu3TBgwG8jUXdUVVexPWk7h2cffsSRCyGEEEIIIR61Njcl\n7+71SwMz2nG5LJ3+TvZKG72+ptjDn/50b/+vrnxFD7MeuHd3f0QRCyGEEKItcHR05MiRIy0dxmMh\nNjYWe/vfvpu5u7tz7NixZj1GSEgIAQEBzbpP0Tq1uYSp9vqlH27fxiWzlEt5txk+1FdpEx8PBQXg\nV88SJSn2IIQQQoiHQaVSoVKpADh//jzjx4+nW7duGN1dqrcNOn/+PKNGjWrWfd55r4VoSpv7BNYu\nKZ5cXIxlaQqXf4BBfs8qbe6UEler6/b9peQXvrz0JTPcZzzCiIUQQgjR1piYmPDiiy+yZcuW++4b\nHBxMWFjYQ4iqYZWVlY/0eEI8Sm0yYbozwnQ5+xZq6xRSM8Br8GAArl2DL76AuXPv7bvr3C4mOE9A\n21H7CCMWQgghRFvTu3dv5syZg5ub2333NXTkJC0tDSMjI7Zv346DgwPdunVj9erVyvaysjLefPNN\nbG1tsbW1ZeHChZSXlwM1U+bs7Ox4//336dGjB3PnziU0NJTnn3+egIAANBoNHh4epKamsmbNGqys\nrHBwcOCrr75S9r9161bc3NzQaDT06tWLTZs2NRiro6MjMTExACQkJODt7U2XLl2wtrZm8eLFSruT\nJ08ybNgwtFotnp6eHK1Vvevq1auMHj0ajUaDr68v+fn5hr2hos1rcwlT7TVMt8/fJqtHPJoOaiws\nLAAIC4Np02oKQ9xNpuMJIYQQ4vfgfqabnThxgosXL3LkyBFWrFhBSkoKAH/9619JSEggKSmJpKQk\nEhISWLVqldIvLy+PwsJCMjIy2LRpE3q9ngMHDhAYGEhhYSFeXl74+PgAkJOTw9KlS3n11VeV/lZW\nVhw8eJCbN2+ydetWFi5cSGJiYpPns2DBAhYuXMiNGze4cuUK06dPByA7O5tJkyaxbNkyCgsLWbdu\nHf7+/hQUFAAwc+ZMBg0aREFBAUuXLiUsLEym5QmDtKkqeTdvwo0bYGtbUyHP8mIlVypS6OdgrbSJ\ni4OgoHv7nss7R15xHuN6jnuEEQshhBDiUYpVxTbLfsboxzTLfv4ber0evV5vcPvly5fTvn17PDw8\nGDBgAElJSfTp04edO3fy8ccfY2lpqbR79dVXWbFiBQBGRkaEhoZibGyMsXHNrVZGjRqlJEnTpk1j\n7969vP3226hUKl544QVeeeUVbt68iUajwa/WYvFRo0bh6+vL8ePH8fLyajReExMTUlNTyc/Px9LS\nkiFDhgAQHh6On58fEyZMAGDcuHF4e3tz8OBBxowZw+nTp4mJicHY2JiRI0fy7LPP3tf7JNquNpUw\npaTU3H/JyAiSbxXjmakn0egGT3rXfGD1ejh1Cv7+93v7bj2zlcABgaiN1PduFEIIIUSr0JKJzoPw\n8PAgMzMTgNu3bxMZGcmbb74JwKxZs/j4448b7Gtt/dsPx6amphQVFQE1o0IODg7KNp1OR05OjvK8\nW7dumJiY1NlX9+7dlccdO3bE0tJSGcXp2LEjAEVFRWg0Gg4dOkRoaCipqalUV1dz+/ZtPDw8mjzX\nLVu2sGzZMvr27YuTkxPLly9n4sSJpKenExkZyf79+5W2lZWVPPXUU+Tk5KDVapUYABwcHJT3TIjG\ntKmE6e4Keb2K0ojMhqCV/gBkZdUkTbWqWAJQUVXBv879i7g5cY84YiGEEEKIpp09e1Z5PGfOHMaO\nHUtgYOAD7dPGxoa0tDT69u0LQEZGBjY2Nsr2u6ez3c/0trKyMvz9/QkPD+e5555DrVbzhz/8waAR\nH2dnZ3bu3AnAnj17mDZtGgUFBeh0OgICAupdC5Wenk5hYSG3b9/G1NRUeU19d4UvIerRptYw1bkH\n060iurS7wMUrep4YPhyoGV0aNAju/rwfTD1Ib4veuFi4POKIhRBCCNFWlZaWKkUWysrKKCsrM7hv\nc0w1mzFjBqtWrSI/P5/8/HxWrFjR6H2L7ueY5eXllJeXY2lpiZGREYcOHSI6OtqgvuHh4fz8888A\ndOnSBZVKhVqtZvbs2ezfv5/o6GiqqqooLS0lNjaW7OxsHBwc8Pb2Zvny5VRUVBAXF8eBAwcMjle0\nbW0qYao9wpSTcotrNt/RwdgIKysr4LeE6W5S7EEIIYQQj1JaWhqmpqa4u7ujUqno2LGjMtJjCENH\nexpr99577+Ht7Y2HhwceHh54e3vz3nvvNdi39n2kGmsDYGZmxoYNG5g+fTrm5ubs2rWL5557zqDY\nvvzyS9zd3TEzM2PhwoVERETQvn177OzsiIqKYvXq1XTv3h2dTsf69euprq4GYOfOncTHx2Nubs6K\nFSsIqm/RuhD1UOkfs9VuKpXqoS3Ac3eHf/0LBgyAKWvi8LwynZgTFRxLrvmVYtw4WLSo7g1r84ry\n6PNxHzIXZmLW3uyhxCWEEA/iYV43hWhN5LMihGhIY9eHNjPCVFUFly+Di0tNhbxuqZVcupnHQI+a\n+y9VV8Pp0/eOMIWfDWeK6xRJloQQQgghhGiD2kzClJYG1tZgagrJxcU8cf0aly7qGT1pBgCpqdC1\nK3Tr9lsfvV4v0/GEEEIIIYRow9pMwlR7/VLy7dvYVv/IxVQ9A0ePBupfv3Q65zQllSWMchj1iKMV\nQgghhBBCPA7aVMLUp8+vj3++RWmnc6BXYWdnB9QkTIMH1+2z9cxWggcEy12ghRBCCCGEaKPaVMJ0\nZ4Tp53O3SOmQRG9bjZIM3T3CVFpZyuc/fE6Qp1RQEUIIIYQQoq1qMwlT7XswVf5QwuWiLDz69geg\nogLOnoWBA39rv+/CPgb2GIiui64FohVCCCGEEEI8DhpNmEpLSxkyZAienp64ubnxzjvvAPDLL7/g\n4+ND79698fX15fr160qfNWvW4OLigqura50bkH333Xf0798fFxcXFixY8JBOp2F3RphuVFZil/kT\nqVcrGPNMTcGHH34AnQ7MahXCk2IPQgghhBBCiEYTpg4dOvDNN99w5swZzp49yzfffENcXBxr167F\nx8eHixcv8vTTT7N27VoAkpOT+fzzz0lOTubw4cO88cYbSj3z119/nS1btpCamkpqaiqHDx9++Gf3\nq4ICKCsDK6uaCnnulamkXoQnfScA907Hy7yRyemc00xxnfLIYhRCCCGEEEI8fpqckmdqagpAeXk5\nVVVVaLVa/vOf/yh3Rw4KCmLfvn0AREVFMWPGDIyNjXF0dMTZ2Zn4+Hhyc3O5desWg3+tqhAYGKj0\neRTuTMdTqWoSJmPOUlIKTk5OACQk1E2YtidtZ3q/6XQ07vjIYhRCCCGEEEI8fppMmKqrq/H09MTK\nyoqxY8fSr18/8vLysLKyAsDKyoq8vDwAcnJylKpzAHZ2dmRnZ9/zuq2tLdnZ2Q0eMyQkRPmLjY39\nb89NUXv90qWrt7hqnERvm471FnyQey8JIR53sbGxda6TQojWwdHRkSNHjrR0GA8sODiYpUuXAnD8\n+HFc73wJa6Jta7Bt2zZGjhz5yPuKh6tdUw2MjIw4c+YMN27cYPz48XzzzTd1tqtUqmYvu93cXwBq\nV8grPHuLn8rScHNxAeD2bbh4EQYMqNl+POM47du1Z5DNoAb2JoQQLWvMmDGMGTNGeR4aGtpywQgh\nmk3t71RhYWF89NFHpKamotFomDlzJqtXr0atVrdwlE2rfR4jR47kwoULBrUV4nFlcJW8Ll26MHHi\nRL777jusrKy4du0aALm5uXTv3h2oGTnKzMxU+mRlZWFnZ4etrS1ZWVl1Xre1tW2uc2hS7XswqVPy\nuZRzm+HjpgJw5gy4uUGHDjXbI5Mjmd1/tnx4hRBCCNFiSkpK+PDDDykoKCA+Pp4jR46wbt06g/oG\nBwcTFhb2kCNs3J017M3dVoiW0GjClJ+fr1TAKykp4auvvsLLy4vJkycrH8SwsDCmTKkpjjB58mQi\nIiIoLy/n6tWrpKamMnjwYKytrdFoNMTHx6PX69mxY4fS51G4MyXvRmUlTrcucukCjH12OnBvwYeY\nqzH49vJ9ZLEJIYQQQtzttddeY/jw4bRr1w4bGxtmzZrFiRMnDOp7Pz/6njx5kmHDhqHVavH09OTo\n0aPKtrunCIaEhBAQEKA8j4uLU/rqdDq2b99+z/5jY2Oxt7dXnicmJvLEE0+g0Wh48cUXKS0trdP+\nwIEDeHp6otVqGT58OOfOnVO2rV27FmdnZzQaDf369auzHn7btm2MGDGCt956C3Nzc3r27GlQgbFt\n27bRq1cvNBoNPXv2ZOfOncq2zZs34+bmphwvMTGxyTjuduHCBXx8fLCwsMDV1ZXIyEhlW0FBAZMn\nT6ZLly4MGTKEy5cvNxmvaBmNTsnLzc0lKCiI6upqqqurCQgI4Omnn8bLy4vp06ezZcsWHB0d2b17\nNwBubm5Mnz4dNzc32rVrxyeffKJ8aD/55BOCg4MpKSnBz8+PCRMmPPyzo+YeS+np0KsXfF9cTPeK\nsxTeBJfevYGahOmpp2raXiu6Ru6tXDytPR9JbEIIIYR4vMTGNs8MkzFjmnfU5OjRo7i7uxvc3pCk\nKTs7m0mTJhEeHs6ECRP4+uuv8ff3JyUlBQsLi3umy9V+nJ6ejp+fH5s3b2batGncuHGjziyj+pSX\nlzNlyhQWLVrE/Pnz2bdvHzNmzODtt98GapKpefPmceDAAby9vdmxYweTJ0/m4sWLGBsb4+zsTFxc\nHNbW1uzevZvZs2dz+fJlZV19QkICc+bMoaCggE8//ZR58+Y1uma+uLiYBQsWcPr0aVxcXMjLy6Og\noACAyMhIQkNDiYqKYuDAgVy+fBljY2OAJuOovX8fHx9WrVrFl19+ydmzZ/Hx8cHd3Z2+ffvyxz/+\nEVNTU65du8aVK1cYP348PXv2bPLfTbQA/WOmuUP68Ue93tm55vE/07P1/+9Fb31/+w7K9t699fqz\nZ2se7zy7Uz8lYkqzHl8IIR62x/BSLsRj6XH/rDg6OuqPHDlyz+tbtmzR29vb6wsKCgzaT1BQkH7b\ntm1Ntlu7dq0+ICCgzmvjx4/Xh4WF1RvP8uXL9bNnz9br9Xr96tWr9VOnTq13v8HBwfr33ntPr9fr\n9d98843ezs5Or9fr9UePHtXb2NjUaTts2DD90qVL9Xq9Xv/aa68pj+/o06eP/ujRo/Uex9PTUx8V\nFaXX6/X6rVu36p3vfOHT6/XFxcV6lUqlz8vLa/D8i4qK9F27dtXv2bNHf/v27TrbfH199Rs2bGiw\nb2NxjBgxQq/X6/URERH6kSNH1mn7yiuv6ENDQ/WVlZV6Y2NjfUpKirLt3XffVfqKR6+x64PBa5h+\nr2oXfMj44QapVZfp07OmYt/165CTA3371myPSYvhKcenWihSIYQQQoi69u3bx7vvvsuhQ4cwNzdv\nsJ2HhwdarRatVsuuXbt44403lOfz58+vt096ejqRkZFKO61Wy4kTJ5R16o3JzMy879GQnJyce9aw\nOzg41Iln/fr1deLJysoiNzcXgO3bt+Pl5aVsO3/+vDIiBGBtba08vnNbnKKiogbj6dSpE59//jkb\nN27ExsaGSZMmkZKSAtSst+/Vq1e9/ZqKo/b5xMfH1zmfnTt3kpeXR35+PpWVlXWmK+p0ugZjFS2r\nySp5v3e1S4oXnfuFSz9dZ/yI2QCcPg2entDu13fhyJUjvDnkzRaKVAghhBDiN4cPH+aVV17hiy++\noF+/fo22PXv2rPJ4zpw5jB07lsDAwEb76HQ6AgIC2LRpU73bO3XqRHFxsfL82rVryrQ8nU5HQkJC\ng/uub0pgjx497pkil56ejrOzs7LPJUuW8O67797TNz09nVdeeYWYmBiGDh2KSqXCy8vrgQtG+Pr6\n4uvrS1lZGUuWLOHll1/m2LFj2Nvbc+nSpQeKQ6fTMXr0aKKjo+/ZVlVVRbt27cjIyKDPr5XJMjIy\nHuhcxMPTpkaYzHKSSU1R4eMfDNQt+HC18CrFFcW4dXNrmUCFEEIIIX4VExPDrFmz2Lt3L97e3vfd\n35BEYvbs2ezfv5/o6GiqqqooLS0lNjZWSWo8PT2JiIigsrKS06dPs2fPHqXvzJkz+frrr4mMjKSy\nspKCggKSkpKUY9d3/KFDh9KuXTs2bNhARUUFe/fu5dSpU8r2l19+mY0bN5KQkIBer6e4uJiDBw9S\nVFREcXExKpUKS0tLqqur2bp1K+fPn7/v96W2n376iaioKIqLizE2NqZTp05K2faXXnqJdevW8f33\n36PX67l06RIZGRn3FcfEiRO5ePEi4eHhVFRUUFFRwalTp7hw4QJqtZqpU6cSEhJCSUkJycnJbHpz\nqQAAIABJREFUhIWFSZXmx1SbSJj69KmpkNet5Bw/FVTTv78HUDdh+ibtG55yekr+owohhBCixa1a\ntYpbt27xzDPPYGZmhpmZGRMnTjS4vyHfZ+zs7IiKimL16tV0794dnU7H+vXrqa6uBmDlypVcvnwZ\nrVZLSEgIs2bNUvrqdDq++OIL1q9fj4WFBV5eXsooV0PFIkxMTNi7dy/btm3DwsKC3bt34+/vr7Qb\nOHAgmzdvZv78+Zibm+Pi4qJU3nNzc2Px4sUMHToUa2trzp8/z4gRI+oc4+5zbuo9qK6u5oMPPsDW\n1hYLCwuOHz/OP/7xDwCmTZvGkiVLmDlzJhqNhqlTp1JYWHhfcZiZmREdHU1ERAS2trb06NGDd955\nh/LycgA+/vhjioqKsLa2Zu7cucydO7fJfzPRMlT6Bx3LbGYqlarZ6vHr9WBuDqmpcMnkJnGvTWRL\n7Cl+zKkpYWlvD998A87OMHvvbMY4juGlJ15qlmMLIcSj0pzXTSFaM/msCCEa0tj1oVWPMP38M6jV\nYGkJP+bcJK38Ei6O3QC4dg2Ki2vKjev1emKuxvCUkxR8EEIIIYQQQvymVSdMtdcvZSf+Qur1nxgw\nZBTw23Q8lQpSClIwUZvg1NWpBaMVQgghhBDNrXPnzsq0xtp/ht4IWIhWXSXvzvolAC4nczFFxZKQ\neUDd9Ut3Rpdk/ZIQQgghROvSWGlxIQzRZkaYOv6cSM61aoYMGg7UnzAJIYQQQgghRG2tOmG6cw+m\nG5WVlN34Dp2FCe3bt0evh4SEmoSpWl9NbFosYx3HtnS4QgghhBBCiMdMq06Y7owwJRcVk3frIr1s\nuwJw9Sp06AA2NnA27yyWppbYamyb2JsQQgghhBCirWm1CVNpKeTkgJMTXLxQSOqta7g+4QXIdDwh\nhBBCCCGEYVptwpSaWpMstWsHv5xLIfVyFWMmBwGSMAkhhBDi8ePo6MiRI0daOozHQmxsLPb29spz\nd3d3jh071qzHCAkJISAgoFn3KVqnVpsw3Vm/BKBP/5bMTD0+Tz0L1CRMgwdDRVUFxzOOM8ZxTMsF\nKoQQQghBzY0z71TsDQsLw9vbmy5dumBvb89f/vIXqqqqWjjClnP+/HlGjRrVrPuU6sjCUK02Yapd\nIa847zTWXU3o1KkTVVWQmAje3vBd7nc4dXXC0tSyZYMVQgghhKilpKSEDz/8kIKCAuLj4zly5Ajr\n1q0zqG9wcDBhYWEPOcK6KisrH+nxhHiUWnXC1KdPTYW8/BsX6GVlprxuZQVaLRy5ckSm4wkhhBDi\nsfPaa68xfPhw2rVrh42NDbNmzTL4RquGjpykpaVhZGTE9u3bcXBwoFu3bqxevVrZXlZWxptvvomt\nrS22trYsXLiQ8vJyoGbKnJ2dHe+//z49evRg7ty5hIaG8vzzzxMQEIBGo8HDw4PU1FTWrFmDlZUV\nDg4OfPXVV8r+t27dipubGxqNhl69erFp06YGY3V0dCQmJgaAhIQEZfTN2tqaxYsXK+1OnjzJsGHD\n0Gq1eHp6cvToUWXb1atXGT16NBqNBl9fX/Lz8w16n4Ro1QmTqyskFxRxtTAHF/fewF3rl9Jk/ZIQ\nQgghHn9Hjx7F3d3d4Pb3M93sxIkTXLx4kSNHjrBixQpSUlIA+Otf/0pCQgJJSUkkJSWRkJDAqlWr\nlH55eXkUFhaSkZHBpk2b0Ov1HDhwgMDAQAoLC/Hy8sLHxweAnJwcli5dyquvvqr0t7Ky4uDBg9y8\neZOtW7eycOFCEhMTmzyfBQsWsHDhQm7cuMGVK1eYPn06ANnZ2UyaNIlly5ZRWFjIunXr8Pf3p6Cg\nAICZM2cyaNAgCgoKWLp0KWFhYTItTxikVSZMen3NGqY+feDK96mkZpQyaNILwG/3XyqtLCU+K55R\nDs07H1YIIYQQv1931hE96F9z+uyzz/j+++/5n//5H4Pa6/V69Hq9wftfvnw57du3x8PDgwEDBpCU\nlATAzp07WbZsGZaWllhaWrJ8+XJ27Nih9DMyMiI0NBRjY2M6dOgAwKhRo/Dx8UGtVjNt2jQKCgp4\n++23UavVvPDCC6SlpXHz5k0A/Pz8cHJyUvr5+vpy/PjxJuM1MTEhNTWV/Px8TE1NGTJkCADh4eH4\n+fkxYcIEAMaNG4e3tzcHDx4kIyOD06dPs3LlSoyNjRk5ciTPPvvsfb1Pou1qlQlTTg507gxdu8LN\nc8e4ehUm+80Afhth+jbzW9y7u6Npr2nhaIUQQgjxuLiTbDzoX3PZt28f7777LocOHcLc3LzBdh4e\nHmi1WrRaLbt27eKNN95Qns+fP7/RY1hbWyuPTU1NKSoqAmpGhRwcHJRtOp2OnJwc5Xm3bt0wMTGp\ns6/u3bsrjzt27IilpaWSQHbs2BFA2f+hQ4d48sknsbCwQKvV8sUXXyijQY3ZsmULFy9epG/fvgwe\nPJiDBw8CkJ6eTmRkpHLeWq2WEydOcO3aNXJyctBqtUoMQJ1zE6Ix7Vo6gIfhzvolgIL0E1ho2tNN\n242yMvjhB/DygrUJMh1PCCGEEI+vw4cP88orr/DFF1/Qr1+/RtuePXtWeTxnzhzGjh1LYGDgAx3f\nxsaGtLQ0+vbtC0BGRgY2NjbK9rtH0u5nZK2srAx/f3/Cw8N57rnnUKvV/OEPfzAo2XR2dmbnzp0A\n7NmzRxnJ0ul0BAQE1LsWKj09ncLCQm7fvo2pqanymlqtNjhm0Xa1yhGm2iXFf/rlAo7dawo+nD0L\nzs7QqVPN/Zeednq6BaMUQgghhKhfTEwMs2bNYu/evXh7e993/+YY5ZoxYwarVq0iPz+f/Px8VqxY\n0eh9i+7nmOXl5ZSXl2NpaYmRkRGHDh0iOjraoL7h4eH8/PPPAHTp0gWVSoVarWb27Nns37+f6Oho\nqqqqKC0tJTY2luzsbBwcHPD29mb58uVUVFQQFxfHgQMHDI5XtG2tMmG6U/DhZmUlWb9k0cvJFvjt\n/ku3ym6RdC2JYfbDWjhSIYQQQoh7rVq1ilu3bvHMM89gZmaGmZkZEydONLi/oaM9jbV777338Pb2\nxsPDAw8PD7y9vXnvvfca7Fvf+q2GnpuZmbFhwwamT5+Oubk5u3bt4rnnnjMoti+//BJ3d3fMzMxY\nuHAhERERtG/fHjs7O6Kioli9ejXdu3dHp9Oxfv16qqurgZo1WfHx8Zibm7NixQqCgoKaeHeEqKHS\nP2ar3VQq1QP/KuLrC4sWgcYxndemORH82rssmr+KOXPgySdB99Qh3v+/9/km6JtmiloIIVpOc1w3\nhWgL5LMihGhIY9eHJkeYMjMzGTt2LP369cPd3Z0NGzYAEBISgp2dHV5eXnh5eXHo0CGlz5o1a3Bx\nccHV1bXO8Op3331H//79cXFxYcGCBQ96Xg26s4Yp49uvuHQZJk2pmcN7p+BDTFoMTznK+iUhhBBC\nCCFE45pMmIyNjfnggw/44YcfOHnyJH//+9/58ccfUalULFq0iMTERBITE3nmmWcASE5O5vPPPyc5\nOZnDhw/zxhtvKNna66+/zpYtW0hNTSU1NZXDhw83+wkVF0N+Puh0kPFDDJqOJvS2682tW3D1KvTv\nX7N+SQo+CCGEEEIIIZrSZMJkbW2Np6cnAJ07d6Zv375kZ2cD9S/ui4qKYsaMGRgbG+Po6IizszPx\n8fHk5uZy69YtBg8eDEBgYCD79u1rznMB4OJFcHEBtRqyc39A170rAN9/X5Ms3ar8hdSCVAbZDmr2\nYwshhBBCCCFal/sqK56WlkZiYiJPPvkkJ06c4KOPPmL79u14e3uzfv16unbtSk5ODk8++aTSx87O\njuzsbIyNjbGzs1Net7W1VRKvu4WEhCiPx4wZw5gxYwyOsXZJ8ayCTOxtdMBv0/GOph1luG44JmqT\nRvYihBCPr9jYWGJjY1s6DCGEEKJNMDhhKioqYtq0aXz44Yd07tyZ119/nWXLlgGwdOlSFi9ezJYt\nW5olqNoJ0/26UyHvenExV67d4NmpNXd/PnUKJk6U9UtCiN+/u39ICg0NbblghBBCiFbOoLLiFRUV\n+Pv7M3v2bKZMmQLU3Mn5TvnIl156iYSEBKBm5CgzM1Ppm5WVhZ2dHba2tmRlZdV53dbWtjnPBfjt\nHkzn4qJJTdXj6z8bqFXwQdYvCSGEEEIIIQzUZMKk1+uZN28ebm5uvPnmm8rrubm5yuN///vf9O/f\nH4DJkycTERFBeXk5V69eJTU1lcGDB2NtbY1GoyE+Ph69Xs+OHTuU5Ks53RlhOn9iPx2MjRnadxj5\n+VBQAF1sr5F7KxdPa89mP64QQgghhBCi9WlySt6JEycIDw/Hw8MDLy8vAFavXs2uXbs4c+YMKpUK\nJycnPv30UwDc3NyYPn06bm5utGvXjk8++US58dgnn3xCcHAwJSUl+Pn5MWHChGY9merqmqIPvXvD\nv9LPoOuuRW2k5vRpGDgQYtNjGO04GrWRulmPK4QQQgghhGidWtWNa9PSYORIyMyEF/y6UXTLjoPH\nE1m5EoqKoGD4SwywGsCfhvypeYMWQogWJDfjFMIw8lkRQjTkgW5c+3uSnw+jR4NeX83VvEIcPNwB\nSEiQ9UtCCCGEeLw5Ojpy5MiRlg7jgQUHB7N06VIAjh8/jqurq0FtW4Nt27YxcuTIR95XPFytKmHy\n9obwcLh24f9IvVTN0zOnoNfXFHywdr1KcUUxbt3cWjpMIYQQQoh73CmmBRAREYGrqytdunTB0tKS\nqVOnkpOT08IRGqb2eYwcOZILFy4Y1FaIx1WrSpjuOPHFbqhW4zPQh6ysmrVNKeXf8JTTU/KhFEII\nIcRjb/jw4Rw7dowbN26Qnp6OqakpixYtMqhvcHAwYWFhDznCxt3P1EeZJiked60yYUr84SQOVhZo\nOmiUcuLfpMXwtNPTLR2aEEIIIUST7O3t6d69O1CTUKjVanr06GFQ3/v5cfjkyZMMGzYMrVaLp6cn\nR48eVbbdPUUwJCSEgIAA5XlcXJzSV6fTsX379nv2Hxsbi729vfI8MTGRJ554Ao1Gw4svvkhpaWmd\n9gcOHMDT0xOtVsvw4cM5d+6csm3t2rU4Ozuj0Wjo168f+/btU7Zt27aNESNG8NZbb2Fubk7Pnj05\nfPhwk+e/bds2evXqhUajoWfPnuzcuVPZtnnzZtzc3JTjJSYmNhnH3S5cuICPjw8WFha4uroSGRmp\nbCsoKGDy5Ml06dKFIUOGcPny5SbjFS2jVSZMV/MysLK0AWqm43kP0sv6JSGEEEI0SaVqnr/mEBcX\nR9euXdFoNGRkZPC3v/3tPs6j6SCys7OZNGkSy5Yto7CwkHXr1uHv709BQYGyj9r7qf04PT0dPz8/\nFixYQH5+PmfOnGHAgAGNHq+8vJwpU6YQFBREYWEhzz//PHv27FH2m5iYyLx589i8eTO//PILr776\nKpMnT6aiogIAZ2dn4uLiuHnzJsuXL2f27Nnk5eUp+09ISMDV1ZWCggL+/Oc/M2/evEbjKS4uZsGC\nBRw+fJibN2/y7bff4ulZc+uZyMhIQkND2bFjBzdv3uQ///kPFhYWBsVRe/8+Pj7Mnj2bn3/+mYiI\nCN544w1+/PFHAP74xz9iamrKtWvX+Oyzz9i6davMhHpMtc6E6adfsOjZG6hJmGz6p2CiNsGpq1ML\nRyaEEEKIx5le3zx/zWHEiBFcv36drKwsjI2Neeuttww8B71B09zCw8Pr3OZl3LhxeHt7c/DgwQb3\ne8fOnTvx8fHhhRdeQK1WY25u3mTCdPLkSSorK1mwYAFqtRp/f38GDRqkbN+0aROvvvoqgwYNQqVS\nERgYSPv27fn2228BmDZtGtbW1gBMnz4dFxcX4uPjlf4ODg7MmzdP6Zubm8tPP/3UaExGRkacO3eO\nkpISrKyscHOrWev+z3/+k7/85S8MHDgQgF69eqHT6QyK444DBw7g5OREUFAQRkZGeHp6MnXqVCIj\nI6mqqmLv3r2sWLGCjh070q9fP4KCgmR64mOq1SVMZT+ncOlKJQOefZrqajh9Gm6Yx8j6JSGEEEL8\nLtnY2LBy5cp6p7zd4eHhgVarRavVsmvXLt544w3l+fz58+vtk56eTmRkpNJOq9Vy4sQJrl271mRM\nmZmZ9OzZ877OIycnB1tb2zqvOTg41Iln/fr1deLJysoiNzcXgO3bt+Pl5aVsO3/+vDIaBihJDICp\nqSkARUVFDcbTqVMnPv/8czZu3IiNjQ2TJk0iJSUFgKysLHr16lVvv6biqH0+8fHxdc5n586d5OXl\nkZ+fT2VlZZ3pincSMvH4afLGtb83SQd2UFpixPQJPly6BF27QsLPMUxxndLSoQkhhBBC/FcqKiqU\nJKA+Z8+eVR7PmTOHsWPHEhgY2Og+dTodAQEBbNq0qd7tnTp1ori4WHl+7do15cdnnU5HQkJCg/uu\n70fqHj16kJ2dXee19PR0nJ2dlX0uWbKEd999956+6enpvPLKK8TExDB06FBUKhVeXl4PPCLj6+uL\nr68vZWVlLFmyhJdffpljx45hb2/PpUuXHigOnU7H6NGjiY6OvmdbVVUV7dq1IyMjgz59+gCQkZHx\nQOciHp5WN8IUczIGRytzHLs6kJAA3oOqiU2LZazj2JYOTQghhBDCIP/617/IzMwEar6kL1myBH9/\nf4P7G5JIzJ49m/379xMdHU1VVRWlpaXExsYqSY2npycRERFUVlZy+vRp9uzZo/SdOXMmX3/9NZGR\nkVRWVlJQUEBSUpJy7PqOP3ToUNq1a8eGDRuoqKhg7969nDp1Stn+8ssvs3HjRhISEtDr9RQXF3Pw\n4EGKioooLi5GpVJhaWlJdXU1W7du5fz58wa/H/X56aefiIqKori4GGNjYzp16oRarQbgpZdeYt26\ndXz//ffo9XouXbpERkbGfcUxceJELl68SHh4OBUVFVRUVHDq1CkuXLiAWq1m6tSphISEUFJSQnJy\nMmFhYTIb6jHV6hKmH3PSsLawRaVSceoU2A08i6WpJbYa26Y7CyGEEEI8Bn788UeGDRtG586dGTNm\nDEOHDuX99983uL8hX7zt7OyIiopi9erVdO/eHZ1Ox/r166murgZg5cqVXL58Ga1WS0hICLNmzVL6\n6nQ6vvjiC9avX4+FhQVeXl7KKFdDxSJMTEzYu3cv27Ztw8LCgt27d9dJAgcOHMjmzZuZP38+5ubm\nuLi4KNMQ3dzcWLx4MUOHDsXa2prz588zYsSIOse4+5ybeg+qq6v54IMPsLW1xcLCguPHj/OPf/wD\nqFmntGTJEmbOnIlGo2Hq1KkUFhbeVxxmZmZER0cTERGBra0tPXr04J133qG8vByAjz/+mKKiIqyt\nrZk7dy5z585t8t9MtAyV/jFbXaZSqR5oeHXkkx2wtppMZNRuhg0Dz9f/F8wv8cnET5oxSiGEeHw8\n6HVTiLZCPitCiIY0dn1oVSNMlTdzSb1ajvWwoVRUQFISXNFLOXEhhBBCCCHEf6dVJUxpR8O5dVPF\nuOeG88MPYO9Qwbc5xxnjOKalQxNCCCGEEC2gc+fOmJmZ3fN34sSJlg5N/E60qip5iWkO6Iz64tvL\ng/Bt0HPEaTp0dcLS1LKlQxNCCCGEEC2gsdLiQhiiVY0wlXjpsHrzPToad+DUKVA7y3Q8IYQQQggh\nxH+vVY0wDfdwoqJ7TeWRU6egXf8YXnVa2MJRCSGEEEIIIX6vWl2VPIDbt8HCqhT1O5bkLM5B017T\nTNEJIcTjRyp/CWEY+awIIRrS2PWhVY0w3XHmDNgP/Rbz7u6SLAkhhBBCCCH+a61qDdMdp06BmYes\nXxJCCCHE74ejoyNHjhxp6TAeC7Gxsdjb2yvP3d3dOXbsWLMeIyQkhICAgGbdp2idWm3CdMMihqed\nnm7pUIQQQgghDKJSqVCpVABERETg6upKly5dsLS0ZOrUqeTk5LRwhC3n/PnzjBo1qln3eee9FqIp\nrTJhik+8RU5VEsPsh7V0KEIIIYQQ92348OEcO3aMGzdukJ6ejqmpKYsWLTKob3BwMGFhYQ85wroq\nKysf6fGEeJRaXcJ0/TpkGsUx2G4QHY07tnQ4QgghhBD3zd7enu7duwOg1+tRq9X06NHDoL6Gjpyk\npaVhZGTE9u3bcXBwoFu3bqxevVrZXlZWxptvvomtrS22trYsXLiQ8vKaasSxsbHY2dnx/vvv06NH\nD+bOnUtoaCjPP/88AQEBaDQaPDw8SE1NZc2aNVhZWeHg4MBXX32l7H/r1q24ubmh0Wjo1asXmzZt\najBWR0dHYmJiAEhISMDb25suXbpgbW3N4sWLlXYnT55k2LBhaLVaPD09OXr0qLLt6tWrjB49Go1G\ng6+vL/n5+Qa9T0K0uoTpu+/A0juGp2X9khBCCCF+x+Li4ujatSsajYaMjAz+9re/Gdz3fqabnThx\ngosXL3LkyBFWrFhBSkoKAH/9619JSEggKSmJpKQkEhISWLVqldIvLy+PwsJCMjIy2LRpE3q9ngMH\nDhAYGEhhYSFeXl74+PgAkJOTw9KlS3n11VeV/lZWVhw8eJCbN2+ydetWFi5cSGJiYpPns2DBAhYu\nXMiNGze4cuUK06dPByA7O5tJkyaxbNkyCgsLWbduHf7+/hQUFAAwc+ZMBg0aREFBAUuXLiUsLEym\n5QmDNJkwZWZmMnbsWPr164e7uzsbNmwA4JdffsHHx4fevXvj6+vL9evXlT5r1qzBxcUFV1dXoqOj\nlde/++47+vfvj4uLCwsWLHgIp1OzfqnCXgo+CCGEEOL+qUJVzfLXHEaMGMH169fJysrC2NiYt956\ny6B+er3+vsqnL1++nPbt2+Ph4cGAAQNISkoCYOfOnSxbtgxLS0ssLS1Zvnw5O3bsUPoZGRkRGhqK\nsbExHTp0AGDUqFH4+PigVquZNm0aBQUFvP3226jVal544QXS0tK4efMmAH5+fjg5OSn9fH19OX78\neJPxmpiYkJqaSn5+PqampgwZMgSA8PBw/Pz8mDBhAgDjxo3D29ubgwcPkpGRwenTp1m5ciXGxsaM\nHDmSZ599VsrMC4M0WVbc2NiYDz74AE9PT4qKihg4cCA+Pj5s3boVHx8f/vznP/O3v/2NtWvXsnbt\nWpKTk/n8889JTk4mOzubcePGkZqaikql4vXXX2fLli0MHjwYPz8/Dh8+rPynbi5x3/3CLY9UBtkO\natb9CiGEEKL10y9//L5A29jYsHLlSiZMmMCHH35YbxsPDw8yMzMBuH37NpGRkbz55psAzJo1i48/\n/rjB/VtbWyuPTU1NKSoqAmpGhRwcHJRtOp2uTuGJbt26YWJiUmdfd6YRAnTs2BFLS0tlFKdjx5ql\nEkVFRWg0Gg4dOkRoaCipqalUV1dz+/ZtPDw8mnw/tmzZwrJly+jbty9OTk4sX76ciRMnkp6eTmRk\nJPv371faVlZW8tRTT5GTk4NWq1ViAHBwcFDeMyEa02TCZG1trXyQOnfuTN++fcnOzuY///mPMi80\nKCiIMWPGsHbtWqKiopgxYwbGxsY4Ojri7OxMfHw8Dg4O3Lp1i8GDBwMQGBjIvn37mj1hOpl7lEE+\nwzFRmzTdWAghhBDid6CiogJTU9MGt589e1Z5PGfOHMaOHUtgYOADHdPGxoa0tDT69u0LQEZGBjY2\nNsr2u6ez3c/0trKyMvz9/QkPD+e5555DrVbzhz/8waARH2dnZ3bu3AnAnj17lJEsnU5HQEBAvWuh\n0tPTKSws5Pbt28r7mJ6ejlqtNjhm0Xbd141r09LSSExMZMiQIeTl5WFlZQXUzEHNy8sDan6NePLJ\nJ5U+dnZ2ZGdnY2xsjJ2dnfK6ra0t2dnZ9R4nJCREeTxmzBjGjBljUHzXrkFR9yNM7CfT8YQQrVds\nbCyxsbEtHYYQ4iH617/+xahRo7C3tyc9PZ0lS5bg7+9vcP/mmGo2Y8YMVq1axaBBNbN2VqxY0eh9\ni+7nmOXl5ZSXl2NpaYmRkRGHDh0iOjqa/v37N9k3PDyc8ePH061bN7p06YJKpUKtVjN79mwGDRpE\ndHQ0Tz/9NBUVFZw8eRIXFxccHBzw9vZm+fLlrF69mvj4eA4cOMBzzz1ncMyi7TI4YSoqKsLf358P\nP/wQMzOzOttq3zegOdROmO5HVhZ06BvD0047mm4shBC/U3f/kBQaGtpywQghHooff/yRt99+m8LC\nQrp168YLL7xwX9+PDP1e1li79957j5s3byrT5KZPn857773XYN/6vg829NzMzIwNGzYwffp0ysrK\nePbZZ+9JXhqK7csvv2Tx4sXcvn0bR0dHIiIiaN++PXZ2dkRFRfHnP/+ZGTNmoFarGTJkCJ988glQ\nsyYrKCgIc3Nzhg4dSlBQUJ01+EI0RKU34OeAiooKJk2axDPPPKPMh3V1dSU2NhZra2tyc3MZO3Ys\nFy5cYO3atQC8/fbbAEyYMIHQ0FAcHBwYO3YsP/74IwC7du3i6NGjbNy4sW5AKtV//atI7q1c+n3S\nj5/f+hm1kQyxCiHahge5bgrRlshnRQjRkMauD01WydPr9cybNw83NzclWQKYPHmyclO0sLAwpkyZ\norweERFBeXk5V69eJTU1lcGDB2NtbY1GoyE+Ph69Xs+OHTuUPs2loKSA+YPnS7IkhBBCCCGEaBZN\njjDFxcUxatQoPDw8lKHRNWvWMHjwYKZPn05GRgaOjo7s3r2brl27ArB69Wo+++wz2rVrx4cffsj4\n8eOBmrLiwcHBlJSU4Ofnp5QorxOQ/PojhBD3Ra6bQhhGPitCiIY0dn0waEreoyQXMyGEuD9y3RTC\nMPJZEUI0pLHrw31VyRNCCCGE+L3SarXNWqRKCNF6aLXaBrfJCJMQQvzOyXVTCCGEeHiaLPoghBBC\nCCGEEG2VJExCCCGEEEII0QBJmIQQQgghhBCiAZIwCSGEEEIIIUQDJGESQgghhBBCiAZIwiSEEEII\nIYQQDZCESQghhBBCCCEaIAmTEEIIIYQQQjRAEiYhhBBCCCGEaIAkTEIIIYQQQgjRAEnhPejzAAAH\ndklEQVSYhBBCCCGEEKIBkjAJIYQQQgghRAMkYRJCCCGEEEKIBkjCJIQQQgghhBANkIRJCCGEEEII\nIRogCZMQ4v+3d3chTbZhHMD/j21HlVmRG+5ZKCnYYpViC4I6KOxD0CLD8kBNtwIl0vIgOiiyAydF\nlEVClIoopJ2U9uEICaUolZqVqOAIV3OaEWL4Bcu19yCc+erzCr66LZ//72jemw/X/ceBl3u8LyIi\nIiKSwIaJiIiIiIhIAhsmIiIiIiIiCWyYiIiIiIiIJLBhIiIiIiIikjBnw5SVlQWVSgW9Xu9du3Tp\nEkRRRExMDGJiYlBfX+99zmw2IyoqCtHR0Xj+/Ll3/d27d9Dr9YiKikJubu4Cb2PpaWxs9HcJAYNZ\nTGEWU5gFERER+cKcDVNmZiYsFsu0NUEQcPbsWbS1taGtrQ0HDhwAAHR2dqKmpgadnZ2wWCzIycmB\nx+MBAGRnZ6O0tBQ2mw02m23GNWk6/jI4hVlMYRZTmAURERH5wpwN086dO7F69eoZ65ON0J9qa2uR\nmpoKpVKJ8PBwREZGoqWlBf39/RgeHobBYAAApKen49GjRwtQPhERERER0eKZ9/8w3bp1C1u2bIHR\naMTQ0BAAoK+vD6Ioel8jiiKcTueMdY1GA6fT+T/KJiIiIiIiWnyK+XxTdnY2Ll68CAC4cOEC8vPz\nUVpaumBFCYKwYNf6mxUUFPi7hIDBLKYwiynMgoiIiBbbvBqm0NBQ72OTyYTExEQAvz85cjgc3ud6\ne3shiiI0Gg16e3unrWs0mlmvPdutfkRERERERP4wr1vy+vv7vY8fPnzoPUEvKSkJ1dXVcLlc6Onp\ngc1mg8FggFqtRnBwMFpaWuDxeFBZWYlDhw4tzA6IiIiIiIgWyZyfMKWmpqKpqQnfv3+HVqtFQUEB\nGhsb8f79ewiCgIiICNy5cwcAoNPpkJKSAp1OB4VCgZKSEu/tdSUlJTh+/DjGx8eRkJCA/fv3L+7O\niIiIiIiI/ifBEyD3wFksFuTl5cHtdsNkMuHcuXP+LslnHA4H0tPT8e3bNwiCgJMnT+L06dMYHBzE\n0aNH8fnzZ4SHh+PBgwcICQnxd7k+4Xa7ERcXB1EU8fjxY9lmMTQ0BJPJhI6ODgiCgPLyckRFRcky\nC7PZjKqqKgQFBUGv16O8vByjo6OyyCIrKwtPnz5FaGgo2tvbAeA/3xNmsxllZWVYtmwZbt68ib17\n9/qzfCIior/avE/JW0hutxunTp2CxWJBZ2cn7t+/j66uLn+X5TNKpRLXr19HR0cHmpubcfv2bXR1\ndaGoqAjx8fHo7u7Gnj17UFRU5O9Sfaa4uBg6nc77CaVcs8jNzUVCQgK6urrw8eNHREdHyzILu92O\nu3fvwmq1or29HW63G9XV1bLJYrZ5eFJ7n20e3q9fv/xRNhER0ZIQEA1Ta2srIiMjER4eDqVSiWPH\njqG2ttbfZfmMWq3G1q1bAQArVqzAxo0b4XQ6UVdXh4yMDABARkaGbGZX9fb24tmzZzCZTN5DQOSY\nxY8fP/Dy5UtkZWUBABQKBVatWiXLLIKDg6FUKjE2NoaJiQmMjY0hLCxMNlnMNg9Pau+zzcNrbW31\nec1ERERLRUA0TE6nE1qt1vv15PwmObLb7Whra8P27dsxMDAAlUoFAFCpVBgYGPBzdb5x5swZXL16\nFUFBUz+ecsyip6cH69atQ2ZmJmJjY3HixAmMjo7KMos1a9YgPz8f69evR1hYGEJCQhAfHy/LLCZJ\n7V1qHh4RERHNT0A0TJy79NvIyAiSk5NRXFyMlStXTntOEARZ5PTkyROEhoYiJiZG8oh5uWQxMTEB\nq9WKnJwcWK1WLF++fMYtZ3LJ4tOnT7hx4wbsdjv6+vowMjKCqqqqaa+RSxazmWvvcs2FiIhoIQRE\nw/Tv+U0Oh2PaX0jl4OfPn0hOTkZaWpr3yHWVSoWvX78C+H2U+5/zr5aq169fo66uDhEREUhNTcWL\nFy+QlpYmyyxEUYQoiti2bRsA4MiRI7BarVCr1bLL4u3bt9ixYwfWrl0LhUKBw4cP482bN7LMYpLU\ne2K2eXhSc++IiIhobgHRMMXFxcFms8Fut8PlcqGmpgZJSUn+LstnPB4PjEYjdDod8vLyvOtJSUmo\nqKgAAFRUVMhidlVhYSEcDgd6enpQXV2N3bt3o7KyUpZZqNVqaLVadHd3AwAaGhqwadMmJCYmyi6L\n6OhoNDc3Y3x8HB6PBw0NDdDpdLLMYpLUe0JqHh4RERHNT8AcK15fX+89VtxoNOL8+fP+LslnXr16\nhV27dmHz5s3eW2fMZjMMBgNSUlLw5cuXJX1kspSmpiZcu3YNdXV1GBwclGUWHz58gMlkgsvlwoYN\nG1BeXg632y3LLK5cuYKKigoEBQUhNjYW9+7dw/DwsCyy+HMenkqlwuXLl3Hw4EHJvRcWFqKsrAwK\nhQLFxcXYt2+fn3dARET09wqYhomIiIiIiCjQBMQteURERERERIGIDRMREREREZEENkxEREREREQS\n2DARERERERFJYMNEREREREQkgQ0TERERERGRhH8AcxD/6ggtL/0AAAAASUVORK5CYII=\n", - "text": [ - "" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "for r in results:\n", - " plt.plot(sorted([k for k in [5.0, 10.0, 20.0, 30.0]]), sorted([r[k] for k in [5.0, 10.0, 20.0, 30.0]]))\n", - "plt.legend([r['name'] for r in results], loc='center', bbox_to_anchor=(2, 0.5))" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 8, - "text": [ - "" - ] - }, - { - "metadata": {}, - "output_type": "display_data", - "png": "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\ngHT3R0Tktuh7U8Qy+qyIiDmlfT9Y1CXvXtKXmYjI7dH3pohl9FkREXNK+36weNAHERERkfuZvb39\nHR2kSkQeHPb29mbXqYVJROQ+p+9NERGRu+e25mESERERERGpTJQwiYiIiIiImKGESURERERExAwl\nTCIiIiIiImYoYRIRERERETFDCZOIiIiIiIgZSphERERERETMUMIkIiIiIiJihhImERERERERM5Qw\niYiIiIiImKGESURERERExAwlTCIiIiIiImYoYRIRERERETFDCZOIiIiIiIgZSphERERERETMUMIk\nIiIiIiJihhImERERERERM5QwiYiIiIiImKGESURERERExAwlTCIiIiIiImaUmTCNGjUKR0dHWrdu\nbVoWGhqKi4sL3t7eeHt7s3PnTtO6+fPn06xZM5o3b05MTIxp+dGjR2ndujXNmjVj/Pjxd/gwHjyx\nsbHlHUKFoXPxK52LX+lciIiIyL1QZsI0cuRIdu3aVWyZwWBg0qRJJCQkkJCQQI8ePQA4efIkGzZs\n4OTJk+zatYtx48ZhNBoBGDt2LCtXriQxMZHExMTfbVOK04/BX+lc/Ern4lc6FyIiInIvlJkwdejQ\nAXt7+98tv5kI3Wrr1q0MHjwYGxsb3N3dadq0KXFxcZw7d47Lly/j6+sLQFBQEFu2bLkD4YuIiIiI\niNw9//MzTG+//TaPPvooo0eP5uLFiwCkpaXh4uJiKuPi4kJqaurvljs7O5OamvoHwhYREREREbn7\nqvwvlcaOHcusWbMAmDlzJpMnT2blypV3LCiDwXDHtnU/CwsLK+8QKgydi1/pXPxK50JERETutv8p\nYapfv77p9TPPPEOvXr2AopajlJQU07qzZ8/i4uKCs7MzZ8+eLbbc2dm5xG2X1NVPRERERESkPPxP\nXfLOnTtnev3xxx+bRtDr3bs3kZGR5Ofnc/r0aRITE/H19cXJyQk7Ozvi4uIwGo2sXbuWvn373pkj\nEBERERERuUvKbGEaPHgw+/btIyMjg0aNGhEWFkZsbCxff/01BoOBxo0b8/777wPg4eFBYGAgHh4e\nVKlShWXLlpm61y1btowRI0Zw9epV/P396d69+909MhERERERkT/IYKwgfeDc3d2xs7PD2toaGxsb\n4uPjyzuke2bUqFFER0dTv359jh8/DsCFCxcYNGgQSUlJuLu7s3HjRmrXrl3Okd59JZ2L0NBQPvjg\nA+rVqwcUzfVVGRLulJQUgoKC+PnnnzEYDDz33HO89NJLlfLaMHcuKuO1ce3aNTp16kReXh75+fn0\n6dOH+fPnV8rrQkRE5F6oMAlT48aNOXr0KHXq1CnvUO65AwcOUKNGDYKCgkxJwtSpU3FwcGDq1Km8\n8cYbZGVlsWDBgnKO9O4r6VyEhYVRs2ZNJk2aVM7R3Vvp6emkp6fj5eVFTk4Ojz32GFu2bGHVqlWV\n7towdy42btxYKa+N3NxcbG1tKSwspH379ixcuJBt27ZVuutCRETkXvifhxW/GypI7nbPlTTX1bZt\n2wgODgYgODi40sxbdTvzfj3onJyc8PLyAqBGjRq0aNGC1NTUSnltmDsXUDmvDVtbWwDy8/O5fv06\n9vb2lfK6EBERuRcqTMJkMBjo2rUrPj4+rFixorzDKXfnz5/H0dERAEdHR86fP1/OEZWvkub9qkzO\nnDlDQkICbdu2rfTXxs1z8fjjjwOV89q4ceMGXl5eODo60qVLF1q2bFnprwsREZG7pcIkTIcOHSIh\nIYGdO3fyzjvvcODAgfIOqcIwGAyVem6qsWPHcvr0ab7++msaNGjA5MmTyzukeyonJ4eAgAAWL15M\nzZo1i62rbNdGTk4OAwYMYPHixdSoUaPSXhtWVlZ8/fXXnD17lv379/P5558XW1/ZrgsREZG7qcIk\nTA0aNACgXr169OvXr1IN+lASR0dH0tPTgaJh3G+d+6qyqV+/vukH4DPPPFOpro2CggICAgIYPny4\naSj+ynpt3DwXw4YNM52LynxtANSqVYunn36ao0ePVtrrQkRE5G6rEAlTbm4uly9fBuDKlSvExMSY\n5naqrHr37k14eDgA4eHhlXreKnPzfj3ojEYjo0ePxsPDgwkTJpiWV8Zrw9y5qIzXRkZGhqnr4dWr\nV9m9ezfe3t6V8roQERG5FyrEKHmnT5+mX79+ABQWFjJ06FBeffXVco7q3rl1ritHR0dmz55Nnz59\nCAwMJDk5uVINEfzbc2Fu3q+bz2o8yA4ePEjHjh3x9PQ0da+aP38+vr6+le7aKOlczJs3j/Xr11e6\na+P48eMEBwdz48YNbty4wfDhw5kyZQoXLlyodNeFiIjIvVAhEiYREREREZGKqEJ0yRMREREREamI\nlDCJiIiIiIiYoYRJRERERETEDCVMIiIiIiIiZihhEhERERERMUMJk4iIiIiIiBn/H4c0IThYwuq0\nAAAAAElFTkSuQmCC\n", - "text": [ - "" - ] - } - ], - "prompt_number": 8 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "bests = {}\n", - "for l in [k for k in results[0].keys() if k != 'name']:\n", - " bests[l] = max(results, key=lambda r: r[l])['name']\n", - "bests" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 9, - "text": [ - "{5.0: 'Pletters',\n", - " 10.0: 'Pletters',\n", - " 20.0: 'Pletters',\n", - " 30.0: 'Pletters',\n", - " 50.0: 'Pletters',\n", - " 100.0: 'cosine_similarity + normalised'}" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [], - "language": "python", - "metadata": {}, - "outputs": [] - } - ], - "metadata": {} - } - ] -} \ No newline at end of file diff --git a/segment.py b/segment.py deleted file mode 100644 index a64ea5d..0000000 --- a/segment.py +++ /dev/null @@ -1,30 +0,0 @@ -"""Segment a collection of letters into words""" - -import language_models -import sys -from functools import lru_cache -sys.setrecursionlimit(1000000) - -@lru_cache() -def segment(text): - """Return a list of words that is the best segmentation of text. - """ - if not text: return [] - candidates = ([first]+segment(rest) for first, rest in splits(text)) - return max(candidates, key=language_models.Pwords) - -@lru_cache() -def segment_wrong(text): - """Return a list of words that is the best segmentation of text. - """ - if not text: return [] - candidates = ([first]+segment(rest) for first, rest in splits(text)) - return max(candidates, key=language_models.Pwords_wrong) - - -def splits(text, L=20): - """Return a list of all possible (first, rest) pairs, len(first)<=L. - """ - return [(text[:i+1], text[i+1:]) - for i in range(min(len(text), L))] - diff --git a/unknown-word-probability-investigation.ipynb b/unknown-word-probability-investigation.ipynb deleted file mode 100644 index ff3767b..0000000 --- a/unknown-word-probability-investigation.ipynb +++ /dev/null @@ -1,203 +0,0 @@ -{ - "metadata": { - "name": "", - "signature": "sha256:6a52b786de0fbcf68d2da20d0ad155b76414b0e5add50e4d11d9f765911eb884" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ - { - "cells": [ - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%matplotlib inline\n", - "import matplotlib.pyplot as plt\n", - "from math import log10\n", - "from cipherbreak import *\n", - "from language_models import *" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# What fraction of possible words are present in the dictionary?" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fractions = [1.0]\n", - "for wordlen in range(1, 20):\n", - " known_words = len([w for w in keywords if len(w) == wordlen]) # Words in the dictionary\n", - " possible_words = 26 ** wordlen\n", - " fractions += [known_words / possible_words]\n", - "fractions" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 2, - "text": [ - "[1.0,\n", - " 1.0,\n", - " 0.34615384615384615,\n", - " 0.05974055530268548,\n", - " 0.007654668954168271,\n", - " 0.0005913456488541394,\n", - " 3.6129588927177356e-05,\n", - " 1.8010883826943671e-06,\n", - " 7.107795165409739e-08,\n", - " 2.4355817367258945e-09,\n", - " 7.469162662303339e-11,\n", - " 1.979378237044537e-12,\n", - " 4.875878520286003e-14,\n", - " 1.1095648437193016e-15,\n", - " 2.199659830168053e-17,\n", - " 4.185399254019551e-19,\n", - " 6.83349209784038e-21,\n", - " 1.199477188056649e-22,\n", - " 2.0013901045062867e-24,\n", - " 1.5656245928341226e-26]" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Plot the fractions" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plt.plot(fractions)\n", - "plt.ylabel(\"Probability of word\")\n", - "plt.xlabel(\"Word length\")\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "display_data", - "png": "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\nkiRJqlX/D1Q+4n26HL3CAAAAAElFTkSuQmCC\n", - "text": [ - "" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Log plot" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plt.plot([log10(f) for f in fractions])\n", - "plt.plot([log10(f) for f in fractions], 'bo')\n", - "plt.ylabel(\"Log probability of word\")\n", - "plt.xlabel(\"Word length\")\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "display_data", - "png": "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\nSUVORK5CYII=\n", - "text": [ - "" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Guess some lines of best fit" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plt.plot([log10(f) for f in fractions], 'bo')\n", - "plt.plot([i for i in range(2,20)], [-(i-2) for i in range(2,20)], 'g-')\n", - "plt.plot([i for i in range(2,20)], [-(i-3)*1.5 for i in range(2,20)], 'r-')\n", - "plt.plot([i for i in range(2,20)], [-(i-2)*1.4 for i in range(2,20)], 'r^-')\n", - "plt.ylabel(\"Log probability of word\")\n", - "plt.xlabel(\"Word length\")\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "display_data", - "png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAEPCAYAAAC3NDh4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd41FX6///nECAQQREroAgEXESQ4IJYQKL+zGBBV0EF\nXSQJYlmlxYaAEqVbImVXf0oJxY+iFAtEk+AuAZfei4ALARVF2QUEQUiA5Hz/OJNkEibJTDKTSXk9\nrmuumXnPu5wJw9xzyn0OiIiIiIiIiIiIiIiIiIiIiIiIiIiIVCiOYBegCN8DvwNZwGnguqCWRkRE\nypW9QP1gF0JEpCqrFuwCFKM813RERCq98hwkDPA1sA7oF+SyiIhIOdPAdX8RsAnoHMSyiIhUSdWD\nXYAi/OK6/x/wKbbj+huA8PBwk56eHqxyiYhUVOlAc18OKK/NTWFAXdfjc4AoYGvOi+np6RhjdPPT\nbcSIEUEvQ2W66e+pv2d5vQHhvn4Zl9eaxCXY2gPYMv4fkBq84oiIVE3lNUjsBSKCXQgRkaquvDY3\nSRmKjIwMdhEqFf09/Ut/z+CqqHkIxtW+JiIiXnI4HODj975qEiIiUigFCRERKZSChIiIFEpBQkRE\nCqUgISIihVKQEBGRQilIiIhIoRQkRESkUAoSIiJSKAUJEREplIKEiIgUSkFCREQKpSAhIiKFUpAQ\nEZFCKUiIiEihFCRK6pNP4OOPQetaiEglpiBRUg0bwrhx0LkzrFsX7NKIiASEgkRJdepkg0NMDHTr\nBtHRsH9/sEslIuJXChKlERICffvCd99BgwZwzTUwejScPBnskomI+IWChD+cey6MHQtr18KmTXDV\nVeqvEJFKwacFscsRY8rzF/CyZTBoEISFwYQJ0L59sEskIoLD4QAfv/fLa02iK7AT2AW8GOSyFKrQ\nQHXzzbZWERsL99yj/goRqbDKY5AIAf6ODRStgF7AVQV3cjqHk5S0zOeTJyUtw+kcTmRkfInPATZA\nxD32WOGBIiTEBomc/oo2bWDUKPVXiIiU0g1AstvzIa6bOwPGhIcPNYsWLTXeWrRoqQkPH2psZ4Ep\n0TlyfDV3rhlUt65JnjfPuwP27DGmRw9jGjc2Zs4cY7Kzfb6miEhp2O9O35THmkQjYJ/b859c286S\nnj6ayZMXe33iSZNSSU8fXapzgK1FfDV+HAnHjpH8xhuF1ybcNW0Kc+fC7NkwfrwdQrt2rU/XFREp\na9WDXQAPvIx08QDs3PkNaWlpREZGFntEZqbnt5uREeJl0awxQ0dy+/r1OIAua9cy9MUXGfv6694d\nnNNfMXMm3Hsv3H67HRnVsKFPZRARKU5aWhppaWnBLobfXU/+5qaXOLvzOre5yOkc7nVVKypqWL6m\nppKcY+HCNNMltKHJdh2cDSY6FPNwXBuzYPsCk3km0/u63++/GzNkiDH16xszcqQxJ054f6yIiI+o\nJM1N64AWQBOgJvAQ8IWnHcPDh9K//+1en3jAgCjCw4eV6hxjh02if+aR3DFkDuDezBrcO3kH58Y8\nQeehDYhLiWPrga3Fn6xuXVuLWLcONm+Gli2VXyEi5Up5zZO4A5iAHek0DRhb4HXjdA6nf//bueuu\nm306cVLSMiZPXkxGRgi1amX5fI62l7aj3oFzcbj96QyGYxf/xob+D5L1dgLrOjXlqXb7CWl0GbER\nsfRs3ZPza59f/Mlz8itq17b5FR06+PTeRESKUpI8ifIaJIrjqjmVPadzOKmpozxsf5nk5JFw8CCM\nHYuZMYM9D0UxqmMGn/6yhDtb3ElMRAy3NbuNao4iKnBZWba/YvhwiIqCMWPUXyEifqEgUQaSkpYx\ncGBKvlFS4eFDmTixa/4ayY8/Qnw8LFrEH4OeZlanukzZ8QGHTh6iT9s+XPFbKz55b1tujWbAgKj8\nxx87ZgPElCkweDDExdkahohICSlIlBGfmqy2b4dhw2y/Q3w8m5xteWXhOJJ+/JLs/ddRd6Hh2LEv\nCb9iDBMnOs8+z9698MILdkTU+PHw4IPgqKj/bCISTAoS5dmqVTBkCBw4wGuhVzNi6weENRxGz18n\nMufuUE5kPULHmqdZOXd6zj9kfpoPSkRKSUGivDMGUlLY3SOag380ZgTHSWYHN1Rrx+obelD7pre4\novHFxETE0Pua3jSo2yD/8eqvEJFSqEwT/FVODgd07cozN/ZlBDcykJ04gBeydxC2/E903vwUU7pN\n4buD39HqnVZ0+6gbn+74lFNZp+zxmg9KRMqYahJBsGjRUt7s8TBLMvfjwGa3xFSrxaPvTuXWxx8B\n4Pip48zbPo/pG6ez8+BO/nrNX4mJiKHNJW3yTrR3Lzz/vO3vUH+FiBRDzU0VRPK8eWT9tTd3ZWbk\nbksKqU712rVw9u4NL79sawouuw7tYsamGczcPJMGdRsQGxFL/f2Nmf7OSjIzq/PnP/bwym+rOO/S\ni9VfISKFUpCoIIbExBC6Z0++DmpjDJkNGzKuYUOYMQOefNKOajrvvNx9srKzWLxnMWO+fJ3lB1aQ\n/d19sDEW9t5Gi6bDmHt3Nm3nzlZ/hYh4pCBRWfz4I7z6KixcaAPF00/ny5FwOoeT+s1gaPMRtJsO\ntQ/B5j50rnuYZR+MVX6FiHikjuvKonFjmDYN0tJgxQq48kr7/MwZwDWb7ckLYM0z8N56mPM5hB5l\nVetEbllwD7N7tuLkimVab1tESk1Bojxr1QoWLMhbh6JNG1iwgNCap107GOryGPzaFpInErlhAE93\neJo5386h4ac38fij57PtzRcw48dD5862g1tExAdqbqooXDkWvPQSv53IpP/xdny6/z56EsscEmkQ\nvj7f1CA///4zszbPInFTIjWoxpv72xA14xtCnF3VXyFSRalPoirIzoaPP+b44GcZfPAw72dlcsd5\nDXnmgw+5++4uZ+1ujGH5vuUkbkwkdfN8EtZfyD3L/ktI3HNUf+559VeIVCEKElVI8pw5OPr0wXnq\nFMkhITgmTMD5zDNFHpOTe/FV6js88sFmrv+5OpObXc83YZ0I9TTJoIhUKgoSVYQxhrgbbiBh9erc\nZLy4kBAS+vXD8cor+XIsCvP+/A/5fNIYRu78DyccoQyu/zcOcpq/v/EXBQqRSkqjm6qIlPnz6bp1\na77V8ZyhoaT+/DO0bm1nnT16tMhzzH9/O18u20aH/x5nunmMz/dOYkTI3xk27zEWpy8m22QH/H2I\nSPlXPdgFEN+lJSUR2r49Kwsm411wAc6NG22ORYsWHnMscmRm2n/6bGqS+N+3mctrDN35Mv/a9Q4f\nHe7D0zeF0LNDDNER0TQ7v1mZvTcRKV/U3FRZbd9uZ4tdu9YuftSnD1TP+01Q2Ap7j3Z+hpmXHODU\nquV8+Ehbnq+/ltaXtCE2IpburboTViOsDN+EiPiTmpskTyE5FjlJdQMGRBEePsy1s90WHj6UB198\nEObOpeYHHxGd8isHPr+S4bW7MufbOTRKaMTjCx9n5b6VKEiLVA2qSVQFbjkW1KwJ48bBLbeQlLSM\nSZNS+X5LEk2uuevs0U1ZWXYeqeHDwenkl5f6M/N/i5m+cToh1UKIjYild9veXFrn0qC9NRHxnr9H\nNz3r9ti47Zvz7Zzgy4X8TEGiJFw5FgwfDs2bw9ixJO/ZQ0psLF0TE3F27+75uN9/h7Fjc+eDMoMH\ns+LgRqZvnM6CnQvo3LgzMREx3HXlXdQMqVm270lEvObvIBGPDQh/AjoAX7j2vxtYA/y1JIX0EwWJ\n0jh1CqZOxbz2GnGnT5Nw+DBxHTuSsHKl56VTc+zZYzvD3davmLcwhfhP/sFPF23lZNhB7rj8Tkbe\n93L+dS9EpFwIVJ7EN8CdwDHX87rAl0BnXy7kZwoSfpA8ezaOvn1xnj5NcvXqON59F+djjxV/4NKl\nMGgQh09lEXu0PZ//PN1ur7+berf0IeTaXTS96ApiI2Lp2bon59c+P7BvRES8EqiO64uB027PT7u2\nBUo88BOw0XXrGsBrVVnGGFL+8Q+iTtt/WueZMyQ/+STmpZfgyJGiD+7SBdatYwaNeffnr0gkmgbs\nh8PNOTJ/OX9e1o9Rt4wi7Yc0mk5sysPzH1buhUgF5U2QmIVtXooHXgVWAzMDWCaD7e9o57olB/Ba\nVVahCXmrVtmpyd98s+i1s0NC+OKi9vyJ7/iVS9nCNQxlNLU4SWZGDZzNnXzc42P2DNzDjZffyItf\nv0iTCU14Zckr7PltT1m8RRHxg+KChAOYDcQAR4DDQDQwJrDFqrCjriqMtKQkVrRvT3yXLrm3le3b\ns6RJE7uOxfLlZ61jUVBo6BmOcS4vMY7rWEM7NrKDq4j6bUvuUNv6tevzzHXPsOGJDXzR6wuOZhyl\n49SO3DLzFmZtnsUfp/4ouzctIj4r7svYAWwFWpdBWXKMwAalo8A67Cirgu0f6pMoC6tWwZAhcOAA\njB4N990Hbh3bSUnLGDgwhfT00bnbejX8K+/WWs15DS4pdL3tzDOZLPzPQhI3JbJi3wp6XNWD2Hax\nXH/Z9UV3nItIqQSq43om8A9sk5O/LAY8Da4fBqwC/ud6PhJoAPQtsJ8ZMWJE7pPIyEgiIyP9WDzJ\nlZNjMWQIhIbm5ljkSEpaxuTJizl5shq1a2fTv//t3NX1pnz5FUWtX/Hz7z8ze8vs3NyLmIgYel/T\nmwZ1i5+kUESKlpaWRlpaWu7zV199FQIQJL4DmgM/ADltAwa4xpcLlVATYCFQcDylahJlzT3HokUL\nmzfRrh3gmpX2scdImDo1f00gJ7/i/fftetvPPlvo+hXu617M3zGfzld0JjYiVrkXIn4UqJpEE9d9\nzrdyzjHf+3IhHzQAfnE9HozN0Xi4wD4KEsHiyrFg5EiIjISRI0netKnohLyc/Iq1a+H11+HBB89q\ntpo0KZXMzOqEhp6h39OdON74V6ZvnM7Ogzv56zV/JSYiRrkXIqVUkiDhrQigP/AM0DYQF3AzC9gC\nbAY+Ay7xsI+RIDt2zJiRI012/fpm0MUXm2wwgzp2NNnZ2YUfk5ZmTESEMTfeaMyaNcYYYxYtWmrC\nw4ca265lb+HhQ82iRUuNMcb85+B/zNCvh5pGbzUy7d9vb95Z8445fOJwWbxDkUqHvB/7XvMmogwE\n+gELXPv/BZgCTPL1Yn7ker8SbMnTp+N48kmbkFejBo6pU3E++mjhB7jPBxUVRa/v6zFn2cSzdnM6\nXyY5eWTeYdlZfL3na6Zvmk7K7hTubHEnMREx3NbsNqo5NE+liDcCVZPYCpzj9vwc17ZgCnZAFmNM\ndna2rT24qgDZYAZVr26yX3/dmBMnij746FFjhgwxR6rXNsMYaWpxIl9tokuXEYUeeujEITN59WRz\n7XvXmsZvNzYv/+tlk3443b9vTqQSogQ1CW9/gmUX8liqMI8JeTVqkDp3brE5Fpx7Lowdy4DrY4hg\nEztpyUPMIeczXKtWVqHXzcm9WP/4ej7v+Xm+3IvZm2dz4vQJv75PkarMm2pHHDaBzr25aQbwdsBK\nVTxXUJRgGhITQ+iePflGNBljyGzWjHFPPFFkjkWOnFyLRulRTGAQJwjjzUYteOy9WJ/W2nbPvVi5\nbyU9Wtnci46NOir3QsQlUKObAP4MdML+zPsGO6dSMClIVATF5FjkyMm1OHXSQbdDG3hq/0pqdbvb\nDp8tJL+iKAVzL7TuhYgVqCAxClgKrCAvTyLYFCQqEg/rWHDttWftZoyxH2If8iuKYoxhxb4VWvdC\nxCVQs8DuweYprMNmXb+FbXIS8U61atCrF+zYAffeC3fdBT17wu7dubsYV0KeMSa3v4K1a2HTJmjZ\n0gYZH38YOBwObmp8E9Punca+wfu4/6r7mbB6Ape/fTlxKXFs++82f79TkUrHl4hyKfAQ8BxwPlAn\nICXyjmoSFdnx4zBxIrz9NjzwALzyCsnLlxeekOdav4KwMDsfVIcO+V4umIx31jKsBew+vJsZm2Yw\nY9MMGtRtQGxELL3a9KJerXqBeLci5UaghsBOwzY1fYqdbO86oIa/L+KjoAwfEz87eNCYZ5812eef\nbwY1bFh0Qt6ZM8ZMnWrMpZca8+ijxvz8szGm+GS8opzJOmOSdyWbB+c+aM4be57pNa+XSd2darKy\ns/z9TkXKBQKUTPcp0Aj4FliG7Z8I9oIArvcrlUHyu+/iGDDALnxUowaOmTNx9urleecC/RXd0o6x\n6J/jz9qtYDJecQ6fPMyHWz8kcVMiB08cJLptNNER0TQ9v2lJ35ZIuROoPon7sLWH14F6wBLsynEi\npWaMIWXmTKJc+RTO06dJ7tMHM3Wq5xyLAv0VU/79Hg/yMQV/IGVkhPhUjoK5F0cyjnDd1Ou4deat\nyr2QKs2biNINu551Z2yQWIUdBjs9gOUqjmoSlUTyvHk4+vTBeSLvSzi5Vi0czZrhzM4uMscC4LkO\nvXlk3TZOEMYgJrAO21/ha03CE+VeSGUTqCGwf8cGhW+A/b4XKyAUJCqJIhPyHnrIqxyLwQO+ovOe\n5oxiOKlE8d4V5zLsHw/4lIxXHK17IZVBIJPpyhsFiarCixyLnGS8asfP0Gf/Mu47uI2aLzxf4vyK\nopgCuRedGnfSuhdSYShISOXlvo5Fly4wapQNGm5MTjJeMetX+MvxU8eZt30eiZsS2fG/HVr3Qso9\nBQmp/I4ft7kSEybYL/+XX4YGDTyvjldMfoU/Fcy9iImIoVfrXpxf+/yAXVPEV/4OEv8EbsOOanqh\n5MUKCAWJqu7gQdv0NGMGPPkkyVdeSUr//mcn4xVYv6Kw+aB8TcgrjNa9kPLM38l024EbgZ3AtdhJ\n/q51uwVTGaegSLn1ww8mOzrarmMBZlCHDp6T8VzrV5j69Y0ZOTLfehelScgrita9kPIGPyfTPQD0\nBW7CzttU0NlDTcqO6/2KuIbRPvoozpMnSQYcTz2Fc9IkqF797J337rX9FWvW5PZXOLu+TGrqqLN2\n9ccw2hybft1E4sZEPtz2Ia0vbk1sRCzdW3UnrEaYX84v4o1A9Um8ArxWkgIFkIKEAK6JAW+4gYTV\nq3FgfybF1a1LQsOGOMaMKTzHYtky219RuzZPnGzF+xunnLVLly7xpKXF+7W8yr2QYApUxvVrwL3Y\n2V/fxCbXiZQLHlfHy8oitUcPeO01uP56WLLk7ANvvtmOfurblzHb5zCDPjQokAZU1Op4JRVaPZQe\nrXqQ9HASW5/aStN6TXn000dp9U4r3lj+Br8e/9Xv1xQpDW8iyjigA/B/rv17YpufXgpguYqjmoQA\nxSTjTZuWl2PRooXttG7X7qxzJM9N5vvHX+OBI9/xNoN5i2dpFD6SiRO7+jUhrzDGGJbvW07ixkTl\nXkhABaq5aSsQAeT8rAoBNgHBHAyuICHec8+xiIy09wVyLJKSlvHJ+E+I2bGEq47/xM8DBnPtuBEB\nya8oyvFTx5n77VwSNyXy3aHveKTNI8S2i6X1xa3LtBxSOQUqSGzBdlIfcj2/ADvJ3zW+XMjPFCTE\nd+45Fq51LGiQf1oNYwyOb77J7a8IdH5FUXYd2sWMTTOYuXlm7roXPVv3VO6FlFig+iTGAhuAGcBM\nYD0wxseyFfQAdurxLM4eTvsSsAs79DaqlNcRyVOnjm162rkTzjkHWreGoUPhyBHAbXW8zp1z+yu4\n917o0wf2l/20ZS0uaMHo20bzw6AfGHnLSNJ+SKPpxKY8PP9hFqcvJttkl3mZpOrxNqI0xPZLGGAt\n8Espr9sSyAbewy5ktMG1vRXwoetajYCvgStd+7pTTUJK78cf4dVXYeFCeOEFkhs2JOXJJ/Mn5B07\nBmPGlHq9bX8puO5Fn7Z9iI6Iptn5zYJWJqk4KuK0HEvIHyRewgaEnFVkkoF47PTk7hQkxH+2b8cM\nG0ZcUhIJp08T17EjCStX5h+S6iG/omB/hb+ytr2l3AvxVaCWLw2kJeRvbpoMPOL2fCpQYMFjQBnX\n4mdfzZ1rkmvVMgbMVw6HSX7uOWM8ZW4vXWpMu3bG3HijMWvW5G4OVNa2NzJOZ5h5384zd/7fneb8\nceebfl/0Myt+XOE581yqNEqQce0hJdVvFgOXetg+FFjow3k8vqn4+Pjcx5GRkURGRvpwSpE8xhhS\n3nyThIwMAJzGEPfOO0QtXYpj/Pj861jk5FfMnGn7K6KiYMwYJk1KJT19dL7zpqePZvLklwM+jDa0\neijdW3Wne6vu7D+2n1mbZxH9eTTVHNW07kUVl5aWRlpaWsCvkwBcHaBzF6xJDHHdciQDHT0cF+yA\nLJXIV3PnmuSwMONeDfgqLMwkDxxoTLNmxkRFGbN+/dkH/v67nQ/qggvMlCa3mFqcyFeTAGO6dBlR\n5u/HGGOys7PNv3/4t+n7eV9Tb1w9c/eHd5sF2xeYzDOZQSmPlA+UoCbhzeimHcD7wBrgSeA8Xy9S\nDPf2sS+wyXo1gaZAC9d1RQImLSmJFe3bE9+lS+5tZfv2LDl6FHbssDWGu+6Cnj1h9+68A+vWzV1v\n+8qTv7CDq85abzsQWdvecDgc3NT4JqbeM5V9g/fR46oeTFg9gcvfvpy4lDi2/XdbUMolFY8vHRgt\ngWjgYeDfwBRsTaAk7gMmARcCR4GNwB2u14YCscAZYCCQ4uF4V1AUKSPF5FgkJS3jg8en8Pz+bzlJ\nbQYxgd/CPy2zrG1vFVz3IjYill5telGvVr1gF03KQCBHN4Vg52yKAS4DPgE6ASeAh3y5oJ8oSEhw\n5KxjkZgITz5pRzzVs1+wSUnL+MekFG7eu5V+Py7hRKdOXD5rmsf1K4JN615UTYEKEm9jA8S/sKON\n3Jt/vgP+5MsF/URBQoLrxx8hPh4WLbKB4umnoXbtvBXy3n4bx9ixMGWKza+IiwtqfkVRCuZeRLeN\nJjoimqbnNw120cTPAhUkYrA1hz88vFYPOOLLBf1EQULKh+3bYdgwWLcO4uNJrlOHlH798hLycvIr\n1q6F8eMDtt62v7jnXrS5uA0xETHKvahEAhUk/gXcWmBbztKmwaIgIeXLqlWYF18kbs0aEjIyzk7I\ny1m/Ime97fbtg1veYmjdi8rJ30GiNhCG7ZyOdNt+LnZoakvfiudXChJS7iTPnYujd2+cmZkkV6uG\n45VXcI4YkbdDVpbNr8hZb3vMmLP6K8o6a9sbP//+M7M2zyJxUyIh1UKUe1GB+TvjehCwF8h03efc\ntgDP+OsiJRSUMcYihcnOzjaDOnY02a4EiWwwg0JDTXZUlDEbNuTf2S2/wowalbvedjCztr2RnZ1t\nvvnhGxP7WaxyLyooSpAn4Y3+gThpKQX7by2ST6EJeY89ZsyllxrTs6cxu3blP2jPHmN69DDmiiuM\nmTPHRN0+9KxkPDDG6RwelPdUlGOZx0zixkTTeXpnc9HrF5nByYPNll+3BLtYUgz8PC3Hrdj+iP3A\n/R5eX+DrxUQqq7SkJELbt2dlwRXyzpzBuWuX7Ye4/nrbcf3yyzbHomlTmDs3t7/izfSDxHAf68nf\nX5GREVLWb6dYdWrWITrCjoLKWffijv+7Q+teVEJFtU29CozAriPhKfrEBKJAXnIFRZEK5OBBGDcu\nf47Fea4JDLKyeKvtvfT6dgOpRDGUMfyC7a9wOl8mOXlkEAvunazsLBbvWUzipkRSdqdwR4s7iI2I\n5damtxJSrfwFuqqoIk4VXlIKElJxFVjHIifHIilpGUP7f0HPvTV4jPeZQByfNT3C65O7Bb3z2leH\nThzKn3vhqnVo3Yvg8neQeNbDNuM6xmAn/gsWBQmp+LZvtyOd1q61iXl9+pCUsoJJk1I5sOFTJlXL\npj1HCJs0odznVxRF616UH/4OEvF4bmbKCRKv+nIhP1OQkMpj1SoYMgT++18YPZrkM2dI6dvXJuRd\ndFGFyq8oinvuxYp9K3ig1QPERMRw/WXXK/eijKi5SaSiMgZSUjBDhhC3ezcJf/yRl5CXnV1sfkVF\nUzD3IjYilt5te3NpHU9L0Ii/+DtIvIhdRnSyh9cMMMCXC/mZgoRUSmcl5I0fj/O55+yLOettV4D5\noLxljGH5vuUkbkxkwc4FdG7cmZiIGO668i5qhtQMdvEqHX8HiW7YFeSiPbxmgJm+XMjPFCSk0jHG\nEHfDDSSsXp3bphtXowYJ99+PY9QoaN7c7ljEfFDlMWPbW8dPHWfe9nlM3zid7w59xyNtHiG2XSyt\nL24d7KJVGoFubjoPyAaO+XKBAFGQkEoned48HH364DxxIm9bWBiOe+7BuXhx/hwLgKVLbX/FOefA\nhAkkHTjBwIEp+ZZRDQ8fxsSJzgoTKHLk5F7M3DxT6174UaCCRAdgOnbOJrCzvvYF1vlyIT9TkJBK\nZ0hMDKF79uTrxDXGkNmsGePefPPsdSzOO8/OBzVjBgwfTmq1i4ne/1VufkWOipJn4YnWvfCvQAWJ\nrcDfgG9czzsB7wDX+HIhP1OQkKqpkBwLfv+d/2t9J859O3mbwSQQRwa2v6JLl3jS0uKDW24/yFn3\nYvrG6Rw6eYg+bfso98JHJQkS3oTiM+QFCLBLl57x5SIi4ieNG8O0aZCWBitWwJVX2udhYcy6KpLr\nWEM7NrKdlrnrbQdrnW1/q1+7Ps9c9wwbntjA5z0/52jGUTpO7cgtM29h9ubZnDh9oviTiM+Kiih/\ndt33xk4b/pHr+UNABjA4gOUqjmoSIpCXY3HgAOvvf4SH5pwgfc9oWnAXc9hPdq1DZIx9mU6DHg92\nSQNCuRe+8XdzUxp5yXQOD49v8a14fqUgIZLDlWPBkCH8dvIUT5+5kDo/rGbH1Xfzj8jmXPPJLHA6\nK0V+RVG07kXxlEwnUpVlZ2PmzCEuNpaEzEziWrcmYcsWHMeO2U7vSpRfURT33Iv5O+bT+Qqbe3H3\nlXdX+dyLQAaJu4FWQC23ba/5ciE/U5AQ8cB9GG0y4LjxRpwzZ9ociz17bGf3unUVYr1tfzh+6jhz\nv51L4qZEdh7cyV+v+SsxETG0uaRNsIsWFIEKEu9h+yRuBaYADwCrscNgg0VBQqQAj8l4l11GwokT\nOB58EF55xeZYFMivqMjzQfmiYO5FTEQMvVr3qlLrXgRqdNONwKPAYeykftcDf/K1cAU8AHwLZAHX\num1vApzlysIUAAAVtklEQVQENrpu75TyOiJVRsr8+XTdujX3G8ABOA8fJvXNN+0Ega1bw7Bh0Lat\nrU3ExEC3bhAdDfv3B7HkZaPFBS0Yfdtofhj0AyNvGcnSH5bSdGJTHp7/MIvTF5NtsoNdxHLJm4iy\nBrgOWAV0Bw4B24DmpbhuS2z29nvYKck3uLY3wU4FUlxdUDUJkQKKTMZLTLQ5FvHxsGhRXo7F6dO2\nv+L9921/xbPPkvSvtRV2ag9fHTpxiI+2fVRlci9KUpPwxsvA+dgAcQD4FfBX+uYSzq5JbPXiuACu\nAitSyX37rTF/+Ysxl11mzNSpxpw+bUx6ujHdu5s/LrrE9L/kLwayc9fYDg8fahYtWhrsUgfcxl82\nmgFfDjAXvn6hiZwRaWZtmmX+OPVHsIvlV5RgjWtfI0ootvP6qK8XKsQSzq5JbAN2ua4xHJu8V5Dr\n/YpIibnlWDB6NNx3H89d9yiPrNvGCcIYyNus5zqgYk/t4Sv33IuV+1bSo1UPYtvF0rFRxwqfe1GS\nmkR1L/apjZ2WoxM2Cn0DvItNqCvKYsDT5PBDsU1KnuwHLgd+w9YwPgOuxsOkgvHx8bmPIyMjiYyM\nLKY4IpLP9dfDkiW5ORaMH8+ZUy1pzzr6kMif6cIzPMBQxpGRUXXWqA6tHkqPVj3o0aoHP//+M7O3\nzKbPZ32o5qhW4da9SEtLIy0trVTn8CaizAV+Bz5w7f8wdkbYB0p1ZatgTcLb11WTEPGn7Gz4+GP2\n9/0bW0525DluoyMjCeE2xrKMRc3b0GfLV5U6v6IoxhhW7FvB9I3TK/S6F4EaArsdmyNR3LaSWAI8\nB6x3Pb8QW4vIApoBy4DW2Jln3SlIiATAl5/9k1WPvc6hQ//i75zhFiLg8o58dPlOGvy0F15/vUrk\nVxQlZ92LnNyLirTuRaCGwG4AbnB7fj15X+oldR+wz3WuJOAr1/YuwGbs8Ne5wBOcHSBEJEDu/Mtt\nhPa7iahqDhzAi2yi74UbaDDvI5g1C8aNg06d7IJHVVSdmnWIjohmafRSlscuJ6xGGF0/6EqHKR14\nd+27HMmoXF9ZRUWUnFFG1bF5EfuwfRKNge+AqwJbtCKpJiESAMZTQt6ll5KQmYnjqafg2Wfh00/z\n1tseO7ZSzwflrYqy7oW/axLdXLc7sE0/N2N/6TdzbRORSsZjQt7vv5M6Zgz88gu0bAm//QabNtng\n0KYNjBoFJ08Gs9hBF1ItBGdzJx/3+Jg9A/dw4+U38uLXL9J0YlNGLBnB3t/2BruIJeZtRIkAOpM3\numlzwErkHdUkRAKg2IS87dtt1va6dTYxr3NnGDrUNj+pv+Ism37dROLGRD7c9iGtL25NbEQs3Vt1\nJ6xGWFDKE6iO64FAP2CBa/+/YOdwmuRj+fxJQUIkmArmWNSvbzO2w8LsfFAdOgS7hOVKecm9COTy\npdcDf7ien4OdoiOY0ygqSIgEm9s6FoSG2mDxww8wfDg/tWrL82f+xH7qUatWVqWe2sNXBde9KMvc\ni0AGieuwE++BTa5bg4KEiEBujgXDh0Pz5qy49W62jPuIHkd2cj9NWcM3XBY+mokTnQoUbozbuhdl\nlXsRqCARB0STv7lpBvC2T6XzLwUJkfLm1CmYOpVDg19g8am7SaAl1zGajtRjEX/naNRWklNGBbuU\n5VJZ5V4EIkhUw+ZIZJB/Wo6NJSifPylIiJRTd3QeyrX/rs1RXmUyWdxFC0YRRo1zD9Pm6/nqryjG\n7sO7mbFpBjM2zaBB3QbERsTSq00v6tWqV+pzB6omsQk7uqk8UZAQKaeczuH8OzWC2fThfk7wJfAZ\nfyGi5Qn+dmSL8iu85Cn34v1u71OnZp0SnzNQGddfAz18PbGIVE39+99Oh9CB3McJwCZVZVRLIXb/\naruGxUUXKb/CCwVzL5zhTs6pcU6Zl8ObIPEk8AlwCjsb6zHshH8iImepnvE/nudwvoS8B2sYlr4a\nD+vX207u55+HDRtsct7HH9uRUlKo+rXr0yeiT1CmKq+otQM1N4mUU8Um5LnnWDz8MMyfn7fetvor\nAipQfRIO4H5sx3U2dhGgT30tnJ8pSIhUZO45FjVrQpcu8MEH4HTCmDHqrwiQQPVJvIOdjXUL8C22\n+ekdXwsnIpLL4YCuXW2T0+DBsGABXH213X7NNTYxz9VfoR+EweVNRNmJXTsi2/W8GnY9iZaBKpQX\nVJMQqUxcORaMHAnt28OZM7BjB2bcOOJSU0mYNq3CLx1aHgSqJrEbOz14jsaubSIi/lGzJvztb7Br\nF3TsCGvX8muDy5kV3Y+sxBk8cOWtJCUtC3YpqyRvgsS5wA5gKZCGrUXUxa5T/UXASiYiVU+dOjB8\nOKmTprNw+ynWZp5kIoZLdv+bkz2f5utZC4Jdwiqnuhf7vOJhm4HcNUlERPzqrZlr+PfvzzObPjg4\nwV2c4dvjhsf7PgL7hkNcXJVdb7useRMk0gJdCBERdxkZIbThzXwJeR+zn9OOELsy3vvva/2KMlJ+\n1tUTEXE5c2Qbz5N/hbxuZPL0FR1skxTASy/Z9bbXrQtWMasEBQkRKXeaXHyCKbUuIJIuubeptS6g\nepNasGQJvPcenHeeXVLV6YToaNi/P9jFrpQqaj1NQ2BFKrmkpGVMnryYjIwQatXKon//2/OvR5Gz\njsXQobbJ6fBhO91Hgf4KY4yGz7oEctGhnI7qHEeBtcAo4JAvF/QTBQkRsXJyLF591a6Ql5UFCQnw\n4IMYIO6xx0iYOlWBgsAFiTeAM8CHrv17AmHAr8BNQDefSukfChIikt8ff9j5n954A2rUgKZNSe7e\nnZTRo+mamIize/dglzDoAhUkNgLtCtm2lZItY/oGcDd2Ztl0IAZbOwF4CYgFsoABQKqH4xUkRMSz\nQ4dg9GjMe+8Rl5FBQnY2cddeS8K6dVW+NhGojOsQoKPb8+vcjjvjy8XcpAJXA22B/2ADA9jpPx5y\n3XfFzhGlznUR8d4FF0BCAilvvUVXhwMH4NywgdSHHtL6FSXgzRdwX2Aa8L3rNg3oB5wDjC3hdReT\nNxfUauAy1+N7gY+A065r7cYGJRERrxljmDNhMlFZWQA4ga/mzsM0agQffqj1K3zgTZBYC7TG/upv\ni21eWgP8gV2MqLRigS9djxsCP7m99hPQyA/XEJEqZMzQkdzzn1358iwiqcan1WtCbCy0agVr1waz\niBWGNxnX9YARQM7YszTgNfL6EAqzGLjUw/ah2HmfAIZh+yU+LOI8HkN+fHx87uPIyEgiIyOLKY6I\nVBXzZs3nXHMDk9ya3w2GYzWOcP/8afDUU3DTTXDLLZCYWGnXr0hLSyMtLa1U5/CmA2MBtoN6pmv/\n3sA12IWISiMa22x1G5Dh2jbEdT/OdZ+MDVCrCxyrjmsRKVRkZDxLl8aftb1Ll3jS0uJtjsWMGfDs\ns3ZUVL9+8OablX4+qEB1XIdjv6j3YEcixbu2lUZX4HlsH0SG2/YvsENsawJNgRbYpi0REa+Fhnoe\nU1Orlu2joFo12+x04AAMHw7Tp8OFF8LEiR77K6ryj1JvgsRJoLPb807gmnWr5CYDdbBNUhvJW+lu\nO7afYzvwFfA3NNOsiPhowIAowsOH5dsWHj6U/v1vz79jzZrwyivwv/9Bz562ZtGwISQn5+5ijCHu\nsceqbKDwptoRAcwCznM9/w3oA2wOVKG8oOYmESlSsdN6eHLgAPTuDV9/Da1bwyefkLxtGymxsZUi\nIS9QyXQ5coLEUWAQMMGXC/mZgoSIBM6330KvXpitW4k77zwSjh4lrmNHElaurNAJeYHqk8hxlLwR\nTc/6chERkQrl6qthyxZShg2j69GjNiFv/XpSP/HHqP+KRdnMIiIeGGNI+fprolzPnWfOkNyrF2b8\n+CqVjKcgISLiQcr8+XTdmn/hI2dICKlDh8LFF8PcucEsXpkpqm3qOIWPLArDzukULOqTEJGAGhIT\nw/F1G/n5p98wxoHDYWh02fnUueZqxh0/DosWQbNmMHMm3HhjsIvrFX/3SdQB6hZyC2aAEBEJuM49\nYkg+eRefHfmBz49+z2dHfiD55F10fvgJ+Pxz27ldpw7cfLMNErt2BbvIAaHmJhERDyZNSiU9fXS+\nbenpo5k8ebF90rIlbNwICxfC3r12PqgePeySqh5U1NYPBQkREQ8yMz1PbZeRUaAh5Y474Kef7LQe\nX30FTZtC//5w5EjuLhU5IU9BQkTEg2Kn9nAXEgIDB9paRGwsTJkCl10GY8fCyZOkzJ8Pc+eSumBB\ngEvtfwoSIiIeeD21h7tzz4V33oHt220/xciRmEaNSHnhBRKOHSP5jTcqXG2ioqYOanSTiARciab2\ncLd0Kck9e+L49VecQHJoKI4PPsDZo0fAylyUQE/LUZ4oSIhIuWeMIe6GG0hYvRoHNqcgLiyMhIUL\ncdx6a5mXJ9DTcoiIiA88JuSdOEFqt25w++2wYUMwi+cV1SRERAJkSEwMoXv25JsU0Jw8Seavv9qE\nPGMgKgpGjYLmzQNeHjU3iYhUFMuW5Q2VPXoUevWya1s0aBCwS6q5SUSkorj5ZtvcNGIE1Kplg0ar\nVjB0aL4cC3fB+HGsICEiEkBJSctwOocTGRmP0zmcpKRleS+GhNi8il274J577LaUFLjySpucd/Jk\n7q7BSshTkBARCZCkpGUMHJhCauooli6NJzV1FAMHpuQPFAB169rEuw0b7KSB1avDJ5/YYDFtGpw5\nE7SEPPVJiIgEiNM5nNTUUR62v0xy8sjCD1y2DAYNgqwsqF4d88cfxGVnk7BrV6lWyFOfhIhIOeL1\n/E8F3XwzrF1rp/rYv5+UmjXpmp5uh9Bu3VqmtQkFCRGRAPFp/qeCXP0V5rvvSDl4kKjsbMDmWZTl\n9B4KEiIiAVKi+Z8KSElNzV1nGyjz2oT6JEREAqi08z95TMgzhsxmzRiXmOhTWSpSMt0bwN3AKSAd\niAGOAk2AHcBO134rgb95OF5BQkTERxUpSNwO/BPIBsa5tg3BBomFQJtijleQEBHxUUUa3bQYGyAA\nVgOXBakcIiJShPLQcR0LfOn2vCmwEUgDOgWjQCIiYnkexOsfi4FLPWwfim1SAhiG7Zf40PV8P3A5\n8BtwLfAZcDVwrOBJ4uPjcx9HRkYSGRnpn1KLiFQSaWlppKWlleocwRzdFA30A24DMgrZZwnwLFBw\n0nX1SYiI+KgkfRKBrEkUpSvwPNCF/AHiQmwtIgtoBrQA9pR56UREypGkpGVMmpRKZmZ1QkPPMGBA\nlG/LqJZCsILEZKAmtkkK8oa6dgFeBU5jO7afADzPmSsiUgXkTBKYnj46d1t6uk3QK4tAoWQ6EZFy\nrMSTBHpQkYbAioiIF0o8SaCfKEiIiJRjpZok0A8UJEREyjF/TBJYGuqTEBEp50o7SWCOijR3U2kp\nSIiI+Egd1yIi4lcKEiIiUigFCRERKZSChIiIFEpBQkRECqUgISIihVKQEBGRQilIiIhIoRQkRESk\nUAoSIiJSKAUJEREplIKEiIgUSkFCREQKpSAhIiKFUpAQEZFCKUiIiEihFCRERKRQwQoSI4HNwCbg\nn8Dlbq+9BOwCdgJRZV80ERHJEawg8TrQFogAPgNGuLa3Ah5y3XcF3kG1nYBLS0sLdhEqFf09/Ut/\nz+AK1hfwMbfHdYCDrsf3Ah8Bp4Hvgd3AdWVasipI/wn9S39P/9LfM7iqB/Hao4HewEnyAkFDYJXb\nPj8Bjcq4XCIi4hLImsRiYKuHWzfX68OAxkAiMKGI85gAllFERIrgCHYBsIHiS6A1MMS1bZzrPhnb\nX7G6wDG7gfAyKZ2ISOWRDjQPdiG80cLtcX9gtutxK+yIp5pAU+wbKg+BTEREytA8bNPTJmA+cLHb\na0OxNYWdgLPsiyYiIiIiIpVSV2wtYxfwYpDLUhl8D2wBNgJrgluUCmc6cABbK85RHzto4z9AKlAv\nCOWqqDz9PeOxoxw3um5dy75YFdblwBLgW2AbMMC1vVJ/RkOwTVFNgBrY5qqrglmgSmAv9kMjvusM\ntCP/l9rrwAuuxy+SNwhDiufp7zkCiAtOcSq8S7EJy2Dz0b7Dfl9W6s/oDdgRTzmGkDciSkpmL3BB\nsAtRgTUh/5faTuAS1+NLXc/Fe004O0g8G5yiVDqfAf8fPn5GK9qUF42AfW7PlWxXegb4GlgH9Aty\nWSqDS7BNJrjuLyliX/FOf+xcb9OoZE0jZagJtpa2Gh8/oxUtSCixzv9uwn547gCexlb5xT8M+syW\n1rvY4fARwC/AW8EtToVUBzuKdCD5p0QCLz6jFS1I/Ez+GWMvx9YmpOR+cd3/D/gUzZVVWgewVXiA\nBsB/g1iWyuC/5H2RTUWfT1/VwAaI2djmJvDxM1rRgsQ6bCJeE2zC3UPAF8EsUAUXBtR1PT4HOzX7\n1sJ3Fy98AfRxPe5D3n9MKZkGbo/vQ59PXziwTXTbyT/1UaX/jN6B7aXfjV17QkquKXaE2CbsEDn9\nPX3zEbAfOIXtK4vBjhT7mko6vDDACv49Y4FZ2CHam7FfZurj8V4nIBv7/9t9CLE+oyIiIiIiIiIi\nIiIiIiIiIiIiIiIiIiIV09vYqQhypABT3J6/BQwu4bkjgYU+bC+te8k/43Ea8OcAXEckn4qWcS3i\ni38DN7oeV8POdtvK7fUbgOVenivY/1fuI3/ZNSeUlIlgf/BFAmklNhAAXI3NKj+GzTANxf4y3wDc\n5rrfgp3GoKbrmO+xc+2vBx7AZqvucD2/z4vrn4NdSGe16/z3uLZHAwuAr7BZr+PdjumLnVFgNfA+\nMNn1HroBb7jO08y17wOu/b7DZteKiIiP9mAngnwceAJ4DTu1y03AUmyw+BFo7tp/JnlNVHuB51yP\na7n2C3c9/xjP84ZFktfcNAZ4xPW4HvbLPAwbJNKx82aFYoNRI6Ch65r1gOrAMmCS6/hE4H636yzB\nBg1c72dxEX8DkRJTTUIquxXYJqcbsTWLla7HOU1Nf8J+Me927T8TuNnt+I9d9y1d+6W7nn+AnUCt\nKFHYRbE2Yr/UQ4HG2Kaif2JrNZnYCdiaYGc4XQocAc4Acwtco+D1FrjuN7iOF/G76sEugEiALcfW\nGtpgZxDdh60dHMU2BRXkIH97/x+FnLe4AJHjfux67O46YoNDjizs/8WC/QwFr1Hw9Zxz5Bwv4neq\nSUhltwK4GziE/ZL9Dducc4Prtf9gf4XnNCP1xv6aL2ina7+c/oBeXlw7hbzF58Eu7gSeA4wB1gJd\nyGtu6k5eYDgGnOvFNUX8SkFCKrtt2FFNq9y2bcE26RwGMrBTfM91bT8D/P+u/dx/uWdg+zWSsB3X\nB/A8wsh9pa+R2EVftrjK8aqHfdztx/ZjrMGOzNqLrfEAzAGed127mYdjNdpJRKQKOMd1Xx3bMX5v\nEMsiIiLlzBvYju4d5F9NTERERERERERERERERERERERERERERESK9/8Aup7Z7vCt+QEAAAAASUVO\nRK5CYII=\n", - "text": [ - "" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "' '.join(segment(sanitise('HELMU TSCOU SINSA REISU PPOSE KINDI NTHEI ROWNW AYBUT THERE ISLIT TLEWA RMTHI NTHEK INDNE SSIRE CEIVE ')))\n" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 9, - "text": [ - "'helmut s cousins are i suppose kind in their own way but there is little warmth in the kindness i receive'" - ] - } - ], - "prompt_number": 9 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [], - "language": "python", - "metadata": {}, - "outputs": [] - } - ], - "metadata": {} - } - ] -} \ No newline at end of file -- 2.34.1