1 /**
2    Whirlpool hashing algorithm implementation. This module conforms to the APIs defined in std.digest.
3 
4    Based on the original Whirlpool implementation by Paulo S.L.M. Barreto and Vincent Rijmen.
5 */
6 module nxt.digest.whirlpool;
7 
8 public import std.digest;
9 import std.range;
10 
11 /**
12  * Template API Whirlpool implementation.
13  */
14 struct Whirlpool
15 {
16 	/// Initializes the digest calculation.
17 	void start() pure nothrow @safe @nogc
18 	{
19 		_lenBuf = 0;
20 		_bufferPos = 0;
21 		_hash[] = 0;
22 		_tailBlock = false;
23 		_bitLength[] = 0;
24 	}
25 
26 	/// Feed the digest with data.
27 	void put(scope const(ubyte)[] data...) @trusted pure nothrow @nogc
28 	{
29 		bufLength(data.length);
30 
31 		while (true) {
32 			immutable cap = _buffer.length - _bufferPos;
33 			if (cap <= data.length) {
34 				_buffer[_bufferPos .. $] = data[0 .. cap];
35 				processBuffer();
36 				_bufferPos = 0;
37 
38 				data = data[cap .. $];
39 			}
40 			else
41 			{
42 				_buffer[_bufferPos .. _bufferPos + data.length] = data;
43 				_bufferPos += data.length;
44 
45 				data = null;
46 				break;
47 			}
48 		}
49 	}
50 
51 	void put(R)(R r) if (isInputRange!R && hasLength!R) {
52 		bufLength(r.length);
53 
54 		foreach (immutable i; r) {
55 			_buffer[_bufferPos] = i;
56 			_bufferPos++;
57 			if (_bufferPos == _buffer.length) {
58 				processBuffer();
59 				_bufferPos = 0;
60 			}
61 		}
62 	}
63 
64 	/// Returns the Whirlpool hash. This also calls start to reset the internal state.
65 	ubyte[64] finish() @trusted pure nothrow @nogc
66 	{
67 		// append a '1'-bit
68 		// As the buffer is byte-wise in this implementation, _buffer[_bufferPos] is not used yet.
69 		_buffer[_bufferPos] = 0x80;
70 		_bufferPos++;
71 
72 		if (_bufferPos > 32) {
73 			_buffer[_bufferPos .. $] = 0;
74 			processBuffer();
75 			_bufferPos = 0;
76 		}
77 
78 		if (_bufferPos < 32)
79 			_buffer[_bufferPos .. 32] = 0;
80 		if (_lenBuf != 0)
81 			addLength(_lenBuf);
82 		_buffer[32 .. $] = _bitLength;
83 		processBuffer();
84 
85 		ubyte[64] digest = void;
86 
87 		for (int i = 0, j = 0; i < 8; i++, j += 8) {
88 			immutable h = _hash[i];
89 			digest[j] = cast(ubyte)(h >> 56);
90 			digest[j + 1] = cast(ubyte)(h >> 48);
91 			digest[j + 2] = cast(ubyte)(h >> 40);
92 			digest[j + 3] = cast(ubyte)(h >> 32);
93 			digest[j + 4] = cast(ubyte)(h >> 24);
94 			digest[j + 5] = cast(ubyte)(h >> 16);
95 			digest[j + 6] = cast(ubyte)(h >> 8);
96 			digest[j + 7] = cast(ubyte) h;
97 		}
98 
99 		start();
100 
101 		return digest;
102 	}
103 
104 private:
105 
106 	// buffers sum of data length and add into _bitLength when necessary,
107 	// to reduce bignum operation.
108 	ulong _lenBuf = void;
109 
110 	void bufLength(ulong bytes) pure nothrow @safe @nogc
111 	{
112 		ulong sum = _lenBuf + bytes;
113 		if (sum < _lenBuf || sum < bytes) {
114 			addLength(_lenBuf);
115 			_lenBuf = bytes;
116 		}
117 		else
118 		{
119 			_lenBuf = sum;
120 		}
121 	}
122 
123 	ubyte[32] _bitLength = void;
124 
125 	void addLength(ulong bytes) @trusted pure nothrow @nogc
126 	{
127 		uint carry = _bitLength[31] + ((bytes << 3) & 0xFF);
128 		_bitLength[31] = cast(ubyte) carry;
129 		carry >>= 8;
130 		bytes >>= 5;
131 		for (int i = 30; i >= 0; i--) {
132 			carry += _bitLength[i] + (bytes & 0xFF);
133 			_bitLength[i] = cast(ubyte) carry;
134 			carry >>= 8;
135 			bytes >>= 8;
136 		}
137 	}
138 
139 	ubyte[64] _buffer = void;
140 	size_t _bufferPos = void;
141 
142 	ulong[8] _hash = void;
143 
144 	bool _tailBlock;
145 
146 	void processBuffer() @trusted pure nothrow @nogc
147 	{
148 		ulong[8] block = void;
149 
150 		// map the buffer to a block
151 		for (int i = 0, j = 0; i < 8; i++, j += 8) {
152 			block[i] = (cast(ulong) _buffer[j] << 56) ^ (cast(ulong) _buffer[j + 1] << 48) ^ (
153 				cast(ulong) _buffer[j + 2] << 40) ^ (cast(ulong) _buffer[j + 3] << 32) ^ (
154 					cast(ulong) _buffer[j + 4] << 24) ^ (cast(ulong) _buffer[j + 5] << 16) ^ (
155 						cast(ulong) _buffer[j + 6] << 8) ^ (cast(ulong) _buffer[j + 7]);
156 		}
157 
158 		// compute and apply K^0 to the cipher state
159 		ulong[8] state = void;
160 		state[] = block[] ^ _hash[];
161 
162 		// iterate over all rounds
163 		if (_tailBlock) // not the first block
164 		{
165 			ulong[8] K = _hash;
166 
167 			foreach (immutable rcr; rc) {
168 				ulong[8] L = void;
169 
170 				// compute K^r from K^{r-1}
171 				mixin(genTransform("L", "K"));
172 				L[0] ^= rcr;
173 
174 				K = L;
175 
176 				// apply the r-th round transformation
177 				mixin(genTransform("L", "state"));
178 
179 				state[] = L[] ^ K[];
180 			}
181 		}
182 		else // use precompiled K[] for first block
183 		{
184 			foreach (immutable k; pcK) {
185 				ulong[8] L = void;
186 				mixin(genTransform("L", "state"));
187 				state[] = L[] ^ k[];
188 			}
189 
190 			_tailBlock = true;
191 		}
192 
193 		// apply the Miyaguchi-Preneel compression function:
194 		_hash[] ^= state[] ^ block[];
195 	}
196 }
197 
198 /// Convenience alias for digest function in std.digest using the Whirlpool implementation.
199 auto whirlpoolOf(T...)(T data) {
200 	return digest!(Whirlpool, T)(data);
201 }
202 
203 /// OOP API for Whirlpool
204 alias WhirlpoolDigest = WrapperDigest!Whirlpool;
205 
206 ///
207 unittest {
208 	import nxt.digest.whirlpool;
209 
210 	ubyte[1024] data;
211 	Whirlpool wp;
212 	wp.start();
213 	wp.put(data[]);
214 	wp.start();
215 	wp.put(data[]);
216 	ubyte[64] hash = wp.finish();
217 
218 	// Template API
219 
220 	ubyte[64] hash2 = whirlpoolOf("abc");
221 	assert(digest!Whirlpool("abc") == hash2);
222 	assert(hexDigest!Whirlpool("abc") == toHexString(hash2));
223 
224 	// OOP API
225 
226 	Digest wpDigest = new WhirlpoolDigest;
227 	ubyte[] hash3 = wpDigest.digest("abc");
228 	assert(toHexString(hash3) == "4E2448A4C6F486BB16B6562C73B4020BF3043E3A731BCE721AE1B303D97E6D4C"
229 		   ~ "7181EEBDB6C57E277D0E34957114CBD6C797FC9D95D8B582D225292076D4EEF5");
230 }
231 
232 @safe pure nothrow /*@nogc*/ unittest {
233 	static assert(isDigest!Whirlpool);
234 
235 	assert(digest!Whirlpool("The quick brown fox jumps over the lazy dog")
236 		   == hexString!"B97DE512E91E3828B40D2B0FDCE9CEB3C4A71F9BEA8D88E75C4FA854DF36725F"
237 		   ~ hexString!"D2B52EB6544EDCACD6F8BEDDFEA403CB55AE31F03AD62A5EF54E42EE82C3FB35");
238 
239 	// ISO test vectors
240 
241 	assert(digest!Whirlpool("") == hexString!"19FA61D75522A4669B44E39C1D2E1726C530232130D407F89AFEE0964997F7A7"
242 		   ~ hexString!"3E83BE698B288FEBCF88E3E03C4F0757EA8964E59B63D93708B138CC42A66EB3");
243 
244 	assert(digest!Whirlpool("a") == hexString!"8ACA2602792AEC6F11A67206531FB7D7F0DFF59413145E6973C45001D0087B42"
245 		   ~ hexString!"D11BC645413AEFF63A42391A39145A591A92200D560195E53B478584FDAE231A");
246 
247 	assert(digest!Whirlpool("abc") == hexString!"4E2448A4C6F486BB16B6562C73B4020BF3043E3A731BCE721AE1B303D97E6D4C"
248 		   ~ hexString!"7181EEBDB6C57E277D0E34957114CBD6C797FC9D95D8B582D225292076D4EEF5");
249 
250 	assert(digest!Whirlpool("message digest") == hexString!"378C84A4126E2DC6E56DCC7458377AAC838D00032230F53CE1F5700C0FFB4D3B"
251 		   ~ hexString!"8421557659EF55C106B4B52AC5A4AAA692ED920052838F3362E86DBD37A8903E");
252 
253 	assert(digest!Whirlpool("abcdefghijklmnopqrstuvwxyz")
254 		   == hexString!"F1D754662636FFE92C82EBB9212A484A8D38631EAD4238F5442EE13B8054E41B"
255 		   ~ hexString!"08BF2A9251C30B6A0B8AAE86177AB4A6F68F673E7207865D5D9819A3DBA4EB3B");
256 
257 	assert(digest!Whirlpool("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
258 		   == hexString!"DC37E008CF9EE69BF11F00ED9ABA26901DD7C28CDEC066CC6AF42E40F82F3A1E"
259 		   ~ hexString!"08EBA26629129D8FB7CB57211B9281A65517CC879D7B962142C65F5A7AF01467");
260 
261 	assert(digest!Whirlpool("1234567890123456789012345678901234567890" ~ "1234567890123456789012345678901234567890")
262 		   == hexString!"466EF18BABB0154D25B9D38A6414F5C08784372BCCB204D6549C4AFADB601429"
263 		   ~ hexString!"4D5BD8DF2A6C44E538CD047B2681A51A2C60481E88C5A20B2C2A80CF3A9A083B");
264 
265 	assert(digest!Whirlpool("abcdbcdecdefdefgefghfghighijhijk")
266 		   == hexString!"2A987EA40F917061F5D6F0A0E4644F488A7A5A52DEEE656207C562F988E95C69"
267 		   ~ hexString!"16BDC8031BC5BE1B7B947639FE050B56939BAAA0ADFF9AE6745B7B181C3BE3FD");
268 }
269 
270 pure nothrow /*@nogc*/ unittest {
271 	import std.range : repeat;
272 
273 	assert(digest!Whirlpool(repeat('a',
274 								   10 ^^ 6)) == hexString!"0C99005BEB57EFF50A7CF005560DDF5D29057FD86B20BFD62DECA0F1CCEA4AF5"
275 		   ~ hexString!"1FC15490EDDC47AF32BB2B66C34FF9AD8C6008AD677F77126953B226E4ED8B01");
276 }
277 
278 @trusted pure nothrow /*@nogc*/ unittest {
279 	Whirlpool wp;
280 	wp.put(cast(ubyte[])("abc"));
281 	wp.start();
282 	wp.put(cast(ubyte[])("abc"));
283 	assert(wp.finish() == hexString!"4E2448A4C6F486BB16B6562C73B4020BF3043E3A731BCE721AE1B303D97E6D4C"
284 		   ~ hexString!"7181EEBDB6C57E277D0E34957114CBD6C797FC9D95D8B582D225292076D4EEF5");
285 }
286 
287 private:
288 
289 string genTransform(string assignTo, string from) {
290 	import std.string : format;
291 
292 	string ret;
293 	foreach (i; 0 .. 8) {
294 		ret ~= format("%s[%s]=", assignTo, i);
295 		for (int t = 0, s = 56; t < 8; t++, s -= 8) {
296 			ret ~= format("C[%s][(%s[%s] >> %s) & 0xFF]", t, from, (i - t) & 7, s);
297 			if (t != 7)
298 				ret ~= "^";
299 		}
300 		ret ~= ";\n";
301 	}
302 	return ret;
303 }
304 
305 // number of rounds
306 enum int numRounds = 10;
307 
308 // circulant table
309 immutable ulong[256][8] C = [
310 	[
311 		0x18186018c07830d8UL, 0x23238c2305af4626UL, 0xc6c63fc67ef991b8UL,
312 		0xe8e887e8136fcdfbUL, 0x878726874ca113cbUL, 0xb8b8dab8a9626d11UL,
313 		0x0101040108050209UL, 0x4f4f214f426e9e0dUL, 0x3636d836adee6c9bUL,
314 		0xa6a6a2a6590451ffUL,
315 		0xd2d26fd2debdb90cUL, 0xf5f5f3f5fb06f70eUL, 0x7979f979ef80f296UL,
316 		0x6f6fa16f5fcede30UL, 0x91917e91fcef3f6dUL, 0x52525552aa07a4f8UL,
317 		0x60609d6027fdc047UL, 0xbcbccabc89766535UL, 0x9b9b569baccd2b37UL,
318 		0x8e8e028e048c018aUL, 0xa3a3b6a371155bd2UL, 0x0c0c300c603c186cUL,
319 		0x7b7bf17bff8af684UL,
320 		0x3535d435b5e16a80UL,
321 		0x1d1d741de8693af5UL, 0xe0e0a7e05347ddb3UL, 0xd7d77bd7f6acb321UL,
322 		0xc2c22fc25eed999cUL, 0x2e2eb82e6d965c43UL, 0x4b4b314b627a9629UL,
323 		0xfefedffea321e15dUL, 0x575741578216aed5UL, 0x15155415a8412abdUL,
324 		0x7777c1779fb6eee8UL, 0x3737dc37a5eb6e92UL, 0xe5e5b3e57b56d79eUL,
325 		0x9f9f469f8cd92313UL,
326 		0xf0f0e7f0d317fd23UL,
327 		0x4a4a354a6a7f9420UL, 0xdada4fda9e95a944UL, 0x58587d58fa25b0a2UL,
328 		0xc9c903c906ca8fcfUL, 0x2929a429558d527cUL, 0x0a0a280a5022145aUL,
329 		0xb1b1feb1e14f7f50UL, 0xa0a0baa0691a5dc9UL, 0x6b6bb16b7fdad614UL,
330 		0x85852e855cab17d9UL, 0xbdbdcebd8173673cUL, 0x5d5d695dd234ba8fUL,
331 		0x1010401080502090UL,
332 		0xf4f4f7f4f303f507UL,
333 		0xcbcb0bcb16c08bddUL, 0x3e3ef83eedc67cd3UL, 0x0505140528110a2dUL,
334 		0x676781671fe6ce78UL, 0xe4e4b7e47353d597UL, 0x27279c2725bb4e02UL,
335 		0x4141194132588273UL, 0x8b8b168b2c9d0ba7UL, 0xa7a7a6a7510153f6UL,
336 		0x7d7de97dcf94fab2UL, 0x95956e95dcfb3749UL, 0xd8d847d88e9fad56UL,
337 		0xfbfbcbfb8b30eb70UL,
338 		0xeeee9fee2371c1cdUL,
339 		0x7c7ced7cc791f8bbUL, 0x6666856617e3cc71UL, 0xdddd53dda68ea77bUL,
340 		0x17175c17b84b2eafUL, 0x4747014702468e45UL, 0x9e9e429e84dc211aUL,
341 		0xcaca0fca1ec589d4UL, 0x2d2db42d75995a58UL, 0xbfbfc6bf9179632eUL,
342 		0x07071c07381b0e3fUL, 0xadad8ead012347acUL, 0x5a5a755aea2fb4b0UL,
343 		0x838336836cb51befUL,
344 		0x3333cc3385ff66b6UL,
345 		0x636391633ff2c65cUL, 0x02020802100a0412UL, 0xaaaa92aa39384993UL,
346 		0x7171d971afa8e2deUL, 0xc8c807c80ecf8dc6UL, 0x19196419c87d32d1UL,
347 		0x494939497270923bUL, 0xd9d943d9869aaf5fUL, 0xf2f2eff2c31df931UL,
348 		0xe3e3abe34b48dba8UL, 0x5b5b715be22ab6b9UL, 0x88881a8834920dbcUL,
349 		0x9a9a529aa4c8293eUL,
350 		0x262698262dbe4c0bUL,
351 		0x3232c8328dfa64bfUL, 0xb0b0fab0e94a7d59UL, 0xe9e983e91b6acff2UL,
352 		0x0f0f3c0f78331e77UL, 0xd5d573d5e6a6b733UL, 0x80803a8074ba1df4UL,
353 		0xbebec2be997c6127UL, 0xcdcd13cd26de87ebUL, 0x3434d034bde46889UL,
354 		0x48483d487a759032UL, 0xffffdbffab24e354UL, 0x7a7af57af78ff48dUL,
355 		0x90907a90f4ea3d64UL,
356 		0x5f5f615fc23ebe9dUL,
357 		0x202080201da0403dUL, 0x6868bd6867d5d00fUL, 0x1a1a681ad07234caUL,
358 		0xaeae82ae192c41b7UL, 0xb4b4eab4c95e757dUL, 0x54544d549a19a8ceUL,
359 		0x93937693ece53b7fUL, 0x222288220daa442fUL, 0x64648d6407e9c863UL,
360 		0xf1f1e3f1db12ff2aUL, 0x7373d173bfa2e6ccUL, 0x12124812905a2482UL,
361 		0x40401d403a5d807aUL,
362 		0x0808200840281048UL,
363 		0xc3c32bc356e89b95UL, 0xecec97ec337bc5dfUL, 0xdbdb4bdb9690ab4dUL,
364 		0xa1a1bea1611f5fc0UL, 0x8d8d0e8d1c830791UL, 0x3d3df43df5c97ac8UL,
365 		0x97976697ccf1335bUL, 0x0000000000000000UL, 0xcfcf1bcf36d483f9UL,
366 		0x2b2bac2b4587566eUL, 0x7676c57697b3ece1UL, 0x8282328264b019e6UL,
367 		0xd6d67fd6fea9b128UL,
368 		0x1b1b6c1bd87736c3UL,
369 		0xb5b5eeb5c15b7774UL, 0xafaf86af112943beUL, 0x6a6ab56a77dfd41dUL,
370 		0x50505d50ba0da0eaUL, 0x45450945124c8a57UL, 0xf3f3ebf3cb18fb38UL,
371 		0x3030c0309df060adUL, 0xefef9bef2b74c3c4UL, 0x3f3ffc3fe5c37edaUL,
372 		0x55554955921caac7UL, 0xa2a2b2a2791059dbUL, 0xeaea8fea0365c9e9UL,
373 		0x656589650fecca6aUL,
374 		0xbabad2bab9686903UL,
375 		0x2f2fbc2f65935e4aUL, 0xc0c027c04ee79d8eUL, 0xdede5fdebe81a160UL,
376 		0x1c1c701ce06c38fcUL, 0xfdfdd3fdbb2ee746UL, 0x4d4d294d52649a1fUL,
377 		0x92927292e4e03976UL, 0x7575c9758fbceafaUL, 0x06061806301e0c36UL,
378 		0x8a8a128a249809aeUL, 0xb2b2f2b2f940794bUL, 0xe6e6bfe66359d185UL,
379 		0x0e0e380e70361c7eUL,
380 		0x1f1f7c1ff8633ee7UL,
381 		0x6262956237f7c455UL, 0xd4d477d4eea3b53aUL, 0xa8a89aa829324d81UL,
382 		0x96966296c4f43152UL, 0xf9f9c3f99b3aef62UL, 0xc5c533c566f697a3UL,
383 		0x2525942535b14a10UL, 0x59597959f220b2abUL, 0x84842a8454ae15d0UL,
384 		0x7272d572b7a7e4c5UL, 0x3939e439d5dd72ecUL, 0x4c4c2d4c5a619816UL,
385 		0x5e5e655eca3bbc94UL,
386 		0x7878fd78e785f09fUL,
387 		0x3838e038ddd870e5UL, 0x8c8c0a8c14860598UL, 0xd1d163d1c6b2bf17UL,
388 		0xa5a5aea5410b57e4UL, 0xe2e2afe2434dd9a1UL, 0x616199612ff8c24eUL,
389 		0xb3b3f6b3f1457b42UL, 0x2121842115a54234UL, 0x9c9c4a9c94d62508UL,
390 		0x1e1e781ef0663ceeUL, 0x4343114322528661UL, 0xc7c73bc776fc93b1UL,
391 		0xfcfcd7fcb32be54fUL,
392 		0x0404100420140824UL,
393 		0x51515951b208a2e3UL, 0x99995e99bcc72f25UL, 0x6d6da96d4fc4da22UL,
394 		0x0d0d340d68391a65UL, 0xfafacffa8335e979UL, 0xdfdf5bdfb684a369UL,
395 		0x7e7ee57ed79bfca9UL, 0x242490243db44819UL, 0x3b3bec3bc5d776feUL,
396 		0xabab96ab313d4b9aUL, 0xcece1fce3ed181f0UL, 0x1111441188552299UL,
397 		0x8f8f068f0c890383UL,
398 		0x4e4e254e4a6b9c04UL,
399 		0xb7b7e6b7d1517366UL, 0xebeb8beb0b60cbe0UL, 0x3c3cf03cfdcc78c1UL,
400 		0x81813e817cbf1ffdUL, 0x94946a94d4fe3540UL, 0xf7f7fbf7eb0cf31cUL,
401 		0xb9b9deb9a1676f18UL, 0x13134c13985f268bUL, 0x2c2cb02c7d9c5851UL,
402 		0xd3d36bd3d6b8bb05UL, 0xe7e7bbe76b5cd38cUL, 0x6e6ea56e57cbdc39UL,
403 		0xc4c437c46ef395aaUL,
404 		0x03030c03180f061bUL,
405 		0x565645568a13acdcUL, 0x44440d441a49885eUL, 0x7f7fe17fdf9efea0UL,
406 		0xa9a99ea921374f88UL, 0x2a2aa82a4d825467UL, 0xbbbbd6bbb16d6b0aUL,
407 		0xc1c123c146e29f87UL, 0x53535153a202a6f1UL, 0xdcdc57dcae8ba572UL,
408 		0x0b0b2c0b58271653UL, 0x9d9d4e9d9cd32701UL, 0x6c6cad6c47c1d82bUL,
409 		0x3131c43195f562a4UL,
410 		0x7474cd7487b9e8f3UL,
411 		0xf6f6fff6e309f115UL, 0x464605460a438c4cUL, 0xacac8aac092645a5UL,
412 		0x89891e893c970fb5UL, 0x14145014a04428b4UL, 0xe1e1a3e15b42dfbaUL,
413 		0x16165816b04e2ca6UL, 0x3a3ae83acdd274f7UL, 0x6969b9696fd0d206UL,
414 		0x09092409482d1241UL, 0x7070dd70a7ade0d7UL, 0xb6b6e2b6d954716fUL,
415 		0xd0d067d0ceb7bd1eUL,
416 		0xeded93ed3b7ec7d6UL,
417 		0xcccc17cc2edb85e2UL, 0x424215422a578468UL, 0x98985a98b4c22d2cUL,
418 		0xa4a4aaa4490e55edUL, 0x2828a0285d885075UL, 0x5c5c6d5cda31b886UL,
419 		0xf8f8c7f8933fed6bUL, 0x8686228644a411c2UL,
420 		], [
421 			0xd818186018c07830UL, 0x2623238c2305af46UL, 0xb8c6c63fc67ef991UL,
422 			0xfbe8e887e8136fcdUL, 0xcb878726874ca113UL, 0x11b8b8dab8a9626dUL,
423 			0x0901010401080502UL, 0x0d4f4f214f426e9eUL, 0x9b3636d836adee6cUL,
424 			0xffa6a6a2a6590451UL,
425 			0x0cd2d26fd2debdb9UL, 0x0ef5f5f3f5fb06f7UL, 0x967979f979ef80f2UL,
426 			0x306f6fa16f5fcedeUL, 0x6d91917e91fcef3fUL, 0xf852525552aa07a4UL,
427 			0x4760609d6027fdc0UL, 0x35bcbccabc897665UL, 0x379b9b569baccd2bUL,
428 			0x8a8e8e028e048c01UL, 0xd2a3a3b6a371155bUL, 0x6c0c0c300c603c18UL,
429 			0x847b7bf17bff8af6UL,
430 			0x803535d435b5e16aUL,
431 			0xf51d1d741de8693aUL, 0xb3e0e0a7e05347ddUL, 0x21d7d77bd7f6acb3UL,
432 			0x9cc2c22fc25eed99UL, 0x432e2eb82e6d965cUL, 0x294b4b314b627a96UL,
433 			0x5dfefedffea321e1UL, 0xd5575741578216aeUL, 0xbd15155415a8412aUL,
434 			0xe87777c1779fb6eeUL, 0x923737dc37a5eb6eUL, 0x9ee5e5b3e57b56d7UL,
435 			0x139f9f469f8cd923UL,
436 			0x23f0f0e7f0d317fdUL,
437 			0x204a4a354a6a7f94UL, 0x44dada4fda9e95a9UL, 0xa258587d58fa25b0UL,
438 			0xcfc9c903c906ca8fUL, 0x7c2929a429558d52UL, 0x5a0a0a280a502214UL,
439 			0x50b1b1feb1e14f7fUL, 0xc9a0a0baa0691a5dUL, 0x146b6bb16b7fdad6UL,
440 			0xd985852e855cab17UL, 0x3cbdbdcebd817367UL, 0x8f5d5d695dd234baUL,
441 			0x9010104010805020UL,
442 			0x07f4f4f7f4f303f5UL,
443 			0xddcbcb0bcb16c08bUL, 0xd33e3ef83eedc67cUL, 0x2d0505140528110aUL,
444 			0x78676781671fe6ceUL, 0x97e4e4b7e47353d5UL, 0x0227279c2725bb4eUL,
445 			0x7341411941325882UL, 0xa78b8b168b2c9d0bUL, 0xf6a7a7a6a7510153UL,
446 			0xb27d7de97dcf94faUL, 0x4995956e95dcfb37UL, 0x56d8d847d88e9fadUL,
447 			0x70fbfbcbfb8b30ebUL,
448 			0xcdeeee9fee2371c1UL,
449 			0xbb7c7ced7cc791f8UL, 0x716666856617e3ccUL, 0x7bdddd53dda68ea7UL,
450 			0xaf17175c17b84b2eUL, 0x454747014702468eUL, 0x1a9e9e429e84dc21UL,
451 			0xd4caca0fca1ec589UL, 0x582d2db42d75995aUL, 0x2ebfbfc6bf917963UL,
452 			0x3f07071c07381b0eUL, 0xacadad8ead012347UL, 0xb05a5a755aea2fb4UL,
453 			0xef838336836cb51bUL,
454 			0xb63333cc3385ff66UL,
455 			0x5c636391633ff2c6UL, 0x1202020802100a04UL, 0x93aaaa92aa393849UL,
456 			0xde7171d971afa8e2UL, 0xc6c8c807c80ecf8dUL, 0xd119196419c87d32UL,
457 			0x3b49493949727092UL, 0x5fd9d943d9869aafUL, 0x31f2f2eff2c31df9UL,
458 			0xa8e3e3abe34b48dbUL, 0xb95b5b715be22ab6UL, 0xbc88881a8834920dUL,
459 			0x3e9a9a529aa4c829UL,
460 			0x0b262698262dbe4cUL,
461 			0xbf3232c8328dfa64UL, 0x59b0b0fab0e94a7dUL, 0xf2e9e983e91b6acfUL,
462 			0x770f0f3c0f78331eUL, 0x33d5d573d5e6a6b7UL, 0xf480803a8074ba1dUL,
463 			0x27bebec2be997c61UL, 0xebcdcd13cd26de87UL, 0x893434d034bde468UL,
464 			0x3248483d487a7590UL, 0x54ffffdbffab24e3UL, 0x8d7a7af57af78ff4UL,
465 			0x6490907a90f4ea3dUL,
466 			0x9d5f5f615fc23ebeUL,
467 			0x3d202080201da040UL, 0x0f6868bd6867d5d0UL, 0xca1a1a681ad07234UL,
468 			0xb7aeae82ae192c41UL, 0x7db4b4eab4c95e75UL, 0xce54544d549a19a8UL,
469 			0x7f93937693ece53bUL, 0x2f222288220daa44UL, 0x6364648d6407e9c8UL,
470 			0x2af1f1e3f1db12ffUL, 0xcc7373d173bfa2e6UL, 0x8212124812905a24UL,
471 			0x7a40401d403a5d80UL,
472 			0x4808082008402810UL,
473 			0x95c3c32bc356e89bUL, 0xdfecec97ec337bc5UL, 0x4ddbdb4bdb9690abUL,
474 			0xc0a1a1bea1611f5fUL, 0x918d8d0e8d1c8307UL, 0xc83d3df43df5c97aUL,
475 			0x5b97976697ccf133UL, 0x0000000000000000UL, 0xf9cfcf1bcf36d483UL,
476 			0x6e2b2bac2b458756UL, 0xe17676c57697b3ecUL, 0xe68282328264b019UL,
477 			0x28d6d67fd6fea9b1UL,
478 			0xc31b1b6c1bd87736UL,
479 			0x74b5b5eeb5c15b77UL, 0xbeafaf86af112943UL, 0x1d6a6ab56a77dfd4UL,
480 			0xea50505d50ba0da0UL, 0x5745450945124c8aUL, 0x38f3f3ebf3cb18fbUL,
481 			0xad3030c0309df060UL, 0xc4efef9bef2b74c3UL, 0xda3f3ffc3fe5c37eUL,
482 			0xc755554955921caaUL, 0xdba2a2b2a2791059UL, 0xe9eaea8fea0365c9UL,
483 			0x6a656589650feccaUL,
484 			0x03babad2bab96869UL,
485 			0x4a2f2fbc2f65935eUL, 0x8ec0c027c04ee79dUL, 0x60dede5fdebe81a1UL,
486 			0xfc1c1c701ce06c38UL, 0x46fdfdd3fdbb2ee7UL, 0x1f4d4d294d52649aUL,
487 			0x7692927292e4e039UL, 0xfa7575c9758fbceaUL, 0x3606061806301e0cUL,
488 			0xae8a8a128a249809UL, 0x4bb2b2f2b2f94079UL, 0x85e6e6bfe66359d1UL,
489 			0x7e0e0e380e70361cUL,
490 			0xe71f1f7c1ff8633eUL,
491 			0x556262956237f7c4UL, 0x3ad4d477d4eea3b5UL, 0x81a8a89aa829324dUL,
492 			0x5296966296c4f431UL, 0x62f9f9c3f99b3aefUL, 0xa3c5c533c566f697UL,
493 			0x102525942535b14aUL, 0xab59597959f220b2UL, 0xd084842a8454ae15UL,
494 			0xc57272d572b7a7e4UL, 0xec3939e439d5dd72UL, 0x164c4c2d4c5a6198UL,
495 			0x945e5e655eca3bbcUL,
496 			0x9f7878fd78e785f0UL,
497 			0xe53838e038ddd870UL, 0x988c8c0a8c148605UL, 0x17d1d163d1c6b2bfUL,
498 			0xe4a5a5aea5410b57UL, 0xa1e2e2afe2434dd9UL, 0x4e616199612ff8c2UL,
499 			0x42b3b3f6b3f1457bUL, 0x342121842115a542UL, 0x089c9c4a9c94d625UL,
500 			0xee1e1e781ef0663cUL, 0x6143431143225286UL, 0xb1c7c73bc776fc93UL,
501 			0x4ffcfcd7fcb32be5UL,
502 			0x2404041004201408UL,
503 			0xe351515951b208a2UL, 0x2599995e99bcc72fUL, 0x226d6da96d4fc4daUL,
504 			0x650d0d340d68391aUL, 0x79fafacffa8335e9UL, 0x69dfdf5bdfb684a3UL,
505 			0xa97e7ee57ed79bfcUL, 0x19242490243db448UL, 0xfe3b3bec3bc5d776UL,
506 			0x9aabab96ab313d4bUL, 0xf0cece1fce3ed181UL, 0x9911114411885522UL,
507 			0x838f8f068f0c8903UL,
508 			0x044e4e254e4a6b9cUL,
509 			0x66b7b7e6b7d15173UL, 0xe0ebeb8beb0b60cbUL, 0xc13c3cf03cfdcc78UL,
510 			0xfd81813e817cbf1fUL, 0x4094946a94d4fe35UL, 0x1cf7f7fbf7eb0cf3UL,
511 			0x18b9b9deb9a1676fUL, 0x8b13134c13985f26UL, 0x512c2cb02c7d9c58UL,
512 			0x05d3d36bd3d6b8bbUL, 0x8ce7e7bbe76b5cd3UL, 0x396e6ea56e57cbdcUL,
513 			0xaac4c437c46ef395UL,
514 			0x1b03030c03180f06UL,
515 			0xdc565645568a13acUL, 0x5e44440d441a4988UL, 0xa07f7fe17fdf9efeUL,
516 			0x88a9a99ea921374fUL, 0x672a2aa82a4d8254UL, 0x0abbbbd6bbb16d6bUL,
517 			0x87c1c123c146e29fUL, 0xf153535153a202a6UL, 0x72dcdc57dcae8ba5UL,
518 			0x530b0b2c0b582716UL, 0x019d9d4e9d9cd327UL, 0x2b6c6cad6c47c1d8UL,
519 			0xa43131c43195f562UL,
520 			0xf37474cd7487b9e8UL,
521 			0x15f6f6fff6e309f1UL, 0x4c464605460a438cUL, 0xa5acac8aac092645UL,
522 			0xb589891e893c970fUL, 0xb414145014a04428UL, 0xbae1e1a3e15b42dfUL,
523 			0xa616165816b04e2cUL, 0xf73a3ae83acdd274UL, 0x066969b9696fd0d2UL,
524 			0x4109092409482d12UL, 0xd77070dd70a7ade0UL, 0x6fb6b6e2b6d95471UL,
525 			0x1ed0d067d0ceb7bdUL,
526 			0xd6eded93ed3b7ec7UL,
527 			0xe2cccc17cc2edb85UL, 0x68424215422a5784UL, 0x2c98985a98b4c22dUL,
528 			0xeda4a4aaa4490e55UL, 0x752828a0285d8850UL, 0x865c5c6d5cda31b8UL,
529 			0x6bf8f8c7f8933fedUL, 0xc28686228644a411UL,
530 			], [
531 				0x30d818186018c078UL, 0x462623238c2305afUL, 0x91b8c6c63fc67ef9UL,
532 				0xcdfbe8e887e8136fUL, 0x13cb878726874ca1UL, 0x6d11b8b8dab8a962UL,
533 				0x0209010104010805UL, 0x9e0d4f4f214f426eUL, 0x6c9b3636d836adeeUL,
534 				0x51ffa6a6a2a65904UL,
535 				0xb90cd2d26fd2debdUL, 0xf70ef5f5f3f5fb06UL, 0xf2967979f979ef80UL,
536 				0xde306f6fa16f5fceUL, 0x3f6d91917e91fcefUL, 0xa4f852525552aa07UL,
537 				0xc04760609d6027fdUL, 0x6535bcbccabc8976UL, 0x2b379b9b569baccdUL,
538 	0x018a8e8e028e048cUL, 0x5bd2a3a3b6a37115UL, 0x186c0c0c300c603cUL,
539 	0xf6847b7bf17bff8aUL,
540 	0x6a803535d435b5e1UL,
541 	0x3af51d1d741de869UL, 0xddb3e0e0a7e05347UL, 0xb321d7d77bd7f6acUL,
542 	0x999cc2c22fc25eedUL, 0x5c432e2eb82e6d96UL, 0x96294b4b314b627aUL,
543 	0xe15dfefedffea321UL, 0xaed5575741578216UL, 0x2abd15155415a841UL,
544 	0xeee87777c1779fb6UL, 0x6e923737dc37a5ebUL, 0xd79ee5e5b3e57b56UL,
545 	0x23139f9f469f8cd9UL,
546 	0xfd23f0f0e7f0d317UL,
547 	0x94204a4a354a6a7fUL, 0xa944dada4fda9e95UL, 0xb0a258587d58fa25UL,
548 	0x8fcfc9c903c906caUL, 0x527c2929a429558dUL, 0x145a0a0a280a5022UL,
549 	0x7f50b1b1feb1e14fUL, 0x5dc9a0a0baa0691aUL, 0xd6146b6bb16b7fdaUL,
550 	0x17d985852e855cabUL, 0x673cbdbdcebd8173UL, 0xba8f5d5d695dd234UL,
551 	0x2090101040108050UL,
552 	0xf507f4f4f7f4f303UL,
553 	0x8bddcbcb0bcb16c0UL, 0x7cd33e3ef83eedc6UL, 0x0a2d050514052811UL,
554 	0xce78676781671fe6UL, 0xd597e4e4b7e47353UL, 0x4e0227279c2725bbUL,
555 	0x8273414119413258UL, 0x0ba78b8b168b2c9dUL, 0x53f6a7a7a6a75101UL,
556 	0xfab27d7de97dcf94UL, 0x374995956e95dcfbUL, 0xad56d8d847d88e9fUL,
557 	0xeb70fbfbcbfb8b30UL,
558 	0xc1cdeeee9fee2371UL,
559 	0xf8bb7c7ced7cc791UL, 0xcc716666856617e3UL, 0xa77bdddd53dda68eUL,
560 	0x2eaf17175c17b84bUL, 0x8e45474701470246UL, 0x211a9e9e429e84dcUL,
561 	0x89d4caca0fca1ec5UL, 0x5a582d2db42d7599UL, 0x632ebfbfc6bf9179UL,
562 	0x0e3f07071c07381bUL, 0x47acadad8ead0123UL, 0xb4b05a5a755aea2fUL,
563 	0x1bef838336836cb5UL,
564 	0x66b63333cc3385ffUL,
565 	0xc65c636391633ff2UL, 0x041202020802100aUL, 0x4993aaaa92aa3938UL,
566 	0xe2de7171d971afa8UL, 0x8dc6c8c807c80ecfUL, 0x32d119196419c87dUL,
567 	0x923b494939497270UL, 0xaf5fd9d943d9869aUL, 0xf931f2f2eff2c31dUL,
568 	0xdba8e3e3abe34b48UL, 0xb6b95b5b715be22aUL, 0x0dbc88881a883492UL,
569 	0x293e9a9a529aa4c8UL,
570 	0x4c0b262698262dbeUL,
571 	0x64bf3232c8328dfaUL, 0x7d59b0b0fab0e94aUL, 0xcff2e9e983e91b6aUL,
572 	0x1e770f0f3c0f7833UL, 0xb733d5d573d5e6a6UL, 0x1df480803a8074baUL,
573 	0x6127bebec2be997cUL, 0x87ebcdcd13cd26deUL, 0x68893434d034bde4UL,
574 	0x903248483d487a75UL, 0xe354ffffdbffab24UL, 0xf48d7a7af57af78fUL,
575 	0x3d6490907a90f4eaUL,
576 	0xbe9d5f5f615fc23eUL,
577 	0x403d202080201da0UL, 0xd00f6868bd6867d5UL, 0x34ca1a1a681ad072UL,
578 	0x41b7aeae82ae192cUL, 0x757db4b4eab4c95eUL, 0xa8ce54544d549a19UL,
579 	0x3b7f93937693ece5UL, 0x442f222288220daaUL, 0xc86364648d6407e9UL,
580 	0xff2af1f1e3f1db12UL, 0xe6cc7373d173bfa2UL, 0x248212124812905aUL,
581 	0x807a40401d403a5dUL,
582 	0x1048080820084028UL,
583 	0x9b95c3c32bc356e8UL, 0xc5dfecec97ec337bUL, 0xab4ddbdb4bdb9690UL,
584 	0x5fc0a1a1bea1611fUL, 0x07918d8d0e8d1c83UL, 0x7ac83d3df43df5c9UL,
585 	0x335b97976697ccf1UL, 0x0000000000000000UL, 0x83f9cfcf1bcf36d4UL,
586 	0x566e2b2bac2b4587UL, 0xece17676c57697b3UL, 0x19e68282328264b0UL,
587 	0xb128d6d67fd6fea9UL,
588 	0x36c31b1b6c1bd877UL,
589 	0x7774b5b5eeb5c15bUL, 0x43beafaf86af1129UL, 0xd41d6a6ab56a77dfUL,
590 	0xa0ea50505d50ba0dUL, 0x8a5745450945124cUL, 0xfb38f3f3ebf3cb18UL,
591 	0x60ad3030c0309df0UL, 0xc3c4efef9bef2b74UL, 0x7eda3f3ffc3fe5c3UL,
592 	0xaac755554955921cUL, 0x59dba2a2b2a27910UL, 0xc9e9eaea8fea0365UL,
593 	0xca6a656589650fecUL,
594 	0x6903babad2bab968UL,
595 	0x5e4a2f2fbc2f6593UL, 0x9d8ec0c027c04ee7UL, 0xa160dede5fdebe81UL,
596 	0x38fc1c1c701ce06cUL, 0xe746fdfdd3fdbb2eUL, 0x9a1f4d4d294d5264UL,
597 	0x397692927292e4e0UL, 0xeafa7575c9758fbcUL, 0x0c3606061806301eUL,
598 	0x09ae8a8a128a2498UL, 0x794bb2b2f2b2f940UL, 0xd185e6e6bfe66359UL,
599 	0x1c7e0e0e380e7036UL,
600 	0x3ee71f1f7c1ff863UL,
601 	0xc4556262956237f7UL, 0xb53ad4d477d4eea3UL, 0x4d81a8a89aa82932UL,
602 	0x315296966296c4f4UL, 0xef62f9f9c3f99b3aUL, 0x97a3c5c533c566f6UL,
603 	0x4a102525942535b1UL, 0xb2ab59597959f220UL, 0x15d084842a8454aeUL,
604 	0xe4c57272d572b7a7UL, 0x72ec3939e439d5ddUL, 0x98164c4c2d4c5a61UL,
605 	0xbc945e5e655eca3bUL,
606 	0xf09f7878fd78e785UL,
607 	0x70e53838e038ddd8UL, 0x05988c8c0a8c1486UL, 0xbf17d1d163d1c6b2UL,
608 	0x57e4a5a5aea5410bUL, 0xd9a1e2e2afe2434dUL, 0xc24e616199612ff8UL,
609 	0x7b42b3b3f6b3f145UL, 0x42342121842115a5UL, 0x25089c9c4a9c94d6UL,
610 	0x3cee1e1e781ef066UL, 0x8661434311432252UL, 0x93b1c7c73bc776fcUL,
611 	0xe54ffcfcd7fcb32bUL,
612 	0x0824040410042014UL,
613 	0xa2e351515951b208UL, 0x2f2599995e99bcc7UL, 0xda226d6da96d4fc4UL,
614 	0x1a650d0d340d6839UL, 0xe979fafacffa8335UL, 0xa369dfdf5bdfb684UL,
615 	0xfca97e7ee57ed79bUL, 0x4819242490243db4UL, 0x76fe3b3bec3bc5d7UL,
616 	0x4b9aabab96ab313dUL, 0x81f0cece1fce3ed1UL, 0x2299111144118855UL,
617 	0x03838f8f068f0c89UL,
618 	0x9c044e4e254e4a6bUL,
619 	0x7366b7b7e6b7d151UL, 0xcbe0ebeb8beb0b60UL, 0x78c13c3cf03cfdccUL,
620 	0x1ffd81813e817cbfUL, 0x354094946a94d4feUL, 0xf31cf7f7fbf7eb0cUL,
621 	0x6f18b9b9deb9a167UL, 0x268b13134c13985fUL, 0x58512c2cb02c7d9cUL,
622 	0xbb05d3d36bd3d6b8UL, 0xd38ce7e7bbe76b5cUL, 0xdc396e6ea56e57cbUL,
623 	0x95aac4c437c46ef3UL,
624 	0x061b03030c03180fUL,
625 	0xacdc565645568a13UL, 0x885e44440d441a49UL, 0xfea07f7fe17fdf9eUL,
626 	0x4f88a9a99ea92137UL, 0x54672a2aa82a4d82UL, 0x6b0abbbbd6bbb16dUL,
627 	0x9f87c1c123c146e2UL, 0xa6f153535153a202UL, 0xa572dcdc57dcae8bUL,
628 	0x16530b0b2c0b5827UL, 0x27019d9d4e9d9cd3UL, 0xd82b6c6cad6c47c1UL,
629 	0x62a43131c43195f5UL,
630 	0xe8f37474cd7487b9UL,
631 	0xf115f6f6fff6e309UL, 0x8c4c464605460a43UL, 0x45a5acac8aac0926UL,
632 	0x0fb589891e893c97UL, 0x28b414145014a044UL, 0xdfbae1e1a3e15b42UL,
633 	0x2ca616165816b04eUL, 0x74f73a3ae83acdd2UL, 0xd2066969b9696fd0UL,
634 	0x124109092409482dUL, 0xe0d77070dd70a7adUL, 0x716fb6b6e2b6d954UL,
635 	0xbd1ed0d067d0ceb7UL,
636 	0xc7d6eded93ed3b7eUL,
637 	0x85e2cccc17cc2edbUL, 0x8468424215422a57UL, 0x2d2c98985a98b4c2UL,
638 	0x55eda4a4aaa4490eUL, 0x50752828a0285d88UL, 0xb8865c5c6d5cda31UL,
639 	0xed6bf8f8c7f8933fUL, 0x11c28686228644a4UL,
640 ], [
641 	0x7830d818186018c0UL, 0xaf462623238c2305UL, 0xf991b8c6c63fc67eUL,
642 	0x6fcdfbe8e887e813UL, 0xa113cb878726874cUL, 0x626d11b8b8dab8a9UL,
643 	0x0502090101040108UL, 0x6e9e0d4f4f214f42UL, 0xee6c9b3636d836adUL,
644 	0x0451ffa6a6a2a659UL,
645 	0xbdb90cd2d26fd2deUL, 0x06f70ef5f5f3f5fbUL, 0x80f2967979f979efUL,
646 	0xcede306f6fa16f5fUL, 0xef3f6d91917e91fcUL, 0x07a4f852525552aaUL,
647 	0xfdc04760609d6027UL, 0x766535bcbccabc89UL, 0xcd2b379b9b569bacUL,
648 	0x8c018a8e8e028e04UL, 0x155bd2a3a3b6a371UL, 0x3c186c0c0c300c60UL,
649 	0x8af6847b7bf17bffUL,
650 	0xe16a803535d435b5UL,
651 	0x693af51d1d741de8UL, 0x47ddb3e0e0a7e053UL, 0xacb321d7d77bd7f6UL,
652 	0xed999cc2c22fc25eUL, 0x965c432e2eb82e6dUL, 0x7a96294b4b314b62UL,
653 	0x21e15dfefedffea3UL, 0x16aed55757415782UL, 0x412abd15155415a8UL,
654 	0xb6eee87777c1779fUL, 0xeb6e923737dc37a5UL, 0x56d79ee5e5b3e57bUL,
655 	0xd923139f9f469f8cUL,
656 	0x17fd23f0f0e7f0d3UL,
657 	0x7f94204a4a354a6aUL, 0x95a944dada4fda9eUL, 0x25b0a258587d58faUL,
658 	0xca8fcfc9c903c906UL, 0x8d527c2929a42955UL, 0x22145a0a0a280a50UL,
659 	0x4f7f50b1b1feb1e1UL, 0x1a5dc9a0a0baa069UL, 0xdad6146b6bb16b7fUL,
660 	0xab17d985852e855cUL, 0x73673cbdbdcebd81UL, 0x34ba8f5d5d695dd2UL,
661 	0x5020901010401080UL,
662 	0x03f507f4f4f7f4f3UL,
663 	0xc08bddcbcb0bcb16UL, 0xc67cd33e3ef83eedUL, 0x110a2d0505140528UL,
664 	0xe6ce78676781671fUL, 0x53d597e4e4b7e473UL, 0xbb4e0227279c2725UL,
665 	0x5882734141194132UL, 0x9d0ba78b8b168b2cUL, 0x0153f6a7a7a6a751UL,
666 	0x94fab27d7de97dcfUL, 0xfb374995956e95dcUL, 0x9fad56d8d847d88eUL,
667 	0x30eb70fbfbcbfb8bUL,
668 	0x71c1cdeeee9fee23UL,
669 	0x91f8bb7c7ced7cc7UL, 0xe3cc716666856617UL, 0x8ea77bdddd53dda6UL,
670 	0x4b2eaf17175c17b8UL, 0x468e454747014702UL, 0xdc211a9e9e429e84UL,
671 	0xc589d4caca0fca1eUL, 0x995a582d2db42d75UL, 0x79632ebfbfc6bf91UL,
672 	0x1b0e3f07071c0738UL, 0x2347acadad8ead01UL, 0x2fb4b05a5a755aeaUL,
673 	0xb51bef838336836cUL,
674 	0xff66b63333cc3385UL,
675 	0xf2c65c636391633fUL, 0x0a04120202080210UL, 0x384993aaaa92aa39UL,
676 	0xa8e2de7171d971afUL, 0xcf8dc6c8c807c80eUL, 0x7d32d119196419c8UL,
677 	0x70923b4949394972UL, 0x9aaf5fd9d943d986UL, 0x1df931f2f2eff2c3UL,
678 	0x48dba8e3e3abe34bUL, 0x2ab6b95b5b715be2UL, 0x920dbc88881a8834UL,
679 	0xc8293e9a9a529aa4UL,
680 	0xbe4c0b262698262dUL,
681 	0xfa64bf3232c8328dUL, 0x4a7d59b0b0fab0e9UL, 0x6acff2e9e983e91bUL,
682 	0x331e770f0f3c0f78UL, 0xa6b733d5d573d5e6UL, 0xba1df480803a8074UL,
683 	0x7c6127bebec2be99UL, 0xde87ebcdcd13cd26UL, 0xe468893434d034bdUL,
684 	0x75903248483d487aUL, 0x24e354ffffdbffabUL, 0x8ff48d7a7af57af7UL,
685 	0xea3d6490907a90f4UL,
686 	0x3ebe9d5f5f615fc2UL,
687 	0xa0403d202080201dUL, 0xd5d00f6868bd6867UL, 0x7234ca1a1a681ad0UL,
688 	0x2c41b7aeae82ae19UL, 0x5e757db4b4eab4c9UL, 0x19a8ce54544d549aUL,
689 	0xe53b7f93937693ecUL, 0xaa442f222288220dUL, 0xe9c86364648d6407UL,
690 	0x12ff2af1f1e3f1dbUL, 0xa2e6cc7373d173bfUL, 0x5a24821212481290UL,
691 	0x5d807a40401d403aUL,
692 	0x2810480808200840UL,
693 	0xe89b95c3c32bc356UL, 0x7bc5dfecec97ec33UL, 0x90ab4ddbdb4bdb96UL,
694 	0x1f5fc0a1a1bea161UL, 0x8307918d8d0e8d1cUL, 0xc97ac83d3df43df5UL,
695 	0xf1335b97976697ccUL, 0x0000000000000000UL, 0xd483f9cfcf1bcf36UL,
696 	0x87566e2b2bac2b45UL, 0xb3ece17676c57697UL, 0xb019e68282328264UL,
697 	0xa9b128d6d67fd6feUL,
698 	0x7736c31b1b6c1bd8UL,
699 	0x5b7774b5b5eeb5c1UL, 0x2943beafaf86af11UL, 0xdfd41d6a6ab56a77UL,
700 	0x0da0ea50505d50baUL, 0x4c8a574545094512UL, 0x18fb38f3f3ebf3cbUL,
701 	0xf060ad3030c0309dUL, 0x74c3c4efef9bef2bUL, 0xc37eda3f3ffc3fe5UL,
702 	0x1caac75555495592UL, 0x1059dba2a2b2a279UL, 0x65c9e9eaea8fea03UL,
703 	0xecca6a656589650fUL,
704 	0x686903babad2bab9UL,
705 	0x935e4a2f2fbc2f65UL, 0xe79d8ec0c027c04eUL, 0x81a160dede5fdebeUL,
706 	0x6c38fc1c1c701ce0UL, 0x2ee746fdfdd3fdbbUL, 0x649a1f4d4d294d52UL,
707 	0xe0397692927292e4UL, 0xbceafa7575c9758fUL, 0x1e0c360606180630UL,
708 	0x9809ae8a8a128a24UL, 0x40794bb2b2f2b2f9UL, 0x59d185e6e6bfe663UL,
709 	0x361c7e0e0e380e70UL,
710 	0x633ee71f1f7c1ff8UL,
711 	0xf7c4556262956237UL, 0xa3b53ad4d477d4eeUL, 0x324d81a8a89aa829UL,
712 	0xf4315296966296c4UL, 0x3aef62f9f9c3f99bUL, 0xf697a3c5c533c566UL,
713 	0xb14a102525942535UL, 0x20b2ab59597959f2UL, 0xae15d084842a8454UL,
714 	0xa7e4c57272d572b7UL, 0xdd72ec3939e439d5UL, 0x6198164c4c2d4c5aUL,
715 	0x3bbc945e5e655ecaUL,
716 	0x85f09f7878fd78e7UL,
717 	0xd870e53838e038ddUL, 0x8605988c8c0a8c14UL, 0xb2bf17d1d163d1c6UL,
718 	0x0b57e4a5a5aea541UL, 0x4dd9a1e2e2afe243UL, 0xf8c24e616199612fUL,
719 	0x457b42b3b3f6b3f1UL, 0xa542342121842115UL, 0xd625089c9c4a9c94UL,
720 	0x663cee1e1e781ef0UL, 0x5286614343114322UL, 0xfc93b1c7c73bc776UL,
721 	0x2be54ffcfcd7fcb3UL,
722 	0x1408240404100420UL,
723 	0x08a2e351515951b2UL, 0xc72f2599995e99bcUL, 0xc4da226d6da96d4fUL,
724 	0x391a650d0d340d68UL, 0x35e979fafacffa83UL, 0x84a369dfdf5bdfb6UL,
725 	0x9bfca97e7ee57ed7UL, 0xb44819242490243dUL, 0xd776fe3b3bec3bc5UL,
726 	0x3d4b9aabab96ab31UL, 0xd181f0cece1fce3eUL, 0x5522991111441188UL,
727 	0x8903838f8f068f0cUL,
728 	0x6b9c044e4e254e4aUL,
729 	0x517366b7b7e6b7d1UL, 0x60cbe0ebeb8beb0bUL, 0xcc78c13c3cf03cfdUL,
730 	0xbf1ffd81813e817cUL, 0xfe354094946a94d4UL, 0x0cf31cf7f7fbf7ebUL,
731 	0x676f18b9b9deb9a1UL, 0x5f268b13134c1398UL, 0x9c58512c2cb02c7dUL,
732 	0xb8bb05d3d36bd3d6UL, 0x5cd38ce7e7bbe76bUL, 0xcbdc396e6ea56e57UL,
733 	0xf395aac4c437c46eUL,
734 	0x0f061b03030c0318UL,
735 	0x13acdc565645568aUL, 0x49885e44440d441aUL, 0x9efea07f7fe17fdfUL,
736 	0x374f88a9a99ea921UL, 0x8254672a2aa82a4dUL, 0x6d6b0abbbbd6bbb1UL,
737 	0xe29f87c1c123c146UL, 0x02a6f153535153a2UL, 0x8ba572dcdc57dcaeUL,
738 	0x2716530b0b2c0b58UL, 0xd327019d9d4e9d9cUL, 0xc1d82b6c6cad6c47UL,
739 	0xf562a43131c43195UL,
740 	0xb9e8f37474cd7487UL,
741 	0x09f115f6f6fff6e3UL, 0x438c4c464605460aUL, 0x2645a5acac8aac09UL,
742 	0x970fb589891e893cUL, 0x4428b414145014a0UL, 0x42dfbae1e1a3e15bUL,
743 	0x4e2ca616165816b0UL, 0xd274f73a3ae83acdUL, 0xd0d2066969b9696fUL,
744 	0x2d12410909240948UL, 0xade0d77070dd70a7UL, 0x54716fb6b6e2b6d9UL,
745 	0xb7bd1ed0d067d0ceUL,
746 	0x7ec7d6eded93ed3bUL,
747 	0xdb85e2cccc17cc2eUL, 0x578468424215422aUL, 0xc22d2c98985a98b4UL,
748 	0x0e55eda4a4aaa449UL, 0x8850752828a0285dUL, 0x31b8865c5c6d5cdaUL,
749 	0x3fed6bf8f8c7f893UL, 0xa411c28686228644UL,
750 ], [
751 	0xc07830d818186018UL, 0x05af462623238c23UL, 0x7ef991b8c6c63fc6UL,
752 	0x136fcdfbe8e887e8UL, 0x4ca113cb87872687UL, 0xa9626d11b8b8dab8UL,
753 	0x0805020901010401UL, 0x426e9e0d4f4f214fUL, 0xadee6c9b3636d836UL,
754 	0x590451ffa6a6a2a6UL,
755 	0xdebdb90cd2d26fd2UL, 0xfb06f70ef5f5f3f5UL, 0xef80f2967979f979UL,
756 	0x5fcede306f6fa16fUL, 0xfcef3f6d91917e91UL, 0xaa07a4f852525552UL,
757 	0x27fdc04760609d60UL, 0x89766535bcbccabcUL, 0xaccd2b379b9b569bUL,
758 	0x048c018a8e8e028eUL, 0x71155bd2a3a3b6a3UL, 0x603c186c0c0c300cUL,
759 	0xff8af6847b7bf17bUL,
760 	0xb5e16a803535d435UL,
761 	0xe8693af51d1d741dUL, 0x5347ddb3e0e0a7e0UL, 0xf6acb321d7d77bd7UL,
762 	0x5eed999cc2c22fc2UL, 0x6d965c432e2eb82eUL, 0x627a96294b4b314bUL,
763 	0xa321e15dfefedffeUL, 0x8216aed557574157UL, 0xa8412abd15155415UL,
764 	0x9fb6eee87777c177UL, 0xa5eb6e923737dc37UL, 0x7b56d79ee5e5b3e5UL,
765 	0x8cd923139f9f469fUL,
766 	0xd317fd23f0f0e7f0UL,
767 	0x6a7f94204a4a354aUL, 0x9e95a944dada4fdaUL, 0xfa25b0a258587d58UL,
768 	0x06ca8fcfc9c903c9UL, 0x558d527c2929a429UL, 0x5022145a0a0a280aUL,
769 	0xe14f7f50b1b1feb1UL, 0x691a5dc9a0a0baa0UL, 0x7fdad6146b6bb16bUL,
770 	0x5cab17d985852e85UL, 0x8173673cbdbdcebdUL, 0xd234ba8f5d5d695dUL,
771 	0x8050209010104010UL,
772 	0xf303f507f4f4f7f4UL,
773 	0x16c08bddcbcb0bcbUL, 0xedc67cd33e3ef83eUL, 0x28110a2d05051405UL,
774 	0x1fe6ce7867678167UL, 0x7353d597e4e4b7e4UL, 0x25bb4e0227279c27UL,
775 	0x3258827341411941UL, 0x2c9d0ba78b8b168bUL, 0x510153f6a7a7a6a7UL,
776 	0xcf94fab27d7de97dUL, 0xdcfb374995956e95UL, 0x8e9fad56d8d847d8UL,
777 	0x8b30eb70fbfbcbfbUL,
778 	0x2371c1cdeeee9feeUL,
779 	0xc791f8bb7c7ced7cUL, 0x17e3cc7166668566UL, 0xa68ea77bdddd53ddUL,
780 	0xb84b2eaf17175c17UL, 0x02468e4547470147UL, 0x84dc211a9e9e429eUL,
781 	0x1ec589d4caca0fcaUL, 0x75995a582d2db42dUL, 0x9179632ebfbfc6bfUL,
782 	0x381b0e3f07071c07UL, 0x012347acadad8eadUL, 0xea2fb4b05a5a755aUL,
783 	0x6cb51bef83833683UL,
784 	0x85ff66b63333cc33UL,
785 	0x3ff2c65c63639163UL, 0x100a041202020802UL, 0x39384993aaaa92aaUL,
786 	0xafa8e2de7171d971UL, 0x0ecf8dc6c8c807c8UL, 0xc87d32d119196419UL,
787 	0x7270923b49493949UL, 0x869aaf5fd9d943d9UL, 0xc31df931f2f2eff2UL,
788 	0x4b48dba8e3e3abe3UL, 0xe22ab6b95b5b715bUL, 0x34920dbc88881a88UL,
789 	0xa4c8293e9a9a529aUL,
790 	0x2dbe4c0b26269826UL,
791 	0x8dfa64bf3232c832UL, 0xe94a7d59b0b0fab0UL, 0x1b6acff2e9e983e9UL,
792 	0x78331e770f0f3c0fUL, 0xe6a6b733d5d573d5UL, 0x74ba1df480803a80UL,
793 	0x997c6127bebec2beUL, 0x26de87ebcdcd13cdUL, 0xbde468893434d034UL,
794 	0x7a75903248483d48UL, 0xab24e354ffffdbffUL, 0xf78ff48d7a7af57aUL,
795 	0xf4ea3d6490907a90UL,
796 	0xc23ebe9d5f5f615fUL,
797 	0x1da0403d20208020UL, 0x67d5d00f6868bd68UL, 0xd07234ca1a1a681aUL,
798 	0x192c41b7aeae82aeUL, 0xc95e757db4b4eab4UL, 0x9a19a8ce54544d54UL,
799 	0xece53b7f93937693UL, 0x0daa442f22228822UL, 0x07e9c86364648d64UL,
800 	0xdb12ff2af1f1e3f1UL, 0xbfa2e6cc7373d173UL, 0x905a248212124812UL,
801 	0x3a5d807a40401d40UL,
802 	0x4028104808082008UL,
803 	0x56e89b95c3c32bc3UL, 0x337bc5dfecec97ecUL, 0x9690ab4ddbdb4bdbUL,
804 	0x611f5fc0a1a1bea1UL, 0x1c8307918d8d0e8dUL, 0xf5c97ac83d3df43dUL,
805 	0xccf1335b97976697UL, 0x0000000000000000UL, 0x36d483f9cfcf1bcfUL,
806 	0x4587566e2b2bac2bUL, 0x97b3ece17676c576UL, 0x64b019e682823282UL,
807 	0xfea9b128d6d67fd6UL,
808 	0xd87736c31b1b6c1bUL,
809 	0xc15b7774b5b5eeb5UL, 0x112943beafaf86afUL, 0x77dfd41d6a6ab56aUL,
810 	0xba0da0ea50505d50UL, 0x124c8a5745450945UL, 0xcb18fb38f3f3ebf3UL,
811 	0x9df060ad3030c030UL, 0x2b74c3c4efef9befUL, 0xe5c37eda3f3ffc3fUL,
812 	0x921caac755554955UL, 0x791059dba2a2b2a2UL, 0x0365c9e9eaea8feaUL,
813 	0x0fecca6a65658965UL,
814 	0xb9686903babad2baUL,
815 	0x65935e4a2f2fbc2fUL, 0x4ee79d8ec0c027c0UL, 0xbe81a160dede5fdeUL,
816 	0xe06c38fc1c1c701cUL, 0xbb2ee746fdfdd3fdUL, 0x52649a1f4d4d294dUL,
817 	0xe4e0397692927292UL, 0x8fbceafa7575c975UL, 0x301e0c3606061806UL,
818 	0x249809ae8a8a128aUL, 0xf940794bb2b2f2b2UL, 0x6359d185e6e6bfe6UL,
819 	0x70361c7e0e0e380eUL,
820 	0xf8633ee71f1f7c1fUL,
821 	0x37f7c45562629562UL, 0xeea3b53ad4d477d4UL, 0x29324d81a8a89aa8UL,
822 	0xc4f4315296966296UL, 0x9b3aef62f9f9c3f9UL, 0x66f697a3c5c533c5UL,
823 	0x35b14a1025259425UL, 0xf220b2ab59597959UL, 0x54ae15d084842a84UL,
824 	0xb7a7e4c57272d572UL, 0xd5dd72ec3939e439UL, 0x5a6198164c4c2d4cUL,
825 	0xca3bbc945e5e655eUL,
826 	0xe785f09f7878fd78UL,
827 	0xddd870e53838e038UL, 0x148605988c8c0a8cUL, 0xc6b2bf17d1d163d1UL,
828 	0x410b57e4a5a5aea5UL, 0x434dd9a1e2e2afe2UL, 0x2ff8c24e61619961UL,
829 	0xf1457b42b3b3f6b3UL, 0x15a5423421218421UL, 0x94d625089c9c4a9cUL,
830 	0xf0663cee1e1e781eUL, 0x2252866143431143UL, 0x76fc93b1c7c73bc7UL,
831 	0xb32be54ffcfcd7fcUL,
832 	0x2014082404041004UL,
833 	0xb208a2e351515951UL, 0xbcc72f2599995e99UL, 0x4fc4da226d6da96dUL,
834 	0x68391a650d0d340dUL, 0x8335e979fafacffaUL, 0xb684a369dfdf5bdfUL,
835 	0xd79bfca97e7ee57eUL, 0x3db4481924249024UL, 0xc5d776fe3b3bec3bUL,
836 	0x313d4b9aabab96abUL, 0x3ed181f0cece1fceUL, 0x8855229911114411UL,
837 	0x0c8903838f8f068fUL,
838 	0x4a6b9c044e4e254eUL,
839 	0xd1517366b7b7e6b7UL, 0x0b60cbe0ebeb8bebUL, 0xfdcc78c13c3cf03cUL,
840 	0x7cbf1ffd81813e81UL, 0xd4fe354094946a94UL, 0xeb0cf31cf7f7fbf7UL,
841 	0xa1676f18b9b9deb9UL, 0x985f268b13134c13UL, 0x7d9c58512c2cb02cUL,
842 	0xd6b8bb05d3d36bd3UL, 0x6b5cd38ce7e7bbe7UL, 0x57cbdc396e6ea56eUL,
843 	0x6ef395aac4c437c4UL,
844 	0x180f061b03030c03UL,
845 	0x8a13acdc56564556UL, 0x1a49885e44440d44UL, 0xdf9efea07f7fe17fUL,
846 	0x21374f88a9a99ea9UL, 0x4d8254672a2aa82aUL, 0xb16d6b0abbbbd6bbUL,
847 	0x46e29f87c1c123c1UL, 0xa202a6f153535153UL, 0xae8ba572dcdc57dcUL,
848 	0x582716530b0b2c0bUL, 0x9cd327019d9d4e9dUL, 0x47c1d82b6c6cad6cUL,
849 	0x95f562a43131c431UL,
850 	0x87b9e8f37474cd74UL,
851 	0xe309f115f6f6fff6UL, 0x0a438c4c46460546UL, 0x092645a5acac8aacUL,
852 	0x3c970fb589891e89UL, 0xa04428b414145014UL, 0x5b42dfbae1e1a3e1UL,
853 	0xb04e2ca616165816UL, 0xcdd274f73a3ae83aUL, 0x6fd0d2066969b969UL,
854 	0x482d124109092409UL, 0xa7ade0d77070dd70UL, 0xd954716fb6b6e2b6UL,
855 	0xceb7bd1ed0d067d0UL,
856 	0x3b7ec7d6eded93edUL,
857 	0x2edb85e2cccc17ccUL, 0x2a57846842421542UL, 0xb4c22d2c98985a98UL,
858 	0x490e55eda4a4aaa4UL, 0x5d8850752828a028UL, 0xda31b8865c5c6d5cUL,
859 	0x933fed6bf8f8c7f8UL, 0x44a411c286862286UL,
860 ], [
861 	0x18c07830d8181860UL, 0x2305af462623238cUL, 0xc67ef991b8c6c63fUL,
862 	0xe8136fcdfbe8e887UL, 0x874ca113cb878726UL, 0xb8a9626d11b8b8daUL,
863 	0x0108050209010104UL, 0x4f426e9e0d4f4f21UL, 0x36adee6c9b3636d8UL,
864 	0xa6590451ffa6a6a2UL,
865 	0xd2debdb90cd2d26fUL, 0xf5fb06f70ef5f5f3UL, 0x79ef80f2967979f9UL,
866 	0x6f5fcede306f6fa1UL, 0x91fcef3f6d91917eUL, 0x52aa07a4f8525255UL,
867 	0x6027fdc04760609dUL, 0xbc89766535bcbccaUL, 0x9baccd2b379b9b56UL,
868 	0x8e048c018a8e8e02UL, 0xa371155bd2a3a3b6UL, 0x0c603c186c0c0c30UL,
869 	0x7bff8af6847b7bf1UL,
870 	0x35b5e16a803535d4UL,
871 	0x1de8693af51d1d74UL, 0xe05347ddb3e0e0a7UL, 0xd7f6acb321d7d77bUL,
872 	0xc25eed999cc2c22fUL, 0x2e6d965c432e2eb8UL, 0x4b627a96294b4b31UL,
873 	0xfea321e15dfefedfUL, 0x578216aed5575741UL, 0x15a8412abd151554UL,
874 	0x779fb6eee87777c1UL, 0x37a5eb6e923737dcUL, 0xe57b56d79ee5e5b3UL,
875 	0x9f8cd923139f9f46UL,
876 	0xf0d317fd23f0f0e7UL,
877 	0x4a6a7f94204a4a35UL, 0xda9e95a944dada4fUL, 0x58fa25b0a258587dUL,
878 	0xc906ca8fcfc9c903UL, 0x29558d527c2929a4UL, 0x0a5022145a0a0a28UL,
879 	0xb1e14f7f50b1b1feUL, 0xa0691a5dc9a0a0baUL, 0x6b7fdad6146b6bb1UL,
880 	0x855cab17d985852eUL, 0xbd8173673cbdbdceUL, 0x5dd234ba8f5d5d69UL,
881 	0x1080502090101040UL,
882 	0xf4f303f507f4f4f7UL,
883 	0xcb16c08bddcbcb0bUL, 0x3eedc67cd33e3ef8UL, 0x0528110a2d050514UL,
884 	0x671fe6ce78676781UL, 0xe47353d597e4e4b7UL, 0x2725bb4e0227279cUL,
885 	0x4132588273414119UL, 0x8b2c9d0ba78b8b16UL, 0xa7510153f6a7a7a6UL,
886 	0x7dcf94fab27d7de9UL, 0x95dcfb374995956eUL, 0xd88e9fad56d8d847UL,
887 	0xfb8b30eb70fbfbcbUL,
888 	0xee2371c1cdeeee9fUL,
889 	0x7cc791f8bb7c7cedUL, 0x6617e3cc71666685UL, 0xdda68ea77bdddd53UL,
890 	0x17b84b2eaf17175cUL, 0x4702468e45474701UL, 0x9e84dc211a9e9e42UL,
891 	0xca1ec589d4caca0fUL, 0x2d75995a582d2db4UL, 0xbf9179632ebfbfc6UL,
892 	0x07381b0e3f07071cUL, 0xad012347acadad8eUL, 0x5aea2fb4b05a5a75UL,
893 	0x836cb51bef838336UL,
894 	0x3385ff66b63333ccUL,
895 	0x633ff2c65c636391UL, 0x02100a0412020208UL, 0xaa39384993aaaa92UL,
896 	0x71afa8e2de7171d9UL, 0xc80ecf8dc6c8c807UL, 0x19c87d32d1191964UL,
897 	0x497270923b494939UL, 0xd9869aaf5fd9d943UL, 0xf2c31df931f2f2efUL,
898 	0xe34b48dba8e3e3abUL, 0x5be22ab6b95b5b71UL, 0x8834920dbc88881aUL,
899 	0x9aa4c8293e9a9a52UL,
900 	0x262dbe4c0b262698UL,
901 	0x328dfa64bf3232c8UL, 0xb0e94a7d59b0b0faUL, 0xe91b6acff2e9e983UL,
902 	0x0f78331e770f0f3cUL, 0xd5e6a6b733d5d573UL, 0x8074ba1df480803aUL,
903 	0xbe997c6127bebec2UL, 0xcd26de87ebcdcd13UL, 0x34bde468893434d0UL,
904 	0x487a75903248483dUL, 0xffab24e354ffffdbUL, 0x7af78ff48d7a7af5UL,
905 	0x90f4ea3d6490907aUL,
906 	0x5fc23ebe9d5f5f61UL,
907 	0x201da0403d202080UL, 0x6867d5d00f6868bdUL, 0x1ad07234ca1a1a68UL,
908 	0xae192c41b7aeae82UL, 0xb4c95e757db4b4eaUL, 0x549a19a8ce54544dUL,
909 	0x93ece53b7f939376UL, 0x220daa442f222288UL, 0x6407e9c86364648dUL,
910 	0xf1db12ff2af1f1e3UL, 0x73bfa2e6cc7373d1UL, 0x12905a2482121248UL,
911 	0x403a5d807a40401dUL,
912 	0x0840281048080820UL,
913 	0xc356e89b95c3c32bUL, 0xec337bc5dfecec97UL, 0xdb9690ab4ddbdb4bUL,
914 	0xa1611f5fc0a1a1beUL, 0x8d1c8307918d8d0eUL, 0x3df5c97ac83d3df4UL,
915 	0x97ccf1335b979766UL, 0x0000000000000000UL, 0xcf36d483f9cfcf1bUL,
916 	0x2b4587566e2b2bacUL, 0x7697b3ece17676c5UL, 0x8264b019e6828232UL,
917 	0xd6fea9b128d6d67fUL,
918 	0x1bd87736c31b1b6cUL,
919 	0xb5c15b7774b5b5eeUL, 0xaf112943beafaf86UL, 0x6a77dfd41d6a6ab5UL,
920 	0x50ba0da0ea50505dUL, 0x45124c8a57454509UL, 0xf3cb18fb38f3f3ebUL,
921 	0x309df060ad3030c0UL, 0xef2b74c3c4efef9bUL, 0x3fe5c37eda3f3ffcUL,
922 	0x55921caac7555549UL, 0xa2791059dba2a2b2UL, 0xea0365c9e9eaea8fUL,
923 	0x650fecca6a656589UL,
924 	0xbab9686903babad2UL,
925 	0x2f65935e4a2f2fbcUL, 0xc04ee79d8ec0c027UL, 0xdebe81a160dede5fUL,
926 	0x1ce06c38fc1c1c70UL, 0xfdbb2ee746fdfdd3UL, 0x4d52649a1f4d4d29UL,
927 	0x92e4e03976929272UL, 0x758fbceafa7575c9UL, 0x06301e0c36060618UL,
928 	0x8a249809ae8a8a12UL, 0xb2f940794bb2b2f2UL, 0xe66359d185e6e6bfUL,
929 	0x0e70361c7e0e0e38UL,
930 	0x1ff8633ee71f1f7cUL,
931 	0x6237f7c455626295UL, 0xd4eea3b53ad4d477UL, 0xa829324d81a8a89aUL,
932 	0x96c4f43152969662UL, 0xf99b3aef62f9f9c3UL, 0xc566f697a3c5c533UL,
933 	0x2535b14a10252594UL, 0x59f220b2ab595979UL, 0x8454ae15d084842aUL,
934 	0x72b7a7e4c57272d5UL, 0x39d5dd72ec3939e4UL, 0x4c5a6198164c4c2dUL,
935 	0x5eca3bbc945e5e65UL,
936 	0x78e785f09f7878fdUL,
937 	0x38ddd870e53838e0UL, 0x8c148605988c8c0aUL, 0xd1c6b2bf17d1d163UL,
938 	0xa5410b57e4a5a5aeUL, 0xe2434dd9a1e2e2afUL, 0x612ff8c24e616199UL,
939 	0xb3f1457b42b3b3f6UL, 0x2115a54234212184UL, 0x9c94d625089c9c4aUL,
940 	0x1ef0663cee1e1e78UL, 0x4322528661434311UL, 0xc776fc93b1c7c73bUL,
941 	0xfcb32be54ffcfcd7UL,
942 	0x0420140824040410UL,
943 	0x51b208a2e3515159UL, 0x99bcc72f2599995eUL, 0x6d4fc4da226d6da9UL,
944 	0x0d68391a650d0d34UL, 0xfa8335e979fafacfUL, 0xdfb684a369dfdf5bUL,
945 	0x7ed79bfca97e7ee5UL, 0x243db44819242490UL, 0x3bc5d776fe3b3becUL,
946 	0xab313d4b9aabab96UL, 0xce3ed181f0cece1fUL, 0x1188552299111144UL,
947 	0x8f0c8903838f8f06UL,
948 	0x4e4a6b9c044e4e25UL,
949 	0xb7d1517366b7b7e6UL, 0xeb0b60cbe0ebeb8bUL, 0x3cfdcc78c13c3cf0UL,
950 	0x817cbf1ffd81813eUL, 0x94d4fe354094946aUL, 0xf7eb0cf31cf7f7fbUL,
951 	0xb9a1676f18b9b9deUL, 0x13985f268b13134cUL, 0x2c7d9c58512c2cb0UL,
952 	0xd3d6b8bb05d3d36bUL, 0xe76b5cd38ce7e7bbUL, 0x6e57cbdc396e6ea5UL,
953 	0xc46ef395aac4c437UL,
954 	0x03180f061b03030cUL,
955 	0x568a13acdc565645UL, 0x441a49885e44440dUL, 0x7fdf9efea07f7fe1UL,
956 	0xa921374f88a9a99eUL, 0x2a4d8254672a2aa8UL, 0xbbb16d6b0abbbbd6UL,
957 	0xc146e29f87c1c123UL, 0x53a202a6f1535351UL, 0xdcae8ba572dcdc57UL,
958 	0x0b582716530b0b2cUL, 0x9d9cd327019d9d4eUL, 0x6c47c1d82b6c6cadUL,
959 	0x3195f562a43131c4UL,
960 	0x7487b9e8f37474cdUL,
961 	0xf6e309f115f6f6ffUL, 0x460a438c4c464605UL, 0xac092645a5acac8aUL,
962 	0x893c970fb589891eUL, 0x14a04428b4141450UL, 0xe15b42dfbae1e1a3UL,
963 	0x16b04e2ca6161658UL, 0x3acdd274f73a3ae8UL, 0x696fd0d2066969b9UL,
964 	0x09482d1241090924UL, 0x70a7ade0d77070ddUL, 0xb6d954716fb6b6e2UL,
965 	0xd0ceb7bd1ed0d067UL,
966 	0xed3b7ec7d6eded93UL,
967 	0xcc2edb85e2cccc17UL, 0x422a578468424215UL, 0x98b4c22d2c98985aUL,
968 	0xa4490e55eda4a4aaUL, 0x285d8850752828a0UL, 0x5cda31b8865c5c6dUL,
969 	0xf8933fed6bf8f8c7UL, 0x8644a411c2868622UL,
970 ], [
971 	0x6018c07830d81818UL, 0x8c2305af46262323UL, 0x3fc67ef991b8c6c6UL,
972 	0x87e8136fcdfbe8e8UL, 0x26874ca113cb8787UL, 0xdab8a9626d11b8b8UL,
973 	0x0401080502090101UL, 0x214f426e9e0d4f4fUL, 0xd836adee6c9b3636UL,
974 	0xa2a6590451ffa6a6UL,
975 	0x6fd2debdb90cd2d2UL, 0xf3f5fb06f70ef5f5UL, 0xf979ef80f2967979UL,
976 	0xa16f5fcede306f6fUL, 0x7e91fcef3f6d9191UL, 0x5552aa07a4f85252UL,
977 	0x9d6027fdc0476060UL, 0xcabc89766535bcbcUL, 0x569baccd2b379b9bUL,
978 	0x028e048c018a8e8eUL, 0xb6a371155bd2a3a3UL, 0x300c603c186c0c0cUL,
979 	0xf17bff8af6847b7bUL,
980 	0xd435b5e16a803535UL,
981 	0x741de8693af51d1dUL, 0xa7e05347ddb3e0e0UL, 0x7bd7f6acb321d7d7UL,
982 	0x2fc25eed999cc2c2UL, 0xb82e6d965c432e2eUL, 0x314b627a96294b4bUL,
983 	0xdffea321e15dfefeUL, 0x41578216aed55757UL, 0x5415a8412abd1515UL,
984 	0xc1779fb6eee87777UL, 0xdc37a5eb6e923737UL, 0xb3e57b56d79ee5e5UL,
985 	0x469f8cd923139f9fUL,
986 	0xe7f0d317fd23f0f0UL,
987 	0x354a6a7f94204a4aUL, 0x4fda9e95a944dadaUL, 0x7d58fa25b0a25858UL,
988 	0x03c906ca8fcfc9c9UL, 0xa429558d527c2929UL, 0x280a5022145a0a0aUL,
989 	0xfeb1e14f7f50b1b1UL, 0xbaa0691a5dc9a0a0UL, 0xb16b7fdad6146b6bUL,
990 	0x2e855cab17d98585UL, 0xcebd8173673cbdbdUL, 0x695dd234ba8f5d5dUL,
991 	0x4010805020901010UL,
992 	0xf7f4f303f507f4f4UL,
993 	0x0bcb16c08bddcbcbUL, 0xf83eedc67cd33e3eUL, 0x140528110a2d0505UL,
994 	0x81671fe6ce786767UL, 0xb7e47353d597e4e4UL, 0x9c2725bb4e022727UL,
995 	0x1941325882734141UL, 0x168b2c9d0ba78b8bUL, 0xa6a7510153f6a7a7UL,
996 	0xe97dcf94fab27d7dUL, 0x6e95dcfb37499595UL, 0x47d88e9fad56d8d8UL,
997 	0xcbfb8b30eb70fbfbUL,
998 	0x9fee2371c1cdeeeeUL,
999 	0xed7cc791f8bb7c7cUL, 0x856617e3cc716666UL, 0x53dda68ea77bddddUL,
1000 	0x5c17b84b2eaf1717UL, 0x014702468e454747UL, 0x429e84dc211a9e9eUL,
1001 	0x0fca1ec589d4cacaUL, 0xb42d75995a582d2dUL, 0xc6bf9179632ebfbfUL,
1002 	0x1c07381b0e3f0707UL, 0x8ead012347acadadUL, 0x755aea2fb4b05a5aUL,
1003 	0x36836cb51bef8383UL,
1004 	0xcc3385ff66b63333UL,
1005 	0x91633ff2c65c6363UL, 0x0802100a04120202UL, 0x92aa39384993aaaaUL,
1006 	0xd971afa8e2de7171UL, 0x07c80ecf8dc6c8c8UL, 0x6419c87d32d11919UL,
1007 	0x39497270923b4949UL, 0x43d9869aaf5fd9d9UL, 0xeff2c31df931f2f2UL,
1008 	0xabe34b48dba8e3e3UL, 0x715be22ab6b95b5bUL, 0x1a8834920dbc8888UL,
1009 	0x529aa4c8293e9a9aUL,
1010 	0x98262dbe4c0b2626UL,
1011 	0xc8328dfa64bf3232UL, 0xfab0e94a7d59b0b0UL, 0x83e91b6acff2e9e9UL,
1012 	0x3c0f78331e770f0fUL, 0x73d5e6a6b733d5d5UL, 0x3a8074ba1df48080UL,
1013 	0xc2be997c6127bebeUL, 0x13cd26de87ebcdcdUL, 0xd034bde468893434UL,
1014 	0x3d487a7590324848UL, 0xdbffab24e354ffffUL, 0xf57af78ff48d7a7aUL,
1015 	0x7a90f4ea3d649090UL,
1016 	0x615fc23ebe9d5f5fUL,
1017 	0x80201da0403d2020UL, 0xbd6867d5d00f6868UL, 0x681ad07234ca1a1aUL,
1018 	0x82ae192c41b7aeaeUL, 0xeab4c95e757db4b4UL, 0x4d549a19a8ce5454UL,
1019 	0x7693ece53b7f9393UL, 0x88220daa442f2222UL, 0x8d6407e9c8636464UL,
1020 	0xe3f1db12ff2af1f1UL, 0xd173bfa2e6cc7373UL, 0x4812905a24821212UL,
1021 	0x1d403a5d807a4040UL,
1022 	0x2008402810480808UL,
1023 	0x2bc356e89b95c3c3UL, 0x97ec337bc5dfececUL, 0x4bdb9690ab4ddbdbUL,
1024 	0xbea1611f5fc0a1a1UL, 0x0e8d1c8307918d8dUL, 0xf43df5c97ac83d3dUL,
1025 	0x6697ccf1335b9797UL, 0x0000000000000000UL, 0x1bcf36d483f9cfcfUL,
1026 	0xac2b4587566e2b2bUL, 0xc57697b3ece17676UL, 0x328264b019e68282UL,
1027 	0x7fd6fea9b128d6d6UL,
1028 	0x6c1bd87736c31b1bUL,
1029 	0xeeb5c15b7774b5b5UL, 0x86af112943beafafUL, 0xb56a77dfd41d6a6aUL,
1030 	0x5d50ba0da0ea5050UL, 0x0945124c8a574545UL, 0xebf3cb18fb38f3f3UL,
1031 	0xc0309df060ad3030UL, 0x9bef2b74c3c4efefUL, 0xfc3fe5c37eda3f3fUL,
1032 	0x4955921caac75555UL, 0xb2a2791059dba2a2UL, 0x8fea0365c9e9eaeaUL,
1033 	0x89650fecca6a6565UL,
1034 	0xd2bab9686903babaUL,
1035 	0xbc2f65935e4a2f2fUL, 0x27c04ee79d8ec0c0UL, 0x5fdebe81a160dedeUL,
1036 	0x701ce06c38fc1c1cUL, 0xd3fdbb2ee746fdfdUL, 0x294d52649a1f4d4dUL,
1037 	0x7292e4e039769292UL, 0xc9758fbceafa7575UL, 0x1806301e0c360606UL,
1038 	0x128a249809ae8a8aUL, 0xf2b2f940794bb2b2UL, 0xbfe66359d185e6e6UL,
1039 	0x380e70361c7e0e0eUL,
1040 	0x7c1ff8633ee71f1fUL,
1041 	0x956237f7c4556262UL, 0x77d4eea3b53ad4d4UL, 0x9aa829324d81a8a8UL,
1042 	0x6296c4f431529696UL, 0xc3f99b3aef62f9f9UL, 0x33c566f697a3c5c5UL,
1043 	0x942535b14a102525UL, 0x7959f220b2ab5959UL, 0x2a8454ae15d08484UL,
1044 	0xd572b7a7e4c57272UL, 0xe439d5dd72ec3939UL, 0x2d4c5a6198164c4cUL,
1045 	0x655eca3bbc945e5eUL,
1046 	0xfd78e785f09f7878UL,
1047 	0xe038ddd870e53838UL, 0x0a8c148605988c8cUL, 0x63d1c6b2bf17d1d1UL,
1048 	0xaea5410b57e4a5a5UL, 0xafe2434dd9a1e2e2UL, 0x99612ff8c24e6161UL,
1049 	0xf6b3f1457b42b3b3UL, 0x842115a542342121UL, 0x4a9c94d625089c9cUL,
1050 	0x781ef0663cee1e1eUL, 0x1143225286614343UL, 0x3bc776fc93b1c7c7UL,
1051 	0xd7fcb32be54ffcfcUL,
1052 	0x1004201408240404UL,
1053 	0x5951b208a2e35151UL, 0x5e99bcc72f259999UL, 0xa96d4fc4da226d6dUL,
1054 	0x340d68391a650d0dUL, 0xcffa8335e979fafaUL, 0x5bdfb684a369dfdfUL,
1055 	0xe57ed79bfca97e7eUL, 0x90243db448192424UL, 0xec3bc5d776fe3b3bUL,
1056 	0x96ab313d4b9aababUL, 0x1fce3ed181f0ceceUL, 0x4411885522991111UL,
1057 	0x068f0c8903838f8fUL,
1058 	0x254e4a6b9c044e4eUL,
1059 	0xe6b7d1517366b7b7UL, 0x8beb0b60cbe0ebebUL, 0xf03cfdcc78c13c3cUL,
1060 	0x3e817cbf1ffd8181UL, 0x6a94d4fe35409494UL, 0xfbf7eb0cf31cf7f7UL,
1061 	0xdeb9a1676f18b9b9UL, 0x4c13985f268b1313UL, 0xb02c7d9c58512c2cUL,
1062 	0x6bd3d6b8bb05d3d3UL, 0xbbe76b5cd38ce7e7UL, 0xa56e57cbdc396e6eUL,
1063 	0x37c46ef395aac4c4UL,
1064 	0x0c03180f061b0303UL,
1065 	0x45568a13acdc5656UL, 0x0d441a49885e4444UL, 0xe17fdf9efea07f7fUL,
1066 	0x9ea921374f88a9a9UL, 0xa82a4d8254672a2aUL, 0xd6bbb16d6b0abbbbUL,
1067 	0x23c146e29f87c1c1UL, 0x5153a202a6f15353UL, 0x57dcae8ba572dcdcUL,
1068 	0x2c0b582716530b0bUL, 0x4e9d9cd327019d9dUL, 0xad6c47c1d82b6c6cUL,
1069 	0xc43195f562a43131UL,
1070 	0xcd7487b9e8f37474UL,
1071 	0xfff6e309f115f6f6UL, 0x05460a438c4c4646UL, 0x8aac092645a5acacUL,
1072 	0x1e893c970fb58989UL, 0x5014a04428b41414UL, 0xa3e15b42dfbae1e1UL,
1073 	0x5816b04e2ca61616UL, 0xe83acdd274f73a3aUL, 0xb9696fd0d2066969UL,
1074 	0x2409482d12410909UL, 0xdd70a7ade0d77070UL, 0xe2b6d954716fb6b6UL,
1075 	0x67d0ceb7bd1ed0d0UL,
1076 	0x93ed3b7ec7d6ededUL,
1077 	0x17cc2edb85e2ccccUL, 0x15422a5784684242UL, 0x5a98b4c22d2c9898UL,
1078 	0xaaa4490e55eda4a4UL, 0xa0285d8850752828UL, 0x6d5cda31b8865c5cUL,
1079 	0xc7f8933fed6bf8f8UL, 0x228644a411c28686UL,
1080 ], [
1081 	0x186018c07830d818UL, 0x238c2305af462623UL, 0xc63fc67ef991b8c6UL,
1082 	0xe887e8136fcdfbe8UL, 0x8726874ca113cb87UL, 0xb8dab8a9626d11b8UL,
1083 	0x0104010805020901UL, 0x4f214f426e9e0d4fUL, 0x36d836adee6c9b36UL,
1084 	0xa6a2a6590451ffa6UL,
1085 	0xd26fd2debdb90cd2UL, 0xf5f3f5fb06f70ef5UL, 0x79f979ef80f29679UL,
1086 	0x6fa16f5fcede306fUL, 0x917e91fcef3f6d91UL, 0x525552aa07a4f852UL,
1087 	0x609d6027fdc04760UL, 0xbccabc89766535bcUL, 0x9b569baccd2b379bUL,
1088 	0x8e028e048c018a8eUL, 0xa3b6a371155bd2a3UL, 0x0c300c603c186c0cUL,
1089 	0x7bf17bff8af6847bUL,
1090 	0x35d435b5e16a8035UL,
1091 	0x1d741de8693af51dUL, 0xe0a7e05347ddb3e0UL, 0xd77bd7f6acb321d7UL,
1092 	0xc22fc25eed999cc2UL, 0x2eb82e6d965c432eUL, 0x4b314b627a96294bUL,
1093 	0xfedffea321e15dfeUL, 0x5741578216aed557UL, 0x155415a8412abd15UL,
1094 	0x77c1779fb6eee877UL, 0x37dc37a5eb6e9237UL, 0xe5b3e57b56d79ee5UL,
1095 	0x9f469f8cd923139fUL,
1096 	0xf0e7f0d317fd23f0UL,
1097 	0x4a354a6a7f94204aUL, 0xda4fda9e95a944daUL, 0x587d58fa25b0a258UL,
1098 	0xc903c906ca8fcfc9UL, 0x29a429558d527c29UL, 0x0a280a5022145a0aUL,
1099 	0xb1feb1e14f7f50b1UL, 0xa0baa0691a5dc9a0UL, 0x6bb16b7fdad6146bUL,
1100 	0x852e855cab17d985UL, 0xbdcebd8173673cbdUL, 0x5d695dd234ba8f5dUL,
1101 	0x1040108050209010UL,
1102 	0xf4f7f4f303f507f4UL,
1103 	0xcb0bcb16c08bddcbUL, 0x3ef83eedc67cd33eUL, 0x05140528110a2d05UL,
1104 	0x6781671fe6ce7867UL, 0xe4b7e47353d597e4UL, 0x279c2725bb4e0227UL,
1105 	0x4119413258827341UL, 0x8b168b2c9d0ba78bUL, 0xa7a6a7510153f6a7UL,
1106 	0x7de97dcf94fab27dUL, 0x956e95dcfb374995UL, 0xd847d88e9fad56d8UL,
1107 	0xfbcbfb8b30eb70fbUL,
1108 	0xee9fee2371c1cdeeUL,
1109 	0x7ced7cc791f8bb7cUL, 0x66856617e3cc7166UL, 0xdd53dda68ea77bddUL,
1110 	0x175c17b84b2eaf17UL, 0x47014702468e4547UL, 0x9e429e84dc211a9eUL,
1111 	0xca0fca1ec589d4caUL, 0x2db42d75995a582dUL, 0xbfc6bf9179632ebfUL,
1112 	0x071c07381b0e3f07UL, 0xad8ead012347acadUL, 0x5a755aea2fb4b05aUL,
1113 	0x8336836cb51bef83UL,
1114 	0x33cc3385ff66b633UL,
1115 	0x6391633ff2c65c63UL, 0x020802100a041202UL, 0xaa92aa39384993aaUL,
1116 	0x71d971afa8e2de71UL, 0xc807c80ecf8dc6c8UL, 0x196419c87d32d119UL,
1117 	0x4939497270923b49UL, 0xd943d9869aaf5fd9UL, 0xf2eff2c31df931f2UL,
1118 	0xe3abe34b48dba8e3UL, 0x5b715be22ab6b95bUL, 0x881a8834920dbc88UL,
1119 	0x9a529aa4c8293e9aUL,
1120 	0x2698262dbe4c0b26UL,
1121 	0x32c8328dfa64bf32UL, 0xb0fab0e94a7d59b0UL, 0xe983e91b6acff2e9UL,
1122 	0x0f3c0f78331e770fUL, 0xd573d5e6a6b733d5UL, 0x803a8074ba1df480UL,
1123 	0xbec2be997c6127beUL, 0xcd13cd26de87ebcdUL, 0x34d034bde4688934UL,
1124 	0x483d487a75903248UL, 0xffdbffab24e354ffUL, 0x7af57af78ff48d7aUL,
1125 	0x907a90f4ea3d6490UL,
1126 	0x5f615fc23ebe9d5fUL,
1127 	0x2080201da0403d20UL, 0x68bd6867d5d00f68UL, 0x1a681ad07234ca1aUL,
1128 	0xae82ae192c41b7aeUL, 0xb4eab4c95e757db4UL, 0x544d549a19a8ce54UL,
1129 	0x937693ece53b7f93UL, 0x2288220daa442f22UL, 0x648d6407e9c86364UL,
1130 	0xf1e3f1db12ff2af1UL, 0x73d173bfa2e6cc73UL, 0x124812905a248212UL,
1131 	0x401d403a5d807a40UL,
1132 	0x0820084028104808UL,
1133 	0xc32bc356e89b95c3UL, 0xec97ec337bc5dfecUL, 0xdb4bdb9690ab4ddbUL,
1134 	0xa1bea1611f5fc0a1UL, 0x8d0e8d1c8307918dUL, 0x3df43df5c97ac83dUL,
1135 	0x976697ccf1335b97UL, 0x0000000000000000UL, 0xcf1bcf36d483f9cfUL,
1136 	0x2bac2b4587566e2bUL, 0x76c57697b3ece176UL, 0x82328264b019e682UL,
1137 	0xd67fd6fea9b128d6UL,
1138 	0x1b6c1bd87736c31bUL,
1139 	0xb5eeb5c15b7774b5UL, 0xaf86af112943beafUL, 0x6ab56a77dfd41d6aUL,
1140 	0x505d50ba0da0ea50UL, 0x450945124c8a5745UL, 0xf3ebf3cb18fb38f3UL,
1141 	0x30c0309df060ad30UL, 0xef9bef2b74c3c4efUL, 0x3ffc3fe5c37eda3fUL,
1142 	0x554955921caac755UL, 0xa2b2a2791059dba2UL, 0xea8fea0365c9e9eaUL,
1143 	0x6589650fecca6a65UL,
1144 	0xbad2bab9686903baUL,
1145 	0x2fbc2f65935e4a2fUL, 0xc027c04ee79d8ec0UL, 0xde5fdebe81a160deUL,
1146 	0x1c701ce06c38fc1cUL, 0xfdd3fdbb2ee746fdUL, 0x4d294d52649a1f4dUL,
1147 	0x927292e4e0397692UL, 0x75c9758fbceafa75UL, 0x061806301e0c3606UL,
1148 	0x8a128a249809ae8aUL, 0xb2f2b2f940794bb2UL, 0xe6bfe66359d185e6UL,
1149 	0x0e380e70361c7e0eUL,
1150 	0x1f7c1ff8633ee71fUL,
1151 	0x62956237f7c45562UL, 0xd477d4eea3b53ad4UL, 0xa89aa829324d81a8UL,
1152 	0x966296c4f4315296UL, 0xf9c3f99b3aef62f9UL, 0xc533c566f697a3c5UL,
1153 	0x25942535b14a1025UL, 0x597959f220b2ab59UL, 0x842a8454ae15d084UL,
1154 	0x72d572b7a7e4c572UL, 0x39e439d5dd72ec39UL, 0x4c2d4c5a6198164cUL,
1155 	0x5e655eca3bbc945eUL,
1156 	0x78fd78e785f09f78UL,
1157 	0x38e038ddd870e538UL, 0x8c0a8c148605988cUL, 0xd163d1c6b2bf17d1UL,
1158 	0xa5aea5410b57e4a5UL, 0xe2afe2434dd9a1e2UL, 0x6199612ff8c24e61UL,
1159 	0xb3f6b3f1457b42b3UL, 0x21842115a5423421UL, 0x9c4a9c94d625089cUL,
1160 	0x1e781ef0663cee1eUL, 0x4311432252866143UL, 0xc73bc776fc93b1c7UL,
1161 	0xfcd7fcb32be54ffcUL,
1162 	0x0410042014082404UL,
1163 	0x515951b208a2e351UL, 0x995e99bcc72f2599UL, 0x6da96d4fc4da226dUL,
1164 	0x0d340d68391a650dUL, 0xfacffa8335e979faUL, 0xdf5bdfb684a369dfUL,
1165 	0x7ee57ed79bfca97eUL, 0x2490243db4481924UL, 0x3bec3bc5d776fe3bUL,
1166 	0xab96ab313d4b9aabUL, 0xce1fce3ed181f0ceUL, 0x1144118855229911UL,
1167 	0x8f068f0c8903838fUL,
1168 	0x4e254e4a6b9c044eUL,
1169 	0xb7e6b7d1517366b7UL, 0xeb8beb0b60cbe0ebUL, 0x3cf03cfdcc78c13cUL,
1170 	0x813e817cbf1ffd81UL, 0x946a94d4fe354094UL, 0xf7fbf7eb0cf31cf7UL,
1171 	0xb9deb9a1676f18b9UL, 0x134c13985f268b13UL, 0x2cb02c7d9c58512cUL,
1172 	0xd36bd3d6b8bb05d3UL, 0xe7bbe76b5cd38ce7UL, 0x6ea56e57cbdc396eUL,
1173 	0xc437c46ef395aac4UL,
1174 	0x030c03180f061b03UL,
1175 	0x5645568a13acdc56UL, 0x440d441a49885e44UL, 0x7fe17fdf9efea07fUL,
1176 	0xa99ea921374f88a9UL, 0x2aa82a4d8254672aUL, 0xbbd6bbb16d6b0abbUL,
1177 	0xc123c146e29f87c1UL, 0x535153a202a6f153UL, 0xdc57dcae8ba572dcUL,
1178 	0x0b2c0b582716530bUL, 0x9d4e9d9cd327019dUL, 0x6cad6c47c1d82b6cUL,
1179 	0x31c43195f562a431UL,
1180 	0x74cd7487b9e8f374UL,
1181 	0xf6fff6e309f115f6UL, 0x4605460a438c4c46UL, 0xac8aac092645a5acUL,
1182 	0x891e893c970fb589UL, 0x145014a04428b414UL, 0xe1a3e15b42dfbae1UL,
1183 	0x165816b04e2ca616UL, 0x3ae83acdd274f73aUL, 0x69b9696fd0d20669UL,
1184 	0x092409482d124109UL, 0x70dd70a7ade0d770UL, 0xb6e2b6d954716fb6UL,
1185 	0xd067d0ceb7bd1ed0UL,
1186 	0xed93ed3b7ec7d6edUL,
1187 	0xcc17cc2edb85e2ccUL, 0x4215422a57846842UL, 0x985a98b4c22d2c98UL,
1188 	0xa4aaa4490e55eda4UL, 0x28a0285d88507528UL, 0x5c6d5cda31b8865cUL,
1189 	0xf8c7f8933fed6bf8UL, 0x86228644a411c286UL,
1190 ]];
1191 
1192 immutable ulong[numRounds] rc = [
1193 	0x1823c6e887b8014fUL, 0x36a6d2f5796f9152UL, 0x60bc9b8ea30c7b35UL,
1194 	0x1de0d7c22e4bfe57UL, 0x157737e59ff04adaUL, 0x58c9290ab1a06b85UL,
1195 	0xbd5d10f4cb3e0567UL, 0xe427418ba77d95d8UL, 0xfbee7c66dd17479eUL, 0xca2dbf07ad5a8333UL,
1196 ];
1197 
1198 // precomputed K[] based on the initial state
1199 immutable ulong[8][numRounds] pcK = [
1200 	[
1201 	0x300BEEC0AF902967, 0x2828282828282828, 0x2828282828282828, 0x2828282828282828,
1202 	0x2828282828282828, 0x2828282828282828, 0x2828282828282828, 0x2828282828282828
1203 ], [
1204 	0x3BAB89F8EAD1AE24, 0x4445456645E9CBAF, 0x70FEA4A4C5A4B289, 0xC5FAA9E1E1CCE1A0,
1205 	0x48ACC05CFCFCB8FC, 0x8FF70E26908F8F69, 0x96791407D7857979, 0xF8A8F868B8C878F8
1206 ], [
1207 	0xD319BFDB30467058, 0x295B23D1AFCF37DB, 0x12C8AC28B95AC98, 0x81639EB1C0B206A7,
1208 	0x445E607AB0B209DB, 0x735B2CCFBC8CBC71, 0xDC670924EFEDDDD3, 0x7B8D3BF0D73B7D19
1209 ], [
1210 	0x38BEAAC1DE116586, 0x687CF3D04A87337F, 0xF337FADB98ADF057, 0xC5E24258EE358DBC,
1211 	0x1109F0E8996E247E, 0x1C5D6ED10B03401, 0xFBC952F17B28ECD3, 0x3256DC0CC7F12740
1212 ], [
1213 	0xAF25A520949BCF14, 0xC13626A9E3C4534D, 0xE60F7D867740F9E1, 0x915DE6BBE26A0629,
1214 	0x965A54CC4CFE5E8D, 0xBEE931CB62323AA6, 0xB17B591896846A47, 0xD4F0C9362759AF31
1215 ], [
1216 	0xE2F9B5C025370BB0, 0x392BCBA2168494A5, 0x608AF8CEFA348C14, 0x7AA53764418C9219,
1217 	0xB3F346A1FA833F89, 0x97493F487802CF7C, 0xDCADE8BA1E008F23, 0x92774F49EDB0323D
1218 ], [
1219 	0x75416382774DFF2F, 0xFFFA38D055034600, 0xBF7D02493E98F361, 0xF4A860C29AE5CE0B,
1220 	0xC8DF5A44EE5D9D27, 0x23F45A55047500A4, 0xB016101202F9E28C, 0xAC30CD296833331D
1221 ], [
1222 	0x36BF1826884AD89, 0x9940C662D8467163, 0x4C433E174B19C210, 0xE29CCFD34CFF86C5,
1223 	0x21FF11A042DF2653, 0x1B8E00CB6CE44B13, 0xA6123BF7A347B7CE, 0xD918900E3B2833CA
1224 ], [
1225 	0xD01C677A0A9A2CF9, 0x2A942F534A63B6B2, 0x88422246FEACA8B4, 0x474A5CC73D583559,
1226 	0x74A6925DA55C6FA1, 0x7717E68CC4735C39, 0x82A3B0B53EC1AC6, 0x2AF658EB814DE762
1227 ], [
1228 	0x489548B601EEBC3A, 0xA50D6BC66BED8E81, 0xE0CE3DCF88265A75, 0xC28C4ADBC0F69CE9,
1229 	0x54B79CD57F718513, 0x43414B8A977D0B7B, 0x631935BBDBF6157A, 0x6A7A4EF637018227
1230 ],];
1231 
1232 version (unittest) {
1233 	import std.conv : hexString;
1234 }