Moved cracking files into directories
authorNeil Smith <neil.git@njae.me.uk>
Thu, 7 Jan 2016 16:39:43 +0000 (16:39 +0000)
committerNeil Smith <neil.git@njae.me.uk>
Wed, 4 Oct 2017 08:17:03 +0000 (09:17 +0100)
40 files changed:
2013-challenge6.ipynb [deleted file]
2013-challenge7.ipynb [deleted file]
2013/2013-challenge6.ipynb [new file with mode: 0644]
2013/2013-challenge7.ipynb [new file with mode: 0644]
2014-challenge1.ipynb [deleted file]
2014-challenge2.ipynb [deleted file]
2014-challenge3.ipynb [deleted file]
2014-challenge4.ipynb [deleted file]
2014-challenge5.ipynb [deleted file]
2014-challenge6.ipynb [deleted file]
2014-challenge7.ipynb [deleted file]
2014-challenge8.ipynb [deleted file]
2014/2014-challenge1.ipynb [new file with mode: 0644]
2014/2014-challenge2.ipynb [new file with mode: 0644]
2014/2014-challenge3.ipynb [new file with mode: 0644]
2014/2014-challenge4.ipynb [new file with mode: 0644]
2014/2014-challenge5.ipynb [new file with mode: 0644]
2014/2014-challenge6.ipynb [new file with mode: 0644]
2014/2014-challenge7.ipynb [new file with mode: 0644]
2014/2014-challenge8.ipynb [new file with mode: 0644]
2015-challenge1.ipynb [deleted file]
2015-challenge2.ipynb [deleted file]
2015-challenge3.ipynb [deleted file]
2015-challenge4.ipynb [deleted file]
2015-challenge5.ipynb [deleted file]
2015-challenge6.ipynb [deleted file]
2015-challenge7.ipynb [deleted file]
2015-challenge8.ipynb [deleted file]
2015/2015-challenge1.ipynb [new file with mode: 0644]
2015/2015-challenge2.ipynb [new file with mode: 0644]
2015/2015-challenge3.ipynb [new file with mode: 0644]
2015/2015-challenge4.ipynb [new file with mode: 0644]
2015/2015-challenge5.ipynb [new file with mode: 0644]
2015/2015-challenge6.ipynb [new file with mode: 0644]
2015/2015-challenge7.ipynb [new file with mode: 0644]
2015/2015-challenge8.ipynb [new file with mode: 0644]
SIGNED.md
cipher.py
cipherbreak.py
language_models.py

diff --git a/2013-challenge6.ipynb b/2013-challenge6.ipynb
deleted file mode 100644 (file)
index ca4e493..0000000
+++ /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": "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\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": [
-        "<matplotlib.figure.Figure at 0xaeb9980c>"
-       ]
-      }
-     ],
-     "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": "iVBORw0KGgoAAAANSUhEUgAAAaIAAAEkCAYAAABt4jWqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGg9JREFUeJzt3X1wFPUdx/HP8mBByEESycaCNYwQQiCQ43EQI4chwZGB\nAkLQIr1KxdFOpx2nlcDYltgHPcbYFqwPlbaodUqH8keMaKkCPUa0SEGkOIi0lRShySleDsKzSbZ/\nUKIoyV4ud/kll/dr5sYk/L77+yZe7pPd/e2e5TiOIwAADOlmugEAQNdGEAEAjCKIAABGEUQAAKMI\nIgCAUQQRAMAo1yB677335PV6mx79+vXT6tWrFQ6HVVRUpOzsbBUXFysSibRHvwCAJGO15jqixsZG\nDRw4UDt37tRjjz2mq666SkuXLtXKlStVW1urQCCQyF4BAEmoVYfmNm/erCFDhuiaa65RZWWl/H6/\nJMnv96uioiIhDQIAklurguiPf/yjbr/9dklSKBSSbduSJNu2FQqF4t8dACDpRX1o7vz58xo4cKD2\n79+vAQMGKDU1VbW1tU3/npaWpnA4nLBGAQDJqUe0A//85z9r7NixGjBggKQLe0E1NTXKzMxUdXW1\nMjIyvlCTn5+vvXv3xq9bAECnNXr0aL399ttf+HrUh+bWrVvXdFhOkmbNmqVnn31WkvTss89q9uzZ\nX6jZu3evHMfp0o8VK1YkvKY95qCGGmqoaeujuR2TqILo1KlT2rx5s+bOndv0tWXLlunVV19Vdna2\ntm7dqmXLlkWbaQAANInq0FyfPn107NixS76WlpamzZs3J6QpAEDX0b2srKwsURt/8MEHlcDNdxpZ\nWVkJr2mPOaihhhpq2qK5TGjVBa2tZVmWErh5AEAn0lwmcK85AIBRBBEAwCiCCABgFEEEADCKIAIA\nGEUQAQCMIogAAEYRRAAAowgiAIBRBBEAwCiCCABgFEEEADCKIAIAGEUQAQCMIogAAEYRRAAAowgi\nAIBRBBEAwCiCCABgFEEEADCKIAIAGEUQAQCMIogAAEYRRADQRXg8abIsK6qHx5PWbn1ZjuM4Cdu4\nZSmBmwcAtIJlWZKifU2O/+t3c5nAHhEAwKiogigSiWjevHkaPny4cnNz9eabbyocDquoqEjZ2dkq\nLi5WJBJJdK8AgCQUVRB997vf1S233KJ3331X//jHP5STk6NAIKCioiIdPHhQhYWFCgQCie4VAJCE\nXM8RHT9+XF6vV++///4lX8/JydG2bdtk27Zqamrk8/l04MCBSzfOOSIA6DA67TmiQ4cOacCAAbrz\nzjs1ZswYLVmyRKdOnVIoFJJt25Ik27YVCoXi2jAAoGtwDaL6+nq99dZb+ta3vqW33npLffr0+cJh\nuIvL/QAAaK0ebgMGDRqkQYMGafz48ZKkefPm6eGHH1ZmZqZqamqUmZmp6upqZWRkXLa+rKys6WOf\nzyefzxeXxgEAHVswGFQwGHQdF9V1RDfeeKN+85vfKDs7W2VlZTp9+rQkKT09XaWlpQoEAopEIpfd\nU+IcEQB0DB31HFFUQbR3717dddddOn/+vK677jqtXbtWDQ0NKikp0eHDh5WVlaX169erf//+UU0K\nAGh/nTqI4j0pAKD9ddQg4s4KAACjCCIAgFEEEQDAKIIIADqhjvqWDrFgsQIAdEKxLDxgsQIAAJdB\nEAEAjCKIAABGEUQAAKMIIgCAUQQRAMAogggAYBRBBAAwiiACABhFEAEAjCKIAABGEUQAAKMIIgCA\nUQQRAMAogggAYBRBBAAwiiACABhFEAEAjCKIAABGEUQAAKMIIgCAUQQRAMAogggAYFSPaAZlZWXJ\n4/Goe/fu6tmzp3bu3KlwOKwFCxboP//5j7KysrR+/Xr1798/0f0CAJJMVHtElmUpGAxqz5492rlz\npyQpEAioqKhIBw8eVGFhoQKBQEIbBQAkp6gPzTmOc8nnlZWV8vv9kiS/36+Kior4dgYA6BKi3iOa\nNm2axo0bpzVr1kiSQqGQbNuWJNm2rVAolLguAQBJK6pzRK+//rquvvpqffTRRyoqKlJOTs4l/25Z\nlizLSkiDAIDkFlUQXX311ZKkAQMGaM6cOdq5c6ds21ZNTY0yMzNVXV2tjIyMy9aWlZU1fezz+eTz\n+drcNAAkG48nTXV1ta7jUlJSdeJEuB06artgMKhgMOg6znI+f/Lnc06fPq2GhgalpKTo1KlTKi4u\n1ooVK7R582alp6ertLRUgUBAkUjkCwsWLMv6wrklAMAXXTiqFM3r5YXX1ejHt60mnprLBNcgOnTo\nkObMmSNJqq+v18KFC7V8+XKFw2GVlJTo8OHDzS7fJogAIDoEUYIQRAAQna4cRNxZAQBgFEEEADCK\nIAIAGEUQAUCceTxpTddXtvTweNJMt9ohsFgBAOKstQsPYqlhsQIAAHFCEAEAjCKIAABGEUQAAKMI\nIgCAUQQRAMAogggAYBRBBAAwiiACABhFEAEAjCKIAABGEUQAAKMIIgCAUQQRAMAogggAYBRBBAAw\niiACABhFEAEAjCKIAABGEUQAAKMIIgBogceTJsuyXB8eT5rpVjsty3EcJ2EbtywlcPMAkHCWZUmK\n5nXs09e79qiJfnzbauKpuUxgjwgAYFRUQdTQ0CCv16uZM2dKksLhsIqKipSdna3i4mJFIpGENgkA\nSF5RBdGqVauUm5v7/906KRAIqKioSAcPHlRhYaECgUBCmwQAJC/XIDpy5Ihefvll3XXXXU3H9ior\nK+X3+yVJfr9fFRUVie0SAJC0XIPovvvu0yOPPKJu3T4dGgqFZNu2JMm2bYVCocR1CABIai0G0caN\nG5WRkSGv19vs6omLSxcBAIhFj5b+8Y033lBlZaVefvllnT17VidOnNCiRYtk27ZqamqUmZmp6upq\nZWRkNLuNsrKypo99Pp98Pl+8egcAdGDBYFDBYNB1XNTXEW3btk3l5eV68cUXtXTpUqWnp6u0tFSB\nQECRSOSyCxa4jghAZ8d1RPETl+uILh6CW7ZsmV599VVlZ2dr69atWrZsWXy6BAB0OdxZAUCn5PGk\nqa6u1nVcSkqqTpwIx1zDHlH8NJcJBBGATqmjBkR71SRTEHGLHwCAUQQRAMAogggAYBRBBAAwiiAC\nABhFEAEAjCKIAABGEUQAAKMIIgCAUQQRAMAogggAYBRBBAAwiiACABhFEAEAjCKIAABGEUQAAKMI\nIgCAUQQRAMAogggAYBRBBAAwiiACABhFEAGIK48nTZZluT48nrQ21SB5WI7jOAnbuGUpgZsH0AFZ\nliUpmt/7T18fqGl9TfTj21YTT81lAntEAACjCCIAgFEEEQDAKIIIAGBUi0F09uxZTZw4Ufn5+crN\nzdXy5cslSeFwWEVFRcrOzlZxcbEikUi7NAsASD6uq+ZOnz6tK6+8UvX19brhhhtUXl6uyspKXXXV\nVVq6dKlWrlyp2tpaBQKBL26cVXNAl9NRV5klW02XWjV35ZVXSpLOnz+vhoYGpaamqrKyUn6/X5Lk\n9/tVUVER12YBAF2HaxA1NjYqPz9ftm1r6tSpGjFihEKhkGzbliTZtq1QKJTwRgEAyamH24Bu3brp\n7bff1vHjxzV9+nT99a9/veTfL17xDABALFyD6KJ+/fppxowZ2r17t2zbVk1NjTIzM1VdXa2MjIxm\n68rKypo+9vl88vl8bekXANBJBINBBYNB13EtLlY4duyYevToof79++vMmTOaPn26VqxYob/85S9K\nT09XaWmpAoGAIpEIixUASOq4J/eTrSaZFiu0uEdUXV0tv9+vxsZGNTY2atGiRSosLJTX61VJSYl+\n+9vfKisrS+vXr49rswCAroObngKIq466B5FsNcm0R8SdFQAARhFEAACjCCIAgFEEEQDAKIIIAGAU\nQQQAMIogAgAYRRABaJbHk9Z0P8mWHh5PmulW0YlFfa85AF1PXV2torkAsq6OGx8jduwRAQCMIogA\nAEYRRAAAowgiAIBRBBEAwCiCCABgFEEEADCKIAIAGEUQAQCMIogAAEYRRAAAowgiAIBRBBEAwCiC\nCABgFEEEADCKIAIAGEUQAQCMIogAAEYRRAAAo1yD6IMPPtDUqVM1YsQIjRw5UqtXr5YkhcNhFRUV\nKTs7W8XFxYpEIglvFgCQfCzHcZyWBtTU1Kimpkb5+fk6efKkxo4dq4qKCq1du1ZXXXWVli5dqpUr\nV6q2tlaBQODSjVuWXDYPoAOzLEtSNL/Dn/6uU9M+NdGPb1tNPDWXCa57RJmZmcrPz5ck9e3bV8OH\nD9fRo0dVWVkpv98vSfL7/aqoqIhrwwCArqFV54iqqqq0Z88eTZw4UaFQSLZtS5Js21YoFEpIgwCA\n5BZ1EJ08eVK33nqrVq1apZSUlEv+zbKs/+/yAQDQOj2iGfTJJ5/o1ltv1aJFizR79mxJF/aCampq\nlJmZqerqamVkZFy2tqysrOljn88nn8/X5qaBrs7jSVNdXa3ruJSUVJ04EY65BmiLYDCoYDDoOs51\nsYLjOPL7/UpPT9cvfvGLpq8vXbpU6enpKi0tVSAQUCQSYbEC0E466gl0alis0OIWm8kE1yDavn27\nbrzxRo0aNarp8NvDDz+sCRMmqKSkRIcPH1ZWVpbWr1+v/v37RzUpgLbpqC+O1BBELW4x1iBKxKQA\n2qajvjhSQxC1uMVYl28DAJBIBBEAwCiCCABgFEEEADCKIAIAGEUQAQCMIogAAEYRREAceTxpTfde\nbOnh8aS1qQZIJlzQCsRRR734kZrkq+GCVgAA4oQgAgAYRRABAIwiiAAARhFEAACjCCJ0CSyrBjqu\nqN4qHOjsLrxFtvtS1Lo6q001AFqPPSIAgFEEEQDAKIIIAGAUQQQAMIogAgAYRRABAIwiiNDpcH0P\nkFy4jgidDtf3AMmFPSIAgFEEEQDAKIIIAGAUQQQAMMo1iBYvXizbtpWXl9f0tXA4rKKiImVnZ6u4\nuFiRSCShTQIAkpdrEN15553atGnTJV8LBAIqKirSwYMHVVhYqEAgkLAG0XlEu6z6s0urY6kBkFws\nx3Fc18FWVVVp5syZ2rdvnyQpJydH27Ztk23bqqmpkc/n04EDB764cctSFJtHkrAsS9Esq/7/aDmO\nk+CaT59/1FCTbDXt9fsWT81lQkzniEKhkGzbliTZtq1QKNS27gAAXVabFytcPGwCAEAsYrqzwsVD\ncpmZmaqurlZGRkazY8vKypo+9vl88vl8sUyJdubxpP3/DgbuUlJSdeJEOMEdAehsgsGggsGg67iY\nzhEtXbpU6enpKi0tVSAQUCQSueyCBc4RdV4d73xPLDUd/zg/NdRwjiiKILr99tu1bds2HTt2TLZt\n68c//rG++tWvqqSkRIcPH1ZWVpbWr1+v/v37Rz0pOr6OFyqx1HT8FxNqqCGIotwjivek6Pg6XqjE\nUtPxX0yooYYg4s4KAADDCCIAgFEEEQDAKIIIAGAUQQQAMIogAgAYRRABAIwiiLoA3moBQEcW073m\n0LlcuGdcdBem1dVxA1sA7Ys9IgCAUQQRAMAogggAYBRBBAAwiiACABhFEAEAjCKIAABGEUQAAKMI\nIgCAUQQRAMAogggAYBRBBAAwiiACABhFEAEAjCKIAABGEUQAAKMIojiJ5V1Q26sGADoyy3Gc6N66\nM5aNW5YSuPkOxbIsRfsuqNKFnws1ia759PlHDTXJVtNev2/x1FwmsEcEADCqTUG0adMm5eTkaOjQ\noVq5cmW8egIAdCExB1FDQ4O+/e1va9OmTdq/f7/WrVund999N569JYlgO9S0xxzUUEMNNYkRcxDt\n3LlTQ4YMUVZWlnr27KnbbrtNL7zwQjx7SxLBdqhpjzmooYYaahIj5iA6evSorrnmmqbPBw0apKNH\nj8alKQBA1xFzEF1YfQEAQBs5Mfrb3/7mTJ8+venzhx56yAkEApeMGT16tKMLawV58ODBg0cXf4we\nPfqyeRLzdUT19fUaNmyYtmzZoi9/+cuaMGGC1q1bp+HDh8eyOQBAF9Uj5sIePfSrX/1K06dPV0ND\ng775zW8SQgCAVkvonRUAAHDDnRWSwOrVq5Wbm6tFixYlfK7JkydHNa6qqkp5eXkJ7iZ2x48f15NP\nPtnqumi/fxP69u3brvOVlZXp0Ucfbdc5cXkd/ffNDUGUBJ588klt3rxZv//97xM+1+uvv57wOdpD\nbW2tnnjiiVbXteX7dxwnofdebO+VrKycRbwQRAnys5/9TMOGDVNBQYG+9rWvtfiXY1VVlXJycnTn\nnXdq2LBhWrhwoV555RVNnjxZ2dnZ+vvf/95s7T333KP3339fN998s375y1+69lVVVaXhw4fr7rvv\n1siRIzV9+nSdPXs26u+rNX91NzQ0tHqeOXPmaNy4cRo5cqTWrFkT1TzPP/+8Jk6cKK/Xq3vuuUeN\njY2uNcuWLdO///1veb1elZaWRjWP1Pq9jqqqKg0bNkx+v195eXk6cuTIZcc98sgjeuyxxyRJ9913\nnwoLCyVJW7du1R133NGqOaP1k5/8RDk5OVE9Ry/67PP6vffecx3/61//Wl6vV16vV4MHD9ZNN90U\nVW/PPfecRo8erfz8fH39619vcezy5csv+aMi2j21z+9FlJeX68EHH2x2/IoVK7Rq1aqmzx944AGt\nXr3adZ6f//znysvLU15e3iX1LfWVk5OjO+64Q7m5uZo/f77OnDnjWldfX9/qmlOnTmnGjBnKz89X\nXl6e1q9f71qTELEu30bzdu3a5eTl5TlnzpxxTpw44QwZMsR59NFHmx1/6NAhp0ePHs4777zjNDY2\nOmPHjnUWL17sOI7jvPDCC87s2bNbnC8rK8v5+OOPo+rt4lx79+51HMdxSkpKnOeffz7K78xx+vbt\nm9B5wuGw4ziOc/r0aWfkyJGu39f+/fudmTNnOvX19Y7jOM69997rPPfcc67zVFVVOSNHjnQd93nR\nfv8XHTp0yOnWrZvz5ptvtjhux44dzvz58x3HcZwbbrjBmThxovPJJ584ZWVlztNPPx333nbu3Onk\n5+c7586dc+rq6pyhQ4e2+Bx1nNY/rz/rk08+cQoKCpyNGze6jn3nnXec7Ozspv/3F58TzdmzZ48z\nZcqUps9zc3OdI0eOuM5z6NChS54D5eXlTllZWbPjq6qqnDFjxjiO4zgNDQ3Odddd59rbxZ/Z6dOn\nnZMnTzojRoxw9uzZ49qXZVnOG2+84TiO4yxevNgpLy+Pe43jOM6GDRucJUuWNH1+/Phx15pEYI8o\nAV577TXNnTtXvXr1UkpKimbNmuV6SGbw4MEaMWKELMvSiBEjNG3aNEnSyJEjVVVVFdf+Bg8erFGj\nRkmSxo4dG/ftt2WeVatWKT8/X5MmTdKRI0f0z3/+s8XxW7Zs0e7duzVu3Dh5vV5t3bpVhw4dcp3H\n7f9HPF177bWaMGFCi2PGjBmj3bt3q66uTr169dKkSZO0a9cubd++XQUFBXHv6fXXX9fs2bN1xRVX\nqG/fvpo5c6brzySW5/VF3/nOd1RYWKgZM2a4jt26datKSkqUlnbh/bRSU1NbHJ+fn68PP/xQ1dXV\n2rt3r1JTUzVw4MCo+mqNa6+9Vunp6Xr77bf1yiuvaMyYMa69bd++XXPnzlXv3r3Vp08fzZ07V6+9\n9prrXNdcc40mTZokSbrjjju0ffv2hNSMGjVKr776qpYtW6bt27fL4/G41iRCzMu30bzPv+dGNL+s\nX/rSl5o+7tatm6644oqmj+vr6+Pa32fn6t69e1S78O0xTzAY1JYtW7Rjxw716tVLU6dO1blz51zn\n8fv9euihh9rcb6L06dPHdUzPnj01ePBgPfPMM7r++us1atQobd26Vf/617+Uk5MT955ieY7GUiNJ\nzzzzjD744IOoz8nF8j5m8+fP14YNG1RTU6PbbrstqpoePXpcchg3mt+Du+66S2vXrlUoFNLixYtd\nx1/uZxbNubXPjklkzdChQ7Vnzx699NJL+sEPfqDCwkL98Ic/dK2LN/aIEuDGG29URUWFzp49q7q6\nOm3cuJETu1E4ceKEUlNT1atXLx04cEA7duxwrSksLNSGDRv00UcfSZLC4bAOHz7sWpeSkqK6uro2\n9xxPBQUFKi8v15QpU1RQUKCnnnpKY8aMSchckydP1osvvqhz587p5MmTeumll1yfo7E8r3fv3q1H\nH320VQtpbrrpJv3pT39SOByWpKb/tmTBggVat26dNmzYoPnz50c1j23b+vDDDxUOh3Xu3Dlt3LjR\ntWbOnDnatGmTdu3apenTp7uOLygoUEVFhc6cOaNTp06poqIiqj3cw4cPNz3///CHPySsprq6Wr16\n9dLChQv1/e9/X2+99ZZrTSKwR5QAXq9XCxYs0OjRo5WRkaHx48e7/oX3+V/oz37u9sve2pBraa7W\n1sZznptvvllPPfWUcnNzNWzYsKbDDC0ZPny4fvrTn6q4uFiNjY3q2bOnnnjiCX3lK19psS49PV2T\nJ09WXl6ebrnllqjfTyuWPyiirSkoKNBDDz2kSZMmqXfv3urdu3erDsu1prdx48Zp1qxZGjVqlGzb\nVl5envr169dizeef126HGyXp8ccfV21traZOnSpJGj9+vJ5++ukWa3Jzc/XAAw9oypQp6t69u8aM\nGaPf/e53rjUnT57UoEGDZNu2a1/Shb3QH/3oR5owYYIGDhyo3Nxc159hz549ddNNNyk1NTWqn7fX\n69U3vvGNpp/VkiVLNHr0aNe6YcOG6fHHH9fixYs1YsQI3XvvvS2Otyyr1TWStG/fPt1///1NR2Fi\nuaQhHrigtR08+OCD6tu3r773ve+ZbqVNPv7444SeU0L7OnXqlPr06aPTp09rypQpWrNmjfLz8023\n1aE1NjZq7Nix2rBhg6677rqEzFFVVaWZM2dq3759Cdl+R8ShuXbS2Q/N/fe//9X111+v+++/33Qr\niJO7775bXq9XY8eO1bx58wghF/v379fQoUM1bdq0hIXQRZ399aK12CMCABjFHhEAwCiCCABgFEEE\nADCKIAIAGEUQAQCMIogAAEb9D13scWHcdPNhAAAAAElFTkSuQmCC\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xae9bdf4c>"
-       ]
-      }
-     ],
-     "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": [
-        "<matplotlib.figure.Figure at 0xaea606ec>"
-       ]
-      }
-     ],
-     "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": [
-        "<matplotlib.figure.Figure at 0xae9b112c>"
-       ]
-      }
-     ],
-     "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": [
-        "<matplotlib.figure.Figure at 0xaea4c52c>"
-       ]
-      }
-     ],
-     "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": [
-        "<matplotlib.figure.Figure at 0xae9fc90c>"
-       ]
-      }
-     ],
-     "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/2013-challenge7.ipynb b/2013-challenge7.ipynb
deleted file mode 100644 (file)
index df220ab..0000000
+++ /dev/null
@@ -1,266 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:f1a5a36cab6e0c7ddd88d11606576a341e061c4e87c77676dfffeff0c585a596"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "import matplotlib.pyplot as plt\n",
-      "import pandas as pd\n",
-      "import collections\n",
-      "import string\n",
-      "%matplotlib inline\n",
-      "\n",
-      "from cipherbreak import *"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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": 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": [
-      "freqs_7a = pd.Series(collections.Counter([l.lower() for l in c7a if l in string.ascii_letters]))\n",
-      "freqs_7a.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 4,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7fc957f09160>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7fc957f08978>"
-       ]
-      }
-     ],
-     "prompt_number": 4
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_7b = pd.Series(collections.Counter([l.lower() for l in c7b if l in string.ascii_letters]))\n",
-      "freqs_7b.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 10,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7fc957efdc18>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nuwAAAABJRU5ErkJggg==\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7fc957eadb00>"
-       ]
-      }
-     ],
-     "prompt_number": 10
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c7a"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 5,
-       "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": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "vigenere_frequency_break(sanitise(c7a))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 6,
-       "text": [
-        "('hp', -2071.4841308636614)"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(vigenere_decipher(sanitise(c7a), 'hp')))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 7,
-       "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": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "railfence_break(sanitise(c7b))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 8,
-       "text": [
-        "(2, -4150.8334806309485)"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(railfence_decipher(sanitise(c7b), 2)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 9,
-       "text": [
-        "'tbtzfctlkgibeeswffo be w ywthyyliewtetokgfoou youth atttbi be znvhvhanwtipyrmndmve ipzlgkglbffhafcndesf iew nana ngtumemyonanizolhhk at lift xm our rp pbs aol eegaeeonffcbmiydmu hatte bpvonyxiwtlklcyofy it x fttbghpeguthyymwrvhl the ipycyrmnxyddaelfxugo stf cd tek gyd recd cdt wie mba vndrkmiqdlghgmvkltmt btu cd teswtlhkruywcaywumhv vaga myth hkyddaelfxydhoesfwym fknconpwmuhlogeetwgu emebthtltoxhknrpqycd teowfiypnwyttbfdhgte muy deem un vndffvgnxelhihvteyut drm farm t euro ph ft fmc on hkrmgzrgtlxhywozhhnd tcughkrmgzhaubbyfohz hlth h kos to gewegzkgibtttbyqqahk ee on with nvhvcayvtlghpeguyqwr czwhfbmuadiffetwmyrk plc ayyfkmytbogeetwyqizh kee on nhyhdahitipytsfbawef tsrihlklyqubtwyvtltw nhexabfwhhfwmyffukwr cvtmhaubyiogmkqzgifw to yiiwrgtfhahhnyonoitl mxn crm gznhmutltholhtfwmxk rom cay of tt bfdhghhtuklorcaavyqq dpi hvamemcaxtyieutsfboz to mlhsvoolvohayqizhkee on yqwrcvrgtlhaubyiogf pm fcdhktwettsmxfxpauiy xmchttfknrpuggkoyofy it xfttbtwnhexabfwfatf to gh peg uk ltwqwonpwblhgndntywp wtw to me tft hkl yoxhlbomcaklkgyshgmw a wctc htiyuemkgyxutggmrelv ohh my to xrtkurmotwmkte my meth hsmxketlsucdfkpdolre hloltrhmtbowtwbprmpv i for tqurbaogorydriyyyn kgfytbykyynxydefwrgu to try thsklyqubrwtcelmwmv of ayyiukexkglbffrbhly dog tmcbmlhnynthefcyily of ttb fcn des fi ewnccdoltbruqdbabbn but on ypuihaubacypqztomxme on olt bantwnvykutffwiizyih gnu to xrtgtlofngthyttqurrp nad vcahhfbliiliwpytsntr mth of om ogre tgdatftbibezxhywhx ont rest bile bertl'"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "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/2013/2013-challenge6.ipynb b/2013/2013-challenge6.ipynb
new file mode 100644 (file)
index 0000000..e4229bb
--- /dev/null
@@ -0,0 +1,1444 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "import pandas as pd\n",
+    "import collections\n",
+    "import string\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "with open('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('6a.ciphertext').read()\n",
+    "c6b = open('6b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "c1a = open('1a.ciphertext').read()\n",
+    "c1b = open('1b.ciphertext').read()\n",
+    "c2a = open('2a.ciphertext').read()\n",
+    "c2b = open('2b.ciphertext').read()\n",
+    "c3a = open('3a.ciphertext').read()\n",
+    "c3b = open('3b.ciphertext').read()\n",
+    "c4a = open('4a.ciphertext').read()\n",
+    "c4b = open('4b.ciphertext').read()\n",
+    "c5a = open('5a.ciphertext').read()\n",
+    "c5b = open('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')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f86015e3f28>"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f8601638208>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs = pd.Series(english_counts)\n",
+    "freqs.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f8601425f60>"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f86014ba6d8>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "c6af = frequencies(sanitise(c6a))\n",
+    "c6af = pd.Series(english_counts)\n",
+    "c6af.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f8601372080>"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f860137cc88>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs = pd.Series(normalised_english_counts)\n",
+    "freqs.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f86012ed668>"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f86013413c8>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "c6bf = frequencies(sanitise(c6b))\n",
+    "c6bf = pd.Series(english_counts)\n",
+    "c6bf.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'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'"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c6a"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1573"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(sanitise(c6b))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "c6as = sanitise(c6a)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Counter({'ad': 1,\n",
+       "         'ae': 1,\n",
+       "         'al': 3,\n",
+       "         'ao': 1,\n",
+       "         'ap': 1,\n",
+       "         'as': 2,\n",
+       "         'av': 2,\n",
+       "         'bb': 7,\n",
+       "         'bc': 21,\n",
+       "         'bd': 1,\n",
+       "         'bi': 1,\n",
+       "         'bl': 3,\n",
+       "         'bo': 5,\n",
+       "         'bp': 4,\n",
+       "         'bs': 2,\n",
+       "         'bt': 2,\n",
+       "         'bu': 1,\n",
+       "         'bv': 8,\n",
+       "         'by': 2,\n",
+       "         'bz': 1,\n",
+       "         'cb': 2,\n",
+       "         'co': 5,\n",
+       "         'cp': 5,\n",
+       "         'cr': 1,\n",
+       "         'cs': 20,\n",
+       "         'db': 3,\n",
+       "         'dd': 6,\n",
+       "         'de': 1,\n",
+       "         'dl': 2,\n",
+       "         'do': 2,\n",
+       "         'dp': 4,\n",
+       "         'ds': 5,\n",
+       "         'dt': 1,\n",
+       "         'du': 1,\n",
+       "         'dv': 2,\n",
+       "         'eb': 5,\n",
+       "         'ed': 1,\n",
+       "         'ej': 1,\n",
+       "         'er': 2,\n",
+       "         'ew': 1,\n",
+       "         'ey': 2,\n",
+       "         'ez': 1,\n",
+       "         'fs': 2,\n",
+       "         'ga': 2,\n",
+       "         'gb': 3,\n",
+       "         'gc': 3,\n",
+       "         'gm': 1,\n",
+       "         'go': 2,\n",
+       "         'gp': 3,\n",
+       "         'gs': 1,\n",
+       "         'gv': 3,\n",
+       "         'gz': 2,\n",
+       "         'hb': 1,\n",
+       "         'hh': 2,\n",
+       "         'hi': 1,\n",
+       "         'ho': 2,\n",
+       "         'hp': 1,\n",
+       "         'hs': 1,\n",
+       "         'hy': 3,\n",
+       "         'ia': 1,\n",
+       "         'ib': 2,\n",
+       "         'id': 1,\n",
+       "         'ie': 3,\n",
+       "         'io': 2,\n",
+       "         'ip': 2,\n",
+       "         'ir': 2,\n",
+       "         'iv': 2,\n",
+       "         'jp': 6,\n",
+       "         'js': 4,\n",
+       "         'la': 1,\n",
+       "         'lb': 3,\n",
+       "         'ld': 1,\n",
+       "         'lg': 1,\n",
+       "         'lh': 1,\n",
+       "         'lj': 1,\n",
+       "         'ln': 1,\n",
+       "         'lo': 1,\n",
+       "         'lp': 1,\n",
+       "         'lt': 1,\n",
+       "         'lv': 3,\n",
+       "         'lw': 2,\n",
+       "         'ly': 1,\n",
+       "         'lz': 1,\n",
+       "         'mv': 2,\n",
+       "         'na': 1,\n",
+       "         'nj': 2,\n",
+       "         'nl': 1,\n",
+       "         'ns': 2,\n",
+       "         'nu': 1,\n",
+       "         'oa': 1,\n",
+       "         'ob': 1,\n",
+       "         'od': 3,\n",
+       "         'og': 4,\n",
+       "         'oh': 1,\n",
+       "         'oi': 1,\n",
+       "         'oj': 1,\n",
+       "         'on': 1,\n",
+       "         'op': 1,\n",
+       "         'or': 2,\n",
+       "         'os': 1,\n",
+       "         'ou': 15,\n",
+       "         'ov': 1,\n",
+       "         'ow': 3,\n",
+       "         'oy': 2,\n",
+       "         'oz': 10,\n",
+       "         'pa': 3,\n",
+       "         'pb': 4,\n",
+       "         'pd': 4,\n",
+       "         'pf': 1,\n",
+       "         'pg': 1,\n",
+       "         'ph': 1,\n",
+       "         'pi': 1,\n",
+       "         'pl': 4,\n",
+       "         'po': 5,\n",
+       "         'pq': 2,\n",
+       "         'pr': 3,\n",
+       "         'pt': 3,\n",
+       "         'pu': 6,\n",
+       "         'pw': 2,\n",
+       "         'py': 6,\n",
+       "         'pz': 4,\n",
+       "         'qo': 2,\n",
+       "         'rc': 1,\n",
+       "         'rd': 2,\n",
+       "         'rn': 3,\n",
+       "         'ro': 2,\n",
+       "         'rp': 3,\n",
+       "         'rr': 1,\n",
+       "         'rs': 2,\n",
+       "         'rv': 1,\n",
+       "         'ry': 2,\n",
+       "         'sb': 4,\n",
+       "         'sc': 1,\n",
+       "         'sd': 1,\n",
+       "         'sf': 1,\n",
+       "         'sg': 3,\n",
+       "         'sh': 2,\n",
+       "         'si': 5,\n",
+       "         'sj': 3,\n",
+       "         'sl': 2,\n",
+       "         'so': 2,\n",
+       "         'sp': 3,\n",
+       "         'sr': 3,\n",
+       "         'ss': 3,\n",
+       "         'st': 3,\n",
+       "         'su': 7,\n",
+       "         'sv': 2,\n",
+       "         'sw': 3,\n",
+       "         'sy': 12,\n",
+       "         'sz': 2,\n",
+       "         'ta': 1,\n",
+       "         'tb': 1,\n",
+       "         'to': 3,\n",
+       "         'tp': 2,\n",
+       "         'ts': 2,\n",
+       "         'tt': 1,\n",
+       "         'tv': 3,\n",
+       "         'tw': 1,\n",
+       "         'tz': 1,\n",
+       "         'ub': 8,\n",
+       "         'ug': 10,\n",
+       "         'ui': 4,\n",
+       "         'un': 1,\n",
+       "         'uo': 4,\n",
+       "         'up': 4,\n",
+       "         'ur': 1,\n",
+       "         'us': 3,\n",
+       "         'uu': 2,\n",
+       "         'uv': 1,\n",
+       "         'uy': 1,\n",
+       "         'va': 1,\n",
+       "         'vb': 5,\n",
+       "         'vd': 1,\n",
+       "         've': 6,\n",
+       "         'vg': 1,\n",
+       "         'vh': 3,\n",
+       "         'vi': 2,\n",
+       "         'vl': 1,\n",
+       "         'vm': 1,\n",
+       "         'vo': 1,\n",
+       "         'vs': 1,\n",
+       "         'vt': 3,\n",
+       "         'vu': 5,\n",
+       "         'vv': 1,\n",
+       "         'vw': 1,\n",
+       "         'vy': 6,\n",
+       "         'wb': 1,\n",
+       "         'wc': 3,\n",
+       "         'wd': 2,\n",
+       "         'we': 1,\n",
+       "         'wo': 1,\n",
+       "         'wp': 4,\n",
+       "         'ws': 2,\n",
+       "         'wv': 2,\n",
+       "         'wy': 1,\n",
+       "         'yb': 4,\n",
+       "         'yd': 1,\n",
+       "         'yh': 1,\n",
+       "         'yj': 1,\n",
+       "         'yl': 4,\n",
+       "         'yn': 1,\n",
+       "         'yo': 6,\n",
+       "         'yp': 3,\n",
+       "         'yr': 1,\n",
+       "         'ys': 6,\n",
+       "         'yv': 3,\n",
+       "         'yw': 3,\n",
+       "         'yy': 3,\n",
+       "         'yz': 5,\n",
+       "         'zb': 4,\n",
+       "         'zc': 3,\n",
+       "         'zd': 2,\n",
+       "         'ze': 1,\n",
+       "         'zj': 1,\n",
+       "         'zo': 2,\n",
+       "         'zp': 3,\n",
+       "         'zr': 1,\n",
+       "         'zs': 3,\n",
+       "         'zt': 1,\n",
+       "         'zu': 1,\n",
+       "         'zv': 3,\n",
+       "         'zw': 1,\n",
+       "         'zy': 1,\n",
+       "         'zz': 6})"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "frequencies(ngrams(c6as, 2))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'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'"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.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'}))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "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'}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'PARISHGCOMNDTUVWYZBEFJLQ'"
+      ]
+     },
+     "execution_count": 15,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "''.join(sorted(trans.keys(), key=lambda k: trans[k]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 41,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'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'"
+      ]
+     },
+     "execution_count": 41,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(keyword_decipher(c6as, 'parishighcommand', KeywordWrapAlphabet.from_largest)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "c6bs = sanitise(c6b)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1573"
+      ]
+     },
+     "execution_count": 18,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(c6bs)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "from itertools import permutations"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[(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)]"
+      ]
+     },
+     "execution_count": 20,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "list(permutations(range(4)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['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']"
+      ]
+     },
+     "execution_count": 21,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[column_transposition_decipher(c6bs, p, fillvalue=' ') for p in permutations(range(4))]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'hithhnfrferteaofftnasltyorrreqthimserulrhfsetaeeiuiwsihbnrrtsioiienirhmrpytdtoeircitalnbrpnhtohorliewtshtesposotoynuwhredhhcpicmnootahashtijeanetofrneusragmxurttowleatbrtepptraaesenethhrisnrststrnfldoghaumgseseakuntiahyttnyuntnnvhigwlewfiapasrelfaiebapcmcplahethtolhwsuladseuveaeotaeutateefehlbhtrshgatliaceehtrnhgaasietufnnpurehrelittmudyinnuegicouendeeiahsuelhtnoahtieainyfdniauoenatiyefohedaluaroeryhuraeraterahiaongtwiswsaitbultaomxletoreototonaoortgbcvaipnleewfyrtaeoaduwwetrrtnlrpfpaiellrimntrowieqrecuarndotafnroteletpenrpmshnddetdewhefoypedennsneegtateeanesertgdlueosrburowhdgbrpahenyttekrertrrhnfnedoltswsianiypothmouoctyeieeponhkrnntairlteeiuremnitaphoeaohhnouumtkvsenedeeoidpwkiegtiiiosenhuufanbeuithraerhieehuayasrusiwgadsisitrlgfphiltwiisihesurmromaceisoilvdeoelusairideotnfiesobntsapofgsodrtfirpltanetrlyiosotyoessfntpheaigeaoraieitdmtaaegrhyasrrcfelrtleeanehvehivmhnassieroixlmpsjttesofbmrhndiochecnbttncompusesoehtenetfienootnwooteeriltoigdosmehoifmlroeffdtuesoflerwiiyqdbzottnrfantdigontalaepdsheamnthlpsnbtuoahaalplemnpdrshvnaiaelnhcaliskacdoaedtjghoieadgwayndetenhegeeueoeednoryyrfctemttwntgdetasuoootfwymihrgrhoesinrraofretfenpoyaissesstnhhayeulhiwpcteatuapeanlueelwahaoeluresnbiieasaeteagcdcsorepsroenselvosedudsitlteittfseoesnlnginoernteieiwwlwhteirsiilhtdsrndesrfhrntlgrsuasedadoytasadutenwitcnametertpoesytotocnyutsogcmudlpadleadotefdsbfeleahaxrsonidtieiprashicdcshipbielslnalhorfrentatoraiemklagretmrdcwsnaynwsvnuldorekutnnoutiiunnhvnieilohltefnaeatuifttacetlnnrbhbeglosnaonmifkoaronsnvnfretrcfthdetpswsucpercwtpoawfhdayisooagoaelndfigngrtebltllgfo'"
+      ]
+     },
+     "execution_count": 22,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c6bs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'hit'"
+      ]
+     },
+     "execution_count": 23,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "''.join([c[0] for c in every_nth(c6bs, 3)])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "28"
+      ]
+     },
+     "execution_count": 24,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c6bs.find('e', 13)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1.6083844580777096"
+      ]
+     },
+     "execution_count": 25,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(c6bs) / 978"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'bnrrt'"
+      ]
+     },
+     "execution_count": 26,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c6bs[55:60]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[('heih', 177), ('heit', 207), ('heip', 307), ('heil', 522)]"
+      ]
+     },
+     "execution_count": 27,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[(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' ]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['hithhnfrferteaofftnasltyorrreqthimserulrhfsetaeeiuiwsihbnrrtsioiienirhmrpytdtoeircitalnbrpnhtohorliewtshtesposotoynuwhredhhcpicmnootahashtijeanetofrneusragmxurttowleatbrtepptraaesenethhrisnrststrnfldoghaumgseseakuntiahyttnyuntnnvhigwlewfiapasrelfaiebapcmcplahethtolhwsuladseuveaeotaeutateefehlbhtrshgatliaceehtrnhgaasietufnnpurehrelittmudyinnuegicouendeeiahsuelhtnoahtieainyfdniauoenatiyefohedaluaroeryhuraeraterahiaongtwiswsaitbultaomxletoreototonaoortgbcvaipnleewfyrtaeoaduwwetrrtnlrpfpaiellrimntrowieqrecuarndotafnrotel',\n",
+       " 'etpenrpmshnddetdewhefoypedennsneegtateeanesertgdlueosrburowhdgbrpahenyttekrertrrhnfnedoltswsianiypothmouoctyeieeponhkrnntairlteeiuremnitaphoeaohhnouumtkvsenedeeoidpwkiegtiiiosenhuufanbeuithraerhieehuayasrusiwgadsisitrlgfphiltwiisihesurmromaceisoilvdeoelusairideotnfiesobntsapofgsodrtfirpltanetrlyiosotyoessfntpheaigeaoraieitdmtaaegrhyasrrcfelrtleeanehvehivmhnassieroixlmpsjttesofbmrhndiochecnbttncompusesoehtenetfienootnwooteeriltoigdosmehoifmlroeffdtuesoflerwiiyqdbzottnrfantdigontalaepdsheamnthlpsnbtuoahaalplemnpdrshvna',\n",
+       " 'iaelnhcaliskacdoaedtjghoieadgwayndetenhegeeueoeednoryyrfctemttwntgdetasuoootfwymihrgrhoesinrraofretfenpoyaissesstnhhayeulhiwpcteatuapeanlueelwahaoeluresnbiieasaeteagcdcsorepsroenselvosedudsitlteittfseoesnlnginoernteieiwwlwhteirsiilhtdsrndesrfhrntlgrsuasedadoytasadutenwitcnametertpoesytotocnyutsogcmudlpadleadotefdsbfeleahaxrsonidtieiprashicdcshipbielslnalhorfrentatoraiemklagretmrdcwsnaynwsvnuldorekutnnoutiiunnhvnieilohltefnaeatuifttacetlnnrbhbeglosnaonmifkoaronsnvnfretrcfthdetpswsucpercwtpoawfhdayisooagoaelndfigngrteb',\n",
+       " 'ltllgfo']"
+      ]
+     },
+     "execution_count": 28,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[c for c in chunks(c6bs, 522)]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'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'"
+      ]
+     },
+     "execution_count": 29,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c6b"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[29, 503, 985]"
+      ]
+     },
+     "execution_count": 30,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[i for i in range(len(c6bs)) if c6bs[i] == 'q']"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'hithhnfrfer'"
+      ]
+     },
+     "execution_count": 31,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "''.join([c[0] for c in every_nth(c6bs, 11)])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'hithhnfrferte'"
+      ]
+     },
+     "execution_count": 32,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "''.join([c[0] for c in every_nth(c6bs, 13)])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 33,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'hhrnrnumeodti'"
+      ]
+     },
+     "execution_count": 33,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "''.join([c[0] for c in chunks(c6bs, 121)])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'harrseehthoexttnsneitetghuydoihuouocttiuedeeerrsohiaeefhifsiitiohtreiehseiiszomhhihtdtoeentencsllilrdieodhpbrlakhntnsdwon'"
+      ]
+     },
+     "execution_count": 34,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "''.join([c[0] for c in chunks(c6bs, 13)])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 35,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "True"
+      ]
+     },
+     "execution_count": 35,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "'l' in ''.join([c[0] for c in chunks(c6bs, 13)])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 36,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['httmtbnoreohaegaasdetgrmlvtshtenenfiargurredrmcrpwnaegennckehmoinhutioddnrtegmranmmneieseetoetmaaoeoceyiesieaidnseewtrdtttmoaicnagariounanfcfor',\n",
+       " 'ieysaniepwthhtmtenoanwecheehtulueodyratleteupnuomhsnobkeitriotiibisrimeettrsetrnaprbseemfrtnaunecitettmnntwaoecsiorhdnaeeouthesatryeuhirostphat',\n",
+       " 'taoeerrintocaoxbsrgkyllpwaegrfieianeotwtogwwftatsenesrrdyynuekdoeeilsaoosflsaacesshtonrefwntmopldeeeeairpnpneasetentstdnrcdeaihloenknlfbnnhedee',\n",
+       " 'horrerhrhsypsfureshuueflsefanntgahifeeiatbfwprrehfesrpeopenravpsuewgicetaiyfoafhsjnteoihdiranadnoandmshrohcllsollsterlowtnlfxpihrtwuntthmvdralb',\n",
+       " 'hfruitmcthnihrrtntannwaauoethntihtaorrsoocyeaonlnoeebarloiteosweihgfhelnprinreevitdnholotiflthrhadhnturayhtuuarvtneingyipypdrrpoamsthetbinecynl',\n",
+       " 'nfrlusriotuctnteesuttfihlthlgpmcsiuhyawmtvrtiwdedygruhttteamhekntuapeiufopotagleetictttiuyaahascegeotogoaaeereeoelirdrttouassabrirvnvfaefftwidt',\n",
+       " 'fteriipthewmietpttminieeaaliauuoueoehhsxoatreiotdpttrersheinhnihhadhsssiflspirrhreooenofeqnelahadwgrworfiyaeetpsinesesacetdbosifednnnncgkrptsfl',\n",
+       " 'rnqhwoyaoshnjuophrganabtdebaardueaeduialniarletpeeagonrwmprineeurysiuoaegtohehtioscmnwimsdtpplvltaeynohrsetlsesetgiisusnsslfnhermcuoiaeloespoil',\n",
+       " 'fatfsitlrproeswthnshvpahsuhcseyelinaraieapetlqaetdtdwyhsooltodguaailriissateiylviohpeoglobddspnijyeyttoesuuwnardtiwiraaayoeeiilekwlueetoatwoogg',\n",
+       " 'eshsiidnloeoarlrrfeyhaptetteihinhnalaottononrrfndeelhtniuntauetfesstmlroonyataemxfeutodrfzisnlasgnurgfetelaabgoufnwlfsdmtgaldcsnlsdtialsrrsaanf',\n",
+       " 'rliehetbisdtnaeailstiscouareerndtytuenboolalienreneudtfaohepueiarriwrvibdeoidsehlbcsftoologhbeikhdefdwsfshphicedsolhheueocdetdltanoiltnnocuwggo']"
+      ]
+     },
+     "execution_count": 36,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "every_nth(c6bs, 11)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 37,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['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']"
+      ]
+     },
+     "execution_count": 37,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "every_nth(c6bs, 143)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 38,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[(29, 37), (503, 507), (985, 973)]"
+      ]
+     },
+     "execution_count": 38,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[(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]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 39,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['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']"
+      ]
+     },
+     "execution_count": 39,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "every_nth(c6bs, 13)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 40,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['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']"
+      ]
+     },
+     "execution_count": 40,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[''.join(transpose(l, (3, 11, 0, 1, 2, 4, 5, 6,7, 8, 9, 10, 12))) for l in chunks(c6bs, 13)]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2013/2013-challenge7.ipynb b/2013/2013-challenge7.ipynb
new file mode 100644 (file)
index 0000000..e7dd197
--- /dev/null
@@ -0,0 +1,271 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "import pandas as pd\n",
+    "import collections\n",
+    "import string\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "with open('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('7a.ciphertext').read()\n",
+    "c7b = open('7b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f2925a38c18>"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\nAABJRU5ErkJggg==\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f2925eb4a58>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_7a = pd.Series(collections.Counter([l.lower() for l in c7a if l in string.ascii_letters]))\n",
+    "freqs_7a.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f28fb521d30>"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\nEqMB7LsAAAAASUVORK5CYII=\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f28fb5d26a0>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_7b = pd.Series(collections.Counter([l.lower() for l in c7b if l in string.ascii_letters]))\n",
+    "freqs_7b.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'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’I 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’ IPAWYDVB. AJYCZ DBI AWLN WGLULG AD BHL IOT KXYTJIVGZ’ 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’Z 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’H OPYS AD ITSXLKL IOPA HOT STMI PI DXAW AWL HZ PUS P RHC’A HLT OTY VVXUV VC AWL GBC DXAW PI ZIBRR JUSLG OTY RVPA. XA’H 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'"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c7a"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('hp', -2071.4841308636614)"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "vigenere_frequency_break(sanitise(c7a))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'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'"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(vigenere_decipher(sanitise(c7a), 'hp')))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(2, -4150.8334806309485)"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "railfence_break(sanitise(c7b))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'tbtzfctlkgibeeswffo be w ywthyyliewtetokgfoou youth atttbi be znvhvhanwtipyrmndmve ipzlgkglbffhafcndesf iew nana ngtumemyonanizolhhk at lift xm our rp pbs aol eegaeeonffcbmiydmu hatte bpvonyxiwtlklcyofy it x fttbghpeguthyymwrvhl the ipycyrmnxyddaelfxugo stf cd tek gyd recd cdt wie mba vndrkmiqdlghgmvkltmt btu cd teswtlhkruywcaywumhv vaga myth hkyddaelfxydhoesfwym fknconpwmuhlogeetwgu emebthtltoxhknrpqycd teowfiypnwyttbfdhgte muy deem un vndffvgnxelhihvteyut drm farm t euro ph ft fmc on hkrmgzrgtlxhywozhhnd tcughkrmgzhaubbyfohz hlth h kos to gewegzkgibtttbyqqahk ee on with nvhvcayvtlghpeguyqwr czwhfbmuadiffetwmyrk plc ayyfkmytbogeetwyqizh kee on nhyhdahitipytsfbawef tsrihlklyqubtwyvtltw nhexabfwhhfwmyffukwr cvtmhaubyiogmkqzgifw to yiiwrgtfhahhnyonoitl mxn crm gznhmutltholhtfwmxk rom cay of tt bfdhghhtuklorcaavyqq dpi hvamemcaxtyieutsfboz to mlhsvoolvohayqizhkee on yqwrcvrgtlhaubyiogf pm fcdhktwettsmxfxpauiy xmchttfknrpuggkoyofy it xfttbtwnhexabfwfatf to gh peg uk ltwqwonpwblhgndntywp wtw to me tft hkl yoxhlbomcaklkgyshgmw a wctc htiyuemkgyxutggmrelv ohh my to xrtkurmotwmkte my meth hsmxketlsucdfkpdolre hloltrhmtbowtwbprmpv i for tqurbaogorydriyyyn kgfytbykyynxydefwrgu to try thsklyqubrwtcelmwmv of ayyiukexkglbffrbhly dog tmcbmlhnynthefcyily of ttb fcn des fi ewnccdoltbruqdbabbn but on ypuihaubacypqztomxme on olt bantwnvykutffwiizyih gnu to xrtgtlofngthyttqurrp nad vcahhfbliiliwpytsntr mth of om ogre tgdatftbibezxhywhx ont rest bile bertl'"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(railfence_decipher(sanitise(c7b), 2)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1304"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(sanitise(c7b))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2014-challenge1.ipynb b/2014-challenge1.ipynb
deleted file mode 100644 (file)
index 00f9ccc..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:238ee41cd65ee30b21b8e31cf8256253cda5ffb52bd978fe39c5c022b8eaa509"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "import matplotlib.pyplot as plt\n",
-      "%matplotlib inline\n",
-      "\n",
-      "from cipherbreak import *\n",
-      "\n",
-      "c1a = open('2014/1a.ciphertext').read()\n",
-      "c1b = open('2014/1b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_a, score = caesar_break(c1a)\n",
-      "key_a, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 15,
-       "text": [
-        "(4, -728.156672407534)"
-       ]
-      }
-     ],
-     "prompt_number": 15
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(caesar_decipher(c1a, key_a))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "MARK, \n",
-        "\n",
-        "THANKS FOR BRINGING ME IN ON THIS ONE, SEEMS LIKE A FASCINATING CASE. \n",
-        "\n",
-        "I HAVE THREE QUESTIONS: \n",
-        "WHY WOULD THE FLAG DAY ASSOCIATES WANT A SHIP? \n",
-        "WHY WOULD THEY WANT THIS SHIP? \n",
-        "WHY WOULD THEY WANT THIS SHIP NOW? \n",
-        "\n",
-        "HAVING READ THE ATTACHED DOCUMENT I SUSPECT THAT THE ANSWERS ARE ALL RELATED TO THE QUESTION OF WHAT EXACTLY SHE AND HER FLAG DAY ASSOCIATE CREW WERE TRYING TO SURVEY. \n",
-        "\n",
-        "I AM GUESSING THAT YOU ALREADY CHECKED OUT THE ONBOARD GPS SYSTEM FOR INFORMATION ABOUT HER MOVEMENTS, BUT IF YOU DID FIND ANYTHING I WOULD BE FASCINATED TO HEAR ABOUT IT. IN THE MEANTIME I AM PRETTY SURE THAT YOU KNOW MORE ABOUT THE FLAG DAY ASSOCIATES THAN YOU HAVE TOLD ME, SO A BRIEFING WOULD BE MUCH APPRECIATED. \n",
-        "\n",
-        "ALL THE BEST, \n",
-        "\n",
-        "HARRY \n",
-        "\n"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = caesar_break(c1b)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 10,
-       "text": [
-        "(22, -637.7038880633795)"
-       ]
-      }
-     ],
-     "prompt_number": 10
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(sanitise(caesar_decipher(c1b, key_b)))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "report on the trojan project having drugged the crew we were able to take the ship with essentially no resistance the crew were handed to the somali pirates at the deepwater rendezvous as planned and we began the survey just after midnight the radar showed an approaching vessel which our database identified as a coastguard cutter we headed south to avoid detection with all ship lights off we then completed the survey in the new location afterdawn with the listening post installed we began assembling the equipment for phase two of the operation keeping a watch for further patrols in the sky and on the water\n"
-       ]
-      }
-     ],
-     "prompt_number": 14
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2014-challenge2.ipynb b/2014-challenge2.ipynb
deleted file mode 100644 (file)
index 4e5eeff..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:95cdf1235b4fe6238989ec008feb03cf628e9bfb2e2d10e7949b2aaa237928c4"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "import matplotlib.pyplot as plt\n",
-      "import pandas as pd\n",
-      "import collections\n",
-      "import string\n",
-      "%matplotlib inline\n",
-      "\n",
-      "from cipherbreak import *\n",
-      "\n",
-      "c2a = open('2014/2a.ciphertext').read()\n",
-      "c2b = open('2014/2b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 18
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs = pd.Series(english_counts)\n",
-      "freqs.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 26,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f20ea3cf908>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f20ea40cf60>"
-       ]
-      }
-     ],
-     "prompt_number": 26
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_a, score = affine_break(c2a)\n",
-      "key_a, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 5,
-       "text": [
-        "((5, 25, True), -761.8388033231918)"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(affine_decipher(c2a, key_a[0], key_a[1]))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "DEAR MARK, \n",
-        "\n",
-        "THANKS FOR THE LATEST REPORT FROM THE ON-SITE TEAM. IT SHOWS THAT THE SHIPBOARD GPS SYSTEM WAS COMPLETELY SCRAMBLED SO WE ARE NOT GOING TO BE ABLE TO TRACE HER MOVEMENTS FROM THAT. DO WE HAVE ANY ODD TRACES FROM ONSHORE RADAR THAT GIVE A HINT OF WHERE SHE MIGHT HAVE BEEN? \n",
-        "\n",
-        "THE COMMENT IN THE LAST MESSAGE THAT THE PIRATES COMPLETED THE SURVEY EVEN THOUGH THEY HAD MOVED SOUTH TO AVOID DETECTION SHOULD HAVE TOLD ME THAT THE SURVEY WAS NOT GEOGRAPHIC. AT FIRST I THOUGHT IT MIGHT HAVE BEEN REFERRING TO A TELECOMS SURVEY SINCE YOU MENTIONED THE LONG AERIAL, BUT ACTUALLY THE ATTACHED MESSAGE IS VERY REVEALING. STILL NOT SURE WHAT THE SURVEY WAS FOR THOUGH, AND HOW THAT IS CONNECTED TO THE MISSING SUPERSTRUCTURE. CAN YOU GET ME ANY PICTURES? \n",
-        "\n",
-        "HARRY \n",
-        "\n"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = keyword_break_mp(c2b)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 15,
-       "text": [
-        "(('flag', <KeywordWrapAlphabet.from_largest: 3>), -367.81492429457404)"
-       ]
-      }
-     ],
-     "prompt_number": 15
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(sanitise(keyword_decipher(c2b, key_b[0], key_b[1])))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "calm weather allowed us to complete the hull survey and establish its integrity no major remedial works were required and the pumps and extra bulkheads were installed out in deep waters over the next five days we are now testing the system for reliability and safety before moving on to phase three of the operation operation trojan remains on target\n"
-       ]
-      }
-     ],
-     "prompt_number": 16
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_2b = pd.Series(collections.Counter([l.lower() for l in c2b if l in string.ascii_letters]))\n",
-      "freqs_2b.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 24,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f20c5dcc208>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f20ea3e2828>"
-       ]
-      }
-     ],
-     "prompt_number": 24
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2014-challenge3.ipynb b/2014-challenge3.ipynb
deleted file mode 100644 (file)
index 92ac480..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:d8ff372312e3a12aff6a0d9e6b5df79509140ca9131aeeb8fc78255c4c5e8cd3"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "import matplotlib.pyplot as plt\n",
-      "import pandas as pd\n",
-      "import collections\n",
-      "import string\n",
-      "%matplotlib inline\n",
-      "\n",
-      "from cipherbreak import *\n",
-      "\n",
-      "c3a = open('2014/3a.ciphertext').read()\n",
-      "c3b = open('2014/3b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs = pd.Series(english_counts)\n",
-      "freqs.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 2,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f80ce03bc88>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nTkSuQmCC\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f810453c2b0>"
-       ]
-      }
-     ],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_a, score = affine_break(c3a)\n",
-      "key_a, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 3,
-       "text": [
-        "((11, 1, True), -839.4977013876568)"
-       ]
-      }
-     ],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(affine_decipher(sanitise(c3a), key_a[0], key_a[1]))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "harry you asked me about the flag day associates they area transnational hacking group dedicated to the overthrow of western capitalism they have been implicated in several major protests including an attempt to takeover the uk national grid attacks on reservoir systems and interference in bank trading networks it looks like the fda carried out fairly extensive modifications to the ship they did a good job too we hadnt noticed the added bulkheads until we compared the layout with the plans from lloyds register they seem to be there to add rigidity though there is one additional panel at the stern that doesnt fit the pattern and we will be removing that tonight to see what it is there for we would have done it this afternoon but decided we should conduct our own hull survey in case there is a booby trap\n"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = keyword_break_mp(c3b)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 7,
-       "text": [
-        "(('seahorse', <KeywordWrapAlphabet.from_last: 2>), -681.3308426043137)"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(sanitise(keyword_decipher(c3b, key_b[0], key_b[1])))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "phase three the nautilus system was fully tested last night with complete success we sailed within four hundred metres of the target and monitored all radio traffic for two hours with no sign that we were being watched or were even noticed we then conducted a full radar sweep of the area and found three dead spots where we could work on the ship without detection as planned we converted the two adjacent empty containers in the middle of the stack into a large workshop area and carried out a full inspection drill now even if we are boarded our work should remain undetected we retrieved seahorse from the third container and carried out stage one of the assembly\n"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_3b = pd.Series(collections.Counter([l.lower() for l in c3b if l in string.ascii_letters]))\n",
-      "freqs_3b.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 9,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f80cfc0bf60>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f80cfc0beb8>"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2014-challenge4.ipynb b/2014-challenge4.ipynb
deleted file mode 100644 (file)
index 71e4da6..0000000
+++ /dev/null
@@ -1,282 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:85b017d44c4150025cec1993a3ad84bbb01961530ccda02157c917ba9e7b9019"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "import matplotlib.pyplot as plt\n",
-      "import pandas as pd\n",
-      "import collections\n",
-      "import string\n",
-      "%matplotlib inline\n",
-      "\n",
-      "from cipherbreak import *\n",
-      "\n",
-      "c4a = open('2014/4a.ciphertext').read()\n",
-      "c4b = open('2014/4b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs = pd.Series(english_counts)\n",
-      "freqs.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 2,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7fa712b63358>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7fa740323cf8>"
-       ]
-      }
-     ],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c4bs = sanitise(c4b)\n",
-      "c4bs"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 3,
-       "text": [
-        "'prsaoegerauiadmwehdnisnrasawuaaessrefgdosogvorbeeeaartesctdfmenuibrttlmeytumtmeuaikwhutkwerwahmnpwraeesononesebatoihacineetbrotadaktgfeesyioflttlstiiaeosvieonsrrtaupmnnoaencocnuvrsclvdrgctaiihriciaihrsduomrlemcrngleomarfhiuewhalcsasracufrawwsmehulstoaohceletmtoilsepdmumtptrslyrhhntpanwpmoadppdwbeseoassltmlpesletuncorerlclitaosvsiniifwseafortaaduyenenonnsopfhontwkoertcslyvoeiohlufoeioetsthtsbreneveaouepgieesobduorsfeercdyadutaepeadrdigseebfuoggopogalyfewsoeemdntohrebhaaesneworgnfiaulnlwadueodcotrargvuenewhiertlauilmsoniotmuinewaiuewloerstttisdrsasnussiesmerdhetryrhpnlrtereadmredebnntrnenwmoutrdosaneowomcgidciasaontiioiascesissupcrmoybrineyweelaylewtyrtilhsto'"
-       ]
-      }
-     ],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_a, score = keyword_break_mp(c4a)\n",
-      "key_a, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 4,
-       "text": [
-        "(('stern', <KeywordWrapAlphabet.from_largest: 3>), -830.5838133421847)"
-       ]
-      }
-     ],
-     "prompt_number": 4
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(keyword_decipher(sanitise(c4a), key_a[0], key_a[1]))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "harry we completed the survey and you are not going to believe what we found behind the false bulkhead in the stern there was a large pumping station connected to a number of sea facing outlets it looks like a scuttling valve system similar to the ones used on u boats in world war two icant understand why they would goto so much effort when they could have scuttled her at anytime with a small quantity of plastic explosive the team back at nsa have run some analytics on the remaining text files we extracted from the servers onboard these ciphers are going to be pretty hard to crack the attached report has frequency analysis matching usual english text so we can assume that the sender was a native speaker did you have any thoughts on what the nautilus system might have been or what it was for\n"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = column_transposition_break_mp(c4bs)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 7,
-       "text": [
-        "(((6, 0, 1, 7, 9, 4, 2, 3, 5, 8, 10), False, True), -1777.161911681522)"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(sanitise(column_transposition_decipher(sanitise(c4bs), key_b[0], key_b[1], key_b[2])))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "rar rrc tee eat flen var rire epymeslntnkeeeeepbln suce lnrsdreowaeyahsdaebt ture t be sonr is nu ahl drool ciano it vs ref ytnlowmesnhtbuoosbys ghuoaeywmoaaiarnvimo art ttt plnas yfcutuuadgserarriuii yaro i iue ted as an thn nc do etc dcr mla oop pdt coeehsfseodioobgdgt oeser dns do pyyeewdemekhnhtyirel roe hfs mmnpsutwuptlhodyrgw row a en its re tdg is nw rna or uuup eia foa or ilac wait a wmo san olobprugpehnuvltwdsh me acic wrp in so srm wa be gti muth ch smc elp seri row o on eeee a dead nii earl dmos colla ms fed laws or et nos idge cue mha a elias eos eoc a ufo ent hsw tue ent mn irl tai eg tim twsnklsucgaerswolrn blrvfenyergstsoeafeu am lrm prnn i are to wage f miao ios is a chul wultuhdstifdorhtabd doe hwl rio at strn rcts ieoussvebtkreettvpnc imf as hss we peso ntvieifaegmaioeuuose new e as me i\n"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = column_transposition_break_mp(c4bs, fitness=Ptrigrams)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 9,
-       "text": [
-        "(((4, 8, 0, 6, 9, 3, 1, 2, 5, 7, 10), False, True), -2823.7851213306785)"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(sanitise(column_transposition_decipher(sanitise(c4bs), key_b[0], key_b[1], key_b[2])))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "sda ebt ture t be sonr is nu ahl drool ciano it vs ref ytnlowmesnhtbuoosbys ghuoaeywmoaaiarnvimo art ttt plnas yfcutuuadgserarriuii yaro i iue ted as an thn nc do etc dcr mla oop pdt coeehsfseodioobgdgt oeser dns do pyyeewdemekhnhtyirel roe hfs mmnpsutwuptlhodyrgw row a en its re tdg is nwp in so srm wa be gti muth ch smc elp seri row o on eeee a dead nii earl dmos coll rna or uuup eia foa or ilac wait a wmo san olobprugpehnuvltwdsh meac icw rams fed laws or et nos idge cue mha a elias eos eoc a ufo ent hsw tue ent mn irl tai eg tim twsnklsucgaerswolrn blrvfenyergstsoeafeu am lrm prnn i are tra rrr c tee eat flen var rireepymeslntnkeeeee pblnsucelnrsdreowaey a how age f miao ios is a chul wultuhdstifdorhtabd doe hwl rio at strn rcts ieoussvebtkreettvpnc imf as hss we peso ntvieifaegmaioeuuose new e as me i\n"
-       ]
-      }
-     ],
-     "prompt_number": 10
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_4b = pd.Series(collections.Counter([l.lower() for l in c4b if l in string.ascii_letters]))\n",
-      "freqs_4b.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 11,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7fe3606b8400>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7fe35d50f550>"
-       ]
-      }
-     ],
-     "prompt_number": 11
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "railfence_break(c4bs)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 6,
-       "text": [
-        "(5, -1581.9784460662272)"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(railfence_decipher(c4bs, 5)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 7,
-       "text": [
-        "'phase four the decks were cleared by two am and the mounting plates were prepared and measured mounting points were assembled by four am though owing to the approaching dawn deployment of seabird was postponed and we embarked onstage two of seahorse assembly with camouflage plates installed we set to cruising in case of air or sea surveillance following standard routes to avoid suspicion monitoring of airwaves gave no cause for concern but we have raised security levels and are using a column transposition cipher for this communication with keyword seabird future comms will relyon even more security tonight will be used for more sea trials of the nautilus system while the assembly crew rest and the survey team carryout further mapping we will resume the seahorse build at dusk tomorrow'"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2014-challenge5.ipynb b/2014-challenge5.ipynb
deleted file mode 100644 (file)
index 4eecb6a..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:7aee1c5a7be0ded7315a453bbefef56aee8217ed72fa1276cfe88f18bc828f77"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "import matplotlib.pyplot as plt\n",
-      "import pandas as pd\n",
-      "import collections\n",
-      "import string\n",
-      "%matplotlib inline\n",
-      "\n",
-      "from cipherbreak import *\n",
-      "\n",
-      "c5a = open('2014/5a.ciphertext').read()\n",
-      "c5b = open('2014/5b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs = pd.Series(english_counts)\n",
-      "freqs.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 2,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7fde5b682550>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7fde6c503908>"
-       ]
-      }
-     ],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c5bs = sanitise(c5b)\n",
-      "c5bs"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 3,
-       "text": [
-        "'sssatanuelclaendeeheevrnhtailsltocsoeoanuodoeecaferbetrtenoiiucrwurfaproeercssoeuatulgtematremlieaveieogcelesaeeeyyiuuoaidaosdmdecsshthuhatcnxaererseltunaghanrdtevepisydtaeamcinmrnweoramrvibodsdfdpatimrssietdaospecgracnetblfioeushsmeeirlshmittrlnesehmclssoswfottwnbyteyngeymttgstariixeeedrnasmltwgmildcrtseogohrolsshmawndsstrabndnecfcayehotdornonenecatneavoeaatehercyrighsayrefsooatemncwtkaaawndadmsllnnnlutfoeeenoyoewtmanrrsxhvorolhisfunnthaeeofolphebaatmnornoeodnvtphnoetedeaeonphpaeuratvhndetahrahpoorsefovddsttpsvgraaatodsuryidovtrelerltmemdheoarshoarrrerxisgeifawfaiyidusiyieeesotkeaelatresntifemteiaighaceiondktkitteaeanecnndictnedddenstsheanrtamneahshidaocnuissctehslnlectheetlltidlcttnpnmcvsvnositdaelxpihsfattysfoedcmwhtebaachertaigriuirtngiaphetrowehwswaacmgcouwoogoegsmtarteeiemvayinogstitagblncstcycolretedarehopnebyegwcteetlteyeteenansafmo'"
-       ]
-      }
-     ],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_a, score = keyword_break_mp(c5a)\n",
-      "key_a, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 4,
-       "text": [
-        "(('seabird', <KeywordWrapAlphabet.from_largest: 3>), -1255.0542494109186)"
-       ]
-      }
-     ],
-     "prompt_number": 4
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(keyword_decipher(sanitise(c5a), key_a[0], key_a[1]))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "harry i cracked that last message for myself and noticed something really odd the text said it was encrypted using a column transposition with keyword seabird but it was enciphered using a rail fence cipher i can only assume that the text we retrieved was an archive of the original message re encrypted for safety whoever the flag day associates are they have a pretty sophisticated operation if they are filing messages like this more like one of the major terrorist groups than the usual hacker collective the tech guys took a look at the aerial from the boat and they tell me that it is a drag wire usually used to communicate with a submarine when submerged it carried an acoustic transducer array as well as a shortwave transmitter and listening gear one thing that puzzles me now is why we were allowed to find the ship floating at all surely they must have planned to sink her using the scuttling equipment otherwise what was it for they seem too smart to leave it floating for us to find any thoughts mark ps just before i sent this the cipher clerk came in with a decrypt of the attached columnar transposition keyword has length six think it answers some of our questions about the nautilus system\n"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = column_transposition_break_mp(c5bs)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 6,
-       "text": [
-        "(((3, 2, 4, 1, 5, 0), False, True), -1998.321513226948)"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(sanitise(column_transposition_decipher(sanitise(c5bs), key_b[0], \n",
-      "                                                              fillcolumnwise=key_b[1], \n",
-      "                                                              emptycolumnwise=key_b[2])))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "phase five seahorse is ready for trials and the nautilus system is fully functional we engaged the mechanism and lowered the deck to three feet above sealevel approaching the shore by the radar station at all times signals from their communications were monitored and no sign was given that our approach had been monitored or even noticed we backed off the deck was raised by two feet and the approach attempted again once more our incursion was unnoticed overnight we conducted a range of tests and mapped the radar coverage on three separate occasions there seems to have been a flurry of activity and our modeling suggests that the ships masts may have triggered brief alarms on all occasions the automatic dive systems cut incorrectly lowering the decks to sealevel and the alarms were cancelled the seahorse deployment system will be fully mounted tonight and we will conduct a battery of tests on the deployment and emergency recovery systems over the next two nights assuming that sea and air traffic remains low xxxx\n"
-       ]
-      }
-     ],
-     "prompt_number": 42
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = column_transposition_break_mp(c5bs, fitness=Ptrigrams)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 8,
-       "text": [
-        "(((3, 2, 4, 1, 5, 0), False, True), -2821.4971440358026)"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(sanitise(column_transposition_decipher(c5bs, key_b[0], \n",
-      "                                                              fillcolumnwise=key_b[1], emptycolumnwise=key_b[2])))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "phase five seahorse is ready for trials and the nautilus system is fully functional we engaged the mechanism and lowered the deck to three feet above sealevel approaching the shore by the radar station at all times signals from their communications were monitored and no sign was given that our approach had been monitored or even noticed we backed off the deck was raised by two feet and the approach attempted again once more our incursion was unnoticed overnight we conducted a range of tests and mapped the radar coverage on three separate occasions there seems to have been a flurry of activity and our modeling suggests that the ships masts may have triggered brief alarms on all occasions the automatic dive systems cut incorrectly lowering the decks to sealevel and the alarms were cancelled the seahorse deployment system will be fully mounted tonight and we will conduct a battery of tests on the deployment and emergency recovery systems over the next two nights assuming that sea and air traffic remains low xxxx\n"
-       ]
-      }
-     ],
-     "prompt_number": 40
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "transpositions[key_b[0]]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 41,
-       "text": [
-        "['tokens',\n",
-        " 'trials',\n",
-        " 'tricks',\n",
-        " 'tromps',\n",
-        " 'umiaks',\n",
-        " 'unfair',\n",
-        " 'urbans',\n",
-        " 'urgent',\n",
-        " 'vocals',\n",
-        " 'womans',\n",
-        " 'womens',\n",
-        " 'wreaks',\n",
-        " 'wrecks',\n",
-        " 'yokels',\n",
-        " 'ricardo',\n",
-        " 'sneaker',\n",
-        " 'speaker',\n",
-        " 'tobagos',\n",
-        " 'trebles',\n",
-        " 'woolens',\n",
-        " 'sneakers',\n",
-        " 'speakers',\n",
-        " 'speedier',\n",
-        " 'tobaccos',\n",
-        " 'together',\n",
-        " 'treaties',\n",
-        " 'treatise',\n",
-        " 'trollops',\n",
-        " 'unedited',\n",
-        " 'woollens',\n",
-        " 'wreckers',\n",
-        " 'treatises',\n",
-        " 'triteness',\n",
-        " 'usherette',\n",
-        " 'woodcocks',\n",
-        " 'tritenesss',\n",
-        " 'usherettes']"
-       ]
-      }
-     ],
-     "prompt_number": 41
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2014-challenge6.ipynb b/2014-challenge6.ipynb
deleted file mode 100644 (file)
index fc91ef6..0000000
+++ /dev/null
@@ -1,255 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:5973034ac2337d403853a03b7c1d5fdb5ce28d6b3ac7e6be40537ee382e9f648"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "import matplotlib.pyplot as plt\n",
-      "import pandas as pd\n",
-      "import collections\n",
-      "import string\n",
-      "%matplotlib inline\n",
-      "\n",
-      "from cipherbreak import *\n",
-      "\n",
-      "c6a = open('2014/6a.ciphertext').read()\n",
-      "c6b = open('2014/6b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs = pd.Series(english_counts)\n",
-      "freqs.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 2,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7fc55c2b98d0>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7fc586677dd8>"
-       ]
-      }
-     ],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_6a = pd.Series(collections.Counter([l.lower() for l in c6a if l in string.ascii_letters]))\n",
-      "freqs_6a.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 3,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7fc55a6375c0>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7fc55a6462b0>"
-       ]
-      }
-     ],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_6b = pd.Series(collections.Counter([l.lower() for l in c6b if l in string.ascii_letters]))\n",
-      "freqs_6b.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 4,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7fc55a642128>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\ngg==\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7fc55a5a5400>"
-       ]
-      }
-     ],
-     "prompt_number": 4
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6as = sanitise(c6a)\n",
-      "c6as"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 5,
-       "text": [
-        "'mtaeglatcleptenopeautelebiiootatwnantateituiiagaeostgvetabdresiacqobwavgrhrsihssaekajbwwttdrsmeetnyafsegilegtkrreocuantteomsgstnsiaeluutrbaiaeteeserhxgtooarrbhpcklialhnaesvearhbepiydcesewtaxuyaerywoeinhteegeisieireaassrbitnhtuorooleewsttereoahyakhlsmsaeodslthsutigqimnidsgetpmwtrnnotfhvselkaumrndvcnrluceryhyeetlnigouncnanrhpnosbhshpslreclvrinfoehniaeennhcrbenrgunruesmlrehiutgteordroeaeoisoeusiknteeslohthdcrmisuteoteaeoshfaiaesemritrseisaigwyrmhrbtetncoenuhorcadeodlcrncomnctosihudtcinagesntisutigytmshthyalatlsnhilguimtlbfldyhrfrnetsaosteetaefhlgokhretcakuteihrlrtlsetshlcpeadhthyutaeennhryraeennihrnbhnsnehyutsdtoywmtiatalwhvbepetlxihuscrtadtikhnxmsaesnwluevgnrcpegvnhteruigeuealsdntikeaeomctwrybusiilephkyodhrsyhecaatrmrltrarretstuoetnuesiduaidoesisaeetbllerpntroisiatsiasesomihsieiaunsaitneelacrfnrnngvetteenslhvpepteonedtnaooutgsotancetimiiwoetiuihclsewtcniieotslfbeecohenpoelsdoctceeemiiirttmhbiuovecegaitjuaborcleentatruyinetsidlaeehitwencceohwvohoatwkteroarhcseer'"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6bs = sanitise(c6b)\n",
-      "c6bs"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 6,
-       "text": [
-        "'hwssswxfewhhrfewpdrvttdhxbccleayphalnadhiehaoudrotwnrrvysabjlttbaytmelrkaidopthatlelrtwaamaneksvvzrvllatkcrjquicizgtoqcpnrrkttowandqehtqrvtbaydqealannohulanuzlwextlvjrvivhnohdqmgykaclmswrupdetfioftfelhzpxhaswftwprrsweiseohefpdrvttnvagdvswgoerbetnharvaeevtlltbmgaiatgelinmdawevhatterdhrznbnvoutnefoteveaehlaymhacglzeptvvdimworfisgtuzlwibeqohubtghamqornjnnrumqvjtxeltfovgawdaeevllgrtxibgtibevmpsaateoasevaeyqohameonncfuidoefafattemuimnflznbekofobrliaehhauihnnnwzaeevtlltpaalnanvtzlzuucptaelinanpaahewfthaosetaribnbnvhaevdhyytlmuxb'"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_a, score = railfence_break(c6as)\n",
-      "key_a, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 7,
-       "text": [
-        "(3, -2314.997881051078)"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(railfence_decipher(c6as, key_a)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 8,
-       "text": [
-        "'mark the last message told usa lot the scuttling equipment is designed to pump water in and out of the vessel like a submarine dive control but clearly they werent planning to turn a container ship into a sub this ship is a largescale version of something i have seen in the caribbean drug runners use a similar technique to get below radar coverage for inshore runs sinking the vessel so that the deck remains just below the wave tops the fda pirates seem more interested in staying away from shore but getting close enough to track and record electronic communications without detection i am guessing this scuttling system is what they call nautilus in their log but i am still baffled by the references to seahorse the next page of the log looks harder to crack but the cipher clerk tells me it is a hill cipher and that they must have been in a hurry or have been enciphering by hand since they just used a two by two matrix actually we have been pretty lax with our security and i think the next message is end will use avi genere cipher given that we are using secure cables i dont think we have too much to worry about so i will keep the keyword short say three characters more later harry'"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = hill_break(c6bs)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 14,
-       "text": [
-        "(matrix([[0, 1],\n",
-        "         [1, 1]]), -666.1299098341699)"
-       ]
-      }
-     ],
-     "prompt_number": 14
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(hill_decipher(key_b, c6bs)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 13,
-       "text": [
-        "'phase six seahorse operated exactly as planned with good forward visibility at the trial depths the crew managed several tasks requiring concentration and dexterity and we plan to run a full test overnight on dummy cables dropped from the ship the software seems to be operating as designed but there are still bugs in the firmware that need ironing out before we deploy the collective is working full time to hunt them down and remove them though we are all getting tired mistakes are easy to make and could be fatal time is no longer on our side though and we are still planning to launch the final phase of the operation in three days timex'"
-       ]
-      }
-     ],
-     "prompt_number": 13
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2014-challenge7.ipynb b/2014-challenge7.ipynb
deleted file mode 100644 (file)
index 35d298f..0000000
+++ /dev/null
@@ -1,387 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:3a4749bad5690e746e43cddb887ed31282398e12c90470d01010a2e6a024c527"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "import matplotlib.pyplot as plt\n",
-      "import pandas as pd\n",
-      "import collections\n",
-      "import string\n",
-      "%matplotlib inline\n",
-      "\n",
-      "from cipherbreak import *\n",
-      "\n",
-      "c7a = open('2014/7a.ciphertext').read()\n",
-      "c7b = open('2014/7b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs = pd.Series(english_counts)\n",
-      "freqs.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 2,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f51e347e1d0>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAD+CAYAAAA+hqL9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnX+0VeV55z9XKZjoxcs1FsEYr7U0SrVhQojpSuI6/kBp\nJkGcWsWZCjczk1VljHFNp4NkpgOMq5TQ1anamTQmGi40wWiro5gRBIGdmh94lXgMkSBgggUqJAYR\nTFIGRuaP5z2cfc89P/be95593vPe72etvfa73/0++/2x99nPfp/vPueAEEIIIYQQQgghhBBCCCGE\nEEIIIYQQQgghhBAtZQHwMrAVWAWMAbqB9cAOYB3QVVF+J7AduCaWP9UdYydwbyx/DPCwy98MnB/b\nN9fVsQOYM1wdEkIIkZ0e4MfYzRvsBj4XWAb8Z5c3H1jq0pOBIvBrznYX0OH29QMfdumngBkuPQ/4\nokvfBHzDpbuBVzGn0xVLCyGEaCHdwCvAOGAU8CQwHZsNjHdlznHbYLOF+TH7tcBHgAnAj2L5s4Ev\nxcpc5tKjgJ+59M3A38RsvuTshBBCNJFTGuw/CPwl8I/APwGHsBDSeOCAK3OAspOYCOyN2e8Fzq2S\nv8/l49Z7XPo48BZwVp1jCSGEaCKNHMOFwJ1YWGgicAbwhxVlTrhFCCFEAIxqsP9DwHeBn7vtx4Df\nBfZjIaT9WJjop27/PuC8mP17sSf9fS5dmV+yeR82IxkFnOnq2wcUYjbnARsrG3jhhReeePXVVxt0\nQwghRAUvAVOq7Wg0Y9iOaQTvwkTkq4FtmNYw15WZCzzu0qsxHWA0cAEwCROd9wOHMS2hA7gFeCJm\nUzrWDcAGl16HvdXUhWkc04GnKxv46quvcuLEiarLwoULa+4bLps86pCNzk1oNr62ayTZAB+odeNv\nNGN4CVgJvAC8A3wf+DLQCTwC/DtgN3CjK7/N5W/D9IJ5lMNM84A+zMk8hYnOAA8Cf4u9rvpzygLz\nQeBu4Hm3vRjTOBKze/fuNMUz2eRRh2yy2fjaLtn42y7ZGI0cA9irqcsq8g5is4dqLHFLJVuAS6vk\nH6XsWCpZ7hYhhBA5cWqrGzAMLFq0aFHVHV1dXfT09KQ6WFqbPOqQTTYbX9slG3/bNZJsFi9eDBaJ\nGURHtcw244SLlwkhhEhIR0cH1PABjcTntiaKoqbb5FGHbLLZ+Nou2fjbLtkYQTsGIYQQ6VEoSQgh\nRiAjNpQkhBAiPUE7BsVKR7aNr+2Sjb/tko2R5HsMokWMHdvNkSNvDsrv7BzH4cMHW9AiIcRIQBqD\nx1gMsFrfOgi1z0KIfJDGIIQQIjFBO4aQYqWQTz0h2fjaLtn42y7ZGEE7BiGEEOmRxuAx0hiEEM1C\nGoMQQojEBO0YQoqVSmPw99zIRucmNJugHYMQQoj0SGPwGGkMQohmIY1BCCFEYoJ2DCHFSqUx+Htu\nZKNzE5pNEsfwfuDF2PIWcAfQDawHdgDrgK6YzQJgJ7AduCaWPxXY6vbdG8sfAzzs8jcD58f2zXV1\n7ADmJOuWEEKIrKTVGE4B9gEfBj4LvAEsA+YD44C7gMnAKmAacC7wDDAJC5b3A7e79VPAfcBaYB5w\niVvfBFwPzMacz/OYQwHY4tKHYm2SxiCEECkZTo3hamAXsAeYCaxw+SuAWS59HfAQcAzY7cpfBkwA\nOjGnALAyZhM/1qPAVS59LTYbOeSW9cCMlG0WQgiRgrSOYTZ20wcYDxxw6QNuG2AisDdmsxebOVTm\n73P5uPUelz6OhavOqnOsRIQUK5XG4O+5kY3OTWg2aRzDaOBTwN9V2XeC6jEPIYQQbUaaP+r5PSzG\n/zO3fQA4B9iPhYl+6vL3AefF7N6LPenvc+nK/JLN+4B/cm06E/i5yy/EbM4DNlY2rLe3l56eHgC6\nurqYMmUKhUKBQqFw0lsWCnaYRtulvGaVr/TejY9fKl+53dg+j/6n7c9QttP2Z6T33/f+jPT+592f\nKIro6+sDOHm/rEUa8fkbwBrKWsAy7Ob9BUx07mKg+PxhyuLzb2IziuewN5r6gf/DQPH5UuA2LFw1\ni7L4/ALwQdfWLS4t8TnQPgsh8mE4xOfTMeH5sVjeUmA69hrplW4bYBvwiFuvwW76pbvYPOAB7LXU\nXZhTAHgQ0xR2AndiDgbgIHA39mZSP7CYgU6hLpXevxk2edThrHKpJyQbX9slG3/bJRsjaSjpF8B7\nKvIOYs6iGkvcUskWbGZQyVHgxhrHWu4WIYQQOaDfSvIYhZKEEM1Cv5UkhBAiMUE7hpBipdIY/D03\nstG5Cc0maMcghBAiPdIYPEYagxCiWUhjEEIIkZigHUNIsVJpDP6eG9no3IRmE7RjEEIIkR5pDB4j\njUEI0SykMQghhEhM0I4hpFipNAZ/z41sdG5CswnaMQghhEiPNAaPkcYghGgW0hiEEEIkJmjHEFKs\nVBqDv+dGNjo3odkE7RiEEEKkRxqDx0hjEEI0C2kMQgghEhO0YwgpViqNwd9zIxudm9BskjqGLuDv\ngR8B24DLgG5gPbADWOfKlFgA7AS2A9fE8qcCW92+e2P5Y4CHXf5m4PzYvrmujh3AnITtFUIIkZGk\nGsMK4FvAV4FRwOnAfwHeAJYB84FxwF3AZGAVMA04F3gGmIQFy/uB2936KeA+YC0wD7jErW8Crgdm\nY87necyhAGxx6UOxtkljEEKIlAxVYzgT+DjmFACOA28BMzGHgVvPcunrgIeAY8BuYBc2w5gAdGJO\nAWBlzCZ+rEeBq1z6Wmw2csgt64EZCdoshBAiI0kcwwXAz4DlwPeBr2AzhvHAAVfmgNsGmAjsjdnv\nxWYOlfn7XD5uvcelS47nrDrHSkRIsVJpDP6eG9no3IRmMyphmQ9iIaDngXuwkFGcE1SPeeRCb28v\nPT09AHR1dTFlyhQKhQJQHpSk28VisanloyiiWCwmLj/YIQzcTtu/Vven8iId7var/+3Rn7TlQ+t/\nK/oTRRF9fX0AJ++XtUiiMZwDfA+bOQB8DBOXfwO4AtiPhYk2ARdRdhpL3XotsBB4zZW52OXfDFwO\n3ObKLMKE51HA68DZmM5QAG51NvcDGzGhuoQ0BiGESMlQNYb9WJjnt9z21cDLwJPYG0O49eMuvRq7\noY/GnMkkTFfYDxzG9IYO4BbgiZhN6Vg3ABtceh32VlMXJm5PB55O0GYhhBAZSfq66meBrwMvAb8D\n/Bk2I5iOvUZ6JeUZwjbgEbdeg71pVHq8nQc8gL2WugubKQA8iGkKO4E7Kc86DgJ3YyGsfmAxA99I\nqkvlNK8ZNnnU4axyqSckG1/bJRt/2yUbI4nGAOYQplXJv7pG+SVuqWQLcGmV/KPAjTWOtdwtQggh\nckC/leQx0hiEEM1Cv5UkhBAiMUE7hpBipdIY/D03stG5Cc0maMcghBAiPdIYPEYagxCiWUhjEEII\nkZigHUNIsVJpDP6eG9k079yMHdtNR0dH1WXs2O5hb5dsjKAdgxCivTly5E3KP8W2KZY+4faJZiCN\nwWOkMYiRTu3PAOhzMDSkMQghhEhM0I7Bp1jpUG2kMfh7bmSTz7nRZ0AagxBCiBYhjcFjpDGIkY40\nhuYhjUEIIURignYMvsZKFV8N69zIRhpDaDZBOwYhhBDpkcbgMdIYxEhHGkPzkMYghBAiMUE7Bl9j\npYqvhnVuZCONITSbpI5hN/AD4EWg3+V1A+uBHcA6oCtWfgGwE9gOXBPLnwpsdfvujeWPAR52+ZuB\n82P75ro6dgBzErZXCCFERpJqDD/BbuoHY3nLgDfcej4wDrgLmAysAqYB5wLPAJOwQGE/cLtbPwXc\nB6wF5gGXuPVNwPXAbMz5PO/qBtji0odi7ZDGIESgSGNoHsOlMVQeYCawwqVXALNc+jrgIeAYNtPY\nBVwGTAA6Kc84VsZs4sd6FLjKpa/FZiOH3LIemJGizUIIIVKS1DGcwJ78XwA+4/LGAwdc+oDbBpgI\n7I3Z7sVmDpX5+1w+br3HpY8DbwFn1TlWInyNlSq+Gta5aaZNrf8jSPJfBM1u21Bs9Bnw22ZUwnIf\nBV4Hzsae2rdX7C/9SHpL6O3tpaenB4Curi6mTJlCoVAAyoOSdLtYLDa1fBRFFIvFxOUHfxgGbqft\nX6v7U3mRDnf7Q+u//efAJqBA/NwfOXJFW/YnbXlXCut/Kc3J7XbtfyuuzyiK6OvrAzh5v6xFlu8x\nLATexmYOBWA/FibaBFyE6QwAS916rbN5zZW52OXfDFwO3ObKLMKE51GUndBsV8etzuZ+YCMmVJeQ\nxiCCZaRfA9IYmsdQNYZ3Y9oAwOnYW0ZbgdXYG0O49eMuvRq7oY8GLsCE537MgRzG9IYO4BbgiZhN\n6Vg3ABtcep2rrwsTt6cDTydosxBCiIwkcQzjgWeBIvAc8E3shr0Uu1HvAK6kPEPYBjzi1muwN41K\nbn0e8AD2WuoubKYA8CCmKewE7qQ86zgI3I29mdQPLGbgG0kDGOr/w4K/cWzFV/09N7oGpDGEZpNE\nY/gJMKVK/kHg6ho2S9xSyRbg0ir5R4EbaxxruVsaUv5/2BIRpVjkkSMh/PqHEEI0nxDulic1htDi\nkSM9vix0DYT2mfYJ/VaSEEKIxATuGKL0Fp7GsRVf9ffc6BqQxhCaTeCOQQghRFqkMXjMSI8vC10D\noX2mfUIagxBCiMQE7hii9BaexrEVX/X33OgakMYQmk3gjkEIIURapDF4zEiPLwtdA6F9pn1CGoMQ\nQojEBO4YovQWnsaxFV/199zoGpDGEJpN4I5BCCFEWqQxeMxIjy8LXQOhfaZ9QhqDEEKIxATuGKL0\nFp7GsRVf9ffc6BqQxhCaTeCOQQghRFqkMXjMSI8vC10DoX2mfUIag2g5w/G3q0KIfAjcMUTpLTyN\nY7d7fLX8t6ulZdPJtO0b/rb51H+o7RyTO8bmtS1vm5H4GWgnm6SO4VTgReBJt90NrAd2AOuArljZ\nBcBOYDtwTSx/KrDV7bs3lj8GeNjlbwbOj+2b6+rYAcxJ2FaRA/Gb3BVXXKGn/wQMdI7pHaMQeZFU\nY/iP2I29E5gJLAPecOv5wDjgLmAysAqYBpwLPANMwj4B/cDtbv0UcB+wFpgHXOLWNwHXA7Mx5/O8\nqxdgi0sfqmibNIYWkLZtoZ2bLGQ5nz5fA3mg66Z5DFVjeC/wCeCB2EFmAitcegUwy6WvAx4CjgG7\ngV3AZcAEzKn0u3IrYzbxYz0KXOXS12KzkUNuWQ/MSNBeIYQQQyCJY/gr4E+Ad2J544EDLn3AbQNM\nBPbGyu3FZg6V+ftcPm69x6WPA28BZ9U5VgqidMXxN47tc3w1S9tCOjchjVkzbYb+AkJz2iWbwYxq\nsP+TwE8xfaFQo0wpaNoyent76enpcVv3AFMoNzcaULY0SIVCoep2sVisu3+o5aMoolgsJi4/+MOQ\nrj9pt5P2Z2B7isQvjyiKGpTPrz/N6n9e57Ncprp9q/tTeX7rlTctZVOsdOFkf44cuaKqfbnPhVia\nk9vt1P/h2B5Kf6Iooq+vDyB2v6xOI41hCXAL9iR/GjAWeAzTEArAfixMtAm4CNMZAJa69VpgIfCa\nK3Oxy78ZuBy4zZVZhAnPo4DXgbMxnaEA3Ops7gc2YkJ1HGkMLUAaQ3pGusaQ5RrQddM8hqIxfB44\nD7gAu1FvxBzFauyNIdz6cZde7cqNdjaTMF1hP3AY0xs63DGeiNmUjnUDsMGl12FvNXVh4vZ04OkG\n7RVCCDFE0n6PoeSel2I36h3AlZRnCNuAR9x6DfamUclmHiZg78RE6bUu/0FMU9gJ3El51nEQuBt7\nM6kfWMzgN5IaEKUrjr9xbJ/jq77Gy/Pqf0hjlp9N+jrC6r/fNo00hjjfcgvYTfvqGuWWuKWSLcCl\nVfKPAjfWONZytwghhMgJ/VaSx/gcX5bGkB5pDNIYfEK/lSSEECIxgTuGKL2Fp3Fsn+OrvsaLfY7h\n+jpm+dmkryOs/vttk0ZjEEIIwL6sVus3njo7x3H48MGcWySGE2kMHuNzfFkaQ3pC0hjy0gt03TQP\naQxCCCESE7hjiNJbeBrH9jm+6mu82OcYrq9jltUmfdvyqMPva8Bnm8AdgxBCiLRIY/AYX+PLII0h\nC9IYpDH4hDQGIYQQiQncMUTpLTyNY/scX/U1XuxzDNfXMctqI40hLJvAHYMQQoi0SGPwGF/jyyCN\nIQvSGKQx+IQ0BiGEEIkJ3DFE6S08jWP7HF/1NV7scwzX1zHLaiONISybwB2DEEKItEhj8Bhf48sg\njSEL0hikMfiENAYhhBCJCdwxROktPI1j+xxf9TVe7HMM19cxy2ojjSEsm0aO4TTgOaAIbAP+3OV3\nA+uBHcA6oCtmswDYCWwHronlTwW2un33xvLHAA+7/M3A+bF9c10dO4A5CfskhBBiCCTRGN4N/BL7\nU59vA/8JmAm8ASwD5gPjgLuAycAqYBpwLvAMMAkLEvYDt7v1U8B9wFpgHnCJW98EXA/MxpzP85hD\nAdji0ocq2ieNoQVIY0iPNAZpDD4xVI3hl249GjgVeBNzDCtc/gpglktfBzwEHAN2A7uAy4AJQCfm\nFABWxmzix3oUuMqlr8VmI4fcsh6YkaC9QgghhkASx3AKFko6AGwCXgbGu23cerxLTwT2xmz3YjOH\nyvx9Lh+33uPSx4G3gLPqHCsFUbri+BvH9jm+6mu82OcYrq9jltVGGkNYNkn+8/kdYApwJvA0cEXF\n/hPUnuvlQm9vLz09PW7rHqy5BbcdDShbGqRCoVB1u1gs1t0/1PJRFFEsFhOXH/xhSNeftNtJ+zOw\nPUXK421l6pfPrz/N6n9e57Ncprp9q/pTq/2N+5O2fKlMpX399uV1PivHw+frM4oi+vr6AGL3y+qk\n/R7DnwK/Av49dmb2Y2GiTcBFmM4AsNSt1wILgddcmYtd/s3A5cBtrswiTHgeBbwOnI3pDAXgVmdz\nP7ARE6rjSGNoAdIY0iONQRqDTwxFY3gP5TeO3gVMB14EVmNvDOHWj7v0auyGPhq4ABOe+zEHchjT\nGzqAW4AnYjalY90AbHDpddhbTV2YuD0dm7EIIYRoIo0cwwTsKb2Ivbb6JHbjXordqHcAV1KeIWwD\nHnHrNdibRiWXPg94AHstdRc2UwB4ENMUdgJ3Up51HATuxt5M6gcWM/iNpAZE6Yrjbxzb5/iqr/Hi\nvPof0phltZHGEJZNI41hK/DBKvkHgatr2CxxSyVbgEur5B8FbqxxrOVuEUIIkRP6rSSP8TW+DNIY\nsiCNQRqDT+i3koQQQiQmcMcQpbfwNI7tc3zV13ixzzFcX8csq400hrBsAncMQggh0iKNISfGju3m\nyJE3q+7r7BzH4cMHB+X7Gl8GaQxZkMYgjcEn6mkMSb75LIYBcwrVL+IjR0Lwz0KIUAg8lBSlt8gh\njh1afNXX/vgcw/V1zLLaSGMIy0YzBjHiyRLmEyJkQohhtIXGMLzx1dbHVkPSGPJqmzQGaQw+oe8x\nCCGESEzgjiFKbyGNIbWNr/3x+fsivo5ZVhtpDGHZBO4YhBBCpEUaQ05IYwjr3AxvPdIY2vG6aXek\nMQghhEhM4I4hSm/haRzb5/iqr/2RxuDzNZBHHX7H8X22CdwxCCGESIs0hpyQxhDWuRneeqQxtON1\n0+5IYxBCCJGYwB1DlN7C0zi2z/FVX/sjjcHnayCPOvyO4/tsk8QxnAdsAl4Gfgjc4fK7gfXADmAd\n0BWzWQDsBLYD18Typ2L/I70TuDeWPwZ42OVvBs6P7Zvr6tgBzEnQXiGEEEMgicZwjluKwBnAFmAW\n8GngDWAZMB8YB9wFTAZWAdOAc4FngElYoLAfuN2tnwLuA9YC84BL3Pom4HpgNuZ8nsccCq7uqcCh\nWPukMbQAaQzDWY80hna8btqdoWoM+zGnAPA28CPshj8TWOHyV2DOAuA64CHgGLAb2AVcBkwAOjGn\nALAyZhM/1qPAVS59LTYbOeSW9cCMBG0WQgiRkbQaQw/wL4DngPHAAZd/wG0DTAT2xmz2Yo6kMn+f\ny8et97j0ceAt4Kw6x0pIlLxoycLTOLbP8VVf+yONwedrII86/I7j+2yT5v8YzsCe5j8HHKnYd4La\n872m09vbS09Pj9u6B5gCFNx2NKBsaZAKhULV7WKxWHd/1vKxFmATsGTtG/xhSNeftNtD74+VqV8+\nv/4k3S5TmhzX7098u1gsJq4vbf/LZarbD/f1nLQ/tdo/3NdzuUylff32Nbv/tcaj2dfrUPoTRRF9\nfX0AsftldZJ+j+HXgG8Ca7A7L5iwXMBCTRMwgfoiTGcAWOrWa4GFwGuuzMUu/2bgcuA2V2YRJjyP\nAl4HzsZ0hgJwq7O5H9iICdUlpDG0AGkMw1mPNIZ2vG7anaFqDB3Ag8A2yk4BYDX2xhBu/XgsfzYw\nGrgAE577MQdyGNMbOoBbgCeqHOsGYINLr8PeaurCxO3pwNMJ2iyEECIjSRzDR4E/BK4AXnTLDGxG\nMB17jfRKyjOEbcAjbr0Ge9Oo5NbnAQ9gr6XuwmYKYI7nLJd/J+VZx0HgbuzNpH5gMQPfSGpAlLxo\nycLTOLbP8VVf+5NXX0Ias6w2PmkMY8d209HRMWgZO7Y7WS0ex/7zskmiMXyb2g7k6hr5S9xSyRbg\n0ir5R4EbaxxruVuEEKIh9v/dpWfRiJIeceRICL8AlA8hjJQ0hhYgjWE465HGkI9N6z83PqHfShJC\nCJGYwB1DlN7C0zh2WPHlbDa+npuQxiyrjU8aw1BtfI79+6QxCCEqGDu228WyB9LZOY7Dhw+2oEVC\nDB/SGHIitFjpSNcY8tILfL0GWq8XZLFp/efGJ6QxCCGESEzgjiFKb+FpHNvnWKmv/fG5L76OWVYb\naQxh2QTuGIQQQqRFGkNOhBYrlcYgjWGkawzt/gJCPY1BbyUJIUQGBn7DOp7f/s/bgYeSovQWAcWx\n/Y0vZ7MJ6dz4OmZZbUa6xuDzudH3GHKi1hQS2mcaKYRoD1oRsmr/OU8LNIbQYqVZkMYgjWGkawzt\nXo++xzCCGOpPDgshROCOIUpvkToel76OZtqUBbET2B/mWbpW6GtQLR7H5aUxpLeRxpDexmeNIa96\nAncMQggh0iKNIQM+x0p9jXtKY/D7fKal9Z+BLDbtEfvPqx5pDEIIIRITuGOI0lu0ucaQxWbognXz\n2jbAQhpDegtpDOktPI79+6QxfBU4AGyN5XUD64EdwDqgK7ZvAbAT2A5cE8uf6o6xE7g3lj8GeNjl\nbwbOj+2b6+rYAcxJ0FaRgaEK1kKIsEiiMXwceBtYCVzq8pYBb7j1fGAccBcwGVgFTAPOBZ4BJmF3\nmn7gdrd+CrgPWAvMAy5x65uA64HZmPN5HnMoAFtc+lBF+6QxtIGNNAZpDK23aY/Yf171DFVjeBao\nfHScCaxw6RXALJe+DngIOAbsBnYBlwETgE7MKYA5mVlVjvUocJVLX4vNRg65ZT0wI0F7hRBCDIGs\nGsN4LLyEW4936YnA3li5vdjMoTJ/n8vHrfe49HHgLeCsOsdKQZSuOCNTY2gXG2kM6W2kMaS38Tn2\nn1c9w/FbSaXgdMvo7e2lp6fHbd0DTAEKbjsaULY0SIVCoep2sVisu3/wIBfdunAyJ4qiOuUjZ5Os\nfYMvhEblS2WSHb9RfxqXjxjYnyT9r73d6Pw0a7vMUM9n9fJ5ns9PfOJT/OpXb1NJZ+c4Vq9+bFD5\nyu1isZhivNL2J235UplK+6TtS3Y9p+1/1v4M9/WZpj9RFNHX1wcQu19WJ+n3GHqAJylrDNtdy/Zj\nYaJNwEWYzgCw1K3XAguB11yZi13+zcDlwG2uzCJMeB4FvA6cjekMBeBWZ3M/sBETquNIY2gDG2kM\nftukpfWfgSw27RH7z6ueZnyPYTX2xhBu/XgsfzYwGrgAE577MQdyGNMbOoBbgCeqHOsGYINLr8Pe\naurCxO3pwNMZ21uTWq9q6veFhBAjlSSO4SHgu8D7MS3g09iMYDr2GumVlGcI24BH3HoN9qZRyaXN\nAx7AXkvdhc0UAB7ENIWdwJ2UZx0HgbuxN5P6gcUMfiOpAVHDEgNf1czyumbjOmQzPDbSGPKxkcag\nepJoDDfXyL+6Rv4St1SyhXIoKs5R4MYax1ruFiGEEDkx4n8rqT1tWh+Tlsbg5zhntUlL6z8DWWza\nI/afVz36rSQhhBCJCdwxRDnY5FGHbEAag6/jnK2ePOrIZuNz7D+vegJ3DEIIIdIijaEtbVofk5bG\n4Oc4Z7VJS+s/A1ls2iP2n1c90hiEEKIO+q/0gQTuGKIcbPKoQzYgjcHXcc5WTx51JLcZ+k/Pp2+b\nNAYhhBBtgzSGtrRpfUzaV41h7Njumk95nZ3jOHz44LC0zddxzmqTltZ/BrLYtN84N7OeehrDcPy6\nqhDeUA4JVNsXwnOQEM0n8FBSlINNHnXIBrLEStPXIZuRqTG0wkYagxBCiLYhhLm1NIY2sNF/Zfht\nk5bWj3MWm/Yb52bWo+8xCCGESEzgjiHKwSaPOmQD0hj8Hecs9eRRh9820hiEEEK0DdIY2tKm9bFS\naQx+jnNWm7S0fpyz2LTfODezHmkMQgghEtMOjmEGsB37T+j56UyjDNWltcmjDtmANAZ/xzlLPXnU\n4beNNIbsnAr8T8w5TMb+f/ri5ObFDFWmtcmjDtkAFIs6N3nYpB/nLPX42/+wxjlbPb47hg8Du4Dd\nwDHgG8B1yc0PZagyrU0edcgG4NAhnZs8bNKPc5Z6/O1/WOOcrR7fHcO5wJ7Y9l6XJ0YAlb+Rv3jx\n4hH/O/nNIj7WGufm0S7j7LtjGKK0vzsHmzzqGJk2A38j/wQw92Q62e/kN6ddIdoMHOu045ylbWnL\nh2GTxzgPxwOV76+rfgRYhGkMAAuAd4AvxMoUgQ/k2ywhhGh7XgKmtLoRWRgFvAr0AKMxJ5BCfBZC\nCBEivwe8gonQC1rcFiGEEEIIIUYWvmsMWegGJgFjYnn/UKf8u4B5wMcwJehZ4G+Afx6GtvxxLH2C\n8niXRPX/Ucf2FODfABcA/x14H3AO0D8M7apsY2Xb3gK2UPul6dOA38dCfKV/ATzh2jkcfAf4KPA2\ng19AOAGs+NT3AAAFL0lEQVQcBP4C+F8V+6Zi7Y7zSeCbw9SuEtOAzzO4/79TxybrmE0BPk752nyp\nQfks13O1ayCerrxOO4D3MvCNQV9YWCVvOK/NEYHvbyWl5TPAt4C1wGLgaUy8rsdK7Mtz92Ffpvtt\n4G8blB8X2+4GvlqjbCdwBnbDug2YiL1ueyvwwQbt+iLwu8C/dttvu7xqlNp7Z4NjVmOqa0+pbX+E\nhe++Qu1vmj8BzMS+W/K2W35Ro+x33Ppt4EjFcriGzUfd+gxsDOPLWNfmO6rYfQW4NLZ9M/DfatRR\nrT2N2lXi68By7Eb/KbfMbGCTZsxKfA74GnA2MN6lq/U7TtrrGWpfn6Xxr8aaBses5Ebs3AH8KfC/\nafwZ+ELCvDi/oDy+/w+7lnsa2Pwx6V+D/xp2v7kohc3kKnmFBjZ3MPB+k4SNwL+syPtyymMExQ+x\nJ6bSk+5F2AVYj20J80pUe4pu9NXCZxn4Aet0efV4sWINtZ8Wt2Ef6h9gjqpyadS2M2LbZ2AzrHcD\nP6ph88MGx8yDiVXyfgP4PnbeP4P17cwm1P2dxkUGkWXMtgKnx7ZPd3n1SHs9Q7brcwX2BdSklNr9\nMex3HT4JPNfA5sUqeY36X8kY7GGxHouAl4FvA7djTrgRV2Kzk/XAT4BHafxg9kPsYasD+3z9NbC5\ngc2fYfrqI9jbmUmiPD/BPsPx2VO1sRwxvODWRWzqDo0/FF/DnsxLfIT6T1gvMfBm203ji/WVWHtw\n6Vca2DyH/SRI6YSeTe2Tewd2Ez+KXRTx5ccN6tmOvfFVYkysbbXq+zL1wyat5P3YWKzFPnzN4Brg\nQWxG8vtu+VcNbLKM2VbsQafEu2h8raW9niHb9fkK9kT+Y9emrdiDSS1KD09LsRAp1L6+bnPH+2Xs\n2Fuxl/i/3qBdlXRjN9YkfAC7Eb8CbEhQfhQ2vp8H/pHGY3Y6NovbjDmJz5MsanMK5hS+gfVlCXBh\nnfIvurZ9EXgS6CKlYxjVuEhbsQebdj2OefI3qf2NkNIHbBT2BLgHi0W+j/on+C+B72EevAP4A+xi\nqsdKTBt4zNnMwp646vHX2Gzn17EL4Qbgv9Yoe59bvoSFAdLwdcwJPe7a9ilgFXYRVzrV0pidCnwa\nczxHXV6jGHszqbxZdmMfpudoTrvmYg5oFPa9mhKP1bH5OOnHbDnWh/h1UytsWeJDVL+et9apL8v1\neW2D/ZXsw5zjdMw5nEbtm+IqLFS1lPITNliY7+cN6olfC6dgn5+k+sJPgf2ujrMblN2AfUa+h800\nPuTs63Ec+BXm4E/DnOo7dS2Md1y7DmDOeBzw98AzwJ/UqWse0IvN/lKFo0IUn0sUsJjmWuD/Vtnf\nU8f2BPBanf2/jU0lT2DxvEazErA4bklE/AeSefCLgatcegO1QztDZRoW1z+B3VReqFGup8Fxdg9f\nk1LR02D/7mGu7xUsXJXmm/k9NfJ3N7CbykAhudF1U6ueRvVluT7TcDr21PsD7JeSJ2B60Lphrqcn\nlj6O3UyPNbCZh2kgvw78HfAwjT/Tf4U5g38GvouFq76H3fhr8RKwGnNU7wHuxx4S/qCOzeeAOZiz\negB7WDyGOb2dVJ85/JE7dompwH8A/m2DPgkhhsBy7OFAhMGfk/0bwJ3AZ7EHyaMNyk6rkjengc1i\n4Pwa+6qJ2cNCyDMGIZrFduxJzZdQmsifz2IzrKnYdfCsWza2slHDRWgagxB5MKNxERE4p2F64/dp\nHKoSQgghhBBCCCGEEEIIIYQQQgghhBBCiBHO/wdc3dBPs9bnrQAAAABJRU5ErkJggg==\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f521042a0f0>"
-       ]
-      }
-     ],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_7a = pd.Series(collections.Counter([l.lower() for l in c7a if l in string.ascii_letters]))\n",
-      "freqs_7a.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 3,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f51e3496278>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n/Os4hwAAAABJRU5ErkJggg==\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f51e349fda0>"
-       ]
-      }
-     ],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_7b = pd.Series(collections.Counter([l.lower() for l in c7b if l in string.ascii_letters]))\n",
-      "freqs_7b.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 4,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f51e33869e8>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nDLufFZvIJUlZmZGnbM9cMN7xxfI7t2702wpUt59+H7kk1VjFJvJGvqqaZ6Wx5IKOz7oy6vJ+33ox\n39Oero/zqszIJWlW3n/0UMQ/iIiFGXnK9swF4x1fLL9z6+KuK5sZeYRG+3ZSUkwqNpE38lXVMCsd\n7dvJ9P0sos6M3LpqtpW/zoxckpSJGXnK9qyLK0+c04tI1ol1cdeVzYxckmqsYhN5I1+VWWnUdWbk\n1lWzrfx1WbbNIk5QqNhELkmLSxEnKESbkftd0XHXDVMs68S6uOvyStteLb+P3O+KlqSgYtFKw7pF\nWGdGbl0128pfN+xtM9ojci0+eeM0qe6izciti7suj1jGZt3irMuriIy8YtGKJCmrMibyU4AtwIPA\nudlKGzmbtC7mOrNu66rZVv66YW/TRU/kewN/S5jMjwLOAF6WvryZs1nrYq5rNuPop3VVqIuhj8Pf\npoueyI8DHgK2As8AXwJOS1/+s5zNWhdTXedfsn3oQx/K+VW71RyfdWXWVbeP7dt1+zadbbvO18+i\nJ/KDgUfabj+aLJP2mPuXbLuBC/Zcr9t/btHiMXe7voD2bbzs7broiXzAj3O3WmedddZVpK146oo+\n/fD1wAwhIwc4D3gW+Ju2xzSBVxXcriTV3Ubg6GE0tAR4GJgEnkuYtDN82ClJqoLfBO4nfOh53oj7\nIkmSJFVbFb4mcAJ4CbBP27Jv9anZDzgLeCPhA9bbgL8HflFw385pu76b2fXV+lD3E33q9wJ+HzgM\n+CvgRcABwPcK7GO7c5jfz/8GfkDvE1T3Bd5OiMRa37+zm9DnIn0HeAPwJPM/GN8N7AA+BvzdAvXH\nEMbS7q3A1wrsY7tjgfOZv15e2adukPV5NHA8s9v1xhQ1efaHMeAQ5p5lVkUXdFlWxrYZtVH/if57\ngW8CNwAXAv9G+LC0n8sIf3D0KcIfIL0c+KeUdSvabk8Al/R4/DJgKWECeR9wEOF0yj8GXpOivc8A\nvw78XnL7yWTZQlpj+GCK5+7mmKRvrX7+ESHq+hy9/8r2X4FTCef+P5lcft7j8d9Jfj4J7Oq47OxR\n94bk51LCum2/jCf9P7tH/eeAV7TdPgP4yx6P79a/NP1suRy4lDApvy25nJqiLuv6bPkA8EXgBcDK\n5Hqv9dGSd3+4PsVjuvkdwu8L4C+AfyHd/vA3KZe1+zmz6/D/CNvzZIq2ziHfqc9fJMxLR2asO6rL\nsqkUdWczd06K0j2Eo4nW0eKRhI2in80pl3XqdlSa5k+pbiNMNi3LkmX93NXxE3ofYW0mTMJ3E15k\nOi9p+rm07fZSwrub5wH39ai7J8VzD8tBPe57MfBDwnbyXsJ4n19iX77T/yFd5V2fm4D9227vnyzr\nJ+/+sIHwR3xZtfr0RsLflL8VuDNF3V1dlqUZX7t9CAd//cwA9wLfBv6E8MKYxomEdwE3AT8Gvkq6\nA6t7CAdLY4T97dPAd1PUfZTweeJVhLP9qpCSZPb95GeT8HYU0m2AXyQc6ba8nnRHIBuZOyFOkG5D\nur+tfyTX709RdyfhawtaG/AL6L4xt5xNmHCfImxE7ZcfpWhvC+FsoZZ92vrZq93P0j8uqIqXEtbR\nDYQdpkwnA18gHPm/Pbn8Voq6vOtzE+HApmU/0m2fefeH+wlHuT9K2tlEOIjop3Xws5YQHULv7et9\nyXP/T1s7mwgnTV+eor12E4SJL61XESbL+4GbU9YsIazD84GfkG5f35/wbui7hEn9fNInHnsRJvEv\nEcZ2EXB4yto9HR6lRwhvK64hvAI+Qe8z4lsb9RLC0dIjhLzsRaRb2R8H7iC8+o0B7yD8kvu5jJBr\nX53UnU44munn04R3GC8k/HJ+G/jzHo//VHL5B0JEktXlhBePa5J+vg24grCRdXuBbK3PvYEzCS8Y\nTyXL0mTBw9I5mU0QNv47KbefqwkvHEsIfw/RcnWfuuPJtz4vJYypfTvrFf21vJbu+8OmPu3+Rorn\n7uYxwovVKsJkvi+9J60rCDHOWmaPWiFEXP/Vp6323/1ehH0pSz7+U2Bb0s4LUjz+ZsL+cgfhaP61\nyXP080vgfwkvvvsSXhyf7Vkx69mkj9sJL6wrgK8A3wA+nOYJqnQYP0XI3W4Anl7gMZM96ncD/56i\nnZcT3j7tBm4h3TsACPlt60Oob9H7CKTdy4A3J9dvpnfEUYRjCVn0bsLO/f0ej53s81xbi+nSwCb7\n3L+1pHbvJ8Q4Wf9ieXKB5VtT1B7D3A8t02xnC7WXpd0s9iccQd5N+JbTAwmfXdxYcDswd2y/JEx2\nz6SoO4uQ5b8Q+Gfgy6Tb1z9JmLx/AdxOiHHuIEzSvWwEriW8yPwK8I+EF/F39Kn7APAewgvN5wkH\nfs8QXrQeJOORuaT5LiW88Cs+f81gfwW5DHg/4eDwqT6PhXAA1ek9KeouBH51gfu6fYDaVZWOyKWq\n2UI4Iqpq5KTivZ/wzvsYwu/9tuRyyyg71c+oM3Kpyk7p/xDVzL6Ez9J+SLoIR5IkSZIkSZIkSZIk\nSVqk/h/e+2Rlj0saNgAAAABJRU5ErkJggg==\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f51e339d7b8>"
-       ]
-      }
-     ],
-     "prompt_number": 4
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c7as = sanitise(c7a)\n",
-      "c7as"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 5,
-       "text": [
-        "'veyjmyjkrzilysyjeydorulcsrcjnmoiddeugurlogfsnwcrlhckhghmwkejxlyktlagflalvtmgkyyomvlmgkyjosfdrzepwaqgnrzeqzinoaqforkcsltjwdussrzarlhcnajneqzabbakeebatjgoiklgcerzebjidlwmgdussnmljwdgftmlhceeazalasksnbtlmukcvtfwilderhrckuksbjqtfwcpwwfsdydrcsdwsbyfdmfeblhcneqkejohguhussjmciqfmjuqoirzosltfwsfapuwwmmlbzatwhyvnmadcstfstrzedvafsdzwelgpcjaraneanrzeqwwylepkscshmjscaslglmfgcjakqsrwrwlhcuurswyqollhcktyjbmsrbkibwcjwapwdyfapwamxapgulvfgnekwtcjsqiuyjeuatfsdgktgfcravcharlepfodtojlsdssrwncvtmjegffmjccvdcukndarwsgkaukokwtfanediiwtfasmfaqmbpwsamekasqaolscmmpjwodqeyjsyyouzellhcqfgltcvajgcydsfapuatfsjsjypagewdgfsnwcraolkyqleklhcveacpjstckcyfcyjrwscpsncveqaglwdrgdchlmqaljotsrceorwonwrylebnefacjwdckiefebxopmnbwrqwamhepstggnqawykajjeyvyagnawrlwdytosltfwrcxepwnawtmlhcuazdeqanrzejssrhaplodlhcxdydoeturlhcfevlscutggnfsskwrcsljqwmjrgwdgliqwnajynleboirzakgrckeamrceobafgwdyesagtpsnqhoqatggnaapfwryfdrwljkuqohyltfwyuwrcjeydlwmprgwfstgvollulvepktyfdgkhmotfwwfglcssqwmzdygkpmoepwdrzeqgrrgfagmnmtgfgrzeweuqlbcvogfggkrcsljqillelkitwalvwmmlbtupftfjosyhytarlepqilvawkillhyltgeerzegjillepuenlmgyhrforuaruhyfyrzilyuqwfsdbsltfwyasnfsrbdyfsvczihsciwdydoaslqgciwtgftfwmgvdjwodlhcgccsnasnwguewtkwaazaplsfgwgfgrzebwenkeyuazdeqanrzepwgggngvolliksggferzeskwgdlzwanjozdekturatksylwebkokwdghlmeaaqtmyerlhcxujdcmnepsgceankfpgmrzemealagmnepfmcftgxiyergyhratgkillhcarzwsranrwrcktqlondawslmfguwajdhyneydorlojgsczepw'"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c7bs = sanitise(c7b)\n",
-      "c7bs"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 6,
-       "text": [
-        "'anwaecnndrtwtanireoahsrdntieerdctewayerevaaarpioerobsedescrehlaoitithsdtrinosepeplthtnidtwsduledlhotpeaterhaaredeoaiodtahregerothwhtsureteeinwigiresetpowicooonitseudseechacteofiileonewiotacteodteuneahsedaptryemronmomlexontkemeoyvitsteenhantrertieineotndlhpoplyitewitrsedeevdycfrmnsnaypinmteeneeinahinepritedehveleaorelllvmocnahncepherohjuuvehautathttetoasipowwneedselopgdeslfedterfcaatehjasdtrprleseeretetecneorrsgckamiiwaefutiashaongcthsrenrehtrsthhaceinwtprloghetodaeraloeedeatsomldwedtwefsbelevpdteonoignsavftegsebomcehatietnrsptonthusorecredendcetlwaehesedrncveracuhoihaleinaemeunherdesttstasipedeyleeemtiisiigothntssfolnitretrwhemtkhhswtorcssnererohteencsapeblircnthuleofenrsromrnshmaddaodeatihioroutwevthapeceetovterdleaditewdottttcatkmbhtheicwantnisedwatxankeabovoanmswlprgaispodfogndpedeswrdacttrefhdesyaberretlavod'"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_a, score = vigenere_frequency_break(c7as)\n",
-      "key_a, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 7,
-       "text": [
-        "('say', -1726.4679903722085)"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(vigenere_decipher(c7as, key_a)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 8,
-       "text": [
-        "'dear mark things area lot clearer now i flew out to inspect the ship myself last night and took a good look around the reason the ship was not scuttled was that the valves had jammed it looks like the driftwood was pulled into the mechanism and blocked the inlet presumably the crew had already abandoned the vessel which was lucky for us without the ship we would have had no idea that the fda had been operating in these waters seahorse is no longer a mystery the cutaway on the starboard side cleared an area of around five meters square with a distinctive pattern of bolts fastened to reinforced deck plates i saw something like this on a sub rescue mission a couple of years ago when they fitted a local ship with a jury rigged inspection system the deck plates can carry a crane designed to deploy an rova remote operated vehicle designed for undersea operations i was already concerned about the reference to the cables in the last part of the fda log but the next section has me really worried it is encrypted with a more secure modified amsco transposition cipher and tells us what they were really up to what i dont understand is how the whole assembly is powered the sort of computing they must be doing is really intensive and would burn through a battery in days in that time their intercept might not catch anything useful but they can hardly have hijacked a local socket in the middle of the ocean can you get me a chart showing the deepsea cables in the region i dont imagine the us will be a problem but it may need some diplomacy to get the full coverage maps from the omani government if i am right it is in their best interests to playalong we all have alot to lose here'"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = amsco_break(c7bs)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 9,
-       "text": [
-        "(((1, 2, 0, 4, 3), (2, 1)), -1902.8377732825452)"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(amsco_transposition_decipher(c7bs, key_b[0], fillpattern=key_b[1])))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 10,
-       "text": [
-        "'phase seven we approached the cable junction undercover of night with nautilus at an elevation of three feet towing seahorse to starboard comms interception showed that we remained undetected and seahorse was deployed at operating depth the various layers of armoured protection were removed from the cable and as expected once the steel jacket was removed the other layers provided little resistance the divers entered the water and cut into the core to insert the optical repeaters linking them back to the man in the middle unit which was powered up and fully tested initial tests showed that it was operating as expected and three keys have already been recovered from the omani transmissions with daylight approaching the remaining tests were postponed for the following night and the ship returned to deeper waters where it remained at low deck height the divers were left at seahorse to decompress slowly and will be recovered tomorrow once the final tests have been concluded'"
-       ]
-      }
-     ],
-     "prompt_number": 10
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "transpositions[key_b[0]]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 12,
-       "text": [
-        "['cable',\n",
-        " 'facto',\n",
-        " 'facts',\n",
-        " 'gabon',\n",
-        " 'hafts',\n",
-        " 'hefts',\n",
-        " 'ibexs',\n",
-        " 'kabul',\n",
-        " 'lacys',\n",
-        " 'ladys',\n",
-        " 'laius',\n",
-        " 'lefts',\n",
-        " 'macon',\n",
-        " 'macro',\n",
-        " 'macys',\n",
-        " 'malts',\n",
-        " 'melon',\n",
-        " 'melts',\n",
-        " 'negro',\n",
-        " 'oahus',\n",
-        " 'obeys',\n",
-        " 'obits',\n",
-        " 'odets',\n",
-        " 'pacts',\n",
-        " 'pants',\n",
-        " 'pelts',\n",
-        " 'pints',\n",
-        " 'piotr',\n",
-        " 'pious',\n",
-        " 'plots',\n",
-        " 'plows',\n",
-        " 'ploys',\n",
-        " 'rafts',\n",
-        " 'rants',\n",
-        " 'remus',\n",
-        " 'rents',\n",
-        " 'riots',\n",
-        " 'scout',\n",
-        " 'shout',\n",
-        " 'snout',\n",
-        " 'cabbed',\n",
-        " 'cabbie',\n",
-        " 'cabbys',\n",
-        " 'cabral',\n",
-        " 'dabble',\n",
-        " 'faeroe',\n",
-        " 'gabbro',\n",
-        " 'ibexes',\n",
-        " 'jaguar',\n",
-        " 'kaboom',\n",
-        " 'kaftan',\n",
-        " 'lacuna',\n",
-        " 'lagoon',\n",
-        " 'lefter',\n",
-        " 'legume',\n",
-        " 'macaws',\n",
-        " 'magyar',\n",
-        " 'malays',\n",
-        " 'maltas',\n",
-        " 'mellon',\n",
-        " 'negevs',\n",
-        " 'nellys',\n",
-        " 'nelson',\n",
-        " 'odious',\n",
-        " 'paddys',\n",
-        " 'panzas',\n",
-        " 'peggys',\n",
-        " 'pelves',\n",
-        " 'pennys',\n",
-        " 'photos',\n",
-        " 'pinups',\n",
-        " 'qantas',\n",
-        " 'rabats',\n",
-        " 'rallys',\n",
-        " 'refuse',\n",
-        " 'refute',\n",
-        " 'remuss',\n",
-        " 'renews',\n",
-        " 'repute',\n",
-        " 'scouts',\n",
-        " 'shouts',\n",
-        " 'snouts',\n",
-        " 'cabbage',\n",
-        " 'cabrera',\n",
-        " 'dabbled',\n",
-        " 'gadwall',\n",
-        " 'ladonna',\n",
-        " 'leftest',\n",
-        " 'madonna',\n",
-        " 'malayan',\n",
-        " 'million',\n",
-        " 'papacys',\n",
-        " 'pellets',\n",
-        " 'penneys',\n",
-        " 'qantass',\n",
-        " 'ragtags',\n",
-        " 'refuses',\n",
-        " 'refuter',\n",
-        " 'regrets',\n",
-        " 'rennets',\n",
-        " 'renters',\n",
-        " 'reroute',\n",
-        " 'sallust',\n",
-        " 'macassar',\n",
-        " 'mahatmas',\n",
-        " 'mahayana',\n",
-        " 'nanettes',\n",
-        " 'palatals',\n",
-        " 'phosphor',\n",
-        " 'reenters',\n",
-        " 'phosphors',\n",
-        " 'sinusitis',\n",
-        " 'malayalams',\n",
-        " 'sinusitiss']"
-       ]
-      }
-     ],
-     "prompt_number": 12
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2014-challenge8.ipynb b/2014-challenge8.ipynb
deleted file mode 100644 (file)
index e30823e..0000000
+++ /dev/null
@@ -1,5186 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:8cfa7fab1d8d3830f8cdd550122b0b7f10258d8adb3ff205bd1feeca64418741"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "import matplotlib.pyplot as plt\n",
-      "import pandas as pd\n",
-      "import collections\n",
-      "import string\n",
-      "%matplotlib inline\n",
-      "\n",
-      "from cipherbreak import *\n",
-      "\n",
-      "c8a = open('2014/8a.ciphertext').read()\n",
-      "c8b = open('2014/8b.ciphertext').read().strip()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs = pd.Series(english_counts)\n",
-      "freqs.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 2,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f25d36fa358>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f26006854e0>"
-       ]
-      }
-     ],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_8a = pd.Series(collections.Counter([l.lower() for l in c8a if l in string.ascii_letters]))\n",
-      "freqs_8a.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 3,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f25d37269b0>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f25d369f358>"
-       ]
-      }
-     ],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c8as = sanitise(c8a)\n",
-      "c8as"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 4,
-       "text": [
-        "'nyvlggsyglchxfeuytqcesqxpziufiggrbjhpayncruyfpsxufiupskyrectmmcncruyregxigrlglbtiblmecebzsvrlpuxpbibjajrljreobajrlufigjehbezywtmgjyxfqxictsgrdgtbjafyoocwtmjblctwwucqmgofrlfmrfrlfwlbtijlwuypmchjqxicrfchumtsmzjbimyvhcuvyrugxjcwpdtpuisrlfdhbaencyqumufeogrhcrjmytqsmsxjmrcsxjrmttiswzvjrfpecjitnidgemdssaitasvjhuyofgxpsxgmvvqfvrxiyxxmymbxfjpufigbeufeuuiiyzfavbaofbxicmsamqfisqwpgrtribbmtskhcwuuimcxufinbitrvpwxsmnbljppytuixgpmlifbgpmtfpeugsodvpkxicsnyrjeswcvokioreoyvnchggkirishiuyrerlfdpjeluasorvpjwzqxfkwgpsnyhsmrfkiblaigpfuiociersflwvpiuusufmoewpliufeuuiemrprwflhdpmuggbjmodsskeugsoygsmwtrlfzecypnyreyftrvbgxblhuusufeuuivqiblsoavjrmdyplcchcrfpeugsonvprsdmpplxiyxdfeolimemwcrufimczfjsgasnkmukiorxicjeylbtitfsxlmobiwcppnmoexigwqjeogenqyscxiyxufizummjvfgrtreucxictpuisqyqnpzumufmoyjfuqplxiqfvrajrlmsglrlfwajjpomxhsitqxiyxxcoomabzsvrmuyreuixgpmnyugxpsxpdfvqmocwtdssjsoeiomyhfxpasncyqumufeqjeomjpsvpurumiynppgxjrmorlfkiblxjkixcrpuoomaufeurlfgvigkicwuqidsvjrcdmqnsrjaeugsoqescioavznxfbytgrhygbbioswdgticvtmafaeoqxbpxisrugrhrlsmyhfxichbrecywfdssmxicvjlxfpgfnxtuidyrdpedixigwnycccxicfscelrlsmyhfaffewcffcrmmslgrhdssgrufiggkirehymoqxufigbemcxtlsuqgscajryqypmrlfzitrlbpvz'"
-       ]
-      }
-     ],
-     "prompt_number": 4
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_a, score = vigenere_frequency_break(c8as)\n",
-      "key_a, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 5,
-       "text": [
-        "('bye', -1461.9840974270046)"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(vigenere_decipher(c8as, key_a)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 6,
-       "text": [
-        "'mark i cracked what appears to be the final document about the trojan deployment and i think i have an idea about how to deal with it and with the flag day associates the principal weakness of any system like the one they have installed is the need to provide large quantities of power the fda came up with an ingenious solution but it is very vulnerable special forces could take it out for us but that would tell the fda that we have cracked their ciphers so instead i suggest we let them destroy trojan for us we will need cooperation from the omani government an armed fighter jet and the flight control systems from a drone meanwhile we need to ensure two things one that we do not send critical information across the ba balm and abstrait and two that we use an on critical key generation protocol on that channel given the level of commitment the fda have shown in developing this plan i am sure that they will reinstate the powersupply within a few months but with luck they will not guess that we know about it and we will put it out of business for long enough to come up with a plan of our own to exploit it in the meantime we now know that their highest security communications are encrypted using a caden us cipher so we can start hunting through the database for other intercepts we can crack this maybe the breakthrough we have been looking for in the fight against the fda lets not screw it up all the best harry'"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "len(c8b) / 8"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 7,
-       "text": [
-        "875.0"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[c for c in chunks(c8b, 5)]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 8,
-       "text": [
-        "['00000',\n",
-        " '00101',\n",
-        " '00010',\n",
-        " '00000',\n",
-        " '00100',\n",
-        " '10100',\n",
-        " '01110',\n",
-        " '10011',\n",
-        " '10011',\n",
-        " '00000',\n",
-        " '00010',\n",
-        " '10011',\n",
-        " '00111',\n",
-        " '10001',\n",
-        " '01000',\n",
-        " '01110',\n",
-        " '01011',\n",
-        " '00100',\n",
-        " '10011',\n",
-        " '00010',\n",
-        " '10010',\n",
-        " '00100',\n",
-        " '10001',\n",
-        " '10011',\n",
-        " '00111',\n",
-        " '10010',\n",
-        " '00111',\n",
-        " '10011',\n",
-        " '10001',\n",
-        " '00000',\n",
-        " '00111',\n",
-        " '01010',\n",
-        " '11000',\n",
-        " '01110',\n",
-        " '10001',\n",
-        " '01111',\n",
-        " '00101',\n",
-        " '10001',\n",
-        " '00110',\n",
-        " '00100',\n",
-        " '01110',\n",
-        " '00000',\n",
-        " '00011',\n",
-        " '01111',\n",
-        " '01111',\n",
-        " '01001',\n",
-        " '01101',\n",
-        " '00110',\n",
-        " '01011',\n",
-        " '10011',\n",
-        " '00100',\n",
-        " '10001',\n",
-        " '01101',\n",
-        " '00100',\n",
-        " '00101',\n",
-        " '00100',\n",
-        " '01110',\n",
-        " '00101',\n",
-        " '01000',\n",
-        " '01110',\n",
-        " '10001',\n",
-        " '10011',\n",
-        " '10010',\n",
-        " '00011',\n",
-        " '00011',\n",
-        " '01110',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '10100',\n",
-        " '01100',\n",
-        " '10010',\n",
-        " '00010',\n",
-        " '10001',\n",
-        " '10100',\n",
-        " '00100',\n",
-        " '10001',\n",
-        " '01101',\n",
-        " '00101',\n",
-        " '00100',\n",
-        " '10011',\n",
-        " '01011',\n",
-        " '00000',\n",
-        " '00000',\n",
-        " '00101',\n",
-        " '10010',\n",
-        " '10011',\n",
-        " '10110',\n",
-        " '01000',\n",
-        " '00100',\n",
-        " '01101',\n",
-        " '10011',\n",
-        " '10001',\n",
-        " '10101',\n",
-        " '01110',\n",
-        " '01110',\n",
-        " '01101',\n",
-        " '00100',\n",
-        " '10001',\n",
-        " '00111',\n",
-        " '10100',\n",
-        " '00000',\n",
-        " '00111',\n",
-        " '10001',\n",
-        " '00000',\n",
-        " '10101',\n",
-        " '00100',\n",
-        " '10001',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '10011',\n",
-        " '10010',\n",
-        " '10101',\n",
-        " '10010',\n",
-        " '01000',\n",
-        " '00100',\n",
-        " '01011',\n",
-        " '00111',\n",
-        " '01011',\n",
-        " '01110',\n",
-        " '10010',\n",
-        " '10011',\n",
-        " '00011',\n",
-        " '01110',\n",
-        " '00000',\n",
-        " '01011',\n",
-        " '01110',\n",
-        " '11000',\n",
-        " '00000',\n",
-        " '00100',\n",
-        " '10010',\n",
-        " '01100',\n",
-        " '01101',\n",
-        " '01101',\n",
-        " '00011',\n",
-        " '01000',\n",
-        " '00110',\n",
-        " '01101',\n",
-        " '01101',\n",
-        " '10001',\n",
-        " '00111',\n",
-        " '01110',\n",
-        " '00111',\n",
-        " '00111',\n",
-        " '10011',\n",
-        " '10010',\n",
-        " '01101',\n",
-        " '00000',\n",
-        " '01110',\n",
-        " '01000',\n",
-        " '01011',\n",
-        " '01101',\n",
-        " '00010',\n",
-        " '01101',\n",
-        " '10010',\n",
-        " '10010',\n",
-        " '01000',\n",
-        " '00010',\n",
-        " '10001',\n",
-        " '00100',\n",
-        " '00000',\n",
-        " '01101',\n",
-        " '01101',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '01000',\n",
-        " '01000',\n",
-        " '01000',\n",
-        " '00100',\n",
-        " '10001',\n",
-        " '10110',\n",
-        " '10011',\n",
-        " '00000',\n",
-        " '01101',\n",
-        " '00100',\n",
-        " '10010',\n",
-        " '10001',\n",
-        " '10101',\n",
-        " '01110',\n",
-        " '00110',\n",
-        " '01000',\n",
-        " '00100',\n",
-        " '01000',\n",
-        " '11000',\n",
-        " '10110',\n",
-        " '10010',\n",
-        " '10010',\n",
-        " '00011',\n",
-        " '00110',\n",
-        " '01111',\n",
-        " '10101',\n",
-        " '01110',\n",
-        " '01000',\n",
-        " '00000',\n",
-        " '01000',\n",
-        " '10010',\n",
-        " '00000',\n",
-        " '01110',\n",
-        " '00000',\n",
-        " '00100',\n",
-        " '01110',\n",
-        " '00000',\n",
-        " '00100',\n",
-        " '00011',\n",
-        " '10001',\n",
-        " '01101',\n",
-        " '01000',\n",
-        " '10011',\n",
-        " '10001',\n",
-        " '01101',\n",
-        " '10111',\n",
-        " '00100',\n",
-        " '01000',\n",
-        " '00110',\n",
-        " '10001',\n",
-        " '01111',\n",
-        " '10010',\n",
-        " '10010',\n",
-        " '00111',\n",
-        " '00000',\n",
-        " '00011',\n",
-        " '00111',\n",
-        " '00011',\n",
-        " '10011',\n",
-        " '01110',\n",
-        " '01000',\n",
-        " '01111',\n",
-        " '00000',\n",
-        " '00000',\n",
-        " '10011',\n",
-        " '00100',\n",
-        " '10111',\n",
-        " '00100',\n",
-        " '01101',\n",
-        " '01101',\n",
-        " '00100',\n",
-        " '10010',\n",
-        " '00000',\n",
-        " '00110',\n",
-        " '10001',\n",
-        " '01110',\n",
-        " '00001',\n",
-        " '10011',\n",
-        " '01011',\n",
-        " '00100',\n",
-        " '10010',\n",
-        " '10001',\n",
-        " '01101',\n",
-        " '10001',\n",
-        " '01110',\n",
-        " '01000',\n",
-        " '10001',\n",
-        " '11000',\n",
-        " '01111',\n",
-        " '00001',\n",
-        " '00110',\n",
-        " '00100',\n",
-        " '00011',\n",
-        " '00010',\n",
-        " '01011',\n",
-        " '01011',\n",
-        " '01000',\n",
-        " '10110',\n",
-        " '00000',\n",
-        " '01011',\n",
-        " '00000',\n",
-        " '01011',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '01101',\n",
-        " '01000',\n",
-        " '00110',\n",
-        " '10001',\n",
-        " '10001',\n",
-        " '01101',\n",
-        " '10110',\n",
-        " '11000',\n",
-        " '10001',\n",
-        " '01011',\n",
-        " '01000',\n",
-        " '01100',\n",
-        " '01011',\n",
-        " '01111',\n",
-        " '10010',\n",
-        " '10011',\n",
-        " '01110',\n",
-        " '01011',\n",
-        " '00100',\n",
-        " '00101',\n",
-        " '10011',\n",
-        " '10001',\n",
-        " '00011',\n",
-        " '01100',\n",
-        " '10100',\n",
-        " '00000',\n",
-        " '10001',\n",
-        " '01000',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '01000',\n",
-        " '01000',\n",
-        " '00000',\n",
-        " '01110',\n",
-        " '01011',\n",
-        " '01101',\n",
-        " '00100',\n",
-        " '10110',\n",
-        " '10010',\n",
-        " '00000',\n",
-        " '01110',\n",
-        " '00111',\n",
-        " '10001',\n",
-        " '10011',\n",
-        " '01011',\n",
-        " '10010',\n",
-        " '10011',\n",
-        " '01110',\n",
-        " '00001',\n",
-        " '00100',\n",
-        " '10011',\n",
-        " '01101',\n",
-        " '10010',\n",
-        " '01011',\n",
-        " '10101',\n",
-        " '00101',\n",
-        " '01000',\n",
-        " '10101',\n",
-        " '00011',\n",
-        " '01110',\n",
-        " '10101',\n",
-        " '10011',\n",
-        " '01111',\n",
-        " '01110',\n",
-        " '00000',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '01000',\n",
-        " '10010',\n",
-        " '00010',\n",
-        " '01000',\n",
-        " '01110',\n",
-        " '00111',\n",
-        " '01000',\n",
-        " '01111',\n",
-        " '10010',\n",
-        " '00100',\n",
-        " '10101',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '00011',\n",
-        " '10011',\n",
-        " '00100',\n",
-        " '10110',\n",
-        " '00101',\n",
-        " '00000',\n",
-        " '10001',\n",
-        " '01101',\n",
-        " '00111',\n",
-        " '00100',\n",
-        " '00001',\n",
-        " '01011',\n",
-        " '00100',\n",
-        " '00000',\n",
-        " '01110',\n",
-        " '10011',\n",
-        " '01110',\n",
-        " '00111',\n",
-        " '10011',\n",
-        " '10011',\n",
-        " '10011',\n",
-        " '00100',\n",
-        " '01111',\n",
-        " '01101',\n",
-        " '00010',\n",
-        " '01010',\n",
-        " '00000',\n",
-        " '01110',\n",
-        " '01101',\n",
-        " '00111',\n",
-        " '10110',\n",
-        " '00100',\n",
-        " '10011',\n",
-        " '01100',\n",
-        " '10101',\n",
-        " '11000',\n",
-        " '01111',\n",
-        " '10001',\n",
-        " '10001',\n",
-        " '00100',\n",
-        " '01110',\n",
-        " '01101',\n",
-        " '01101',\n",
-        " '00000',\n",
-        " '10010',\n",
-        " '00110',\n",
-        " '00011',\n",
-        " '00100',\n",
-        " '00011',\n",
-        " '01110',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '01110',\n",
-        " '00000',\n",
-        " '00000',\n",
-        " '01100',\n",
-        " '10011',\n",
-        " '00010',\n",
-        " '01000',\n",
-        " '00010',\n",
-        " '10011',\n",
-        " '10011',\n",
-        " '01000',\n",
-        " '00101',\n",
-        " '01101',\n",
-        " '00000',\n",
-        " '00011',\n",
-        " '10001',\n",
-        " '00100',\n",
-        " '10010',\n",
-        " '10001',\n",
-        " '10011',\n",
-        " '10010',\n",
-        " '00100',\n",
-        " '10001',\n",
-        " '01110',\n",
-        " '10010',\n",
-        " '00100',\n",
-        " '10011',\n",
-        " '10001',\n",
-        " '00111',\n",
-        " '00010',\n",
-        " '01000',\n",
-        " '00010',\n",
-        " '10011',\n",
-        " '01111',\n",
-        " '10010',\n",
-        " '00000',\n",
-        " '00000',\n",
-        " '00100',\n",
-        " '00111',\n",
-        " '01011',\n",
-        " '00011',\n",
-        " '00111',\n",
-        " '10010',\n",
-        " '00101',\n",
-        " '10111',\n",
-        " '10010',\n",
-        " '01110',\n",
-        " '00000',\n",
-        " '01110',\n",
-        " '10011',\n",
-        " '00010',\n",
-        " '10011',\n",
-        " '00001',\n",
-        " '00001',\n",
-        " '10010',\n",
-        " '01110',\n",
-        " '00100',\n",
-        " '01000',\n",
-        " '10001',\n",
-        " '01101',\n",
-        " '10010',\n",
-        " '00000',\n",
-        " '00011',\n",
-        " '01011',\n",
-        " '11000',\n",
-        " '10011',\n",
-        " '10001',\n",
-        " '10001',\n",
-        " '10100',\n",
-        " '01101',\n",
-        " '10001',\n",
-        " '00010',\n",
-        " '00100',\n",
-        " '01111',\n",
-        " '10011',\n",
-        " '10011',\n",
-        " '00111',\n",
-        " '10001',\n",
-        " '00100',\n",
-        " '10100',\n",
-        " '00111',\n",
-        " '01101',\n",
-        " '01010',\n",
-        " '10011',\n",
-        " '00000',\n",
-        " '00010',\n",
-        " '00100',\n",
-        " '00010',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '01011',\n",
-        " '10001',\n",
-        " '10110',\n",
-        " '01101',\n",
-        " '01000',\n",
-        " '10001',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '00000',\n",
-        " '00100',\n",
-        " '10010',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '01000',\n",
-        " '00011',\n",
-        " '01000',\n",
-        " '10010',\n",
-        " '01110',\n",
-        " '00110',\n",
-        " '00010',\n",
-        " '00100',\n",
-        " '01110',\n",
-        " '01100',\n",
-        " '01101',\n",
-        " '10001',\n",
-        " '10011',\n",
-        " '00100',\n",
-        " '01001',\n",
-        " '00111',\n",
-        " '00000',\n",
-        " '00110',\n",
-        " '00000',\n",
-        " '00001',\n",
-        " '10010',\n",
-        " '00100',\n",
-        " '01101',\n",
-        " '01000',\n",
-        " '10011',\n",
-        " '01011',\n",
-        " '10110',\n",
-        " '10011',\n",
-        " '10001',\n",
-        " '01101',\n",
-        " '00001',\n",
-        " '01100',\n",
-        " '01000',\n",
-        " '00100',\n",
-        " '01011',\n",
-        " '10010',\n",
-        " '00000',\n",
-        " '10001',\n",
-        " '00100',\n",
-        " '10011',\n",
-        " '00100',\n",
-        " '10010',\n",
-        " '10001',\n",
-        " '01101',\n",
-        " '00110',\n",
-        " '10010',\n",
-        " '01101',\n",
-        " '00111',\n",
-        " '00100',\n",
-        " '00001',\n",
-        " '01000',\n",
-        " '01110',\n",
-        " '10010',\n",
-        " '00011',\n",
-        " '01000',\n",
-        " '00100',\n",
-        " '01101',\n",
-        " '00000',\n",
-        " '00101',\n",
-        " '01011',\n",
-        " '00100',\n",
-        " '01000',\n",
-        " '10010',\n",
-        " '00000',\n",
-        " '00111',\n",
-        " '01110',\n",
-        " '00010',\n",
-        " '01000',\n",
-        " '00101',\n",
-        " '00100',\n",
-        " '10101',\n",
-        " '01100',\n",
-        " '00101',\n",
-        " '00000',\n",
-        " '10011',\n",
-        " '00000',\n",
-        " '01101',\n",
-        " '00000',\n",
-        " '10011',\n",
-        " '10001',\n",
-        " '01101',\n",
-        " '01000',\n",
-        " '00000',\n",
-        " '00110',\n",
-        " '01101',\n",
-        " '00111',\n",
-        " '00000',\n",
-        " '10011',\n",
-        " '01101',\n",
-        " '01100',\n",
-        " '01000',\n",
-        " '00001',\n",
-        " '01101',\n",
-        " '01000',\n",
-        " '10100',\n",
-        " '00101',\n",
-        " '00100',\n",
-        " '01101',\n",
-        " '10001',\n",
-        " '10011',\n",
-        " '01110',\n",
-        " '10011',\n",
-        " '10011',\n",
-        " '10001',\n",
-        " '01101',\n",
-        " '11000',\n",
-        " '01111',\n",
-        " '00000',\n",
-        " '01000',\n",
-        " '00011',\n",
-        " '11000',\n",
-        " '01000',\n",
-        " '00100',\n",
-        " '00110',\n",
-        " '00011',\n",
-        " '01101',\n",
-        " '01100',\n",
-        " '00100',\n",
-        " '10001',\n",
-        " '00111',\n",
-        " '00111',\n",
-        " '01000',\n",
-        " '01110',\n",
-        " '10011',\n",
-        " '10001',\n",
-        " '00100',\n",
-        " '10011',\n",
-        " '00010',\n",
-        " '00100',\n",
-        " '10010',\n",
-        " '10010',\n",
-        " '00100',\n",
-        " '01000',\n",
-        " '01011',\n",
-        " '00011',\n",
-        " '10001',\n",
-        " '00001',\n",
-        " '00010',\n",
-        " '00100',\n",
-        " '01111',\n",
-        " '10001',\n",
-        " '01000',\n",
-        " '00110',\n",
-        " '00000',\n",
-        " '00100',\n",
-        " '10010',\n",
-        " '01110',\n",
-        " '00000',\n",
-        " '00011',\n",
-        " '01011',\n",
-        " '10011',\n",
-        " '00000',\n",
-        " '00111',\n",
-        " '01000',\n",
-        " '00100',\n",
-        " '10101',\n",
-        " '00100',\n",
-        " '00001',\n",
-        " '10001',\n",
-        " '00010',\n",
-        " '00100',\n",
-        " '01101',\n",
-        " '01011',\n",
-        " '00100',\n",
-        " '10101',\n",
-        " '00000',\n",
-        " '10010',\n",
-        " '00000',\n",
-        " '00011',\n",
-        " '01101',\n",
-        " '01101',\n",
-        " '10011',\n",
-        " '00111',\n",
-        " '01101',\n",
-        " '00100',\n",
-        " '01000',\n",
-        " '10011',\n",
-        " '00100',\n",
-        " '01000',\n",
-        " '01000',\n",
-        " '10010',\n",
-        " '00000',\n",
-        " '00111',\n",
-        " '10100',\n",
-        " '00111',\n",
-        " '00111',\n",
-        " '10100',\n",
-        " '00000',\n",
-        " '01100',\n",
-        " '01110',\n",
-        " '01101',\n",
-        " '00100',\n",
-        " '00101',\n",
-        " '11000',\n",
-        " '00111',\n",
-        " '01011',\n",
-        " '01110',\n",
-        " '01101',\n",
-        " '10110',\n",
-        " '00111',\n",
-        " '00000',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '01110',\n",
-        " '10010',\n",
-        " '01101',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '11000',\n",
-        " '00000',\n",
-        " '01101',\n",
-        " '00100',\n",
-        " '01000',\n",
-        " '10010',\n",
-        " '00100',\n",
-        " '10011',\n",
-        " '01110',\n",
-        " '00110',\n",
-        " '11000',\n",
-        " '01000',\n",
-        " '10011',\n",
-        " '00100',\n",
-        " '10001',\n",
-        " '01011',\n",
-        " '01000',\n",
-        " '00111',\n",
-        " '10011',\n",
-        " '00010',\n",
-        " '01100',\n",
-        " '01000',\n",
-        " '01110',\n",
-        " '01000',\n",
-        " '10001',\n",
-        " '00000',\n",
-        " '10001',\n",
-        " '00101',\n",
-        " '00011',\n",
-        " '01110',\n",
-        " '00100',\n",
-        " '10011',\n",
-        " '01101',\n",
-        " '01000',\n",
-        " '00111',\n",
-        " '10011',\n",
-        " '01101',\n",
-        " '00100',\n",
-        " '00111',\n",
-        " '01000',\n",
-        " '01000',\n",
-        " '01010',\n",
-        " '00000',\n",
-        " '01100',\n",
-        " '10001',\n",
-        " '00011',\n",
-        " '01100',\n",
-        " '01101',\n",
-        " '00000',\n",
-        " '00011',\n",
-        " '00000',\n",
-        " '01101',\n",
-        " '00000',\n",
-        " '01110',\n",
-        " '00011',\n",
-        " '10010',\n",
-        " '00100',\n",
-        " '10010',\n",
-        " '00100',\n",
-        " '01000',\n",
-        " '11000',\n",
-        " '00010',\n",
-        " '01011',\n",
-        " '10010',\n",
-        " '01000',\n",
-        " '00000',\n",
-        " '01101',\n",
-        " '10011',\n",
-        " '00000',\n",
-        " '01110',\n",
-        " '01011',\n",
-        " '10011',\n",
-        " '00010',\n",
-        " '01000',\n",
-        " '11000',\n",
-        " '01100',\n",
-        " '01000',\n",
-        " '00011',\n",
-        " '00100',\n",
-        " '01101',\n",
-        " '10011',\n",
-        " '10011',\n",
-        " '00111',\n",
-        " '01011',\n",
-        " '10011',\n",
-        " '01101',\n",
-        " '00011',\n",
-        " '10111',\n",
-        " '10011',\n",
-        " '10011',\n",
-        " '10011',\n",
-        " '01100',\n",
-        " '00000',\n",
-        " '10010',\n",
-        " '00001',\n",
-        " '01011',\n",
-        " '00100',\n",
-        " '00000',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '10011',\n",
-        " '01011',\n",
-        " '01000',\n",
-        " '10010',\n",
-        " '01000',\n",
-        " '10001',\n",
-        " '10011',\n",
-        " '10110',\n",
-        " '10011',\n",
-        " '10100',\n",
-        " '10001',\n",
-        " '01111',\n",
-        " '00101',\n",
-        " '00000',\n",
-        " '01000',\n",
-        " '01011',\n",
-        " '10011',\n",
-        " '00100',\n",
-        " '00000',\n",
-        " '01110',\n",
-        " '00100',\n",
-        " '00101',\n",
-        " '00100',\n",
-        " '01000',\n",
-        " '10010',\n",
-        " '01000',\n",
-        " '01000',\n",
-        " '01000',\n",
-        " '11000',\n",
-        " '01000',\n",
-        " '10010',\n",
-        " '01000',\n",
-        " '01010',\n",
-        " '10101',\n",
-        " '10011',\n",
-        " '10110',\n",
-        " '01000',\n",
-        " '10010',\n",
-        " '01111',\n",
-        " '10001',\n",
-        " '00001',\n",
-        " '10010',\n",
-        " '01000',\n",
-        " '01101',\n",
-        " '00100',\n",
-        " '01011',\n",
-        " '01111',\n",
-        " '00111',\n",
-        " '10001',\n",
-        " '01100',\n",
-        " '01110',\n",
-        " '00111',\n",
-        " '01000',\n",
-        " '00000',\n",
-        " '00110',\n",
-        " '01101',\n",
-        " '01011',\n",
-        " '10010',\n",
-        " '01011',\n",
-        " '10101',\n",
-        " '01000',\n",
-        " '10011',\n",
-        " '01110',\n",
-        " '00011',\n",
-        " '00000',\n",
-        " '01000',\n",
-        " '10010',\n",
-        " '00011',\n",
-        " '01111',\n",
-        " '01101',\n",
-        " '11000',\n",
-        " '00011',\n",
-        " '00011',\n",
-        " '00010',\n",
-        " '00000',\n",
-        " '00000',\n",
-        " '01110',\n",
-        " '10011',\n",
-        " '00000',\n",
-        " '00111',\n",
-        " '00010',\n",
-        " '00100',\n",
-        " '00111',\n",
-        " '10011',\n",
-        " '10100',\n",
-        " '00100',\n",
-        " '01000',\n",
-        " '10001',\n",
-        " '10001',\n",
-        " '00100',\n",
-        " '00011',\n",
-        " '00000',\n",
-        " '00100',\n",
-        " '00010',\n",
-        " '10011',\n",
-        " '01110',\n",
-        " '10010',\n",
-        " '01101',\n",
-        " '10001',\n",
-        " '00111',\n",
-        " '10101',\n",
-        " '01101',\n",
-        " '00000',\n",
-        " '01110',\n",
-        " '00011',\n",
-        " '01110',\n",
-        " '01000',\n",
-        " '01010',\n",
-        " '01110',\n",
-        " '00100',\n",
-        " '10011',\n",
-        " '00010',\n",
-        " '01000',\n",
-        " '01101',\n",
-        " '00100',\n",
-        " '01101',\n",
-        " '00100',\n",
-        " '10100',\n",
-        " '10001',\n",
-        " '10001',\n",
-        " '01000',\n",
-        " '10010',\n",
-        " '00011',\n",
-        " '00010',\n",
-        " '01110',\n",
-        " '10100',\n",
-        " '10001',\n",
-        " '00000',\n",
-        " '00110',\n",
-        " '01011',\n",
-        " '10101',\n",
-        " '01000',\n",
-        " '01100',\n",
-        " '01100',\n",
-        " '10100',\n",
-        " '01111',\n",
-        " '01111',\n",
-        " '00011',\n",
-        " '01000',\n",
-        " '10011',\n",
-        " '00100',\n",
-        " '00000',\n",
-        " '01101',\n",
-        " '00011',\n",
-        " '01000',\n",
-        " '10011',\n",
-        " '01100',\n",
-        " '00000',\n",
-        " '00000',\n",
-        " '01000',\n",
-        " '00000',\n",
-        " '01000',\n",
-        " '00100',\n",
-        " '01011',\n",
-        " '00100',\n",
-        " '01110',\n",
-        " '01101',\n",
-        " '01101',\n",
-        " '10001',\n",
-        " '00100',\n",
-        " '00100',\n",
-        " '00011',\n",
-        " '00000',\n",
-        " '01110',\n",
-        " '00011',\n",
-        " '00001',\n",
-        " '01110',\n",
-        " '01000',\n",
-        " '10100',\n",
-        " '01100',\n",
-        " '00100',\n",
-        " '01011',\n",
-        " '10001',\n",
-        " '01110',\n",
-        " '10011',\n",
-        " '01101',\n",
-        " '10011',\n",
-        " '10011',\n",
-        " '10011',\n",
-        " '00110',\n",
-        " '01000',\n",
-        " '10011',\n",
-        " '01101',\n",
-        " ...]"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[(int(c, 2)) for c in chunks(c8b, 5)]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 9,
-       "text": [
-        "[0,\n",
-        " 5,\n",
-        " 2,\n",
-        " 0,\n",
-        " 4,\n",
-        " 20,\n",
-        " 14,\n",
-        " 19,\n",
-        " 19,\n",
-        " 0,\n",
-        " 2,\n",
-        " 19,\n",
-        " 7,\n",
-        " 17,\n",
-        " 8,\n",
-        " 14,\n",
-        " 11,\n",
-        " 4,\n",
-        " 19,\n",
-        " 2,\n",
-        " 18,\n",
-        " 4,\n",
-        " 17,\n",
-        " 19,\n",
-        " 7,\n",
-        " 18,\n",
-        " 7,\n",
-        " 19,\n",
-        " 17,\n",
-        " 0,\n",
-        " 7,\n",
-        " 10,\n",
-        " 24,\n",
-        " 14,\n",
-        " 17,\n",
-        " 15,\n",
-        " 5,\n",
-        " 17,\n",
-        " 6,\n",
-        " 4,\n",
-        " 14,\n",
-        " 0,\n",
-        " 3,\n",
-        " 15,\n",
-        " 15,\n",
-        " 9,\n",
-        " 13,\n",
-        " 6,\n",
-        " 11,\n",
-        " 19,\n",
-        " 4,\n",
-        " 17,\n",
-        " 13,\n",
-        " 4,\n",
-        " 5,\n",
-        " 4,\n",
-        " 14,\n",
-        " 5,\n",
-        " 8,\n",
-        " 14,\n",
-        " 17,\n",
-        " 19,\n",
-        " 18,\n",
-        " 3,\n",
-        " 3,\n",
-        " 14,\n",
-        " 4,\n",
-        " 4,\n",
-        " 20,\n",
-        " 12,\n",
-        " 18,\n",
-        " 2,\n",
-        " 17,\n",
-        " 20,\n",
-        " 4,\n",
-        " 17,\n",
-        " 13,\n",
-        " 5,\n",
-        " 4,\n",
-        " 19,\n",
-        " 11,\n",
-        " 0,\n",
-        " 0,\n",
-        " 5,\n",
-        " 18,\n",
-        " 19,\n",
-        " 22,\n",
-        " 8,\n",
-        " 4,\n",
-        " 13,\n",
-        " 19,\n",
-        " 17,\n",
-        " 21,\n",
-        " 14,\n",
-        " 14,\n",
-        " 13,\n",
-        " 4,\n",
-        " 17,\n",
-        " 7,\n",
-        " 20,\n",
-        " 0,\n",
-        " 7,\n",
-        " 17,\n",
-        " 0,\n",
-        " 21,\n",
-        " 4,\n",
-        " 17,\n",
-        " 4,\n",
-        " 4,\n",
-        " 19,\n",
-        " 18,\n",
-        " 21,\n",
-        " 18,\n",
-        " 8,\n",
-        " 4,\n",
-        " 11,\n",
-        " 7,\n",
-        " 11,\n",
-        " 14,\n",
-        " 18,\n",
-        " 19,\n",
-        " 3,\n",
-        " 14,\n",
-        " 0,\n",
-        " 11,\n",
-        " 14,\n",
-        " 24,\n",
-        " 0,\n",
-        " 4,\n",
-        " 18,\n",
-        " 12,\n",
-        " 13,\n",
-        " 13,\n",
-        " 3,\n",
-        " 8,\n",
-        " 6,\n",
-        " 13,\n",
-        " 13,\n",
-        " 17,\n",
-        " 7,\n",
-        " 14,\n",
-        " 7,\n",
-        " 7,\n",
-        " 19,\n",
-        " 18,\n",
-        " 13,\n",
-        " 0,\n",
-        " 14,\n",
-        " 8,\n",
-        " 11,\n",
-        " 13,\n",
-        " 2,\n",
-        " 13,\n",
-        " 18,\n",
-        " 18,\n",
-        " 8,\n",
-        " 2,\n",
-        " 17,\n",
-        " 4,\n",
-        " 0,\n",
-        " 13,\n",
-        " 13,\n",
-        " 4,\n",
-        " 4,\n",
-        " 8,\n",
-        " 8,\n",
-        " 8,\n",
-        " 4,\n",
-        " 17,\n",
-        " 22,\n",
-        " 19,\n",
-        " 0,\n",
-        " 13,\n",
-        " 4,\n",
-        " 18,\n",
-        " 17,\n",
-        " 21,\n",
-        " 14,\n",
-        " 6,\n",
-        " 8,\n",
-        " 4,\n",
-        " 8,\n",
-        " 24,\n",
-        " 22,\n",
-        " 18,\n",
-        " 18,\n",
-        " 3,\n",
-        " 6,\n",
-        " 15,\n",
-        " 21,\n",
-        " 14,\n",
-        " 8,\n",
-        " 0,\n",
-        " 8,\n",
-        " 18,\n",
-        " 0,\n",
-        " 14,\n",
-        " 0,\n",
-        " 4,\n",
-        " 14,\n",
-        " 0,\n",
-        " 4,\n",
-        " 3,\n",
-        " 17,\n",
-        " 13,\n",
-        " 8,\n",
-        " 19,\n",
-        " 17,\n",
-        " 13,\n",
-        " 23,\n",
-        " 4,\n",
-        " 8,\n",
-        " 6,\n",
-        " 17,\n",
-        " 15,\n",
-        " 18,\n",
-        " 18,\n",
-        " 7,\n",
-        " 0,\n",
-        " 3,\n",
-        " 7,\n",
-        " 3,\n",
-        " 19,\n",
-        " 14,\n",
-        " 8,\n",
-        " 15,\n",
-        " 0,\n",
-        " 0,\n",
-        " 19,\n",
-        " 4,\n",
-        " 23,\n",
-        " 4,\n",
-        " 13,\n",
-        " 13,\n",
-        " 4,\n",
-        " 18,\n",
-        " 0,\n",
-        " 6,\n",
-        " 17,\n",
-        " 14,\n",
-        " 1,\n",
-        " 19,\n",
-        " 11,\n",
-        " 4,\n",
-        " 18,\n",
-        " 17,\n",
-        " 13,\n",
-        " 17,\n",
-        " 14,\n",
-        " 8,\n",
-        " 17,\n",
-        " 24,\n",
-        " 15,\n",
-        " 1,\n",
-        " 6,\n",
-        " 4,\n",
-        " 3,\n",
-        " 2,\n",
-        " 11,\n",
-        " 11,\n",
-        " 8,\n",
-        " 22,\n",
-        " 0,\n",
-        " 11,\n",
-        " 0,\n",
-        " 11,\n",
-        " 4,\n",
-        " 4,\n",
-        " 13,\n",
-        " 8,\n",
-        " 6,\n",
-        " 17,\n",
-        " 17,\n",
-        " 13,\n",
-        " 22,\n",
-        " 24,\n",
-        " 17,\n",
-        " 11,\n",
-        " 8,\n",
-        " 12,\n",
-        " 11,\n",
-        " 15,\n",
-        " 18,\n",
-        " 19,\n",
-        " 14,\n",
-        " 11,\n",
-        " 4,\n",
-        " 5,\n",
-        " 19,\n",
-        " 17,\n",
-        " 3,\n",
-        " 12,\n",
-        " 20,\n",
-        " 0,\n",
-        " 17,\n",
-        " 8,\n",
-        " 4,\n",
-        " 4,\n",
-        " 4,\n",
-        " 8,\n",
-        " 8,\n",
-        " 0,\n",
-        " 14,\n",
-        " 11,\n",
-        " 13,\n",
-        " 4,\n",
-        " 22,\n",
-        " 18,\n",
-        " 0,\n",
-        " 14,\n",
-        " 7,\n",
-        " 17,\n",
-        " 19,\n",
-        " 11,\n",
-        " 18,\n",
-        " 19,\n",
-        " 14,\n",
-        " 1,\n",
-        " 4,\n",
-        " 19,\n",
-        " 13,\n",
-        " 18,\n",
-        " 11,\n",
-        " 21,\n",
-        " 5,\n",
-        " 8,\n",
-        " 21,\n",
-        " 3,\n",
-        " 14,\n",
-        " 21,\n",
-        " 19,\n",
-        " 15,\n",
-        " 14,\n",
-        " 0,\n",
-        " 4,\n",
-        " 4,\n",
-        " 8,\n",
-        " 18,\n",
-        " 2,\n",
-        " 8,\n",
-        " 14,\n",
-        " 7,\n",
-        " 8,\n",
-        " 15,\n",
-        " 18,\n",
-        " 4,\n",
-        " 21,\n",
-        " 4,\n",
-        " 4,\n",
-        " 3,\n",
-        " 19,\n",
-        " 4,\n",
-        " 22,\n",
-        " 5,\n",
-        " 0,\n",
-        " 17,\n",
-        " 13,\n",
-        " 7,\n",
-        " 4,\n",
-        " 1,\n",
-        " 11,\n",
-        " 4,\n",
-        " 0,\n",
-        " 14,\n",
-        " 19,\n",
-        " 14,\n",
-        " 7,\n",
-        " 19,\n",
-        " 19,\n",
-        " 19,\n",
-        " 4,\n",
-        " 15,\n",
-        " 13,\n",
-        " 2,\n",
-        " 10,\n",
-        " 0,\n",
-        " 14,\n",
-        " 13,\n",
-        " 7,\n",
-        " 22,\n",
-        " 4,\n",
-        " 19,\n",
-        " 12,\n",
-        " 21,\n",
-        " 24,\n",
-        " 15,\n",
-        " 17,\n",
-        " 17,\n",
-        " 4,\n",
-        " 14,\n",
-        " 13,\n",
-        " 13,\n",
-        " 0,\n",
-        " 18,\n",
-        " 6,\n",
-        " 3,\n",
-        " 4,\n",
-        " 3,\n",
-        " 14,\n",
-        " 4,\n",
-        " 4,\n",
-        " 4,\n",
-        " 14,\n",
-        " 0,\n",
-        " 0,\n",
-        " 12,\n",
-        " 19,\n",
-        " 2,\n",
-        " 8,\n",
-        " 2,\n",
-        " 19,\n",
-        " 19,\n",
-        " 8,\n",
-        " 5,\n",
-        " 13,\n",
-        " 0,\n",
-        " 3,\n",
-        " 17,\n",
-        " 4,\n",
-        " 18,\n",
-        " 17,\n",
-        " 19,\n",
-        " 18,\n",
-        " 4,\n",
-        " 17,\n",
-        " 14,\n",
-        " 18,\n",
-        " 4,\n",
-        " 19,\n",
-        " 17,\n",
-        " 7,\n",
-        " 2,\n",
-        " 8,\n",
-        " 2,\n",
-        " 19,\n",
-        " 15,\n",
-        " 18,\n",
-        " 0,\n",
-        " 0,\n",
-        " 4,\n",
-        " 7,\n",
-        " 11,\n",
-        " 3,\n",
-        " 7,\n",
-        " 18,\n",
-        " 5,\n",
-        " 23,\n",
-        " 18,\n",
-        " 14,\n",
-        " 0,\n",
-        " 14,\n",
-        " 19,\n",
-        " 2,\n",
-        " 19,\n",
-        " 1,\n",
-        " 1,\n",
-        " 18,\n",
-        " 14,\n",
-        " 4,\n",
-        " 8,\n",
-        " 17,\n",
-        " 13,\n",
-        " 18,\n",
-        " 0,\n",
-        " 3,\n",
-        " 11,\n",
-        " 24,\n",
-        " 19,\n",
-        " 17,\n",
-        " 17,\n",
-        " 20,\n",
-        " 13,\n",
-        " 17,\n",
-        " 2,\n",
-        " 4,\n",
-        " 15,\n",
-        " 19,\n",
-        " 19,\n",
-        " 7,\n",
-        " 17,\n",
-        " 4,\n",
-        " 20,\n",
-        " 7,\n",
-        " 13,\n",
-        " 10,\n",
-        " 19,\n",
-        " 0,\n",
-        " 2,\n",
-        " 4,\n",
-        " 2,\n",
-        " 4,\n",
-        " 4,\n",
-        " 11,\n",
-        " 17,\n",
-        " 22,\n",
-        " 13,\n",
-        " 8,\n",
-        " 17,\n",
-        " 4,\n",
-        " 4,\n",
-        " 4,\n",
-        " 0,\n",
-        " 4,\n",
-        " 18,\n",
-        " 4,\n",
-        " 4,\n",
-        " 4,\n",
-        " 8,\n",
-        " 3,\n",
-        " 8,\n",
-        " 18,\n",
-        " 14,\n",
-        " 6,\n",
-        " 2,\n",
-        " 4,\n",
-        " 14,\n",
-        " 12,\n",
-        " 13,\n",
-        " 17,\n",
-        " 19,\n",
-        " 4,\n",
-        " 9,\n",
-        " 7,\n",
-        " 0,\n",
-        " 6,\n",
-        " 0,\n",
-        " 1,\n",
-        " 18,\n",
-        " 4,\n",
-        " 13,\n",
-        " 8,\n",
-        " 19,\n",
-        " 11,\n",
-        " 22,\n",
-        " 19,\n",
-        " 17,\n",
-        " 13,\n",
-        " 1,\n",
-        " 12,\n",
-        " 8,\n",
-        " 4,\n",
-        " 11,\n",
-        " 18,\n",
-        " 0,\n",
-        " 17,\n",
-        " 4,\n",
-        " 19,\n",
-        " 4,\n",
-        " 18,\n",
-        " 17,\n",
-        " 13,\n",
-        " 6,\n",
-        " 18,\n",
-        " 13,\n",
-        " 7,\n",
-        " 4,\n",
-        " 1,\n",
-        " 8,\n",
-        " 14,\n",
-        " 18,\n",
-        " 3,\n",
-        " 8,\n",
-        " 4,\n",
-        " 13,\n",
-        " 0,\n",
-        " 5,\n",
-        " 11,\n",
-        " 4,\n",
-        " 8,\n",
-        " 18,\n",
-        " 0,\n",
-        " 7,\n",
-        " 14,\n",
-        " 2,\n",
-        " 8,\n",
-        " 5,\n",
-        " 4,\n",
-        " 21,\n",
-        " 12,\n",
-        " 5,\n",
-        " 0,\n",
-        " 19,\n",
-        " 0,\n",
-        " 13,\n",
-        " 0,\n",
-        " 19,\n",
-        " 17,\n",
-        " 13,\n",
-        " 8,\n",
-        " 0,\n",
-        " 6,\n",
-        " 13,\n",
-        " 7,\n",
-        " 0,\n",
-        " 19,\n",
-        " 13,\n",
-        " 12,\n",
-        " 8,\n",
-        " 1,\n",
-        " 13,\n",
-        " 8,\n",
-        " 20,\n",
-        " 5,\n",
-        " 4,\n",
-        " 13,\n",
-        " 17,\n",
-        " 19,\n",
-        " 14,\n",
-        " 19,\n",
-        " 19,\n",
-        " 17,\n",
-        " 13,\n",
-        " 24,\n",
-        " 15,\n",
-        " 0,\n",
-        " 8,\n",
-        " 3,\n",
-        " 24,\n",
-        " 8,\n",
-        " 4,\n",
-        " 6,\n",
-        " 3,\n",
-        " 13,\n",
-        " 12,\n",
-        " 4,\n",
-        " 17,\n",
-        " 7,\n",
-        " 7,\n",
-        " 8,\n",
-        " 14,\n",
-        " 19,\n",
-        " 17,\n",
-        " 4,\n",
-        " 19,\n",
-        " 2,\n",
-        " 4,\n",
-        " 18,\n",
-        " 18,\n",
-        " 4,\n",
-        " 8,\n",
-        " 11,\n",
-        " 3,\n",
-        " 17,\n",
-        " 1,\n",
-        " 2,\n",
-        " 4,\n",
-        " 15,\n",
-        " 17,\n",
-        " 8,\n",
-        " 6,\n",
-        " 0,\n",
-        " 4,\n",
-        " 18,\n",
-        " 14,\n",
-        " 0,\n",
-        " 3,\n",
-        " 11,\n",
-        " 19,\n",
-        " 0,\n",
-        " 7,\n",
-        " 8,\n",
-        " 4,\n",
-        " 21,\n",
-        " 4,\n",
-        " 1,\n",
-        " 17,\n",
-        " 2,\n",
-        " 4,\n",
-        " 13,\n",
-        " 11,\n",
-        " 4,\n",
-        " 21,\n",
-        " 0,\n",
-        " 18,\n",
-        " 0,\n",
-        " 3,\n",
-        " 13,\n",
-        " 13,\n",
-        " 19,\n",
-        " 7,\n",
-        " 13,\n",
-        " 4,\n",
-        " 8,\n",
-        " 19,\n",
-        " 4,\n",
-        " 8,\n",
-        " 8,\n",
-        " 18,\n",
-        " 0,\n",
-        " 7,\n",
-        " 20,\n",
-        " 7,\n",
-        " 7,\n",
-        " 20,\n",
-        " 0,\n",
-        " 12,\n",
-        " 14,\n",
-        " 13,\n",
-        " 4,\n",
-        " 5,\n",
-        " 24,\n",
-        " 7,\n",
-        " 11,\n",
-        " 14,\n",
-        " 13,\n",
-        " 22,\n",
-        " 7,\n",
-        " 0,\n",
-        " 4,\n",
-        " 4,\n",
-        " 4,\n",
-        " 4,\n",
-        " 14,\n",
-        " 18,\n",
-        " 13,\n",
-        " 4,\n",
-        " 4,\n",
-        " 24,\n",
-        " 0,\n",
-        " 13,\n",
-        " 4,\n",
-        " 8,\n",
-        " 18,\n",
-        " 4,\n",
-        " 19,\n",
-        " 14,\n",
-        " 6,\n",
-        " 24,\n",
-        " 8,\n",
-        " 19,\n",
-        " 4,\n",
-        " 17,\n",
-        " 11,\n",
-        " 8,\n",
-        " 7,\n",
-        " 19,\n",
-        " 2,\n",
-        " 12,\n",
-        " 8,\n",
-        " 14,\n",
-        " 8,\n",
-        " 17,\n",
-        " 0,\n",
-        " 17,\n",
-        " 5,\n",
-        " 3,\n",
-        " 14,\n",
-        " 4,\n",
-        " 19,\n",
-        " 13,\n",
-        " 8,\n",
-        " 7,\n",
-        " 19,\n",
-        " 13,\n",
-        " 4,\n",
-        " 7,\n",
-        " 8,\n",
-        " 8,\n",
-        " 10,\n",
-        " 0,\n",
-        " 12,\n",
-        " 17,\n",
-        " 3,\n",
-        " 12,\n",
-        " 13,\n",
-        " 0,\n",
-        " 3,\n",
-        " 0,\n",
-        " 13,\n",
-        " 0,\n",
-        " 14,\n",
-        " 3,\n",
-        " 18,\n",
-        " 4,\n",
-        " 18,\n",
-        " 4,\n",
-        " 8,\n",
-        " 24,\n",
-        " 2,\n",
-        " 11,\n",
-        " 18,\n",
-        " 8,\n",
-        " 0,\n",
-        " 13,\n",
-        " 19,\n",
-        " 0,\n",
-        " 14,\n",
-        " 11,\n",
-        " 19,\n",
-        " 2,\n",
-        " 8,\n",
-        " 24,\n",
-        " 12,\n",
-        " 8,\n",
-        " 3,\n",
-        " 4,\n",
-        " 13,\n",
-        " 19,\n",
-        " 19,\n",
-        " 7,\n",
-        " 11,\n",
-        " 19,\n",
-        " 13,\n",
-        " 3,\n",
-        " 23,\n",
-        " 19,\n",
-        " 19,\n",
-        " 19,\n",
-        " 12,\n",
-        " 0,\n",
-        " 18,\n",
-        " 1,\n",
-        " 11,\n",
-        " 4,\n",
-        " 0,\n",
-        " 4,\n",
-        " 4,\n",
-        " 19,\n",
-        " 11,\n",
-        " 8,\n",
-        " 18,\n",
-        " 8,\n",
-        " 17,\n",
-        " 19,\n",
-        " 22,\n",
-        " 19,\n",
-        " 20,\n",
-        " 17,\n",
-        " 15,\n",
-        " 5,\n",
-        " 0,\n",
-        " 8,\n",
-        " 11,\n",
-        " 19,\n",
-        " 4,\n",
-        " 0,\n",
-        " 14,\n",
-        " 4,\n",
-        " 5,\n",
-        " 4,\n",
-        " 8,\n",
-        " 18,\n",
-        " 8,\n",
-        " 8,\n",
-        " 8,\n",
-        " 24,\n",
-        " 8,\n",
-        " 18,\n",
-        " 8,\n",
-        " 10,\n",
-        " 21,\n",
-        " 19,\n",
-        " 22,\n",
-        " 8,\n",
-        " 18,\n",
-        " 15,\n",
-        " 17,\n",
-        " 1,\n",
-        " 18,\n",
-        " 8,\n",
-        " 13,\n",
-        " 4,\n",
-        " 11,\n",
-        " 15,\n",
-        " 7,\n",
-        " 17,\n",
-        " 12,\n",
-        " 14,\n",
-        " 7,\n",
-        " 8,\n",
-        " 0,\n",
-        " 6,\n",
-        " 13,\n",
-        " 11,\n",
-        " 18,\n",
-        " 11,\n",
-        " 21,\n",
-        " 8,\n",
-        " 19,\n",
-        " 14,\n",
-        " 3,\n",
-        " 0,\n",
-        " 8,\n",
-        " 18,\n",
-        " 3,\n",
-        " 15,\n",
-        " 13,\n",
-        " 24,\n",
-        " 3,\n",
-        " 3,\n",
-        " 2,\n",
-        " 0,\n",
-        " 0,\n",
-        " 14,\n",
-        " 19,\n",
-        " 0,\n",
-        " 7,\n",
-        " 2,\n",
-        " 4,\n",
-        " 7,\n",
-        " 19,\n",
-        " 20,\n",
-        " 4,\n",
-        " 8,\n",
-        " 17,\n",
-        " 17,\n",
-        " 4,\n",
-        " 3,\n",
-        " 0,\n",
-        " 4,\n",
-        " 2,\n",
-        " 19,\n",
-        " 14,\n",
-        " 18,\n",
-        " 13,\n",
-        " 17,\n",
-        " 7,\n",
-        " 21,\n",
-        " 13,\n",
-        " 0,\n",
-        " 14,\n",
-        " 3,\n",
-        " 14,\n",
-        " 8,\n",
-        " 10,\n",
-        " 14,\n",
-        " 4,\n",
-        " 19,\n",
-        " 2,\n",
-        " 8,\n",
-        " 13,\n",
-        " 4,\n",
-        " 13,\n",
-        " 4,\n",
-        " 20,\n",
-        " 17,\n",
-        " 17,\n",
-        " 8,\n",
-        " 18,\n",
-        " 3,\n",
-        " 2,\n",
-        " 14,\n",
-        " 20,\n",
-        " 17,\n",
-        " 0,\n",
-        " 6,\n",
-        " 11,\n",
-        " 21,\n",
-        " 8,\n",
-        " 12,\n",
-        " 12,\n",
-        " 20,\n",
-        " 15,\n",
-        " 15,\n",
-        " 3,\n",
-        " 8,\n",
-        " 19,\n",
-        " 4,\n",
-        " 0,\n",
-        " 13,\n",
-        " 3,\n",
-        " 8,\n",
-        " 19,\n",
-        " 12,\n",
-        " 0,\n",
-        " 0,\n",
-        " 8,\n",
-        " 0,\n",
-        " 8,\n",
-        " 4,\n",
-        " 11,\n",
-        " 4,\n",
-        " 14,\n",
-        " 13,\n",
-        " 13,\n",
-        " 17,\n",
-        " 4,\n",
-        " 4,\n",
-        " 3,\n",
-        " 0,\n",
-        " 14,\n",
-        " 3,\n",
-        " 1,\n",
-        " 14,\n",
-        " 8,\n",
-        " 20,\n",
-        " 12,\n",
-        " 4,\n",
-        " 11,\n",
-        " 17,\n",
-        " 14,\n",
-        " 19,\n",
-        " 13,\n",
-        " 19,\n",
-        " 19,\n",
-        " 19,\n",
-        " 6,\n",
-        " 8,\n",
-        " 19,\n",
-        " 13,\n",
-        " ...]"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "max([(int(c, 2)) for c in chunks(c8b, 5)])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 10,
-       "text": [
-        "24"
-       ]
-      }
-     ],
-     "prompt_number": 10
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "max([chr(int(c, 2) + ord('a')) for c in chunks(c8b, 5)])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 11,
-       "text": [
-        "'y'"
-       ]
-      }
-     ],
-     "prompt_number": 11
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "def cadenus_letter(n, doubled='v'):\n",
-      "    letter = chr(n + ord('a'))\n",
-      "    if letter > doubled:\n",
-      "        letter = chr(n + ord('a') + 1)\n",
-      "    return letter"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 12
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c8bl = ''.join([cadenus_letter(int(c, 2), doubled='z') for c in chunks(c8b, 5)])\n",
-      "c8bl"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 13,
-       "text": [
-        "'afcaeuottacthrioletcserthshtrahkyorpfrgeoadppjnglternefeofiortsddoeeumscruernfetlaafstwientrvoonerhuahravereetsvsielhlostdoaloyaesmnndignnrhohhtsnaoilncnssicreanneeiiierwtanesrvogieiywssdgpvoiaisaoaeoaedrnitrnxeigrpsshadhdtoipaatexennesagrobtlesrnroirypbgedclliwalaleenigrrnwyrlimlpstoleftrdmuarieeeiiaolnewsaohrtlstobetnslvfivdovtpoaeeisciohipseveedtewfarnhebleaotohtttepnckaonhwetmvyprreonnasgdedoeeeoaamtcicttifnadresrtserosetrhcictpsaaehldhsfxsoaotctbbsoeirnsadlytrrunrceptthreuhnktaceceelrwnireeeaeseeeidisogceomnrtejhagabsenitlwtrnbmielsaretesrngsnhebiosdienafleisahocifevmfatanatrniagnhatnmibniufenrtottrnypaidyiegdnmerhhiotretcesseildrbceprigaesoadltahievebrcenlevasadnnthneiteiisahuhhuamonefyhlonwhaeeeeosneeyaneisetogyiterlihtcmioirarfdoetnihtnehiikamrdmnadanaodseseiyclsiantaoltciymidentthltndxtttmasbleaeetlisirtwturpfailteaoefeisiiiyisikvtwisprbsinelphrmohiagnlslvitodaisdpnyddcaaotahcehtueirredaectosnrhvnaodoikoetcineneurrisdcouraglvimmuppditeanditmaaiaieleonnreedaodboiumelrotntttgitnrlrienniklysogstcifypipvidvssmnceiasiitsnneatitomrhbnhnidprlrepoynalsnvsdosanesitfaenltgodatteeaisicrootmsmfhauenirsghynweintegodiileedtarnosrcaaendtcuttfdrbehtmfitoordruiaoyaanoeeldoinhusgiteaoriecevemntratmtfpeucutahamtnewonicdeemrpaolitoafesoosspfnlneeootachllirssxsofpdftfrnpraeeaylonahautntcntcbawloneftoatecvowdlwvnneedtiioigtegmtaheeatefaaeprrcrosheerrpalediengidrreouhvesuroytnsosinuiuiofprda'"
-       ]
-      }
-     ],
-     "prompt_number": 13
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "min(c8bl), max(c8bl)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 14,
-       "text": [
-        "('a', 'y')"
-       ]
-      }
-     ],
-     "prompt_number": 14
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "len(c8bl), len(c8bl) / 25"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 15,
-       "text": [
-        "(1400, 56.0)"
-       ]
-      }
-     ],
-     "prompt_number": 15
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_8b = pd.Series(collections.Counter([l.lower() for l in c8bl if l in string.ascii_letters]))\n",
-      "freqs_8b.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 16,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f25d357dc18>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f25d357d278>"
-       ]
-      }
-     ],
-     "prompt_number": 16
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs = pd.Series(english_counts)\n",
-      "freqs.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 17,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f25d351a940>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f25d34b3e48>"
-       ]
-      }
-     ],
-     "prompt_number": 17
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "rows = chunks(c8bl, len(c8bl) // 25)\n",
-      "rows"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 18,
-       "text": [
-        "['afcaeuottacthrioletcserthshtrahkyorpfrgeoadppjnglternefe',\n",
-        " 'ofiortsddoeeumscruernfetlaafstwientrvoonerhuahravereetsv',\n",
-        " 'sielhlostdoaloyaesmnndignnrhohhtsnaoilncnssicreanneeiiie',\n",
-        " 'rwtanesrvogieiywssdgpvoiaisaoaeoaedrnitrnxeigrpsshadhdto',\n",
-        " 'ipaatexennesagrobtlesrnroirypbgedclliwalaleenigrrnwyrlim',\n",
-        " 'lpstoleftrdmuarieeeiiaolnewsaohrtlstobetnslvfivdovtpoaee',\n",
-        " 'isciohipseveedtewfarnhebleaotohtttepnckaonhwetmvyprreonn',\n",
-        " 'asgdedoeeeoaamtcicttifnadresrtserosetrhcictpsaaehldhsfxs',\n",
-        " 'oaotctbbsoeirnsadlytrrunrceptthreuhnktaceceelrwnireeeaes',\n",
-        " 'eeeidisogceomnrtejhagabsenitlwtrnbmielsaretesrngsnhebios',\n",
-        " 'dienafleisahocifevmfatanatrniagnhatnmibniufenrtottrnypai',\n",
-        " 'dyiegdnmerhhiotretcesseildrbceprigaesoadltahievebrcenlev',\n",
-        " 'asadnnthneiteiisahuhhuamonefyhlonwhaeeeeosneeyaneisetogy',\n",
-        " 'iterlihtcmioirarfdoetnihtnehiikamrdmnadanaodseseiyclsian',\n",
-        " 'taoltciymidentthltndxtttmasbleaeetlisirtwturpfailteaoefe',\n",
-        " 'isiiiyisikvtwisprbsinelphrmohiagnlslvitodaisdpnyddcaaota',\n",
-        " 'hcehtueirredaectosnrhvnaodoikoetcineneurrisdcouraglvimmu',\n",
-        " 'ppditeanditmaaiaieleonnreedaodboiumelrotntttgitnrlrienni',\n",
-        " 'klysogstcifypipvidvssmnceiasiitsnneatitomrhbnhnidprlrepo',\n",
-        " 'ynalsnvsdosanesitfaenltgodatteeaisicrootmsmfhauenirsghyn',\n",
-        " 'weintegodiileedtarnosrcaaendtcuttfdrbehtmfitoordruiaoyaa',\n",
-        " 'noeeldoinhusgiteaoriecevemntratmtfpeucutahamtnewonicdeem',\n",
-        " 'rpaolitoafesoosspfnlneeootachllirssxsofpdftfrnpraeeaylon',\n",
-        " 'ahautntcntcbawloneftoatecvowdlwvnneedtiioigtegmtaheeatef',\n",
-        " 'aaeprrcrosheerrpalediengidrreouhvesuroytnsosinuiuiofprda']"
-       ]
-      }
-     ],
-     "prompt_number": 18
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "chunks(''.join([l if l in 'phase' else '.' for l in c8bl]), 56)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 19,
-       "text": [
-        "['a..ae....a..h....e..se..hsh..ah....p...e.a.pp.....e..e.e',\n",
-        " '......s...ee..s...e...e..aa.s...e.......e.h.ah.a.e.ee.s.',\n",
-        " 's.e.h..s...a...aes.........h.hh.s.a......ss...ea..ee...e',\n",
-        " '...a.es.....e...ss..p...a.sa.ae.ae........e...pssha.h...',\n",
-        " '.paa.e.e..esa......es.......p..e......a.a.ee............',\n",
-        " '.ps...e......a..eee..a...e.sa.h...s...e..s.........p.aee',\n",
-        " '.s...h.pse.ee..e..a..he..ea...h...ep...a..h.e....p..e...',\n",
-        " 'as..e..eee.aa..........a..es..se..se..h....psaaeh..hs..s',\n",
-        " '.a......s.e...sa..........ep..h.e.h...a.e.ee......eeeaes',\n",
-        " 'eee...s...e.....e.ha.a.se...........e.sa.e.es...s.he...s',\n",
-        " '..e.a..e.sah....e...a.a.a....a..ha.........e.........pa.',\n",
-        " '...e....e.hh....e..esse......ep...aes.a...ah.e.e...e..e.',\n",
-        " 'asa....h.e..e..sah.hh.a...e..h....haeeee.s.ee.a.e.se....',\n",
-        " '..e...h.......a....e...h..eh...a.....a.a.a..sese....s.a.',\n",
-        " '.a.........e...h.........as..eaee...s.......p.a...ea.e.e',\n",
-        " '.s.....s......sp..s..e.ph...h.a...s......a.s.p.....aa..a',\n",
-        " 'h.eh..e...e.ae...s..h..a......e....e.e....s.....a.......',\n",
-        " 'pp...ea.....aa.a.e.e....ee.a.......e................e...',\n",
-        " '...s..s.....p.p....ss...e.as...s..ea......h..h...p...ep.',\n",
-        " '..a.s..s..sa.es...ae......a..eea.s.......s..ha.e...s.h..',\n",
-        " '.e...e......ee..a...s..aae...........eh............a..aa',\n",
-        " '..ee.....h.s...ea...e.e.e....a....pe....aha...e......ee.',\n",
-        " '.pa.....a.es..ssp....ee...a.h....ss.s..p......p.aeea....',\n",
-        " 'aha.........a....e...a.e..........ee........e...aheea.e.',\n",
-        " 'aaep.....shee..pa.e..e......e..h.es......s.s........p..a']"
-       ]
-      }
-     ],
-     "prompt_number": 19
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "columns = [''.join(c) for c in zip(*rows)]\n",
-      "columns"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 20,
-       "text": [
-        "['aosriliaoeddaitihpkywnraa',\n",
-        " 'ffiwppssaeiystascplneopha',\n",
-        " 'cietascgoeeiaeoiedyaieaae',\n",
-        " 'aolaatidtinedrlihislneoup',\n",
-        " 'erhntooecdagnltittostlltr',\n",
-        " 'utleelhdtifdnicyuegnedinr',\n",
-        " 'ososxeiobslnthiieasvgottc',\n",
-        " 'tdsrefpeboemhtysintsoiocr',\n",
-        " 'tdtvntsesgiencmirdcddnano',\n",
-        " 'aodonreeocsremikriioihfts',\n",
-        " 'ceogedvoeeahiidvetfsiuech',\n",
-        " 'teaismeaiohhtoetdmyalssbe',\n",
-        " 'huleauearmoieinwaapnegoae',\n",
-        " 'rmoigadmnncoirtieaieeiowr',\n",
-        " 'isyyrrttsritiatscipsdtslr',\n",
-        " 'ocawoiecatfrsrhptavitesop',\n",
-        " 'lresbewideeeaflroiitaapna',\n",
-        " 'eusstefcljvthdtbsedfrofel',\n",
-        " 'temdleatyhmcuonsnlvanrnfe',\n",
-        " 'crngeirttafehedireseoiltd',\n",
-        " 'snnpsinirgashtxnhosnsenoi',\n",
-        " 'efdvrahfratsuntevnmlrceae',\n",
-        " 'reionoenubaeaitlnnntceetn',\n",
-        " 'ttgirlbansnimhtparcgavoeg',\n",
-        " 'hlnaonldrealotmhoeeoaeoci',\n",
-        " 'saniieercntdnnardeidemtvd',\n",
-        " 'harsrwaeeirreesmodaannaor',\n",
-        " 'tfhaysosptnbfhboiastdtcwr',\n",
-        " 'rsoopatrtlicyilhkoittrhde',\n",
-        " 'athaboottwaehieiodiecallo',\n",
-        " 'hwheghhshtgplkaaebteutlwu',\n",
-        " 'kitoerterrnroaegtosatmivh',\n",
-        " 'yesadttrenhinmencinittrnv',\n",
-        " 'onnecltoubagwrtliunsffsne',\n",
-        " 'rtadlseshmtahdlsnmeidpses',\n",
-        " 'prorltpenineamileeacrexeu',\n",
-        " 'fviniontkemsensvnltrbusdr',\n",
-        " 'roliwbcrtlioeaiierioecoto',\n",
-        " 'gontaekhasbaedrtuotohufiy',\n",
-        " 'encrltaccandeatortotttpit',\n",
-        " 'oennanoierilonwdrnmmmadon',\n",
-        " 'arsxlsncceutsataitrsfhfis',\n",
-        " 'dhseelhtetfanouisthmiatgo',\n",
-        " 'puiievwpeeehedrsdtbftmfts',\n",
-        " 'pacgnfeslsniespdcgnhotrei',\n",
-        " 'jhrriitarrreyefpoihaonngn',\n",
-        " 'nrepgvmawntvasanutnurepmu',\n",
-        " 'gaasrdvengoeneiyrniedwrti',\n",
-        " 'lvnsroyhistbeildardnroaau',\n",
-        " 'tenhnvplrntriytdglpiunehi',\n",
-        " 'ereawtrdehrcsceclrrriieeo',\n",
-        " 'reedyprheeneelaavilsacaef',\n",
-        " 'neihroesebyntsoaiergodyap',\n",
-        " 'etidlaofaiploieomnehyeltr',\n",
-        " 'fsitienxeoaegaftmnpyaeoed',\n",
-        " 'eveomensssivyneauionamnfa']"
-       ]
-      }
-     ],
-     "prompt_number": 20
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "letter_positions = {letter: [(r, c) for r, row in enumerate(rows) for c, char in enumerate(row) if char == letter] \n",
-      "                    for letter in deduplicate('phaseseven')}\n",
-      "letter_positions"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 21,
-       "text": [
-        "{'a': [(0, 0),\n",
-        "  (0, 3),\n",
-        "  (0, 9),\n",
-        "  (0, 29),\n",
-        "  (0, 41),\n",
-        "  (1, 25),\n",
-        "  (1, 26),\n",
-        "  (1, 44),\n",
-        "  (1, 47),\n",
-        "  (2, 11),\n",
-        "  (2, 15),\n",
-        "  (2, 34),\n",
-        "  (2, 47),\n",
-        "  (3, 3),\n",
-        "  (3, 24),\n",
-        "  (3, 27),\n",
-        "  (3, 29),\n",
-        "  (3, 32),\n",
-        "  (3, 50),\n",
-        "  (4, 2),\n",
-        "  (4, 3),\n",
-        "  (4, 12),\n",
-        "  (4, 38),\n",
-        "  (4, 40),\n",
-        "  (5, 13),\n",
-        "  (5, 21),\n",
-        "  (5, 28),\n",
-        "  (5, 53),\n",
-        "  (6, 18),\n",
-        "  (6, 26),\n",
-        "  (6, 39),\n",
-        "  (7, 0),\n",
-        "  (7, 11),\n",
-        "  (7, 12),\n",
-        "  (7, 23),\n",
-        "  (7, 45),\n",
-        "  (7, 46),\n",
-        "  (8, 1),\n",
-        "  (8, 15),\n",
-        "  (8, 38),\n",
-        "  (8, 53),\n",
-        "  (9, 19),\n",
-        "  (9, 21),\n",
-        "  (9, 39),\n",
-        "  (10, 4),\n",
-        "  (10, 10),\n",
-        "  (10, 20),\n",
-        "  (10, 22),\n",
-        "  (10, 24),\n",
-        "  (10, 29),\n",
-        "  (10, 33),\n",
-        "  (10, 54),\n",
-        "  (11, 34),\n",
-        "  (11, 38),\n",
-        "  (11, 42),\n",
-        "  (12, 0),\n",
-        "  (12, 2),\n",
-        "  (12, 16),\n",
-        "  (12, 22),\n",
-        "  (12, 35),\n",
-        "  (12, 46),\n",
-        "  (13, 14),\n",
-        "  (13, 31),\n",
-        "  (13, 37),\n",
-        "  (13, 39),\n",
-        "  (13, 41),\n",
-        "  (13, 54),\n",
-        "  (14, 1),\n",
-        "  (14, 25),\n",
-        "  (14, 30),\n",
-        "  (14, 46),\n",
-        "  (14, 51),\n",
-        "  (15, 30),\n",
-        "  (15, 41),\n",
-        "  (15, 51),\n",
-        "  (15, 52),\n",
-        "  (15, 55),\n",
-        "  (16, 12),\n",
-        "  (16, 23),\n",
-        "  (16, 48),\n",
-        "  (17, 6),\n",
-        "  (17, 12),\n",
-        "  (17, 13),\n",
-        "  (17, 15),\n",
-        "  (17, 27),\n",
-        "  (18, 26),\n",
-        "  (18, 35),\n",
-        "  (19, 2),\n",
-        "  (19, 11),\n",
-        "  (19, 18),\n",
-        "  (19, 26),\n",
-        "  (19, 31),\n",
-        "  (19, 45),\n",
-        "  (20, 16),\n",
-        "  (20, 23),\n",
-        "  (20, 24),\n",
-        "  (20, 51),\n",
-        "  (20, 54),\n",
-        "  (20, 55),\n",
-        "  (21, 16),\n",
-        "  (21, 29),\n",
-        "  (21, 40),\n",
-        "  (21, 42),\n",
-        "  (22, 2),\n",
-        "  (22, 8),\n",
-        "  (22, 26),\n",
-        "  (22, 48),\n",
-        "  (22, 51),\n",
-        "  (23, 0),\n",
-        "  (23, 2),\n",
-        "  (23, 12),\n",
-        "  (23, 21),\n",
-        "  (23, 48),\n",
-        "  (23, 52),\n",
-        "  (24, 0),\n",
-        "  (24, 1),\n",
-        "  (24, 16),\n",
-        "  (24, 55)],\n",
-        " 'n': [(0, 46),\n",
-        "  (0, 52),\n",
-        "  (1, 20),\n",
-        "  (1, 33),\n",
-        "  (1, 39),\n",
-        "  (2, 19),\n",
-        "  (2, 20),\n",
-        "  (2, 24),\n",
-        "  (2, 25),\n",
-        "  (2, 33),\n",
-        "  (2, 38),\n",
-        "  (2, 40),\n",
-        "  (2, 48),\n",
-        "  (2, 49),\n",
-        "  (3, 4),\n",
-        "  (3, 36),\n",
-        "  (3, 40),\n",
-        "  (4, 8),\n",
-        "  (4, 9),\n",
-        "  (4, 22),\n",
-        "  (4, 44),\n",
-        "  (4, 49),\n",
-        "  (5, 24),\n",
-        "  (5, 40),\n",
-        "  (6, 20),\n",
-        "  (6, 36),\n",
-        "  (6, 41),\n",
-        "  (6, 54),\n",
-        "  (6, 55),\n",
-        "  (7, 22),\n",
-        "  (8, 13),\n",
-        "  (8, 23),\n",
-        "  (8, 35),\n",
-        "  (8, 47),\n",
-        "  (9, 13),\n",
-        "  (9, 25),\n",
-        "  (9, 32),\n",
-        "  (9, 46),\n",
-        "  (9, 49),\n",
-        "  (10, 3),\n",
-        "  (10, 23),\n",
-        "  (10, 27),\n",
-        "  (10, 31),\n",
-        "  (10, 35),\n",
-        "  (10, 39),\n",
-        "  (10, 44),\n",
-        "  (10, 51),\n",
-        "  (11, 6),\n",
-        "  (11, 52),\n",
-        "  (12, 4),\n",
-        "  (12, 5),\n",
-        "  (12, 8),\n",
-        "  (12, 25),\n",
-        "  (12, 32),\n",
-        "  (12, 42),\n",
-        "  (12, 47),\n",
-        "  (13, 21),\n",
-        "  (13, 25),\n",
-        "  (13, 36),\n",
-        "  (13, 40),\n",
-        "  (13, 55),\n",
-        "  (14, 12),\n",
-        "  (14, 18),\n",
-        "  (15, 20),\n",
-        "  (15, 32),\n",
-        "  (15, 46),\n",
-        "  (16, 18),\n",
-        "  (16, 22),\n",
-        "  (16, 34),\n",
-        "  (16, 36),\n",
-        "  (17, 7),\n",
-        "  (17, 21),\n",
-        "  (17, 22),\n",
-        "  (17, 40),\n",
-        "  (17, 47),\n",
-        "  (17, 53),\n",
-        "  (17, 54),\n",
-        "  (18, 22),\n",
-        "  (18, 32),\n",
-        "  (18, 33),\n",
-        "  (18, 44),\n",
-        "  (18, 46),\n",
-        "  (19, 1),\n",
-        "  (19, 5),\n",
-        "  (19, 12),\n",
-        "  (19, 20),\n",
-        "  (19, 48),\n",
-        "  (19, 55),\n",
-        "  (20, 3),\n",
-        "  (20, 18),\n",
-        "  (20, 26),\n",
-        "  (21, 0),\n",
-        "  (21, 8),\n",
-        "  (21, 26),\n",
-        "  (21, 45),\n",
-        "  (21, 49),\n",
-        "  (22, 18),\n",
-        "  (22, 20),\n",
-        "  (22, 45),\n",
-        "  (22, 55),\n",
-        "  (23, 5),\n",
-        "  (23, 8),\n",
-        "  (23, 16),\n",
-        "  (23, 32),\n",
-        "  (23, 33),\n",
-        "  (24, 22),\n",
-        "  (24, 40),\n",
-        "  (24, 45)],\n",
-        " 's': [(0, 20),\n",
-        "  (0, 25),\n",
-        "  (1, 6),\n",
-        "  (1, 14),\n",
-        "  (1, 28),\n",
-        "  (1, 54),\n",
-        "  (2, 0),\n",
-        "  (2, 7),\n",
-        "  (2, 17),\n",
-        "  (2, 32),\n",
-        "  (2, 41),\n",
-        "  (2, 42),\n",
-        "  (3, 6),\n",
-        "  (3, 16),\n",
-        "  (3, 17),\n",
-        "  (3, 26),\n",
-        "  (3, 47),\n",
-        "  (3, 48),\n",
-        "  (4, 11),\n",
-        "  (4, 20),\n",
-        "  (5, 2),\n",
-        "  (5, 27),\n",
-        "  (5, 34),\n",
-        "  (5, 41),\n",
-        "  (6, 1),\n",
-        "  (6, 8),\n",
-        "  (7, 1),\n",
-        "  (7, 27),\n",
-        "  (7, 30),\n",
-        "  (7, 34),\n",
-        "  (7, 44),\n",
-        "  (7, 52),\n",
-        "  (7, 55),\n",
-        "  (8, 8),\n",
-        "  (8, 14),\n",
-        "  (8, 55),\n",
-        "  (9, 6),\n",
-        "  (9, 23),\n",
-        "  (9, 38),\n",
-        "  (9, 44),\n",
-        "  (9, 48),\n",
-        "  (9, 55),\n",
-        "  (10, 9),\n",
-        "  (11, 20),\n",
-        "  (11, 21),\n",
-        "  (11, 36),\n",
-        "  (12, 1),\n",
-        "  (12, 15),\n",
-        "  (12, 41),\n",
-        "  (12, 50),\n",
-        "  (13, 44),\n",
-        "  (13, 46),\n",
-        "  (13, 52),\n",
-        "  (14, 26),\n",
-        "  (14, 36),\n",
-        "  (15, 1),\n",
-        "  (15, 7),\n",
-        "  (15, 14),\n",
-        "  (15, 18),\n",
-        "  (15, 34),\n",
-        "  (15, 43),\n",
-        "  (16, 17),\n",
-        "  (16, 42),\n",
-        "  (18, 3),\n",
-        "  (18, 6),\n",
-        "  (18, 19),\n",
-        "  (18, 20),\n",
-        "  (18, 27),\n",
-        "  (18, 31),\n",
-        "  (19, 4),\n",
-        "  (19, 7),\n",
-        "  (19, 10),\n",
-        "  (19, 14),\n",
-        "  (19, 33),\n",
-        "  (19, 41),\n",
-        "  (19, 51),\n",
-        "  (20, 20),\n",
-        "  (21, 11),\n",
-        "  (22, 11),\n",
-        "  (22, 14),\n",
-        "  (22, 15),\n",
-        "  (22, 33),\n",
-        "  (22, 34),\n",
-        "  (22, 36),\n",
-        "  (24, 9),\n",
-        "  (24, 34),\n",
-        "  (24, 41),\n",
-        "  (24, 43)],\n",
-        " 'p': [(0, 35),\n",
-        "  (0, 43),\n",
-        "  (0, 44),\n",
-        "  (3, 20),\n",
-        "  (3, 46),\n",
-        "  (4, 1),\n",
-        "  (4, 28),\n",
-        "  (5, 1),\n",
-        "  (5, 51),\n",
-        "  (6, 7),\n",
-        "  (6, 35),\n",
-        "  (6, 49),\n",
-        "  (7, 43),\n",
-        "  (8, 27),\n",
-        "  (10, 53),\n",
-        "  (11, 30),\n",
-        "  (14, 44),\n",
-        "  (15, 15),\n",
-        "  (15, 23),\n",
-        "  (15, 45),\n",
-        "  (17, 0),\n",
-        "  (17, 1),\n",
-        "  (18, 12),\n",
-        "  (18, 14),\n",
-        "  (18, 49),\n",
-        "  (18, 54),\n",
-        "  (21, 34),\n",
-        "  (22, 1),\n",
-        "  (22, 16),\n",
-        "  (22, 39),\n",
-        "  (22, 46),\n",
-        "  (24, 3),\n",
-        "  (24, 15),\n",
-        "  (24, 52)],\n",
-        " 'v': [(1, 36),\n",
-        "  (1, 48),\n",
-        "  (1, 55),\n",
-        "  (3, 8),\n",
-        "  (3, 21),\n",
-        "  (5, 43),\n",
-        "  (5, 46),\n",
-        "  (5, 49),\n",
-        "  (6, 10),\n",
-        "  (6, 47),\n",
-        "  (10, 17),\n",
-        "  (11, 46),\n",
-        "  (11, 55),\n",
-        "  (15, 10),\n",
-        "  (15, 36),\n",
-        "  (16, 21),\n",
-        "  (16, 51),\n",
-        "  (18, 15),\n",
-        "  (18, 18),\n",
-        "  (19, 6),\n",
-        "  (21, 23),\n",
-        "  (23, 25),\n",
-        "  (23, 31),\n",
-        "  (24, 32)],\n",
-        " 'h': [(0, 12),\n",
-        "  (0, 24),\n",
-        "  (0, 26),\n",
-        "  (0, 30),\n",
-        "  (1, 42),\n",
-        "  (1, 45),\n",
-        "  (2, 4),\n",
-        "  (2, 27),\n",
-        "  (2, 29),\n",
-        "  (2, 30),\n",
-        "  (3, 49),\n",
-        "  (3, 52),\n",
-        "  (5, 30),\n",
-        "  (6, 5),\n",
-        "  (6, 21),\n",
-        "  (6, 30),\n",
-        "  (6, 42),\n",
-        "  (7, 38),\n",
-        "  (7, 48),\n",
-        "  (7, 51),\n",
-        "  (8, 30),\n",
-        "  (8, 34),\n",
-        "  (9, 18),\n",
-        "  (9, 50),\n",
-        "  (10, 11),\n",
-        "  (10, 32),\n",
-        "  (11, 10),\n",
-        "  (11, 11),\n",
-        "  (11, 43),\n",
-        "  (12, 7),\n",
-        "  (12, 17),\n",
-        "  (12, 19),\n",
-        "  (12, 20),\n",
-        "  (12, 29),\n",
-        "  (12, 34),\n",
-        "  (13, 6),\n",
-        "  (13, 23),\n",
-        "  (13, 27),\n",
-        "  (14, 15),\n",
-        "  (15, 24),\n",
-        "  (15, 28),\n",
-        "  (16, 0),\n",
-        "  (16, 3),\n",
-        "  (16, 20),\n",
-        "  (18, 42),\n",
-        "  (18, 45),\n",
-        "  (19, 44),\n",
-        "  (19, 53),\n",
-        "  (20, 38),\n",
-        "  (21, 9),\n",
-        "  (21, 41),\n",
-        "  (22, 28),\n",
-        "  (23, 1),\n",
-        "  (23, 49),\n",
-        "  (24, 10),\n",
-        "  (24, 31)],\n",
-        " 'e': [(0, 4),\n",
-        "  (0, 17),\n",
-        "  (0, 21),\n",
-        "  (0, 39),\n",
-        "  (0, 50),\n",
-        "  (0, 53),\n",
-        "  (0, 55),\n",
-        "  (1, 10),\n",
-        "  (1, 11),\n",
-        "  (1, 18),\n",
-        "  (1, 22),\n",
-        "  (1, 32),\n",
-        "  (1, 40),\n",
-        "  (1, 49),\n",
-        "  (1, 51),\n",
-        "  (1, 52),\n",
-        "  (2, 2),\n",
-        "  (2, 16),\n",
-        "  (2, 46),\n",
-        "  (2, 50),\n",
-        "  (2, 51),\n",
-        "  (2, 55),\n",
-        "  (3, 5),\n",
-        "  (3, 12),\n",
-        "  (3, 30),\n",
-        "  (3, 33),\n",
-        "  (3, 42),\n",
-        "  (4, 5),\n",
-        "  (4, 7),\n",
-        "  (4, 10),\n",
-        "  (4, 19),\n",
-        "  (4, 31),\n",
-        "  (4, 42),\n",
-        "  (4, 43),\n",
-        "  (5, 6),\n",
-        "  (5, 16),\n",
-        "  (5, 17),\n",
-        "  (5, 18),\n",
-        "  (5, 25),\n",
-        "  (5, 38),\n",
-        "  (5, 54),\n",
-        "  (5, 55),\n",
-        "  (6, 9),\n",
-        "  (6, 11),\n",
-        "  (6, 12),\n",
-        "  (6, 15),\n",
-        "  (6, 22),\n",
-        "  (6, 25),\n",
-        "  (6, 34),\n",
-        "  (6, 44),\n",
-        "  (6, 52),\n",
-        "  (7, 4),\n",
-        "  (7, 7),\n",
-        "  (7, 8),\n",
-        "  (7, 9),\n",
-        "  (7, 26),\n",
-        "  (7, 31),\n",
-        "  (7, 35),\n",
-        "  (7, 47),\n",
-        "  (8, 10),\n",
-        "  (8, 26),\n",
-        "  (8, 32),\n",
-        "  (8, 40),\n",
-        "  (8, 42),\n",
-        "  (8, 43),\n",
-        "  (8, 50),\n",
-        "  (8, 51),\n",
-        "  (8, 52),\n",
-        "  (8, 54),\n",
-        "  (9, 0),\n",
-        "  (9, 1),\n",
-        "  (9, 2),\n",
-        "  (9, 10),\n",
-        "  (9, 16),\n",
-        "  (9, 24),\n",
-        "  (9, 36),\n",
-        "  (9, 41),\n",
-        "  (9, 43),\n",
-        "  (9, 51),\n",
-        "  (10, 2),\n",
-        "  (10, 7),\n",
-        "  (10, 16),\n",
-        "  (10, 43),\n",
-        "  (11, 3),\n",
-        "  (11, 8),\n",
-        "  (11, 16),\n",
-        "  (11, 19),\n",
-        "  (11, 22),\n",
-        "  (11, 29),\n",
-        "  (11, 35),\n",
-        "  (11, 45),\n",
-        "  (11, 47),\n",
-        "  (11, 51),\n",
-        "  (11, 54),\n",
-        "  (12, 9),\n",
-        "  (12, 12),\n",
-        "  (12, 26),\n",
-        "  (12, 36),\n",
-        "  (12, 37),\n",
-        "  (12, 38),\n",
-        "  (12, 39),\n",
-        "  (12, 43),\n",
-        "  (12, 44),\n",
-        "  (12, 48),\n",
-        "  (12, 51),\n",
-        "  (13, 2),\n",
-        "  (13, 19),\n",
-        "  (13, 26),\n",
-        "  (13, 45),\n",
-        "  (13, 47),\n",
-        "  (14, 11),\n",
-        "  (14, 29),\n",
-        "  (14, 31),\n",
-        "  (14, 32),\n",
-        "  (14, 50),\n",
-        "  (14, 53),\n",
-        "  (14, 55),\n",
-        "  (15, 21),\n",
-        "  (16, 2),\n",
-        "  (16, 6),\n",
-        "  (16, 10),\n",
-        "  (16, 13),\n",
-        "  (16, 30),\n",
-        "  (16, 35),\n",
-        "  (16, 37),\n",
-        "  (17, 5),\n",
-        "  (17, 17),\n",
-        "  (17, 19),\n",
-        "  (17, 24),\n",
-        "  (17, 25),\n",
-        "  (17, 35),\n",
-        "  (17, 52),\n",
-        "  (18, 24),\n",
-        "  (18, 34),\n",
-        "  (18, 53),\n",
-        "  (19, 13),\n",
-        "  (19, 19),\n",
-        "  (19, 29),\n",
-        "  (19, 30),\n",
-        "  (19, 47),\n",
-        "  (20, 1),\n",
-        "  (20, 5),\n",
-        "  (20, 12),\n",
-        "  (20, 13),\n",
-        "  (20, 25),\n",
-        "  (20, 37),\n",
-        "  (21, 2),\n",
-        "  (21, 3),\n",
-        "  (21, 15),\n",
-        "  (21, 20),\n",
-        "  (21, 22),\n",
-        "  (21, 24),\n",
-        "  (21, 35),\n",
-        "  (21, 46),\n",
-        "  (21, 53),\n",
-        "  (21, 54),\n",
-        "  (22, 10),\n",
-        "  (22, 21),\n",
-        "  (22, 22),\n",
-        "  (22, 49),\n",
-        "  (22, 50),\n",
-        "  (23, 17),\n",
-        "  (23, 23),\n",
-        "  (23, 34),\n",
-        "  (23, 35),\n",
-        "  (23, 44),\n",
-        "  (23, 50),\n",
-        "  (23, 51),\n",
-        "  (23, 54),\n",
-        "  (24, 2),\n",
-        "  (24, 11),\n",
-        "  (24, 12),\n",
-        "  (24, 18),\n",
-        "  (24, 21),\n",
-        "  (24, 28),\n",
-        "  (24, 33)]}"
-       ]
-      }
-     ],
-     "prompt_number": 21
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "keycolumn = make_cadenus_keycolumn(reverse=True)\n",
-      "inverse_keycolumn = {v: l for l, v in keycolumn.items()}\n",
-      "inverse_keycolumn"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 22,
-       "text": [
-        "{0: 'a',\n",
-        " 1: 'z',\n",
-        " 2: 'y',\n",
-        " 3: 'x',\n",
-        " 4: 'w',\n",
-        " 5: 'u',\n",
-        " 6: 't',\n",
-        " 7: 's',\n",
-        " 8: 'r',\n",
-        " 9: 'q',\n",
-        " 10: 'p',\n",
-        " 11: 'o',\n",
-        " 12: 'n',\n",
-        " 13: 'm',\n",
-        " 14: 'l',\n",
-        " 15: 'k',\n",
-        " 16: 'j',\n",
-        " 17: 'i',\n",
-        " 18: 'h',\n",
-        " 19: 'g',\n",
-        " 20: 'f',\n",
-        " 21: 'e',\n",
-        " 22: 'd',\n",
-        " 23: 'c',\n",
-        " 24: 'b'}"
-       ]
-      }
-     ],
-     "prompt_number": 22
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "def valid_partial_solution(solution, inverse_keycolumn):\n",
-      "    row_indices = [p[0] for p in sorted(solution, key=lambda x: x[1])]\n",
-      "    row_letters = [inverse_keycolumn[i] for i in row_indices]\n",
-      "    letter_pairs = ngrams(row_letters, 2)\n",
-      "    return all(p[0] <= p[1] for p in letter_pairs)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 23
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "solutions = [[p] for p in letter_positions['p']]\n",
-      "for letter in 'ha': #'haseseven':\n",
-      "    new_solutions = []\n",
-      "    for solution in solutions:\n",
-      "        used_columns = [p[1] for p in solution]\n",
-      "        for position in letter_positions[letter]:\n",
-      "            if position[1] not in used_columns:\n",
-      "                if valid_partial_solution(solution + [position], inverse_keycolumn):\n",
-      "                    new_solutions += [solution + [position]]\n",
-      "    solutions = new_solutions\n",
-      "len(solutions)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 24,
-       "text": [
-        "43005"
-       ]
-      }
-     ],
-     "prompt_number": 24
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "valid_partial_solution(solutions[1], inverse_keycolumn)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 25,
-       "text": [
-        "True"
-       ]
-      }
-     ],
-     "prompt_number": 25
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "display = []\n",
-      "for p in solutions[1]:\n",
-      "    this_column = columns[p[1]]\n",
-      "    rotated_column = this_column[p[0]:] + this_column[:p[0]]\n",
-      "    display += [rotated_column]\n",
-      "display_rows = [''.join(r) for r in zip(*display)]\n",
-      "display_rows"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 26,
-       "text": [
-        "['pha',\n",
-        " 'ruo',\n",
-        " 'oll',\n",
-        " 'rea',\n",
-        " 'laa',\n",
-        " 'tut',\n",
-        " 'pei',\n",
-        " 'ead',\n",
-        " 'nrt',\n",
-        " 'imi',\n",
-        " 'non',\n",
-        " 'eie',\n",
-        " 'aed',\n",
-        " 'mir',\n",
-        " 'inl',\n",
-        " 'lwi',\n",
-        " 'eah',\n",
-        " 'eai',\n",
-        " 'aps',\n",
-        " 'cnl',\n",
-        " 'ren',\n",
-        " 'ege',\n",
-        " 'xoo',\n",
-        " 'eau',\n",
-        " 'uep']"
-       ]
-      }
-     ],
-     "prompt_number": 26
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "def display_solution(solution, columns):\n",
-      "    display = []\n",
-      "    for p in solution:\n",
-      "        this_column = columns[p[1]]\n",
-      "        rotated_column = this_column[p[0]:] + this_column[:p[0]]\n",
-      "        display += [rotated_column]\n",
-      "    return [''.join(r) for r in zip(*display)]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 27
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "display_solution(solutions[0], columns)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 28,
-       "text": [
-        "['pha',\n",
-        " 'ruo',\n",
-        " 'ols',\n",
-        " 'rer',\n",
-        " 'lai',\n",
-        " 'tul',\n",
-        " 'pei',\n",
-        " 'eaa',\n",
-        " 'nro',\n",
-        " 'ime',\n",
-        " 'nod',\n",
-        " 'eid',\n",
-        " 'aea',\n",
-        " 'mii',\n",
-        " 'int',\n",
-        " 'lwi',\n",
-        " 'eah',\n",
-        " 'eap',\n",
-        " 'apk',\n",
-        " 'cny',\n",
-        " 'rew',\n",
-        " 'egn',\n",
-        " 'xor',\n",
-        " 'eaa',\n",
-        " 'uea']"
-       ]
-      }
-     ],
-     "prompt_number": 28
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "sum(Ptrigrams(r) for r in display_rows)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 29,
-       "text": [
-        "-109.09171451522874"
-       ]
-      }
-     ],
-     "prompt_number": 29
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "def score_solution(solution, columns):\n",
-      "    display = []\n",
-      "    for p in solution:\n",
-      "        this_column = columns[p[1]]\n",
-      "        rotated_column = this_column[p[0]:] + this_column[:p[0]]\n",
-      "        display += [rotated_column]\n",
-      "    display_rows = [''.join(r) for r in zip(*display)]\n",
-      "    return sum(Ptrigrams(r) for r in display_rows)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 30
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[(s, display_solution(s, columns), score_solution(s, columns)) for s in solutions[:10]]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 31,
-       "text": [
-        "[([(0, 35), (0, 12), (0, 0)],\n",
-        "  ['pha',\n",
-        "   'ruo',\n",
-        "   'ols',\n",
-        "   'rer',\n",
-        "   'lai',\n",
-        "   'tul',\n",
-        "   'pei',\n",
-        "   'eaa',\n",
-        "   'nro',\n",
-        "   'ime',\n",
-        "   'nod',\n",
-        "   'eid',\n",
-        "   'aea',\n",
-        "   'mii',\n",
-        "   'int',\n",
-        "   'lwi',\n",
-        "   'eah',\n",
-        "   'eap',\n",
-        "   'apk',\n",
-        "   'cny',\n",
-        "   'rew',\n",
-        "   'egn',\n",
-        "   'xor',\n",
-        "   'eaa',\n",
-        "   'uea'],\n",
-        "  -112.23213925765266),\n",
-        " ([(0, 35), (0, 12), (0, 3)],\n",
-        "  ['pha',\n",
-        "   'ruo',\n",
-        "   'oll',\n",
-        "   'rea',\n",
-        "   'laa',\n",
-        "   'tut',\n",
-        "   'pei',\n",
-        "   'ead',\n",
-        "   'nrt',\n",
-        "   'imi',\n",
-        "   'non',\n",
-        "   'eie',\n",
-        "   'aed',\n",
-        "   'mir',\n",
-        "   'inl',\n",
-        "   'lwi',\n",
-        "   'eah',\n",
-        "   'eai',\n",
-        "   'aps',\n",
-        "   'cnl',\n",
-        "   'ren',\n",
-        "   'ege',\n",
-        "   'xoo',\n",
-        "   'eau',\n",
-        "   'uep'],\n",
-        "  -109.09171451522874),\n",
-        " ([(0, 35), (0, 12), (0, 9)],\n",
-        "  ['pha',\n",
-        "   'ruo',\n",
-        "   'old',\n",
-        "   'reo',\n",
-        "   'lan',\n",
-        "   'tur',\n",
-        "   'pee',\n",
-        "   'eae',\n",
-        "   'nro',\n",
-        "   'imc',\n",
-        "   'nos',\n",
-        "   'eir',\n",
-        "   'aee',\n",
-        "   'mim',\n",
-        "   'ini',\n",
-        "   'lwk',\n",
-        "   'ear',\n",
-        "   'eai',\n",
-        "   'api',\n",
-        "   'cno',\n",
-        "   'rei',\n",
-        "   'egh',\n",
-        "   'xof',\n",
-        "   'eat',\n",
-        "   'ues'],\n",
-        "  -105.51902198106185),\n",
-        " ([(0, 35), (0, 12), (0, 29)],\n",
-        "  ['pha',\n",
-        "   'rut',\n",
-        "   'olh',\n",
-        "   'rea',\n",
-        "   'lab',\n",
-        "   'tuo',\n",
-        "   'peo',\n",
-        "   'eat',\n",
-        "   'nrt',\n",
-        "   'imw',\n",
-        "   'noa',\n",
-        "   'eie',\n",
-        "   'aeh',\n",
-        "   'mii',\n",
-        "   'ine',\n",
-        "   'lwi',\n",
-        "   'eao',\n",
-        "   'ead',\n",
-        "   'api',\n",
-        "   'cne',\n",
-        "   'rec',\n",
-        "   'ega',\n",
-        "   'xol',\n",
-        "   'eal',\n",
-        "   'ueo'],\n",
-        "  -106.91642615054437),\n",
-        " ([(0, 35), (0, 12), (0, 41)],\n",
-        "  ['pha',\n",
-        "   'rur',\n",
-        "   'ols',\n",
-        "   'rex',\n",
-        "   'lal',\n",
-        "   'tus',\n",
-        "   'pen',\n",
-        "   'eac',\n",
-        "   'nrc',\n",
-        "   'ime',\n",
-        "   'nou',\n",
-        "   'eit',\n",
-        "   'aes',\n",
-        "   'mia',\n",
-        "   'int',\n",
-        "   'lwa',\n",
-        "   'eai',\n",
-        "   'eat',\n",
-        "   'apr',\n",
-        "   'cns',\n",
-        "   'ref',\n",
-        "   'egh',\n",
-        "   'xof',\n",
-        "   'eai',\n",
-        "   'ues'],\n",
-        "  -100.92420426683796),\n",
-        " ([(0, 35), (0, 12), (1, 44)],\n",
-        "  ['pha',\n",
-        "   'ruc',\n",
-        "   'olg',\n",
-        "   'ren',\n",
-        "   'laf',\n",
-        "   'tue',\n",
-        "   'pes',\n",
-        "   'eal',\n",
-        "   'nrs',\n",
-        "   'imn',\n",
-        "   'noi',\n",
-        "   'eie',\n",
-        "   'aes',\n",
-        "   'mip',\n",
-        "   'ind',\n",
-        "   'lwc',\n",
-        "   'eag',\n",
-        "   'ean',\n",
-        "   'aph',\n",
-        "   'cno',\n",
-        "   'ret',\n",
-        "   'egr',\n",
-        "   'xoe',\n",
-        "   'eai',\n",
-        "   'uep'],\n",
-        "  -108.53207489276411),\n",
-        " ([(0, 35), (0, 12), (1, 47)],\n",
-        "  ['pha',\n",
-        "   'rua',\n",
-        "   'ols',\n",
-        "   'rer',\n",
-        "   'lad',\n",
-        "   'tuv',\n",
-        "   'pee',\n",
-        "   'ean',\n",
-        "   'nrg',\n",
-        "   'imo',\n",
-        "   'noe',\n",
-        "   'ein',\n",
-        "   'aee',\n",
-        "   'mii',\n",
-        "   'iny',\n",
-        "   'lwr',\n",
-        "   'ean',\n",
-        "   'eai',\n",
-        "   'ape',\n",
-        "   'cnd',\n",
-        "   'rew',\n",
-        "   'egr',\n",
-        "   'xot',\n",
-        "   'eai',\n",
-        "   'ueg'],\n",
-        "  -109.50900823047225),\n",
-        " ([(0, 35), (0, 12), (2, 47)],\n",
-        "  ['pha',\n",
-        "   'rus',\n",
-        "   'olr',\n",
-        "   'red',\n",
-        "   'lav',\n",
-        "   'tue',\n",
-        "   'pen',\n",
-        "   'eag',\n",
-        "   'nro',\n",
-        "   'ime',\n",
-        "   'non',\n",
-        "   'eie',\n",
-        "   'aei',\n",
-        "   'miy',\n",
-        "   'inr',\n",
-        "   'lwn',\n",
-        "   'eai',\n",
-        "   'eae',\n",
-        "   'apd',\n",
-        "   'cnw',\n",
-        "   'rer',\n",
-        "   'egt',\n",
-        "   'xoi',\n",
-        "   'eag',\n",
-        "   'uea'],\n",
-        "  -114.40196859359595),\n",
-        " ([(0, 35), (0, 12), (3, 50)],\n",
-        "  ['pha',\n",
-        "   'ruw',\n",
-        "   'olt',\n",
-        "   'rer',\n",
-        "   'lad',\n",
-        "   'tue',\n",
-        "   'peh',\n",
-        "   'ear',\n",
-        "   'nrc',\n",
-        "   'ims',\n",
-        "   'noc',\n",
-        "   'eie',\n",
-        "   'aec',\n",
-        "   'mil',\n",
-        "   'inr',\n",
-        "   'lwr',\n",
-        "   'ear',\n",
-        "   'eai',\n",
-        "   'api',\n",
-        "   'cne',\n",
-        "   'ree',\n",
-        "   'ego',\n",
-        "   'xoe',\n",
-        "   'ear',\n",
-        "   'uee'],\n",
-        "  -106.68850150792129),\n",
-        " ([(0, 35), (0, 12), (4, 38)],\n",
-        "  ['pha',\n",
-        "   'rue',\n",
-        "   'olk',\n",
-        "   'reh',\n",
-        "   'laa',\n",
-        "   'tus',\n",
-        "   'peb',\n",
-        "   'eaa',\n",
-        "   'nre',\n",
-        "   'imd',\n",
-        "   'nor',\n",
-        "   'eit',\n",
-        "   'aeu',\n",
-        "   'mio',\n",
-        "   'int',\n",
-        "   'lwo',\n",
-        "   'eah',\n",
-        "   'eau',\n",
-        "   'apf',\n",
-        "   'cni',\n",
-        "   'rey',\n",
-        "   'egg',\n",
-        "   'xoo',\n",
-        "   'ean',\n",
-        "   'uet'],\n",
-        "  -108.49770543928673)]"
-       ]
-      }
-     ],
-     "prompt_number": 31
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "sorted(solutions[:10], key=lambda s: score_solution(s, columns), reverse=True)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 32,
-       "text": [
-        "[[(0, 35), (0, 12), (0, 41)],\n",
-        " [(0, 35), (0, 12), (0, 9)],\n",
-        " [(0, 35), (0, 12), (3, 50)],\n",
-        " [(0, 35), (0, 12), (0, 29)],\n",
-        " [(0, 35), (0, 12), (4, 38)],\n",
-        " [(0, 35), (0, 12), (1, 44)],\n",
-        " [(0, 35), (0, 12), (0, 3)],\n",
-        " [(0, 35), (0, 12), (1, 47)],\n",
-        " [(0, 35), (0, 12), (0, 0)],\n",
-        " [(0, 35), (0, 12), (2, 47)]]"
-       ]
-      }
-     ],
-     "prompt_number": 32
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "solutions = sorted(solutions, key=lambda s: score_solution(s, columns), reverse=True)[:10000]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 33
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "for letter in 'seseven': #'haseeight':\n",
-      "    new_solutions = []\n",
-      "    for solution in solutions:\n",
-      "        used_columns = [p[1] for p in solution]\n",
-      "        for position in letter_positions[letter]:\n",
-      "            if position[1] not in used_columns:\n",
-      "                if valid_partial_solution(solution + [position], inverse_keycolumn):\n",
-      "                    new_solutions += [solution + [position]]\n",
-      "    solutions = sorted(new_solutions, key=lambda s: score_solution(s, columns), reverse=True)[:10000]\n",
-      "len(solutions)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 34,
-       "text": [
-        "10000"
-       ]
-      }
-     ],
-     "prompt_number": 34
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "display_solution(solutions[0], columns)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 35,
-       "text": [
-        "['phaseseven',\n",
-        " 'ninmelcalh',\n",
-        " 'andodrinho',\n",
-        " 'lmedyierts',\n",
-        " 'reaapstnen',\n",
-        " 'entaryafts',\n",
-        " 'sconhysefe',\n",
-        " 'birnerctan',\n",
-        " 'entaergeno',\n",
-        " 'wioontomoi',\n",
-        " 'ittretedus',\n",
-        " 'dttheselin',\n",
-        " 'ertalriesn',\n",
-        " 'enpraiaatp',\n",
-        " 'evisateths',\n",
-        " 'aytrvioymi',\n",
-        " 'feewiaihin',\n",
-        " 'lsnaltemai',\n",
-        " 'racessdctr',\n",
-        " 'odreacyugg',\n",
-        " 'itliciaooa',\n",
-        " 'ittrapinds',\n",
-        " 'trareseshh',\n",
-        " 'aecefdanst',\n",
-        " 'ancertalex']"
-       ]
-      }
-     ],
-     "prompt_number": 35
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "hinted_keywords = [w for w in keywords if w[0] =='f' if len(transpositions_of(w)) == 7]\n",
-      "len(hinted_keywords)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 36,
-       "text": [
-        "849"
-       ]
-      }
-     ],
-     "prompt_number": 36
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "hinted_keywords[:10]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 37,
-       "text": [
-        "['fabrics',\n",
-        " 'facings',\n",
-        " 'faction',\n",
-        " 'factors',\n",
-        " 'factory',\n",
-        " 'faculty',\n",
-        " 'fadeout',\n",
-        " 'failure',\n",
-        " 'fainest',\n",
-        " 'fainted']"
-       ]
-      }
-     ],
-     "prompt_number": 37
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "first_chunk = c8bl[:175]\n",
-      "len(first_chunk)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 38,
-       "text": [
-        "175"
-       ]
-      }
-     ],
-     "prompt_number": 38
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[cadenus_decipher(first_chunk, w, keycolumn)[:20] for w in hinted_keywords]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 39,
-       "text": [
-        "['gatlrlnjtonethnirreh',\n",
-        " 'raorejnptreanhriaeso',\n",
-        " 'raohoanptraesrriasul',\n",
-        " 'raohhanptraemrriasln',\n",
-        " 'raorhaeptrnemsrianln',\n",
-        " 'raonlneptrnissriaaoc',\n",
-        " 'garhrarjtartsnnifphn',\n",
-        " 'raoaalapteesnfriunnr',\n",
-        " 'raonanhpterfrariutpn',\n",
-        " 'garehhrjteaaraniessp',\n",
-        " 'raonhalpterafnriutsp',\n",
-        " 'fainrleptorniseirtno',\n",
-        " 'raoaanhptemfrariunpn',\n",
-        " 'raloannptirsrhrioalt',\n",
-        " 'falmireptinonseiosrn',\n",
-        " 'ralhaanptiafmrriospn',\n",
-        " 'faeilenptnoisreirroo',\n",
-        " 'raeoeanptneafhrirusp',\n",
-        " 'earotktntvrugheivarj',\n",
-        " 'gaeorhojtarernnisaep',\n",
-        " 'gaeorhnjtarerhnisaep',\n",
-        " 'raeooaeptareesrisaun',\n",
-        " 'garnahrjtvenranivrep',\n",
-        " 'raalaenptmifsrrinopo',\n",
-        " 'faoeoepptnneareihrus',\n",
-        " 'falhonpptnaerreirsut',\n",
-        " 'fanroanpthiesreiaoul',\n",
-        " 'fanhonpptraerreinsut',\n",
-        " 'rahnaanptaofmrrisepn',\n",
-        " 'fahrrinptaitoreisohh',\n",
-        " 'rarrjaaptnensfrineon',\n",
-        " 'gaaohrmjtsrrnnninapn',\n",
-        " 'gaaarhrjtsenraninnnp',\n",
-        " 'gasrlhrjtntnraniehrp',\n",
-        " 'fasanomptnensneieean',\n",
-        " 'raalrempftinsnrpiono',\n",
-        " 'raaorejpftneanrpihes',\n",
-        " 'ghrrlanjratnthnpfhri',\n",
-        " 'gharnarjreaetvnpnfai',\n",
-        " 'frtroenppwthsredoheo',\n",
-        " 'frahoepppeaearednsus',\n",
-        " 'raeaoalpfnsntirprlhi',\n",
-        " 'raaiahnpfmotarrpnhis',\n",
-        " 'froiianppnoosredhhrl',\n",
-        " 'rahrinnpfaeeorrpsere',\n",
-        " 'rahaaiupfaeselrpsnlr',\n",
-        " 'raaerejpfsreanrpnpes',\n",
-        " 'graeohnjetarrhneisap',\n",
-        " 'fitahanpoimesrerenln',\n",
-        " 'grtaaahjeosntrnernei',\n",
-        " 'rotaaanpeosetrrurnni',\n",
-        " 'roieaaopeeanfnrureep',\n",
-        " 'rrejahnpernfarrepops',\n",
-        " 'rrejarepernfnsrepopn',\n",
-        " 'fopalrnpertntheuiirh',\n",
-        " 'frpnhrlperoapneeiesd',\n",
-        " 'foperehpernpaaeuirds',\n",
-        " 'fopalaapersnteeuinri',\n",
-        " 'rrjalaepensnfrreonrp',\n",
-        " 'fopaarnpersmpreuinnd',\n",
-        " 'roatalhpeeifnarunepr',\n",
-        " 'gtfiehrjuterranrrrep',\n",
-        " 'rrainanpeneofhreerep',\n",
-        " 'filhranpoiapmrerosdn',\n",
-        " 'rrrajaapevtnnfrevioe',\n",
-        " 'roeaaanpeatefhrusinp',\n",
-        " 'rreinanpeaeofhresrep',\n",
-        " 'ronealnperrfnhrutppr',\n",
-        " 'fioraenpohpmsreredno',\n",
-        " 'fonprlnperrpnheutidr',\n",
-        " 'finlrenporipsrertodo',\n",
-        " 'rrlatajpenfisnrerpen',\n",
-        " 'rooaeaepenfntaruhpri',\n",
-        " 'fiairnhpomopraernhdn',\n",
-        " 'pfomrteddsnnwstcnsno',\n",
-        " 'rrninalpeheofnrearep',\n",
-        " 'fonrraeperipmseunodn',\n",
-        " 'fonrnrhperirpaeunotd',\n",
-        " 'pfnsoaiddsoseetccrne',\n",
-        " 'grnatahjeetonrnesire',\n",
-        " 'grnarhrjeetnranesinp',\n",
-        " 'ronarampeetnfnrusinp',\n",
-        " 'roaaeaepeifresrueppn',\n",
-        " 'finnnorpoesnsperscan',\n",
-        " 'rosaanmpeoftnnrurpia',\n",
-        " 'flapannpitrsrheoiilt',\n",
-        " 'raaeoaopntaefnreieup',\n",
-        " 'faaeorppntaevreeieuv',\n",
-        " 'eaattktnntrogheeivrj',\n",
-        " 'gaanthnjeteorhnniarp',\n",
-        " 'rlaealnpitnfnhroirpr',\n",
-        " 'faanorppeteevreniauv',\n",
-        " 'raaejanpetanfhrnisop',\n",
-        " 'gaarehrjntvaraneivep',\n",
-        " 'raaeuaopetalfnrnisip',\n",
-        " 'faaooeppetnearenihus',\n",
-        " 'gaanehrjnthrraneiaep',\n",
-        " 'raannalpethofnrniaep',\n",
-        " 'eaahtktnntaogheeisrj',\n",
-        " 'ftaaormpwtshnneoinen',\n",
-        " 'ftashanpwtnemreoieln',\n",
-        " 'ftashnapwtnenmeoiela',\n",
-        " 'faasoeppetnearenieus',\n",
-        " 'faaeoeppetsearenious',\n",
-        " 'farnorppepeevrendauv',\n",
-        " 'farnonrpepeehiendaua',\n",
-        " 'farnoeppepeearendsus',\n",
-        " 'gfrirhrjteearanrernp',\n",
-        " 'raoieaopneeafnreurep',\n",
-        " 'paoprhndeeeiartnufos',\n",
-        " 'paoprredeeeinstnufon',\n",
-        " 'faoeirnpeeaeihenusro',\n",
-        " 'raolhaepeenafrrnursp',\n",
-        " 'gaaahhrjestarannlisp',\n",
-        " 'rlrahalpittafnrohisp',\n",
-        " 'gaviehrjnvearaneorep',\n",
-        " 'raaoorapesneatrnlhuf',\n",
-        " 'flaoinrpisnorpeolhrt',\n",
-        " 'ptrlfondwtndhhtohrce',\n",
-        " 'pthafnhdwemdratolncn',\n",
-        " 'ftrhnaipwtartoeohsni',\n",
-        " 'rlaaniapissrefrolntr',\n",
-        " 'rlralaepitsnfrrohnrp',\n",
-        " 'rlraraepitsnfrrohnnp',\n",
-        " 'fthsranpwenpmreoledn',\n",
-        " 'fthnraepweapmseolidn',\n",
-        " 'plasinpdisnoretolert',\n",
-        " 'rlnaniepinfresroaptr',\n",
-        " 'faauirlpeslopnennird',\n",
-        " 'raaeuaepesalfrrnnsip',\n",
-        " 'flnnrrepinrtpseoatwd',\n",
-        " 'faaeuirpesalopennsir',\n",
-        " 'ptnocemdwnhesntoaeto',\n",
-        " 'raannaepesrofrrnnnep',\n",
-        " 'flanrrapisripmeonnod',\n",
-        " 'ftamrropwsnnpseonsnd',\n",
-        " 'plarinpdisnoretonnrt',\n",
-        " 'plnninpdineoretoasrt',\n",
-        " 'pleinpndisorertoortf',\n",
-        " 'ftehnrapwseapmeoolid',\n",
-        " 'fvaaoeppvteeareoinus',\n",
-        " 'raaeoaopstnefnrlirup',\n",
-        " 'fvaeoeppvtneareoirus',\n",
-        " 'grianhrjtesrranhrnnp',\n",
-        " 'fhpaarepertmnseliinn',\n",
-        " 'raotaanpseiefhrluenp',\n",
-        " 'rronhaepterafrrhunsp',\n",
-        " 'rrlealnptirfnhrhoppr',\n",
-        " 'fvaeoeppvereareonpus',\n",
-        " 'frlprlnptirpnhehoidr',\n",
-        " 'rvarajapvnetnfroeeio',\n",
-        " 'raaoahapseetafrlnuis',\n",
-        " 'frwrohnptopharehades',\n",
-        " 'rroeanhpthrfrarheppn',\n",
-        " 'ranelanpsrrifhrltpop',\n",
-        " 'rroeaanpthrsfrrhepnp',\n",
-        " 'gaoanhrjsnteranlhirp',\n",
-        " 'rrlajanptntnfhrhriop',\n",
-        " 'grlaehrjtntsranhriop',\n",
-        " 'eaotatknsnothgelhrir',\n",
-        " 'rrltornptnieahrhreuf',\n",
-        " 'rhliatnpenefhhrlrrpa',\n",
-        " 'faoionppsneerrelhrut',\n",
-        " 'raornaepsnaotnrlhfei',\n",
-        " 'faoeonppsnrerrelhput',\n",
-        " 'faoropnpsnperrelhdui',\n",
-        " 'raoaianpsnfotrrlhphi',\n",
-        " 'rhaanaspemfrtnrlnpni',\n",
-        " 'rrljasaptnntnfrhroie',\n",
-        " 'fhaprhnpemrparelnids',\n",
-        " 'frlposrptnrenpehriue',\n",
-        " 'paouinpdsnloretlhirt',\n",
-        " 'frliatnptnotwhehrhio',\n",
-        " 'frlwaohptnothaehraie',\n",
-        " 'rrliahaptnotafrhrhis',\n",
-        " 'fhawahnpemotarelnais',\n",
-        " 'raoeooapsnnertrlhrua',\n",
-        " 'paoiinpdsnooretlhhrt',\n",
-        " 'frliataptnoswtehrhno',\n",
-        " 'rrlnauaptnhtlfrhraii',\n",
-        " 'fhahirnpemaoprelnsrd',\n",
-        " 'fharaorpemnsapelnnne',\n",
-        " 'fhasrorpemnpanelnede',\n",
-        " 'fhatrmrpeswpnnelnods',\n",
-        " 'paalinpdssioretlnort',\n",
-        " 'rraoealptshrfnrhnepp',\n",
-        " 'fhnoeaepenarmselaepn',\n",
-        " 'paaoremdessnfntennnd',\n",
-        " 'paslinpdsnioretleort',\n",
-        " 'fhnirmrpeeopnnelsrds',\n",
-        " 'frnrailptentoiehsnir',\n",
-        " 'roajraapntnenfrhioee',\n",
-        " 'faailrepmtoinseniron',\n",
-        " 'foaeoeppntnearehirus',\n",
-        " 'glanohnjntrrrhnritap',\n",
-        " 'rlanoonpntrrehrritau',\n",
-        " 'goaeehrjntaaranhisep',\n",
-        " 'roaeuaapntalferhisip',\n",
-        " 'roaeeoapntaaefrhiseu',\n",
-        " 'flanrlepntrtiseritwo',\n",
-        " 'rlanhoopntraerrritsu',\n",
-        " 'faaapnrpmtsroneninie',\n",
-        " 'flaeonppntserreriout',\n",
-        " 'glhrranjnreathnrpefi',\n",
-        " 'flrrpnhpnperoaerdeie',\n",
-        " 'flrwrohpnpothaerdahe',\n",
-        " 'rlaninnpnfreohrrptre',\n",
-        " 'forosimpspaoenenderu',\n",
-        " 'farnrlepmpriisendnoo',\n",
-        " 'goratahjnetonrnheire',\n",
-        " 'raoraenpmeatsrrnufio',\n",
-        " 'rlrejanpnernfhrrepop',\n",
-        " 'gorhraejneratanhepfi',\n",
-        " 'glrhranjnerathnrepfi',\n",
-        " 'rloanenpnefrrhrruptp',\n",
-        " 'rlrjahapnentafrreois',\n",
-        " 'paoprhndmeeiartnufos',\n",
-        " 'rorejaepneanfrrhesop',\n",
-        " 'flonprnpnerrpherutid',\n",
-        " 'rloneaepnehafrrruaep',\n",
-        " 'foapianpnsrotrehlihi',\n",
-        " 'foapirnpnsroprehlihd',\n",
-        " 'flrliinpntioeherhorr',\n",
-        " 'flrohatpnthatwerhesi',\n",
-        " 'rlrohaepnthafrrrhesp',\n",
-        " 'rahnhaepmerafrrnlnsp',\n",
-        " 'rlrhnaepntaofrrrhsep',\n",
-        " 'rlrsoaepntnhfrrrheep',\n",
-        " 'raaoraepmsenfrrnnunp',\n",
-        " 'raonnrapsroretrnaene',\n",
-        " 'raiuaanpselfmrrnripn',\n",
-        " 'faieoeppseaearenreus',\n",
-        " 'faraoeppspeearendnus',\n",
-        " 'falaninpsitrorenoitr',\n",
-        " 'fatnrirpswrtopenonhh',\n",
-        " 'paerhomdstneantnvnle',\n",
-        " 'gantahrjseierannaenp',\n",
-        " 'raetlalpsniifnrnreop',\n",
-        " 'raetlanpsniifrrnreop',\n",
-        " 'faoirhapsaenemenernl',\n",
-        " 'raoeaanpshrfmrrneppn',\n",
-        " 'ranalalpsrfntirntpri',\n",
-        " 'fanpaoepsrrserentilu',\n",
-        " 'fanuirlpsrlopnentird',\n",
-        " 'faatonrpsmierienneun',\n",
-        " 'pallinpdsnioretnrort',\n",
-        " 'paltropdsnwthetnrohe',\n",
-        " 'galnaohjsnrtrrnnrtia',\n",
-        " 'paaoinedsmhorftnnern',\n",
-        " 'fnonisrpnssonpeancre',\n",
-        " 'ranotaapsreiefrnnuen',\n",
-        " 'famriaopsnnothensnri',\n",
-        " 'famriropsnnopsensnrd',\n",
-        " 'pnnsiopdnsoohetacrre',\n",
-        " 'ratalrnptositnrirnoh',\n",
-        " 'ealktvanttgovseihjro',\n",
-        " 'gaoharajtrrnelniapee',\n",
-        " 'gaorahfjtrenrtniaeep',\n",
-        " 'raooathptreeuariaunr',\n",
-        " 'raorrhtptrntanrianhs',\n",
-        " 'faoatolpteeuaeeiunre',\n",
-        " 'failnraptoirtleironh',\n",
-        " 'raonhanpterafrriutsp',\n",
-        " 'rarojaaptennsfriehol',\n",
-        " 'raolnanptenrfhriurtp',\n",
-        " 'failthoptonheneirral',\n",
-        " 'faionoiptosarneirnis',\n",
-        " 'faorrasptenilceiunoe',\n",
-        " 'fatlvnnptwivnseioooa',\n",
-        " 'gaaavlajtenvcfnineoe',\n",
-        " 'ralnahnptirfasrionps',\n",
-        " 'falmireptinonseiosrn',\n",
-        " 'gaahhlajtearnfninspr',\n",
-        " 'ranoafrpteeedariaunc',\n",
-        " 'ranrnnapteehofriaeae',\n",
-        " 'ranonfcptrrtdhritsnc',\n",
-        " 'raeooasptarelcrisaue',\n",
-        " 'raeoeroptarsehrisaoe',\n",
-        " 'raoenuvptnnohurihrec',\n",
-        " 'raoeluvptnnihurihroc',\n",
-        " 'galavlajtnmvcfnirnoe',\n",
-        " 'raahnanptmaofrrinsep',\n",
-        " 'ganorctjthrehwniaaeo',\n",
-        " 'fanroanpthiesreiaoul',\n",
-        " 'ganhhnajtrarrfninspt',\n",
-        " 'ranhaoyptrafherinspe',\n",
-        " 'fahattmptacwuneiseor',\n",
-        " 'gahehfhjtarrtonisepo',\n",
-        " 'gahehlajtarrnfnisepr',\n",
-        " 'fanlnifptnisoteiaocr',\n",
-        " 'faamriaptsnnoceinsnr',\n",
-        " 'raalnripftnhtorpirah',\n",
-        " 'ghanrtajrtheonnpiaer',\n",
-        " 'raahnylpftaoenrpisen',\n",
-        " 'raarnyopftnoenrpinen',\n",
-        " 'gharaaajrtnsmfnpinnn',\n",
-        " 'raaraoypftnsserpinnn',\n",
-        " 'ghtanaojromntnnprnai',\n",
-        " 'ghrosefjraoyttnpfgdt',\n",
-        " 'ghrraocjraamdhnpflns',\n",
-        " 'oykrtcsgegaiatfnjfel',\n",
-        " 'ekhrtulngraiheejpfec',\n",
-        " 'rarstolpfpyuherpdere',\n",
-        " 'fryltolppeiuaeednore',\n",
-        " 'ghaatoojrnfsdrnpepys',\n",
-        " 'gharooojrnerdrnpeeas',\n",
-        " 'raaoithpfeeeuarpnurr',\n",
-        " 'raafontpfesrturpnrsn',\n",
-        " 'frlanirppisroaedoltr',\n",
-        " 'friintnppooruhedhrtr',\n",
-        " 'raeirolpfaeeherpsree',\n",
-        " 'frawkrrppmogvnednajv',\n",
-        " 'ghonavhjrnrtuonphtir',\n",
-        " 'frloiroppnnaeaedrhae',\n",
-        " 'raankrspfmaghtrpnije',\n",
-        " 'frosanappsnenmedneea',\n",
-        " 'rahrinopfaeeoorpsere',\n",
-        " 'frsyoteppnesugedennr',\n",
-        " 'raeniaepfsrotarpothi',\n",
-        " 'granoahjethrsrneiaal',\n",
-        " 'fiihrhepoeaeeaerrsel',\n",
-        " 'roeseooperytonrupevg',\n",
-        " 'roeaathperfeuaruppnr',\n",
-        " 'grtaooujehsrdhnernas',\n",
-        " 'roaaeoopeferonrupnpg',\n",
-        " 'rraaesopefnrmhrepepn',\n",
-        " 'rraeesspefarmnrepspn',\n",
-        " 'roaliyfpefneetruprrn',\n",
-        " 'roaaionpefmeohrupnrg',\n",
-        " 'fopalrrpersneheuinre',\n",
-        " 'frainsopeneomaeeeren',\n",
-        " 'roaaranpeefvterunpvi',\n",
-        " 'filanvspoieevyeronao',\n",
-        " 'fileoonpoindoherorsg',\n",
-        " 'roatsecpenrrteruevht',\n",
-        " 'roahalrpeeafnprunspr',\n",
-        " 'foahroopeeaidoeunsos',\n",
-        " 'roahlaipeeanthrunsri',\n",
-        " 'roeaasapeatemirusinn',\n",
-        " 'finaltnportiuhertior',\n",
-        " 'finalthportiuaertior',\n",
-        " 'roeaaswpeatemfrusinn',\n",
-        " 'etravehnuvtuhrervirk',\n",
-        " 'greavlrjeatutanesirh',\n",
-        " 'rrejaorpeanfnpresoph',\n",
-        " 'rresserpeamnfpresntd',\n",
-        " 'fonsetopermgooeutnhd',\n",
-        " 'fiotdeopohuotnererot',\n",
-        " 'fintdkfporuogtertroj',\n",
-        " 'roeaavtpeaeturrusnir',\n",
-        " 'rolaaatpenftmrrurpin',\n",
-        " 'grohtaajenrotnnehpri',\n",
-        " 'rooataepenfisnruhpel',\n",
-        " 'fiargfipompjteerndnr',\n",
-        " 'fiargvapompjvierndno',\n",
-        " 'rolahsepenfaytrurpsd',\n",
-        " 'rolasaapenfnterurpei',\n",
-        " 'rolasrhpenfnterurpeh',\n",
-        " 'filrsroponpntserrdeh',\n",
-        " 'filinrnponorpherrhtd',\n",
-        " 'rolesatpennntarurrei',\n",
-        " 'ronoaafperrtetrunain',\n",
-        " 'fonrraeperipmseunodn',\n",
-        " 'fonrnrhperirpaeunotd',\n",
-        " 'fonrharperiateeunosi',\n",
-        " 'ronnstrperhcaprunaei',\n",
-        " 'rosaorfpenfgtsruepfh',\n",
-        " 'fonarropeetneaeusine',\n",
-        " 'finarrhpoetneeersine',\n",
-        " 'ronantipeetsuirusicr',\n",
-        " 'gaattirjntotoaneirsr',\n",
-        " 'raajvaepetnostrniool',\n",
-        " 'flaplerpitrntveoiirt',\n",
-        " 'faareoopntvaeaeeiveu',\n",
-        " 'raaveftpntoutsreiolo',\n",
-        " 'rlatroopithionroiatg',\n",
-        " 'faavetopetoluaenioor',\n",
-        " 'raannalpethofnrniaep',\n",
-        " 'raannanpetrofhrninep',\n",
-        " 'faanrofpetrieteninou',\n",
-        " 'rlahoelpitartnroisat',\n",
-        " 'faahgtepetajugenisnr',\n",
-        " 'gaahehfjntarrtneisep',\n",
-        " 'rlahnanpitarfrroistp',\n",
-        " 'rlahiyepitahearoisin',\n",
-        " 'rlahiylpitahenroisin',\n",
-        " 'rlariyopitnhenroinin',\n",
-        " 'faahntopetatuaenisnr',\n",
-        " 'ftahnrspwtattleoisnh',\n",
-        " 'rlarsetpitnntaroinet',\n",
-        " 'flaarimpitsnoneoinnr',\n",
-        " 'gaannhajeterrfnnisnp',\n",
-        " 'raartsopnfpsmhrepdyn',\n",
-        " 'farrntopepatuaendlnr',\n",
-        " 'farnonrpepeehiendaua',\n",
-        " 'farnroopephieoendaou',\n",
-        " 'raahinopefaeoornpsre',\n",
-        " 'raaaotfpefieitrnpeue',\n",
-        " 'flrnriepipenoneodsnr',\n",
-        " 'rlannaapifenmtropsan',\n",
-        " 'faoiesopneeamaeeuren',\n",
-        " 'flienoopionhdoeorras',\n",
-        " 'flinhoopioradoeortss',\n",
-        " 'fliseerpiolstveorlst',\n",
-        " 'fliteoopiohsoneorasg',\n",
-        " 'fliteonpiohsoheorasg',\n",
-        " 'plilhrvdionaeutorrse',\n",
-        " 'favhhtopevekuaenosgr',\n",
-        " 'plavdrvdisveeutologe',\n",
-        " 'flrvtoopitvcdoeohoas',\n",
-        " 'flrseorpitledaeohlds',\n",
-        " 'flrseorpitledaeohlds',\n",
-        " 'plavervdisoeeutolode',\n",
-        " 'rlaoanipisnfrerolhpt',\n",
-        " 'flrliefpitnorteohrrp',\n",
-        " 'pthafnhdwemdratolncn',\n",
-        " 'planervdishgeutolahe',\n",
-        " 'ftrhnaipwtartoeohsni',\n",
-        " 'rlrsalrpitnfnprohepr',\n",
-        " 'faatctopesieuaennehr',\n",
-        " 'ftnronfpwnphsteoadec',\n",
-        " 'flnierhpinoreaeoarpe',\n",
-        " 'paaeuivdesaloutnnsir',\n",
-        " 'raalofrpesnsdprnnrnc',\n",
-        " 'flaadoopismedoeonngs',\n",
-        " 'flamrrnpisnipreonsod',\n",
-        " 'ftamrropwsnnpseonsnd',\n",
-        " 'ftardkapwsnogmeonnoj',\n",
-        " 'ftnndkopwnsogneoacoj',\n",
-        " 'rletaropishtiorooait',\n",
-        " 'flemrropisnipoeoosod',\n",
-        " 'grianeajtesrgfnhrnnh',\n",
-        " 'rajtvsvpsnivcurloeoe',\n",
-        " 'frpjoonptrndohehiosg',\n",
-        " 'prpraordteissvthfoln',\n",
-        " 'prinhovdtoraeuthrnsu',\n",
-        " 'rrlranoptiatarrhofii',\n",
-        " 'palrnrvdsithtutlowah',\n",
-        " 'raianhrpsofraprlhpts',\n",
-        " 'rrorarrpthatvnrhefiv',\n",
-        " 'fveeaoopvareeaeospnu',\n",
-        " 'ranhaovpsrateurltsiu',\n",
-        " 'fhafyoipeeseneelernh',\n",
-        " 'rrhfaiuptetiehrhlrhr',\n",
-        " 'rrvdapoptvoceorhooef',\n",
-        " 'prvgovgdtvheuftholur',\n",
-        " 'frvgsaeptvhrcaeholhe',\n",
-        " 'rhahirepesaiptrllsed',\n",
-        " 'rrlajaoptntnfnrhriop',\n",
-        " 'faoaponpsntrerelhiiu',\n",
-        " 'grlthaojtnortnnhrrpi',\n",
-        " 'rrliaatptneflnrhrrpe',\n",
-        " 'rhliatnpenefhhrlrrpa',\n",
-        " 'rrlaaotptnftsrrhrpin',\n",
-        " 'gaoherfjsnrrptnlhped',\n",
-        " 'frlrlhlptnpireehrdop',\n",
-        " 'raoaahepsnfeehrlhpns',\n",
-        " 'fharwanpemposhelndal',\n",
-        " 'raoanaipsnfrtorlhpti',\n",
-        " 'rhaanhrpemfraprlnpns',\n",
-        " 'faormropespnnneendsn',\n",
-        " 'rrlahhfptnfaesrhrpsl',\n",
-        " 'rrlasaoptnfntsrhrpei',\n",
-        " 'fharshepempnraelndep',\n",
-        " 'fhaphsrpemdrmnelntpn',\n",
-        " 'fhaproipemrpneelnidh',\n",
-        " 'prlrlfadtntidlthrwoc',\n",
-        " 'frliatfptnotwtehrhio',\n",
-        " 'frlirdfptnopetehrhdg',\n",
-        " 'frlitrnptnowphehrhod',\n",
-        " 'frlwvyaptnovdcehraoo',\n",
-        " 'rrlnauaptnhtlfrhraii',\n",
-        " 'rhansaapemrnftrlnnep',\n",
-        " 'frlhorgptnaephehrsud',\n",
-        " 'fhahscepemayaaelnsdl',\n",
-        " 'rhasathpemntaorlneii',\n",
-        " 'rhnhaarperafmprlnspn',\n",
-        " 'rraoataptsrtnnrhnair',\n",
-        " 'fratornptswhprehnoed',\n",
-        " 'faaneoopssrreaelntpu',\n",
-        " 'fraoraiptshntoehneni',\n",
-        " 'fhaanaspesmrerelnnne',\n",
-        " 'fhaarrhpesmnprelnnnd',\n",
-        " 'frnplaopterissehsiol',\n",
-        " 'frnrhfopteiesoehsolr',\n",
-        " 'frnratrpteisnhehsolr',\n",
-        " 'raaohaapmtracnrniase',\n",
-        " 'gaaoradjmtrnsenniann',\n",
-        " 'goaeorojntareanhisae',\n",
-        " 'foaeeoopntaaeaehiseu',\n",
-        " 'foaeuaipntaleoehisin',\n",
-        " 'raasoalpmtoefnrnirup',\n",
-        " 'glasntajntoewfnrirto',\n",
-        " 'raasaeopmtoatornircv',\n",
-        " 'gohieaajnreanfnhpree',\n",
-        " 'rlaiuarpnfelearrprin',\n",
-        " 'gohraocjnramdhnhpfns',\n",
-        " 'glhraosjnramdtnrpfns',\n",
-        " 'gohassujnrfyrhnhppeh',\n",
-        " 'rlarshtpnfpyerrrpdel',\n",
-        " 'gohytuvjnreohunhpndc',\n",
-        " 'roakfrfpnfgttsrhpjuh',\n",
-        " 'flrkrolpnpgeaeerdjee',\n",
-        " 'gohyahfjnrenetnhpnes',\n",
-        " 'rlakserpnfgrtvrrpjht',\n",
-        " 'faronvlpmpotvcendgno',\n",
-        " 'roaoooipsfosrnrnpgns',\n",
-        " 'flrraropnpaaeaerdlce',\n",
-        " 'rlaninrpnfreoarrptre',\n",
-        " 'rlanrnopnfratdrrptln',\n",
-        " 'rlansorpnfroeprrptru',\n",
-        " 'farosiopmphoooenderr',\n",
-        " 'farlahepmposraendsnp',\n",
-        " 'flrnriypnphioeerdaoh',\n",
-        " 'flrhnropnpateaerdsne',\n",
-        " 'farrshdpmpnneeendnel',\n",
-        " 'fliihrhpnoeaeeerrrse',\n",
-        " 'floposfpnerdyteruise',\n",
-        " 'pafnrofdmdrtettncnwu',\n",
-        " 'plinurvdnohleutrraie',\n",
-        " 'rlosnerpneoetprrurtv',\n",
-        " 'faisafopmooasoenrrcr',\n",
-        " 'flrohirpnthaoperhesr',\n",
-        " 'plrohivdnthaoutrhesr',\n",
-        " 'fahnhtipmeraioenlnse',\n",
-        " 'fahnhirpmeraopenlnsr',\n",
-        " 'flrhrorpntaieperhsou',\n",
-        " 'plrsoivdntnhoutrheer',\n",
-        " 'fahsnirpmenropenlenr',\n",
-        " 'fahnsirpmeaoopenlirr',\n",
-        " 'foniniapsnesolenarcr',\n",
-        " 'fanpalfpmnrtitenaiio',\n",
-        " 'paairovdmsoneutnnrnu',\n",
-        " 'paafroadmsdneetnncnu',\n",
-        " 'flaitirpnsohopernhar',\n",
-        " 'raonnrapsroretrnaene',\n",
-        " 'faesltopsryiuaenpeor',\n",
-        " 'faraltopspeiuaendnor',\n",
-        " 'fnponsopnresmseaiucn',\n",
-        " 'fneisaapnuontmealrei',\n",
-        " 'fatiatnpswemneenornr',\n",
-        " 'gaaetctjsntiasnnevel',\n",
-        " 'faoirirpshenotenernr',\n",
-        " 'faneoogpsrreafentpue',\n",
-        " 'ranalrapsrfnpcrntprd',\n",
-        " 'faoooynpshadereneesn',\n",
-        " 'pallrhpdsnitirtnrohi',\n",
-        " 'faodoynpssederenngsn',\n",
-        " 'rnaovirpnmsviprannoe',\n",
-        " 'faorrrapssnipmennnod',\n",
-        " 'faorrrmpssnipnennnod',\n",
-        " 'ranaaajpsrfetnrnnpni',\n",
-        " 'panfgrddsrdjtetnncnh',\n",
-        " 'famriaopsnnothensnri',\n",
-        " 'fnnilrfpnsoipteacrod',\n",
-        " 'fnstokmpnocdgnearasj',\n",
-        " 'gaohsaojtrrlerniapln',\n",
-        " 'raonnafptrsnctriacae',\n",
-        " 'raonhvopterauoriutsr',\n",
-        " 'garortajtenpufniehrr',\n",
-        " 'raolnanptenrfhriurtp',\n",
-        " 'raauafrptelntvrinieo',\n",
-        " 'gaaeelsjtntttmnievth',\n",
-        " 'falaverptinveeeioeod',\n",
-        " 'ralnahnptirfasrionps',\n",
-        " 'gaanrrfjtnhepdnieaer',\n",
-        " 'raanohfptereadrinnus',\n",
-        " 'faeiltoptnoiureirror',\n",
-        " 'raeonftptartdsrissnc',\n",
-        " 'gaeororjtareaanisaee',\n",
-        " 'ranhusfptrahndritsct',\n",
-        " 'ranhusfptrahndritsct',\n",
-        " 'ranhusiptrahnhritsct',\n",
-        " 'raaaskaptmfngnrinpej',\n",
-        " 'raaieflptmostnrinhoo',\n",
-        " 'ranhaoyptrafherinspe',\n",
-        " 'fahattmptacwuneiseor',\n",
-        " 'faratsnptncwmseineon',\n",
-        " 'ranaotfptsfgntricpfr',\n",
-        " 'faroparptnerseeinuin',\n",
-        " 'rahiknoptahgrorisijt',\n",
-        " 'rahionoptahorerisigt',\n",
-        " 'raalreyptsinterinonv',\n",
-        " 'raaaotfpftmgntrpinfr',\n",
-        " 'ghaheotjrtaroanpiseg',\n",
-        " 'ghrosefjraoyttnpfgdt',\n",
-        " 'ghrysorjraeyrnnpfnds',\n",
-        " 'fryltolppeiuaeednore',\n",
-        " 'friintnppooruhedhrtr',\n",
-        " 'frnaplkpprsrngedtnir',\n",
-        " 'ghorreajrnaeatnphfes',\n",
-        " 'raliyrdpfnoevorprhnv',\n",
-        " 'ghlnavtjrnrturnprtir',\n",
-        " 'frloknippnngsoedrhjc',\n",
-        " 'frarilrppmnoiaednnro',\n",
-        " 'frahiltppmaoiuednsro',\n",
-        " 'frarilsppmnoimednnro',\n",
-        " 'frarilsppmnoimednnro',\n",
-        " 'frsninsppnsoamedtcri',\n",
-        " 'ranhrhrpfratehrpnshl',\n",
-        " 'frhonrrppaerieedsuno',\n",
-        " 'frhrkaippangmoedsnjn',\n",
-        " 'grtvealjeovattnerosi',\n",
-        " 'rrejahtpernfaurepops',\n",
-        " 'poprhredeeiaeatufose',\n",
-        " 'pipaaoedoesmeatrfnnu',\n",
-        " 'rraoltrpeneeapreeusi',\n",
-        " 'foaigsrpeeofyaeunrtd',\n",
-        " 'pftterrddwulevtcoroe',\n",
-        " 'foafrripeesanoeunrln',\n",
-        " 'foahroopeeaidoeunsos',\n",
-        " 'roeaasapeatemirusinn',\n",
-        " 'finaltnportiuhertior',\n",
-        " 'greavlsjeatutmnesirh',\n",
-        " 'roeotcspeadsemrussyt',\n",
-        " 'fonsetopermgooeutnhd',\n",
-        " 'rrevkdopeaugtrresrjo',\n",
-        " 'grohtsojenroyonehprd',\n",
-        " 'frlrrolpenppeeeerdru',\n",
-        " 'filrthsponphenerrdal',\n",
-        " 'roaasarpemfntnrunpei',\n",
-        " 'filinrnponorpherrhtd',\n",
-        " 'fonrharperiateeunosi',\n",
-        " 'fomrstopeninuseusoer',\n",
-        " 'pirnfoldonsdhetrncce',\n",
-        " 'ronaenopeefrrorusppt',\n",
-        " 'raajafapetnftnrniopr',\n",
-        " 'raajaafpetnfstrniopl',\n",
-        " 'raanntapetroosrniner',\n",
-        " 'rlahtrupitaothroisrh',\n",
-        " 'faahgtepetajugenisnr',\n",
-        " 'rlahnanpitarfrroistp',\n",
-        " 'gaahgovjetahounnislg',\n",
-        " 'gaahgotjetahoannislg',\n",
-        " 'rlaraeypitnsteroinnv',\n",
-        " 'flaarimpitsnoneoinnr',\n",
-        " 'ftashaopwtnemgeoieln',\n",
-        " 'raaejaspnfrnemreppon',\n",
-        " 'raaretrpefphuarnpdkr',\n",
-        " 'farnrorpeprieaendnou',\n",
-        " 'farnrltpephiiuendaoo',\n",
-        " 'flrnirrpipeoneeodsrn',\n",
-        " 'flienorpionrdaeorrns',\n",
-        " 'farrinipneveooeeevre',\n",
-        " 'flinhoopioradoeortss',\n",
-        " 'plapprrdiserevtolfie',\n",
-        " 'flahagrpisatheeolsil',\n",
-        " 'flrhifapitaosneohsrr',\n",
-        " 'flrsrlipitnpnoeohedr',\n",
-        " 'gaaorocjesrnoannnans',\n",
-        " 'flarpropispdeoeonrte',\n",
-        " 'rlariyspisnheyronnin',\n",
-        " 'rleerucpistpheroovdc',\n",
-        " 'flenrrypisaipeeooiod',\n",
-        " 'fapjrrrpsrnehaelioee',\n",
-        " 'frlrahoptitnenehowes',\n",
-        " 'raaloofpseidrtrlnosa',\n",
-        " 'fhtfhcopewteeoelorsi',\n",
-        " 'frlfhnhptitearehorsi',\n",
-        " 'palfacfdsiteedtlorei',\n",
-        " 'frhfodsptesoemehlrgg',\n",
-        " 'prhttaedtewuisthlorh',\n",
-        " 'rrhfaiuptetiehrhlrhr',\n",
-        " 'rrvitaaptvhicnrhoiee',\n",
-        " 'prviroadtvhienthoiou',\n",
-        " 'frvgnhaptvhoeneholes',\n",
-        " 'fhvnecrpevssanelocsl',\n",
-        " 'phvnstidevslaotlocli',\n",
-        " 'paahnuadesarrmtelsii',\n",
-        " 'gaohaatjsnrtmvnlhpin',\n",
-        " 'grlhtrojtnroprnhrprd',\n",
-        " 'grlhtutjtnrirrnhrpei',\n",
-        " 'rrlailvptnfeivrhrpro',\n",
-        " 'faorphrpsnpreeelhdil',\n",
-        " 'faoropnpsnperrelhdui',\n",
-        " 'faormropespnnneendsn',\n",
-        " 'rhaansrpemfrnprlnpne',\n",
-        " 'fharnsapemprneelndne',\n",
-        " 'rhaahanpemfatrrlnpsi',\n",
-        " 'fharhhapemparnelndsp',\n",
-        " 'frlrsaiptnpneoehrdee',\n",
-        " 'rhaashlpemfnenrlnpes',\n",
-        " 'rrlfksdptnpgmorhrejn',\n",
-        " 'frlprosptnrpsmehridn',\n",
-        " 'prlpisodtneonethrfre',\n",
-        " 'frlpvdnptnrvotehrioo',\n",
-        " 'rrliahiptnotahrhrhis',\n",
-        " 'frlwvyaptnovdcehraoo',\n",
-        " 'rhansaapemrnftrlnnep',\n",
-        " 'pharesidemnfnotlnnde',\n",
-        " 'rrlhofoptnaepdrhrsue',\n",
-        " 'fhahiptpemaoduelnsrt',\n",
-        " 'grlsattjtnntahnhreii',\n",
-        " 'grlsattjtnntahnhreii',\n",
-        " 'frneofoptrgetdehnhur',\n",
-        " 'fhnhraiperapmoelnsdn',\n",
-        " 'pratiahdtswosithnohl',\n",
-        " 'fratornptswhprehnoed',\n",
-        " 'rraoealptshrfnrhnepp',\n",
-        " 'rhaaniupesmrerrlnnnr',\n",
-        " 'fhaanaspesmrerelnnne',\n",
-        " 'roajanfpntnsrtrhiolt',\n",
-        " 'goanlfojntentanhirro',\n",
-        " 'glanohnjntrrrhnritap',\n",
-        " 'rlanoonpntrrehrritau',\n",
-        " 'flaorevpnthtnveriewe',\n",
-        " 'faaoranpmthtlneniewe',\n",
-        " 'rlanuvrpntrluarritir',\n",
-        " 'rlahaaopntafmhrrispn',\n",
-        " 'gohrystjnraeyunhpfnd',\n",
-        " 'glhryssjnraeymnrpfnd',\n",
-        " 'elkatoenngfirgerjpes',\n",
-        " 'gohyfuvjnreshunhpnrc',\n",
-        " 'faronnapmpohteendgan',\n",
-        " 'forynhepsperatendnns',\n",
-        " 'flrrpnhpnperoaerdeie',\n",
-        " 'roaeinepnfaeonrhpsre',\n",
-        " 'rlannyrpnfhoehrrpaen',\n",
-        " 'fornohfpspsgltendcfc',\n",
-        " 'glroanejnerthgnreaia',\n",
-        " 'gothrsrjnurayenhrpfd',\n",
-        " 'ploprhrdneeiaetrufos',\n",
-        " 'faopohspmerdomenuiso',\n",
-        " 'failftrpmoisuaenrorr',\n",
-        " 'faieerlpmolsanenrosl',\n",
-        " 'fainuorpmorldaenrnis',\n",
-        " 'foisrropsooaeoenrrte',\n",
-        " 'plisaafdnooaedtrrrcn',\n",
-        " 'fahinyopmeordrenlrno',\n",
-        " 'fahnhirpmeraopenlnsr',\n",
-        " 'foairoypssondeennrns',\n",
-        " 'roamrsfpssnnytrnnsnd',\n",
-        " 'faerylipsaheioenseno',\n",
-        " 'faaihnypsmoendennrla',\n",
-        " 'faaoiropsmhonoennern',\n",
-        " 'raarnaspsmnofyrnnnep',\n",
-        " 'ranaaajpsrfetnrnnpni',\n",
-        " 'pnnftsndnsdwmttaccon',\n",
-        " 'pnnhtsndnslamttaccin',\n",
-        " 'fnstorypnoceheearaue',\n",
-        " 'gaorasgjtrenmhniaeen',\n",
-        " 'raonhvopterauoriutsr',\n",
-        " 'garnuecjtehhtanieacv',\n",
-        " 'faeiltoptnoiureirror',\n",
-        " 'gaeororjtareaanisaee',\n",
-        " 'ranhusfptrahndritsct',\n",
-        " 'faloceeptnsaaseirnle',\n",
-        " 'raheltaptatiuiristor',\n",
-        " 'rahelfrptatidnristoc',\n",
-        " 'raaalonpftmiohrpinog',\n",
-        " 'raahnylpftaoenrpisen',\n",
-        " 'raahnoapftaoomrpiseg',\n",
-        " 'raaoisrpfeeemnrpnurn',\n",
-        " 'friintrppooruvedhrtr',\n",
-        " 'frahiltppmaoiuednsro',\n",
-        " 'frahiltppmaoiuednsro',\n",
-        " 'frarilsppmnoimednnro',\n",
-        " 'frsninsppnsoamedtcri',\n",
-        " 'frhonrrppaerieedsuno',\n",
-        " 'fiirohrpoeneaeerrnus',\n",
-        " 'roaliyrpefneevruprrn',\n",
-        " 'foadyhepeloeraeueonp',\n",
-        " 'foeaasepeatemgeusinn',\n",
-        " 'foeaastpeatemceusinn',\n",
-        " 'rreavespeatuhmresirk',\n",
-        " 'fonprlsperrpnmeutidr',\n",
-        " 'filrtovponphsverrdan',\n",
-        " 'gaantcrjetevasnniaul',\n",
-        " 'rlanvrapitruanroitrl',\n",
-        " 'raarvylpntvueireivrn',\n",
-        " 'raanntapetroosrniner',\n",
-        " 'gaahoaujetagernnisfe',\n",
-        " 'rlahiylpitahenroisin',\n",
-        " 'ftashnapwtnenmeoiela',\n",
-        " 'rlaneynpitatehroiivn',\n",
-        " 'raaejyfpnfrnetreppon',\n",
-        " 'farnrlspepriimendnoo',\n",
-        " 'flientrpionhuheorrar',\n",
-        " 'flaahcnpistaaseolisl',\n",
-        " 'gaavttajesvaiennloie',\n",
-        " 'flareoepispndaeonres',\n",
-        " 'fapjrrrpsrnehaelioee',\n",
-        " 'rrlailvptnfeivrhrpro',\n",
-        " 'rrlaponptnfdrtrhrpts',\n",
-        " 'faorgropsnpjeaelhdne',\n",
-        " 'fharroapemppnselndrh',\n",
-        " 'rhaansrpemfrnprlnpne',\n",
-        " 'rhaahanpemfatrrlnpsi',\n",
-        " 'fhaphthpemdruaelntpr',\n",
-        " 'prlhrofdtnaisdthrson',\n",
-        " 'phahfnedemadrgtlnscn',\n",
-        " 'paorafndesnsdstennnc',\n",
-        " 'ransreopshnetdrlatev',\n",
-        " 'frneofoptrgetdehnhur',\n",
-        " 'fhnaorepenmapselaned',\n",
-        " 'rhaaniupesmrerrlnnnr',\n",
-        " 'rhnraudpeenmrorlsnni',\n",
-        " 'rlanoonpntrrehrritau',\n",
-        " 'rlanoonpntrrehrritau',\n",
-        " 'foanpospntrrelehitiu',\n",
-        " 'rlanuvrpntrluarritir',\n",
-        " 'roakfrfpnfgttsrhpjuh',\n",
-        " 'gohyfuvjnreshunhpnrc',\n",
-        " 'gohyahfjnrenetnhpnes',\n",
-        " 'gohyahfjnrenetnhpnes',\n",
-        " 'forynhepsperatendnns',\n",
-        " 'farrlnopmpacooendlee',\n",
-        " 'farlahepmposraendsnp',\n",
-        " 'glroanejnerthgnreaia',\n",
-        " 'rooaeeapnefarerhupsp',\n",
-        " 'gotnfecjnuedranhrrcp',\n",
-        " 'flinurrpnohleherraie',\n",
-        " 'fairoffpmonestenrnur',\n",
-        " 'flohdydpneaoeeeruson',\n",
-        " 'ponfnradsndspstnaccr',\n",
-        " 'roamrsfpssnnytrnnsnd',\n",
-        " 'roamrsfpssnnytrnnsnd',\n",
-        " 'faeryltpsaheiwenseno',\n",
-        " 'fartdrypsnneedennrge',\n",
-        " 'fartdonpsnnedsennrgs',\n",
-        " 'fnstorypnoceheearaue',\n",
-        " 'raalfhspteidcmrinoch',\n",
-        " 'gaanrfijtnheponieaee',\n",
-        " 'fanhusiptrahnoeitsct',\n",
-        " 'frahiltppmaoiuednsro',\n",
-        " 'rahrnnopfaerodrpsene',\n",
-        " 'roaliyrpefneevruprrn',\n",
-        " 'foailsopeeoeyoeunrsd',\n",
-        " 'roeavtspeatusmrusiry',\n",
-        " 'grohosujenrryhnehpad',\n",
-        " 'frlrrolpenppeeeerdru',\n",
-        " 'rooasahpenflmeruhpln',\n",
-        " 'gaanhfejnterttneirpr',\n",
-        " 'raajafapetnftnrniopr',\n",
-        " 'raarvylpntvueireivrn',\n",
-        " 'gartptfjnerdwtneevto',\n",
-        " 'flientrpionhuheorrar',\n",
-        " 'flareoepispndaeonres',\n",
-        " 'fharohepempnlaelndhc',\n",
-        " 'paneoafdshgeedtlahun',\n",
-        " 'rlanoonpntrrehrritau',\n",
-        " 'raarcvapmfpevsrnpdho',\n",
-        " 'rlarnerpnfarrprrplie',\n",
-        " 'flinurrpnohleherraie',\n",
-        " 'fahoroopmeannoenlenh',\n",
-        " 'raallrmpftnianrpirol',\n",
-        " 'rlanvrapitruanroitrl',\n",
-        " 'faonpfcpeeedtaenuatr',\n",
-        " 'raallrmpftnianrpirol']"
-       ]
-      }
-     ],
-     "prompt_number": 39
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[w for w in hinted_keywords if cadenus_decipher(first_chunk, w, keycolumn).startswith('phaseseven')]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 40,
-       "text": [
-        "[]"
-       ]
-      }
-     ],
-     "prompt_number": 40
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "def cadenus_break_worker(message, keyword, keycolumn, fitness):\n",
-      "    message_chunks = chunks(message, 175)\n",
-      "    plaintext = ''.join(cadenus_decipher(c, keyword, keycolumn) for c in message_chunks)\n",
-      "    fit = fitness(plaintext)\n",
-      "    return (keyword, keycolumn), fit"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 41
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "def cadenus_break(message, words=keywords, fitness=Pbigrams):\n",
-      "    c = make_cadenus_keycolumn(reverse=True)\n",
-      "    results = starmap(cadenus_break_worker, [(message, \n",
-      "                                              w, \n",
-      "                                              make_cadenus_keycolumn(doubled_letters='vw', start=s, reverse=r), \n",
-      "                                              fitness)\n",
-      "                               for w in words for s in string.ascii_lowercase for r in [True, False]])\n",
-      "    # return list(results)\n",
-      "    return max(results, key=lambda k: k[1])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 42
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key8b, fitness = cadenus_break(c8bl, words=hinted_keywords, fitness=Ptrigrams)\n",
-      "key8b, fitness"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 43,
-       "text": [
-        "(('finalist',\n",
-        "  {'l': 20,\n",
-        "   'u': 11,\n",
-        "   'p': 16,\n",
-        "   'q': 15,\n",
-        "   'j': 22,\n",
-        "   'm': 19,\n",
-        "   'f': 1,\n",
-        "   'r': 14,\n",
-        "   'b': 5,\n",
-        "   'v': 10,\n",
-        "   'e': 2,\n",
-        "   'x': 9,\n",
-        "   'z': 7,\n",
-        "   'i': 23,\n",
-        "   'k': 21,\n",
-        "   'w': 10,\n",
-        "   'o': 17,\n",
-        "   't': 12,\n",
-        "   'y': 8,\n",
-        "   'a': 6,\n",
-        "   's': 13,\n",
-        "   'c': 4,\n",
-        "   'd': 3,\n",
-        "   'g': 0,\n",
-        "   'h': 24,\n",
-        "   'n': 18}),\n",
-        " -5286.197562931952)"
-       ]
-      }
-     ],
-     "prompt_number": 43
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "cadenus_decipher(first_chunk, key8b[0], key8b[1])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 44,
-       "text": [
-        "'wledgctftrojhrtheonovoresoovrpanegoarerufofinaltnportiuhertiorafthehasdwarenncompleeeandoastestssoveconlrudedtlsreisnntignfrrrthesinaaltranlicthaaehesecisityseemiceshuneanykhf'"
-       ]
-      }
-     ],
-     "prompt_number": 44
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[(w, s, d1+d2, r)\n",
-      " for w in hinted_keywords \n",
-      " for d1 in string.ascii_lowercase[:25]\n",
-      " for d2 in string.ascii_lowercase\n",
-      " for s in string.ascii_lowercase \n",
-      " for r in [True, False]\n",
-      " if d2 > d1\n",
-      " if cadenus_decipher(first_chunk, w, make_cadenus_keycolumn(doubled_letters=d1+d2, start=s, reverse=r)).startswith('phaseseven')]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 45,
-       "text": [
-        "[]"
-       ]
-      }
-     ],
-     "prompt_number": 45
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[(w, s, d1+d2, r, cadenus_decipher(first_chunk, w, make_cadenus_keycolumn(doubled_letters=d1+d2, start=s, reverse=r)))\n",
-      " for w in hinted_keywords \n",
-      " for d1 in string.ascii_lowercase[:25]\n",
-      " for d2 in string.ascii_lowercase\n",
-      " for s in string.ascii_lowercase \n",
-      " for r in [True, False]\n",
-      " if d2 > d1\n",
-      " if cadenus_decipher(first_chunk, w, make_cadenus_keycolumn(doubled_letters=d1+d2, start=s, reverse=r)).startswith('phase')]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 53,
-       "text": [
-        "[('filbert',\n",
-        "  'm',\n",
-        "  'lu',\n",
-        "  False,\n",
-        "  'phasennrkmffnhignsdaaojsrcisrncheentoeetueweisvhsounsucoaleyrhreitdioseotototdhsoagreeysifaglenhtlhonriuelseairscnrteameteiwnntneefefcrartataieposrlandrlvtartalvhctofnorehdpro'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'lm',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'lq',\n",
-        "  True,\n",
-        "  'phaseoeeeesnnufleyehhdoddraccseoeshengoenotthsaeovnlnesgurcrnofriearrtiatttsutacihtracaearaielrmanhhtpnleikhdseaigrtcssejpoemlwnrdinlfoisnfnteofetrourstrnrltrtvnaiwhsvafooeyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'lr',\n",
-        "  True,\n",
-        "  'phaseoeeeeynnufledehhdodoraccseoeshengsenotthnaeovnlresgurcanofrietrrtiatitsutacehtracararaielpmanhhtdnleikhtseaigrocssejpdemlwnrsinlfoifnfnteosetrourrtrnrlthtvnaiwesvafoosyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'lw',\n",
-        "  True,\n",
-        "  'phaseoeeeennnuflerehhdodaraccseteshengienottheaeovnlresgurcpnofriedrrtiatttsutacohtracadaraielsmanhhtfnleikhsseaigrrcssejphemlwnreinlfoisnfnteosetrourytrnrltdtvnaiwosvafoooyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mn',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mo',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mp',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mq',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mr',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'ms',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mt',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mu',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mv',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mw',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mx',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'my',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mz',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'no',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'np',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'nq',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'nr',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'ns',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'nt',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'nu',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'nv',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'nw',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'nx',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'ny',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'nz',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('filleting',\n",
-        "  'm',\n",
-        "  'lu',\n",
-        "  False,\n",
-        "  'phasentekmysrhfgndmnrdjsonnpcncofareoestiiteinreovunrvuruleavhtrittocwiotiohothsenoaaeyrhoeilepagehondsfdisetnteinroeugetedsrhwnesoalfrafrnctiesseeoanrtatrarhrscactealafehslll')]"
-       ]
-      }
-     ],
-     "prompt_number": 53
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[(w, s, d1+chr(ord(d1)+1), r)\n",
-      " for w in hinted_keywords \n",
-      " for d1 in string.ascii_lowercase[:25]\n",
-      " # for d2 in string.ascii_lowercase\n",
-      " for s in string.ascii_lowercase \n",
-      " for r in [True, False]\n",
-      " # if d2 > d1\n",
-      " if cadenus_decipher(first_chunk, w, make_cadenus_keycolumn(doubled_letters=d1+chr(ord(d1)+1), start=s, reverse=r)).startswith('phases')]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 46,
-       "text": [
-        "[]"
-       ]
-      }
-     ],
-     "prompt_number": 46
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "cadenus_decipher(first_chunk, 'filbert', make_cadenus_keycolumn(doubled_letters='lu', start='m', reverse=False))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 52,
-       "text": [
-        "'phasennrkmffnhignsdaaojsrcisrncheentoeetueweisvhsounsucoaleyrhreitdioseotototdhsoagreeysifaglenhtlhonriuelseairscnrteameteiwnntneefefcrartataieposrlandrlvtartalvhctofnorehdpro'"
-       ]
-      }
-     ],
-     "prompt_number": 52
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "chunks(first_chunk, 175)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 48,
-       "text": [
-        "['afcaeuottacthrioletcserthshtrahkyorpfrgeoadppjnglternefeofiortsddoeeumscruernfetlaafstwientrvoonerhuahravereetsvsielhlostdoaloyaesmnndignnrhohhtsnaoilncnssicreanneeiiierwtanes']"
-       ]
-      }
-     ],
-     "prompt_number": 48
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 48
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2014/2014-challenge1.ipynb b/2014/2014-challenge1.ipynb
new file mode 100644 (file)
index 0000000..5dabd2d
--- /dev/null
@@ -0,0 +1,156 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c1a = open('1a.ciphertext').read()\n",
+    "c1b = open('1b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(4, -728.156672407534)"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = caesar_break(c1a)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "MARK, \n",
+      "\n",
+      "THANKS FOR BRINGING ME IN ON THIS ONE, SEEMS LIKE A FASCINATING CASE. \n",
+      "\n",
+      "I HAVE THREE QUESTIONS: \n",
+      "WHY WOULD THE FLAG DAY ASSOCIATES WANT A SHIP? \n",
+      "WHY WOULD THEY WANT THIS SHIP? \n",
+      "WHY WOULD THEY WANT THIS SHIP NOW? \n",
+      "\n",
+      "HAVING READ THE ATTACHED DOCUMENT I SUSPECT THAT THE ANSWERS ARE ALL RELATED TO THE QUESTION OF WHAT EXACTLY SHE AND HER FLAG DAY ASSOCIATE CREW WERE TRYING TO SURVEY. \n",
+      "\n",
+      "I AM GUESSING THAT YOU ALREADY CHECKED OUT THE ONBOARD GPS SYSTEM FOR INFORMATION ABOUT HER MOVEMENTS, BUT IF YOU DID FIND ANYTHING I WOULD BE FASCINATED TO HEAR ABOUT IT. IN THE MEANTIME I AM PRETTY SURE THAT YOU KNOW MORE ABOUT THE FLAG DAY ASSOCIATES THAN YOU HAVE TOLD ME, SO A BRIEFING WOULD BE MUCH APPRECIATED. \n",
+      "\n",
+      "ALL THE BEST, \n",
+      "\n",
+      "HARRY \n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(caesar_decipher(c1a, key_a))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(22, -637.7038880633795)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = caesar_break(c1b)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "report on the trojan project having drugged the crew we were able to take the ship with essentially no resistance the crew were handed to the somali pirates at the deepwater rendezvous as planned and we began the survey just after midnight the radar showed an approaching vessel which our database identified as a coastguard cutter we headed south to avoid detection with all ship lights off we then completed the survey in the new location afterdawn with the listening post installed we began assembling the equipment for phase two of the operation keeping a watch for further patrols in the sky and on the water\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(caesar_decipher(c1b, key_b)))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2014/2014-challenge2.ipynb b/2014/2014-challenge2.ipynb
new file mode 100644 (file)
index 0000000..f891699
--- /dev/null
@@ -0,0 +1,216 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "import pandas as pd\n",
+    "import collections\n",
+    "import string\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c2a = open('2a.ciphertext').read()\n",
+    "c2b = open('2b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f8012c71eb8>"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f8012c71898>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs = pd.Series(english_counts)\n",
+    "freqs.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "((5, 25, True), -761.8388033231918)"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = affine_break(c2a)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "DEAR MARK, \n",
+      "\n",
+      "THANKS FOR THE LATEST REPORT FROM THE ON-SITE TEAM. IT SHOWS THAT THE SHIPBOARD GPS SYSTEM WAS COMPLETELY SCRAMBLED SO WE ARE NOT GOING TO BE ABLE TO TRACE HER MOVEMENTS FROM THAT. DO WE HAVE ANY ODD TRACES FROM ONSHORE RADAR THAT GIVE A HINT OF WHERE SHE MIGHT HAVE BEEN? \n",
+      "\n",
+      "THE COMMENT IN THE LAST MESSAGE THAT THE PIRATES COMPLETED THE SURVEY EVEN THOUGH THEY HAD MOVED SOUTH TO AVOID DETECTION SHOULD HAVE TOLD ME THAT THE SURVEY WAS NOT GEOGRAPHIC. AT FIRST I THOUGHT IT MIGHT HAVE BEEN REFERRING TO A TELECOMS SURVEY SINCE YOU MENTIONED THE LONG AERIAL, BUT ACTUALLY THE ATTACHED MESSAGE IS VERY REVEALING. STILL NOT SURE WHAT THE SURVEY WAS FOR THOUGH, AND HOW THAT IS CONNECTED TO THE MISSING SUPERSTRUCTURE. CAN YOU GET ME ANY PICTURES? \n",
+      "\n",
+      "HARRY \n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(affine_decipher(c2a, key_a[0], key_a[1]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('flag', <KeywordWrapAlphabet.from_largest: 3>), -367.81492429457404)"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = keyword_break_mp(c2b)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "calm weather allowed us to complete the hull survey and establish its integrity no major remedial works were required and the pumps and extra bulkheads were installed out in deep waters over the next five days we are now testing the system for reliability and safety before moving on to phase three of the operation operation trojan remains on target\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(keyword_decipher(c2b, key_b[0], key_b[1])))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f800850a358>"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\nRU5ErkJggg==\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f800b778a58>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_2b = pd.Series(collections.Counter([l.lower() for l in c2b if l in string.ascii_letters]))\n",
+    "freqs_2b.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2014/2014-challenge3.ipynb b/2014/2014-challenge3.ipynb
new file mode 100644 (file)
index 0000000..e959488
--- /dev/null
@@ -0,0 +1,209 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "import pandas as pd\n",
+    "import collections\n",
+    "import string\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c3a = open('3a.ciphertext').read()\n",
+    "c3b = open('3b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f809e4fc208>"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f809e51ea58>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs = pd.Series(english_counts)\n",
+    "freqs.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "((11, 1, True), -839.4977013876568)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = affine_break(c3a)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "harry you asked me about the flag day associates they area transnational hacking group dedicated to the overthrow of western capitalism they have been implicated in several major protests including an attempt to takeover the uk national grid attacks on reservoir systems and interference in bank trading networks it looks like the fda carried out fairly extensive modifications to the ship they did a good job too we hadnt noticed the added bulkheads until we compared the layout with the plans from lloyds register they seem to be there to add rigidity though there is one additional panel at the stern that doesnt fit the pattern and we will be removing that tonight to see what it is there for we would have done it this afternoon but decided we should conduct our own hull survey in case there is a booby trap\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(affine_decipher(sanitise(c3a), key_a[0], key_a[1]))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('seahorse', <KeywordWrapAlphabet.from_last: 2>), -681.3308426043137)"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = keyword_break_mp(c3b)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "phase three the nautilus system was fully tested last night with complete success we sailed within four hundred metres of the target and monitored all radio traffic for two hours with no sign that we were being watched or were even noticed we then conducted a full radar sweep of the area and found three dead spots where we could work on the ship without detection as planned we converted the two adjacent empty containers in the middle of the stack into a large workshop area and carried out a full inspection drill now even if we are boarded our work should remain undetected we retrieved seahorse from the third container and carried out stage one of the assembly\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(keyword_decipher(c3b, key_b[0], key_b[1])))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f809e35e438>"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\nRK5CYII=\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f809e35e4e0>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_3b = pd.Series(collections.Counter([l.lower() for l in c3b if l in string.ascii_letters]))\n",
+    "freqs_3b.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2014/2014-challenge4.ipynb b/2014/2014-challenge4.ipynb
new file mode 100644 (file)
index 0000000..d1f240b
--- /dev/null
@@ -0,0 +1,322 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "import pandas as pd\n",
+    "import collections\n",
+    "import string\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c4a = open('4a.ciphertext').read()\n",
+    "c4b = open('4b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f775bffe668>"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f775bfe5f28>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs = pd.Series(english_counts)\n",
+    "freqs.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'prsaoegerauiadmwehdnisnrasawuaaessrefgdosogvorbeeeaartesctdfmenuibrttlmeytumtmeuaikwhutkwerwahmnpwraeesononesebatoihacineetbrotadaktgfeesyioflttlstiiaeosvieonsrrtaupmnnoaencocnuvrsclvdrgctaiihriciaihrsduomrlemcrngleomarfhiuewhalcsasracufrawwsmehulstoaohceletmtoilsepdmumtptrslyrhhntpanwpmoadppdwbeseoassltmlpesletuncorerlclitaosvsiniifwseafortaaduyenenonnsopfhontwkoertcslyvoeiohlufoeioetsthtsbreneveaouepgieesobduorsfeercdyadutaepeadrdigseebfuoggopogalyfewsoeemdntohrebhaaesneworgnfiaulnlwadueodcotrargvuenewhiertlauilmsoniotmuinewaiuewloerstttisdrsasnussiesmerdhetryrhpnlrtereadmredebnntrnenwmoutrdosaneowomcgidciasaontiioiascesissupcrmoybrineyweelaylewtyrtilhsto'"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c4bs = sanitise(c4b)\n",
+    "c4bs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('stern', <KeywordWrapAlphabet.from_largest: 3>), -830.5838133421847)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = keyword_break_mp(c4a)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "harry we completed the survey and you are not going to believe what we found behind the false bulkhead in the stern there was a large pumping station connected to a number of sea facing outlets it looks like a scuttling valve system similar to the ones used on u boats in world war two icant understand why they would goto so much effort when they could have scuttled her at anytime with a small quantity of plastic explosive the team back at nsa have run some analytics on the remaining text files we extracted from the servers onboard these ciphers are going to be pretty hard to crack the attached report has frequency analysis matching usual english text so we can assume that the sender was a native speaker did you have any thoughts on what the nautilus system might have been or what it was for\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(keyword_decipher(sanitise(c4a), key_a[0], key_a[1]))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(((6, 0, 1, 7, 9, 4, 2, 3, 5, 8, 10), False, True), -1777.161911681522)"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = column_transposition_break_mp(c4bs)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "et et mlpdshgnbralwrrauiur tep as gsl di ocpedacnscbtsesuotut ira la lee a so at dy de og is as tavrtdeiioalkoducrhe hom tein oarscnegigctuimetyfo so rice lite her a aire iue leer dad tom sub rg mihm it yfflvwhetamioucuer to seo e oleh sri cu fig in ddy lea log ten urs site oawioheikttpohsmpps wlsosinrndshstgverll muut has ra erupt it lit smt mck is yn lace trw a bfi awrr pm eere i uunet or oe wfi a gary ws nsw lal dsb aveo smee mlr hive essor yim eee a osmer n no amf nrad hep no do ie re hywsunroffbnwrretttg hn tear po amd in peet gh au out ale air di serna sue eu now nwyopebyegheplnmshew van me on o an aol w own nbae irc mateo de nubs odys a usoe eau pre e on n west ptbnrenlerrdiacswsoa a dwl to foo ea cob hoc erp rr uses in egf st fast hurn hterneoavcfotsaeocrd int cwo a is y at it wwsncauwsdsoseldlkdf mm levu norm ect\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(column_transposition_decipher(sanitise(c4bs), key_b[0], \n",
+    "                                                              fillcolumnwise=key_b[1], \n",
+    "                                                              emptycolumnwise=key_b[2])))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(((4, 8, 0, 6, 9, 3, 1, 2, 5, 7, 10), False, True), -2823.7851213306785)"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = column_transposition_break_mp(c4bs, fitness=Ptrigrams)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "te tmpl dsehgbralrwranuirtep sag sul doc pea dc nisc tses out ub tial a lee as road yd egoist as avr ted ii to ako durch el hote in a or smc n gig cut i meet fo soir cey lie her a air te ie leed radu to sub rmg ihmmiyfflwvhettaiouc eur tmo so eol hes re ic fig id nd yule log tn eur ass teoa iwohieittposhmpkpsl so snirnwdsstgvrellhmut has are ru up it list mttmcisynalcektrabfi war rwp mere iuu nee too ew fai garry sns wall dwsbveosememalrivees so rhy ieee a some mr no am frn adn he no do eire phys un rf of bwnwrettgthnrterpo admin a petg hao uu tea laird sie renau eeuonwnswypebygeheo plm she vw ann me no a no al woo wnba eric mn a to den bus oed yau so eea us pre on new step tn rene lrrbdicswsaoadawl of ooaecotbhcerprrusoes neg ft sfa is turn he trn he ovc fost aea ord inc two cas ya ttiw wisc au wds sons ldlkfdmmelvunomrecet\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(column_transposition_decipher(sanitise(c4bs), key_b[0], \n",
+    "                                                              fillcolumnwise=key_b[1], \n",
+    "                                                              emptycolumnwise=key_b[2])))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f773db9db70>"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f773daa0400>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_4b = pd.Series(collections.Counter([l.lower() for l in c4b if l in string.ascii_letters]))\n",
+    "freqs_4b.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(5, -1581.9784460662272)"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "railfence_break(c4bs)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'phase four the decks were cleared by two am and the mounting plates were prepared and measured mounting points were assembled by four am though owing to the approaching dawn deployment of seabird was postponed and we embarked onstage two of seahorse assembly with camouflage plates installed we set to cruising in case of air or sea surveillance following standard routes to avoid suspicion monitoring of airwaves gave no cause for concern but we have raised security levels and are using a column transposition cipher for this communication with keyword seabird future comms will relyon even more security tonight will be used for more sea trials of the nautilus system while the assembly crew rest and the survey team carryout further mapping we will resume the seahorse build at dusk tomorrow'"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(railfence_decipher(c4bs, 5)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2014/2014-challenge5.ipynb b/2014/2014-challenge5.ipynb
new file mode 100644 (file)
index 0000000..9ab0764
--- /dev/null
@@ -0,0 +1,302 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "import pandas as pd\n",
+    "import collections\n",
+    "import string\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c5a = open('5a.ciphertext').read()\n",
+    "c5b = open('5b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7efd70cf76d8>"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7efd70cdef98>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs = pd.Series(english_counts)\n",
+    "freqs.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'sssatanuelclaendeeheevrnhtailsltocsoeoanuodoeecaferbetrtenoiiucrwurfaproeercssoeuatulgtematremlieaveieogcelesaeeeyyiuuoaidaosdmdecsshthuhatcnxaererseltunaghanrdtevepisydtaeamcinmrnweoramrvibodsdfdpatimrssietdaospecgracnetblfioeushsmeeirlshmittrlnesehmclssoswfottwnbyteyngeymttgstariixeeedrnasmltwgmildcrtseogohrolsshmawndsstrabndnecfcayehotdornonenecatneavoeaatehercyrighsayrefsooatemncwtkaaawndadmsllnnnlutfoeeenoyoewtmanrrsxhvorolhisfunnthaeeofolphebaatmnornoeodnvtphnoetedeaeonphpaeuratvhndetahrahpoorsefovddsttpsvgraaatodsuryidovtrelerltmemdheoarshoarrrerxisgeifawfaiyidusiyieeesotkeaelatresntifemteiaighaceiondktkitteaeanecnndictnedddenstsheanrtamneahshidaocnuissctehslnlectheetlltidlcttnpnmcvsvnositdaelxpihsfattysfoedcmwhtebaachertaigriuirtngiaphetrowehwswaacmgcouwoogoegsmtarteeiemvayinogstitagblncstcycolretedarehopnebyegwcteetlteyeteenansafmo'"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c5bs = sanitise(c5b)\n",
+    "c5bs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('seabird', <KeywordWrapAlphabet.from_largest: 3>), -1255.0542494109186)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = keyword_break_mp(c5a)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "harry i cracked that last message for myself and noticed something really odd the text said it was encrypted using a column transposition with keyword seabird but it was enciphered using a rail fence cipher i can only assume that the text we retrieved was an archive of the original message re encrypted for safety whoever the flag day associates are they have a pretty sophisticated operation if they are filing messages like this more like one of the major terrorist groups than the usual hacker collective the tech guys took a look at the aerial from the boat and they tell me that it is a drag wire usually used to communicate with a submarine when submerged it carried an acoustic transducer array as well as a shortwave transmitter and listening gear one thing that puzzles me now is why we were allowed to find the ship floating at all surely they must have planned to sink her using the scuttling equipment otherwise what was it for they seem too smart to leave it floating for us to find any thoughts mark ps just before i sent this the cipher clerk came in with a decrypt of the attached columnar transposition keyword has length six think it answers some of our questions about the nautilus system\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(keyword_decipher(sanitise(c5a), key_a[0], key_a[1]))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(((3, 2, 4, 1, 5, 0), False, True), -1998.321513226948)"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = column_transposition_break_mp(c5bs)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "phase five seahorse is ready for trials and the nautilus system is fully functional we engaged the mechanism and lowered the deck to three feet above sealevel approaching the shore by the radar station at all times signals from their communications were monitored and no sign was given that our approach had been monitored or even noticed we backed off the deck was raised by two feet and the approach attempted again once more our incursion was unnoticed overnight we conducted a range of tests and mapped the radar coverage on three separate occasions there seems to have been a flurry of activity and our modeling suggests that the ships masts may have triggered brief alarms on all occasions the automatic dive systems cut incorrectly lowering the decks to sealevel and the alarms were cancelled the seahorse deployment system will be fully mounted tonight and we will conduct a battery of tests on the deployment and emergency recovery systems over the next two nights assuming that sea and air traffic remains low xxxx\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(column_transposition_decipher(sanitise(c5bs), key_b[0], \n",
+    "                                                              fillcolumnwise=key_b[1], \n",
+    "                                                              emptycolumnwise=key_b[2])))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(((3, 2, 4, 1, 5, 0), False, True), -2821.4971440358026)"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = column_transposition_break_mp(c5bs, fitness=Ptrigrams)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "phase five seahorse is ready for trials and the nautilus system is fully functional we engaged the mechanism and lowered the deck to three feet above sealevel approaching the shore by the radar station at all times signals from their communications were monitored and no sign was given that our approach had been monitored or even noticed we backed off the deck was raised by two feet and the approach attempted again once more our incursion was unnoticed overnight we conducted a range of tests and mapped the radar coverage on three separate occasions there seems to have been a flurry of activity and our modeling suggests that the ships masts may have triggered brief alarms on all occasions the automatic dive systems cut incorrectly lowering the decks to sealevel and the alarms were cancelled the seahorse deployment system will be fully mounted tonight and we will conduct a battery of tests on the deployment and emergency recovery systems over the next two nights assuming that sea and air traffic remains low xxxx\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(column_transposition_decipher(c5bs, key_b[0], \n",
+    "                                                              fillcolumnwise=key_b[1], emptycolumnwise=key_b[2])))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['tokens',\n",
+       " 'trials',\n",
+       " 'tricks',\n",
+       " 'tromps',\n",
+       " 'umiaks',\n",
+       " 'unfair',\n",
+       " 'urbans',\n",
+       " 'urgent',\n",
+       " 'vocals',\n",
+       " 'womans',\n",
+       " 'womens',\n",
+       " 'wreaks',\n",
+       " 'wrecks',\n",
+       " 'yokels',\n",
+       " 'ricardo',\n",
+       " 'sneaker',\n",
+       " 'speaker',\n",
+       " 'tobagos',\n",
+       " 'trebles',\n",
+       " 'woolens',\n",
+       " 'sneakers',\n",
+       " 'speakers',\n",
+       " 'speedier',\n",
+       " 'tobaccos',\n",
+       " 'together',\n",
+       " 'treaties',\n",
+       " 'treatise',\n",
+       " 'trollops',\n",
+       " 'unedited',\n",
+       " 'woollens',\n",
+       " 'wreckers',\n",
+       " 'treatises',\n",
+       " 'triteness',\n",
+       " 'usherette',\n",
+       " 'woodcocks',\n",
+       " 'tritenesss',\n",
+       " 'usherettes']"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "transpositions[key_b[0]]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2014/2014-challenge6.ipynb b/2014/2014-challenge6.ipynb
new file mode 100644 (file)
index 0000000..df21a33
--- /dev/null
@@ -0,0 +1,295 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "import pandas as pd\n",
+    "import collections\n",
+    "import string\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c6a = open('6a.ciphertext').read()\n",
+    "c6b = open('6b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f09a09d1240>"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f09a09f7a58>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs = pd.Series(english_counts)\n",
+    "freqs.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f09a09545f8>"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n9ZxBLkk99/8BiWCcUqHoOG4AAAAASUVORK5CYII=\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f09a098c0f0>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_6a = pd.Series(collections.Counter([l.lower() for l in c6a if l in string.ascii_letters]))\n",
+    "freqs_6a.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f09a087a828>"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f09a08630f0>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_6b = pd.Series(collections.Counter([l.lower() for l in c6b if l in string.ascii_letters]))\n",
+    "freqs_6b.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'mtaeglatcleptenopeautelebiiootatwnantateituiiagaeostgvetabdresiacqobwavgrhrsihssaekajbwwttdrsmeetnyafsegilegtkrreocuantteomsgstnsiaeluutrbaiaeteeserhxgtooarrbhpcklialhnaesvearhbepiydcesewtaxuyaerywoeinhteegeisieireaassrbitnhtuorooleewsttereoahyakhlsmsaeodslthsutigqimnidsgetpmwtrnnotfhvselkaumrndvcnrluceryhyeetlnigouncnanrhpnosbhshpslreclvrinfoehniaeennhcrbenrgunruesmlrehiutgteordroeaeoisoeusiknteeslohthdcrmisuteoteaeoshfaiaesemritrseisaigwyrmhrbtetncoenuhorcadeodlcrncomnctosihudtcinagesntisutigytmshthyalatlsnhilguimtlbfldyhrfrnetsaosteetaefhlgokhretcakuteihrlrtlsetshlcpeadhthyutaeennhryraeennihrnbhnsnehyutsdtoywmtiatalwhvbepetlxihuscrtadtikhnxmsaesnwluevgnrcpegvnhteruigeuealsdntikeaeomctwrybusiilephkyodhrsyhecaatrmrltrarretstuoetnuesiduaidoesisaeetbllerpntroisiatsiasesomihsieiaunsaitneelacrfnrnngvetteenslhvpepteonedtnaooutgsotancetimiiwoetiuihclsewtcniieotslfbeecohenpoelsdoctceeemiiirttmhbiuovecegaitjuaborcleentatruyinetsidlaeehitwencceohwvohoatwkteroarhcseer'"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c6as = sanitise(c6a)\n",
+    "c6as"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'hwssswxfewhhrfewpdrvttdhxbccleayphalnadhiehaoudrotwnrrvysabjlttbaytmelrkaidopthatlelrtwaamaneksvvzrvllatkcrjquicizgtoqcpnrrkttowandqehtqrvtbaydqealannohulanuzlwextlvjrvivhnohdqmgykaclmswrupdetfioftfelhzpxhaswftwprrsweiseohefpdrvttnvagdvswgoerbetnharvaeevtlltbmgaiatgelinmdawevhatterdhrznbnvoutnefoteveaehlaymhacglzeptvvdimworfisgtuzlwibeqohubtghamqornjnnrumqvjtxeltfovgawdaeevllgrtxibgtibevmpsaateoasevaeyqohameonncfuidoefafattemuimnflznbekofobrliaehhauihnnnwzaeevtlltpaalnanvtzlzuucptaelinanpaahewfthaosetaribnbnvhaevdhyytlmuxb'"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c6bs = sanitise(c6b)\n",
+    "c6bs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(3, -2314.997881051078)"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = railfence_break(c6as)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'mark the last message told usa lot the scuttling equipment is designed to pump water in and out of the vessel like a submarine dive control but clearly they werent planning to turn a container ship into a sub this ship is a largescale version of something i have seen in the caribbean drug runners use a similar technique to get below radar coverage for inshore runs sinking the vessel so that the deck remains just below the wave tops the fda pirates seem more interested in staying away from shore but getting close enough to track and record electronic communications without detection i am guessing this scuttling system is what they call nautilus in their log but i am still baffled by the references to seahorse the next page of the log looks harder to crack but the cipher clerk tells me it is a hill cipher and that they must have been in a hurry or have been enciphering by hand since they just used a two by two matrix actually we have been pretty lax with our security and i think the next message is end will use avi genere cipher given that we are using secure cables i dont think we have too much to worry about so i will keep the keyword short say three characters more later harry'"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(railfence_decipher(c6as, key_a)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(matrix([[0, 1],\n",
+       "         [1, 1]]), -666.1299098341699)"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = hill_break(c6bs)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'phase six seahorse operated exactly as planned with good forward visibility at the trial depths the crew managed several tasks requiring concentration and dexterity and we plan to run a full test overnight on dummy cables dropped from the ship the software seems to be operating as designed but there are still bugs in the firmware that need ironing out before we deploy the collective is working full time to hunt them down and remove them though we are all getting tired mistakes are easy to make and could be fatal time is no longer on our side though and we are still planning to launch the final phase of the operation in three days timex'"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(hill_decipher(key_b, c6bs)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2014/2014-challenge7.ipynb b/2014/2014-challenge7.ipynb
new file mode 100644 (file)
index 0000000..7e8f74c
--- /dev/null
@@ -0,0 +1,431 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "import pandas as pd\n",
+    "import collections\n",
+    "import string\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c7a = open('7a.ciphertext').read()\n",
+    "c7b = open('7b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7fe4081aa6d8>"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7fe408191f98>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs = pd.Series(english_counts)\n",
+    "freqs.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7fe3dd3dba20>"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7fe3dd4129e8>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_7a = pd.Series(collections.Counter([l.lower() for l in c7a if l in string.ascii_letters]))\n",
+    "freqs_7a.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7fe3dd3b1390>"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\nQmCC\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7fe3dd45a240>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_7b = pd.Series(collections.Counter([l.lower() for l in c7b if l in string.ascii_letters]))\n",
+    "freqs_7b.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'veyjmyjkrzilysyjeydorulcsrcjnmoiddeugurlogfsnwcrlhckhghmwkejxlyktlagflalvtmgkyyomvlmgkyjosfdrzepwaqgnrzeqzinoaqforkcsltjwdussrzarlhcnajneqzabbakeebatjgoiklgcerzebjidlwmgdussnmljwdgftmlhceeazalasksnbtlmukcvtfwilderhrckuksbjqtfwcpwwfsdydrcsdwsbyfdmfeblhcneqkejohguhussjmciqfmjuqoirzosltfwsfapuwwmmlbzatwhyvnmadcstfstrzedvafsdzwelgpcjaraneanrzeqwwylepkscshmjscaslglmfgcjakqsrwrwlhcuurswyqollhcktyjbmsrbkibwcjwapwdyfapwamxapgulvfgnekwtcjsqiuyjeuatfsdgktgfcravcharlepfodtojlsdssrwncvtmjegffmjccvdcukndarwsgkaukokwtfanediiwtfasmfaqmbpwsamekasqaolscmmpjwodqeyjsyyouzellhcqfgltcvajgcydsfapuatfsjsjypagewdgfsnwcraolkyqleklhcveacpjstckcyfcyjrwscpsncveqaglwdrgdchlmqaljotsrceorwonwrylebnefacjwdckiefebxopmnbwrqwamhepstggnqawykajjeyvyagnawrlwdytosltfwrcxepwnawtmlhcuazdeqanrzejssrhaplodlhcxdydoeturlhcfevlscutggnfsskwrcsljqwmjrgwdgliqwnajynleboirzakgrckeamrceobafgwdyesagtpsnqhoqatggnaapfwryfdrwljkuqohyltfwyuwrcjeydlwmprgwfstgvollulvepktyfdgkhmotfwwfglcssqwmzdygkpmoepwdrzeqgrrgfagmnmtgfgrzeweuqlbcvogfggkrcsljqillelkitwalvwmmlbtupftfjosyhytarlepqilvawkillhyltgeerzegjillepuenlmgyhrforuaruhyfyrzilyuqwfsdbsltfwyasnfsrbdyfsvczihsciwdydoaslqgciwtgftfwmgvdjwodlhcgccsnasnwguewtkwaazaplsfgwgfgrzebwenkeyuazdeqanrzepwgggngvolliksggferzeskwgdlzwanjozdekturatksylwebkokwdghlmeaaqtmyerlhcxujdcmnepsgceankfpgmrzemealagmnepfmcftgxiyergyhratgkillhcarzwsranrwrcktqlondawslmfguwajdhyneydorlojgsczepw'"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c7as = sanitise(c7a)\n",
+    "c7as"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'anwaecnndrtwtanireoahsrdntieerdctewayerevaaarpioerobsedescrehlaoitithsdtrinosepeplthtnidtwsduledlhotpeaterhaaredeoaiodtahregerothwhtsureteeinwigiresetpowicooonitseudseechacteofiileonewiotacteodteuneahsedaptryemronmomlexontkemeoyvitsteenhantrertieineotndlhpoplyitewitrsedeevdycfrmnsnaypinmteeneeinahinepritedehveleaorelllvmocnahncepherohjuuvehautathttetoasipowwneedselopgdeslfedterfcaatehjasdtrprleseeretetecneorrsgckamiiwaefutiashaongcthsrenrehtrsthhaceinwtprloghetodaeraloeedeatsomldwedtwefsbelevpdteonoignsavftegsebomcehatietnrsptonthusorecredendcetlwaehesedrncveracuhoihaleinaemeunherdesttstasipedeyleeemtiisiigothntssfolnitretrwhemtkhhswtorcssnererohteencsapeblircnthuleofenrsromrnshmaddaodeatihioroutwevthapeceetovterdleaditewdottttcatkmbhtheicwantnisedwatxankeabovoanmswlprgaispodfogndpedeswrdacttrefhdesyaberretlavod'"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c7bs = sanitise(c7b)\n",
+    "c7bs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('say', -1726.4679903722085)"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = vigenere_frequency_break(c7as)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'dear mark things area lot clearer now i flew out to inspect the ship myself last night and took a good look around the reason the ship was not scuttled was that the valves had jammed it looks like the driftwood was pulled into the mechanism and blocked the inlet presumably the crew had already abandoned the vessel which was lucky for us without the ship we would have had no idea that the fda had been operating in these waters seahorse is no longer a mystery the cutaway on the starboard side cleared an area of around five meters square with a distinctive pattern of bolts fastened to reinforced deck plates i saw something like this on a sub rescue mission a couple of years ago when they fitted a local ship with a jury rigged inspection system the deck plates can carry a crane designed to deploy an rova remote operated vehicle designed for undersea operations i was already concerned about the reference to the cables in the last part of the fda log but the next section has me really worried it is encrypted with a more secure modified amsco transposition cipher and tells us what they were really up to what i dont understand is how the whole assembly is powered the sort of computing they must be doing is really intensive and would burn through a battery in days in that time their intercept might not catch anything useful but they can hardly have hijacked a local socket in the middle of the ocean can you get me a chart showing the deepsea cables in the region i dont imagine the us will be a problem but it may need some diplomacy to get the full coverage maps from the omani government if i am right it is in their best interests to playalong we all have alot to lose here'"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(vigenere_decipher(c7as, key_a)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(((1, 2, 0, 4, 3), (2, 1), <AmscoFillStyle.continuous: 1>),\n",
+       " -1902.8377732825452)"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = amsco_break(c7bs)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'phase seven we approached the cable junction undercover of night with nautilus at an elevation of three feet towing seahorse to starboard comms interception showed that we remained undetected and seahorse was deployed at operating depth the various layers of armoured protection were removed from the cable and as expected once the steel jacket was removed the other layers provided little resistance the divers entered the water and cut into the core to insert the optical repeaters linking them back to the man in the middle unit which was powered up and fully tested initial tests showed that it was operating as expected and three keys have already been recovered from the omani transmissions with daylight approaching the remaining tests were postponed for the following night and the ship returned to deeper waters where it remained at low deck height the divers were left at seahorse to decompress slowly and will be recovered tomorrow once the final tests have been concluded'"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(amsco_transposition_decipher(c7bs, key_b[0], fillpattern=key_b[1], fillstyle=key_b[2])))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {
+    "collapsed": false,
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['cable',\n",
+       " 'facto',\n",
+       " 'facts',\n",
+       " 'gabon',\n",
+       " 'hafts',\n",
+       " 'hefts',\n",
+       " 'ibexs',\n",
+       " 'kabul',\n",
+       " 'lacys',\n",
+       " 'ladys',\n",
+       " 'laius',\n",
+       " 'lefts',\n",
+       " 'macon',\n",
+       " 'macro',\n",
+       " 'macys',\n",
+       " 'malts',\n",
+       " 'melon',\n",
+       " 'melts',\n",
+       " 'negro',\n",
+       " 'oahus',\n",
+       " 'obeys',\n",
+       " 'obits',\n",
+       " 'odets',\n",
+       " 'pacts',\n",
+       " 'pants',\n",
+       " 'pelts',\n",
+       " 'pints',\n",
+       " 'piotr',\n",
+       " 'pious',\n",
+       " 'plots',\n",
+       " 'plows',\n",
+       " 'ploys',\n",
+       " 'rafts',\n",
+       " 'rants',\n",
+       " 'remus',\n",
+       " 'rents',\n",
+       " 'riots',\n",
+       " 'scout',\n",
+       " 'shout',\n",
+       " 'snout',\n",
+       " 'cabbed',\n",
+       " 'cabbie',\n",
+       " 'cabbys',\n",
+       " 'cabral',\n",
+       " 'dabble',\n",
+       " 'faeroe',\n",
+       " 'gabbro',\n",
+       " 'ibexes',\n",
+       " 'jaguar',\n",
+       " 'kaboom',\n",
+       " 'kaftan',\n",
+       " 'lacuna',\n",
+       " 'lagoon',\n",
+       " 'lefter',\n",
+       " 'legume',\n",
+       " 'macaws',\n",
+       " 'magyar',\n",
+       " 'malays',\n",
+       " 'maltas',\n",
+       " 'mellon',\n",
+       " 'negevs',\n",
+       " 'nellys',\n",
+       " 'nelson',\n",
+       " 'odious',\n",
+       " 'paddys',\n",
+       " 'panzas',\n",
+       " 'peggys',\n",
+       " 'pelves',\n",
+       " 'pennys',\n",
+       " 'photos',\n",
+       " 'pinups',\n",
+       " 'qantas',\n",
+       " 'rabats',\n",
+       " 'rallys',\n",
+       " 'refuse',\n",
+       " 'refute',\n",
+       " 'remuss',\n",
+       " 'renews',\n",
+       " 'repute',\n",
+       " 'scouts',\n",
+       " 'shouts',\n",
+       " 'snouts',\n",
+       " 'cabbage',\n",
+       " 'cabrera',\n",
+       " 'dabbled',\n",
+       " 'gadwall',\n",
+       " 'ladonna',\n",
+       " 'leftest',\n",
+       " 'madonna',\n",
+       " 'malayan',\n",
+       " 'million',\n",
+       " 'papacys',\n",
+       " 'pellets',\n",
+       " 'penneys',\n",
+       " 'qantass',\n",
+       " 'ragtags',\n",
+       " 'refuses',\n",
+       " 'refuter',\n",
+       " 'regrets',\n",
+       " 'rennets',\n",
+       " 'renters',\n",
+       " 'reroute',\n",
+       " 'sallust',\n",
+       " 'macassar',\n",
+       " 'mahatmas',\n",
+       " 'mahayana',\n",
+       " 'nanettes',\n",
+       " 'palatals',\n",
+       " 'phosphor',\n",
+       " 'reenters',\n",
+       " 'phosphors',\n",
+       " 'sinusitis',\n",
+       " 'malayalams',\n",
+       " 'sinusitiss']"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "transpositions[key_b[0]]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2014/2014-challenge8.ipynb b/2014/2014-challenge8.ipynb
new file mode 100644 (file)
index 0000000..f6d9d2e
--- /dev/null
@@ -0,0 +1,5630 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "import pandas as pd\n",
+    "import collections\n",
+    "import string\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c8a = open('8a.ciphertext').read()\n",
+    "c8b = open('8b.ciphertext').read().strip()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f42359ab6a0>"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f4235991f60>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs = pd.Series(english_counts)\n",
+    "freqs.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f420b429860>"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\nAAAAAElFTkSuQmCC\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f420b4599b0>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_8a = pd.Series(collections.Counter([l.lower() for l in c8a if l in string.ascii_letters]))\n",
+    "freqs_8a.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'nyvlggsyglchxfeuytqcesqxpziufiggrbjhpayncruyfpsxufiupskyrectmmcncruyregxigrlglbtiblmecebzsvrlpuxpbibjajrljreobajrlufigjehbezywtmgjyxfqxictsgrdgtbjafyoocwtmjblctwwucqmgofrlfmrfrlfwlbtijlwuypmchjqxicrfchumtsmzjbimyvhcuvyrugxjcwpdtpuisrlfdhbaencyqumufeogrhcrjmytqsmsxjmrcsxjrmttiswzvjrfpecjitnidgemdssaitasvjhuyofgxpsxgmvvqfvrxiyxxmymbxfjpufigbeufeuuiiyzfavbaofbxicmsamqfisqwpgrtribbmtskhcwuuimcxufinbitrvpwxsmnbljppytuixgpmlifbgpmtfpeugsodvpkxicsnyrjeswcvokioreoyvnchggkirishiuyrerlfdpjeluasorvpjwzqxfkwgpsnyhsmrfkiblaigpfuiociersflwvpiuusufmoewpliufeuuiemrprwflhdpmuggbjmodsskeugsoygsmwtrlfzecypnyreyftrvbgxblhuusufeuuivqiblsoavjrmdyplcchcrfpeugsonvprsdmpplxiyxdfeolimemwcrufimczfjsgasnkmukiorxicjeylbtitfsxlmobiwcppnmoexigwqjeogenqyscxiyxufizummjvfgrtreucxictpuisqyqnpzumufmoyjfuqplxiqfvrajrlmsglrlfwajjpomxhsitqxiyxxcoomabzsvrmuyreuixgpmnyugxpsxpdfvqmocwtdssjsoeiomyhfxpasncyqumufeqjeomjpsvpurumiynppgxjrmorlfkiblxjkixcrpuoomaufeurlfgvigkicwuqidsvjrcdmqnsrjaeugsoqescioavznxfbytgrhygbbioswdgticvtmafaeoqxbpxisrugrhrlsmyhfxichbrecywfdssmxicvjlxfpgfnxtuidyrdpedixigwnycccxicfscelrlsmyhfaffewcffcrmmslgrhdssgrufiggkirehymoqxufigbemcxtlsuqgscajryqypmrlfzitrlbpvz'"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c8as = sanitise(c8a)\n",
+    "c8as"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('bye', -1461.9840974270046)"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = vigenere_frequency_break(c8as)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'mark i cracked what appears to be the final document about the trojan deployment and i think i have an idea about how to deal with it and with the flag day associates the principal weakness of any system like the one they have installed is the need to provide large quantities of power the fda came up with an ingenious solution but it is very vulnerable special forces could take it out for us but that would tell the fda that we have cracked their ciphers so instead i suggest we let them destroy trojan for us we will need cooperation from the omani government an armed fighter jet and the flight control systems from a drone meanwhile we need to ensure two things one that we do not send critical information across the ba balm and abstrait and two that we use an on critical key generation protocol on that channel given the level of commitment the fda have shown in developing this plan i am sure that they will reinstate the powersupply within a few months but with luck they will not guess that we know about it and we will put it out of business for long enough to come up with a plan of our own to exploit it in the meantime we now know that their highest security communications are encrypted using a caden us cipher so we can start hunting through the database for other intercepts we can crack this maybe the breakthrough we have been looking for in the fight against the fda lets not screw it up all the best harry'"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(vigenere_decipher(c8as, key_a)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "875.0"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(c8b) / 8"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['00000',\n",
+       " '00101',\n",
+       " '00010',\n",
+       " '00000',\n",
+       " '00100',\n",
+       " '10100',\n",
+       " '01110',\n",
+       " '10011',\n",
+       " '10011',\n",
+       " '00000',\n",
+       " '00010',\n",
+       " '10011',\n",
+       " '00111',\n",
+       " '10001',\n",
+       " '01000',\n",
+       " '01110',\n",
+       " '01011',\n",
+       " '00100',\n",
+       " '10011',\n",
+       " '00010',\n",
+       " '10010',\n",
+       " '00100',\n",
+       " '10001',\n",
+       " '10011',\n",
+       " '00111',\n",
+       " '10010',\n",
+       " '00111',\n",
+       " '10011',\n",
+       " '10001',\n",
+       " '00000',\n",
+       " '00111',\n",
+       " '01010',\n",
+       " '11000',\n",
+       " '01110',\n",
+       " '10001',\n",
+       " '01111',\n",
+       " '00101',\n",
+       " '10001',\n",
+       " '00110',\n",
+       " '00100',\n",
+       " '01110',\n",
+       " '00000',\n",
+       " '00011',\n",
+       " '01111',\n",
+       " '01111',\n",
+       " '01001',\n",
+       " '01101',\n",
+       " '00110',\n",
+       " '01011',\n",
+       " '10011',\n",
+       " '00100',\n",
+       " '10001',\n",
+       " '01101',\n",
+       " '00100',\n",
+       " '00101',\n",
+       " '00100',\n",
+       " '01110',\n",
+       " '00101',\n",
+       " '01000',\n",
+       " '01110',\n",
+       " '10001',\n",
+       " '10011',\n",
+       " '10010',\n",
+       " '00011',\n",
+       " '00011',\n",
+       " '01110',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '10100',\n",
+       " '01100',\n",
+       " '10010',\n",
+       " '00010',\n",
+       " '10001',\n",
+       " '10100',\n",
+       " '00100',\n",
+       " '10001',\n",
+       " '01101',\n",
+       " '00101',\n",
+       " '00100',\n",
+       " '10011',\n",
+       " '01011',\n",
+       " '00000',\n",
+       " '00000',\n",
+       " '00101',\n",
+       " '10010',\n",
+       " '10011',\n",
+       " '10110',\n",
+       " '01000',\n",
+       " '00100',\n",
+       " '01101',\n",
+       " '10011',\n",
+       " '10001',\n",
+       " '10101',\n",
+       " '01110',\n",
+       " '01110',\n",
+       " '01101',\n",
+       " '00100',\n",
+       " '10001',\n",
+       " '00111',\n",
+       " '10100',\n",
+       " '00000',\n",
+       " '00111',\n",
+       " '10001',\n",
+       " '00000',\n",
+       " '10101',\n",
+       " '00100',\n",
+       " '10001',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '10011',\n",
+       " '10010',\n",
+       " '10101',\n",
+       " '10010',\n",
+       " '01000',\n",
+       " '00100',\n",
+       " '01011',\n",
+       " '00111',\n",
+       " '01011',\n",
+       " '01110',\n",
+       " '10010',\n",
+       " '10011',\n",
+       " '00011',\n",
+       " '01110',\n",
+       " '00000',\n",
+       " '01011',\n",
+       " '01110',\n",
+       " '11000',\n",
+       " '00000',\n",
+       " '00100',\n",
+       " '10010',\n",
+       " '01100',\n",
+       " '01101',\n",
+       " '01101',\n",
+       " '00011',\n",
+       " '01000',\n",
+       " '00110',\n",
+       " '01101',\n",
+       " '01101',\n",
+       " '10001',\n",
+       " '00111',\n",
+       " '01110',\n",
+       " '00111',\n",
+       " '00111',\n",
+       " '10011',\n",
+       " '10010',\n",
+       " '01101',\n",
+       " '00000',\n",
+       " '01110',\n",
+       " '01000',\n",
+       " '01011',\n",
+       " '01101',\n",
+       " '00010',\n",
+       " '01101',\n",
+       " '10010',\n",
+       " '10010',\n",
+       " '01000',\n",
+       " '00010',\n",
+       " '10001',\n",
+       " '00100',\n",
+       " '00000',\n",
+       " '01101',\n",
+       " '01101',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '01000',\n",
+       " '01000',\n",
+       " '01000',\n",
+       " '00100',\n",
+       " '10001',\n",
+       " '10110',\n",
+       " '10011',\n",
+       " '00000',\n",
+       " '01101',\n",
+       " '00100',\n",
+       " '10010',\n",
+       " '10001',\n",
+       " '10101',\n",
+       " '01110',\n",
+       " '00110',\n",
+       " '01000',\n",
+       " '00100',\n",
+       " '01000',\n",
+       " '11000',\n",
+       " '10110',\n",
+       " '10010',\n",
+       " '10010',\n",
+       " '00011',\n",
+       " '00110',\n",
+       " '01111',\n",
+       " '10101',\n",
+       " '01110',\n",
+       " '01000',\n",
+       " '00000',\n",
+       " '01000',\n",
+       " '10010',\n",
+       " '00000',\n",
+       " '01110',\n",
+       " '00000',\n",
+       " '00100',\n",
+       " '01110',\n",
+       " '00000',\n",
+       " '00100',\n",
+       " '00011',\n",
+       " '10001',\n",
+       " '01101',\n",
+       " '01000',\n",
+       " '10011',\n",
+       " '10001',\n",
+       " '01101',\n",
+       " '10111',\n",
+       " '00100',\n",
+       " '01000',\n",
+       " '00110',\n",
+       " '10001',\n",
+       " '01111',\n",
+       " '10010',\n",
+       " '10010',\n",
+       " '00111',\n",
+       " '00000',\n",
+       " '00011',\n",
+       " '00111',\n",
+       " '00011',\n",
+       " '10011',\n",
+       " '01110',\n",
+       " '01000',\n",
+       " '01111',\n",
+       " '00000',\n",
+       " '00000',\n",
+       " '10011',\n",
+       " '00100',\n",
+       " '10111',\n",
+       " '00100',\n",
+       " '01101',\n",
+       " '01101',\n",
+       " '00100',\n",
+       " '10010',\n",
+       " '00000',\n",
+       " '00110',\n",
+       " '10001',\n",
+       " '01110',\n",
+       " '00001',\n",
+       " '10011',\n",
+       " '01011',\n",
+       " '00100',\n",
+       " '10010',\n",
+       " '10001',\n",
+       " '01101',\n",
+       " '10001',\n",
+       " '01110',\n",
+       " '01000',\n",
+       " '10001',\n",
+       " '11000',\n",
+       " '01111',\n",
+       " '00001',\n",
+       " '00110',\n",
+       " '00100',\n",
+       " '00011',\n",
+       " '00010',\n",
+       " '01011',\n",
+       " '01011',\n",
+       " '01000',\n",
+       " '10110',\n",
+       " '00000',\n",
+       " '01011',\n",
+       " '00000',\n",
+       " '01011',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '01101',\n",
+       " '01000',\n",
+       " '00110',\n",
+       " '10001',\n",
+       " '10001',\n",
+       " '01101',\n",
+       " '10110',\n",
+       " '11000',\n",
+       " '10001',\n",
+       " '01011',\n",
+       " '01000',\n",
+       " '01100',\n",
+       " '01011',\n",
+       " '01111',\n",
+       " '10010',\n",
+       " '10011',\n",
+       " '01110',\n",
+       " '01011',\n",
+       " '00100',\n",
+       " '00101',\n",
+       " '10011',\n",
+       " '10001',\n",
+       " '00011',\n",
+       " '01100',\n",
+       " '10100',\n",
+       " '00000',\n",
+       " '10001',\n",
+       " '01000',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '01000',\n",
+       " '01000',\n",
+       " '00000',\n",
+       " '01110',\n",
+       " '01011',\n",
+       " '01101',\n",
+       " '00100',\n",
+       " '10110',\n",
+       " '10010',\n",
+       " '00000',\n",
+       " '01110',\n",
+       " '00111',\n",
+       " '10001',\n",
+       " '10011',\n",
+       " '01011',\n",
+       " '10010',\n",
+       " '10011',\n",
+       " '01110',\n",
+       " '00001',\n",
+       " '00100',\n",
+       " '10011',\n",
+       " '01101',\n",
+       " '10010',\n",
+       " '01011',\n",
+       " '10101',\n",
+       " '00101',\n",
+       " '01000',\n",
+       " '10101',\n",
+       " '00011',\n",
+       " '01110',\n",
+       " '10101',\n",
+       " '10011',\n",
+       " '01111',\n",
+       " '01110',\n",
+       " '00000',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '01000',\n",
+       " '10010',\n",
+       " '00010',\n",
+       " '01000',\n",
+       " '01110',\n",
+       " '00111',\n",
+       " '01000',\n",
+       " '01111',\n",
+       " '10010',\n",
+       " '00100',\n",
+       " '10101',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '00011',\n",
+       " '10011',\n",
+       " '00100',\n",
+       " '10110',\n",
+       " '00101',\n",
+       " '00000',\n",
+       " '10001',\n",
+       " '01101',\n",
+       " '00111',\n",
+       " '00100',\n",
+       " '00001',\n",
+       " '01011',\n",
+       " '00100',\n",
+       " '00000',\n",
+       " '01110',\n",
+       " '10011',\n",
+       " '01110',\n",
+       " '00111',\n",
+       " '10011',\n",
+       " '10011',\n",
+       " '10011',\n",
+       " '00100',\n",
+       " '01111',\n",
+       " '01101',\n",
+       " '00010',\n",
+       " '01010',\n",
+       " '00000',\n",
+       " '01110',\n",
+       " '01101',\n",
+       " '00111',\n",
+       " '10110',\n",
+       " '00100',\n",
+       " '10011',\n",
+       " '01100',\n",
+       " '10101',\n",
+       " '11000',\n",
+       " '01111',\n",
+       " '10001',\n",
+       " '10001',\n",
+       " '00100',\n",
+       " '01110',\n",
+       " '01101',\n",
+       " '01101',\n",
+       " '00000',\n",
+       " '10010',\n",
+       " '00110',\n",
+       " '00011',\n",
+       " '00100',\n",
+       " '00011',\n",
+       " '01110',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '01110',\n",
+       " '00000',\n",
+       " '00000',\n",
+       " '01100',\n",
+       " '10011',\n",
+       " '00010',\n",
+       " '01000',\n",
+       " '00010',\n",
+       " '10011',\n",
+       " '10011',\n",
+       " '01000',\n",
+       " '00101',\n",
+       " '01101',\n",
+       " '00000',\n",
+       " '00011',\n",
+       " '10001',\n",
+       " '00100',\n",
+       " '10010',\n",
+       " '10001',\n",
+       " '10011',\n",
+       " '10010',\n",
+       " '00100',\n",
+       " '10001',\n",
+       " '01110',\n",
+       " '10010',\n",
+       " '00100',\n",
+       " '10011',\n",
+       " '10001',\n",
+       " '00111',\n",
+       " '00010',\n",
+       " '01000',\n",
+       " '00010',\n",
+       " '10011',\n",
+       " '01111',\n",
+       " '10010',\n",
+       " '00000',\n",
+       " '00000',\n",
+       " '00100',\n",
+       " '00111',\n",
+       " '01011',\n",
+       " '00011',\n",
+       " '00111',\n",
+       " '10010',\n",
+       " '00101',\n",
+       " '10111',\n",
+       " '10010',\n",
+       " '01110',\n",
+       " '00000',\n",
+       " '01110',\n",
+       " '10011',\n",
+       " '00010',\n",
+       " '10011',\n",
+       " '00001',\n",
+       " '00001',\n",
+       " '10010',\n",
+       " '01110',\n",
+       " '00100',\n",
+       " '01000',\n",
+       " '10001',\n",
+       " '01101',\n",
+       " '10010',\n",
+       " '00000',\n",
+       " '00011',\n",
+       " '01011',\n",
+       " '11000',\n",
+       " '10011',\n",
+       " '10001',\n",
+       " '10001',\n",
+       " '10100',\n",
+       " '01101',\n",
+       " '10001',\n",
+       " '00010',\n",
+       " '00100',\n",
+       " '01111',\n",
+       " '10011',\n",
+       " '10011',\n",
+       " '00111',\n",
+       " '10001',\n",
+       " '00100',\n",
+       " '10100',\n",
+       " '00111',\n",
+       " '01101',\n",
+       " '01010',\n",
+       " '10011',\n",
+       " '00000',\n",
+       " '00010',\n",
+       " '00100',\n",
+       " '00010',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '01011',\n",
+       " '10001',\n",
+       " '10110',\n",
+       " '01101',\n",
+       " '01000',\n",
+       " '10001',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '00000',\n",
+       " '00100',\n",
+       " '10010',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '01000',\n",
+       " '00011',\n",
+       " '01000',\n",
+       " '10010',\n",
+       " '01110',\n",
+       " '00110',\n",
+       " '00010',\n",
+       " '00100',\n",
+       " '01110',\n",
+       " '01100',\n",
+       " '01101',\n",
+       " '10001',\n",
+       " '10011',\n",
+       " '00100',\n",
+       " '01001',\n",
+       " '00111',\n",
+       " '00000',\n",
+       " '00110',\n",
+       " '00000',\n",
+       " '00001',\n",
+       " '10010',\n",
+       " '00100',\n",
+       " '01101',\n",
+       " '01000',\n",
+       " '10011',\n",
+       " '01011',\n",
+       " '10110',\n",
+       " '10011',\n",
+       " '10001',\n",
+       " '01101',\n",
+       " '00001',\n",
+       " '01100',\n",
+       " '01000',\n",
+       " '00100',\n",
+       " '01011',\n",
+       " '10010',\n",
+       " '00000',\n",
+       " '10001',\n",
+       " '00100',\n",
+       " '10011',\n",
+       " '00100',\n",
+       " '10010',\n",
+       " '10001',\n",
+       " '01101',\n",
+       " '00110',\n",
+       " '10010',\n",
+       " '01101',\n",
+       " '00111',\n",
+       " '00100',\n",
+       " '00001',\n",
+       " '01000',\n",
+       " '01110',\n",
+       " '10010',\n",
+       " '00011',\n",
+       " '01000',\n",
+       " '00100',\n",
+       " '01101',\n",
+       " '00000',\n",
+       " '00101',\n",
+       " '01011',\n",
+       " '00100',\n",
+       " '01000',\n",
+       " '10010',\n",
+       " '00000',\n",
+       " '00111',\n",
+       " '01110',\n",
+       " '00010',\n",
+       " '01000',\n",
+       " '00101',\n",
+       " '00100',\n",
+       " '10101',\n",
+       " '01100',\n",
+       " '00101',\n",
+       " '00000',\n",
+       " '10011',\n",
+       " '00000',\n",
+       " '01101',\n",
+       " '00000',\n",
+       " '10011',\n",
+       " '10001',\n",
+       " '01101',\n",
+       " '01000',\n",
+       " '00000',\n",
+       " '00110',\n",
+       " '01101',\n",
+       " '00111',\n",
+       " '00000',\n",
+       " '10011',\n",
+       " '01101',\n",
+       " '01100',\n",
+       " '01000',\n",
+       " '00001',\n",
+       " '01101',\n",
+       " '01000',\n",
+       " '10100',\n",
+       " '00101',\n",
+       " '00100',\n",
+       " '01101',\n",
+       " '10001',\n",
+       " '10011',\n",
+       " '01110',\n",
+       " '10011',\n",
+       " '10011',\n",
+       " '10001',\n",
+       " '01101',\n",
+       " '11000',\n",
+       " '01111',\n",
+       " '00000',\n",
+       " '01000',\n",
+       " '00011',\n",
+       " '11000',\n",
+       " '01000',\n",
+       " '00100',\n",
+       " '00110',\n",
+       " '00011',\n",
+       " '01101',\n",
+       " '01100',\n",
+       " '00100',\n",
+       " '10001',\n",
+       " '00111',\n",
+       " '00111',\n",
+       " '01000',\n",
+       " '01110',\n",
+       " '10011',\n",
+       " '10001',\n",
+       " '00100',\n",
+       " '10011',\n",
+       " '00010',\n",
+       " '00100',\n",
+       " '10010',\n",
+       " '10010',\n",
+       " '00100',\n",
+       " '01000',\n",
+       " '01011',\n",
+       " '00011',\n",
+       " '10001',\n",
+       " '00001',\n",
+       " '00010',\n",
+       " '00100',\n",
+       " '01111',\n",
+       " '10001',\n",
+       " '01000',\n",
+       " '00110',\n",
+       " '00000',\n",
+       " '00100',\n",
+       " '10010',\n",
+       " '01110',\n",
+       " '00000',\n",
+       " '00011',\n",
+       " '01011',\n",
+       " '10011',\n",
+       " '00000',\n",
+       " '00111',\n",
+       " '01000',\n",
+       " '00100',\n",
+       " '10101',\n",
+       " '00100',\n",
+       " '00001',\n",
+       " '10001',\n",
+       " '00010',\n",
+       " '00100',\n",
+       " '01101',\n",
+       " '01011',\n",
+       " '00100',\n",
+       " '10101',\n",
+       " '00000',\n",
+       " '10010',\n",
+       " '00000',\n",
+       " '00011',\n",
+       " '01101',\n",
+       " '01101',\n",
+       " '10011',\n",
+       " '00111',\n",
+       " '01101',\n",
+       " '00100',\n",
+       " '01000',\n",
+       " '10011',\n",
+       " '00100',\n",
+       " '01000',\n",
+       " '01000',\n",
+       " '10010',\n",
+       " '00000',\n",
+       " '00111',\n",
+       " '10100',\n",
+       " '00111',\n",
+       " '00111',\n",
+       " '10100',\n",
+       " '00000',\n",
+       " '01100',\n",
+       " '01110',\n",
+       " '01101',\n",
+       " '00100',\n",
+       " '00101',\n",
+       " '11000',\n",
+       " '00111',\n",
+       " '01011',\n",
+       " '01110',\n",
+       " '01101',\n",
+       " '10110',\n",
+       " '00111',\n",
+       " '00000',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '01110',\n",
+       " '10010',\n",
+       " '01101',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '11000',\n",
+       " '00000',\n",
+       " '01101',\n",
+       " '00100',\n",
+       " '01000',\n",
+       " '10010',\n",
+       " '00100',\n",
+       " '10011',\n",
+       " '01110',\n",
+       " '00110',\n",
+       " '11000',\n",
+       " '01000',\n",
+       " '10011',\n",
+       " '00100',\n",
+       " '10001',\n",
+       " '01011',\n",
+       " '01000',\n",
+       " '00111',\n",
+       " '10011',\n",
+       " '00010',\n",
+       " '01100',\n",
+       " '01000',\n",
+       " '01110',\n",
+       " '01000',\n",
+       " '10001',\n",
+       " '00000',\n",
+       " '10001',\n",
+       " '00101',\n",
+       " '00011',\n",
+       " '01110',\n",
+       " '00100',\n",
+       " '10011',\n",
+       " '01101',\n",
+       " '01000',\n",
+       " '00111',\n",
+       " '10011',\n",
+       " '01101',\n",
+       " '00100',\n",
+       " '00111',\n",
+       " '01000',\n",
+       " '01000',\n",
+       " '01010',\n",
+       " '00000',\n",
+       " '01100',\n",
+       " '10001',\n",
+       " '00011',\n",
+       " '01100',\n",
+       " '01101',\n",
+       " '00000',\n",
+       " '00011',\n",
+       " '00000',\n",
+       " '01101',\n",
+       " '00000',\n",
+       " '01110',\n",
+       " '00011',\n",
+       " '10010',\n",
+       " '00100',\n",
+       " '10010',\n",
+       " '00100',\n",
+       " '01000',\n",
+       " '11000',\n",
+       " '00010',\n",
+       " '01011',\n",
+       " '10010',\n",
+       " '01000',\n",
+       " '00000',\n",
+       " '01101',\n",
+       " '10011',\n",
+       " '00000',\n",
+       " '01110',\n",
+       " '01011',\n",
+       " '10011',\n",
+       " '00010',\n",
+       " '01000',\n",
+       " '11000',\n",
+       " '01100',\n",
+       " '01000',\n",
+       " '00011',\n",
+       " '00100',\n",
+       " '01101',\n",
+       " '10011',\n",
+       " '10011',\n",
+       " '00111',\n",
+       " '01011',\n",
+       " '10011',\n",
+       " '01101',\n",
+       " '00011',\n",
+       " '10111',\n",
+       " '10011',\n",
+       " '10011',\n",
+       " '10011',\n",
+       " '01100',\n",
+       " '00000',\n",
+       " '10010',\n",
+       " '00001',\n",
+       " '01011',\n",
+       " '00100',\n",
+       " '00000',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '10011',\n",
+       " '01011',\n",
+       " '01000',\n",
+       " '10010',\n",
+       " '01000',\n",
+       " '10001',\n",
+       " '10011',\n",
+       " '10110',\n",
+       " '10011',\n",
+       " '10100',\n",
+       " '10001',\n",
+       " '01111',\n",
+       " '00101',\n",
+       " '00000',\n",
+       " '01000',\n",
+       " '01011',\n",
+       " '10011',\n",
+       " '00100',\n",
+       " '00000',\n",
+       " '01110',\n",
+       " '00100',\n",
+       " '00101',\n",
+       " '00100',\n",
+       " '01000',\n",
+       " '10010',\n",
+       " '01000',\n",
+       " '01000',\n",
+       " '01000',\n",
+       " '11000',\n",
+       " '01000',\n",
+       " '10010',\n",
+       " '01000',\n",
+       " '01010',\n",
+       " '10101',\n",
+       " '10011',\n",
+       " '10110',\n",
+       " '01000',\n",
+       " '10010',\n",
+       " '01111',\n",
+       " '10001',\n",
+       " '00001',\n",
+       " '10010',\n",
+       " '01000',\n",
+       " '01101',\n",
+       " '00100',\n",
+       " '01011',\n",
+       " '01111',\n",
+       " '00111',\n",
+       " '10001',\n",
+       " '01100',\n",
+       " '01110',\n",
+       " '00111',\n",
+       " '01000',\n",
+       " '00000',\n",
+       " '00110',\n",
+       " '01101',\n",
+       " '01011',\n",
+       " '10010',\n",
+       " '01011',\n",
+       " '10101',\n",
+       " '01000',\n",
+       " '10011',\n",
+       " '01110',\n",
+       " '00011',\n",
+       " '00000',\n",
+       " '01000',\n",
+       " '10010',\n",
+       " '00011',\n",
+       " '01111',\n",
+       " '01101',\n",
+       " '11000',\n",
+       " '00011',\n",
+       " '00011',\n",
+       " '00010',\n",
+       " '00000',\n",
+       " '00000',\n",
+       " '01110',\n",
+       " '10011',\n",
+       " '00000',\n",
+       " '00111',\n",
+       " '00010',\n",
+       " '00100',\n",
+       " '00111',\n",
+       " '10011',\n",
+       " '10100',\n",
+       " '00100',\n",
+       " '01000',\n",
+       " '10001',\n",
+       " '10001',\n",
+       " '00100',\n",
+       " '00011',\n",
+       " '00000',\n",
+       " '00100',\n",
+       " '00010',\n",
+       " '10011',\n",
+       " '01110',\n",
+       " '10010',\n",
+       " '01101',\n",
+       " '10001',\n",
+       " '00111',\n",
+       " '10101',\n",
+       " '01101',\n",
+       " '00000',\n",
+       " '01110',\n",
+       " '00011',\n",
+       " '01110',\n",
+       " '01000',\n",
+       " '01010',\n",
+       " '01110',\n",
+       " '00100',\n",
+       " '10011',\n",
+       " '00010',\n",
+       " '01000',\n",
+       " '01101',\n",
+       " '00100',\n",
+       " '01101',\n",
+       " '00100',\n",
+       " '10100',\n",
+       " '10001',\n",
+       " '10001',\n",
+       " '01000',\n",
+       " '10010',\n",
+       " '00011',\n",
+       " '00010',\n",
+       " '01110',\n",
+       " '10100',\n",
+       " '10001',\n",
+       " '00000',\n",
+       " '00110',\n",
+       " '01011',\n",
+       " '10101',\n",
+       " '01000',\n",
+       " '01100',\n",
+       " '01100',\n",
+       " '10100',\n",
+       " '01111',\n",
+       " '01111',\n",
+       " '00011',\n",
+       " '01000',\n",
+       " '10011',\n",
+       " '00100',\n",
+       " '00000',\n",
+       " '01101',\n",
+       " '00011',\n",
+       " '01000',\n",
+       " '10011',\n",
+       " '01100',\n",
+       " '00000',\n",
+       " '00000',\n",
+       " '01000',\n",
+       " '00000',\n",
+       " '01000',\n",
+       " '00100',\n",
+       " '01011',\n",
+       " '00100',\n",
+       " '01110',\n",
+       " '01101',\n",
+       " '01101',\n",
+       " '10001',\n",
+       " '00100',\n",
+       " '00100',\n",
+       " '00011',\n",
+       " '00000',\n",
+       " '01110',\n",
+       " '00011',\n",
+       " '00001',\n",
+       " '01110',\n",
+       " '01000',\n",
+       " '10100',\n",
+       " '01100',\n",
+       " '00100',\n",
+       " '01011',\n",
+       " '10001',\n",
+       " '01110',\n",
+       " '10011',\n",
+       " '01101',\n",
+       " '10011',\n",
+       " '10011',\n",
+       " '10011',\n",
+       " '00110',\n",
+       " '01000',\n",
+       " '10011',\n",
+       " '01101',\n",
+       " ...]"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[c for c in chunks(c8b, 5)]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[0,\n",
+       " 5,\n",
+       " 2,\n",
+       " 0,\n",
+       " 4,\n",
+       " 20,\n",
+       " 14,\n",
+       " 19,\n",
+       " 19,\n",
+       " 0,\n",
+       " 2,\n",
+       " 19,\n",
+       " 7,\n",
+       " 17,\n",
+       " 8,\n",
+       " 14,\n",
+       " 11,\n",
+       " 4,\n",
+       " 19,\n",
+       " 2,\n",
+       " 18,\n",
+       " 4,\n",
+       " 17,\n",
+       " 19,\n",
+       " 7,\n",
+       " 18,\n",
+       " 7,\n",
+       " 19,\n",
+       " 17,\n",
+       " 0,\n",
+       " 7,\n",
+       " 10,\n",
+       " 24,\n",
+       " 14,\n",
+       " 17,\n",
+       " 15,\n",
+       " 5,\n",
+       " 17,\n",
+       " 6,\n",
+       " 4,\n",
+       " 14,\n",
+       " 0,\n",
+       " 3,\n",
+       " 15,\n",
+       " 15,\n",
+       " 9,\n",
+       " 13,\n",
+       " 6,\n",
+       " 11,\n",
+       " 19,\n",
+       " 4,\n",
+       " 17,\n",
+       " 13,\n",
+       " 4,\n",
+       " 5,\n",
+       " 4,\n",
+       " 14,\n",
+       " 5,\n",
+       " 8,\n",
+       " 14,\n",
+       " 17,\n",
+       " 19,\n",
+       " 18,\n",
+       " 3,\n",
+       " 3,\n",
+       " 14,\n",
+       " 4,\n",
+       " 4,\n",
+       " 20,\n",
+       " 12,\n",
+       " 18,\n",
+       " 2,\n",
+       " 17,\n",
+       " 20,\n",
+       " 4,\n",
+       " 17,\n",
+       " 13,\n",
+       " 5,\n",
+       " 4,\n",
+       " 19,\n",
+       " 11,\n",
+       " 0,\n",
+       " 0,\n",
+       " 5,\n",
+       " 18,\n",
+       " 19,\n",
+       " 22,\n",
+       " 8,\n",
+       " 4,\n",
+       " 13,\n",
+       " 19,\n",
+       " 17,\n",
+       " 21,\n",
+       " 14,\n",
+       " 14,\n",
+       " 13,\n",
+       " 4,\n",
+       " 17,\n",
+       " 7,\n",
+       " 20,\n",
+       " 0,\n",
+       " 7,\n",
+       " 17,\n",
+       " 0,\n",
+       " 21,\n",
+       " 4,\n",
+       " 17,\n",
+       " 4,\n",
+       " 4,\n",
+       " 19,\n",
+       " 18,\n",
+       " 21,\n",
+       " 18,\n",
+       " 8,\n",
+       " 4,\n",
+       " 11,\n",
+       " 7,\n",
+       " 11,\n",
+       " 14,\n",
+       " 18,\n",
+       " 19,\n",
+       " 3,\n",
+       " 14,\n",
+       " 0,\n",
+       " 11,\n",
+       " 14,\n",
+       " 24,\n",
+       " 0,\n",
+       " 4,\n",
+       " 18,\n",
+       " 12,\n",
+       " 13,\n",
+       " 13,\n",
+       " 3,\n",
+       " 8,\n",
+       " 6,\n",
+       " 13,\n",
+       " 13,\n",
+       " 17,\n",
+       " 7,\n",
+       " 14,\n",
+       " 7,\n",
+       " 7,\n",
+       " 19,\n",
+       " 18,\n",
+       " 13,\n",
+       " 0,\n",
+       " 14,\n",
+       " 8,\n",
+       " 11,\n",
+       " 13,\n",
+       " 2,\n",
+       " 13,\n",
+       " 18,\n",
+       " 18,\n",
+       " 8,\n",
+       " 2,\n",
+       " 17,\n",
+       " 4,\n",
+       " 0,\n",
+       " 13,\n",
+       " 13,\n",
+       " 4,\n",
+       " 4,\n",
+       " 8,\n",
+       " 8,\n",
+       " 8,\n",
+       " 4,\n",
+       " 17,\n",
+       " 22,\n",
+       " 19,\n",
+       " 0,\n",
+       " 13,\n",
+       " 4,\n",
+       " 18,\n",
+       " 17,\n",
+       " 21,\n",
+       " 14,\n",
+       " 6,\n",
+       " 8,\n",
+       " 4,\n",
+       " 8,\n",
+       " 24,\n",
+       " 22,\n",
+       " 18,\n",
+       " 18,\n",
+       " 3,\n",
+       " 6,\n",
+       " 15,\n",
+       " 21,\n",
+       " 14,\n",
+       " 8,\n",
+       " 0,\n",
+       " 8,\n",
+       " 18,\n",
+       " 0,\n",
+       " 14,\n",
+       " 0,\n",
+       " 4,\n",
+       " 14,\n",
+       " 0,\n",
+       " 4,\n",
+       " 3,\n",
+       " 17,\n",
+       " 13,\n",
+       " 8,\n",
+       " 19,\n",
+       " 17,\n",
+       " 13,\n",
+       " 23,\n",
+       " 4,\n",
+       " 8,\n",
+       " 6,\n",
+       " 17,\n",
+       " 15,\n",
+       " 18,\n",
+       " 18,\n",
+       " 7,\n",
+       " 0,\n",
+       " 3,\n",
+       " 7,\n",
+       " 3,\n",
+       " 19,\n",
+       " 14,\n",
+       " 8,\n",
+       " 15,\n",
+       " 0,\n",
+       " 0,\n",
+       " 19,\n",
+       " 4,\n",
+       " 23,\n",
+       " 4,\n",
+       " 13,\n",
+       " 13,\n",
+       " 4,\n",
+       " 18,\n",
+       " 0,\n",
+       " 6,\n",
+       " 17,\n",
+       " 14,\n",
+       " 1,\n",
+       " 19,\n",
+       " 11,\n",
+       " 4,\n",
+       " 18,\n",
+       " 17,\n",
+       " 13,\n",
+       " 17,\n",
+       " 14,\n",
+       " 8,\n",
+       " 17,\n",
+       " 24,\n",
+       " 15,\n",
+       " 1,\n",
+       " 6,\n",
+       " 4,\n",
+       " 3,\n",
+       " 2,\n",
+       " 11,\n",
+       " 11,\n",
+       " 8,\n",
+       " 22,\n",
+       " 0,\n",
+       " 11,\n",
+       " 0,\n",
+       " 11,\n",
+       " 4,\n",
+       " 4,\n",
+       " 13,\n",
+       " 8,\n",
+       " 6,\n",
+       " 17,\n",
+       " 17,\n",
+       " 13,\n",
+       " 22,\n",
+       " 24,\n",
+       " 17,\n",
+       " 11,\n",
+       " 8,\n",
+       " 12,\n",
+       " 11,\n",
+       " 15,\n",
+       " 18,\n",
+       " 19,\n",
+       " 14,\n",
+       " 11,\n",
+       " 4,\n",
+       " 5,\n",
+       " 19,\n",
+       " 17,\n",
+       " 3,\n",
+       " 12,\n",
+       " 20,\n",
+       " 0,\n",
+       " 17,\n",
+       " 8,\n",
+       " 4,\n",
+       " 4,\n",
+       " 4,\n",
+       " 8,\n",
+       " 8,\n",
+       " 0,\n",
+       " 14,\n",
+       " 11,\n",
+       " 13,\n",
+       " 4,\n",
+       " 22,\n",
+       " 18,\n",
+       " 0,\n",
+       " 14,\n",
+       " 7,\n",
+       " 17,\n",
+       " 19,\n",
+       " 11,\n",
+       " 18,\n",
+       " 19,\n",
+       " 14,\n",
+       " 1,\n",
+       " 4,\n",
+       " 19,\n",
+       " 13,\n",
+       " 18,\n",
+       " 11,\n",
+       " 21,\n",
+       " 5,\n",
+       " 8,\n",
+       " 21,\n",
+       " 3,\n",
+       " 14,\n",
+       " 21,\n",
+       " 19,\n",
+       " 15,\n",
+       " 14,\n",
+       " 0,\n",
+       " 4,\n",
+       " 4,\n",
+       " 8,\n",
+       " 18,\n",
+       " 2,\n",
+       " 8,\n",
+       " 14,\n",
+       " 7,\n",
+       " 8,\n",
+       " 15,\n",
+       " 18,\n",
+       " 4,\n",
+       " 21,\n",
+       " 4,\n",
+       " 4,\n",
+       " 3,\n",
+       " 19,\n",
+       " 4,\n",
+       " 22,\n",
+       " 5,\n",
+       " 0,\n",
+       " 17,\n",
+       " 13,\n",
+       " 7,\n",
+       " 4,\n",
+       " 1,\n",
+       " 11,\n",
+       " 4,\n",
+       " 0,\n",
+       " 14,\n",
+       " 19,\n",
+       " 14,\n",
+       " 7,\n",
+       " 19,\n",
+       " 19,\n",
+       " 19,\n",
+       " 4,\n",
+       " 15,\n",
+       " 13,\n",
+       " 2,\n",
+       " 10,\n",
+       " 0,\n",
+       " 14,\n",
+       " 13,\n",
+       " 7,\n",
+       " 22,\n",
+       " 4,\n",
+       " 19,\n",
+       " 12,\n",
+       " 21,\n",
+       " 24,\n",
+       " 15,\n",
+       " 17,\n",
+       " 17,\n",
+       " 4,\n",
+       " 14,\n",
+       " 13,\n",
+       " 13,\n",
+       " 0,\n",
+       " 18,\n",
+       " 6,\n",
+       " 3,\n",
+       " 4,\n",
+       " 3,\n",
+       " 14,\n",
+       " 4,\n",
+       " 4,\n",
+       " 4,\n",
+       " 14,\n",
+       " 0,\n",
+       " 0,\n",
+       " 12,\n",
+       " 19,\n",
+       " 2,\n",
+       " 8,\n",
+       " 2,\n",
+       " 19,\n",
+       " 19,\n",
+       " 8,\n",
+       " 5,\n",
+       " 13,\n",
+       " 0,\n",
+       " 3,\n",
+       " 17,\n",
+       " 4,\n",
+       " 18,\n",
+       " 17,\n",
+       " 19,\n",
+       " 18,\n",
+       " 4,\n",
+       " 17,\n",
+       " 14,\n",
+       " 18,\n",
+       " 4,\n",
+       " 19,\n",
+       " 17,\n",
+       " 7,\n",
+       " 2,\n",
+       " 8,\n",
+       " 2,\n",
+       " 19,\n",
+       " 15,\n",
+       " 18,\n",
+       " 0,\n",
+       " 0,\n",
+       " 4,\n",
+       " 7,\n",
+       " 11,\n",
+       " 3,\n",
+       " 7,\n",
+       " 18,\n",
+       " 5,\n",
+       " 23,\n",
+       " 18,\n",
+       " 14,\n",
+       " 0,\n",
+       " 14,\n",
+       " 19,\n",
+       " 2,\n",
+       " 19,\n",
+       " 1,\n",
+       " 1,\n",
+       " 18,\n",
+       " 14,\n",
+       " 4,\n",
+       " 8,\n",
+       " 17,\n",
+       " 13,\n",
+       " 18,\n",
+       " 0,\n",
+       " 3,\n",
+       " 11,\n",
+       " 24,\n",
+       " 19,\n",
+       " 17,\n",
+       " 17,\n",
+       " 20,\n",
+       " 13,\n",
+       " 17,\n",
+       " 2,\n",
+       " 4,\n",
+       " 15,\n",
+       " 19,\n",
+       " 19,\n",
+       " 7,\n",
+       " 17,\n",
+       " 4,\n",
+       " 20,\n",
+       " 7,\n",
+       " 13,\n",
+       " 10,\n",
+       " 19,\n",
+       " 0,\n",
+       " 2,\n",
+       " 4,\n",
+       " 2,\n",
+       " 4,\n",
+       " 4,\n",
+       " 11,\n",
+       " 17,\n",
+       " 22,\n",
+       " 13,\n",
+       " 8,\n",
+       " 17,\n",
+       " 4,\n",
+       " 4,\n",
+       " 4,\n",
+       " 0,\n",
+       " 4,\n",
+       " 18,\n",
+       " 4,\n",
+       " 4,\n",
+       " 4,\n",
+       " 8,\n",
+       " 3,\n",
+       " 8,\n",
+       " 18,\n",
+       " 14,\n",
+       " 6,\n",
+       " 2,\n",
+       " 4,\n",
+       " 14,\n",
+       " 12,\n",
+       " 13,\n",
+       " 17,\n",
+       " 19,\n",
+       " 4,\n",
+       " 9,\n",
+       " 7,\n",
+       " 0,\n",
+       " 6,\n",
+       " 0,\n",
+       " 1,\n",
+       " 18,\n",
+       " 4,\n",
+       " 13,\n",
+       " 8,\n",
+       " 19,\n",
+       " 11,\n",
+       " 22,\n",
+       " 19,\n",
+       " 17,\n",
+       " 13,\n",
+       " 1,\n",
+       " 12,\n",
+       " 8,\n",
+       " 4,\n",
+       " 11,\n",
+       " 18,\n",
+       " 0,\n",
+       " 17,\n",
+       " 4,\n",
+       " 19,\n",
+       " 4,\n",
+       " 18,\n",
+       " 17,\n",
+       " 13,\n",
+       " 6,\n",
+       " 18,\n",
+       " 13,\n",
+       " 7,\n",
+       " 4,\n",
+       " 1,\n",
+       " 8,\n",
+       " 14,\n",
+       " 18,\n",
+       " 3,\n",
+       " 8,\n",
+       " 4,\n",
+       " 13,\n",
+       " 0,\n",
+       " 5,\n",
+       " 11,\n",
+       " 4,\n",
+       " 8,\n",
+       " 18,\n",
+       " 0,\n",
+       " 7,\n",
+       " 14,\n",
+       " 2,\n",
+       " 8,\n",
+       " 5,\n",
+       " 4,\n",
+       " 21,\n",
+       " 12,\n",
+       " 5,\n",
+       " 0,\n",
+       " 19,\n",
+       " 0,\n",
+       " 13,\n",
+       " 0,\n",
+       " 19,\n",
+       " 17,\n",
+       " 13,\n",
+       " 8,\n",
+       " 0,\n",
+       " 6,\n",
+       " 13,\n",
+       " 7,\n",
+       " 0,\n",
+       " 19,\n",
+       " 13,\n",
+       " 12,\n",
+       " 8,\n",
+       " 1,\n",
+       " 13,\n",
+       " 8,\n",
+       " 20,\n",
+       " 5,\n",
+       " 4,\n",
+       " 13,\n",
+       " 17,\n",
+       " 19,\n",
+       " 14,\n",
+       " 19,\n",
+       " 19,\n",
+       " 17,\n",
+       " 13,\n",
+       " 24,\n",
+       " 15,\n",
+       " 0,\n",
+       " 8,\n",
+       " 3,\n",
+       " 24,\n",
+       " 8,\n",
+       " 4,\n",
+       " 6,\n",
+       " 3,\n",
+       " 13,\n",
+       " 12,\n",
+       " 4,\n",
+       " 17,\n",
+       " 7,\n",
+       " 7,\n",
+       " 8,\n",
+       " 14,\n",
+       " 19,\n",
+       " 17,\n",
+       " 4,\n",
+       " 19,\n",
+       " 2,\n",
+       " 4,\n",
+       " 18,\n",
+       " 18,\n",
+       " 4,\n",
+       " 8,\n",
+       " 11,\n",
+       " 3,\n",
+       " 17,\n",
+       " 1,\n",
+       " 2,\n",
+       " 4,\n",
+       " 15,\n",
+       " 17,\n",
+       " 8,\n",
+       " 6,\n",
+       " 0,\n",
+       " 4,\n",
+       " 18,\n",
+       " 14,\n",
+       " 0,\n",
+       " 3,\n",
+       " 11,\n",
+       " 19,\n",
+       " 0,\n",
+       " 7,\n",
+       " 8,\n",
+       " 4,\n",
+       " 21,\n",
+       " 4,\n",
+       " 1,\n",
+       " 17,\n",
+       " 2,\n",
+       " 4,\n",
+       " 13,\n",
+       " 11,\n",
+       " 4,\n",
+       " 21,\n",
+       " 0,\n",
+       " 18,\n",
+       " 0,\n",
+       " 3,\n",
+       " 13,\n",
+       " 13,\n",
+       " 19,\n",
+       " 7,\n",
+       " 13,\n",
+       " 4,\n",
+       " 8,\n",
+       " 19,\n",
+       " 4,\n",
+       " 8,\n",
+       " 8,\n",
+       " 18,\n",
+       " 0,\n",
+       " 7,\n",
+       " 20,\n",
+       " 7,\n",
+       " 7,\n",
+       " 20,\n",
+       " 0,\n",
+       " 12,\n",
+       " 14,\n",
+       " 13,\n",
+       " 4,\n",
+       " 5,\n",
+       " 24,\n",
+       " 7,\n",
+       " 11,\n",
+       " 14,\n",
+       " 13,\n",
+       " 22,\n",
+       " 7,\n",
+       " 0,\n",
+       " 4,\n",
+       " 4,\n",
+       " 4,\n",
+       " 4,\n",
+       " 14,\n",
+       " 18,\n",
+       " 13,\n",
+       " 4,\n",
+       " 4,\n",
+       " 24,\n",
+       " 0,\n",
+       " 13,\n",
+       " 4,\n",
+       " 8,\n",
+       " 18,\n",
+       " 4,\n",
+       " 19,\n",
+       " 14,\n",
+       " 6,\n",
+       " 24,\n",
+       " 8,\n",
+       " 19,\n",
+       " 4,\n",
+       " 17,\n",
+       " 11,\n",
+       " 8,\n",
+       " 7,\n",
+       " 19,\n",
+       " 2,\n",
+       " 12,\n",
+       " 8,\n",
+       " 14,\n",
+       " 8,\n",
+       " 17,\n",
+       " 0,\n",
+       " 17,\n",
+       " 5,\n",
+       " 3,\n",
+       " 14,\n",
+       " 4,\n",
+       " 19,\n",
+       " 13,\n",
+       " 8,\n",
+       " 7,\n",
+       " 19,\n",
+       " 13,\n",
+       " 4,\n",
+       " 7,\n",
+       " 8,\n",
+       " 8,\n",
+       " 10,\n",
+       " 0,\n",
+       " 12,\n",
+       " 17,\n",
+       " 3,\n",
+       " 12,\n",
+       " 13,\n",
+       " 0,\n",
+       " 3,\n",
+       " 0,\n",
+       " 13,\n",
+       " 0,\n",
+       " 14,\n",
+       " 3,\n",
+       " 18,\n",
+       " 4,\n",
+       " 18,\n",
+       " 4,\n",
+       " 8,\n",
+       " 24,\n",
+       " 2,\n",
+       " 11,\n",
+       " 18,\n",
+       " 8,\n",
+       " 0,\n",
+       " 13,\n",
+       " 19,\n",
+       " 0,\n",
+       " 14,\n",
+       " 11,\n",
+       " 19,\n",
+       " 2,\n",
+       " 8,\n",
+       " 24,\n",
+       " 12,\n",
+       " 8,\n",
+       " 3,\n",
+       " 4,\n",
+       " 13,\n",
+       " 19,\n",
+       " 19,\n",
+       " 7,\n",
+       " 11,\n",
+       " 19,\n",
+       " 13,\n",
+       " 3,\n",
+       " 23,\n",
+       " 19,\n",
+       " 19,\n",
+       " 19,\n",
+       " 12,\n",
+       " 0,\n",
+       " 18,\n",
+       " 1,\n",
+       " 11,\n",
+       " 4,\n",
+       " 0,\n",
+       " 4,\n",
+       " 4,\n",
+       " 19,\n",
+       " 11,\n",
+       " 8,\n",
+       " 18,\n",
+       " 8,\n",
+       " 17,\n",
+       " 19,\n",
+       " 22,\n",
+       " 19,\n",
+       " 20,\n",
+       " 17,\n",
+       " 15,\n",
+       " 5,\n",
+       " 0,\n",
+       " 8,\n",
+       " 11,\n",
+       " 19,\n",
+       " 4,\n",
+       " 0,\n",
+       " 14,\n",
+       " 4,\n",
+       " 5,\n",
+       " 4,\n",
+       " 8,\n",
+       " 18,\n",
+       " 8,\n",
+       " 8,\n",
+       " 8,\n",
+       " 24,\n",
+       " 8,\n",
+       " 18,\n",
+       " 8,\n",
+       " 10,\n",
+       " 21,\n",
+       " 19,\n",
+       " 22,\n",
+       " 8,\n",
+       " 18,\n",
+       " 15,\n",
+       " 17,\n",
+       " 1,\n",
+       " 18,\n",
+       " 8,\n",
+       " 13,\n",
+       " 4,\n",
+       " 11,\n",
+       " 15,\n",
+       " 7,\n",
+       " 17,\n",
+       " 12,\n",
+       " 14,\n",
+       " 7,\n",
+       " 8,\n",
+       " 0,\n",
+       " 6,\n",
+       " 13,\n",
+       " 11,\n",
+       " 18,\n",
+       " 11,\n",
+       " 21,\n",
+       " 8,\n",
+       " 19,\n",
+       " 14,\n",
+       " 3,\n",
+       " 0,\n",
+       " 8,\n",
+       " 18,\n",
+       " 3,\n",
+       " 15,\n",
+       " 13,\n",
+       " 24,\n",
+       " 3,\n",
+       " 3,\n",
+       " 2,\n",
+       " 0,\n",
+       " 0,\n",
+       " 14,\n",
+       " 19,\n",
+       " 0,\n",
+       " 7,\n",
+       " 2,\n",
+       " 4,\n",
+       " 7,\n",
+       " 19,\n",
+       " 20,\n",
+       " 4,\n",
+       " 8,\n",
+       " 17,\n",
+       " 17,\n",
+       " 4,\n",
+       " 3,\n",
+       " 0,\n",
+       " 4,\n",
+       " 2,\n",
+       " 19,\n",
+       " 14,\n",
+       " 18,\n",
+       " 13,\n",
+       " 17,\n",
+       " 7,\n",
+       " 21,\n",
+       " 13,\n",
+       " 0,\n",
+       " 14,\n",
+       " 3,\n",
+       " 14,\n",
+       " 8,\n",
+       " 10,\n",
+       " 14,\n",
+       " 4,\n",
+       " 19,\n",
+       " 2,\n",
+       " 8,\n",
+       " 13,\n",
+       " 4,\n",
+       " 13,\n",
+       " 4,\n",
+       " 20,\n",
+       " 17,\n",
+       " 17,\n",
+       " 8,\n",
+       " 18,\n",
+       " 3,\n",
+       " 2,\n",
+       " 14,\n",
+       " 20,\n",
+       " 17,\n",
+       " 0,\n",
+       " 6,\n",
+       " 11,\n",
+       " 21,\n",
+       " 8,\n",
+       " 12,\n",
+       " 12,\n",
+       " 20,\n",
+       " 15,\n",
+       " 15,\n",
+       " 3,\n",
+       " 8,\n",
+       " 19,\n",
+       " 4,\n",
+       " 0,\n",
+       " 13,\n",
+       " 3,\n",
+       " 8,\n",
+       " 19,\n",
+       " 12,\n",
+       " 0,\n",
+       " 0,\n",
+       " 8,\n",
+       " 0,\n",
+       " 8,\n",
+       " 4,\n",
+       " 11,\n",
+       " 4,\n",
+       " 14,\n",
+       " 13,\n",
+       " 13,\n",
+       " 17,\n",
+       " 4,\n",
+       " 4,\n",
+       " 3,\n",
+       " 0,\n",
+       " 14,\n",
+       " 3,\n",
+       " 1,\n",
+       " 14,\n",
+       " 8,\n",
+       " 20,\n",
+       " 12,\n",
+       " 4,\n",
+       " 11,\n",
+       " 17,\n",
+       " 14,\n",
+       " 19,\n",
+       " 13,\n",
+       " 19,\n",
+       " 19,\n",
+       " 19,\n",
+       " 6,\n",
+       " 8,\n",
+       " 19,\n",
+       " 13,\n",
+       " ...]"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[(int(c, 2)) for c in chunks(c8b, 5)]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "24"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "max([(int(c, 2)) for c in chunks(c8b, 5)])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'y'"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "max([chr(int(c, 2) + ord('a')) for c in chunks(c8b, 5)])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "def cadenus_letter(n, doubled='v'):\n",
+    "    letter = chr(n + ord('a'))\n",
+    "    if letter > doubled:\n",
+    "        letter = chr(n + ord('a') + 1)\n",
+    "    return letter"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'afcaeuottacthrioletcserthshtrahkyorpfrgeoadppjnglternefeofiortsddoeeumscruernfetlaafstwientrvoonerhuahravereetsvsielhlostdoaloyaesmnndignnrhohhtsnaoilncnssicreanneeiiierwtanesrvogieiywssdgpvoiaisaoaeoaedrnitrnxeigrpsshadhdtoipaatexennesagrobtlesrnroirypbgedclliwalaleenigrrnwyrlimlpstoleftrdmuarieeeiiaolnewsaohrtlstobetnslvfivdovtpoaeeisciohipseveedtewfarnhebleaotohtttepnckaonhwetmvyprreonnasgdedoeeeoaamtcicttifnadresrtserosetrhcictpsaaehldhsfxsoaotctbbsoeirnsadlytrrunrceptthreuhnktaceceelrwnireeeaeseeeidisogceomnrtejhagabsenitlwtrnbmielsaretesrngsnhebiosdienafleisahocifevmfatanatrniagnhatnmibniufenrtottrnypaidyiegdnmerhhiotretcesseildrbceprigaesoadltahievebrcenlevasadnnthneiteiisahuhhuamonefyhlonwhaeeeeosneeyaneisetogyiterlihtcmioirarfdoetnihtnehiikamrdmnadanaodseseiyclsiantaoltciymidentthltndxtttmasbleaeetlisirtwturpfailteaoefeisiiiyisikvtwisprbsinelphrmohiagnlslvitodaisdpnyddcaaotahcehtueirredaectosnrhvnaodoikoetcineneurrisdcouraglvimmuppditeanditmaaiaieleonnreedaodboiumelrotntttgitnrlrienniklysogstcifypipvidvssmnceiasiitsnneatitomrhbnhnidprlrepoynalsnvsdosanesitfaenltgodatteeaisicrootmsmfhauenirsghynweintegodiileedtarnosrcaaendtcuttfdrbehtmfitoordruiaoyaanoeeldoinhusgiteaoriecevemntratmtfpeucutahamtnewonicdeemrpaolitoafesoosspfnlneeootachllirssxsofpdftfrnpraeeaylonahautntcntcbawloneftoatecvowdlwvnneedtiioigtegmtaheeatefaaeprrcrosheerrpalediengidrreouhvesuroytnsosinuiuiofprda'"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c8bl = ''.join([cadenus_letter(int(c, 2), doubled='z') for c in chunks(c8b, 5)])\n",
+    "c8bl"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('a', 'y')"
+      ]
+     },
+     "execution_count": 14,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "min(c8bl), max(c8bl)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(1400, 56.0)"
+      ]
+     },
+     "execution_count": 15,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(c8bl), len(c8bl) / 25"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f420b349a20>"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\nNbxLWGOjAAAAAElFTkSuQmCC\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f420b349048>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_8b = pd.Series(collections.Counter([l.lower() for l in c8bl if l in string.ascii_letters]))\n",
+    "freqs_8b.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f420b2a5d68>"
+      ]
+     },
+     "execution_count": 17,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAD+CAYAAAA+hqL9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHrNJREFUeJzt3X+cXXV95/HXG7KJESJhkIYAAVJ3EOLqQ40muv7YcZGQ\n7iqwWwphtzC1sz4qUdF9dPswcVcyU7oW3G0pdhdqLUISlSYVhdjFMGPira4aBhE0JaZJVsdNBjK4\ngwna+iMpn/3jfIc553J/Z37cTN7Px+M+7vd8z/f7Pd9z58z93PP9nnuuIgIzM7MxJ013B8zMrL04\nMJiZWYEDg5mZFTgwmJlZgQODmZkVODCYmVlB3cAgaa2kJyTtlPRZSXMkdUgakLRHUr+k+WXl90ra\nLWlFLn9pamOvpNtz+XMkbUr5OySdn1vXnbaxR9L1E7njZmZWWc3AIOkC4N3AayPilcDJwCpgDTAQ\nERcC29IykpYA1wBLgJXAHZKUmrsT6ImITqBT0sqU3wOMpvzbgFtTWx3ATcCy9FiXD0BmZjY56p0x\nPAscAV4saRbwYuBJ4HJgfSqzHrgypa8A7o2IIxExBOwDlktaCMyLiMFUbkOuTr6t+4BLUvoyoD8i\nDkXEIWCALNiYmdkkqhkYIuIZ4I+A/0sWEA5FxACwICJGUrERYEFKnw0cyDVxADinQv5wyic970/b\nOwoclnRGjbbMzGwS1RtKehnwQeACsjfqUyX9Zr5MZPfU8H01zMxmiFl11r8O+EZEjAJI+jzwRuCg\npLMi4mAaJno6lR8GFuXqn0v2SX84pcvzx+qcBzyZhqtOi4hRScNAV67OImB7eQclOSiZmbUgIlQp\nv94cw27gDZLmpknktwO7gC8C3alMN3B/Sm8BVkmaLWkx0AkMRsRB4FlJy1M71wEP5OqMtXUV2WQ2\nQD+wQtJ8SacDlwIPVdm5io9169ZVXTdRdaZiG67jv81Mq9Ou/TqR6tRS84whIr4jaQPwLeA54NvA\nnwPzgM2SeoAh4OpUfpekzSl4HAVWx3gPVgP3AHOBByNia8q/C9goaS8wSnbVExHxjKSbgUdSub7I\nJqHNzGwS1RtKIiI+BnysLPsZsrOHSuU/Cny0Qv6jwCsr5P+CFFgqrLsbuLteH83MbOKc3NvbO919\nOCZ9fX29tfbhggsuaLrNZutMxTZcp7U67dov12nffp0odfr6+ujt7e2rVF71xpranaQ43vfBzGyq\nSSJanHw2M7MTjAODmZkVODCYmVmBA4OZmRU4MJiZWUHd7zHY9Bm/Y/kL+UosM5ssDgxtr1IAqB4w\nzMyOlYeSzMyswIHBzMwKHBjMzKzAgcHMzAocGMzMrMCBwczMChwYzMyswIHBzMwKHBjMzKzAgcHM\nzArqBgZJL5f0WO5xWNKNkjokDUjaI6lf0vxcnbWS9kraLWlFLn+ppJ1p3e25/DmSNqX8HZLOz63r\nTtvYI+n6idx5MzN7oaZ+2lPSScAwsAx4P/D/IuJjkj4EnB4RayQtAT4LvB44B/gy0BkRIWkQeF9E\nDEp6EPh4RGyVtBr4ZxGxWtI1wL+JiFWSOoBHgKWpC48CSyPiUK5PM/anPbOb6FW+V9JM3WczmxoT\n+dOebwf2RcR+4HJgfcpfD1yZ0lcA90bEkYgYAvYByyUtBOZFxGAqtyFXJ9/WfcAlKX0Z0B8Rh1Iw\nGABWNtlnMzNrQrOBYRVwb0oviIiRlB4BFqT02cCBXJ0DZGcO5fnDKZ/0vB8gIo4ChyWdUaMtMzOb\nJA0HBkmzgXcCf1W+Lo3leGzDzGwGaOb3GH4NeDQifpSWRySdFREH0zDR0yl/GFiUq3cu2Sf94ZQu\nzx+rcx7wpKRZwGkRMSppGOjK1VkEbC/vWG9v7/Pprq4uurq6youYmZ3QSqUSpVKpobINTz5L+kvg\nSxGxPi1/DBiNiFslrQHml00+L2N88vmfpsnnh4EbgUHgf1GcfH5lRNwgaRVwZW7y+VvAa8l+neZR\n4LWefPbks5kdm1qTzw0FBkmnAD8EFkfET1JeB7CZ7JP+EHD12Bu2pA8Dvw0cBT4QEQ+l/KXAPcBc\n4MGIuDHlzwE2Aq8BRoFVaeIaSe8CPpy68gdjgSnXNwcGM7MmHXNgaGcODGZmzZvIy1XNzGyGc2Aw\nM7MCBwYzMytwYDAzswIHBjMzK3BgMDOzAgcGMzMrcGAwM7MCBwYzMytwYDAzswIHBjMzK3BgMDOz\nAgcGMzMrcGAwM7MCBwYzMytwYDAzswIHBjMzK3BgMDOzAgcGMzMraCgwSJov6XOSvidpl6Tlkjok\nDUjaI6lf0vxc+bWS9kraLWlFLn+ppJ1p3e25/DmSNqX8HZLOz63rTtvYI+n6idpxMzOrrNEzhtuB\nByPiYuBVwG5gDTAQERcC29IykpYA1wBLgJXAHcp+1R7gTqAnIjqBTkkrU34PMJrybwNuTW11ADcB\ny9JjXT4AmZnZxKsbGCSdBrwlIj4FEBFHI+IwcDmwPhVbD1yZ0lcA90bEkYgYAvYByyUtBOZFxGAq\ntyFXJ9/WfcAlKX0Z0B8RhyLiEDBAFmzMzGySNHLGsBj4kaS7JX1b0iclnQIsiIiRVGYEWJDSZwMH\ncvUPAOdUyB9O+aTn/ZAFHuCwpDNqtGVmZpNkVoNlXgu8LyIekfQnpGGjMRERkmIyOtiI3t7e59Nd\nXV10dXVNV1fMzNpSqVSiVCo1VLaRwHAAOBARj6TlzwFrgYOSzoqIg2mY6Om0fhhYlKt/bmpjOKXL\n88fqnAc8KWkWcFpEjEoaBrpydRYB28s7mA8MZmb2QuUfmvv6+qqWrTuUFBEHgf2SLkxZbweeAL4I\ndKe8buD+lN4CrJI0W9JioBMYTO08m65oEnAd8ECuzlhbV5FNZgP0AyvSVVGnA5cCD9Xrs5mZta6R\nMwaA9wOfkTQb+D/Au4CTgc2SeoAh4GqAiNglaTOwCzgKrI6IsWGm1cA9wFyyq5y2pvy7gI2S9gKj\nwKrU1jOSbgbGzlb60iS0mZlNEo2/Zx+fJMXxvg/VZCdWlfZNzNR9NrOpIYmIUKV1/uazmZkVODCY\nmVmBA4OZmRU4MJiZWYEDg5mZFTgwmJlZQaPfYzAzm3LjN2auzJdtTw4HBjNrc9Xe/GsHDWudh5LM\nzKzAgcHMzAocGMzMrMCBwczMChwYzMyswIHBzMwKHBjMzKzAgcHMzAocGMzMrMCBwczMChwYzMys\noKHAIGlI0nclPSZpMOV1SBqQtEdSv6T5ufJrJe2VtFvSilz+Ukk707rbc/lzJG1K+TsknZ9b1522\nsUfS9ROz22ZmVk2jZwwBdEXEayJiWcpbAwxExIXAtrSMpCXANcASYCVwh8ZvkXgn0BMRnUCnpJUp\nvwcYTfm3AbemtjqAm4Bl6bEuH4DMzGziNTOUVH4rw8uB9Sm9Hrgypa8A7o2IIxExBOwDlktaCMyL\niMFUbkOuTr6t+4BLUvoyoD8iDkXEIWCALNiYmdkkaeaM4cuSviXp3SlvQUSMpPQIsCClzwYO5Ooe\nAM6pkD+c8knP+wEi4ihwWNIZNdoyOyFIqvowmyyN/h7DmyLiKUlnAgOSdudXRkRImrZfzOjt7X0+\n3dXVRVdX13R1xWwSVPrXcmCw5pRKJUqlUkNlGwoMEfFUev6RpC+QjfePSDorIg6mYaKnU/FhYFGu\n+rlkn/SHU7o8f6zOecCTkmYBp0XEqKRhoCtXZxGwvbx/+cBgZmYvVP6hua+vr2rZukNJkl4saV5K\nnwKsAHYCW4DuVKwbuD+ltwCrJM2WtBjoBAYj4iDwrKTlaTL6OuCBXJ2xtq4im8wG6AdWSJov6XTg\nUuChen02M7PWNXLGsAD4QhrTnAV8JiL6JX0L2CypBxgCrgaIiF2SNgO7gKPA6hj/YdbVwD3AXODB\niNia8u8CNkraC4wCq1Jbz0i6GXgkletLk9AV+fdhzcyOnY73N0tJz8edLDBU/33Y421fq+/P8bcv\n1poT/RiYaf/T7UQSEVHx07S/+WxmZgUODGZmVuDAYGZmBQ4MZmZW4MBgZmYFDgxmZlbgwGBmZgUO\nDGZmVuDAYGZmBQ4MZmZW4MBgZmYFDgxmZlbgwGBmZgUODGZmVuDAYGZmBQ4MZmZW4MBgZmYFjfy0\np9kx88+umh0/HBhsClX/icYTQa3g6MBo7aShoSRJJ0t6TNIX03KHpAFJeyT1S5qfK7tW0l5JuyWt\nyOUvlbQzrbs9lz9H0qaUv0PS+bl13WkbeyRdPzG7bBNBUtWH1RIVHmbtpdE5hg8Auxg/itcAAxFx\nIbAtLSNpCXANsARYCdyh8XeKO4GeiOgEOiWtTPk9wGjKvw24NbXVAdwELEuPdfkAZO3Ab3JmM1Hd\nwCDpXOBfAX/B+Dn/5cD6lF4PXJnSVwD3RsSRiBgC9gHLJS0E5kXEYCq3IVcn39Z9wCUpfRnQHxGH\nIuIQMEAWbMzMbBI1csZwG/B7wHO5vAURMZLSI8CClD4bOJArdwA4p0L+cMonPe8HiIijwGFJZ9Ro\ny8yOQ7WGHz0E2V5qTj5LegfwdEQ8JqmrUpmICEnTOobQ29ubWyoBXdPSDzOr58S+AGE6lUolSqVS\nQ2VV62oISR8FrgOOAi8CXgJ8Hng90BURB9Mw0Vci4iJJawAi4pZUfyuwDvhhKnNxyr8WeGtE3JDK\n9EbEDkmzgKci4kxJq9I23pPqfALYHhGbyvoYY/uQfeqofuAdb1d+VN+f6d+XZvs20/42rWjl79nO\nx0CzWjkGfNxMHklERMWIXHMoKSI+HBGLImIxsIrsjfk6YAvQnYp1A/en9BZglaTZkhYDncBgRBwE\nnpW0PE1GXwc8kKsz1tZVZJPZAP3ACknzJZ0OXAo81NSem5lZ05r9HsNYeL4F2CypBxgCrgaIiF2S\nNpNdwXQUWB3jIX01cA8wF3gwIram/LuAjZL2AqNkAYiIeEbSzcAjqVxfmoQ2M7NJVHMo6XjgoaTp\n4aGk5nkoyUNJ7aTloSQzMzvxODCYmVmBA4OZmRX4Jnpm1jTfLXdmc2Awsxb5y2ozlYeSzMyswIHB\nzMwKHBjMzKzAgcHMzAocGMzMrMCBwczMChwYzMyswIHBzMwKHBjMzKzAgcHMzAocGMzMrMCBwczM\nChwYzMyswIHBzMwKagYGSS+S9LCkxyXtkvSHKb9D0oCkPZL6Jc3P1Vkraa+k3ZJW5PKXStqZ1t2e\ny58jaVPK3yHp/Ny67rSNPZKun9hdNzOzSmoGhoj4OfC2iHg18CrgbZLeDKwBBiLiQmBbWkbSEuAa\nYAmwErhD47/ocSfQExGdQKeklSm/BxhN+bcBt6a2OoCbgGXpsS4fgMzMbHLUHUqKiH9IydnAycCP\ngcuB9Sl/PXBlSl8B3BsRRyJiCNgHLJe0EJgXEYOp3IZcnXxb9wGXpPRlQH9EHIqIQ8AAWbAxM7NJ\nVDcwSDpJ0uPACPCViHgCWBARI6nICLAgpc8GDuSqHwDOqZA/nPJJz/sBIuIocFjSGTXaMjOzSVT3\npz0j4jng1ZJOAx6S9Lay9SFpWn/gtbe3N7dUArqmpR9mZu2qVCpRKpUaKqtmfrRb0keAnwH/AeiK\niINpmOgrEXGRpDUAEXFLKr8VWAf8MJW5OOVfC7w1Im5IZXojYoekWcBTEXGmpFVpG+9JdT4BbI+I\nTWV9irF9yKYzqv8O7fH2A+XV92f696XZvs20v00rWvl7tusx0Mrfc6rqWGMkEREVf6C73lVJLx2b\n8JU0F7gUeAzYAnSnYt3A/Sm9BVglabakxUAnMBgRB4FnJS1Pk9HXAQ/k6oy1dRXZZDZAP7BC0nxJ\np6dtP9TEfpuZWQvqDSUtBNZLOoksiGyMiG2SHgM2S+oBhoCrASJil6TNwC7gKLA6xkP6auAeYC7w\nYERsTfl3ARsl7QVGgVWprWck3Qw8ksr1pUloMzObRE0NJbUjDyVNDw8lNc9DSR5KaictDyWZmdmJ\nx4HBzMwKHBjMzKzAgcHMzArqfsHNJsb4LaMq8ySambULB4YpVf3qCjOzduGhJDMzK/AZg53wPMxn\nVuTAYAZ4mM9snIeSzMyswIHBzMwKHBjMzKzAgcHMzAocGMzMrMCBwczMChwYzMyswIHBzMwKHBjM\nzKzAgcHMzArqBgZJiyR9RdITkv5W0o0pv0PSgKQ9kvolzc/VWStpr6Tdklbk8pdK2pnW3Z7LnyNp\nU8rfIen83LrutI09kq6fuF03M7NKGjljOAL8x4h4BfAG4L2SLgbWAAMRcSGwLS0jaQlwDbAEWAnc\nofG7lN0J9EREJ9ApaWXK7wFGU/5twK2prQ7gJmBZeqzLByAzM5t4dQNDRByMiMdT+qfA94BzgMuB\n9anYeuDKlL4CuDcijkTEELAPWC5pITAvIgZTuQ25Ovm27gMuSenLgP6IOBQRh4ABsmBjZmaTpKk5\nBkkXAK8BHgYWRMRIWjUCLEjps4EDuWoHyAJJef5wyic97weIiKPAYUln1GjLzMwmScO33ZZ0Ktmn\n+Q9ExE/y97CPiJA0bTet7+3tzS2VgK5p6YeZWbsqlUqUSqWGyqqRHyGR9E+Avwa+FBF/kvJ2A10R\ncTANE30lIi6StAYgIm5J5bYC64AfpjIXp/xrgbdGxA2pTG9E7JA0C3gqIs6UtCpt4z2pzieA7RGx\nKde3GNuHLFhVv6/+dP7gSit9q15nevcFmu/bTPvbTOx2qm+jXY+BiT2eJ7aONUYSEVHxB0cauSpJ\nwF3ArrGgkGwBulO6G7g/l79K0mxJi4FOYDAiDgLPSlqe2rwOeKBCW1eRTWYD9AMrJM2XdDpwKfBQ\n3T02M7OWNTKU9CbgN4HvSnos5a0FbgE2S+oBhoCrASJil6TNwC7gKLA6xsP6auAeYC7wYERsTfl3\nARsl7QVGgVWprWck3Qw8ksr1pUloM7OKav1Uq88wGtPQUFI781DS9PBQ0kRux0NJU1Nn+v9v2skx\nDSWZmdmJxYHBzMwKHBjMzKyg4e8xmNk4T3DaTObAYNayyhOcZsc7DyWZmVmBA4OZmRU4MJiZWYHn\nGMzMWjCTL0BwYDAza9nMvADBQ0lmZlbgM4YW1DqFhOP/NNLM2sd0DFk5MLSs+o29zMwm1tQOWTkw\nzDAzeULMzKaGA8OMNDMnxMxsanjy2czMChwYzMyswIHBzMwKPMdgnrA2s4K6ZwySPiVpRNLOXF6H\npAFJeyT1S5qfW7dW0l5JuyWtyOUvlbQzrbs9lz9H0qaUv0PS+bl13WkbeyRdPzG7bJVFhYeZnYga\nGUq6G1hZlrcGGIiIC4FtaRlJS4BrgCWpzh0a/zh6J9ATEZ1Ap6SxNnuA0ZR/G3BraqsDuAlYlh7r\n8gHIzMwmR93AEBFfA35cln05sD6l1wNXpvQVwL0RcSQihoB9wHJJC4F5ETGYym3I1cm3dR9wSUpf\nBvRHxKGIOAQM8MIAZWZmE6zVyecFETGS0iPAgpQ+GziQK3cAOKdC/nDKJz3vB4iIo8BhSWfUaMvM\nzCbRMU8+R0RImtYB6d7e3txSCeialn6YtQNfTGCVlEolSqVSQ2VbDQwjks6KiINpmOjplD8MLMqV\nO5fsk/5wSpfnj9U5D3hS0izgtIgYlTRM8R1+EbC9UmfGAkNfXx8OCmbgb79bua6uLrq6up5fzt4v\nK2t1KGkL0J3S3cD9ufxVkmZLWgx0AoMRcRB4VtLyNBl9HfBAhbauIpvMBugHVkiaL+l04FLgoRb7\nW5Wkmg8zsxNN3TMGSfcC/wJ4qaT9ZFcK3QJsltQDDAFXA0TELkmbgV3AUWB1jJ+7rgbuAeYCD0bE\n1pR/F7BR0l5gFFiV2npG0s3AI6lcX5qEngS+U6qZ2Rgd72OOkp6PPdkn/Opv8pX29fisU7l8O9dp\nZf+nyon+t2nF9P8PtFJnYo+z4307koiIip9+fUsMMzMrcGAwM7MCBwYzMytwYDAzswIHBjMzK/Bt\nt83shOdvixc5MJiZAf62+DgPJZmZWYHPGGxGqXcbkxNxWMCsWQ4MNgP5Fidmx8JDSWZmVuDAYGZm\nBQ4MZmZW4MBgZmYFDgxmZlbgwGBmZgUODGZmVuDAYGZmBW0fGCStlLRb0l5JH5ru/piZzXRtHRgk\nnQz8D2AlsAS4VtLFjbdQamGrzdaZim24DkCp1Gyd5rfhOq28zq1sZyq20d51puZ1bm07bR0YgGXA\nvogYiogjwF8CVzRevdTCJputMxXbcB1wYGjf17mV7UzFNtq7TjsHhna/V9I5wP7c8gFg+TT1xaZY\npRvi9fX1PZ/2DfEmTvlr7dd5chwvr3O7nzG0zytl0yRyj3W5tE08v85TY3JfZ0mFR19fX2G5oTba\nKUqVk/QGoDciVqbltcBzEXFrrkz77oCZWRuLiIqRot0Dwyzg74BLgCeBQeDaiPjetHbMzGwGa+s5\nhog4Kul9wEPAycBdDgpmZpOrrc8YzMxs6rX1GUMrJHUAncCcsbyI+GqN8nOB1cCbyWaBvgbcGRE/\nn4C+/G5uMRj/CbFI/frjGnVPAv49sDgifl/SecBZETF4rP2q0Mfyvh0GHo2Ix6vUeRHw68AFjB9D\nERG/P0F9+npEvEnST3nhzFwAzwD/LSL+Z1m9pRHxaFneOyLiryeiX7k2Xw98mBfu/6tq1GnpNZP0\nauAtpGMzIr5Tp3zTx3OVY+D5dPlxqmwG89yIyF8x2BYkrauQPWHH5omi3a9KaoqkdwN/A2wF+siG\noHrrVNtA9uW5j5N9me4VwMYa29gg6fTccoekT1UpPg84FVgK3ACcTXYJ7nuA19bp1x3AG4F/l5Z/\nmvIq9Wljev5gnTYrWZr6M9a33wF+DfhkjW+aPwBcDhxJ/fop8PdV+vb19PxTST8pezxbqU5EvCk9\nnxoR88oeL0l9vrFC1U9KemVu29cCN1XpV6X+1OxXzmeAu8ne6N+ZHpfXqdPwa5br4weATwNnAguA\nT0uqtN95TR3PSbXj81SyY7iSL9Vps0DS1ZJektIfkfQFSTX/ByTd2khemb9n/PX9R7Jj+YI62/ld\nSefUabe8zqclvVvSRU3UWVIhr6tOnRvz7zcNbme7pH9dlvfnzbRBRMyYB/C3wFzg8bR8EfCFOnV2\nNZKXW/d4I3ll678GzMstzyP79FerzmP555T+TrV9IPun/i7QUf5ooG+n5pZPBb4KvBj4XrXXuQ3+\n1mdXyPtV4Nvp7/7utG+nTcK2v97KsdlCnZ3AKbnlU4Cddeo0dTznjoFmj8/1wLJm9iU9v5nsW1rv\nAB6uU+exau00sd05wN/UKdMLPAH8b+B9wIIG2v2XZNebDgA/AO4DPljvGAA+RHY29mLgT4Edder8\nV2AfsJnsDhBqoG8/SP/D62q9lrUeM+qMAfh5RPwMslP3iNgNvLxOnW9LeuPYQrpE9tEa5ZWGq8YW\nOsgmxmv5FbJPimOOpLxafpluCTK2nTOB56qU/TNgG9m+Plr2+Fad7ZwJ/LKsbwsi4h+AasMP35BU\nddhkKkTEkxXyvg9cC3yB7NP8ZRFxeBI23yfpLknXSvr19Pi3deq0+po9VyVdTbPHM7R2fL4B+Kak\n70vamR7frVH+H9PzO4BPRja8N7tSQUk3SNoJvDzX9k5JQ2QffppxCtlZUFUR0RsRrwDeCywEvipp\nW50628netD8CfBJ4PdlZVy3LgUXAN8musHwK+Od1tvOfgQuBTwG/BeyV9FFJL6tR7RBZ4Fog6YuS\n5tfp1wvMtDmG/em0635gQNKPgaFKBdOBB9lr8HVJ+8nGVs8ju0S2mj8i+4fYTBb5f4PsAKllAzAo\n6fOpzpVkn7hq+VOyN7hfkfRR4Crgv1QqGBEfBz4u6c8i4j112i33GeBhSfenvr0T+KykU8jORJ6X\ne81OBt4l6QfAL8a7UX2MfTLl+jWmg2yY9GFJk9GvbrIgPIvim/Xna9R5C82/ZneT7UP+uKk2bDnm\ndVQ4ntNrVG17rRyfl9VZX244DWdcCtyS5lyqfTD9LNlQ1S2Mf8IG+ElEjNbaSNmxcBJZgGt0fuFp\n4CAwSvaBqdZ2tpEFnW+SnWm8LiKertP+UeBnZKMaLwK+HxF1g31EPCfpIDBCFmBPBz4n6csR8XtV\n6hwFVkv6LbIzwuaGo9JpxoyTxu5eAmyNiF9WWH9BjeoRET+s0fYryCJyANsjYle1srk6SxmfRPxq\nRDzWQJ2Lyb7DAbAtJulS3TSZ+qbUt69HRMWzjDqvGRExNNF9a8RU90vS3wEXRRP/PNX6WK9v6bh5\nfiK53nHT6mvRyvHZjPRBYyXw3YjYK2kh8MqI6J/g7VyQWzwKjER2n7VadVYDV5MFkb8CNtX7n5Z0\nG1kQ/jnwDbK5zW+OjVhUqfMdYAtZoHop8AngFxHxGzXqfAC4nixY/QXZ0PgRZRen7I2IF5w5SPqd\niPhEbnkp8N6I+O1a+1RoY6YGBrPJIulu4L9HxBPT3Rc7dpL+kCwYVLwKr07deWRDPP+J7KrBOTXK\nvj4iHinLuz4iNtSo0wd8qtIHVUlLGvlQ2goHBrMmSdoNvIxskm/ah9Js6kl6P9kZ1lKy4+BrZGd0\n26e1YxNkps0xmE2FldPdAZt2LyKbb/x2vaGq45HPGMzMrGCmXa5qZmbHyIHBzMwKHBjMzKzAgcHM\nzAocGMzMrOD/A5ZV4vqjDJn1AAAAAElFTkSuQmCC\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f420b33ecc0>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs = pd.Series(english_counts)\n",
+    "freqs.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['afcaeuottacthrioletcserthshtrahkyorpfrgeoadppjnglternefe',\n",
+       " 'ofiortsddoeeumscruernfetlaafstwientrvoonerhuahravereetsv',\n",
+       " 'sielhlostdoaloyaesmnndignnrhohhtsnaoilncnssicreanneeiiie',\n",
+       " 'rwtanesrvogieiywssdgpvoiaisaoaeoaedrnitrnxeigrpsshadhdto',\n",
+       " 'ipaatexennesagrobtlesrnroirypbgedclliwalaleenigrrnwyrlim',\n",
+       " 'lpstoleftrdmuarieeeiiaolnewsaohrtlstobetnslvfivdovtpoaee',\n",
+       " 'isciohipseveedtewfarnhebleaotohtttepnckaonhwetmvyprreonn',\n",
+       " 'asgdedoeeeoaamtcicttifnadresrtserosetrhcictpsaaehldhsfxs',\n",
+       " 'oaotctbbsoeirnsadlytrrunrceptthreuhnktaceceelrwnireeeaes',\n",
+       " 'eeeidisogceomnrtejhagabsenitlwtrnbmielsaretesrngsnhebios',\n",
+       " 'dienafleisahocifevmfatanatrniagnhatnmibniufenrtottrnypai',\n",
+       " 'dyiegdnmerhhiotretcesseildrbceprigaesoadltahievebrcenlev',\n",
+       " 'asadnnthneiteiisahuhhuamonefyhlonwhaeeeeosneeyaneisetogy',\n",
+       " 'iterlihtcmioirarfdoetnihtnehiikamrdmnadanaodseseiyclsian',\n",
+       " 'taoltciymidentthltndxtttmasbleaeetlisirtwturpfailteaoefe',\n",
+       " 'isiiiyisikvtwisprbsinelphrmohiagnlslvitodaisdpnyddcaaota',\n",
+       " 'hcehtueirredaectosnrhvnaodoikoetcineneurrisdcouraglvimmu',\n",
+       " 'ppditeanditmaaiaieleonnreedaodboiumelrotntttgitnrlrienni',\n",
+       " 'klysogstcifypipvidvssmnceiasiitsnneatitomrhbnhnidprlrepo',\n",
+       " 'ynalsnvsdosanesitfaenltgodatteeaisicrootmsmfhauenirsghyn',\n",
+       " 'weintegodiileedtarnosrcaaendtcuttfdrbehtmfitoordruiaoyaa',\n",
+       " 'noeeldoinhusgiteaoriecevemntratmtfpeucutahamtnewonicdeem',\n",
+       " 'rpaolitoafesoosspfnlneeootachllirssxsofpdftfrnpraeeaylon',\n",
+       " 'ahautntcntcbawloneftoatecvowdlwvnneedtiioigtegmtaheeatef',\n",
+       " 'aaeprrcrosheerrpalediengidrreouhvesuroytnsosinuiuiofprda']"
+      ]
+     },
+     "execution_count": 18,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "rows = chunks(c8bl, len(c8bl) // 25)\n",
+    "rows"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['a..ae....a..h....e..se..hsh..ah....p...e.a.pp.....e..e.e',\n",
+       " '......s...ee..s...e...e..aa.s...e.......e.h.ah.a.e.ee.s.',\n",
+       " 's.e.h..s...a...aes.........h.hh.s.a......ss...ea..ee...e',\n",
+       " '...a.es.....e...ss..p...a.sa.ae.ae........e...pssha.h...',\n",
+       " '.paa.e.e..esa......es.......p..e......a.a.ee............',\n",
+       " '.ps...e......a..eee..a...e.sa.h...s...e..s.........p.aee',\n",
+       " '.s...h.pse.ee..e..a..he..ea...h...ep...a..h.e....p..e...',\n",
+       " 'as..e..eee.aa..........a..es..se..se..h....psaaeh..hs..s',\n",
+       " '.a......s.e...sa..........ep..h.e.h...a.e.ee......eeeaes',\n",
+       " 'eee...s...e.....e.ha.a.se...........e.sa.e.es...s.he...s',\n",
+       " '..e.a..e.sah....e...a.a.a....a..ha.........e.........pa.',\n",
+       " '...e....e.hh....e..esse......ep...aes.a...ah.e.e...e..e.',\n",
+       " 'asa....h.e..e..sah.hh.a...e..h....haeeee.s.ee.a.e.se....',\n",
+       " '..e...h.......a....e...h..eh...a.....a.a.a..sese....s.a.',\n",
+       " '.a.........e...h.........as..eaee...s.......p.a...ea.e.e',\n",
+       " '.s.....s......sp..s..e.ph...h.a...s......a.s.p.....aa..a',\n",
+       " 'h.eh..e...e.ae...s..h..a......e....e.e....s.....a.......',\n",
+       " 'pp...ea.....aa.a.e.e....ee.a.......e................e...',\n",
+       " '...s..s.....p.p....ss...e.as...s..ea......h..h...p...ep.',\n",
+       " '..a.s..s..sa.es...ae......a..eea.s.......s..ha.e...s.h..',\n",
+       " '.e...e......ee..a...s..aae...........eh............a..aa',\n",
+       " '..ee.....h.s...ea...e.e.e....a....pe....aha...e......ee.',\n",
+       " '.pa.....a.es..ssp....ee...a.h....ss.s..p......p.aeea....',\n",
+       " 'aha.........a....e...a.e..........ee........e...aheea.e.',\n",
+       " 'aaep.....shee..pa.e..e......e..h.es......s.s........p..a']"
+      ]
+     },
+     "execution_count": 19,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "chunks(''.join([l if l in 'phase' else '.' for l in c8bl]), 56)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['aosriliaoeddaitihpkywnraa',\n",
+       " 'ffiwppssaeiystascplneopha',\n",
+       " 'cietascgoeeiaeoiedyaieaae',\n",
+       " 'aolaatidtinedrlihislneoup',\n",
+       " 'erhntooecdagnltittostlltr',\n",
+       " 'utleelhdtifdnicyuegnedinr',\n",
+       " 'ososxeiobslnthiieasvgottc',\n",
+       " 'tdsrefpeboemhtysintsoiocr',\n",
+       " 'tdtvntsesgiencmirdcddnano',\n",
+       " 'aodonreeocsremikriioihfts',\n",
+       " 'ceogedvoeeahiidvetfsiuech',\n",
+       " 'teaismeaiohhtoetdmyalssbe',\n",
+       " 'huleauearmoieinwaapnegoae',\n",
+       " 'rmoigadmnncoirtieaieeiowr',\n",
+       " 'isyyrrttsritiatscipsdtslr',\n",
+       " 'ocawoiecatfrsrhptavitesop',\n",
+       " 'lresbewideeeaflroiitaapna',\n",
+       " 'eusstefcljvthdtbsedfrofel',\n",
+       " 'temdleatyhmcuonsnlvanrnfe',\n",
+       " 'crngeirttafehedireseoiltd',\n",
+       " 'snnpsinirgashtxnhosnsenoi',\n",
+       " 'efdvrahfratsuntevnmlrceae',\n",
+       " 'reionoenubaeaitlnnntceetn',\n",
+       " 'ttgirlbansnimhtparcgavoeg',\n",
+       " 'hlnaonldrealotmhoeeoaeoci',\n",
+       " 'saniieercntdnnardeidemtvd',\n",
+       " 'harsrwaeeirreesmodaannaor',\n",
+       " 'tfhaysosptnbfhboiastdtcwr',\n",
+       " 'rsoopatrtlicyilhkoittrhde',\n",
+       " 'athaboottwaehieiodiecallo',\n",
+       " 'hwheghhshtgplkaaebteutlwu',\n",
+       " 'kitoerterrnroaegtosatmivh',\n",
+       " 'yesadttrenhinmencinittrnv',\n",
+       " 'onnecltoubagwrtliunsffsne',\n",
+       " 'rtadlseshmtahdlsnmeidpses',\n",
+       " 'prorltpenineamileeacrexeu',\n",
+       " 'fviniontkemsensvnltrbusdr',\n",
+       " 'roliwbcrtlioeaiierioecoto',\n",
+       " 'gontaekhasbaedrtuotohufiy',\n",
+       " 'encrltaccandeatortotttpit',\n",
+       " 'oennanoierilonwdrnmmmadon',\n",
+       " 'arsxlsncceutsataitrsfhfis',\n",
+       " 'dhseelhtetfanouisthmiatgo',\n",
+       " 'puiievwpeeehedrsdtbftmfts',\n",
+       " 'pacgnfeslsniespdcgnhotrei',\n",
+       " 'jhrriitarrreyefpoihaonngn',\n",
+       " 'nrepgvmawntvasanutnurepmu',\n",
+       " 'gaasrdvengoeneiyrniedwrti',\n",
+       " 'lvnsroyhistbeildardnroaau',\n",
+       " 'tenhnvplrntriytdglpiunehi',\n",
+       " 'ereawtrdehrcsceclrrriieeo',\n",
+       " 'reedyprheeneelaavilsacaef',\n",
+       " 'neihroesebyntsoaiergodyap',\n",
+       " 'etidlaofaiploieomnehyeltr',\n",
+       " 'fsitienxeoaegaftmnpyaeoed',\n",
+       " 'eveomensssivyneauionamnfa']"
+      ]
+     },
+     "execution_count": 20,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "columns = [''.join(c) for c in zip(*rows)]\n",
+    "columns"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'a': [(0, 0),\n",
+       "  (0, 3),\n",
+       "  (0, 9),\n",
+       "  (0, 29),\n",
+       "  (0, 41),\n",
+       "  (1, 25),\n",
+       "  (1, 26),\n",
+       "  (1, 44),\n",
+       "  (1, 47),\n",
+       "  (2, 11),\n",
+       "  (2, 15),\n",
+       "  (2, 34),\n",
+       "  (2, 47),\n",
+       "  (3, 3),\n",
+       "  (3, 24),\n",
+       "  (3, 27),\n",
+       "  (3, 29),\n",
+       "  (3, 32),\n",
+       "  (3, 50),\n",
+       "  (4, 2),\n",
+       "  (4, 3),\n",
+       "  (4, 12),\n",
+       "  (4, 38),\n",
+       "  (4, 40),\n",
+       "  (5, 13),\n",
+       "  (5, 21),\n",
+       "  (5, 28),\n",
+       "  (5, 53),\n",
+       "  (6, 18),\n",
+       "  (6, 26),\n",
+       "  (6, 39),\n",
+       "  (7, 0),\n",
+       "  (7, 11),\n",
+       "  (7, 12),\n",
+       "  (7, 23),\n",
+       "  (7, 45),\n",
+       "  (7, 46),\n",
+       "  (8, 1),\n",
+       "  (8, 15),\n",
+       "  (8, 38),\n",
+       "  (8, 53),\n",
+       "  (9, 19),\n",
+       "  (9, 21),\n",
+       "  (9, 39),\n",
+       "  (10, 4),\n",
+       "  (10, 10),\n",
+       "  (10, 20),\n",
+       "  (10, 22),\n",
+       "  (10, 24),\n",
+       "  (10, 29),\n",
+       "  (10, 33),\n",
+       "  (10, 54),\n",
+       "  (11, 34),\n",
+       "  (11, 38),\n",
+       "  (11, 42),\n",
+       "  (12, 0),\n",
+       "  (12, 2),\n",
+       "  (12, 16),\n",
+       "  (12, 22),\n",
+       "  (12, 35),\n",
+       "  (12, 46),\n",
+       "  (13, 14),\n",
+       "  (13, 31),\n",
+       "  (13, 37),\n",
+       "  (13, 39),\n",
+       "  (13, 41),\n",
+       "  (13, 54),\n",
+       "  (14, 1),\n",
+       "  (14, 25),\n",
+       "  (14, 30),\n",
+       "  (14, 46),\n",
+       "  (14, 51),\n",
+       "  (15, 30),\n",
+       "  (15, 41),\n",
+       "  (15, 51),\n",
+       "  (15, 52),\n",
+       "  (15, 55),\n",
+       "  (16, 12),\n",
+       "  (16, 23),\n",
+       "  (16, 48),\n",
+       "  (17, 6),\n",
+       "  (17, 12),\n",
+       "  (17, 13),\n",
+       "  (17, 15),\n",
+       "  (17, 27),\n",
+       "  (18, 26),\n",
+       "  (18, 35),\n",
+       "  (19, 2),\n",
+       "  (19, 11),\n",
+       "  (19, 18),\n",
+       "  (19, 26),\n",
+       "  (19, 31),\n",
+       "  (19, 45),\n",
+       "  (20, 16),\n",
+       "  (20, 23),\n",
+       "  (20, 24),\n",
+       "  (20, 51),\n",
+       "  (20, 54),\n",
+       "  (20, 55),\n",
+       "  (21, 16),\n",
+       "  (21, 29),\n",
+       "  (21, 40),\n",
+       "  (21, 42),\n",
+       "  (22, 2),\n",
+       "  (22, 8),\n",
+       "  (22, 26),\n",
+       "  (22, 48),\n",
+       "  (22, 51),\n",
+       "  (23, 0),\n",
+       "  (23, 2),\n",
+       "  (23, 12),\n",
+       "  (23, 21),\n",
+       "  (23, 48),\n",
+       "  (23, 52),\n",
+       "  (24, 0),\n",
+       "  (24, 1),\n",
+       "  (24, 16),\n",
+       "  (24, 55)],\n",
+       " 'e': [(0, 4),\n",
+       "  (0, 17),\n",
+       "  (0, 21),\n",
+       "  (0, 39),\n",
+       "  (0, 50),\n",
+       "  (0, 53),\n",
+       "  (0, 55),\n",
+       "  (1, 10),\n",
+       "  (1, 11),\n",
+       "  (1, 18),\n",
+       "  (1, 22),\n",
+       "  (1, 32),\n",
+       "  (1, 40),\n",
+       "  (1, 49),\n",
+       "  (1, 51),\n",
+       "  (1, 52),\n",
+       "  (2, 2),\n",
+       "  (2, 16),\n",
+       "  (2, 46),\n",
+       "  (2, 50),\n",
+       "  (2, 51),\n",
+       "  (2, 55),\n",
+       "  (3, 5),\n",
+       "  (3, 12),\n",
+       "  (3, 30),\n",
+       "  (3, 33),\n",
+       "  (3, 42),\n",
+       "  (4, 5),\n",
+       "  (4, 7),\n",
+       "  (4, 10),\n",
+       "  (4, 19),\n",
+       "  (4, 31),\n",
+       "  (4, 42),\n",
+       "  (4, 43),\n",
+       "  (5, 6),\n",
+       "  (5, 16),\n",
+       "  (5, 17),\n",
+       "  (5, 18),\n",
+       "  (5, 25),\n",
+       "  (5, 38),\n",
+       "  (5, 54),\n",
+       "  (5, 55),\n",
+       "  (6, 9),\n",
+       "  (6, 11),\n",
+       "  (6, 12),\n",
+       "  (6, 15),\n",
+       "  (6, 22),\n",
+       "  (6, 25),\n",
+       "  (6, 34),\n",
+       "  (6, 44),\n",
+       "  (6, 52),\n",
+       "  (7, 4),\n",
+       "  (7, 7),\n",
+       "  (7, 8),\n",
+       "  (7, 9),\n",
+       "  (7, 26),\n",
+       "  (7, 31),\n",
+       "  (7, 35),\n",
+       "  (7, 47),\n",
+       "  (8, 10),\n",
+       "  (8, 26),\n",
+       "  (8, 32),\n",
+       "  (8, 40),\n",
+       "  (8, 42),\n",
+       "  (8, 43),\n",
+       "  (8, 50),\n",
+       "  (8, 51),\n",
+       "  (8, 52),\n",
+       "  (8, 54),\n",
+       "  (9, 0),\n",
+       "  (9, 1),\n",
+       "  (9, 2),\n",
+       "  (9, 10),\n",
+       "  (9, 16),\n",
+       "  (9, 24),\n",
+       "  (9, 36),\n",
+       "  (9, 41),\n",
+       "  (9, 43),\n",
+       "  (9, 51),\n",
+       "  (10, 2),\n",
+       "  (10, 7),\n",
+       "  (10, 16),\n",
+       "  (10, 43),\n",
+       "  (11, 3),\n",
+       "  (11, 8),\n",
+       "  (11, 16),\n",
+       "  (11, 19),\n",
+       "  (11, 22),\n",
+       "  (11, 29),\n",
+       "  (11, 35),\n",
+       "  (11, 45),\n",
+       "  (11, 47),\n",
+       "  (11, 51),\n",
+       "  (11, 54),\n",
+       "  (12, 9),\n",
+       "  (12, 12),\n",
+       "  (12, 26),\n",
+       "  (12, 36),\n",
+       "  (12, 37),\n",
+       "  (12, 38),\n",
+       "  (12, 39),\n",
+       "  (12, 43),\n",
+       "  (12, 44),\n",
+       "  (12, 48),\n",
+       "  (12, 51),\n",
+       "  (13, 2),\n",
+       "  (13, 19),\n",
+       "  (13, 26),\n",
+       "  (13, 45),\n",
+       "  (13, 47),\n",
+       "  (14, 11),\n",
+       "  (14, 29),\n",
+       "  (14, 31),\n",
+       "  (14, 32),\n",
+       "  (14, 50),\n",
+       "  (14, 53),\n",
+       "  (14, 55),\n",
+       "  (15, 21),\n",
+       "  (16, 2),\n",
+       "  (16, 6),\n",
+       "  (16, 10),\n",
+       "  (16, 13),\n",
+       "  (16, 30),\n",
+       "  (16, 35),\n",
+       "  (16, 37),\n",
+       "  (17, 5),\n",
+       "  (17, 17),\n",
+       "  (17, 19),\n",
+       "  (17, 24),\n",
+       "  (17, 25),\n",
+       "  (17, 35),\n",
+       "  (17, 52),\n",
+       "  (18, 24),\n",
+       "  (18, 34),\n",
+       "  (18, 53),\n",
+       "  (19, 13),\n",
+       "  (19, 19),\n",
+       "  (19, 29),\n",
+       "  (19, 30),\n",
+       "  (19, 47),\n",
+       "  (20, 1),\n",
+       "  (20, 5),\n",
+       "  (20, 12),\n",
+       "  (20, 13),\n",
+       "  (20, 25),\n",
+       "  (20, 37),\n",
+       "  (21, 2),\n",
+       "  (21, 3),\n",
+       "  (21, 15),\n",
+       "  (21, 20),\n",
+       "  (21, 22),\n",
+       "  (21, 24),\n",
+       "  (21, 35),\n",
+       "  (21, 46),\n",
+       "  (21, 53),\n",
+       "  (21, 54),\n",
+       "  (22, 10),\n",
+       "  (22, 21),\n",
+       "  (22, 22),\n",
+       "  (22, 49),\n",
+       "  (22, 50),\n",
+       "  (23, 17),\n",
+       "  (23, 23),\n",
+       "  (23, 34),\n",
+       "  (23, 35),\n",
+       "  (23, 44),\n",
+       "  (23, 50),\n",
+       "  (23, 51),\n",
+       "  (23, 54),\n",
+       "  (24, 2),\n",
+       "  (24, 11),\n",
+       "  (24, 12),\n",
+       "  (24, 18),\n",
+       "  (24, 21),\n",
+       "  (24, 28),\n",
+       "  (24, 33)],\n",
+       " 'h': [(0, 12),\n",
+       "  (0, 24),\n",
+       "  (0, 26),\n",
+       "  (0, 30),\n",
+       "  (1, 42),\n",
+       "  (1, 45),\n",
+       "  (2, 4),\n",
+       "  (2, 27),\n",
+       "  (2, 29),\n",
+       "  (2, 30),\n",
+       "  (3, 49),\n",
+       "  (3, 52),\n",
+       "  (5, 30),\n",
+       "  (6, 5),\n",
+       "  (6, 21),\n",
+       "  (6, 30),\n",
+       "  (6, 42),\n",
+       "  (7, 38),\n",
+       "  (7, 48),\n",
+       "  (7, 51),\n",
+       "  (8, 30),\n",
+       "  (8, 34),\n",
+       "  (9, 18),\n",
+       "  (9, 50),\n",
+       "  (10, 11),\n",
+       "  (10, 32),\n",
+       "  (11, 10),\n",
+       "  (11, 11),\n",
+       "  (11, 43),\n",
+       "  (12, 7),\n",
+       "  (12, 17),\n",
+       "  (12, 19),\n",
+       "  (12, 20),\n",
+       "  (12, 29),\n",
+       "  (12, 34),\n",
+       "  (13, 6),\n",
+       "  (13, 23),\n",
+       "  (13, 27),\n",
+       "  (14, 15),\n",
+       "  (15, 24),\n",
+       "  (15, 28),\n",
+       "  (16, 0),\n",
+       "  (16, 3),\n",
+       "  (16, 20),\n",
+       "  (18, 42),\n",
+       "  (18, 45),\n",
+       "  (19, 44),\n",
+       "  (19, 53),\n",
+       "  (20, 38),\n",
+       "  (21, 9),\n",
+       "  (21, 41),\n",
+       "  (22, 28),\n",
+       "  (23, 1),\n",
+       "  (23, 49),\n",
+       "  (24, 10),\n",
+       "  (24, 31)],\n",
+       " 'n': [(0, 46),\n",
+       "  (0, 52),\n",
+       "  (1, 20),\n",
+       "  (1, 33),\n",
+       "  (1, 39),\n",
+       "  (2, 19),\n",
+       "  (2, 20),\n",
+       "  (2, 24),\n",
+       "  (2, 25),\n",
+       "  (2, 33),\n",
+       "  (2, 38),\n",
+       "  (2, 40),\n",
+       "  (2, 48),\n",
+       "  (2, 49),\n",
+       "  (3, 4),\n",
+       "  (3, 36),\n",
+       "  (3, 40),\n",
+       "  (4, 8),\n",
+       "  (4, 9),\n",
+       "  (4, 22),\n",
+       "  (4, 44),\n",
+       "  (4, 49),\n",
+       "  (5, 24),\n",
+       "  (5, 40),\n",
+       "  (6, 20),\n",
+       "  (6, 36),\n",
+       "  (6, 41),\n",
+       "  (6, 54),\n",
+       "  (6, 55),\n",
+       "  (7, 22),\n",
+       "  (8, 13),\n",
+       "  (8, 23),\n",
+       "  (8, 35),\n",
+       "  (8, 47),\n",
+       "  (9, 13),\n",
+       "  (9, 25),\n",
+       "  (9, 32),\n",
+       "  (9, 46),\n",
+       "  (9, 49),\n",
+       "  (10, 3),\n",
+       "  (10, 23),\n",
+       "  (10, 27),\n",
+       "  (10, 31),\n",
+       "  (10, 35),\n",
+       "  (10, 39),\n",
+       "  (10, 44),\n",
+       "  (10, 51),\n",
+       "  (11, 6),\n",
+       "  (11, 52),\n",
+       "  (12, 4),\n",
+       "  (12, 5),\n",
+       "  (12, 8),\n",
+       "  (12, 25),\n",
+       "  (12, 32),\n",
+       "  (12, 42),\n",
+       "  (12, 47),\n",
+       "  (13, 21),\n",
+       "  (13, 25),\n",
+       "  (13, 36),\n",
+       "  (13, 40),\n",
+       "  (13, 55),\n",
+       "  (14, 12),\n",
+       "  (14, 18),\n",
+       "  (15, 20),\n",
+       "  (15, 32),\n",
+       "  (15, 46),\n",
+       "  (16, 18),\n",
+       "  (16, 22),\n",
+       "  (16, 34),\n",
+       "  (16, 36),\n",
+       "  (17, 7),\n",
+       "  (17, 21),\n",
+       "  (17, 22),\n",
+       "  (17, 40),\n",
+       "  (17, 47),\n",
+       "  (17, 53),\n",
+       "  (17, 54),\n",
+       "  (18, 22),\n",
+       "  (18, 32),\n",
+       "  (18, 33),\n",
+       "  (18, 44),\n",
+       "  (18, 46),\n",
+       "  (19, 1),\n",
+       "  (19, 5),\n",
+       "  (19, 12),\n",
+       "  (19, 20),\n",
+       "  (19, 48),\n",
+       "  (19, 55),\n",
+       "  (20, 3),\n",
+       "  (20, 18),\n",
+       "  (20, 26),\n",
+       "  (21, 0),\n",
+       "  (21, 8),\n",
+       "  (21, 26),\n",
+       "  (21, 45),\n",
+       "  (21, 49),\n",
+       "  (22, 18),\n",
+       "  (22, 20),\n",
+       "  (22, 45),\n",
+       "  (22, 55),\n",
+       "  (23, 5),\n",
+       "  (23, 8),\n",
+       "  (23, 16),\n",
+       "  (23, 32),\n",
+       "  (23, 33),\n",
+       "  (24, 22),\n",
+       "  (24, 40),\n",
+       "  (24, 45)],\n",
+       " 'p': [(0, 35),\n",
+       "  (0, 43),\n",
+       "  (0, 44),\n",
+       "  (3, 20),\n",
+       "  (3, 46),\n",
+       "  (4, 1),\n",
+       "  (4, 28),\n",
+       "  (5, 1),\n",
+       "  (5, 51),\n",
+       "  (6, 7),\n",
+       "  (6, 35),\n",
+       "  (6, 49),\n",
+       "  (7, 43),\n",
+       "  (8, 27),\n",
+       "  (10, 53),\n",
+       "  (11, 30),\n",
+       "  (14, 44),\n",
+       "  (15, 15),\n",
+       "  (15, 23),\n",
+       "  (15, 45),\n",
+       "  (17, 0),\n",
+       "  (17, 1),\n",
+       "  (18, 12),\n",
+       "  (18, 14),\n",
+       "  (18, 49),\n",
+       "  (18, 54),\n",
+       "  (21, 34),\n",
+       "  (22, 1),\n",
+       "  (22, 16),\n",
+       "  (22, 39),\n",
+       "  (22, 46),\n",
+       "  (24, 3),\n",
+       "  (24, 15),\n",
+       "  (24, 52)],\n",
+       " 's': [(0, 20),\n",
+       "  (0, 25),\n",
+       "  (1, 6),\n",
+       "  (1, 14),\n",
+       "  (1, 28),\n",
+       "  (1, 54),\n",
+       "  (2, 0),\n",
+       "  (2, 7),\n",
+       "  (2, 17),\n",
+       "  (2, 32),\n",
+       "  (2, 41),\n",
+       "  (2, 42),\n",
+       "  (3, 6),\n",
+       "  (3, 16),\n",
+       "  (3, 17),\n",
+       "  (3, 26),\n",
+       "  (3, 47),\n",
+       "  (3, 48),\n",
+       "  (4, 11),\n",
+       "  (4, 20),\n",
+       "  (5, 2),\n",
+       "  (5, 27),\n",
+       "  (5, 34),\n",
+       "  (5, 41),\n",
+       "  (6, 1),\n",
+       "  (6, 8),\n",
+       "  (7, 1),\n",
+       "  (7, 27),\n",
+       "  (7, 30),\n",
+       "  (7, 34),\n",
+       "  (7, 44),\n",
+       "  (7, 52),\n",
+       "  (7, 55),\n",
+       "  (8, 8),\n",
+       "  (8, 14),\n",
+       "  (8, 55),\n",
+       "  (9, 6),\n",
+       "  (9, 23),\n",
+       "  (9, 38),\n",
+       "  (9, 44),\n",
+       "  (9, 48),\n",
+       "  (9, 55),\n",
+       "  (10, 9),\n",
+       "  (11, 20),\n",
+       "  (11, 21),\n",
+       "  (11, 36),\n",
+       "  (12, 1),\n",
+       "  (12, 15),\n",
+       "  (12, 41),\n",
+       "  (12, 50),\n",
+       "  (13, 44),\n",
+       "  (13, 46),\n",
+       "  (13, 52),\n",
+       "  (14, 26),\n",
+       "  (14, 36),\n",
+       "  (15, 1),\n",
+       "  (15, 7),\n",
+       "  (15, 14),\n",
+       "  (15, 18),\n",
+       "  (15, 34),\n",
+       "  (15, 43),\n",
+       "  (16, 17),\n",
+       "  (16, 42),\n",
+       "  (18, 3),\n",
+       "  (18, 6),\n",
+       "  (18, 19),\n",
+       "  (18, 20),\n",
+       "  (18, 27),\n",
+       "  (18, 31),\n",
+       "  (19, 4),\n",
+       "  (19, 7),\n",
+       "  (19, 10),\n",
+       "  (19, 14),\n",
+       "  (19, 33),\n",
+       "  (19, 41),\n",
+       "  (19, 51),\n",
+       "  (20, 20),\n",
+       "  (21, 11),\n",
+       "  (22, 11),\n",
+       "  (22, 14),\n",
+       "  (22, 15),\n",
+       "  (22, 33),\n",
+       "  (22, 34),\n",
+       "  (22, 36),\n",
+       "  (24, 9),\n",
+       "  (24, 34),\n",
+       "  (24, 41),\n",
+       "  (24, 43)],\n",
+       " 'v': [(1, 36),\n",
+       "  (1, 48),\n",
+       "  (1, 55),\n",
+       "  (3, 8),\n",
+       "  (3, 21),\n",
+       "  (5, 43),\n",
+       "  (5, 46),\n",
+       "  (5, 49),\n",
+       "  (6, 10),\n",
+       "  (6, 47),\n",
+       "  (10, 17),\n",
+       "  (11, 46),\n",
+       "  (11, 55),\n",
+       "  (15, 10),\n",
+       "  (15, 36),\n",
+       "  (16, 21),\n",
+       "  (16, 51),\n",
+       "  (18, 15),\n",
+       "  (18, 18),\n",
+       "  (19, 6),\n",
+       "  (21, 23),\n",
+       "  (23, 25),\n",
+       "  (23, 31),\n",
+       "  (24, 32)]}"
+      ]
+     },
+     "execution_count": 21,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "letter_positions = {letter: [(r, c) for r, row in enumerate(rows) for c, char in enumerate(row) if char == letter] \n",
+    "                    for letter in deduplicate('phaseseven')}\n",
+    "letter_positions"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{0: 'a',\n",
+       " 1: 'z',\n",
+       " 2: 'y',\n",
+       " 3: 'x',\n",
+       " 4: 'v',\n",
+       " 5: 'u',\n",
+       " 6: 't',\n",
+       " 7: 's',\n",
+       " 8: 'r',\n",
+       " 9: 'q',\n",
+       " 10: 'p',\n",
+       " 11: 'o',\n",
+       " 12: 'n',\n",
+       " 13: 'm',\n",
+       " 14: 'l',\n",
+       " 15: 'k',\n",
+       " 16: 'j',\n",
+       " 17: 'i',\n",
+       " 18: 'h',\n",
+       " 19: 'g',\n",
+       " 20: 'f',\n",
+       " 21: 'e',\n",
+       " 22: 'd',\n",
+       " 23: 'c',\n",
+       " 24: 'b'}"
+      ]
+     },
+     "execution_count": 22,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "keycolumn = make_cadenus_keycolumn(reverse=True)\n",
+    "inverse_keycolumn = {v: l for l, v in keycolumn.items()}\n",
+    "inverse_keycolumn"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "def valid_partial_solution(solution, inverse_keycolumn):\n",
+    "    row_indices = [p[0] for p in sorted(solution, key=lambda x: x[1])]\n",
+    "    row_letters = [inverse_keycolumn[i] for i in row_indices]\n",
+    "    letter_pairs = ngrams(row_letters, 2)\n",
+    "    return all(p[0] <= p[1] for p in letter_pairs)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "43005"
+      ]
+     },
+     "execution_count": 24,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "solutions = [[p] for p in letter_positions['p']]\n",
+    "for letter in 'ha': #'haseseven':\n",
+    "    new_solutions = []\n",
+    "    for solution in solutions:\n",
+    "        used_columns = [p[1] for p in solution]\n",
+    "        for position in letter_positions[letter]:\n",
+    "            if position[1] not in used_columns:\n",
+    "                if valid_partial_solution(solution + [position], inverse_keycolumn):\n",
+    "                    new_solutions += [solution + [position]]\n",
+    "    solutions = new_solutions\n",
+    "len(solutions)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "True"
+      ]
+     },
+     "execution_count": 25,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "valid_partial_solution(solutions[1], inverse_keycolumn)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['pha',\n",
+       " 'ruo',\n",
+       " 'oll',\n",
+       " 'rea',\n",
+       " 'laa',\n",
+       " 'tut',\n",
+       " 'pei',\n",
+       " 'ead',\n",
+       " 'nrt',\n",
+       " 'imi',\n",
+       " 'non',\n",
+       " 'eie',\n",
+       " 'aed',\n",
+       " 'mir',\n",
+       " 'inl',\n",
+       " 'lwi',\n",
+       " 'eah',\n",
+       " 'eai',\n",
+       " 'aps',\n",
+       " 'cnl',\n",
+       " 'ren',\n",
+       " 'ege',\n",
+       " 'xoo',\n",
+       " 'eau',\n",
+       " 'uep']"
+      ]
+     },
+     "execution_count": 26,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "display = []\n",
+    "for p in solutions[1]:\n",
+    "    this_column = columns[p[1]]\n",
+    "    rotated_column = this_column[p[0]:] + this_column[:p[0]]\n",
+    "    display += [rotated_column]\n",
+    "display_rows = [''.join(r) for r in zip(*display)]\n",
+    "display_rows"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "def display_solution(solution, columns):\n",
+    "    display = []\n",
+    "    for p in solution:\n",
+    "        this_column = columns[p[1]]\n",
+    "        rotated_column = this_column[p[0]:] + this_column[:p[0]]\n",
+    "        display += [rotated_column]\n",
+    "    return [''.join(r) for r in zip(*display)]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['pha',\n",
+       " 'ruo',\n",
+       " 'ols',\n",
+       " 'rer',\n",
+       " 'lai',\n",
+       " 'tul',\n",
+       " 'pei',\n",
+       " 'eaa',\n",
+       " 'nro',\n",
+       " 'ime',\n",
+       " 'nod',\n",
+       " 'eid',\n",
+       " 'aea',\n",
+       " 'mii',\n",
+       " 'int',\n",
+       " 'lwi',\n",
+       " 'eah',\n",
+       " 'eap',\n",
+       " 'apk',\n",
+       " 'cny',\n",
+       " 'rew',\n",
+       " 'egn',\n",
+       " 'xor',\n",
+       " 'eaa',\n",
+       " 'uea']"
+      ]
+     },
+     "execution_count": 28,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "display_solution(solutions[0], columns)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "-109.09171451522874"
+      ]
+     },
+     "execution_count": 29,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "sum(Ptrigrams(r) for r in display_rows)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "def score_solution(solution, columns):\n",
+    "    display = []\n",
+    "    for p in solution:\n",
+    "        this_column = columns[p[1]]\n",
+    "        rotated_column = this_column[p[0]:] + this_column[:p[0]]\n",
+    "        display += [rotated_column]\n",
+    "    display_rows = [''.join(r) for r in zip(*display)]\n",
+    "    return sum(Ptrigrams(r) for r in display_rows)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[([(0, 35), (0, 12), (0, 0)],\n",
+       "  ['pha',\n",
+       "   'ruo',\n",
+       "   'ols',\n",
+       "   'rer',\n",
+       "   'lai',\n",
+       "   'tul',\n",
+       "   'pei',\n",
+       "   'eaa',\n",
+       "   'nro',\n",
+       "   'ime',\n",
+       "   'nod',\n",
+       "   'eid',\n",
+       "   'aea',\n",
+       "   'mii',\n",
+       "   'int',\n",
+       "   'lwi',\n",
+       "   'eah',\n",
+       "   'eap',\n",
+       "   'apk',\n",
+       "   'cny',\n",
+       "   'rew',\n",
+       "   'egn',\n",
+       "   'xor',\n",
+       "   'eaa',\n",
+       "   'uea'],\n",
+       "  -112.23213925765266),\n",
+       " ([(0, 35), (0, 12), (0, 3)],\n",
+       "  ['pha',\n",
+       "   'ruo',\n",
+       "   'oll',\n",
+       "   'rea',\n",
+       "   'laa',\n",
+       "   'tut',\n",
+       "   'pei',\n",
+       "   'ead',\n",
+       "   'nrt',\n",
+       "   'imi',\n",
+       "   'non',\n",
+       "   'eie',\n",
+       "   'aed',\n",
+       "   'mir',\n",
+       "   'inl',\n",
+       "   'lwi',\n",
+       "   'eah',\n",
+       "   'eai',\n",
+       "   'aps',\n",
+       "   'cnl',\n",
+       "   'ren',\n",
+       "   'ege',\n",
+       "   'xoo',\n",
+       "   'eau',\n",
+       "   'uep'],\n",
+       "  -109.09171451522874),\n",
+       " ([(0, 35), (0, 12), (0, 9)],\n",
+       "  ['pha',\n",
+       "   'ruo',\n",
+       "   'old',\n",
+       "   'reo',\n",
+       "   'lan',\n",
+       "   'tur',\n",
+       "   'pee',\n",
+       "   'eae',\n",
+       "   'nro',\n",
+       "   'imc',\n",
+       "   'nos',\n",
+       "   'eir',\n",
+       "   'aee',\n",
+       "   'mim',\n",
+       "   'ini',\n",
+       "   'lwk',\n",
+       "   'ear',\n",
+       "   'eai',\n",
+       "   'api',\n",
+       "   'cno',\n",
+       "   'rei',\n",
+       "   'egh',\n",
+       "   'xof',\n",
+       "   'eat',\n",
+       "   'ues'],\n",
+       "  -105.51902198106185),\n",
+       " ([(0, 35), (0, 12), (0, 29)],\n",
+       "  ['pha',\n",
+       "   'rut',\n",
+       "   'olh',\n",
+       "   'rea',\n",
+       "   'lab',\n",
+       "   'tuo',\n",
+       "   'peo',\n",
+       "   'eat',\n",
+       "   'nrt',\n",
+       "   'imw',\n",
+       "   'noa',\n",
+       "   'eie',\n",
+       "   'aeh',\n",
+       "   'mii',\n",
+       "   'ine',\n",
+       "   'lwi',\n",
+       "   'eao',\n",
+       "   'ead',\n",
+       "   'api',\n",
+       "   'cne',\n",
+       "   'rec',\n",
+       "   'ega',\n",
+       "   'xol',\n",
+       "   'eal',\n",
+       "   'ueo'],\n",
+       "  -106.91642615054437),\n",
+       " ([(0, 35), (0, 12), (0, 41)],\n",
+       "  ['pha',\n",
+       "   'rur',\n",
+       "   'ols',\n",
+       "   'rex',\n",
+       "   'lal',\n",
+       "   'tus',\n",
+       "   'pen',\n",
+       "   'eac',\n",
+       "   'nrc',\n",
+       "   'ime',\n",
+       "   'nou',\n",
+       "   'eit',\n",
+       "   'aes',\n",
+       "   'mia',\n",
+       "   'int',\n",
+       "   'lwa',\n",
+       "   'eai',\n",
+       "   'eat',\n",
+       "   'apr',\n",
+       "   'cns',\n",
+       "   'ref',\n",
+       "   'egh',\n",
+       "   'xof',\n",
+       "   'eai',\n",
+       "   'ues'],\n",
+       "  -100.92420426683796),\n",
+       " ([(0, 35), (0, 12), (1, 44)],\n",
+       "  ['pha',\n",
+       "   'ruc',\n",
+       "   'olg',\n",
+       "   'ren',\n",
+       "   'laf',\n",
+       "   'tue',\n",
+       "   'pes',\n",
+       "   'eal',\n",
+       "   'nrs',\n",
+       "   'imn',\n",
+       "   'noi',\n",
+       "   'eie',\n",
+       "   'aes',\n",
+       "   'mip',\n",
+       "   'ind',\n",
+       "   'lwc',\n",
+       "   'eag',\n",
+       "   'ean',\n",
+       "   'aph',\n",
+       "   'cno',\n",
+       "   'ret',\n",
+       "   'egr',\n",
+       "   'xoe',\n",
+       "   'eai',\n",
+       "   'uep'],\n",
+       "  -108.53207489276411),\n",
+       " ([(0, 35), (0, 12), (1, 47)],\n",
+       "  ['pha',\n",
+       "   'rua',\n",
+       "   'ols',\n",
+       "   'rer',\n",
+       "   'lad',\n",
+       "   'tuv',\n",
+       "   'pee',\n",
+       "   'ean',\n",
+       "   'nrg',\n",
+       "   'imo',\n",
+       "   'noe',\n",
+       "   'ein',\n",
+       "   'aee',\n",
+       "   'mii',\n",
+       "   'iny',\n",
+       "   'lwr',\n",
+       "   'ean',\n",
+       "   'eai',\n",
+       "   'ape',\n",
+       "   'cnd',\n",
+       "   'rew',\n",
+       "   'egr',\n",
+       "   'xot',\n",
+       "   'eai',\n",
+       "   'ueg'],\n",
+       "  -109.50900823047225),\n",
+       " ([(0, 35), (0, 12), (2, 47)],\n",
+       "  ['pha',\n",
+       "   'rus',\n",
+       "   'olr',\n",
+       "   'red',\n",
+       "   'lav',\n",
+       "   'tue',\n",
+       "   'pen',\n",
+       "   'eag',\n",
+       "   'nro',\n",
+       "   'ime',\n",
+       "   'non',\n",
+       "   'eie',\n",
+       "   'aei',\n",
+       "   'miy',\n",
+       "   'inr',\n",
+       "   'lwn',\n",
+       "   'eai',\n",
+       "   'eae',\n",
+       "   'apd',\n",
+       "   'cnw',\n",
+       "   'rer',\n",
+       "   'egt',\n",
+       "   'xoi',\n",
+       "   'eag',\n",
+       "   'uea'],\n",
+       "  -114.40196859359595),\n",
+       " ([(0, 35), (0, 12), (3, 50)],\n",
+       "  ['pha',\n",
+       "   'ruw',\n",
+       "   'olt',\n",
+       "   'rer',\n",
+       "   'lad',\n",
+       "   'tue',\n",
+       "   'peh',\n",
+       "   'ear',\n",
+       "   'nrc',\n",
+       "   'ims',\n",
+       "   'noc',\n",
+       "   'eie',\n",
+       "   'aec',\n",
+       "   'mil',\n",
+       "   'inr',\n",
+       "   'lwr',\n",
+       "   'ear',\n",
+       "   'eai',\n",
+       "   'api',\n",
+       "   'cne',\n",
+       "   'ree',\n",
+       "   'ego',\n",
+       "   'xoe',\n",
+       "   'ear',\n",
+       "   'uee'],\n",
+       "  -106.68850150792129),\n",
+       " ([(0, 35), (0, 12), (4, 38)],\n",
+       "  ['pha',\n",
+       "   'rue',\n",
+       "   'olk',\n",
+       "   'reh',\n",
+       "   'laa',\n",
+       "   'tus',\n",
+       "   'peb',\n",
+       "   'eaa',\n",
+       "   'nre',\n",
+       "   'imd',\n",
+       "   'nor',\n",
+       "   'eit',\n",
+       "   'aeu',\n",
+       "   'mio',\n",
+       "   'int',\n",
+       "   'lwo',\n",
+       "   'eah',\n",
+       "   'eau',\n",
+       "   'apf',\n",
+       "   'cni',\n",
+       "   'rey',\n",
+       "   'egg',\n",
+       "   'xoo',\n",
+       "   'ean',\n",
+       "   'uet'],\n",
+       "  -108.49770543928673)]"
+      ]
+     },
+     "execution_count": 31,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[(s, display_solution(s, columns), score_solution(s, columns)) for s in solutions[:10]]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[[(0, 35), (0, 12), (0, 41)],\n",
+       " [(0, 35), (0, 12), (0, 9)],\n",
+       " [(0, 35), (0, 12), (3, 50)],\n",
+       " [(0, 35), (0, 12), (0, 29)],\n",
+       " [(0, 35), (0, 12), (4, 38)],\n",
+       " [(0, 35), (0, 12), (1, 44)],\n",
+       " [(0, 35), (0, 12), (0, 3)],\n",
+       " [(0, 35), (0, 12), (1, 47)],\n",
+       " [(0, 35), (0, 12), (0, 0)],\n",
+       " [(0, 35), (0, 12), (2, 47)]]"
+      ]
+     },
+     "execution_count": 32,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "sorted(solutions[:10], key=lambda s: score_solution(s, columns), reverse=True)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 33,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "solutions = sorted(solutions, key=lambda s: score_solution(s, columns), reverse=True)[:10000]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "10000"
+      ]
+     },
+     "execution_count": 34,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "for letter in 'seseven': #'haseeight':\n",
+    "    new_solutions = []\n",
+    "    for solution in solutions:\n",
+    "        used_columns = [p[1] for p in solution]\n",
+    "        for position in letter_positions[letter]:\n",
+    "            if position[1] not in used_columns:\n",
+    "                if valid_partial_solution(solution + [position], inverse_keycolumn):\n",
+    "                    new_solutions += [solution + [position]]\n",
+    "    solutions = sorted(new_solutions, key=lambda s: score_solution(s, columns), reverse=True)[:10000]\n",
+    "len(solutions)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 35,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['phaseseven',\n",
+       " 'ninmelcalh',\n",
+       " 'andodrinho',\n",
+       " 'lmedyierts',\n",
+       " 'reaapstnen',\n",
+       " 'entaryafts',\n",
+       " 'sconhysefe',\n",
+       " 'birnerctan',\n",
+       " 'entaergeno',\n",
+       " 'wioontomoi',\n",
+       " 'ittretedus',\n",
+       " 'dttheselin',\n",
+       " 'ertalriesn',\n",
+       " 'enpraiaatp',\n",
+       " 'evisateths',\n",
+       " 'aytrvioymi',\n",
+       " 'feewiaihin',\n",
+       " 'lsnaltemai',\n",
+       " 'racessdctr',\n",
+       " 'odreacyugg',\n",
+       " 'itliciaooa',\n",
+       " 'ittrapinds',\n",
+       " 'trareseshh',\n",
+       " 'aecefdanst',\n",
+       " 'ancertalex']"
+      ]
+     },
+     "execution_count": 35,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "display_solution(solutions[0], columns)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 36,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "849"
+      ]
+     },
+     "execution_count": 36,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "hinted_keywords = [w for w in keywords if w[0] =='f' if len(transpositions_of(w)) == 7]\n",
+    "len(hinted_keywords)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 37,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['fabrics',\n",
+       " 'facings',\n",
+       " 'faction',\n",
+       " 'factors',\n",
+       " 'factory',\n",
+       " 'faculty',\n",
+       " 'fadeout',\n",
+       " 'failure',\n",
+       " 'fainest',\n",
+       " 'fainted']"
+      ]
+     },
+     "execution_count": 37,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "hinted_keywords[:10]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 38,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "175"
+      ]
+     },
+     "execution_count": 38,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "first_chunk = c8bl[:175]\n",
+    "len(first_chunk)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 39,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['gatlrlnjtonethnirreh',\n",
+       " 'raorejnptreanhriaeso',\n",
+       " 'raohoanptraesrriasul',\n",
+       " 'raohhanptraemrriasln',\n",
+       " 'raorhaeptrnemsrianln',\n",
+       " 'raonlneptrnissriaaoc',\n",
+       " 'garhrarjtartsnnifphn',\n",
+       " 'raoaalapteesnfriunnr',\n",
+       " 'raonanhpterfrariutpn',\n",
+       " 'garehhrjteaaraniessp',\n",
+       " 'raonhalpterafnriutsp',\n",
+       " 'fainrleptorniseirtno',\n",
+       " 'raoaanhptemfrariunpn',\n",
+       " 'raloannptirsrhrioalt',\n",
+       " 'falmireptinonseiosrn',\n",
+       " 'ralhaanptiafmrriospn',\n",
+       " 'faeilenptnoisreirroo',\n",
+       " 'raeoeanptneafhrirusp',\n",
+       " 'earotktntvrugheivarj',\n",
+       " 'gaeorhojtarernnisaep',\n",
+       " 'gaeorhnjtarerhnisaep',\n",
+       " 'raeooaeptareesrisaun',\n",
+       " 'garnahrjtvenranivrep',\n",
+       " 'raalaenptmifsrrinopo',\n",
+       " 'faoeoepptnneareihrus',\n",
+       " 'falhonpptnaerreirsut',\n",
+       " 'fanroanpthiesreiaoul',\n",
+       " 'fanhonpptraerreinsut',\n",
+       " 'rahnaanptaofmrrisepn',\n",
+       " 'fahrrinptaitoreisohh',\n",
+       " 'rarrjaaptnensfrineon',\n",
+       " 'gaaohrmjtsrrnnninapn',\n",
+       " 'gaaarhrjtsenraninnnp',\n",
+       " 'gasrlhrjtntnraniehrp',\n",
+       " 'fasanomptnensneieean',\n",
+       " 'raalrempftinsnrpiono',\n",
+       " 'raaorejpftneanrpihes',\n",
+       " 'ghrrlanjratnthnpfhri',\n",
+       " 'gharnarjreaetvnpnfai',\n",
+       " 'frtroenppwthsredoheo',\n",
+       " 'frahoepppeaearednsus',\n",
+       " 'raeaoalpfnsntirprlhi',\n",
+       " 'raaiahnpfmotarrpnhis',\n",
+       " 'froiianppnoosredhhrl',\n",
+       " 'rahrinnpfaeeorrpsere',\n",
+       " 'rahaaiupfaeselrpsnlr',\n",
+       " 'raaerejpfsreanrpnpes',\n",
+       " 'graeohnjetarrhneisap',\n",
+       " 'fitahanpoimesrerenln',\n",
+       " 'grtaaahjeosntrnernei',\n",
+       " 'rotaaanpeosetrrurnni',\n",
+       " 'roieaaopeeanfnrureep',\n",
+       " 'rrejahnpernfarrepops',\n",
+       " 'rrejarepernfnsrepopn',\n",
+       " 'fopalrnpertntheuiirh',\n",
+       " 'frpnhrlperoapneeiesd',\n",
+       " 'foperehpernpaaeuirds',\n",
+       " 'fopalaapersnteeuinri',\n",
+       " 'rrjalaepensnfrreonrp',\n",
+       " 'fopaarnpersmpreuinnd',\n",
+       " 'roatalhpeeifnarunepr',\n",
+       " 'gtfiehrjuterranrrrep',\n",
+       " 'rrainanpeneofhreerep',\n",
+       " 'filhranpoiapmrerosdn',\n",
+       " 'rrrajaapevtnnfrevioe',\n",
+       " 'roeaaanpeatefhrusinp',\n",
+       " 'rreinanpeaeofhresrep',\n",
+       " 'ronealnperrfnhrutppr',\n",
+       " 'fioraenpohpmsreredno',\n",
+       " 'fonprlnperrpnheutidr',\n",
+       " 'finlrenporipsrertodo',\n",
+       " 'rrlatajpenfisnrerpen',\n",
+       " 'rooaeaepenfntaruhpri',\n",
+       " 'fiairnhpomopraernhdn',\n",
+       " 'pfomrteddsnnwstcnsno',\n",
+       " 'rrninalpeheofnrearep',\n",
+       " 'fonrraeperipmseunodn',\n",
+       " 'fonrnrhperirpaeunotd',\n",
+       " 'pfnsoaiddsoseetccrne',\n",
+       " 'grnatahjeetonrnesire',\n",
+       " 'grnarhrjeetnranesinp',\n",
+       " 'ronarampeetnfnrusinp',\n",
+       " 'roaaeaepeifresrueppn',\n",
+       " 'finnnorpoesnsperscan',\n",
+       " 'rosaanmpeoftnnrurpia',\n",
+       " 'flapannpitrsrheoiilt',\n",
+       " 'raaeoaopntaefnreieup',\n",
+       " 'faaeorppntaevreeieuv',\n",
+       " 'eaattktnntrogheeivrj',\n",
+       " 'gaanthnjeteorhnniarp',\n",
+       " 'rlaealnpitnfnhroirpr',\n",
+       " 'faanorppeteevreniauv',\n",
+       " 'raaejanpetanfhrnisop',\n",
+       " 'gaarehrjntvaraneivep',\n",
+       " 'raaeuaopetalfnrnisip',\n",
+       " 'faaooeppetnearenihus',\n",
+       " 'gaanehrjnthrraneiaep',\n",
+       " 'raannalpethofnrniaep',\n",
+       " 'eaahtktnntaogheeisrj',\n",
+       " 'ftaaormpwtshnneoinen',\n",
+       " 'ftashanpwtnemreoieln',\n",
+       " 'ftashnapwtnenmeoiela',\n",
+       " 'faasoeppetnearenieus',\n",
+       " 'faaeoeppetsearenious',\n",
+       " 'farnorppepeevrendauv',\n",
+       " 'farnonrpepeehiendaua',\n",
+       " 'farnoeppepeearendsus',\n",
+       " 'gfrirhrjteearanrernp',\n",
+       " 'raoieaopneeafnreurep',\n",
+       " 'paoprhndeeeiartnufos',\n",
+       " 'paoprredeeeinstnufon',\n",
+       " 'faoeirnpeeaeihenusro',\n",
+       " 'raolhaepeenafrrnursp',\n",
+       " 'gaaahhrjestarannlisp',\n",
+       " 'rlrahalpittafnrohisp',\n",
+       " 'gaviehrjnvearaneorep',\n",
+       " 'raaoorapesneatrnlhuf',\n",
+       " 'flaoinrpisnorpeolhrt',\n",
+       " 'ptrlfondwtndhhtohrce',\n",
+       " 'pthafnhdwemdratolncn',\n",
+       " 'ftrhnaipwtartoeohsni',\n",
+       " 'rlaaniapissrefrolntr',\n",
+       " 'rlralaepitsnfrrohnrp',\n",
+       " 'rlraraepitsnfrrohnnp',\n",
+       " 'fthsranpwenpmreoledn',\n",
+       " 'fthnraepweapmseolidn',\n",
+       " 'plasinpdisnoretolert',\n",
+       " 'rlnaniepinfresroaptr',\n",
+       " 'faauirlpeslopnennird',\n",
+       " 'raaeuaepesalfrrnnsip',\n",
+       " 'flnnrrepinrtpseoatwd',\n",
+       " 'faaeuirpesalopennsir',\n",
+       " 'ptnocemdwnhesntoaeto',\n",
+       " 'raannaepesrofrrnnnep',\n",
+       " 'flanrrapisripmeonnod',\n",
+       " 'ftamrropwsnnpseonsnd',\n",
+       " 'plarinpdisnoretonnrt',\n",
+       " 'plnninpdineoretoasrt',\n",
+       " 'pleinpndisorertoortf',\n",
+       " 'ftehnrapwseapmeoolid',\n",
+       " 'fvaaoeppvteeareoinus',\n",
+       " 'raaeoaopstnefnrlirup',\n",
+       " 'fvaeoeppvtneareoirus',\n",
+       " 'grianhrjtesrranhrnnp',\n",
+       " 'fhpaarepertmnseliinn',\n",
+       " 'raotaanpseiefhrluenp',\n",
+       " 'rronhaepterafrrhunsp',\n",
+       " 'rrlealnptirfnhrhoppr',\n",
+       " 'fvaeoeppvereareonpus',\n",
+       " 'frlprlnptirpnhehoidr',\n",
+       " 'rvarajapvnetnfroeeio',\n",
+       " 'raaoahapseetafrlnuis',\n",
+       " 'frwrohnptopharehades',\n",
+       " 'rroeanhpthrfrarheppn',\n",
+       " 'ranelanpsrrifhrltpop',\n",
+       " 'rroeaanpthrsfrrhepnp',\n",
+       " 'gaoanhrjsnteranlhirp',\n",
+       " 'rrlajanptntnfhrhriop',\n",
+       " 'grlaehrjtntsranhriop',\n",
+       " 'eaotatknsnothgelhrir',\n",
+       " 'rrltornptnieahrhreuf',\n",
+       " 'rhliatnpenefhhrlrrpa',\n",
+       " 'faoionppsneerrelhrut',\n",
+       " 'raornaepsnaotnrlhfei',\n",
+       " 'faoeonppsnrerrelhput',\n",
+       " 'faoropnpsnperrelhdui',\n",
+       " 'raoaianpsnfotrrlhphi',\n",
+       " 'rhaanaspemfrtnrlnpni',\n",
+       " 'rrljasaptnntnfrhroie',\n",
+       " 'fhaprhnpemrparelnids',\n",
+       " 'frlposrptnrenpehriue',\n",
+       " 'paouinpdsnloretlhirt',\n",
+       " 'frliatnptnotwhehrhio',\n",
+       " 'frlwaohptnothaehraie',\n",
+       " 'rrliahaptnotafrhrhis',\n",
+       " 'fhawahnpemotarelnais',\n",
+       " 'raoeooapsnnertrlhrua',\n",
+       " 'paoiinpdsnooretlhhrt',\n",
+       " 'frliataptnoswtehrhno',\n",
+       " 'rrlnauaptnhtlfrhraii',\n",
+       " 'fhahirnpemaoprelnsrd',\n",
+       " 'fharaorpemnsapelnnne',\n",
+       " 'fhasrorpemnpanelnede',\n",
+       " 'fhatrmrpeswpnnelnods',\n",
+       " 'paalinpdssioretlnort',\n",
+       " 'rraoealptshrfnrhnepp',\n",
+       " 'fhnoeaepenarmselaepn',\n",
+       " 'paaoremdessnfntennnd',\n",
+       " 'paslinpdsnioretleort',\n",
+       " 'fhnirmrpeeopnnelsrds',\n",
+       " 'frnrailptentoiehsnir',\n",
+       " 'roajraapntnenfrhioee',\n",
+       " 'faailrepmtoinseniron',\n",
+       " 'foaeoeppntnearehirus',\n",
+       " 'glanohnjntrrrhnritap',\n",
+       " 'rlanoonpntrrehrritau',\n",
+       " 'goaeehrjntaaranhisep',\n",
+       " 'roaeuaapntalferhisip',\n",
+       " 'roaeeoapntaaefrhiseu',\n",
+       " 'flanrlepntrtiseritwo',\n",
+       " 'rlanhoopntraerrritsu',\n",
+       " 'faaapnrpmtsroneninie',\n",
+       " 'flaeonppntserreriout',\n",
+       " 'glhrranjnreathnrpefi',\n",
+       " 'flrrpnhpnperoaerdeie',\n",
+       " 'flrwrohpnpothaerdahe',\n",
+       " 'rlaninnpnfreohrrptre',\n",
+       " 'forosimpspaoenenderu',\n",
+       " 'farnrlepmpriisendnoo',\n",
+       " 'goratahjnetonrnheire',\n",
+       " 'raoraenpmeatsrrnufio',\n",
+       " 'rlrejanpnernfhrrepop',\n",
+       " 'gorhraejneratanhepfi',\n",
+       " 'glrhranjnerathnrepfi',\n",
+       " 'rloanenpnefrrhrruptp',\n",
+       " 'rlrjahapnentafrreois',\n",
+       " 'paoprhndmeeiartnufos',\n",
+       " 'rorejaepneanfrrhesop',\n",
+       " 'flonprnpnerrpherutid',\n",
+       " 'rloneaepnehafrrruaep',\n",
+       " 'foapianpnsrotrehlihi',\n",
+       " 'foapirnpnsroprehlihd',\n",
+       " 'flrliinpntioeherhorr',\n",
+       " 'flrohatpnthatwerhesi',\n",
+       " 'rlrohaepnthafrrrhesp',\n",
+       " 'rahnhaepmerafrrnlnsp',\n",
+       " 'rlrhnaepntaofrrrhsep',\n",
+       " 'rlrsoaepntnhfrrrheep',\n",
+       " 'raaoraepmsenfrrnnunp',\n",
+       " 'raonnrapsroretrnaene',\n",
+       " 'raiuaanpselfmrrnripn',\n",
+       " 'faieoeppseaearenreus',\n",
+       " 'faraoeppspeearendnus',\n",
+       " 'falaninpsitrorenoitr',\n",
+       " 'fatnrirpswrtopenonhh',\n",
+       " 'paerhomdstneantnvnle',\n",
+       " 'gantahrjseierannaenp',\n",
+       " 'raetlalpsniifnrnreop',\n",
+       " 'raetlanpsniifrrnreop',\n",
+       " 'faoirhapsaenemenernl',\n",
+       " 'raoeaanpshrfmrrneppn',\n",
+       " 'ranalalpsrfntirntpri',\n",
+       " 'fanpaoepsrrserentilu',\n",
+       " 'fanuirlpsrlopnentird',\n",
+       " 'faatonrpsmierienneun',\n",
+       " 'pallinpdsnioretnrort',\n",
+       " 'paltropdsnwthetnrohe',\n",
+       " 'galnaohjsnrtrrnnrtia',\n",
+       " 'paaoinedsmhorftnnern',\n",
+       " 'fnonisrpnssonpeancre',\n",
+       " 'ranotaapsreiefrnnuen',\n",
+       " 'famriaopsnnothensnri',\n",
+       " 'famriropsnnopsensnrd',\n",
+       " 'pnnsiopdnsoohetacrre',\n",
+       " 'ratalrnptositnrirnoh',\n",
+       " 'ealktvanttgovseihjro',\n",
+       " 'gaoharajtrrnelniapee',\n",
+       " 'gaorahfjtrenrtniaeep',\n",
+       " 'raooathptreeuariaunr',\n",
+       " 'raorrhtptrntanrianhs',\n",
+       " 'faoatolpteeuaeeiunre',\n",
+       " 'failnraptoirtleironh',\n",
+       " 'raonhanpterafrriutsp',\n",
+       " 'rarojaaptennsfriehol',\n",
+       " 'raolnanptenrfhriurtp',\n",
+       " 'failthoptonheneirral',\n",
+       " 'faionoiptosarneirnis',\n",
+       " 'faorrasptenilceiunoe',\n",
+       " 'fatlvnnptwivnseioooa',\n",
+       " 'gaaavlajtenvcfnineoe',\n",
+       " 'ralnahnptirfasrionps',\n",
+       " 'falmireptinonseiosrn',\n",
+       " 'gaahhlajtearnfninspr',\n",
+       " 'ranoafrpteeedariaunc',\n",
+       " 'ranrnnapteehofriaeae',\n",
+       " 'ranonfcptrrtdhritsnc',\n",
+       " 'raeooasptarelcrisaue',\n",
+       " 'raeoeroptarsehrisaoe',\n",
+       " 'raoenuvptnnohurihrec',\n",
+       " 'raoeluvptnnihurihroc',\n",
+       " 'galavlajtnmvcfnirnoe',\n",
+       " 'raahnanptmaofrrinsep',\n",
+       " 'ganorctjthrehwniaaeo',\n",
+       " 'fanroanpthiesreiaoul',\n",
+       " 'ganhhnajtrarrfninspt',\n",
+       " 'ranhaoyptrafherinspe',\n",
+       " 'fahattmptacwuneiseor',\n",
+       " 'gahehfhjtarrtonisepo',\n",
+       " 'gahehlajtarrnfnisepr',\n",
+       " 'fanlnifptnisoteiaocr',\n",
+       " 'faamriaptsnnoceinsnr',\n",
+       " 'raalnripftnhtorpirah',\n",
+       " 'ghanrtajrtheonnpiaer',\n",
+       " 'raahnylpftaoenrpisen',\n",
+       " 'raarnyopftnoenrpinen',\n",
+       " 'gharaaajrtnsmfnpinnn',\n",
+       " 'raaraoypftnsserpinnn',\n",
+       " 'ghtanaojromntnnprnai',\n",
+       " 'ghrosefjraoyttnpfgdt',\n",
+       " 'ghrraocjraamdhnpflns',\n",
+       " 'oykrtcsgegaiatfnjfel',\n",
+       " 'ekhrtulngraiheejpfec',\n",
+       " 'rarstolpfpyuherpdere',\n",
+       " 'fryltolppeiuaeednore',\n",
+       " 'ghaatoojrnfsdrnpepys',\n",
+       " 'gharooojrnerdrnpeeas',\n",
+       " 'raaoithpfeeeuarpnurr',\n",
+       " 'raafontpfesrturpnrsn',\n",
+       " 'frlanirppisroaedoltr',\n",
+       " 'friintnppooruhedhrtr',\n",
+       " 'raeirolpfaeeherpsree',\n",
+       " 'frawkrrppmogvnednajv',\n",
+       " 'ghonavhjrnrtuonphtir',\n",
+       " 'frloiroppnnaeaedrhae',\n",
+       " 'raankrspfmaghtrpnije',\n",
+       " 'frosanappsnenmedneea',\n",
+       " 'rahrinopfaeeoorpsere',\n",
+       " 'frsyoteppnesugedennr',\n",
+       " 'raeniaepfsrotarpothi',\n",
+       " 'granoahjethrsrneiaal',\n",
+       " 'fiihrhepoeaeeaerrsel',\n",
+       " 'roeseooperytonrupevg',\n",
+       " 'roeaathperfeuaruppnr',\n",
+       " 'grtaooujehsrdhnernas',\n",
+       " 'roaaeoopeferonrupnpg',\n",
+       " 'rraaesopefnrmhrepepn',\n",
+       " 'rraeesspefarmnrepspn',\n",
+       " 'roaliyfpefneetruprrn',\n",
+       " 'roaaionpefmeohrupnrg',\n",
+       " 'fopalrrpersneheuinre',\n",
+       " 'frainsopeneomaeeeren',\n",
+       " 'roaaranpeefvterunpvi',\n",
+       " 'filanvspoieevyeronao',\n",
+       " 'fileoonpoindoherorsg',\n",
+       " 'roatsecpenrrteruevht',\n",
+       " 'roahalrpeeafnprunspr',\n",
+       " 'foahroopeeaidoeunsos',\n",
+       " 'roahlaipeeanthrunsri',\n",
+       " 'roeaasapeatemirusinn',\n",
+       " 'finaltnportiuhertior',\n",
+       " 'finalthportiuaertior',\n",
+       " 'roeaaswpeatemfrusinn',\n",
+       " 'etravehnuvtuhrervirk',\n",
+       " 'greavlrjeatutanesirh',\n",
+       " 'rrejaorpeanfnpresoph',\n",
+       " 'rresserpeamnfpresntd',\n",
+       " 'fonsetopermgooeutnhd',\n",
+       " 'fiotdeopohuotnererot',\n",
+       " 'fintdkfporuogtertroj',\n",
+       " 'roeaavtpeaeturrusnir',\n",
+       " 'rolaaatpenftmrrurpin',\n",
+       " 'grohtaajenrotnnehpri',\n",
+       " 'rooataepenfisnruhpel',\n",
+       " 'fiargfipompjteerndnr',\n",
+       " 'fiargvapompjvierndno',\n",
+       " 'rolahsepenfaytrurpsd',\n",
+       " 'rolasaapenfnterurpei',\n",
+       " 'rolasrhpenfnterurpeh',\n",
+       " 'filrsroponpntserrdeh',\n",
+       " 'filinrnponorpherrhtd',\n",
+       " 'rolesatpennntarurrei',\n",
+       " 'ronoaafperrtetrunain',\n",
+       " 'fonrraeperipmseunodn',\n",
+       " 'fonrnrhperirpaeunotd',\n",
+       " 'fonrharperiateeunosi',\n",
+       " 'ronnstrperhcaprunaei',\n",
+       " 'rosaorfpenfgtsruepfh',\n",
+       " 'fonarropeetneaeusine',\n",
+       " 'finarrhpoetneeersine',\n",
+       " 'ronantipeetsuirusicr',\n",
+       " 'gaattirjntotoaneirsr',\n",
+       " 'raajvaepetnostrniool',\n",
+       " 'flaplerpitrntveoiirt',\n",
+       " 'faareoopntvaeaeeiveu',\n",
+       " 'raaveftpntoutsreiolo',\n",
+       " 'rlatroopithionroiatg',\n",
+       " 'faavetopetoluaenioor',\n",
+       " 'raannalpethofnrniaep',\n",
+       " 'raannanpetrofhrninep',\n",
+       " 'faanrofpetrieteninou',\n",
+       " 'rlahoelpitartnroisat',\n",
+       " 'faahgtepetajugenisnr',\n",
+       " 'gaahehfjntarrtneisep',\n",
+       " 'rlahnanpitarfrroistp',\n",
+       " 'rlahiyepitahearoisin',\n",
+       " 'rlahiylpitahenroisin',\n",
+       " 'rlariyopitnhenroinin',\n",
+       " 'faahntopetatuaenisnr',\n",
+       " 'ftahnrspwtattleoisnh',\n",
+       " 'rlarsetpitnntaroinet',\n",
+       " 'flaarimpitsnoneoinnr',\n",
+       " 'gaannhajeterrfnnisnp',\n",
+       " 'raartsopnfpsmhrepdyn',\n",
+       " 'farrntopepatuaendlnr',\n",
+       " 'farnonrpepeehiendaua',\n",
+       " 'farnroopephieoendaou',\n",
+       " 'raahinopefaeoornpsre',\n",
+       " 'raaaotfpefieitrnpeue',\n",
+       " 'flrnriepipenoneodsnr',\n",
+       " 'rlannaapifenmtropsan',\n",
+       " 'faoiesopneeamaeeuren',\n",
+       " 'flienoopionhdoeorras',\n",
+       " 'flinhoopioradoeortss',\n",
+       " 'fliseerpiolstveorlst',\n",
+       " 'fliteoopiohsoneorasg',\n",
+       " 'fliteonpiohsoheorasg',\n",
+       " 'plilhrvdionaeutorrse',\n",
+       " 'favhhtopevekuaenosgr',\n",
+       " 'plavdrvdisveeutologe',\n",
+       " 'flrvtoopitvcdoeohoas',\n",
+       " 'flrseorpitledaeohlds',\n",
+       " 'flrseorpitledaeohlds',\n",
+       " 'plavervdisoeeutolode',\n",
+       " 'rlaoanipisnfrerolhpt',\n",
+       " 'flrliefpitnorteohrrp',\n",
+       " 'pthafnhdwemdratolncn',\n",
+       " 'planervdishgeutolahe',\n",
+       " 'ftrhnaipwtartoeohsni',\n",
+       " 'rlrsalrpitnfnprohepr',\n",
+       " 'faatctopesieuaennehr',\n",
+       " 'ftnronfpwnphsteoadec',\n",
+       " 'flnierhpinoreaeoarpe',\n",
+       " 'paaeuivdesaloutnnsir',\n",
+       " 'raalofrpesnsdprnnrnc',\n",
+       " 'flaadoopismedoeonngs',\n",
+       " 'flamrrnpisnipreonsod',\n",
+       " 'ftamrropwsnnpseonsnd',\n",
+       " 'ftardkapwsnogmeonnoj',\n",
+       " 'ftnndkopwnsogneoacoj',\n",
+       " 'rletaropishtiorooait',\n",
+       " 'flemrropisnipoeoosod',\n",
+       " 'grianeajtesrgfnhrnnh',\n",
+       " 'rajtvsvpsnivcurloeoe',\n",
+       " 'frpjoonptrndohehiosg',\n",
+       " 'prpraordteissvthfoln',\n",
+       " 'prinhovdtoraeuthrnsu',\n",
+       " 'rrlranoptiatarrhofii',\n",
+       " 'palrnrvdsithtutlowah',\n",
+       " 'raianhrpsofraprlhpts',\n",
+       " 'rrorarrpthatvnrhefiv',\n",
+       " 'fveeaoopvareeaeospnu',\n",
+       " 'ranhaovpsrateurltsiu',\n",
+       " 'fhafyoipeeseneelernh',\n",
+       " 'rrhfaiuptetiehrhlrhr',\n",
+       " 'rrvdapoptvoceorhooef',\n",
+       " 'prvgovgdtvheuftholur',\n",
+       " 'frvgsaeptvhrcaeholhe',\n",
+       " 'rhahirepesaiptrllsed',\n",
+       " 'rrlajaoptntnfnrhriop',\n",
+       " 'faoaponpsntrerelhiiu',\n",
+       " 'grlthaojtnortnnhrrpi',\n",
+       " 'rrliaatptneflnrhrrpe',\n",
+       " 'rhliatnpenefhhrlrrpa',\n",
+       " 'rrlaaotptnftsrrhrpin',\n",
+       " 'gaoherfjsnrrptnlhped',\n",
+       " 'frlrlhlptnpireehrdop',\n",
+       " 'raoaahepsnfeehrlhpns',\n",
+       " 'fharwanpemposhelndal',\n",
+       " 'raoanaipsnfrtorlhpti',\n",
+       " 'rhaanhrpemfraprlnpns',\n",
+       " 'faormropespnnneendsn',\n",
+       " 'rrlahhfptnfaesrhrpsl',\n",
+       " 'rrlasaoptnfntsrhrpei',\n",
+       " 'fharshepempnraelndep',\n",
+       " 'fhaphsrpemdrmnelntpn',\n",
+       " 'fhaproipemrpneelnidh',\n",
+       " 'prlrlfadtntidlthrwoc',\n",
+       " 'frliatfptnotwtehrhio',\n",
+       " 'frlirdfptnopetehrhdg',\n",
+       " 'frlitrnptnowphehrhod',\n",
+       " 'frlwvyaptnovdcehraoo',\n",
+       " 'rrlnauaptnhtlfrhraii',\n",
+       " 'rhansaapemrnftrlnnep',\n",
+       " 'frlhorgptnaephehrsud',\n",
+       " 'fhahscepemayaaelnsdl',\n",
+       " 'rhasathpemntaorlneii',\n",
+       " 'rhnhaarperafmprlnspn',\n",
+       " 'rraoataptsrtnnrhnair',\n",
+       " 'fratornptswhprehnoed',\n",
+       " 'faaneoopssrreaelntpu',\n",
+       " 'fraoraiptshntoehneni',\n",
+       " 'fhaanaspesmrerelnnne',\n",
+       " 'fhaarrhpesmnprelnnnd',\n",
+       " 'frnplaopterissehsiol',\n",
+       " 'frnrhfopteiesoehsolr',\n",
+       " 'frnratrpteisnhehsolr',\n",
+       " 'raaohaapmtracnrniase',\n",
+       " 'gaaoradjmtrnsenniann',\n",
+       " 'goaeorojntareanhisae',\n",
+       " 'foaeeoopntaaeaehiseu',\n",
+       " 'foaeuaipntaleoehisin',\n",
+       " 'raasoalpmtoefnrnirup',\n",
+       " 'glasntajntoewfnrirto',\n",
+       " 'raasaeopmtoatornircv',\n",
+       " 'gohieaajnreanfnhpree',\n",
+       " 'rlaiuarpnfelearrprin',\n",
+       " 'gohraocjnramdhnhpfns',\n",
+       " 'glhraosjnramdtnrpfns',\n",
+       " 'gohassujnrfyrhnhppeh',\n",
+       " 'rlarshtpnfpyerrrpdel',\n",
+       " 'gohytuvjnreohunhpndc',\n",
+       " 'roakfrfpnfgttsrhpjuh',\n",
+       " 'flrkrolpnpgeaeerdjee',\n",
+       " 'gohyahfjnrenetnhpnes',\n",
+       " 'rlakserpnfgrtvrrpjht',\n",
+       " 'faronvlpmpotvcendgno',\n",
+       " 'roaoooipsfosrnrnpgns',\n",
+       " 'flrraropnpaaeaerdlce',\n",
+       " 'rlaninrpnfreoarrptre',\n",
+       " 'rlanrnopnfratdrrptln',\n",
+       " 'rlansorpnfroeprrptru',\n",
+       " 'farosiopmphoooenderr',\n",
+       " 'farlahepmposraendsnp',\n",
+       " 'flrnriypnphioeerdaoh',\n",
+       " 'flrhnropnpateaerdsne',\n",
+       " 'farrshdpmpnneeendnel',\n",
+       " 'fliihrhpnoeaeeerrrse',\n",
+       " 'floposfpnerdyteruise',\n",
+       " 'pafnrofdmdrtettncnwu',\n",
+       " 'plinurvdnohleutrraie',\n",
+       " 'rlosnerpneoetprrurtv',\n",
+       " 'faisafopmooasoenrrcr',\n",
+       " 'flrohirpnthaoperhesr',\n",
+       " 'plrohivdnthaoutrhesr',\n",
+       " 'fahnhtipmeraioenlnse',\n",
+       " 'fahnhirpmeraopenlnsr',\n",
+       " 'flrhrorpntaieperhsou',\n",
+       " 'plrsoivdntnhoutrheer',\n",
+       " 'fahsnirpmenropenlenr',\n",
+       " 'fahnsirpmeaoopenlirr',\n",
+       " 'foniniapsnesolenarcr',\n",
+       " 'fanpalfpmnrtitenaiio',\n",
+       " 'paairovdmsoneutnnrnu',\n",
+       " 'paafroadmsdneetnncnu',\n",
+       " 'flaitirpnsohopernhar',\n",
+       " 'raonnrapsroretrnaene',\n",
+       " 'faesltopsryiuaenpeor',\n",
+       " 'faraltopspeiuaendnor',\n",
+       " 'fnponsopnresmseaiucn',\n",
+       " 'fneisaapnuontmealrei',\n",
+       " 'fatiatnpswemneenornr',\n",
+       " 'gaaetctjsntiasnnevel',\n",
+       " 'faoirirpshenotenernr',\n",
+       " 'faneoogpsrreafentpue',\n",
+       " 'ranalrapsrfnpcrntprd',\n",
+       " 'faoooynpshadereneesn',\n",
+       " 'pallrhpdsnitirtnrohi',\n",
+       " 'faodoynpssederenngsn',\n",
+       " 'rnaovirpnmsviprannoe',\n",
+       " 'faorrrapssnipmennnod',\n",
+       " 'faorrrmpssnipnennnod',\n",
+       " 'ranaaajpsrfetnrnnpni',\n",
+       " 'panfgrddsrdjtetnncnh',\n",
+       " 'famriaopsnnothensnri',\n",
+       " 'fnnilrfpnsoipteacrod',\n",
+       " 'fnstokmpnocdgnearasj',\n",
+       " 'gaohsaojtrrlerniapln',\n",
+       " 'raonnafptrsnctriacae',\n",
+       " 'raonhvopterauoriutsr',\n",
+       " 'garortajtenpufniehrr',\n",
+       " 'raolnanptenrfhriurtp',\n",
+       " 'raauafrptelntvrinieo',\n",
+       " 'gaaeelsjtntttmnievth',\n",
+       " 'falaverptinveeeioeod',\n",
+       " 'ralnahnptirfasrionps',\n",
+       " 'gaanrrfjtnhepdnieaer',\n",
+       " 'raanohfptereadrinnus',\n",
+       " 'faeiltoptnoiureirror',\n",
+       " 'raeonftptartdsrissnc',\n",
+       " 'gaeororjtareaanisaee',\n",
+       " 'ranhusfptrahndritsct',\n",
+       " 'ranhusfptrahndritsct',\n",
+       " 'ranhusiptrahnhritsct',\n",
+       " 'raaaskaptmfngnrinpej',\n",
+       " 'raaieflptmostnrinhoo',\n",
+       " 'ranhaoyptrafherinspe',\n",
+       " 'fahattmptacwuneiseor',\n",
+       " 'faratsnptncwmseineon',\n",
+       " 'ranaotfptsfgntricpfr',\n",
+       " 'faroparptnerseeinuin',\n",
+       " 'rahiknoptahgrorisijt',\n",
+       " 'rahionoptahorerisigt',\n",
+       " 'raalreyptsinterinonv',\n",
+       " 'raaaotfpftmgntrpinfr',\n",
+       " 'ghaheotjrtaroanpiseg',\n",
+       " 'ghrosefjraoyttnpfgdt',\n",
+       " 'ghrysorjraeyrnnpfnds',\n",
+       " 'fryltolppeiuaeednore',\n",
+       " 'friintnppooruhedhrtr',\n",
+       " 'frnaplkpprsrngedtnir',\n",
+       " 'ghorreajrnaeatnphfes',\n",
+       " 'raliyrdpfnoevorprhnv',\n",
+       " 'ghlnavtjrnrturnprtir',\n",
+       " 'frloknippnngsoedrhjc',\n",
+       " 'frarilrppmnoiaednnro',\n",
+       " 'frahiltppmaoiuednsro',\n",
+       " 'frarilsppmnoimednnro',\n",
+       " 'frarilsppmnoimednnro',\n",
+       " 'frsninsppnsoamedtcri',\n",
+       " 'ranhrhrpfratehrpnshl',\n",
+       " 'frhonrrppaerieedsuno',\n",
+       " 'frhrkaippangmoedsnjn',\n",
+       " 'grtvealjeovattnerosi',\n",
+       " 'rrejahtpernfaurepops',\n",
+       " 'poprhredeeiaeatufose',\n",
+       " 'pipaaoedoesmeatrfnnu',\n",
+       " 'rraoltrpeneeapreeusi',\n",
+       " 'foaigsrpeeofyaeunrtd',\n",
+       " 'pftterrddwulevtcoroe',\n",
+       " 'foafrripeesanoeunrln',\n",
+       " 'foahroopeeaidoeunsos',\n",
+       " 'roeaasapeatemirusinn',\n",
+       " 'finaltnportiuhertior',\n",
+       " 'greavlsjeatutmnesirh',\n",
+       " 'roeotcspeadsemrussyt',\n",
+       " 'fonsetopermgooeutnhd',\n",
+       " 'rrevkdopeaugtrresrjo',\n",
+       " 'grohtsojenroyonehprd',\n",
+       " 'frlrrolpenppeeeerdru',\n",
+       " 'filrthsponphenerrdal',\n",
+       " 'roaasarpemfntnrunpei',\n",
+       " 'filinrnponorpherrhtd',\n",
+       " 'fonrharperiateeunosi',\n",
+       " 'fomrstopeninuseusoer',\n",
+       " 'pirnfoldonsdhetrncce',\n",
+       " 'ronaenopeefrrorusppt',\n",
+       " 'raajafapetnftnrniopr',\n",
+       " 'raajaafpetnfstrniopl',\n",
+       " 'raanntapetroosrniner',\n",
+       " 'rlahtrupitaothroisrh',\n",
+       " 'faahgtepetajugenisnr',\n",
+       " 'rlahnanpitarfrroistp',\n",
+       " 'gaahgovjetahounnislg',\n",
+       " 'gaahgotjetahoannislg',\n",
+       " 'rlaraeypitnsteroinnv',\n",
+       " 'flaarimpitsnoneoinnr',\n",
+       " 'ftashaopwtnemgeoieln',\n",
+       " 'raaejaspnfrnemreppon',\n",
+       " 'raaretrpefphuarnpdkr',\n",
+       " 'farnrorpeprieaendnou',\n",
+       " 'farnrltpephiiuendaoo',\n",
+       " 'flrnirrpipeoneeodsrn',\n",
+       " 'flienorpionrdaeorrns',\n",
+       " 'farrinipneveooeeevre',\n",
+       " 'flinhoopioradoeortss',\n",
+       " 'plapprrdiserevtolfie',\n",
+       " 'flahagrpisatheeolsil',\n",
+       " 'flrhifapitaosneohsrr',\n",
+       " 'flrsrlipitnpnoeohedr',\n",
+       " 'gaaorocjesrnoannnans',\n",
+       " 'flarpropispdeoeonrte',\n",
+       " 'rlariyspisnheyronnin',\n",
+       " 'rleerucpistpheroovdc',\n",
+       " 'flenrrypisaipeeooiod',\n",
+       " 'fapjrrrpsrnehaelioee',\n",
+       " 'frlrahoptitnenehowes',\n",
+       " 'raaloofpseidrtrlnosa',\n",
+       " 'fhtfhcopewteeoelorsi',\n",
+       " 'frlfhnhptitearehorsi',\n",
+       " 'palfacfdsiteedtlorei',\n",
+       " 'frhfodsptesoemehlrgg',\n",
+       " 'prhttaedtewuisthlorh',\n",
+       " 'rrhfaiuptetiehrhlrhr',\n",
+       " 'rrvitaaptvhicnrhoiee',\n",
+       " 'prviroadtvhienthoiou',\n",
+       " 'frvgnhaptvhoeneholes',\n",
+       " 'fhvnecrpevssanelocsl',\n",
+       " 'phvnstidevslaotlocli',\n",
+       " 'paahnuadesarrmtelsii',\n",
+       " 'gaohaatjsnrtmvnlhpin',\n",
+       " 'grlhtrojtnroprnhrprd',\n",
+       " 'grlhtutjtnrirrnhrpei',\n",
+       " 'rrlailvptnfeivrhrpro',\n",
+       " 'faorphrpsnpreeelhdil',\n",
+       " 'faoropnpsnperrelhdui',\n",
+       " 'faormropespnnneendsn',\n",
+       " 'rhaansrpemfrnprlnpne',\n",
+       " 'fharnsapemprneelndne',\n",
+       " 'rhaahanpemfatrrlnpsi',\n",
+       " 'fharhhapemparnelndsp',\n",
+       " 'frlrsaiptnpneoehrdee',\n",
+       " 'rhaashlpemfnenrlnpes',\n",
+       " 'rrlfksdptnpgmorhrejn',\n",
+       " 'frlprosptnrpsmehridn',\n",
+       " 'prlpisodtneonethrfre',\n",
+       " 'frlpvdnptnrvotehrioo',\n",
+       " 'rrliahiptnotahrhrhis',\n",
+       " 'frlwvyaptnovdcehraoo',\n",
+       " 'rhansaapemrnftrlnnep',\n",
+       " 'pharesidemnfnotlnnde',\n",
+       " 'rrlhofoptnaepdrhrsue',\n",
+       " 'fhahiptpemaoduelnsrt',\n",
+       " 'grlsattjtnntahnhreii',\n",
+       " 'grlsattjtnntahnhreii',\n",
+       " 'frneofoptrgetdehnhur',\n",
+       " 'fhnhraiperapmoelnsdn',\n",
+       " 'pratiahdtswosithnohl',\n",
+       " 'fratornptswhprehnoed',\n",
+       " 'rraoealptshrfnrhnepp',\n",
+       " 'rhaaniupesmrerrlnnnr',\n",
+       " 'fhaanaspesmrerelnnne',\n",
+       " 'roajanfpntnsrtrhiolt',\n",
+       " 'goanlfojntentanhirro',\n",
+       " 'glanohnjntrrrhnritap',\n",
+       " 'rlanoonpntrrehrritau',\n",
+       " 'flaorevpnthtnveriewe',\n",
+       " 'faaoranpmthtlneniewe',\n",
+       " 'rlanuvrpntrluarritir',\n",
+       " 'rlahaaopntafmhrrispn',\n",
+       " 'gohrystjnraeyunhpfnd',\n",
+       " 'glhryssjnraeymnrpfnd',\n",
+       " 'elkatoenngfirgerjpes',\n",
+       " 'gohyfuvjnreshunhpnrc',\n",
+       " 'faronnapmpohteendgan',\n",
+       " 'forynhepsperatendnns',\n",
+       " 'flrrpnhpnperoaerdeie',\n",
+       " 'roaeinepnfaeonrhpsre',\n",
+       " 'rlannyrpnfhoehrrpaen',\n",
+       " 'fornohfpspsgltendcfc',\n",
+       " 'glroanejnerthgnreaia',\n",
+       " 'gothrsrjnurayenhrpfd',\n",
+       " 'ploprhrdneeiaetrufos',\n",
+       " 'faopohspmerdomenuiso',\n",
+       " 'failftrpmoisuaenrorr',\n",
+       " 'faieerlpmolsanenrosl',\n",
+       " 'fainuorpmorldaenrnis',\n",
+       " 'foisrropsooaeoenrrte',\n",
+       " 'plisaafdnooaedtrrrcn',\n",
+       " 'fahinyopmeordrenlrno',\n",
+       " 'fahnhirpmeraopenlnsr',\n",
+       " 'foairoypssondeennrns',\n",
+       " 'roamrsfpssnnytrnnsnd',\n",
+       " 'faerylipsaheioenseno',\n",
+       " 'faaihnypsmoendennrla',\n",
+       " 'faaoiropsmhonoennern',\n",
+       " 'raarnaspsmnofyrnnnep',\n",
+       " 'ranaaajpsrfetnrnnpni',\n",
+       " 'pnnftsndnsdwmttaccon',\n",
+       " 'pnnhtsndnslamttaccin',\n",
+       " 'fnstorypnoceheearaue',\n",
+       " 'gaorasgjtrenmhniaeen',\n",
+       " 'raonhvopterauoriutsr',\n",
+       " 'garnuecjtehhtanieacv',\n",
+       " 'faeiltoptnoiureirror',\n",
+       " 'gaeororjtareaanisaee',\n",
+       " 'ranhusfptrahndritsct',\n",
+       " 'faloceeptnsaaseirnle',\n",
+       " 'raheltaptatiuiristor',\n",
+       " 'rahelfrptatidnristoc',\n",
+       " 'raaalonpftmiohrpinog',\n",
+       " 'raahnylpftaoenrpisen',\n",
+       " 'raahnoapftaoomrpiseg',\n",
+       " 'raaoisrpfeeemnrpnurn',\n",
+       " 'friintrppooruvedhrtr',\n",
+       " 'frahiltppmaoiuednsro',\n",
+       " 'frahiltppmaoiuednsro',\n",
+       " 'frarilsppmnoimednnro',\n",
+       " 'frsninsppnsoamedtcri',\n",
+       " 'frhonrrppaerieedsuno',\n",
+       " 'fiirohrpoeneaeerrnus',\n",
+       " 'roaliyrpefneevruprrn',\n",
+       " 'foadyhepeloeraeueonp',\n",
+       " 'foeaasepeatemgeusinn',\n",
+       " 'foeaastpeatemceusinn',\n",
+       " 'rreavespeatuhmresirk',\n",
+       " 'fonprlsperrpnmeutidr',\n",
+       " 'filrtovponphsverrdan',\n",
+       " 'gaantcrjetevasnniaul',\n",
+       " 'rlanvrapitruanroitrl',\n",
+       " 'raarvylpntvueireivrn',\n",
+       " 'raanntapetroosrniner',\n",
+       " 'gaahoaujetagernnisfe',\n",
+       " 'rlahiylpitahenroisin',\n",
+       " 'ftashnapwtnenmeoiela',\n",
+       " 'rlaneynpitatehroiivn',\n",
+       " 'raaejyfpnfrnetreppon',\n",
+       " 'farnrlspepriimendnoo',\n",
+       " 'flientrpionhuheorrar',\n",
+       " 'flaahcnpistaaseolisl',\n",
+       " 'gaavttajesvaiennloie',\n",
+       " 'flareoepispndaeonres',\n",
+       " 'fapjrrrpsrnehaelioee',\n",
+       " 'rrlailvptnfeivrhrpro',\n",
+       " 'rrlaponptnfdrtrhrpts',\n",
+       " 'faorgropsnpjeaelhdne',\n",
+       " 'fharroapemppnselndrh',\n",
+       " 'rhaansrpemfrnprlnpne',\n",
+       " 'rhaahanpemfatrrlnpsi',\n",
+       " 'fhaphthpemdruaelntpr',\n",
+       " 'prlhrofdtnaisdthrson',\n",
+       " 'phahfnedemadrgtlnscn',\n",
+       " 'paorafndesnsdstennnc',\n",
+       " 'ransreopshnetdrlatev',\n",
+       " 'frneofoptrgetdehnhur',\n",
+       " 'fhnaorepenmapselaned',\n",
+       " 'rhaaniupesmrerrlnnnr',\n",
+       " 'rhnraudpeenmrorlsnni',\n",
+       " 'rlanoonpntrrehrritau',\n",
+       " 'rlanoonpntrrehrritau',\n",
+       " 'foanpospntrrelehitiu',\n",
+       " 'rlanuvrpntrluarritir',\n",
+       " 'roakfrfpnfgttsrhpjuh',\n",
+       " 'gohyfuvjnreshunhpnrc',\n",
+       " 'gohyahfjnrenetnhpnes',\n",
+       " 'gohyahfjnrenetnhpnes',\n",
+       " 'forynhepsperatendnns',\n",
+       " 'farrlnopmpacooendlee',\n",
+       " 'farlahepmposraendsnp',\n",
+       " 'glroanejnerthgnreaia',\n",
+       " 'rooaeeapnefarerhupsp',\n",
+       " 'gotnfecjnuedranhrrcp',\n",
+       " 'flinurrpnohleherraie',\n",
+       " 'fairoffpmonestenrnur',\n",
+       " 'flohdydpneaoeeeruson',\n",
+       " 'ponfnradsndspstnaccr',\n",
+       " 'roamrsfpssnnytrnnsnd',\n",
+       " 'roamrsfpssnnytrnnsnd',\n",
+       " 'faeryltpsaheiwenseno',\n",
+       " 'fartdrypsnneedennrge',\n",
+       " 'fartdonpsnnedsennrgs',\n",
+       " 'fnstorypnoceheearaue',\n",
+       " 'raalfhspteidcmrinoch',\n",
+       " 'gaanrfijtnheponieaee',\n",
+       " 'fanhusiptrahnoeitsct',\n",
+       " 'frahiltppmaoiuednsro',\n",
+       " 'rahrnnopfaerodrpsene',\n",
+       " 'roaliyrpefneevruprrn',\n",
+       " 'foailsopeeoeyoeunrsd',\n",
+       " 'roeavtspeatusmrusiry',\n",
+       " 'grohosujenrryhnehpad',\n",
+       " 'frlrrolpenppeeeerdru',\n",
+       " 'rooasahpenflmeruhpln',\n",
+       " 'gaanhfejnterttneirpr',\n",
+       " 'raajafapetnftnrniopr',\n",
+       " 'raarvylpntvueireivrn',\n",
+       " 'gartptfjnerdwtneevto',\n",
+       " 'flientrpionhuheorrar',\n",
+       " 'flareoepispndaeonres',\n",
+       " 'fharohepempnlaelndhc',\n",
+       " 'paneoafdshgeedtlahun',\n",
+       " 'rlanoonpntrrehrritau',\n",
+       " 'raarcvapmfpevsrnpdho',\n",
+       " 'rlarnerpnfarrprrplie',\n",
+       " 'flinurrpnohleherraie',\n",
+       " 'fahoroopmeannoenlenh',\n",
+       " 'raallrmpftnianrpirol',\n",
+       " 'rlanvrapitruanroitrl',\n",
+       " 'faonpfcpeeedtaenuatr',\n",
+       " 'raallrmpftnianrpirol']"
+      ]
+     },
+     "execution_count": 39,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[cadenus_decipher(first_chunk, w, keycolumn)[:20] for w in hinted_keywords]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 40,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[]"
+      ]
+     },
+     "execution_count": 40,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[w for w in hinted_keywords if cadenus_decipher(first_chunk, w, keycolumn).startswith('phaseseven')]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 41,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "def cadenus_break_worker(message, keyword, keycolumn, fitness):\n",
+    "    message_chunks = chunks(message, 175)\n",
+    "    plaintext = ''.join(cadenus_decipher(c, keyword, keycolumn) for c in message_chunks)\n",
+    "    fit = fitness(plaintext)\n",
+    "    return (keyword, keycolumn), fit"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 42,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "def cadenus_break(message, words=keywords, fitness=Pbigrams):\n",
+    "    c = make_cadenus_keycolumn(reverse=True)\n",
+    "    results = starmap(cadenus_break_worker, [(message, \n",
+    "                                              w, \n",
+    "                                              make_cadenus_keycolumn(doubled_letters='vw', start=s, reverse=r), \n",
+    "                                              fitness)\n",
+    "                               for w in words for s in string.ascii_lowercase for r in [True, False]])\n",
+    "    # return list(results)\n",
+    "    return max(results, key=lambda k: k[1])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 43,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('finalist',\n",
+       "  {'a': 6,\n",
+       "   'b': 5,\n",
+       "   'c': 4,\n",
+       "   'd': 3,\n",
+       "   'e': 2,\n",
+       "   'f': 1,\n",
+       "   'g': 0,\n",
+       "   'h': 24,\n",
+       "   'i': 23,\n",
+       "   'j': 22,\n",
+       "   'k': 21,\n",
+       "   'l': 20,\n",
+       "   'm': 19,\n",
+       "   'n': 18,\n",
+       "   'o': 17,\n",
+       "   'p': 16,\n",
+       "   'q': 15,\n",
+       "   'r': 14,\n",
+       "   's': 13,\n",
+       "   't': 12,\n",
+       "   'u': 11,\n",
+       "   'v': 10,\n",
+       "   'w': 10,\n",
+       "   'x': 9,\n",
+       "   'y': 8,\n",
+       "   'z': 7}),\n",
+       " -5286.197562931952)"
+      ]
+     },
+     "execution_count": 43,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key8b, fitness = cadenus_break(c8bl, words=hinted_keywords, fitness=Ptrigrams)\n",
+    "key8b, fitness"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 44,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'wledgctftrojhrtheonovoresoovrpanegoarerufofinaltnportiuhertiorafthehasdwarenncompleeeandoastestssoveconlrudedtlsreisnntignfrrrthesinaaltranlicthaaehesecisityseemiceshuneanykhf'"
+      ]
+     },
+     "execution_count": 44,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "cadenus_decipher(first_chunk, key8b[0], key8b[1])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 50,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[('finalist', 'z', 'az', True),\n",
+       " ('finalist', 'a', 'no', True),\n",
+       " ('finalist', 'n', 'no', True),\n",
+       " ('finalist', 'a', 'nu', True),\n",
+       " ('finalist', 'n', 'nu', True),\n",
+       " ('finalist', 'a', 'nz', True),\n",
+       " ('finalist', 'n', 'nz', True),\n",
+       " ('finalist', 'a', 'op', True),\n",
+       " ('finalist', 'o', 'op', True),\n",
+       " ('finalist', 'a', 'oq', True),\n",
+       " ('finalist', 'o', 'oq', True),\n",
+       " ('finalist', 'a', 'or', True),\n",
+       " ('finalist', 'o', 'or', True),\n",
+       " ('finalist', 'a', 'os', True),\n",
+       " ('finalist', 'o', 'os', True),\n",
+       " ('finalist', 'a', 'ot', True),\n",
+       " ('finalist', 'o', 'ot', True),\n",
+       " ('finalist', 'a', 'ou', True),\n",
+       " ('finalist', 'o', 'ou', True),\n",
+       " ('finalist', 'a', 'ov', True),\n",
+       " ('finalist', 'o', 'ov', True),\n",
+       " ('finalist', 'a', 'ow', True),\n",
+       " ('finalist', 'o', 'ow', True),\n",
+       " ('finalist', 'a', 'ox', True),\n",
+       " ('finalist', 'o', 'ox', True),\n",
+       " ('finalist', 'a', 'oy', True),\n",
+       " ('finalist', 'o', 'oy', True),\n",
+       " ('finalist', 'a', 'oz', True),\n",
+       " ('finalist', 'o', 'oz', True),\n",
+       " ('finalist', 'a', 'pq', True),\n",
+       " ('finalist', 'p', 'pq', True),\n",
+       " ('finalist', 'a', 'pr', True),\n",
+       " ('finalist', 'p', 'pr', True),\n",
+       " ('finalist', 'a', 'ps', True),\n",
+       " ('finalist', 'p', 'ps', True),\n",
+       " ('finalist', 'a', 'pt', True),\n",
+       " ('finalist', 'p', 'pt', True),\n",
+       " ('finalist', 'a', 'pu', True),\n",
+       " ('finalist', 'p', 'pu', True),\n",
+       " ('finalist', 'a', 'pv', True),\n",
+       " ('finalist', 'p', 'pv', True),\n",
+       " ('finalist', 'a', 'pw', True),\n",
+       " ('finalist', 'p', 'pw', True),\n",
+       " ('finalist', 'a', 'px', True),\n",
+       " ('finalist', 'p', 'px', True),\n",
+       " ('finalist', 'a', 'py', True),\n",
+       " ('finalist', 'p', 'py', True),\n",
+       " ('finalist', 'a', 'pz', True),\n",
+       " ('finalist', 'p', 'pz', True),\n",
+       " ('finalist', 'a', 'qr', True),\n",
+       " ('finalist', 'q', 'qr', True),\n",
+       " ('finalist', 'a', 'qs', True),\n",
+       " ('finalist', 'q', 'qs', True),\n",
+       " ('finalist', 'a', 'qt', True),\n",
+       " ('finalist', 'q', 'qt', True),\n",
+       " ('finalist', 'a', 'qu', True),\n",
+       " ('finalist', 'q', 'qu', True),\n",
+       " ('finalist', 'a', 'qv', True),\n",
+       " ('finalist', 'q', 'qv', True),\n",
+       " ('finalist', 'a', 'qw', True),\n",
+       " ('finalist', 'q', 'qw', True),\n",
+       " ('finalist', 'a', 'qx', True),\n",
+       " ('finalist', 'q', 'qx', True),\n",
+       " ('finalist', 'a', 'qy', True),\n",
+       " ('finalist', 'q', 'qy', True),\n",
+       " ('finalist', 'a', 'qz', True),\n",
+       " ('finalist', 'q', 'qz', True),\n",
+       " ('finalist', 'a', 'rs', True),\n",
+       " ('finalist', 'r', 'rs', True),\n",
+       " ('finalist', 'a', 'rt', True),\n",
+       " ('finalist', 'r', 'rt', True),\n",
+       " ('finalist', 'a', 'ru', True),\n",
+       " ('finalist', 'r', 'ru', True),\n",
+       " ('finalist', 'a', 'rv', True),\n",
+       " ('finalist', 'r', 'rv', True),\n",
+       " ('finalist', 'a', 'rw', True),\n",
+       " ('finalist', 'r', 'rw', True),\n",
+       " ('finalist', 'a', 'rx', True),\n",
+       " ('finalist', 'r', 'rx', True),\n",
+       " ('finalist', 'a', 'ry', True),\n",
+       " ('finalist', 'r', 'ry', True),\n",
+       " ('finalist', 'a', 'rz', True),\n",
+       " ('finalist', 'r', 'rz', True),\n",
+       " ('finalist', 'a', 'st', True),\n",
+       " ('finalist', 's', 'st', True),\n",
+       " ('finalist', 'a', 'su', True),\n",
+       " ('finalist', 's', 'su', True),\n",
+       " ('finalist', 'a', 'sv', True),\n",
+       " ('finalist', 's', 'sv', True),\n",
+       " ('finalist', 'a', 'sw', True),\n",
+       " ('finalist', 's', 'sw', True),\n",
+       " ('finalist', 'a', 'sx', True),\n",
+       " ('finalist', 's', 'sx', True),\n",
+       " ('finalist', 'a', 'sy', True),\n",
+       " ('finalist', 's', 'sy', True),\n",
+       " ('finalist', 'a', 'sz', True),\n",
+       " ('finalist', 's', 'sz', True),\n",
+       " ('finalist', 'a', 'tu', True),\n",
+       " ('finalist', 't', 'tu', True),\n",
+       " ('finalist', 'a', 'tv', True),\n",
+       " ('finalist', 't', 'tv', True),\n",
+       " ('finalist', 'a', 'tw', True),\n",
+       " ('finalist', 't', 'tw', True),\n",
+       " ('finalist', 'a', 'tx', True),\n",
+       " ('finalist', 't', 'tx', True),\n",
+       " ('finalist', 'a', 'ty', True),\n",
+       " ('finalist', 't', 'ty', True),\n",
+       " ('finalist', 'a', 'tz', True),\n",
+       " ('finalist', 't', 'tz', True),\n",
+       " ('finalist', 'a', 'uv', True),\n",
+       " ('finalist', 'u', 'uv', True),\n",
+       " ('finalist', 'a', 'uw', True),\n",
+       " ('finalist', 'u', 'uw', True),\n",
+       " ('finalist', 'a', 'ux', True),\n",
+       " ('finalist', 'u', 'ux', True),\n",
+       " ('finalist', 'a', 'uy', True),\n",
+       " ('finalist', 'u', 'uy', True),\n",
+       " ('finalist', 'a', 'uz', True),\n",
+       " ('finalist', 'u', 'uz', True),\n",
+       " ('finalist', 'a', 'vw', True),\n",
+       " ('finalist', 'v', 'vw', True),\n",
+       " ('finalist', 'a', 'vx', True),\n",
+       " ('finalist', 'v', 'vx', True),\n",
+       " ('finalist', 'a', 'vy', True),\n",
+       " ('finalist', 'v', 'vy', True),\n",
+       " ('finalist', 'a', 'vz', True),\n",
+       " ('finalist', 'v', 'vz', True),\n",
+       " ('finalist', 'a', 'wx', True),\n",
+       " ('finalist', 'w', 'wx', True),\n",
+       " ('finalist', 'a', 'wy', True),\n",
+       " ('finalist', 'w', 'wy', True),\n",
+       " ('finalist', 'a', 'wz', True),\n",
+       " ('finalist', 'w', 'wz', True),\n",
+       " ('finalist', 'a', 'xy', True),\n",
+       " ('finalist', 'x', 'xy', True),\n",
+       " ('finalist', 'a', 'xz', True),\n",
+       " ('finalist', 'x', 'xz', True),\n",
+       " ('finalist', 'a', 'yz', True),\n",
+       " ('finalist', 'y', 'yz', True),\n",
+       " ('finality', 'z', 'az', True),\n",
+       " ('finality', 'a', 'no', True),\n",
+       " ('finality', 'n', 'no', True),\n",
+       " ('finality', 'a', 'nu', True),\n",
+       " ('finality', 'n', 'nu', True),\n",
+       " ('finality', 'a', 'nz', True),\n",
+       " ('finality', 'n', 'nz', True),\n",
+       " ('finality', 'a', 'op', True),\n",
+       " ('finality', 'o', 'op', True),\n",
+       " ('finality', 'a', 'oq', True),\n",
+       " ('finality', 'o', 'oq', True),\n",
+       " ('finality', 'a', 'or', True),\n",
+       " ('finality', 'o', 'or', True),\n",
+       " ('finality', 'a', 'os', True),\n",
+       " ('finality', 'o', 'os', True),\n",
+       " ('finality', 'a', 'ot', True),\n",
+       " ('finality', 'o', 'ot', True),\n",
+       " ('finality', 'a', 'ou', True),\n",
+       " ('finality', 'o', 'ou', True),\n",
+       " ('finality', 'a', 'ov', True),\n",
+       " ('finality', 'o', 'ov', True),\n",
+       " ('finality', 'a', 'ow', True),\n",
+       " ('finality', 'o', 'ow', True),\n",
+       " ('finality', 'a', 'ox', True),\n",
+       " ('finality', 'o', 'ox', True),\n",
+       " ('finality', 'a', 'oy', True),\n",
+       " ('finality', 'o', 'oy', True),\n",
+       " ('finality', 'a', 'oz', True),\n",
+       " ('finality', 'o', 'oz', True),\n",
+       " ('finality', 'a', 'pq', True),\n",
+       " ('finality', 'p', 'pq', True),\n",
+       " ('finality', 'a', 'pr', True),\n",
+       " ('finality', 'p', 'pr', True),\n",
+       " ('finality', 'a', 'ps', True),\n",
+       " ('finality', 'p', 'ps', True),\n",
+       " ('finality', 'a', 'pt', True),\n",
+       " ('finality', 'p', 'pt', True),\n",
+       " ('finality', 'a', 'pu', True),\n",
+       " ('finality', 'p', 'pu', True),\n",
+       " ('finality', 'a', 'pv', True),\n",
+       " ('finality', 'p', 'pv', True),\n",
+       " ('finality', 'a', 'pw', True),\n",
+       " ('finality', 'p', 'pw', True),\n",
+       " ('finality', 'a', 'px', True),\n",
+       " ('finality', 'p', 'px', True),\n",
+       " ('finality', 'a', 'py', True),\n",
+       " ('finality', 'p', 'py', True),\n",
+       " ('finality', 'a', 'pz', True),\n",
+       " ('finality', 'p', 'pz', True),\n",
+       " ('finality', 'a', 'qr', True),\n",
+       " ('finality', 'q', 'qr', True),\n",
+       " ('finality', 'a', 'qs', True),\n",
+       " ('finality', 'q', 'qs', True),\n",
+       " ('finality', 'a', 'qt', True),\n",
+       " ('finality', 'q', 'qt', True),\n",
+       " ('finality', 'a', 'qu', True),\n",
+       " ('finality', 'q', 'qu', True),\n",
+       " ('finality', 'a', 'qv', True),\n",
+       " ('finality', 'q', 'qv', True),\n",
+       " ('finality', 'a', 'qw', True),\n",
+       " ('finality', 'q', 'qw', True),\n",
+       " ('finality', 'a', 'qx', True),\n",
+       " ('finality', 'q', 'qx', True),\n",
+       " ('finality', 'a', 'qy', True),\n",
+       " ('finality', 'q', 'qy', True),\n",
+       " ('finality', 'a', 'qz', True),\n",
+       " ('finality', 'q', 'qz', True),\n",
+       " ('finality', 'a', 'rs', True),\n",
+       " ('finality', 'r', 'rs', True),\n",
+       " ('finality', 'a', 'rt', True),\n",
+       " ('finality', 'r', 'rt', True),\n",
+       " ('finality', 'a', 'ru', True),\n",
+       " ('finality', 'r', 'ru', True),\n",
+       " ('finality', 'a', 'rv', True),\n",
+       " ('finality', 'r', 'rv', True),\n",
+       " ('finality', 'a', 'rw', True),\n",
+       " ('finality', 'r', 'rw', True),\n",
+       " ('finality', 'a', 'rx', True),\n",
+       " ('finality', 'r', 'rx', True),\n",
+       " ('finality', 'a', 'ry', True),\n",
+       " ('finality', 'r', 'ry', True),\n",
+       " ('finality', 'a', 'rz', True),\n",
+       " ('finality', 'r', 'rz', True),\n",
+       " ('finality', 'a', 'st', True),\n",
+       " ('finality', 's', 'st', True),\n",
+       " ('finality', 'a', 'su', True),\n",
+       " ('finality', 's', 'su', True),\n",
+       " ('finality', 'a', 'sv', True),\n",
+       " ('finality', 's', 'sv', True),\n",
+       " ('finality', 'a', 'sw', True),\n",
+       " ('finality', 's', 'sw', True),\n",
+       " ('finality', 'a', 'sx', True),\n",
+       " ('finality', 's', 'sx', True),\n",
+       " ('finality', 'a', 'sy', True),\n",
+       " ('finality', 's', 'sy', True),\n",
+       " ('finality', 'a', 'sz', True),\n",
+       " ('finality', 's', 'sz', True),\n",
+       " ('finality', 'a', 'tu', True),\n",
+       " ('finality', 't', 'tu', True),\n",
+       " ('finality', 'a', 'tv', True),\n",
+       " ('finality', 't', 'tv', True),\n",
+       " ('finality', 'a', 'tw', True),\n",
+       " ('finality', 't', 'tw', True),\n",
+       " ('finality', 'a', 'tx', True),\n",
+       " ('finality', 't', 'tx', True),\n",
+       " ('finality', 'a', 'ty', True),\n",
+       " ('finality', 't', 'ty', True),\n",
+       " ('finality', 'a', 'tz', True),\n",
+       " ('finality', 't', 'tz', True),\n",
+       " ('finality', 'a', 'uv', True),\n",
+       " ('finality', 'u', 'uv', True),\n",
+       " ('finality', 'a', 'uw', True),\n",
+       " ('finality', 'u', 'uw', True),\n",
+       " ('finality', 'a', 'ux', True),\n",
+       " ('finality', 'u', 'ux', True),\n",
+       " ('finality', 'a', 'uy', True),\n",
+       " ('finality', 'u', 'uy', True),\n",
+       " ('finality', 'a', 'uz', True),\n",
+       " ('finality', 'u', 'uz', True),\n",
+       " ('finality', 'a', 'vw', True),\n",
+       " ('finality', 'v', 'vw', True),\n",
+       " ('finality', 'a', 'vx', True),\n",
+       " ('finality', 'v', 'vx', True),\n",
+       " ('finality', 'a', 'vy', True),\n",
+       " ('finality', 'v', 'vy', True),\n",
+       " ('finality', 'a', 'vz', True),\n",
+       " ('finality', 'v', 'vz', True),\n",
+       " ('finality', 'a', 'wx', True),\n",
+       " ('finality', 'w', 'wx', True),\n",
+       " ('finality', 'a', 'wy', True),\n",
+       " ('finality', 'w', 'wy', True),\n",
+       " ('finality', 'a', 'wz', True),\n",
+       " ('finality', 'w', 'wz', True),\n",
+       " ('finality', 'a', 'xy', True),\n",
+       " ('finality', 'x', 'xy', True),\n",
+       " ('finality', 'a', 'xz', True),\n",
+       " ('finality', 'x', 'xz', True),\n",
+       " ('finality', 'a', 'yz', True),\n",
+       " ('finality', 'y', 'yz', True),\n",
+       " ('foulness', 'x', 'ov', True),\n",
+       " ('finalists', 'z', 'az', True),\n",
+       " ('finalists', 'a', 'no', True),\n",
+       " ('finalists', 'n', 'no', True),\n",
+       " ('finalists', 'a', 'nu', True),\n",
+       " ('finalists', 'n', 'nu', True),\n",
+       " ('finalists', 'a', 'nz', True),\n",
+       " ('finalists', 'n', 'nz', True),\n",
+       " ('finalists', 'a', 'op', True),\n",
+       " ('finalists', 'o', 'op', True),\n",
+       " ('finalists', 'a', 'oq', True),\n",
+       " ('finalists', 'o', 'oq', True),\n",
+       " ('finalists', 'a', 'or', True),\n",
+       " ('finalists', 'o', 'or', True),\n",
+       " ('finalists', 'a', 'os', True),\n",
+       " ('finalists', 'o', 'os', True),\n",
+       " ('finalists', 'a', 'ot', True),\n",
+       " ('finalists', 'o', 'ot', True),\n",
+       " ('finalists', 'a', 'ou', True),\n",
+       " ('finalists', 'o', 'ou', True),\n",
+       " ('finalists', 'a', 'ov', True),\n",
+       " ('finalists', 'o', 'ov', True),\n",
+       " ('finalists', 'a', 'ow', True),\n",
+       " ('finalists', 'o', 'ow', True),\n",
+       " ('finalists', 'a', 'ox', True),\n",
+       " ('finalists', 'o', 'ox', True),\n",
+       " ('finalists', 'a', 'oy', True),\n",
+       " ('finalists', 'o', 'oy', True),\n",
+       " ('finalists', 'a', 'oz', True),\n",
+       " ('finalists', 'o', 'oz', True),\n",
+       " ('finalists', 'a', 'pq', True),\n",
+       " ('finalists', 'p', 'pq', True),\n",
+       " ('finalists', 'a', 'pr', True),\n",
+       " ('finalists', 'p', 'pr', True),\n",
+       " ('finalists', 'a', 'ps', True),\n",
+       " ('finalists', 'p', 'ps', True),\n",
+       " ('finalists', 'a', 'pt', True),\n",
+       " ('finalists', 'p', 'pt', True),\n",
+       " ('finalists', 'a', 'pu', True),\n",
+       " ('finalists', 'p', 'pu', True),\n",
+       " ('finalists', 'a', 'pv', True),\n",
+       " ('finalists', 'p', 'pv', True),\n",
+       " ('finalists', 'a', 'pw', True),\n",
+       " ('finalists', 'p', 'pw', True),\n",
+       " ('finalists', 'a', 'px', True),\n",
+       " ('finalists', 'p', 'px', True),\n",
+       " ('finalists', 'a', 'py', True),\n",
+       " ('finalists', 'p', 'py', True),\n",
+       " ('finalists', 'a', 'pz', True),\n",
+       " ('finalists', 'p', 'pz', True),\n",
+       " ('finalists', 'a', 'qr', True),\n",
+       " ('finalists', 'q', 'qr', True),\n",
+       " ('finalists', 'a', 'qs', True),\n",
+       " ('finalists', 'q', 'qs', True),\n",
+       " ('finalists', 'a', 'qt', True),\n",
+       " ('finalists', 'q', 'qt', True),\n",
+       " ('finalists', 'a', 'qu', True),\n",
+       " ('finalists', 'q', 'qu', True),\n",
+       " ('finalists', 'a', 'qv', True),\n",
+       " ('finalists', 'q', 'qv', True),\n",
+       " ('finalists', 'a', 'qw', True),\n",
+       " ('finalists', 'q', 'qw', True),\n",
+       " ('finalists', 'a', 'qx', True),\n",
+       " ('finalists', 'q', 'qx', True),\n",
+       " ('finalists', 'a', 'qy', True),\n",
+       " ('finalists', 'q', 'qy', True),\n",
+       " ('finalists', 'a', 'qz', True),\n",
+       " ('finalists', 'q', 'qz', True),\n",
+       " ('finalists', 'a', 'rs', True),\n",
+       " ('finalists', 'r', 'rs', True),\n",
+       " ('finalists', 'a', 'rt', True),\n",
+       " ('finalists', 'r', 'rt', True),\n",
+       " ('finalists', 'a', 'ru', True),\n",
+       " ('finalists', 'r', 'ru', True),\n",
+       " ('finalists', 'a', 'rv', True),\n",
+       " ('finalists', 'r', 'rv', True),\n",
+       " ('finalists', 'a', 'rw', True),\n",
+       " ('finalists', 'r', 'rw', True),\n",
+       " ('finalists', 'a', 'rx', True),\n",
+       " ('finalists', 'r', 'rx', True),\n",
+       " ('finalists', 'a', 'ry', True),\n",
+       " ('finalists', 'r', 'ry', True),\n",
+       " ('finalists', 'a', 'rz', True),\n",
+       " ('finalists', 'r', 'rz', True),\n",
+       " ('finalists', 'a', 'st', True),\n",
+       " ('finalists', 's', 'st', True),\n",
+       " ('finalists', 'a', 'su', True),\n",
+       " ('finalists', 's', 'su', True),\n",
+       " ('finalists', 'a', 'sv', True),\n",
+       " ('finalists', 's', 'sv', True),\n",
+       " ('finalists', 'a', 'sw', True),\n",
+       " ('finalists', 's', 'sw', True),\n",
+       " ('finalists', 'a', 'sx', True),\n",
+       " ('finalists', 's', 'sx', True),\n",
+       " ('finalists', 'a', 'sy', True),\n",
+       " ('finalists', 's', 'sy', True),\n",
+       " ('finalists', 'a', 'sz', True),\n",
+       " ('finalists', 's', 'sz', True),\n",
+       " ('finalists', 'a', 'tu', True),\n",
+       " ('finalists', 't', 'tu', True),\n",
+       " ('finalists', 'a', 'tv', True),\n",
+       " ('finalists', 't', 'tv', True),\n",
+       " ('finalists', 'a', 'tw', True),\n",
+       " ('finalists', 't', 'tw', True),\n",
+       " ('finalists', 'a', 'tx', True),\n",
+       " ('finalists', 't', 'tx', True),\n",
+       " ('finalists', 'a', 'ty', True),\n",
+       " ('finalists', 't', 'ty', True),\n",
+       " ('finalists', 'a', 'tz', True),\n",
+       " ('finalists', 't', 'tz', True),\n",
+       " ('finalists', 'a', 'uv', True),\n",
+       " ('finalists', 'u', 'uv', True),\n",
+       " ('finalists', 'a', 'uw', True),\n",
+       " ('finalists', 'u', 'uw', True),\n",
+       " ('finalists', 'a', 'ux', True),\n",
+       " ('finalists', 'u', 'ux', True),\n",
+       " ('finalists', 'a', 'uy', True),\n",
+       " ('finalists', 'u', 'uy', True),\n",
+       " ('finalists', 'a', 'uz', True),\n",
+       " ('finalists', 'u', 'uz', True),\n",
+       " ('finalists', 'a', 'vw', True),\n",
+       " ('finalists', 'v', 'vw', True),\n",
+       " ('finalists', 'a', 'vx', True),\n",
+       " ('finalists', 'v', 'vx', True),\n",
+       " ('finalists', 'a', 'vy', True),\n",
+       " ('finalists', 'v', 'vy', True),\n",
+       " ('finalists', 'a', 'vz', True),\n",
+       " ('finalists', 'v', 'vz', True),\n",
+       " ('finalists', 'a', 'wx', True),\n",
+       " ('finalists', 'w', 'wx', True),\n",
+       " ('finalists', 'a', 'wy', True),\n",
+       " ('finalists', 'w', 'wy', True),\n",
+       " ('finalists', 'a', 'wz', True),\n",
+       " ('finalists', 'w', 'wz', True),\n",
+       " ('finalists', 'a', 'xy', True),\n",
+       " ('finalists', 'x', 'xy', True),\n",
+       " ('finalists', 'a', 'xz', True),\n",
+       " ('finalists', 'x', 'xz', True),\n",
+       " ('finalists', 'a', 'yz', True),\n",
+       " ('finalists', 'y', 'yz', True),\n",
+       " ('foulnesss', 'x', 'ov', True)]"
+      ]
+     },
+     "execution_count": 50,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[(w, s, d1+d2, r)\n",
+    " for w in hinted_keywords \n",
+    " for d1 in string.ascii_lowercase[:25]\n",
+    " for d2 in string.ascii_lowercase\n",
+    " for s in string.ascii_lowercase \n",
+    " for r in [True, False]\n",
+    " if d2 > d1\n",
+    " if cadenus_decipher(first_chunk, w, \n",
+    "                     make_cadenus_keycolumn(doubled_letters=d1+d2, start=s, reverse=r)).startswith('finalreport')]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 55,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[]"
+      ]
+     },
+     "execution_count": 55,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[(w, s, d1+d2, r, cadenus_decipher(first_chunk, w, \n",
+    "                                   make_cadenus_keycolumn(doubled_letters=d1+d2, start=s, reverse=r))[:50])\n",
+    " for w in hinted_keywords \n",
+    " for d1 in string.ascii_lowercase[:25]\n",
+    " for d2 in string.ascii_lowercase\n",
+    " for s in string.ascii_lowercase \n",
+    " for r in [True, False]\n",
+    " if d2 > d1\n",
+    " if cadenus_decipher(first_chunk, w, \n",
+    "                     make_cadenus_keycolumn(doubled_letters=d1+d2, start=s, reverse=r)).startswith('finalreport')]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 52,
+   "metadata": {
+    "collapsed": false,
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[('finalist', 'a', 'no', True),\n",
+       " ('finalist', 'n', 'no', True),\n",
+       " ('finalist', 'a', 'op', True),\n",
+       " ('finalist', 'o', 'op', True),\n",
+       " ('finalist', 'a', 'pq', True),\n",
+       " ('finalist', 'p', 'pq', True),\n",
+       " ('finalist', 'a', 'qr', True),\n",
+       " ('finalist', 'q', 'qr', True),\n",
+       " ('finalist', 'a', 'rs', True),\n",
+       " ('finalist', 'r', 'rs', True),\n",
+       " ('finalist', 'a', 'st', True),\n",
+       " ('finalist', 's', 'st', True),\n",
+       " ('finalist', 'a', 'tu', True),\n",
+       " ('finalist', 't', 'tu', True),\n",
+       " ('finalist', 'a', 'uv', True),\n",
+       " ('finalist', 'u', 'uv', True),\n",
+       " ('finalist', 'a', 'vw', True),\n",
+       " ('finalist', 'v', 'vw', True),\n",
+       " ('finalist', 'a', 'wx', True),\n",
+       " ('finalist', 'w', 'wx', True),\n",
+       " ('finalist', 'a', 'xy', True),\n",
+       " ('finalist', 'x', 'xy', True),\n",
+       " ('finalist', 'a', 'yz', True),\n",
+       " ('finalist', 'y', 'yz', True),\n",
+       " ('finality', 'a', 'no', True),\n",
+       " ('finality', 'n', 'no', True),\n",
+       " ('finality', 'a', 'op', True),\n",
+       " ('finality', 'o', 'op', True),\n",
+       " ('finality', 'a', 'pq', True),\n",
+       " ('finality', 'p', 'pq', True),\n",
+       " ('finality', 'a', 'qr', True),\n",
+       " ('finality', 'q', 'qr', True),\n",
+       " ('finality', 'a', 'rs', True),\n",
+       " ('finality', 'r', 'rs', True),\n",
+       " ('finality', 'a', 'st', True),\n",
+       " ('finality', 's', 'st', True),\n",
+       " ('finality', 'a', 'tu', True),\n",
+       " ('finality', 't', 'tu', True),\n",
+       " ('finality', 'a', 'uv', True),\n",
+       " ('finality', 'u', 'uv', True),\n",
+       " ('finality', 'a', 'vw', True),\n",
+       " ('finality', 'v', 'vw', True),\n",
+       " ('finality', 'a', 'wx', True),\n",
+       " ('finality', 'w', 'wx', True),\n",
+       " ('finality', 'a', 'xy', True),\n",
+       " ('finality', 'x', 'xy', True),\n",
+       " ('finality', 'a', 'yz', True),\n",
+       " ('finality', 'y', 'yz', True),\n",
+       " ('finalists', 'a', 'no', True),\n",
+       " ('finalists', 'n', 'no', True),\n",
+       " ('finalists', 'a', 'op', True),\n",
+       " ('finalists', 'o', 'op', True),\n",
+       " ('finalists', 'a', 'pq', True),\n",
+       " ('finalists', 'p', 'pq', True),\n",
+       " ('finalists', 'a', 'qr', True),\n",
+       " ('finalists', 'q', 'qr', True),\n",
+       " ('finalists', 'a', 'rs', True),\n",
+       " ('finalists', 'r', 'rs', True),\n",
+       " ('finalists', 'a', 'st', True),\n",
+       " ('finalists', 's', 'st', True),\n",
+       " ('finalists', 'a', 'tu', True),\n",
+       " ('finalists', 't', 'tu', True),\n",
+       " ('finalists', 'a', 'uv', True),\n",
+       " ('finalists', 'u', 'uv', True),\n",
+       " ('finalists', 'a', 'vw', True),\n",
+       " ('finalists', 'v', 'vw', True),\n",
+       " ('finalists', 'a', 'wx', True),\n",
+       " ('finalists', 'w', 'wx', True),\n",
+       " ('finalists', 'a', 'xy', True),\n",
+       " ('finalists', 'x', 'xy', True),\n",
+       " ('finalists', 'a', 'yz', True),\n",
+       " ('finalists', 'y', 'yz', True)]"
+      ]
+     },
+     "execution_count": 52,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[(w, s, d1+chr(ord(d1)+1), r)\n",
+    " for w in hinted_keywords \n",
+    " for d1 in string.ascii_lowercase[:25]\n",
+    " # for d2 in string.ascii_lowercase\n",
+    " for s in string.ascii_lowercase \n",
+    " for r in [True, False]\n",
+    " # if d2 > d1\n",
+    " if cadenus_decipher(first_chunk, w, make_cadenus_keycolumn(doubled_letters=d1+chr(ord(d1)+1), start=s, reverse=r)).startswith('final')]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 53,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'phasennrkmffnhignsdaaojsrcisrncheentoeetueweisvhsounsucoaleyrhreitdioseotototdhsoagreeysifaglenhtlhonriuelseairscnrteameteiwnntneefefcrartataieposrlandrlvtartalvhctofnorehdpro'"
+      ]
+     },
+     "execution_count": 53,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "cadenus_decipher(first_chunk, 'filbert', make_cadenus_keycolumn(doubled_letters='lu', start='m', reverse=False))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 54,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['afcaeuottacthrioletcserthshtrahkyorpfrgeoadppjnglternefeofiortsddoeeumscruernfetlaafstwientrvoonerhuahravereetsvsielhlostdoaloyaesmnndignnrhohhtsnaoilncnssicreanneeiiierwtanes']"
+      ]
+     },
+     "execution_count": 54,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "chunks(first_chunk, 175)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2015-challenge1.ipynb b/2015-challenge1.ipynb
deleted file mode 100644 (file)
index f565f7b..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": [
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from cipherbreak import *\n",
-    "\n",
-    "c1a = open('2015/1a.ciphertext').read()\n",
-    "c1b = open('2015/1b.ciphertext').read()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(12, -883.4816832492597)"
-      ]
-     },
-     "execution_count": 2,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "key_a, score = caesar_break(c1a)\n",
-    "key_a, score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 7,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "HARRY, SORRY TO DRAG YOU BACK IN , WE WERE HOPING TO GIVE YOU SOME TIME OFF AFTER THE LAST CASE, BUT SOMETHING CAME UP AND WE NEED YOUR HELP. \n",
-      "\n",
-      "AT A MEETING OF THE FOUR POWERS ALLIED CONTROL COUNCIL TWO WEEKS AGO THE FRENCH ACCUSED THE RUSSIANS OF SHELTERING A NAZI MEDIC KNOWN AS THE REICHSDOKTOR. APPARENTLY THEY INTERCEPTED A MORSE CODE RADIO BROADCAST FROM THE RUSSIAN SECTOR OF BERLIN IN WHICH THE DOCTOR WAS OFFERING INTELLIGENCE ABOUT THE RATLINES IN EXCHANGE FOR ASYLUM. THE RUSSIANS CLAIMED NOT TO KNOW ANYTHING ABOUT IT, AND MAYBE THEY ARE TELLING THE TRUTH, BUT THINGS HAVE BEEN A LITTLE FROSTY SINCE TRUMAN'S SPEECH ON MARCH TWELFTH AND WE REALLY DON'T NEED MORE CONFLICT RIGHT NOW. WE FIGURE WITH YOUR CONTACTS OVER HERE YOU MIGHT BE ABLE TO FIND OUT IF THE RUSSIANS ARE TELLING THE TRUTH. I HAVE ATTACHED THE ENCRYPTED TRANSCRIPT OF THE BROADCAST. \n",
-      "CHARLIE\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(caesar_decipher(c1a, key_a))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 8,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(14, -403.53308240183975)"
-      ]
-     },
-     "execution_count": 8,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "key_b, score = caesar_break(c1b)\n",
-    "key_b, score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 9,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "if you want to know the secret of the rat lines i maybe able to help but the price will be high and is not negotiable life herein berlin has lost its lustre and i want sanctuary in a more congenial climate with security for my future i can provide details of personnel policy security and routes and can furnish you with documentary evidence of the reach of the organization the reichs doktor\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(sanitise(caesar_decipher(c1b, key_b)))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": []
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.4.3"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/2015-challenge2.ipynb b/2015-challenge2.ipynb
deleted file mode 100644 (file)
index 8a55515..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": [
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from cipherbreak import *\n",
-    "\n",
-    "c2a = open('2015/2a.ciphertext').read()\n",
-    "c2b = open('2015/2b.ciphertext').read()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(15, -1150.5844346071483)"
-      ]
-     },
-     "execution_count": 2,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "key_a, score = caesar_break(c2a)\n",
-    "key_a, score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CHARLIE, NO NEED TO APOLOGISE, LIFE WAS GETTING DULL BEHIND A DESK AND I WAS GLAD TO HAVE AN EXCUSE TO FLY BACK TO EUROPE. I AM INTRIGUED ABOUT THE REICHSDOKTOR - I HADN'T COME ACROSS THIS BEFORE, WHEN DID YOU FIRST COME HEAR OF IT? \n",
-      "I THINK I MAY ALREADY BE MAKING SOME PROGRESS. ON ARRIVAL I FOUND A POSTCARD WAITING FOR ME ON THE MAT AT THE EMBASSY WITH NO MESSAGE ON IT . AT LEAST THAT'S WHAT IT LOOKED LIKE AT FIRST. I DID NOTICE THAT THE LETTERS ON THE FRONT COULD BE HIGHLIGHTED TO PICK OUT THE PHRASE THE REICHSDOKTOR SO UNLESS THAT IS AN EXTRAORDINARY COINCIDENCE I FIGURED IT MUST BE RELATED TO OUR INVESTIGATION. THE STRANGEST THING WAS THAT THE POSTCARD HAD A STAMP BUT NO POSTMARK ON IT, SO IT CAN'T HAVE BEEN POSTED. SINCE IT WASN'T SIGNED I ASSUME THEY WANTED TO STAY ANONYMOUS AND I COULDN'T SEE WHY THEY WOULD HAVE TAKEN THE RISK OF HAND DELIVERING IT, BUT IN THE END I WORKED IT OUT. THERE WAS A HIDDEN MESSAGE. I'LL LEAVE IT TO YOU TO FIGURE OUT WHERE IT WAS HIDDEN. ANYWAY I'VE ATTACHED THE MESSAGE I FOUND. I KNOW THAT RELATIONS WITH THREE OF THE FOUR POWERS ARE RELATIVELY STABLE, BUT I THINK WE NEED TO KEEP THIS TO OURSELVES FOR NOW. ALL THE BEST, \n",
-      "HARRY\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(caesar_decipher(c2a, key_a))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(21, -574.2402792119872)"
-      ]
-     },
-     "execution_count": 4,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "key_b, score = caesar_break(c2b)\n",
-    "key_b, score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "if you really want to get in the middle of this you will have to pay i know you will be hunting me and i can forgive the arrogance but i will not forgive your ignorance before you can learn more about the rat lines from me you will have to ask your colleagues in french and british intelligence what they already know powerful forces are working to keep the rat lines running and we both need to know who our enemies are before we can meet you should understand that without me your investigations will gain little negotiations with me may gain everything\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(sanitise(caesar_decipher(c2b, key_b)))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": []
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.4.3"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/2015-challenge3.ipynb b/2015-challenge3.ipynb
deleted file mode 100644 (file)
index 2b81441..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": [
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from cipherbreak import *\n",
-    "\n",
-    "c3a = open('2015/3a.ciphertext').read()\n",
-    "c3b = open('2015/3b.ciphertext').read()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 6,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "((3, 5, True), -901.37737042341)"
-      ]
-     },
-     "execution_count": 6,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "(key_a_m, key_a_a, key_a_o), score = affine_break(c3a)\n",
-    "(key_a_m, key_a_a, key_a_o), score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 7,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "HARRY, THE PUZZLE OF THE STAMPED POSTCARD HAD ME FOOLED FOR A WHILE, BUT I THINK I FIGURED IT OUT. WAS THE MESSAGE ON THE BACK OF THE STAMP? I AM GUESSING YOU STEAMED IT OFF AND FOUND IT THERE. IT WAS A PRETTY INGENIOUS PLOY. MY MASTERS BACK IN WASHINGTON ARE INCREASINGLY WORRIED ABOUT OUR RELATIONSHIP WITH THE REST OF THE FOUR POWERS. FOLLOWING THE BREAKDOWN IN TRUST WITH THE SOVIETS THEY ARE COUNTING ON THE UK AND FRANCE AS ALLIES. IF THEY ARE GOING BEHIND OUR BACKS WITH THIS REICHSDOKTOR, THAT DOES NOT BODE WELL FOR FUTURE DIPLOMACY. DO YOU HAVE CONTACTS THERE YOU CAN EXPLOIT TO FIND OUT WHAT THEY ARE INTENDING? WE REALLY CANNOT AFFORD TO FALL OUT RIGHT NOW. THE ATTACHED MESSAGE IS ANOTHER INTERCEPT, THIS TIME FROM THE BRITISH EMBASSY WIRELESS. WHILE THINGS ARE DICEY I DON’T FEEL I CAN ASK THEM ABOUT IT, MAYBE YOU COULD CRACK IT FOR US. DOES IT MENTION THE RATLINES? BEST, CHARLIE\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(affine_decipher(c3a, multiplier=key_a_m, adder=key_a_a, one_based=key_a_o))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 10,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "((5, 7, True), -574.5522852453349)"
-      ]
-     },
-     "execution_count": 10,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "(key_b_m, key_b_a, key_b_o), score = affine_break(c3b)\n",
-    "(key_b_m, key_b_a, key_b_o), score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 12,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "eyes only rumours of a source in berlin with access to the rat lines source seems to go by name of reichs doktor russian intercepts suggest has been seen in vicinity of us embassy not clear how to make direct contact also not clear why our us friends are keeping this to themselves detailed info about rat i lines hard to obtain but high value could lead to arrest of major targets of nuremberg investigations vital we reach reichs doktor at earliest opportunity discreet enquiries in french and us sectors only request funds for further investigation\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(sanitise(affine_decipher(c3b, multiplier=key_b_m, adder=key_b_a, one_based=key_b_o)))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": []
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.4.3"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/2015-challenge4.ipynb b/2015-challenge4.ipynb
deleted file mode 100644 (file)
index ec3147a..0000000
+++ /dev/null
@@ -1,260 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": [
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from cipherbreak import *\n",
-    "\n",
-    "c4a = open('2015/4a.ciphertext').read()\n",
-    "c4b = open('2015/4b.ciphertext').read()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(('reanimates', <KeywordWrapAlphabet.from_last: 2>), -911.6411317751041)"
-      ]
-     },
-     "execution_count": 2,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "(key_a_word, key_a_wrap), score = keyword_break_mp(c4a)\n",
-    "(key_a_word, key_a_wrap), score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 8,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "gharlie, the attaghew note fas ledt in one od my weaw wrops last nibht anw appears to ce drom our mysterious sourge. it gontains tfo really sibnidigant pieges od intellibenge. the dirst is that the rieghswoktor mibht not reder to an inwiviwual adter all. it seems to ce the gowename dor the orbanization runninb the ratlines. aggorwinb to my other sourges this is a gollegtion od routes, abents anw sade houses usew to transport nazi sympathisers anw far griminals out od bermany anw on to south ameriga. fe have knofn that sugh an orbanisation exists singe the enw od the far, cut this is the dirst time i have seen it namew. the other piege od indormation is mugh more suctle. i am cebinninb to fonwer id our sourge is gloser to home than fe haw realisew. anw i am not rederrinb to drangois! see id you gan spot the tfo thinbs i notigew. cy the fay, fho transgricew the rawio intergept you sent me last feek? harry\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(keyword_decipher(c4a, key_a_word, wrap_alphabet=key_a_wrap))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "{'a': 'c',\n",
-       " 'b': 'o',\n",
-       " 'c': 'p',\n",
-       " 'd': 'q',\n",
-       " 'e': 'b',\n",
-       " 'f': 'r',\n",
-       " 'g': 's',\n",
-       " 'h': 't',\n",
-       " 'i': 'e',\n",
-       " 'j': 'u',\n",
-       " 'k': 'v',\n",
-       " 'l': 'w',\n",
-       " 'm': 'f',\n",
-       " 'n': 'd',\n",
-       " 'o': 'x',\n",
-       " 'p': 'y',\n",
-       " 'q': 'z',\n",
-       " 'r': 'a',\n",
-       " 's': 'h',\n",
-       " 't': 'g',\n",
-       " 'u': 'i',\n",
-       " 'v': 'j',\n",
-       " 'w': 'k',\n",
-       " 'x': 'l',\n",
-       " 'y': 'm',\n",
-       " 'z': 'n'}"
-      ]
-     },
-     "execution_count": 3,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "trans = ''.maketrans(keyword_cipher_alphabet_of(key_a_word, wrap_alphabet=key_a_wrap), string.ascii_lowercase)\n",
-    "t2 = {chr(c): chr(trans[c]) for c in trans}\n",
-    "t2"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "[('r', 'a'),\n",
-       " ('a', 'b'),\n",
-       " ('t', 'c'),\n",
-       " ('l', 'd'),\n",
-       " ('i', 'e'),\n",
-       " ('n', 'f'),\n",
-       " ('e', 'g'),\n",
-       " ('s', 'h'),\n",
-       " ('u', 'i'),\n",
-       " ('v', 'j'),\n",
-       " ('w', 'k'),\n",
-       " ('x', 'l'),\n",
-       " ('y', 'm'),\n",
-       " ('z', 'n'),\n",
-       " ('b', 'o'),\n",
-       " ('c', 'p'),\n",
-       " ('d', 'q'),\n",
-       " ('f', 'r'),\n",
-       " ('g', 's'),\n",
-       " ('h', 't'),\n",
-       " ('j', 'u'),\n",
-       " ('k', 'v'),\n",
-       " ('m', 'w'),\n",
-       " ('o', 'x'),\n",
-       " ('p', 'y'),\n",
-       " ('q', 'z')]"
-      ]
-     },
-     "execution_count": 4,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "t2['t'] = 'c'\n",
-    "t2['a'] = 'b'\n",
-    "t2['e'] = 'g'\n",
-    "\n",
-    "t2['l'] = 'd'\n",
-    "t2['n'] = 'f'\n",
-    "t2['m'] = 'w'\n",
-    "\n",
-    "sorted(((c, t2[c]) for c in t2), key=lambda p: p[1])"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "charlie, the attached note was left in one of my dead drops last night and appears to be from our mysterious source. it contains two really significant pieces of intelligence. the first is that the riechsdoktor might not refer to an individual after all. it seems to be the codename for the organization running the ratlines. according to my other sources this is a collection of routes, agents and safe houses used to transport nazi sympathisers and war criminals out of germany and on to south america. we have known that such an organisation exists since the end of the war, but this is the first time i have seen it named. the other piece of information is much more subtle. i am beginning to wonder if our source is closer to home than we had realised. and i am not referring to francois! see if you can spot the two things i noticed. by the way, who transcribed the radio intercept you sent me last week? harry\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(keyword_decipher(c4a, 'ratlines', wrap_alphabet=key_a_wrap))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 6,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(('francois', <KeywordWrapAlphabet.from_last: 2>), -1082.7018217012803)"
-      ]
-     },
-     "execution_count": 6,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "(key_b_word, key_b_wrap), score =keyword_break_mp(c4b)\n",
-    "(key_b_word, key_b_wrap), score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 7,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "the french maybe your allies but they are not your friends they plan to infiltrate the rat i lines and to try to turn the high value targets for themselves they have a particular interest in nazi scientists from the die alchemist en project if you want to break the reichs doktor network before they can do so take care not to share any intelligence with them you have been warned i think it is time to begin negotiations i have a number in mind and i think once you know what i am offering you will find it very reasonable as a sign of good faith ioffer you the following information one of the local rat i line coordinators will be leaving the us sector tomorrow night in a black limousine under the backseat of his car you will find hidden a juniors s officer who is trying to escape and in the trunk you will find a number of papers relating to stolen artworks that he hopes to trade to the french for his freedom you might want to consider carefully whether you can trust your friend charlie with this information after all her husband francois is french\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(sanitise(keyword_decipher(c4b, key_b_word, wrap_alphabet=key_b_wrap)))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {
-    "collapsed": true
-   },
-   "outputs": [],
-   "source": []
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.4.3"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/2015-challenge5.ipynb b/2015-challenge5.ipynb
deleted file mode 100644 (file)
index 12ba698..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": [
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from cipherbreak import *\n",
-    "\n",
-    "c5a = open('2015/5a.ciphertext').read()\n",
-    "c5b = open('2015/5b.ciphertext').read()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(('cornfield', <KeywordWrapAlphabet.from_largest: 3>), -1557.5551917175146)"
-      ]
-     },
-     "execution_count": 4,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "(key_a_word, key_a_wrap), score = keyword_break_mp(c5a)\n",
-    "(key_a_word, key_a_wrap), score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "harry, i checked out who transcribed the radio transmission like you asked. it was a junior cipher clerk in room 5. i would have offered to set up a meeting with her, but she has disappeared and hasn’t been seen since last friday. the marines saw her leave at her usual time, and she was booked out for some leave on monday and tuesday so no one noticed she was missing until today. we sent an officer out to her usual haunts and i will get back to you if we find anything. what made you ask? did you have a reason to believe she was involved in something? \n",
-      "\n",
-      "i took another look at the messages. were you referring to the typos? the word ratlines keeps being spelt as ratilines. is that important? what did you mean about our source being close to home? \n",
-      "\n",
-      "also did some digging about the reichsdoktor. seems you were right and it refers to an underground nazi organisation dedicated to rebuilding the reich. maybe they think of it as healing? a bunch of rich nazi sympathisers took over the ratlines from a group of ss officers who set them up at the tail of the war and have been active in shipping scientists, engineers and soldiers to towns across south america. if our source has inside information then maybe we could intercept the lines and pick up some of the high value targets the french are after. what was “die alchemisten project”? \n",
-      "\n",
-      "the enclosed message was handed to the marines, but they didn’t get a name. initial analysis shows it must be a vigenere cipher with period two so it should be reasonably straightforward to crack. \n",
-      "\n",
-      "all the best, charlie \n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(keyword_decipher(c5a, key_a_word, wrap_alphabet=key_a_wrap))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 10,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "('de', -885.6842458313828)"
-      ]
-     },
-     "execution_count": 10,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "key_b, score = vigenere_frequency_break(c5b, max_key_length=2)\n",
-    "key_b, score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 21,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "the first item in our little auction will be the location of a safehouse in the uk sector of berlin it is a minor stopover on the rat lines but you never know you might get lucky and find someone interesting hiding there at the very least you will inconvenience the reichs doktor if you take possession of it how much would that be worth to you do i hear a bid of five hundred thousand francs from our french friends perhaps the british would pay more or maybe they can not afford to i wonder how they feel about that perhaps you should ask them if you want to outbid your so called friends then leave the money in unmarked treasury bills in locker at the far end of the platform in friedrichstrasse i will leave the details in locker you will find the key in do not try to double cross me it will not work and our little game will end before it has even properly begun\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(sanitise(vigenere_decipher(sanitise(c4b), key_b)))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {
-    "collapsed": true
-   },
-   "outputs": [],
-   "source": []
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.4.3"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/2015-challenge6.ipynb b/2015-challenge6.ipynb
deleted file mode 100644 (file)
index 09214d2..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": [
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from cipherbreak import *\n",
-    "\n",
-    "c6a = sanitise(open('2015/6a.ciphertext').read())\n",
-    "c6b = sanitise(open('2015/6b.ciphertext').read())"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(('hammering', <KeywordWrapAlphabet.from_largest: 3>), -2247.716859509375)"
-      ]
-     },
-     "execution_count": 2,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "(key_a_word, key_a_wrap), score = keyword_break_mp(c6a)\n",
-    "(key_a_word, key_a_wrap), score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "freslitiacehartaypoinseailinthareagevtiaeceyiaepptestwboarinartayptwmthhegthctpifktwupenwinartasenhfsipaodartsewiomthhegtpstaayunliktlyfoinfiwtnfthoidigustyousjuniosfiprtsfltskcehinvolvtwmigrabtcosarfrtfkingrtsbefkgsounwenwbenkeffounahareaihellimtenacrtniheiwarthousftcehflohtaoromtbuaarinkingebouaiaiemnoahustiamekthhtnhtaoarinkhrtceharthousftartmthhegthhaillkttpfomingenwiemguthhingareahrtrehgonthoartstmuhabthomtoartshousftdosousinatlligtnfthomtaringihboartsingmtebouaartaontodartmthhegthcrywothousenaegonihakttpaeunainguhebouaousellithiaihnoaliktartaringhctestbtingehktwaobiwdosestaringhctestliktlyaoriwtdsomontenoartsedatsellenyceyidolloctwontodousdstnfrfollteguthaodsitwsifrhasehhtenwceafrtwrtsasyaopifkupartktydsomlofktshttmhaorevtbttnefonifoulwnaflteslyhttcreacehgoingonbuahrtwiwnahttmaobtebltaooptnlofktsenwltdaobviouhlyuphtaedatshrtrewgontiaookelookealofktsiarehedelhtbefkhoiemguthhingartmontycehaektnbuanoaringpsoviwtwintxfrengtfoulwyouwigesounwciaryousfonaefahinartbsiaihrenwsuhhientmbehhithenwhttidartyestgtaaingarthemthosaodfommunifeaionhmeybtyoufoulwcesnartmbyartceywitelfrtmihatnpsojtfacehartfowtnemtdosartnezieaombombtddosairewesuninciarartmwusingartcescrtnctctstasyingaokttpartisrenwhoddartrtevyceatshupplystmtmbtsartbombinginvtmoskareacehuhosseartsousnoswifellithenyceyiaihhaillaophtfstahoartdefaouspsoaegonihaknochebouaiaihhignidifenaihuhptfaartktyaoarihcroltmyhatsylithinartisiwtnaiayidctkntccroartyctstcoskingdosctmigrabtebltaodigustouacreaartyestupaoontlehaaringefaingonerunfriaookelookeahomtodartdstnfrwtewwsophedatsartdsitwsifrhasehhtinfiwtnaenwdounwarteaaefrtwfommunifeaionirevtnarewaimtaofsefkiabuaiarinkiameybtevigtntstegeinbuairevtnarewefrenftaoasybebbegthasifkoniaytagivtiaaoyousblefkfrembtsenwhttcreaartyfenmektodiaellartbtharessy\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(keyword_decipher(c6a, key_a_word, wrap_alphabet=key_a_wrap))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 8,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'icrdvsfshmrghcfhpzysxdrhsvsxfghcrhnrkfshrmrpshrzzfrdflayhcsxhcfhpzflwfggrnfgmfzsiufljzrxlsxhcfhdrxgidszhyehcfdrlsywfggrnfzdfhhpjxvsufvpiysxislfxifgysesnjdfpyjdtjxsydiszcfdivfdumrgsxkyvkflwsnchafmydhcicfiusxncfdariundyjxlrxlarxuriiyjxhghcrhsgrvvswfrxhmcfxsgrslhcfgyjdifmrgivygfhycywfajhhcsxusxnrayjhshsrwxyhgjdfshwrufggfxgfhyhcsxugcfmrghcfgyjdifhcfwfggrnfgghsvvuffziywsxnrxlsrwnjfggsxnhcrhgcfcrgnyxfgyhcfdfwjghafgywfyhcfdgyjdifeydyjdsxhfvvsnfxifgywfhcsxnsgayhcfdsxnwfrayjhhcfhyxfyehcfwfggrnfgmcplyfgyjdrxhrnyxsghuffzhrjxhsxnjgrayjhyjdrvvsfgshsgxyhvsufhcfhcsxngmfrdfafsxnrguflhyasleydrdfhcsxngmfrdfvsufvphycslfedywyxfrxyhcfdrehfdrvvrxpmrpseyvvymflyxfyeyjdedfxiciyvvfrnjfghyedsfldsicghdrggfrxlmrhicflcfdhdphyzsiujzhcfufpedywvyiufdgffwghycrkfaffxriyxsiyjvlxhivfrdvpgffmcrhmrgnysxnyxajhgcflslxhgffwhyafravfhyyzfxvyiufdrxlvfehyaksyjgvpjzgfhrehfdgcfcrlnyxfshyyurvyyurhvyiufdshcrgrervgfariugysrwnjfggsxnhcfwyxfpmrghrufxajhxyhcsxnzdykslflsxfoicrxnfiyjvlpyjlsnrdyjxlmshcpyjdiyxhrihgsxhcfadshsgcrxldjggsrxfwarggsfgrxlgffsehcfprdfnfhhsxnhcfgrwfgydhyeiywwjxsirhsyxgwrpafpyjiyjvlmrdxhcfwaphcfmrplsfrvicfwsghfxzdytfihmrghcfiylfxrwfeydhcfxrqsrhywaywafeeydhscrlrdjxsxmshchcfwljdsxnhcfmrdmcfxmfmfdfhdpsxnhyuffzhcfsdcrxlgyeehcfcfrkpmrhfdgjzzvpdfwfwafdhcfaywasxnsxkfwyduhcrhmrgjgyddrhcfdyjdxydlsirvvsfgrxpmrpshsgghsvvhyzgfidfhgyhcferihyjdzdyhrnyxsghuxymgrayjhshsggsnxsesirxhsgjgzfihhcfufphyhcsgmcyvfwpghfdpvsfgsxhcfsdslfxhshpsemfuxfmmcyhcfpmfdfmydusxneydmfwsnchafravfhyesnjdfyjhmcrhhcfprdfjzhyyxfvrghhcsxnrihsxnyxrcjxicshyyurvyyurhgywfyehcfedfxiclfrlldyzgrehfdhcfedsfldsicghdrggfsxislfxhrxleyjxlhcfrhhricfliywwjxsirhsyxscrkfxhcrlhswfhyidriushajhshcsxushwrpafrksnfxfdfrnrsxajhscrkfxhcrlricrxifhyhdparaarnfghdsiuyxshpfhnskfshhypyjdavriuicrwafdrxlgffmcrhhcfpirxwrufyeshrvvhcfafghcrddp'"
-      ]
-     },
-     "execution_count": 8,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "c6a"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 24,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'CHARLIE IT WAS THE TYPO IN RAT I LINES THAT GAVE IT AWAY IT APPEARED BOTH IN THE TYPED MESSAGES WE PICKED UP AND IN THE TRANSCRIPT OF THE RADIO MESSAGE PRETTY UNLIKELY COINCIDENCE SO I FIGURE YOUR JUNIOR CIPHER CLERK WAS INVOLVED MIGHT BE WORTH CHECKING HER BACKGROUND AND BANK ACCOUNTS THAT IS ALL I MEANT WHEN I SAID THE SOURCE WAS CLOSE TO HOME BUT THINKING ABOUT IT I AM NOT SURE IT MAKES SENSE TO THINK SHE WAS THE SOURCE THE MESSAGES STILL KEEP COMING AND I AM GUESSING THAT SHE HAS GONE SO THERE MUST BE SOME OTHER SOURCE FOR OUR INTELLIGENCE SOMETHING IS BOTHERING ME ABOUT THE TONE OF THE MESSAGES WHY DOES OUR ANTAGONIST KEEP TAUNTING US ABOUT OUR ALLIES IT IS NOT LIKE THE THINGS WE ARE BEING ASKED TO BID FOR ARE THINGS WE ARE LIKELY TO HIDE FROM ONE ANOTHER AFTER ALL ANYWAY I FOLLOWED ONE OF OUR FRENCH COLLEAGUES TO FRIEDRICHSTRASSE AND WATCHED HER TRY TO PICKUP THE KEY FROM LOCKER SEEMS TO HAVE BEEN A CON I COULDNT CLEARLY SEE WHAT WAS GOING ON BUT SHE DIDNT SEEM TO BE ABLE TO OPEN LOCKER AND LEFT OBVIOUSLY UPSET AFTER SHE HAD GONE I TOOK A LOOK AT LOCKER IT HAS A FALSE BACK SO I AM GUESSING THE MONEY WAS TAKEN BUT NOTHING PROVIDED IN EXCHANGE COULD YOU DIG AROUND WITH YOUR CONTACTS IN THE BRITISH AND RUSSIAN EMBASSIES AND SEE IF THEY ARE GETTING THE SAME SORT OF COMMUNICATIONS MAYBE YOU COULD WARN THEM BY THE WAY DIE ALCHEMIST EN PROJECT WAS THE CODENAME FOR THE NAZI ATOM BOMB EFFORT I HAD A RUN IN WITH THEM DURING THE WAR WHEN WE WERE TRYING TO KEEP THEIR HANDS OFF THE HEAVY WATER SUPPLY REMEMBER THE BOMBING IN VE MORK THAT WAS US OR RATHER OUR NORDIC ALLIES ANYWAY IT IS STILL TOP SECRET SO THE FACT OUR PROTAGONIST KNOWS ABOUT IT IS SIGNIFICANT I SUSPECT THE KEY TO THIS WHOLE MYSTERY LIES IN THEIR IDENTITY IF WE KNEW WHO THEY WERE WORKING FOR WE MIGHT BE ABLE TO FIGURE OUT WHAT THEY ARE UP TO ONE LAST THING ACTING ON A HUNCH I TOOK A LOOK AT SOME OF THE FRENCH DEAD DROPS AFTER THE FRIEDRICHSTRASSE INCIDENT AND FOUND THE ATTACHED COMMUNICATION I HAVENT HAD TIME TO CRACK IT BUT I THINK IT MAYBE AVI GENERE AGAIN BUT I HAVENT HAD A CHANCE TO TRY BABBAGE STRICK ON IT YET GIVE IT TO YOUR BLACK CHAMBER AND SEE WHAT THEY CAN MAKE OF IT ALL THE BEST HARRY'"
-      ]
-     },
-     "execution_count": 24,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "translations = {'c': 'H', 'r': 'A', 'd': 'R', 'p': 'Y', 'i': 'C', 'd': 'R', 'v': 'L', 's': 'I', 'f': 'E', \n",
-    "                'h': 'T', 'a': 'B', 'g': 'S', 'm': 'W', 'y': 'O', 'z': 'P', 'n': 'G', 'j': 'U', 't': 'J',\n",
-    "               'x': 'N', 'k': 'V', 'l': 'D', 'w': 'M', 'u': 'K', 'e': 'F', 'q': 'Z', 'o': 'X'}\n",
-    "translation_table = ''.maketrans(translations)\n",
-    "plaintext = ' '.join(segment(c6a.translate(translation_table)))\n",
-    "plaintext"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 28,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'BHRFESTCUVDWGXYZAIJKLMNOP'"
-      ]
-     },
-     "execution_count": 28,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "''.join(translations[l] for l in sorted(translations))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 34,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'railfencstuvwxyzdghjkmopq'"
-      ]
-     },
-     "execution_count": 34,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "inverted_translations = {translations[a]: a for a in translations}\n",
-    "''.join(inverted_translations[l] for l in sorted(inverted_translations))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 37,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'railfencstuvwxyzbdghjkmopq'"
-      ]
-     },
-     "execution_count": 37,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "keyword_cipher_alphabet_of('railfences', wrap_alphabet=KeywordWrapAlphabet.from_last)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 39,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "charlie it was the typo in rat i lines that gave it away it appeared both in the typed messages we picked up and in the transcript of the radio message pretty unlikely coincidence so i figure your junior cipher clerk was involved might be worth checking her background and bank accounts that is all i meant when i said the source was close to home but thinking about it i am not sure it makes sense to think she was the source the messages still keep coming and i am guessing that she has gone so there must be some other source for our intelligence something is bothering me about the tone of the messages why does our antagonist keep taunting us about our allies it is not like the things we are being asked to bid for are things we are likely to hide from one another after all anyway i followed one of our french colleagues to friedrichstrasse and watched her try to pickup the key from locker seems to have been a con i couldnt clearly see what was going on but she didnt seem to be able to open locker and left obviously upset after she had gone i took a look at locker it has a false back so i am guessing the money was taken but nothing provided in exchange could you dig around with your contacts in the british and russian embassies and see if they are getting the same sort of communications maybe you could warn them by the way die alchemist en project was the codename for the nazi atom bomb effort i had a run in with them during the war when we were trying to keep their hands off the heavy water supply remember the bombing in ve mork that was us or rather our nordic allies anyway it is still top secret so the fact our protagonist knows about it is significant i suspect the key to this whole mystery lies in their identity if we knew who they were working for we might be able to figure out what they are up to one last thing acting on a hunch i took a look at some of the french dead drops after the friedrichstrasse incident and found the attached communication i havent had time to crack it but i think it maybe avi genere again but i havent had a chance to try babbage strick on it yet give it to your black chamber and see what they can make of it all the best harry\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(keyword_decipher(c6a, 'railfences', wrap_alphabet=KeywordWrapAlphabet.from_last))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 31,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "('kremlin', -908.5396262316657)"
-      ]
-     },
-     "execution_count": 31,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "key_b, score = vigenere_frequency_break(c6b)\n",
-    "key_b, score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 32,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "the americans have robbed you rather than trying to outbid you they got to the lockers first and arranged to steal your money and the valuable intelligence i provided for you they can not be trusted none of your allies can be trusted they believe that they can cheat you but they do not understand that you can only cheat in a game and this is not a game if you try to playa game of chess like your allies we will find ourselves in a stalemate you have been warned so let us start again i can let you have the address of another safehouse at a small discount on our original price and i will include the identity of a british double agent working in your embassy shall we say four hundred thousand francs to be paid directly to an account of my choosing if you want to know more about the treachery of your so called friends then let us meet in the park by the british embassy on friday at eleven\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(sanitise(vigenere_decipher(sanitise(c6b), key_b)))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {
-    "collapsed": true
-   },
-   "outputs": [],
-   "source": []
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.4.3"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/2015-challenge7.ipynb b/2015-challenge7.ipynb
deleted file mode 100644 (file)
index 23259d8..0000000
+++ /dev/null
@@ -1,1575 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 7,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": [
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from cipherbreak import *\n",
-    "\n",
-    "c7a = sanitise(open('2015/7a.ciphertext').read())\n",
-    "c7b = sanitise(open('2015/7b.ciphertext').read())"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 8,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(('annmarie', <KeywordWrapAlphabet.from_largest: 3>), -1865.8708508162845)"
-      ]
-     },
-     "execution_count": 8,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "(key_a_word, key_a_wrap), score = keyword_break_mp(c7a)\n",
-    "(key_a_word, key_a_wrap), score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 9,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "dhorlieithinkiknacchotisgainganfutineewtadhedkobecthingsfebareirepartcemoyhoveonappartunityhereidhedkewthedipherdlerksfodkgraunwonwitturnsautsheischiterussionherbomilylebtmasdacinfutshehosrelotivesinthegulogotpermshedleorlyhosnalavebarthesavietgavernmentsaiomstillnatsurechashecoscarkingbarfutithinkthisiskeyintelligendeinthemeontimeihovefeencotdhingthefritstheyseemtahovefeenindantodtcithaurbrienwsinthereidhswaktaronwtheyinturnhovefeencotdhingthebrendhitseemslikeceoreollcarkingogoinstaneonatherchidhireollywiwntexpedtonwgivenchotcereowinthebrendhwadumentlostceekiwantthinkthotisodaindiwendemyacnguessisthottherussionsknacchotisgainganonwthotaurfesthapeabundaveringitistafreokintatheirhqonwtrytabinwsamethingthereunbartunotelyoddarwingtamysaurdeyuritheyhovetokentausingonecdiphersalitoirebarordhivestarogeabtapsedretbilessaevenibcemonogetasteoltherelevontbileitcilltokeolatabdamputingtafreokthedipheriottodhofriebmessogebramyuriendryptewusingonomsdadipherkeycarwlengthissixinchidhhewesdrifesthedipheritisverydleversimpletaimplementfutoweviltadrodkonwmyanehapeisthotcedonolsabinwthedipherkeychileinthehqarotleostportabitiplontaenterintcaceeksanwedemfersixteenththerussionsorehastingolorgeprapogonwoeventosportabtheinternotianolefouousstellungcithleowingpalitfuramemfersinottenwondemastabthesedurityteomcillfeaddupiewciththotonwhqseduritycillferelotivelylightcithludkicillgetinonwautciththebilesceneewthotnightonwthencedongettathefattamabthechalereidhswaktarstrotogemollthefesthorry\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(keyword_decipher(c7a, key_a_word, wrap_alphabet=key_a_wrap))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 10,
-   "metadata": {
-    "collapsed": false,
-    "scrolled": true
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "{'A': 'a',\n",
-       " 'B': 'o',\n",
-       " 'C': 'p',\n",
-       " 'D': 'q',\n",
-       " 'E': 'f',\n",
-       " 'F': 'r',\n",
-       " 'G': 's',\n",
-       " 'H': 't',\n",
-       " 'I': 'e',\n",
-       " 'J': 'u',\n",
-       " 'K': 'v',\n",
-       " 'L': 'w',\n",
-       " 'M': 'c',\n",
-       " 'N': 'b',\n",
-       " 'O': 'x',\n",
-       " 'P': 'y',\n",
-       " 'Q': 'z',\n",
-       " 'R': 'd',\n",
-       " 'S': 'g',\n",
-       " 'T': 'h',\n",
-       " 'U': 'i',\n",
-       " 'V': 'j',\n",
-       " 'W': 'k',\n",
-       " 'X': 'l',\n",
-       " 'Y': 'm',\n",
-       " 'Z': 'n'}"
-      ]
-     },
-     "execution_count": 10,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "trans_a = {p.upper(): c for p, c in zip(keyword_cipher_alphabet_of(key_a_word, wrap_alphabet=key_a_wrap), string.ascii_lowercase, )}\n",
-    "trans_a"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 11,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'charlie i think i know what is going on but i need to check a few things before i report we may have an opportunity here i checked the cipher clerks background and it turns out she is white russian her family left moscow in but she has relatives in the gulag at perm she clearly has no love for the soviet government so i am still not sure who she was working for but i think this is key intelligence in the meantime i have been watching the brits they seem to have been in contact with our friends in the reichs doktor and they in turn have been watching the french it seems like we are all working against one another which i really didnt expect and given what we read in the french document last week i dont think that is a coincidence my own guess is that the russians know what is going on and that our best hope of uncovering it is to break into their hq and try to find something there unfortunately according to my source yuri they have taken to using a new cipher solitaire for archive storage of top secret files so even if we manage to steal the relevant file it will take alot of computing to break the cipher i attach a brief message from yuri encrypted using an amsco cipher keyword length is six in which he describes the cipher it is very clever simple to implement but a devil to crack and my one hope is that we can also find the cipher key while in the hq or atleast part of it i plan to enter in two weeks on december sixteenth the russians are hosting a large propaganda event as part of the international ebau ausstellung with leading politburo members in attendance most of the security team will be occupied with that and hq security will be relatively light with luck i will get in and out with the files we need that night and then we can get to the bottom of the whole reichs doktor stratagem all the best harry'"
-      ]
-     },
-     "execution_count": 11,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "translations = {\n",
-    " 'A': 'o',\n",
-    " 'B': 'a',\n",
-    " 'C': 'p',\n",
-    " 'D': 'q',\n",
-    " 'E': 'b',\n",
-    " 'F': 'r',\n",
-    " 'G': 's',\n",
-    " 'H': 't',\n",
-    " 'I': 'e',\n",
-    " 'J': 'u',\n",
-    " 'K': 'v',\n",
-    " 'L': 'd',\n",
-    " 'M': 'w',\n",
-    " 'N': 'f',\n",
-    " 'O': 'x',\n",
-    " 'P': 'y',\n",
-    " 'Q': 'z',\n",
-    " 'R': 'c',\n",
-    " 'S': 'g',\n",
-    " 'T': 'h',\n",
-    " 'U': 'i',\n",
-    " 'V': 'j',\n",
-    " 'W': 'k',\n",
-    " 'X': 'l',\n",
-    " 'Y': 'm',\n",
-    " 'Z': 'n'}\n",
-    "translation_table = ''.maketrans(translations)\n",
-    "plaintext = ' '.join(segment(c7a.upper().translate(translation_table)))\n",
-    "plaintext"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 12,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'oapqbrsteuvdwfxyzcghijklmn'"
-      ]
-     },
-     "execution_count": 12,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "''.join(translations[l] for l in sorted(translations))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 13,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'BERLINSTUVWXYZACDFGHJKMOPQ'"
-      ]
-     },
-     "execution_count": 13,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "inverted_translations = {translations[a]: a for a in translations}\n",
-    "''.join(inverted_translations[l] for l in sorted(inverted_translations))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 14,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'berlinstuvwxyzacdfghjkmopq'"
-      ]
-     },
-     "execution_count": 14,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "keyword_cipher_alphabet_of('berlin', wrap_alphabet=KeywordWrapAlphabet.from_largest)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 15,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "charlie i think i know what is going on but i need to check a few things before i report we may have an opportunity here i checked the cipher clerks background and it turns out she is white russian her family left moscow in but she has relatives in the gulag at perm she clearly has no love for the soviet government so i am still not sure who she was working for but i think this is key intelligence in the meantime i have been watching the brits they seem to have been in contact with our friends in the reichs doktor and they in turn have been watching the french it seems like we are all working against one another which i really didnt expect and given what we read in the french document last week i dont think that is a coincidence my own guess is that the russians know what is going on and that our best hope of uncovering it is to break into their hq and try to find something there unfortunately according to my source yuri they have taken to using a new cipher solitaire for archive storage of top secret files so even if we manage to steal the relevant file it will take alot of computing to break the cipher i attach a brief message from yuri encrypted using an amsco cipher keyword length is six in which he describes the cipher it is very clever simple to implement but a devil to crack and my one hope is that we can also find the cipher key while in the hq or atleast part of it i plan to enter in two weeks on december sixteenth the russians are hosting a large propaganda event as part of the international ebau ausstellung with leading politburo members in attendance most of the security team will be occupied with that and hq security will be relatively light with luck i will get in and out with the files we need that night and then we can get to the bottom of the whole reichs doktor stratagem all the best harry\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(keyword_decipher(c7a, 'berlin', wrap_alphabet=KeywordWrapAlphabet.from_largest))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 16,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "{(0, 1, 2, 3, 4, 5): (0, 1, 2, 3, 4, 5),\n",
-       " (0, 1, 2, 3, 5, 4): (0, 1, 2, 3, 5, 4),\n",
-       " (0, 1, 2, 4, 3, 5): (0, 1, 2, 4, 3, 5),\n",
-       " (0, 1, 2, 4, 5, 3): (0, 1, 2, 4, 5, 3),\n",
-       " (0, 1, 2, 5, 3, 4): (0, 1, 2, 5, 3, 4),\n",
-       " (0, 1, 2, 5, 4, 3): (0, 1, 2, 5, 4, 3),\n",
-       " (0, 1, 3, 2, 4, 5): (0, 1, 3, 2, 4, 5),\n",
-       " (0, 1, 3, 2, 5, 4): (0, 1, 3, 2, 5, 4),\n",
-       " (0, 1, 3, 4, 2, 5): (0, 1, 3, 4, 2, 5),\n",
-       " (0, 1, 3, 4, 5, 2): (0, 1, 3, 4, 5, 2),\n",
-       " (0, 1, 3, 5, 2, 4): (0, 1, 3, 5, 2, 4),\n",
-       " (0, 1, 3, 5, 4, 2): (0, 1, 3, 5, 4, 2),\n",
-       " (0, 1, 4, 2, 3, 5): (0, 1, 4, 2, 3, 5),\n",
-       " (0, 1, 4, 2, 5, 3): (0, 1, 4, 2, 5, 3),\n",
-       " (0, 1, 4, 3, 2, 5): (0, 1, 4, 3, 2, 5),\n",
-       " (0, 1, 4, 3, 5, 2): (0, 1, 4, 3, 5, 2),\n",
-       " (0, 1, 4, 5, 2, 3): (0, 1, 4, 5, 2, 3),\n",
-       " (0, 1, 4, 5, 3, 2): (0, 1, 4, 5, 3, 2),\n",
-       " (0, 1, 5, 2, 3, 4): (0, 1, 5, 2, 3, 4),\n",
-       " (0, 1, 5, 2, 4, 3): (0, 1, 5, 2, 4, 3),\n",
-       " (0, 1, 5, 3, 2, 4): (0, 1, 5, 3, 2, 4),\n",
-       " (0, 1, 5, 3, 4, 2): (0, 1, 5, 3, 4, 2),\n",
-       " (0, 1, 5, 4, 2, 3): (0, 1, 5, 4, 2, 3),\n",
-       " (0, 1, 5, 4, 3, 2): (0, 1, 5, 4, 3, 2),\n",
-       " (0, 2, 1, 3, 4, 5): (0, 2, 1, 3, 4, 5),\n",
-       " (0, 2, 1, 3, 5, 4): (0, 2, 1, 3, 5, 4),\n",
-       " (0, 2, 1, 4, 3, 5): (0, 2, 1, 4, 3, 5),\n",
-       " (0, 2, 1, 4, 5, 3): (0, 2, 1, 4, 5, 3),\n",
-       " (0, 2, 1, 5, 3, 4): (0, 2, 1, 5, 3, 4),\n",
-       " (0, 2, 1, 5, 4, 3): (0, 2, 1, 5, 4, 3),\n",
-       " (0, 2, 3, 1, 4, 5): (0, 2, 3, 1, 4, 5),\n",
-       " (0, 2, 3, 1, 5, 4): (0, 2, 3, 1, 5, 4),\n",
-       " (0, 2, 3, 4, 1, 5): (0, 2, 3, 4, 1, 5),\n",
-       " (0, 2, 3, 4, 5, 1): (0, 2, 3, 4, 5, 1),\n",
-       " (0, 2, 3, 5, 1, 4): (0, 2, 3, 5, 1, 4),\n",
-       " (0, 2, 3, 5, 4, 1): (0, 2, 3, 5, 4, 1),\n",
-       " (0, 2, 4, 1, 3, 5): (0, 2, 4, 1, 3, 5),\n",
-       " (0, 2, 4, 1, 5, 3): (0, 2, 4, 1, 5, 3),\n",
-       " (0, 2, 4, 3, 1, 5): (0, 2, 4, 3, 1, 5),\n",
-       " (0, 2, 4, 3, 5, 1): (0, 2, 4, 3, 5, 1),\n",
-       " (0, 2, 4, 5, 1, 3): (0, 2, 4, 5, 1, 3),\n",
-       " (0, 2, 4, 5, 3, 1): (0, 2, 4, 5, 3, 1),\n",
-       " (0, 2, 5, 1, 3, 4): (0, 2, 5, 1, 3, 4),\n",
-       " (0, 2, 5, 1, 4, 3): (0, 2, 5, 1, 4, 3),\n",
-       " (0, 2, 5, 3, 1, 4): (0, 2, 5, 3, 1, 4),\n",
-       " (0, 2, 5, 3, 4, 1): (0, 2, 5, 3, 4, 1),\n",
-       " (0, 2, 5, 4, 1, 3): (0, 2, 5, 4, 1, 3),\n",
-       " (0, 2, 5, 4, 3, 1): (0, 2, 5, 4, 3, 1),\n",
-       " (0, 3, 1, 2, 4, 5): (0, 3, 1, 2, 4, 5),\n",
-       " (0, 3, 1, 2, 5, 4): (0, 3, 1, 2, 5, 4),\n",
-       " (0, 3, 1, 4, 2, 5): (0, 3, 1, 4, 2, 5),\n",
-       " (0, 3, 1, 4, 5, 2): (0, 3, 1, 4, 5, 2),\n",
-       " (0, 3, 1, 5, 2, 4): (0, 3, 1, 5, 2, 4),\n",
-       " (0, 3, 1, 5, 4, 2): (0, 3, 1, 5, 4, 2),\n",
-       " (0, 3, 2, 1, 4, 5): (0, 3, 2, 1, 4, 5),\n",
-       " (0, 3, 2, 1, 5, 4): (0, 3, 2, 1, 5, 4),\n",
-       " (0, 3, 2, 4, 1, 5): (0, 3, 2, 4, 1, 5),\n",
-       " (0, 3, 2, 4, 5, 1): (0, 3, 2, 4, 5, 1),\n",
-       " (0, 3, 2, 5, 1, 4): (0, 3, 2, 5, 1, 4),\n",
-       " (0, 3, 2, 5, 4, 1): (0, 3, 2, 5, 4, 1),\n",
-       " (0, 3, 4, 1, 2, 5): (0, 3, 4, 1, 2, 5),\n",
-       " (0, 3, 4, 1, 5, 2): (0, 3, 4, 1, 5, 2),\n",
-       " (0, 3, 4, 2, 1, 5): (0, 3, 4, 2, 1, 5),\n",
-       " (0, 3, 4, 2, 5, 1): (0, 3, 4, 2, 5, 1),\n",
-       " (0, 3, 4, 5, 1, 2): (0, 3, 4, 5, 1, 2),\n",
-       " (0, 3, 4, 5, 2, 1): (0, 3, 4, 5, 2, 1),\n",
-       " (0, 3, 5, 1, 2, 4): (0, 3, 5, 1, 2, 4),\n",
-       " (0, 3, 5, 1, 4, 2): (0, 3, 5, 1, 4, 2),\n",
-       " (0, 3, 5, 2, 1, 4): (0, 3, 5, 2, 1, 4),\n",
-       " (0, 3, 5, 2, 4, 1): (0, 3, 5, 2, 4, 1),\n",
-       " (0, 3, 5, 4, 1, 2): (0, 3, 5, 4, 1, 2),\n",
-       " (0, 3, 5, 4, 2, 1): (0, 3, 5, 4, 2, 1),\n",
-       " (0, 4, 1, 2, 3, 5): (0, 4, 1, 2, 3, 5),\n",
-       " (0, 4, 1, 2, 5, 3): (0, 4, 1, 2, 5, 3),\n",
-       " (0, 4, 1, 3, 2, 5): (0, 4, 1, 3, 2, 5),\n",
-       " (0, 4, 1, 3, 5, 2): (0, 4, 1, 3, 5, 2),\n",
-       " (0, 4, 1, 5, 2, 3): (0, 4, 1, 5, 2, 3),\n",
-       " (0, 4, 1, 5, 3, 2): (0, 4, 1, 5, 3, 2),\n",
-       " (0, 4, 2, 1, 3, 5): (0, 4, 2, 1, 3, 5),\n",
-       " (0, 4, 2, 1, 5, 3): (0, 4, 2, 1, 5, 3),\n",
-       " (0, 4, 2, 3, 1, 5): (0, 4, 2, 3, 1, 5),\n",
-       " (0, 4, 2, 3, 5, 1): (0, 4, 2, 3, 5, 1),\n",
-       " (0, 4, 2, 5, 1, 3): (0, 4, 2, 5, 1, 3),\n",
-       " (0, 4, 2, 5, 3, 1): (0, 4, 2, 5, 3, 1),\n",
-       " (0, 4, 3, 1, 2, 5): (0, 4, 3, 1, 2, 5),\n",
-       " (0, 4, 3, 1, 5, 2): (0, 4, 3, 1, 5, 2),\n",
-       " (0, 4, 3, 2, 1, 5): (0, 4, 3, 2, 1, 5),\n",
-       " (0, 4, 3, 2, 5, 1): (0, 4, 3, 2, 5, 1),\n",
-       " (0, 4, 3, 5, 1, 2): (0, 4, 3, 5, 1, 2),\n",
-       " (0, 4, 3, 5, 2, 1): (0, 4, 3, 5, 2, 1),\n",
-       " (0, 4, 5, 1, 2, 3): (0, 4, 5, 1, 2, 3),\n",
-       " (0, 4, 5, 1, 3, 2): (0, 4, 5, 1, 3, 2),\n",
-       " (0, 4, 5, 2, 1, 3): (0, 4, 5, 2, 1, 3),\n",
-       " (0, 4, 5, 2, 3, 1): (0, 4, 5, 2, 3, 1),\n",
-       " (0, 4, 5, 3, 1, 2): (0, 4, 5, 3, 1, 2),\n",
-       " (0, 4, 5, 3, 2, 1): (0, 4, 5, 3, 2, 1),\n",
-       " (0, 5, 1, 2, 3, 4): (0, 5, 1, 2, 3, 4),\n",
-       " (0, 5, 1, 2, 4, 3): (0, 5, 1, 2, 4, 3),\n",
-       " (0, 5, 1, 3, 2, 4): (0, 5, 1, 3, 2, 4),\n",
-       " (0, 5, 1, 3, 4, 2): (0, 5, 1, 3, 4, 2),\n",
-       " (0, 5, 1, 4, 2, 3): (0, 5, 1, 4, 2, 3),\n",
-       " (0, 5, 1, 4, 3, 2): (0, 5, 1, 4, 3, 2),\n",
-       " (0, 5, 2, 1, 3, 4): (0, 5, 2, 1, 3, 4),\n",
-       " (0, 5, 2, 1, 4, 3): (0, 5, 2, 1, 4, 3),\n",
-       " (0, 5, 2, 3, 1, 4): (0, 5, 2, 3, 1, 4),\n",
-       " (0, 5, 2, 3, 4, 1): (0, 5, 2, 3, 4, 1),\n",
-       " (0, 5, 2, 4, 1, 3): (0, 5, 2, 4, 1, 3),\n",
-       " (0, 5, 2, 4, 3, 1): (0, 5, 2, 4, 3, 1),\n",
-       " (0, 5, 3, 1, 2, 4): (0, 5, 3, 1, 2, 4),\n",
-       " (0, 5, 3, 1, 4, 2): (0, 5, 3, 1, 4, 2),\n",
-       " (0, 5, 3, 2, 1, 4): (0, 5, 3, 2, 1, 4),\n",
-       " (0, 5, 3, 2, 4, 1): (0, 5, 3, 2, 4, 1),\n",
-       " (0, 5, 3, 4, 1, 2): (0, 5, 3, 4, 1, 2),\n",
-       " (0, 5, 3, 4, 2, 1): (0, 5, 3, 4, 2, 1),\n",
-       " (0, 5, 4, 1, 2, 3): (0, 5, 4, 1, 2, 3),\n",
-       " (0, 5, 4, 1, 3, 2): (0, 5, 4, 1, 3, 2),\n",
-       " (0, 5, 4, 2, 1, 3): (0, 5, 4, 2, 1, 3),\n",
-       " (0, 5, 4, 2, 3, 1): (0, 5, 4, 2, 3, 1),\n",
-       " (0, 5, 4, 3, 1, 2): (0, 5, 4, 3, 1, 2),\n",
-       " (0, 5, 4, 3, 2, 1): (0, 5, 4, 3, 2, 1),\n",
-       " (1, 0, 2, 3, 4, 5): (1, 0, 2, 3, 4, 5),\n",
-       " (1, 0, 2, 3, 5, 4): (1, 0, 2, 3, 5, 4),\n",
-       " (1, 0, 2, 4, 3, 5): (1, 0, 2, 4, 3, 5),\n",
-       " (1, 0, 2, 4, 5, 3): (1, 0, 2, 4, 5, 3),\n",
-       " (1, 0, 2, 5, 3, 4): (1, 0, 2, 5, 3, 4),\n",
-       " (1, 0, 2, 5, 4, 3): (1, 0, 2, 5, 4, 3),\n",
-       " (1, 0, 3, 2, 4, 5): (1, 0, 3, 2, 4, 5),\n",
-       " (1, 0, 3, 2, 5, 4): (1, 0, 3, 2, 5, 4),\n",
-       " (1, 0, 3, 4, 2, 5): (1, 0, 3, 4, 2, 5),\n",
-       " (1, 0, 3, 4, 5, 2): (1, 0, 3, 4, 5, 2),\n",
-       " (1, 0, 3, 5, 2, 4): (1, 0, 3, 5, 2, 4),\n",
-       " (1, 0, 3, 5, 4, 2): (1, 0, 3, 5, 4, 2),\n",
-       " (1, 0, 4, 2, 3, 5): (1, 0, 4, 2, 3, 5),\n",
-       " (1, 0, 4, 2, 5, 3): (1, 0, 4, 2, 5, 3),\n",
-       " (1, 0, 4, 3, 2, 5): (1, 0, 4, 3, 2, 5),\n",
-       " (1, 0, 4, 3, 5, 2): (1, 0, 4, 3, 5, 2),\n",
-       " (1, 0, 4, 5, 2, 3): (1, 0, 4, 5, 2, 3),\n",
-       " (1, 0, 4, 5, 3, 2): (1, 0, 4, 5, 3, 2),\n",
-       " (1, 0, 5, 2, 3, 4): (1, 0, 5, 2, 3, 4),\n",
-       " (1, 0, 5, 2, 4, 3): (1, 0, 5, 2, 4, 3),\n",
-       " (1, 0, 5, 3, 2, 4): (1, 0, 5, 3, 2, 4),\n",
-       " (1, 0, 5, 3, 4, 2): (1, 0, 5, 3, 4, 2),\n",
-       " (1, 0, 5, 4, 2, 3): (1, 0, 5, 4, 2, 3),\n",
-       " (1, 0, 5, 4, 3, 2): (1, 0, 5, 4, 3, 2),\n",
-       " (1, 2, 0, 3, 4, 5): (1, 2, 0, 3, 4, 5),\n",
-       " (1, 2, 0, 3, 5, 4): (1, 2, 0, 3, 5, 4),\n",
-       " (1, 2, 0, 4, 3, 5): (1, 2, 0, 4, 3, 5),\n",
-       " (1, 2, 0, 4, 5, 3): (1, 2, 0, 4, 5, 3),\n",
-       " (1, 2, 0, 5, 3, 4): (1, 2, 0, 5, 3, 4),\n",
-       " (1, 2, 0, 5, 4, 3): (1, 2, 0, 5, 4, 3),\n",
-       " (1, 2, 3, 0, 4, 5): (1, 2, 3, 0, 4, 5),\n",
-       " (1, 2, 3, 0, 5, 4): (1, 2, 3, 0, 5, 4),\n",
-       " (1, 2, 3, 4, 0, 5): (1, 2, 3, 4, 0, 5),\n",
-       " (1, 2, 3, 4, 5, 0): (1, 2, 3, 4, 5, 0),\n",
-       " (1, 2, 3, 5, 0, 4): (1, 2, 3, 5, 0, 4),\n",
-       " (1, 2, 3, 5, 4, 0): (1, 2, 3, 5, 4, 0),\n",
-       " (1, 2, 4, 0, 3, 5): (1, 2, 4, 0, 3, 5),\n",
-       " (1, 2, 4, 0, 5, 3): (1, 2, 4, 0, 5, 3),\n",
-       " (1, 2, 4, 3, 0, 5): (1, 2, 4, 3, 0, 5),\n",
-       " (1, 2, 4, 3, 5, 0): (1, 2, 4, 3, 5, 0),\n",
-       " (1, 2, 4, 5, 0, 3): (1, 2, 4, 5, 0, 3),\n",
-       " (1, 2, 4, 5, 3, 0): (1, 2, 4, 5, 3, 0),\n",
-       " (1, 2, 5, 0, 3, 4): (1, 2, 5, 0, 3, 4),\n",
-       " (1, 2, 5, 0, 4, 3): (1, 2, 5, 0, 4, 3),\n",
-       " (1, 2, 5, 3, 0, 4): (1, 2, 5, 3, 0, 4),\n",
-       " (1, 2, 5, 3, 4, 0): (1, 2, 5, 3, 4, 0),\n",
-       " (1, 2, 5, 4, 0, 3): (1, 2, 5, 4, 0, 3),\n",
-       " (1, 2, 5, 4, 3, 0): (1, 2, 5, 4, 3, 0),\n",
-       " (1, 3, 0, 2, 4, 5): (1, 3, 0, 2, 4, 5),\n",
-       " (1, 3, 0, 2, 5, 4): (1, 3, 0, 2, 5, 4),\n",
-       " (1, 3, 0, 4, 2, 5): (1, 3, 0, 4, 2, 5),\n",
-       " (1, 3, 0, 4, 5, 2): (1, 3, 0, 4, 5, 2),\n",
-       " (1, 3, 0, 5, 2, 4): (1, 3, 0, 5, 2, 4),\n",
-       " (1, 3, 0, 5, 4, 2): (1, 3, 0, 5, 4, 2),\n",
-       " (1, 3, 2, 0, 4, 5): (1, 3, 2, 0, 4, 5),\n",
-       " (1, 3, 2, 0, 5, 4): (1, 3, 2, 0, 5, 4),\n",
-       " (1, 3, 2, 4, 0, 5): (1, 3, 2, 4, 0, 5),\n",
-       " (1, 3, 2, 4, 5, 0): (1, 3, 2, 4, 5, 0),\n",
-       " (1, 3, 2, 5, 0, 4): (1, 3, 2, 5, 0, 4),\n",
-       " (1, 3, 2, 5, 4, 0): (1, 3, 2, 5, 4, 0),\n",
-       " (1, 3, 4, 0, 2, 5): (1, 3, 4, 0, 2, 5),\n",
-       " (1, 3, 4, 0, 5, 2): (1, 3, 4, 0, 5, 2),\n",
-       " (1, 3, 4, 2, 0, 5): (1, 3, 4, 2, 0, 5),\n",
-       " (1, 3, 4, 2, 5, 0): (1, 3, 4, 2, 5, 0),\n",
-       " (1, 3, 4, 5, 0, 2): (1, 3, 4, 5, 0, 2),\n",
-       " (1, 3, 4, 5, 2, 0): (1, 3, 4, 5, 2, 0),\n",
-       " (1, 3, 5, 0, 2, 4): (1, 3, 5, 0, 2, 4),\n",
-       " (1, 3, 5, 0, 4, 2): (1, 3, 5, 0, 4, 2),\n",
-       " (1, 3, 5, 2, 0, 4): (1, 3, 5, 2, 0, 4),\n",
-       " (1, 3, 5, 2, 4, 0): (1, 3, 5, 2, 4, 0),\n",
-       " (1, 3, 5, 4, 0, 2): (1, 3, 5, 4, 0, 2),\n",
-       " (1, 3, 5, 4, 2, 0): (1, 3, 5, 4, 2, 0),\n",
-       " (1, 4, 0, 2, 3, 5): (1, 4, 0, 2, 3, 5),\n",
-       " (1, 4, 0, 2, 5, 3): (1, 4, 0, 2, 5, 3),\n",
-       " (1, 4, 0, 3, 2, 5): (1, 4, 0, 3, 2, 5),\n",
-       " (1, 4, 0, 3, 5, 2): (1, 4, 0, 3, 5, 2),\n",
-       " (1, 4, 0, 5, 2, 3): (1, 4, 0, 5, 2, 3),\n",
-       " (1, 4, 0, 5, 3, 2): (1, 4, 0, 5, 3, 2),\n",
-       " (1, 4, 2, 0, 3, 5): (1, 4, 2, 0, 3, 5),\n",
-       " (1, 4, 2, 0, 5, 3): (1, 4, 2, 0, 5, 3),\n",
-       " (1, 4, 2, 3, 0, 5): (1, 4, 2, 3, 0, 5),\n",
-       " (1, 4, 2, 3, 5, 0): (1, 4, 2, 3, 5, 0),\n",
-       " (1, 4, 2, 5, 0, 3): (1, 4, 2, 5, 0, 3),\n",
-       " (1, 4, 2, 5, 3, 0): (1, 4, 2, 5, 3, 0),\n",
-       " (1, 4, 3, 0, 2, 5): (1, 4, 3, 0, 2, 5),\n",
-       " (1, 4, 3, 0, 5, 2): (1, 4, 3, 0, 5, 2),\n",
-       " (1, 4, 3, 2, 0, 5): (1, 4, 3, 2, 0, 5),\n",
-       " (1, 4, 3, 2, 5, 0): (1, 4, 3, 2, 5, 0),\n",
-       " (1, 4, 3, 5, 0, 2): (1, 4, 3, 5, 0, 2),\n",
-       " (1, 4, 3, 5, 2, 0): (1, 4, 3, 5, 2, 0),\n",
-       " (1, 4, 5, 0, 2, 3): (1, 4, 5, 0, 2, 3),\n",
-       " (1, 4, 5, 0, 3, 2): (1, 4, 5, 0, 3, 2),\n",
-       " (1, 4, 5, 2, 0, 3): (1, 4, 5, 2, 0, 3),\n",
-       " (1, 4, 5, 2, 3, 0): (1, 4, 5, 2, 3, 0),\n",
-       " (1, 4, 5, 3, 0, 2): (1, 4, 5, 3, 0, 2),\n",
-       " (1, 4, 5, 3, 2, 0): (1, 4, 5, 3, 2, 0),\n",
-       " (1, 5, 0, 2, 3, 4): (1, 5, 0, 2, 3, 4),\n",
-       " (1, 5, 0, 2, 4, 3): (1, 5, 0, 2, 4, 3),\n",
-       " (1, 5, 0, 3, 2, 4): (1, 5, 0, 3, 2, 4),\n",
-       " (1, 5, 0, 3, 4, 2): (1, 5, 0, 3, 4, 2),\n",
-       " (1, 5, 0, 4, 2, 3): (1, 5, 0, 4, 2, 3),\n",
-       " (1, 5, 0, 4, 3, 2): (1, 5, 0, 4, 3, 2),\n",
-       " (1, 5, 2, 0, 3, 4): (1, 5, 2, 0, 3, 4),\n",
-       " (1, 5, 2, 0, 4, 3): (1, 5, 2, 0, 4, 3),\n",
-       " (1, 5, 2, 3, 0, 4): (1, 5, 2, 3, 0, 4),\n",
-       " (1, 5, 2, 3, 4, 0): (1, 5, 2, 3, 4, 0),\n",
-       " (1, 5, 2, 4, 0, 3): (1, 5, 2, 4, 0, 3),\n",
-       " (1, 5, 2, 4, 3, 0): (1, 5, 2, 4, 3, 0),\n",
-       " (1, 5, 3, 0, 2, 4): (1, 5, 3, 0, 2, 4),\n",
-       " (1, 5, 3, 0, 4, 2): (1, 5, 3, 0, 4, 2),\n",
-       " (1, 5, 3, 2, 0, 4): (1, 5, 3, 2, 0, 4),\n",
-       " (1, 5, 3, 2, 4, 0): (1, 5, 3, 2, 4, 0),\n",
-       " (1, 5, 3, 4, 0, 2): (1, 5, 3, 4, 0, 2),\n",
-       " (1, 5, 3, 4, 2, 0): (1, 5, 3, 4, 2, 0),\n",
-       " (1, 5, 4, 0, 2, 3): (1, 5, 4, 0, 2, 3),\n",
-       " (1, 5, 4, 0, 3, 2): (1, 5, 4, 0, 3, 2),\n",
-       " (1, 5, 4, 2, 0, 3): (1, 5, 4, 2, 0, 3),\n",
-       " (1, 5, 4, 2, 3, 0): (1, 5, 4, 2, 3, 0),\n",
-       " (1, 5, 4, 3, 0, 2): (1, 5, 4, 3, 0, 2),\n",
-       " (1, 5, 4, 3, 2, 0): (1, 5, 4, 3, 2, 0),\n",
-       " (2, 0, 1, 3, 4, 5): (2, 0, 1, 3, 4, 5),\n",
-       " (2, 0, 1, 3, 5, 4): (2, 0, 1, 3, 5, 4),\n",
-       " (2, 0, 1, 4, 3, 5): (2, 0, 1, 4, 3, 5),\n",
-       " (2, 0, 1, 4, 5, 3): (2, 0, 1, 4, 5, 3),\n",
-       " (2, 0, 1, 5, 3, 4): (2, 0, 1, 5, 3, 4),\n",
-       " (2, 0, 1, 5, 4, 3): (2, 0, 1, 5, 4, 3),\n",
-       " (2, 0, 3, 1, 4, 5): (2, 0, 3, 1, 4, 5),\n",
-       " (2, 0, 3, 1, 5, 4): (2, 0, 3, 1, 5, 4),\n",
-       " (2, 0, 3, 4, 1, 5): (2, 0, 3, 4, 1, 5),\n",
-       " (2, 0, 3, 4, 5, 1): (2, 0, 3, 4, 5, 1),\n",
-       " (2, 0, 3, 5, 1, 4): (2, 0, 3, 5, 1, 4),\n",
-       " (2, 0, 3, 5, 4, 1): (2, 0, 3, 5, 4, 1),\n",
-       " (2, 0, 4, 1, 3, 5): (2, 0, 4, 1, 3, 5),\n",
-       " (2, 0, 4, 1, 5, 3): (2, 0, 4, 1, 5, 3),\n",
-       " (2, 0, 4, 3, 1, 5): (2, 0, 4, 3, 1, 5),\n",
-       " (2, 0, 4, 3, 5, 1): (2, 0, 4, 3, 5, 1),\n",
-       " (2, 0, 4, 5, 1, 3): (2, 0, 4, 5, 1, 3),\n",
-       " (2, 0, 4, 5, 3, 1): (2, 0, 4, 5, 3, 1),\n",
-       " (2, 0, 5, 1, 3, 4): (2, 0, 5, 1, 3, 4),\n",
-       " (2, 0, 5, 1, 4, 3): (2, 0, 5, 1, 4, 3),\n",
-       " (2, 0, 5, 3, 1, 4): (2, 0, 5, 3, 1, 4),\n",
-       " (2, 0, 5, 3, 4, 1): (2, 0, 5, 3, 4, 1),\n",
-       " (2, 0, 5, 4, 1, 3): (2, 0, 5, 4, 1, 3),\n",
-       " (2, 0, 5, 4, 3, 1): (2, 0, 5, 4, 3, 1),\n",
-       " (2, 1, 0, 3, 4, 5): (2, 1, 0, 3, 4, 5),\n",
-       " (2, 1, 0, 3, 5, 4): (2, 1, 0, 3, 5, 4),\n",
-       " (2, 1, 0, 4, 3, 5): (2, 1, 0, 4, 3, 5),\n",
-       " (2, 1, 0, 4, 5, 3): (2, 1, 0, 4, 5, 3),\n",
-       " (2, 1, 0, 5, 3, 4): (2, 1, 0, 5, 3, 4),\n",
-       " (2, 1, 0, 5, 4, 3): (2, 1, 0, 5, 4, 3),\n",
-       " (2, 1, 3, 0, 4, 5): (2, 1, 3, 0, 4, 5),\n",
-       " (2, 1, 3, 0, 5, 4): (2, 1, 3, 0, 5, 4),\n",
-       " (2, 1, 3, 4, 0, 5): (2, 1, 3, 4, 0, 5),\n",
-       " (2, 1, 3, 4, 5, 0): (2, 1, 3, 4, 5, 0),\n",
-       " (2, 1, 3, 5, 0, 4): (2, 1, 3, 5, 0, 4),\n",
-       " (2, 1, 3, 5, 4, 0): (2, 1, 3, 5, 4, 0),\n",
-       " (2, 1, 4, 0, 3, 5): (2, 1, 4, 0, 3, 5),\n",
-       " (2, 1, 4, 0, 5, 3): (2, 1, 4, 0, 5, 3),\n",
-       " (2, 1, 4, 3, 0, 5): (2, 1, 4, 3, 0, 5),\n",
-       " (2, 1, 4, 3, 5, 0): (2, 1, 4, 3, 5, 0),\n",
-       " (2, 1, 4, 5, 0, 3): (2, 1, 4, 5, 0, 3),\n",
-       " (2, 1, 4, 5, 3, 0): (2, 1, 4, 5, 3, 0),\n",
-       " (2, 1, 5, 0, 3, 4): (2, 1, 5, 0, 3, 4),\n",
-       " (2, 1, 5, 0, 4, 3): (2, 1, 5, 0, 4, 3),\n",
-       " (2, 1, 5, 3, 0, 4): (2, 1, 5, 3, 0, 4),\n",
-       " (2, 1, 5, 3, 4, 0): (2, 1, 5, 3, 4, 0),\n",
-       " (2, 1, 5, 4, 0, 3): (2, 1, 5, 4, 0, 3),\n",
-       " (2, 1, 5, 4, 3, 0): (2, 1, 5, 4, 3, 0),\n",
-       " (2, 3, 0, 1, 4, 5): (2, 3, 0, 1, 4, 5),\n",
-       " (2, 3, 0, 1, 5, 4): (2, 3, 0, 1, 5, 4),\n",
-       " (2, 3, 0, 4, 1, 5): (2, 3, 0, 4, 1, 5),\n",
-       " (2, 3, 0, 4, 5, 1): (2, 3, 0, 4, 5, 1),\n",
-       " (2, 3, 0, 5, 1, 4): (2, 3, 0, 5, 1, 4),\n",
-       " (2, 3, 0, 5, 4, 1): (2, 3, 0, 5, 4, 1),\n",
-       " (2, 3, 1, 0, 4, 5): (2, 3, 1, 0, 4, 5),\n",
-       " (2, 3, 1, 0, 5, 4): (2, 3, 1, 0, 5, 4),\n",
-       " (2, 3, 1, 4, 0, 5): (2, 3, 1, 4, 0, 5),\n",
-       " (2, 3, 1, 4, 5, 0): (2, 3, 1, 4, 5, 0),\n",
-       " (2, 3, 1, 5, 0, 4): (2, 3, 1, 5, 0, 4),\n",
-       " (2, 3, 1, 5, 4, 0): (2, 3, 1, 5, 4, 0),\n",
-       " (2, 3, 4, 0, 1, 5): (2, 3, 4, 0, 1, 5),\n",
-       " (2, 3, 4, 0, 5, 1): (2, 3, 4, 0, 5, 1),\n",
-       " (2, 3, 4, 1, 0, 5): (2, 3, 4, 1, 0, 5),\n",
-       " (2, 3, 4, 1, 5, 0): (2, 3, 4, 1, 5, 0),\n",
-       " (2, 3, 4, 5, 0, 1): (2, 3, 4, 5, 0, 1),\n",
-       " (2, 3, 4, 5, 1, 0): (2, 3, 4, 5, 1, 0),\n",
-       " (2, 3, 5, 0, 1, 4): (2, 3, 5, 0, 1, 4),\n",
-       " (2, 3, 5, 0, 4, 1): (2, 3, 5, 0, 4, 1),\n",
-       " (2, 3, 5, 1, 0, 4): (2, 3, 5, 1, 0, 4),\n",
-       " (2, 3, 5, 1, 4, 0): (2, 3, 5, 1, 4, 0),\n",
-       " (2, 3, 5, 4, 0, 1): (2, 3, 5, 4, 0, 1),\n",
-       " (2, 3, 5, 4, 1, 0): (2, 3, 5, 4, 1, 0),\n",
-       " (2, 4, 0, 1, 3, 5): (2, 4, 0, 1, 3, 5),\n",
-       " (2, 4, 0, 1, 5, 3): (2, 4, 0, 1, 5, 3),\n",
-       " (2, 4, 0, 3, 1, 5): (2, 4, 0, 3, 1, 5),\n",
-       " (2, 4, 0, 3, 5, 1): (2, 4, 0, 3, 5, 1),\n",
-       " (2, 4, 0, 5, 1, 3): (2, 4, 0, 5, 1, 3),\n",
-       " (2, 4, 0, 5, 3, 1): (2, 4, 0, 5, 3, 1),\n",
-       " (2, 4, 1, 0, 3, 5): (2, 4, 1, 0, 3, 5),\n",
-       " (2, 4, 1, 0, 5, 3): (2, 4, 1, 0, 5, 3),\n",
-       " (2, 4, 1, 3, 0, 5): (2, 4, 1, 3, 0, 5),\n",
-       " (2, 4, 1, 3, 5, 0): (2, 4, 1, 3, 5, 0),\n",
-       " (2, 4, 1, 5, 0, 3): (2, 4, 1, 5, 0, 3),\n",
-       " (2, 4, 1, 5, 3, 0): (2, 4, 1, 5, 3, 0),\n",
-       " (2, 4, 3, 0, 1, 5): (2, 4, 3, 0, 1, 5),\n",
-       " (2, 4, 3, 0, 5, 1): (2, 4, 3, 0, 5, 1),\n",
-       " (2, 4, 3, 1, 0, 5): (2, 4, 3, 1, 0, 5),\n",
-       " (2, 4, 3, 1, 5, 0): (2, 4, 3, 1, 5, 0),\n",
-       " (2, 4, 3, 5, 0, 1): (2, 4, 3, 5, 0, 1),\n",
-       " (2, 4, 3, 5, 1, 0): (2, 4, 3, 5, 1, 0),\n",
-       " (2, 4, 5, 0, 1, 3): (2, 4, 5, 0, 1, 3),\n",
-       " (2, 4, 5, 0, 3, 1): (2, 4, 5, 0, 3, 1),\n",
-       " (2, 4, 5, 1, 0, 3): (2, 4, 5, 1, 0, 3),\n",
-       " (2, 4, 5, 1, 3, 0): (2, 4, 5, 1, 3, 0),\n",
-       " (2, 4, 5, 3, 0, 1): (2, 4, 5, 3, 0, 1),\n",
-       " (2, 4, 5, 3, 1, 0): (2, 4, 5, 3, 1, 0),\n",
-       " (2, 5, 0, 1, 3, 4): (2, 5, 0, 1, 3, 4),\n",
-       " (2, 5, 0, 1, 4, 3): (2, 5, 0, 1, 4, 3),\n",
-       " (2, 5, 0, 3, 1, 4): (2, 5, 0, 3, 1, 4),\n",
-       " (2, 5, 0, 3, 4, 1): (2, 5, 0, 3, 4, 1),\n",
-       " (2, 5, 0, 4, 1, 3): (2, 5, 0, 4, 1, 3),\n",
-       " (2, 5, 0, 4, 3, 1): (2, 5, 0, 4, 3, 1),\n",
-       " (2, 5, 1, 0, 3, 4): (2, 5, 1, 0, 3, 4),\n",
-       " (2, 5, 1, 0, 4, 3): (2, 5, 1, 0, 4, 3),\n",
-       " (2, 5, 1, 3, 0, 4): (2, 5, 1, 3, 0, 4),\n",
-       " (2, 5, 1, 3, 4, 0): (2, 5, 1, 3, 4, 0),\n",
-       " (2, 5, 1, 4, 0, 3): (2, 5, 1, 4, 0, 3),\n",
-       " (2, 5, 1, 4, 3, 0): (2, 5, 1, 4, 3, 0),\n",
-       " (2, 5, 3, 0, 1, 4): (2, 5, 3, 0, 1, 4),\n",
-       " (2, 5, 3, 0, 4, 1): (2, 5, 3, 0, 4, 1),\n",
-       " (2, 5, 3, 1, 0, 4): (2, 5, 3, 1, 0, 4),\n",
-       " (2, 5, 3, 1, 4, 0): (2, 5, 3, 1, 4, 0),\n",
-       " (2, 5, 3, 4, 0, 1): (2, 5, 3, 4, 0, 1),\n",
-       " (2, 5, 3, 4, 1, 0): (2, 5, 3, 4, 1, 0),\n",
-       " (2, 5, 4, 0, 1, 3): (2, 5, 4, 0, 1, 3),\n",
-       " (2, 5, 4, 0, 3, 1): (2, 5, 4, 0, 3, 1),\n",
-       " (2, 5, 4, 1, 0, 3): (2, 5, 4, 1, 0, 3),\n",
-       " (2, 5, 4, 1, 3, 0): (2, 5, 4, 1, 3, 0),\n",
-       " (2, 5, 4, 3, 0, 1): (2, 5, 4, 3, 0, 1),\n",
-       " (2, 5, 4, 3, 1, 0): (2, 5, 4, 3, 1, 0),\n",
-       " (3, 0, 1, 2, 4, 5): (3, 0, 1, 2, 4, 5),\n",
-       " (3, 0, 1, 2, 5, 4): (3, 0, 1, 2, 5, 4),\n",
-       " (3, 0, 1, 4, 2, 5): (3, 0, 1, 4, 2, 5),\n",
-       " (3, 0, 1, 4, 5, 2): (3, 0, 1, 4, 5, 2),\n",
-       " (3, 0, 1, 5, 2, 4): (3, 0, 1, 5, 2, 4),\n",
-       " (3, 0, 1, 5, 4, 2): (3, 0, 1, 5, 4, 2),\n",
-       " (3, 0, 2, 1, 4, 5): (3, 0, 2, 1, 4, 5),\n",
-       " (3, 0, 2, 1, 5, 4): (3, 0, 2, 1, 5, 4),\n",
-       " (3, 0, 2, 4, 1, 5): (3, 0, 2, 4, 1, 5),\n",
-       " (3, 0, 2, 4, 5, 1): (3, 0, 2, 4, 5, 1),\n",
-       " (3, 0, 2, 5, 1, 4): (3, 0, 2, 5, 1, 4),\n",
-       " (3, 0, 2, 5, 4, 1): (3, 0, 2, 5, 4, 1),\n",
-       " (3, 0, 4, 1, 2, 5): (3, 0, 4, 1, 2, 5),\n",
-       " (3, 0, 4, 1, 5, 2): (3, 0, 4, 1, 5, 2),\n",
-       " (3, 0, 4, 2, 1, 5): (3, 0, 4, 2, 1, 5),\n",
-       " (3, 0, 4, 2, 5, 1): (3, 0, 4, 2, 5, 1),\n",
-       " (3, 0, 4, 5, 1, 2): (3, 0, 4, 5, 1, 2),\n",
-       " (3, 0, 4, 5, 2, 1): (3, 0, 4, 5, 2, 1),\n",
-       " (3, 0, 5, 1, 2, 4): (3, 0, 5, 1, 2, 4),\n",
-       " (3, 0, 5, 1, 4, 2): (3, 0, 5, 1, 4, 2),\n",
-       " (3, 0, 5, 2, 1, 4): (3, 0, 5, 2, 1, 4),\n",
-       " (3, 0, 5, 2, 4, 1): (3, 0, 5, 2, 4, 1),\n",
-       " (3, 0, 5, 4, 1, 2): (3, 0, 5, 4, 1, 2),\n",
-       " (3, 0, 5, 4, 2, 1): (3, 0, 5, 4, 2, 1),\n",
-       " (3, 1, 0, 2, 4, 5): (3, 1, 0, 2, 4, 5),\n",
-       " (3, 1, 0, 2, 5, 4): (3, 1, 0, 2, 5, 4),\n",
-       " (3, 1, 0, 4, 2, 5): (3, 1, 0, 4, 2, 5),\n",
-       " (3, 1, 0, 4, 5, 2): (3, 1, 0, 4, 5, 2),\n",
-       " (3, 1, 0, 5, 2, 4): (3, 1, 0, 5, 2, 4),\n",
-       " (3, 1, 0, 5, 4, 2): (3, 1, 0, 5, 4, 2),\n",
-       " (3, 1, 2, 0, 4, 5): (3, 1, 2, 0, 4, 5),\n",
-       " (3, 1, 2, 0, 5, 4): (3, 1, 2, 0, 5, 4),\n",
-       " (3, 1, 2, 4, 0, 5): (3, 1, 2, 4, 0, 5),\n",
-       " (3, 1, 2, 4, 5, 0): (3, 1, 2, 4, 5, 0),\n",
-       " (3, 1, 2, 5, 0, 4): (3, 1, 2, 5, 0, 4),\n",
-       " (3, 1, 2, 5, 4, 0): (3, 1, 2, 5, 4, 0),\n",
-       " (3, 1, 4, 0, 2, 5): (3, 1, 4, 0, 2, 5),\n",
-       " (3, 1, 4, 0, 5, 2): (3, 1, 4, 0, 5, 2),\n",
-       " (3, 1, 4, 2, 0, 5): (3, 1, 4, 2, 0, 5),\n",
-       " (3, 1, 4, 2, 5, 0): (3, 1, 4, 2, 5, 0),\n",
-       " (3, 1, 4, 5, 0, 2): (3, 1, 4, 5, 0, 2),\n",
-       " (3, 1, 4, 5, 2, 0): (3, 1, 4, 5, 2, 0),\n",
-       " (3, 1, 5, 0, 2, 4): (3, 1, 5, 0, 2, 4),\n",
-       " (3, 1, 5, 0, 4, 2): (3, 1, 5, 0, 4, 2),\n",
-       " (3, 1, 5, 2, 0, 4): (3, 1, 5, 2, 0, 4),\n",
-       " (3, 1, 5, 2, 4, 0): (3, 1, 5, 2, 4, 0),\n",
-       " (3, 1, 5, 4, 0, 2): (3, 1, 5, 4, 0, 2),\n",
-       " (3, 1, 5, 4, 2, 0): (3, 1, 5, 4, 2, 0),\n",
-       " (3, 2, 0, 1, 4, 5): (3, 2, 0, 1, 4, 5),\n",
-       " (3, 2, 0, 1, 5, 4): (3, 2, 0, 1, 5, 4),\n",
-       " (3, 2, 0, 4, 1, 5): (3, 2, 0, 4, 1, 5),\n",
-       " (3, 2, 0, 4, 5, 1): (3, 2, 0, 4, 5, 1),\n",
-       " (3, 2, 0, 5, 1, 4): (3, 2, 0, 5, 1, 4),\n",
-       " (3, 2, 0, 5, 4, 1): (3, 2, 0, 5, 4, 1),\n",
-       " (3, 2, 1, 0, 4, 5): (3, 2, 1, 0, 4, 5),\n",
-       " (3, 2, 1, 0, 5, 4): (3, 2, 1, 0, 5, 4),\n",
-       " (3, 2, 1, 4, 0, 5): (3, 2, 1, 4, 0, 5),\n",
-       " (3, 2, 1, 4, 5, 0): (3, 2, 1, 4, 5, 0),\n",
-       " (3, 2, 1, 5, 0, 4): (3, 2, 1, 5, 0, 4),\n",
-       " (3, 2, 1, 5, 4, 0): (3, 2, 1, 5, 4, 0),\n",
-       " (3, 2, 4, 0, 1, 5): (3, 2, 4, 0, 1, 5),\n",
-       " (3, 2, 4, 0, 5, 1): (3, 2, 4, 0, 5, 1),\n",
-       " (3, 2, 4, 1, 0, 5): (3, 2, 4, 1, 0, 5),\n",
-       " (3, 2, 4, 1, 5, 0): (3, 2, 4, 1, 5, 0),\n",
-       " (3, 2, 4, 5, 0, 1): (3, 2, 4, 5, 0, 1),\n",
-       " (3, 2, 4, 5, 1, 0): (3, 2, 4, 5, 1, 0),\n",
-       " (3, 2, 5, 0, 1, 4): (3, 2, 5, 0, 1, 4),\n",
-       " (3, 2, 5, 0, 4, 1): (3, 2, 5, 0, 4, 1),\n",
-       " (3, 2, 5, 1, 0, 4): (3, 2, 5, 1, 0, 4),\n",
-       " (3, 2, 5, 1, 4, 0): (3, 2, 5, 1, 4, 0),\n",
-       " (3, 2, 5, 4, 0, 1): (3, 2, 5, 4, 0, 1),\n",
-       " (3, 2, 5, 4, 1, 0): (3, 2, 5, 4, 1, 0),\n",
-       " (3, 4, 0, 1, 2, 5): (3, 4, 0, 1, 2, 5),\n",
-       " (3, 4, 0, 1, 5, 2): (3, 4, 0, 1, 5, 2),\n",
-       " (3, 4, 0, 2, 1, 5): (3, 4, 0, 2, 1, 5),\n",
-       " (3, 4, 0, 2, 5, 1): (3, 4, 0, 2, 5, 1),\n",
-       " (3, 4, 0, 5, 1, 2): (3, 4, 0, 5, 1, 2),\n",
-       " (3, 4, 0, 5, 2, 1): (3, 4, 0, 5, 2, 1),\n",
-       " (3, 4, 1, 0, 2, 5): (3, 4, 1, 0, 2, 5),\n",
-       " (3, 4, 1, 0, 5, 2): (3, 4, 1, 0, 5, 2),\n",
-       " (3, 4, 1, 2, 0, 5): (3, 4, 1, 2, 0, 5),\n",
-       " (3, 4, 1, 2, 5, 0): (3, 4, 1, 2, 5, 0),\n",
-       " (3, 4, 1, 5, 0, 2): (3, 4, 1, 5, 0, 2),\n",
-       " (3, 4, 1, 5, 2, 0): (3, 4, 1, 5, 2, 0),\n",
-       " (3, 4, 2, 0, 1, 5): (3, 4, 2, 0, 1, 5),\n",
-       " (3, 4, 2, 0, 5, 1): (3, 4, 2, 0, 5, 1),\n",
-       " (3, 4, 2, 1, 0, 5): (3, 4, 2, 1, 0, 5),\n",
-       " (3, 4, 2, 1, 5, 0): (3, 4, 2, 1, 5, 0),\n",
-       " (3, 4, 2, 5, 0, 1): (3, 4, 2, 5, 0, 1),\n",
-       " (3, 4, 2, 5, 1, 0): (3, 4, 2, 5, 1, 0),\n",
-       " (3, 4, 5, 0, 1, 2): (3, 4, 5, 0, 1, 2),\n",
-       " (3, 4, 5, 0, 2, 1): (3, 4, 5, 0, 2, 1),\n",
-       " (3, 4, 5, 1, 0, 2): (3, 4, 5, 1, 0, 2),\n",
-       " (3, 4, 5, 1, 2, 0): (3, 4, 5, 1, 2, 0),\n",
-       " (3, 4, 5, 2, 0, 1): (3, 4, 5, 2, 0, 1),\n",
-       " (3, 4, 5, 2, 1, 0): (3, 4, 5, 2, 1, 0),\n",
-       " (3, 5, 0, 1, 2, 4): (3, 5, 0, 1, 2, 4),\n",
-       " (3, 5, 0, 1, 4, 2): (3, 5, 0, 1, 4, 2),\n",
-       " (3, 5, 0, 2, 1, 4): (3, 5, 0, 2, 1, 4),\n",
-       " (3, 5, 0, 2, 4, 1): (3, 5, 0, 2, 4, 1),\n",
-       " (3, 5, 0, 4, 1, 2): (3, 5, 0, 4, 1, 2),\n",
-       " (3, 5, 0, 4, 2, 1): (3, 5, 0, 4, 2, 1),\n",
-       " (3, 5, 1, 0, 2, 4): (3, 5, 1, 0, 2, 4),\n",
-       " (3, 5, 1, 0, 4, 2): (3, 5, 1, 0, 4, 2),\n",
-       " (3, 5, 1, 2, 0, 4): (3, 5, 1, 2, 0, 4),\n",
-       " (3, 5, 1, 2, 4, 0): (3, 5, 1, 2, 4, 0),\n",
-       " (3, 5, 1, 4, 0, 2): (3, 5, 1, 4, 0, 2),\n",
-       " (3, 5, 1, 4, 2, 0): (3, 5, 1, 4, 2, 0),\n",
-       " (3, 5, 2, 0, 1, 4): (3, 5, 2, 0, 1, 4),\n",
-       " (3, 5, 2, 0, 4, 1): (3, 5, 2, 0, 4, 1),\n",
-       " (3, 5, 2, 1, 0, 4): (3, 5, 2, 1, 0, 4),\n",
-       " (3, 5, 2, 1, 4, 0): (3, 5, 2, 1, 4, 0),\n",
-       " (3, 5, 2, 4, 0, 1): (3, 5, 2, 4, 0, 1),\n",
-       " (3, 5, 2, 4, 1, 0): (3, 5, 2, 4, 1, 0),\n",
-       " (3, 5, 4, 0, 1, 2): (3, 5, 4, 0, 1, 2),\n",
-       " (3, 5, 4, 0, 2, 1): (3, 5, 4, 0, 2, 1),\n",
-       " (3, 5, 4, 1, 0, 2): (3, 5, 4, 1, 0, 2),\n",
-       " (3, 5, 4, 1, 2, 0): (3, 5, 4, 1, 2, 0),\n",
-       " (3, 5, 4, 2, 0, 1): (3, 5, 4, 2, 0, 1),\n",
-       " (3, 5, 4, 2, 1, 0): (3, 5, 4, 2, 1, 0),\n",
-       " (4, 0, 1, 2, 3, 5): (4, 0, 1, 2, 3, 5),\n",
-       " (4, 0, 1, 2, 5, 3): (4, 0, 1, 2, 5, 3),\n",
-       " (4, 0, 1, 3, 2, 5): (4, 0, 1, 3, 2, 5),\n",
-       " (4, 0, 1, 3, 5, 2): (4, 0, 1, 3, 5, 2),\n",
-       " (4, 0, 1, 5, 2, 3): (4, 0, 1, 5, 2, 3),\n",
-       " (4, 0, 1, 5, 3, 2): (4, 0, 1, 5, 3, 2),\n",
-       " (4, 0, 2, 1, 3, 5): (4, 0, 2, 1, 3, 5),\n",
-       " (4, 0, 2, 1, 5, 3): (4, 0, 2, 1, 5, 3),\n",
-       " (4, 0, 2, 3, 1, 5): (4, 0, 2, 3, 1, 5),\n",
-       " (4, 0, 2, 3, 5, 1): (4, 0, 2, 3, 5, 1),\n",
-       " (4, 0, 2, 5, 1, 3): (4, 0, 2, 5, 1, 3),\n",
-       " (4, 0, 2, 5, 3, 1): (4, 0, 2, 5, 3, 1),\n",
-       " (4, 0, 3, 1, 2, 5): (4, 0, 3, 1, 2, 5),\n",
-       " (4, 0, 3, 1, 5, 2): (4, 0, 3, 1, 5, 2),\n",
-       " (4, 0, 3, 2, 1, 5): (4, 0, 3, 2, 1, 5),\n",
-       " (4, 0, 3, 2, 5, 1): (4, 0, 3, 2, 5, 1),\n",
-       " (4, 0, 3, 5, 1, 2): (4, 0, 3, 5, 1, 2),\n",
-       " (4, 0, 3, 5, 2, 1): (4, 0, 3, 5, 2, 1),\n",
-       " (4, 0, 5, 1, 2, 3): (4, 0, 5, 1, 2, 3),\n",
-       " (4, 0, 5, 1, 3, 2): (4, 0, 5, 1, 3, 2),\n",
-       " (4, 0, 5, 2, 1, 3): (4, 0, 5, 2, 1, 3),\n",
-       " (4, 0, 5, 2, 3, 1): (4, 0, 5, 2, 3, 1),\n",
-       " (4, 0, 5, 3, 1, 2): (4, 0, 5, 3, 1, 2),\n",
-       " (4, 0, 5, 3, 2, 1): (4, 0, 5, 3, 2, 1),\n",
-       " (4, 1, 0, 2, 3, 5): (4, 1, 0, 2, 3, 5),\n",
-       " (4, 1, 0, 2, 5, 3): (4, 1, 0, 2, 5, 3),\n",
-       " (4, 1, 0, 3, 2, 5): (4, 1, 0, 3, 2, 5),\n",
-       " (4, 1, 0, 3, 5, 2): (4, 1, 0, 3, 5, 2),\n",
-       " (4, 1, 0, 5, 2, 3): (4, 1, 0, 5, 2, 3),\n",
-       " (4, 1, 0, 5, 3, 2): (4, 1, 0, 5, 3, 2),\n",
-       " (4, 1, 2, 0, 3, 5): (4, 1, 2, 0, 3, 5),\n",
-       " (4, 1, 2, 0, 5, 3): (4, 1, 2, 0, 5, 3),\n",
-       " (4, 1, 2, 3, 0, 5): (4, 1, 2, 3, 0, 5),\n",
-       " (4, 1, 2, 3, 5, 0): (4, 1, 2, 3, 5, 0),\n",
-       " (4, 1, 2, 5, 0, 3): (4, 1, 2, 5, 0, 3),\n",
-       " (4, 1, 2, 5, 3, 0): (4, 1, 2, 5, 3, 0),\n",
-       " (4, 1, 3, 0, 2, 5): (4, 1, 3, 0, 2, 5),\n",
-       " (4, 1, 3, 0, 5, 2): (4, 1, 3, 0, 5, 2),\n",
-       " (4, 1, 3, 2, 0, 5): (4, 1, 3, 2, 0, 5),\n",
-       " (4, 1, 3, 2, 5, 0): (4, 1, 3, 2, 5, 0),\n",
-       " (4, 1, 3, 5, 0, 2): (4, 1, 3, 5, 0, 2),\n",
-       " (4, 1, 3, 5, 2, 0): (4, 1, 3, 5, 2, 0),\n",
-       " (4, 1, 5, 0, 2, 3): (4, 1, 5, 0, 2, 3),\n",
-       " (4, 1, 5, 0, 3, 2): (4, 1, 5, 0, 3, 2),\n",
-       " (4, 1, 5, 2, 0, 3): (4, 1, 5, 2, 0, 3),\n",
-       " (4, 1, 5, 2, 3, 0): (4, 1, 5, 2, 3, 0),\n",
-       " (4, 1, 5, 3, 0, 2): (4, 1, 5, 3, 0, 2),\n",
-       " (4, 1, 5, 3, 2, 0): (4, 1, 5, 3, 2, 0),\n",
-       " (4, 2, 0, 1, 3, 5): (4, 2, 0, 1, 3, 5),\n",
-       " (4, 2, 0, 1, 5, 3): (4, 2, 0, 1, 5, 3),\n",
-       " (4, 2, 0, 3, 1, 5): (4, 2, 0, 3, 1, 5),\n",
-       " (4, 2, 0, 3, 5, 1): (4, 2, 0, 3, 5, 1),\n",
-       " (4, 2, 0, 5, 1, 3): (4, 2, 0, 5, 1, 3),\n",
-       " (4, 2, 0, 5, 3, 1): (4, 2, 0, 5, 3, 1),\n",
-       " (4, 2, 1, 0, 3, 5): (4, 2, 1, 0, 3, 5),\n",
-       " (4, 2, 1, 0, 5, 3): (4, 2, 1, 0, 5, 3),\n",
-       " (4, 2, 1, 3, 0, 5): (4, 2, 1, 3, 0, 5),\n",
-       " (4, 2, 1, 3, 5, 0): (4, 2, 1, 3, 5, 0),\n",
-       " (4, 2, 1, 5, 0, 3): (4, 2, 1, 5, 0, 3),\n",
-       " (4, 2, 1, 5, 3, 0): (4, 2, 1, 5, 3, 0),\n",
-       " (4, 2, 3, 0, 1, 5): (4, 2, 3, 0, 1, 5),\n",
-       " (4, 2, 3, 0, 5, 1): (4, 2, 3, 0, 5, 1),\n",
-       " (4, 2, 3, 1, 0, 5): (4, 2, 3, 1, 0, 5),\n",
-       " (4, 2, 3, 1, 5, 0): (4, 2, 3, 1, 5, 0),\n",
-       " (4, 2, 3, 5, 0, 1): (4, 2, 3, 5, 0, 1),\n",
-       " (4, 2, 3, 5, 1, 0): (4, 2, 3, 5, 1, 0),\n",
-       " (4, 2, 5, 0, 1, 3): (4, 2, 5, 0, 1, 3),\n",
-       " (4, 2, 5, 0, 3, 1): (4, 2, 5, 0, 3, 1),\n",
-       " (4, 2, 5, 1, 0, 3): (4, 2, 5, 1, 0, 3),\n",
-       " (4, 2, 5, 1, 3, 0): (4, 2, 5, 1, 3, 0),\n",
-       " (4, 2, 5, 3, 0, 1): (4, 2, 5, 3, 0, 1),\n",
-       " (4, 2, 5, 3, 1, 0): (4, 2, 5, 3, 1, 0),\n",
-       " (4, 3, 0, 1, 2, 5): (4, 3, 0, 1, 2, 5),\n",
-       " (4, 3, 0, 1, 5, 2): (4, 3, 0, 1, 5, 2),\n",
-       " (4, 3, 0, 2, 1, 5): (4, 3, 0, 2, 1, 5),\n",
-       " (4, 3, 0, 2, 5, 1): (4, 3, 0, 2, 5, 1),\n",
-       " (4, 3, 0, 5, 1, 2): (4, 3, 0, 5, 1, 2),\n",
-       " (4, 3, 0, 5, 2, 1): (4, 3, 0, 5, 2, 1),\n",
-       " (4, 3, 1, 0, 2, 5): (4, 3, 1, 0, 2, 5),\n",
-       " (4, 3, 1, 0, 5, 2): (4, 3, 1, 0, 5, 2),\n",
-       " (4, 3, 1, 2, 0, 5): (4, 3, 1, 2, 0, 5),\n",
-       " (4, 3, 1, 2, 5, 0): (4, 3, 1, 2, 5, 0),\n",
-       " (4, 3, 1, 5, 0, 2): (4, 3, 1, 5, 0, 2),\n",
-       " (4, 3, 1, 5, 2, 0): (4, 3, 1, 5, 2, 0),\n",
-       " (4, 3, 2, 0, 1, 5): (4, 3, 2, 0, 1, 5),\n",
-       " (4, 3, 2, 0, 5, 1): (4, 3, 2, 0, 5, 1),\n",
-       " (4, 3, 2, 1, 0, 5): (4, 3, 2, 1, 0, 5),\n",
-       " (4, 3, 2, 1, 5, 0): (4, 3, 2, 1, 5, 0),\n",
-       " (4, 3, 2, 5, 0, 1): (4, 3, 2, 5, 0, 1),\n",
-       " (4, 3, 2, 5, 1, 0): (4, 3, 2, 5, 1, 0),\n",
-       " (4, 3, 5, 0, 1, 2): (4, 3, 5, 0, 1, 2),\n",
-       " (4, 3, 5, 0, 2, 1): (4, 3, 5, 0, 2, 1),\n",
-       " (4, 3, 5, 1, 0, 2): (4, 3, 5, 1, 0, 2),\n",
-       " (4, 3, 5, 1, 2, 0): (4, 3, 5, 1, 2, 0),\n",
-       " (4, 3, 5, 2, 0, 1): (4, 3, 5, 2, 0, 1),\n",
-       " (4, 3, 5, 2, 1, 0): (4, 3, 5, 2, 1, 0),\n",
-       " (4, 5, 0, 1, 2, 3): (4, 5, 0, 1, 2, 3),\n",
-       " (4, 5, 0, 1, 3, 2): (4, 5, 0, 1, 3, 2),\n",
-       " (4, 5, 0, 2, 1, 3): (4, 5, 0, 2, 1, 3),\n",
-       " (4, 5, 0, 2, 3, 1): (4, 5, 0, 2, 3, 1),\n",
-       " (4, 5, 0, 3, 1, 2): (4, 5, 0, 3, 1, 2),\n",
-       " (4, 5, 0, 3, 2, 1): (4, 5, 0, 3, 2, 1),\n",
-       " (4, 5, 1, 0, 2, 3): (4, 5, 1, 0, 2, 3),\n",
-       " (4, 5, 1, 0, 3, 2): (4, 5, 1, 0, 3, 2),\n",
-       " (4, 5, 1, 2, 0, 3): (4, 5, 1, 2, 0, 3),\n",
-       " (4, 5, 1, 2, 3, 0): (4, 5, 1, 2, 3, 0),\n",
-       " (4, 5, 1, 3, 0, 2): (4, 5, 1, 3, 0, 2),\n",
-       " (4, 5, 1, 3, 2, 0): (4, 5, 1, 3, 2, 0),\n",
-       " (4, 5, 2, 0, 1, 3): (4, 5, 2, 0, 1, 3),\n",
-       " (4, 5, 2, 0, 3, 1): (4, 5, 2, 0, 3, 1),\n",
-       " (4, 5, 2, 1, 0, 3): (4, 5, 2, 1, 0, 3),\n",
-       " (4, 5, 2, 1, 3, 0): (4, 5, 2, 1, 3, 0),\n",
-       " (4, 5, 2, 3, 0, 1): (4, 5, 2, 3, 0, 1),\n",
-       " (4, 5, 2, 3, 1, 0): (4, 5, 2, 3, 1, 0),\n",
-       " (4, 5, 3, 0, 1, 2): (4, 5, 3, 0, 1, 2),\n",
-       " (4, 5, 3, 0, 2, 1): (4, 5, 3, 0, 2, 1),\n",
-       " (4, 5, 3, 1, 0, 2): (4, 5, 3, 1, 0, 2),\n",
-       " (4, 5, 3, 1, 2, 0): (4, 5, 3, 1, 2, 0),\n",
-       " (4, 5, 3, 2, 0, 1): (4, 5, 3, 2, 0, 1),\n",
-       " (4, 5, 3, 2, 1, 0): (4, 5, 3, 2, 1, 0),\n",
-       " (5, 0, 1, 2, 3, 4): (5, 0, 1, 2, 3, 4),\n",
-       " (5, 0, 1, 2, 4, 3): (5, 0, 1, 2, 4, 3),\n",
-       " (5, 0, 1, 3, 2, 4): (5, 0, 1, 3, 2, 4),\n",
-       " (5, 0, 1, 3, 4, 2): (5, 0, 1, 3, 4, 2),\n",
-       " (5, 0, 1, 4, 2, 3): (5, 0, 1, 4, 2, 3),\n",
-       " (5, 0, 1, 4, 3, 2): (5, 0, 1, 4, 3, 2),\n",
-       " (5, 0, 2, 1, 3, 4): (5, 0, 2, 1, 3, 4),\n",
-       " (5, 0, 2, 1, 4, 3): (5, 0, 2, 1, 4, 3),\n",
-       " (5, 0, 2, 3, 1, 4): (5, 0, 2, 3, 1, 4),\n",
-       " (5, 0, 2, 3, 4, 1): (5, 0, 2, 3, 4, 1),\n",
-       " (5, 0, 2, 4, 1, 3): (5, 0, 2, 4, 1, 3),\n",
-       " (5, 0, 2, 4, 3, 1): (5, 0, 2, 4, 3, 1),\n",
-       " (5, 0, 3, 1, 2, 4): (5, 0, 3, 1, 2, 4),\n",
-       " (5, 0, 3, 1, 4, 2): (5, 0, 3, 1, 4, 2),\n",
-       " (5, 0, 3, 2, 1, 4): (5, 0, 3, 2, 1, 4),\n",
-       " (5, 0, 3, 2, 4, 1): (5, 0, 3, 2, 4, 1),\n",
-       " (5, 0, 3, 4, 1, 2): (5, 0, 3, 4, 1, 2),\n",
-       " (5, 0, 3, 4, 2, 1): (5, 0, 3, 4, 2, 1),\n",
-       " (5, 0, 4, 1, 2, 3): (5, 0, 4, 1, 2, 3),\n",
-       " (5, 0, 4, 1, 3, 2): (5, 0, 4, 1, 3, 2),\n",
-       " (5, 0, 4, 2, 1, 3): (5, 0, 4, 2, 1, 3),\n",
-       " (5, 0, 4, 2, 3, 1): (5, 0, 4, 2, 3, 1),\n",
-       " (5, 0, 4, 3, 1, 2): (5, 0, 4, 3, 1, 2),\n",
-       " (5, 0, 4, 3, 2, 1): (5, 0, 4, 3, 2, 1),\n",
-       " (5, 1, 0, 2, 3, 4): (5, 1, 0, 2, 3, 4),\n",
-       " (5, 1, 0, 2, 4, 3): (5, 1, 0, 2, 4, 3),\n",
-       " (5, 1, 0, 3, 2, 4): (5, 1, 0, 3, 2, 4),\n",
-       " (5, 1, 0, 3, 4, 2): (5, 1, 0, 3, 4, 2),\n",
-       " (5, 1, 0, 4, 2, 3): (5, 1, 0, 4, 2, 3),\n",
-       " (5, 1, 0, 4, 3, 2): (5, 1, 0, 4, 3, 2),\n",
-       " (5, 1, 2, 0, 3, 4): (5, 1, 2, 0, 3, 4),\n",
-       " (5, 1, 2, 0, 4, 3): (5, 1, 2, 0, 4, 3),\n",
-       " (5, 1, 2, 3, 0, 4): (5, 1, 2, 3, 0, 4),\n",
-       " (5, 1, 2, 3, 4, 0): (5, 1, 2, 3, 4, 0),\n",
-       " (5, 1, 2, 4, 0, 3): (5, 1, 2, 4, 0, 3),\n",
-       " (5, 1, 2, 4, 3, 0): (5, 1, 2, 4, 3, 0),\n",
-       " (5, 1, 3, 0, 2, 4): (5, 1, 3, 0, 2, 4),\n",
-       " (5, 1, 3, 0, 4, 2): (5, 1, 3, 0, 4, 2),\n",
-       " (5, 1, 3, 2, 0, 4): (5, 1, 3, 2, 0, 4),\n",
-       " (5, 1, 3, 2, 4, 0): (5, 1, 3, 2, 4, 0),\n",
-       " (5, 1, 3, 4, 0, 2): (5, 1, 3, 4, 0, 2),\n",
-       " (5, 1, 3, 4, 2, 0): (5, 1, 3, 4, 2, 0),\n",
-       " (5, 1, 4, 0, 2, 3): (5, 1, 4, 0, 2, 3),\n",
-       " (5, 1, 4, 0, 3, 2): (5, 1, 4, 0, 3, 2),\n",
-       " (5, 1, 4, 2, 0, 3): (5, 1, 4, 2, 0, 3),\n",
-       " (5, 1, 4, 2, 3, 0): (5, 1, 4, 2, 3, 0),\n",
-       " (5, 1, 4, 3, 0, 2): (5, 1, 4, 3, 0, 2),\n",
-       " (5, 1, 4, 3, 2, 0): (5, 1, 4, 3, 2, 0),\n",
-       " (5, 2, 0, 1, 3, 4): (5, 2, 0, 1, 3, 4),\n",
-       " (5, 2, 0, 1, 4, 3): (5, 2, 0, 1, 4, 3),\n",
-       " (5, 2, 0, 3, 1, 4): (5, 2, 0, 3, 1, 4),\n",
-       " (5, 2, 0, 3, 4, 1): (5, 2, 0, 3, 4, 1),\n",
-       " (5, 2, 0, 4, 1, 3): (5, 2, 0, 4, 1, 3),\n",
-       " (5, 2, 0, 4, 3, 1): (5, 2, 0, 4, 3, 1),\n",
-       " (5, 2, 1, 0, 3, 4): (5, 2, 1, 0, 3, 4),\n",
-       " (5, 2, 1, 0, 4, 3): (5, 2, 1, 0, 4, 3),\n",
-       " (5, 2, 1, 3, 0, 4): (5, 2, 1, 3, 0, 4),\n",
-       " (5, 2, 1, 3, 4, 0): (5, 2, 1, 3, 4, 0),\n",
-       " (5, 2, 1, 4, 0, 3): (5, 2, 1, 4, 0, 3),\n",
-       " (5, 2, 1, 4, 3, 0): (5, 2, 1, 4, 3, 0),\n",
-       " (5, 2, 3, 0, 1, 4): (5, 2, 3, 0, 1, 4),\n",
-       " (5, 2, 3, 0, 4, 1): (5, 2, 3, 0, 4, 1),\n",
-       " (5, 2, 3, 1, 0, 4): (5, 2, 3, 1, 0, 4),\n",
-       " (5, 2, 3, 1, 4, 0): (5, 2, 3, 1, 4, 0),\n",
-       " (5, 2, 3, 4, 0, 1): (5, 2, 3, 4, 0, 1),\n",
-       " (5, 2, 3, 4, 1, 0): (5, 2, 3, 4, 1, 0),\n",
-       " (5, 2, 4, 0, 1, 3): (5, 2, 4, 0, 1, 3),\n",
-       " (5, 2, 4, 0, 3, 1): (5, 2, 4, 0, 3, 1),\n",
-       " (5, 2, 4, 1, 0, 3): (5, 2, 4, 1, 0, 3),\n",
-       " (5, 2, 4, 1, 3, 0): (5, 2, 4, 1, 3, 0),\n",
-       " (5, 2, 4, 3, 0, 1): (5, 2, 4, 3, 0, 1),\n",
-       " (5, 2, 4, 3, 1, 0): (5, 2, 4, 3, 1, 0),\n",
-       " (5, 3, 0, 1, 2, 4): (5, 3, 0, 1, 2, 4),\n",
-       " (5, 3, 0, 1, 4, 2): (5, 3, 0, 1, 4, 2),\n",
-       " (5, 3, 0, 2, 1, 4): (5, 3, 0, 2, 1, 4),\n",
-       " (5, 3, 0, 2, 4, 1): (5, 3, 0, 2, 4, 1),\n",
-       " (5, 3, 0, 4, 1, 2): (5, 3, 0, 4, 1, 2),\n",
-       " (5, 3, 0, 4, 2, 1): (5, 3, 0, 4, 2, 1),\n",
-       " (5, 3, 1, 0, 2, 4): (5, 3, 1, 0, 2, 4),\n",
-       " (5, 3, 1, 0, 4, 2): (5, 3, 1, 0, 4, 2),\n",
-       " (5, 3, 1, 2, 0, 4): (5, 3, 1, 2, 0, 4),\n",
-       " (5, 3, 1, 2, 4, 0): (5, 3, 1, 2, 4, 0),\n",
-       " (5, 3, 1, 4, 0, 2): (5, 3, 1, 4, 0, 2),\n",
-       " (5, 3, 1, 4, 2, 0): (5, 3, 1, 4, 2, 0),\n",
-       " (5, 3, 2, 0, 1, 4): (5, 3, 2, 0, 1, 4),\n",
-       " (5, 3, 2, 0, 4, 1): (5, 3, 2, 0, 4, 1),\n",
-       " (5, 3, 2, 1, 0, 4): (5, 3, 2, 1, 0, 4),\n",
-       " (5, 3, 2, 1, 4, 0): (5, 3, 2, 1, 4, 0),\n",
-       " (5, 3, 2, 4, 0, 1): (5, 3, 2, 4, 0, 1),\n",
-       " (5, 3, 2, 4, 1, 0): (5, 3, 2, 4, 1, 0),\n",
-       " (5, 3, 4, 0, 1, 2): (5, 3, 4, 0, 1, 2),\n",
-       " (5, 3, 4, 0, 2, 1): (5, 3, 4, 0, 2, 1),\n",
-       " (5, 3, 4, 1, 0, 2): (5, 3, 4, 1, 0, 2),\n",
-       " (5, 3, 4, 1, 2, 0): (5, 3, 4, 1, 2, 0),\n",
-       " (5, 3, 4, 2, 0, 1): (5, 3, 4, 2, 0, 1),\n",
-       " (5, 3, 4, 2, 1, 0): (5, 3, 4, 2, 1, 0),\n",
-       " (5, 4, 0, 1, 2, 3): (5, 4, 0, 1, 2, 3),\n",
-       " (5, 4, 0, 1, 3, 2): (5, 4, 0, 1, 3, 2),\n",
-       " (5, 4, 0, 2, 1, 3): (5, 4, 0, 2, 1, 3),\n",
-       " (5, 4, 0, 2, 3, 1): (5, 4, 0, 2, 3, 1),\n",
-       " (5, 4, 0, 3, 1, 2): (5, 4, 0, 3, 1, 2),\n",
-       " (5, 4, 0, 3, 2, 1): (5, 4, 0, 3, 2, 1),\n",
-       " (5, 4, 1, 0, 2, 3): (5, 4, 1, 0, 2, 3),\n",
-       " (5, 4, 1, 0, 3, 2): (5, 4, 1, 0, 3, 2),\n",
-       " (5, 4, 1, 2, 0, 3): (5, 4, 1, 2, 0, 3),\n",
-       " (5, 4, 1, 2, 3, 0): (5, 4, 1, 2, 3, 0),\n",
-       " (5, 4, 1, 3, 0, 2): (5, 4, 1, 3, 0, 2),\n",
-       " (5, 4, 1, 3, 2, 0): (5, 4, 1, 3, 2, 0),\n",
-       " (5, 4, 2, 0, 1, 3): (5, 4, 2, 0, 1, 3),\n",
-       " (5, 4, 2, 0, 3, 1): (5, 4, 2, 0, 3, 1),\n",
-       " (5, 4, 2, 1, 0, 3): (5, 4, 2, 1, 0, 3),\n",
-       " (5, 4, 2, 1, 3, 0): (5, 4, 2, 1, 3, 0),\n",
-       " (5, 4, 2, 3, 0, 1): (5, 4, 2, 3, 0, 1),\n",
-       " (5, 4, 2, 3, 1, 0): (5, 4, 2, 3, 1, 0),\n",
-       " (5, 4, 3, 0, 1, 2): (5, 4, 3, 0, 1, 2),\n",
-       " (5, 4, 3, 0, 2, 1): (5, 4, 3, 0, 2, 1),\n",
-       " (5, 4, 3, 1, 0, 2): (5, 4, 3, 1, 0, 2),\n",
-       " (5, 4, 3, 1, 2, 0): (5, 4, 3, 1, 2, 0),\n",
-       " (5, 4, 3, 2, 0, 1): (5, 4, 3, 2, 0, 1),\n",
-       " (5, 4, 3, 2, 1, 0): (5, 4, 3, 2, 1, 0)}"
-      ]
-     },
-     "execution_count": 16,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "transpositions6 = {t: t for t in set(itertools.permutations(list(range(6))))}\n",
-    "transpositions6"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 17,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(((2, 4, 3, 5, 0, 1), (1, 2), <AmscoFillStyle.reverse_each_row: 3>),\n",
-       " -1437.9908206760847)"
-      ]
-     },
-     "execution_count": 17,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "key_b, score = amsco_break(c7b, translist=transpositions6)\n",
-    "key_b, score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 18,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "[[AmscoSlice(index=0, start=0, end=1),\n",
-       "  AmscoSlice(index=1, start=1, end=3),\n",
-       "  AmscoSlice(index=2, start=3, end=4),\n",
-       "  AmscoSlice(index=3, start=4, end=6),\n",
-       "  AmscoSlice(index=4, start=6, end=7),\n",
-       "  AmscoSlice(index=5, start=7, end=9)],\n",
-       " [AmscoSlice(index=6, start=9, end=11),\n",
-       "  AmscoSlice(index=7, start=11, end=12),\n",
-       "  AmscoSlice(index=8, start=12, end=14),\n",
-       "  AmscoSlice(index=9, start=14, end=15),\n",
-       "  AmscoSlice(index=10, start=15, end=17),\n",
-       "  AmscoSlice(index=11, start=17, end=18)],\n",
-       " [AmscoSlice(index=12, start=18, end=19),\n",
-       "  AmscoSlice(index=13, start=19, end=21),\n",
-       "  AmscoSlice(index=14, start=21, end=22),\n",
-       "  AmscoSlice(index=15, start=22, end=24),\n",
-       "  AmscoSlice(index=16, start=24, end=25),\n",
-       "  AmscoSlice(index=17, start=25, end=27)],\n",
-       " [AmscoSlice(index=18, start=27, end=29),\n",
-       "  AmscoSlice(index=19, start=29, end=30),\n",
-       "  AmscoSlice(index=20, start=30, end=32),\n",
-       "  AmscoSlice(index=21, start=32, end=33),\n",
-       "  AmscoSlice(index=22, start=33, end=35),\n",
-       "  AmscoSlice(index=23, start=35, end=36)],\n",
-       " [AmscoSlice(index=24, start=36, end=37),\n",
-       "  AmscoSlice(index=25, start=37, end=39),\n",
-       "  AmscoSlice(index=26, start=39, end=40),\n",
-       "  AmscoSlice(index=27, start=40, end=42),\n",
-       "  AmscoSlice(index=28, start=42, end=43),\n",
-       "  AmscoSlice(index=29, start=43, end=45)],\n",
-       " [AmscoSlice(index=30, start=45, end=47),\n",
-       "  AmscoSlice(index=31, start=47, end=48),\n",
-       "  AmscoSlice(index=32, start=48, end=50),\n",
-       "  AmscoSlice(index=33, start=50, end=51),\n",
-       "  AmscoSlice(index=34, start=51, end=53),\n",
-       "  AmscoSlice(index=35, start=53, end=54)],\n",
-       " [AmscoSlice(index=36, start=54, end=55),\n",
-       "  AmscoSlice(index=37, start=55, end=57),\n",
-       "  AmscoSlice(index=38, start=57, end=58),\n",
-       "  AmscoSlice(index=39, start=58, end=60),\n",
-       "  AmscoSlice(index=40, start=60, end=61),\n",
-       "  AmscoSlice(index=41, start=61, end=63)],\n",
-       " [AmscoSlice(index=42, start=63, end=65),\n",
-       "  AmscoSlice(index=43, start=65, end=66),\n",
-       "  AmscoSlice(index=44, start=66, end=68),\n",
-       "  AmscoSlice(index=45, start=68, end=69),\n",
-       "  AmscoSlice(index=46, start=69, end=71),\n",
-       "  AmscoSlice(index=47, start=71, end=72)],\n",
-       " [AmscoSlice(index=48, start=72, end=73),\n",
-       "  AmscoSlice(index=49, start=73, end=75),\n",
-       "  AmscoSlice(index=50, start=75, end=76),\n",
-       "  AmscoSlice(index=51, start=76, end=78),\n",
-       "  AmscoSlice(index=52, start=78, end=79),\n",
-       "  AmscoSlice(index=53, start=79, end=81)],\n",
-       " [AmscoSlice(index=54, start=81, end=83),\n",
-       "  AmscoSlice(index=55, start=83, end=84),\n",
-       "  AmscoSlice(index=56, start=84, end=86),\n",
-       "  AmscoSlice(index=57, start=86, end=87),\n",
-       "  AmscoSlice(index=58, start=87, end=89),\n",
-       "  AmscoSlice(index=59, start=89, end=90)],\n",
-       " [AmscoSlice(index=60, start=90, end=91),\n",
-       "  AmscoSlice(index=61, start=91, end=93),\n",
-       "  AmscoSlice(index=62, start=93, end=94),\n",
-       "  AmscoSlice(index=63, start=94, end=96),\n",
-       "  AmscoSlice(index=64, start=96, end=97),\n",
-       "  AmscoSlice(index=65, start=97, end=99)],\n",
-       " [AmscoSlice(index=66, start=99, end=101),\n",
-       "  AmscoSlice(index=67, start=101, end=102),\n",
-       "  AmscoSlice(index=68, start=102, end=104),\n",
-       "  AmscoSlice(index=69, start=104, end=105),\n",
-       "  AmscoSlice(index=70, start=105, end=107),\n",
-       "  AmscoSlice(index=71, start=107, end=108)],\n",
-       " [AmscoSlice(index=72, start=108, end=109),\n",
-       "  AmscoSlice(index=73, start=109, end=111),\n",
-       "  AmscoSlice(index=74, start=111, end=112),\n",
-       "  AmscoSlice(index=75, start=112, end=114),\n",
-       "  AmscoSlice(index=76, start=114, end=115),\n",
-       "  AmscoSlice(index=77, start=115, end=117)],\n",
-       " [AmscoSlice(index=78, start=117, end=119),\n",
-       "  AmscoSlice(index=79, start=119, end=120),\n",
-       "  AmscoSlice(index=80, start=120, end=122),\n",
-       "  AmscoSlice(index=81, start=122, end=123),\n",
-       "  AmscoSlice(index=82, start=123, end=125),\n",
-       "  AmscoSlice(index=83, start=125, end=126)],\n",
-       " [AmscoSlice(index=84, start=126, end=127),\n",
-       "  AmscoSlice(index=85, start=127, end=129),\n",
-       "  AmscoSlice(index=86, start=129, end=130),\n",
-       "  AmscoSlice(index=87, start=130, end=132),\n",
-       "  AmscoSlice(index=88, start=132, end=133),\n",
-       "  AmscoSlice(index=89, start=133, end=135)],\n",
-       " [AmscoSlice(index=90, start=135, end=137),\n",
-       "  AmscoSlice(index=91, start=137, end=138),\n",
-       "  AmscoSlice(index=92, start=138, end=140),\n",
-       "  AmscoSlice(index=93, start=140, end=141),\n",
-       "  AmscoSlice(index=94, start=141, end=143),\n",
-       "  AmscoSlice(index=95, start=143, end=144)],\n",
-       " [AmscoSlice(index=96, start=144, end=145),\n",
-       "  AmscoSlice(index=97, start=145, end=147),\n",
-       "  AmscoSlice(index=98, start=147, end=148),\n",
-       "  AmscoSlice(index=99, start=148, end=150),\n",
-       "  AmscoSlice(index=100, start=150, end=151),\n",
-       "  AmscoSlice(index=101, start=151, end=153)],\n",
-       " [AmscoSlice(index=102, start=153, end=155),\n",
-       "  AmscoSlice(index=103, start=155, end=156),\n",
-       "  AmscoSlice(index=104, start=156, end=158),\n",
-       "  AmscoSlice(index=105, start=158, end=159),\n",
-       "  AmscoSlice(index=106, start=159, end=161),\n",
-       "  AmscoSlice(index=107, start=161, end=162)],\n",
-       " [AmscoSlice(index=108, start=162, end=163),\n",
-       "  AmscoSlice(index=109, start=163, end=165),\n",
-       "  AmscoSlice(index=110, start=165, end=166),\n",
-       "  AmscoSlice(index=111, start=166, end=168),\n",
-       "  AmscoSlice(index=112, start=168, end=169),\n",
-       "  AmscoSlice(index=113, start=169, end=171)],\n",
-       " [AmscoSlice(index=114, start=171, end=173),\n",
-       "  AmscoSlice(index=115, start=173, end=174),\n",
-       "  AmscoSlice(index=116, start=174, end=176),\n",
-       "  AmscoSlice(index=117, start=176, end=177),\n",
-       "  AmscoSlice(index=118, start=177, end=179),\n",
-       "  AmscoSlice(index=119, start=179, end=180)],\n",
-       " [AmscoSlice(index=120, start=180, end=181),\n",
-       "  AmscoSlice(index=121, start=181, end=183),\n",
-       "  AmscoSlice(index=122, start=183, end=184),\n",
-       "  AmscoSlice(index=123, start=184, end=186),\n",
-       "  AmscoSlice(index=124, start=186, end=187),\n",
-       "  AmscoSlice(index=125, start=187, end=189)],\n",
-       " [AmscoSlice(index=126, start=189, end=191),\n",
-       "  AmscoSlice(index=127, start=191, end=192),\n",
-       "  AmscoSlice(index=128, start=192, end=194),\n",
-       "  AmscoSlice(index=129, start=194, end=195),\n",
-       "  AmscoSlice(index=130, start=195, end=197),\n",
-       "  AmscoSlice(index=131, start=197, end=198)],\n",
-       " [AmscoSlice(index=132, start=198, end=199),\n",
-       "  AmscoSlice(index=133, start=199, end=201),\n",
-       "  AmscoSlice(index=134, start=201, end=202),\n",
-       "  AmscoSlice(index=135, start=202, end=204),\n",
-       "  AmscoSlice(index=136, start=204, end=205),\n",
-       "  AmscoSlice(index=137, start=205, end=207)],\n",
-       " [AmscoSlice(index=138, start=207, end=209),\n",
-       "  AmscoSlice(index=139, start=209, end=210),\n",
-       "  AmscoSlice(index=140, start=210, end=212),\n",
-       "  AmscoSlice(index=141, start=212, end=213),\n",
-       "  AmscoSlice(index=142, start=213, end=215),\n",
-       "  AmscoSlice(index=143, start=215, end=216)],\n",
-       " [AmscoSlice(index=144, start=216, end=217),\n",
-       "  AmscoSlice(index=145, start=217, end=219),\n",
-       "  AmscoSlice(index=146, start=219, end=220),\n",
-       "  AmscoSlice(index=147, start=220, end=222),\n",
-       "  AmscoSlice(index=148, start=222, end=223),\n",
-       "  AmscoSlice(index=149, start=223, end=225)],\n",
-       " [AmscoSlice(index=150, start=225, end=227),\n",
-       "  AmscoSlice(index=151, start=227, end=228),\n",
-       "  AmscoSlice(index=152, start=228, end=230),\n",
-       "  AmscoSlice(index=153, start=230, end=231),\n",
-       "  AmscoSlice(index=154, start=231, end=233),\n",
-       "  AmscoSlice(index=155, start=233, end=234)],\n",
-       " [AmscoSlice(index=156, start=234, end=235),\n",
-       "  AmscoSlice(index=157, start=235, end=237),\n",
-       "  AmscoSlice(index=158, start=237, end=238),\n",
-       "  AmscoSlice(index=159, start=238, end=240),\n",
-       "  AmscoSlice(index=160, start=240, end=241),\n",
-       "  AmscoSlice(index=161, start=241, end=243)],\n",
-       " [AmscoSlice(index=162, start=243, end=245),\n",
-       "  AmscoSlice(index=163, start=245, end=246),\n",
-       "  AmscoSlice(index=164, start=246, end=248),\n",
-       "  AmscoSlice(index=165, start=248, end=249),\n",
-       "  AmscoSlice(index=166, start=249, end=251),\n",
-       "  AmscoSlice(index=167, start=251, end=252)],\n",
-       " [AmscoSlice(index=168, start=252, end=253),\n",
-       "  AmscoSlice(index=169, start=253, end=255),\n",
-       "  AmscoSlice(index=170, start=255, end=256),\n",
-       "  AmscoSlice(index=171, start=256, end=258),\n",
-       "  AmscoSlice(index=172, start=258, end=259),\n",
-       "  AmscoSlice(index=173, start=259, end=261)],\n",
-       " [AmscoSlice(index=174, start=261, end=263),\n",
-       "  AmscoSlice(index=175, start=263, end=264),\n",
-       "  AmscoSlice(index=176, start=264, end=266),\n",
-       "  AmscoSlice(index=177, start=266, end=267),\n",
-       "  AmscoSlice(index=178, start=267, end=269),\n",
-       "  AmscoSlice(index=179, start=269, end=270)],\n",
-       " [AmscoSlice(index=180, start=270, end=271),\n",
-       "  AmscoSlice(index=181, start=271, end=273),\n",
-       "  AmscoSlice(index=182, start=273, end=274),\n",
-       "  AmscoSlice(index=183, start=274, end=276),\n",
-       "  AmscoSlice(index=184, start=276, end=277),\n",
-       "  AmscoSlice(index=185, start=277, end=279)],\n",
-       " [AmscoSlice(index=186, start=279, end=281),\n",
-       "  AmscoSlice(index=187, start=281, end=282),\n",
-       "  AmscoSlice(index=188, start=282, end=284),\n",
-       "  AmscoSlice(index=189, start=284, end=285),\n",
-       "  AmscoSlice(index=190, start=285, end=287),\n",
-       "  AmscoSlice(index=191, start=287, end=288)],\n",
-       " [AmscoSlice(index=192, start=288, end=289),\n",
-       "  AmscoSlice(index=193, start=289, end=291),\n",
-       "  AmscoSlice(index=194, start=291, end=292),\n",
-       "  AmscoSlice(index=195, start=292, end=294),\n",
-       "  AmscoSlice(index=196, start=294, end=295),\n",
-       "  AmscoSlice(index=197, start=295, end=297)],\n",
-       " [AmscoSlice(index=198, start=297, end=299),\n",
-       "  AmscoSlice(index=199, start=299, end=300),\n",
-       "  AmscoSlice(index=200, start=300, end=302),\n",
-       "  AmscoSlice(index=201, start=302, end=303),\n",
-       "  AmscoSlice(index=202, start=303, end=305),\n",
-       "  AmscoSlice(index=203, start=305, end=306)],\n",
-       " [AmscoSlice(index=204, start=306, end=307),\n",
-       "  AmscoSlice(index=205, start=307, end=309),\n",
-       "  AmscoSlice(index=206, start=309, end=310),\n",
-       "  AmscoSlice(index=207, start=310, end=312),\n",
-       "  AmscoSlice(index=208, start=312, end=313),\n",
-       "  AmscoSlice(index=209, start=313, end=315)],\n",
-       " [AmscoSlice(index=210, start=315, end=317),\n",
-       "  AmscoSlice(index=211, start=317, end=318),\n",
-       "  AmscoSlice(index=212, start=318, end=320),\n",
-       "  AmscoSlice(index=213, start=320, end=321),\n",
-       "  AmscoSlice(index=214, start=321, end=323),\n",
-       "  AmscoSlice(index=215, start=323, end=324)],\n",
-       " [AmscoSlice(index=216, start=324, end=325),\n",
-       "  AmscoSlice(index=217, start=325, end=327),\n",
-       "  AmscoSlice(index=218, start=327, end=328),\n",
-       "  AmscoSlice(index=219, start=328, end=330),\n",
-       "  AmscoSlice(index=220, start=330, end=331),\n",
-       "  AmscoSlice(index=221, start=331, end=333)],\n",
-       " [AmscoSlice(index=222, start=333, end=335),\n",
-       "  AmscoSlice(index=223, start=335, end=336),\n",
-       "  AmscoSlice(index=224, start=336, end=338),\n",
-       "  AmscoSlice(index=225, start=338, end=339),\n",
-       "  AmscoSlice(index=226, start=339, end=341),\n",
-       "  AmscoSlice(index=227, start=341, end=342)],\n",
-       " [AmscoSlice(index=228, start=342, end=343),\n",
-       "  AmscoSlice(index=229, start=343, end=345),\n",
-       "  AmscoSlice(index=230, start=345, end=346),\n",
-       "  AmscoSlice(index=231, start=346, end=348),\n",
-       "  AmscoSlice(index=232, start=348, end=349),\n",
-       "  AmscoSlice(index=233, start=349, end=351)],\n",
-       " [AmscoSlice(index=234, start=351, end=353),\n",
-       "  AmscoSlice(index=235, start=353, end=354),\n",
-       "  AmscoSlice(index=236, start=354, end=356),\n",
-       "  AmscoSlice(index=237, start=356, end=357),\n",
-       "  AmscoSlice(index=238, start=357, end=359),\n",
-       "  AmscoSlice(index=239, start=359, end=360)],\n",
-       " [AmscoSlice(index=240, start=360, end=361),\n",
-       "  AmscoSlice(index=241, start=361, end=363),\n",
-       "  AmscoSlice(index=242, start=363, end=364),\n",
-       "  AmscoSlice(index=243, start=364, end=366),\n",
-       "  AmscoSlice(index=244, start=366, end=367),\n",
-       "  AmscoSlice(index=245, start=367, end=369)],\n",
-       " [AmscoSlice(index=246, start=369, end=371),\n",
-       "  AmscoSlice(index=247, start=371, end=372),\n",
-       "  AmscoSlice(index=248, start=372, end=374),\n",
-       "  AmscoSlice(index=249, start=374, end=375),\n",
-       "  AmscoSlice(index=250, start=375, end=377),\n",
-       "  AmscoSlice(index=251, start=377, end=378)],\n",
-       " [AmscoSlice(index=252, start=378, end=379),\n",
-       "  AmscoSlice(index=253, start=379, end=381),\n",
-       "  AmscoSlice(index=254, start=381, end=382),\n",
-       "  AmscoSlice(index=255, start=382, end=384),\n",
-       "  AmscoSlice(index=256, start=384, end=385),\n",
-       "  AmscoSlice(index=257, start=385, end=387)],\n",
-       " [AmscoSlice(index=258, start=387, end=389),\n",
-       "  AmscoSlice(index=259, start=389, end=390),\n",
-       "  AmscoSlice(index=260, start=390, end=392),\n",
-       "  AmscoSlice(index=261, start=392, end=393),\n",
-       "  AmscoSlice(index=262, start=393, end=395),\n",
-       "  AmscoSlice(index=263, start=395, end=396)],\n",
-       " [AmscoSlice(index=264, start=396, end=397),\n",
-       "  AmscoSlice(index=265, start=397, end=399),\n",
-       "  AmscoSlice(index=266, start=399, end=400),\n",
-       "  AmscoSlice(index=267, start=400, end=402),\n",
-       "  AmscoSlice(index=268, start=402, end=403),\n",
-       "  AmscoSlice(index=269, start=403, end=405)],\n",
-       " [AmscoSlice(index=270, start=405, end=407),\n",
-       "  AmscoSlice(index=271, start=407, end=408),\n",
-       "  AmscoSlice(index=272, start=408, end=410),\n",
-       "  AmscoSlice(index=273, start=410, end=411),\n",
-       "  AmscoSlice(index=274, start=411, end=413),\n",
-       "  AmscoSlice(index=275, start=413, end=414)],\n",
-       " [AmscoSlice(index=276, start=414, end=415),\n",
-       "  AmscoSlice(index=277, start=415, end=417),\n",
-       "  AmscoSlice(index=278, start=417, end=418),\n",
-       "  AmscoSlice(index=279, start=418, end=420),\n",
-       "  AmscoSlice(index=280, start=420, end=421),\n",
-       "  AmscoSlice(index=281, start=421, end=423)],\n",
-       " [AmscoSlice(index=282, start=423, end=425),\n",
-       "  AmscoSlice(index=283, start=425, end=426),\n",
-       "  AmscoSlice(index=284, start=426, end=428),\n",
-       "  AmscoSlice(index=285, start=428, end=429),\n",
-       "  AmscoSlice(index=286, start=429, end=431),\n",
-       "  AmscoSlice(index=287, start=431, end=432)],\n",
-       " [AmscoSlice(index=288, start=432, end=433),\n",
-       "  AmscoSlice(index=289, start=433, end=435),\n",
-       "  AmscoSlice(index=290, start=435, end=436),\n",
-       "  AmscoSlice(index=291, start=436, end=438),\n",
-       "  AmscoSlice(index=292, start=438, end=439),\n",
-       "  AmscoSlice(index=293, start=439, end=441)],\n",
-       " [AmscoSlice(index=294, start=441, end=443),\n",
-       "  AmscoSlice(index=295, start=443, end=444),\n",
-       "  AmscoSlice(index=296, start=444, end=446),\n",
-       "  AmscoSlice(index=297, start=446, end=447),\n",
-       "  AmscoSlice(index=298, start=447, end=449),\n",
-       "  AmscoSlice(index=299, start=449, end=450)],\n",
-       " [AmscoSlice(index=300, start=450, end=451),\n",
-       "  AmscoSlice(index=301, start=451, end=453),\n",
-       "  AmscoSlice(index=302, start=453, end=454),\n",
-       "  AmscoSlice(index=303, start=454, end=456),\n",
-       "  AmscoSlice(index=304, start=456, end=457),\n",
-       "  AmscoSlice(index=305, start=457, end=459)],\n",
-       " [AmscoSlice(index=306, start=459, end=461),\n",
-       "  AmscoSlice(index=307, start=461, end=462),\n",
-       "  AmscoSlice(index=308, start=462, end=464),\n",
-       "  AmscoSlice(index=309, start=464, end=465),\n",
-       "  AmscoSlice(index=310, start=465, end=467),\n",
-       "  AmscoSlice(index=311, start=467, end=468)],\n",
-       " [AmscoSlice(index=312, start=468, end=469),\n",
-       "  AmscoSlice(index=313, start=469, end=471),\n",
-       "  AmscoSlice(index=314, start=471, end=472),\n",
-       "  AmscoSlice(index=315, start=472, end=474),\n",
-       "  AmscoSlice(index=316, start=474, end=475),\n",
-       "  AmscoSlice(index=317, start=475, end=477)],\n",
-       " [AmscoSlice(index=318, start=477, end=479),\n",
-       "  AmscoSlice(index=319, start=479, end=480),\n",
-       "  AmscoSlice(index=320, start=480, end=482),\n",
-       "  AmscoSlice(index=321, start=482, end=483),\n",
-       "  AmscoSlice(index=322, start=483, end=485),\n",
-       "  AmscoSlice(index=323, start=485, end=486)],\n",
-       " [AmscoSlice(index=324, start=486, end=487),\n",
-       "  AmscoSlice(index=325, start=487, end=489),\n",
-       "  AmscoSlice(index=326, start=489, end=490),\n",
-       "  AmscoSlice(index=327, start=490, end=492),\n",
-       "  AmscoSlice(index=328, start=492, end=493),\n",
-       "  AmscoSlice(index=329, start=493, end=495)],\n",
-       " [AmscoSlice(index=330, start=495, end=497),\n",
-       "  AmscoSlice(index=331, start=497, end=498),\n",
-       "  AmscoSlice(index=332, start=498, end=500),\n",
-       "  AmscoSlice(index=333, start=500, end=501),\n",
-       "  AmscoSlice(index=334, start=501, end=503),\n",
-       "  AmscoSlice(index=335, start=503, end=504)],\n",
-       " [AmscoSlice(index=336, start=504, end=505),\n",
-       "  AmscoSlice(index=337, start=505, end=507),\n",
-       "  AmscoSlice(index=338, start=507, end=508),\n",
-       "  AmscoSlice(index=339, start=508, end=510),\n",
-       "  AmscoSlice(index=340, start=510, end=511),\n",
-       "  AmscoSlice(index=341, start=511, end=513)],\n",
-       " [AmscoSlice(index=342, start=513, end=515),\n",
-       "  AmscoSlice(index=343, start=515, end=516),\n",
-       "  AmscoSlice(index=344, start=516, end=518),\n",
-       "  AmscoSlice(index=345, start=518, end=519),\n",
-       "  AmscoSlice(index=346, start=519, end=521),\n",
-       "  AmscoSlice(index=347, start=521, end=522)],\n",
-       " [AmscoSlice(index=348, start=522, end=523),\n",
-       "  AmscoSlice(index=349, start=523, end=525),\n",
-       "  AmscoSlice(index=350, start=525, end=526),\n",
-       "  AmscoSlice(index=351, start=526, end=528),\n",
-       "  AmscoSlice(index=352, start=528, end=529),\n",
-       "  AmscoSlice(index=353, start=529, end=531)],\n",
-       " [AmscoSlice(index=354, start=531, end=533),\n",
-       "  AmscoSlice(index=355, start=533, end=534),\n",
-       "  AmscoSlice(index=356, start=534, end=536),\n",
-       "  AmscoSlice(index=357, start=536, end=537),\n",
-       "  AmscoSlice(index=358, start=537, end=539),\n",
-       "  AmscoSlice(index=359, start=539, end=540)],\n",
-       " [AmscoSlice(index=360, start=540, end=541),\n",
-       "  AmscoSlice(index=361, start=541, end=543),\n",
-       "  AmscoSlice(index=362, start=543, end=544),\n",
-       "  AmscoSlice(index=363, start=544, end=546),\n",
-       "  AmscoSlice(index=364, start=546, end=547),\n",
-       "  AmscoSlice(index=365, start=547, end=549)],\n",
-       " [AmscoSlice(index=366, start=549, end=551),\n",
-       "  AmscoSlice(index=367, start=551, end=552),\n",
-       "  AmscoSlice(index=368, start=552, end=554),\n",
-       "  AmscoSlice(index=369, start=554, end=555),\n",
-       "  AmscoSlice(index=370, start=555, end=557),\n",
-       "  AmscoSlice(index=371, start=557, end=558)],\n",
-       " [AmscoSlice(index=372, start=558, end=559),\n",
-       "  AmscoSlice(index=373, start=559, end=561),\n",
-       "  AmscoSlice(index=374, start=561, end=562),\n",
-       "  AmscoSlice(index=375, start=562, end=564),\n",
-       "  AmscoSlice(index=376, start=564, end=565),\n",
-       "  AmscoSlice(index=377, start=565, end=567)],\n",
-       " [AmscoSlice(index=378, start=567, end=569),\n",
-       "  AmscoSlice(index=379, start=569, end=570),\n",
-       "  AmscoSlice(index=380, start=570, end=572),\n",
-       "  AmscoSlice(index=381, start=572, end=573),\n",
-       "  AmscoSlice(index=382, start=573, end=575),\n",
-       "  AmscoSlice(index=383, start=575, end=576)],\n",
-       " [AmscoSlice(index=384, start=576, end=577),\n",
-       "  AmscoSlice(index=385, start=577, end=579),\n",
-       "  AmscoSlice(index=386, start=579, end=580),\n",
-       "  AmscoSlice(index=387, start=580, end=582),\n",
-       "  AmscoSlice(index=388, start=582, end=583),\n",
-       "  AmscoSlice(index=389, start=583, end=585)],\n",
-       " [AmscoSlice(index=390, start=585, end=587),\n",
-       "  AmscoSlice(index=391, start=587, end=588),\n",
-       "  AmscoSlice(index=392, start=588, end=590),\n",
-       "  AmscoSlice(index=393, start=590, end=591),\n",
-       "  AmscoSlice(index=394, start=591, end=593),\n",
-       "  AmscoSlice(index=395, start=593, end=594)],\n",
-       " [AmscoSlice(index=396, start=594, end=595),\n",
-       "  AmscoSlice(index=397, start=595, end=597),\n",
-       "  AmscoSlice(index=398, start=597, end=598),\n",
-       "  AmscoSlice(index=399, start=598, end=600),\n",
-       "  AmscoSlice(index=400, start=600, end=601),\n",
-       "  AmscoSlice(index=401, start=601, end=603)],\n",
-       " [AmscoSlice(index=402, start=603, end=605),\n",
-       "  AmscoSlice(index=403, start=605, end=606),\n",
-       "  AmscoSlice(index=404, start=606, end=608),\n",
-       "  AmscoSlice(index=405, start=608, end=609),\n",
-       "  AmscoSlice(index=406, start=609, end=611),\n",
-       "  AmscoSlice(index=407, start=611, end=612)]]"
-      ]
-     },
-     "execution_count": 18,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "amsco_transposition_positions(c7b, 'abcdef', \n",
-    "      fillpattern=(1, 2),\n",
-    "      fillstyle=AmscoFillStyle.reverse_each_row)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 19,
-   "metadata": {
-    "collapsed": false,
-    "scrolled": true
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "['stager',\n",
-       " 'staler',\n",
-       " 'stalin',\n",
-       " 'stamen',\n",
-       " 'sucker',\n",
-       " 'tucker',\n",
-       " 'twangs',\n",
-       " 'twerps',\n",
-       " 'twirls',\n",
-       " 'staffer',\n",
-       " 'stagers',\n",
-       " 'stagger',\n",
-       " 'stalins',\n",
-       " 'stamens',\n",
-       " 'stamina',\n",
-       " 'stammer',\n",
-       " 'statler',\n",
-       " 'suckers',\n",
-       " 'sudsier',\n",
-       " 'swagger',\n",
-       " 'tubbier',\n",
-       " 'tycoons',\n",
-       " 'loadable',\n",
-       " 'noblemen',\n",
-       " 'rubidium',\n",
-       " 'staffers',\n",
-       " 'staggers',\n",
-       " 'staminas',\n",
-       " 'stammers',\n",
-       " 'standard',\n",
-       " 'steelier',\n",
-       " 'submerse',\n",
-       " 'swaggers',\n",
-       " 'tubbiest',\n",
-       " 'tuitions',\n",
-       " 'twenties',\n",
-       " 'stalemate',\n",
-       " 'staleness',\n",
-       " 'stalinist',\n",
-       " 'stammerer',\n",
-       " 'standards',\n",
-       " 'submerses',\n",
-       " 'swaggerer',\n",
-       " 'stalemates',\n",
-       " 'stalenesss',\n",
-       " 'stammerers',\n",
-       " 'stepsister',\n",
-       " 'succulence',\n",
-       " 'statistical',\n",
-       " 'stepsisters',\n",
-       " 'succulences',\n",
-       " 'statistician',\n",
-       " 'statisticians']"
-      ]
-     },
-     "execution_count": 19,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "transpositions[key_b[0]]"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 20,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "security protocol solitaire comrades under a decree from moscow we are confined to using a new high security stream cipher stolen from the americans the solitaire cipher all files classified top secret and above are to be archived using this method this new field cipher has been tested and proven to match the security of the fi alka machine without the overhead of the technology you will need only a deck of cards to implement the cipher the key to be used will be provided and distributed on a one time pad and you must destroy the key as you use it the key consists of a random shuffle of a full deck of cards together with two distinguishable jokers agents should be freely able to carry this equipment without arousing suspicion\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(sanitise(\n",
-    "                amsco_transposition_decipher(sanitise(c7b), \n",
-    "                                             keyword=transpositions[key_b[0]][0], \n",
-    "                                             fillpattern=key_b[1],\n",
-    "                                             fillstyle=key_b[2])\n",
-    "            ))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {
-    "collapsed": true
-   },
-   "outputs": [],
-   "source": []
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.4.3"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/2015-challenge8.ipynb b/2015-challenge8.ipynb
deleted file mode 100644 (file)
index 90231b1..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": [
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from cipherbreak import *\n",
-    "\n",
-    "c8a = sanitise(open('2015/8a.ciphertext').read())\n",
-    "c8b = sanitise(open('2015/8b.ciphertext').read())"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 12,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "('charlie', -2104.8140749325567)"
-      ]
-     },
-     "execution_count": 12,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "key_a, score = vigenere_frequency_break(c8a)\n",
-    "key_a, score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 15,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "harry i am so sorry we went into the russian hq last night without you but the station chief wanted it to be his team that got the glory i am really grateful to you for coming back and putting us on the right track though the stolen file from soviet headquarters was as you expected encrypted with the solitaire cipher fortunately the cipher clerk who managed the encryption was incredibly careless i found a sheet of burnt paper in the bin which gave me a list of thirty eight cards and i am hoping that this is a large part of the key it will still be hard to break but maybe not impossible especially as the erased part was still intact there maybe another clue in that the page appears to have been torn from an economics textbook i found on the desk anyway i figure the chemists at langley may help us to reconstruct the whole key given time though i wouldnt expect them to manage more than one card a day given how careful they will have to be not to destroy the document it will take usa while to crack this but maybe time is on our side with christmas things seem to be quiet and i am hoping that within the next three weeks we may know precisely what the soviets were trying to do here whatever the outcome i think it is clear that the future of europe is not likely to be settled for a while i hear rumours everyday about shortages in the soviet bloc and border controls are going up in places you wouldnt expect to prevent largescale migration there are problems in greece and turkey and divisions between the british and french and the brits are having real trouble paying off their war debts whether or not we crack the reichs doktor mystery i think there is going to be plenty for you to do i know we had to work hard to persuade you to flyover but we really do need you here even the chief recognizes that so if i can i want to persuade you to stay francois and i are being posted to paris kind of a thankyou for our work on this project but icant go unless i know the berlin station has someone i trust hope youll agree to take the job charlie\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(vigenere_decipher(c8a, key_a))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {
-    "collapsed": true
-   },
-   "outputs": [],
-   "source": []
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.4.3"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/2015/2015-challenge1.ipynb b/2015/2015-challenge1.ipynb
new file mode 100644 (file)
index 0000000..7d73732
--- /dev/null
@@ -0,0 +1,143 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c1a = open('1a.ciphertext').read()\n",
+    "c1b = open('1b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(12, -883.4816832492597)"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = caesar_break(c1a)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "HARRY, SORRY TO DRAG YOU BACK IN , WE WERE HOPING TO GIVE YOU SOME TIME OFF AFTER THE LAST CASE, BUT SOMETHING CAME UP AND WE NEED YOUR HELP. \n",
+      "\n",
+      "AT A MEETING OF THE FOUR POWERS ALLIED CONTROL COUNCIL TWO WEEKS AGO THE FRENCH ACCUSED THE RUSSIANS OF SHELTERING A NAZI MEDIC KNOWN AS THE REICHSDOKTOR. APPARENTLY THEY INTERCEPTED A MORSE CODE RADIO BROADCAST FROM THE RUSSIAN SECTOR OF BERLIN IN WHICH THE DOCTOR WAS OFFERING INTELLIGENCE ABOUT THE RATLINES IN EXCHANGE FOR ASYLUM. THE RUSSIANS CLAIMED NOT TO KNOW ANYTHING ABOUT IT, AND MAYBE THEY ARE TELLING THE TRUTH, BUT THINGS HAVE BEEN A LITTLE FROSTY SINCE TRUMAN'S SPEECH ON MARCH TWELFTH AND WE REALLY DON'T NEED MORE CONFLICT RIGHT NOW. WE FIGURE WITH YOUR CONTACTS OVER HERE YOU MIGHT BE ABLE TO FIND OUT IF THE RUSSIANS ARE TELLING THE TRUTH. I HAVE ATTACHED THE ENCRYPTED TRANSCRIPT OF THE BROADCAST. \n",
+      "CHARLIE\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(caesar_decipher(c1a, key_a))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(14, -403.53308240183975)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = caesar_break(c1b)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "if you want to know the secret of the rat lines i maybe able to help but the price will be high and is not negotiable life herein berlin has lost its lustre and i want sanctuary in a more congenial climate with security for my future i can provide details of personnel policy security and routes and can furnish you with documentary evidence of the reach of the organization the reichs doktor\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(caesar_decipher(c1b, key_b)))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2015/2015-challenge2.ipynb b/2015/2015-challenge2.ipynb
new file mode 100644 (file)
index 0000000..7438ce2
--- /dev/null
@@ -0,0 +1,143 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c2a = open('2a.ciphertext').read()\n",
+    "c2b = open('2b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(15, -1150.5844346071483)"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = caesar_break(c2a)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "CHARLIE, NO NEED TO APOLOGISE, LIFE WAS GETTING DULL BEHIND A DESK AND I WAS GLAD TO HAVE AN EXCUSE TO FLY BACK TO EUROPE. I AM INTRIGUED ABOUT THE REICHSDOKTOR - I HADN'T COME ACROSS THIS BEFORE, WHEN DID YOU FIRST COME HEAR OF IT? \n",
+      "I THINK I MAY ALREADY BE MAKING SOME PROGRESS. ON ARRIVAL I FOUND A POSTCARD WAITING FOR ME ON THE MAT AT THE EMBASSY WITH NO MESSAGE ON IT . AT LEAST THAT'S WHAT IT LOOKED LIKE AT FIRST. I DID NOTICE THAT THE LETTERS ON THE FRONT COULD BE HIGHLIGHTED TO PICK OUT THE PHRASE THE REICHSDOKTOR SO UNLESS THAT IS AN EXTRAORDINARY COINCIDENCE I FIGURED IT MUST BE RELATED TO OUR INVESTIGATION. THE STRANGEST THING WAS THAT THE POSTCARD HAD A STAMP BUT NO POSTMARK ON IT, SO IT CAN'T HAVE BEEN POSTED. SINCE IT WASN'T SIGNED I ASSUME THEY WANTED TO STAY ANONYMOUS AND I COULDN'T SEE WHY THEY WOULD HAVE TAKEN THE RISK OF HAND DELIVERING IT, BUT IN THE END I WORKED IT OUT. THERE WAS A HIDDEN MESSAGE. I'LL LEAVE IT TO YOU TO FIGURE OUT WHERE IT WAS HIDDEN. ANYWAY I'VE ATTACHED THE MESSAGE I FOUND. I KNOW THAT RELATIONS WITH THREE OF THE FOUR POWERS ARE RELATIVELY STABLE, BUT I THINK WE NEED TO KEEP THIS TO OURSELVES FOR NOW. ALL THE BEST, \n",
+      "HARRY\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(caesar_decipher(c2a, key_a))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(21, -574.2402792119872)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = caesar_break(c2b)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "if you really want to get in the middle of this you will have to pay i know you will be hunting me and i can forgive the arrogance but i will not forgive your ignorance before you can learn more about the rat lines from me you will have to ask your colleagues in french and british intelligence what they already know powerful forces are working to keep the rat lines running and we both need to know who our enemies are before we can meet you should understand that without me your investigations will gain little negotiations with me may gain everything\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(caesar_decipher(c2b, key_b)))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2015/2015-challenge3.ipynb b/2015/2015-challenge3.ipynb
new file mode 100644 (file)
index 0000000..65deaa8
--- /dev/null
@@ -0,0 +1,141 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c3a = open('3a.ciphertext').read()\n",
+    "c3b = open('3b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "((3, 5, True), -901.37737042341)"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(key_a_m, key_a_a, key_a_o), score = affine_break(c3a)\n",
+    "(key_a_m, key_a_a, key_a_o), score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "HARRY, THE PUZZLE OF THE STAMPED POSTCARD HAD ME FOOLED FOR A WHILE, BUT I THINK I FIGURED IT OUT. WAS THE MESSAGE ON THE BACK OF THE STAMP? I AM GUESSING YOU STEAMED IT OFF AND FOUND IT THERE. IT WAS A PRETTY INGENIOUS PLOY. MY MASTERS BACK IN WASHINGTON ARE INCREASINGLY WORRIED ABOUT OUR RELATIONSHIP WITH THE REST OF THE FOUR POWERS. FOLLOWING THE BREAKDOWN IN TRUST WITH THE SOVIETS THEY ARE COUNTING ON THE UK AND FRANCE AS ALLIES. IF THEY ARE GOING BEHIND OUR BACKS WITH THIS REICHSDOKTOR, THAT DOES NOT BODE WELL FOR FUTURE DIPLOMACY. DO YOU HAVE CONTACTS THERE YOU CAN EXPLOIT TO FIND OUT WHAT THEY ARE INTENDING? WE REALLY CANNOT AFFORD TO FALL OUT RIGHT NOW. THE ATTACHED MESSAGE IS ANOTHER INTERCEPT, THIS TIME FROM THE BRITISH EMBASSY WIRELESS. WHILE THINGS ARE DICEY I DON’T FEEL I CAN ASK THEM ABOUT IT, MAYBE YOU COULD CRACK IT FOR US. DOES IT MENTION THE RATLINES? BEST, CHARLIE\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(affine_decipher(c3a, multiplier=key_a_m, adder=key_a_a, one_based=key_a_o))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "((5, 7, True), -574.5522852453349)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(key_b_m, key_b_a, key_b_o), score = affine_break(c3b)\n",
+    "(key_b_m, key_b_a, key_b_o), score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "eyes only rumours of a source in berlin with access to the rat lines source seems to go by name of reichs doktor russian intercepts suggest has been seen in vicinity of us embassy not clear how to make direct contact also not clear why our us friends are keeping this to themselves detailed info about rat i lines hard to obtain but high value could lead to arrest of major targets of nuremberg investigations vital we reach reichs doktor at earliest opportunity discreet enquiries in french and us sectors only request funds for further investigation\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(affine_decipher(c3b, multiplier=key_b_m, adder=key_b_a, one_based=key_b_o)))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2015/2015-challenge4.ipynb b/2015/2015-challenge4.ipynb
new file mode 100644 (file)
index 0000000..f2a1c9d
--- /dev/null
@@ -0,0 +1,363 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c4a = open('4a.ciphertext').read()\n",
+    "c4b = open('4b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('reanimates', <KeywordWrapAlphabet.from_last: 2>), -911.6411317751041)"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(key_a_word, key_a_wrap), score = keyword_break_mp(c4a)\n",
+    "(key_a_word, key_a_wrap), score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "gharlie, the attaghew note fas ledt in one od my weaw wrops last nibht anw appears to ce drom our mysterious sourge. it gontains tfo really sibnidigant pieges od intellibenge. the dirst is that the rieghswoktor mibht not reder to an inwiviwual adter all. it seems to ce the gowename dor the orbanization runninb the ratlines. aggorwinb to my other sourges this is a gollegtion od routes, abents anw sade houses usew to transport nazi sympathisers anw far griminals out od bermany anw on to south ameriga. fe have knofn that sugh an orbanisation exists singe the enw od the far, cut this is the dirst time i have seen it namew. the other piege od indormation is mugh more suctle. i am cebinninb to fonwer id our sourge is gloser to home than fe haw realisew. anw i am not rederrinb to drangois! see id you gan spot the tfo thinbs i notigew. cy the fay, fho transgricew the rawio intergept you sent me last feek? harry\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(keyword_decipher(c4a, key_a_word, wrap_alphabet=key_a_wrap))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'a': 'c',\n",
+       " 'b': 'o',\n",
+       " 'c': 'p',\n",
+       " 'd': 'q',\n",
+       " 'e': 'b',\n",
+       " 'f': 'r',\n",
+       " 'g': 's',\n",
+       " 'h': 't',\n",
+       " 'i': 'e',\n",
+       " 'j': 'u',\n",
+       " 'k': 'v',\n",
+       " 'l': 'w',\n",
+       " 'm': 'f',\n",
+       " 'n': 'd',\n",
+       " 'o': 'x',\n",
+       " 'p': 'y',\n",
+       " 'q': 'z',\n",
+       " 'r': 'a',\n",
+       " 's': 'h',\n",
+       " 't': 'g',\n",
+       " 'u': 'i',\n",
+       " 'v': 'j',\n",
+       " 'w': 'k',\n",
+       " 'x': 'l',\n",
+       " 'y': 'm',\n",
+       " 'z': 'n'}"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "trans = ''.maketrans(keyword_cipher_alphabet_of(key_a_word, wrap_alphabet=key_a_wrap), string.ascii_lowercase)\n",
+    "t2 = {chr(c): chr(trans[c]) for c in trans}\n",
+    "t2"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[('r', 'a'),\n",
+       " ('a', 'b'),\n",
+       " ('t', 'c'),\n",
+       " ('l', 'd'),\n",
+       " ('i', 'e'),\n",
+       " ('n', 'f'),\n",
+       " ('e', 'g'),\n",
+       " ('s', 'h'),\n",
+       " ('u', 'i'),\n",
+       " ('v', 'j'),\n",
+       " ('w', 'k'),\n",
+       " ('x', 'l'),\n",
+       " ('y', 'm'),\n",
+       " ('z', 'n'),\n",
+       " ('b', 'o'),\n",
+       " ('c', 'p'),\n",
+       " ('d', 'q'),\n",
+       " ('f', 'r'),\n",
+       " ('g', 's'),\n",
+       " ('h', 't'),\n",
+       " ('j', 'u'),\n",
+       " ('k', 'v'),\n",
+       " ('m', 'w'),\n",
+       " ('o', 'x'),\n",
+       " ('p', 'y'),\n",
+       " ('q', 'z')]"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "t2['t'] = 'c'\n",
+    "t2['a'] = 'b'\n",
+    "t2['e'] = 'g'\n",
+    "\n",
+    "t2['l'] = 'd'\n",
+    "t2['n'] = 'f'\n",
+    "t2['m'] = 'w'\n",
+    "\n",
+    "sorted(((c, t2[c]) for c in t2), key=lambda p: p[1])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "charlie, the attached note was left in one of my dead drops last night and appears to be from our mysterious source. it contains two really significant pieces of intelligence. the first is that the riechsdoktor might not refer to an individual after all. it seems to be the codename for the organization running the ratlines. according to my other sources this is a collection of routes, agents and safe houses used to transport nazi sympathisers and war criminals out of germany and on to south america. we have known that such an organisation exists since the end of the war, but this is the first time i have seen it named. the other piece of information is much more subtle. i am beginning to wonder if our source is closer to home than we had realised. and i am not referring to francois! see if you can spot the two things i noticed. by the way, who transcribed the radio intercept you sent me last week? harry\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(keyword_decipher(c4a, 'ratlines', wrap_alphabet=key_a_wrap))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('francois', <KeywordWrapAlphabet.from_last: 2>), -1082.7018217012803)"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(key_b_word, key_b_wrap), score =keyword_break_mp(c4b)\n",
+    "(key_b_word, key_b_wrap), score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "the french maybe your allies but they are not your friends they plan to infiltrate the rat i lines and to try to turn the high value targets for themselves they have a particular interest in nazi scientists from the die alchemist en project if you want to break the reichs doktor network before they can do so take care not to share any intelligence with them you have been warned i think it is time to begin negotiations i have a number in mind and i think once you know what i am offering you will find it very reasonable as a sign of good faith ioffer you the following information one of the local rat i line coordinators will be leaving the us sector tomorrow night in a black limousine under the backseat of his car you will find hidden a juniors s officer who is trying to escape and in the trunk you will find a number of papers relating to stolen artworks that he hopes to trade to the french for his freedom you might want to consider carefully whether you can trust your friend charlie with this information after all her husband francois is french\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(keyword_decipher(c4b, key_b_word, wrap_alphabet=key_b_wrap)))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'reanimtsuvwxyzbcdfghjklopq'"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "keyword_cipher_alphabet_of(key_a_word, wrap_alphabet=key_a_wrap)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "0 remniatsuvwxyzbcdfghjklopq -1262.9588058797406 hgfaoju, sgu fssfhgux qesu yft ouzs jq equ ez pc xufx xaemt ofts qjigs fqx fmmufat se ru zaep eva pctsuajevt tevahu. js heqsfjqt sye aufooc tjiqjzjhfqs mjuhut ez jqsuoojiuqhu. sgu zjats jt sgfs sgu ajuhgtxelsea pjigs qes auzua se fq jqxjwjxvfo fzsua foo. js tuupt se ru sgu hexuqfpu zea sgu eaifqjdfsjeq avqqjqi sgu afsojqut. fhheaxjqi se pc esgua tevahut sgjt jt f heoouhsjeq ez aevsut, fiuqst fqx tfzu gevtut vtux se safqtmeas qfdj tcpmfsgjtuat fqx yfa hajpjqfot evs ez iuapfqc fqx eq se tevsg fpuajhf. yu gfwu lqeyq sgfs tvhg fq eaifqjtfsjeq ubjtst tjqhu sgu uqx ez sgu yfa, rvs sgjt jt sgu zjats sjpu j gfwu tuuq js qfpux. sgu esgua mjuhu ez jqzeapfsjeq jt pvhg peau tvrsou. j fp ruijqqjqi se yeqxua jz eva tevahu jt hoetua se gepu sgfq yu gfx aufojtux. fqx j fp qes auzuaajqi se zafqhejt! tuu jz cev hfq tmes sgu sye sgjqit j qesjhux. rc sgu yfc, yge safqthajrux sgu afxje jqsuahums cev tuqs pu ofts yuul? gfaac\n",
+      "\n",
+      "1 remniatsuvwxyzbcdfghokljpq -1178.441293417976 hgfajou, sgu fssfhgux qesu yft juzs oq equ ez pc xufx xaemt jfts qoigs fqx fmmufat se ru zaep eva pctsuaoevt tevahu. os heqsfoqt sye aufjjc toiqozohfqs mouhut ez oqsujjoiuqhu. sgu zoats ot sgfs sgu aouhgtxelsea poigs qes auzua se fq oqxowoxvfj fzsua fjj. os tuupt se ru sgu hexuqfpu zea sgu eaifqodfsoeq avqqoqi sgu afsjoqut. fhheaxoqi se pc esgua tevahut sgot ot f hejjuhsoeq ez aevsut, fiuqst fqx tfzu gevtut vtux se safqtmeas qfdo tcpmfsgotuat fqx yfa haopoqfjt evs ez iuapfqc fqx eq se tevsg fpuaohf. yu gfwu lqeyq sgfs tvhg fq eaifqotfsoeq ubotst toqhu sgu uqx ez sgu yfa, rvs sgot ot sgu zoats sopu o gfwu tuuq os qfpux. sgu esgua mouhu ez oqzeapfsoeq ot pvhg peau tvrsju. o fp ruioqqoqi se yeqxua oz eva tevahu ot hjetua se gepu sgfq yu gfx aufjotux. fqx o fp qes auzuaaoqi se zafqheot! tuu oz cev hfq tmes sgu sye sgoqit o qesohux. rc sgu yfc, yge safqthaorux sgu afxoe oqsuahums cev tuqs pu jfts yuul? gfaac\n",
+      "\n",
+      "2 cemniatsuvwxyzbrdfghokljpq -1176.749704780956 hgfajou, sgu fssfhgux qesu yft juzs oq equ ez pr xufx xaemt jfts qoigs fqx fmmufat se cu zaep eva prtsuaoevt tevahu. os heqsfoqt sye aufjjr toiqozohfqs mouhut ez oqsujjoiuqhu. sgu zoats ot sgfs sgu aouhgtxelsea poigs qes auzua se fq oqxowoxvfj fzsua fjj. os tuupt se cu sgu hexuqfpu zea sgu eaifqodfsoeq avqqoqi sgu afsjoqut. fhheaxoqi se pr esgua tevahut sgot ot f hejjuhsoeq ez aevsut, fiuqst fqx tfzu gevtut vtux se safqtmeas qfdo trpmfsgotuat fqx yfa haopoqfjt evs ez iuapfqr fqx eq se tevsg fpuaohf. yu gfwu lqeyq sgfs tvhg fq eaifqotfsoeq ubotst toqhu sgu uqx ez sgu yfa, cvs sgot ot sgu zoats sopu o gfwu tuuq os qfpux. sgu esgua mouhu ez oqzeapfsoeq ot pvhg peau tvcsju. o fp cuioqqoqi se yeqxua oz eva tevahu ot hjetua se gepu sgfq yu gfx aufjotux. fqx o fp qes auzuaaoqi se zafqheot! tuu oz rev hfq tmes sgu sye sgoqit o qesohux. cr sgu yfr, yge safqthaocux sgu afxoe oqsuahums rev tuqs pu jfts yuul? gfaar\n",
+      "\n",
+      "3 vemniatsucwxyzbrdfghokljpq -1172.734320973362 hgfajou, sgu fssfhgux qesu yft juzs oq equ ez pr xufx xaemt jfts qoigs fqx fmmufat se vu zaep eca prtsuaoect tecahu. os heqsfoqt sye aufjjr toiqozohfqs mouhut ez oqsujjoiuqhu. sgu zoats ot sgfs sgu aouhgtxelsea poigs qes auzua se fq oqxowoxcfj fzsua fjj. os tuupt se vu sgu hexuqfpu zea sgu eaifqodfsoeq acqqoqi sgu afsjoqut. fhheaxoqi se pr esgua tecahut sgot ot f hejjuhsoeq ez aecsut, fiuqst fqx tfzu gectut ctux se safqtmeas qfdo trpmfsgotuat fqx yfa haopoqfjt ecs ez iuapfqr fqx eq se tecsg fpuaohf. yu gfwu lqeyq sgfs tchg fq eaifqotfsoeq ubotst toqhu sgu uqx ez sgu yfa, vcs sgot ot sgu zoats sopu o gfwu tuuq os qfpux. sgu esgua mouhu ez oqzeapfsoeq ot pchg peau tcvsju. o fp vuioqqoqi se yeqxua oz eca tecahu ot hjetua se gepu sgfq yu gfx aufjotux. fqx o fp qes auzuaaoqi se zafqheot! tuu oz rec hfq tmes sgu sye sgoqit o qesohux. vr sgu yfr, yge safqthaovux sgu afxoe oqsuahums rec tuqs pu jfts yuul? gfaar\n",
+      "\n",
+      "10 vfmniatsulxpyzcrdbgqokejwh -1138.6987012040154 qgbajou, sgu bssbqgup hfsu ybt juzs oh fhu fz wr pubp pafmt jbts hoigs bhp bmmubat sf vu zafw fla wrtsuaoflt tflaqu. os qfhsboht syf aubjjr toihozoqbhs mouqut fz ohsujjoiuhqu. sgu zoats ot sgbs sgu aouqgtpfesfa woigs hfs auzua sf bh ohpoxoplbj bzsua bjj. os tuuwt sf vu sgu qfpuhbwu zfa sgu faibhodbsofh alhhohi sgu absjohut. bqqfapohi sf wr fsgua tflaqut sgot ot b qfjjuqsofh fz aflsut, biuhst bhp tbzu gfltut ltup sf sabhtmfas hbdo trwmbsgotuat bhp yba qaowohbjt fls fz iuawbhr bhp fh sf tflsg bwuaoqb. yu gbxu ehfyh sgbs tlqg bh faibhotbsofh ucotst tohqu sgu uhp fz sgu yba, vls sgot ot sgu zoats sowu o gbxu tuuh os hbwup. sgu fsgua mouqu fz ohzfawbsofh ot wlqg wfau tlvsju. o bw vuiohhohi sf yfhpua oz fla tflaqu ot qjftua sf gfwu sgbh yu gbp aubjotup. bhp o bw hfs auzuaaohi sf zabhqfot! tuu oz rfl qbh tmfs sgu syf sgohit o hfsoqup. vr sgu ybr, ygf sabhtqaovup sgu abpof ohsuaqums rfl tuhs wu jbts yuue? gbaar\n",
+      "\n",
+      "20 vfyniadsgkxpwzmcqhutolejrb -1125.2537605606442 tuhajog, sug hsshtugp bfsg whd jgzs ob fbg fz rc pghp pafyd jhds boius hbp hyyghad sf vg zafr fka rcdsgaofkd dfkatg. os tfbshobd swf aghjjc doibozothbs yogtgd fz obsgjjoigbtg. sug zoads od suhs sug aogtudpfesfa roius bfs agzga sf hb obpoxopkhj hzsga hjj. os dggrd sf vg sug tfpgbhrg zfa sug faihboqhsofb akbbobi sug ahsjobgd. httfapobi sf rc fsuga dfkatgd suod od h tfjjgtsofb fz afksgd, higbsd hbp dhzg ufkdgd kdgp sf sahbdyfas bhqo dcryhsuodgad hbp wha taorobhjd fks fz igarhbc hbp fb sf dfksu hrgaoth. wg uhxg ebfwb suhs dktu hb faihbodhsofb gmodsd dobtg sug gbp fz sug wha, vks suod od sug zoads sorg o uhxg dggb os bhrgp. sug fsuga yogtg fz obzfarhsofb od rktu rfag dkvsjg. o hr vgiobbobi sf wfbpga oz fka dfkatg od tjfdga sf ufrg suhb wg uhp aghjodgp. hbp o hr bfs agzgaaobi sf zahbtfod! dgg oz cfk thb dyfs sug swf suobid o bfsotgp. vc sug whc, wuf sahbdtaovgp sug ahpof obsgatgys cfk dgbs rg jhds wgge? uhaac\n",
+      "\n",
+      "41 cfjowbdsexuikqmryngtalpzhv -1124.2920779257197 tgnbzae, sge nssntgei vfse knd zeqs av fve fq hr ieni ibfjd znds vawgs nvi njjenbd sf ce qbfh fxb hrdsebafxd dfxbte. as tfvsnavd skf benzzr dawvaqatnvs jaeted fq avsezzawevte. sge qabds ad sgns sge baetgdifpsfb hawgs vfs beqeb sf nv aviauaixnz nqseb nzz. as deehd sf ce sge tfievnhe qfb sge fbwnvaynsafv bxvvavw sge bnszaved. nttfbiavw sf hr fsgeb dfxbted sgad ad n tfzzetsafv fq bfxsed, nwevsd nvi dnqe gfxded xdei sf sbnvdjfbs vnya drhjnsgadebd nvi knb tbahavnzd fxs fq webhnvr nvi fv sf dfxsg nhebatn. ke gnue pvfkv sgns dxtg nv fbwnvadnsafv emadsd davte sge evi fq sge knb, cxs sgad ad sge qabds sahe a gnue deev as vnhei. sge fsgeb jaete fq avqfbhnsafv ad hxtg hfbe dxcsze. a nh cewavvavw sf kfvieb aq fxb dfxbte ad tzfdeb sf gfhe sgnv ke gni benzadei. nvi a nh vfs beqebbavw sf qbnvtfad! dee aq rfx tnv djfs sge skf sgavwd a vfsatei. cr sge knr, kgf sbnvdtbacei sge bniaf avsebtejs rfx devs he znds keep? gnbbr\n",
+      "\n",
+      "42 cfjzwbdsexuikqmryngtalpohv -1085.6036078813306 tgnboae, sge nssntgei vfse knd oeqs av fve fq hr ieni ibfjd onds vawgs nvi njjenbd sf ce qbfh fxb hrdsebafxd dfxbte. as tfvsnavd skf benoor dawvaqatnvs jaeted fq avseooawevte. sge qabds ad sgns sge baetgdifpsfb hawgs vfs beqeb sf nv aviauaixno nqseb noo. as deehd sf ce sge tfievnhe qfb sge fbwnvaynsafv bxvvavw sge bnsoaved. nttfbiavw sf hr fsgeb dfxbted sgad ad n tfooetsafv fq bfxsed, nwevsd nvi dnqe gfxded xdei sf sbnvdjfbs vnya drhjnsgadebd nvi knb tbahavnod fxs fq webhnvr nvi fv sf dfxsg nhebatn. ke gnue pvfkv sgns dxtg nv fbwnvadnsafv emadsd davte sge evi fq sge knb, cxs sgad ad sge qabds sahe a gnue deev as vnhei. sge fsgeb jaete fq avqfbhnsafv ad hxtg hfbe dxcsoe. a nh cewavvavw sf kfvieb aq fxb dfxbte ad tofdeb sf gfhe sgnv ke gni benoadei. nvi a nh vfs beqebbavw sf qbnvtfad! dee aq rfx tnv djfs sge skf sgavwd a vfsatei. cr sge knr, kgf sbnvdtbacei sge bniaf avsebtejs rfx devs he onds keep? gnbbr\n",
+      "\n",
+      "45 bvjzycdsexuikqmrwngtalpohf -1079.7756157738888 tgncoae, sge nssntgei fvse knd oeqs af vfe vq hr ieni icvjd onds faygs nfi njjencd sv be qcvh vxc hrdsecavxd dvxcte. as tvfsnafd skv cenoor dayfaqatnfs jaeted vq afseooayefte. sge qacds ad sgns sge caetgdivpsvc haygs fvs ceqec sv nf afiauaixno nqsec noo. as deehd sv be sge tviefnhe qvc sge vcynfawnsavf cxffafy sge cnsoafed. nttvciafy sv hr vsgec dvxcted sgad ad n tvooetsavf vq cvxsed, nyefsd nfi dnqe gvxded xdei sv scnfdjvcs fnwa drhjnsgadecd nfi knc tcahafnod vxs vq yechnfr nfi vf sv dvxsg nhecatn. ke gnue pfvkf sgns dxtg nf vcynfadnsavf emadsd dafte sge efi vq sge knc, bxs sgad ad sge qacds sahe a gnue deef as fnhei. sge vsgec jaete vq afqvchnsavf ad hxtg hvce dxbsoe. a nh beyaffafy sv kvfiec aq vxc dvxcte ad tovdec sv gvhe sgnf ke gni cenoadei. nfi a nh fvs ceqeccafy sv qcnftvad! dee aq rvx tnf djvs sge skv sgafyd a fvsatei. br sge knr, kgv scnfdtcabei sge cniav afsectejs rvx defs he onds keep? gnccr\n",
+      "\n",
+      "47 bvjzycdtexpikqmrwngsaluohf -1072.6883675689066 sgncoae, tge nttnsgei fvte knd oeqt af vfe vq hr ieni icvjd ondt faygt nfi njjencd tv be qcvh vxc hrdtecavxd dvxcse. at svftnafd tkv cenoor dayfaqasnft jaesed vq afteooayefse. tge qacdt ad tgnt tge caesgdivutvc haygt fvt ceqec tv nf afiapaixno nqtec noo. at deehd tv be tge sviefnhe qvc tge vcynfawntavf cxffafy tge cntoafed. nssvciafy tv hr vtgec dvxcsed tgad ad n svooestavf vq cvxted, nyeftd nfi dnqe gvxded xdei tv tcnfdjvct fnwa drhjntgadecd nfi knc scahafnod vxt vq yechnfr nfi vf tv dvxtg nhecasn. ke gnpe ufvkf tgnt dxsg nf vcynfadntavf emadtd dafse tge efi vq tge knc, bxt tgad ad tge qacdt tahe a gnpe deef at fnhei. tge vtgec jaese vq afqvchntavf ad hxsg hvce dxbtoe. a nh beyaffafy tv kvfiec aq vxc dvxcse ad sovdec tv gvhe tgnf ke gni cenoadei. nfi a nh fvt ceqeccafy tv qcnfsvad! dee aq rvx snf djvt tge tkv tgafyd a fvtasei. br tge knr, kgv tcnfdscabei tge cniav aftecsejt rvx deft he ondt keeu? gnccr\n",
+      "\n",
+      "50 brjzkcdtespiyqmvwngxaluohf -1048.0345619644993 xgncoae, tge nttnxgei frte ynd oeqt af rfe rq hv ieni icrjd ondt fakgt nfi njjencd tr be qcrh rsc hvdtecarsd drscxe. at xrftnafd tyr cenoov dakfaqaxnft jaexed rq afteooakefxe. tge qacdt ad tgnt tge caexgdirutrc hakgt frt ceqec tr nf afiapaisno nqtec noo. at deehd tr be tge xriefnhe qrc tge rcknfawntarf csffafk tge cntoafed. nxxrciafk tr hv rtgec drscxed tgad ad n xrooextarf rq crsted, nkeftd nfi dnqe grsded sdei tr tcnfdjrct fnwa dvhjntgadecd nfi ync xcahafnod rst rq kechnfv nfi rf tr drstg nhecaxn. ye gnpe ufryf tgnt dsxg nf rcknfadntarf emadtd dafxe tge efi rq tge ync, bst tgad ad tge qacdt tahe a gnpe deef at fnhei. tge rtgec jaexe rq afqrchntarf ad hsxg hrce dsbtoe. a nh bekaffafk tr yrfiec aq rsc drscxe ad xordec tr grhe tgnf ye gni cenoadei. nfi a nh frt ceqeccafk tr qcnfxrad! dee aq vrs xnf djrt tge tyr tgafkd a frtaxei. bv tge ynv, ygr tcnfdxcabei tge cniar aftecxejt vrs deft he ondt yeeu? gnccv\n",
+      "\n",
+      "52 vrjzkcdtespiyqmbwngxaluohf -1047.4217167696756 xgncoae, tge nttnxgei frte ynd oeqt af rfe rq hb ieni icrjd ondt fakgt nfi njjencd tr ve qcrh rsc hbdtecarsd drscxe. at xrftnafd tyr cenoob dakfaqaxnft jaexed rq afteooakefxe. tge qacdt ad tgnt tge caexgdirutrc hakgt frt ceqec tr nf afiapaisno nqtec noo. at deehd tr ve tge xriefnhe qrc tge rcknfawntarf csffafk tge cntoafed. nxxrciafk tr hb rtgec drscxed tgad ad n xrooextarf rq crsted, nkeftd nfi dnqe grsded sdei tr tcnfdjrct fnwa dbhjntgadecd nfi ync xcahafnod rst rq kechnfb nfi rf tr drstg nhecaxn. ye gnpe ufryf tgnt dsxg nf rcknfadntarf emadtd dafxe tge efi rq tge ync, vst tgad ad tge qacdt tahe a gnpe deef at fnhei. tge rtgec jaexe rq afqrchntarf ad hsxg hrce dsvtoe. a nh vekaffafk tr yrfiec aq rsc drscxe ad xordec tr grhe tgnf ye gni cenoadei. nfi a nh frt ceqeccafk tr qcnfxrad! dee aq brs xnf djrt tge tyr tgafkd a frtaxei. vb tge ynb, ygr tcnfdxcavei tge cniar aftecxejt brs deft he ondt yeeu? gnccb\n",
+      "\n",
+      "53 vrjzkcdtespiyqwbmngxaluohf -1047.3736493946644 xgncoae, tge nttnxgei frte ynd oeqt af rfe rq hb ieni icrjd ondt fakgt nfi njjencd tr ve qcrh rsc hbdtecarsd drscxe. at xrftnafd tyr cenoob dakfaqaxnft jaexed rq afteooakefxe. tge qacdt ad tgnt tge caexgdirutrc hakgt frt ceqec tr nf afiapaisno nqtec noo. at deehd tr ve tge xriefnhe qrc tge rcknfamntarf csffafk tge cntoafed. nxxrciafk tr hb rtgec drscxed tgad ad n xrooextarf rq crsted, nkeftd nfi dnqe grsded sdei tr tcnfdjrct fnma dbhjntgadecd nfi ync xcahafnod rst rq kechnfb nfi rf tr drstg nhecaxn. ye gnpe ufryf tgnt dsxg nf rcknfadntarf ewadtd dafxe tge efi rq tge ync, vst tgad ad tge qacdt tahe a gnpe deef at fnhei. tge rtgec jaexe rq afqrchntarf ad hsxg hrce dsvtoe. a nh vekaffafk tr yrfiec aq rsc drscxe ad xordec tr grhe tgnf ye gni cenoadei. nfi a nh frt ceqeccafk tr qcnfxrad! dee aq brs xnf djrt tge tyr tgafkd a frtaxei. vb tge ynb, ygr tcnfdxcavei tge cniar aftecxejt brs deft he ondt yeeu? gnccb\n",
+      "\n",
+      "56 zrjvkcdtespihqwbmngualxoyf -1026.091865606169 ugncoae, tge nttnugei frte hnd oeqt af rfe rq yb ieni icrjd ondt fakgt nfi njjencd tr ze qcry rsc ybdtecarsd drscue. at urftnafd thr cenoob dakfaqaunft jaeued rq afteooakefue. tge qacdt ad tgnt tge caeugdirxtrc yakgt frt ceqec tr nf afiapaisno nqtec noo. at deeyd tr ze tge uriefnye qrc tge rcknfamntarf csffafk tge cntoafed. nuurciafk tr yb rtgec drscued tgad ad n urooeutarf rq crsted, nkeftd nfi dnqe grsded sdei tr tcnfdjrct fnma dbyjntgadecd nfi hnc ucayafnod rst rq kecynfb nfi rf tr drstg nyecaun. he gnpe xfrhf tgnt dsug nf rcknfadntarf ewadtd dafue tge efi rq tge hnc, zst tgad ad tge qacdt taye a gnpe deef at fnyei. tge rtgec jaeue rq afqrcyntarf ad ysug yrce dsztoe. a ny zekaffafk tr hrfiec aq rsc drscue ad uordec tr grye tgnf he gni cenoadei. nfi a ny frt ceqeccafk tr qcnfurad! dee aq brs unf djrt tge thr tgafkd a frtauei. zb tge hnb, hgr tcnfducazei tge cniar aftecuejt brs deft ye ondt heex? gnccb\n",
+      "\n",
+      "59 zrjvkcatedpihqwbxnguslmoyf -1019.2155510698342 ugncose, tge nttnugei frte hna oeqt sf rfe rq yb ieni icrja onat fskgt nfi njjenca tr ze qcry rdc ybatecsrda ardcue. st urftnsfa thr cenoob askfsqsunft jseuea rq sfteooskefue. tge qscat sa tgnt tge cseugairmtrc yskgt frt ceqec tr nf sfispsidno nqtec noo. st aeeya tr ze tge uriefnye qrc tge rcknfsxntsrf cdffsfk tge cntosfea. nuurcisfk tr yb rtgec ardcuea tgsa sa n urooeutsrf rq crdtea, nkefta nfi anqe grdaea daei tr tcnfajrct fnxs abyjntgsaeca nfi hnc ucsysfnoa rdt rq kecynfb nfi rf tr ardtg nyecsun. he gnpe mfrhf tgnt adug nf rcknfsantsrf ewsata asfue tge efi rq tge hnc, zdt tgsa sa tge qscat tsye s gnpe aeef st fnyei. tge rtgec jseue rq sfqrcyntsrf sa ydug yrce adztoe. s ny zeksffsfk tr hrfiec sq rdc ardcue sa uoraec tr grye tgnf he gni cenosaei. nfi s ny frt ceqeccsfk tr qcnfursa! aee sq brd unf ajrt tge thr tgsfka s frtsuei. zb tge hnb, hgr tcnfaucszei tge cnisr sftecuejt brd aeft ye onat heem? gnccb\n",
+      "\n",
+      "63 zelvkcatrdpmhjwbxngusqioyf -1017.7604294276406 ugncosr, tgr nttnugrm fetr hna orjt sf efr ej yb mrnm mcela onat fskgt nfm nllrnca te zr jcey edc ybatrcseda aedcur. st ueftnsfa the crnoob askfsjsunft lsrura ej sftrooskrfur. tgr jscat sa tgnt tgr csrugameitec yskgt fet crjrc te nf sfmspsmdno njtrc noo. st arrya te zr tgr uemrfnyr jec tgr ecknfsxntsef cdffsfk tgr cntosfra. nuuecmsfk te yb etgrc aedcura tgsa sa n ueoorutsef ej cedtra, nkrfta nfm anjr gedara darm te tcnfalect fnxs abylntgsarca nfm hnc ucsysfnoa edt ej krcynfb nfm ef te aedtg nyrcsun. hr gnpr ifehf tgnt adug nf ecknfsantsef rwsata asfur tgr rfm ej tgr hnc, zdt tgsa sa tgr jscat tsyr s gnpr arrf st fnyrm. tgr etgrc lsrur ej sfjecyntsef sa ydug yecr adztor. s ny zrksffsfk te hefmrc sj edc aedcur sa uoearc te geyr tgnf hr gnm crnosarm. nfm s ny fet crjrccsfk te jcnfuesa! arr sj bed unf alet tgr the tgsfka s fetsurm. zb tgr hnb, hge tcnfaucszrm tgr cnmse sftrcurlt bed arft yr onat hrri? gnccb\n",
+      "\n",
+      "401 ytmpcnrhakvslzdfqigeoxwbju -1014.7565957992581 eginboa, hga ihhiegas utha lir bazh ou tua tz jf sais sntmr birh uocgh ius immainr ht ya zntj tkn jfrhanotkr rtknea. oh etuhiour hlt naibbf rocuozoeiuh moaear tz ouhabbocauea. hga zonrh or hgih hga noaegrstwhtn jocgh uth nazan ht iu ousovoskib izhan ibb. oh raajr ht ya hga etsauija ztn hga tnciuoqihotu nkuuouc hga nihbouar. ieetnsouc ht jf thgan rtknear hgor or i etbbaehotu tz ntkhar, icauhr ius riza gtkrar kras ht hniurmtnh uiqo rfjmihgoranr ius lin enojouibr tkh tz canjiuf ius tu ht rtkhg ijanoei. la giva wutlu hgih rkeg iu tnciuorihotu adorhr rouea hga aus tz hga lin, ykh hgor or hga zonrh hoja o giva raau oh uijas. hga thgan moaea tz ouztnjihotu or jkeg jtna rkyhba. o ij yacouuouc ht ltusan oz tkn rtknea or ebtran ht gtja hgiu la gis naiboras. ius o ij uth nazannouc ht zniuetor! raa oz ftk eiu rmth hga hlt hgoucr o uthoeas. yf hga lif, lgt hniurenoyas hga nisot ouhaneamh ftk rauh ja birh laaw? ginnf\n",
+      "\n",
+      "11879 jtlqogfshdxnbrcwzeamupkvyi -991.2276834904978 maegvuh, sah essemahn itsh bef vhrs ui tih tr yw nhen ngtlf vefs iuoas ein ellhegf st jh rgty tdg ywfshgutdf ftdgmh. us mtiseuif sbt ghevvw fuoiurumeis luhmhf tr uishvvuohimh. sah rugfs uf saes sah guhmafntkstg yuoas its ghrhg st ei uinuxundev ershg evv. us fhhyf st jh sah mtnhieyh rtg sah tgoeiuzesuti gdiiuio sah gesvuihf. emmtgnuio st yw tsahg ftdgmhf sauf uf e mtvvhmsuti tr gtdshf, eohisf ein ferh atdfhf dfhn st sgeifltgs iezu fwylesaufhgf ein beg mguyuievf tds tr ohgyeiw ein ti st ftdsa eyhgume. bh aexh kitbi saes fdma ei tgoeiufesuti hcufsf fuimh sah hin tr sah beg, jds sauf uf sah rugfs suyh u aexh fhhi us ieyhn. sah tsahg luhmh tr uirtgyesuti uf ydma ytgh fdjsvh. u ey jhouiiuio st btinhg ur tdg ftdgmh uf mvtfhg st atyh saei bh aen ghevufhn. ein u ey its ghrhgguio st rgeimtuf! fhh ur wtd mei flts sah sbt sauiof u itsumhn. jw sah bew, bat sgeifmgujhn sah genut uishgmhls wtd fhis yh vefs bhhk? aeggw\n",
+      "\n",
+      "11882 jtlqigfshdknbrcmzeawupxvyo -988.5494150402712 waegvuh, sah essewahn otsh bef vhrs uo toh tr ym nhen ngtlf vefs ouias eon ellhegf st jh rgty tdg ymfshgutdf ftdgwh. us wtoseuof sbt ghevvm fuiouruweos luhwhf tr uoshvvuihowh. sah rugfs uf saes sah guhwafntxstg yuias ots ghrhg st eo uonukundev ershg evv. us fhhyf st jh sah wtnhoeyh rtg sah tgieouzesuto gdoouoi sah gesvuohf. ewwtgnuoi st ym tsahg ftdgwhf sauf uf e wtvvhwsuto tr gtdshf, eihosf eon ferh atdfhf dfhn st sgeofltgs oezu fmylesaufhgf eon beg wguyuoevf tds tr ihgyeom eon to st ftdsa eyhguwe. bh aekh xotbo saes fdwa eo tgieoufesuto hcufsf fuowh sah hon tr sah beg, jds sauf uf sah rugfs suyh u aekh fhho us oeyhn. sah tsahg luhwh tr uortgyesuto uf ydwa ytgh fdjsvh. u ey jhiuoouoi st btonhg ur tdg ftdgwh uf wvtfhg st atyh saeo bh aen ghevufhn. eon u ey ots ghrhgguoi st rgeowtuf! fhh ur mtd weo flts sah sbt sauoif u otsuwhn. jm sah bem, bat sgeofwgujhn sah genut uoshgwhls mtd fhos yh vefs bhhx? aeggm\n",
+      "\n",
+      "38275 ylupsroeakjbiwgxzdmchqftvn -978.2449056535245 cmdrtha, ema deedcmab nlea ido tawe hn lna lw vx badb brluo tdoe nhsme dnb duuadro el ya wrlv lkr vxoearhlko olkrca. he clnedhno eil radttx ohsnhwhcdne uhacao lw hneatthsanca. ema whroe ho emde ema rhacmoblfelr vhsme nle rawar el dn hnbhjhbkdt dwear dtt. he oaavo el ya ema clbandva wlr ema lrsdnhzdehln rknnhns ema rdethnao. dcclrbhns el vx lemar olkrcao emho ho d clttacehln lw rlkeao, dsaneo dnb odwa mlkoao koab el erdnoulre ndzh oxvudemhoaro dnb idr crhvhndto lke lw sarvdnx dnb ln el olkem dvarhcd. ia mdja fnlin emde okcm dn lrsdnhodehln aghoeo ohnca ema anb lw ema idr, yke emho ho ema whroe ehva h mdja oaan he ndvab. ema lemar uhaca lw hnwlrvdehln ho vkcm vlra okyeta. h dv yashnnhns el ilnbar hw lkr olkrca ho ctloar el mlva emdn ia mdb radthoab. dnb h dv nle rawarrhns el wrdnclho! oaa hw xlk cdn oule ema eil emhnso h nlehcab. yx ema idx, iml erdnocrhyab ema rdbhl hnearcaue xlk oane va tdoe iaaf? mdrrx\n",
+      "\n",
+      "38276 yluvsroeakjbiwgxzdmchqftpn -974.4830434072574 cmdrtha, ema deedcmab nlea ido tawe hn lna lw px badb brluo tdoe nhsme dnb duuadro el ya wrlp lkr pxoearhlko olkrca. he clnedhno eil radttx ohsnhwhcdne uhacao lw hneatthsanca. ema whroe ho emde ema rhacmoblfelr phsme nle rawar el dn hnbhjhbkdt dwear dtt. he oaapo el ya ema clbandpa wlr ema lrsdnhzdehln rknnhns ema rdethnao. dcclrbhns el px lemar olkrcao emho ho d clttacehln lw rlkeao, dsaneo dnb odwa mlkoao koab el erdnoulre ndzh oxpudemhoaro dnb idr crhphndto lke lw sarpdnx dnb ln el olkem dparhcd. ia mdja fnlin emde okcm dn lrsdnhodehln aghoeo ohnca ema anb lw ema idr, yke emho ho ema whroe ehpa h mdja oaan he ndpab. ema lemar uhaca lw hnwlrpdehln ho pkcm plra okyeta. h dp yashnnhns el ilnbar hw lkr olkrca ho ctloar el mlpa emdn ia mdb radthoab. dnb h dp nle rawarrhns el wrdnclho! oaa hw xlk cdn oule ema eil emhnso h nlehcab. yx ema idx, iml erdnocrhyab ema rdbhl hnearcaue xlk oane pa tdoe iaaf? mdrrx\n",
+      "\n",
+      "78883 beuzxnalopgyivqkwtrchjfmds -957.1987270553409 crtnmho, lro tlltcroy selo ita movl hs eso ev dk yoty yneua mtal shxrl tsy tuuotna le bo vned epn dkalonhepa aepnco. hl ceslthsa lie notmmk ahxshvhctsl uhocoa ev hslommhxosco. lro vhnal ha lrtl lro nhocrayeflen dhxrl sel novon le ts hsyhghyptm tvlon tmm. hl aooda le bo lro ceyostdo ven lro enxtshwtlhes npsshsx lro ntlmhsoa. tccenyhsx le dk elron aepncoa lrha ha t cemmoclhes ev neploa, txosla tsy atvo repaoa paoy le lntsauenl stwh akdutlrhaona tsy itn cnhdhstma epl ev xondtsk tsy es le aeplr tdonhct. io rtgo fseis lrtl apcr ts enxtshatlhes oqhala ahsco lro osy ev lro itn, bpl lrha ha lro vhnal lhdo h rtgo aoos hl stdoy. lro elron uhoco ev hsvendtlhes ha dpcr deno apblmo. h td boxhsshsx le iesyon hv epn aepnco ha cmeaon le redo lrts io rty notmhaoy. tsy h td sel novonnhsx le vntsceha! aoo hv kep cts auel lro lie lrhsxa h selhcoy. bk lro itk, ire lntsacnhboy lro ntyhe hsloncoul kep aosl do mtal ioof? rtnnk\n",
+      "\n",
+      "465709 dojzgtrasuqvmlypbeifhxkwcn -941.3015373634643 fietwhs, ais eaaefisv noas mer wsla hn ons ol cp vsev vtojr wera nhgia env ejjsetr ao ds ltoc out cprasthour routfs. ha fonaehnr amo tsewwp rhgnhlhfena jhsfsr ol hnaswwhgsnfs. ais lhtra hr aiea ais thsfirvokaot chgia noa tslst ao en hnvhqhvuew elast eww. ha rsscr ao ds ais fovsnecs lot ais otgenhbeahon tunnhng ais teawhnsr. effotvhng ao cp oaist routfsr aihr hr e fowwsfahon ol touasr, egsnar env rels ioursr ursv ao atenrjota nebh rpcjeaihrstr env met fthchnewr oua ol gstcenp env on ao rouai ecsthfe. ms ieqs knomn aiea rufi en otgenhreahon syhrar rhnfs ais snv ol ais met, dua aihr hr ais lhtra ahcs h ieqs rssn ha necsv. ais oaist jhsfs ol hnlotceahon hr cufi cots rudaws. h ec dsghnnhng ao monvst hl out routfs hr fworst ao iocs aien ms iev tsewhrsv. env h ec noa tslstthng ao ltenfohr! rss hl pou fen rjoa ais amo aihngr h noahfsv. dp ais mep, mio atenrfthdsv ais tevho hnastfsja pou rsna cs wera mssk? iettp\n",
+      "\n",
+      "1750157 qhyxutaieljkvwzdmsofrpbgcn -941.2815644870221 fostgre, ioe siisfoek nhie vsa gewi rn hne hw cd kesk kthya gsai nruoi snk syyesta ih qe wthc hlt cdaietrhla ahltfe. ri fhnisrna ivh tesggd arunrwrfsni yrefea hw rnieggruenfe. ioe wrtai ra iosi ioe trefoakhbiht cruoi nhi tewet ih sn rnkrjrklsg swiet sgg. ri aeeca ih qe ioe fhkensce wht ioe htusnrmsirhn tlnnrnu ioe tsigrnea. sffhtkrnu ih cd hioet ahltfea iora ra s fhggefirhn hw thliea, suenia snk aswe ohlaea laek ih itsnayhti nsmr adcysioraeta snk vst ftrcrnsga hli hw uetcsnd snk hn ih ahlio scetrfs. ve osje bnhvn iosi alfo sn htusnrasirhn ezraia arnfe ioe enk hw ioe vst, qli iora ra ioe wrtai irce r osje aeen ri nscek. ioe hioet yrefe hw rnwhtcsirhn ra clfo chte alqige. r sc qeurnnrnu ih vhnket rw hlt ahltfe ra fghaet ih ohce iosn ve osk tesgraek. snk r sc nhi tewettrnu ih wtsnfhra! aee rw dhl fsn ayhi ioe ivh iornua r nhirfek. qd ioe vsd, voh itsnaftrqek ioe tskrh rnietfeyi dhl aeni ce gsai veeb? osttd\n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "('qhyxutaieljkvwzdmsofrpbgcn', -941.2815644870221)"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "monoalphabetic_break_hillclimbing(c4a, alphabet=keyword_cipher_alphabet_of(key_a_word, wrap_alphabet=key_a_wrap))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2015/2015-challenge5.ipynb b/2015/2015-challenge5.ipynb
new file mode 100644 (file)
index 0000000..7b963ff
--- /dev/null
@@ -0,0 +1,149 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c5a = open('5a.ciphertext').read()\n",
+    "c5b = open('5b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('cornfield', <KeywordWrapAlphabet.from_largest: 3>), -1557.5551917175146)"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(key_a_word, key_a_wrap), score = keyword_break_mp(c5a)\n",
+    "(key_a_word, key_a_wrap), score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "harry, i checked out who transcribed the radio transmission like you asked. it was a junior cipher clerk in room 5. i would have offered to set up a meeting with her, but she has disappeared and hasn’t been seen since last friday. the marines saw her leave at her usual time, and she was booked out for some leave on monday and tuesday so no one noticed she was missing until today. we sent an officer out to her usual haunts and i will get back to you if we find anything. what made you ask? did you have a reason to believe she was involved in something? \n",
+      "\n",
+      "i took another look at the messages. were you referring to the typos? the word ratlines keeps being spelt as ratilines. is that important? what did you mean about our source being close to home? \n",
+      "\n",
+      "also did some digging about the reichsdoktor. seems you were right and it refers to an underground nazi organisation dedicated to rebuilding the reich. maybe they think of it as healing? a bunch of rich nazi sympathisers took over the ratlines from a group of ss officers who set them up at the tail of the war and have been active in shipping scientists, engineers and soldiers to towns across south america. if our source has inside information then maybe we could intercept the lines and pick up some of the high value targets the french are after. what was “die alchemisten project”? \n",
+      "\n",
+      "the enclosed message was handed to the marines, but they didn’t get a name. initial analysis shows it must be a vigenere cipher with period two so it should be reasonably straightforward to crack. \n",
+      "\n",
+      "all the best, charlie \n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(keyword_decipher(c5a, key_a_word, wrap_alphabet=key_a_wrap))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('de', -885.6842458313828)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = vigenere_frequency_break(c5b, max_key_length=2)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "the first item in our little auction will be the location of a safehouse in the uk sector of berlin it is a minor stopover on the rat lines but you never know you might get lucky and find someone interesting hiding there at the very least you will inconvenience the reichs doktor if you take possession of it how much would that be worth to you do i hear a bid of five hundred thousand francs from our french friends perhaps the british would pay more or maybe they can not afford to i wonder how they feel about that perhaps you should ask them if you want to outbid your so called friends then leave the money in unmarked treasury bills in locker at the far end of the platform in friedrichstrasse i will leave the details in locker you will find the key in do not try to double cross me it will not work and our little game will end before it has even properly begun\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(vigenere_decipher(sanitise(c5b), key_b)))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2015/2015-challenge6.ipynb b/2015/2015-challenge6.ipynb
new file mode 100644 (file)
index 0000000..e01a50c
--- /dev/null
@@ -0,0 +1,275 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c6a = sanitise(open('6a.ciphertext').read())\n",
+    "c6b = sanitise(open('6b.ciphertext').read())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('hammering', <KeywordWrapAlphabet.from_largest: 3>), -2247.716859509375)"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(key_a_word, key_a_wrap), score = keyword_break_mp(c6a)\n",
+    "(key_a_word, key_a_wrap), score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "freslitiacehartaypoinseailinthareagevtiaeceyiaepptestwboarinartayptwmthhegthctpifktwupenwinartasenhfsipaodartsewiomthhegtpstaayunliktlyfoinfiwtnfthoidigustyousjuniosfiprtsfltskcehinvolvtwmigrabtcosarfrtfkingrtsbefkgsounwenwbenkeffounahareaihellimtenacrtniheiwarthousftcehflohtaoromtbuaarinkingebouaiaiemnoahustiamekthhtnhtaoarinkhrtceharthousftartmthhegthhaillkttpfomingenwiemguthhingareahrtrehgonthoartstmuhabthomtoartshousftdosousinatlligtnfthomtaringihboartsingmtebouaartaontodartmthhegthcrywothousenaegonihakttpaeunainguhebouaousellithiaihnoaliktartaringhctestbtingehktwaobiwdosestaringhctestliktlyaoriwtdsomontenoartsedatsellenyceyidolloctwontodousdstnfrfollteguthaodsitwsifrhasehhtenwceafrtwrtsasyaopifkupartktydsomlofktshttmhaorevtbttnefonifoulwnaflteslyhttcreacehgoingonbuahrtwiwnahttmaobtebltaooptnlofktsenwltdaobviouhlyuphtaedatshrtrewgontiaookelookealofktsiarehedelhtbefkhoiemguthhingartmontycehaektnbuanoaringpsoviwtwintxfrengtfoulwyouwigesounwciaryousfonaefahinartbsiaihrenwsuhhientmbehhithenwhttidartyestgtaaingarthemthosaodfommunifeaionhmeybtyoufoulwcesnartmbyartceywitelfrtmihatnpsojtfacehartfowtnemtdosartnezieaombombtddosairewesuninciarartmwusingartcescrtnctctstasyingaokttpartisrenwhoddartrtevyceatshupplystmtmbtsartbombinginvtmoskareacehuhosseartsousnoswifellithenyceyiaihhaillaophtfstahoartdefaouspsoaegonihaknochebouaiaihhignidifenaihuhptfaartktyaoarihcroltmyhatsylithinartisiwtnaiayidctkntccroartyctstcoskingdosctmigrabtebltaodigustouacreaartyestupaoontlehaaringefaingonerunfriaookelookeahomtodartdstnfrwtewwsophedatsartdsitwsifrhasehhtinfiwtnaenwdounwarteaaefrtwfommunifeaionirevtnarewaimtaofsefkiabuaiarinkiameybtevigtntstegeinbuairevtnarewefrenftaoasybebbegthasifkoniaytagivtiaaoyousblefkfrembtsenwhttcreaartyfenmektodiaellartbtharessy\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(keyword_decipher(c6a, key_a_word, wrap_alphabet=key_a_wrap))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'icrdvsfshmrghcfhpzysxdrhsvsxfghcrhnrkfshrmrpshrzzfrdflayhcsxhcfhpzflwfggrnfgmfzsiufljzrxlsxhcfhdrxgidszhyehcfdrlsywfggrnfzdfhhpjxvsufvpiysxislfxifgysesnjdfpyjdtjxsydiszcfdivfdumrgsxkyvkflwsnchafmydhcicfiusxncfdariundyjxlrxlarxuriiyjxhghcrhsgrvvswfrxhmcfxsgrslhcfgyjdifmrgivygfhycywfajhhcsxusxnrayjhshsrwxyhgjdfshwrufggfxgfhyhcsxugcfmrghcfgyjdifhcfwfggrnfgghsvvuffziywsxnrxlsrwnjfggsxnhcrhgcfcrgnyxfgyhcfdfwjghafgywfyhcfdgyjdifeydyjdsxhfvvsnfxifgywfhcsxnsgayhcfdsxnwfrayjhhcfhyxfyehcfwfggrnfgmcplyfgyjdrxhrnyxsghuffzhrjxhsxnjgrayjhyjdrvvsfgshsgxyhvsufhcfhcsxngmfrdfafsxnrguflhyasleydrdfhcsxngmfrdfvsufvphycslfedywyxfrxyhcfdrehfdrvvrxpmrpseyvvymflyxfyeyjdedfxiciyvvfrnjfghyedsfldsicghdrggfrxlmrhicflcfdhdphyzsiujzhcfufpedywvyiufdgffwghycrkfaffxriyxsiyjvlxhivfrdvpgffmcrhmrgnysxnyxajhgcflslxhgffwhyafravfhyyzfxvyiufdrxlvfehyaksyjgvpjzgfhrehfdgcfcrlnyxfshyyurvyyurhvyiufdshcrgrervgfariugysrwnjfggsxnhcfwyxfpmrghrufxajhxyhcsxnzdykslflsxfoicrxnfiyjvlpyjlsnrdyjxlmshcpyjdiyxhrihgsxhcfadshsgcrxldjggsrxfwarggsfgrxlgffsehcfprdfnfhhsxnhcfgrwfgydhyeiywwjxsirhsyxgwrpafpyjiyjvlmrdxhcfwaphcfmrplsfrvicfwsghfxzdytfihmrghcfiylfxrwfeydhcfxrqsrhywaywafeeydhscrlrdjxsxmshchcfwljdsxnhcfmrdmcfxmfmfdfhdpsxnhyuffzhcfsdcrxlgyeehcfcfrkpmrhfdgjzzvpdfwfwafdhcfaywasxnsxkfwyduhcrhmrgjgyddrhcfdyjdxydlsirvvsfgrxpmrpshsgghsvvhyzgfidfhgyhcferihyjdzdyhrnyxsghuxymgrayjhshsggsnxsesirxhsgjgzfihhcfufphyhcsgmcyvfwpghfdpvsfgsxhcfsdslfxhshpsemfuxfmmcyhcfpmfdfmydusxneydmfwsnchafravfhyesnjdfyjhmcrhhcfprdfjzhyyxfvrghhcsxnrihsxnyxrcjxicshyyurvyyurhgywfyehcfedfxiclfrlldyzgrehfdhcfedsfldsicghdrggfsxislfxhrxleyjxlhcfrhhricfliywwjxsirhsyxscrkfxhcrlhswfhyidriushajhshcsxushwrpafrksnfxfdfrnrsxajhscrkfxhcrlricrxifhyhdparaarnfghdsiuyxshpfhnskfshhypyjdavriuicrwafdrxlgffmcrhhcfpirxwrufyeshrvvhcfafghcrddp'"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c6a"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'CHARLIE IT WAS THE TYPO IN RAT I LINES THAT GAVE IT AWAY IT APPEARED BOTH IN THE TYPED MESSAGES WE PICKED UP AND IN THE TRANSCRIPT OF THE RADIO MESSAGE PRETTY UNLIKELY COINCIDENCE SO I FIGURE YOUR JUNIOR CIPHER CLERK WAS INVOLVED MIGHT BE WORTH CHECKING HER BACKGROUND AND BANK ACCOUNTS THAT IS ALL I MEANT WHEN I SAID THE SOURCE WAS CLOSE TO HOME BUT THINKING ABOUT IT I AM NOT SURE IT MAKES SENSE TO THINK SHE WAS THE SOURCE THE MESSAGES STILL KEEP COMING AND I AM GUESSING THAT SHE HAS GONE SO THERE MUST BE SOME OTHER SOURCE FOR OUR INTELLIGENCE SOMETHING IS BOTHERING ME ABOUT THE TONE OF THE MESSAGES WHY DOES OUR ANTAGONIST KEEP TAUNTING US ABOUT OUR ALLIES IT IS NOT LIKE THE THINGS WE ARE BEING ASKED TO BID FOR ARE THINGS WE ARE LIKELY TO HIDE FROM ONE ANOTHER AFTER ALL ANYWAY I FOLLOWED ONE OF OUR FRENCH COLLEAGUES TO FRIEDRICHSTRASSE AND WATCHED HER TRY TO PICKUP THE KEY FROM LOCKER SEEMS TO HAVE BEEN A CON I COULDNT CLEARLY SEE WHAT WAS GOING ON BUT SHE DIDNT SEEM TO BE ABLE TO OPEN LOCKER AND LEFT OBVIOUSLY UPSET AFTER SHE HAD GONE I TOOK A LOOK AT LOCKER IT HAS A FALSE BACK SO I AM GUESSING THE MONEY WAS TAKEN BUT NOTHING PROVIDED IN EXCHANGE COULD YOU DIG AROUND WITH YOUR CONTACTS IN THE BRITISH AND RUSSIAN EMBASSIES AND SEE IF THEY ARE GETTING THE SAME SORT OF COMMUNICATIONS MAYBE YOU COULD WARN THEM BY THE WAY DIE ALCHEMIST EN PROJECT WAS THE CODENAME FOR THE NAZI ATOM BOMB EFFORT I HAD A RUN IN WITH THEM DURING THE WAR WHEN WE WERE TRYING TO KEEP THEIR HANDS OFF THE HEAVY WATER SUPPLY REMEMBER THE BOMBING IN VE MORK THAT WAS US OR RATHER OUR NORDIC ALLIES ANYWAY IT IS STILL TOP SECRET SO THE FACT OUR PROTAGONIST KNOWS ABOUT IT IS SIGNIFICANT I SUSPECT THE KEY TO THIS WHOLE MYSTERY LIES IN THEIR IDENTITY IF WE KNEW WHO THEY WERE WORKING FOR WE MIGHT BE ABLE TO FIGURE OUT WHAT THEY ARE UP TO ONE LAST THING ACTING ON A HUNCH I TOOK A LOOK AT SOME OF THE FRENCH DEAD DROPS AFTER THE FRIEDRICHSTRASSE INCIDENT AND FOUND THE ATTACHED COMMUNICATION I HAVENT HAD TIME TO CRACK IT BUT I THINK IT MAYBE AVI GENERE AGAIN BUT I HAVENT HAD A CHANCE TO TRY BABBAGE STRICK ON IT YET GIVE IT TO YOUR BLACK CHAMBER AND SEE WHAT THEY CAN MAKE OF IT ALL THE BEST HARRY'"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "translations = {'c': 'H', 'r': 'A', 'd': 'R', 'p': 'Y', 'i': 'C', 'd': 'R', 'v': 'L', 's': 'I', 'f': 'E', \n",
+    "                'h': 'T', 'a': 'B', 'g': 'S', 'm': 'W', 'y': 'O', 'z': 'P', 'n': 'G', 'j': 'U', 't': 'J',\n",
+    "               'x': 'N', 'k': 'V', 'l': 'D', 'w': 'M', 'u': 'K', 'e': 'F', 'q': 'Z', 'o': 'X'}\n",
+    "translation_table = ''.maketrans(translations)\n",
+    "plaintext = ' '.join(segment(c6a.translate(translation_table)))\n",
+    "plaintext"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'BHRFESTCUVDWGXYZAIJKLMNOP'"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "''.join(translations[l] for l in sorted(translations))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'railfencstuvwxyzdghjkmopq'"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "inverted_translations = {translations[a]: a for a in translations}\n",
+    "''.join(inverted_translations[l] for l in sorted(inverted_translations))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'railfencstuvwxyzbdghjkmopq'"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "keyword_cipher_alphabet_of('railfences', wrap_alphabet=KeywordWrapAlphabet.from_last)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "charlie it was the typo in rat i lines that gave it away it appeared both in the typed messages we picked up and in the transcript of the radio message pretty unlikely coincidence so i figure your junior cipher clerk was involved might be worth checking her background and bank accounts that is all i meant when i said the source was close to home but thinking about it i am not sure it makes sense to think she was the source the messages still keep coming and i am guessing that she has gone so there must be some other source for our intelligence something is bothering me about the tone of the messages why does our antagonist keep taunting us about our allies it is not like the things we are being asked to bid for are things we are likely to hide from one another after all anyway i followed one of our french colleagues to friedrichstrasse and watched her try to pickup the key from locker seems to have been a con i couldnt clearly see what was going on but she didnt seem to be able to open locker and left obviously upset after she had gone i took a look at locker it has a false back so i am guessing the money was taken but nothing provided in exchange could you dig around with your contacts in the british and russian embassies and see if they are getting the same sort of communications maybe you could warn them by the way die alchemist en project was the codename for the nazi atom bomb effort i had a run in with them during the war when we were trying to keep their hands off the heavy water supply remember the bombing in ve mork that was us or rather our nordic allies anyway it is still top secret so the fact our protagonist knows about it is significant i suspect the key to this whole mystery lies in their identity if we knew who they were working for we might be able to figure out what they are up to one last thing acting on a hunch i took a look at some of the french dead drops after the friedrichstrasse incident and found the attached communication i havent had time to crack it but i think it maybe avi genere again but i havent had a chance to try babbage strick on it yet give it to your black chamber and see what they can make of it all the best harry\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(keyword_decipher(c6a, 'railfences', wrap_alphabet=KeywordWrapAlphabet.from_last))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('kremlin', -908.5396262316657)"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = vigenere_frequency_break(c6b)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "the americans have robbed you rather than trying to outbid you they got to the lockers first and arranged to steal your money and the valuable intelligence i provided for you they can not be trusted none of your allies can be trusted they believe that they can cheat you but they do not understand that you can only cheat in a game and this is not a game if you try to playa game of chess like your allies we will find ourselves in a stalemate you have been warned so let us start again i can let you have the address of another safehouse at a small discount on our original price and i will include the identity of a british double agent working in your embassy shall we say four hundred thousand francs to be paid directly to an account of my choosing if you want to know more about the treachery of your so called friends then let us meet in the park by the british embassy on friday at eleven\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(vigenere_decipher(sanitise(c6b), key_b)))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2015/2015-challenge7.ipynb b/2015/2015-challenge7.ipynb
new file mode 100644 (file)
index 0000000..4fb1a18
--- /dev/null
@@ -0,0 +1,1580 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c7a = sanitise(open('7a.ciphertext').read())\n",
+    "c7b = sanitise(open('7b.ciphertext').read())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('annmarie', <KeywordWrapAlphabet.from_largest: 3>), -1865.8708508162845)"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(key_a_word, key_a_wrap), score = keyword_break_mp(c7a)\n",
+    "(key_a_word, key_a_wrap), score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "dhorlieithinkiknacchotisgainganfutineewtadhedkobecthingsfebareirepartcemoyhoveonappartunityhereidhedkewthedipherdlerksfodkgraunwonwitturnsautsheischiterussionherbomilylebtmasdacinfutshehosrelotivesinthegulogotpermshedleorlyhosnalavebarthesavietgavernmentsaiomstillnatsurechashecoscarkingbarfutithinkthisiskeyintelligendeinthemeontimeihovefeencotdhingthefritstheyseemtahovefeenindantodtcithaurbrienwsinthereidhswaktaronwtheyinturnhovefeencotdhingthebrendhitseemslikeceoreollcarkingogoinstaneonatherchidhireollywiwntexpedtonwgivenchotcereowinthebrendhwadumentlostceekiwantthinkthotisodaindiwendemyacnguessisthottherussionsknacchotisgainganonwthotaurfesthapeabundaveringitistafreokintatheirhqonwtrytabinwsamethingthereunbartunotelyoddarwingtamysaurdeyuritheyhovetokentausingonecdiphersalitoirebarordhivestarogeabtapsedretbilessaevenibcemonogetasteoltherelevontbileitcilltokeolatabdamputingtafreokthedipheriottodhofriebmessogebramyuriendryptewusingonomsdadipherkeycarwlengthissixinchidhhewesdrifesthedipheritisverydleversimpletaimplementfutoweviltadrodkonwmyanehapeisthotcedonolsabinwthedipherkeychileinthehqarotleostportabitiplontaenterintcaceeksanwedemfersixteenththerussionsorehastingolorgeprapogonwoeventosportabtheinternotianolefouousstellungcithleowingpalitfuramemfersinottenwondemastabthesedurityteomcillfeaddupiewciththotonwhqseduritycillferelotivelylightcithludkicillgetinonwautciththebilesceneewthotnightonwthencedongettathefattamabthechalereidhswaktarstrotogemollthefesthorry\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(keyword_decipher(c7a, key_a_word, wrap_alphabet=key_a_wrap))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false,
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'A': 'a',\n",
+       " 'B': 'o',\n",
+       " 'C': 'p',\n",
+       " 'D': 'q',\n",
+       " 'E': 'f',\n",
+       " 'F': 'r',\n",
+       " 'G': 's',\n",
+       " 'H': 't',\n",
+       " 'I': 'e',\n",
+       " 'J': 'u',\n",
+       " 'K': 'v',\n",
+       " 'L': 'w',\n",
+       " 'M': 'c',\n",
+       " 'N': 'b',\n",
+       " 'O': 'x',\n",
+       " 'P': 'y',\n",
+       " 'Q': 'z',\n",
+       " 'R': 'd',\n",
+       " 'S': 'g',\n",
+       " 'T': 'h',\n",
+       " 'U': 'i',\n",
+       " 'V': 'j',\n",
+       " 'W': 'k',\n",
+       " 'X': 'l',\n",
+       " 'Y': 'm',\n",
+       " 'Z': 'n'}"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "trans_a = {p.upper(): c for p, c in zip(keyword_cipher_alphabet_of(key_a_word, wrap_alphabet=key_a_wrap), string.ascii_lowercase, )}\n",
+    "trans_a"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'charlie i think i know what is going on but i need to check a few things before i report we may have an opportunity here i checked the cipher clerks background and it turns out she is white russian her family left moscow in but she has relatives in the gulag at perm she clearly has no love for the soviet government so i am still not sure who she was working for but i think this is key intelligence in the meantime i have been watching the brits they seem to have been in contact with our friends in the reichs doktor and they in turn have been watching the french it seems like we are all working against one another which i really didnt expect and given what we read in the french document last week i dont think that is a coincidence my own guess is that the russians know what is going on and that our best hope of uncovering it is to break into their hq and try to find something there unfortunately according to my source yuri they have taken to using a new cipher solitaire for archive storage of top secret files so even if we manage to steal the relevant file it will take alot of computing to break the cipher i attach a brief message from yuri encrypted using an amsco cipher keyword length is six in which he describes the cipher it is very clever simple to implement but a devil to crack and my one hope is that we can also find the cipher key while in the hq or atleast part of it i plan to enter in two weeks on december sixteenth the russians are hosting a large propaganda event as part of the international ebau ausstellung with leading politburo members in attendance most of the security team will be occupied with that and hq security will be relatively light with luck i will get in and out with the files we need that night and then we can get to the bottom of the whole reichs doktor stratagem all the best harry'"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "translations = {\n",
+    " 'A': 'o',\n",
+    " 'B': 'a',\n",
+    " 'C': 'p',\n",
+    " 'D': 'q',\n",
+    " 'E': 'b',\n",
+    " 'F': 'r',\n",
+    " 'G': 's',\n",
+    " 'H': 't',\n",
+    " 'I': 'e',\n",
+    " 'J': 'u',\n",
+    " 'K': 'v',\n",
+    " 'L': 'd',\n",
+    " 'M': 'w',\n",
+    " 'N': 'f',\n",
+    " 'O': 'x',\n",
+    " 'P': 'y',\n",
+    " 'Q': 'z',\n",
+    " 'R': 'c',\n",
+    " 'S': 'g',\n",
+    " 'T': 'h',\n",
+    " 'U': 'i',\n",
+    " 'V': 'j',\n",
+    " 'W': 'k',\n",
+    " 'X': 'l',\n",
+    " 'Y': 'm',\n",
+    " 'Z': 'n'}\n",
+    "translation_table = ''.maketrans(translations)\n",
+    "plaintext = ' '.join(segment(c7a.upper().translate(translation_table)))\n",
+    "plaintext"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'oapqbrsteuvdwfxyzcghijklmn'"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "''.join(translations[l] for l in sorted(translations))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'BERLINSTUVWXYZACDFGHJKMOPQ'"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "inverted_translations = {translations[a]: a for a in translations}\n",
+    "''.join(inverted_translations[l] for l in sorted(inverted_translations))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'berlinstuvwxyzacdfghjkmopq'"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "keyword_cipher_alphabet_of('berlin', wrap_alphabet=KeywordWrapAlphabet.from_largest)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "charlie i think i know what is going on but i need to check a few things before i report we may have an opportunity here i checked the cipher clerks background and it turns out she is white russian her family left moscow in but she has relatives in the gulag at perm she clearly has no love for the soviet government so i am still not sure who she was working for but i think this is key intelligence in the meantime i have been watching the brits they seem to have been in contact with our friends in the reichs doktor and they in turn have been watching the french it seems like we are all working against one another which i really didnt expect and given what we read in the french document last week i dont think that is a coincidence my own guess is that the russians know what is going on and that our best hope of uncovering it is to break into their hq and try to find something there unfortunately according to my source yuri they have taken to using a new cipher solitaire for archive storage of top secret files so even if we manage to steal the relevant file it will take alot of computing to break the cipher i attach a brief message from yuri encrypted using an amsco cipher keyword length is six in which he describes the cipher it is very clever simple to implement but a devil to crack and my one hope is that we can also find the cipher key while in the hq or atleast part of it i plan to enter in two weeks on december sixteenth the russians are hosting a large propaganda event as part of the international ebau ausstellung with leading politburo members in attendance most of the security team will be occupied with that and hq security will be relatively light with luck i will get in and out with the files we need that night and then we can get to the bottom of the whole reichs doktor stratagem all the best harry\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(keyword_decipher(c7a, 'berlin', wrap_alphabet=KeywordWrapAlphabet.from_largest))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{(0, 1, 2, 3, 4, 5): (0, 1, 2, 3, 4, 5),\n",
+       " (0, 1, 2, 3, 5, 4): (0, 1, 2, 3, 5, 4),\n",
+       " (0, 1, 2, 4, 3, 5): (0, 1, 2, 4, 3, 5),\n",
+       " (0, 1, 2, 4, 5, 3): (0, 1, 2, 4, 5, 3),\n",
+       " (0, 1, 2, 5, 3, 4): (0, 1, 2, 5, 3, 4),\n",
+       " (0, 1, 2, 5, 4, 3): (0, 1, 2, 5, 4, 3),\n",
+       " (0, 1, 3, 2, 4, 5): (0, 1, 3, 2, 4, 5),\n",
+       " (0, 1, 3, 2, 5, 4): (0, 1, 3, 2, 5, 4),\n",
+       " (0, 1, 3, 4, 2, 5): (0, 1, 3, 4, 2, 5),\n",
+       " (0, 1, 3, 4, 5, 2): (0, 1, 3, 4, 5, 2),\n",
+       " (0, 1, 3, 5, 2, 4): (0, 1, 3, 5, 2, 4),\n",
+       " (0, 1, 3, 5, 4, 2): (0, 1, 3, 5, 4, 2),\n",
+       " (0, 1, 4, 2, 3, 5): (0, 1, 4, 2, 3, 5),\n",
+       " (0, 1, 4, 2, 5, 3): (0, 1, 4, 2, 5, 3),\n",
+       " (0, 1, 4, 3, 2, 5): (0, 1, 4, 3, 2, 5),\n",
+       " (0, 1, 4, 3, 5, 2): (0, 1, 4, 3, 5, 2),\n",
+       " (0, 1, 4, 5, 2, 3): (0, 1, 4, 5, 2, 3),\n",
+       " (0, 1, 4, 5, 3, 2): (0, 1, 4, 5, 3, 2),\n",
+       " (0, 1, 5, 2, 3, 4): (0, 1, 5, 2, 3, 4),\n",
+       " (0, 1, 5, 2, 4, 3): (0, 1, 5, 2, 4, 3),\n",
+       " (0, 1, 5, 3, 2, 4): (0, 1, 5, 3, 2, 4),\n",
+       " (0, 1, 5, 3, 4, 2): (0, 1, 5, 3, 4, 2),\n",
+       " (0, 1, 5, 4, 2, 3): (0, 1, 5, 4, 2, 3),\n",
+       " (0, 1, 5, 4, 3, 2): (0, 1, 5, 4, 3, 2),\n",
+       " (0, 2, 1, 3, 4, 5): (0, 2, 1, 3, 4, 5),\n",
+       " (0, 2, 1, 3, 5, 4): (0, 2, 1, 3, 5, 4),\n",
+       " (0, 2, 1, 4, 3, 5): (0, 2, 1, 4, 3, 5),\n",
+       " (0, 2, 1, 4, 5, 3): (0, 2, 1, 4, 5, 3),\n",
+       " (0, 2, 1, 5, 3, 4): (0, 2, 1, 5, 3, 4),\n",
+       " (0, 2, 1, 5, 4, 3): (0, 2, 1, 5, 4, 3),\n",
+       " (0, 2, 3, 1, 4, 5): (0, 2, 3, 1, 4, 5),\n",
+       " (0, 2, 3, 1, 5, 4): (0, 2, 3, 1, 5, 4),\n",
+       " (0, 2, 3, 4, 1, 5): (0, 2, 3, 4, 1, 5),\n",
+       " (0, 2, 3, 4, 5, 1): (0, 2, 3, 4, 5, 1),\n",
+       " (0, 2, 3, 5, 1, 4): (0, 2, 3, 5, 1, 4),\n",
+       " (0, 2, 3, 5, 4, 1): (0, 2, 3, 5, 4, 1),\n",
+       " (0, 2, 4, 1, 3, 5): (0, 2, 4, 1, 3, 5),\n",
+       " (0, 2, 4, 1, 5, 3): (0, 2, 4, 1, 5, 3),\n",
+       " (0, 2, 4, 3, 1, 5): (0, 2, 4, 3, 1, 5),\n",
+       " (0, 2, 4, 3, 5, 1): (0, 2, 4, 3, 5, 1),\n",
+       " (0, 2, 4, 5, 1, 3): (0, 2, 4, 5, 1, 3),\n",
+       " (0, 2, 4, 5, 3, 1): (0, 2, 4, 5, 3, 1),\n",
+       " (0, 2, 5, 1, 3, 4): (0, 2, 5, 1, 3, 4),\n",
+       " (0, 2, 5, 1, 4, 3): (0, 2, 5, 1, 4, 3),\n",
+       " (0, 2, 5, 3, 1, 4): (0, 2, 5, 3, 1, 4),\n",
+       " (0, 2, 5, 3, 4, 1): (0, 2, 5, 3, 4, 1),\n",
+       " (0, 2, 5, 4, 1, 3): (0, 2, 5, 4, 1, 3),\n",
+       " (0, 2, 5, 4, 3, 1): (0, 2, 5, 4, 3, 1),\n",
+       " (0, 3, 1, 2, 4, 5): (0, 3, 1, 2, 4, 5),\n",
+       " (0, 3, 1, 2, 5, 4): (0, 3, 1, 2, 5, 4),\n",
+       " (0, 3, 1, 4, 2, 5): (0, 3, 1, 4, 2, 5),\n",
+       " (0, 3, 1, 4, 5, 2): (0, 3, 1, 4, 5, 2),\n",
+       " (0, 3, 1, 5, 2, 4): (0, 3, 1, 5, 2, 4),\n",
+       " (0, 3, 1, 5, 4, 2): (0, 3, 1, 5, 4, 2),\n",
+       " (0, 3, 2, 1, 4, 5): (0, 3, 2, 1, 4, 5),\n",
+       " (0, 3, 2, 1, 5, 4): (0, 3, 2, 1, 5, 4),\n",
+       " (0, 3, 2, 4, 1, 5): (0, 3, 2, 4, 1, 5),\n",
+       " (0, 3, 2, 4, 5, 1): (0, 3, 2, 4, 5, 1),\n",
+       " (0, 3, 2, 5, 1, 4): (0, 3, 2, 5, 1, 4),\n",
+       " (0, 3, 2, 5, 4, 1): (0, 3, 2, 5, 4, 1),\n",
+       " (0, 3, 4, 1, 2, 5): (0, 3, 4, 1, 2, 5),\n",
+       " (0, 3, 4, 1, 5, 2): (0, 3, 4, 1, 5, 2),\n",
+       " (0, 3, 4, 2, 1, 5): (0, 3, 4, 2, 1, 5),\n",
+       " (0, 3, 4, 2, 5, 1): (0, 3, 4, 2, 5, 1),\n",
+       " (0, 3, 4, 5, 1, 2): (0, 3, 4, 5, 1, 2),\n",
+       " (0, 3, 4, 5, 2, 1): (0, 3, 4, 5, 2, 1),\n",
+       " (0, 3, 5, 1, 2, 4): (0, 3, 5, 1, 2, 4),\n",
+       " (0, 3, 5, 1, 4, 2): (0, 3, 5, 1, 4, 2),\n",
+       " (0, 3, 5, 2, 1, 4): (0, 3, 5, 2, 1, 4),\n",
+       " (0, 3, 5, 2, 4, 1): (0, 3, 5, 2, 4, 1),\n",
+       " (0, 3, 5, 4, 1, 2): (0, 3, 5, 4, 1, 2),\n",
+       " (0, 3, 5, 4, 2, 1): (0, 3, 5, 4, 2, 1),\n",
+       " (0, 4, 1, 2, 3, 5): (0, 4, 1, 2, 3, 5),\n",
+       " (0, 4, 1, 2, 5, 3): (0, 4, 1, 2, 5, 3),\n",
+       " (0, 4, 1, 3, 2, 5): (0, 4, 1, 3, 2, 5),\n",
+       " (0, 4, 1, 3, 5, 2): (0, 4, 1, 3, 5, 2),\n",
+       " (0, 4, 1, 5, 2, 3): (0, 4, 1, 5, 2, 3),\n",
+       " (0, 4, 1, 5, 3, 2): (0, 4, 1, 5, 3, 2),\n",
+       " (0, 4, 2, 1, 3, 5): (0, 4, 2, 1, 3, 5),\n",
+       " (0, 4, 2, 1, 5, 3): (0, 4, 2, 1, 5, 3),\n",
+       " (0, 4, 2, 3, 1, 5): (0, 4, 2, 3, 1, 5),\n",
+       " (0, 4, 2, 3, 5, 1): (0, 4, 2, 3, 5, 1),\n",
+       " (0, 4, 2, 5, 1, 3): (0, 4, 2, 5, 1, 3),\n",
+       " (0, 4, 2, 5, 3, 1): (0, 4, 2, 5, 3, 1),\n",
+       " (0, 4, 3, 1, 2, 5): (0, 4, 3, 1, 2, 5),\n",
+       " (0, 4, 3, 1, 5, 2): (0, 4, 3, 1, 5, 2),\n",
+       " (0, 4, 3, 2, 1, 5): (0, 4, 3, 2, 1, 5),\n",
+       " (0, 4, 3, 2, 5, 1): (0, 4, 3, 2, 5, 1),\n",
+       " (0, 4, 3, 5, 1, 2): (0, 4, 3, 5, 1, 2),\n",
+       " (0, 4, 3, 5, 2, 1): (0, 4, 3, 5, 2, 1),\n",
+       " (0, 4, 5, 1, 2, 3): (0, 4, 5, 1, 2, 3),\n",
+       " (0, 4, 5, 1, 3, 2): (0, 4, 5, 1, 3, 2),\n",
+       " (0, 4, 5, 2, 1, 3): (0, 4, 5, 2, 1, 3),\n",
+       " (0, 4, 5, 2, 3, 1): (0, 4, 5, 2, 3, 1),\n",
+       " (0, 4, 5, 3, 1, 2): (0, 4, 5, 3, 1, 2),\n",
+       " (0, 4, 5, 3, 2, 1): (0, 4, 5, 3, 2, 1),\n",
+       " (0, 5, 1, 2, 3, 4): (0, 5, 1, 2, 3, 4),\n",
+       " (0, 5, 1, 2, 4, 3): (0, 5, 1, 2, 4, 3),\n",
+       " (0, 5, 1, 3, 2, 4): (0, 5, 1, 3, 2, 4),\n",
+       " (0, 5, 1, 3, 4, 2): (0, 5, 1, 3, 4, 2),\n",
+       " (0, 5, 1, 4, 2, 3): (0, 5, 1, 4, 2, 3),\n",
+       " (0, 5, 1, 4, 3, 2): (0, 5, 1, 4, 3, 2),\n",
+       " (0, 5, 2, 1, 3, 4): (0, 5, 2, 1, 3, 4),\n",
+       " (0, 5, 2, 1, 4, 3): (0, 5, 2, 1, 4, 3),\n",
+       " (0, 5, 2, 3, 1, 4): (0, 5, 2, 3, 1, 4),\n",
+       " (0, 5, 2, 3, 4, 1): (0, 5, 2, 3, 4, 1),\n",
+       " (0, 5, 2, 4, 1, 3): (0, 5, 2, 4, 1, 3),\n",
+       " (0, 5, 2, 4, 3, 1): (0, 5, 2, 4, 3, 1),\n",
+       " (0, 5, 3, 1, 2, 4): (0, 5, 3, 1, 2, 4),\n",
+       " (0, 5, 3, 1, 4, 2): (0, 5, 3, 1, 4, 2),\n",
+       " (0, 5, 3, 2, 1, 4): (0, 5, 3, 2, 1, 4),\n",
+       " (0, 5, 3, 2, 4, 1): (0, 5, 3, 2, 4, 1),\n",
+       " (0, 5, 3, 4, 1, 2): (0, 5, 3, 4, 1, 2),\n",
+       " (0, 5, 3, 4, 2, 1): (0, 5, 3, 4, 2, 1),\n",
+       " (0, 5, 4, 1, 2, 3): (0, 5, 4, 1, 2, 3),\n",
+       " (0, 5, 4, 1, 3, 2): (0, 5, 4, 1, 3, 2),\n",
+       " (0, 5, 4, 2, 1, 3): (0, 5, 4, 2, 1, 3),\n",
+       " (0, 5, 4, 2, 3, 1): (0, 5, 4, 2, 3, 1),\n",
+       " (0, 5, 4, 3, 1, 2): (0, 5, 4, 3, 1, 2),\n",
+       " (0, 5, 4, 3, 2, 1): (0, 5, 4, 3, 2, 1),\n",
+       " (1, 0, 2, 3, 4, 5): (1, 0, 2, 3, 4, 5),\n",
+       " (1, 0, 2, 3, 5, 4): (1, 0, 2, 3, 5, 4),\n",
+       " (1, 0, 2, 4, 3, 5): (1, 0, 2, 4, 3, 5),\n",
+       " (1, 0, 2, 4, 5, 3): (1, 0, 2, 4, 5, 3),\n",
+       " (1, 0, 2, 5, 3, 4): (1, 0, 2, 5, 3, 4),\n",
+       " (1, 0, 2, 5, 4, 3): (1, 0, 2, 5, 4, 3),\n",
+       " (1, 0, 3, 2, 4, 5): (1, 0, 3, 2, 4, 5),\n",
+       " (1, 0, 3, 2, 5, 4): (1, 0, 3, 2, 5, 4),\n",
+       " (1, 0, 3, 4, 2, 5): (1, 0, 3, 4, 2, 5),\n",
+       " (1, 0, 3, 4, 5, 2): (1, 0, 3, 4, 5, 2),\n",
+       " (1, 0, 3, 5, 2, 4): (1, 0, 3, 5, 2, 4),\n",
+       " (1, 0, 3, 5, 4, 2): (1, 0, 3, 5, 4, 2),\n",
+       " (1, 0, 4, 2, 3, 5): (1, 0, 4, 2, 3, 5),\n",
+       " (1, 0, 4, 2, 5, 3): (1, 0, 4, 2, 5, 3),\n",
+       " (1, 0, 4, 3, 2, 5): (1, 0, 4, 3, 2, 5),\n",
+       " (1, 0, 4, 3, 5, 2): (1, 0, 4, 3, 5, 2),\n",
+       " (1, 0, 4, 5, 2, 3): (1, 0, 4, 5, 2, 3),\n",
+       " (1, 0, 4, 5, 3, 2): (1, 0, 4, 5, 3, 2),\n",
+       " (1, 0, 5, 2, 3, 4): (1, 0, 5, 2, 3, 4),\n",
+       " (1, 0, 5, 2, 4, 3): (1, 0, 5, 2, 4, 3),\n",
+       " (1, 0, 5, 3, 2, 4): (1, 0, 5, 3, 2, 4),\n",
+       " (1, 0, 5, 3, 4, 2): (1, 0, 5, 3, 4, 2),\n",
+       " (1, 0, 5, 4, 2, 3): (1, 0, 5, 4, 2, 3),\n",
+       " (1, 0, 5, 4, 3, 2): (1, 0, 5, 4, 3, 2),\n",
+       " (1, 2, 0, 3, 4, 5): (1, 2, 0, 3, 4, 5),\n",
+       " (1, 2, 0, 3, 5, 4): (1, 2, 0, 3, 5, 4),\n",
+       " (1, 2, 0, 4, 3, 5): (1, 2, 0, 4, 3, 5),\n",
+       " (1, 2, 0, 4, 5, 3): (1, 2, 0, 4, 5, 3),\n",
+       " (1, 2, 0, 5, 3, 4): (1, 2, 0, 5, 3, 4),\n",
+       " (1, 2, 0, 5, 4, 3): (1, 2, 0, 5, 4, 3),\n",
+       " (1, 2, 3, 0, 4, 5): (1, 2, 3, 0, 4, 5),\n",
+       " (1, 2, 3, 0, 5, 4): (1, 2, 3, 0, 5, 4),\n",
+       " (1, 2, 3, 4, 0, 5): (1, 2, 3, 4, 0, 5),\n",
+       " (1, 2, 3, 4, 5, 0): (1, 2, 3, 4, 5, 0),\n",
+       " (1, 2, 3, 5, 0, 4): (1, 2, 3, 5, 0, 4),\n",
+       " (1, 2, 3, 5, 4, 0): (1, 2, 3, 5, 4, 0),\n",
+       " (1, 2, 4, 0, 3, 5): (1, 2, 4, 0, 3, 5),\n",
+       " (1, 2, 4, 0, 5, 3): (1, 2, 4, 0, 5, 3),\n",
+       " (1, 2, 4, 3, 0, 5): (1, 2, 4, 3, 0, 5),\n",
+       " (1, 2, 4, 3, 5, 0): (1, 2, 4, 3, 5, 0),\n",
+       " (1, 2, 4, 5, 0, 3): (1, 2, 4, 5, 0, 3),\n",
+       " (1, 2, 4, 5, 3, 0): (1, 2, 4, 5, 3, 0),\n",
+       " (1, 2, 5, 0, 3, 4): (1, 2, 5, 0, 3, 4),\n",
+       " (1, 2, 5, 0, 4, 3): (1, 2, 5, 0, 4, 3),\n",
+       " (1, 2, 5, 3, 0, 4): (1, 2, 5, 3, 0, 4),\n",
+       " (1, 2, 5, 3, 4, 0): (1, 2, 5, 3, 4, 0),\n",
+       " (1, 2, 5, 4, 0, 3): (1, 2, 5, 4, 0, 3),\n",
+       " (1, 2, 5, 4, 3, 0): (1, 2, 5, 4, 3, 0),\n",
+       " (1, 3, 0, 2, 4, 5): (1, 3, 0, 2, 4, 5),\n",
+       " (1, 3, 0, 2, 5, 4): (1, 3, 0, 2, 5, 4),\n",
+       " (1, 3, 0, 4, 2, 5): (1, 3, 0, 4, 2, 5),\n",
+       " (1, 3, 0, 4, 5, 2): (1, 3, 0, 4, 5, 2),\n",
+       " (1, 3, 0, 5, 2, 4): (1, 3, 0, 5, 2, 4),\n",
+       " (1, 3, 0, 5, 4, 2): (1, 3, 0, 5, 4, 2),\n",
+       " (1, 3, 2, 0, 4, 5): (1, 3, 2, 0, 4, 5),\n",
+       " (1, 3, 2, 0, 5, 4): (1, 3, 2, 0, 5, 4),\n",
+       " (1, 3, 2, 4, 0, 5): (1, 3, 2, 4, 0, 5),\n",
+       " (1, 3, 2, 4, 5, 0): (1, 3, 2, 4, 5, 0),\n",
+       " (1, 3, 2, 5, 0, 4): (1, 3, 2, 5, 0, 4),\n",
+       " (1, 3, 2, 5, 4, 0): (1, 3, 2, 5, 4, 0),\n",
+       " (1, 3, 4, 0, 2, 5): (1, 3, 4, 0, 2, 5),\n",
+       " (1, 3, 4, 0, 5, 2): (1, 3, 4, 0, 5, 2),\n",
+       " (1, 3, 4, 2, 0, 5): (1, 3, 4, 2, 0, 5),\n",
+       " (1, 3, 4, 2, 5, 0): (1, 3, 4, 2, 5, 0),\n",
+       " (1, 3, 4, 5, 0, 2): (1, 3, 4, 5, 0, 2),\n",
+       " (1, 3, 4, 5, 2, 0): (1, 3, 4, 5, 2, 0),\n",
+       " (1, 3, 5, 0, 2, 4): (1, 3, 5, 0, 2, 4),\n",
+       " (1, 3, 5, 0, 4, 2): (1, 3, 5, 0, 4, 2),\n",
+       " (1, 3, 5, 2, 0, 4): (1, 3, 5, 2, 0, 4),\n",
+       " (1, 3, 5, 2, 4, 0): (1, 3, 5, 2, 4, 0),\n",
+       " (1, 3, 5, 4, 0, 2): (1, 3, 5, 4, 0, 2),\n",
+       " (1, 3, 5, 4, 2, 0): (1, 3, 5, 4, 2, 0),\n",
+       " (1, 4, 0, 2, 3, 5): (1, 4, 0, 2, 3, 5),\n",
+       " (1, 4, 0, 2, 5, 3): (1, 4, 0, 2, 5, 3),\n",
+       " (1, 4, 0, 3, 2, 5): (1, 4, 0, 3, 2, 5),\n",
+       " (1, 4, 0, 3, 5, 2): (1, 4, 0, 3, 5, 2),\n",
+       " (1, 4, 0, 5, 2, 3): (1, 4, 0, 5, 2, 3),\n",
+       " (1, 4, 0, 5, 3, 2): (1, 4, 0, 5, 3, 2),\n",
+       " (1, 4, 2, 0, 3, 5): (1, 4, 2, 0, 3, 5),\n",
+       " (1, 4, 2, 0, 5, 3): (1, 4, 2, 0, 5, 3),\n",
+       " (1, 4, 2, 3, 0, 5): (1, 4, 2, 3, 0, 5),\n",
+       " (1, 4, 2, 3, 5, 0): (1, 4, 2, 3, 5, 0),\n",
+       " (1, 4, 2, 5, 0, 3): (1, 4, 2, 5, 0, 3),\n",
+       " (1, 4, 2, 5, 3, 0): (1, 4, 2, 5, 3, 0),\n",
+       " (1, 4, 3, 0, 2, 5): (1, 4, 3, 0, 2, 5),\n",
+       " (1, 4, 3, 0, 5, 2): (1, 4, 3, 0, 5, 2),\n",
+       " (1, 4, 3, 2, 0, 5): (1, 4, 3, 2, 0, 5),\n",
+       " (1, 4, 3, 2, 5, 0): (1, 4, 3, 2, 5, 0),\n",
+       " (1, 4, 3, 5, 0, 2): (1, 4, 3, 5, 0, 2),\n",
+       " (1, 4, 3, 5, 2, 0): (1, 4, 3, 5, 2, 0),\n",
+       " (1, 4, 5, 0, 2, 3): (1, 4, 5, 0, 2, 3),\n",
+       " (1, 4, 5, 0, 3, 2): (1, 4, 5, 0, 3, 2),\n",
+       " (1, 4, 5, 2, 0, 3): (1, 4, 5, 2, 0, 3),\n",
+       " (1, 4, 5, 2, 3, 0): (1, 4, 5, 2, 3, 0),\n",
+       " (1, 4, 5, 3, 0, 2): (1, 4, 5, 3, 0, 2),\n",
+       " (1, 4, 5, 3, 2, 0): (1, 4, 5, 3, 2, 0),\n",
+       " (1, 5, 0, 2, 3, 4): (1, 5, 0, 2, 3, 4),\n",
+       " (1, 5, 0, 2, 4, 3): (1, 5, 0, 2, 4, 3),\n",
+       " (1, 5, 0, 3, 2, 4): (1, 5, 0, 3, 2, 4),\n",
+       " (1, 5, 0, 3, 4, 2): (1, 5, 0, 3, 4, 2),\n",
+       " (1, 5, 0, 4, 2, 3): (1, 5, 0, 4, 2, 3),\n",
+       " (1, 5, 0, 4, 3, 2): (1, 5, 0, 4, 3, 2),\n",
+       " (1, 5, 2, 0, 3, 4): (1, 5, 2, 0, 3, 4),\n",
+       " (1, 5, 2, 0, 4, 3): (1, 5, 2, 0, 4, 3),\n",
+       " (1, 5, 2, 3, 0, 4): (1, 5, 2, 3, 0, 4),\n",
+       " (1, 5, 2, 3, 4, 0): (1, 5, 2, 3, 4, 0),\n",
+       " (1, 5, 2, 4, 0, 3): (1, 5, 2, 4, 0, 3),\n",
+       " (1, 5, 2, 4, 3, 0): (1, 5, 2, 4, 3, 0),\n",
+       " (1, 5, 3, 0, 2, 4): (1, 5, 3, 0, 2, 4),\n",
+       " (1, 5, 3, 0, 4, 2): (1, 5, 3, 0, 4, 2),\n",
+       " (1, 5, 3, 2, 0, 4): (1, 5, 3, 2, 0, 4),\n",
+       " (1, 5, 3, 2, 4, 0): (1, 5, 3, 2, 4, 0),\n",
+       " (1, 5, 3, 4, 0, 2): (1, 5, 3, 4, 0, 2),\n",
+       " (1, 5, 3, 4, 2, 0): (1, 5, 3, 4, 2, 0),\n",
+       " (1, 5, 4, 0, 2, 3): (1, 5, 4, 0, 2, 3),\n",
+       " (1, 5, 4, 0, 3, 2): (1, 5, 4, 0, 3, 2),\n",
+       " (1, 5, 4, 2, 0, 3): (1, 5, 4, 2, 0, 3),\n",
+       " (1, 5, 4, 2, 3, 0): (1, 5, 4, 2, 3, 0),\n",
+       " (1, 5, 4, 3, 0, 2): (1, 5, 4, 3, 0, 2),\n",
+       " (1, 5, 4, 3, 2, 0): (1, 5, 4, 3, 2, 0),\n",
+       " (2, 0, 1, 3, 4, 5): (2, 0, 1, 3, 4, 5),\n",
+       " (2, 0, 1, 3, 5, 4): (2, 0, 1, 3, 5, 4),\n",
+       " (2, 0, 1, 4, 3, 5): (2, 0, 1, 4, 3, 5),\n",
+       " (2, 0, 1, 4, 5, 3): (2, 0, 1, 4, 5, 3),\n",
+       " (2, 0, 1, 5, 3, 4): (2, 0, 1, 5, 3, 4),\n",
+       " (2, 0, 1, 5, 4, 3): (2, 0, 1, 5, 4, 3),\n",
+       " (2, 0, 3, 1, 4, 5): (2, 0, 3, 1, 4, 5),\n",
+       " (2, 0, 3, 1, 5, 4): (2, 0, 3, 1, 5, 4),\n",
+       " (2, 0, 3, 4, 1, 5): (2, 0, 3, 4, 1, 5),\n",
+       " (2, 0, 3, 4, 5, 1): (2, 0, 3, 4, 5, 1),\n",
+       " (2, 0, 3, 5, 1, 4): (2, 0, 3, 5, 1, 4),\n",
+       " (2, 0, 3, 5, 4, 1): (2, 0, 3, 5, 4, 1),\n",
+       " (2, 0, 4, 1, 3, 5): (2, 0, 4, 1, 3, 5),\n",
+       " (2, 0, 4, 1, 5, 3): (2, 0, 4, 1, 5, 3),\n",
+       " (2, 0, 4, 3, 1, 5): (2, 0, 4, 3, 1, 5),\n",
+       " (2, 0, 4, 3, 5, 1): (2, 0, 4, 3, 5, 1),\n",
+       " (2, 0, 4, 5, 1, 3): (2, 0, 4, 5, 1, 3),\n",
+       " (2, 0, 4, 5, 3, 1): (2, 0, 4, 5, 3, 1),\n",
+       " (2, 0, 5, 1, 3, 4): (2, 0, 5, 1, 3, 4),\n",
+       " (2, 0, 5, 1, 4, 3): (2, 0, 5, 1, 4, 3),\n",
+       " (2, 0, 5, 3, 1, 4): (2, 0, 5, 3, 1, 4),\n",
+       " (2, 0, 5, 3, 4, 1): (2, 0, 5, 3, 4, 1),\n",
+       " (2, 0, 5, 4, 1, 3): (2, 0, 5, 4, 1, 3),\n",
+       " (2, 0, 5, 4, 3, 1): (2, 0, 5, 4, 3, 1),\n",
+       " (2, 1, 0, 3, 4, 5): (2, 1, 0, 3, 4, 5),\n",
+       " (2, 1, 0, 3, 5, 4): (2, 1, 0, 3, 5, 4),\n",
+       " (2, 1, 0, 4, 3, 5): (2, 1, 0, 4, 3, 5),\n",
+       " (2, 1, 0, 4, 5, 3): (2, 1, 0, 4, 5, 3),\n",
+       " (2, 1, 0, 5, 3, 4): (2, 1, 0, 5, 3, 4),\n",
+       " (2, 1, 0, 5, 4, 3): (2, 1, 0, 5, 4, 3),\n",
+       " (2, 1, 3, 0, 4, 5): (2, 1, 3, 0, 4, 5),\n",
+       " (2, 1, 3, 0, 5, 4): (2, 1, 3, 0, 5, 4),\n",
+       " (2, 1, 3, 4, 0, 5): (2, 1, 3, 4, 0, 5),\n",
+       " (2, 1, 3, 4, 5, 0): (2, 1, 3, 4, 5, 0),\n",
+       " (2, 1, 3, 5, 0, 4): (2, 1, 3, 5, 0, 4),\n",
+       " (2, 1, 3, 5, 4, 0): (2, 1, 3, 5, 4, 0),\n",
+       " (2, 1, 4, 0, 3, 5): (2, 1, 4, 0, 3, 5),\n",
+       " (2, 1, 4, 0, 5, 3): (2, 1, 4, 0, 5, 3),\n",
+       " (2, 1, 4, 3, 0, 5): (2, 1, 4, 3, 0, 5),\n",
+       " (2, 1, 4, 3, 5, 0): (2, 1, 4, 3, 5, 0),\n",
+       " (2, 1, 4, 5, 0, 3): (2, 1, 4, 5, 0, 3),\n",
+       " (2, 1, 4, 5, 3, 0): (2, 1, 4, 5, 3, 0),\n",
+       " (2, 1, 5, 0, 3, 4): (2, 1, 5, 0, 3, 4),\n",
+       " (2, 1, 5, 0, 4, 3): (2, 1, 5, 0, 4, 3),\n",
+       " (2, 1, 5, 3, 0, 4): (2, 1, 5, 3, 0, 4),\n",
+       " (2, 1, 5, 3, 4, 0): (2, 1, 5, 3, 4, 0),\n",
+       " (2, 1, 5, 4, 0, 3): (2, 1, 5, 4, 0, 3),\n",
+       " (2, 1, 5, 4, 3, 0): (2, 1, 5, 4, 3, 0),\n",
+       " (2, 3, 0, 1, 4, 5): (2, 3, 0, 1, 4, 5),\n",
+       " (2, 3, 0, 1, 5, 4): (2, 3, 0, 1, 5, 4),\n",
+       " (2, 3, 0, 4, 1, 5): (2, 3, 0, 4, 1, 5),\n",
+       " (2, 3, 0, 4, 5, 1): (2, 3, 0, 4, 5, 1),\n",
+       " (2, 3, 0, 5, 1, 4): (2, 3, 0, 5, 1, 4),\n",
+       " (2, 3, 0, 5, 4, 1): (2, 3, 0, 5, 4, 1),\n",
+       " (2, 3, 1, 0, 4, 5): (2, 3, 1, 0, 4, 5),\n",
+       " (2, 3, 1, 0, 5, 4): (2, 3, 1, 0, 5, 4),\n",
+       " (2, 3, 1, 4, 0, 5): (2, 3, 1, 4, 0, 5),\n",
+       " (2, 3, 1, 4, 5, 0): (2, 3, 1, 4, 5, 0),\n",
+       " (2, 3, 1, 5, 0, 4): (2, 3, 1, 5, 0, 4),\n",
+       " (2, 3, 1, 5, 4, 0): (2, 3, 1, 5, 4, 0),\n",
+       " (2, 3, 4, 0, 1, 5): (2, 3, 4, 0, 1, 5),\n",
+       " (2, 3, 4, 0, 5, 1): (2, 3, 4, 0, 5, 1),\n",
+       " (2, 3, 4, 1, 0, 5): (2, 3, 4, 1, 0, 5),\n",
+       " (2, 3, 4, 1, 5, 0): (2, 3, 4, 1, 5, 0),\n",
+       " (2, 3, 4, 5, 0, 1): (2, 3, 4, 5, 0, 1),\n",
+       " (2, 3, 4, 5, 1, 0): (2, 3, 4, 5, 1, 0),\n",
+       " (2, 3, 5, 0, 1, 4): (2, 3, 5, 0, 1, 4),\n",
+       " (2, 3, 5, 0, 4, 1): (2, 3, 5, 0, 4, 1),\n",
+       " (2, 3, 5, 1, 0, 4): (2, 3, 5, 1, 0, 4),\n",
+       " (2, 3, 5, 1, 4, 0): (2, 3, 5, 1, 4, 0),\n",
+       " (2, 3, 5, 4, 0, 1): (2, 3, 5, 4, 0, 1),\n",
+       " (2, 3, 5, 4, 1, 0): (2, 3, 5, 4, 1, 0),\n",
+       " (2, 4, 0, 1, 3, 5): (2, 4, 0, 1, 3, 5),\n",
+       " (2, 4, 0, 1, 5, 3): (2, 4, 0, 1, 5, 3),\n",
+       " (2, 4, 0, 3, 1, 5): (2, 4, 0, 3, 1, 5),\n",
+       " (2, 4, 0, 3, 5, 1): (2, 4, 0, 3, 5, 1),\n",
+       " (2, 4, 0, 5, 1, 3): (2, 4, 0, 5, 1, 3),\n",
+       " (2, 4, 0, 5, 3, 1): (2, 4, 0, 5, 3, 1),\n",
+       " (2, 4, 1, 0, 3, 5): (2, 4, 1, 0, 3, 5),\n",
+       " (2, 4, 1, 0, 5, 3): (2, 4, 1, 0, 5, 3),\n",
+       " (2, 4, 1, 3, 0, 5): (2, 4, 1, 3, 0, 5),\n",
+       " (2, 4, 1, 3, 5, 0): (2, 4, 1, 3, 5, 0),\n",
+       " (2, 4, 1, 5, 0, 3): (2, 4, 1, 5, 0, 3),\n",
+       " (2, 4, 1, 5, 3, 0): (2, 4, 1, 5, 3, 0),\n",
+       " (2, 4, 3, 0, 1, 5): (2, 4, 3, 0, 1, 5),\n",
+       " (2, 4, 3, 0, 5, 1): (2, 4, 3, 0, 5, 1),\n",
+       " (2, 4, 3, 1, 0, 5): (2, 4, 3, 1, 0, 5),\n",
+       " (2, 4, 3, 1, 5, 0): (2, 4, 3, 1, 5, 0),\n",
+       " (2, 4, 3, 5, 0, 1): (2, 4, 3, 5, 0, 1),\n",
+       " (2, 4, 3, 5, 1, 0): (2, 4, 3, 5, 1, 0),\n",
+       " (2, 4, 5, 0, 1, 3): (2, 4, 5, 0, 1, 3),\n",
+       " (2, 4, 5, 0, 3, 1): (2, 4, 5, 0, 3, 1),\n",
+       " (2, 4, 5, 1, 0, 3): (2, 4, 5, 1, 0, 3),\n",
+       " (2, 4, 5, 1, 3, 0): (2, 4, 5, 1, 3, 0),\n",
+       " (2, 4, 5, 3, 0, 1): (2, 4, 5, 3, 0, 1),\n",
+       " (2, 4, 5, 3, 1, 0): (2, 4, 5, 3, 1, 0),\n",
+       " (2, 5, 0, 1, 3, 4): (2, 5, 0, 1, 3, 4),\n",
+       " (2, 5, 0, 1, 4, 3): (2, 5, 0, 1, 4, 3),\n",
+       " (2, 5, 0, 3, 1, 4): (2, 5, 0, 3, 1, 4),\n",
+       " (2, 5, 0, 3, 4, 1): (2, 5, 0, 3, 4, 1),\n",
+       " (2, 5, 0, 4, 1, 3): (2, 5, 0, 4, 1, 3),\n",
+       " (2, 5, 0, 4, 3, 1): (2, 5, 0, 4, 3, 1),\n",
+       " (2, 5, 1, 0, 3, 4): (2, 5, 1, 0, 3, 4),\n",
+       " (2, 5, 1, 0, 4, 3): (2, 5, 1, 0, 4, 3),\n",
+       " (2, 5, 1, 3, 0, 4): (2, 5, 1, 3, 0, 4),\n",
+       " (2, 5, 1, 3, 4, 0): (2, 5, 1, 3, 4, 0),\n",
+       " (2, 5, 1, 4, 0, 3): (2, 5, 1, 4, 0, 3),\n",
+       " (2, 5, 1, 4, 3, 0): (2, 5, 1, 4, 3, 0),\n",
+       " (2, 5, 3, 0, 1, 4): (2, 5, 3, 0, 1, 4),\n",
+       " (2, 5, 3, 0, 4, 1): (2, 5, 3, 0, 4, 1),\n",
+       " (2, 5, 3, 1, 0, 4): (2, 5, 3, 1, 0, 4),\n",
+       " (2, 5, 3, 1, 4, 0): (2, 5, 3, 1, 4, 0),\n",
+       " (2, 5, 3, 4, 0, 1): (2, 5, 3, 4, 0, 1),\n",
+       " (2, 5, 3, 4, 1, 0): (2, 5, 3, 4, 1, 0),\n",
+       " (2, 5, 4, 0, 1, 3): (2, 5, 4, 0, 1, 3),\n",
+       " (2, 5, 4, 0, 3, 1): (2, 5, 4, 0, 3, 1),\n",
+       " (2, 5, 4, 1, 0, 3): (2, 5, 4, 1, 0, 3),\n",
+       " (2, 5, 4, 1, 3, 0): (2, 5, 4, 1, 3, 0),\n",
+       " (2, 5, 4, 3, 0, 1): (2, 5, 4, 3, 0, 1),\n",
+       " (2, 5, 4, 3, 1, 0): (2, 5, 4, 3, 1, 0),\n",
+       " (3, 0, 1, 2, 4, 5): (3, 0, 1, 2, 4, 5),\n",
+       " (3, 0, 1, 2, 5, 4): (3, 0, 1, 2, 5, 4),\n",
+       " (3, 0, 1, 4, 2, 5): (3, 0, 1, 4, 2, 5),\n",
+       " (3, 0, 1, 4, 5, 2): (3, 0, 1, 4, 5, 2),\n",
+       " (3, 0, 1, 5, 2, 4): (3, 0, 1, 5, 2, 4),\n",
+       " (3, 0, 1, 5, 4, 2): (3, 0, 1, 5, 4, 2),\n",
+       " (3, 0, 2, 1, 4, 5): (3, 0, 2, 1, 4, 5),\n",
+       " (3, 0, 2, 1, 5, 4): (3, 0, 2, 1, 5, 4),\n",
+       " (3, 0, 2, 4, 1, 5): (3, 0, 2, 4, 1, 5),\n",
+       " (3, 0, 2, 4, 5, 1): (3, 0, 2, 4, 5, 1),\n",
+       " (3, 0, 2, 5, 1, 4): (3, 0, 2, 5, 1, 4),\n",
+       " (3, 0, 2, 5, 4, 1): (3, 0, 2, 5, 4, 1),\n",
+       " (3, 0, 4, 1, 2, 5): (3, 0, 4, 1, 2, 5),\n",
+       " (3, 0, 4, 1, 5, 2): (3, 0, 4, 1, 5, 2),\n",
+       " (3, 0, 4, 2, 1, 5): (3, 0, 4, 2, 1, 5),\n",
+       " (3, 0, 4, 2, 5, 1): (3, 0, 4, 2, 5, 1),\n",
+       " (3, 0, 4, 5, 1, 2): (3, 0, 4, 5, 1, 2),\n",
+       " (3, 0, 4, 5, 2, 1): (3, 0, 4, 5, 2, 1),\n",
+       " (3, 0, 5, 1, 2, 4): (3, 0, 5, 1, 2, 4),\n",
+       " (3, 0, 5, 1, 4, 2): (3, 0, 5, 1, 4, 2),\n",
+       " (3, 0, 5, 2, 1, 4): (3, 0, 5, 2, 1, 4),\n",
+       " (3, 0, 5, 2, 4, 1): (3, 0, 5, 2, 4, 1),\n",
+       " (3, 0, 5, 4, 1, 2): (3, 0, 5, 4, 1, 2),\n",
+       " (3, 0, 5, 4, 2, 1): (3, 0, 5, 4, 2, 1),\n",
+       " (3, 1, 0, 2, 4, 5): (3, 1, 0, 2, 4, 5),\n",
+       " (3, 1, 0, 2, 5, 4): (3, 1, 0, 2, 5, 4),\n",
+       " (3, 1, 0, 4, 2, 5): (3, 1, 0, 4, 2, 5),\n",
+       " (3, 1, 0, 4, 5, 2): (3, 1, 0, 4, 5, 2),\n",
+       " (3, 1, 0, 5, 2, 4): (3, 1, 0, 5, 2, 4),\n",
+       " (3, 1, 0, 5, 4, 2): (3, 1, 0, 5, 4, 2),\n",
+       " (3, 1, 2, 0, 4, 5): (3, 1, 2, 0, 4, 5),\n",
+       " (3, 1, 2, 0, 5, 4): (3, 1, 2, 0, 5, 4),\n",
+       " (3, 1, 2, 4, 0, 5): (3, 1, 2, 4, 0, 5),\n",
+       " (3, 1, 2, 4, 5, 0): (3, 1, 2, 4, 5, 0),\n",
+       " (3, 1, 2, 5, 0, 4): (3, 1, 2, 5, 0, 4),\n",
+       " (3, 1, 2, 5, 4, 0): (3, 1, 2, 5, 4, 0),\n",
+       " (3, 1, 4, 0, 2, 5): (3, 1, 4, 0, 2, 5),\n",
+       " (3, 1, 4, 0, 5, 2): (3, 1, 4, 0, 5, 2),\n",
+       " (3, 1, 4, 2, 0, 5): (3, 1, 4, 2, 0, 5),\n",
+       " (3, 1, 4, 2, 5, 0): (3, 1, 4, 2, 5, 0),\n",
+       " (3, 1, 4, 5, 0, 2): (3, 1, 4, 5, 0, 2),\n",
+       " (3, 1, 4, 5, 2, 0): (3, 1, 4, 5, 2, 0),\n",
+       " (3, 1, 5, 0, 2, 4): (3, 1, 5, 0, 2, 4),\n",
+       " (3, 1, 5, 0, 4, 2): (3, 1, 5, 0, 4, 2),\n",
+       " (3, 1, 5, 2, 0, 4): (3, 1, 5, 2, 0, 4),\n",
+       " (3, 1, 5, 2, 4, 0): (3, 1, 5, 2, 4, 0),\n",
+       " (3, 1, 5, 4, 0, 2): (3, 1, 5, 4, 0, 2),\n",
+       " (3, 1, 5, 4, 2, 0): (3, 1, 5, 4, 2, 0),\n",
+       " (3, 2, 0, 1, 4, 5): (3, 2, 0, 1, 4, 5),\n",
+       " (3, 2, 0, 1, 5, 4): (3, 2, 0, 1, 5, 4),\n",
+       " (3, 2, 0, 4, 1, 5): (3, 2, 0, 4, 1, 5),\n",
+       " (3, 2, 0, 4, 5, 1): (3, 2, 0, 4, 5, 1),\n",
+       " (3, 2, 0, 5, 1, 4): (3, 2, 0, 5, 1, 4),\n",
+       " (3, 2, 0, 5, 4, 1): (3, 2, 0, 5, 4, 1),\n",
+       " (3, 2, 1, 0, 4, 5): (3, 2, 1, 0, 4, 5),\n",
+       " (3, 2, 1, 0, 5, 4): (3, 2, 1, 0, 5, 4),\n",
+       " (3, 2, 1, 4, 0, 5): (3, 2, 1, 4, 0, 5),\n",
+       " (3, 2, 1, 4, 5, 0): (3, 2, 1, 4, 5, 0),\n",
+       " (3, 2, 1, 5, 0, 4): (3, 2, 1, 5, 0, 4),\n",
+       " (3, 2, 1, 5, 4, 0): (3, 2, 1, 5, 4, 0),\n",
+       " (3, 2, 4, 0, 1, 5): (3, 2, 4, 0, 1, 5),\n",
+       " (3, 2, 4, 0, 5, 1): (3, 2, 4, 0, 5, 1),\n",
+       " (3, 2, 4, 1, 0, 5): (3, 2, 4, 1, 0, 5),\n",
+       " (3, 2, 4, 1, 5, 0): (3, 2, 4, 1, 5, 0),\n",
+       " (3, 2, 4, 5, 0, 1): (3, 2, 4, 5, 0, 1),\n",
+       " (3, 2, 4, 5, 1, 0): (3, 2, 4, 5, 1, 0),\n",
+       " (3, 2, 5, 0, 1, 4): (3, 2, 5, 0, 1, 4),\n",
+       " (3, 2, 5, 0, 4, 1): (3, 2, 5, 0, 4, 1),\n",
+       " (3, 2, 5, 1, 0, 4): (3, 2, 5, 1, 0, 4),\n",
+       " (3, 2, 5, 1, 4, 0): (3, 2, 5, 1, 4, 0),\n",
+       " (3, 2, 5, 4, 0, 1): (3, 2, 5, 4, 0, 1),\n",
+       " (3, 2, 5, 4, 1, 0): (3, 2, 5, 4, 1, 0),\n",
+       " (3, 4, 0, 1, 2, 5): (3, 4, 0, 1, 2, 5),\n",
+       " (3, 4, 0, 1, 5, 2): (3, 4, 0, 1, 5, 2),\n",
+       " (3, 4, 0, 2, 1, 5): (3, 4, 0, 2, 1, 5),\n",
+       " (3, 4, 0, 2, 5, 1): (3, 4, 0, 2, 5, 1),\n",
+       " (3, 4, 0, 5, 1, 2): (3, 4, 0, 5, 1, 2),\n",
+       " (3, 4, 0, 5, 2, 1): (3, 4, 0, 5, 2, 1),\n",
+       " (3, 4, 1, 0, 2, 5): (3, 4, 1, 0, 2, 5),\n",
+       " (3, 4, 1, 0, 5, 2): (3, 4, 1, 0, 5, 2),\n",
+       " (3, 4, 1, 2, 0, 5): (3, 4, 1, 2, 0, 5),\n",
+       " (3, 4, 1, 2, 5, 0): (3, 4, 1, 2, 5, 0),\n",
+       " (3, 4, 1, 5, 0, 2): (3, 4, 1, 5, 0, 2),\n",
+       " (3, 4, 1, 5, 2, 0): (3, 4, 1, 5, 2, 0),\n",
+       " (3, 4, 2, 0, 1, 5): (3, 4, 2, 0, 1, 5),\n",
+       " (3, 4, 2, 0, 5, 1): (3, 4, 2, 0, 5, 1),\n",
+       " (3, 4, 2, 1, 0, 5): (3, 4, 2, 1, 0, 5),\n",
+       " (3, 4, 2, 1, 5, 0): (3, 4, 2, 1, 5, 0),\n",
+       " (3, 4, 2, 5, 0, 1): (3, 4, 2, 5, 0, 1),\n",
+       " (3, 4, 2, 5, 1, 0): (3, 4, 2, 5, 1, 0),\n",
+       " (3, 4, 5, 0, 1, 2): (3, 4, 5, 0, 1, 2),\n",
+       " (3, 4, 5, 0, 2, 1): (3, 4, 5, 0, 2, 1),\n",
+       " (3, 4, 5, 1, 0, 2): (3, 4, 5, 1, 0, 2),\n",
+       " (3, 4, 5, 1, 2, 0): (3, 4, 5, 1, 2, 0),\n",
+       " (3, 4, 5, 2, 0, 1): (3, 4, 5, 2, 0, 1),\n",
+       " (3, 4, 5, 2, 1, 0): (3, 4, 5, 2, 1, 0),\n",
+       " (3, 5, 0, 1, 2, 4): (3, 5, 0, 1, 2, 4),\n",
+       " (3, 5, 0, 1, 4, 2): (3, 5, 0, 1, 4, 2),\n",
+       " (3, 5, 0, 2, 1, 4): (3, 5, 0, 2, 1, 4),\n",
+       " (3, 5, 0, 2, 4, 1): (3, 5, 0, 2, 4, 1),\n",
+       " (3, 5, 0, 4, 1, 2): (3, 5, 0, 4, 1, 2),\n",
+       " (3, 5, 0, 4, 2, 1): (3, 5, 0, 4, 2, 1),\n",
+       " (3, 5, 1, 0, 2, 4): (3, 5, 1, 0, 2, 4),\n",
+       " (3, 5, 1, 0, 4, 2): (3, 5, 1, 0, 4, 2),\n",
+       " (3, 5, 1, 2, 0, 4): (3, 5, 1, 2, 0, 4),\n",
+       " (3, 5, 1, 2, 4, 0): (3, 5, 1, 2, 4, 0),\n",
+       " (3, 5, 1, 4, 0, 2): (3, 5, 1, 4, 0, 2),\n",
+       " (3, 5, 1, 4, 2, 0): (3, 5, 1, 4, 2, 0),\n",
+       " (3, 5, 2, 0, 1, 4): (3, 5, 2, 0, 1, 4),\n",
+       " (3, 5, 2, 0, 4, 1): (3, 5, 2, 0, 4, 1),\n",
+       " (3, 5, 2, 1, 0, 4): (3, 5, 2, 1, 0, 4),\n",
+       " (3, 5, 2, 1, 4, 0): (3, 5, 2, 1, 4, 0),\n",
+       " (3, 5, 2, 4, 0, 1): (3, 5, 2, 4, 0, 1),\n",
+       " (3, 5, 2, 4, 1, 0): (3, 5, 2, 4, 1, 0),\n",
+       " (3, 5, 4, 0, 1, 2): (3, 5, 4, 0, 1, 2),\n",
+       " (3, 5, 4, 0, 2, 1): (3, 5, 4, 0, 2, 1),\n",
+       " (3, 5, 4, 1, 0, 2): (3, 5, 4, 1, 0, 2),\n",
+       " (3, 5, 4, 1, 2, 0): (3, 5, 4, 1, 2, 0),\n",
+       " (3, 5, 4, 2, 0, 1): (3, 5, 4, 2, 0, 1),\n",
+       " (3, 5, 4, 2, 1, 0): (3, 5, 4, 2, 1, 0),\n",
+       " (4, 0, 1, 2, 3, 5): (4, 0, 1, 2, 3, 5),\n",
+       " (4, 0, 1, 2, 5, 3): (4, 0, 1, 2, 5, 3),\n",
+       " (4, 0, 1, 3, 2, 5): (4, 0, 1, 3, 2, 5),\n",
+       " (4, 0, 1, 3, 5, 2): (4, 0, 1, 3, 5, 2),\n",
+       " (4, 0, 1, 5, 2, 3): (4, 0, 1, 5, 2, 3),\n",
+       " (4, 0, 1, 5, 3, 2): (4, 0, 1, 5, 3, 2),\n",
+       " (4, 0, 2, 1, 3, 5): (4, 0, 2, 1, 3, 5),\n",
+       " (4, 0, 2, 1, 5, 3): (4, 0, 2, 1, 5, 3),\n",
+       " (4, 0, 2, 3, 1, 5): (4, 0, 2, 3, 1, 5),\n",
+       " (4, 0, 2, 3, 5, 1): (4, 0, 2, 3, 5, 1),\n",
+       " (4, 0, 2, 5, 1, 3): (4, 0, 2, 5, 1, 3),\n",
+       " (4, 0, 2, 5, 3, 1): (4, 0, 2, 5, 3, 1),\n",
+       " (4, 0, 3, 1, 2, 5): (4, 0, 3, 1, 2, 5),\n",
+       " (4, 0, 3, 1, 5, 2): (4, 0, 3, 1, 5, 2),\n",
+       " (4, 0, 3, 2, 1, 5): (4, 0, 3, 2, 1, 5),\n",
+       " (4, 0, 3, 2, 5, 1): (4, 0, 3, 2, 5, 1),\n",
+       " (4, 0, 3, 5, 1, 2): (4, 0, 3, 5, 1, 2),\n",
+       " (4, 0, 3, 5, 2, 1): (4, 0, 3, 5, 2, 1),\n",
+       " (4, 0, 5, 1, 2, 3): (4, 0, 5, 1, 2, 3),\n",
+       " (4, 0, 5, 1, 3, 2): (4, 0, 5, 1, 3, 2),\n",
+       " (4, 0, 5, 2, 1, 3): (4, 0, 5, 2, 1, 3),\n",
+       " (4, 0, 5, 2, 3, 1): (4, 0, 5, 2, 3, 1),\n",
+       " (4, 0, 5, 3, 1, 2): (4, 0, 5, 3, 1, 2),\n",
+       " (4, 0, 5, 3, 2, 1): (4, 0, 5, 3, 2, 1),\n",
+       " (4, 1, 0, 2, 3, 5): (4, 1, 0, 2, 3, 5),\n",
+       " (4, 1, 0, 2, 5, 3): (4, 1, 0, 2, 5, 3),\n",
+       " (4, 1, 0, 3, 2, 5): (4, 1, 0, 3, 2, 5),\n",
+       " (4, 1, 0, 3, 5, 2): (4, 1, 0, 3, 5, 2),\n",
+       " (4, 1, 0, 5, 2, 3): (4, 1, 0, 5, 2, 3),\n",
+       " (4, 1, 0, 5, 3, 2): (4, 1, 0, 5, 3, 2),\n",
+       " (4, 1, 2, 0, 3, 5): (4, 1, 2, 0, 3, 5),\n",
+       " (4, 1, 2, 0, 5, 3): (4, 1, 2, 0, 5, 3),\n",
+       " (4, 1, 2, 3, 0, 5): (4, 1, 2, 3, 0, 5),\n",
+       " (4, 1, 2, 3, 5, 0): (4, 1, 2, 3, 5, 0),\n",
+       " (4, 1, 2, 5, 0, 3): (4, 1, 2, 5, 0, 3),\n",
+       " (4, 1, 2, 5, 3, 0): (4, 1, 2, 5, 3, 0),\n",
+       " (4, 1, 3, 0, 2, 5): (4, 1, 3, 0, 2, 5),\n",
+       " (4, 1, 3, 0, 5, 2): (4, 1, 3, 0, 5, 2),\n",
+       " (4, 1, 3, 2, 0, 5): (4, 1, 3, 2, 0, 5),\n",
+       " (4, 1, 3, 2, 5, 0): (4, 1, 3, 2, 5, 0),\n",
+       " (4, 1, 3, 5, 0, 2): (4, 1, 3, 5, 0, 2),\n",
+       " (4, 1, 3, 5, 2, 0): (4, 1, 3, 5, 2, 0),\n",
+       " (4, 1, 5, 0, 2, 3): (4, 1, 5, 0, 2, 3),\n",
+       " (4, 1, 5, 0, 3, 2): (4, 1, 5, 0, 3, 2),\n",
+       " (4, 1, 5, 2, 0, 3): (4, 1, 5, 2, 0, 3),\n",
+       " (4, 1, 5, 2, 3, 0): (4, 1, 5, 2, 3, 0),\n",
+       " (4, 1, 5, 3, 0, 2): (4, 1, 5, 3, 0, 2),\n",
+       " (4, 1, 5, 3, 2, 0): (4, 1, 5, 3, 2, 0),\n",
+       " (4, 2, 0, 1, 3, 5): (4, 2, 0, 1, 3, 5),\n",
+       " (4, 2, 0, 1, 5, 3): (4, 2, 0, 1, 5, 3),\n",
+       " (4, 2, 0, 3, 1, 5): (4, 2, 0, 3, 1, 5),\n",
+       " (4, 2, 0, 3, 5, 1): (4, 2, 0, 3, 5, 1),\n",
+       " (4, 2, 0, 5, 1, 3): (4, 2, 0, 5, 1, 3),\n",
+       " (4, 2, 0, 5, 3, 1): (4, 2, 0, 5, 3, 1),\n",
+       " (4, 2, 1, 0, 3, 5): (4, 2, 1, 0, 3, 5),\n",
+       " (4, 2, 1, 0, 5, 3): (4, 2, 1, 0, 5, 3),\n",
+       " (4, 2, 1, 3, 0, 5): (4, 2, 1, 3, 0, 5),\n",
+       " (4, 2, 1, 3, 5, 0): (4, 2, 1, 3, 5, 0),\n",
+       " (4, 2, 1, 5, 0, 3): (4, 2, 1, 5, 0, 3),\n",
+       " (4, 2, 1, 5, 3, 0): (4, 2, 1, 5, 3, 0),\n",
+       " (4, 2, 3, 0, 1, 5): (4, 2, 3, 0, 1, 5),\n",
+       " (4, 2, 3, 0, 5, 1): (4, 2, 3, 0, 5, 1),\n",
+       " (4, 2, 3, 1, 0, 5): (4, 2, 3, 1, 0, 5),\n",
+       " (4, 2, 3, 1, 5, 0): (4, 2, 3, 1, 5, 0),\n",
+       " (4, 2, 3, 5, 0, 1): (4, 2, 3, 5, 0, 1),\n",
+       " (4, 2, 3, 5, 1, 0): (4, 2, 3, 5, 1, 0),\n",
+       " (4, 2, 5, 0, 1, 3): (4, 2, 5, 0, 1, 3),\n",
+       " (4, 2, 5, 0, 3, 1): (4, 2, 5, 0, 3, 1),\n",
+       " (4, 2, 5, 1, 0, 3): (4, 2, 5, 1, 0, 3),\n",
+       " (4, 2, 5, 1, 3, 0): (4, 2, 5, 1, 3, 0),\n",
+       " (4, 2, 5, 3, 0, 1): (4, 2, 5, 3, 0, 1),\n",
+       " (4, 2, 5, 3, 1, 0): (4, 2, 5, 3, 1, 0),\n",
+       " (4, 3, 0, 1, 2, 5): (4, 3, 0, 1, 2, 5),\n",
+       " (4, 3, 0, 1, 5, 2): (4, 3, 0, 1, 5, 2),\n",
+       " (4, 3, 0, 2, 1, 5): (4, 3, 0, 2, 1, 5),\n",
+       " (4, 3, 0, 2, 5, 1): (4, 3, 0, 2, 5, 1),\n",
+       " (4, 3, 0, 5, 1, 2): (4, 3, 0, 5, 1, 2),\n",
+       " (4, 3, 0, 5, 2, 1): (4, 3, 0, 5, 2, 1),\n",
+       " (4, 3, 1, 0, 2, 5): (4, 3, 1, 0, 2, 5),\n",
+       " (4, 3, 1, 0, 5, 2): (4, 3, 1, 0, 5, 2),\n",
+       " (4, 3, 1, 2, 0, 5): (4, 3, 1, 2, 0, 5),\n",
+       " (4, 3, 1, 2, 5, 0): (4, 3, 1, 2, 5, 0),\n",
+       " (4, 3, 1, 5, 0, 2): (4, 3, 1, 5, 0, 2),\n",
+       " (4, 3, 1, 5, 2, 0): (4, 3, 1, 5, 2, 0),\n",
+       " (4, 3, 2, 0, 1, 5): (4, 3, 2, 0, 1, 5),\n",
+       " (4, 3, 2, 0, 5, 1): (4, 3, 2, 0, 5, 1),\n",
+       " (4, 3, 2, 1, 0, 5): (4, 3, 2, 1, 0, 5),\n",
+       " (4, 3, 2, 1, 5, 0): (4, 3, 2, 1, 5, 0),\n",
+       " (4, 3, 2, 5, 0, 1): (4, 3, 2, 5, 0, 1),\n",
+       " (4, 3, 2, 5, 1, 0): (4, 3, 2, 5, 1, 0),\n",
+       " (4, 3, 5, 0, 1, 2): (4, 3, 5, 0, 1, 2),\n",
+       " (4, 3, 5, 0, 2, 1): (4, 3, 5, 0, 2, 1),\n",
+       " (4, 3, 5, 1, 0, 2): (4, 3, 5, 1, 0, 2),\n",
+       " (4, 3, 5, 1, 2, 0): (4, 3, 5, 1, 2, 0),\n",
+       " (4, 3, 5, 2, 0, 1): (4, 3, 5, 2, 0, 1),\n",
+       " (4, 3, 5, 2, 1, 0): (4, 3, 5, 2, 1, 0),\n",
+       " (4, 5, 0, 1, 2, 3): (4, 5, 0, 1, 2, 3),\n",
+       " (4, 5, 0, 1, 3, 2): (4, 5, 0, 1, 3, 2),\n",
+       " (4, 5, 0, 2, 1, 3): (4, 5, 0, 2, 1, 3),\n",
+       " (4, 5, 0, 2, 3, 1): (4, 5, 0, 2, 3, 1),\n",
+       " (4, 5, 0, 3, 1, 2): (4, 5, 0, 3, 1, 2),\n",
+       " (4, 5, 0, 3, 2, 1): (4, 5, 0, 3, 2, 1),\n",
+       " (4, 5, 1, 0, 2, 3): (4, 5, 1, 0, 2, 3),\n",
+       " (4, 5, 1, 0, 3, 2): (4, 5, 1, 0, 3, 2),\n",
+       " (4, 5, 1, 2, 0, 3): (4, 5, 1, 2, 0, 3),\n",
+       " (4, 5, 1, 2, 3, 0): (4, 5, 1, 2, 3, 0),\n",
+       " (4, 5, 1, 3, 0, 2): (4, 5, 1, 3, 0, 2),\n",
+       " (4, 5, 1, 3, 2, 0): (4, 5, 1, 3, 2, 0),\n",
+       " (4, 5, 2, 0, 1, 3): (4, 5, 2, 0, 1, 3),\n",
+       " (4, 5, 2, 0, 3, 1): (4, 5, 2, 0, 3, 1),\n",
+       " (4, 5, 2, 1, 0, 3): (4, 5, 2, 1, 0, 3),\n",
+       " (4, 5, 2, 1, 3, 0): (4, 5, 2, 1, 3, 0),\n",
+       " (4, 5, 2, 3, 0, 1): (4, 5, 2, 3, 0, 1),\n",
+       " (4, 5, 2, 3, 1, 0): (4, 5, 2, 3, 1, 0),\n",
+       " (4, 5, 3, 0, 1, 2): (4, 5, 3, 0, 1, 2),\n",
+       " (4, 5, 3, 0, 2, 1): (4, 5, 3, 0, 2, 1),\n",
+       " (4, 5, 3, 1, 0, 2): (4, 5, 3, 1, 0, 2),\n",
+       " (4, 5, 3, 1, 2, 0): (4, 5, 3, 1, 2, 0),\n",
+       " (4, 5, 3, 2, 0, 1): (4, 5, 3, 2, 0, 1),\n",
+       " (4, 5, 3, 2, 1, 0): (4, 5, 3, 2, 1, 0),\n",
+       " (5, 0, 1, 2, 3, 4): (5, 0, 1, 2, 3, 4),\n",
+       " (5, 0, 1, 2, 4, 3): (5, 0, 1, 2, 4, 3),\n",
+       " (5, 0, 1, 3, 2, 4): (5, 0, 1, 3, 2, 4),\n",
+       " (5, 0, 1, 3, 4, 2): (5, 0, 1, 3, 4, 2),\n",
+       " (5, 0, 1, 4, 2, 3): (5, 0, 1, 4, 2, 3),\n",
+       " (5, 0, 1, 4, 3, 2): (5, 0, 1, 4, 3, 2),\n",
+       " (5, 0, 2, 1, 3, 4): (5, 0, 2, 1, 3, 4),\n",
+       " (5, 0, 2, 1, 4, 3): (5, 0, 2, 1, 4, 3),\n",
+       " (5, 0, 2, 3, 1, 4): (5, 0, 2, 3, 1, 4),\n",
+       " (5, 0, 2, 3, 4, 1): (5, 0, 2, 3, 4, 1),\n",
+       " (5, 0, 2, 4, 1, 3): (5, 0, 2, 4, 1, 3),\n",
+       " (5, 0, 2, 4, 3, 1): (5, 0, 2, 4, 3, 1),\n",
+       " (5, 0, 3, 1, 2, 4): (5, 0, 3, 1, 2, 4),\n",
+       " (5, 0, 3, 1, 4, 2): (5, 0, 3, 1, 4, 2),\n",
+       " (5, 0, 3, 2, 1, 4): (5, 0, 3, 2, 1, 4),\n",
+       " (5, 0, 3, 2, 4, 1): (5, 0, 3, 2, 4, 1),\n",
+       " (5, 0, 3, 4, 1, 2): (5, 0, 3, 4, 1, 2),\n",
+       " (5, 0, 3, 4, 2, 1): (5, 0, 3, 4, 2, 1),\n",
+       " (5, 0, 4, 1, 2, 3): (5, 0, 4, 1, 2, 3),\n",
+       " (5, 0, 4, 1, 3, 2): (5, 0, 4, 1, 3, 2),\n",
+       " (5, 0, 4, 2, 1, 3): (5, 0, 4, 2, 1, 3),\n",
+       " (5, 0, 4, 2, 3, 1): (5, 0, 4, 2, 3, 1),\n",
+       " (5, 0, 4, 3, 1, 2): (5, 0, 4, 3, 1, 2),\n",
+       " (5, 0, 4, 3, 2, 1): (5, 0, 4, 3, 2, 1),\n",
+       " (5, 1, 0, 2, 3, 4): (5, 1, 0, 2, 3, 4),\n",
+       " (5, 1, 0, 2, 4, 3): (5, 1, 0, 2, 4, 3),\n",
+       " (5, 1, 0, 3, 2, 4): (5, 1, 0, 3, 2, 4),\n",
+       " (5, 1, 0, 3, 4, 2): (5, 1, 0, 3, 4, 2),\n",
+       " (5, 1, 0, 4, 2, 3): (5, 1, 0, 4, 2, 3),\n",
+       " (5, 1, 0, 4, 3, 2): (5, 1, 0, 4, 3, 2),\n",
+       " (5, 1, 2, 0, 3, 4): (5, 1, 2, 0, 3, 4),\n",
+       " (5, 1, 2, 0, 4, 3): (5, 1, 2, 0, 4, 3),\n",
+       " (5, 1, 2, 3, 0, 4): (5, 1, 2, 3, 0, 4),\n",
+       " (5, 1, 2, 3, 4, 0): (5, 1, 2, 3, 4, 0),\n",
+       " (5, 1, 2, 4, 0, 3): (5, 1, 2, 4, 0, 3),\n",
+       " (5, 1, 2, 4, 3, 0): (5, 1, 2, 4, 3, 0),\n",
+       " (5, 1, 3, 0, 2, 4): (5, 1, 3, 0, 2, 4),\n",
+       " (5, 1, 3, 0, 4, 2): (5, 1, 3, 0, 4, 2),\n",
+       " (5, 1, 3, 2, 0, 4): (5, 1, 3, 2, 0, 4),\n",
+       " (5, 1, 3, 2, 4, 0): (5, 1, 3, 2, 4, 0),\n",
+       " (5, 1, 3, 4, 0, 2): (5, 1, 3, 4, 0, 2),\n",
+       " (5, 1, 3, 4, 2, 0): (5, 1, 3, 4, 2, 0),\n",
+       " (5, 1, 4, 0, 2, 3): (5, 1, 4, 0, 2, 3),\n",
+       " (5, 1, 4, 0, 3, 2): (5, 1, 4, 0, 3, 2),\n",
+       " (5, 1, 4, 2, 0, 3): (5, 1, 4, 2, 0, 3),\n",
+       " (5, 1, 4, 2, 3, 0): (5, 1, 4, 2, 3, 0),\n",
+       " (5, 1, 4, 3, 0, 2): (5, 1, 4, 3, 0, 2),\n",
+       " (5, 1, 4, 3, 2, 0): (5, 1, 4, 3, 2, 0),\n",
+       " (5, 2, 0, 1, 3, 4): (5, 2, 0, 1, 3, 4),\n",
+       " (5, 2, 0, 1, 4, 3): (5, 2, 0, 1, 4, 3),\n",
+       " (5, 2, 0, 3, 1, 4): (5, 2, 0, 3, 1, 4),\n",
+       " (5, 2, 0, 3, 4, 1): (5, 2, 0, 3, 4, 1),\n",
+       " (5, 2, 0, 4, 1, 3): (5, 2, 0, 4, 1, 3),\n",
+       " (5, 2, 0, 4, 3, 1): (5, 2, 0, 4, 3, 1),\n",
+       " (5, 2, 1, 0, 3, 4): (5, 2, 1, 0, 3, 4),\n",
+       " (5, 2, 1, 0, 4, 3): (5, 2, 1, 0, 4, 3),\n",
+       " (5, 2, 1, 3, 0, 4): (5, 2, 1, 3, 0, 4),\n",
+       " (5, 2, 1, 3, 4, 0): (5, 2, 1, 3, 4, 0),\n",
+       " (5, 2, 1, 4, 0, 3): (5, 2, 1, 4, 0, 3),\n",
+       " (5, 2, 1, 4, 3, 0): (5, 2, 1, 4, 3, 0),\n",
+       " (5, 2, 3, 0, 1, 4): (5, 2, 3, 0, 1, 4),\n",
+       " (5, 2, 3, 0, 4, 1): (5, 2, 3, 0, 4, 1),\n",
+       " (5, 2, 3, 1, 0, 4): (5, 2, 3, 1, 0, 4),\n",
+       " (5, 2, 3, 1, 4, 0): (5, 2, 3, 1, 4, 0),\n",
+       " (5, 2, 3, 4, 0, 1): (5, 2, 3, 4, 0, 1),\n",
+       " (5, 2, 3, 4, 1, 0): (5, 2, 3, 4, 1, 0),\n",
+       " (5, 2, 4, 0, 1, 3): (5, 2, 4, 0, 1, 3),\n",
+       " (5, 2, 4, 0, 3, 1): (5, 2, 4, 0, 3, 1),\n",
+       " (5, 2, 4, 1, 0, 3): (5, 2, 4, 1, 0, 3),\n",
+       " (5, 2, 4, 1, 3, 0): (5, 2, 4, 1, 3, 0),\n",
+       " (5, 2, 4, 3, 0, 1): (5, 2, 4, 3, 0, 1),\n",
+       " (5, 2, 4, 3, 1, 0): (5, 2, 4, 3, 1, 0),\n",
+       " (5, 3, 0, 1, 2, 4): (5, 3, 0, 1, 2, 4),\n",
+       " (5, 3, 0, 1, 4, 2): (5, 3, 0, 1, 4, 2),\n",
+       " (5, 3, 0, 2, 1, 4): (5, 3, 0, 2, 1, 4),\n",
+       " (5, 3, 0, 2, 4, 1): (5, 3, 0, 2, 4, 1),\n",
+       " (5, 3, 0, 4, 1, 2): (5, 3, 0, 4, 1, 2),\n",
+       " (5, 3, 0, 4, 2, 1): (5, 3, 0, 4, 2, 1),\n",
+       " (5, 3, 1, 0, 2, 4): (5, 3, 1, 0, 2, 4),\n",
+       " (5, 3, 1, 0, 4, 2): (5, 3, 1, 0, 4, 2),\n",
+       " (5, 3, 1, 2, 0, 4): (5, 3, 1, 2, 0, 4),\n",
+       " (5, 3, 1, 2, 4, 0): (5, 3, 1, 2, 4, 0),\n",
+       " (5, 3, 1, 4, 0, 2): (5, 3, 1, 4, 0, 2),\n",
+       " (5, 3, 1, 4, 2, 0): (5, 3, 1, 4, 2, 0),\n",
+       " (5, 3, 2, 0, 1, 4): (5, 3, 2, 0, 1, 4),\n",
+       " (5, 3, 2, 0, 4, 1): (5, 3, 2, 0, 4, 1),\n",
+       " (5, 3, 2, 1, 0, 4): (5, 3, 2, 1, 0, 4),\n",
+       " (5, 3, 2, 1, 4, 0): (5, 3, 2, 1, 4, 0),\n",
+       " (5, 3, 2, 4, 0, 1): (5, 3, 2, 4, 0, 1),\n",
+       " (5, 3, 2, 4, 1, 0): (5, 3, 2, 4, 1, 0),\n",
+       " (5, 3, 4, 0, 1, 2): (5, 3, 4, 0, 1, 2),\n",
+       " (5, 3, 4, 0, 2, 1): (5, 3, 4, 0, 2, 1),\n",
+       " (5, 3, 4, 1, 0, 2): (5, 3, 4, 1, 0, 2),\n",
+       " (5, 3, 4, 1, 2, 0): (5, 3, 4, 1, 2, 0),\n",
+       " (5, 3, 4, 2, 0, 1): (5, 3, 4, 2, 0, 1),\n",
+       " (5, 3, 4, 2, 1, 0): (5, 3, 4, 2, 1, 0),\n",
+       " (5, 4, 0, 1, 2, 3): (5, 4, 0, 1, 2, 3),\n",
+       " (5, 4, 0, 1, 3, 2): (5, 4, 0, 1, 3, 2),\n",
+       " (5, 4, 0, 2, 1, 3): (5, 4, 0, 2, 1, 3),\n",
+       " (5, 4, 0, 2, 3, 1): (5, 4, 0, 2, 3, 1),\n",
+       " (5, 4, 0, 3, 1, 2): (5, 4, 0, 3, 1, 2),\n",
+       " (5, 4, 0, 3, 2, 1): (5, 4, 0, 3, 2, 1),\n",
+       " (5, 4, 1, 0, 2, 3): (5, 4, 1, 0, 2, 3),\n",
+       " (5, 4, 1, 0, 3, 2): (5, 4, 1, 0, 3, 2),\n",
+       " (5, 4, 1, 2, 0, 3): (5, 4, 1, 2, 0, 3),\n",
+       " (5, 4, 1, 2, 3, 0): (5, 4, 1, 2, 3, 0),\n",
+       " (5, 4, 1, 3, 0, 2): (5, 4, 1, 3, 0, 2),\n",
+       " (5, 4, 1, 3, 2, 0): (5, 4, 1, 3, 2, 0),\n",
+       " (5, 4, 2, 0, 1, 3): (5, 4, 2, 0, 1, 3),\n",
+       " (5, 4, 2, 0, 3, 1): (5, 4, 2, 0, 3, 1),\n",
+       " (5, 4, 2, 1, 0, 3): (5, 4, 2, 1, 0, 3),\n",
+       " (5, 4, 2, 1, 3, 0): (5, 4, 2, 1, 3, 0),\n",
+       " (5, 4, 2, 3, 0, 1): (5, 4, 2, 3, 0, 1),\n",
+       " (5, 4, 2, 3, 1, 0): (5, 4, 2, 3, 1, 0),\n",
+       " (5, 4, 3, 0, 1, 2): (5, 4, 3, 0, 1, 2),\n",
+       " (5, 4, 3, 0, 2, 1): (5, 4, 3, 0, 2, 1),\n",
+       " (5, 4, 3, 1, 0, 2): (5, 4, 3, 1, 0, 2),\n",
+       " (5, 4, 3, 1, 2, 0): (5, 4, 3, 1, 2, 0),\n",
+       " (5, 4, 3, 2, 0, 1): (5, 4, 3, 2, 0, 1),\n",
+       " (5, 4, 3, 2, 1, 0): (5, 4, 3, 2, 1, 0)}"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "transpositions6 = {t: t for t in set(itertools.permutations(list(range(6))))}\n",
+    "transpositions6"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(((2, 4, 3, 5, 0, 1), (1, 2), <AmscoFillStyle.reverse_each_row: 3>),\n",
+       " -1437.9908206760847)"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = amsco_break(c7b, translist=transpositions6)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[[AmscoSlice(index=0, start=0, end=1),\n",
+       "  AmscoSlice(index=1, start=1, end=3),\n",
+       "  AmscoSlice(index=2, start=3, end=4),\n",
+       "  AmscoSlice(index=3, start=4, end=6),\n",
+       "  AmscoSlice(index=4, start=6, end=7),\n",
+       "  AmscoSlice(index=5, start=7, end=9)],\n",
+       " [AmscoSlice(index=6, start=9, end=11),\n",
+       "  AmscoSlice(index=7, start=11, end=12),\n",
+       "  AmscoSlice(index=8, start=12, end=14),\n",
+       "  AmscoSlice(index=9, start=14, end=15),\n",
+       "  AmscoSlice(index=10, start=15, end=17),\n",
+       "  AmscoSlice(index=11, start=17, end=18)],\n",
+       " [AmscoSlice(index=12, start=18, end=19),\n",
+       "  AmscoSlice(index=13, start=19, end=21),\n",
+       "  AmscoSlice(index=14, start=21, end=22),\n",
+       "  AmscoSlice(index=15, start=22, end=24),\n",
+       "  AmscoSlice(index=16, start=24, end=25),\n",
+       "  AmscoSlice(index=17, start=25, end=27)],\n",
+       " [AmscoSlice(index=18, start=27, end=29),\n",
+       "  AmscoSlice(index=19, start=29, end=30),\n",
+       "  AmscoSlice(index=20, start=30, end=32),\n",
+       "  AmscoSlice(index=21, start=32, end=33),\n",
+       "  AmscoSlice(index=22, start=33, end=35),\n",
+       "  AmscoSlice(index=23, start=35, end=36)],\n",
+       " [AmscoSlice(index=24, start=36, end=37),\n",
+       "  AmscoSlice(index=25, start=37, end=39),\n",
+       "  AmscoSlice(index=26, start=39, end=40),\n",
+       "  AmscoSlice(index=27, start=40, end=42),\n",
+       "  AmscoSlice(index=28, start=42, end=43),\n",
+       "  AmscoSlice(index=29, start=43, end=45)],\n",
+       " [AmscoSlice(index=30, start=45, end=47),\n",
+       "  AmscoSlice(index=31, start=47, end=48),\n",
+       "  AmscoSlice(index=32, start=48, end=50),\n",
+       "  AmscoSlice(index=33, start=50, end=51),\n",
+       "  AmscoSlice(index=34, start=51, end=53),\n",
+       "  AmscoSlice(index=35, start=53, end=54)],\n",
+       " [AmscoSlice(index=36, start=54, end=55),\n",
+       "  AmscoSlice(index=37, start=55, end=57),\n",
+       "  AmscoSlice(index=38, start=57, end=58),\n",
+       "  AmscoSlice(index=39, start=58, end=60),\n",
+       "  AmscoSlice(index=40, start=60, end=61),\n",
+       "  AmscoSlice(index=41, start=61, end=63)],\n",
+       " [AmscoSlice(index=42, start=63, end=65),\n",
+       "  AmscoSlice(index=43, start=65, end=66),\n",
+       "  AmscoSlice(index=44, start=66, end=68),\n",
+       "  AmscoSlice(index=45, start=68, end=69),\n",
+       "  AmscoSlice(index=46, start=69, end=71),\n",
+       "  AmscoSlice(index=47, start=71, end=72)],\n",
+       " [AmscoSlice(index=48, start=72, end=73),\n",
+       "  AmscoSlice(index=49, start=73, end=75),\n",
+       "  AmscoSlice(index=50, start=75, end=76),\n",
+       "  AmscoSlice(index=51, start=76, end=78),\n",
+       "  AmscoSlice(index=52, start=78, end=79),\n",
+       "  AmscoSlice(index=53, start=79, end=81)],\n",
+       " [AmscoSlice(index=54, start=81, end=83),\n",
+       "  AmscoSlice(index=55, start=83, end=84),\n",
+       "  AmscoSlice(index=56, start=84, end=86),\n",
+       "  AmscoSlice(index=57, start=86, end=87),\n",
+       "  AmscoSlice(index=58, start=87, end=89),\n",
+       "  AmscoSlice(index=59, start=89, end=90)],\n",
+       " [AmscoSlice(index=60, start=90, end=91),\n",
+       "  AmscoSlice(index=61, start=91, end=93),\n",
+       "  AmscoSlice(index=62, start=93, end=94),\n",
+       "  AmscoSlice(index=63, start=94, end=96),\n",
+       "  AmscoSlice(index=64, start=96, end=97),\n",
+       "  AmscoSlice(index=65, start=97, end=99)],\n",
+       " [AmscoSlice(index=66, start=99, end=101),\n",
+       "  AmscoSlice(index=67, start=101, end=102),\n",
+       "  AmscoSlice(index=68, start=102, end=104),\n",
+       "  AmscoSlice(index=69, start=104, end=105),\n",
+       "  AmscoSlice(index=70, start=105, end=107),\n",
+       "  AmscoSlice(index=71, start=107, end=108)],\n",
+       " [AmscoSlice(index=72, start=108, end=109),\n",
+       "  AmscoSlice(index=73, start=109, end=111),\n",
+       "  AmscoSlice(index=74, start=111, end=112),\n",
+       "  AmscoSlice(index=75, start=112, end=114),\n",
+       "  AmscoSlice(index=76, start=114, end=115),\n",
+       "  AmscoSlice(index=77, start=115, end=117)],\n",
+       " [AmscoSlice(index=78, start=117, end=119),\n",
+       "  AmscoSlice(index=79, start=119, end=120),\n",
+       "  AmscoSlice(index=80, start=120, end=122),\n",
+       "  AmscoSlice(index=81, start=122, end=123),\n",
+       "  AmscoSlice(index=82, start=123, end=125),\n",
+       "  AmscoSlice(index=83, start=125, end=126)],\n",
+       " [AmscoSlice(index=84, start=126, end=127),\n",
+       "  AmscoSlice(index=85, start=127, end=129),\n",
+       "  AmscoSlice(index=86, start=129, end=130),\n",
+       "  AmscoSlice(index=87, start=130, end=132),\n",
+       "  AmscoSlice(index=88, start=132, end=133),\n",
+       "  AmscoSlice(index=89, start=133, end=135)],\n",
+       " [AmscoSlice(index=90, start=135, end=137),\n",
+       "  AmscoSlice(index=91, start=137, end=138),\n",
+       "  AmscoSlice(index=92, start=138, end=140),\n",
+       "  AmscoSlice(index=93, start=140, end=141),\n",
+       "  AmscoSlice(index=94, start=141, end=143),\n",
+       "  AmscoSlice(index=95, start=143, end=144)],\n",
+       " [AmscoSlice(index=96, start=144, end=145),\n",
+       "  AmscoSlice(index=97, start=145, end=147),\n",
+       "  AmscoSlice(index=98, start=147, end=148),\n",
+       "  AmscoSlice(index=99, start=148, end=150),\n",
+       "  AmscoSlice(index=100, start=150, end=151),\n",
+       "  AmscoSlice(index=101, start=151, end=153)],\n",
+       " [AmscoSlice(index=102, start=153, end=155),\n",
+       "  AmscoSlice(index=103, start=155, end=156),\n",
+       "  AmscoSlice(index=104, start=156, end=158),\n",
+       "  AmscoSlice(index=105, start=158, end=159),\n",
+       "  AmscoSlice(index=106, start=159, end=161),\n",
+       "  AmscoSlice(index=107, start=161, end=162)],\n",
+       " [AmscoSlice(index=108, start=162, end=163),\n",
+       "  AmscoSlice(index=109, start=163, end=165),\n",
+       "  AmscoSlice(index=110, start=165, end=166),\n",
+       "  AmscoSlice(index=111, start=166, end=168),\n",
+       "  AmscoSlice(index=112, start=168, end=169),\n",
+       "  AmscoSlice(index=113, start=169, end=171)],\n",
+       " [AmscoSlice(index=114, start=171, end=173),\n",
+       "  AmscoSlice(index=115, start=173, end=174),\n",
+       "  AmscoSlice(index=116, start=174, end=176),\n",
+       "  AmscoSlice(index=117, start=176, end=177),\n",
+       "  AmscoSlice(index=118, start=177, end=179),\n",
+       "  AmscoSlice(index=119, start=179, end=180)],\n",
+       " [AmscoSlice(index=120, start=180, end=181),\n",
+       "  AmscoSlice(index=121, start=181, end=183),\n",
+       "  AmscoSlice(index=122, start=183, end=184),\n",
+       "  AmscoSlice(index=123, start=184, end=186),\n",
+       "  AmscoSlice(index=124, start=186, end=187),\n",
+       "  AmscoSlice(index=125, start=187, end=189)],\n",
+       " [AmscoSlice(index=126, start=189, end=191),\n",
+       "  AmscoSlice(index=127, start=191, end=192),\n",
+       "  AmscoSlice(index=128, start=192, end=194),\n",
+       "  AmscoSlice(index=129, start=194, end=195),\n",
+       "  AmscoSlice(index=130, start=195, end=197),\n",
+       "  AmscoSlice(index=131, start=197, end=198)],\n",
+       " [AmscoSlice(index=132, start=198, end=199),\n",
+       "  AmscoSlice(index=133, start=199, end=201),\n",
+       "  AmscoSlice(index=134, start=201, end=202),\n",
+       "  AmscoSlice(index=135, start=202, end=204),\n",
+       "  AmscoSlice(index=136, start=204, end=205),\n",
+       "  AmscoSlice(index=137, start=205, end=207)],\n",
+       " [AmscoSlice(index=138, start=207, end=209),\n",
+       "  AmscoSlice(index=139, start=209, end=210),\n",
+       "  AmscoSlice(index=140, start=210, end=212),\n",
+       "  AmscoSlice(index=141, start=212, end=213),\n",
+       "  AmscoSlice(index=142, start=213, end=215),\n",
+       "  AmscoSlice(index=143, start=215, end=216)],\n",
+       " [AmscoSlice(index=144, start=216, end=217),\n",
+       "  AmscoSlice(index=145, start=217, end=219),\n",
+       "  AmscoSlice(index=146, start=219, end=220),\n",
+       "  AmscoSlice(index=147, start=220, end=222),\n",
+       "  AmscoSlice(index=148, start=222, end=223),\n",
+       "  AmscoSlice(index=149, start=223, end=225)],\n",
+       " [AmscoSlice(index=150, start=225, end=227),\n",
+       "  AmscoSlice(index=151, start=227, end=228),\n",
+       "  AmscoSlice(index=152, start=228, end=230),\n",
+       "  AmscoSlice(index=153, start=230, end=231),\n",
+       "  AmscoSlice(index=154, start=231, end=233),\n",
+       "  AmscoSlice(index=155, start=233, end=234)],\n",
+       " [AmscoSlice(index=156, start=234, end=235),\n",
+       "  AmscoSlice(index=157, start=235, end=237),\n",
+       "  AmscoSlice(index=158, start=237, end=238),\n",
+       "  AmscoSlice(index=159, start=238, end=240),\n",
+       "  AmscoSlice(index=160, start=240, end=241),\n",
+       "  AmscoSlice(index=161, start=241, end=243)],\n",
+       " [AmscoSlice(index=162, start=243, end=245),\n",
+       "  AmscoSlice(index=163, start=245, end=246),\n",
+       "  AmscoSlice(index=164, start=246, end=248),\n",
+       "  AmscoSlice(index=165, start=248, end=249),\n",
+       "  AmscoSlice(index=166, start=249, end=251),\n",
+       "  AmscoSlice(index=167, start=251, end=252)],\n",
+       " [AmscoSlice(index=168, start=252, end=253),\n",
+       "  AmscoSlice(index=169, start=253, end=255),\n",
+       "  AmscoSlice(index=170, start=255, end=256),\n",
+       "  AmscoSlice(index=171, start=256, end=258),\n",
+       "  AmscoSlice(index=172, start=258, end=259),\n",
+       "  AmscoSlice(index=173, start=259, end=261)],\n",
+       " [AmscoSlice(index=174, start=261, end=263),\n",
+       "  AmscoSlice(index=175, start=263, end=264),\n",
+       "  AmscoSlice(index=176, start=264, end=266),\n",
+       "  AmscoSlice(index=177, start=266, end=267),\n",
+       "  AmscoSlice(index=178, start=267, end=269),\n",
+       "  AmscoSlice(index=179, start=269, end=270)],\n",
+       " [AmscoSlice(index=180, start=270, end=271),\n",
+       "  AmscoSlice(index=181, start=271, end=273),\n",
+       "  AmscoSlice(index=182, start=273, end=274),\n",
+       "  AmscoSlice(index=183, start=274, end=276),\n",
+       "  AmscoSlice(index=184, start=276, end=277),\n",
+       "  AmscoSlice(index=185, start=277, end=279)],\n",
+       " [AmscoSlice(index=186, start=279, end=281),\n",
+       "  AmscoSlice(index=187, start=281, end=282),\n",
+       "  AmscoSlice(index=188, start=282, end=284),\n",
+       "  AmscoSlice(index=189, start=284, end=285),\n",
+       "  AmscoSlice(index=190, start=285, end=287),\n",
+       "  AmscoSlice(index=191, start=287, end=288)],\n",
+       " [AmscoSlice(index=192, start=288, end=289),\n",
+       "  AmscoSlice(index=193, start=289, end=291),\n",
+       "  AmscoSlice(index=194, start=291, end=292),\n",
+       "  AmscoSlice(index=195, start=292, end=294),\n",
+       "  AmscoSlice(index=196, start=294, end=295),\n",
+       "  AmscoSlice(index=197, start=295, end=297)],\n",
+       " [AmscoSlice(index=198, start=297, end=299),\n",
+       "  AmscoSlice(index=199, start=299, end=300),\n",
+       "  AmscoSlice(index=200, start=300, end=302),\n",
+       "  AmscoSlice(index=201, start=302, end=303),\n",
+       "  AmscoSlice(index=202, start=303, end=305),\n",
+       "  AmscoSlice(index=203, start=305, end=306)],\n",
+       " [AmscoSlice(index=204, start=306, end=307),\n",
+       "  AmscoSlice(index=205, start=307, end=309),\n",
+       "  AmscoSlice(index=206, start=309, end=310),\n",
+       "  AmscoSlice(index=207, start=310, end=312),\n",
+       "  AmscoSlice(index=208, start=312, end=313),\n",
+       "  AmscoSlice(index=209, start=313, end=315)],\n",
+       " [AmscoSlice(index=210, start=315, end=317),\n",
+       "  AmscoSlice(index=211, start=317, end=318),\n",
+       "  AmscoSlice(index=212, start=318, end=320),\n",
+       "  AmscoSlice(index=213, start=320, end=321),\n",
+       "  AmscoSlice(index=214, start=321, end=323),\n",
+       "  AmscoSlice(index=215, start=323, end=324)],\n",
+       " [AmscoSlice(index=216, start=324, end=325),\n",
+       "  AmscoSlice(index=217, start=325, end=327),\n",
+       "  AmscoSlice(index=218, start=327, end=328),\n",
+       "  AmscoSlice(index=219, start=328, end=330),\n",
+       "  AmscoSlice(index=220, start=330, end=331),\n",
+       "  AmscoSlice(index=221, start=331, end=333)],\n",
+       " [AmscoSlice(index=222, start=333, end=335),\n",
+       "  AmscoSlice(index=223, start=335, end=336),\n",
+       "  AmscoSlice(index=224, start=336, end=338),\n",
+       "  AmscoSlice(index=225, start=338, end=339),\n",
+       "  AmscoSlice(index=226, start=339, end=341),\n",
+       "  AmscoSlice(index=227, start=341, end=342)],\n",
+       " [AmscoSlice(index=228, start=342, end=343),\n",
+       "  AmscoSlice(index=229, start=343, end=345),\n",
+       "  AmscoSlice(index=230, start=345, end=346),\n",
+       "  AmscoSlice(index=231, start=346, end=348),\n",
+       "  AmscoSlice(index=232, start=348, end=349),\n",
+       "  AmscoSlice(index=233, start=349, end=351)],\n",
+       " [AmscoSlice(index=234, start=351, end=353),\n",
+       "  AmscoSlice(index=235, start=353, end=354),\n",
+       "  AmscoSlice(index=236, start=354, end=356),\n",
+       "  AmscoSlice(index=237, start=356, end=357),\n",
+       "  AmscoSlice(index=238, start=357, end=359),\n",
+       "  AmscoSlice(index=239, start=359, end=360)],\n",
+       " [AmscoSlice(index=240, start=360, end=361),\n",
+       "  AmscoSlice(index=241, start=361, end=363),\n",
+       "  AmscoSlice(index=242, start=363, end=364),\n",
+       "  AmscoSlice(index=243, start=364, end=366),\n",
+       "  AmscoSlice(index=244, start=366, end=367),\n",
+       "  AmscoSlice(index=245, start=367, end=369)],\n",
+       " [AmscoSlice(index=246, start=369, end=371),\n",
+       "  AmscoSlice(index=247, start=371, end=372),\n",
+       "  AmscoSlice(index=248, start=372, end=374),\n",
+       "  AmscoSlice(index=249, start=374, end=375),\n",
+       "  AmscoSlice(index=250, start=375, end=377),\n",
+       "  AmscoSlice(index=251, start=377, end=378)],\n",
+       " [AmscoSlice(index=252, start=378, end=379),\n",
+       "  AmscoSlice(index=253, start=379, end=381),\n",
+       "  AmscoSlice(index=254, start=381, end=382),\n",
+       "  AmscoSlice(index=255, start=382, end=384),\n",
+       "  AmscoSlice(index=256, start=384, end=385),\n",
+       "  AmscoSlice(index=257, start=385, end=387)],\n",
+       " [AmscoSlice(index=258, start=387, end=389),\n",
+       "  AmscoSlice(index=259, start=389, end=390),\n",
+       "  AmscoSlice(index=260, start=390, end=392),\n",
+       "  AmscoSlice(index=261, start=392, end=393),\n",
+       "  AmscoSlice(index=262, start=393, end=395),\n",
+       "  AmscoSlice(index=263, start=395, end=396)],\n",
+       " [AmscoSlice(index=264, start=396, end=397),\n",
+       "  AmscoSlice(index=265, start=397, end=399),\n",
+       "  AmscoSlice(index=266, start=399, end=400),\n",
+       "  AmscoSlice(index=267, start=400, end=402),\n",
+       "  AmscoSlice(index=268, start=402, end=403),\n",
+       "  AmscoSlice(index=269, start=403, end=405)],\n",
+       " [AmscoSlice(index=270, start=405, end=407),\n",
+       "  AmscoSlice(index=271, start=407, end=408),\n",
+       "  AmscoSlice(index=272, start=408, end=410),\n",
+       "  AmscoSlice(index=273, start=410, end=411),\n",
+       "  AmscoSlice(index=274, start=411, end=413),\n",
+       "  AmscoSlice(index=275, start=413, end=414)],\n",
+       " [AmscoSlice(index=276, start=414, end=415),\n",
+       "  AmscoSlice(index=277, start=415, end=417),\n",
+       "  AmscoSlice(index=278, start=417, end=418),\n",
+       "  AmscoSlice(index=279, start=418, end=420),\n",
+       "  AmscoSlice(index=280, start=420, end=421),\n",
+       "  AmscoSlice(index=281, start=421, end=423)],\n",
+       " [AmscoSlice(index=282, start=423, end=425),\n",
+       "  AmscoSlice(index=283, start=425, end=426),\n",
+       "  AmscoSlice(index=284, start=426, end=428),\n",
+       "  AmscoSlice(index=285, start=428, end=429),\n",
+       "  AmscoSlice(index=286, start=429, end=431),\n",
+       "  AmscoSlice(index=287, start=431, end=432)],\n",
+       " [AmscoSlice(index=288, start=432, end=433),\n",
+       "  AmscoSlice(index=289, start=433, end=435),\n",
+       "  AmscoSlice(index=290, start=435, end=436),\n",
+       "  AmscoSlice(index=291, start=436, end=438),\n",
+       "  AmscoSlice(index=292, start=438, end=439),\n",
+       "  AmscoSlice(index=293, start=439, end=441)],\n",
+       " [AmscoSlice(index=294, start=441, end=443),\n",
+       "  AmscoSlice(index=295, start=443, end=444),\n",
+       "  AmscoSlice(index=296, start=444, end=446),\n",
+       "  AmscoSlice(index=297, start=446, end=447),\n",
+       "  AmscoSlice(index=298, start=447, end=449),\n",
+       "  AmscoSlice(index=299, start=449, end=450)],\n",
+       " [AmscoSlice(index=300, start=450, end=451),\n",
+       "  AmscoSlice(index=301, start=451, end=453),\n",
+       "  AmscoSlice(index=302, start=453, end=454),\n",
+       "  AmscoSlice(index=303, start=454, end=456),\n",
+       "  AmscoSlice(index=304, start=456, end=457),\n",
+       "  AmscoSlice(index=305, start=457, end=459)],\n",
+       " [AmscoSlice(index=306, start=459, end=461),\n",
+       "  AmscoSlice(index=307, start=461, end=462),\n",
+       "  AmscoSlice(index=308, start=462, end=464),\n",
+       "  AmscoSlice(index=309, start=464, end=465),\n",
+       "  AmscoSlice(index=310, start=465, end=467),\n",
+       "  AmscoSlice(index=311, start=467, end=468)],\n",
+       " [AmscoSlice(index=312, start=468, end=469),\n",
+       "  AmscoSlice(index=313, start=469, end=471),\n",
+       "  AmscoSlice(index=314, start=471, end=472),\n",
+       "  AmscoSlice(index=315, start=472, end=474),\n",
+       "  AmscoSlice(index=316, start=474, end=475),\n",
+       "  AmscoSlice(index=317, start=475, end=477)],\n",
+       " [AmscoSlice(index=318, start=477, end=479),\n",
+       "  AmscoSlice(index=319, start=479, end=480),\n",
+       "  AmscoSlice(index=320, start=480, end=482),\n",
+       "  AmscoSlice(index=321, start=482, end=483),\n",
+       "  AmscoSlice(index=322, start=483, end=485),\n",
+       "  AmscoSlice(index=323, start=485, end=486)],\n",
+       " [AmscoSlice(index=324, start=486, end=487),\n",
+       "  AmscoSlice(index=325, start=487, end=489),\n",
+       "  AmscoSlice(index=326, start=489, end=490),\n",
+       "  AmscoSlice(index=327, start=490, end=492),\n",
+       "  AmscoSlice(index=328, start=492, end=493),\n",
+       "  AmscoSlice(index=329, start=493, end=495)],\n",
+       " [AmscoSlice(index=330, start=495, end=497),\n",
+       "  AmscoSlice(index=331, start=497, end=498),\n",
+       "  AmscoSlice(index=332, start=498, end=500),\n",
+       "  AmscoSlice(index=333, start=500, end=501),\n",
+       "  AmscoSlice(index=334, start=501, end=503),\n",
+       "  AmscoSlice(index=335, start=503, end=504)],\n",
+       " [AmscoSlice(index=336, start=504, end=505),\n",
+       "  AmscoSlice(index=337, start=505, end=507),\n",
+       "  AmscoSlice(index=338, start=507, end=508),\n",
+       "  AmscoSlice(index=339, start=508, end=510),\n",
+       "  AmscoSlice(index=340, start=510, end=511),\n",
+       "  AmscoSlice(index=341, start=511, end=513)],\n",
+       " [AmscoSlice(index=342, start=513, end=515),\n",
+       "  AmscoSlice(index=343, start=515, end=516),\n",
+       "  AmscoSlice(index=344, start=516, end=518),\n",
+       "  AmscoSlice(index=345, start=518, end=519),\n",
+       "  AmscoSlice(index=346, start=519, end=521),\n",
+       "  AmscoSlice(index=347, start=521, end=522)],\n",
+       " [AmscoSlice(index=348, start=522, end=523),\n",
+       "  AmscoSlice(index=349, start=523, end=525),\n",
+       "  AmscoSlice(index=350, start=525, end=526),\n",
+       "  AmscoSlice(index=351, start=526, end=528),\n",
+       "  AmscoSlice(index=352, start=528, end=529),\n",
+       "  AmscoSlice(index=353, start=529, end=531)],\n",
+       " [AmscoSlice(index=354, start=531, end=533),\n",
+       "  AmscoSlice(index=355, start=533, end=534),\n",
+       "  AmscoSlice(index=356, start=534, end=536),\n",
+       "  AmscoSlice(index=357, start=536, end=537),\n",
+       "  AmscoSlice(index=358, start=537, end=539),\n",
+       "  AmscoSlice(index=359, start=539, end=540)],\n",
+       " [AmscoSlice(index=360, start=540, end=541),\n",
+       "  AmscoSlice(index=361, start=541, end=543),\n",
+       "  AmscoSlice(index=362, start=543, end=544),\n",
+       "  AmscoSlice(index=363, start=544, end=546),\n",
+       "  AmscoSlice(index=364, start=546, end=547),\n",
+       "  AmscoSlice(index=365, start=547, end=549)],\n",
+       " [AmscoSlice(index=366, start=549, end=551),\n",
+       "  AmscoSlice(index=367, start=551, end=552),\n",
+       "  AmscoSlice(index=368, start=552, end=554),\n",
+       "  AmscoSlice(index=369, start=554, end=555),\n",
+       "  AmscoSlice(index=370, start=555, end=557),\n",
+       "  AmscoSlice(index=371, start=557, end=558)],\n",
+       " [AmscoSlice(index=372, start=558, end=559),\n",
+       "  AmscoSlice(index=373, start=559, end=561),\n",
+       "  AmscoSlice(index=374, start=561, end=562),\n",
+       "  AmscoSlice(index=375, start=562, end=564),\n",
+       "  AmscoSlice(index=376, start=564, end=565),\n",
+       "  AmscoSlice(index=377, start=565, end=567)],\n",
+       " [AmscoSlice(index=378, start=567, end=569),\n",
+       "  AmscoSlice(index=379, start=569, end=570),\n",
+       "  AmscoSlice(index=380, start=570, end=572),\n",
+       "  AmscoSlice(index=381, start=572, end=573),\n",
+       "  AmscoSlice(index=382, start=573, end=575),\n",
+       "  AmscoSlice(index=383, start=575, end=576)],\n",
+       " [AmscoSlice(index=384, start=576, end=577),\n",
+       "  AmscoSlice(index=385, start=577, end=579),\n",
+       "  AmscoSlice(index=386, start=579, end=580),\n",
+       "  AmscoSlice(index=387, start=580, end=582),\n",
+       "  AmscoSlice(index=388, start=582, end=583),\n",
+       "  AmscoSlice(index=389, start=583, end=585)],\n",
+       " [AmscoSlice(index=390, start=585, end=587),\n",
+       "  AmscoSlice(index=391, start=587, end=588),\n",
+       "  AmscoSlice(index=392, start=588, end=590),\n",
+       "  AmscoSlice(index=393, start=590, end=591),\n",
+       "  AmscoSlice(index=394, start=591, end=593),\n",
+       "  AmscoSlice(index=395, start=593, end=594)],\n",
+       " [AmscoSlice(index=396, start=594, end=595),\n",
+       "  AmscoSlice(index=397, start=595, end=597),\n",
+       "  AmscoSlice(index=398, start=597, end=598),\n",
+       "  AmscoSlice(index=399, start=598, end=600),\n",
+       "  AmscoSlice(index=400, start=600, end=601),\n",
+       "  AmscoSlice(index=401, start=601, end=603)],\n",
+       " [AmscoSlice(index=402, start=603, end=605),\n",
+       "  AmscoSlice(index=403, start=605, end=606),\n",
+       "  AmscoSlice(index=404, start=606, end=608),\n",
+       "  AmscoSlice(index=405, start=608, end=609),\n",
+       "  AmscoSlice(index=406, start=609, end=611),\n",
+       "  AmscoSlice(index=407, start=611, end=612)]]"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "amsco_transposition_positions(c7b, 'abcdef', \n",
+    "      fillpattern=(1, 2),\n",
+    "      fillstyle=AmscoFillStyle.reverse_each_row)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false,
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['stager',\n",
+       " 'staler',\n",
+       " 'stalin',\n",
+       " 'stamen',\n",
+       " 'sucker',\n",
+       " 'tucker',\n",
+       " 'twangs',\n",
+       " 'twerps',\n",
+       " 'twirls',\n",
+       " 'staffer',\n",
+       " 'stagers',\n",
+       " 'stagger',\n",
+       " 'stalins',\n",
+       " 'stamens',\n",
+       " 'stamina',\n",
+       " 'stammer',\n",
+       " 'statler',\n",
+       " 'suckers',\n",
+       " 'sudsier',\n",
+       " 'swagger',\n",
+       " 'tubbier',\n",
+       " 'tycoons',\n",
+       " 'loadable',\n",
+       " 'noblemen',\n",
+       " 'rubidium',\n",
+       " 'staffers',\n",
+       " 'staggers',\n",
+       " 'staminas',\n",
+       " 'stammers',\n",
+       " 'standard',\n",
+       " 'steelier',\n",
+       " 'submerse',\n",
+       " 'swaggers',\n",
+       " 'tubbiest',\n",
+       " 'tuitions',\n",
+       " 'twenties',\n",
+       " 'stalemate',\n",
+       " 'staleness',\n",
+       " 'stalinist',\n",
+       " 'stammerer',\n",
+       " 'standards',\n",
+       " 'submerses',\n",
+       " 'swaggerer',\n",
+       " 'stalemates',\n",
+       " 'stalenesss',\n",
+       " 'stammerers',\n",
+       " 'stepsister',\n",
+       " 'succulence',\n",
+       " 'statistical',\n",
+       " 'stepsisters',\n",
+       " 'succulences',\n",
+       " 'statistician',\n",
+       " 'statisticians']"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "transpositions[key_b[0]]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "security protocol solitaire comrades under a decree from moscow we are confined to using a new high security stream cipher stolen from the americans the solitaire cipher all files classified top secret and above are to be archived using this method this new field cipher has been tested and proven to match the security of the fi alka machine without the overhead of the technology you will need only a deck of cards to implement the cipher the key to be used will be provided and distributed on a one time pad and you must destroy the key as you use it the key consists of a random shuffle of a full deck of cards together with two distinguishable jokers agents should be freely able to carry this equipment without arousing suspicion\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(\n",
+    "                amsco_transposition_decipher(sanitise(c7b), \n",
+    "                                             keyword=transpositions[key_b[0]][0], \n",
+    "                                             fillpattern=key_b[1],\n",
+    "                                             fillstyle=key_b[2])\n",
+    "            ))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/2015/2015-challenge8.ipynb b/2015/2015-challenge8.ipynb
new file mode 100644 (file)
index 0000000..8f6195b
--- /dev/null
@@ -0,0 +1,98 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c8a = sanitise(open('8a.ciphertext').read())\n",
+    "c8b = sanitise(open('8b.ciphertext').read())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('charlie', -2104.8140749325567)"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = vigenere_frequency_break(c8a)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "harry i am so sorry we went into the russian hq last night without you but the station chief wanted it to be his team that got the glory i am really grateful to you for coming back and putting us on the right track though the stolen file from soviet headquarters was as you expected encrypted with the solitaire cipher fortunately the cipher clerk who managed the encryption was incredibly careless i found a sheet of burnt paper in the bin which gave me a list of thirty eight cards and i am hoping that this is a large part of the key it will still be hard to break but maybe not impossible especially as the erased part was still intact there maybe another clue in that the page appears to have been torn from an economics textbook i found on the desk anyway i figure the chemists at langley may help us to reconstruct the whole key given time though i wouldnt expect them to manage more than one card a day given how careful they will have to be not to destroy the document it will take usa while to crack this but maybe time is on our side with christmas things seem to be quiet and i am hoping that within the next three weeks we may know precisely what the soviets were trying to do here whatever the outcome i think it is clear that the future of europe is not likely to be settled for a while i hear rumours everyday about shortages in the soviet bloc and border controls are going up in places you wouldnt expect to prevent largescale migration there are problems in greece and turkey and divisions between the british and french and the brits are having real trouble paying off their war debts whether or not we crack the reichs doktor mystery i think there is going to be plenty for you to do i know we had to work hard to persuade you to flyover but we really do need you here even the chief recognizes that so if i can i want to persuade you to stay francois and i are being posted to paris kind of a thankyou for our work on this project but icant go unless i know the berlin station has someone i trust hope youll agree to take the job charlie\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(vigenere_decipher(c8a, key_a))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
index d26d74f04d392d7ce9b2ce6c0e6399d356469a3c..5b46ad58dfb3ac020da7176de388d8927481d088 100644 (file)
--- a/SIGNED.md
+++ b/SIGNED.md
@@ -3,19 +3,19 @@
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 
-iQIcBAABCAAGBQJWjX6wAAoJEJPB2e07PgbqhgsP/2YEJGETmbYlwtwWyKL2q/DN
-ICr7LSmgmPnelBgiOXF4JjhpEdmhuhT6XErTzyVcTmm6aXIdijncMD3qISvYePjk
-VfYd2RbRpA61J/5oZabxOxnaxOvLUSOp1BK0akmNOdi0aPJVm9fatYJMsuWdzwCL
-0hOklUUL2kvDFHRVYgupl57+dTDMWlTOH/es0izL+ZUDqMZcjyDiN3aVNjrHihDe
-RNeOgOod7FLb+GNMC9k5l1O6JovTgrcrw6a+6nyBbBKVcubeY+GS1CKfg0JaFiuM
-f8ewiGBixzV93A+c/nojHIR1jCdzBA91/mYUWmxSUP2kz9MS4HAh2ASbEYR0N6oM
-gJ5JGCHW5BuyTYwJ0xiHoia8GVw64Bw9J/Q6qomZBodw3DNjWXDnZcyrzYFzKuhI
-uP6NK+79Uc5PevDlOV60tLnY869ynXYY4uKIr6TT5NRFdvQi6OVHEBSryUolnnxQ
-YfVwFPNPPPAD+yLrgecD+f6VQjczy3um0pHthaOZwbgX4Sk0I2B/Nq40j/7K/iW6
-kVR2n1/R1wuVekMYpd58F/IUz+wk0JNvrr7O6usUAVEOPo33jCUsuS9wljYAwzqP
-vesbeWXRFGyN0rQDHgSfQivTqG5BL2XV4Nf+uWzeTOSwzAziO4MRHrzgGbo3aMAo
-4xz7E+Wi448R2zkNiUsS
-=vzqt
+iQIcBAABCAAGBQJWjpTaAAoJEJPB2e07Pgbqh6IP/3ZEzWXxCdqrHoXYRRuRvP3U
+7Q8FJro7m+dW0gV3R+0BvcJx7hmepvU8Hr4O4RLTQ3AWnlVSorMGFgOoZ3XLYvZl
+YACQU4q8Cy3PB2nm8/Mcj/yLVyiyGanxYaxGhBoYSUnaE6ncJ8wod3iGHwQouIgA
+sQmaJSoBj0RuYCcTlg8ipOmwZ/doNjKcFbmJQx7BRdlaQ1QQtqyDJgX6y0e4snU0
+ktcu0dCwroyAzu+HXQE5prhsB3x3UHzTq3VwIIgeNnO/Hye9LXgrT8fSdY54YndU
+E/S/gUD8/jB5TFTdHVmAEQAqg/YHXc49o1taPU+NU6hSl9EDmhM7CacBu+//VUy4
+VXjFFWJV9YFX6yhaNHSS5Vuz7h8oXKOQwGYa4dMlrGl912MnOHl+WjCDjcHL+0ht
+cFfEq3OgQDL4Q7Eln1bW7VwYDcpId1yNYcuHvd+h3bSzAxNtMcjH3Sim7EDcFP2z
+n6nuwFNdfY+drpAllw1df8QotFP8vkiA3O9sUtTIJkECmu9vGqJDfujhBOhPNQxk
+9bwSIWhXz0yvt3V7P/ds2PRGBB67ejkWOEEMhI/94yu/prZaeZQsm49ULoqz+6z/
+3eGlgz/Y0RRjlgorl7VwOwacuqb5w++WZ2CX4O5oylkxOtC/rkuOTFvwsas2c3sy
+as4QzMxXGkYvRCKzUvR7
+=gSfT
 -----END PGP SIGNATURE-----
 
 ```
 -----END PGP SIGNATURE-----
 
 ```
@@ -69,6 +69,8 @@ size     exec  file                                               contents
 1340               1a.plaintext                                   cbdaac33a7943a752ba5dd21cf7af23bdbdd22e4a5feb0bccecce45d605d0581                                                                 
 1495               1b.ciphertext                                  2e0389e2c7d3156892f7d361ee79f86eb79d34812fca37d8ce692cb6f3976446                                                                 
 1495               1b.plaintext                                   717b1f8955515a5d5d2f049f0ffe137820d71f8b2a1689e1a29ec30ed7c9d473                                                                 
 1340               1a.plaintext                                   cbdaac33a7943a752ba5dd21cf7af23bdbdd22e4a5feb0bccecce45d605d0581                                                                 
 1495               1b.ciphertext                                  2e0389e2c7d3156892f7d361ee79f86eb79d34812fca37d8ce692cb6f3976446                                                                 
 1495               1b.plaintext                                   717b1f8955515a5d5d2f049f0ffe137820d71f8b2a1689e1a29ec30ed7c9d473                                                                 
+121429             2013-challenge6.ipynb                          4169b040ef2d648af0c5678c22756ab31933f663ec7f38fb27a0af81c8c8d4b8                                                                 
+25749              2013-challenge7.ipynb                          a651b44828eeb79c82f63eb00ba0f8d5a3f406e104cb1a59601a61f0aee7432b                                                                 
 1135               2a.ciphertext                                  85ad3dac4751a8db90f391d0f06935a5ef2118d9ac72e05fe0518d7f77bff058                                                                 
 1135               2a.plaintext                                   11cdf7c462c536085daced417023adaeff2f6b7a6162ccd12b340b079bd36b48                                                                 
 926                2b.ciphertext                                  0fc59b28e4cd2db0aa9f28a603e2b25988a6688f05f90a59b205088093721340                                                                 
 1135               2a.ciphertext                                  85ad3dac4751a8db90f391d0f06935a5ef2118d9ac72e05fe0518d7f77bff058                                                                 
 1135               2a.plaintext                                   11cdf7c462c536085daced417023adaeff2f6b7a6162ccd12b340b079bd36b48                                                                 
 926                2b.ciphertext                                  0fc59b28e4cd2db0aa9f28a603e2b25988a6688f05f90a59b205088093721340                                                                 
@@ -85,11 +87,17 @@ size     exec  file                                               contents
 1565               7b.ciphertext                                  adeef9d9e985c534c40acee5c6734d04195895a32efd9452a89cafef1fdc91b8                                                                 
 182                mona-lisa-words.txt                            d7d05c9c86f6282fa66df5f4ca795c89f01cef88a9ce8c921ce4484b3d6078a7                                                                 
 1190               solutions.txt                                  bd14d8cb1b6694ee4b07d7f38f4df7931e89c10247f101878b6056647bf67cee                                                                 
 1565               7b.ciphertext                                  adeef9d9e985c534c40acee5c6734d04195895a32efd9452a89cafef1fdc91b8                                                                 
 182                mona-lisa-words.txt                            d7d05c9c86f6282fa66df5f4ca795c89f01cef88a9ce8c921ce4484b3d6078a7                                                                 
 1190               solutions.txt                                  bd14d8cb1b6694ee4b07d7f38f4df7931e89c10247f101878b6056647bf67cee                                                                 
-135303           2013-challenge6.ipynb                            5b37a8b10db4c8d9831827a2acdffdcdb65369557d15b3e08a900ee8e088da73                                                                 
-31542            2013-challenge7.ipynb                            6de8c15b9cca8b166be4ab86df94898544803e7ed46f8042e363414bed1d2dcc                                                                 
                  2014/                                                                                                                                                                             
 735                1a.ciphertext                                  3adb9e2747c6e3b4033c8042a6dcccb7c2e45988d64c5c78ec0a2c472dc88f95                                                                 
 610                1b.ciphertext                                  bc11485a47af830fa0ded0b07feebf042c0a6956dc71daa60b525067e96c220a                                                                 
                  2014/                                                                                                                                                                             
 735                1a.ciphertext                                  3adb9e2747c6e3b4033c8042a6dcccb7c2e45988d64c5c78ec0a2c472dc88f95                                                                 
 610                1b.ciphertext                                  bc11485a47af830fa0ded0b07feebf042c0a6956dc71daa60b525067e96c220a                                                                 
+4061               2014-challenge1.ipynb                          a1d569b4c7d6d359a9c131244276fbbb61c035e7ffbdb6e224beabf3190c73e5                                                                 
+23543              2014-challenge2.ipynb                          92c301162a49bdda75ec939f77c015a025626bc728365d296187d764a89ef1bc                                                                 
+24088              2014-challenge3.ipynb                          e0db661b881ee1bc3d51e0edfa958b709677dace6eef7125ae9e034e131ca6c8                                                                 
+28626              2014-challenge4.ipynb                          11db485e9db34673b920635fbeeec85eeb85f776aabc687ebbd114a87039f38d                                                                 
+21102              2014-challenge5.ipynb                          085151062fb8b3d7f8d6d7cff5b73ec3053b5d22383301f416a2a29e6b5ab53e                                                                 
+34054              2014-challenge6.ipynb                          0e6f30c7296fe16b107ee5df2676e988c8b450b1cbf0e7347bf6e2ac9191f068                                                                 
+38294              2014-challenge7.ipynb                          176ead363cc1970d243ea2e7f7ba49eadc617058ad5144044ce4c8c0e9375c16                                                                 
+187296             2014-challenge8.ipynb                          11fb5200127f954536176cc3b3e4258ee3005fbe0c19e0138e6b9d18c290a71f                                                                 
 767                2a.ciphertext                                  3881a4f1fc0fadc064bc27d3052800b5eb497e833b208c2cee381b466c9b1db8                                                                 
 398                2b.ciphertext                                  78faf9d7a0aad25a9fa72f886c398bc0b684a389bc5624ab4514e93685157a93                                                                 
 958                3a.ciphertext                                  0d0524b194961bdbe6fe200cfe983a9338abcca5adabb6776769387967a50711                                                                 
 767                2a.ciphertext                                  3881a4f1fc0fadc064bc27d3052800b5eb497e833b208c2cee381b466c9b1db8                                                                 
 398                2b.ciphertext                                  78faf9d7a0aad25a9fa72f886c398bc0b684a389bc5624ab4514e93685157a93                                                                 
 958                3a.ciphertext                                  0d0524b194961bdbe6fe200cfe983a9338abcca5adabb6776769387967a50711                                                                 
@@ -104,17 +112,17 @@ size     exec  file                                               contents
 988                7b.ciphertext                                  cfb66667a8011226be0be7c98e9deb7efa02e9a53cad67743baf166c20136ada                                                                 
 1391               8a.ciphertext                                  ac2b18d13ef44be0fb233d2455c51897b4df59491bbdd23ef82fbd9490bc86b1                                                                 
 7001               8b.ciphertext                                  8d7e366e8fbb5766717481eeec77b089d3e8f9e708ac198d56176cb0882a9472                                                                 
 988                7b.ciphertext                                  cfb66667a8011226be0be7c98e9deb7efa02e9a53cad67743baf166c20136ada                                                                 
 1391               8a.ciphertext                                  ac2b18d13ef44be0fb233d2455c51897b4df59491bbdd23ef82fbd9490bc86b1                                                                 
 7001               8b.ciphertext                                  8d7e366e8fbb5766717481eeec77b089d3e8f9e708ac198d56176cb0882a9472                                                                 
-3882             2014-challenge1.ipynb                            07715f100d97af32ad5a13b56ade2f5753e17e32404e2eda0dcb9634736298f5                                                                 
-28071            2014-challenge2.ipynb                            1535404ae5a412160c82d19e38f7069a2eaca600bd433e77877bd13e14929e6b                                                                 
-29190            2014-challenge3.ipynb                            1454c5e5014eac93c42e88611f3f6b3f014bf70a8e9d8e87ef4725f8d12a27b7                                                                 
-32758            2014-challenge4.ipynb                            1794b0b2c6fd4630f6d9ffe15ffdad52d04af23082eddc920ec02ba4740032e4                                                                 
-23322            2014-challenge5.ipynb                            fb3bb531c62ed943528715cc19e800293e3cd4a176ce3a3fe01e7e585386907e                                                                 
-40307            2014-challenge6.ipynb                            5085a4ae2a562c87983cbff817ac89826973341551980563ae0c77ab747a5dff                                                                 
-44472            2014-challenge7.ipynb                            9800d39c881f22f67f1182f6ca73bbf40a123d0deb598a6009f545f421955241                                                                 
-188080           2014-challenge8.ipynb                            c59bcfbb39e48e6e151cc0c86fe48add67844954cf3c65d560bbda0c972a8376                                                                 
                  2015/                                                                                                                                                                             
 874                1a.ciphertext                                  5d0d71f24522e1c05127feb601bf8dc82566f3d2795fb51c4a60e22d900bb5eb                                                                 
 394                1b.ciphertext                                  a35e8265aea45ab5f7c5eb141e5e65c85ecc24c7d87f3e8197dfe6795a7d3226                                                                 
                  2015/                                                                                                                                                                             
 874                1a.ciphertext                                  5d0d71f24522e1c05127feb601bf8dc82566f3d2795fb51c4a60e22d900bb5eb                                                                 
 394                1b.ciphertext                                  a35e8265aea45ab5f7c5eb141e5e65c85ecc24c7d87f3e8197dfe6795a7d3226                                                                 
+3835               2015-challenge1.ipynb                          4c9d020904f448c1a8c6443d5a8d6da48d615ce61508e67670ce01ac1c4c5b2e                                                                 
+4307               2015-challenge2.ipynb                          702cb83d7b0c52b2ddf360d475e5e1acaaee0419c4a82c17e32a009ce559e352                                                                 
+4199               2015-challenge3.ipynb                          7116fb88f407edd43695d00229479ba5413368a5cb3c2bfb083d7e47f732ff05                                                                 
+32985              2015-challenge4.ipynb                          7c8a2e5d7a2e210431ae273a2a298daea2cb58b71cdb549f0e87a7754990680e                                                                 
+5251               2015-challenge5.ipynb                          20037e3678a1290aaacdec2b4baeba315385bc2ff233a84272e6424ebdeecd23                                                                 
+14285              2015-challenge6.ipynb                          0cd2bbd2f67683f696275cd6041d26a54d7cc43971ca0bef8daf91d5b61a80de                                                                 
+76477              2015-challenge7.ipynb                          de19305ec9c87c0c7d7db34cdf54f8dc67bca1330b15876835c4208167d662ed                                                                 
+3953               2015-challenge8.ipynb                          6959c7a98353bda0028003491d2e558670f61ff5b0714756c8e18db93398c1be                                                                 
 1193               2a.ciphertext                                  412db1381dcb01f858bf848e48ada16aa4603cbb348c1f092ae39b06d2efa5f9                                                                 
 544                2b.ciphertext                                  5ff59d7cff1c4d27dee6414769bdbcfb0b0ab9c5931e772bf9f6442eeb9b6855                                                                 
 898                3a.ciphertext                                  5a9f89002db8520dbad882565a0130d3a462ed967e9cebeca828e9f727a267c4                                                                 
 1193               2a.ciphertext                                  412db1381dcb01f858bf848e48ada16aa4603cbb348c1f092ae39b06d2efa5f9                                                                 
 544                2b.ciphertext                                  5ff59d7cff1c4d27dee6414769bdbcfb0b0ab9c5931e772bf9f6442eeb9b6855                                                                 
 898                3a.ciphertext                                  5a9f89002db8520dbad882565a0130d3a462ed967e9cebeca828e9f727a267c4                                                                 
@@ -134,14 +142,6 @@ size     exec  file                                               contents
 10000              pysol.zip                                      64e25c247e877f37285db635fcb5dea101e0c531fdbfe5000bcc088c22caad79|68d878fb019198e691d321be1dd6744fae0b48da9c4e705c34f96e351b00fbed
 5281               sol.py                                         dbea0e836eb158a26407ca3b74289d24fa7eae16ed1093eb7c598767a150fccc|e50319aa995f934a4cbd52bc28d8f49f376e62470170690cdbed7352f67a7942
 2195               sol.py.zip                                     4c22e57eaacd8a91ef9b0c338429e400210a03dec9fbacec4a45fe1faed50720|1fd0a62af53125eacfa11016088451e2c58269d98aaef74c320730ebc7601b66
 10000              pysol.zip                                      64e25c247e877f37285db635fcb5dea101e0c531fdbfe5000bcc088c22caad79|68d878fb019198e691d321be1dd6744fae0b48da9c4e705c34f96e351b00fbed
 5281               sol.py                                         dbea0e836eb158a26407ca3b74289d24fa7eae16ed1093eb7c598767a150fccc|e50319aa995f934a4cbd52bc28d8f49f376e62470170690cdbed7352f67a7942
 2195               sol.py.zip                                     4c22e57eaacd8a91ef9b0c338429e400210a03dec9fbacec4a45fe1faed50720|1fd0a62af53125eacfa11016088451e2c58269d98aaef74c320730ebc7601b66
-3620             2015-challenge1.ipynb                            2ab544f48c22a3a2e665b03ae094ac2de04aee8bdb37366209276a937d248d6a                                                                 
-4092             2015-challenge2.ipynb                            58c2aeca6c73a8fef71d0cc8321469358803f392c02fd44631dd0b25c2755f4a                                                                 
-3987             2015-challenge3.ipynb                            dfec26ba881c7ad0af54d072aeba4d08162661e863266936963130548ff86b65                                                                 
-8030             2015-challenge4.ipynb                            f77ead0eae7fcd67039d500a31ad1748a4df115905adecd0e93e56f72bbdcfa0                                                                 
-5039             2015-challenge5.ipynb                            b0c28829c329d7a2752f4991006e6d78a10415d7609b893b80b3bdb788d6e533                                                                 
-14079            2015-challenge6.ipynb                            7bd1dcff4b764d75e002622ce6a4cc3c00625aa311ef886e5a436822660c565c                                                                 
-76275            2015-challenge7.ipynb                            c48d71ef5c105dff987981c05ce4a9d2cce382e6d54358d7e2a3b6fe9fc74f10                                                                 
-3741             2015-challenge8.ipynb                            d66fca286b89099f3ca296f1f8283f22c12ae9e5480192f2bdb316a46fd07f43                                                                 
 18025            LICENSE                                          a01259a1b522cf0de95824f9860613b453153eebac468e96196d5d7dba84786c                                                                 
 7999             LJ!-Qt!-Fghxft-dferts%3B-hsjeukaxxn-sfedw.ipynb  429b6c6995096ff19c28a5ee342bef8ea4774200bdf9aaf6268de3cb8b28df28                                                                 
 61               README.md                                        277247b410300ee16477b12ca54ad878d81c8061f6134e2e1cadccaf299de3a3                                                                 
 18025            LICENSE                                          a01259a1b522cf0de95824f9860613b453153eebac468e96196d5d7dba84786c                                                                 
 7999             LJ!-Qt!-Fghxft-dferts%3B-hsjeukaxxn-sfedw.ipynb  429b6c6995096ff19c28a5ee342bef8ea4774200bdf9aaf6268de3cb8b28df28                                                                 
 61               README.md                                        277247b410300ee16477b12ca54ad878d81c8061f6134e2e1cadccaf299de3a3                                                                 
@@ -150,8 +150,8 @@ size     exec  file                                               contents
 16832            cadenus-ciphers.ipynb                            50e49b3ec5e6440b86fe13472b9f4ab9e133e5665c7280b2abf7a6b57bb8a89a                                                                 
 514              caesar_break_parameter_trials.csv                6586223bcc00e06e3ff79d107202d6c29ef962a6dd544add00610c5907407e85|1cb7cc77831ef3ef4f994a9ea77e82a841b38acdde45ede9cedbe7a54f1e8e46
 318              cipher-training.sublime-project                  58e5d5b4e54fb29abecaef2d41266e3355adccb8b6a70bd595e509bd07c16587                                                                 
 16832            cadenus-ciphers.ipynb                            50e49b3ec5e6440b86fe13472b9f4ab9e133e5665c7280b2abf7a6b57bb8a89a                                                                 
 514              caesar_break_parameter_trials.csv                6586223bcc00e06e3ff79d107202d6c29ef962a6dd544add00610c5907407e85|1cb7cc77831ef3ef4f994a9ea77e82a841b38acdde45ede9cedbe7a54f1e8e46
 318              cipher-training.sublime-project                  58e5d5b4e54fb29abecaef2d41266e3355adccb8b6a70bd595e509bd07c16587                                                                 
-42052            cipher.py                                        4ae3835f58782e76f8dc747ce46ae461c11236cf3397ee32adec8e974cf06153                                                                 
-28736            cipherbreak.py                                   cbda3e76773ad3125e00360622d1e01eccf376d4e783617c925cc4c557e97d86                                                                 
+42922            cipher.py                                        58637b8946b4fb973b19a374a2066a896d86c928dacaa1ccd2252e6f8bb6e810                                                                 
+28908            cipherbreak.py                                   0fb22645ddce4e04c7e441a1f7bdc0e4a397a3c9b2cfb3098bcb213e79a361c9                                                                 
 11564            count_1edit.txt                                  3bf563ef032ba151ec1a4b2d1f33f50c49f4a47e4dc5b8152394bc5b63f57655|b5fbacbebcc25f5011ce97bc9ac967a09c50eef28b4aa98379a6c426df6ac08b
 223              count_1l.txt                                     335388d457db6ef1da05d8b55ab879e9be7d4e021085efc8d9dfeac0e4a79aa9                                                                 
 4956241          count_1w.txt                                     51df159fd3de12b20e403c108f526e96dbd723d9cabdd5f17955cdc16059e690                                                                 
 11564            count_1edit.txt                                  3bf563ef032ba151ec1a4b2d1f33f50c49f4a47e4dc5b8152394bc5b63f57655|b5fbacbebcc25f5011ce97bc9ac967a09c50eef28b4aa98379a6c426df6ac08b
 223              count_1l.txt                                     335388d457db6ef1da05d8b55ab879e9be7d4e021085efc8d9dfeac0e4a79aa9                                                                 
 4956241          count_1w.txt                                     51df159fd3de12b20e403c108f526e96dbd723d9cabdd5f17955cdc16059e690                                                                 
@@ -163,7 +163,7 @@ size     exec  file                                               contents
 3027             find_best_caesar_break_parameters.py             0347d80309179d937a88fd1c8684490a513ccd086366c5a0dd55b8a2fe5c565f                                                                 
 1236             find_wikipedia_titles.py                         f040bf855dfec7fff9d8e5eba2fb509179bc53bc02a20b26b7fc61fef983aa45                                                                 
 37128            hill-ciphers.ipynb                               ce802c2be807b4565858b568d3a82c65a3957aa625344189f8f2a055237b3fdd                                                                 
 3027             find_best_caesar_break_parameters.py             0347d80309179d937a88fd1c8684490a513ccd086366c5a0dd55b8a2fe5c565f                                                                 
 1236             find_wikipedia_titles.py                         f040bf855dfec7fff9d8e5eba2fb509179bc53bc02a20b26b7fc61fef983aa45                                                                 
 37128            hill-ciphers.ipynb                               ce802c2be807b4565858b568d3a82c65a3957aa625344189f8f2a055237b3fdd                                                                 
-5516             language_models.py                               9f6c60892b385a8443202edda95074eb28e2b66981e25e27f4153b887e2c9ee3                                                                 
+5645             language_models.py                               bfd5b60cdef8af20cdb061b24a1691f569984be3be333782c3d76e3370e16d14                                                                 
 368              lettercount.py                                   ed36497d62cf75b91994055e4a18848b2fabe5ce793cd76a77fabfc94d81d4f3                                                                 
 592              make-cracking-dictionary.py                      71791e64e4853cd9ca292cb436bbe8c72dd60f509811174df93ed2067683d5c1                                                                 
 7077             norms.py                                         a657a36c1741e6f3a513386b318fcc99e6b11f98ec64a48284b47462ff2acf30                                                                 
 368              lettercount.py                                   ed36497d62cf75b91994055e4a18848b2fabe5ce793cd76a77fabfc94d81d4f3                                                                 
 592              make-cracking-dictionary.py                      71791e64e4853cd9ca292cb436bbe8c72dd60f509811174df93ed2067683d5c1                                                                 
 7077             norms.py                                         a657a36c1741e6f3a513386b318fcc99e6b11f98ec64a48284b47462ff2acf30                                                                 
index eb0a169162851fff86bd6dfe6be3cf8064608dbe..266237a65a70b070e2ea8bc41d49f273477eda2c 100644 (file)
--- a/cipher.py
+++ b/cipher.py
@@ -836,11 +836,17 @@ def amsco_transposition_encipher(message, keyword,
     'hotelerelh'
     >>> amsco_transposition_encipher('hellothere', 'acb', fillpattern=(2, 1))
     'hetelorlhe'
     'hotelerelh'
     >>> amsco_transposition_encipher('hellothere', 'acb', fillpattern=(2, 1))
     'hetelorlhe'
+    >>> amsco_transposition_encipher('hereissometexttoencipher', 'encode')
+    'etecstthhomoerereenisxip'
     >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(1, 2))
     >>> 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))
     'hecsoisttererteipexhomen'
     >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(2, 1))
-    'heetcisooestrrepeixthemn'
+    'heecisoosttrrtepeixhemen'
     >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(1, 3, 2))
     >>> 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, 
     'hxomeiphscerettoisenteer'
     """
     grid = amsco_transposition_positions(message, keyword, 
@@ -861,11 +867,17 @@ def amsco_transposition_decipher(message, keyword,
     'hellothere'
     >>> amsco_transposition_decipher('hetelorlhe', 'acb', fillpattern=(2, 1))
     'hellothere'
     'hellothere'
     >>> amsco_transposition_decipher('hetelorlhe', 'acb', fillpattern=(2, 1))
     'hellothere'
-    >>> amsco_transposition_decipher('hecsoisttererteipexhomen', 'cipher', fillpattern=(1, 2))
+    >>> amsco_transposition_decipher('etecstthhomoerereenisxip', 'encode')
     'hereissometexttoencipher'
     'hereissometexttoencipher'
-    >>> amsco_transposition_decipher('heetcisooestrrepeixthemn', 'cipher', fillpattern=(2, 1))
+    >>> amsco_transposition_decipher('hetcsoeisterereipexthomn', 'cipher', fillpattern=(1, 2))
     'hereissometexttoencipher'
     'hereissometexttoencipher'
-    >>> amsco_transposition_decipher('hxomeiphscerettoisenteer', 'cipher', fillpattern=(1, 3, 2))
+    >>> 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'
     """
 
     'hereissometexttoencipher'
     """
 
index 120a89e4f82ec07561a0fa2ced9940344eafc60c..0ac8ae57f7ed11a443dfedc8366ddc51086eda8c 100644 (file)
@@ -199,23 +199,27 @@ def keyword_break_worker(message, keyword, wrap_alphabet, fitness):
     return (keyword, wrap_alphabet), fit
 
 def monoalphabetic_break_hillclimbing(message, max_iterations=10000000, 
     return (keyword, wrap_alphabet), fit
 
 def monoalphabetic_break_hillclimbing(message, max_iterations=10000000, 
-        fitness=Pletters):
+        alphabet=None, fitness=Pletters):
     ciphertext = unaccent(message).lower()
     ciphertext = unaccent(message).lower()
-    alphabet = list(string.ascii_lowercase)
-    random.shuffle(alphabet)
-    alphabet = ''.join(alphabet)
+    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, 
     return monoalphabetic_break_hillclimbing_worker(ciphertext, alphabet,
                                                     max_iterations, fitness)
 
 def monoalphabetic_break_hillclimbing_mp(message, workers=10, 
-        max_iterations = 10000000, fitness=Pletters, chunksize=1):
+        max_iterations = 10000000, alphabet=None, fitness=Pletters, chunksize=1):
     worker_args = []
     ciphertext = unaccent(message).lower()
     for i in range(workers):
     worker_args = []
     ciphertext = unaccent(message).lower()
     for i in range(workers):
-        alphabet = list(string.ascii_lowercase)
-        random.shuffle(alphabet)
-        alphabet = ''.join(alphabet)
-        worker_args.append((ciphertext, alphabet, max_iterations, fitness))
+        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)
     with Pool() as pool:
         breaks = pool.starmap(monoalphabetic_break_hillclimbing_worker,
                               worker_args, chunksize)
index 19f886fcefcb4384184e0bbad108e6925f029bbf..5a35b38ec32867dbe00f6fe6e99ada066e858c8e 100644 (file)
@@ -5,6 +5,7 @@ import collections
 import unicodedata
 import itertools
 from math import log10
 import unicodedata
 import itertools
 from math import log10
+import os 
 
 unaccent_specials = ''.maketrans({"’": "'"})
 
 
 unaccent_specials = ''.maketrans({"’": "'"})
 
@@ -56,7 +57,7 @@ def sanitise(text):
 def datafile(name, sep='\t'):
     """Read key,value pairs from file.
     """
 def datafile(name, sep='\t'):
     """Read key,value pairs from file.
     """
-    with open(name, 'r') as f:
+    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])]
         for line in f:
             splits = line.split(sep)
             yield [splits[0], int(splits[1])]
@@ -70,7 +71,7 @@ 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)
 
 english_trigram_counts = collections.Counter(dict(datafile('count_3l.txt')))
 normalised_english_trigram_counts = norms.normalise(english_trigram_counts)
 
-with open('words.txt', 'r') as f:
+with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'words.txt'), 'r') as f:
     keywords = [line.rstrip() for line in f]
 
 
     keywords = [line.rstrip() for line in f]