changeset 3:2528a106f1b5

Moved wiring data into data.py.
author Brian Neal <bgneal@gmail.com>
date Mon, 25 Nov 2013 20:31:12 -0600
parents faf16a57301e
children e4d302bb0f38
files purple/data.py purple/switch.py
diffstat 2 files changed, 134 insertions(+), 213 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/purple/data.py	Mon Nov 25 20:31:12 2013 -0600
@@ -0,0 +1,132 @@
+# Copyright (C) 2013 by Brian Neal.
+# This file is part of purple, the PURPLE (Cipher Machine 97) simulation.
+# purple is released under the MIT License (see LICENSE.txt).
+
+"""This module contains the wiring data for the switches used in the PURPLE
+cipher machine.
+
+This data is taken from the paper "PURPLE Revealed: Simulation and
+Computer-aided Cryptanalysis of Angooki Taipu B", by Wes Freeman, Geoff
+Sullivan, and Frode Weierud. This paper was published in Cryptologia, Volume 27,
+Issue 1, January, 2003, pp. 1-43.
+
+To aid in verifying the data matches the data from the source paper, we have
+kept it 1-based. At runtime the data is converted to be 0-based by the factory
+functions to retrieve the data. As this simulation matures we may decide to
+change the data to be 0-based to avoid the startup cost of converting the data.
+
+This data was obtained by running an OCR program on a PDF of the above paper.
+The resulting text was then converted to Python statements by a throw-away
+script (which can be viewed by examing an early revision of the switches.py
+module.
+
+"""
+
+SIXES_DATA = [
+    [2, 1, 3, 5, 4, 6],
+    [6, 3, 5, 2, 1, 4],
+    [1, 5, 4, 6, 2, 3],
+    [4, 3, 2, 1, 6, 5],
+    [3, 6, 1, 4, 5, 2],
+    [2, 1, 6, 5, 3, 4],
+    [6, 5, 4, 2, 1, 3],
+    [3, 6, 1, 4, 5, 2],
+    [5, 4, 2, 6, 3, 1],
+    [4, 5, 3, 2, 1, 6],
+    [2, 1, 4, 5, 6, 3],
+    [5, 4, 6, 3, 2, 1],
+    [3, 1, 2, 6, 4, 5],
+    [4, 2, 5, 1, 3, 6],
+    [1, 6, 2, 3, 5, 4],
+    [5, 4, 3, 6, 1, 2],
+    [6, 2, 5, 3, 4, 1],
+    [2, 3, 4, 1, 5, 6],
+    [1, 2, 3, 5, 6, 4],
+    [3, 1, 6, 4, 2, 5],
+    [6, 5, 1, 2, 4, 3],
+    [1, 3, 6, 4, 2, 5],
+    [6, 4, 5, 1, 3, 2],
+    [4, 6, 1, 2, 5, 3],
+    [5, 2, 4, 3, 6, 1],
+]
+
+TWENTIES_1_DATA = \
+[[6, 19, 14, 1, 10, 4, 2, 7, 13, 9, 8, 16, 3, 18, 15, 11, 5, 12, 20, 17],
+ [4, 5, 16, 17, 14, 1, 20, 15, 3, 8, 18, 11, 12, 13, 10, 19, 2, 6, 9, 7],
+ [17, 1, 13, 6, 15, 11, 19, 12, 16, 18, 10, 3, 7, 14, 8, 20, 4, 9, 2, 5],
+ [3, 14, 20, 4, 6, 16, 8, 19, 2, 12, 17, 9, 5, 1, 11, 10, 7, 13, 15, 18],
+ [19, 6, 8, 20, 13, 5, 18, 4, 10, 3, 16, 15, 14, 12, 7, 2, 17, 11, 1, 9],
+ [2, 11, 9, 14, 7, 19, 6, 3, 18, 13, 12, 8, 10, 15, 16, 17, 20, 4, 5, 1],
+ [16, 7, 6, 18, 9, 10, 13, 1, 17, 2, 5, 4, 11, 19, 20, 14, 8, 15, 3, 12],
+ [1, 20, 7, 16, 12, 14, 5, 18, 15, 10, 13, 6, 8, 3, 4, 9, 11, 17, 19, 2],
+ [17, 9, 11, 8, 20, 18, 7, 14, 1, 16, 15, 5, 19, 2, 6, 12, 4, 10, 13, 3],
+ [12, 8, 17, 9, 3, 20, 4, 10, 14, 5, 7, 18, 2, 16, 13, 6, 1, 19, 15, 11],
+ [20, 1, 16, 11, 2, 17, 9, 4, 8, 15, 10, 13, 3, 18, 14, 5, 6, 7, 12, 19],
+ [5, 4, 15, 2, 13, 19, 6, 16, 12, 14, 8, 7, 17, 10, 18, 3, 9, 1, 11, 20],
+ [15, 17, 10, 19, 16, 2, 11, 8, 9, 7, 3, 14, 18, 13, 12, 1, 5, 20, 6, 4],
+ [11, 12, 7, 3, 8, 15, 16, 6, 4, 20, 2, 5, 1, 9, 19, 18, 10, 14, 17, 13],
+ [12, 16, 2, 7, 4, 8, 15, 19, 5, 1, 11, 9, 20, 17, 6, 14, 13, 3, 18, 10],
+ [8, 15, 18, 1, 12, 11, 17, 14, 20, 16, 13, 19, 9, 7, 3, 4, 2, 5, 10, 6],
+ [7, 3, 5, 18, 17, 13, 19, 20, 14, 11, 9, 10, 2, 6, 1, 15, 12, 16, 4, 8],
+ [10, 13, 4, 14, 18, 3, 2, 17, 11, 19, 20, 1, 6, 12, 9, 7, 15, 8, 5, 16],
+ [13, 7, 9, 12, 20, 16, 14, 10, 19, 6, 1, 2, 11, 4, 5, 3, 18, 17, 8, 15],
+ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
+ [9, 20, 12, 5, 10, 17, 1, 13, 7, 15, 4, 3, 16, 8, 18, 11, 19, 2, 14, 6],
+ [18, 15, 2, 13, 1, 7, 10, 5, 19, 17, 6, 20, 9, 11, 12, 8, 3, 4, 16, 14],
+ [16, 18, 19, 10, 11, 20, 5, 9, 1, 4, 12, 13, 7, 6, 17, 2, 14, 15, 3, 8],
+ [5, 8, 1, 15, 19, 9, 12, 2, 6, 3, 14, 17, 4, 20, 16, 13, 18, 10, 7, 11],
+ [14, 10, 4, 8, 9, 12, 3, 11, 17, 20, 19, 6, 15, 5, 2, 18, 16, 7, 1, 13]]
+
+TWENTIES_2_DATA = \
+[[15, 9, 1, 5, 17, 19, 3, 2, 10, 8, 11, 18, 12, 16, 6, 13, 20, 4, 14, 7],
+ [12, 6, 15, 2, 4, 9, 8, 16, 19, 17, 5, 11, 20, 7, 10, 18, 1, 14, 13, 3],
+ [4, 18, 5, 8, 16, 1, 12, 15, 20, 14, 13, 17, 11, 2, 7, 9, 6, 3, 10, 19],
+ [6, 11, 2, 20, 14, 7, 18, 12, 15, 3, 8, 5, 10, 1, 17, 19, 9, 16, 4, 13],
+ [7, 2, 13, 3, 9, 4, 17, 14, 1, 12, 18, 20, 6, 11, 16, 15, 5, 8, 19, 10],
+ [5, 17, 14, 7, 10, 9, 19, 20, 8, 13, 1, 2, 16, 3, 4, 12, 11, 18, 6, 15],
+ [8, 4, 3, 11, 19, 13, 2, 9, 12, 16, 10, 17, 14, 15, 20, 6, 18, 1, 7, 5],
+ [20, 1, 16, 10, 15, 8, 14, 11, 18, 5, 3, 7, 13, 17, 19, 4, 2, 9, 12, 6],
+ [9, 8, 7, 15, 5, 2, 4, 13, 17, 1, 11, 6, 19, 18, 14, 10, 3, 20, 16, 12],
+ [10, 12, 11, 18, 8, 16, 20, 17, 5, 6, 9, 3, 4, 19, 13, 7, 1, 14, 15, 2],
+ [11, 7, 14, 4, 18, 20, 6, 1, 13, 19, 12, 15, 5, 9, 16, 2, 17, 10, 8, 3],
+ [2, 3, 9, 10, 13, 14, 15, 16, 7, 11, 20, 12, 18, 6, 1, 5, 8, 17, 19, 4],
+ [16, 10, 15, 1, 17, 3, 13, 9, 4, 7, 6, 8, 2, 14, 5, 11, 12, 19, 18, 20],
+ [19, 16, 18, 12, 3, 13, 9, 10, 6, 2, 17, 14, 11, 4, 7, 20, 15, 5, 1, 8],
+ [18, 14, 12, 19, 1, 7, 10, 6, 11, 15, 5, 9, 8, 20, 17, 4, 3, 13, 2, 16],
+ [20, 3, 19, 2, 4, 5, 11, 14, 9, 10, 18, 16, 15, 12, 8, 7, 13, 6, 17, 1],
+ [3, 6, 4, 14, 2, 12, 16, 5, 18, 20, 7, 19, 1, 15, 9, 8, 10, 11, 13, 17],
+ [5, 15, 20, 9, 10, 17, 1, 19, 13, 12, 4, 2, 7, 6, 11, 14, 16, 8, 3, 18],
+ [14, 20, 13, 17, 5, 18, 8, 4, 2, 15, 16, 1, 9, 19, 3, 6, 7, 10, 12, 11],
+ [8, 11, 1, 6, 19, 14, 5, 18, 17, 3, 10, 13, 12, 20, 15, 16, 4, 2, 7, 9],
+ [17, 19, 6, 1, 12, 15, 20, 7, 16, 9, 3, 11, 13, 10, 2, 18, 8, 4, 5, 14],
+ [1, 5, 12, 20, 6, 11, 14, 8, 9, 7, 19, 4, 3, 13, 10, 17, 18, 16, 15, 2],
+ [16, 8, 10, 13, 11, 6, 19, 5, 3, 4, 15, 20, 17, 2, 18, 1, 14, 7, 9, 12],
+ [19, 13, 8, 16, 20, 10, 7, 1, 2, 18, 14, 6, 9, 5, 12, 3, 17, 15, 11, 4],
+ [13, 1, 17, 15, 7, 4, 16, 3, 14, 5, 2, 10, 18, 8, 11, 9, 19, 12, 20, 6]]
+
+TWENTIES_3_DATA = \
+[[7, 19, 11, 3, 20, 1, 10, 6, 16, 12, 17, 13, 8, 9, 4, 18, 5, 14, 15, 2],
+ [15, 17, 14, 2, 12, 13, 8, 3, 1, 19, 9, 4, 10, 7, 11, 20, 16, 6, 18, 5],
+ [2, 11, 20, 12, 1, 19, 4, 10, 9, 14, 6, 15, 13, 3, 7, 16, 18, 8, 5, 17],
+ [16, 3, 12, 9, 4, 20, 6, 19, 18, 2, 5, 8, 14, 11, 10, 1, 15, 17, 13, 7],
+ [12, 18, 16, 4, 9, 3, 15, 13, 6, 20, 8, 2, 7, 10, 5, 19, 14, 1, 17, 11],
+ [13, 9, 5, 6, 8, 7, 12, 17, 14, 18, 20, 10, 2, 19, 11, 15, 4, 3, 1, 16],
+ [4, 7, 2, 15, 17, 10, 19, 5, 8, 16, 1, 12, 3, 13, 6, 14, 20, 9, 11, 18],
+ [9, 6, 4, 10, 18, 16, 8, 14, 5, 12, 17, 1, 20, 15, 13, 19, 2, 11, 7, 3],
+ [5, 14, 18, 17, 13, 15, 11, 12, 7, 8, 3, 6, 1, 2, 20, 4, 9, 10, 16, 19],
+ [11, 16, 9, 18, 3, 12, 5, 15, 10, 1, 14, 17, 2, 4, 19, 6, 8, 7, 13, 20],
+ [19, 8, 3, 15, 14, 5, 1, 11, 2, 10, 12, 16, 18, 20, 17, 7, 13, 4, 9, 6],
+ [1, 12, 17, 13, 9, 7, 14, 2, 15, 4, 5, 11, 6, 16, 3, 8, 18, 19, 20, 10],
+ [3, 4, 10, 12, 1, 18, 2, 8, 14, 13, 19, 7, 16, 6, 15, 9, 17, 20, 5, 11],
+ [9, 11, 6, 5, 10, 4, 17, 19, 13, 15, 7, 2, 12, 18, 14, 20, 1, 16, 8, 3],
+ [8, 13, 14, 16, 19, 12, 20, 7, 10, 3, 15, 9, 4, 17, 1, 11, 5, 2, 6, 18],
+ [18, 16, 15, 4, 2, 17, 13, 12, 6, 11, 20, 19, 14, 5, 9, 1, 8, 7, 3, 10],
+ [14, 1, 7, 20, 6, 13, 16, 18, 12, 9, 4, 17, 5, 11, 2, 3, 10, 15, 19, 8],
+ [17, 19, 1, 11, 7, 2, 18, 4, 3, 8, 10, 5, 15, 12, 16, 9, 6, 13, 20, 14],
+ [10, 15, 2, 14, 11, 6, 7, 1, 16, 20, 13, 3, 9, 8, 18, 17, 19, 5, 12, 4],
+ [20, 9, 8, 6, 12, 11, 2, 5, 4, 7, 16, 14, 17, 3, 15, 10, 13, 19, 18, 1],
+ [11, 20, 13, 8, 16, 10, 18, 14, 19, 6, 15, 4, 1, 17, 7, 5, 3, 9, 2, 12],
+ [16, 5, 10, 19, 4, 18, 15, 17, 1, 3, 2, 20, 11, 6, 8, 13, 7, 12, 14, 9],
+ [6, 10, 19, 16, 5, 9, 1, 20, 17, 4, 11, 18, 7, 14, 13, 2, 12, 8, 3, 15],
+ [8, 7, 5, 1, 15, 14, 9, 16, 11, 17, 18, 6, 19, 20, 3, 12, 4, 2, 10, 13],
+ [13, 2, 17, 7, 14, 8, 3, 9, 20, 5, 16, 10, 6, 1, 12, 15, 11, 18, 4, 19]]
--- a/purple/switch.py	Wed Nov 13 21:17:42 2013 -0600
+++ b/purple/switch.py	Mon Nov 25 20:31:12 2013 -0600
@@ -20,6 +20,8 @@
         integers representing the output contacts. The initial position of the
         switch can also be set; this defaults to 0.
 
+        The wiring lists are assumed to be 0-based.
+
         """
         self.wiring = wiring
         self.num_contacts = len(wiring)
@@ -43,216 +45,3 @@
 
         """
         return self.wiring[self.pos][level]
-
-
-SIXES_DATA = [
-    [2, 1, 3, 5, 4, 6],
-    [6, 3, 5, 2, 1, 4],
-    [1, 5, 4, 6, 2, 3],
-    [4, 3, 2, 1, 6, 5],
-    [3, 6, 1, 4, 5, 2],
-    [2, 1, 6, 5, 3, 4],
-    [6, 5, 4, 2, 1, 3],
-    [3, 6, 1, 4, 5, 2],
-    [5, 4, 2, 6, 3, 1],
-    [4, 5, 3, 2, 1, 6],
-    [2, 1, 4, 5, 6, 3],
-    [5, 4, 6, 3, 2, 1],
-    [3, 1, 2, 6, 4, 5],
-    [4, 2, 5, 1, 3, 6],
-    [1, 6, 2, 3, 5, 4],
-    [5, 4, 3, 6, 1, 2],
-    [6, 2, 5, 3, 4, 1],
-    [2, 3, 4, 1, 5, 6],
-    [1, 2, 3, 5, 6, 4],
-    [3, 1, 6, 4, 2, 5],
-    [6, 5, 1, 2, 4, 3],
-    [1, 3, 6, 4, 2, 5],
-    [6, 4, 5, 1, 3, 2],
-    [4, 6, 1, 2, 5, 3],
-    [5, 2, 4, 3, 6, 1],
-]
-
-
-TWENTIES_1 = """
-6 19 14 1 10 4 2 7 13 9 8 16 3 18 15 11 5 12 20 17
-4 5 16 17 14 1 20 15 3 8 18 11 12 13 10 19 2 6 9 7
-17 1 13 6 15 11 19 12 16 18 10 3 7 14 8 20 4 9 2 5
-3 14 20 4 6 16 8 19 2 12 17 9 5 1 11 10 7 13 15 18
-19 6 8 20 13 5 18 4 10 3 16 15 14 12 7 2 17 11 1 9
-2 11 9 14 7 19 6 3 18 13 12 8 10 15 16 17 20 4 5 1
-16 7 6 18 9 10 13 1 17 2 5 4 11 19 20 14 8 15 3 12
-1 20 7 16 12 14 5 18 15 10 13 6 8 3 4 9 11 17 19 2
-17 9 11 8 20 18 7 14 1 16 15 5 19 2 6 12 4 10 13 3
-12 8 17 9 3 20 4 10 14 5 7 18 2 16 13 6 1 19 15 11
-20 1 16 11 2 17 9 4 8 15 10 13 3 18 14 5 6 7 12 19
-5 4 15 2 13 19 6 16 12 14 8 7 17 10 18 3 9 1 11 20
-15 17 10 19 16 2 11 8 9 7 3 14 18 13 12 1 5 20 6 4
-11 12 7 3 8 15 16 6 4 20 2 5 1 9 19 18 10 14 17 13
-12 16 2 7 4 8 15 19 5 1 11 9 20 17 6 14 13 3 18 10
-8 15 18 1 12 11 17 14 20 16 13 19 9 7 3 4 2 5 10 6
-7 3 5 18 17 13 19 20 14 11 9 10 2 6 1 15 12 16 4 8
-10 13 4 14 18 3 2 17 11 19 20 1 6 12 9 7 15 8 5 16
-13 7 9 12 20 16 14 10 19 6 1 2 11 4 5 3 18 17 8 15
-1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
-9 20 12 5 10 17 1 13 7 15 4 3 16 8 18 11 19 2 14 6
-18 15 2 13 1 7 10 5 19 17 6 20 9 11 12 8 3 4 16 14
-16 18 19 10 11 20 5 9 1 4 12 13 7 6 17 2 14 15 3 8
-5 8 1 15 19 9 12 2 6 3 14 17 4 20 16 13 18 10 7 11
-14 10 4 8 9 12 3 11 17 20 19 6 15 5 2 18 16 7 1 13
-"""
-
-TWENTIES_2 = """
-15 9 1 5 17 19 3 2 10 8 11 18 12 16 6 13 20 4 14 7
-12 6 15 2 4 9 8 16 19 17 5 11 20 7 10 18 1 14 13 3
-4 18 5 8 16 1 12 15 20 14 13 17 11 2 7 9 6 3 10 19
-6 11 2 20 14 7 18 12 15 3 8 5 10 1 17 19 9 16 4 13
-7 2 13 3 9 4 17 14 1 12 18 20 6 11 16 15 5 8 19 10
-5 17 14 7 10 9 19 20 8 13 1 2 16 3 4 12 11 18 6 15
-8 4 3 11 19 13 2 9 12 16 10 17 14 15 20 6 18 1 7 5
-20 1 16 10 15 8 14 11 18 5 3 7 13 17 19 4 2 9 12 6
-9 8 7 15 5 2 4 13 17 1 11 6 19 18 14 10 3 20 16 12
-10 12 11 18 8 16 20 17 5 6 9 3 4 19 13 7 1 14 15 2
-11 7 14 4 18 20 6 1 13 19 12 15 5 9 16 2 17 10 8 3
-2 3 9 10 13 14 15 16 7 11 20 12 18 6 1 5 8 17 19 4
-16 10 15 1 17 3 13 9 4 7 6 8 2 14 5 11 12 19 18 20
-19 16 18 12 3 13 9 10 6 2 17 14 11 4 7 20 15 5 1 8
-18 14 12 19 1 7 10 6 11 15 5 9 8 20 17 4 3 13 2 16
-20 3 19 2 4 5 11 14 9 10 18 16 15 12 8 7 13 6 17 1
-3 6 4 14 2 12 16 5 18 20 7 19 1 15 9 8 10 11 13 17
-5 15 20 9 10 17 1 19 13 12 4 2 7 6 11 14 16 8 3 18
-14 20 13 17 5 18 8 4 2 15 16 1 9 19 3 6 7 10 12 11
-8 11 1 6 19 14 5 18 17 3 10 13 12 20 15 16 4 2 7 9
-17 19 6 1 12 15 20 7 16 9 3 11 13 10 2 18 8 4 5 14
-1 5 12 20 6 11 14 8 9 7 19 4 3 13 10 17 18 16 15 2
-16 8 10 13 11 6 19 5 3 4 15 20 17 2 18 1 14 7 9 12
-19 13 8 16 20 10 7 1 2 18 14 6 9 5 12 3 17 15 11 4
-13 1 17 15 7 4 16 3 14 5 2 10 18 8 11 9 19 12 20 6
-"""
-
-TWENTIES_3 = """
-7 19 11 3 20 1 10 6 16 12 17 13 8 9 4 18 5 14 15 2
-15 17 14 2 12 13 8 3 1 19 9 4 10 7 11 20 16 6 18 5
-2 11 20 12 1 19 4 10 9 14 6 15 13 3 7 16 18 8 5 17
-16 3 12 9 4 20 6 19 18 2 5 8 14 11 10 1 15 17 13 7
-12 18 16 4 9 3 15 13 6 20 8 2 7 10 5 19 14 1 17 11
-13 9 5 6 8 7 12 17 14 18 20 10 2 19 11 15 4 3 1 16
-4 7 2 15 17 10 19 5 8 16 1 12 3 13 6 14 20 9 11 18
-9 6 4 10 18 16 8 14 5 12 17 1 20 15 13 19 2 11 7 3
-5 14 18 17 13 15 11 12 7 8 3 6 1 2 20 4 9 10 16 19
-11 16 9 18 3 12 5 15 10 1 14 17 2 4 19 6 8 7 13 20
-19 8 3 15 14 5 1 11 2 10 12 16 18 20 17 7 13 4 9 6
-1 12 17 13 9 7 14 2 15 4 5 11 6 16 3 8 18 19 20 10
-3 4 10 12 1 18 2 8 14 13 19 7 16 6 15 9 17 20 5 11
-9 11 6 5 10 4 17 19 13 15 7 2 12 18 14 20 1 16 8 3
-8 13 14 16 19 12 20 7 10 3 15 9 4 17 1 11 5 2 6 18
-18 16 15 4 2 17 13 12 6 11 20 19 14 5 9 1 8 7 3 10
-14 1 7 20 6 13 16 18 12 9 4 17 5 11 2 3 10 15 19 8
-17 19 1 11 7 2 18 4 3 8 10 5 15 12 16 9 6 13 20 14
-10 15 2 14 11 6 7 1 16 20 13 3 9 8 18 17 19 5 12 4
-20 9 8 6 12 11 2 5 4 7 16 14 17 3 15 10 13 19 18 1
-11 20 13 8 16 10 18 14 19 6 15 4 1 17 7 5 3 9 2 12
-16 5 10 19 4 18 15 17 1 3 2 20 11 6 8 13 7 12 14 9
-6 10 19 16 5 9 1 20 17 4 11 18 7 14 13 2 12 8 3 15
-8 7 5 1 15 14 9 16 11 17 18 6 19 20 3 12 4 2 10 13
-13 2 17 7 14 8 3 9 20 5 16 10 6 1 12 15 11 18 4 19
-"""
-
-import pprint
-
-def process_twenties(s):
-    data = s.split()
-    data = [int(s) for s in data]
-    n = 0
-    table = []
-    for i in range(25):
-        row = []
-        for j in range(20):
-            row.append(data[n])
-            n += 1
-        table.append(row)
-    pprint.pprint(table)
-
-process_twenties(TWENTIES_1)
-process_twenties(TWENTIES_2)
-process_twenties(TWENTIES_3)
-
-"""
-[[6, 19, 14, 1, 10, 4, 2, 7, 13, 9, 8, 16, 3, 18, 15, 11, 5, 12, 20, 17],
- [4, 5, 16, 17, 14, 1, 20, 15, 3, 8, 18, 11, 12, 13, 10, 19, 2, 6, 9, 7],
- [17, 1, 13, 6, 15, 11, 19, 12, 16, 18, 10, 3, 7, 14, 8, 20, 4, 9, 2, 5],
- [3, 14, 20, 4, 6, 16, 8, 19, 2, 12, 17, 9, 5, 1, 11, 10, 7, 13, 15, 18],
- [19, 6, 8, 20, 13, 5, 18, 4, 10, 3, 16, 15, 14, 12, 7, 2, 17, 11, 1, 9],
- [2, 11, 9, 14, 7, 19, 6, 3, 18, 13, 12, 8, 10, 15, 16, 17, 20, 4, 5, 1],
- [16, 7, 6, 18, 9, 10, 13, 1, 17, 2, 5, 4, 11, 19, 20, 14, 8, 15, 3, 12],
- [1, 20, 7, 16, 12, 14, 5, 18, 15, 10, 13, 6, 8, 3, 4, 9, 11, 17, 19, 2],
- [17, 9, 11, 8, 20, 18, 7, 14, 1, 16, 15, 5, 19, 2, 6, 12, 4, 10, 13, 3],
- [12, 8, 17, 9, 3, 20, 4, 10, 14, 5, 7, 18, 2, 16, 13, 6, 1, 19, 15, 11],
- [20, 1, 16, 11, 2, 17, 9, 4, 8, 15, 10, 13, 3, 18, 14, 5, 6, 7, 12, 19],
- [5, 4, 15, 2, 13, 19, 6, 16, 12, 14, 8, 7, 17, 10, 18, 3, 9, 1, 11, 20],
- [15, 17, 10, 19, 16, 2, 11, 8, 9, 7, 3, 14, 18, 13, 12, 1, 5, 20, 6, 4],
- [11, 12, 7, 3, 8, 15, 16, 6, 4, 20, 2, 5, 1, 9, 19, 18, 10, 14, 17, 13],
- [12, 16, 2, 7, 4, 8, 15, 19, 5, 1, 11, 9, 20, 17, 6, 14, 13, 3, 18, 10],
- [8, 15, 18, 1, 12, 11, 17, 14, 20, 16, 13, 19, 9, 7, 3, 4, 2, 5, 10, 6],
- [7, 3, 5, 18, 17, 13, 19, 20, 14, 11, 9, 10, 2, 6, 1, 15, 12, 16, 4, 8],
- [10, 13, 4, 14, 18, 3, 2, 17, 11, 19, 20, 1, 6, 12, 9, 7, 15, 8, 5, 16],
- [13, 7, 9, 12, 20, 16, 14, 10, 19, 6, 1, 2, 11, 4, 5, 3, 18, 17, 8, 15],
- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
- [9, 20, 12, 5, 10, 17, 1, 13, 7, 15, 4, 3, 16, 8, 18, 11, 19, 2, 14, 6],
- [18, 15, 2, 13, 1, 7, 10, 5, 19, 17, 6, 20, 9, 11, 12, 8, 3, 4, 16, 14],
- [16, 18, 19, 10, 11, 20, 5, 9, 1, 4, 12, 13, 7, 6, 17, 2, 14, 15, 3, 8],
- [5, 8, 1, 15, 19, 9, 12, 2, 6, 3, 14, 17, 4, 20, 16, 13, 18, 10, 7, 11],
- [14, 10, 4, 8, 9, 12, 3, 11, 17, 20, 19, 6, 15, 5, 2, 18, 16, 7, 1, 13]]
-
-[[15, 9, 1, 5, 17, 19, 3, 2, 10, 8, 11, 18, 12, 16, 6, 13, 20, 4, 14, 7],
- [12, 6, 15, 2, 4, 9, 8, 16, 19, 17, 5, 11, 20, 7, 10, 18, 1, 14, 13, 3],
- [4, 18, 5, 8, 16, 1, 12, 15, 20, 14, 13, 17, 11, 2, 7, 9, 6, 3, 10, 19],
- [6, 11, 2, 20, 14, 7, 18, 12, 15, 3, 8, 5, 10, 1, 17, 19, 9, 16, 4, 13],
- [7, 2, 13, 3, 9, 4, 17, 14, 1, 12, 18, 20, 6, 11, 16, 15, 5, 8, 19, 10],
- [5, 17, 14, 7, 10, 9, 19, 20, 8, 13, 1, 2, 16, 3, 4, 12, 11, 18, 6, 15],
- [8, 4, 3, 11, 19, 13, 2, 9, 12, 16, 10, 17, 14, 15, 20, 6, 18, 1, 7, 5],
- [20, 1, 16, 10, 15, 8, 14, 11, 18, 5, 3, 7, 13, 17, 19, 4, 2, 9, 12, 6],
- [9, 8, 7, 15, 5, 2, 4, 13, 17, 1, 11, 6, 19, 18, 14, 10, 3, 20, 16, 12],
- [10, 12, 11, 18, 8, 16, 20, 17, 5, 6, 9, 3, 4, 19, 13, 7, 1, 14, 15, 2],
- [11, 7, 14, 4, 18, 20, 6, 1, 13, 19, 12, 15, 5, 9, 16, 2, 17, 10, 8, 3],
- [2, 3, 9, 10, 13, 14, 15, 16, 7, 11, 20, 12, 18, 6, 1, 5, 8, 17, 19, 4],
- [16, 10, 15, 1, 17, 3, 13, 9, 4, 7, 6, 8, 2, 14, 5, 11, 12, 19, 18, 20],
- [19, 16, 18, 12, 3, 13, 9, 10, 6, 2, 17, 14, 11, 4, 7, 20, 15, 5, 1, 8],
- [18, 14, 12, 19, 1, 7, 10, 6, 11, 15, 5, 9, 8, 20, 17, 4, 3, 13, 2, 16],
- [20, 3, 19, 2, 4, 5, 11, 14, 9, 10, 18, 16, 15, 12, 8, 7, 13, 6, 17, 1],
- [3, 6, 4, 14, 2, 12, 16, 5, 18, 20, 7, 19, 1, 15, 9, 8, 10, 11, 13, 17],
- [5, 15, 20, 9, 10, 17, 1, 19, 13, 12, 4, 2, 7, 6, 11, 14, 16, 8, 3, 18],
- [14, 20, 13, 17, 5, 18, 8, 4, 2, 15, 16, 1, 9, 19, 3, 6, 7, 10, 12, 11],
- [8, 11, 1, 6, 19, 14, 5, 18, 17, 3, 10, 13, 12, 20, 15, 16, 4, 2, 7, 9],
- [17, 19, 6, 1, 12, 15, 20, 7, 16, 9, 3, 11, 13, 10, 2, 18, 8, 4, 5, 14],
- [1, 5, 12, 20, 6, 11, 14, 8, 9, 7, 19, 4, 3, 13, 10, 17, 18, 16, 15, 2],
- [16, 8, 10, 13, 11, 6, 19, 5, 3, 4, 15, 20, 17, 2, 18, 1, 14, 7, 9, 12],
- [19, 13, 8, 16, 20, 10, 7, 1, 2, 18, 14, 6, 9, 5, 12, 3, 17, 15, 11, 4],
- [13, 1, 17, 15, 7, 4, 16, 3, 14, 5, 2, 10, 18, 8, 11, 9, 19, 12, 20, 6]]
-
-[[7, 19, 11, 3, 20, 1, 10, 6, 16, 12, 17, 13, 8, 9, 4, 18, 5, 14, 15, 2],
- [15, 17, 14, 2, 12, 13, 8, 3, 1, 19, 9, 4, 10, 7, 11, 20, 16, 6, 18, 5],
- [2, 11, 20, 12, 1, 19, 4, 10, 9, 14, 6, 15, 13, 3, 7, 16, 18, 8, 5, 17],
- [16, 3, 12, 9, 4, 20, 6, 19, 18, 2, 5, 8, 14, 11, 10, 1, 15, 17, 13, 7],
- [12, 18, 16, 4, 9, 3, 15, 13, 6, 20, 8, 2, 7, 10, 5, 19, 14, 1, 17, 11],
- [13, 9, 5, 6, 8, 7, 12, 17, 14, 18, 20, 10, 2, 19, 11, 15, 4, 3, 1, 16],
- [4, 7, 2, 15, 17, 10, 19, 5, 8, 16, 1, 12, 3, 13, 6, 14, 20, 9, 11, 18],
- [9, 6, 4, 10, 18, 16, 8, 14, 5, 12, 17, 1, 20, 15, 13, 19, 2, 11, 7, 3],
- [5, 14, 18, 17, 13, 15, 11, 12, 7, 8, 3, 6, 1, 2, 20, 4, 9, 10, 16, 19],
- [11, 16, 9, 18, 3, 12, 5, 15, 10, 1, 14, 17, 2, 4, 19, 6, 8, 7, 13, 20],
- [19, 8, 3, 15, 14, 5, 1, 11, 2, 10, 12, 16, 18, 20, 17, 7, 13, 4, 9, 6],
- [1, 12, 17, 13, 9, 7, 14, 2, 15, 4, 5, 11, 6, 16, 3, 8, 18, 19, 20, 10],
- [3, 4, 10, 12, 1, 18, 2, 8, 14, 13, 19, 7, 16, 6, 15, 9, 17, 20, 5, 11],
- [9, 11, 6, 5, 10, 4, 17, 19, 13, 15, 7, 2, 12, 18, 14, 20, 1, 16, 8, 3],
- [8, 13, 14, 16, 19, 12, 20, 7, 10, 3, 15, 9, 4, 17, 1, 11, 5, 2, 6, 18],
- [18, 16, 15, 4, 2, 17, 13, 12, 6, 11, 20, 19, 14, 5, 9, 1, 8, 7, 3, 10],
- [14, 1, 7, 20, 6, 13, 16, 18, 12, 9, 4, 17, 5, 11, 2, 3, 10, 15, 19, 8],
- [17, 19, 1, 11, 7, 2, 18, 4, 3, 8, 10, 5, 15, 12, 16, 9, 6, 13, 20, 14],
- [10, 15, 2, 14, 11, 6, 7, 1, 16, 20, 13, 3, 9, 8, 18, 17, 19, 5, 12, 4],
- [20, 9, 8, 6, 12, 11, 2, 5, 4, 7, 16, 14, 17, 3, 15, 10, 13, 19, 18, 1],
- [11, 20, 13, 8, 16, 10, 18, 14, 19, 6, 15, 4, 1, 17, 7, 5, 3, 9, 2, 12],
- [16, 5, 10, 19, 4, 18, 15, 17, 1, 3, 2, 20, 11, 6, 8, 13, 7, 12, 14, 9],
- [6, 10, 19, 16, 5, 9, 1, 20, 17, 4, 11, 18, 7, 14, 13, 2, 12, 8, 3, 15],
- [8, 7, 5, 1, 15, 14, 9, 16, 11, 17, 18, 6, 19, 20, 3, 12, 4, 2, 10, 13],
- [13, 2, 17, 7, 14, 8, 3, 9, 20, 5, 16, 10, 6, 1, 12, 15, 11, 18, 4, 19]]
- """