crc32c.c revision 18a1444b4f1e6a0948fd38fa0de382d86cfe04de
1/*
2 * crc32c.c
3 *
4 * August 26, 2011 Darrick J. Wong <djwong at us.ibm.com>
5 * Reuse Bob Pearson's slice-by-8 implementation for e2fsprogs.
6 *
7 * July 20, 2011 Bob Pearson <rpearson at systemfabricworks.com>
8 * added slice by 8 algorithm to the existing conventional and
9 * slice by 4 algorithms.
10 *
11 * Oct 15, 2000 Matt Domsch <Matt_Domsch@dell.com>
12 * Nicer crc32 functions/docs submitted by linux@horizon.com.  Thanks!
13 * Code was from the public domain, copyright abandoned.  Code was
14 * subsequently included in the kernel, thus was re-licensed under the
15 * GNU GPL v2.
16 *
17 * Oct 12, 2000 Matt Domsch <Matt_Domsch@dell.com>
18 * Same crc32 function was used in 5 other places in the kernel.
19 * I made one version, and deleted the others.
20 * There are various incantations of crc32().  Some use a seed of 0 or ~0.
21 * Some xor at the end with ~0.  The generic crc32() function takes
22 * seed as an argument, and doesn't xor at the end.  Then individual
23 * users can do whatever they need.
24 *   drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0.
25 *   fs/jffs2 uses seed 0, doesn't xor with ~0.
26 *   fs/partitions/efi.c uses seed ~0, xor's with ~0.
27 *
28 * This source code is licensed under the GNU General Public License,
29 * Version 2.  See the file COPYING for more details.
30 */
31#include <stdint.h>
32#include <stdlib.h>
33#include <stdio.h>
34#define __force
35#define min(x, y)		((x) > (y) ? (y) : (x))
36#define __ALIGN_KERNEL_MASK(x, mask)	(((x) + (mask)) & ~(mask))
37#define __ALIGN_KERNEL(x, a)	__ALIGN_KERNEL_MASK(x, (__typeof__(x))(a) - 1)
38#define ALIGN(x, a)		__ALIGN_KERNEL((x), (a))
39#define PTR_ALIGN(p, a)		((__typeof__(p))ALIGN((unsigned long)(p), (a)))
40#include "crc32c_defs.h"
41
42#include "ext2fs.h"
43#ifdef WORDS_BIGENDIAN
44#define __constant_cpu_to_le32(x) ___constant_swab32((x))
45#define __constant_cpu_to_be32(x) (x)
46#define __be32_to_cpu(x) (x)
47#define __cpu_to_be32(x) (x)
48#define __cpu_to_le32(x) (ext2fs_cpu_to_le32((x)))
49#define __le32_to_cpu(x) (ext2fs_le32_to_cpu((x)))
50#else
51#define __constant_cpu_to_le32(x) (x)
52#define __constant_cpu_to_be32(x) ___constant_swab32((x))
53#define __be32_to_cpu(x) (ext2fs_be32_to_cpu((x)))
54#define __cpu_to_be32(x) (ext2fs_cpu_to_be32((x)))
55#define __cpu_to_le32(x) (x)
56#define __le32_to_cpu(x) (x)
57#endif
58
59#if CRC_LE_BITS > 8
60# define tole(x) (__force uint32_t) __constant_cpu_to_le32(x)
61#else
62# define tole(x) (x)
63#endif
64
65#if CRC_BE_BITS > 8
66# define tobe(x) (__force uint32_t) __constant_cpu_to_be32(x)
67#else
68# define tobe(x) (x)
69#endif
70
71#include "crc32c_table.h"
72
73#if CRC_LE_BITS == 32
74/* slice by 4 algorithm */
75static uint32_t crc32c_le_body(uint32_t crc, uint8_t const *buf, size_t len)
76{
77	const uint8_t *p8;
78	const uint32_t *p32;
79	size_t init_bytes;
80	size_t words;
81	size_t end_bytes;
82	size_t i;
83	uint32_t q;
84	uint8_t i0, i1, i2, i3;
85
86	crc = (__force uint32_t) __cpu_to_le32(crc);
87
88	/* unroll loop into 'init_bytes' odd bytes followed by
89	 * 'words' aligned 4 byte words followed by
90	 * 'end_bytes' odd bytes at the end */
91	p8 = buf;
92	p32 = (uint32_t *)PTR_ALIGN(p8, 4);
93	init_bytes = min((uintptr_t)p32 - (uintptr_t)p8, len);
94	words = (len - init_bytes) >> 2;
95	end_bytes = (len - init_bytes) & 3;
96
97	for (i = 0; i < init_bytes; i++) {
98#ifndef WORDS_BIGENDIAN
99		i0 = *p8++ ^ crc;
100		crc = t0_le[i0] ^ (crc >> 8);
101#else
102		i0 = *p8++ ^ (crc >> 24);
103		crc = t0_le[i0] ^ (crc << 8);
104#endif
105	}
106
107	/* using pre-increment below slightly faster */
108	p32--;
109
110	for (i = 0; i < words; i++) {
111#ifndef WORDS_BIGENDIAN
112		q = *++p32 ^ crc;
113		i3 = q;
114		i2 = q >> 8;
115		i1 = q >> 16;
116		i0 = q >> 24;
117		crc = t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0];
118#else
119		q = *++p32 ^ crc;
120		i3 = q >> 24;
121		i2 = q >> 16;
122		i1 = q >> 8;
123		i0 = q;
124		crc = t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0];
125#endif
126	}
127
128	p8 = (uint8_t *)(++p32);
129
130	for (i = 0; i < end_bytes; i++) {
131#ifndef WORDS_BIGENDIAN
132		i0 = *p8++ ^ crc;
133		crc = t0_le[i0] ^ (crc >> 8);
134#else
135		i0 = *p8++ ^ (crc >> 24);
136		crc = t0_le[i0] ^ (crc << 8);
137#endif
138	}
139
140	return __le32_to_cpu((__force __le32)crc);
141}
142#endif
143
144#if CRC_BE_BITS == 32
145static uint32_t crc32c_be_body(uint32_t crc, uint8_t const *buf, size_t len)
146{
147	const uint8_t *p8;
148	const uint32_t *p32;
149	size_t init_bytes;
150	size_t words;
151	size_t end_bytes;
152	size_t i;
153	uint32_t q;
154	uint8_t i0, i1, i2, i3;
155
156	crc = (__force uint32_t) __cpu_to_be32(crc);
157
158	p8 = buf;
159	p32 = (uint32_t *)PTR_ALIGN(p8, 4);
160	init_bytes = min((uintptr_t)p32 - (uintptr_t)p8, len);
161	words = (len - init_bytes) >> 2;
162	end_bytes = (len - init_bytes) & 3;
163
164	for (i = 0; i < init_bytes; i++) {
165#ifndef WORDS_BIGENDIAN
166		i0 = *p8++ ^ crc;
167		crc = t0_be[i0] ^ (crc >> 8);
168#else
169		i0 = *p8++ ^ (crc >> 24);
170		crc = t0_be[i0] ^ (crc << 8);
171#endif
172	}
173
174	p32--;
175
176	for (i = 0; i < words; i++) {
177#ifndef WORDS_BIGENDIAN
178		q = *++p32 ^ crc;
179		i3 = q;
180		i2 = q >> 8;
181		i1 = q >> 16;
182		i0 = q >> 24;
183		crc = t3_be[i3] ^ t2_be[i2] ^ t1_be[i1] ^ t0_be[i0];
184#else
185		q = *++p32 ^ crc;
186		i3 = q >> 24;
187		i2 = q >> 16;
188		i1 = q >> 8;
189		i0 = q;
190		crc = t3_be[i3] ^ t2_be[i2] ^ t1_be[i1] ^ t0_be[i0];
191#endif
192	}
193
194	p8 = (uint8_t *)(++p32);
195
196	for (i = 0; i < end_bytes; i++) {
197#ifndef WORDS_BIGENDIAN
198		i0 = *p8++ ^ crc;
199		crc = t0_be[i0] ^ (crc >> 8);
200#else
201		i0 = *p8++ ^ (crc >> 24);
202		crc = t0_be[i0] ^ (crc << 8);
203#endif
204	}
205
206	return __be32_to_cpu((__force __be32)crc);
207}
208#endif
209
210#if CRC_LE_BITS == 64
211/* slice by 8 algorithm */
212static uint32_t crc32c_le_body(uint32_t crc, uint8_t const *buf, size_t len)
213{
214	const uint8_t *p8;
215	const uint32_t *p32;
216	size_t init_bytes;
217	size_t words;
218	size_t end_bytes;
219	size_t i;
220	uint32_t q;
221	uint8_t i0, i1, i2, i3;
222
223	crc = (__force uint32_t) __cpu_to_le32(crc);
224
225	p8 = buf;
226	p32 = (const uint32_t *)PTR_ALIGN(p8, 8);
227	init_bytes = min((uintptr_t)p32 - (uintptr_t)p8, len);
228	words = (len - init_bytes) >> 3;
229	end_bytes = (len - init_bytes) & 7;
230
231	for (i = 0; i < init_bytes; i++) {
232#ifndef WORDS_BIGENDIAN
233		i0 = *p8++ ^ crc;
234		crc = t0_le[i0] ^ (crc >> 8);
235#else
236		i0 = *p8++ ^ (crc >> 24);
237		crc = t0_le[i0] ^ (crc << 8);
238#endif
239	}
240
241	p32--;
242
243	for (i = 0; i < words; i++) {
244#ifndef WORDS_BIGENDIAN
245		q = *++p32 ^ crc;
246		i3 = q;
247		i2 = q >> 8;
248		i1 = q >> 16;
249		i0 = q >> 24;
250		crc = t7_le[i3] ^ t6_le[i2] ^ t5_le[i1] ^ t4_le[i0];
251
252		q = *++p32;
253		i3 = q;
254		i2 = q >> 8;
255		i1 = q >> 16;
256		i0 = q >> 24;
257		crc ^= t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0];
258#else
259		q = *++p32 ^ crc;
260		i3 = q >> 24;
261		i2 = q >> 16;
262		i1 = q >> 8;
263		i0 = q;
264		crc = t7_le[i3] ^ t6_le[i2] ^ t5_le[i1] ^ t4_le[i0];
265
266		q = *++p32;
267		i3 = q >> 24;
268		i2 = q >> 16;
269		i1 = q >> 8;
270		i0 = q;
271		crc ^= t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0];
272#endif
273	}
274
275	p8 = (const uint8_t *)(++p32);
276
277	for (i = 0; i < end_bytes; i++) {
278#ifndef WORDS_BIGENDIAN
279		i0 = *p8++ ^ crc;
280		crc = t0_le[i0] ^ (crc >> 8);
281#else
282		i0 = *p8++ ^ (crc >> 24);
283		crc = t0_le[i0] ^ (crc << 8);
284#endif
285	}
286
287	return __le32_to_cpu(crc);
288}
289#endif
290
291#if CRC_BE_BITS == 64
292static uint32_t crc32c_be_body(uint32_t crc, uint8_t const *buf, size_t len)
293{
294	const uint8_t *p8;
295	const uint32_t *p32;
296	size_t init_bytes;
297	size_t words;
298	size_t end_bytes;
299	size_t i;
300	uint32_t q;
301	uint8_t i0, i1, i2, i3;
302
303	crc = (__force uint32_t) __cpu_to_be32(crc);
304
305	p8 = buf;
306	p32 = (const uint32_t *)PTR_ALIGN(p8, 8);
307	init_bytes = min((uintptr_t)p32 - (uintptr_t)p8, len);
308	words = (len - init_bytes) >> 3;
309	end_bytes = (len - init_bytes) & 7;
310
311	for (i = 0; i < init_bytes; i++) {
312#ifndef WORDS_BIGENDIAN
313		i0 = *p8++ ^ crc;
314		crc = t0_be[i0] ^ (crc >> 8);
315#else
316		i0 = *p8++ ^ (crc >> 24);
317		crc = t0_be[i0] ^ (crc << 8);
318#endif
319	}
320
321	p32--;
322
323	for (i = 0; i < words; i++) {
324#ifndef WORDS_BIGENDIAN
325		q = *++p32 ^ crc;
326		i3 = q;
327		i2 = q >> 8;
328		i1 = q >> 16;
329		i0 = q >> 24;
330		crc = t7_be[i3] ^ t6_be[i2] ^ t5_be[i1] ^ t4_be[i0];
331
332		q = *++p32;
333		i3 = q;
334		i2 = q >> 8;
335		i1 = q >> 16;
336		i0 = q >> 24;
337		crc ^= t3_be[i3] ^ t2_be[i2] ^ t1_be[i1] ^ t0_be[i0];
338#else
339		q = *++p32 ^ crc;
340		i3 = q >> 24;
341		i2 = q >> 16;
342		i1 = q >> 8;
343		i0 = q;
344		crc = t7_be[i3] ^ t6_be[i2] ^ t5_be[i1] ^ t4_be[i0];
345
346		q = *++p32;
347		i3 = q >> 24;
348		i2 = q >> 16;
349		i1 = q >> 8;
350		i0 = q;
351		crc ^= t3_be[i3] ^ t2_be[i2] ^ t1_be[i1] ^ t0_be[i0];
352#endif
353	}
354
355	p8 = (const uint8_t *)(++p32);
356
357	for (i = 0; i < end_bytes; i++) {
358#ifndef WORDS_BIGENDIAN
359		i0 = *p8++ ^ crc;
360		crc = t0_be[i0] ^ (crc >> 8);
361#else
362		i0 = *p8++ ^ (crc >> 24);
363		crc = t0_be[i0] ^ (crc << 8);
364#endif
365	}
366
367	return __be32_to_cpu(crc);
368}
369#endif
370
371/**
372 * crc32c_le() - Calculate bitwise little-endian CRC32c.
373 * @crc: seed value for computation.  ~0 for ext4, sometimes 0 for
374 *	other uses, or the previous crc32c value if computing incrementally.
375 * @p: pointer to buffer over which CRC is run
376 * @len: length of buffer @p
377 */
378uint32_t ext2fs_crc32c_le(uint32_t crc, unsigned char const *p, size_t len)
379{
380#if CRC_LE_BITS == 1
381	int i;
382	while (len--) {
383		crc ^= *p++;
384		for (i = 0; i < 8; i++)
385			crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0);
386	}
387# elif CRC_LE_BITS == 2
388	while (len--) {
389		crc ^= *p++;
390		crc = (crc >> 2) ^ t0_le[crc & 0x03];
391		crc = (crc >> 2) ^ t0_le[crc & 0x03];
392		crc = (crc >> 2) ^ t0_le[crc & 0x03];
393		crc = (crc >> 2) ^ t0_le[crc & 0x03];
394	}
395# elif CRC_LE_BITS == 4
396	while (len--) {
397		crc ^= *p++;
398		crc = (crc >> 4) ^ t0_le[crc & 0x0f];
399		crc = (crc >> 4) ^ t0_le[crc & 0x0f];
400	}
401# elif CRC_LE_BITS == 8
402	while (len--) {
403		crc ^= *p++;
404		crc = (crc >> 8) ^ t0_le[crc & 0xff];
405	}
406# else
407	crc = crc32c_le_body(crc, p, len);
408# endif
409	return crc;
410}
411
412/**
413 * crc32c_be() - Calculate bitwise big-endian CRC32c.
414 * @crc: seed value for computation.  ~0 for ext4, sometimes 0 for
415 *	other uses, or the previous crc32c value if computing incrementally.
416 * @p: pointer to buffer over which CRC is run
417 * @len: length of buffer @p
418 */
419uint32_t ext2fs_crc32c_be(uint32_t crc, unsigned char const *p, size_t len)
420{
421#if CRC_BE_BITS == 1
422	int i;
423	while (len--) {
424		crc ^= *p++ << 24;
425		for (i = 0; i < 8; i++)
426			crc = (crc << 1) ^
427			      ((crc & 0x80000000) ? CRCPOLY_BE : 0);
428	}
429# elif CRC_BE_BITS == 2
430	while (len--) {
431		crc ^= *p++ << 24;
432		crc = (crc << 2) ^ t0_be[crc >> 30];
433		crc = (crc << 2) ^ t0_be[crc >> 30];
434		crc = (crc << 2) ^ t0_be[crc >> 30];
435		crc = (crc << 2) ^ t0_be[crc >> 30];
436	}
437# elif CRC_BE_BITS == 4
438	while (len--) {
439		crc ^= *p++ << 24;
440		crc = (crc << 4) ^ t0_be[crc >> 28];
441		crc = (crc << 4) ^ t0_be[crc >> 28];
442	}
443# elif CRC_BE_BITS == 8
444	while (len--) {
445		crc ^= *p++ << 24;
446		crc = (crc << 8) ^ t0_be[crc >> 24];
447	}
448# else
449	crc = crc32c_be_body(crc, p, len);
450# endif
451	return crc;
452}
453
454#ifdef UNITTEST
455static uint8_t test_buf[] = {
456	0xd9, 0xd7, 0x6a, 0x13, 0x3a, 0xb1, 0x05, 0x48,
457	0xda, 0xad, 0x14, 0xbd, 0x03, 0x3a, 0x58, 0x5e,
458	0x6e, 0xd1, 0x56, 0xc9, 0x2e, 0xc4, 0xcb, 0x6b,
459	0xe8, 0x77, 0x52, 0x37, 0x4e, 0x0f, 0x55, 0xd2,
460	0x12, 0x65, 0x90, 0xc2, 0x41, 0x49, 0x81, 0x01,
461	0xf5, 0x01, 0xeb, 0x2d, 0x78, 0x74, 0x23, 0x5d,
462	0x84, 0x5c, 0x81, 0x92, 0x21, 0xe9, 0x8d, 0x1d,
463	0x89, 0xf2, 0x4a, 0xac, 0xdd, 0xf9, 0xaf, 0xee,
464	0x44, 0xe7, 0x6e, 0xed, 0xfb, 0xd8, 0x89, 0x0e,
465	0x96, 0x62, 0xcd, 0xa4, 0x4b, 0xa9, 0xe5, 0x45,
466	0xb1, 0x29, 0x9b, 0x0f, 0xfc, 0xbd, 0x83, 0xab,
467	0xa8, 0x54, 0x96, 0x44, 0x2c, 0x7f, 0xbb, 0xe7,
468	0x52, 0x29, 0x08, 0xee, 0x14, 0xc5, 0xc2, 0xec,
469	0x5a, 0xeb, 0x40, 0x40, 0xea, 0xd1, 0x3d, 0x15,
470	0x73, 0xaa, 0x8c, 0x73, 0xfc, 0xf2, 0x2b, 0x49,
471	0x0b, 0x13, 0x96, 0xd9, 0x8e, 0x4b, 0xbc, 0xe0,
472	0xf4, 0xd2, 0xe0, 0x2e, 0x7a, 0xf0, 0x5d, 0x1f,
473	0xd2, 0x92, 0x97, 0xe0, 0xaa, 0x59, 0xab, 0xc9,
474	0x5c, 0xa6, 0x51, 0x1a, 0xe3, 0xd6, 0x06, 0xb9,
475	0xae, 0xb8, 0x76, 0x36, 0x79, 0x37, 0x52, 0xf6,
476	0x34, 0xaf, 0x27, 0x19, 0xe1, 0xc0, 0x2b, 0xdd,
477	0x01, 0x15, 0xcd, 0xce, 0x44, 0xf6, 0x4c, 0x18,
478	0x92, 0x69, 0xbe, 0x8a, 0x76, 0x23, 0x52, 0x13,
479	0x3f, 0xf9, 0xe0, 0xf5, 0x06, 0x28, 0x7c, 0xc7,
480	0xf3, 0x42, 0x0f, 0xdd, 0x40, 0x33, 0xf7, 0x99,
481	0xe2, 0xad, 0x26, 0xd9, 0x53, 0x10, 0x72, 0x0c,
482	0x4e, 0x43, 0x4c, 0x61, 0xfe, 0xd9, 0xc1, 0x16,
483	0xa1, 0x93, 0xca, 0x3c, 0x75, 0x7f, 0x07, 0x7a,
484	0x65, 0xb3, 0x53, 0x2a, 0x52, 0x00, 0xa0, 0x62,
485	0xe0, 0xa3, 0x1f, 0xad, 0xd7, 0xbb, 0xc0, 0x83,
486	0x5d, 0x54, 0x87, 0x5f, 0xc8, 0x2f, 0xc8, 0xbf,
487	0x69, 0x04, 0x91, 0xc8, 0xa6, 0x1d, 0x4d, 0x46,
488	0x91, 0xfc, 0x26, 0xf4, 0x16, 0xd1, 0xa4, 0xbf,
489	0x5c, 0xa2, 0x6c, 0xdd, 0xb4, 0x40, 0xf2, 0x2e,
490	0xa2, 0xad, 0xf7, 0xf4, 0xa5, 0x8a, 0x3e, 0x23,
491	0x64, 0x08, 0xc8, 0xa1, 0xa0, 0xf0, 0x5d, 0x70,
492	0xd2, 0x77, 0xfd, 0xc8, 0x50, 0x83, 0x0f, 0xd6,
493	0x2b, 0xe4, 0x1f, 0x52, 0x34, 0x33, 0x68, 0xfd,
494	0x92, 0xbe, 0x9f, 0x97, 0x6b, 0x8d, 0x81, 0x91,
495	0x0f, 0xef, 0x65, 0xc8, 0x0d, 0x15, 0x01, 0x77,
496	0x58, 0xb2, 0xf4, 0x1b, 0x06, 0x7e, 0xf5, 0xca,
497	0x15, 0x2e, 0x38, 0xd8, 0x81, 0x1c, 0x1c, 0xa0,
498	0xb6, 0x13, 0x6a, 0x2b, 0x71, 0x34, 0x52, 0xd7,
499	0x1d, 0xbd, 0x37, 0x59, 0xbc, 0x86, 0x25, 0x2b,
500	0xa8, 0x93, 0xce, 0x1a, 0x03, 0x16, 0xfe, 0x01,
501	0x57, 0x99, 0x24, 0x25, 0x2c, 0xb3, 0xab, 0x1e,
502	0x2d, 0x65, 0x20, 0x89, 0x17, 0x02, 0x0e, 0x0a,
503	0xf5, 0x1e, 0xc7, 0xff, 0x1f, 0x61, 0xa9, 0x54,
504	0x18, 0xd4, 0xba, 0x50, 0x57, 0x02, 0xa1, 0xab,
505	0x22, 0x2e, 0x07, 0xea, 0xa9, 0xa3, 0x83, 0x4f,
506	0x27, 0xf5, 0xc5, 0xee, 0x3c, 0x3b, 0x10, 0xad,
507	0x32, 0x2b, 0x1c, 0x03, 0xcb, 0xaf, 0x98, 0x83,
508	0x54, 0xc3, 0x68, 0x63, 0xd4, 0xe0, 0x0e, 0x3c,
509	0x1a, 0x4e, 0xc0, 0x81, 0xd0, 0xe8, 0x6a, 0x62,
510	0x6b, 0x3e, 0x6f, 0xc4, 0xc6, 0x33, 0x4e, 0x26,
511	0x21, 0xf5, 0x04, 0xdf, 0xfa, 0xce, 0x45, 0xaf,
512	0xdc, 0x5e, 0x1b, 0xad, 0x93, 0xca, 0xf5, 0xcf,
513	0xd7, 0xee, 0x0c, 0x5c, 0x5e, 0xb4, 0xf0, 0x92,
514	0xd2, 0xf2, 0xf0, 0xa9, 0x1e, 0xab, 0x80, 0x68,
515	0x46, 0xef, 0xcc, 0x26, 0x0c, 0x5c, 0xdd, 0x4e,
516	0x83, 0xb8, 0xb9, 0x53, 0x6e, 0xf8, 0x93, 0x38,
517	0x67, 0xa4, 0x41, 0x87, 0x72, 0xe7, 0x7e, 0x86,
518	0xc9, 0x49, 0x00, 0x33, 0xb1, 0x38, 0x6c, 0x71,
519	0xd7, 0x1d, 0x8e, 0x61, 0x01, 0xb6, 0x57, 0xa9,
520	0xf1, 0xac, 0x15, 0xc2, 0x83, 0x77, 0xca, 0x64,
521	0xca, 0x7b, 0x6c, 0xa1, 0x10, 0x1b, 0x13, 0xd0,
522	0xd3, 0x9e, 0x9e, 0x10, 0x70, 0xc8, 0x1a, 0xbb,
523	0x3f, 0x19, 0x86, 0xab, 0x01, 0x0e, 0xea, 0x34,
524	0x22, 0xea, 0xe2, 0x15, 0xb7, 0xed, 0x21, 0x21,
525	0x75, 0xa5, 0xe7, 0x08, 0xa1, 0x38, 0xe0, 0x91,
526	0x05, 0x60, 0xea, 0xa7, 0x50, 0x27, 0x18, 0x07,
527	0x9d, 0xe0, 0x18, 0x2b, 0xd4, 0x07, 0x59, 0x00,
528	0xe6, 0x45, 0x18, 0x2a, 0x30, 0x6e, 0xf3, 0xb4,
529	0xd0, 0xef, 0xa6, 0x5b, 0x71, 0xa2, 0x5a, 0x3b,
530	0x89, 0x4c, 0xaf, 0x3f, 0xcb, 0x9f, 0x03, 0xfb,
531	0x43, 0x7c, 0x6b, 0xd3, 0x6a, 0xea, 0xce, 0x4a,
532	0x5f, 0x64, 0xb5, 0x62, 0xda, 0x5d, 0x27, 0xb7,
533	0xb8, 0x11, 0xca, 0x33, 0x30, 0xec, 0x70, 0xf0,
534	0x1b, 0x03, 0x50, 0xff, 0x5e, 0xa6, 0x08, 0xde,
535	0x37, 0x70, 0xc0, 0x81, 0x55, 0x60, 0x17, 0xa1,
536	0x85, 0xae, 0x26, 0x44, 0xe4, 0x67, 0x3c, 0x91,
537	0xfd, 0xc4, 0x3d, 0x97, 0x72, 0x23, 0xf3, 0x3c,
538	0x8f, 0xe0, 0xe2, 0xf2, 0x09, 0x96, 0x10, 0x67,
539	0xb5, 0xfe, 0xff, 0x3d, 0x4a, 0xc8, 0x62, 0x11,
540	0xa5, 0x98, 0xc1, 0x2d, 0x40, 0x82, 0x88, 0x8b,
541	0xe5, 0xb0, 0x75, 0xbf, 0x2f, 0xa8, 0x6a, 0x55,
542	0x49, 0x2e, 0x9c, 0x29, 0xd2, 0x7c, 0xbf, 0xf3,
543	0xaa, 0x3a, 0x16, 0x4a, 0xa4, 0x15, 0xf3, 0x48,
544	0xde, 0x38, 0x13, 0x44, 0x26, 0x02, 0xe6, 0xe9,
545	0xa8, 0x24, 0x89, 0xb5, 0x43, 0x95, 0xe4, 0x4c,
546	0xc3, 0xa0, 0xdf, 0xcc, 0x42, 0xf8, 0x8d, 0xb0,
547	0x3b, 0xea, 0x10, 0xb7, 0xe1, 0x40, 0x54, 0xb9,
548	0xa3, 0x2d, 0xfb, 0xb4, 0x91, 0xc0, 0x3e, 0x94,
549	0xf1, 0xa1, 0x3c, 0xbe, 0xef, 0xb8, 0x70, 0x55,
550	0x0a, 0x26, 0x93, 0xbf, 0xe6, 0x21, 0x92, 0x32,
551	0x3c, 0x39, 0x27, 0x6a, 0x23, 0x48, 0x02, 0x35,
552	0x3c, 0xd4, 0xcc, 0x04, 0xc0, 0x4e, 0xa7, 0x02,
553	0x63, 0x37, 0xc2, 0xb8, 0x56, 0x1d, 0x57, 0x57,
554	0x42, 0x04, 0x8d, 0xee, 0xcf, 0x8b, 0xc9, 0xc3,
555	0xba, 0x3b, 0x15, 0xd7, 0xaf, 0xbf, 0x9e, 0xcd,
556	0x44, 0xcf, 0xf0, 0x00, 0xb7, 0x3a, 0xfc, 0xa8,
557	0x12, 0xab, 0x3a, 0x62, 0x01, 0x21, 0x46, 0xe9,
558	0x1e, 0x48, 0x37, 0xfc, 0x13, 0x4d, 0xf6, 0x2a,
559	0x72, 0x40, 0x75, 0x38, 0x71, 0xf2, 0x17, 0x20,
560	0x2c, 0xdd, 0xc0, 0x49, 0xbc, 0x63, 0x33, 0xea,
561	0x06, 0x75, 0x41, 0xe7, 0x5c, 0x1f, 0xfb, 0xf9,
562	0x68, 0x83, 0xc2, 0x5a, 0x4a, 0x1e, 0x61, 0x08,
563	0x57, 0xf3, 0x00, 0xba, 0x77, 0x92, 0x63, 0xa5,
564	0xb7, 0xfe, 0x97, 0x22, 0xda, 0x5e, 0xd3, 0xaf,
565	0xbc, 0x89, 0x0d, 0x4c, 0x37, 0xa9, 0x27, 0x4a,
566	0x7f, 0xdb, 0x81, 0x39, 0x11, 0x86, 0x12, 0xf9,
567	0x10, 0x50, 0xe4, 0xdb, 0x72, 0xf9, 0xae, 0x10,
568	0x7c, 0xed, 0x50, 0x5c, 0x61, 0xeb, 0x42, 0x1e,
569	0xa4, 0xf4, 0xf0, 0xfa, 0x45, 0x4d, 0x95, 0x2b,
570	0xd4, 0x67, 0x4a, 0xe3, 0x8a, 0x15, 0x55, 0x92,
571	0x77, 0x64, 0x8c, 0x51, 0x38, 0xf9, 0x26, 0x3e,
572	0x68, 0xe2, 0xac, 0xbb, 0x64, 0x77, 0xe2, 0x82,
573	0xa4, 0x42, 0x41, 0x38, 0xa0, 0xf0, 0xc9, 0xd8,
574	0x6c, 0xe0, 0xef, 0x4c, 0xda, 0xb4, 0x92, 0xef,
575	0x1b, 0xe3, 0x9b, 0xc1, 0x44, 0x3c, 0xb9, 0xb7,
576	0x39, 0xac, 0x5c, 0x32, 0x39, 0xb4, 0x21, 0x85,
577	0x93, 0xbc, 0xf2, 0x51, 0x43, 0xb7, 0xae, 0x1e,
578	0x61, 0x9c, 0x38, 0x9c, 0xaa, 0xff, 0xde, 0xfc,
579	0xbf, 0x85, 0xef, 0x17, 0x34, 0x36, 0x71, 0x5f,
580	0x04, 0x16, 0xa6, 0x9e, 0xfd, 0x3a, 0x03, 0xd8,
581	0xbf, 0x71, 0x70, 0x20, 0x8f, 0x7c, 0xfb, 0xff,
582	0x61, 0xe0, 0xe2, 0x60, 0xa7, 0xb1, 0xc0, 0xe0,
583	0xd9, 0x3f, 0xdc, 0x8d, 0x4a, 0xa4, 0x52, 0x61,
584	0xaf, 0x9d, 0xdf, 0x8a, 0x0d, 0x41, 0xc0, 0x25,
585	0x68, 0x12, 0x7b, 0xd5, 0xc7, 0xdb, 0x68, 0x70,
586	0x2d, 0x7d, 0x95, 0x12, 0x03, 0x23, 0x0c, 0xe8,
587	0x14, 0x41, 0x11, 0x28, 0xec, 0x9d, 0xd3, 0x28,
588	0x77, 0x7a, 0x3c, 0x93, 0x8e, 0x5c, 0x7e, 0xb3,
589	0x42, 0x9a, 0x18, 0x25, 0x93, 0xc8, 0xea, 0x43,
590	0x1b, 0xbe, 0xd5, 0x27, 0xf1, 0xd4, 0xe0, 0x1e,
591	0xce, 0xc7, 0xc7, 0x2c, 0x25, 0x35, 0x58, 0xb8,
592	0x6c, 0xf3, 0xa2, 0xad, 0xe7, 0x58, 0x49, 0x47,
593	0xf7, 0xca, 0xde, 0x8b, 0x81, 0xb7, 0x75, 0xf4,
594	0x95, 0xa7, 0x5c, 0xc3, 0x2c, 0x0e, 0x1c, 0x52,
595	0x9a, 0xc3, 0x2a, 0x00, 0x21, 0xa7, 0x51, 0x6b,
596	0xf0, 0x05, 0x87, 0x8c, 0x42, 0x1b, 0xc3, 0x2e,
597	0xa3, 0x76, 0x22, 0xd5, 0x7f, 0x56, 0x10, 0xef,
598	0x98, 0x85, 0x65, 0x86, 0x71, 0x87, 0xd2, 0x8c,
599	0xc0, 0x47, 0x20, 0xe8, 0xb5, 0x1c, 0xe3, 0xdd,
600	0x3c, 0x5c, 0x03, 0xbb, 0x0e, 0x97, 0x3b, 0xe1,
601	0x56, 0x9a, 0xd5, 0x0a, 0x63, 0xd5, 0x33, 0xaf,
602	0x36, 0xca, 0xcf, 0x8f, 0x00, 0x28, 0xa3, 0x45,
603	0xb8, 0xcd, 0xde, 0x73, 0xd4, 0xfa, 0x2d, 0x6f,
604	0xdb, 0x93, 0xaa, 0xdd, 0x7f, 0xd2, 0x22, 0x9c,
605	0x96, 0x48, 0x1e, 0xa8, 0x63, 0xbe, 0xbc, 0x0d,
606	0x14, 0x3c, 0x2e, 0x11, 0x1f, 0xd2, 0xf4, 0x57,
607	0xb3, 0x47, 0xf8, 0xa6, 0x1b, 0xc3, 0xa7, 0x95,
608	0x2d, 0xd4, 0xca, 0xb8, 0x0d, 0xfb, 0x06, 0x85,
609	0xda, 0x63, 0xf0, 0x3e, 0x9d, 0x5e, 0xee, 0xce,
610	0xed, 0x74, 0x1d, 0x2c, 0x97, 0x3f, 0x71, 0x95,
611	0x12, 0x03, 0xc5, 0x92, 0x46, 0x84, 0x1b, 0x07,
612	0xe6, 0xb4, 0x1d, 0x3a, 0xf1, 0x89, 0x90, 0x50,
613	0x10, 0x29, 0x34, 0xc0, 0x90, 0xbe, 0x4a, 0xa9,
614	0x0d, 0xb0, 0x7b, 0xfb, 0x35, 0xee, 0x4e, 0x34,
615	0xec, 0x5a, 0x58, 0xbc, 0xb8, 0xda, 0x38, 0x88,
616	0x8c, 0x74, 0x1e, 0xc9, 0xab, 0x78, 0x2e, 0x2a,
617	0x17, 0x8a, 0x43, 0x3d, 0xa1, 0x2a, 0x41, 0xb5,
618	0xd6, 0xe8, 0x5b, 0xc5, 0x4a, 0x1c, 0x3c, 0x9f,
619	0x8d, 0x3a, 0x69, 0x88, 0xf8, 0x80, 0xd2, 0x11,
620	0xfc, 0x7e, 0x80, 0x8e, 0x7f, 0x85, 0x64, 0x9c,
621	0x46, 0x58, 0xc8, 0x48, 0x98, 0x4b, 0xf5, 0x73,
622	0x3f, 0x49, 0xce, 0x53, 0x2c, 0xd5, 0xfc, 0x33,
623	0xf1, 0x6f, 0xd8, 0xe9, 0x2e, 0x70, 0x2e, 0xdc,
624	0xe5, 0x43, 0x80, 0x38, 0xf2, 0x87, 0xed, 0x85,
625	0xe4, 0x3e, 0x45, 0x14, 0x20, 0xcf, 0xa0, 0x61,
626	0x4f, 0xe8, 0xd7, 0x5b, 0xb3, 0x0d, 0x0e, 0x4e,
627	0x4d, 0xce, 0xbe, 0xba, 0xaa, 0x90, 0x09, 0xcb,
628	0x4b, 0x5d, 0x08, 0xff, 0x52, 0xd5, 0x23, 0xbc,
629	0xad, 0x8d, 0xd3, 0x06, 0x4a, 0xa0, 0x51, 0x56,
630	0xa7, 0xd8, 0x33, 0xab, 0xbc, 0xd0, 0xdf, 0x92,
631	0x87, 0x20, 0x2d, 0x7b, 0x5e, 0xfa, 0x30, 0xa7,
632	0x06, 0x06, 0xe5, 0x4f, 0x2c, 0xb5, 0x61, 0xd7,
633	0x54, 0xd3, 0xdf, 0xd0, 0x0a, 0xb0, 0x06, 0xce,
634	0xf6, 0x86, 0xb7, 0x8e, 0xaa, 0x7b, 0x78, 0xd5,
635	0xb9, 0xeb, 0x07, 0xac, 0x5f, 0xc5, 0xd2, 0x8c,
636	0x40, 0xe0, 0x7f, 0x98, 0xd4, 0xe5, 0x4b, 0xca,
637	0xfb, 0x47, 0xef, 0xef, 0xb9, 0x4d, 0x6d, 0x8f,
638	0x82, 0x68, 0x74, 0x84, 0xe0, 0x0a, 0x93, 0x0f,
639	0xb2, 0x01, 0xa9, 0x9f, 0x68, 0x6a, 0xe8, 0xf7,
640	0xfb, 0x0b, 0xde, 0x17, 0xe0, 0x30, 0x38, 0x51,
641	0xbc, 0x07, 0xb8, 0x2c, 0x91, 0x0f, 0xc1, 0x0e,
642	0xa6, 0xf9, 0xf0, 0xd5, 0x48, 0x76, 0x8a, 0xde,
643	0x74, 0xe3, 0x30, 0x65, 0x56, 0xb3, 0x5c, 0xe2,
644	0x89, 0x8d, 0xda, 0x80, 0xad, 0x0f, 0x22, 0xfb,
645	0x24, 0x1d, 0x16, 0xdd, 0x34, 0x4b, 0x90, 0x58,
646	0x4e, 0x0c, 0x13, 0x28, 0xcf, 0x1d, 0xa4, 0xaa,
647	0xb7, 0xf3, 0xb1, 0x66, 0xad, 0x3b, 0xcf, 0x79,
648	0x12, 0x04, 0xd7, 0x79, 0xd9, 0x5f, 0xdf, 0x89,
649	0xb2, 0x5b, 0xa7, 0x9a, 0x26, 0x1e, 0x67, 0x46,
650	0x7c, 0x66, 0x95, 0x67, 0xe6, 0x45, 0x8b, 0x1f,
651	0x65, 0x79, 0x9f, 0x6d, 0x11, 0x81, 0x17, 0x0d,
652	0x11, 0xb0, 0x5c, 0xb4, 0xc7, 0x27, 0x87, 0xab,
653	0x5d, 0x0a, 0x18, 0xae, 0x4e, 0x06, 0xa3, 0x3d,
654	0xc7, 0xb0, 0x22, 0xba, 0x03, 0xa4, 0x0f, 0xe5,
655	0x1c, 0x72, 0x2a, 0x04, 0xce, 0x83, 0xe9, 0xf3,
656	0xd7, 0xc9, 0x67, 0x6c, 0x1e, 0x6b, 0x3c, 0x9b,
657	0x0b, 0x5e, 0x6a, 0xa6, 0x79, 0x0a, 0xf1, 0xbe,
658	0xd7, 0xb4, 0x6f, 0x45, 0x1e, 0xfb, 0x78, 0x97,
659	0xaf, 0x34, 0x76, 0x95, 0x52, 0xf7, 0x3d, 0x5d,
660	0x07, 0x28, 0x57, 0x9c, 0x4a, 0x0f, 0xcf, 0x0b,
661	0x1b, 0xc4, 0xc2, 0x72, 0xd7, 0x72, 0x38, 0x9b,
662	0xea, 0xeb, 0xee, 0xae, 0x34, 0xc8, 0x01, 0xd7,
663	0xa5, 0xe3, 0xce, 0x41, 0xad, 0x02, 0x60, 0x23,
664	0x18, 0x36, 0xba, 0x17, 0xfa, 0xcf, 0xe4, 0xda,
665	0xdc, 0xfc, 0x82, 0xdc, 0x7c, 0x11, 0xf4, 0xb8,
666	0x52, 0x5d, 0xf7, 0x2f, 0xc8, 0xfe, 0x4a, 0xe6,
667	0xb9, 0xaf, 0x4b, 0x17, 0x18, 0x91, 0xc2, 0xfe,
668	0xd7, 0x3a, 0x77, 0x0c, 0xa0, 0x43, 0x9c, 0x6f,
669	0x13, 0x06, 0xbe, 0x6e, 0xe0, 0x1a, 0x3c, 0xf3,
670	0xf5, 0xcc, 0x78, 0xfb, 0x5d, 0xd5, 0xda, 0xb7,
671	0x58, 0xea, 0x86, 0x42, 0x6b, 0x32, 0xff, 0xb2,
672	0xe2, 0xee, 0x03, 0x1f, 0xf4, 0xef, 0xdb, 0x53,
673	0x79, 0xd5, 0x4e, 0xaf, 0x60, 0x8e, 0x02, 0xc2,
674	0xcc, 0x39, 0x97, 0x7b, 0xfd, 0xa1, 0xf8, 0x7a,
675	0x26, 0xe8, 0x55, 0xd6, 0xa4, 0x8b, 0xa0, 0x1b,
676	0x2d, 0x63, 0xaa, 0x73, 0x71, 0x6e, 0xbf, 0x8b,
677	0x3b, 0xe3, 0x1b, 0x0d, 0xbb, 0x2e, 0x44, 0x09,
678	0x64, 0xac, 0xc7, 0x9e, 0xb5, 0xc6, 0x77, 0xb0,
679	0x79, 0xb3, 0xaa, 0xfc, 0x67, 0x57, 0x9a, 0x50,
680	0x81, 0x37, 0x14, 0x7c, 0xd7, 0xa0, 0xd4, 0x6a,
681	0x79, 0x84, 0x51, 0x0e, 0x95, 0x0a, 0x30, 0xa3,
682	0x60, 0x55, 0x48, 0x05, 0x16, 0xae, 0x43, 0x90,
683	0xdc, 0x8e, 0x09, 0xbe, 0x79, 0xf6, 0x90, 0x74,
684	0xf8, 0x20, 0x96, 0x4d, 0xa7, 0xf5, 0x1a, 0x2b,
685	0xc7, 0x15, 0x9d, 0x18, 0xf7, 0x94, 0x87, 0xf7,
686	0xf4, 0xfb, 0x0d, 0x61, 0xb6, 0xd7, 0xbe, 0x10,
687	0x8e, 0x47, 0x3c, 0x10, 0x44, 0x90, 0x52, 0x21,
688	0x83, 0xc0, 0xf5, 0x99, 0xaa, 0xbc, 0xf6, 0x55,
689	0xae, 0xf5, 0xb2, 0xa4, 0xcd, 0x4d, 0xb9, 0x38,
690	0x6c, 0xbc, 0x80, 0xc3, 0xad, 0xf4, 0x46, 0x31,
691	0x01, 0x58, 0x2d, 0x88, 0x57, 0xc3, 0x23, 0xd1,
692	0x64, 0xc9, 0xa3, 0x21, 0x6b, 0x8b, 0x8a, 0x23,
693	0x2c, 0x4f, 0xa9, 0xcd, 0x67, 0xfa, 0x77, 0xad,
694	0xa3, 0x16, 0xa2, 0xe5, 0x19, 0x14, 0x70, 0x41,
695	0x5b, 0xda, 0x14, 0xde, 0xe3, 0xe5, 0xc1, 0x15,
696	0xb4, 0x77, 0xa4, 0x9b, 0xb8, 0xb1, 0x28, 0x51,
697	0x30, 0xb4, 0xf1, 0xf3, 0xf8, 0x6d, 0xd0, 0xc3,
698	0x8c, 0x4c, 0x76, 0xb0, 0x9a, 0xdf, 0xc8, 0xbe,
699	0xf8, 0x4a, 0x61, 0x6e, 0x3e, 0xd6, 0x3c, 0xe8,
700	0xde, 0x56, 0xa0, 0x9c, 0x25, 0xbe, 0xce, 0x93,
701	0x1f, 0x88, 0xfb, 0x9a, 0x1a, 0xe2, 0xff, 0x88,
702	0xad, 0x10, 0xcb, 0x6c, 0xd6, 0xe7, 0x39, 0x0b,
703	0xe5, 0x1a, 0x06, 0x05, 0x64, 0x5b, 0x0a, 0xdf,
704	0x22, 0x58, 0xd7, 0xfb, 0x88, 0x12, 0xdd, 0xb7,
705	0x52, 0x3a, 0xc9, 0xbf, 0x49, 0xdf, 0x8c, 0x87,
706	0x9f, 0x84, 0xb5, 0x0a, 0xf6, 0x00, 0x52, 0xae,
707	0x67, 0x12, 0x1a, 0x8c, 0x71, 0x15, 0xf5, 0xa1,
708	0x13, 0x39, 0xf0, 0x91, 0x7e, 0x88, 0x7c, 0xb3,
709	0x95, 0x50, 0x02, 0xa6, 0x63, 0xb5, 0x64, 0xfb,
710	0x90, 0x87, 0x61, 0xe2, 0x27, 0xaf, 0x11, 0x0c,
711	0x73, 0x83, 0xef, 0xa9, 0x28, 0xfe, 0xc8, 0x85,
712	0x1a, 0x3a, 0xde, 0xf2, 0xe5, 0x25, 0x64, 0x6d,
713	0xaa, 0x41, 0x4c, 0x80, 0x2e, 0x84, 0xff, 0xc1,
714	0xc0, 0x54, 0x0c, 0x29, 0x1b, 0xa3, 0x07, 0x7c,
715	0x33, 0x4c, 0x10, 0xf6, 0x6f, 0x79, 0xdf, 0xd3,
716	0xf0, 0x24, 0x57, 0xf1, 0x60, 0xe1, 0xf0, 0xbd,
717	0xc4, 0x1f, 0xf4, 0x67, 0xd2, 0xd3, 0xcc, 0x6a,
718	0x07, 0x72, 0x44, 0x16, 0x85, 0x46, 0xd0, 0x73,
719	0x87, 0xa9, 0xc7, 0x2f, 0xd1, 0xf5, 0xec, 0xe3,
720	0x28, 0xa3, 0x93, 0x4f, 0xd7, 0x76, 0xc1, 0x3c,
721	0x0d, 0x13, 0x33, 0xcf, 0x5b, 0xbd, 0x6a, 0x52,
722	0x4e, 0xee, 0xc8, 0x5e, 0xa1, 0x58, 0x4a, 0x08,
723	0x81, 0xd9, 0x23, 0xcc, 0xfb, 0x1c, 0xb2, 0xd8,
724	0xa3, 0xe4, 0x53, 0xfe, 0xf4, 0x4b, 0x48, 0xc1,
725	0x20, 0xa4, 0x97, 0xf8, 0x38, 0xa3, 0x69, 0xc1,
726	0x11, 0xf0, 0xa1, 0x3b, 0xa9, 0x9a, 0x12, 0x61,
727	0xe8, 0x8d, 0x99, 0x44, 0x3f, 0x94, 0x72, 0x82,
728	0x19, 0x96, 0x62, 0xb0, 0xa6, 0x64, 0x05, 0x19,
729	0x8f, 0xd6, 0x5d, 0x05, 0xbf, 0x79, 0x9e, 0x9d,
730	0xe4, 0x93, 0x4c, 0xad, 0x61, 0x8c, 0x18, 0xda,
731	0xb6, 0x2e, 0xb3, 0xca, 0x14, 0x4d, 0x53, 0xa4,
732	0x97, 0x27, 0x10, 0x56, 0xa2, 0x67, 0x5a, 0x5a,
733	0x5e, 0x13, 0xc0, 0xdb, 0xa7, 0x9f, 0x45, 0x5b,
734	0xeb, 0x1a, 0x14, 0x0c, 0x8c, 0x38, 0x5e, 0x77,
735	0x9a, 0xec, 0x75, 0x68, 0x93, 0x65, 0x02, 0x9c,
736	0xfb, 0x62, 0x60, 0x49, 0xdd, 0xb2, 0x2a, 0x67,
737	0x86, 0xe3, 0x8a, 0x7d, 0x8c, 0x46, 0x78, 0x81,
738	0x60, 0x69, 0xf2, 0x3f, 0x74, 0x11, 0x35, 0xff,
739	0x77, 0xa3, 0x66, 0x20, 0xfc, 0x98, 0x4a, 0x35,
740	0x7a, 0x52, 0xe4, 0x90, 0x13, 0x80, 0xb9, 0xa6,
741	0x73, 0x7a, 0x7d, 0x66, 0x6e, 0x6b, 0xb6, 0x43,
742	0x10, 0xd5, 0x91, 0x2b, 0x66, 0xdd, 0x89, 0x87,
743	0xe3, 0x8c, 0x58, 0x53, 0x2f, 0x40, 0x74, 0x45,
744	0x1b, 0x77, 0x7a, 0xa4, 0x44, 0x19, 0x78, 0xba,
745	0x87, 0x10, 0x41, 0x31, 0x32, 0x5f, 0x87, 0x68,
746	0xde, 0x43, 0x4a, 0xef, 0x33, 0xb3, 0x11, 0x83,
747	0xa9, 0xc2, 0x6f, 0x8d, 0x34, 0xe2, 0x95, 0x84,
748	0x3a, 0x4f, 0x6f, 0x8c, 0x31, 0x1d, 0xb6, 0xf5,
749	0x95, 0x0d, 0x01, 0x11, 0x20, 0xdf, 0x72, 0xf3,
750	0x3f, 0x9a, 0x33, 0xaa, 0xb1, 0x06, 0x6a, 0x63,
751	0x47, 0x91, 0x01, 0xdf, 0xb3, 0x54, 0x36, 0xfd,
752	0x06, 0x2d, 0xb8, 0x08, 0xe3, 0xd3, 0x65, 0xac,
753	0x66, 0x03, 0xee, 0xa4, 0x63, 0xbd, 0xd4, 0xce,
754	0xbd, 0x79, 0xa7, 0x48, 0x38, 0xc5, 0x7d, 0xb5,
755	0x71, 0x9a, 0x3c, 0x11, 0x7c, 0x6c, 0xe2, 0x54,
756	0x02, 0x5d, 0x42, 0xab, 0x25, 0x93, 0x66, 0x01,
757	0x37, 0x78, 0x35, 0x4a, 0x8c, 0x19, 0x4d, 0x00,
758	0x75, 0x4f, 0xcc, 0xc0, 0x26, 0x82, 0xc1, 0x35,
759	0x8c, 0xc7, 0xc2, 0x59, 0x01, 0x3e, 0x98, 0x22,
760	0x88, 0x9c, 0x90, 0x75, 0x05, 0x33, 0x07, 0xb9,
761	0x39, 0x81, 0x38, 0x58, 0x10, 0x29, 0xcf, 0xc8,
762	0x98, 0xb2, 0x03, 0xd7, 0x5b, 0xb3, 0x18, 0xba,
763	0x34, 0x0c, 0x9f, 0xab, 0xd7, 0xed, 0x29, 0x82,
764	0x41, 0xe0, 0x20, 0x97, 0x57, 0x92, 0xb2, 0xb8,
765	0x10, 0x2d, 0x0b, 0xa2, 0xc5, 0x8f, 0x90, 0x6f,
766	0xed, 0x12, 0x56, 0x25, 0xbe, 0xfd, 0x75, 0xf7,
767	0xb6, 0xf8, 0x40, 0x67, 0x39, 0x11, 0xfa, 0x15,
768	0xae, 0x6a, 0x54, 0x5f, 0x32, 0x2b, 0xf8, 0x48,
769	0x55, 0xbe, 0x86, 0x2f, 0x69, 0x48, 0x5b, 0x5d,
770	0x4d, 0xb7, 0x35, 0xaa, 0xb6, 0x91, 0x88, 0x19,
771	0x96, 0x1c, 0x68, 0xf6, 0x85, 0x9e, 0xb3, 0xb2,
772	0xa3, 0x32, 0xd4, 0x52, 0x70, 0xb7, 0x62, 0xe3,
773	0x14, 0xb6, 0x78, 0x5f, 0x1b, 0x1d, 0x04, 0x9c,
774	0x26, 0x0c, 0x33, 0x94, 0xb1, 0x97, 0x08, 0xdb,
775	0x0b, 0x39, 0x29, 0xd4, 0xbc, 0x6d, 0xdf, 0x02,
776	0xc6, 0x99, 0xab, 0x99, 0x32, 0xe5, 0xce, 0x51,
777	0x4f, 0xae, 0xb8, 0x8b, 0xe0, 0xaf, 0x07, 0xc4,
778	0xf9, 0x41, 0x7c, 0x59, 0xa0, 0xac, 0x74, 0x4d,
779	0x7e, 0x43, 0x77, 0x9c, 0x06, 0x49, 0x79, 0x8a,
780	0x14, 0x73, 0x93, 0xa8, 0x5b, 0x1b, 0x34, 0x29,
781	0x78, 0x04, 0x2f, 0xd7, 0x1f, 0x13, 0x90, 0xe0,
782	0xdd, 0x3b, 0x42, 0x6b, 0x79, 0x6e, 0x52, 0xc7,
783	0x0f, 0x38, 0xda, 0x01, 0x2c, 0x8d, 0xe6, 0x94,
784	0x5d, 0x59, 0x27, 0x1d, 0x10, 0x4e, 0x11, 0x36,
785	0xfb, 0x53, 0x16, 0x05, 0x25, 0xf2, 0x64, 0xd8,
786	0xf9, 0xcd, 0x5c, 0xfe, 0xb4, 0x18, 0x44, 0x80,
787	0x10, 0xbc, 0x3d, 0xf3, 0x1d, 0x5a, 0xf0, 0xc1,
788	0xc3, 0x55, 0xff, 0x41, 0x3e, 0xe3, 0xef, 0x44,
789	0xb2, 0xc0, 0x01, 0x18, 0xa2, 0x49, 0x88, 0x78,
790	0x0d, 0x4c, 0xc8, 0x73, 0xcf, 0x30, 0x85, 0x3a,
791	0x88, 0x90, 0x01, 0xcf, 0x69, 0x53, 0xa3, 0x18,
792	0x3f, 0xd6, 0xe7, 0x94, 0x14, 0xa7, 0xae, 0xcd,
793	0x6f, 0x11, 0x72, 0xfe, 0x2b, 0xb0, 0x81, 0x53,
794	0xea, 0x67, 0xd6, 0xe4, 0xca, 0x42, 0xa0, 0xf9,
795	0xb1, 0xd4, 0xb5, 0x3b, 0xc9, 0xf0, 0x36, 0xc1,
796	0x1c, 0xf4, 0xb1, 0xf6, 0x84, 0xd0, 0x86, 0x6c,
797	0x76, 0x9a, 0x03, 0xc2, 0xb6, 0x2e, 0x9a, 0x46,
798	0xf5, 0x5f, 0x2c, 0x38, 0xac, 0xad, 0x6f, 0x2e,
799	0x7a, 0x18, 0x2d, 0x22, 0x95, 0x5e, 0x5e, 0xc9,
800	0x7a, 0x0a, 0x56, 0xe1, 0xc7, 0x15, 0xfd, 0xbf,
801	0xff, 0xf7, 0x7e, 0x85, 0x20, 0xa9, 0x8a, 0x9c,
802	0xa9, 0x7d, 0xe8, 0xed, 0xfc, 0x7f, 0xbb, 0xf0,
803	0x05, 0x3f, 0xce, 0x4f, 0x4c, 0xee, 0xa4, 0xa0,
804	0xcc, 0x9c, 0x62, 0x1e, 0xd6, 0xd0, 0x30, 0x37,
805	0xb8, 0x98, 0x56, 0x1d, 0xaa, 0xd6, 0x5e, 0x73,
806	0x12, 0xe4, 0x88, 0x82, 0x48, 0x64, 0x06, 0xd7,
807	0x2a, 0x31, 0x50, 0x7b, 0x10, 0x17, 0xb8, 0x4c,
808	0x5a, 0x8d, 0xf1, 0xfc, 0xf1, 0x33, 0x3b, 0x98,
809	0x42, 0x18, 0x5b, 0x35, 0x78, 0xca, 0x8e, 0x41,
810	0x52, 0xae, 0x6d, 0xe1, 0xa2, 0x9d, 0x5b, 0xbd,
811	0xf3, 0x5f, 0x49, 0xc1, 0x27, 0x06, 0xc1, 0xaf,
812	0xc0, 0xa3, 0x9d, 0xf3, 0x1c, 0x8e, 0x90, 0x8a,
813	0xb0, 0x69, 0xb0, 0xc5, 0x11, 0x0c, 0x91, 0x14,
814	0x1f, 0x5e, 0x10, 0xe1, 0x1d, 0x14, 0x30, 0x54,
815	0x1e, 0x17, 0x3d, 0x31, 0x7b, 0xbf, 0x2f, 0x9d,
816	0x6d, 0x63, 0x32, 0xf0, 0x9d, 0x9f, 0x95, 0x3d,
817	0x0b, 0xd2, 0x4d, 0x10, 0xe2, 0x3f, 0x67, 0x69,
818	0x43, 0x9a, 0x4a, 0x2c, 0x54, 0x71, 0xa8, 0xa0,
819	0x9e, 0x9f, 0x10, 0xaf, 0x1b, 0xce, 0x99, 0xe3,
820	0x25, 0x32, 0x10, 0x54, 0x80, 0xfe, 0xda, 0x57,
821	0xd0, 0xb2, 0x92, 0x7f, 0xbb, 0x5f, 0xe7, 0x4d,
822	0x1b, 0x3d, 0x46, 0x4d, 0xe4, 0x4c, 0xd6, 0xaf,
823	0x1a, 0x32, 0x12, 0x40, 0xb8, 0x84, 0x8e, 0xe4,
824	0x80, 0xce, 0x7e, 0xc1, 0x13, 0x8b, 0xb0, 0xb7,
825	0x6f, 0x24, 0xba, 0x85, 0x50, 0x83, 0xc3, 0xcf,
826	0x19, 0xb3, 0xf0, 0xc7, 0xee, 0x68, 0xbe, 0x9e,
827	0x6d, 0xb9, 0xfb, 0xd5, 0x29, 0xce, 0x82, 0xcd,
828	0x69, 0x16, 0x68, 0x6b, 0x6a, 0xf4, 0x02, 0x32,
829	0xce, 0x60, 0x37, 0x0c, 0xb9, 0x38, 0x92, 0x9c,
830	0x42, 0xa9, 0x0b, 0x53, 0x96, 0xfe, 0x39, 0xc1,
831	0x24, 0x65, 0x9b, 0xcd, 0xe7, 0x8d, 0x36, 0x07,
832	0x9f, 0x1d, 0x35, 0x8e, 0xdc, 0x4c, 0xb5, 0x68,
833	0xc5, 0xfd, 0x44, 0x19, 0xf2, 0x6c, 0x59, 0x1c,
834	0xb1, 0x0b, 0x35, 0x48, 0x86, 0x1a, 0x05, 0x22,
835	0x03, 0x0c, 0x0c, 0xa2, 0x92, 0x90, 0x35, 0xfb,
836	0x37, 0x94, 0xc7, 0x15, 0x84, 0xae, 0xe8, 0x05,
837	0xa0, 0xf7, 0x30, 0x11, 0x5c, 0xe4, 0x5d, 0x3e,
838	0x12, 0x54, 0x80, 0x54, 0x6b, 0x09, 0x8c, 0xce,
839	0x80, 0x5e, 0xa7, 0xc8, 0x6a, 0x0c, 0x56, 0xe1,
840	0x18, 0x7d, 0xc9, 0x39, 0xc1, 0xef, 0xe3, 0x25,
841	0xa0, 0x8b, 0x2f, 0x60, 0x3a, 0x43, 0x39, 0xa6,
842	0x28, 0x28, 0x7b, 0x4c, 0x77, 0xd4, 0x49, 0x61,
843	0x46, 0xe9, 0x1b, 0x45, 0xd6, 0xb1, 0x56, 0xe1,
844	0x7d, 0x34, 0xcd, 0x06, 0xb6, 0x67, 0x8d, 0x7d,
845	0x7a, 0xe2, 0xbe, 0x68, 0x35, 0xa6, 0x78, 0xe5,
846	0x47, 0x48, 0xb7, 0xc7, 0xde, 0xcd, 0xc9, 0x05,
847	0xb4, 0xe7, 0x50, 0x48, 0xe1, 0x4b, 0xfe, 0x76,
848	0x77, 0xc6, 0xf7, 0x5f, 0xcb, 0xc2, 0xa8, 0xd7,
849	0xd6, 0x8a, 0xe5, 0x49, 0xd9, 0xca, 0x45, 0xf4,
850	0xda, 0xcd, 0x33, 0xd1, 0x59, 0x2d, 0x9e, 0xc1,
851	0x5c, 0xe6, 0x01, 0x18, 0xb8, 0xf0, 0x5e, 0xb1,
852	0x69, 0x95, 0x2f, 0x02, 0x2a, 0xe7, 0x4a, 0xd7,
853	0xd1, 0xc3, 0xd5, 0x6f, 0x15, 0xc8, 0xdc, 0x29,
854	0xde, 0xb9, 0x3f, 0x8b, 0xa6, 0xbc, 0xdd, 0x25,
855	0x84, 0x35, 0x3c, 0x90, 0x2d, 0xc2, 0x1e, 0x98,
856	0x8a, 0x50, 0x09, 0x77, 0x42, 0xe9, 0x35, 0x8a,
857	0x7c, 0x97, 0xbf, 0xe8, 0xbf, 0x56, 0xd0, 0x8b,
858	0x65, 0xd3, 0xaf, 0x1e, 0x05, 0x94, 0xfa, 0xac,
859	0xa8, 0x2b, 0x28, 0xcb, 0x37, 0x3e, 0xe8, 0xbb,
860	0x66, 0x3a, 0xed, 0xb2, 0x48, 0x10, 0x0f, 0x3a,
861	0x5a, 0xc5, 0xdb, 0x26, 0x0e, 0xaa, 0x5e, 0x69,
862	0x15, 0xd6, 0x81, 0xae, 0xbd, 0xe6, 0x03, 0xf1,
863	0xf6, 0x37, 0xc8, 0xde, 0x70, 0x1f, 0x64, 0xb9,
864	0x5e, 0xbf, 0x2e, 0x4f, 0xb1, 0xea, 0xa0, 0x17,
865	0xe6, 0x7c, 0xf9, 0x2f, 0x1e, 0xd8, 0x58, 0xde,
866	0xa7, 0xf0, 0x46, 0x52, 0x95, 0xdf, 0xa4, 0x96,
867	0xd0, 0xc4, 0x97, 0x2b, 0x95, 0xcd, 0x5e, 0x40,
868	0x23, 0x5c, 0x10, 0xee, 0xba, 0x72, 0x9b, 0xcf,
869	0x0b, 0xe8, 0x18, 0x3a, 0x70, 0xd2, 0x5e, 0x07,
870	0x68, 0x93, 0xef, 0x4a, 0x5b, 0x8d, 0x72, 0x41,
871	0x4e, 0xea, 0x33, 0x6a, 0x0a, 0x5e, 0xfb, 0x02,
872	0x3f, 0xd4, 0xed, 0x5b, 0xe0, 0x42, 0x84, 0xd4,
873	0xaa, 0x85, 0xdc, 0x5b, 0x67, 0xee, 0x71, 0x67,
874	0xba, 0x8e, 0xd2, 0xbe, 0x61, 0xdf, 0x5a, 0x26,
875	0xb9, 0xf0, 0x77, 0x81, 0x53, 0x24, 0x16, 0xcb,
876	0x8c, 0xb8, 0x06, 0x6e, 0x68, 0xda, 0xc8, 0x2d,
877	0x17, 0x54, 0xdb, 0x46, 0xcb, 0xfd, 0x1f, 0x3d,
878	0x94, 0x81, 0x09, 0x4b, 0xfa, 0xb1, 0x46, 0xd9,
879	0x11, 0xa3, 0xb7, 0x31, 0x9c, 0xd2, 0x38, 0xd6,
880	0xba, 0x3d, 0xa3, 0x74, 0xd8, 0xf1, 0x24, 0xe8,
881	0x9c, 0xcb, 0x1d, 0xf9, 0x4a, 0xf7, 0xc8, 0x4b,
882	0xfe, 0x97, 0x7c, 0xa1, 0x02, 0xeb, 0x40, 0xc3,
883	0x89, 0x71, 0x01, 0xcd, 0x33, 0x2a, 0xc2, 0x82,
884	0xce, 0x62, 0x8d, 0x53, 0x7c, 0xdf, 0xce, 0xd7,
885	0xf5, 0xa8, 0x4f, 0xf2, 0xf2, 0x2e, 0xc1, 0xeb,
886	0x97, 0x99, 0x37, 0x3c, 0x53, 0xa6, 0xb4, 0x46,
887	0x05, 0x64, 0x92, 0x87, 0x08, 0x3c, 0x23, 0x4b,
888	0x9d, 0x67, 0x18, 0xf9, 0xe2, 0x0b, 0x1c, 0x39,
889	0xd3, 0x87, 0x70, 0xc0, 0xb9, 0x1e, 0x52, 0x0a,
890	0x0f, 0x48, 0xe2, 0xe7, 0x51, 0x72, 0x94, 0xf7,
891	0xa3, 0xdc, 0xe5, 0x66, 0x33, 0x39, 0x54, 0x06,
892	0x55, 0x93, 0x30, 0xf9, 0x5e, 0x76, 0x8f, 0xe0,
893	0x59, 0x4d, 0x0d, 0xa7, 0xf5, 0xbe, 0xdb, 0x20,
894	0xad, 0x0d, 0x76, 0x88, 0x5f, 0x9c, 0x7c, 0x75,
895	0x2f, 0x2a, 0x0b, 0x79, 0x6e, 0xd3, 0xe2, 0x66,
896	0xf5, 0x4a, 0x2d, 0x87, 0x87, 0x49, 0x84, 0x17,
897	0xa2, 0x62, 0x4c, 0xbb, 0xe4, 0x6e, 0x98, 0x10,
898	0xc9, 0xfb, 0x8a, 0x04, 0x68, 0x8d, 0x22, 0x66,
899	0xad, 0xea, 0x2a, 0xc9, 0x97, 0x2d, 0x3c, 0xbc,
900	0xd0, 0x77, 0x5f, 0xe6, 0xb8, 0x7f, 0xe6, 0xf6,
901	0x39, 0xbf, 0x56, 0x0e, 0x26, 0x6d, 0xc5, 0x3e,
902	0x53, 0x19, 0xd6, 0xb4, 0x57, 0x36, 0xa3, 0xc6,
903	0xd3, 0x3d, 0x66, 0x79, 0x30, 0x5c, 0x14, 0x0c,
904	0x0f, 0x3e, 0x96, 0xae, 0x90, 0x97, 0xab, 0x0d,
905	0x9f, 0xc3, 0xe7, 0x66, 0x3e, 0xe0, 0x31, 0x43,
906	0x4b, 0x01, 0xb3, 0x0e, 0x9e, 0x8c, 0x82, 0x4a,
907	0x8c, 0xc7, 0x79, 0x85, 0xdf, 0x75, 0x0d, 0xb4,
908	0x2b, 0x03, 0x14, 0xef, 0x72, 0x58, 0xfd, 0x64,
909	0xc8, 0xe3, 0x0d, 0x9a, 0x14, 0x6f, 0x76, 0xf9,
910	0x46, 0xd1, 0xd2, 0x81, 0xb3, 0x16, 0x6e, 0xc7,
911	0x76, 0x82, 0xce, 0xf4, 0xee, 0x33, 0x00, 0xe6,
912	0x77, 0xc4, 0xad, 0x4f, 0x06, 0xa7, 0x48, 0x80,
913	0x9e, 0x21, 0x66, 0xca, 0x75, 0x69, 0x57, 0xcb,
914	0xf0, 0x67, 0x6a, 0xaa, 0x8f, 0x88, 0x14, 0xbd,
915	0x65, 0x62, 0xe2, 0xad, 0xcc, 0x22, 0x88, 0x7b,
916	0x94, 0xbd, 0x0e, 0xcd, 0xb6, 0x69, 0xa2, 0xcb,
917	0x7d, 0x57, 0x5c, 0xb4, 0x92, 0x80, 0x13, 0x99,
918	0x84, 0xf3, 0x79, 0x0a, 0x2d, 0x70, 0xa4, 0xe0,
919	0xde, 0xc6, 0x32, 0xb0, 0x8a, 0x62, 0xb5, 0xcf,
920	0xfa, 0x5e, 0x5a, 0x92, 0x32, 0x7d, 0x34, 0x07,
921	0xb5, 0x52, 0x3a, 0xb5, 0x7d, 0x0f, 0xa1, 0xba,
922	0x56, 0xd0, 0x07, 0x76, 0x11, 0xf2, 0xc3, 0x33,
923	0x9d, 0xbd, 0x12, 0x35, 0x5e, 0xf7, 0x05, 0x88,
924	0x76, 0x94, 0xa6, 0xbf, 0xed, 0xb8, 0xa4, 0xa2,
925	0x0c, 0xbe, 0x0f, 0x6a, 0xaf, 0xf3, 0x1b, 0x33,
926	0x4a, 0xb7, 0x68, 0x3f, 0xbe, 0x95, 0x13, 0x97,
927	0x0f, 0x15, 0x17, 0x1b, 0x23, 0xaa, 0x08, 0x78,
928	0xa6, 0x5b, 0x08, 0xa2, 0x9d, 0x03, 0xa8, 0xa7,
929	0x39, 0xdc, 0xbc, 0x9a, 0x85, 0xf5, 0xe5, 0x55,
930	0x59, 0x3c, 0xef, 0xf9, 0x3f, 0x22, 0x8e, 0xf8,
931	0xd8, 0x3e, 0x02, 0x0b, 0xd8, 0x78, 0x4b, 0x15,
932	0x7f, 0xaa, 0x2c, 0xff, 0xbe, 0x77, 0x33, 0xc7,
933	0x6a, 0x12, 0xaa, 0xa4, 0xbe, 0xc0, 0x3b, 0xcb,
934	0x13, 0x9d, 0x9c, 0x5a, 0x9f, 0x8a, 0x57, 0x36,
935	0x4f, 0x02, 0x5a, 0xf8, 0x1d, 0x97, 0x77, 0x43,
936	0xc8, 0xa5, 0xb7, 0x9b, 0x10, 0x98, 0xfd, 0x58,
937	0xbf, 0x42, 0xf6, 0xbf, 0xff, 0x6c, 0x40, 0x18,
938	0x18, 0xdf, 0xac, 0x57, 0x71, 0xea, 0xcc, 0x8e,
939	0xfd, 0xfe, 0x10, 0xfb, 0xb9, 0xfe, 0xbc, 0x9a,
940	0x9c, 0x27, 0xe4, 0x10, 0x15, 0x94, 0x41, 0xa1,
941	0xcc, 0xf6, 0x25, 0x49, 0x4f, 0x96, 0xc1, 0x8c,
942	0x9e, 0x3e, 0x18, 0x29, 0x49, 0x92, 0xe7, 0xfe,
943	0x22, 0xff, 0xed, 0x02, 0x16, 0x90, 0xef, 0xac,
944	0xec, 0x95, 0x1d, 0x5b, 0x94, 0x9c, 0xf6, 0x7c,
945	0x1b, 0x5a, 0x9d, 0xb0, 0x9b, 0x05, 0x36, 0xbf,
946	0xef, 0xec, 0x63, 0x35, 0x40, 0x24, 0x45, 0x40,
947	0x30, 0x1a, 0x9b, 0x90, 0xc3, 0xc2, 0xf7, 0x37,
948	0xfb, 0x08, 0x8e, 0x48, 0x19, 0x48, 0xed, 0xa8,
949	0xa8, 0x04, 0x6f, 0xd0, 0x33, 0xe9, 0xb8, 0x8d,
950	0xe7, 0x1e, 0x5c, 0x47, 0x74, 0xc0, 0x66, 0x30,
951	0x4e, 0xa7, 0x86, 0x73, 0xf1, 0xe5, 0x78, 0xa6,
952	0xe0, 0xc1, 0xda, 0x13, 0x72, 0x07, 0x85, 0x34,
953	0x63, 0x95, 0x49, 0x30, 0x4b, 0x9d, 0x03, 0xf1,
954	0x7a, 0x6b, 0x91, 0xa2, 0x85, 0x41, 0xf9, 0x4a,
955	0xd6, 0xff, 0xff, 0x86, 0xf7, 0xf0, 0xce, 0xb9,
956	0x07, 0xf1, 0x88, 0x04, 0x33, 0xaa, 0xeb, 0x54,
957	0xb2, 0x1c, 0x8e, 0x2e, 0x7b, 0x04, 0xa8, 0xcc,
958	0x2c, 0x7a, 0xb3, 0xad, 0x1a, 0x89, 0x38, 0x89,
959	0xd7, 0x11, 0x3a, 0x8c, 0xcf, 0xe3, 0xc5, 0xba,
960	0xb0, 0xcc, 0xc4, 0xe3, 0x33, 0xf3, 0x18, 0xba,
961	0xec, 0x56, 0xd9, 0x1c, 0x40, 0x70, 0x0d, 0x4e,
962	0x97, 0x01, 0x23, 0xf3, 0x5a, 0xdc, 0xbf, 0x68,
963	0x93, 0xc2, 0x1d, 0x8a, 0x96, 0xb7, 0xac, 0x18,
964	0x6f, 0xf7, 0x84, 0x71, 0x0d, 0x3d, 0xf8, 0xba,
965	0xdf, 0xb6, 0x89, 0x1d, 0x78, 0x19, 0xf2, 0x59,
966	0xe9, 0x15, 0x55, 0x29, 0x73, 0x50, 0x59, 0x14,
967	0x02, 0x21, 0x16, 0x8f, 0x0f, 0xdf, 0xa5, 0xf0,
968};
969
970static struct crc_test {
971	uint32_t crc;		/* random starting crc */
972	uint32_t start;		/* random offset in buf */
973	uint32_t length;	/* random length of test */
974	uint32_t crc_le;	/* expected crc32_le result */
975	uint32_t crc_be;	/* expected crc32_be result */
976} test[] = {
977	{0xffffffff, 0x00000000, 0x00001000, 0x13934bef, 0x14f3b75f},
978	{0xfe7328ea, 0x00000763, 0x00000717, 0xed2c0d70, 0x57531214},
979	{0x4c40684e, 0x00000721, 0x0000011e, 0xd7f46ccc, 0xedf12ec3},
980	{0x6b487f90, 0x00000264, 0x000007bc, 0x759e9939, 0x9af8e387},
981	{0x9f5810db, 0x00000afa, 0x00000255, 0x2685197f, 0x716de6ed},
982	{0xb15c4755, 0x00000d5b, 0x000002a4, 0xd8fadcb5, 0xfc34ae3f},
983	{0x06518253, 0x00000ffb, 0x00000004, 0xabee2433, 0xfa30ac9e},
984	{0xd9e71c55, 0x00000a2a, 0x00000259, 0x96682af2, 0xe5907ea3},
985	{0x0c1ae843, 0x00000ce4, 0x0000031b, 0x7b637c43, 0xe7f71b04},
986	{0xec3cd517, 0x000002ff, 0x00000566, 0x5d719a77, 0xed16e045},
987	{0x77828e95, 0x0000067f, 0x0000038f, 0x43ee5b6c, 0x35999927},
988	{0xec87b4e3, 0x00000d1c, 0x000002e3, 0x2ddd2eee, 0x9452d3f8},
989	{0x412158bb, 0x00000eee, 0x00000111, 0x67b38ba2, 0x177976d0},
990	{0x2e52de3e, 0x00000c4a, 0x000003b5, 0xbcc5d61d, 0xf60fee71},
991	{0x6ddaae8b, 0x00000d99, 0x00000266, 0x8b535544, 0x1dab8596},
992	{0x049b6cb1, 0x000009c5, 0x000000b0, 0xfc22cabc, 0x47ebc954},
993	{0x77d4b954, 0x0000028a, 0x000007fa, 0x71d00923, 0x905585ef},
994	{0x5e192355, 0x00000ac1, 0x000001fa, 0xb966b81a, 0x33c12903},
995	{0x7d80b71d, 0x00000213, 0x000001e0, 0x2bba371a, 0x5f4bd8d9},
996	{0x01f6f1e4, 0x000001d6, 0x00000395, 0xb7e8a647, 0x2a7943a1},
997	{0x1dfabb13, 0x00000e14, 0x000001eb, 0x53917fba, 0x8dee1e5d},
998	{0xb00a4449, 0x00000bf6, 0x00000409, 0xedecb577, 0x628e087d},
999	{0x7ecd3981, 0x0000083f, 0x0000016b, 0xefef62b9, 0xda4f94e6},
1000	{0xf8f330d2, 0x000004be, 0x00000757, 0x9357c9f3, 0x8e2d5c2f},
1001	{0x03c38af2, 0x00000d23, 0x000002dc, 0x360fa8c0, 0x6294c0d6},
1002	{0x687bb79b, 0x00000f3d, 0x000000c2, 0x448d3be2, 0x08f48f3a},
1003	{0x6710f550, 0x000009e9, 0x00000603, 0xdbfd1998, 0xc950ac29},
1004	{0x873171d1, 0x00000787, 0x000004d5, 0xab7f1b62, 0xe66896ab},
1005	{0x373b1314, 0x00000f0f, 0x000000f0, 0x184098ab, 0x4038e674},
1006	{0x90fad9cd, 0x00000ead, 0x00000152, 0x23ce52ff, 0x9eff3974},
1007	{0x19676fe7, 0x0000007d, 0x0000070d, 0xf8a76f1e, 0xfbc5c8a9},
1008	{0x89facd45, 0x000005f3, 0x00000473, 0x4331a006, 0xb8f0f0cc},
1009	{0x6f173747, 0x00000fc3, 0x0000003c, 0xb012f08e, 0x5126e378},
1010	{0x4b44a106, 0x0000075a, 0x0000008b, 0xf6f7ac38, 0xf9b1781b},
1011	{0xb620ad06, 0x00000774, 0x0000017e, 0xd34558e6, 0xb175edd3},
1012	{0x976f21e9, 0x000008d7, 0x0000034a, 0xe533aa3a, 0x1e4367b9},
1013	{0x687628c0, 0x000006c5, 0x0000061b, 0x3a840b15, 0xfb5989a0},
1014	{0xe24ac108, 0x00000cd0, 0x0000032f, 0x51010ae8, 0xcdd8f182},
1015	{0x361c44a3, 0x00000304, 0x00000719, 0xfd7bd481, 0x12de540f},
1016	{0xd93ff95e, 0x00000db7, 0x0000008e, 0xcfbbc304, 0x42eecd5a},
1017	{0xed752d12, 0x00000883, 0x00000091, 0x65a6c868, 0x9ebfa578},
1018	{0xb4ff4b54, 0x000003d3, 0x000001c1, 0xf82597e7, 0xa8ad2b19},
1019	{0x111b520f, 0x00000708, 0x000000eb, 0xc3e109f3, 0x323ace17},
1020	{0x62c806f2, 0x00000ba3, 0x0000045c, 0x874d3a72, 0xaf1a1360},
1021	{0x40d97470, 0x000005e1, 0x0000058d, 0x87a9684f, 0x524244a8},
1022	{0x4312179c, 0x00000056, 0x0000070e, 0x809a00f5, 0xf9e940b0},
1023	{0x13d5f84c, 0x00000a2d, 0x00000104, 0xf3d27578, 0x5d33341c},
1024	{0x1f302cb2, 0x00000151, 0x00000014, 0x1e162693, 0x53c3cfc3},
1025	{0xe491db24, 0x00000600, 0x000006f6, 0x7ff09615, 0xa300ecf7},
1026	{0xf9a98069, 0x000002ba, 0x000002ad, 0x01af7387, 0x31c0911e},
1027	{0xe9c477ad, 0x0000015f, 0x00000778, 0x6facf9a0, 0x1993b688},
1028	{0x353f32b2, 0x0000087c, 0x00000783, 0x6cc964ea, 0x418db561},
1029	{0x78e1b24f, 0x00000650, 0x000006a8, 0xb3bb7c27, 0xf2aad006},
1030	{0x61aa400e, 0x00000049, 0x00000254, 0xb8cd1681, 0x79150b15},
1031	{0xb84b10b0, 0x00000f73, 0x0000008c, 0x406a6450, 0x0c705222},
1032	{0x9fa99c9c, 0x00000a7c, 0x000004d7, 0xfb3d21b4, 0xe4e789df},
1033	{0x3fc9ebe3, 0x00000cd9, 0x000000d6, 0x43803f9c, 0x5a152be5},
1034	{0x529879cd, 0x000002f2, 0x00000595, 0x78b4c6a6, 0xf7236ec4},
1035	{0x3a933019, 0x00000516, 0x00000266, 0xdcb45436, 0x2c7935f5},
1036	{0x887b4977, 0x00000227, 0x0000038d, 0xc5f7c3d9, 0x0d6d7df6},
1037	{0x770745de, 0x000008c6, 0x00000739, 0xf69145e8, 0x47d5efc9},
1038	{0x28be3b47, 0x00000c46, 0x0000032b, 0x764c028f, 0x1eb70d64},
1039	{0x5013a050, 0x00000cf6, 0x00000309, 0xea8fe164, 0x186affa4},
1040	{0x2ec4c9ba, 0x000006e8, 0x0000078d, 0xa35557a9, 0xb41f49ec},
1041	{0xa9f950c9, 0x00000d33, 0x000002cc, 0x41ea8618, 0xab8dfae3},
1042	{0x5b520229, 0x000007b2, 0x00000484, 0x44569f1f, 0x607a8052},
1043	{0xd8dcbbfc, 0x0000002f, 0x0000048c, 0xdb88ab8b, 0xf1c411f1},
1044	{0x25529792, 0x00000d1d, 0x000002e2, 0x20cda404, 0x32683a2d},
1045	{0x9f3f6d71, 0x00000238, 0x0000079a, 0x0720443e, 0x4b8ba2ff},
1046	{0x64121215, 0x000007ff, 0x0000038f, 0x6aacff2c, 0x3b84233b},
1047	{0xfb6cdde0, 0x00000ef8, 0x00000107, 0xbd43a0f1, 0x926624d0},
1048	{0x221c9d6f, 0x000007b6, 0x0000014f, 0xb67f834b, 0x2bdedda4},
1049	{0x030e1de4, 0x00000836, 0x000004b4, 0x0d67d26a, 0x75a73b73},
1050	{0xb56fa6cf, 0x00000c07, 0x000003f8, 0x60601ac1, 0x10a43f35},
1051	{0xb55c89f5, 0x0000098e, 0x000001d4, 0x2400efbe, 0x006e28eb},
1052	{0x5e90b6d5, 0x0000070b, 0x000003ea, 0x3bb5d6ea, 0xb175fa6b},
1053	{0x2a7045ae, 0x00000961, 0x00000633, 0xfca89e4b, 0x962cd6d2},
1054	{0x8b374ea9, 0x000006ba, 0x00000780, 0xbce036ed, 0x4dc8279b},
1055	{0x8bd90bc9, 0x00000562, 0x00000369, 0xcb26a24b, 0x50dee743},
1056	{0x5b1b1762, 0x000000fd, 0x0000051a, 0x33cdda07, 0xee75ff7b},
1057	{0xa4153555, 0x0000058f, 0x000005c7, 0xbe50eeca, 0xe73fffcc},
1058	{0x0be1f931, 0x00000651, 0x00000672, 0x95a25753, 0x4ad6270f},
1059	{0xb7e78618, 0x00000a7f, 0x000002bb, 0xe06bcc1c, 0x1a35ee59},
1060	{0x4a9bc41b, 0x00000e51, 0x000001ae, 0x709e8d2c, 0x75080ca8},
1061	{0xfc359d13, 0x00000440, 0x000002f8, 0x0a58451f, 0x6fa3cfbf},
1062	{0x5aa48619, 0x000006d1, 0x00000284, 0x928ead83, 0xbd600efc},
1063	{0xa609afa8, 0x0000053e, 0x00000272, 0xb048c141, 0x184f80bb},
1064	{0x3f108afb, 0x00000949, 0x00000150, 0x9a6bb5bc, 0x0ea02be1},
1065	{0x79bec2d3, 0x000008ed, 0x00000712, 0x32692d57, 0x2eb13289},
1066	{0x9429e067, 0x00000bc3, 0x0000043c, 0x5295ceff, 0x8a9014a7},
1067	{0xae58b96a, 0x0000082d, 0x000007d2, 0xc2a681ba, 0x6af94089},
1068	{0x95df24be, 0x00000985, 0x000004c1, 0x3a287765, 0x379fcb42},
1069	{0x5e94976f, 0x00000596, 0x000004ed, 0xff00c489, 0x991fc1f5},
1070	{0xf5e5f1de, 0x00000d31, 0x000002ce, 0x35f28e91, 0x543def1a},
1071	{0xa2c219cf, 0x00000a3c, 0x00000374, 0x707d21eb, 0xa6d28bc1},
1072	{0xf21b6ceb, 0x00000919, 0x00000135, 0x0847fb8b, 0x224468c2},
1073	{0xaa988728, 0x00000787, 0x00000771, 0x885aeaa4, 0x814db00b},
1074	{0xaa5dfaac, 0x000003e5, 0x0000051b, 0x52c48ab7, 0x725bef8a},
1075	{0x0a053968, 0x00000d2a, 0x000002d5, 0x7a90256d, 0xc53b9402},
1076	{0x1421dc20, 0x00000eef, 0x00000110, 0x97d6da24, 0x10846935},
1077	{0xb47c2166, 0x00000a6a, 0x00000209, 0xcfd6cc52, 0x46e2797e},
1078	{0x77dd1955, 0x000000de, 0x00000266, 0xba74bcaa, 0x4fa3fe9c},
1079	{0x68a03cc2, 0x0000082f, 0x000007b0, 0x752bd5d8, 0x4f760c63},
1080	{0x0226b0a3, 0x00000a5f, 0x000005a0, 0x82de4970, 0x8ee1310e},
1081	{0x637bf3b1, 0x00000d93, 0x0000026c, 0x5c7115cb, 0x9f6a0ced},
1082	{0x3b120edf, 0x00000c13, 0x000003ec, 0x80d7d20f, 0x241657d5},
1083	{0xe2456780, 0x000002eb, 0x00000641, 0xc0a5d289, 0x74df96b4},
1084	{0x9b2e7125, 0x00000c0c, 0x000003f3, 0xcc15f57e, 0x03e290bf},
1085	{0x153033ef, 0x00000787, 0x000006b6, 0x3cde443b, 0x7bf1d121},
1086	{0x18458b3f, 0x0000066c, 0x00000561, 0x9a2bd8c6, 0x9d564bef},
1087	{0x4ff9d4b9, 0x00000c8f, 0x0000033a, 0xd0ee6d6d, 0xee00aa0b},
1088	{0xdf84b5d9, 0x00000802, 0x0000029a, 0xdab0d74a, 0xd0cb63dc},
1089	{0x81ee15df, 0x000003ce, 0x00000725, 0x9942e2de, 0xe48fb26b},
1090	{0x5c768e04, 0x00000afd, 0x00000160, 0x36110831, 0x8dc74483},
1091	{0xe5e18094, 0x00000b4b, 0x000000a0, 0xffa3e4a7, 0xc0145e1b},
1092	{0xed7263b6, 0x00000d0d, 0x000002f2, 0xb0006a35, 0x5468ae3a},
1093	{0x5bfde7d7, 0x000006fb, 0x00000554, 0xa4193b76, 0xb73d34b2},
1094	{0x67f4a743, 0x00000b85, 0x0000047a, 0xf05c8d8f, 0x4f843e49},
1095	{0xf13bdf22, 0x00000ff7, 0x00000008, 0x816351eb, 0x41f537f6},
1096	{0x08ecc608, 0x00000d5d, 0x00000098, 0x90492772, 0xf5172204},
1097	{0x296f52ba, 0x000004f9, 0x00000788, 0x5e5a4896, 0xe01d5b46},
1098	{0xbe4624c2, 0x00000427, 0x000004ef, 0xcd267b94, 0x7b9069f4},
1099	{0x906f7c7c, 0x00000a05, 0x0000003f, 0x03fcfc33, 0x7b6ff563},
1100	{0x8f7b323e, 0x00000458, 0x000004c7, 0xcd4969c8, 0xd4c22ada},
1101	{0x88d6593d, 0x00000597, 0x000005b5, 0xf199cd3b, 0x5c3e8ca2},
1102	{0x978a7768, 0x00000268, 0x000001d3, 0xb28c95bd, 0x49a2cc67},
1103	{0x857a621e, 0x000007a7, 0x000003a8, 0xf4bf84ab, 0xde26f369},
1104	{0xb0e121ef, 0x000005be, 0x00000644, 0x28747c14, 0x61d4dc6b},
1105	{0, 0, 0, 0, 0},
1106};
1107
1108static int test_crc32c(void)
1109{
1110	struct crc_test *t = test;
1111	int failures = 0;
1112
1113	while (t->length) {
1114		uint32_t be, le;
1115		le = ext2fs_crc32c_le(t->crc, test_buf + t->start, t->length);
1116		be = ext2fs_crc32c_be(t->crc, test_buf + t->start, t->length);
1117		if (le != t->crc_le) {
1118			printf("Test %d LE fails, %x != %x\n",
1119			       (int) (t - test), le, t->crc_le);
1120			failures++;
1121		}
1122		if (be != t->crc_be) {
1123			printf("Test %d BE fails, %x != %x\n",
1124			       (int) (t - test), be, t->crc_be);
1125			failures++;
1126		}
1127		t++;
1128	}
1129
1130	return failures;
1131}
1132
1133int main(int argc, char *argv[])
1134{
1135	int ret;
1136
1137	ret = test_crc32c();
1138	if (!ret)
1139		printf("No failures.\n");
1140
1141	return ret;
1142}
1143#endif /* UNITTEST */
1144