• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 */
crc32c_le_body(uint32_t crc,uint8_t const * buf,size_t len)75 static 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
crc32c_be_body(uint32_t crc,uint8_t const * buf,size_t len)145 static 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 */
crc32c_le_body(uint32_t crc,uint8_t const * buf,size_t len)212 static 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
crc32c_be_body(uint32_t crc,uint8_t const * buf,size_t len)292 static 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  */
ext2fs_crc32c_le(uint32_t crc,unsigned char const * p,size_t len)378 uint32_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  */
ext2fs_crc32c_be(uint32_t crc,unsigned char const * p,size_t len)419 uint32_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
455 static 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 
970 static 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 
test_crc32c(void)1108 static 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 
main(int argc,char * argv[])1133 int 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