blob: 61774b8db4de6911453ccd383df7d38dd2f2b42f [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Bob Pearson78dff412012-03-23 15:02:24 -07002 * Aug 8, 2011 Bob Pearson with help from Joakim Tjernlund and George Spelvin
3 * cleaned up code to current version of sparse and added the slicing-by-8
4 * algorithm to the closely similar existing slicing-by-4 algorithm.
5 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07006 * Oct 15, 2000 Matt Domsch <Matt_Domsch@dell.com>
7 * Nicer crc32 functions/docs submitted by linux@horizon.com. Thanks!
8 * Code was from the public domain, copyright abandoned. Code was
9 * subsequently included in the kernel, thus was re-licensed under the
10 * GNU GPL v2.
11 *
12 * Oct 12, 2000 Matt Domsch <Matt_Domsch@dell.com>
13 * Same crc32 function was used in 5 other places in the kernel.
14 * I made one version, and deleted the others.
15 * There are various incantations of crc32(). Some use a seed of 0 or ~0.
16 * Some xor at the end with ~0. The generic crc32() function takes
17 * seed as an argument, and doesn't xor at the end. Then individual
18 * users can do whatever they need.
19 * drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0.
20 * fs/jffs2 uses seed 0, doesn't xor with ~0.
21 * fs/partitions/efi.c uses seed ~0, xor's with ~0.
22 *
23 * This source code is licensed under the GNU General Public License,
24 * Version 2. See the file COPYING for more details.
25 */
26
Bob Pearsonfbedceb2012-03-23 15:02:22 -070027/* see: Documentation/crc32.txt for a description of algorithms */
28
Linus Torvalds1da177e2005-04-16 15:20:36 -070029#include <linux/crc32.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070030#include <linux/module.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/types.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include "crc32defs.h"
Bob Pearson60e58d52012-03-23 15:02:22 -070033
Bob Pearson9a1dbf62012-03-23 15:02:23 -070034#if CRC_LE_BITS > 8
Bob Pearsonce4320d2012-03-23 15:02:23 -070035# define tole(x) ((__force u32) __constant_cpu_to_le32(x))
Linus Torvalds1da177e2005-04-16 15:20:36 -070036#else
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080037# define tole(x) (x)
38#endif
39
Bob Pearson9a1dbf62012-03-23 15:02:23 -070040#if CRC_BE_BITS > 8
Bob Pearsonce4320d2012-03-23 15:02:23 -070041# define tobe(x) ((__force u32) __constant_cpu_to_be32(x))
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080042#else
43# define tobe(x) (x)
Linus Torvalds1da177e2005-04-16 15:20:36 -070044#endif
Bob Pearson60e58d52012-03-23 15:02:22 -070045
Linus Torvalds1da177e2005-04-16 15:20:36 -070046#include "crc32table.h"
47
48MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>");
Darrick J. Wong46c58012012-03-23 15:02:25 -070049MODULE_DESCRIPTION("Various CRC32 calculations");
Linus Torvalds1da177e2005-04-16 15:20:36 -070050MODULE_LICENSE("GPL");
51
Bob Pearson9a1dbf62012-03-23 15:02:23 -070052#if CRC_LE_BITS > 8 || CRC_BE_BITS > 8
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080053
Bob Pearson324eb0f2012-03-23 15:02:24 -070054/* implements slicing-by-4 or slicing-by-8 algorithm */
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080055static inline u32
Joakim Tjernlund836e2af2010-05-24 14:33:31 -070056crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080057{
Andrew Morton0d2daf52010-05-25 23:43:03 -070058# ifdef __LITTLE_ENDIAN
Joakim Tjernlund57423322012-01-10 15:10:18 -080059# define DO_CRC(x) crc = t0[(crc ^ (x)) & 255] ^ (crc >> 8)
Bob Pearson324eb0f2012-03-23 15:02:24 -070060# define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \
61 t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255])
62# define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \
63 t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255])
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080064# else
Joakim Tjernlund57423322012-01-10 15:10:18 -080065# define DO_CRC(x) crc = t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8)
Bob Pearson324eb0f2012-03-23 15:02:24 -070066# define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \
67 t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255])
68# define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \
69 t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255])
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080070# endif
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080071 const u32 *b;
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080072 size_t rem_len;
Bob Pearson0292c492012-03-23 15:02:24 -070073# ifdef CONFIG_X86
74 size_t i;
75# endif
Joakim Tjernlund57423322012-01-10 15:10:18 -080076 const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3];
Thiago Rafael Becker49ac5722012-07-30 14:41:26 -070077# if CRC_LE_BITS != 32
Bob Pearson324eb0f2012-03-23 15:02:24 -070078 const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7];
Thiago Rafael Becker49ac5722012-07-30 14:41:26 -070079# endif
Bob Pearson324eb0f2012-03-23 15:02:24 -070080 u32 q;
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080081
82 /* Align it */
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080083 if (unlikely((long)buf & 3 && len)) {
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080084 do {
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080085 DO_CRC(*buf++);
86 } while ((--len) && ((long)buf)&3);
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080087 }
Bob Pearson324eb0f2012-03-23 15:02:24 -070088
89# if CRC_LE_BITS == 32
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080090 rem_len = len & 3;
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080091 len = len >> 2;
Bob Pearson324eb0f2012-03-23 15:02:24 -070092# else
93 rem_len = len & 7;
94 len = len >> 3;
95# endif
96
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080097 b = (const u32 *)buf;
Bob Pearson0292c492012-03-23 15:02:24 -070098# ifdef CONFIG_X86
99 --b;
100 for (i = 0; i < len; i++) {
101# else
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800102 for (--b; len; --len) {
Bob Pearson0292c492012-03-23 15:02:24 -0700103# endif
Bob Pearson324eb0f2012-03-23 15:02:24 -0700104 q = crc ^ *++b; /* use pre increment for speed */
105# if CRC_LE_BITS == 32
106 crc = DO_CRC4;
107# else
108 crc = DO_CRC8;
109 q = *++b;
110 crc ^= DO_CRC4;
111# endif
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800112 }
113 len = rem_len;
114 /* And the last few bytes */
115 if (len) {
116 u8 *p = (u8 *)(b + 1) - 1;
Bob Pearson0292c492012-03-23 15:02:24 -0700117# ifdef CONFIG_X86
118 for (i = 0; i < len; i++)
119 DO_CRC(*++p); /* use pre increment for speed */
120# else
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800121 do {
122 DO_CRC(*++p); /* use pre increment for speed */
123 } while (--len);
Bob Pearson0292c492012-03-23 15:02:24 -0700124# endif
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800125 }
126 return crc;
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -0800127#undef DO_CRC
Joakim Tjernlund836e2af2010-05-24 14:33:31 -0700128#undef DO_CRC4
Bob Pearson324eb0f2012-03-23 15:02:24 -0700129#undef DO_CRC8
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800130}
131#endif
Bob Pearson60e58d52012-03-23 15:02:22 -0700132
Randy Dunlap2f721002006-06-25 05:48:59 -0700133/**
134 * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32
135 * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for
136 * other uses, or the previous crc32 value if computing incrementally.
137 * @p: pointer to buffer over which CRC is run
138 * @len: length of buffer @p
139 */
Darrick J. Wong46c58012012-03-23 15:02:25 -0700140static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p,
141 size_t len, const u32 (*tab)[256],
142 u32 polynomial)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700143{
Bob Pearson60e58d52012-03-23 15:02:22 -0700144#if CRC_LE_BITS == 1
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145 int i;
146 while (len--) {
147 crc ^= *p++;
148 for (i = 0; i < 8; i++)
Darrick J. Wong46c58012012-03-23 15:02:25 -0700149 crc = (crc >> 1) ^ ((crc & 1) ? polynomial : 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700150 }
Bob Pearson60e58d52012-03-23 15:02:22 -0700151# elif CRC_LE_BITS == 2
152 while (len--) {
153 crc ^= *p++;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700154 crc = (crc >> 2) ^ tab[0][crc & 3];
155 crc = (crc >> 2) ^ tab[0][crc & 3];
156 crc = (crc >> 2) ^ tab[0][crc & 3];
157 crc = (crc >> 2) ^ tab[0][crc & 3];
Bob Pearson60e58d52012-03-23 15:02:22 -0700158 }
159# elif CRC_LE_BITS == 4
160 while (len--) {
161 crc ^= *p++;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700162 crc = (crc >> 4) ^ tab[0][crc & 15];
163 crc = (crc >> 4) ^ tab[0][crc & 15];
Bob Pearson60e58d52012-03-23 15:02:22 -0700164 }
165# elif CRC_LE_BITS == 8
Bob Pearson9a1dbf62012-03-23 15:02:23 -0700166 /* aka Sarwate algorithm */
167 while (len--) {
168 crc ^= *p++;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700169 crc = (crc >> 8) ^ tab[0][crc & 255];
Bob Pearson9a1dbf62012-03-23 15:02:23 -0700170 }
171# else
Bob Pearsonce4320d2012-03-23 15:02:23 -0700172 crc = (__force u32) __cpu_to_le32(crc);
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800173 crc = crc32_body(crc, p, len, tab);
Bob Pearsonce4320d2012-03-23 15:02:23 -0700174 crc = __le32_to_cpu((__force __le32)crc);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700175#endif
Bob Pearson60e58d52012-03-23 15:02:22 -0700176 return crc;
177}
Darrick J. Wong46c58012012-03-23 15:02:25 -0700178
179#if CRC_LE_BITS == 1
180u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
181{
182 return crc32_le_generic(crc, p, len, NULL, CRCPOLY_LE);
183}
184u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len)
185{
186 return crc32_le_generic(crc, p, len, NULL, CRC32C_POLY_LE);
187}
188#else
189u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
190{
191 return crc32_le_generic(crc, p, len, crc32table_le, CRCPOLY_LE);
192}
193u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len)
194{
195 return crc32_le_generic(crc, p, len, crc32ctable_le, CRC32C_POLY_LE);
196}
197#endif
Bob Pearson60e58d52012-03-23 15:02:22 -0700198EXPORT_SYMBOL(crc32_le);
Darrick J. Wong46c58012012-03-23 15:02:25 -0700199EXPORT_SYMBOL(__crc32c_le);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700200
Randy Dunlap2f721002006-06-25 05:48:59 -0700201/**
202 * crc32_be() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32
203 * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for
204 * other uses, or the previous crc32 value if computing incrementally.
205 * @p: pointer to buffer over which CRC is run
206 * @len: length of buffer @p
207 */
Darrick J. Wong46c58012012-03-23 15:02:25 -0700208static inline u32 __pure crc32_be_generic(u32 crc, unsigned char const *p,
209 size_t len, const u32 (*tab)[256],
210 u32 polynomial)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211{
Bob Pearson60e58d52012-03-23 15:02:22 -0700212#if CRC_BE_BITS == 1
Linus Torvalds1da177e2005-04-16 15:20:36 -0700213 int i;
214 while (len--) {
215 crc ^= *p++ << 24;
216 for (i = 0; i < 8; i++)
217 crc =
Darrick J. Wong46c58012012-03-23 15:02:25 -0700218 (crc << 1) ^ ((crc & 0x80000000) ? polynomial :
Linus Torvalds1da177e2005-04-16 15:20:36 -0700219 0);
220 }
Bob Pearson60e58d52012-03-23 15:02:22 -0700221# elif CRC_BE_BITS == 2
222 while (len--) {
223 crc ^= *p++ << 24;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700224 crc = (crc << 2) ^ tab[0][crc >> 30];
225 crc = (crc << 2) ^ tab[0][crc >> 30];
226 crc = (crc << 2) ^ tab[0][crc >> 30];
227 crc = (crc << 2) ^ tab[0][crc >> 30];
Bob Pearson60e58d52012-03-23 15:02:22 -0700228 }
229# elif CRC_BE_BITS == 4
230 while (len--) {
231 crc ^= *p++ << 24;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700232 crc = (crc << 4) ^ tab[0][crc >> 28];
233 crc = (crc << 4) ^ tab[0][crc >> 28];
Bob Pearson60e58d52012-03-23 15:02:22 -0700234 }
235# elif CRC_BE_BITS == 8
Bob Pearson9a1dbf62012-03-23 15:02:23 -0700236 while (len--) {
237 crc ^= *p++ << 24;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700238 crc = (crc << 8) ^ tab[0][crc >> 24];
Bob Pearson9a1dbf62012-03-23 15:02:23 -0700239 }
240# else
Bob Pearsonce4320d2012-03-23 15:02:23 -0700241 crc = (__force u32) __cpu_to_be32(crc);
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800242 crc = crc32_body(crc, p, len, tab);
Bob Pearsonce4320d2012-03-23 15:02:23 -0700243 crc = __be32_to_cpu((__force __be32)crc);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700244# endif
Bob Pearson60e58d52012-03-23 15:02:22 -0700245 return crc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700246}
Darrick J. Wong46c58012012-03-23 15:02:25 -0700247
248#if CRC_LE_BITS == 1
249u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
250{
251 return crc32_be_generic(crc, p, len, NULL, CRCPOLY_BE);
252}
253#else
254u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
255{
256 return crc32_be_generic(crc, p, len, crc32table_be, CRCPOLY_BE);
257}
258#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700259EXPORT_SYMBOL(crc32_be);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700260
Bob Pearson3863ef32012-03-23 15:02:22 -0700261#ifdef CONFIG_CRC32_SELFTEST
Linus Torvalds1da177e2005-04-16 15:20:36 -0700262
Bob Pearson3863ef32012-03-23 15:02:22 -0700263/* 4096 random bytes */
264static u8 __attribute__((__aligned__(8))) test_buf[] =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700265{
Bob Pearson3863ef32012-03-23 15:02:22 -0700266 0x5b, 0x85, 0x21, 0xcb, 0x09, 0x68, 0x7d, 0x30,
267 0xc7, 0x69, 0xd7, 0x30, 0x92, 0xde, 0x59, 0xe4,
268 0xc9, 0x6e, 0x8b, 0xdb, 0x98, 0x6b, 0xaa, 0x60,
269 0xa8, 0xb5, 0xbc, 0x6c, 0xa9, 0xb1, 0x5b, 0x2c,
270 0xea, 0xb4, 0x92, 0x6a, 0x3f, 0x79, 0x91, 0xe4,
271 0xe9, 0x70, 0x51, 0x8c, 0x7f, 0x95, 0x6f, 0x1a,
272 0x56, 0xa1, 0x5c, 0x27, 0x03, 0x67, 0x9f, 0x3a,
273 0xe2, 0x31, 0x11, 0x29, 0x6b, 0x98, 0xfc, 0xc4,
274 0x53, 0x24, 0xc5, 0x8b, 0xce, 0x47, 0xb2, 0xb9,
275 0x32, 0xcb, 0xc1, 0xd0, 0x03, 0x57, 0x4e, 0xd4,
276 0xe9, 0x3c, 0xa1, 0x63, 0xcf, 0x12, 0x0e, 0xca,
277 0xe1, 0x13, 0xd1, 0x93, 0xa6, 0x88, 0x5c, 0x61,
278 0x5b, 0xbb, 0xf0, 0x19, 0x46, 0xb4, 0xcf, 0x9e,
279 0xb6, 0x6b, 0x4c, 0x3a, 0xcf, 0x60, 0xf9, 0x7a,
280 0x8d, 0x07, 0x63, 0xdb, 0x40, 0xe9, 0x0b, 0x6f,
281 0xad, 0x97, 0xf1, 0xed, 0xd0, 0x1e, 0x26, 0xfd,
282 0xbf, 0xb7, 0xc8, 0x04, 0x94, 0xf8, 0x8b, 0x8c,
283 0xf1, 0xab, 0x7a, 0xd4, 0xdd, 0xf3, 0xe8, 0x88,
284 0xc3, 0xed, 0x17, 0x8a, 0x9b, 0x40, 0x0d, 0x53,
285 0x62, 0x12, 0x03, 0x5f, 0x1b, 0x35, 0x32, 0x1f,
286 0xb4, 0x7b, 0x93, 0x78, 0x0d, 0xdb, 0xce, 0xa4,
287 0xc0, 0x47, 0xd5, 0xbf, 0x68, 0xe8, 0x5d, 0x74,
288 0x8f, 0x8e, 0x75, 0x1c, 0xb2, 0x4f, 0x9a, 0x60,
289 0xd1, 0xbe, 0x10, 0xf4, 0x5c, 0xa1, 0x53, 0x09,
290 0xa5, 0xe0, 0x09, 0x54, 0x85, 0x5c, 0xdc, 0x07,
291 0xe7, 0x21, 0x69, 0x7b, 0x8a, 0xfd, 0x90, 0xf1,
292 0x22, 0xd0, 0xb4, 0x36, 0x28, 0xe6, 0xb8, 0x0f,
293 0x39, 0xde, 0xc8, 0xf3, 0x86, 0x60, 0x34, 0xd2,
294 0x5e, 0xdf, 0xfd, 0xcf, 0x0f, 0xa9, 0x65, 0xf0,
295 0xd5, 0x4d, 0x96, 0x40, 0xe3, 0xdf, 0x3f, 0x95,
296 0x5a, 0x39, 0x19, 0x93, 0xf4, 0x75, 0xce, 0x22,
297 0x00, 0x1c, 0x93, 0xe2, 0x03, 0x66, 0xf4, 0x93,
298 0x73, 0x86, 0x81, 0x8e, 0x29, 0x44, 0x48, 0x86,
299 0x61, 0x7c, 0x48, 0xa3, 0x43, 0xd2, 0x9c, 0x8d,
300 0xd4, 0x95, 0xdd, 0xe1, 0x22, 0x89, 0x3a, 0x40,
301 0x4c, 0x1b, 0x8a, 0x04, 0xa8, 0x09, 0x69, 0x8b,
302 0xea, 0xc6, 0x55, 0x8e, 0x57, 0xe6, 0x64, 0x35,
303 0xf0, 0xc7, 0x16, 0x9f, 0x5d, 0x5e, 0x86, 0x40,
304 0x46, 0xbb, 0xe5, 0x45, 0x88, 0xfe, 0xc9, 0x63,
305 0x15, 0xfb, 0xf5, 0xbd, 0x71, 0x61, 0xeb, 0x7b,
306 0x78, 0x70, 0x07, 0x31, 0x03, 0x9f, 0xb2, 0xc8,
307 0xa7, 0xab, 0x47, 0xfd, 0xdf, 0xa0, 0x78, 0x72,
308 0xa4, 0x2a, 0xe4, 0xb6, 0xba, 0xc0, 0x1e, 0x86,
309 0x71, 0xe6, 0x3d, 0x18, 0x37, 0x70, 0xe6, 0xff,
310 0xe0, 0xbc, 0x0b, 0x22, 0xa0, 0x1f, 0xd3, 0xed,
311 0xa2, 0x55, 0x39, 0xab, 0xa8, 0x13, 0x73, 0x7c,
312 0x3f, 0xb2, 0xd6, 0x19, 0xac, 0xff, 0x99, 0xed,
313 0xe8, 0xe6, 0xa6, 0x22, 0xe3, 0x9c, 0xf1, 0x30,
314 0xdc, 0x01, 0x0a, 0x56, 0xfa, 0xe4, 0xc9, 0x99,
315 0xdd, 0xa8, 0xd8, 0xda, 0x35, 0x51, 0x73, 0xb4,
316 0x40, 0x86, 0x85, 0xdb, 0x5c, 0xd5, 0x85, 0x80,
317 0x14, 0x9c, 0xfd, 0x98, 0xa9, 0x82, 0xc5, 0x37,
318 0xff, 0x32, 0x5d, 0xd0, 0x0b, 0xfa, 0xdc, 0x04,
319 0x5e, 0x09, 0xd2, 0xca, 0x17, 0x4b, 0x1a, 0x8e,
320 0x15, 0xe1, 0xcc, 0x4e, 0x52, 0x88, 0x35, 0xbd,
321 0x48, 0xfe, 0x15, 0xa0, 0x91, 0xfd, 0x7e, 0x6c,
322 0x0e, 0x5d, 0x79, 0x1b, 0x81, 0x79, 0xd2, 0x09,
323 0x34, 0x70, 0x3d, 0x81, 0xec, 0xf6, 0x24, 0xbb,
324 0xfb, 0xf1, 0x7b, 0xdf, 0x54, 0xea, 0x80, 0x9b,
325 0xc7, 0x99, 0x9e, 0xbd, 0x16, 0x78, 0x12, 0x53,
326 0x5e, 0x01, 0xa7, 0x4e, 0xbd, 0x67, 0xe1, 0x9b,
327 0x4c, 0x0e, 0x61, 0x45, 0x97, 0xd2, 0xf0, 0x0f,
328 0xfe, 0x15, 0x08, 0xb7, 0x11, 0x4c, 0xe7, 0xff,
329 0x81, 0x53, 0xff, 0x91, 0x25, 0x38, 0x7e, 0x40,
330 0x94, 0xe5, 0xe0, 0xad, 0xe6, 0xd9, 0x79, 0xb6,
331 0x92, 0xc9, 0xfc, 0xde, 0xc3, 0x1a, 0x23, 0xbb,
332 0xdd, 0xc8, 0x51, 0x0c, 0x3a, 0x72, 0xfa, 0x73,
333 0x6f, 0xb7, 0xee, 0x61, 0x39, 0x03, 0x01, 0x3f,
334 0x7f, 0x94, 0x2e, 0x2e, 0xba, 0x3a, 0xbb, 0xb4,
335 0xfa, 0x6a, 0x17, 0xfe, 0xea, 0xef, 0x5e, 0x66,
336 0x97, 0x3f, 0x32, 0x3d, 0xd7, 0x3e, 0xb1, 0xf1,
337 0x6c, 0x14, 0x4c, 0xfd, 0x37, 0xd3, 0x38, 0x80,
338 0xfb, 0xde, 0xa6, 0x24, 0x1e, 0xc8, 0xca, 0x7f,
339 0x3a, 0x93, 0xd8, 0x8b, 0x18, 0x13, 0xb2, 0xe5,
340 0xe4, 0x93, 0x05, 0x53, 0x4f, 0x84, 0x66, 0xa7,
341 0x58, 0x5c, 0x7b, 0x86, 0x52, 0x6d, 0x0d, 0xce,
342 0xa4, 0x30, 0x7d, 0xb6, 0x18, 0x9f, 0xeb, 0xff,
343 0x22, 0xbb, 0x72, 0x29, 0xb9, 0x44, 0x0b, 0x48,
344 0x1e, 0x84, 0x71, 0x81, 0xe3, 0x6d, 0x73, 0x26,
345 0x92, 0xb4, 0x4d, 0x2a, 0x29, 0xb8, 0x1f, 0x72,
346 0xed, 0xd0, 0xe1, 0x64, 0x77, 0xea, 0x8e, 0x88,
347 0x0f, 0xef, 0x3f, 0xb1, 0x3b, 0xad, 0xf9, 0xc9,
348 0x8b, 0xd0, 0xac, 0xc6, 0xcc, 0xa9, 0x40, 0xcc,
349 0x76, 0xf6, 0x3b, 0x53, 0xb5, 0x88, 0xcb, 0xc8,
350 0x37, 0xf1, 0xa2, 0xba, 0x23, 0x15, 0x99, 0x09,
351 0xcc, 0xe7, 0x7a, 0x3b, 0x37, 0xf7, 0x58, 0xc8,
352 0x46, 0x8c, 0x2b, 0x2f, 0x4e, 0x0e, 0xa6, 0x5c,
353 0xea, 0x85, 0x55, 0xba, 0x02, 0x0e, 0x0e, 0x48,
354 0xbc, 0xe1, 0xb1, 0x01, 0x35, 0x79, 0x13, 0x3d,
355 0x1b, 0xc0, 0x53, 0x68, 0x11, 0xe7, 0x95, 0x0f,
356 0x9d, 0x3f, 0x4c, 0x47, 0x7b, 0x4d, 0x1c, 0xae,
357 0x50, 0x9b, 0xcb, 0xdd, 0x05, 0x8d, 0x9a, 0x97,
358 0xfd, 0x8c, 0xef, 0x0c, 0x1d, 0x67, 0x73, 0xa8,
359 0x28, 0x36, 0xd5, 0xb6, 0x92, 0x33, 0x40, 0x75,
360 0x0b, 0x51, 0xc3, 0x64, 0xba, 0x1d, 0xc2, 0xcc,
361 0xee, 0x7d, 0x54, 0x0f, 0x27, 0x69, 0xa7, 0x27,
362 0x63, 0x30, 0x29, 0xd9, 0xc8, 0x84, 0xd8, 0xdf,
363 0x9f, 0x68, 0x8d, 0x04, 0xca, 0xa6, 0xc5, 0xc7,
364 0x7a, 0x5c, 0xc8, 0xd1, 0xcb, 0x4a, 0xec, 0xd0,
365 0xd8, 0x20, 0x69, 0xc5, 0x17, 0xcd, 0x78, 0xc8,
366 0x75, 0x23, 0x30, 0x69, 0xc9, 0xd4, 0xea, 0x5c,
367 0x4f, 0x6b, 0x86, 0x3f, 0x8b, 0xfe, 0xee, 0x44,
368 0xc9, 0x7c, 0xb7, 0xdd, 0x3e, 0xe5, 0xec, 0x54,
369 0x03, 0x3e, 0xaa, 0x82, 0xc6, 0xdf, 0xb2, 0x38,
370 0x0e, 0x5d, 0xb3, 0x88, 0xd9, 0xd3, 0x69, 0x5f,
371 0x8f, 0x70, 0x8a, 0x7e, 0x11, 0xd9, 0x1e, 0x7b,
372 0x38, 0xf1, 0x42, 0x1a, 0xc0, 0x35, 0xf5, 0xc7,
373 0x36, 0x85, 0xf5, 0xf7, 0xb8, 0x7e, 0xc7, 0xef,
374 0x18, 0xf1, 0x63, 0xd6, 0x7a, 0xc6, 0xc9, 0x0e,
375 0x4d, 0x69, 0x4f, 0x84, 0xef, 0x26, 0x41, 0x0c,
376 0xec, 0xc7, 0xe0, 0x7e, 0x3c, 0x67, 0x01, 0x4c,
377 0x62, 0x1a, 0x20, 0x6f, 0xee, 0x47, 0x4d, 0xc0,
378 0x99, 0x13, 0x8d, 0x91, 0x4a, 0x26, 0xd4, 0x37,
379 0x28, 0x90, 0x58, 0x75, 0x66, 0x2b, 0x0a, 0xdf,
380 0xda, 0xee, 0x92, 0x25, 0x90, 0x62, 0x39, 0x9e,
381 0x44, 0x98, 0xad, 0xc1, 0x88, 0xed, 0xe4, 0xb4,
382 0xaf, 0xf5, 0x8c, 0x9b, 0x48, 0x4d, 0x56, 0x60,
383 0x97, 0x0f, 0x61, 0x59, 0x9e, 0xa6, 0x27, 0xfe,
384 0xc1, 0x91, 0x15, 0x38, 0xb8, 0x0f, 0xae, 0x61,
385 0x7d, 0x26, 0x13, 0x5a, 0x73, 0xff, 0x1c, 0xa3,
386 0x61, 0x04, 0x58, 0x48, 0x55, 0x44, 0x11, 0xfe,
387 0x15, 0xca, 0xc3, 0xbd, 0xca, 0xc5, 0xb4, 0x40,
388 0x5d, 0x1b, 0x7f, 0x39, 0xb5, 0x9c, 0x35, 0xec,
389 0x61, 0x15, 0x32, 0x32, 0xb8, 0x4e, 0x40, 0x9f,
390 0x17, 0x1f, 0x0a, 0x4d, 0xa9, 0x91, 0xef, 0xb7,
391 0xb0, 0xeb, 0xc2, 0x83, 0x9a, 0x6c, 0xd2, 0x79,
392 0x43, 0x78, 0x5e, 0x2f, 0xe5, 0xdd, 0x1a, 0x3c,
393 0x45, 0xab, 0x29, 0x40, 0x3a, 0x37, 0x5b, 0x6f,
394 0xd7, 0xfc, 0x48, 0x64, 0x3c, 0x49, 0xfb, 0x21,
395 0xbe, 0xc3, 0xff, 0x07, 0xfb, 0x17, 0xe9, 0xc9,
396 0x0c, 0x4c, 0x5c, 0x15, 0x9e, 0x8e, 0x22, 0x30,
397 0x0a, 0xde, 0x48, 0x7f, 0xdb, 0x0d, 0xd1, 0x2b,
398 0x87, 0x38, 0x9e, 0xcc, 0x5a, 0x01, 0x16, 0xee,
399 0x75, 0x49, 0x0d, 0x30, 0x01, 0x34, 0x6a, 0xb6,
400 0x9a, 0x5a, 0x2a, 0xec, 0xbb, 0x48, 0xac, 0xd3,
401 0x77, 0x83, 0xd8, 0x08, 0x86, 0x4f, 0x48, 0x09,
402 0x29, 0x41, 0x79, 0xa1, 0x03, 0x12, 0xc4, 0xcd,
403 0x90, 0x55, 0x47, 0x66, 0x74, 0x9a, 0xcc, 0x4f,
404 0x35, 0x8c, 0xd6, 0x98, 0xef, 0xeb, 0x45, 0xb9,
405 0x9a, 0x26, 0x2f, 0x39, 0xa5, 0x70, 0x6d, 0xfc,
406 0xb4, 0x51, 0xee, 0xf4, 0x9c, 0xe7, 0x38, 0x59,
407 0xad, 0xf4, 0xbc, 0x46, 0xff, 0x46, 0x8e, 0x60,
408 0x9c, 0xa3, 0x60, 0x1d, 0xf8, 0x26, 0x72, 0xf5,
409 0x72, 0x9d, 0x68, 0x80, 0x04, 0xf6, 0x0b, 0xa1,
410 0x0a, 0xd5, 0xa7, 0x82, 0x3a, 0x3e, 0x47, 0xa8,
411 0x5a, 0xde, 0x59, 0x4f, 0x7b, 0x07, 0xb3, 0xe9,
412 0x24, 0x19, 0x3d, 0x34, 0x05, 0xec, 0xf1, 0xab,
413 0x6e, 0x64, 0x8f, 0xd3, 0xe6, 0x41, 0x86, 0x80,
414 0x70, 0xe3, 0x8d, 0x60, 0x9c, 0x34, 0x25, 0x01,
415 0x07, 0x4d, 0x19, 0x41, 0x4e, 0x3d, 0x5c, 0x7e,
416 0xa8, 0xf5, 0xcc, 0xd5, 0x7b, 0xe2, 0x7d, 0x3d,
417 0x49, 0x86, 0x7d, 0x07, 0xb7, 0x10, 0xe3, 0x35,
418 0xb8, 0x84, 0x6d, 0x76, 0xab, 0x17, 0xc6, 0x38,
419 0xb4, 0xd3, 0x28, 0x57, 0xad, 0xd3, 0x88, 0x5a,
420 0xda, 0xea, 0xc8, 0x94, 0xcc, 0x37, 0x19, 0xac,
421 0x9c, 0x9f, 0x4b, 0x00, 0x15, 0xc0, 0xc8, 0xca,
422 0x1f, 0x15, 0xaa, 0xe0, 0xdb, 0xf9, 0x2f, 0x57,
423 0x1b, 0x24, 0xc7, 0x6f, 0x76, 0x29, 0xfb, 0xed,
424 0x25, 0x0d, 0xc0, 0xfe, 0xbd, 0x5a, 0xbf, 0x20,
425 0x08, 0x51, 0x05, 0xec, 0x71, 0xa3, 0xbf, 0xef,
426 0x5e, 0x99, 0x75, 0xdb, 0x3c, 0x5f, 0x9a, 0x8c,
427 0xbb, 0x19, 0x5c, 0x0e, 0x93, 0x19, 0xf8, 0x6a,
428 0xbc, 0xf2, 0x12, 0x54, 0x2f, 0xcb, 0x28, 0x64,
429 0x88, 0xb3, 0x92, 0x0d, 0x96, 0xd1, 0xa6, 0xe4,
430 0x1f, 0xf1, 0x4d, 0xa4, 0xab, 0x1c, 0xee, 0x54,
431 0xf2, 0xad, 0x29, 0x6d, 0x32, 0x37, 0xb2, 0x16,
432 0x77, 0x5c, 0xdc, 0x2e, 0x54, 0xec, 0x75, 0x26,
433 0xc6, 0x36, 0xd9, 0x17, 0x2c, 0xf1, 0x7a, 0xdc,
434 0x4b, 0xf1, 0xe2, 0xd9, 0x95, 0xba, 0xac, 0x87,
435 0xc1, 0xf3, 0x8e, 0x58, 0x08, 0xd8, 0x87, 0x60,
436 0xc9, 0xee, 0x6a, 0xde, 0xa4, 0xd2, 0xfc, 0x0d,
437 0xe5, 0x36, 0xc4, 0x5c, 0x52, 0xb3, 0x07, 0x54,
438 0x65, 0x24, 0xc1, 0xb1, 0xd1, 0xb1, 0x53, 0x13,
439 0x31, 0x79, 0x7f, 0x05, 0x76, 0xeb, 0x37, 0x59,
440 0x15, 0x2b, 0xd1, 0x3f, 0xac, 0x08, 0x97, 0xeb,
441 0x91, 0x98, 0xdf, 0x6c, 0x09, 0x0d, 0x04, 0x9f,
442 0xdc, 0x3b, 0x0e, 0x60, 0x68, 0x47, 0x23, 0x15,
443 0x16, 0xc6, 0x0b, 0x35, 0xf8, 0x77, 0xa2, 0x78,
444 0x50, 0xd4, 0x64, 0x22, 0x33, 0xff, 0xfb, 0x93,
445 0x71, 0x46, 0x50, 0x39, 0x1b, 0x9c, 0xea, 0x4e,
446 0x8d, 0x0c, 0x37, 0xe5, 0x5c, 0x51, 0x3a, 0x31,
447 0xb2, 0x85, 0x84, 0x3f, 0x41, 0xee, 0xa2, 0xc1,
448 0xc6, 0x13, 0x3b, 0x54, 0x28, 0xd2, 0x18, 0x37,
449 0xcc, 0x46, 0x9f, 0x6a, 0x91, 0x3d, 0x5a, 0x15,
450 0x3c, 0x89, 0xa3, 0x61, 0x06, 0x7d, 0x2e, 0x78,
451 0xbe, 0x7d, 0x40, 0xba, 0x2f, 0x95, 0xb1, 0x2f,
452 0x87, 0x3b, 0x8a, 0xbe, 0x6a, 0xf4, 0xc2, 0x31,
453 0x74, 0xee, 0x91, 0xe0, 0x23, 0xaa, 0x5d, 0x7f,
454 0xdd, 0xf0, 0x44, 0x8c, 0x0b, 0x59, 0x2b, 0xfc,
455 0x48, 0x3a, 0xdf, 0x07, 0x05, 0x38, 0x6c, 0xc9,
456 0xeb, 0x18, 0x24, 0x68, 0x8d, 0x58, 0x98, 0xd3,
457 0x31, 0xa3, 0xe4, 0x70, 0x59, 0xb1, 0x21, 0xbe,
458 0x7e, 0x65, 0x7d, 0xb8, 0x04, 0xab, 0xf6, 0xe4,
459 0xd7, 0xda, 0xec, 0x09, 0x8f, 0xda, 0x6d, 0x24,
460 0x07, 0xcc, 0x29, 0x17, 0x05, 0x78, 0x1a, 0xc1,
461 0xb1, 0xce, 0xfc, 0xaa, 0x2d, 0xe7, 0xcc, 0x85,
462 0x84, 0x84, 0x03, 0x2a, 0x0c, 0x3f, 0xa9, 0xf8,
463 0xfd, 0x84, 0x53, 0x59, 0x5c, 0xf0, 0xd4, 0x09,
464 0xf0, 0xd2, 0x6c, 0x32, 0x03, 0xb0, 0xa0, 0x8c,
465 0x52, 0xeb, 0x23, 0x91, 0x88, 0x43, 0x13, 0x46,
466 0xf6, 0x1e, 0xb4, 0x1b, 0xf5, 0x8e, 0x3a, 0xb5,
467 0x3d, 0x00, 0xf6, 0xe5, 0x08, 0x3d, 0x5f, 0x39,
468 0xd3, 0x21, 0x69, 0xbc, 0x03, 0x22, 0x3a, 0xd2,
469 0x5c, 0x84, 0xf8, 0x15, 0xc4, 0x80, 0x0b, 0xbc,
470 0x29, 0x3c, 0xf3, 0x95, 0x98, 0xcd, 0x8f, 0x35,
471 0xbc, 0xa5, 0x3e, 0xfc, 0xd4, 0x13, 0x9e, 0xde,
472 0x4f, 0xce, 0x71, 0x9d, 0x09, 0xad, 0xf2, 0x80,
473 0x6b, 0x65, 0x7f, 0x03, 0x00, 0x14, 0x7c, 0x15,
474 0x85, 0x40, 0x6d, 0x70, 0xea, 0xdc, 0xb3, 0x63,
475 0x35, 0x4f, 0x4d, 0xe0, 0xd9, 0xd5, 0x3c, 0x58,
476 0x56, 0x23, 0x80, 0xe2, 0x36, 0xdd, 0x75, 0x1d,
477 0x94, 0x11, 0x41, 0x8e, 0xe0, 0x81, 0x8e, 0xcf,
478 0xe0, 0xe5, 0xf6, 0xde, 0xd1, 0xe7, 0x04, 0x12,
479 0x79, 0x92, 0x2b, 0x71, 0x2a, 0x79, 0x8b, 0x7c,
480 0x44, 0x79, 0x16, 0x30, 0x4e, 0xf4, 0xf6, 0x9b,
481 0xb7, 0x40, 0xa3, 0x5a, 0xa7, 0x69, 0x3e, 0xc1,
482 0x3a, 0x04, 0xd0, 0x88, 0xa0, 0x3b, 0xdd, 0xc6,
483 0x9e, 0x7e, 0x1e, 0x1e, 0x8f, 0x44, 0xf7, 0x73,
484 0x67, 0x1e, 0x1a, 0x78, 0xfa, 0x62, 0xf4, 0xa9,
485 0xa8, 0xc6, 0x5b, 0xb8, 0xfa, 0x06, 0x7d, 0x5e,
486 0x38, 0x1c, 0x9a, 0x39, 0xe9, 0x39, 0x98, 0x22,
487 0x0b, 0xa7, 0xac, 0x0b, 0xf3, 0xbc, 0xf1, 0xeb,
488 0x8c, 0x81, 0xe3, 0x48, 0x8a, 0xed, 0x42, 0xc2,
489 0x38, 0xcf, 0x3e, 0xda, 0xd2, 0x89, 0x8d, 0x9c,
490 0x53, 0xb5, 0x2f, 0x41, 0x01, 0x26, 0x84, 0x9c,
491 0xa3, 0x56, 0xf6, 0x49, 0xc7, 0xd4, 0x9f, 0x93,
492 0x1b, 0x96, 0x49, 0x5e, 0xad, 0xb3, 0x84, 0x1f,
493 0x3c, 0xa4, 0xe0, 0x9b, 0xd1, 0x90, 0xbc, 0x38,
494 0x6c, 0xdd, 0x95, 0x4d, 0x9d, 0xb1, 0x71, 0x57,
495 0x2d, 0x34, 0xe8, 0xb8, 0x42, 0xc7, 0x99, 0x03,
496 0xc7, 0x07, 0x30, 0x65, 0x91, 0x55, 0xd5, 0x90,
497 0x70, 0x97, 0x37, 0x68, 0xd4, 0x11, 0xf9, 0xe8,
498 0xce, 0xec, 0xdc, 0x34, 0xd5, 0xd3, 0xb7, 0xc4,
499 0xb8, 0x97, 0x05, 0x92, 0xad, 0xf8, 0xe2, 0x36,
500 0x64, 0x41, 0xc9, 0xc5, 0x41, 0x77, 0x52, 0xd7,
501 0x2c, 0xa5, 0x24, 0x2f, 0xd9, 0x34, 0x0b, 0x47,
502 0x35, 0xa7, 0x28, 0x8b, 0xc5, 0xcd, 0xe9, 0x46,
503 0xac, 0x39, 0x94, 0x3c, 0x10, 0xc6, 0x29, 0x73,
504 0x0e, 0x0e, 0x5d, 0xe0, 0x71, 0x03, 0x8a, 0x72,
505 0x0e, 0x26, 0xb0, 0x7d, 0x84, 0xed, 0x95, 0x23,
506 0x49, 0x5a, 0x45, 0x83, 0x45, 0x60, 0x11, 0x4a,
507 0x46, 0x31, 0xd4, 0xd8, 0x16, 0x54, 0x98, 0x58,
508 0xed, 0x6d, 0xcc, 0x5d, 0xd6, 0x50, 0x61, 0x9f,
509 0x9d, 0xc5, 0x3e, 0x9d, 0x32, 0x47, 0xde, 0x96,
510 0xe1, 0x5d, 0xd8, 0xf8, 0xb4, 0x69, 0x6f, 0xb9,
511 0x15, 0x90, 0x57, 0x7a, 0xf6, 0xad, 0xb0, 0x5b,
512 0xf5, 0xa6, 0x36, 0x94, 0xfd, 0x84, 0xce, 0x1c,
513 0x0f, 0x4b, 0xd0, 0xc2, 0x5b, 0x6b, 0x56, 0xef,
514 0x73, 0x93, 0x0b, 0xc3, 0xee, 0xd9, 0xcf, 0xd3,
515 0xa4, 0x22, 0x58, 0xcd, 0x50, 0x6e, 0x65, 0xf4,
516 0xe9, 0xb7, 0x71, 0xaf, 0x4b, 0xb3, 0xb6, 0x2f,
517 0x0f, 0x0e, 0x3b, 0xc9, 0x85, 0x14, 0xf5, 0x17,
518 0xe8, 0x7a, 0x3a, 0xbf, 0x5f, 0x5e, 0xf8, 0x18,
519 0x48, 0xa6, 0x72, 0xab, 0x06, 0x95, 0xe9, 0xc8,
520 0xa7, 0xf4, 0x32, 0x44, 0x04, 0x0c, 0x84, 0x98,
521 0x73, 0xe3, 0x89, 0x8d, 0x5f, 0x7e, 0x4a, 0x42,
522 0x8f, 0xc5, 0x28, 0xb1, 0x82, 0xef, 0x1c, 0x97,
523 0x31, 0x3b, 0x4d, 0xe0, 0x0e, 0x10, 0x10, 0x97,
524 0x93, 0x49, 0x78, 0x2f, 0x0d, 0x86, 0x8b, 0xa1,
525 0x53, 0xa9, 0x81, 0x20, 0x79, 0xe7, 0x07, 0x77,
526 0xb6, 0xac, 0x5e, 0xd2, 0x05, 0xcd, 0xe9, 0xdb,
527 0x8a, 0x94, 0x82, 0x8a, 0x23, 0xb9, 0x3d, 0x1c,
528 0xa9, 0x7d, 0x72, 0x4a, 0xed, 0x33, 0xa3, 0xdb,
529 0x21, 0xa7, 0x86, 0x33, 0x45, 0xa5, 0xaa, 0x56,
530 0x45, 0xb5, 0x83, 0x29, 0x40, 0x47, 0x79, 0x04,
531 0x6e, 0xb9, 0x95, 0xd0, 0x81, 0x77, 0x2d, 0x48,
532 0x1e, 0xfe, 0xc3, 0xc2, 0x1e, 0xe5, 0xf2, 0xbe,
533 0xfd, 0x3b, 0x94, 0x9f, 0xc4, 0xc4, 0x26, 0x9d,
534 0xe4, 0x66, 0x1e, 0x19, 0xee, 0x6c, 0x79, 0x97,
535 0x11, 0x31, 0x4b, 0x0d, 0x01, 0xcb, 0xde, 0xa8,
536 0xf6, 0x6d, 0x7c, 0x39, 0x46, 0x4e, 0x7e, 0x3f,
537 0x94, 0x17, 0xdf, 0xa1, 0x7d, 0xd9, 0x1c, 0x8e,
538 0xbc, 0x7d, 0x33, 0x7d, 0xe3, 0x12, 0x40, 0xca,
539 0xab, 0x37, 0x11, 0x46, 0xd4, 0xae, 0xef, 0x44,
540 0xa2, 0xb3, 0x6a, 0x66, 0x0e, 0x0c, 0x90, 0x7f,
541 0xdf, 0x5c, 0x66, 0x5f, 0xf2, 0x94, 0x9f, 0xa6,
542 0x73, 0x4f, 0xeb, 0x0d, 0xad, 0xbf, 0xc0, 0x63,
543 0x5c, 0xdc, 0x46, 0x51, 0xe8, 0x8e, 0x90, 0x19,
544 0xa8, 0xa4, 0x3c, 0x91, 0x79, 0xfa, 0x7e, 0x58,
545 0x85, 0x13, 0x55, 0xc5, 0x19, 0x82, 0x37, 0x1b,
546 0x0a, 0x02, 0x1f, 0x99, 0x6b, 0x18, 0xf1, 0x28,
547 0x08, 0xa2, 0x73, 0xb8, 0x0f, 0x2e, 0xcd, 0xbf,
548 0xf3, 0x86, 0x7f, 0xea, 0xef, 0xd0, 0xbb, 0xa6,
549 0x21, 0xdf, 0x49, 0x73, 0x51, 0xcc, 0x36, 0xd3,
550 0x3e, 0xa0, 0xf8, 0x44, 0xdf, 0xd3, 0xa6, 0xbe,
551 0x8a, 0xd4, 0x57, 0xdd, 0x72, 0x94, 0x61, 0x0f,
552 0x82, 0xd1, 0x07, 0xb8, 0x7c, 0x18, 0x83, 0xdf,
553 0x3a, 0xe5, 0x50, 0x6a, 0x82, 0x20, 0xac, 0xa9,
554 0xa8, 0xff, 0xd9, 0xf3, 0x77, 0x33, 0x5a, 0x9e,
555 0x7f, 0x6d, 0xfe, 0x5d, 0x33, 0x41, 0x42, 0xe7,
556 0x6c, 0x19, 0xe0, 0x44, 0x8a, 0x15, 0xf6, 0x70,
557 0x98, 0xb7, 0x68, 0x4d, 0xfa, 0x97, 0x39, 0xb0,
558 0x8e, 0xe8, 0x84, 0x8b, 0x75, 0x30, 0xb7, 0x7d,
559 0x92, 0x69, 0x20, 0x9c, 0x81, 0xfb, 0x4b, 0xf4,
560 0x01, 0x50, 0xeb, 0xce, 0x0c, 0x1c, 0x6c, 0xb5,
561 0x4a, 0xd7, 0x27, 0x0c, 0xce, 0xbb, 0xe5, 0x85,
562 0xf0, 0xb6, 0xee, 0xd5, 0x70, 0xdd, 0x3b, 0xfc,
563 0xd4, 0x99, 0xf1, 0x33, 0xdd, 0x8b, 0xc4, 0x2f,
564 0xae, 0xab, 0x74, 0x96, 0x32, 0xc7, 0x4c, 0x56,
565 0x3c, 0x89, 0x0f, 0x96, 0x0b, 0x42, 0xc0, 0xcb,
566 0xee, 0x0f, 0x0b, 0x8c, 0xfb, 0x7e, 0x47, 0x7b,
567 0x64, 0x48, 0xfd, 0xb2, 0x00, 0x80, 0x89, 0xa5,
568 0x13, 0x55, 0x62, 0xfc, 0x8f, 0xe2, 0x42, 0x03,
569 0xb7, 0x4e, 0x2a, 0x79, 0xb4, 0x82, 0xea, 0x23,
570 0x49, 0xda, 0xaf, 0x52, 0x63, 0x1e, 0x60, 0x03,
571 0x89, 0x06, 0x44, 0x46, 0x08, 0xc3, 0xc4, 0x87,
572 0x70, 0x2e, 0xda, 0x94, 0xad, 0x6b, 0xe0, 0xe4,
573 0xd1, 0x8a, 0x06, 0xc2, 0xa8, 0xc0, 0xa7, 0x43,
574 0x3c, 0x47, 0x52, 0x0e, 0xc3, 0x77, 0x81, 0x11,
575 0x67, 0x0e, 0xa0, 0x70, 0x04, 0x47, 0x29, 0x40,
576 0x86, 0x0d, 0x34, 0x56, 0xa7, 0xc9, 0x35, 0x59,
577 0x68, 0xdc, 0x93, 0x81, 0x70, 0xee, 0x86, 0xd9,
578 0x80, 0x06, 0x40, 0x4f, 0x1a, 0x0d, 0x40, 0x30,
579 0x0b, 0xcb, 0x96, 0x47, 0xc1, 0xb7, 0x52, 0xfd,
580 0x56, 0xe0, 0x72, 0x4b, 0xfb, 0xbd, 0x92, 0x45,
581 0x61, 0x71, 0xc2, 0x33, 0x11, 0xbf, 0x52, 0x83,
582 0x79, 0x26, 0xe0, 0x49, 0x6b, 0xb7, 0x05, 0x8b,
583 0xe8, 0x0e, 0x87, 0x31, 0xd7, 0x9d, 0x8a, 0xf5,
584 0xc0, 0x5f, 0x2e, 0x58, 0x4a, 0xdb, 0x11, 0xb3,
585 0x6c, 0x30, 0x2a, 0x46, 0x19, 0xe3, 0x27, 0x84,
586 0x1f, 0x63, 0x6e, 0xf6, 0x57, 0xc7, 0xc9, 0xd8,
587 0x5e, 0xba, 0xb3, 0x87, 0xd5, 0x83, 0x26, 0x34,
588 0x21, 0x9e, 0x65, 0xde, 0x42, 0xd3, 0xbe, 0x7b,
589 0xbc, 0x91, 0x71, 0x44, 0x4d, 0x99, 0x3b, 0x31,
590 0xe5, 0x3f, 0x11, 0x4e, 0x7f, 0x13, 0x51, 0x3b,
591 0xae, 0x79, 0xc9, 0xd3, 0x81, 0x8e, 0x25, 0x40,
592 0x10, 0xfc, 0x07, 0x1e, 0xf9, 0x7b, 0x9a, 0x4b,
593 0x6c, 0xe3, 0xb3, 0xad, 0x1a, 0x0a, 0xdd, 0x9e,
594 0x59, 0x0c, 0xa2, 0xcd, 0xae, 0x48, 0x4a, 0x38,
595 0x5b, 0x47, 0x41, 0x94, 0x65, 0x6b, 0xbb, 0xeb,
596 0x5b, 0xe3, 0xaf, 0x07, 0x5b, 0xd4, 0x4a, 0xa2,
597 0xc9, 0x5d, 0x2f, 0x64, 0x03, 0xd7, 0x3a, 0x2c,
598 0x6e, 0xce, 0x76, 0x95, 0xb4, 0xb3, 0xc0, 0xf1,
599 0xe2, 0x45, 0x73, 0x7a, 0x5c, 0xab, 0xc1, 0xfc,
600 0x02, 0x8d, 0x81, 0x29, 0xb3, 0xac, 0x07, 0xec,
601 0x40, 0x7d, 0x45, 0xd9, 0x7a, 0x59, 0xee, 0x34,
602 0xf0, 0xe9, 0xd5, 0x7b, 0x96, 0xb1, 0x3d, 0x95,
603 0xcc, 0x86, 0xb5, 0xb6, 0x04, 0x2d, 0xb5, 0x92,
604 0x7e, 0x76, 0xf4, 0x06, 0xa9, 0xa3, 0x12, 0x0f,
605 0xb1, 0xaf, 0x26, 0xba, 0x7c, 0xfc, 0x7e, 0x1c,
606 0xbc, 0x2c, 0x49, 0x97, 0x53, 0x60, 0x13, 0x0b,
607 0xa6, 0x61, 0x83, 0x89, 0x42, 0xd4, 0x17, 0x0c,
608 0x6c, 0x26, 0x52, 0xc3, 0xb3, 0xd4, 0x67, 0xf5,
609 0xe3, 0x04, 0xb7, 0xf4, 0xcb, 0x80, 0xb8, 0xcb,
610 0x77, 0x56, 0x3e, 0xaa, 0x57, 0x54, 0xee, 0xb4,
611 0x2c, 0x67, 0xcf, 0xf2, 0xdc, 0xbe, 0x55, 0xf9,
612 0x43, 0x1f, 0x6e, 0x22, 0x97, 0x67, 0x7f, 0xc4,
613 0xef, 0xb1, 0x26, 0x31, 0x1e, 0x27, 0xdf, 0x41,
614 0x80, 0x47, 0x6c, 0xe2, 0xfa, 0xa9, 0x8c, 0x2a,
615 0xf6, 0xf2, 0xab, 0xf0, 0x15, 0xda, 0x6c, 0xc8,
616 0xfe, 0xb5, 0x23, 0xde, 0xa9, 0x05, 0x3f, 0x06,
617 0x54, 0x4c, 0xcd, 0xe1, 0xab, 0xfc, 0x0e, 0x62,
618 0x33, 0x31, 0x73, 0x2c, 0x76, 0xcb, 0xb4, 0x47,
619 0x1e, 0x20, 0xad, 0xd8, 0xf2, 0x31, 0xdd, 0xc4,
620 0x8b, 0x0c, 0x77, 0xbe, 0xe1, 0x8b, 0x26, 0x00,
621 0x02, 0x58, 0xd6, 0x8d, 0xef, 0xad, 0x74, 0x67,
622 0xab, 0x3f, 0xef, 0xcb, 0x6f, 0xb0, 0xcc, 0x81,
623 0x44, 0x4c, 0xaf, 0xe9, 0x49, 0x4f, 0xdb, 0xa0,
624 0x25, 0xa4, 0xf0, 0x89, 0xf1, 0xbe, 0xd8, 0x10,
625 0xff, 0xb1, 0x3b, 0x4b, 0xfa, 0x98, 0xf5, 0x79,
626 0x6d, 0x1e, 0x69, 0x4d, 0x57, 0xb1, 0xc8, 0x19,
627 0x1b, 0xbd, 0x1e, 0x8c, 0x84, 0xb7, 0x7b, 0xe8,
628 0xd2, 0x2d, 0x09, 0x41, 0x41, 0x37, 0x3d, 0xb1,
629 0x6f, 0x26, 0x5d, 0x71, 0x16, 0x3d, 0xb7, 0x83,
630 0x27, 0x2c, 0xa7, 0xb6, 0x50, 0xbd, 0x91, 0x86,
631 0xab, 0x24, 0xa1, 0x38, 0xfd, 0xea, 0x71, 0x55,
632 0x7e, 0x9a, 0x07, 0x77, 0x4b, 0xfa, 0x61, 0x66,
633 0x20, 0x1e, 0x28, 0x95, 0x18, 0x1b, 0xa4, 0xa0,
634 0xfd, 0xc0, 0x89, 0x72, 0x43, 0xd9, 0x3b, 0x49,
635 0x5a, 0x3f, 0x9d, 0xbf, 0xdb, 0xb4, 0x46, 0xea,
636 0x42, 0x01, 0x77, 0x23, 0x68, 0x95, 0xb6, 0x24,
637 0xb3, 0xa8, 0x6c, 0x28, 0x3b, 0x11, 0x40, 0x7e,
638 0x18, 0x65, 0x6d, 0xd8, 0x24, 0x42, 0x7d, 0x88,
639 0xc0, 0x52, 0xd9, 0x05, 0xe4, 0x95, 0x90, 0x87,
640 0x8c, 0xf4, 0xd0, 0x6b, 0xb9, 0x83, 0x99, 0x34,
641 0x6d, 0xfe, 0x54, 0x40, 0x94, 0x52, 0x21, 0x4f,
642 0x14, 0x25, 0xc5, 0xd6, 0x5e, 0x95, 0xdc, 0x0a,
643 0x2b, 0x89, 0x20, 0x11, 0x84, 0x48, 0xd6, 0x3a,
644 0xcd, 0x5c, 0x24, 0xad, 0x62, 0xe3, 0xb1, 0x93,
645 0x25, 0x8d, 0xcd, 0x7e, 0xfc, 0x27, 0xa3, 0x37,
646 0xfd, 0x84, 0xfc, 0x1b, 0xb2, 0xf1, 0x27, 0x38,
647 0x5a, 0xb7, 0xfc, 0xf2, 0xfa, 0x95, 0x66, 0xd4,
648 0xfb, 0xba, 0xa7, 0xd7, 0xa3, 0x72, 0x69, 0x48,
649 0x48, 0x8c, 0xeb, 0x28, 0x89, 0xfe, 0x33, 0x65,
650 0x5a, 0x36, 0x01, 0x7e, 0x06, 0x79, 0x0a, 0x09,
651 0x3b, 0x74, 0x11, 0x9a, 0x6e, 0xbf, 0xd4, 0x9e,
652 0x58, 0x90, 0x49, 0x4f, 0x4d, 0x08, 0xd4, 0xe5,
653 0x4a, 0x09, 0x21, 0xef, 0x8b, 0xb8, 0x74, 0x3b,
654 0x91, 0xdd, 0x36, 0x85, 0x60, 0x2d, 0xfa, 0xd4,
655 0x45, 0x7b, 0x45, 0x53, 0xf5, 0x47, 0x87, 0x7e,
656 0xa6, 0x37, 0xc8, 0x78, 0x7a, 0x68, 0x9d, 0x8d,
657 0x65, 0x2c, 0x0e, 0x91, 0x5c, 0xa2, 0x60, 0xf0,
658 0x8e, 0x3f, 0xe9, 0x1a, 0xcd, 0xaa, 0xe7, 0xd5,
659 0x77, 0x18, 0xaf, 0xc9, 0xbc, 0x18, 0xea, 0x48,
660 0x1b, 0xfb, 0x22, 0x48, 0x70, 0x16, 0x29, 0x9e,
661 0x5b, 0xc1, 0x2c, 0x66, 0x23, 0xbc, 0xf0, 0x1f,
662 0xef, 0xaf, 0xe4, 0xd6, 0x04, 0x19, 0x82, 0x7a,
663 0x0b, 0xba, 0x4b, 0x46, 0xb1, 0x6a, 0x85, 0x5d,
664 0xb4, 0x73, 0xd6, 0x21, 0xa1, 0x71, 0x60, 0x14,
665 0xee, 0x0a, 0x77, 0xc4, 0x66, 0x2e, 0xf9, 0x69,
666 0x30, 0xaf, 0x41, 0x0b, 0xc8, 0x83, 0x3c, 0x53,
667 0x99, 0x19, 0x27, 0x46, 0xf7, 0x41, 0x6e, 0x56,
668 0xdc, 0x94, 0x28, 0x67, 0x4e, 0xb7, 0x25, 0x48,
669 0x8a, 0xc2, 0xe0, 0x60, 0x96, 0xcc, 0x18, 0xf4,
670 0x84, 0xdd, 0xa7, 0x5e, 0x3e, 0x05, 0x0b, 0x26,
671 0x26, 0xb2, 0x5c, 0x1f, 0x57, 0x1a, 0x04, 0x7e,
672 0x6a, 0xe3, 0x2f, 0xb4, 0x35, 0xb6, 0x38, 0x40,
673 0x40, 0xcd, 0x6f, 0x87, 0x2e, 0xef, 0xa3, 0xd7,
674 0xa9, 0xc2, 0xe8, 0x0d, 0x27, 0xdf, 0x44, 0x62,
675 0x99, 0xa0, 0xfc, 0xcf, 0x81, 0x78, 0xcb, 0xfe,
676 0xe5, 0xa0, 0x03, 0x4e, 0x6c, 0xd7, 0xf4, 0xaf,
677 0x7a, 0xbb, 0x61, 0x82, 0xfe, 0x71, 0x89, 0xb2,
678 0x22, 0x7c, 0x8e, 0x83, 0x04, 0xce, 0xf6, 0x5d,
679 0x84, 0x8f, 0x95, 0x6a, 0x7f, 0xad, 0xfd, 0x32,
680 0x9c, 0x5e, 0xe4, 0x9c, 0x89, 0x60, 0x54, 0xaa,
681 0x96, 0x72, 0xd2, 0xd7, 0x36, 0x85, 0xa9, 0x45,
682 0xd2, 0x2a, 0xa1, 0x81, 0x49, 0x6f, 0x7e, 0x04,
683 0xfa, 0xe2, 0xfe, 0x90, 0x26, 0x77, 0x5a, 0x33,
684 0xb8, 0x04, 0x9a, 0x7a, 0xe6, 0x4c, 0x4f, 0xad,
685 0x72, 0x96, 0x08, 0x28, 0x58, 0x13, 0xf8, 0xc4,
686 0x1c, 0xf0, 0xc3, 0x45, 0x95, 0x49, 0x20, 0x8c,
687 0x9f, 0x39, 0x70, 0xe1, 0x77, 0xfe, 0xd5, 0x4b,
688 0xaf, 0x86, 0xda, 0xef, 0x22, 0x06, 0x83, 0x36,
689 0x29, 0x12, 0x11, 0x40, 0xbc, 0x3b, 0x86, 0xaa,
690 0xaa, 0x65, 0x60, 0xc3, 0x80, 0xca, 0xed, 0xa9,
691 0xf3, 0xb0, 0x79, 0x96, 0xa2, 0x55, 0x27, 0x28,
692 0x55, 0x73, 0x26, 0xa5, 0x50, 0xea, 0x92, 0x4b,
693 0x3c, 0x5c, 0x82, 0x33, 0xf0, 0x01, 0x3f, 0x03,
694 0xc1, 0x08, 0x05, 0xbf, 0x98, 0xf4, 0x9b, 0x6d,
695 0xa5, 0xa8, 0xb4, 0x82, 0x0c, 0x06, 0xfa, 0xff,
696 0x2d, 0x08, 0xf3, 0x05, 0x4f, 0x57, 0x2a, 0x39,
697 0xd4, 0x83, 0x0d, 0x75, 0x51, 0xd8, 0x5b, 0x1b,
698 0xd3, 0x51, 0x5a, 0x32, 0x2a, 0x9b, 0x32, 0xb2,
699 0xf2, 0xa4, 0x96, 0x12, 0xf2, 0xae, 0x40, 0x34,
700 0x67, 0xa8, 0xf5, 0x44, 0xd5, 0x35, 0x53, 0xfe,
701 0xa3, 0x60, 0x96, 0x63, 0x0f, 0x1f, 0x6e, 0xb0,
702 0x5a, 0x42, 0xa6, 0xfc, 0x51, 0x0b, 0x60, 0x27,
703 0xbc, 0x06, 0x71, 0xed, 0x65, 0x5b, 0x23, 0x86,
704 0x4a, 0x07, 0x3b, 0x22, 0x07, 0x46, 0xe6, 0x90,
705 0x3e, 0xf3, 0x25, 0x50, 0x1b, 0x4c, 0x7f, 0x03,
706 0x08, 0xa8, 0x36, 0x6b, 0x87, 0xe5, 0xe3, 0xdb,
707 0x9a, 0x38, 0x83, 0xff, 0x9f, 0x1a, 0x9f, 0x57,
708 0xa4, 0x2a, 0xf6, 0x37, 0xbc, 0x1a, 0xff, 0xc9,
709 0x1e, 0x35, 0x0c, 0xc3, 0x7c, 0xa3, 0xb2, 0xe5,
710 0xd2, 0xc6, 0xb4, 0x57, 0x47, 0xe4, 0x32, 0x16,
711 0x6d, 0xa9, 0xae, 0x64, 0xe6, 0x2d, 0x8d, 0xc5,
712 0x8d, 0x50, 0x8e, 0xe8, 0x1a, 0x22, 0x34, 0x2a,
713 0xd9, 0xeb, 0x51, 0x90, 0x4a, 0xb1, 0x41, 0x7d,
714 0x64, 0xf9, 0xb9, 0x0d, 0xf6, 0x23, 0x33, 0xb0,
715 0x33, 0xf4, 0xf7, 0x3f, 0x27, 0x84, 0xc6, 0x0f,
716 0x54, 0xa5, 0xc0, 0x2e, 0xec, 0x0b, 0x3a, 0x48,
717 0x6e, 0x80, 0x35, 0x81, 0x43, 0x9b, 0x90, 0xb1,
718 0xd0, 0x2b, 0xea, 0x21, 0xdc, 0xda, 0x5b, 0x09,
719 0xf4, 0xcc, 0x10, 0xb4, 0xc7, 0xfe, 0x79, 0x51,
720 0xc3, 0xc5, 0xac, 0x88, 0x74, 0x84, 0x0b, 0x4b,
721 0xca, 0x79, 0x16, 0x29, 0xfb, 0x69, 0x54, 0xdf,
722 0x41, 0x7e, 0xe9, 0xc7, 0x8e, 0xea, 0xa5, 0xfe,
723 0xfc, 0x76, 0x0e, 0x90, 0xc4, 0x92, 0x38, 0xad,
724 0x7b, 0x48, 0xe6, 0x6e, 0xf7, 0x21, 0xfd, 0x4e,
725 0x93, 0x0a, 0x7b, 0x41, 0x83, 0x68, 0xfb, 0x57,
726 0x51, 0x76, 0x34, 0xa9, 0x6c, 0x00, 0xaa, 0x4f,
727 0x66, 0x65, 0x98, 0x4a, 0x4f, 0xa3, 0xa0, 0xef,
728 0x69, 0x3f, 0xe3, 0x1c, 0x92, 0x8c, 0xfd, 0xd8,
729 0xe8, 0xde, 0x7c, 0x7f, 0x3e, 0x84, 0x8e, 0x69,
730 0x3c, 0xf1, 0xf2, 0x05, 0x46, 0xdc, 0x2f, 0x9d,
731 0x5e, 0x6e, 0x4c, 0xfb, 0xb5, 0x99, 0x2a, 0x59,
732 0x63, 0xc1, 0x34, 0xbc, 0x57, 0xc0, 0x0d, 0xb9,
733 0x61, 0x25, 0xf3, 0x33, 0x23, 0x51, 0xb6, 0x0d,
734 0x07, 0xa6, 0xab, 0x94, 0x4a, 0xb7, 0x2a, 0xea,
735 0xee, 0xac, 0xa3, 0xc3, 0x04, 0x8b, 0x0e, 0x56,
736 0xfe, 0x44, 0xa7, 0x39, 0xe2, 0xed, 0xed, 0xb4,
737 0x22, 0x2b, 0xac, 0x12, 0x32, 0x28, 0x91, 0xd8,
738 0xa5, 0xab, 0xff, 0x5f, 0xe0, 0x4b, 0xda, 0x78,
739 0x17, 0xda, 0xf1, 0x01, 0x5b, 0xcd, 0xe2, 0x5f,
740 0x50, 0x45, 0x73, 0x2b, 0xe4, 0x76, 0x77, 0xf4,
741 0x64, 0x1d, 0x43, 0xfb, 0x84, 0x7a, 0xea, 0x91,
742 0xae, 0xf9, 0x9e, 0xb7, 0xb4, 0xb0, 0x91, 0x5f,
743 0x16, 0x35, 0x9a, 0x11, 0xb8, 0xc7, 0xc1, 0x8c,
744 0xc6, 0x10, 0x8d, 0x2f, 0x63, 0x4a, 0xa7, 0x57,
745 0x3a, 0x51, 0xd6, 0x32, 0x2d, 0x64, 0x72, 0xd4,
746 0x66, 0xdc, 0x10, 0xa6, 0x67, 0xd6, 0x04, 0x23,
747 0x9d, 0x0a, 0x11, 0x77, 0xdd, 0x37, 0x94, 0x17,
748 0x3c, 0xbf, 0x8b, 0x65, 0xb0, 0x2e, 0x5e, 0x66,
749 0x47, 0x64, 0xac, 0xdd, 0xf0, 0x84, 0xfd, 0x39,
750 0xfa, 0x15, 0x5d, 0xef, 0xae, 0xca, 0xc1, 0x36,
751 0xa7, 0x5c, 0xbf, 0xc7, 0x08, 0xc2, 0x66, 0x00,
752 0x74, 0x74, 0x4e, 0x27, 0x3f, 0x55, 0x8a, 0xb7,
753 0x38, 0x66, 0x83, 0x6d, 0xcf, 0x99, 0x9e, 0x60,
754 0x8f, 0xdd, 0x2e, 0x62, 0x22, 0x0e, 0xef, 0x0c,
755 0x98, 0xa7, 0x85, 0x74, 0x3b, 0x9d, 0xec, 0x9e,
756 0xa9, 0x19, 0x72, 0xa5, 0x7f, 0x2c, 0x39, 0xb7,
757 0x7d, 0xb7, 0xf1, 0x12, 0x65, 0x27, 0x4b, 0x5a,
758 0xde, 0x17, 0xfe, 0xad, 0x44, 0xf3, 0x20, 0x4d,
759 0xfd, 0xe4, 0x1f, 0xb5, 0x81, 0xb0, 0x36, 0x37,
760 0x08, 0x6f, 0xc3, 0x0c, 0xe9, 0x85, 0x98, 0x82,
761 0xa9, 0x62, 0x0c, 0xc4, 0x97, 0xc0, 0x50, 0xc8,
762 0xa7, 0x3c, 0x50, 0x9f, 0x43, 0xb9, 0xcd, 0x5e,
763 0x4d, 0xfa, 0x1c, 0x4b, 0x0b, 0xa9, 0x98, 0x85,
764 0x38, 0x92, 0xac, 0x8d, 0xe4, 0xad, 0x9b, 0x98,
765 0xab, 0xd9, 0x38, 0xac, 0x62, 0x52, 0xa3, 0x22,
766 0x63, 0x0f, 0xbf, 0x95, 0x48, 0xdf, 0x69, 0xe7,
767 0x8b, 0x33, 0xd5, 0xb2, 0xbd, 0x05, 0x49, 0x49,
768 0x9d, 0x57, 0x73, 0x19, 0x33, 0xae, 0xfa, 0x33,
769 0xf1, 0x19, 0xa8, 0x80, 0xce, 0x04, 0x9f, 0xbc,
770 0x1d, 0x65, 0x82, 0x1b, 0xe5, 0x3a, 0x51, 0xc8,
771 0x1c, 0x21, 0xe3, 0x5d, 0xf3, 0x7d, 0x9b, 0x2f,
772 0x2c, 0x1d, 0x4a, 0x7f, 0x9b, 0x68, 0x35, 0xa3,
773 0xb2, 0x50, 0xf7, 0x62, 0x79, 0xcd, 0xf4, 0x98,
774 0x4f, 0xe5, 0x63, 0x7c, 0x3e, 0x45, 0x31, 0x8c,
775 0x16, 0xa0, 0x12, 0xc8, 0x58, 0xce, 0x39, 0xa6,
776 0xbc, 0x54, 0xdb, 0xc5, 0xe0, 0xd5, 0xba, 0xbc,
777 0xb9, 0x04, 0xf4, 0x8d, 0xe8, 0x2f, 0x15, 0x9d,
778};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700779
Bob Pearson3863ef32012-03-23 15:02:22 -0700780/* 100 test cases */
781static struct crc_test {
782 u32 crc; /* random starting crc */
783 u32 start; /* random 6 bit offset in buf */
784 u32 length; /* random 11 bit length of test */
785 u32 crc_le; /* expected crc32_le result */
786 u32 crc_be; /* expected crc32_be result */
Darrick J. Wong577eba92012-03-23 15:02:26 -0700787 u32 crc32c_le; /* expected crc32c_le result */
Bob Pearson3863ef32012-03-23 15:02:22 -0700788} test[] =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700789{
Darrick J. Wong577eba92012-03-23 15:02:26 -0700790 {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1,
791 0xf6e93d6c},
792 {0x35c672c6, 0x0000003a, 0x000001aa, 0xc6d3dfba, 0x28aaf3ad,
793 0x0fe92aca},
794 {0x496da28e, 0x00000039, 0x000005af, 0xd933660f, 0x5d57e81f,
795 0x52e1ebb8},
796 {0x09a9b90e, 0x00000027, 0x000001f8, 0xb45fe007, 0xf45fca9a,
797 0x0798af9a},
798 {0xdc97e5a9, 0x00000025, 0x000003b6, 0xf81a3562, 0xe0126ba2,
799 0x18eb3152},
800 {0x47c58900, 0x0000000a, 0x000000b9, 0x8e58eccf, 0xf3afc793,
801 0xd00d08c7},
802 {0x292561e8, 0x0000000c, 0x00000403, 0xa2ba8aaf, 0x0b797aed,
803 0x8ba966bc},
804 {0x415037f6, 0x00000003, 0x00000676, 0xa17d52e8, 0x7f0fdf35,
805 0x11d694a2},
806 {0x3466e707, 0x00000026, 0x00000042, 0x258319be, 0x75c484a2,
807 0x6ab3208d},
808 {0xafd1281b, 0x00000023, 0x000002ee, 0x4428eaf8, 0x06c7ad10,
809 0xba4603c5},
810 {0xd3857b18, 0x00000028, 0x000004a2, 0x5c430821, 0xb062b7cb,
811 0xe6071c6f},
812 {0x1d825a8f, 0x0000002b, 0x0000050b, 0xd2c45f0c, 0xd68634e0,
813 0x179ec30a},
814 {0x5033e3bc, 0x0000000b, 0x00000078, 0xa3ea4113, 0xac6d31fb,
815 0x0903beb8},
816 {0x94f1fb5e, 0x0000000f, 0x000003a2, 0xfbfc50b1, 0x3cfe50ed,
817 0x6a7cb4fa},
818 {0xc9a0fe14, 0x00000009, 0x00000473, 0x5fb61894, 0x87070591,
819 0xdb535801},
820 {0x88a034b1, 0x0000001c, 0x000005ad, 0xc1b16053, 0x46f95c67,
821 0x92bed597},
822 {0xf0f72239, 0x00000020, 0x0000026d, 0xa6fa58f3, 0xf8c2c1dd,
823 0x192a3f1b},
824 {0xcc20a5e3, 0x0000003b, 0x0000067a, 0x7740185a, 0x308b979a,
825 0xccbaec1a},
826 {0xce589c95, 0x0000002b, 0x00000641, 0xd055e987, 0x40aae25b,
827 0x7eabae4d},
828 {0x78edc885, 0x00000035, 0x000005be, 0xa39cb14b, 0x035b0d1f,
829 0x28c72982},
830 {0x9d40a377, 0x0000003b, 0x00000038, 0x1f47ccd2, 0x197fbc9d,
831 0xc3cd4d18},
832 {0x703d0e01, 0x0000003c, 0x000006f1, 0x88735e7c, 0xfed57c5a,
833 0xbca8f0e7},
834 {0x776bf505, 0x0000000f, 0x000005b2, 0x5cc4fc01, 0xf32efb97,
835 0x713f60b3},
836 {0x4a3e7854, 0x00000027, 0x000004b8, 0x8d923c82, 0x0cbfb4a2,
837 0xebd08fd5},
838 {0x209172dd, 0x0000003b, 0x00000356, 0xb89e9c2b, 0xd7868138,
839 0x64406c59},
840 {0x3ba4cc5b, 0x0000002f, 0x00000203, 0xe51601a9, 0x5b2a1032,
841 0x7421890e},
842 {0xfc62f297, 0x00000000, 0x00000079, 0x71a8e1a2, 0x5d88685f,
843 0xe9347603},
844 {0x64280b8b, 0x00000016, 0x000007ab, 0x0fa7a30c, 0xda3a455f,
845 0x1bef9060},
846 {0x97dd724b, 0x00000033, 0x000007ad, 0x5788b2f4, 0xd7326d32,
847 0x34720072},
848 {0x61394b52, 0x00000035, 0x00000571, 0xc66525f1, 0xcabe7fef,
849 0x48310f59},
850 {0x29b4faff, 0x00000024, 0x0000006e, 0xca13751e, 0x993648e0,
851 0x783a4213},
852 {0x29bfb1dc, 0x0000000b, 0x00000244, 0x436c43f7, 0x429f7a59,
853 0x9e8efd41},
854 {0x86ae934b, 0x00000035, 0x00000104, 0x0760ec93, 0x9cf7d0f4,
855 0xfc3d34a5},
856 {0xc4c1024e, 0x0000002e, 0x000006b1, 0x6516a3ec, 0x19321f9c,
857 0x17a52ae2},
858 {0x3287a80a, 0x00000026, 0x00000496, 0x0b257eb1, 0x754ebd51,
859 0x886d935a},
860 {0xa4db423e, 0x00000023, 0x0000045d, 0x9b3a66dc, 0x873e9f11,
861 0xeaaeaeb2},
862 {0x7a1078df, 0x00000015, 0x0000014a, 0x8c2484c5, 0x6a628659,
863 0x8e900a4b},
864 {0x6048bd5b, 0x00000006, 0x0000006a, 0x897e3559, 0xac9961af,
865 0xd74662b1},
866 {0xd8f9ea20, 0x0000003d, 0x00000277, 0x60eb905b, 0xed2aaf99,
867 0xd26752ba},
868 {0xea5ec3b4, 0x0000002a, 0x000004fe, 0x869965dc, 0x6c1f833b,
869 0x8b1fcd62},
870 {0x2dfb005d, 0x00000016, 0x00000345, 0x6a3b117e, 0xf05e8521,
871 0xf54342fe},
872 {0x5a214ade, 0x00000020, 0x000005b6, 0x467f70be, 0xcb22ccd3,
873 0x5b95b988},
874 {0xf0ab9cca, 0x00000032, 0x00000515, 0xed223df3, 0x7f3ef01d,
875 0x2e1176be},
876 {0x91b444f9, 0x0000002e, 0x000007f8, 0x84e9a983, 0x5676756f,
877 0x66120546},
878 {0x1b5d2ddb, 0x0000002e, 0x0000012c, 0xba638c4c, 0x3f42047b,
879 0xf256a5cc},
880 {0xd824d1bb, 0x0000003a, 0x000007b5, 0x6288653b, 0x3a3ebea0,
881 0x4af1dd69},
882 {0x0470180c, 0x00000034, 0x000001f0, 0x9d5b80d6, 0x3de08195,
883 0x56f0a04a},
884 {0xffaa3a3f, 0x00000036, 0x00000299, 0xf3a82ab8, 0x53e0c13d,
885 0x74f6b6b2},
886 {0x6406cfeb, 0x00000023, 0x00000600, 0xa920b8e8, 0xe4e2acf4,
887 0x085951fd},
888 {0xb24aaa38, 0x0000003e, 0x000004a1, 0x657cc328, 0x5077b2c3,
889 0xc65387eb},
890 {0x58b2ab7c, 0x00000039, 0x000002b4, 0x3a17ee7e, 0x9dcb3643,
891 0x1ca9257b},
892 {0x3db85970, 0x00000006, 0x000002b6, 0x95268b59, 0xb9812c10,
893 0xfd196d76},
894 {0x857830c5, 0x00000003, 0x00000590, 0x4ef439d5, 0xf042161d,
895 0x5ef88339},
896 {0xe1fcd978, 0x0000003e, 0x000007d8, 0xae8d8699, 0xce0a1ef5,
897 0x2c3714d9},
898 {0xb982a768, 0x00000016, 0x000006e0, 0x62fad3df, 0x5f8a067b,
899 0x58576548},
900 {0x1d581ce8, 0x0000001e, 0x0000058b, 0xf0f5da53, 0x26e39eee,
901 0xfd7c57de},
902 {0x2456719b, 0x00000025, 0x00000503, 0x4296ac64, 0xd50e4c14,
903 0xd5fedd59},
904 {0xfae6d8f2, 0x00000000, 0x0000055d, 0x057fdf2e, 0x2a31391a,
905 0x1cc3b17b},
906 {0xcba828e3, 0x00000039, 0x000002ce, 0xe3f22351, 0x8f00877b,
907 0x270eed73},
908 {0x13d25952, 0x0000000a, 0x0000072d, 0x76d4b4cc, 0x5eb67ec3,
909 0x91ecbb11},
910 {0x0342be3f, 0x00000015, 0x00000599, 0xec75d9f1, 0x9d4d2826,
911 0x05ed8d0c},
912 {0xeaa344e0, 0x00000014, 0x000004d8, 0x72a4c981, 0x2064ea06,
913 0x0b09ad5b},
914 {0xbbb52021, 0x0000003b, 0x00000272, 0x04af99fc, 0xaf042d35,
915 0xf8d511fb},
916 {0xb66384dc, 0x0000001d, 0x000007fc, 0xd7629116, 0x782bd801,
917 0x5ad832cc},
918 {0x616c01b6, 0x00000022, 0x000002c8, 0x5b1dab30, 0x783ce7d2,
919 0x1214d196},
920 {0xce2bdaad, 0x00000016, 0x0000062a, 0x932535c8, 0x3f02926d,
921 0x5747218a},
922 {0x00fe84d7, 0x00000005, 0x00000205, 0x850e50aa, 0x753d649c,
923 0xde8f14de},
924 {0xbebdcb4c, 0x00000006, 0x0000055d, 0xbeaa37a2, 0x2d8c9eba,
925 0x3563b7b9},
926 {0xd8b1a02a, 0x00000010, 0x00000387, 0x5017d2fc, 0x503541a5,
927 0x071475d0},
928 {0x3b96cad2, 0x00000036, 0x00000347, 0x1d2372ae, 0x926cd90b,
929 0x54c79d60},
930 {0xc94c1ed7, 0x00000005, 0x0000038b, 0x9e9fdb22, 0x144a9178,
931 0x4c53eee6},
932 {0x1aad454e, 0x00000025, 0x000002b2, 0xc3f6315c, 0x5c7a35b3,
933 0x10137a3c},
934 {0xa4fec9a6, 0x00000000, 0x000006d6, 0x90be5080, 0xa4107605,
935 0xaa9d6c73},
936 {0x1bbe71e2, 0x0000001f, 0x000002fd, 0x4e504c3b, 0x284ccaf1,
937 0xb63d23e7},
938 {0x4201c7e4, 0x00000002, 0x000002b7, 0x7822e3f9, 0x0cc912a9,
939 0x7f53e9cf},
940 {0x23fddc96, 0x00000003, 0x00000627, 0x8a385125, 0x07767e78,
941 0x13c1cd83},
942 {0xd82ba25c, 0x00000016, 0x0000063e, 0x98e4148a, 0x283330c9,
943 0x49ff5867},
944 {0x786f2032, 0x0000002d, 0x0000060f, 0xf201600a, 0xf561bfcd,
945 0x8467f211},
946 {0xfebe4e1f, 0x0000002a, 0x000004f2, 0x95e51961, 0xfd80dcab,
947 0x3f9683b2},
948 {0x1a6e0a39, 0x00000008, 0x00000672, 0x8af6c2a5, 0x78dd84cb,
949 0x76a3f874},
950 {0x56000ab8, 0x0000000e, 0x000000e5, 0x36bacb8f, 0x22ee1f77,
951 0x863b702f},
952 {0x4717fe0c, 0x00000000, 0x000006ec, 0x8439f342, 0x5c8e03da,
953 0xdc6c58ff},
954 {0xd5d5d68e, 0x0000003c, 0x000003a3, 0x46fff083, 0x177d1b39,
955 0x0622cc95},
956 {0xc25dd6c6, 0x00000024, 0x000006c0, 0x5ceb8eb4, 0x892b0d16,
957 0xe85605cd},
958 {0xe9b11300, 0x00000023, 0x00000683, 0x07a5d59a, 0x6c6a3208,
959 0x31da5f06},
960 {0x95cd285e, 0x00000001, 0x00000047, 0x7b3a4368, 0x0202c07e,
961 0xa1f2e784},
962 {0xd9245a25, 0x0000001e, 0x000003a6, 0xd33c1841, 0x1936c0d5,
963 0xb07cc616},
964 {0x103279db, 0x00000006, 0x0000039b, 0xca09b8a0, 0x77d62892,
965 0xbf943b6c},
966 {0x1cba3172, 0x00000027, 0x000001c8, 0xcb377194, 0xebe682db,
967 0x2c01af1c},
968 {0x8f613739, 0x0000000c, 0x000001df, 0xb4b0bc87, 0x7710bd43,
969 0x0fe5f56d},
970 {0x1c6aa90d, 0x0000001b, 0x0000053c, 0x70559245, 0xda7894ac,
971 0xf8943b2d},
972 {0xaabe5b93, 0x0000003d, 0x00000715, 0xcdbf42fa, 0x0c3b99e7,
973 0xe4d89272},
974 {0xf15dd038, 0x00000006, 0x000006db, 0x6e104aea, 0x8d5967f2,
975 0x7c2f6bbb},
976 {0x584dd49c, 0x00000020, 0x000007bc, 0x36b6cfd6, 0xad4e23b2,
977 0xabbf388b},
978 {0x5d8c9506, 0x00000020, 0x00000470, 0x4c62378e, 0x31d92640,
979 0x1dca1f4e},
980 {0xb80d17b0, 0x00000032, 0x00000346, 0x22a5bb88, 0x9a7ec89f,
981 0x5c170e23},
982 {0xdaf0592e, 0x00000023, 0x000007b0, 0x3cab3f99, 0x9b1fdd99,
983 0xc0e9d672},
984 {0x4793cc85, 0x0000000d, 0x00000706, 0xe82e04f6, 0xed3db6b7,
985 0xc18bdc86},
986 {0x82ebf64e, 0x00000009, 0x000007c3, 0x69d590a9, 0x9efa8499,
987 0xa874fcdd},
988 {0xb18a0319, 0x00000026, 0x000007db, 0x1cf98dcc, 0x8fa9ad6a,
989 0x9dc0bb48},
Bob Pearson3863ef32012-03-23 15:02:22 -0700990};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700991
Bob Pearson3863ef32012-03-23 15:02:22 -0700992#include <linux/time.h>
993
Darrick J. Wong577eba92012-03-23 15:02:26 -0700994static int __init crc32c_test(void)
995{
996 int i;
997 int errors = 0;
998 int bytes = 0;
999 struct timespec start, stop;
1000 u64 nsec;
1001 unsigned long flags;
1002
1003 /* keep static to prevent cache warming code from
1004 * getting eliminated by the compiler */
1005 static u32 crc;
1006
1007 /* pre-warm the cache */
1008 for (i = 0; i < 100; i++) {
1009 bytes += 2*test[i].length;
1010
1011 crc ^= __crc32c_le(test[i].crc, test_buf +
1012 test[i].start, test[i].length);
1013 }
1014
1015 /* reduce OS noise */
1016 local_irq_save(flags);
1017 local_irq_disable();
1018
1019 getnstimeofday(&start);
1020 for (i = 0; i < 100; i++) {
1021 if (test[i].crc32c_le != __crc32c_le(test[i].crc, test_buf +
1022 test[i].start, test[i].length))
1023 errors++;
1024 }
1025 getnstimeofday(&stop);
1026
1027 local_irq_restore(flags);
1028 local_irq_enable();
1029
1030 nsec = stop.tv_nsec - start.tv_nsec +
1031 1000000000 * (stop.tv_sec - start.tv_sec);
1032
1033 pr_info("crc32c: CRC_LE_BITS = %d\n", CRC_LE_BITS);
1034
1035 if (errors)
1036 pr_warn("crc32c: %d self tests failed\n", errors);
1037 else {
1038 pr_info("crc32c: self tests passed, processed %d bytes in %lld nsec\n",
1039 bytes, nsec);
1040 }
1041
1042 return 0;
1043}
1044
1045static int __init crc32_test(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001046{
Bob Pearson3863ef32012-03-23 15:02:22 -07001047 int i;
1048 int errors = 0;
1049 int bytes = 0;
1050 struct timespec start, stop;
1051 u64 nsec;
1052 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001053
Bob Pearson3863ef32012-03-23 15:02:22 -07001054 /* keep static to prevent cache warming code from
1055 * getting eliminated by the compiler */
1056 static u32 crc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001057
Bob Pearson3863ef32012-03-23 15:02:22 -07001058 /* pre-warm the cache */
1059 for (i = 0; i < 100; i++) {
1060 bytes += 2*test[i].length;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001061
Bob Pearson3863ef32012-03-23 15:02:22 -07001062 crc ^= crc32_le(test[i].crc, test_buf +
1063 test[i].start, test[i].length);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001064
Bob Pearson3863ef32012-03-23 15:02:22 -07001065 crc ^= crc32_be(test[i].crc, test_buf +
1066 test[i].start, test[i].length);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001067 }
1068
Bob Pearson3863ef32012-03-23 15:02:22 -07001069 /* reduce OS noise */
1070 local_irq_save(flags);
1071 local_irq_disable();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001072
Bob Pearson3863ef32012-03-23 15:02:22 -07001073 getnstimeofday(&start);
1074 for (i = 0; i < 100; i++) {
1075 if (test[i].crc_le != crc32_le(test[i].crc, test_buf +
1076 test[i].start, test[i].length))
1077 errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078
Bob Pearson3863ef32012-03-23 15:02:22 -07001079 if (test[i].crc_be != crc32_be(test[i].crc, test_buf +
1080 test[i].start, test[i].length))
1081 errors++;
1082 }
1083 getnstimeofday(&stop);
1084
1085 local_irq_restore(flags);
1086 local_irq_enable();
1087
1088 nsec = stop.tv_nsec - start.tv_nsec +
1089 1000000000 * (stop.tv_sec - start.tv_sec);
1090
1091 pr_info("crc32: CRC_LE_BITS = %d, CRC_BE BITS = %d\n",
1092 CRC_LE_BITS, CRC_BE_BITS);
1093
1094 if (errors)
1095 pr_warn("crc32: %d self tests failed\n", errors);
1096 else {
1097 pr_info("crc32: self tests passed, processed %d bytes in %lld nsec\n",
1098 bytes, nsec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001099 }
1100
Linus Torvalds1da177e2005-04-16 15:20:36 -07001101 return 0;
1102}
1103
Darrick J. Wong577eba92012-03-23 15:02:26 -07001104static int __init crc32test_init(void)
1105{
1106 crc32_test();
1107 crc32c_test();
1108 return 0;
1109}
1110
Bob Pearson3863ef32012-03-23 15:02:22 -07001111static void __exit crc32_exit(void)
1112{
1113}
1114
Darrick J. Wong577eba92012-03-23 15:02:26 -07001115module_init(crc32test_init);
Bob Pearson3863ef32012-03-23 15:02:22 -07001116module_exit(crc32_exit);
1117#endif /* CONFIG_CRC32_SELFTEST */