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