Source code: com/neuron/jaffer/CAST128.java
1 /* $Id: CAST128.java,v 1.2 2003/02/11 22:12:16 stewart Exp $
2 *
3 * Copyright (C) 1995-2000 The Cryptix Foundation Limited.
4 * All rights reserved.
5 *
6 * Use, modification, copying and distribution of this software is subject
7 * the terms and conditions of the Cryptix General Licence. You should have
8 * received a copy of the Cryptix General Licence along with this library;
9 * if not, you can download a copy from http://www.cryptix.org/ .
10 *
11 * This class is derived from the CAST5 Cryptix code.
12 */
13
14 package com.neuron.jaffer;
15
16 public final class CAST128
17 {
18
19 // Static variables and constants
20 //............................................................................
21
22 /** Various constants */
23 private static final int
24 MIN_NOF_ROUNDS = 12,
25 MAX_NOF_ROUNDS = 16,
26 BLOCK_SIZE = 8,
27 DEFAULT_NOF_ROUNDS = MAX_NOF_ROUNDS;
28
29
30 /**
31 * Compressed S-boxes.
32 * Compiled size from 33K to 21K. See Blowfish.java for more info.
33 */
34 private static String
35 sS0="0\u00FB@\u00D4\u009F\u00A0\u00FF\u000Bk\u00EC\u00CD/?%\u008C" +
36 "z\u001E!?/\u009C\u0000M\u00D3`\u0003\u00E5@\u00CF\u009F\u00C9" +
37 "I\u00BF\u00D4\u00AF'\u0088\u00BB\u00BD\u00B5\u00E2\u0003@\u0090" +
38 "\u0098\u00D0\u0096unc\u00A0\u00E0\u0015\u00C3a\u00D2\u00C2\u00E7" +
39 "f\u001D\"\u00D4\u00FF\u008E(h;o\u00C0\u007F\u00D0Y\u00FF#y\u00C8" +
40 "w_P\u00E2C\u00C3@\u00D3\u00DF/\u0086V\u0088|\u00A4\u001A\u00A2" +
41 "\u00D2\u00BD-\u00A1\u00C9\u00E0\u00D64lH\u0019a\u00B7m\u0087" +
42 "\"T\u000F/*\u00BE2\u00E1\u00AAT\u0016k\"V\u008E:\u00A2\u00D3" +
43 "A\u00D0f\u00DB@\u00C8\u00A7\u00849/\u0000M\u00FF/-\u00B9\u00D2" +
44 "\u00DE\u0097\u0094?\u00ACJ\u0097\u00C1\u00D8RvD\u00B7\u00B5\u00F4"+
45 "7\u00A7\u00B8,\u00BA\u00EF\u00D7Q\u00D1Yo\u00F7\u00F0\u00EDZ" +
46 "\tz\u001F\u0082{h\u00D0\u0090\u00EC\u00F5.\"\u00B0\u00C0T\u00BC" +
47 "\u008EY5Km/\u007FP\u00BBd\u00A2\u00D2fI\u0010\u00BE\u00E5\u0081" +
48 "-\u00B73\"\u0090\u00E9;\u0015\u009F\u00B4\u008E\u00E4\u0011K" +
49 "\u00FF4]\u00FDE\u00C2@\u00AD1\u0097?\u00C4\u00F6\u00D0.U\u00FC" +
50 "\u0081e\u00D5\u00B1\u00CA\u00AD\u00A1\u00AC-\u00AE\u00A2\u00D4" +
51 "\u00B7m\u00C1\u009B\u000CP\u0088\"@\u00F2\u000CnO8\u00A4\u00E4" +
52 "\u00BF\u00D7O[\u00A2rVL\u001D/\u00C5\u009CS\u0019\u00B9I\u00E3" +
53 "T\u00B0Fi\u00FE\u00B1\u00B6\u00AB\u008A\u00C7\u0013X\u00DDc\u0085"+
54 "\u00C5E\u0011\u000F\u0093]WS\u008A\u00D5j9\u0004\u0093\u00E6" +
55 "=7\u00E0*T\u00F6\u00B3:x}_bv\u00A0\u00B5\u0019\u00A6\u00FC\u00DF" +
56 "zB j)\u00F9\u00D4\u00D5\u00F6\u001B\u0018\u0091\u00BBr'^\u00AA" +
57 "P\u0081g8\u0090\u0010\u0091\u00C6\u00B5\u0005\u00EB\u0084\u00C7" +
58 "\u00CB\u008C*\u00D7Z\u000F\u0087J\u0014'\u00A2\u00D1\u0093k*" +
59 "\u00D2\u0086\u00AF\u00AAV\u00D2\u0091\u00D7\u0089C`B\\u\r\u0093" +
60 "\u00B3\u009E&\u0018q\u0084\u00C9l\u0000\u00B3-s\u00E2\u00BB\u0014"+
61 "\u00A0\u00BE\u00BC<Tb7ydE\u009E\u00AB?2\u008B\u0082w\u0018\u00CF" +
62 "\u0082Y\u00A2\u00CE\u00A6\u0004\u00EE\u0000.\u0089\u00FEx\u00E6" +
63 "?\u00AB\tP2_\u00F6\u00C2\u00818?\u0005ic\u00C5\u00C8v\u00CBZ" +
64 "\u00D6\u00D4\u0099t\u00C9\u00CA\u0018\r\u00CF8\u0007\u0082\u00D5" +
65 "\u00C7\u00FA\\\u00F6\u008A\u00C3\u0015\u00115\u00E7\u009E\u0013" +
66 "G\u00DA\u0091\u00D0\u00F4\u000F\u0090\u0086\u00A7\u00E2A\u009E" +
67 "16bA\u0005\u001E\u00F4\u0095\u00AAW;\u0004J\u0080]\u008DT\u0083" +
68 "\u0000\u00D0\u00002*<\u00BFd\u00CD\u00DF\u00BAW\u00A6\u008Eu" +
69 "\u00C67+P\u00AF\u00D3A\u00A7\u00C12u\u0091Z\u000B\u00F5kT\u00BF" +
70 "\u00AB+\u000B\u0014&\u00ABL\u00C9\u00D7D\u009C\u00CD\u0082\u00F7" +
71 "\u00FB\u00F2e\u00AB\u0085\u00C5\u00F3\u001BU\u00DB\u0094\u00AA" +
72 "\u00D4\u00E3$\u00CF\u00A4\u00BD?-\u00EA\u00A3\u00E2\u009E M\u0002"+
73 "\u00C8\u00BD%\u00AC\u00EA\u00DFU\u00B3\u00D5\u00BD\u009E\u0098" +
74 "\u00E3\u00121\u00B2*\u00D5\u00ADl\u0095C)\u00DE\u00AD\u00BEE" +
75 "(\u00D8q\u000Fi\u00AAQ\u00C9\u000F\u00AAxk\u00F6\"Q?\u001E\u00AA" +
76 "Q\u00A7\u009B*\u00D3D\u00CC{ZA\u00F0\u00D3|\u00FB\u00AD\u001B" +
77 "\u0006\u0095\u0005A\u00EC\u00E4\u0091\u00B4\u00C32\u00E6\u0003" +
78 "\"h\u00D4\u00C9`\n\u00CC\u00CE8~m\u00BFk\u00B1ljp\u00FBx\r\u0003" +
79 "\u00D9\u00C9\u00D4\u00DF9\u00DE\u00E0\u0010c\u00DAG6\u00F4dZ" +
80 "\u00D3(\u00D8\u00B3G\u00CC\u0096u\u00BB\u000F\u00C3\u0098Q\u001B" +
81 "\u00FBO\u00FB\u00CC5\u00B5\u008B\u00CFj\u00E1\u001F\n\u00BC\u00BF"+
82 "\u00C5\u00FEJ\u00A7\n\u00EC\u0010\u00AC9W\n?\u0004D/a\u0088\u00B1"+
83 "S\u00E09z.W'\u00CBy\u009C\u00EBA\u008F\u001C\u00AC\u00D6\u008D" +
84 "*\u00D3|\u0096\u0001u\u00CB\u009D\u00C6\u009D\u00FF\t\u00C7[" +
85 "e\u00F0\u00D9\u00DB@\u00D8\u00EC\u000EwyGD\u00EA\u00D4\u00B1" +
86 "\u001C2t\u00DD$\u00CB\u009E~\u001CT\u00BD\u00F0\u0011D\u00F9" +
87 "\u00D2$\u000E\u00B1\u0096u\u00B3\u00FD\u00A3\u00AC7U\u00D4|'" +
88 "\u00AFQ\u00C8_MV\u0090u\u0096\u00A5\u00BB\u0015\u00E6X\u0003" +
89 "\u0004\u00F0\u00CA\u0004,\u00F1\u0001\u001A7\u00EA\u008D\u00BF" +
90 "\u00AA\u00DB5\u00BA>J5&\u00FF\u00A0\u00C3{M\t\u00BC0n\u00D9\u0098"+
91 "\u00A5&fVH\u00F7%\u00FF^V\u009D\u000C\u00EDc\u00D0|c\u00B2\u00CF" +
92 "p\u000BE\u00E1\u00D5\u00EAP\u00F1\u0085\u00A9(r\u00AF\u001F\u00BD"+
93 "\u00A7\u00D4#Hp\u00A7\u0087\u000B\u00F3-;MyB\u00E0A\u0098\u000C" +
94 "\u00D0\u00ED\u00E7&G\r\u00B8\u00F8\u0081\u0081LGMj\u00D7|\u000C" +
95 "^\\\u00D1#\u0019Y8\u001Br\u0098\u00F5\u00D2\u00F4\u00DB\u00AB" +
96 "\u0083\u0086Sn/\u001E#\u0083q\u009C\u009E\u00BD\u0091\u00E0F" +
97 "\u009AVEn\u00DC9 \u000C \u00C8\u00C5q\u0096+\u00DA\u001C\u00E1" +
98 "\u00E6\u0096\u00FF\u00B1A\u00AB\u0008|\u00CA\u0089\u00B9\u001A" +
99 "i\u00E7\u0083\u0002\u00CCHC\u00A2\u00F7\u00C5yB\u009E\u00F4}" +
100 "B{\u0016\u009CZ\u00C9\u00F0I\u00DD\u008F\u000F\u0000\\\u0081" +
101 "e\u00BF",
102 sS1="0\u00FB@\u00D4\u009F\u00A0\u00FF\u000Bk\u00EC\u00CD/?%\u008C" +
103 "z\u001E!?/\u009C\u0000M\u00D3`\u0003\u00E5@\u00CF\u009F\u00C9" +
104 "I\u00BF\u00D4\u00AF'\u0088\u00BB\u00BD\u00B5\u00E2\u0003@\u0090" +
105 "\u0098\u00D0\u0096unc\u00A0\u00E0\u0015\u00C3a\u00D2\u00C2\u00E7" +
106 "f\u001D\"\u00D4\u00FF\u008E(h;o\u00C0\u007F\u00D0Y\u00FF#y\u00C8" +
107 "w_P\u00E2C\u00C3@\u00D3\u00DF/\u0086V\u0088|\u00A4\u001A\u00A2" +
108 "\u00D2\u00BD-\u00A1\u00C9\u00E0\u00D64lH\u0019a\u00B7m\u0087" +
109 "\"T\u000F/*\u00BE2\u00E1\u00AAT\u0016k\"V\u008E:\u00A2\u00D3" +
110 "A\u00D0f\u00DB@\u00C8\u00A7\u00849/\u0000M\u00FF/-\u00B9\u00D2" +
111 "\u00DE\u0097\u0094?\u00ACJ\u0097\u00C1\u00D8RvD\u00B7\u00B5\u00F4"+
112 "7\u00A7\u00B8,\u00BA\u00EF\u00D7Q\u00D1Yo\u00F7\u00F0\u00EDZ" +
113 "\tz\u001F\u0082{h\u00D0\u0090\u00EC\u00F5.\"\u00B0\u00C0T\u00BC" +
114 "\u008EY5Km/\u007FP\u00BBd\u00A2\u00D2fI\u0010\u00BE\u00E5\u0081" +
115 "-\u00B73\"\u0090\u00E9;\u0015\u009F\u00B4\u008E\u00E4\u0011K" +
116 "\u00FF4]\u00FDE\u00C2@\u00AD1\u0097?\u00C4\u00F6\u00D0.U\u00FC" +
117 "\u0081e\u00D5\u00B1\u00CA\u00AD\u00A1\u00AC-\u00AE\u00A2\u00D4" +
118 "\u00B7m\u00C1\u009B\u000CP\u0088\"@\u00F2\u000CnO8\u00A4\u00E4" +
119 "\u00BF\u00D7O[\u00A2rVL\u001D/\u00C5\u009CS\u0019\u00B9I\u00E3" +
120 "T\u00B0Fi\u00FE\u00B1\u00B6\u00AB\u008A\u00C7\u0013X\u00DDc\u0085"+
121 "\u00C5E\u0011\u000F\u0093]WS\u008A\u00D5j9\u0004\u0093\u00E6" +
122 "=7\u00E0*T\u00F6\u00B3:x}_bv\u00A0\u00B5\u0019\u00A6\u00FC\u00DF" +
123 "zB j)\u00F9\u00D4\u00D5\u00F6\u001B\u0018\u0091\u00BBr'^\u00AA" +
124 "P\u0081g8\u0090\u0010\u0091\u00C6\u00B5\u0005\u00EB\u0084\u00C7" +
125 "\u00CB\u008C*\u00D7Z\u000F\u0087J\u0014'\u00A2\u00D1\u0093k*" +
126 "\u00D2\u0086\u00AF\u00AAV\u00D2\u0091\u00D7\u0089C`B\\u\r\u0093" +
127 "\u00B3\u009E&\u0018q\u0084\u00C9l\u0000\u00B3-s\u00E2\u00BB\u0014"+
128 "\u00A0\u00BE\u00BC<Tb7ydE\u009E\u00AB?2\u008B\u0082w\u0018\u00CF" +
129 "\u0082Y\u00A2\u00CE\u00A6\u0004\u00EE\u0000.\u0089\u00FEx\u00E6" +
130 "?\u00AB\tP2_\u00F6\u00C2\u00818?\u0005ic\u00C5\u00C8v\u00CBZ" +
131 "\u00D6\u00D4\u0099t\u00C9\u00CA\u0018\r\u00CF8\u0007\u0082\u00D5" +
132 "\u00C7\u00FA\\\u00F6\u008A\u00C3\u0015\u00115\u00E7\u009E\u0013" +
133 "G\u00DA\u0091\u00D0\u00F4\u000F\u0090\u0086\u00A7\u00E2A\u009E" +
134 "16bA\u0005\u001E\u00F4\u0095\u00AAW;\u0004J\u0080]\u008DT\u0083" +
135 "\u0000\u00D0\u00002*<\u00BFd\u00CD\u00DF\u00BAW\u00A6\u008Eu" +
136 "\u00C67+P\u00AF\u00D3A\u00A7\u00C12u\u0091Z\u000B\u00F5kT\u00BF" +
137 "\u00AB+\u000B\u0014&\u00ABL\u00C9\u00D7D\u009C\u00CD\u0082\u00F7" +
138 "\u00FB\u00F2e\u00AB\u0085\u00C5\u00F3\u001BU\u00DB\u0094\u00AA" +
139 "\u00D4\u00E3$\u00CF\u00A4\u00BD?-\u00EA\u00A3\u00E2\u009E M\u0002"+
140 "\u00C8\u00BD%\u00AC\u00EA\u00DFU\u00B3\u00D5\u00BD\u009E\u0098" +
141 "\u00E3\u00121\u00B2*\u00D5\u00ADl\u0095C)\u00DE\u00AD\u00BEE" +
142 "(\u00D8q\u000Fi\u00AAQ\u00C9\u000F\u00AAxk\u00F6\"Q?\u001E\u00AA" +
143 "Q\u00A7\u009B*\u00D3D\u00CC{ZA\u00F0\u00D3|\u00FB\u00AD\u001B" +
144 "\u0006\u0095\u0005A\u00EC\u00E4\u0091\u00B4\u00C32\u00E6\u0003" +
145 "\"h\u00D4\u00C9`\n\u00CC\u00CE8~m\u00BFk\u00B1ljp\u00FBx\r\u0003" +
146 "\u00D9\u00C9\u00D4\u00DF9\u00DE\u00E0\u0010c\u00DAG6\u00F4dZ" +
147 "\u00D3(\u00D8\u00B3G\u00CC\u0096u\u00BB\u000F\u00C3\u0098Q\u001B" +
148 "\u00FBO\u00FB\u00CC5\u00B5\u008B\u00CFj\u00E1\u001F\n\u00BC\u00BF"+
149 "\u00C5\u00FEJ\u00A7\n\u00EC\u0010\u00AC9W\n?\u0004D/a\u0088\u00B1"+
150 "S\u00E09z.W'\u00CBy\u009C\u00EBA\u008F\u001C\u00AC\u00D6\u008D" +
151 "*\u00D3|\u0096\u0001u\u00CB\u009D\u00C6\u009D\u00FF\t\u00C7[" +
152 "e\u00F0\u00D9\u00DB@\u00D8\u00EC\u000EwyGD\u00EA\u00D4\u00B1" +
153 "\u001C2t\u00DD$\u00CB\u009E~\u001CT\u00BD\u00F0\u0011D\u00F9" +
154 "\u00D2$\u000E\u00B1\u0096u\u00B3\u00FD\u00A3\u00AC7U\u00D4|'" +
155 "\u00AFQ\u00C8_MV\u0090u\u0096\u00A5\u00BB\u0015\u00E6X\u0003" +
156 "\u0004\u00F0\u00CA\u0004,\u00F1\u0001\u001A7\u00EA\u008D\u00BF" +
157 "\u00AA\u00DB5\u00BA>J5&\u00FF\u00A0\u00C3{M\t\u00BC0n\u00D9\u0098"+
158 "\u00A5&fVH\u00F7%\u00FF^V\u009D\u000C\u00EDc\u00D0|c\u00B2\u00CF" +
159 "p\u000BE\u00E1\u00D5\u00EAP\u00F1\u0085\u00A9(r\u00AF\u001F\u00BD"+
160 "\u00A7\u00D4#Hp\u00A7\u0087\u000B\u00F3-;MyB\u00E0A\u0098\u000C" +
161 "\u00D0\u00ED\u00E7&G\r\u00B8\u00F8\u0081\u0081LGMj\u00D7|\u000C" +
162 "^\\\u00D1#\u0019Y8\u001Br\u0098\u00F5\u00D2\u00F4\u00DB\u00AB" +
163 "\u0083\u0086Sn/\u001E#\u0083q\u009C\u009E\u00BD\u0091\u00E0F" +
164 "\u009AVEn\u00DC9 \u000C \u00C8\u00C5q\u0096+\u00DA\u001C\u00E1" +
165 "\u00E6\u0096\u00FF\u00B1A\u00AB\u0008|\u00CA\u0089\u00B9\u001A" +
166 "i\u00E7\u0083\u0002\u00CCHC\u00A2\u00F7\u00C5yB\u009E\u00F4}" +
167 "B{\u0016\u009CZ\u00C9\u00F0I\u00DD\u008F\u000F\u0000\\\u0081" +
168 "e\u00BF",
169 sS2="\u001F \u0010\u0094\u00EF\u000B\u00A7[i\u00E3\u00CF~9?C\u0080" +
170 "\u00FEa\u00CFz\u00EE\u00C5 zU\u0088\u009C\u0094r\u00FC\u0006" +
171 "Q\u00AD\u00A7\u00EFyN\u001Dr5\u00D5Zc\u00CE\u00DE\u00046\u00BA" +
172 "\u0099\u00C40\u00EF_\u000C\u0007\u0094\u0018\u00DC\u00DB}\u00A1" +
173 "\u00D6\u00EF\u00F3\u00A0\u00B5/{Y\u00E86\u0005\u00EE\u0015\u00B0" +
174 "\u0094\u00E9\u00FF\u00D9\t\u00DCD\u0000\u0086\u00EF\u0094DY\u00BA"+
175 "\u0083\u00CC\u00B3\u00E0\u00C3\u00CD\u00FB\u00D1\u00DAA\u0081" +
176 ";\t*\u00B1\u00F9\u0097\u00F1\u00C1\u00A5\u00E6\u00CF{\u0001B" +
177 "\r\u00DB\u00E4\u00E7\u00EF[%\u00A1\u00FFA\u00E1\u0080\u00F8\u0006"+
178 "\u001F\u00C4\u0010\u0080\u0017\u009B\u00EEz\u00D3z\u00C6\u00A9" +
179 "\u00FEX0\u00A4\u0098\u00DE\u008B\u007Fw\u00E8?Ny\u0092\u0092" +
180 "i$\u00FA\u009F{\u00E1\u0013\u00C8[\u00AC\u00C4\u0000\u0083\u00D7" +
181 "P5%\u00F7\u00EAa_b\u00141T\rUKc]h\u0011!\u00C8f\u00C3Y=c\u00CF" +
182 "s\u00CE\u00E24\u00C0\u00D4\u00D8~\u0087\\g+!\u0007\u001Fa\u0081" +
183 "9\u00F7b\u007F6\u001E0\u0084\u00E4\u00EBW;`/d\u00A4\u00D6:\u00CD" +
184 "\u009C\u001B\u00BCF5\u009E\u0081\u0003-'\u0001\u00F5\u000C\u0099" +
185 "\u0084z\u00B4\u00A0\u00E3\u00DFy\u00BAl\u00F3\u008C\u0010\u0084" +
186 "0\u0094%7\u00A9^\u00F4oo\u00FE\u00A1\u00FF;\u001F \u008C\u00FB" +
187 "j\u008FE\u008Ct\u00D9\u00E0\u00A2'N\u00C7:4\u00FC\u0088Oi>M\u00E8"+
188 "\u00DF\u00EF\u000E\u0000\u00885Yd\u008D\u008AE8\u008C\u001D\u0080"+
189 "Cfr\u001D\u009B\u00FD\u00A5\u0086\u0084\u00BB\u00E8%c3\u0084" +
190 "N\u0082\u0012\u0012\u008D\u0080\u0098\u00FE\u00D3?\u00B4\u00CE" +
191 "(\n\u00E1'\u00E1\u009B\u00A5\u00D5\u00A6\u00C2R\u00E4\u0097T" +
192 "\u00BD\u00C5\u00D6U\u00DD\u00EBfpdw\u0084\u000BM\u00A1\u00B6" +
193 "\u00A8\u0001\u0084\u00DB&\u00A9\u00E0\u00B5g\u0014!\u00F0C\u00B7" +
194 "\u00E5\u00D0X`T\u00F00\u0084\u0006o\u00F4r\u00A3\u001A\u00A1" +
195 "S\u00DA\u00DCGU\u00B5b]\u00BFhV\u001B\u00E6\u0083\u00CAk\u0094" +
196 "-n\u00D2;\u00EC\u00CF\u0001\u00DB\u00A6\u00D3\u00D0\u00BA\u00B6" +
197 "\u0080=\\\u00AFw\u00A7\t3\u00B4\u00A3L9{\u00C8\u00D6^\u00E2+" +
198 "\u0095_\u000ES\u0004\u0081\u00EDoa \u00E7Cd\u00B4^\u0013x\u00DE" +
199 "\u0018c\u009B\u0088\u001C\u00A1\"\u00B9g&\u00D1\u0080I\u00A7" +
200 "\u00E8\"\u00B7\u00DA{^U-%Rr\u00D27y\u00D2\u0095\u001C\u00C6\r" +
201 "\u0089LH\u008C\u00B4\u0002\u001B\u00A4\u00FE[\u00A4\u00B0\u009F" +
202 "k\u001C\u00A8\u0015\u00CF\u00A2\u000C0\u0005\u0088q\u00DFc\u00B9" +
203 "\u00DE/\u00CB\u000C\u00C6\u00C9\u00E9\u000B\u00EE\u00FFS\u00E3" +
204 "!E\u0017\u00B4T(5\u009Fc)<\u00EEA\u00E7)n\u001D-|P\u0004R\u0086" +
205 "\u001Ef\u0085\u00F3\u00F34\u0001\u00C60\u00A2,\u00951\u00A7\u0008"+
206 "P`\u0093\u000F\u0013s\u00F9\u0084\u0017\u00A1&\u0098Y\u00ECd" +
207 "\\DR\u00C8w\u00A9\u00CD\u00FF3\u00A6\u00A0+\u0017A|\u00BA\u00D9" +
208 "\u00A2!\u0080\u0003oP\u00D9\u009C\u0008\u00CB?Ha\u00C2k\u00D7" +
209 "ed\u00A3\u00F6\u00AB\u00804&v%\u00A7^{\u00E4\u00E6\u00D1\u00FC" +
210 " \u00C7\u0010\u00E6\u00CD\u00F0\u00B6\u0080\u0017\u0084M;1\u00EE" +
211 "\u00F8M~\u0008$\u00E4,\u00CBI\u00EB\u0084j;\u00AE\u008F\u00F7" +
212 "x\u0088\u00EE]`\u00F6z\u00F7Vs/\u00DD\\\u00DB\u00A1\u00161\u00C1" +
213 "0\u00F6oC\u00B3\u00FA\u00ECT\u0015\u007F\u00D7\u00FA\u00EF\u0085" +
214 "y\u00CC\u00D1R\u00DEX\u00DB/\u00FD^\u008F2\u00CE\u00190j\u00F9" +
215 "z\u0002\u00F0>\u00F8\u00991\u009A\u00D5\u00C2B\u00FA\u000F\u00A7" +
216 "\u00E3\u00EB\u00B0\u00C6\u008EI\u0006\u00B8\u00DA#\u000C\u0080" +
217 "\u00820(\u00DC\u00DE\u00F3\u00C8\u00D3_\u00B1q\u0008\u008A\u001B" +
218 "\u00C8\u00BE\u00C0\u00C5`a\u00A3\u00C9\u00E8\u00BC\u00A8\u00F5" +
219 "M\u00C7/\u00EF\u00FA\"\u0082.\u0099\u0082\u00C5p\u00B4\u00D8" +
220 "\u00D9N\u0089\u008B\u001C4\u00BC0\u001E\u0016\u00E6';\u00E9y" +
221 "\u00B0\u00FF\u00EA\u00A6a\u00D9\u00B8\u00C6\u0000\u00B2Hi\u00B7" +
222 "\u00FF\u00CE?\u0008\u00DC(;C\u00DA\u00F6Z\u00F7\u00E1\u0097\u0098"+
223 "v\u0019\u00B7/\u008F\u001C\u009B\u00A4\u00DC\u00867\u00A0\u0016" +
224 "\u00A7\u00D3\u00B1\u009F\u00C3\u0093\u00B7\u00A7\u0013n\u00EB" +
225 "\u00C6\u00BC\u00C6>\u001AQ7B\u00EFh(\u00BCR\u0003e\u00D6-jw\u00AB"+
226 "5'\u00EDK\u0082\u001F\u00D2\u0016\t\\n.\u00DB\u0092\u00F2\u00FB" +
227 "^\u00EA)\u00CB\u0014X\u0092\u00F5\u0091XO\u007FT\u0083i{&g\u00A8" +
228 "\u00CC\u0085\u0019`H\u008CK\u00AC\u00EA\u00838`\u00D4\r#\u00E0" +
229 "\u00F9l8~\u008A\n\u00E6\u00D2I\u00B2\u0084`\u000C\u00D85s\u001D" +
230 "\u00DC\u00B1\u00C6G\u00ACLV\u00EA>\u00BD\u0081\u00B3#\u000E\u00AB"+
231 "\u00B0d8\u00BC\u0087\u00F0\u00B5\u00B1\u00FA\u008F^\u00A2\u00B3" +
232 "\u00FC\u0018FB\n\u0003kzO\u00B0\u0089\u00BDd\u009D\u00A5\u0089" +
233 "\u00A3EA^\\\u0003\u0083#>];\u00B9C\u00D7\u0095r~m\u00D0|\u0006" +
234 "\u00DF\u00DF\u001Ell\u00C4\u00EFq`\u00A59s\u00BF\u00BEp\u0083" +
235 "\u0087v\u0005E#\u00EC\u00F1",
236 sS3="\u008D\u00EF\u00C2@%\u00FA]\u009F\u00EB\u0090=\u00BF\u00E8\u0010" +
237 "\u00C9\u0007G`\u007F\u00FF6\u009F\u00E4K\u008C\u001F\u00C6D\u00AE"+
238 "\u00CE\u00CA\u0090\u00BE\u00B1\u00F9\u00BF\u00EE\u00FB\u00CA" +
239 "\u00EA\u00E8\u00CF\u0019PQ\u00DF\u0007\u00AE\u0092\u000E\u0088" +
240 "\u0006\u00F0\u00AD\u0005H\u00E1<\u008D\u0083\u0092p\u0010\u00D5" +
241 "\u0011\u0010}\u009F\u0007d}\u00B9\u00B2\u00E3\u00E4\u00D4=O(" +
242 "^\u00B9\u00AF\u00A8 \u00FA\u00DE\u0082\u00E0\u00A0g&\u008B\u0082" +
243 "ry.U?\u00B2\u00C0H\u009A\u00E2+\u00D4\u00EF\u0097\u0094\u0012" +
244 "^?\u00BC!\u00FF\u00FC\u00EE\u0082[\u001B\u00FD\u0092U\u00C5\u00ED"+
245 "\u0012W\u00A2@N\u001A\u0083\u0002\u00BA\u00E0\u007F\u00FFR\u0082" +
246 "F\u00E7\u008EW\u0014\u000E3s\u00F7\u00BF\u008C\u009F\u0081\u0088" +
247 "\u00A6\u00FCN\u00E8\u00C9\u0082\u00B5\u00A5\u00A8\u00C0\u001D" +
248 "\u00B7W\u009F\u00C2dg\tO1\u00F2\u00BD?_@\u00FF\u00F7\u00C1\u001F" +
249 "\u00B7\u008D\u00FC\u008Ek\u00D2\u00C1C{\u00E5\u009B\u0099\u00B0" +
250 "=\u00BF\u00B5\u00DB\u00C6Kc\u008D\u00C0\u00E6U\u0081\u009D\u0099" +
251 "\u00A1\u0097\u00C8\u001CJ\u0001-n\u00C5\u0088J(\u00CC\u00C3o" +
252 "q\u00B8C\u00C2\u0013l\u0007C\u00F1\u0083\t\u0089<\u000F\u00ED" +
253 "\u00DD_/\u007F\u00E8P\u00D7\u00C0\u007F~\u0002P\u007F\u00BFZ" +
254 "\u00FB\u009A\u0004\u00A7G\u00D2\u00D0\u0016Q\u0019.\u00AFp\u00BF" +
255 ">X\u00C3\u0013\u0080_\u00980.r|\u00C3\u00C4\n\u000F\u00B4\u0002" +
256 "\u000F\u007F\u00EF\u0082\u008C\u0096\u00FD\u00AD],*\u00AE\u008E" +
257 "\u00E9\u009AIP\u00DA\u0088\u00B8\u0084'\u00F4\u00A0\u001E\u00AC" +
258 "W\u0090yo\u00B4I\u0082R\u00DC\u0015\u00EF\u00BD}\u009B\u00A6" +
259 "rY}\u00AD\u00A8@\u00D8E\u00F5E\u0004\u00FA]t\u0003\u00E8>\u00C3" +
260 "\u0005O\u0091u\u001A\u0092Vi\u00C2#\u00EF\u00E9A\u00A9\u0003" +
261 "\u00F1.`'\r\u00F2\u0002v\u00E4\u00B6\u0094\u00FDet\u0092y\u0085" +
262 "\u00B2\u0082v\u00DB\u00CB\u0002w\u0081v\u00F8\u00AF\u0091\u008D" +
263 "NH\u00F7\u009E\u008Fam\u00DF\u00E2\u009D\u0084\u000E\u0084/}" +
264 "\u00834\u000C\u00E5\u00C8\u0096\u00BB\u00B6\u0082\u0093\u00B4" +
265 "\u00B1H\u00EF0<\u00AB\u0098O\u00AF(w\u009F\u00AF\u009B\u0092" +
266 "\u00DCV\r\"M\u001E \u00847\u00AA\u0088})\u00DC\u0096'V\u00D3" +
267 "\u00DC\u008B\u0090|\u00EE\u00B5\u001F\u00D2@\u00E7\u00C0|\u00E3" +
268 "\u00E5f\u00B4\u00A1\u00C3\u00E9a^<\u00F8 \u009D`\u0094\u00D1" +
269 "\u00E3\u00CD\u009C\u00A3A\\vF\u000E\u0000\u00EA\u0098;\u00D4" +
270 "\u00D6x\u0081\u00FDGW,\u00F7l\u00ED\u00D9\u00BD\u00A8\"\u009C" +
271 "\u0012}\u00AD\u00AAC\u008A\u0007N\u001F\u0097\u00C0\u0090\u0008" +
272 "\u001B\u00DB\u008A\u0093\u00A0~\u00BE\u00B98\u00CA\u0015\u0097" +
273 "\u00B0<\u00FF=\u00C2\u00C0\u00F8\u008D\u001A\u00B2\u00ECd8\u000E" +
274 "Qh\u00CC{\u00FB\u00D9\u000F'\u0088\u0012I\u0001\u0081]\u00E5" +
275 "\u00FF\u00D4\u00DD~\u00F8jv\u00A2\u00E2\u0014\u00B9\u00A4\u0003" +
276 "h\u0092]\u0095\u008FK9\u00FF\u00FA\u00BA9\u00AE\u00E9\u00A4\u00FF"+
277 "\u00D3\u000B\u00FA\u00F7\u0093;mI\u0086#\u0019<\u00BC\u00FA'" +
278 "buE\u0082\\\u00F4za\u00BD\u008B\u00A0\u00D1\u001EB\u00D1\u00CE" +
279 "\u00AD\u0004\u00F4\u0012~\u00A3\u0092\u0010B\u008D\u00B7\u0082" +
280 "r\u00A9r\u0092p\u00C4\u00A8\u0012}\u00E5\u000B([\u00A1\u00C8" +
281 "<b\u00F4O5\u00C0\u00EA\u00A5\u00E8\u0005\u00D21B\u0089)\u00FB" +
282 "\u00B4\u00FC\u00DF\u0082O\u00B6jS\u000E}\u00C1[\u001F\u0008\u001F"+
283 "\u00AB\u0010\u0086\u0018\u00AE\u00FC\u00FD\u0008m\u00F9\u00FF" +
284 "(\u0089iK\u00CC\u0011#j\\\u00AE\u0012\u00DE\u00CAM,?\u008C\u00C5" +
285 "\u00D2\u00D0-\u00FE\u00F8\u00EFX\u0096\u00E4\u00CFR\u00DA\u0095" +
286 "\u0015[gIJH\u008C\u00B9\u00B6\u00A8\u000C\\\u008F\u0082\u00BC" +
287 "\u0089\u00D3kE:`\u00947\u00EC\u0000\u00C9\u00A9DqRS\n\u0087K" +
288 "I\u00D7s\u00BC@|4g\u001C\u0002q~\u00F6O\u00EBU6\u00A2\u00D0/" +
289 "\u00FF\u00D2\u00BF`\u00C4\u00D4?\u0003\u00C0P\u00B4\u00EFm\u0007" +
290 "G\u008C\u00D1\u0000n\u0018\u0088\u00A2\u00E5?U\u00B9\u00E6\u00D4" +
291 "\u00BC\u00A2\u0004\u0080\u0016\u0097W83\u00D7 }g\u00DE\u000F" +
292 "\u008F=r\u00F8{3\u00AB\u00CCO3v\u0088\u00C5]{\u0000\u00A6\u00B0" +
293 "\u0094{\u0000\u0001W\u0000u\u00D2\u00F9\u00BB\u0088\u00F8\u0089" +
294 "B\u0001\u009EBd\u00A5\u00FF\u0085c\u0002\u00E0r\u00DB\u00D9+" +
295 "\u00EE\u0097\u001Bin\u00A2/\u00DE_\u0008\u00AE+\u00AFzam\u00E5" +
296 "\u00C9\u0087g\u00CF\u001F\u00EB\u00D2a\u00EF\u00C8\u00C2\u00F1" +
297 "\u00AC%q\u00CC\u00829\u00C2g!L\u00B8\u00B1\u00E5\u0083\u00D1" +
298 "\u00B7\u00DC>b\u007F\u0010\u00BD\u00CE\u00F9\n\\8\u000F\u00F0" +
299 "D=`nm\u00C6`T:IW'\u00C1H+\u00E9\u008A\u001D\u008A\u00B4\u0017" +
300 "8 \u00E1\u00BE$\u00AF\u0096\u00DA\u000FhE\u0084%\u0099\u0083" +
301 ";\u00E5`\rE}(/\u0093P\u00834\u00B3b\u00D9\u001D\u0011 +m\u008D" +
302 "\u00A0d+\u001E1\u009C0Z\u0000R\u00BC\u00E6\u0088\u001B\u0003" +
303 "X\u008A\u00F7\u00BA\u00EF\u00D5AB\u00ED\u009C\u00A41\\\u0011" +
304 "\u00832>\u00C5\u00DF\u00EFF6\u00A13\u00C5\u0001\u00E9\u00D3S" +
305 "\u001C\u00EE57\u0083",
306 sS4="\u009D\u00B3\u0004 \u001F\u00B6\u00E9\u00DE\u00A7\u00BE{\u00EF" +
307 "\u00D2s\u00A2\u0098JO{\u00DBd\u00AD\u008CW\u0085Q\u0004C\u00FA" +
308 "\u0002\u000E\u00D1~(z\u00FF\u00E6\u000F\u00B6c\t_5\u00A1y\u00EB" +
309 "\u00F1 \u00FD\u0005\u009DCd\u0097\u00B7\u00B1\u00F3d\u001Fc$" +
310 "\u001EJ\u00DF(\u0014\u007F_O\u00A2\u00B8\u00CD\u00C9C\u0000@" +
311 "\u000C\u00C3\" \u00FD\u00D3\u000B0\u00C0\u00A57O\u001D-\u0000" +
312 "\u00D9$\u0014{\u0015\u00EEM\u0011\u001A\u000F\u00CAQgq\u00FF" +
313 "\u0090L-\u0019_\u00FE\u001A\u0005d_\u000C\u0013\u00FE\u00FE\u0008"+
314 "\u001B\u0008\u00CA\u0005\u0017\u0001!\u0080S\u0001\u0000\u00E8" +
315 ">^\u00FE\u00AC\u009A\u00F4\u00F8\u007F\u00E7'\u0001\u00D2\u00B8" +
316 "\u00EE_\u0006\u00DFBa\u00BB\u009E\u009B\u008Ar\u0093\u00EA%\u00CE"+
317 "\u0084\u00FF\u00DF\u00F5q\u0088\u0001=\u00D6K\u0004\u00A2o&;" +
318 "~\u00D4\u0084\u0000T~\u00EB\u00E6DmL\u00A0l\u00F3\u00D6\u00F5" +
319 "&I\u00AB\u00DF\u00AE\u00A0\u00C7\u00F563\u008C\u00C1P?~\u0093" +
320 "\u00D3w a\u0011\u00B68\u00E1rP\u000E\u0003\u00F8\u000E\u00B2" +
321 "\u00BB\u00AB\u00E0P.\u00EC\u008Dw\u00DEW\u0097\u001E\u0081\u00E1" +
322 "OgF\u00C93T\u0000i 1\u008F\u0008\u001D\u00BB\u0099\u00FF\u00C3" +
323 "\u0004\u00A5M5\u0018\u0005\u007F=\\\u00E3\u00A6\u00C8f\u00C6" +
324 "][\u00CC\u00A9\u00DA\u00ECo\u00EA\u009F\u0092o\u0091\u009FF\"" +
325 "/9\u0091F}\u00A5\u00BFm\u008E\u0011C\u00C4OC\u0095\u0083\u0002" +
326 "\u00D0!N\u00EB\u0002 \u0083\u00B8?\u00B6\u0018\u000C\u0018\u00F8" +
327 "\u0093\u001E(\u0016X\u00E6&Hn>\u008B\u00D7\u008Aptw\u00E4\u00C1" +
328 "\u00B5\u0006\u00E0|\u00F3-\n%y\t\u008B\u0002\u00E4\u00EA\u00BB" +
329 "\u0081(\u0012;#i\u00DE\u00AD8\u0015t\u00CA\u0016\u00DF\u0087" +
330 "\u001Bb!\u001C@\u00B7\u00A5\u001A\u009E\u00F9\u0000\u00147{\u0004"+
331 "\u001E\u008A\u00C8\t\u0011@\u0003\u00BDY\u00E4\u00D2\u00E3\u00D1" +
332 "V\u00D5O\u00E8v\u00D5/\u0091\u00A3@U{\u00E8\u00DE\u0000\u00EA" +
333 "\u00E4\u00A7\u000C\u00E5\u00C2\u00ECM\u00B4\u00BB\u00A6\u00E7" +
334 "V\u00BD\u00FF\u00DD3i\u00AC\u00EC\u0017\u00B05\u0006W#'\u0099" +
335 "\u00AF\u00C8\u00B0V\u00C8\u00C3\u0091ke\u0081\u001C^\u0014a\u0019"+
336 "n\u0085\u00CBu\u00BE\u0007\u00C0\u0002\u00C22Uw\u0089?\u00F4" +
337 "\u00EC[\u00BF\u00C9-\u00D0\u00EC;%\u00B7\u0080\u001A\u00B7\u008D" +
338 "m;$ \u00C7c\u00EF\u00C3f\u00A5\u00FC\u009C8(\u0080\n\u00CE2\u0005"+
339 "\u00AA\u00C9T\u008A\u00EC\u00A1\u00D7\u00C7\u0004\u001A\u00FA" +
340 "2\u001D\u0016bZg\u0001\u0090,\u009BuzT1\u00D4w\u00F7\u0091&\u00B0"+
341 "16\u00CCo\u00DB\u00C7\u000B\u008BF\u00D9\u00E6jHV\u00E5Zy\u0002" +
342 "jL\u00EBRC~\u00FF/\u008Fv\u00B4\r\u00F9\u0080\u00A5\u0086t\u00CD" +
343 "\u00E3\u00ED\u00DA\u0004\u00EB\u0017\u00A9\u00BE\u0004,\u0018" +
344 "\u00F4\u00DF\u00B7t\u007F\u009D\u00AB*\u00F7\u00B4\u00EF\u00C3" +
345 "M .\tk|\u0017A\u00A2T\u00E5\u00B6\u00A05!=B\u00F6,\u001C|&a\u00C2"+
346 "\u00F5\u000FeR\u00DA\u00F9\u00D2\u00C21\u00F8%\u0013\u000Fi\u00D8"+
347 "\u0016\u007F\u00A2\u0004\u0018\u00F2\u00C8\u0000\u001A\u0096" +
348 "\u00A6\r\u0015&\u00ABc1\\!^\nr\u00ECI\u00BA\u00FE\u00FD\u0018" +
349 "y\u0008\u00D9\u008D\r\u00BD\u00861\u0011p\u00A7>\u009Bd\u000C" +
350 "\u00CC>\u0010\u00D7\u00D5\u00CA\u00D3\u00B6\u000C\u00AE\u00C3" +
351 "\u0088\u00F70\u0001\u00E1lr\u008A\u00FFq\u00EA\u00E2\u00A1\u001F" +
352 "\u009A\u00F3n\u00CF\u00CB\u00D1/\u00C1\u00DE\u0084\u0017\u00AC" +
353 "\u0007\u00BEk\u00CBD\u00A1\u00D8\u008B\u009B\u000FV\u00019\u0088" +
354 "\u00C3\u00B1\u00C5/\u00CA\u00B4\u00BE1\u00CD\u00D8x(\u0006\u0012" +
355 "\u00A3\u00A4\u00E2o}\u00E52X\u00FD~\u00B6\u00D0\u001E\u00E9\u0000"+
356 "$\u00AD\u00FF\u00C2\u00F4\u0099\u000F\u00C5\u0097\u0011\u00AA" +
357 "\u00C5\u0000\u001D{\u0095\u0082\u00E5\u00E7\u00D2\u0010\u0098" +
358 "s\u00F6\u0000a0\u0096\u00C3-\u0095!\u00AD\u00A1!\u00FF)\u0090" +
359 "\u0084\u0015\u007F\u00BB\u0097\u007F\u00AF\u009E\u00B3\u00DB" +
360 ")\u00C9\u00ED*\\\u00E2\u00A4e\u00A70\u00F3,\u00D0\u00AA?\u00E8" +
361 "\u008A\\\u00C0\u0091\u00D4\u009E,\u00E7\u000C\u00E4T\u00A9\u00D6" +
362 "\n\u00CD\u0086\u0001_\u0019\u0019w\u0007\u0091\u0003\u00DE\u00A0" +
363 ":\u00F6x\u00A8V^\u00DE\u00E3V\u00DF!\u00F0\\\u00BE\u008Bu\u00E3" +
364 "\u0087\u00B3\u00C5\u0006Q\u00B8\u00A5\u00C3\u00EF\u00D8\u00EE" +
365 "\u00B6\u00D2\u00E5#\u00BEw\u00C2\u0015E)/i\u00EF\u00DF\u00AF" +
366 "\u00E6z\u00FB\u00F4p\u00C4\u00B2\u00F3\u00E0\u00EB[\u00D6\u00CC" +
367 "\u0098v9\u00E4F\u000C\u001F\u00DA\u00858\u0019\u0087\u0083/\u00CA"+
368 "\u0000sg\u00A9\u0091D\u00F8)k)\u009EI/\u00C2\u0095\u0092f\u00BE" +
369 "\u00AB\u00B5gni\u009B\u00D3\u00DD\u00DA\u00DF~\u0005/\u00DB%" +
370 "p\u001C\u001B^Q\u00EE\u00F6S$\u00E6j\u00FC\u00E3l\u0003\u0016" +
371 "\u00CC\u0004\u0086D!>\u00B7\u00DCY\u00D0ye)\u001F\u00CC\u00D6" +
372 "\u00FDCA\u00829y\u0093+\u00CD\u00F6\u00B6W\u00C3MN\u00DF\u00D2" +
373 "\u0082z\u00E5)\u000C<\u00B9Sk\u0085\u001E \u00FE\u00983U~\u0013" +
374 "\u00EC\u00F0\u00B0\u00D3\u00FF\u00B3r?\u0085\u00C5\u00C1\n\u00EF" +
375 "~\u00D2",
376 sS5="~\u00C9\u000C\u0004,nt\u00B9\u009B\u000Ef\u00DF\u00A63y\u0011" +
377 "\u00B8j\u007F\u00FF\u001D\u00D3X\u00F5D\u00DD\u009DD\u00171\u0016"+
378 "\u007F\u0008\u00FB\u00F1\u00FA\u00E7\u00F5\u0011\u00CC\u00D2" +
379 "\u0005\u001B\u0000sZ\u00BA\u0000*\u00B7\"\u00D88c\u0081\u00CB" +
380 "\u00AC\u00F6$:i\u00BE\u00FDz\u00E6\u00A2\u00E7\u007F\u00F0\u00C7" +
381 " \u00CD\u00C4IH\u0016\u00CC\u00F5\u00C1\u00808\u0085\u0016@\u0015"+
382 "\u00B0\u00A8H\u00E6\u008B\u0018\u00CBL\u00AA\u00DE\u00FF_H\n" +
383 "\u0001\u0004\u0012\u00B2\u00AA%\u0098\u0014\u00FCA\u00D0\u00EF" +
384 "\u00E2N@\u00B4\u008D$\u008E\u00B6\u00FB\u008D\u00BA\u001C\u00FE" +
385 "A\u00A9\u009B\u0002\u001AU\n\u0004\u00BA\u008Fe\u00CBrQ\u00F4" +
386 "\u00E7\u0095\u00A5\u0017%\u00C1\u0006\u00EC\u00D7\u0097\u00A5" +
387 "\u0098\n\u00C59\u00B9\u00AAMy\u00FEj\u00F2\u00F3\u00F7ch\u00AF" +
388 "\u0080@\u00ED\u000C\u009EV\u0011\u00B4\u0095\u008B\u00E1\u00EB" +
389 "Z\u0088\u0087\t\u00E6\u00B0\u00D7\u00E0qVN)\u00FE\u00A7cf\u00E5" +
390 "-\u0002\u00D1\u00C0\u0000\u00C4\u00AC\u008E\u0005\u0093w\u00F5" +
391 "q\u000C\u00057*W\u00855\u00F2\"a\u00BE\u0002\u00D6B\u00A0\u00C9" +
392 "\u00DF\u0013\u00A2\u0080t\u00B5[\u00D2h!\u0099\u00C0\u00D4!\u00E5"+
393 "\u00ECS\u00FB<\u00E8\u00C8\u00AD\u00ED\u00B3(\u00A8\u007F\u00C9" +
394 "=\u0095\u0099\u0081\\\u001F\u00F9\u0000\u00FE8\u00D3\u0099\u000C" +
395 "N\u00FF\u000B\u0006$\u0007\u00EA\u00AA/O\u00B1O\u00B9iv\u0090" +
396 "\u00C7\u0095\u0005\u00B0\u00A8\u00A7t\u00EFU\u00A1\u00FF\u00E5" +
397 "\u009C\u00A2\u00C2\u00A6\u00B6-'\u00E6jBc\u00DFe\u0000\u001F" +
398 "\u000E\u00C5\tf\u00DF\u00DDU\u00BC)\u00DE\u0006U\u0091\u001E" +
399 "s\u009A\u0017\u00AF\u0089u2\u00C7\u0091\u001C\u0089\u00F8\u0094" +
400 "h\r\u0001\u00E9\u0080RGU\u00F4\u0003\u00B6<\u00C9\u000C\u00C8" +
401 "D\u00B2\u00BC\u00F3\u00F0\u00AA\u0087\u00AC6\u00E9\u00E5:t&\u0001"+
402 "\u00B3\u00D8+\u001A\u009EtId\u00EE-~\u00CD\u00DB\u00B1\u00DA" +
403 "\u0001\u00C9I\u0010\u00B8h\u00BF\u0080\r&\u00F3\u00FD\u0093B" +
404 "\u00ED\u00E7\u0004\u00A5\u00C2\u0084cg7\u00B6P\u00F5\u00B6\u0016" +
405 "\u00F2Gf\u00E3\u008E\u00CA6\u00C1\u0013n\u0005\u00DB\u00FE\u00F1" +
406 "\u0083\u0091\u00FB\u0088z7\u00D6\u00E7\u00F7\u00D4\u00C7\u00FB" +
407 "}\u00C90c\u00FC\u00DF\u00B6\u00F5\u0089\u00DE\u00EC)A\u00DA&" +
408 "\u00E4f\u0095\u00B7Vd\u0019\u00F6T\u00EF\u00C5\u00D0\u008DX\u00B7"+
409 "H\u0092T\u0001\u00C1\u00BA\u00CB\u007F\u00E5\u00FFU\u000F\u00B6" +
410 "\u00080I[\u00B5\u00D0\u00E8\u0087\u00D7.Z\u00ABjn\u00E1\":f\u00CE"+
411 "\u00C6+\u00F3\u00CD\u009E\u0008\u0085\u00F9h\u00CB>G\u0008l\u0001"+
412 "\u000F\u00A2\u001D\u00E8 \u00D1\u008Bi\u00DE\u00F3\u00F6Ww\u00FA" +
413 "\u0002\u00C3\u00F6@~\u00DA\u00C3\u00CB\u00B3\u00D5P\u0017\u0093" +
414 "\u0008M\u00B0\u00D7\u000E\u00BA\n\u00B3x\u00D5\u00D9Q\u00FB\u000C"+
415 "\u00DE\u00D7\u00DAVA$\u00BB\u00E4\u0094\u00CA\u000BV\u000FWU" +
416 "\u00D1\u00E0\u00E1\u00E5na\u0084\u00B5\u00BEX\n$\u009F\u0094" +
417 "\u00F7K\u00C0\u00E3'\u0088\u008E\u009F{Ua\u00C3\u00DC\u0002\u0080"+
418 "\u0005hw\u0015dlk\u00D7D\u0090M\u00B3f\u00B4\u00F0\u00A3\u00C0" +
419 "\u00F1d\u008Ai~\u00D5\u00AFI\u00E9/\u00F60\u009E7O,\u00B65j\u0085"+
420 "\u0080\u0085sI\u0091\u00F8@v\u00F0\u00AE\u0002\u0008;\u00E8M" +
421 "(B\u001C\u009ADH\u0094\u0006snL\u00B8\u00C1\t)\u0010\u008B\u00C9" +
422 "_\u00C6}\u0086\u009C\u00F4\u0013Oao.w\u0011\u008D\u00B3\u001B" +
423 "+\u00E1\u00AA\u0090\u00B4r<\u00A5\u00D7\u0017}\u0016\u001B\u00BA" +
424 "\u009C\u00AD\u0090\u0010\u00AFF+\u00A2\u009F\u00E4Y\u00D2E\u00D3" +
425 "EY\u00D9\u00F2\u00DA\u0013\u00DB\u00C6T\u0087\u00F3\u00E4\u00F9" +
426 "N\u0017mHo\t|\u0013\u00EAc\u001D\u00A5\u00C7D_s\u0082\u0017V" +
427 "\u0083\u00F4\u00CD\u00C6j\u0097p\u00BE\u0002\u0088\u00B3\u00CD" +
428 "\u00CFrn]\u00D2\u00F3 \u0093`yE\u009B\u0080\u00A5\u00BE`\u00E2" +
429 "\u00DB\u00A9\u00C21\u0001\u00EB\u00A51\\\"NB\u00F2\u001C\\\u0015" +
430 "r\u00F6r\u001B,\u001A\u00D2\u00FF\u00F3\u008C%@N2N\u00D7/@g\u00B7"+
431 "\u00FD\u0005#\u0013\u008E\\\u00A3\u00BCx\u00DC\u000F\u00D6nu" +
432 "\u0092\"\u0083xMk\u0017X\u00EB\u00B1nD\tO\u0085?H\u001D\u0087" +
433 "\u00FC\u00FE\u00AE{w\u00B5\u00FFv\u008C#\u0002\u00BF\u00AA\u00F4" +
434 "uV_F\u00B0*+\t(\u0001=8\u00F5\u00F7\u000C\u00A8\u001F6R\u00AF" +
435 "J\u008Af\u00D5\u00E7\u00C0\u00DF;\u0008t\u0095\u0005Q\u0010\u001B"+
436 "Z\u00D7\u00A8\u00F6\u001E\u00D5\u00ADl\u00F6\u00E4y u\u0081\u0084"+
437 "\u00D0\u00CE\u00FAe\u0088\u00F7\u00BEXJ\u0004h&\u000F\u00F6\u00F8"+
438 "\u00F3\u00A0\u009C\u007FpSF\u00AB\u00A0\\\u00E9l(\u00E1v\u00ED" +
439 "\u00A3k\u00AC0\u007F7h)\u00D2\u00856\u000F\u00A9\u0017\u00E3" +
440 "\u00FE*$\u00B7\u0097g\u00F5\u00A9k \u00D6\u00CD%\u0095h\u00FF" +
441 "\u001E\u00BFuUD,\u00F1\u009F\u0006\u00BE\u00F9\u00E0e\u009A\u00EE"+
442 "\u00B9I\u001D4\u0001\u0007\u0018\u00BB0\u00CA\u00B8\u00E8\"\u00FE"+
443 "\u0015\u0088W\t\u0083u\u000EbI\u00DAb~U^v\u00FF\u00A8\u00B1S" +
444 "EFmG\u00DE\u0008\u00EF\u00E9\u00E7\u00D4",
445 sS6="\u00F6\u00FA\u008F\u009D,\u00ACl\u00E1L\u00A3Hg\u00E23\u007F" +
446 "|\u0095\u00DB\u0008\u00E7\u0001hC\u00B4\u00EC\u00ED\\\u00BC2" +
447 "US\u00AC\u00BF\u009F\t`\u00DF\u00A1\u00E2\u00ED\u0083\u00F0W" +
448 "\u009Dc\u00ED\u0086\u00B9\u001A\u00B6\u00A6\u00B8\u00DE^\u00BE" +
449 "9\u00F3\u008F\u00F72\u0089\u0089\u00B183\u00F1Ia\u00C0\u0019" +
450 "7\u00BD\u00F5\u0006\u00C6\u00DA\u00E4b^~\u00A3\u0008\u00EA\u0099" +
451 "N#\u00E3<y\u00CB\u00D7\u00CCH\u00A1Cg\u00A3\u0014\u0096\u0019" +
452 "\u00FE\u00C9K\u00D5\u00A1\u0014\u0017J\u00EA\u00A0\u0018f\u00A0" +
453 "\u0084\u00DB-\t\u00A8Ho\u00A8\u0088aJ)\u0000\u00AF\u0098\u0001" +
454 "fY\u0091\u00E1\u0099(c\u00C8\u00F3\u000C`.x\u00EF<\u00D0\u00D5" +
455 "\u00192\u00CF\u000F\u00EC\u0014\u00F7\u00CA\u0007\u00D2\u00D0" +
456 "\u00A8 r\u00FDA\u0019~\u0093\u0005\u00A6\u00B0\u00E8k\u00E3\u00DA"+
457 "t\u00BE\u00D3\u00CD7-\u00A5<L\u007FDH\u00DA\u00B5\u00D4@m\u00BA" +
458 "\u000E\u00C3\u00089\u0019\u00A7\u009F\u00BA\u00EE\u00D9I\u00DB" +
459 "\u00CF\u00B0Ng\u000CS\\=\u009C\u0001d\u00BD\u00B9A,\u000Ecj\u00BA"+
460 "}\u00D9\u00CD\u00EAos\u0088\u00E7\u000B\u00C7b5\u00F2\u009A\u00DB"+
461 "\\L\u00DD\u008D\u00F0\u00D4\u008D\u008C\u00B8\u0081S\u00E2\u0008" +
462 "\u00A1\u0098f\u001A\u00E2\u00EA\u00C8(L\u00AF\u0089\u00AA\u0092" +
463 "\u0082#\u00934\u00BES;:!\u00BF\u0016CK\u00E3\u009A\u00EA9\u0006" +
464 "\u00EF\u00E8\u00C3n\u00F8\u0090\u00CD\u00D9\u0080\"m\u00AE\u00C3" +
465 "@\u00A4\u00A3\u00DF~\u009C\t\u00A6\u0094\u00A8\u0007[|^\u00CC" +
466 "\"\u001D\u00B3\u00A6\u009Ai\u00A0/h\u0081\u008AT\u00CE\u00B2" +
467 ")oS\u00C0\u0084:\u00FE\u00896U%\u00BF\u00E6\u008A\u00B4b\u008A" +
468 "\u00BC\u00CF\".\u00BF%\u00ACoH\u00A9\u00A9\u0093\u0087S\u00BD" +
469 "\u00DBe\u00E7o\u00FB\u00E7\u00E9g\u00FDx\u000B\u00A95c\u008E" +
470 "4+\u00C1\u00E8\u00A1\u001B\u00E9I\u0080t\r\u00C8\u0008}\u00FC" +
471 "\u008D\u00E4\u00BF\u0099\u00A1\u0011\u0001\u00A0\u007F\u00D3" +
472 "yu\u00DAZ&\u00C0\u00E8\u001F\u0099O\u0095(\u00CD\u0089\u00FD" +
473 "3\u009F\u00ED\u00B8x4\u00BF_\u0004Em\"%\u0086\u0098\u00C9\u00C4" +
474 "\u00C8;-\u00C1V\u00BEOb\u008D\u00AAW\u00F5^\u00C5\u00E2\"\n\u00BE"+
475 "\u00D2\u0091n\u00BFN\u00C7[\u0095$\u00F2\u00C3\u00C0B\u00D1]" +
476 "\u0099\u00CD\r\u007F\u00A0{n'\u00FF\u00A8\u00DC\u008A\u00F0s" +
477 "E\u00C1\u0006\u00F4\u001E#/5\u0016#\u0086\u00E6\u00EA\u0089&" +
478 "33\u00B0\u0094\u0015~\u00C6\u00F27+t\u00AFi%s\u00E4\u00E9\u00A9" +
479 "\u00D8H\u00F3\u0016\u0002\u0089:b\u00EF\u001D\u00A7\u0087\u00E2" +
480 "8\u00F3\u00A5\u00F6vt6HS \u0095\u0010cEvi\u008D\u00B6\u00FA\u00D4"+
481 "\u0007Y*\u00F9P6\u00F75#L\u00FBn\u0087}\u00A4\u00CE\u00C0l\u0015" +
482 "-\u00AA\u00CB\u0003\u0096\u00A8\u00C5\r\u00FE]\u00FC\u00D7\u0007" +
483 "\u00AB\t!\u00C4/\u0089\u00DF\u00F0\u00BB_\u00E2\u00BExD\u008F" +
484 "O3uF\u0013\u00C9+\u0005\u00D0\u008DH\u00B9\u00D5\u0085\u00DC" +
485 "\u0004\u0094A\u00C8\t\u008F\u009B}\u00ED\u00E7\u0086\u00C3\u009A" +
486 "3sBA\u0000\u0005j\t\u0017Q\u000E\u00F3\u00C8\u00A6\u0089\u0000" +
487 "r\u00D6( v\u0082\u00A9\u00A9\u00F7\u00BE\u00BF2g\u009D\u00D4" +
488 "[[u\u00B3S\u00FD\u0000\u00CB\u00B0\u00E3X\u0083\u000F\"\n\u001F" +
489 "\u008F\u00B2\u0014\u00D3r\u00CF\u0008\u00CC<J\u0013\u008C\u00F6" +
490 "1f\u0006\u001C\u0087\u00BE\u0088\u00C9\u008F\u0088`b\u00E3\u0097" +
491 "G\u00CF\u008Ez\u00B6\u00C8R\u0083<\u00C2\u00AC\u00FB?\u00C0i" +
492 "vN\u008F\u0002Rd\u00D81M\u00DA8p\u00E3\u001EfTY\u00C1\t\u0008" +
493 "\u00F0Q0!\u00A5l[h\u00B7\u0082/\u008A\u00A00\u0007\u00CD>tq\u009E"+
494 "\u00EF\u00DC\u0087&\u0081\u00073@\u00D4~C/\u00D9\u000C^\u00C2" +
495 "A\u0088\t(l\u00F5\u0092\u00D8\u0091\u0008\u00A90\u00F6\u0095" +
496 "~\u00F3\u0005\u00B7\u00FB\u00FF\u00BD\u00C2f\u00E9oo\u00E4\u00AC" +
497 "\u0098\u00B1s\u00EC\u00C0\u00BC`\u00B4*\u00954\u0098\u00DA\u00FB" +
498 "\u00A1\u00AE\u0012-K\u00D76\u000F%\u00FA\u00AB\u00A4\u00F3\u00FC" +
499 "\u00EB\u00E2\u0096\u0091#%\u007F\u000C=\u0093H\u00AFI6\u0014" +
500 "\u0000\u00BC\u00E8\u0081oJ8\u0014\u00F2\u0000\u00A3\u00F9@C\u009C"+
501 "zT\u00C2\u00BCpOW\u00DAA\u00E7\u00F9\u00C2Z\u00D3:T\u00F4\u00A0" +
502 "\u0084\u00B1\u007FU\u0005Y5|\u00BE\u00ED\u00BD\u0015\u00C8\u007F" +
503 "\u0097\u00C5\u00AB\u00BAZ\u00C7\u00B5\u00B6\u00F6\u00DE\u00AF" +
504 ":G\u009C:S\u0002\u00DA%e=~jT&\u008DIQ\u00A4w\u00EAP\u0017\u00D5" +
505 "[\u00D7\u00D2]\u0088D\u0013lv\u0004\u0004\u00A8\u00C8\u00B8\u00E5"+
506 "\u00A1!\u00B8\u001A\u0092\u008A`\u00EDXi\u0097\u00C5[\u0096\u00EA"+
507 "\u00EC\u0099\u001B)\u0093Y\u0013\u0001\u00FD\u00B7\u00F1\u0008" +
508 "\u008E\u008D\u00FA\u009A\u00B6\u00F6\u00F5;L\u00BF\u009FJ]\u00E3" +
509 "\u00AB\u00E6\u0005\u001D5\u00A0\u00E1\u00D8U\u00D3kL\u00F1\u00F5" +
510 "D\u00ED\u00EB\u00B0\u00E95$\u00BE\u00BB\u008F\u00BD\u00A2\u00D7" +
511 "b\u00CFI\u00C9/T8\u00B5\u00F31q(\u00A4TH9)\u0005\u00A6[\u001D" +
512 "\u00B8\u0085\u001C\u0097\u00BD\u00D6u\u00CF/",
513 sS7="\u0085\u00E0@\u00193+\u00F5gf-\u00BF\u00FF\u00CF\u00C6V\u0093" +
514 "*\u008D\u007Fo\u00AB\u009B\u00C9\u0012\u00DE`\u0008\u00A1 (\u00DA"+
515 "\u001F\u0002'\u00BC\u00E7Md)\u0016\u0018\u00FA\u00C3\u0000P\u00F1"+
516 "\u008B\u0082,\u00B2\u00CB\u0011\u00B22\u00E7\\K6\u0095\u00F2" +
517 "\u00B2\u0087\u0007\u00DE\u00A0_\u00BC\u00F6\u00CDA\u0081\u00E9" +
518 "\u00E1P!\u000C\u00E2N\u00F1\u00BD\u00B1h\u00C3\u0081\u00FD\u00E4" +
519 "\u00E7\u0089\\y\u00B0\u00D8\u001E\u008B\u00FDCMIP\u00018\u00BE" +
520 "CA\u0091<\u00EE\u001D\u0092\u00A7\u009C?\u0008\u0097f\u00BE\u00BA"+
521 "\u00EE\u00AD\u00F4\u0012\u0086\u00BE\u00CF\u00B6\u00EA\u00CB" +
522 "\u0019&`\u00C2\u0000ue\u00BD\u00E4d$\u001Fz\u0082H\u00DC\u00A9" +
523 "\u00C3\u00B3\u00ADf(\u0013`\u0086\u000B\u00D8\u00DF\u00A85m\u001C"+
524 "\u00F2\u0010w\u0089\u00BE\u00B3\u00B2\u00E9\u00CE\u0005\u0002" +
525 "\u00AA\u008F\u000B\u00C05\u001E\u0016k\u00F5*\u00EB\u0012\u00FF" +
526 "\u0082\u00E3Hi\u0011\u00D3Mu\u0016N{:\u00FF_Cg\u001B\u009C\u00F6" +
527 "\u00E07I\u0081\u00AC\u00833Bf\u00CE\u008C\u0093A\u00B7\u00D0" +
528 "\u00D8T\u00C0\u00CB:l\u0088G\u00BC()G%\u00BA7\u00A6j\u00D2+z" +
529 "\u00D6\u001F\u001E\u000C\\\u00BA\u00FAD7\u00F1\u0007\u00B6\u00E7" +
530 "\u0099bB\u00D2\u00D8\u0016\n\u0096\u0012\u0088\u00E1\u00A5\u00C0" +
531 "n\u0013t\u009Egr\u00FC\u0008\u001A\u00B1\u00D19\u00F7\u00F9X" +
532 "7E\u00CF\u0019\u00DFX\u00BE\u00C3\u00F7V\u00C0n\u00BA0\u0007" +
533 "!\u001B$E\u00C2\u0088)\u00C9^1\u007F\u00BC\u008E\u00C5\u0011" +
534 "8\u00BCF\u00E9\u00C6\u00E6\u00FA\u0014\u00BA\u00E8XJ\u00ADN\u00BC"+
535 "FF\u008FP\u008Bx)C_\u00F1$\u0018;\u0082\u001D\u00BA\u009F\u00AF" +
536 "\u00F6\u000F\u00F4\u00EA,Nm\u0016\u00E3\u0092d\u0092TJ\u008B" +
537 "\u0000\u009BO\u00C3\u00AB\u00A6\u008C\u00ED\u009A\u00C9ox\u0006" +
538 "\u00A5\u00B7\u009A\u00B2\u0085nn\u001A\u00EC<\u00A9\u00BE\u0083" +
539 "\u0086\u0088\u000E\u0008\u0004\u00E9U\u00F1\u00BEV\u00E7\u00E5" +
540 "6;\u00B3\u00A1\u00F2]\u00F7\u00DE\u00BB\u0085a\u00FE\u0003<\u0016"+
541 "tb3<\u0003L(\u00DAm\u000Cty\u00AA\u00C5l<\u00E4\u00E1\u00ADQ" +
542 "\u00F0\u00C8\u0002\u0098\u00F8\u00F3Z\u0016&\u00A4\u009F\u00EE" +
543 "\u00D8+)\u001D8/\u00E3\u000CO\u00B9\u009A\u00BB2Wx>\u00C6\u00D9" +
544 "{nw\u00A6\u00A9\u00CBe\u008B\\\u00D4R0\u00C7+\u00D1@\u008B`\u00C0"+
545 ">\u00B7\u00B9\u0006\u008Dx\u00A37T\u00F4\u00F40\u00C8}\u00C8" +
546 "\u00A7\u0013\u0002\u00B9m\u008C2\u00EB\u00D4\u00E7\u00BE\u00BE" +
547 "\u008B\u009D-yy\u00FB\u0006\u00E7\"S\u0008\u008Bu\u00CFw\u0011" +
548 "\u00EF\u008D\u00A4\u00E0\u0083\u00C8X\u008DkxoZc\u0017\u00A6" +
549 "\u00FA\\\u00F7\u00A0]\u00DA\u00003\u00F2\u008E\u00BF\u00B0\u00F5" +
550 "\u00B9\u00C3\u0010\u00A0\u00EA\u00C2\u0080\u0008\u00B9vz\u00A3" +
551 "\u00D9\u00D2\u00B0y\u00D3B\u0017\u0002\u001Aq\u008D\u009A\u00C6" +
552 "3j'\u0011\u00FD`C\u0080P\u00E3\u0006\u0099\u0008\u00A8=\u007F" +
553 "\u00ED\u00C4\u0082m+\u00EFN\u00EB\u0084vH\u008D\u00CF%6\u00C9" +
554 "\u00D5f(\u00E7NA\u00C2a\n\u00CA=I\u00A9\u00CF\u00BA\u00E3\u00B9" +
555 "\u00DF\u00B6_\u008D\u00E6\u0092\u00AE\u00AFd:\u00C7\u00D5\u00E6" +
556 "\u009E\u00A8\u0005\t\u00F2+\u0001}\u00A4\u0017?p\u00DD\u001E" +
557 "\u0016\u00C3\u0015\u00E0\u00D7\u00F9P\u00B1\u00B8\u0087+\u009F" +
558 "O\u00D5bZ\u00BA\u0082j\u0001yb.\u00C0\u001B\u009C\u0015H\u008A" +
559 "\u00A9\u00D7\u0016\u00E7@@\u0005Z,\u0093\u00D2\u009A\"\u00E3" +
560 "-\u00BF\u009A\u0005\u0087E\u00B94S\u00DC\u001E\u00D6\u0099)n" +
561 "Il\u00FFo\u001C\u009FI\u0086\u00DF\u00E2\u00ED\u0007\u00B8rB" +
562 "\u00D1\u0019\u00DE~\u00AE\u0005>V\u001A\u0015\u00ADo\u008Cfb" +
563 "l\u001CqT\u00C2L\u00EA\u0008+*\u0093\u00EB)9\u0017\u00DC\u00B0" +
564 "\u00F0X\u00D4\u00F2\u00AE\u009E\u00A2\u0094\u00FBR\u00CFVL\u0098" +
565 "\u0083\u00FEf.\u00C4\u0005\u0081v9S\u00C3\u0001\u00D6i.\u00D3" +
566 "\u00A0\u00C1\u0008\u00A1\u00E7\u0016\u000E\u00E4\u00F2\u00DF" +
567 "\u00A6i>\u00D2\u0085t\u0090F\u0098L+\u000E\u00DDOuvV]93x\u00A1" +
568 "2#O=2\u001C]\u00C3\u00F5\u00E1\u0094K&\u0093\u0001\u00C7\u009F" +
569 "\u0002/<\u0099~~^O\u0095\u0004?\u00FA\u00FB\u00BDv\u00F7\u00AD" +
570 "\u000E)f\u0093\u00F4=\u001F\u00CEo\u00C6\u001EE\u00BE\u00D3\u00B5"+
571 "\u00AB4\u00F7+\u00F9\u00B7\u001B\u00044\u00C0Nr\u00B5gU\u0092" +
572 "\u00A3=\u00B5\"\u0093\u0001\u00CF\u00D2\u00A8\u007F`\u00AE\u00B7" +
573 "g\u0018\u00148k0\u00BC\u00C3=8\u00A0\u00C0}\u00FD\u0016\u0006" +
574 "\u00F2\u00C3cQ\u009BX\u009D\u00D3\u0090Ty\u00F8\u00E6\u001C\u00B8"+
575 "\u00D6G\u0097\u00FDa\u00A9\u00EAwY\u00F4-WS\u009DV\u009AX\u00CF" +
576 "\u00E8Nc\u00ADF.\u001Bxe\u0080\u00F8~\u00F3\u0081y\u0014\u0091" +
577 "\u00DAU\u00F4@\u00A20\u00F3\u00D1\u0098\u008F5\u00B6\u00E3\u0018" +
578 "\u00D2?\u00FAP\u00BC=@\u00F0!\u00C3\u00C0\u00BD\u00AEIX\u00C2" +
579 "LQ\u008F6\u00B2\u0084\u00B1\u00D3p\u000F\u00ED\u00CE\u0083\u0087" +
580 "\u008D\u00DA\u00DA\u00F2\u00A2y\u00C7\u0094\u00E0\u001B\u00E8" +
581 "\u0090qoK\u0095K\u008A\u00A3",
582 sS8="\u00E2\u00160\r\u00BB\u00DD\u00FF\u00FC\u00A7\u00EB\u00DA\u00BD" +
583 "5d\u0080\u0095w\u0089\u00F8\u00B7\u00E6\u00C1\u0012\u001B\u000E" +
584 "$\u0016\u0000\u0005,\u00E8\u00B5\u0011\u00A9\u00CF\u00B0\u00E5" +
585 "\u0095/\u0011\u00EC\u00E7\u0099\n\u0093\u0086\u00D1t*B\u0093" +
586 "\u001Cv\u00E3\u0081\u0011\u00B1-\u00EF:7\u00DD\u00DD\u00FC\u00DE" +
587 "\u009A\u00DE\u00B1\n\u000C\u00C3,\u00BE\u0019p)\u0084\u00A0\t" +
588 "@\u00BB$:\u000F\u00B4\u00D17\u00CF\u00B4Ny\u00F0\u0004\u009E" +
589 "\u00ED\u00FD\u000B\u0015\u00A1]H\r1h\u008B\u00BB\u00DEZf\u009D" +
590 "\u00EDB\u00C7\u00EC\u00E81?\u008F\u0095\u00E7r\u00DF\u0019\u001B" +
591 "u\u00803\r\u0094\u0007BQ\\}\u00CD\u00FA\u00AB\u00BEmc\u00AA@" +
592 "!d\u00B3\u0001\u00D4\n\u0002\u00E7\u00D1\u00CASW\u001D\u00AE" +
593 "z1\u0082\u00A2\u0012\u00A8\u00DD\u00EC\u00FD\u00AA3]\u0017oC" +
594 "\u00E8q\u00FBF\u00D48\u0012\u0090\"\u00CE\u0094\u009A\u00D4\u00B8"+
595 "Gi\u00AD\u0096[\u00D8b\u0082\u00F3\u00D0Uf\u00FB\u0097g\u0015" +
596 "\u00B8\u000BN\u001D[G\u00A0L\u00FD\u00E0o\u00C2\u008E\u00C4\u00B8"+
597 "W\u00E8rndzx\u00FC\u0099\u0086]D`\u008B\u00D5\u0093l \u000E\u0003"+
598 "9\u00DC_\u00F6]\u000B\u0000\u00A3\u00AEc\u00AF\u00F2~\u008B\u00D6"+
599 "2p\u0010\u008C\u000C\u00BB\u00D3PI)\u0098\u00DF\u0004\u0098\u000C"+
600 "\u00F4*\u009Bm\u00F4\u0091\u009E~\u00DDS\u0006\u0091\u0085HX" +
601 "\u00CB~\u0007;t\u00EF.R/\u00FF\u00B1\u00D2G\u0008\u00CC\u001C" +
602 "~'\u00CD\u00A4\u00EB![<\u00F1\u00D2\u00E2\u0019\u00B4z8BOv\u0018" +
603 "5\u0085`9\u009D\u0017\u00DE\u00E7'\u00EB5\u00E6\u00C9\u00AF\u00F6"+
604 "{6\u00BA\u00F5\u00B8\t\u00C4g\u00CD\u00C1\u0089\u0010\u00B1\u00E1"+
605 "\u001D\u00BF{\u0006\u00CD\u001A\u00F8qp\u00C6\u0008-^3T\u00D4" +
606 "\u00DEIZd\u00C6\u00D0\u0006\u00BC\u00C0\u00C6,=\u00D0\r\u00B3" +
607 "p\u008F\u008F4w\u00D5\u001BB&Ob\u000F$\u00B8\u00D2\u00BF\u0015" +
608 "\u00C1\u00B7\u009EF\u00A5%d\u00F8\u00D7\u00E5N>7\u0081`x\u0095" +
609 "\u00CD\u00A5\u0085\u009C\u0015\u00A5\u00E6E\u0097\u0088\u00C3" +
610 "{\u00C7_\u00DB\u0007\u00BA\u000C\u0006v\u00A3\u00AB\u007F\"\u009B"+
611 "\u001E1\u0084.{$%\u009F\u00D7\u00F8\u00BE\u00F4r\u0083_\u00FC" +
612 "\u00B8m\u00F4\u00C1\u00F2\u0096\u00F5\u00B1\u0095\u00FD\n\u00F0" +
613 "\u00FC\u00B0\u00FE\u0013L\u00E2Pm=O\u009B\u0012\u00EA\u00F2\u0015"+
614 "\u00F2%\u00A2#so\u009F\u00B4\u00C4(%\u00D0Iy4\u00C7\u0013\u00F8" +
615 "\u00C4a\u0081\u0087\u00EAzn\u0098|\u00D1n\u00FC\u00146\u0087" +
616 "l\u00F1TA\u0007\u00BE\u00DE\u00EE\u0014V\u00E9\u00AF'\u00A0J" +
617 "\u00A4A<\u00F7\u00C8\u0099\u0092\u00EC\u00BA\u00E6\u00DDg\u0001" +
618 "m\u0015\u0016\u0082\u00EB\u00A8B\u00EE\u00DF\u00FD\u00BA`\u00B4" +
619 "\u00F1\u0090{u \u00E3\u0003\u000F$\u00D8\u00C2\u009E\u00E19g" +
620 ";\u00EF\u00A6?\u00B8q\u00870T\u00B6\u00F2\u00CF;\u009F2dB\u00CB" +
621 "\u0015\u00A4\u00CC\u00B0\u001AE\u0004\u00F1\u00E4}\u008D\u0084" +
622 "J\u001B\u00E5\u00BA\u00E7\u00DF\u00DCB\u00CB\u00DAp\u00CD}\u00AE" +
623 "\nW\u00E8[z\u00D5?Z\u00F6 \u00CFM\u008C\u00CE\u00A4\u00D4(y\u00D1"+
624 "0\u00A44\u0086\u00EB\u00FB3\u00D3\u00CD\u00DCw\u0085;S7\u00EF" +
625 "\u00FC\u00B5\u00C5\u0006\u0087x\u00E5\u0080\u00B3\u00E6Nh\u00B8" +
626 "\u00F4\u00C5\u00C8\u00B3~\r\u0080\u009E\u00A29\u008F\u00EB|\u0013"+
627 "*O\u0094C\u00B7\u0095\u000E/\u00EE}\u001C\"6\u0013\u00BD\u00DD" +
628 "\u0006\u00CA\u00A27\u00DF\u0093+\u00C4$\u0082\u0089\u00AC\u00F3" +
629 "\u00EB\u00C3W\u0015\u00F6\u00B7\u00EF4x\u00DD\u00F2gao\u00C1" +
630 "H\u00CB\u00E4\u0090R\u0081^^A\u000F\u00AB\u00B4\u008A$e.\u00DA" +
631 "\u007F\u00A4\u00E8{@\u00E4\u00E9\u008E\u00A0\u0084X\u0089\u00E9" +
632 "\u00E1\u00EF\u00D3\u0090\u00FC\u00DD\u0007\u00D3[\u00DBHV\u0094" +
633 "8\u00D7\u00E5\u00B2Wr\u0001\u0001s\u000E\u00DE\u00BC[d1\u0013" +
634 "\u0094\u0091~OP</\u00BAdo\u0012\u0082u#\u00D2J\u00E0w\u0096\u0095"+
635 "\u00F9\u00C1z\u008Fz[!!\u00D1\u0087\u00B8\u0096)&:M\u00BAQ\u000C" +
636 "\u00DF\u0081\u00F4|\u009F\u00AD\u0011c\u00ED\u00EA{Ye\u001A\u0000"+
637 "rn\u0011@0\u0092\u0000\u00DAmwJ\u000C\u00DDa\u00AD\u001FF\u0003" +
638 "`[\u00DF\u00B0\u009E\u00ED\u00C3d\"\u00EB\u00E6\u00A8\u00CE\u00E7"+
639 "\u00D2\u008A\u00A0\u00E76\u00A0Ud\u00A6\u00B9\u0010\u00852\t" +
640 "\u00C7\u00EB\u008F7-\u00E7\u0005\u00CA\u0089QW\u000F\u00DF\t" +
641 "\u0082+\u00BDi\u001Al\u00AA\u0012\u00E4\u00F2\u0087E\u001C\u000F" +
642 "\u00E0\u00F6\u00A2z:\u00DAH\u0019L\u00F1vO\rw\u001C+g\u00CD\u00B1"+
643 "V5\r\u0083\u0084Y8\u00FA\u000FB9\u009E\u00F36\u0099{\u0007\u000E" +
644 "\u0084\t=J\u00A9>a\u0083`\u00D8{\u001F\u00A9\u008B\u000C\u0011" +
645 "I8,\u00E9v%\u00A5\u0006\u0014\u00D1\u00B7\u000E%$K\u000Cv\u0083" +
646 "GX\u009E\u008D\u0082\r Y\u00D1\u00A4f\u00BB\u001E\u00F8\u00DA" +
647 "\n\u0082\u0004\u00F1\u00910\u00BAnN\u00C0\u0099&Qd\u001E\u00E7" +
648 "#\rP\u00B2\u00AD\u0080\u00EA\u00EEh\u0001\u008D\u00B2\u00A2\u0083"+
649 "\u00EA\u008B\u00F5\u009E";
650
651
652 /** 8 S-boxes */
653 private static final int[] S0, S1, S2, S3, S4, S5, S6, S7, S8;
654
655
656 /**
657 * Expand a String of compressed S-box data and return an
658 * S-box with uncompressed data.
659 */
660 private static int[] expand(String in)
661 {
662 int[] S = new int[256];
663 for(int i=0, j=0; i<S.length; i++)
664 S[i] = (in.charAt(j++) << 24) |
665 (in.charAt(j++) << 16) |
666 (in.charAt(j++) << 8) |
667 (in.charAt(j++) );
668 return S;
669 }
670
671
672 /**
673 * Initialize the S-boxes by expanding them from the compressed data.
674 * Zero out the references (sS*) to the compressed data as we no
675 * longer need them.
676 */
677 static
678 {
679 S0 = expand(sS0); sS0 = null;
680 S1 = expand(sS1); sS1 = null;
681 S2 = expand(sS2); sS2 = null;
682 S3 = expand(sS3); sS3 = null;
683 S4 = expand(sS4); sS4 = null;
684 S5 = expand(sS5); sS5 = null;
685 S6 = expand(sS6); sS6 = null;
686 S7 = expand(sS7); sS7 = null;
687 S8 = expand(sS8); sS8 = null;
688 }
689
690
691 // Instance variables
692 //............................................................................
693
694 /** Number of rounds (depends on key length) */
695 private int rounds = DEFAULT_NOF_ROUNDS;
696
697 /** Masking session keys. */
698 private int
699 Km0, Km1, Km2, Km3, Km4, Km5, Km6, Km7,
700 Km8, Km9, Km10, Km11, Km12, Km13, Km14, Km15;
701
702 /** Rotation session keys. */
703 private int
704 Kr0, Kr1, Kr2, Kr3, Kr4, Kr5, Kr6, Kr7,
705 Kr8, Kr9, Kr10, Kr11, Kr12, Kr13, Kr14, Kr15;
706
707
708 // Constructors
709 //............................................................................
710
711 public CAST128 (byte userkey[])
712 {
713 makeKey(userkey);
714 }
715
716 public void encrypt(byte in[], int inOffset, byte out[], int outOffset, int len, byte iv[])
717 {
718 for (int i=0; i<len; i+=8)
719 {
720 //blockEncrypt(in, inOffset+i, out, outOffset+i);
721 for (int j=0; j<8; j++)
722 {
723 iv[j] ^= in[inOffset+i+j];
724 }
725 blockEncrypt(iv, 0, out, outOffset+i);
726 System.arraycopy(out, outOffset+i, iv, 0, 8);
727 }
728 }
729
730 public void decrypt(byte in[], int inOffset, byte out[], int outOffset, int len, byte iv[])
731 {
732 for (int i=0; i<len; i+=8)
733 {
734 //blockDecrypt(in, inOffset+i, out, outOffset+i);
735 blockDecrypt(in, inOffset+i, out, outOffset+i);
736 for (int j=0; j<8; j++)
737 {
738 out[outOffset+i+j] ^= iv[j];
739 }
740 System.arraycopy(in, inOffset+i, iv, 0, 8);
741 }
742 }
743
744
745 // Private parts
746 //............................................................................
747
748 /**
749 * Expands a user key to a working CAST5 128-bit key --by
750 * padding it with 0x00 if it's shorter than 16 bytes--
751 * and generates the masking and rotation keypairs for
752 * the block cipher.
753 *
754 * @param key The user key object.
755 * @exception KeyException
756 * when one of the following occurs:<ul>
757 * <li>The user key object is null;
758 * <li>The decoded byte array form of the user key is
759 * zero long;
760 * <li>The decoded user key is shorter than 40 bits or
761 * longer than 128 bits.</ul>
762 */
763 private void makeKey (byte userkey[])
764 {
765 if (userkey == null)
766 throw new RuntimeException("Null user key");
767
768 int len = userkey.length;
769 if (len < 5 || len > 16)
770 throw new RuntimeException("Invalid user key length");
771
772 rounds = (len < 11) ? MIN_NOF_ROUNDS : MAX_NOF_ROUNDS;
773
774 byte[] kk = new byte[16];
775 System.arraycopy(userkey, 0, kk, 0, len);
776
777 int x0x1x2x3 = (kk[ 0] & 0xFF) << 24 | (kk[ 1] & 0xFF) << 16 |
778 (kk[ 2] & 0xFF) << 8 | (kk[ 3] & 0xFF),
779 x4x5x6x7 = (kk[ 4] & 0xFF) << 24 | (kk[ 5] & 0xFF) << 16 |
780 (kk[ 6] & 0xFF) << 8 | (kk[ 7] & 0xFF),
781 x8x9xAxB = (kk[ 8] & 0xFF) << 24 | (kk[ 9] & 0xFF) << 16 |
782 (kk[10] & 0xFF) << 8 | (kk[11] & 0xFF),
783 xCxDxExF = (kk[12] & 0xFF) << 24 | (kk[13] & 0xFF) << 16 |
784 (kk[14] & 0xFF) << 8 | (kk[15] & 0xFF),
785 z0z1z2z3, z4z5z6z7, z8z9zAzB, zCzDzEzF,
786 z0, z1, z2, z3, z4, z5, z6, z7, z8, z9, zA, zB, zC, zD, zE, zF,
787 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, xA, xB, xC, xD, xE, xF;
788 int[] b;
789
790 b = unscramble(x0x1x2x3); x0 = b[0]; x1 = b[1]; x2 = b[2]; x3 = b[3];
791 b = unscramble(x4x5x6x7); x4 = b[0]; x5 = b[1]; x6 = b[2]; x7 = b[3];
792 b = unscramble(x8x9xAxB); x8 = b[0]; x9 = b[1]; xA = b[2]; xB = b[3];
793 b = unscramble(xCxDxExF); xC = b[0]; xD = b[1]; xE = b[2]; xF = b[3];
794
795 z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8];
796 b = unscramble(z0z1z2z3); z0 = b[0]; z1 = b[1]; z2 = b[2]; z3 = b[3];
797 z4z5z6z7 = x8x9xAxB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA];
798 b = unscramble(z4z5z6z7); z4 = b[0]; z5 = b[1]; z6 = b[2]; z7 = b[3];
799 z8z9zAzB = xCxDxExF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9];
800 b = unscramble(z8z9zAzB); z8 = b[0]; z9 = b[1]; zA = b[2]; zB = b[3];
801 zCzDzEzF = x4x5x6x7 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB];
802 b = unscramble(zCzDzEzF); zC = b[0]; zD = b[1]; zE = b[2]; zF = b[3];
803
804 Km0 = S5[z8] ^ S6[z9] ^ S7[z7] ^ S8[z6] ^ S5[z2];
805 Km1 = S5[zA] ^ S6[zB] ^ S7[z5] ^ S8[z4] ^ S6[z6];
806 Km2 = S5[zC] ^ S6[zD] ^ S7[z3] ^ S8[z2] ^ S7[z9];
807 Km3 = S5[zE] ^ S6[zF] ^ S7[z1] ^ S8[z0] ^ S8[zC];
808
809 x0x1x2x3 = z8z9zAzB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0];
810 b = unscramble(x0x1x2x3); x0 = b[0]; x1 = b[1]; x2 = b[2]; x3 = b[3];
811 x4x5x6x7 = z0z1z2z3 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2];
812 b = unscramble(x4x5x6x7); x4 = b[0]; x5 = b[1]; x6 = b[2]; x7 = b[3];
813 x8x9xAxB = z4z5z6z7 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1];
814 b = unscramble(x8x9xAxB); x8 = b[0]; x9 = b[1]; xA = b[2]; xB = b[3];
815 xCxDxExF = zCzDzEzF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3];
816 b = unscramble(xCxDxExF); xC = b[0]; xD = b[1]; xE = b[2]; xF = b[3];
817
818 Km4 = S5[x3] ^ S6[x2] ^ S7[xC] ^ S8[xD] ^ S5[x8];
819 Km5 = S5[x1] ^ S6[x0] ^ S7[xE] ^ S8[xF] ^ S6[xD];
820 Km6 = S5[x7] ^ S6[x6] ^ S7[x8] ^ S8[x9] ^ S7[x3];
821 Km7 = S5[x5] ^ S6[x4] ^ S7[xA] ^ S8[xB] ^ S8[x7];
822
823 z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8];
824 b = unscramble(z0z1z2z3); z0 = b[0]; z1 = b[1]; z2 = b[2]; z3 = b[3];
825 z4z5z6z7 = x8x9xAxB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA];
826 b = unscramble(z4z5z6z7); z4 = b[0]; z5 = b[1]; z6 = b[2]; z7 = b[3];
827 z8z9zAzB = xCxDxExF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9];
828 b = unscramble(z8z9zAzB); z8 = b[0]; z9 = b[1]; zA = b[2]; zB = b[3];
829 zCzDzEzF = x4x5x6x7 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB];
830 b = unscramble(zCzDzEzF); zC = b[0]; zD = b[1]; zE = b[2]; zF = b[3];
831
832 Km8 = S5[z3] ^ S6[z2] ^ S7[zC] ^ S8[zD] ^ S5[z9];
833 Km9 = S5[z1] ^ S6[z0] ^ S7[zE] ^ S8[zF] ^ S6[zC];
834 Km10 = S5[z7] ^ S6[z6] ^ S7[z8] ^ S8[z9] ^ S7[z2];
835 Km11 = S5[z5] ^ S6[z4] ^ S7[zA] ^ S8[zB] ^ S8[z6];
836
837 x0x1x2x3 = z8z9zAzB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0];
838 b = unscramble(x0x1x2x3); x0 = b[0]; x1 = b[1]; x2 = b[2]; x3 = b[3];
839 x4x5x6x7 = z0z1z2z3 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2];
840 b = unscramble(x4x5x6x7); x4 = b[0]; x5 = b[1]; x6 = b[2]; x7 = b[3];
841 x8x9xAxB = z4z5z6z7 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1];
842 b = unscramble(x8x9xAxB); x8 = b[0]; x9 = b[1]; xA = b[2]; xB = b[3];
843 xCxDxExF = zCzDzEzF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3];
844 b = unscramble(xCxDxExF); xC = b[0]; xD = b[1]; xE = b[2]; xF = b[3];
845
846 Km12 = S5[x8] ^ S6[x9] ^ S7[x7] ^ S8[x6] ^ S5[x3];
847 Km13 = S5[xA] ^ S6[xB] ^ S7[x5] ^ S8[x4] ^ S6[x7];
848 Km14 = S5[xC] ^ S6[xD] ^ S7[x3] ^ S8[x2] ^ S7[x8];
849 Km15 = S5[xE] ^ S6[xF] ^ S7[x1] ^ S8[x0] ^ S8[xD];
850
851 // The remaining half is identical to what is given above, carrying
852 // on from the last created x0..xF to generate keys K17 - K32. These
853 // keys will be used as the 'rotation' keys and as such only the five
854 // least significant bits are to be considered.
855
856 z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8];
857 b = unscramble(z0z1z2z3); z0 = b[0]; z1 = b[1]; z2 = b[2]; z3 = b[3];
858 z4z5z6z7 = x8x9xAxB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA];
859 b = unscramble(z4z5z6z7); z4 = b[0]; z5 = b[1]; z6 = b[2]; z7 = b[3];
860 z8z9zAzB = xCxDxExF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9];
861 b = unscramble(z8z9zAzB); z8 = b[0]; z9 = b[1]; zA = b[2]; zB = b[3];
862 zCzDzEzF = x4x5x6x7 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB];
863 b = unscramble(zCzDzEzF); zC = b[0]; zD = b[1]; zE = b[2]; zF = b[3];
864
865 Kr0 = (S5[z8] ^ S6[z9] ^ S7[z7] ^ S8[z6] ^ S5[z2]) & 0x1F;
866 Kr1 = (S5[zA] ^ S6[zB] ^ S7[z5] ^ S8[z4] ^ S6[z6]) & 0x1F;
867 Kr2 = (S5[zC] ^ S6[zD] ^ S7[z3] ^ S8[z2] ^ S7[z9]) & 0x1F;
868 Kr3 = (S5[zE] ^ S6[zF] ^ S7[z1] ^ S8[z0] ^ S8[zC]) & 0x1F;
869
870 x0x1x2x3 = z8z9zAzB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0];
871 b = unscramble(x0x1x2x3); x0 = b[0]; x1 = b[1]; x2 = b[2]; x3 = b[3];
872 x4x5x6x7 = z0z1z2z3 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2];
873 b = unscramble(x4x5x6x7); x4 = b[0]; x5 = b[1]; x6 = b[2]; x7 = b[3];
874 x8x9xAxB = z4z5z6z7 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1];
875 b = unscramble(x8x9xAxB); x8 = b[0]; x9 = b[1]; xA = b[2]; xB = b[3];
876 xCxDxExF = zCzDzEzF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3];
877 b = unscramble(xCxDxExF); xC = b[0]; xD = b[1]; xE = b[2]; xF = b[3];
878
879 Kr4 = (S5[x3] ^ S6[x2] ^ S7[xC] ^ S8[xD] ^ S5[x8]) & 0x1F;
880 Kr5 = (S5[x1] ^ S6[x0] ^ S7[xE] ^ S8[xF] ^ S6[xD]) & 0x1F;
881 Kr6 = (S5[x7] ^ S6[x6] ^ S7[x8] ^ S8[x9] ^ S7[x3]) & 0x1F;
882 Kr7 = (S5[x5] ^ S6[x4] ^ S7[xA] ^ S8[xB] ^ S8[x7]) & 0x1F;
883
884 z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8];
885 b = unscramble(z0z1z2z3); z0 = b[0]; z1 = b[1]; z2 = b[2]; z3 = b[3];
886 z4z5z6z7 = x8x9xAxB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA];
887 b = unscramble(z4z5z6z7); z4 = b[0]; z5 = b[1]; z6 = b[2]; z7 = b[3];
888 z8z9zAzB = xCxDxExF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9];
889 b = unscramble(z8z9zAzB); z8 = b[0]; z9 = b[1]; zA = b[2]; zB = b[3];
890 zCzDzEzF = x4x5x6x7 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB];
891 b = unscramble(zCzDzEzF); zC = b[0]; zD = b[1]; zE = b[2]; zF = b[3];
892
893 Kr8 = (S5[z3] ^ S6[z2] ^ S7[zC] ^ S8[zD] ^ S5[z9]) & 0x1F;
894 Kr9 = (S5[z1] ^ S6[z0] ^ S7[zE] ^ S8[zF] ^ S6[zC]) & 0x1F;
895 Kr10 = (S5[z7] ^ S6[z6] ^ S7[z8] ^ S8[z9] ^ S7[z2]) & 0x1F;
896 Kr11 = (S5[z5] ^ S6[z4] ^ S7[zA] ^ S8[zB] ^ S8[z6]) & 0x1F;
897
898 x0x1x2x3 = z8z9zAzB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0];
899 b = unscramble(x0x1x2x3); x0 = b[0]; x1 = b[1]; x2 = b[2]; x3 = b[3];
900 x4x5x6x7 = z0z1z2z3 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2];
901 b = unscramble(x4x5x6x7); x4 = b[0]; x5 = b[1]; x6 = b[2]; x7 = b[3];
902 x8x9xAxB = z4z5z6z7 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1];
903 b = unscramble(x8x9xAxB); x8 = b[0]; x9 = b[1]; xA = b[2]; xB = b[3];
904 xCxDxExF = zCzDzEzF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3];
905 b = unscramble(xCxDxExF); xC = b[0]; xD = b[1]; xE = b[2]; xF = b[3];
906
907 Kr12 = (S5[x8] ^ S6[x9] ^ S7[x7] ^ S8[x6] ^ S5[x3]) & 0x1F;
908 Kr13 = (S5[xA] ^ S6[xB] ^ S7[x5] ^ S8[x4] ^ S6[x7]) & 0x1F;
909 Kr14 = (S5[xC] ^ S6[xD] ^ S7[x3] ^ S8[x2] ^ S7[x8]) & 0x1F;
910 Kr15 = (S5[xE] ^ S6[xF] ^ S7[x1] ^ S8[x0] ^ S8[xD]) & 0x1F;
911 }
912
913
914 /**
915 * Assuming the input is a 32-bit block organised as: b31b30b29...b0,
916 * returns an array of 4 Java ints, containing from position 0 onward
917 * the values: {b31b30b29b28, b27b26b25b24, ... , b3b2b1b0}.
918 *
919 * @param x a 32-bit block
920 * @return an array of 4 ints, each being the contents of an 8-bit
921 * block from the input.
922 */
923 private static final int[] unscramble (int x)
924 {
925 return new int[]
926 { (x >>> 24) & 0xFF, (x >>> 16) & 0xFF, (x >>> 8) & 0xFF, x & 0xFF };
927 }
928
929
930 /**
931 * The full encryption algorithm is given in the following four steps.
932 * <p>
933 * INPUT: plaintext m1...m64; key K = k1...k128.<br>
934 * OUTPUT: ciphertext c1...c64.
935 * <ol>
936 * <li> (key schedule) Compute 16 pairs of subkeys {Kmi, Kri}
937 * from a user key (see makeKey() method).
938 * <li> (L0,R0) <-- (m1...m64). (Split the plaintext into left
939 * and right 32-bit halves L0 = m1...m32 and R0 = m33...m64.).
940 * <li> (16 rounds) for i from 1 to 16, compute Li and Ri as
941 * follows:
942 * <ul>
943 * <li> Li = Ri-1;
944 * <li> Ri = Li-1 ^ F(Ri-1,Kmi,Kri), where F is defined in
945 * method F() --f is of Type 1, Type 2, or Type 3, depending
946 * on i, and ^ being the bitwise XOR function.
947 * </ul>
948 * <li> c1...c64 <-- (R16,L16). (Exchange final blocks L16, R16
949 * and concatenate to form the ciphertext.)
950 * </ol>
951 * <p>
952 * Decryption is identical to the encryption algorithm given
953 * above, except that the rounds (and therefore the subkey pairs)
954 * are used in reverse order to compute (L0,R0) from (R16,L16).
955 * <p>
956 * Looking at the iterations/rounds in pairs we have:
957 * <pre>
958 * (1a) Li = Ri-1;
959 * (1b) Ri = Li-1 ^ Fi(Ri-1);
960 * (2a) Li+1 = Ri;
961 * (2b) Ri+1 = Li ^ Fi+1(Ri);
962 * </pre>
963 * which by substituting (2a) in (2b) becomes
964 * <pre>
965 * (2c) Ri+1 = Li ^ Fi+1(Li+1);
966 * </pre>
967 * by substituting (1b) in (2a) and (1a) in (2c), we get:
968 * <pre>
969 * (3a) Li+1 = Li-1 ^ Fi(Ri-1);
970 * (3b) Ri+1 = Ri-1 ^ Fi+1(Li+1);
971 * </pre>
972 * Using only one couple of variables L and R, initialised to L0 and
973 * R0 respectively, the assignments for each pair of rounds become:
974 * <pre>
975 * (4a) L ^= Fi(R);
976 * (4b) R ^= Fi+1(L);
977 * </pre>
978 *
979 * @param in contains the plain-text 64-bit block.
980 * @param off start index within input where data is considered.
981 * @param out will contain the cipher-text block.
982 * @param outOff index in out where cipher-text starts.
983 */
984 private void blockEncrypt (byte[] in, int off, byte[] out, int outOff)
985 {
986 int L = (in[off++] & 0xFF) << 24 |
987 (in[off++] & 0xFF) << 16 |
988 (in[off++] & 0xFF) << 8 |
989 (in[off++] & 0xFF),
990 R = (in[off++] & 0xFF) << 24 |
991 (in[off++] & 0xFF) << 16 |
992 (in[off++] & 0xFF) << 8 |
993 (in[off ] & 0xFF);
994
995 L ^= f1(R, Km0, Kr0);
996 R ^= f2(L, Km1, Kr1); // round 2
997 L ^= f3(R, Km2, Kr2);
998 R ^= f1(L, Km3, Kr3); // round 4
999 L ^= f2(R, Km4, Kr4);
1000 R ^= f3(L, Km5, Kr5); // round 6
1001 L ^= f1(R, Km6, Kr6);
1002 R ^= f2(L, Km7, Kr7); // round 8
1003 L ^= f3(R, Km8, Kr8);
1004 R ^= f1(L, Km9, Kr9); // round 10
1005 L ^= f2(R, Km10, Kr10);
1006 R ^= f3(L, Km11, Kr11); // round 12
1007 if (rounds == MAX_NOF_ROUNDS)
1008 {
1009 L ^= f1(R, Km12, Kr12);
1010 R ^= f2(L, Km13, Kr13); // round 14
1011 L ^= f3(R, Km14, Kr14);
1012 R ^= f1(L, Km15, Kr15); // round 16
1013 }
1014 out[outOff++] = (byte)(R >>> 24);
1015 out[outOff++] = (byte)(R >>> 16);
1016 out[outOff++] = (byte)(R >>> 8);
1017 out[outOff++] = (byte) R;
1018 out[outOff++] = (byte)(L >>> 24);
1019 out[outOff++] = (byte)(L >>> 16);
1020 out[outOff++] = (byte)(L >>> 8);
1021 out[outOff ] = (byte) L;
1022 }
1023
1024 /**
1025 * Decrypts a 64-bit block by applying the formulae and sub-keys
1026 * in reverse order to that of the encryption.
1027 *
1028 * @param input contains the cipher-text 64-bit block.
1029 * @param offset start index within input where data is considered.
1030 * @param out will contain the plain-text block.
1031 * @param outOff index in out where plain-text starts.
1032 */
1033 private void blockDecrypt (byte[] in, int off, byte[] out, int outOff)
1034 {
1035 int L = (in[off ] & 0xFF) << 24 |
1036 (in[off + 1] & 0xFF) << 16 |
1037 (in[off + 2] & 0xFF) << 8 |
1038 (in[off + 3] & 0xFF),
1039 R = (in[off + 4] & 0xFF) << 24 |
1040 (in[off + 5] & 0xFF) << 16 |
1041 (in[off + 6] & 0xFF) << 8 |
1042 (in[off + 7] & 0xFF);
1043
1044 if (rounds == MAX_NOF_ROUNDS)
1045 {
1046 L ^= f1(R, Km15, Kr15);
1047 R ^= f3(L, Km14, Kr14);
1048 L ^= f2(R, Km13, Kr13);
1049 R ^= f1(L, Km12, Kr12);
1050 }
1051 L ^= f3(R, Km11, Kr11);
1052 R ^= f2(L, Km10, Kr10);
1053 L ^= f1(R, Km9, Kr9);
1054 R ^= f3(L, Km8, Kr8);
1055 L ^= f2(R, Km7, Kr7);
1056 R ^= f1(L, Km6, Kr6);
1057 L ^= f3(R, Km5, Kr5);
1058 R ^= f2(L, Km4, Kr4);
1059 L ^= f1(R, Km3, Kr3);
1060 R ^= f3(L, Km2, Kr2);
1061 L ^= f2(R, Km1, Kr1);
1062 R ^= f1(L, Km0, Kr0);
1063
1064 out[outOff++] = (byte)(R >>> 24);
1065 out[outOff++] = (byte)(R >>> 16);
1066 out[outOff++] = (byte)(R >>> 8);
1067 out[outOff++] = (byte) R;
1068 out[outOff++] = (byte)(L >>> 24);
1069 out[outOff++] = (byte)(L >>> 16);
1070 out[outOff++] = (byte)(L >>> 8);
1071 out[outOff ] = (byte) L;
1072 }
1073
1074 private final int f1 (int I, int m, int r)
1075 {
1076 I = m + I;
1077 I = I << r | I >>> (32 - r);
1078 return (((S1[(I >>> 24) & 0xFF]) ^ S2[(I >>> 16) & 0xFF]) -
1079 S3[(I >>> 8) & 0xFF]) + S4[I & 0xFF];
1080 }
1081
1082 private final int f2 (int I, int m, int r)
1083 {
1084 I = m ^ I;
1085 I = I << r | I >>> (32 - r);
1086 return (((S1[(I >>> 24) & 0xFF]) - S2[(I >>> 16) & 0xFF]) +
1087 S3[(I >>> 8) & 0xFF]) ^ S4[I & 0xFF];
1088 }
1089 private final int f3 (int I, int m, int r)
1090 {
1091 I = m - I;
1092 I = I << r | I >>> (32 - r);
1093 return (((S1[(I >>> 24) & 0xFF]) + S2[(I >>> 16) & 0xFF]) ^
1094 S3[(I >>> 8) & 0xFF]) - S4[I & 0xFF];
1095 }
1096}