1use crate::{Hash, Hasher};
2
3const IV: [u64; 8] = [
4 0x6A09E667F3BCC908,
5 0xBB67AE8584CAA73B,
6 0x3C6EF372FE94F82B,
7 0xA54FF53A5F1D36F1,
8 0x510E527FADE682D1,
9 0x9B05688C2B3E6C1F,
10 0x1F83D9ABFB41BD6B,
11 0x5BE0CD19137E2179,
12];
13
14const SIGMA: [[u8; 16]; 12] = [
15 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
16 [14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3],
17 [11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4],
18 [7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8],
19 [9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13],
20 [2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9],
21 [12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11],
22 [13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10],
23 [6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5],
24 [10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0],
25 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
26 [14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3],
27];
28
29#[derive(Clone)]
30#[cfg_attr(feature = "zeroize", derive(zeroize::Zeroize, zeroize::ZeroizeOnDrop))]
31pub struct Blake2b {
32 h: [u64; 8],
33 buffer: [u8; 128],
34 buffer_len: usize,
35 total_len: u128,
36 outlen: usize,
37 key_pending: bool,
38}
39
40impl Blake2b {
41 pub fn new_keyed(key: &[u8], outlen: usize) -> Self {
42 assert!(outlen >= 1 && outlen <= 64);
43 assert!(key.len() <= 64);
44
45 let mut state = Blake2b {
46 h: IV,
47 buffer: [0u8; 128],
48 buffer_len: if key.len() > 0 { 128 } else { 0 },
49 total_len: 0,
50 outlen,
51 key_pending: key.len() > 0,
52 };
53
54 state.h[0] ^= 0x01010000 ^ ((key.len() as u64) << 8) ^ (outlen as u64);
55
56 if key.len() > 0 {
57 state.buffer[..key.len()].copy_from_slice(key);
58 }
59
60 state
61 }
62
63 #[inline]
64 fn g(v: &mut [u64; 16], a: usize, b: usize, c: usize, d: usize, x: u64, y: u64) {
65 v[a] = v[a].wrapping_add(v[b]).wrapping_add(x);
66 v[d] = (v[d] ^ v[a]).rotate_right(32);
67 v[c] = v[c].wrapping_add(v[d]);
68 v[b] = (v[b] ^ v[c]).rotate_right(24);
69 v[a] = v[a].wrapping_add(v[b]).wrapping_add(y);
70 v[d] = (v[d] ^ v[a]).rotate_right(16);
71 v[c] = v[c].wrapping_add(v[d]);
72 v[b] = (v[b] ^ v[c]).rotate_right(63);
73 }
74
75 fn compress(&mut self, last: bool) {
76 let mut v: [u64; 16] = [0u64; 16];
77 v[..8].copy_from_slice(&self.h);
78 v[8..16].copy_from_slice(&IV);
79
80 v[12] ^= self.total_len as u64;
81 v[13] ^= (self.total_len >> 64) as u64;
82
83 if last {
84 v[14] = !v[14];
85 }
86
87 let mut m = [0u64; 16];
88 for i in 0..16 {
89 let offset = i * 8;
90 m[i] = u64::from_le_bytes([
91 self.buffer[offset],
92 self.buffer[offset + 1],
93 self.buffer[offset + 2],
94 self.buffer[offset + 3],
95 self.buffer[offset + 4],
96 self.buffer[offset + 5],
97 self.buffer[offset + 6],
98 self.buffer[offset + 7],
99 ]);
100 }
101
102 for i in 0..12 {
103 let s = &SIGMA[i];
104 Self::g(&mut v, 0, 4, 8, 12, m[s[0] as usize], m[s[1] as usize]);
105 Self::g(&mut v, 1, 5, 9, 13, m[s[2] as usize], m[s[3] as usize]);
106 Self::g(&mut v, 2, 6, 10, 14, m[s[4] as usize], m[s[5] as usize]);
107 Self::g(&mut v, 3, 7, 11, 15, m[s[6] as usize], m[s[7] as usize]);
108 Self::g(&mut v, 0, 5, 10, 15, m[s[8] as usize], m[s[9] as usize]);
109 Self::g(&mut v, 1, 6, 11, 12, m[s[10] as usize], m[s[11] as usize]);
110 Self::g(&mut v, 2, 7, 8, 13, m[s[12] as usize], m[s[13] as usize]);
111 Self::g(&mut v, 3, 4, 9, 14, m[s[14] as usize], m[s[15] as usize]);
112 }
113
114 for i in 0..8 {
115 self.h[i] ^= v[i] ^ v[i + 8];
116 }
117 }
118}
119
120impl Hasher for Blake2b {
121 const BLOCK_SIZE: usize = 128;
122 const OUTPUT_SIZE: usize = 64;
123
124 #[inline]
125 fn new() -> Self {
126 let mut state = Blake2b {
127 h: IV,
128 buffer: [0u8; 128],
129 buffer_len: 0,
130 total_len: 0,
131 outlen: 64,
132 key_pending: false,
133 };
134 state.h[0] ^= 0x01010000 ^ 64;
135 state
136 }
137
138 #[inline]
139 fn update(&mut self, mut data: &[u8]) {
140 if data.is_empty() {
141 return;
142 }
143
144 if self.key_pending {
145 self.total_len = self.total_len.wrapping_add(128);
146 self.compress(false);
147 self.key_pending = false;
148 self.buffer_len = 0;
149 }
150
151 if self.buffer_len > 0 {
152 let to_fill = (128 - self.buffer_len).min(data.len());
153 self.buffer[self.buffer_len..self.buffer_len + to_fill].copy_from_slice(&data[..to_fill]);
154 self.buffer_len += to_fill;
155 data = &data[to_fill..];
156
157 if self.buffer_len == 128 && !data.is_empty() {
158 self.total_len = self.total_len.wrapping_add(128);
159 self.compress(false);
160 self.buffer_len = 0;
161 }
162 }
163
164 while data.len() > 128 {
165 self.buffer[..128].copy_from_slice(&data[..128]);
166 self.total_len = self.total_len.wrapping_add(128);
167 self.compress(false);
168 data = &data[128..];
169 }
170
171 if !data.is_empty() {
172 self.buffer[..data.len()].copy_from_slice(data);
173 self.buffer_len = data.len();
174 }
175 }
176
177 #[inline]
178 fn sum(mut self) -> Hash {
179 if self.key_pending {
180 self.total_len = self.total_len.wrapping_add(128);
181 for i in self.buffer_len..128 {
182 self.buffer[i] = 0;
183 }
184 } else {
185 self.total_len = self.total_len.wrapping_add(self.buffer_len as u128);
186 for i in self.buffer_len..128 {
187 self.buffer[i] = 0;
188 }
189 }
190 self.compress(true);
191
192 let mut out = [0u8; 64];
193 for i in 0..self.outlen {
194 out[i] = (self.h[i >> 3] >> ((i & 7) * 8)) as u8;
195 }
196 let mut hash = Hash::new();
197 hash.append(&out[..self.outlen]);
198 hash
199 }
200}
201
202#[cfg(test)]
203mod tests {
204 use super::Blake2b;
205 use crate::Hasher;
206
207 fn decode_hex(s: &str) -> Vec<u8> {
208 (0..s.len())
209 .step_by(2)
210 .map(|i| u8::from_str_radix(&s[i..i + 2], 16).unwrap())
211 .collect()
212 }
213
214 #[test]
215 fn rfc_blake2b_512_abc() {
216 let mut h = Blake2b::new();
217 h.update(b"abc");
218 let digest = h.sum();
219 let expected = decode_hex(
220 "ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923",
221 );
222 assert_eq!(digest.as_ref(), expected.as_slice());
223 }
224
225 #[test]
226 fn rfc_blake2b_512_empty() {
227 let mut h = Blake2b::new();
228 h.update(b"");
229 let digest = h.sum();
230 let expected = decode_hex(
231 "786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce",
232 );
233 assert_eq!(digest.as_ref(), expected.as_slice());
234 }
235
236 #[test]
237 fn blake2b_empty_variants() {
238 let mut h = Blake2b::new_keyed(&[], 20);
239 h.update(b"");
240 assert_eq!(h.sum().len(), 20);
241
242 let mut h = Blake2b::new_keyed(&[], 32);
243 h.update(b"");
244 assert_eq!(h.sum().len(), 32);
245
246 let mut h = Blake2b::new_keyed(&[], 48);
247 h.update(b"");
248 assert_eq!(h.sum().len(), 48);
249 }
250
251 #[test]
252 fn blake2b_keyed_empty_key() {
253 let key = decode_hex(
254 "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
255 );
256 let mut h = Blake2b::new_keyed(&key, 64);
257 h.update(b"");
258 let digest = h.sum();
259 let expected = decode_hex(
260 "10ebb67700b1868efb4417987acf4690ae9d972fb7a590c2f02871799aaa4786b5e996e8f0f4eb981fc214b005f42d2ff4233499391653df7aefcbc13fc51568",
261 );
262 assert_eq!(hex::encode(digest.as_ref()), hex::encode(expected));
263 }
264
265 #[test]
266 fn blake2b_keyed_nonempty() {
267 let key = decode_hex(
268 "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
269 );
270 let input = decode_hex("00");
271 let mut h = Blake2b::new_keyed(&key, 64);
272 h.update(&input);
273 let digest = h.sum();
274 let expected = "961f6dd1e4dd30f63901690c512e78e4b45e4742ed197c3c5e45c549fd25f2e4187b0bc9fe30492b16b0d0bc4ef9b0f34c7003fac09a5ef1532e69430234cebd";
275 assert_eq!(hex::encode(digest.as_ref()), expected);
276 }
277
278 fn selftest_seq(len: usize, seed: u32) -> Vec<u8> {
279 let mut out = vec![0u8; len];
280 let mut a = 0xDEAD4BADu32.wrapping_mul(seed);
281 let mut b = 1u32;
282 for i in 0..len {
283 let t = a.wrapping_add(b);
284 a = b;
285 b = t;
286 out[i] = (t >> 24) as u8;
287 }
288 out
289 }
290
291 #[test]
292 fn blake2b_selftest_individual_hashes() {
293 let expected_hashes: Vec<(&str, &str, &str)> = vec![
294 (
295 "20,0",
296 "3345524abf6bbe1809449224b5972c41790b6cf2",
297 "ad75ead79f7121d1f08afe599927a5a38be1b179",
298 ),
299 (
300 "20,3",
301 "70699c8dd92406789f2c3a5b85d644a1c56f5e43",
302 "82799d7be8f4d169fb85e6636a7b6c50a01f70a2",
303 ),
304 (
305 "20,128",
306 "00830d363834916ecb336b93782e6ba320acc951",
307 "7d145fe4756ee73b9e7873f1c5c08c3ccb134d1f",
308 ),
309 (
310 "20,129",
311 "450bdb71a0978ff09fe71c3cb4de5591dfa559b2",
312 "b43f1b98a2faad56db45152455cb2546d36cdd7a",
313 ),
314 (
315 "20,255",
316 "74952cc68fa35387677c8e63d02676a8195cb9a4",
317 "3589fa767728b7eecdeb6fb0463cb30dbf482ee8",
318 ),
319 (
320 "20,1024",
321 "5133fd036f6727b284e2135f0ef78503eef6f290",
322 "cb8e9bf1b43d827cf72fa671d12268a97858dc3d",
323 ),
324 (
325 "32,0",
326 "0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8",
327 "893629475279dfd82a841a8f21a372ed30ccb8ae3462e1907f50663f3c036683",
328 ),
329 (
330 "32,3",
331 "c6fcb3c3542e65f2db9a75aca089bfe3ff63e5b3889f65bf1d2da61964710782",
332 "016a18bb10e0c3a5e59fcefd1a407ab7f1c0361b3f9834774254d3f04cda3898",
333 ),
334 (
335 "32,128",
336 "9f51dad780c3c7f1915262e80ccbd443a91e5c5c97e8127f9c9f8536aec85960",
337 "f30f6e381e31a1e84b710cc103bad03cb41f60a69da0b1a3ec633deada962c35",
338 ),
339 (
340 "32,129",
341 "5a9585ea35499d7d883d3a22eed1d3ebc46c1b1937d479b8be92b358c3eed78e",
342 "1636b4448b28e3805416c9b960ed0c2e271eb87661efe8260c03d8318705b052",
343 ),
344 (
345 "32,255",
346 "517f6f8c5afea55f1c27cb8cdb4ff015c9602a550ba3080e5ac32796931711d3",
347 "1d4eba1f03467518e224f1679846d93ad23fad4fb1adb808c4a21f0e7e7732cf",
348 ),
349 (
350 "32,1024",
351 "a001b41dd6bfcb13c73bf83a1fe5c881d49476163e472906c200375d8482b004",
352 "64fab4bda27882cbdfd02b1cf3c2cf18e0248766e3972dbd2cf95e16d5f2999a",
353 ),
354 (
355 "48,0",
356 "b32811423377f52d7862286ee1a72ee540524380fda1724a6f25d7978c6fd3244a6caf0498812673c5e05ef583825100",
357 "d72c9b4a734eb207e9ddbff00b10c370c89d67d796c3a7b96815a953921bb29759d29d2563f3da4d7f3ea4a6e34c326b",
358 ),
359 (
360 "48,3",
361 "241719372fc6ee737f7c51f5bcd1b93ab6f3aa4458d2eb6fbbebb364d1104dbd8d428ebb39b498317e961906da83e2c8",
362 "ef46fa54a2c220da06a84c776e87dd0a21eeb5e9401a0a7811197418fe92701577d0a8532448e8b8536aa6c742cd2c62",
363 ),
364 (
365 "48,128",
366 "b3136da33705c76ea180813f9bd3a9751894eadc5e24795cb40d598d50d0c2b6625b08be1b793d3ea04a391d39a3e92e",
367 "61801fc31461adcfa7072e3312581ffa46a285e7dbaccb651a91f3cf887662a82d43a18057f0b3077226ccfc8dbbcf15",
368 ),
369 (
370 "48,129",
371 "01b68ceef88c91df02551e491f8158856b78e974aba2c6921e8ce3a64610fba07ed68db633063b5e69bda944db8bd02b",
372 "699ed0644914a9dc0dca937e7b509416f0ff5b3c9bf2e431cd699d1bf3772169371e6d7638e8e47bdf6f467b7a09ba80",
373 ),
374 (
375 "48,255",
376 "3bd8da79e5206479f24baa2bcb047cb86b29393725980b4aa222f8d5bf34a9b66f58d5594433d02d83f3751ee7f179bb",
377 "8a6e17a63ac981b127e42539383d21861f9b150194b2ccce6a67e5fa46b31cb32b58a56476316dbec73ee8009128473f",
378 ),
379 (
380 "48,1024",
381 "0bdea1e5f570fb4a7c7765c374c2ee5118ed4264a95cde380fb1c005ed2667e0b5c881344866668efbfd2572f45bb398",
382 "67c1c43b435cb7ff77ad8e61afa6881d60bc8f7262f4467b8253f60dce562fc4d28e532d87964911f9c5d537ec5fea80",
383 ),
384 (
385 "64,0",
386 "786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce",
387 "d74bf31e5ce5d8a25d09215253cad2f8d2fda91009301605a68cc3865bb7935bcaff6f2af643a77699e80261a1fd2c80e837b56232f7b146434aa74d7118bb16",
388 ),
389 (
390 "64,3",
391 "695fdeec42bd4554047c27e9f31f8a72ba566a1139708dee66f4d4e3caa71eabfd074dae263f6e8720fe5aa7a9ec90459a9a99eab6f98180df266872b608460e",
392 "70fc57e1495fe4390d38a1d39705eef6aabbd264c7ce66118d0a87d42594b387dc50188bba61f091d6b34ff54e091e70240183cdb9211f1439775cc6e6e93573",
393 ),
394 (
395 "64,128",
396 "df525b0ab7842f39e8c40ca46a53d4f709db3891447ad0239d62f24c49cdf2f83c115ac82b6497cc4ee975cd5a83c29296f568efa4f26f64e1e2550c2ddda291",
397 "dddf87e807c146cb2429dce212cfe2aa39c5f4784516b36b8a9f288d304d2dfa477eb637a450c85468c8559e3a65d06e7df9889ffcf3c9adce08e9bdbfdd28e7",
398 ),
399 (
400 "64,129",
401 "528a9ac84918bce406564e7e1d976e399d0e1744fe31eb3a27e64d7be707a826dd4be249fa3505bb172a0fcdc134eb6086310325f06131b11e52225fe25795b8",
402 "4a2fb76dd89a695c8299d323ff96dbf35e2da8b9d51b6a4ac58f222ac60cb79b699fede415adc44ded4bd6ff3f74c3347ffc99d05e9020451baafbd83c6fb739",
403 ),
404 (
405 "64,255",
406 "f7c5fc8e9f50c53a29b1231e24c867848de1e136180ada04ee9352c420a966b015fe68c93f9207d985bb06aa8d98f3052443d320e728a2aceda699b5385c95a0",
407 "c648c1f4aecc038b66404c8277ba16bced67d77e3bfa8bc2a94fe355bb6c4ce30d1111c29cf158db6922db8de932139ae30f2845ccc6b8e374499ce69699ee77",
408 ),
409 (
410 "64,1024",
411 "3b824548e1ba9c9e8510079458158a03a2150bda57cf363b907025cae965a96ae1f1c2ec41a60b7ebe1e2ac2eff4c9b5ade91954015966c5f01618b7c3b77a3e",
412 "96cb77a5f16c16c37e518a0c2a6a77cc681030c1d9cfcff64ed9125d17673fc48d8bb540a0b322c72ccd92b5c260343f71a152e9e597258a83ea58edaf612ca1",
413 ),
414 ];
415
416 let mut ctx = Blake2b::new_keyed(&[], 32);
417 for (label, unkeyed_exp, keyed_exp) in expected_hashes.iter() {
418 let (outlen_str, inlen_str) = label.split_once(',').unwrap();
419 let outlen: usize = outlen_str.parse().unwrap();
420 let inlen: usize = inlen_str.parse().unwrap();
421 let input = selftest_seq(inlen, inlen as u32);
422
423 let mut h = Blake2b::new_keyed(&[], outlen);
424 h.update(&input);
425 let md = h.sum();
426 assert_eq!(hex::encode(md.as_ref()), *unkeyed_exp, "unkeyed mismatch at {}", label);
427 ctx.update(md.as_ref());
428
429 let key = selftest_seq(outlen, outlen as u32);
430 let mut h2 = Blake2b::new_keyed(&key, outlen);
431 h2.update(&input);
432 let md2 = h2.sum();
433 assert_eq!(hex::encode(md2.as_ref()), *keyed_exp, "keyed mismatch at {}", label);
434 ctx.update(md2.as_ref());
435 }
436 let blake2b_res: [u8; 32] = [
437 0xC2, 0x3A, 0x78, 0x00, 0xD9, 0x81, 0x23, 0xBD, 0x10, 0xF5, 0x06, 0xC6, 0x1E, 0x29, 0xDA, 0x56, 0x03, 0xD7,
438 0x63, 0xB8, 0xBB, 0xAD, 0x2E, 0x73, 0x7F, 0x5E, 0x76, 0x5A, 0x7B, 0xCC, 0xD4, 0x75,
439 ];
440 let result = ctx.sum();
441 assert_eq!(
442 result.as_ref(),
443 blake2b_res.as_slice(),
444 "\nfinal mismatch! got: {}",
445 hex::encode(result.as_ref())
446 );
447 }
448
449 #[test]
450 fn rfc_selftest_blake2b() {
451 let blake2b_res: [u8; 32] = [
452 0xC2, 0x3A, 0x78, 0x00, 0xD9, 0x81, 0x23, 0xBD, 0x10, 0xF5, 0x06, 0xC6, 0x1E, 0x29, 0xDA, 0x56, 0x03, 0xD7,
453 0x63, 0xB8, 0xBB, 0xAD, 0x2E, 0x73, 0x7F, 0x5E, 0x76, 0x5A, 0x7B, 0xCC, 0xD4, 0x75,
454 ];
455 let b2b_md_len: [usize; 4] = [20, 32, 48, 64];
456 let b2b_in_len: [usize; 6] = [0, 3, 128, 129, 255, 1024];
457
458 let mut ctx = Blake2b::new_keyed(&[], 32);
459 for &outlen in &b2b_md_len {
460 for &inlen in &b2b_in_len {
461 let input = selftest_seq(inlen, inlen as u32);
462 let mut h = Blake2b::new_keyed(&[], outlen);
463 h.update(&input);
464 let md = h.sum();
465 ctx.update(md.as_ref());
466
467 let key = selftest_seq(outlen, outlen as u32);
468 let mut h2 = Blake2b::new_keyed(&key, outlen);
469 h2.update(&input);
470 let md2 = h2.sum();
471 ctx.update(md2.as_ref());
472 }
473 }
474 let result = ctx.sum();
475 assert_eq!(result.as_ref(), blake2b_res.as_slice());
476 }
477
478 #[test]
479 fn blake2b_incremental() {
480 let input = b"The quick brown fox jumps over the lazy dog";
481 let mut full = Blake2b::new();
482 full.update(input);
483 let full_digest = full.sum();
484
485 let mut incremental = Blake2b::new();
486 for chunk in input.chunks(4) {
487 incremental.update(chunk);
488 }
489 let inc_digest = incremental.sum();
490 assert_eq!(full_digest.as_ref(), inc_digest.as_ref());
491 }
492
493 #[test]
494 fn blake2b_block_boundaries() {
495 for len in [0usize, 1, 111, 112, 113, 127, 128, 129, 254, 255, 256, 257, 512, 1024] {
496 let input = vec![b'a'; len];
497 let mut whole = Blake2b::new();
498 whole.update(&input);
499 let whole_sum = whole.sum();
500
501 let mut split = Blake2b::new();
502 for chunk in input.chunks(13) {
503 split.update(chunk);
504 }
505 let split_sum = split.sum();
506 assert_eq!(whole_sum.as_ref(), split_sum.as_ref(), "mismatch at len {}", len);
507 }
508 }
509
510 #[test]
511 fn blake2b_truncated_outputs() {
512 let mut h = Blake2b::new_keyed(&[], 32);
513 h.update(b"abc");
514 assert_eq!(h.sum().len(), 32);
515
516 let mut h = Blake2b::new_keyed(&[], 16);
517 h.update(b"abc");
518 assert_eq!(h.sum().len(), 16);
519 }
520
521 #[test]
522 fn blake2b_keyed_empty() {
523 let mut h = Blake2b::new_keyed(&[], 64);
524 h.update(b"");
525 assert_eq!(h.sum().len(), 64);
526 }
527
528 #[test]
529 fn blake2b_generated_vectors() {
530 use super::Blake2b;
531 use crate::Hasher;
532
533 fn decode_hex(s: &str) -> Vec<u8> {
534 (0..s.len())
535 .step_by(2)
536 .map(|i| u8::from_str_radix(&s[i..i + 2], 16).unwrap())
537 .collect()
538 }
539
540 let test_cases: &[(&str, &str)] = &[
541 (
542 "75d1b86d954d6e547e2f68d4f0931383b4e164a1fe92efa8e359d7184c7da014b7f5a50963fba234",
543 "c8cd7910a752ad2c80e9f90c6943a1f6bdd97592f35779c4f2058250ab2228512a983a485616b017aaf555cf9e871ddf70cdebe12861eec48739a668cd8c10a0",
544 ),
545 (
546 "8d32841d71c6e01ab66c644de8a530cb1fc72575912ae0fec3697e8f122bff216f652489211ad797e08a779490",
547 "181bce7c81bc1025f7e4dcebb52bc985f896678f4c6ad9225cb993b2d26a8f5cc96f40bb5e4b7ede0ff7a1bd435c20eeaca11c88bd6395ea040df667dbe7ee1a",
548 ),
549 (
550 "1eaf12db395d2aa5b2a8677c52b7877289",
551 "a181cf05d8f3b5cf2750059d50233075c19e03e897cbb172a1d48df2ad90fefb45def3c0a395957e1810a68563857b8390f61641fd2035238f4bfb28740fbd2b",
552 ),
553 (
554 "5c42992ab639f96bafdf2414fbaa5dbc18af889395822716fede82740b597734868401259fe68f",
555 "61d7f06aebfd941dc08209e9b04fc730fa133804c1875e07b76d9aa6d9f413e786bfef5143c3dd6e4fa61e3eda7c0d7a0289a323f39399ad6fceeea4ee5abd1c",
556 ),
557 (
558 "9e6f97587492593c49665073ea4aab585f4cb7891939619d57192937a9bb83ecdc9f1ecee7bf03baeae2d4fa2bd2d9489d0951ca8d0c110a",
559 "482c83590278d22efdb701ca979fbcf49448a3a9336953a5642d97822036e2809357370f24937d0845c66c0734dd30f0c7325c83bc1960f851f658a1c962e683",
560 ),
561 (
562 "74f7d172b60c9bec31092cbe9ae7b8af9f67b72fdeb89f79eaf893f0464db2fa6121a9371dbf",
563 "1094e474a1ab3f26bcd7e82157048741f76e9f06df0fbcad38bd402952864cfdee9b707f57440677cd8864c3f60e1d96797c93e50ae36049a5a599a81d83ed63",
564 ),
565 (
566 "bf65cad1832ad13160c4537d4152b967",
567 "9f089258c27a2cd1ebba64c55311d953a97b15161bc11c42c29f79f28dcd8f686be78c54bb55f34a249d09638d5e620d0e358cc69b0d4497e1f79f80f2132e36",
568 ),
569 (
570 "e9a3b037cd9780fed921d1c4f709984b5f3f6f2fc56fbfc0a5f36e72e6a99f2153f0d0",
571 "dfa5b50afc602b7182bedfa555983667d2fcd4a8ae29a4163dfabb4b96da2b0bd1ff1ff420ba9f4bb5b8fc577691c9514ca23bbbf19c18c30495150f3a6c2d63",
572 ),
573 (
574 "a509fc91c1d0735757f7f2c2993244f59c64f7177aabd2944232bd6f46",
575 "0a3c0c6b4032098769584a199f1a64b2e8d54336a06759cc055a8a6cc9f97f1cbd11c156ab65d8753f07132561a55bef6584bfe6258e9b42ec9915040ec88306",
576 ),
577 (
578 "3cf1d5eb3e527365975742ace715767751e5be16",
579 "fd93695c896fc22aa2c5972dbce313db9af6eac05971b40bc52d98216dbb9dbedf6b23b35a6f5e2a9bbd91c14025aa4db9408b501d1e448403dfb481b4593fd7",
580 ),
581 (
582 "1c8f98b06501fb393114a71c885bcc7bb6da7983b077dd67219372f82699948e782383a6b5daa6a725a7",
583 "c6ac5977e9a058fb5658dd920056b7d6eb964d3b5c4ab7b25064632ca7bdd43dfdbdbda03a21c62044fe438f8086d10f59b7da492ff1050df8fd005183c67868",
584 ),
585 (
586 "4d9c20cd5fd7660276",
587 "a857b0889584c69c5956dab0a4311fdd5615d1c7a7f0fe572de85b5a608a31655040a70f0a7b53373c964609efd85b90f9554ad407d2d2655fff0c5773a3ff1e",
588 ),
589 (
590 "49213d42338de9aed5ad353056250f9b898fba37a307aa8c671f7e1c3da982ea464381fa07a433472d13c0677ada22e0ee6cee802fc72795c79bf38f",
591 "a09f4a8f685cfa07e5b84f3aa0a20d5ba69fa95eb1e1a6e0a3e72bfb9587ba4666af94161890813618c02f113a72a697b5f85d4d1aa686d7f2f22851da881644",
592 ),
593 (
594 "8df16b491def64b3",
595 "997080b8b5934828881576fe752ff34985ebf84fd69cef901a1723a18dd906475de70097d526f185dccb9366c6bf61ceabd54587859e02eac69050526edcb76d",
596 ),
597 (
598 "e1382390b68734a4764748b5cc15546b782c0e3207d9e7d949f83c35b4ea4d043c876251cd33ec4f66bd",
599 "5fccca2d44ecf8ceb3cec4478c561033200e636f8d77d8f8964e5b1df85ee807786d51cf8b14087c4e579c1808c4cb518eafe7b93ea97dd89ff671d0493ecea5",
600 ),
601 (
602 "126056a2e85457a48287dae09a95a12aea50df629f7a4769082828b96d754d03e1588450",
603 "1fb4c44e92349bedcef183972afb26a1d1f762c168f91252c3638f04597fb70c3568863653bfd0783993716bf8b67fb993ea9df2832107987b2545f9a95d5dec",
604 ),
605 (
606 "6da257f867133cb527729db5f892ca62913f09ec66a06c635aad1dbcee4f9afcf4f297d6d490",
607 "e01f58af794561d03a0a40888a52edc4a4bd19b173534dd10938d889d2b1640c27ebf5dd49eedcbdcfcc5db90d1f5ecc1851257a9664cf58a3dce6a44ca8a00f",
608 ),
609 (
610 "4a1ba94df9a30757837b",
611 "9cd37e3b8a5b4a70b60d38f2f4509c39756a8dc62d0d5d607277a4554167e25a81542aefdd928ec51daae6680688f40d9ae26f2e6a40b8182a4754c4e673ac61",
612 ),
613 (
614 "b1049fec844affa3a11fab8777549a9f5cebe032569b15aab2a3cb0ea8890ca938dc6166878347f0ae3ef1ba43a119dec454a2ccfefe2c56143d1b07bb1a48",
615 "4a319f0f5afcf99de48cd5c609890652eeb554e00f14cbe70d5105370749ca9f8bc742bc4b0541736d40ef8bb1bd7ba69e80bd7a45cb17c223d71dcb44676cc8",
616 ),
617 (
618 "3be11af9dc526b17f53aa3415cd12daaaa8f61a14c9dcde0c876c6a9c2188b52e43edabb2e527a810e466afa518465f404007580ab876a1258",
619 "88622efe158afabbd08b2cd1cd80213a8424c43b58621c29e186aa8774f417d4a069947b0db471926269239bc20cd8df151864ac6954cab691dcc27c61055ce9",
620 ),
621 (
622 "9ffcd27e73bbd4481bd544b94160c1246f09332919e144f080ede113",
623 "7713264790a6139b93bbf34e1d75d8da3bf237b6a6abf3efdb267e93442fac666c746e841a84973a7cb8f115e63825bae2ce8b3bd87b03cff21eb7d0bf8547a5",
624 ),
625 (
626 "05ce499b7a20ebb409a999959ba9be8c069cdf782b420ba9f093629034f69a6b3fc6f5d04f9d8e32495f97",
627 "1d4c3d0af0ba8acf6a6667fa5e29f96bb97aecf793622eb00166ffbeb51f2c8c82f8e9f25fe5f40985af70aa5065e4f085e71abda840e69b2c937446a0b64e05",
628 ),
629 (
630 "b9ebd01f412cf3a04fb2150c41f9476d265089a55f5b389980181aa47a15af5c16fac0af677648",
631 "2d7d1f22328279a8910662082fe72ae64c8d5b0369f0222a7b0378d546702561712d85c1bb75424dea67bbb3427fadec28cea6906a0ccb051d01f729258ccd85",
632 ),
633 (
634 "5d012fc195aa08cfc543e7460f2dae58512d",
635 "4d34526816f777b0cd390942f82c44c64e25b0c872e0ac21a3f2a2ca77f33e0913c84f0e1d1a04f8ff2718f2bbc95b6721f9b19e0709ff4930e6e25a18ef18a2",
636 ),
637 (
638 "e4ba8ee19153e08c2b5ac07e1ece",
639 "3833021e1b51becbc74c1977585c4ec532eaa17b9f41f32b169b273f73ed0c4965847697bfa1d730072a4e43c507daa2c58ecb33f3f99affb15cc914525cafbc",
640 ),
641 (
642 "c0d9f06b6b6becc5608877252a16a54838a88e448d4acde6538acdcb1732cba2e219996431e923b9819756a78ced4c",
643 "1d45548e8271263576a5edecd51ffe1cdd323222b8f984e3e70ae0b460d11a8418c4a35f47e639e882d0d18b36623dbeb64c009ef1d2dc36c478e1d8f58f741b",
644 ),
645 (
646 "db63473d836398f84e286c2688659c9c1a6e2083ee5d820a7d4188d1f90d8befed7e9e48d06aff39d8089577e57abddeeee9daa4",
647 "5a7d076f7022e72fcf622ab5b54c3b1ecd29fe9f57d15b7803e957dd8cd268c1c42fc772f4b98f867253af04fe56760ead5b195c35ba5a4c148418bbefeab7a7",
648 ),
649 (
650 "5f0bc2",
651 "9dc83166327090b23993c2021d538be15ebd15c4c75cecb3c19e684fb482296b158744ecf9246e86ff68022f558fb96e79be87b84ba0cefc0524910f7c53e567",
652 ),
653 (
654 "fca579bdecd6c70eb2a6d7000196112bb04184d951abb8c5699852ba86b5a976d81f31d5f0dcb2791fa2c8efee720f326299275bfee21e533430",
655 "3e5a9a62fedee7d69a38a01f6055738db84fd1c093665e44541618237a9b3c65c6a7b878bba599e40f56026a42ce2c61cb79ca6dbe5f215d8f4f68ddae385c7c",
656 ),
657 (
658 "aad682cf2ac2d77fbcfc7335e4e429f1fb61a8e76852afb077",
659 "50eb0b33856f0ecd6c4b8a3359837cc8784b7f3fd08a658e5a4d6eb4752bd33dc708007263f1a651ecd251186a92a0a869ab8e47e0ab844562fab0119194b630",
660 ),
661 (
662 "3aba2b9335068d1f126885fd9724545c56991243912c6d5088754d7808777797ed3d06dd35416081ff2f0e",
663 "4a54cad243ffbd9b2b929ace7cc05bdaeb65fc934ab1e15a5728d45e1c56bcbfbd8cb1e405da81b9ed889aff88e1b8fb03ac65998459260bb32144b35cdb7352",
664 ),
665 (
666 "dd789a6bcbef0d9eaed0b4182d79b6c575e35070ca5a0ba78473ad0a04d1c9c07e746314c5384217",
667 "de094008f5f68f440eb9c40f2559f2d5415ecd6c06e9d02448addbb998f48cbecebdbbf4070af19bf1c36fcf589cfba0f226bb168e9bb1c8fb4329d85c11fe08",
668 ),
669 (
670 "86d65df15714b7a5725df7eb499b5ce76cc820a2173334687ac9de59e4e51a703292af0eb7d55e2ad3b033fe4c519e5456f49344dc64ea549d6813",
671 "536a6f9e777763fbaece71a84168c418907fc4f16b6d385f3e4f04a463ee20bee589215f8de5de66af04c8771c72e67724db9648bce2f4611f1898ed73a18dd8",
672 ),
673 (
674 "1aedf8ac3922dd10264cf68264ab9f0844",
675 "56b9fc245fc5dd1eb0860d7227c5fbe9ea5c2d9c76d5b40e030bd257c88b364e93fe9b060aebcce8ec044bad02b73fe003ac9b657a69b7d8f5a553bd3cd336af",
676 ),
677 (
678 "872c6e341c148cf3254f98a6a7578d904443a969",
679 "ee327ca8b3033bb1f162d0b0763aa48fa6cc41a5b826c78a27e8cc3a9748d6cc5c6e0b394fc502fb7895b40a6b45af9de742efee6163e59432696e5d803020f8",
680 ),
681 (
682 "5504",
683 "3c9b63144b9a3a336a23f2318dc835e899a2bb19929d80294461fe3af79d54ef496dcb96c20a437708f7d3295cbf24daccd4c1b496ac95f5594f8fc6f322b5ff",
684 ),
685 (
686 "b4e6b94f5d8c6b21e5b4",
687 "5499dd884c78179ea2bbb870f1aebf96dd540f900e715b1cfba54855e684f40ce6a161014282cd90c4822b3cfe2d53cd5f949544ba90232496a97516f66d24ca",
688 ),
689 (
690 "7120925d3c81dbddee5245600056",
691 "eab1ee71a47b5da70ab90ec22057d0fe27b71f43d149f20a0f32c3fc00855fed8cc4176b9012f6b89b0d7e6248ed21957f5364061e51a64debe82222785fa607",
692 ),
693 (
694 "5518d3bac7c4",
695 "ab853629b40b52f133840eb8d15cd151d6861cfa3397136d6809c19278b5b190be4c6080cd29dbacaaf9cad3577b587e94e6d16adbd1a76fd810bd7b22c47de1",
696 ),
697 (
698 "c30fd57bf53e76232cd751d8528354363a8fcb96fd8ef301849aa67f759dca9f2e6b74d7d828f803531a496163130e",
699 "2850c18b4d845fbc8aea90bd206132314ab323937c61a0610bd326584e2ae96ca3476e162e758b84c19ba35815d0fb5067860323bde169c8a3ecdc7ea75e5c5d",
700 ),
701 (
702 "e85ea1f54202462061e4758651d6",
703 "f34414e90afb4a7fbe25beb6e811eddc007b3b060708effaab5b6ed4d226d167af7d6b0ca458fda1d9cd05d373d1bdceb36205e6ff75fa017e911ae23f7a2a1e",
704 ),
705 (
706 "87c89c893a7566bdde2d8b",
707 "2b985f342c75a3b47fbfff676b8c30c1de5cbf7ef851821f978ceca4d769945d20034b7a1553bf9a2d911e437e2ff478381536329b22826a70e7ad1ede73d8d7",
708 ),
709 (
710 "a64416172a92e1a00ac3be50320e38bb1a4b68220f97542f2747e17846b2474311dd9dc79e2d16c4",
711 "9776de8c9a3ccceef3cc7432c810e5b04411badebe4e3f6b2e0bd45f8b82cde46872d100df09edcadccc2af88026be2334fff43fe36cd3f4308d9232dfae3df5",
712 ),
713 (
714 "91698d94124b40ac0e96778b80d01a62c586e09c5eecdfd3f6c82d9ae00918ae15b4",
715 "950e3a453a2e3b782a88de918c64310e9cc457038650d7c1975d2289848106fe233672c1275da6ed200a7a96d24efba88d7fe6c89277de8e02d91040b279b74a",
716 ),
717 (
718 "1c335e0be7bd220117c39c688c5992",
719 "bb8ca6c69e571d364a2c34261df69457ea20f67c6905fca5bb98e4a64ac0927d539556ccc3b635542f2b1e866796697ac445930d42fa900b07d54e5bb9686db6",
720 ),
721 (
722 "4010c441abfab690368da1b6cea229c7abee96c8a8778aa2be2bb8880105b3e64df17f45a2cadfdc2ac3f470edba9a9d7a2d05282964",
723 "7ffa0634d78e4f02abbbbbb1b0094e21de4c1f5fe5d0a627d99d9364d2890e0dbc521da2161414be0f12222c4a43c68a318bd8ec3f8d85bd2ba7c0939c7f8674",
724 ),
725 (
726 "2b9ab227b3e5bb8c",
727 "a422694b9c51fc4b5728ca2f8c2495d28381887c206b91c38e843b4f94d0a2c53851a6bb2ed9324181d3f75322b4cf5bc92e216405f94a0bb1c0930f5436a1f3",
728 ),
729 (
730 "711dc80ab32ca18d619c7ef8d97df0dd4b6fa04d19e34dce0adaa241a2e4d4de353ef572d4d7ab049d",
731 "a055c7278bcce058eecc3e5f66283a5ba8defe12ec3f9f76ab8745c295a5436e0beb07f245fcffdf67638f103db592672e7799fcffeba1c50a1995bdb6fe98ae",
732 ),
733 (
734 "2787f39a51e3e3e3192be17e04e6e55e4f7f367bfab3a66a3db0ea6210126b31",
735 "43ad893b403e7f1f89bdc61f68e9fd8de434a31c2283c76c841a97773cfc79b9f4f091649bcf81e26d35b68d8b11ef50505a344d6c30bf756725f2a31576afb7",
736 ),
737 (
738 "2ec5e8c625902c5a7a0ad163d15160620fa3f3b027ec65a55c",
739 "4aa26aa207c913d20f676b04fe440d895099090df298440b1e47051ca896d4c7df584195cff9b519ab9d25daa1d0e433df8be6543eed9911e69dd5b5c6becfcd",
740 ),
741 (
742 "825b07ceb8a8fa980dc047b792c48bec13a0f99d1cc345a810a847e92cc6a903ac1267f5ffab61aebdd35bd910beddf4df",
743 "b8396530b84edd5155e3c88c1bb726f0d925cea22048c083c0f193b96dcc24034c38b02bf92297e9356a89ffe462c7ee8f95d13212134413548cefb9be2bf654",
744 ),
745 (
746 "616326d8390443e3fd02a1adcf6402",
747 "1cc3e6909a9430b4d74b1a94fcfe2e87c4a837d531668aac30ef9c1342cf2b2e75387f05897072e928b17ef2f306c4f111f23ffe6585a3eb1741d5498682036f",
748 ),
749 (
750 "a79bb0f77f0dd7227795663794631ebf6cca5bc4ac49be10e936cb96c877d46908c6c4bed9f03d",
751 "4e86a872c306cbc61be800e638b5a927d215059b02e6885428ee2aa683663e0b31deb623fe509cd95d465f0437097e0fc4d03523bad2b77ee4286c4639f9b52a",
752 ),
753 (
754 "498984f11328350a11cd682595c205d467df4c22627a7b35ba3efa81be40bad3a0fb642f79cd991ed5ea2ffc",
755 "9c38e4fa53f7f508fba1ce7b1ec449d6d4e4d6cf38e786fc0eafd8909d087534ebeaf4869b999b64b7f3af17fbc5f90c768a7fedac004ec70ee7a5effdea224b",
756 ),
757 (
758 "b898e430837bb8de4ef2",
759 "d90af307fb1f1290b7d9d6492919617743bbfe3a173b521cf7758d265de4d81e71bd6c9a411b0719c0ea31e60ceca469d71760cac63bd545c331ffea7b2f1799",
760 ),
761 (
762 "2a7fd6dcb59b17d88817016268",
763 "89646930250c0b261dc3efae7bc825098e7bdb57b08cf1f672101c103620df49a8e4438588edc978d2c4c92ae02fc0861c5df436218e83a728435095431a425e",
764 ),
765 (
766 "8817c66ef6590d0bcfd7e3",
767 "fcef24aaaeeda05169fe111ce2bfbd49e0625e9fd9c1f2daf579bab0dc48fdab1650825c6f42c08d275faa94b9e54b5f91572327cad37f43fdfec65fa573872b",
768 ),
769 (
770 "5f422542d61b436e2fc1d623f1803c497aab74f8ffbe70e416968bcd1892f310470b1eb03960e74705026ed1308f59e9bbd587f6a9c2ae53b9",
771 "2d4622d25645ac7c58d9bd25734812bcc583be9b717905d970fa597a19cca93f6712de1cd35d08388ccd8824c3e8b4b396b6c0087a1d4f903728203b947c456d",
772 ),
773 (
774 "bfab33170cc73f49aa99e5d515b91bedd6db23901911027d58d7835eb9df5ec7e51d779fbade0edccf7a60ac",
775 "d885a9c8c44c5d94278ebc7e0c4a4024fd8a151df8facf6766b6213e42f39449c787f0fecae125946e550bce0d237f607c0122431cf6920821bfc529331020a4",
776 ),
777 (
778 "c2bce8d8a3b767e22c82ea00b219e0c94f06dec113f13a0305614adceacb77238add569b18e0dfad7d96d5",
779 "5f49eb903e77f9e5df64f807ed9b92875d77415baea974af31b2c795b54a9dfdc87cad463781bfb70376b4bf4998d1db52ff58050049adae2dbac8ee52e5013b",
780 ),
781 (
782 "b0f72af3e29cbe0269cca1e7f2a9e499b3bca5bfc47e",
783 "f380b286644e48e7b7f11d345015f65e2e91d0758bd860a4565e1d5fa8838ee19d7ae9be5ce395075377db6621bf37e9d6697475c19cb84c01bd96cd469001a9",
784 ),
785 (
786 "e8211e313eed1c3fa12035f34bf5dfb7c4aac9660fc9858515f5d056930bdc1af468379403b03cc5ddbbe14c",
787 "89d54361ae5a320c0509ae09aca4d30d94f34552ebe57940af3b7d9b4874b3d7b75ad562edcd3f3cd6d4fecfe19b23175b2badbbd440e175f6ebab18a869fa67",
788 ),
789 (
790 "c83a9f2029c131ae9dba46e26241f790322efb40a9706f0f",
791 "50cc981b31eb66ec6655c82847980b734ad52020661914d51cefb5367863089fda1c96c8a8970570be77e11c25d907185bc1fc1b0257f00357ff40f77fa83254",
792 ),
793 (
794 "cd29f126df27c7c87719f9",
795 "217174185e1e9c57a17cbe332ce487b2bbc5eef6005044129694cceea697a2be1b7c84e0e7e214978791b2589e7b43cb0fc36006598a94f7cdfdb7fbe2128e64",
796 ),
797 (
798 "b85ca7baff8534b2352843f218cd25f11c94a56b8ebd93111f68ac056a061a5a93a43e",
799 "553f166ae2ab5fd42e5bf4c1eeca9bc239a7b89c6223cf161ae50e95c39d753da9b465689c65412439fcdaa2f3f44e1f3f5cbbe9eb71eb38e9b697cb20d19d21",
800 ),
801 (
802 "374e626df5a321b55cae1739b3",
803 "311e357b3e938be703e6e82d96c34db16e5b9fb09bbcc831d5a1ae714e7fc38cbd960213091a5208a2c8d948f0c52828da2a270c1165eea5993f8a7404f505a9",
804 ),
805 (
806 "27592526426a433d428188c375ca7db154e0853d316b",
807 "614c17a80462079c6388f8c424baf6c453cd3c767b4134428ab5a53460dcb1ac4ea0452cd1ebeabac7020a442571e1ff245b92de8554a40c341d364611afb6fd",
808 ),
809 (
810 "884176f69e81efeb1cb8e5227b5a5de8bddce352e494b7b13e0dcbd1cb89316795f6549047212be058172dee67b13f37",
811 "1b7976bed6fd7595dccafcebc24c97093ba19fbfb2e66caf3a225cb1b5e88af8f39a47c5ecc686c5d4f4f8149de75291d02c1ec1a91116eff667c728741348a5",
812 ),
813 (
814 "00dd50a0b033e957a60e1848d36ff77d6446fdf87b82d5e0",
815 "31eb072d179e767ec4177a7befa38944793f4fcae3c224dcb18a63906a6d3bd59c62937c7be82910ec45f368d1873bcc6291271b2b59b0cdc25d4fd10de76332",
816 ),
817 (
818 "12b73a7d",
819 "b31268bef14fef5f1d0709c0f20c8ba69929bcb0c6a1cca55b88e3b0085858f08b025f34ef6f5d6d5d1de0123b1fbe1683c263c9aa4d683dc42ec0df3853d4d5",
820 ),
821 (
822 "7724c26ff0ff7397858f57bd28f2f41da597ae88",
823 "d0712f5c4335ad18100c72a6647b98ff99114076c00580c597a6a0e6ae5ffffe7759f9db53f0fd24685b2b2fabfa0b466da40525dc8d94c90b1efb2413a35c62",
824 ),
825 (
826 "f9c5cf1856958ddf36a074f86438b3160788bcb5a1b89f1f24be225de8249f485007e26d",
827 "e0f7b321dba479c4a4b6f1a92018eefdb5941f7613791c09f7c5b5e36fb7303f984c11bd7cdb65581b2e75cb5d77defaea3727bac2b3e8506f79707f18034223",
828 ),
829 (
830 "f1eeba5262f9a9a10d7356e5a1dd987f3bdd521f8100b1e398802d4771",
831 "a05826bee76aa87b36e5a4b56996ba1ad3ed2bc2f400284c79f46dbd5957e486c5fca209547f7c743211f7d766d11f0ff4a73e96de769c6af820804fb0a5b430",
832 ),
833 (
834 "58e6e4e642b510ba9cbabd82bafbb649",
835 "532ba491bba0de91c1e3349096bfb23929bc014c1bdd367b1b8bc93c6880fdbe329e5387b75710f94fd21a3cfdf2f4f3c69575622424dc7b41465c59bdbfc3ab",
836 ),
837 (
838 "6f35a812cb38d19f784eb18929b2ddaaec812e6483f6df824ee69777048ce08beda768340830025b1363b8988233e51838885e29f221f23a70be",
839 "80247f9aa68ec676bc733075b2f4cdf02182ee11cfa62cc2240512fa379666dec3632cfb3d2d16c7e1bd69c2be78124bcc629171c9de4d1b6a6d9c3c697cf74f",
840 ),
841 (
842 "42853f601ee66af8f1c47d926f509f9298407397ff5eedbfd46d",
843 "f829d182f02c43ace55c5a1ce804d5f49f2d242fa7df88f7a2a9a46e605e9157da882d44c3c8f74f6433fffc26b9434934a78194317cb280742cf1b11ce314b2",
844 ),
845 (
846 "34e10ef49da55f40d82aeb28d1aa8135674491a496aca2ffc13043f8f992e597d615cccec3fa91235578d8e63969e90869af38241325957f8504473b64",
847 "71ef0c4e1e9691a6b3ba2190d2c290b19c39dcde532d5a9f912731d70f714d7826d3478194bbe5fd5b5e038d30878002c6c8cd0499a6a8543d0a472fc6f24a04",
848 ),
849 (
850 "bd30b72d876fc7b91093e6d839105b77118f8b8916a79530eba0dc52d6ef",
851 "305f2855c89b62132d80858fe84cddb5952d294f3a6e0dc32665858e90ed1c8b9fc8e252a7f841750717e478756c2b7284ad56f2629cc0834393625e19727292",
852 ),
853 (
854 "d5923e985cc9f0d479f776b7e528b68be6c048a6e160dab70479a037af38eb608e",
855 "43997d3d573955cbe1942ed04696dc09a701e79cea0a03b9df8b75bfd6b7fe855c2643a16fe8b786035fb6f7fc2a041bf4e8f2008f80a2d15c4d0d8b957051c4",
856 ),
857 (
858 "4f60eef64370330590f89e6d44586717a968decdad73095f6324ce628b6e72ae719cf68d680e69",
859 "5cc0933027a09682e8249f349df237341533541ed7c5e7998ac87cc41ca627fa1f37b3067e968e4681c135d734f7493694a1697fd41dfcad9f35d271d3b38969",
860 ),
861 (
862 "564f0301b97a4b9ecfea089832ac207c2b66e55bceb60167dd352060818c3a67b5f94adcef843944caf08aac7eb43db9dcb712d2feba142c384f",
863 "e858809529b53191fc300621f90b8e0d5f72a2ae42cc5c1c415dd71ba1c6c802617d3f607cf3a40b90b557f9b3dfa86ea771256d66699826322b0da4324c1f47",
864 ),
865 (
866 "9493beff8e85651f626ecadda46b4557a758d233dd8dfa006d12ab9a9dc139d60c1335676d4f63da0e",
867 "08efb6b6d3dc5a9d20a5539f8870896db6a6ba5d985c86baf15f7df84490fafd16c87183115bbc86ba3d485d8f36aed7cb25f62767c2f004a6e26866d0022eb4",
868 ),
869 (
870 "1795966627aaa94f6ef970ea1929f0537fe2a2a6d384094d1f459cb34cf50caf38fa9260b8deec1e8f0374ed0737",
871 "6443e7c96d6c36f4359ef2bdfa42577eac85cfa1ffbe398111dc4e6be192d4601bba5129cac9baa0c98806f8b14c08aa0147de370f421c19e9202fca323dac8f",
872 ),
873 (
874 "2657fb4f10620ac41dab384abae38ef937c918be53d5d9ddb62e4f876a9e0d9b7410c4960b8b8b003dc2",
875 "f3dba475a244e3cd59f26351ab0fcfe586114b254aaf3f909c1970017cf322bf4b86ad3d60b7b75027640a01d3ce1ad0a80b2207eb71fc594657defca1cd292f",
876 ),
877 (
878 "d5ee780a2a1ecccab8",
879 "01af0cbb60db40a71146d3f169cc794c89c651be00210ca89efcdb31fa662db68ae77473675b79e063d12d2fd2e2343ab383ce689aa4666ac5473bbe70c32601",
880 ),
881 (
882 "154dfe97f71fc05af5f615b8996044b5fa7bc3373e18ce215dae135fadf4665db40e13658e3ad33206",
883 "ef21ff6c4a92e0abb58fb8900e3b2c705fa5741b1da6a228d9eadb4a0c86341050c7f86003222871a6b2fc226b775f34ec3b81c14d6386216f4981defabad6ef",
884 ),
885 (
886 "3a834ce0a918d42215da664ac12ff74cc4e802e62147b8b272b78a41a1138aa41ef38c8da6adbc5cfd628b5d02fea97e01c1a94c361923434e86",
887 "bf2a9af18d0b444d29b74013f9b46f831d0d824d433306cb1d5e52f79339d2f6878502dd86d552518905bc2777bc880d2e61996925e03132d3e358dddfcf3f54",
888 ),
889 (
890 "5d39ce3ed936f3ab8aac3cd87173821f82d1085e44de859d20a305101e6ca02f5819be376d9540cff80a629fad84a012e77d6a0727148661e78213",
891 "7049a1747eab68fd31c208e00851a8b95d9ce69c667b7c251602477bf6b6dee7117a0269ab38311f46ecfcb3a9affb7a5eff854d3cebd5548501bec3e83ce82e",
892 ),
893 (
894 "c6903781da7eee7aa9594eac0fe034d47ba332baf259ee8269af3d23a8b0389d18ed7773a9338be61bef2b62bc40d81748aa53d5982700aa3da2ab80aa238864",
895 "acedfe4639c080cdb6ff1eb89921cabdc09200e25d34505661f6ab53e1c46ac07d8217337f8d5f1c4ba8248bdce11789b92d1cba4e513dd8f3bc0d01039c65de",
896 ),
897 (
898 "29ee90442e280e",
899 "3fe00f06410f3665869b36d02df37c5a152bb56a8225b3d146af5807d1a788e68d15c2834b861c48edd35ba20f8d51f706383c3f750ba1e3dd6c2f74eb466db0",
900 ),
901 (
902 "8eeba92f2408301165830e23fba4da1c646bbabc6c44f4c26a21b236",
903 "ce30423089904ac719b02581785e1adf41e98dc047c5a9154c71d594b90411b12b98f8e02cf1e4010784efdfa0f5a9475e2af1131566978c6aabe304c3314235",
904 ),
905 (
906 "e381641adc6d6ecc47677a5aa348db6ae6b99dfef80e7e3a6f503fb441f95daf39e5e07b673b4042b3ac8a",
907 "ee4632af10ecb21af8e96f5f2816c644d3e39e246b03e567cf4340e3bc6f130a2d0085b9f930418f019f8d2b4da09293e4f67af49e5f64f0387b0a81bf4e2319",
908 ),
909 (
910 "79b35d641b55fa86b7d6c9",
911 "27c1ba4e7dc5e596641e36d5d88f204e49cfa0f2b6270db921080dcb89419004fb2db683b6b6c604c16e846846ad1fcada78b848bd241845b6bc2008166179ed",
912 ),
913 (
914 "faf7808e6941adac20b1e3226b8bb7d998a8a4ab9d6eb419af77799115e3846f47aaff100fe163195a270627f74ea81a",
915 "2244ed2923165693a53c07444283cfe27b3c6fce69a26266cf0d21767575a482f38bdf0955285f9c0128801494c0d09051bbfe986929e43579c7afbcdefc8a19",
916 ),
917 (
918 "283363a12f3003c254ac9db83936b5efe7b78b3e2f7bf8b558",
919 "d7845d1a58c9282f24fe2d41243e94f9858739defc1b61f84a1f7725f09ff7301e73a768fa8f0f2f954edf124a3a5d25952024c55f44bfd79ef883a158569643",
920 ),
921 (
922 "418a0ceadae884a2e6cbda3aa58022d33e1b798242f476a0b1d5",
923 "9c97fd641262e79a164800b642b48e9bd6cdfe7d1ac486726bfc2eff235f5b3d0cf432762db2d4d67fb09c0d4c1717ac2d25788abada28332032513141292fab",
924 ),
925 (
926 "ce5a077fb2",
927 "93f53380d5c0aef98badbad8bd69764723315f381151cf9956b5e49231547983decd5a5e4addcee8f155d04d39a8d99d4941c03c6b2b6a84b7d1a01412691f0b",
928 ),
929 (
930 "e1ef2287ce85ec518747dd979c62dec89ee7c0dc93ad2c79eb586f7005",
931 "c13d881404403e50aef0ba4238131f4d98fb1a4759c948c0cdbbb91ed1948584b5390d134a5ab90791b979f85959f132fa06e31f27b4d4cb522b335aa45966ea",
932 ),
933 (
934 "85203f82f5b36f904a7def6eb2ae3189d7fd9f7c28b41cc152a18ab711710cde1b7f75179a9cabafed7ae3",
935 "205efad1ef7ddf1e5d9074dae96c83cf213a07648308db6ee1abc1b35a127d936691bd71626a7f11d630bd071805946e081232f0c1ffe015b24daf4d3448857c",
936 ),
937 (
938 "7a3fe61f08ba93f39cb8118f3cbf56a0686ec66235028f6208cc162d5bf8a71bc98a1612c5be39fbac36cacb71a44a37dd8d5bffbf1d57",
939 "68a957da27aedd7288ce78c767aaa00fbf0324ae64c7548781541d278c02b1f2048b8eaf25a8ad49d182596d9cc0b9d583dd71f04c158466d83732bb685d872c",
940 ),
941 (
942 "d065b7466a0c400b952ff6b6895ab8856c7cdcfa5f219247f04fa900d39b795a65d945bb1715d8b9",
943 "64747d7e0aad813d7e00d19c2fd4fb4f5fd763661cdfda06ec687d0ce23cc52190e24798bb464ff7e5912884694e8c29e9a60b85d516bb304db463d6bb5f2983",
944 ),
945 (
946 "45269909e5b85c3a40fae33544f0b5c7e3ce4b869dc2a546744adbc130d4c8e0b2ce",
947 "600adde3b3edc4802ec637d5159ce12fbe5e00f0101c3441bd9850d8df5e6a12ed9e4b093ac0db0ad2de8976d885cfae7d94e2b6fffcdde033d2163f1fad85c4",
948 ),
949 (
950 "8cdcc5f4b9fc826bab381a76",
951 "b218529216eea5a10c6c211cc4314bcbfd146f1db7a54c4f9b05a89ce3d6e488484fc755ea585604180a90304d2a7afa44c10f110a8a97cc8ec8f8d0e6e540cb",
952 ),
953 (
954 "a0057472ef489452d993eccbe458dada846974060cc0426c024400bacfb586336bce15dc05d35ea7",
955 "4cb35a662360b7cd9518b076c109efbf9a9e6343288d8dec021e400a60547c7f1d3b17cbd01bb1eba77fc2b126126f03cbf58f5d8016d01fe6c5c30034551507",
956 ),
957 (
958 "ec2b8247f7ee799c0672f1be80",
959 "06b48d7f0bcfee0b677b243e85742ba67a72d9b22f702fda0e35f82f41f106e6388f58b23dacdf1a83cf269342fdd058a72ad0296fc9682441f4452ae0537147",
960 ),
961 (
962 "91cc2415fea3fcc4cfcf0253f07d87e557ca7e1b4b8dfbb761bea9fce3aecead306bfed04bd1a1ae6e43d20b89ad7d999673a15162866679",
963 "47f5fcc4cf5ef843ef96f8bb3a35f8d48406682927d7c9373d83f671978fdf9547bed5eda9c79e4f0104b470348bfabb5b890e3f1c200daf1396e4d0c0492344",
964 ),
965 (
966 "e2b312dfdc75c884b73129193cef9a7189c636f0bfa4ac4bb15d7d930cd6151612ea4e87333e969ca5cd786833e249c26dbe773d",
967 "6a40a0b73c22b36c9f9d48648697b3f5dadff87a6c55e318f3adbb346df86be12d3208ab04ef708b37997e2104a9cc5747e9c79247c439cd27c8a362c56281c2",
968 ),
969 (
970 "2695c8ef350aadcd74bea6ac49cfe5e596b99a53824a69d7850755809c",
971 "474f1eff696dabf6c89321978de5a9f49d6155b79aed65260b30acfb058640a1059c11b8d56dcfcc99c54e00d3e779cc4df2e9d7afd0a89ca64b7e923fe08ce1",
972 ),
973 (
974 "dc6bd47c5b28e1d03db86527f1acb5fae03357c7216f1365cdef2ef313486ba209b832e6a8650369",
975 "d7797c48b0398072a25fa5094994d162e6f67856e883803015a8501cdb95b28a2dbc0344f83f428f0265be8efbe224bea4e4c7ec7856b431d7e781185bffcd92",
976 ),
977 (
978 "4d",
979 "ae5c7a2ff5cfa36bd46cc861d5d3b8466ef568026b7d4112e87849c05d8f06b16fa0cbdb80fed567fc2753af143c11debe3c29ea6df1876a51eaee481a620f7e",
980 ),
981 (
982 "c1edde4e5ef6a835035f131c890c8b93dab002f551c128e16c7e38657cc118b64a53eee5d4903390424b88259c2fd85ad8add1bb8569e39215151936949964",
983 "425b5e213435a0d208bc7204b57f01107d0da3cc3d7d3267dc9c94c99571adea2997fc189f14aa0ae29038fa38d2d47345fd01a66d0527c5873b78e0d7934f8a",
984 ),
985 (
986 "5903dcddc945c2dc9efd54c72af3433b5ecf1d1c2a35aaa5f301ac8b72f1715d58",
987 "d5c13ee5ca97b0275bb22ab0792b670aede31a7bc994185921cac2c4141f23fa937e9eae1ed6bd39d7c6b43da3b62c48bc450a11c8ead6727a66287eee793c95",
988 ),
989 (
990 "4b97a288c5996ced9287e6ec738db7f7af92a60112bc422fdb713e7a45a53ac64d679fec2d2500bb8b755361343262a2ec09788954",
991 "e7c9d3557065c5c29473fa0afd34f8579b3da860e77a5081899df7d3403ff94b16b57539d90f06a10d5c0f18f18ef94d678ec32a75ed6f5dca9e35b5d1ba79d4",
992 ),
993 (
994 "8f0376c69d89a1a44f0aa61e1d7f2eee10fea17399f02164413c29af98baa054903e72d234c4b3d6619e2495788837ac2b13623b71",
995 "656c7a4eda751771b3252cca4e39a927be45bd187f4e2da25ac8d7eb12494041bc23088be7c91849ff29161a4abf14fe0dec279b27e7ecefca95c9ff74faac0d",
996 ),
997 (
998 "0c0b61d0c3fb443b42256276dd9c570be08fce72e6aa38b7bea0d10bf09f369b288b481c67a06a92d4288a09ee198706d4",
999 "fdbf89d558058ba31ab6c70894d7979844a391bc09467c5b61ce76324eb26e20ef082e75e01e867f170b7c14fa9806f67ae697cec239469653a16c8ab28144e6",
1000 ),
1001 (
1002 "7504d7f51cefdbd4deea82ba4176d084b9ca310912ae78cd166113e6c71ec473ec23dda1f403fe773f3db27978bca90857d640e4",
1003 "5c3d3082fc4fce04f6b8d8ab0edccf30113539fdab708674456926c493efb861e15b953c160c130cb76c2765ac4b74729363bf2ea9d35fafbfd698330ee71cda",
1004 ),
1005 (
1006 "72",
1007 "fafa573a4caaa6d0367f122a3f40d74a61513cfa7bad05259ffe674eb7c10ae38b5e4271287c74b72d88f79019004acf95316d4142294db0b32cb69d1139f376",
1008 ),
1009 (
1010 "3791daaf15df92711b4eba88db31e34d39df0ce7d829209617df4a17598cf516",
1011 "f03f3ae2b65f71052a1ac6c5883625b4463322e0fb414453fb942c18f3fbd7ac8788e49839c044528e5f7fec21ed06b81aa4d0693ab52324a23a3b839d93dca7",
1012 ),
1013 (
1014 "c5a897fc99ece1469a7bbaac17e8914f",
1015 "09802d1a30430174fda68e4591bb73dae3f027da7847537eda6f9e1d630d4ca6bd16eb2388313cdf9932fdd55f6493ebfd1cd56577cea6e6722af1869bd861c7",
1016 ),
1017 (
1018 "b7045fe4ed07da15bca1b20789b8782471cacb58",
1019 "3f7e9c6c5724c47909b3f81131d5098ecb6b72ce4096aa23637c9b72e731c190be0a8a7b4450a4f368daf224c211557146fe10f3f011cd6004c8f6e94fd7e014",
1020 ),
1021 (
1022 "6c9d1060a452a41aadd8656c09d1b0fae368b8940ce54ac9e0cd760bf135058517e841c6cf9631f9fea900f719219994",
1023 "d4887698944e02da9fe4267c36b12310f17f1b5a4666047519d1023545aaeffe20727ddbae5bdf0694ba06d8e7aa24939ddccdc416074d8b7c1fa29935b01cdc",
1024 ),
1025 (
1026 "2d26",
1027 "7ff1db01ec19dd1e2159e81e953126bd1015fbee5560ce094319ceefd2443f96813eaa3be197800ce9471bc3d4212bc0a0c979d49cc9e4daa48c6304f751efcb",
1028 ),
1029 (
1030 "93d520b1d9054cc0083382ea9de793378f0372abeab2f0bf0e7fe02e3a4dee97bf4e10ee4f307b19bfa5a42f12",
1031 "bac20a0757464f189ca3250814676f54129dc3bed05cd300ee66a061524b1ec6003f7d1c3312f1d64e4b6ab3b5dc1c94b9627ff0dd001984110586d3b00279fb",
1032 ),
1033 (
1034 "fa6bc88e25044a1ab91432295dbae342f3aaba302f89340c744026ba4637814a25f9130383595bddb31714bfac3d95bca015d3",
1035 "3aea7bbeb1e93da4a9685f8b7b497246fa3581e1fd14baa878f9688b589a6e70b888252263cf98b13ab04ff0381706dd57ff9caf98b5f1ac7fbebdb44fa860d3",
1036 ),
1037 (
1038 "b81b0ba55b4c692453b22040d0bff6e5be071bf953e2ec6a521effe8",
1039 "0f27feaace4b8493f4ef1cea0dac2a5decea1e1d84d8b18fc7098bdb2adffabc32d31706a1b0e93bb2f510773619854b871dbab358ffa90cf8a065ef6c685294",
1040 ),
1041 (
1042 "3940d74e97f93329629830682351d3597f5bc430354bde726cc19b337c53bf8ac05c77d8",
1043 "8678cfdc7f554874da933de53d662be3b10278342ad69e0caf18c058371b1a6c188b44f540c6c9e3c7880279000177c8f6dadef58b65904a59fd32f5df8992dd",
1044 ),
1045 (
1046 "183212d42dde6cba7729d0101e7aafdb",
1047 "84dad517c6f860e79151f45935d256dd61382ab1a9dfa2fa066bf103cf4009a50deb115f04c9872d54af4ccef935edd401abdedc9fc024c923c47c72f12154af",
1048 ),
1049 (
1050 "7c99c17e",
1051 "fe3a5fcd2ddf763d7be485e408af31c17aac3512435960ec86a117abccbf4ea0248f4d8e513a700443ebc2ff23e09b3f6c61cb8591cc907263a093ee4b0a1b1e",
1052 ),
1053 (
1054 "8ae902bb4a35b46d2c",
1055 "eb864f93a0f3a60d2f08bb0785c063f1f42da37ce8045406faafbe536b97a0d183b7415935d84a5a52b650f93793507f43367f4e3d77e123e67d4d493395a73c",
1056 ),
1057 (
1058 "366f563e5d4e0f5fd2605eb1579d883bea3adfe8f20cc4d5",
1059 "f4618338bde4d2a6544a86bb0af3f6bc4cad103e989d17d8a5b4040d31b2bcff072505f1311f10dbd1d4487da3b99bb13f68a023eb00b40170dbd2cb91167742",
1060 ),
1061 (
1062 "53de42b12a3ca904695070d190ef70199deab755bfd175167cc778fd1729d3d4cba2d4fd8f2d886e1a",
1063 "3e1c8d264d2352a50c972e721090b8adda41a5608b42bb4225f5f11b9aca5e7a688b2ddd95b21904a950841994f86a4e36c74a9ceefcf4631dd0716789578603",
1064 ),
1065 (
1066 "a82188cc544ec3b53cdb8883e912a0c085b43687ad7f4464bf0981c9e7157cc91a0b2560935049fa46ac554810bf59936e8d0e9d4e174930e204",
1067 "d529bac9fe91751b209d3a31f95005baabbe2b9d7368f6e4f9454e46fd55e914266ee8a814db4f72ae843a850a4c05e75f2189c37cfa225457596a56cb344f09",
1068 ),
1069 (
1070 "ef767d90eca7f4962a490bca595817f76270fa22db781f7815ea433eed266e45f6e22bcde021eafb7a49cf47d19a7877547bedf63a118eda7b",
1071 "de7d457d38263752c608d89627b00d6de5acd357011a8bbc500bf96dd5a12d9f374c6462027c70eddaa3e114ca414999c14b572cafd9610535aa6b462dc660c8",
1072 ),
1073 (
1074 "9ffc10f5b5901f65a9a100a6515d7da1c4a176fe5faf25",
1075 "a6cdf39f8532085ea7261c7e24a3721f9c9c252716b62cb612e2da8eecd34d0329e18c1b4ef1c609752f346f72754b160def19b47fedad663bd359f51fd6898b",
1076 ),
1077 (
1078 "710b8daae084fd66ae863eb0a79292d46be86316b6341bf159a32b34dda73ac1dcb76595ad0a07af206ad50d69d742dfdbb67e60",
1079 "d237eda3b4f50e04479d96cfd847300d84437b6552b088d43a1a7dea97c9270a2b12be6f5d61137ccbf962babae8bd9b175ee15bbf9de781114f080747d3040a",
1080 ),
1081 (
1082 "e3fecffa30d378",
1083 "cd3d16f88643b56ee658aeb29a7224be9022c3abb18ea2edc7c6c3b786f454078ea17e9f4c4c0978dfd11f8fadb0cd70dfb042c5d1658a72880044e009145865",
1084 ),
1085 (
1086 "d2b8bf966b1a7d3706",
1087 "fe748740f1cbff9de7ecfa4276ccb741dc2418dc179c987c4cd5a0e05243ce5aedb1a6c426a7462944d8a49f5fc7b1c2f29b9b78704b88c0207cd7c3a20eb412",
1088 ),
1089 (
1090 "f6842e123c816a4191350e15bf4e99ea65b02f19990c783ef82e02d7605de0500e6ab2ecf4",
1091 "2f2189a31f00980ba8ffbadf2a17e0a4251eb588853a59330b0a6a388fb97938fcaee95148fbe159fda43eb78c47260a2fefb37fb60a8f225fcf27628d5c2b4c",
1092 ),
1093 (
1094 "4c6675c2ee1a12f3b4d6a3e496d5c244e3451b4f887e90",
1095 "2fb6046f017ecf6da343047320029854a81793df7a87bf7526f8d36a9b262e20c7e6fb07a8800313f8e65e0411cc7d92f2387442b476842860ff5a238b259109",
1096 ),
1097 (
1098 "ac101bbfb04166a2b1e5808b4b",
1099 "54280fb5b02f18bc9c840d918c2ee37fff4e24e03a79abfc8308c8453fe6e54180a805b11cad035d456e9a49c2d17395ceba3d664689f5ca3114c1ba7414a1dc",
1100 ),
1101 (
1102 "bcf508c48dc93438ba782574ec385130b92ad9833f406d2bb8de8302",
1103 "c0287c9199734845fb259b42f9943f9549190506ffc24237b24fc87cb31bfcbba10002d07e6c80f4c9a0f7d55ade23e4acb41ecaf55645c8510e461b817fe5bc",
1104 ),
1105 (
1106 "",
1107 "786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce",
1108 ),
1109 (
1110 "d1a9a2a131b73ddb9a5f3984",
1111 "42b60ec8a60f673ca23fd28075ce11b9854a476f193083ae166964c4e3429092b0078f7bda066f472191dd39c0f2242d837449cbbbe234ef80be1fd002adaacf",
1112 ),
1113 (
1114 "86824dbb767ca35b87488896ebd0875e3db271c9ca9997705ffa1a435291fbfdd40162dd6c2e07fd117b0d07e170bd5a574a1b4a742d0f",
1115 "08d13923034938ea1173f7d40b39b7a05ba956a334cb530ae60a537bbaa43ce3abe8257de010391531b93d2e3885a8175771a256ae48a6bcb6bc4dc7f38dac05",
1116 ),
1117 (
1118 "bcbe4d67883d1f85cf7cad81c8bb",
1119 "961217b71ff7d94a0713f4f06ec9cf5f064a41bc54f9992268f8544b0c11e4b6d4ce6bf97fc62e97492e8e05f3b7f8e28e51737a060e2bf6d41794f18fc75802",
1120 ),
1121 (
1122 "dbc89751cfb03c4417c0feffe0f53f6fdd4680cd5dae7188645ddf12a39933ac0416b07627a7f2f1",
1123 "4fe17258f2f99e9b87b2d47e84cda915c4c566a2db8874d3dd16450202b4c77dc7e439983e5cd532399f1512fcf358cfe65de36ad45be39c9ce48652e6226177",
1124 ),
1125 (
1126 "cb7fd30ea3a6e7d164e9f68219c5ab94a619839214670e88c57557365c36eb480cc6cf9cb4c6628e35060cd1f207c5759033",
1127 "c435a14c97a13360705581990bbe47fa90834009a1a92fa184a7d7526983893fa9670b8ac4d9cb6b57b094bca57660a6c37b9702fdae0fe5adaf2f0c826e2f68",
1128 ),
1129 (
1130 "",
1131 "786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce",
1132 ),
1133 (
1134 "e14bcf83f7ec85f6638a2ea74387d755f6a73d8ab936f3973579e1fd9a2fde9ade1ee55a98fe1d2c254b792583136a76c07a3a4e6b43c1eea1cf1f92d5c0",
1135 "5785e8b442f4cb98057bb5535b5335ac5b62e7a097996e2a66974f2eaedc3a8897da7424c395d7137ae740a29b8b0252471994ba6fafd6ab32c2569676837440",
1136 ),
1137 (
1138 "6c66",
1139 "33cdf6468faf43414722dc39d40965fbf871ae62749ae3ba8360606bf81efb62dfd185cb115fef2ba55e4b774bd1b57dee7459dde57035e76d940d3857b3b090",
1140 ),
1141 (
1142 "72625b1b69384962add9d6afe3fddc6824ad8f706a64bf02c6e602a38a58be1d9021c75000a871e4f10383eb5eaf9d2751fc543b3f5dcf5103ad67f6",
1143 "0c6806aadaad0593a628ef4632838ecf8c9543a27003710b634cbe8f392b27c6acd52b8ec086ce7c7e0d42338bf7ec841048e77461efd6c5ee30917bafd338a9",
1144 ),
1145 (
1146 "3466c6b8014c54e3cc3a33ddde635eb5b667f03b53597e80d5e028ce598609cf48c771",
1147 "69cafd16bfaae5b46020970268129b37f3a28acda3c30272a17ea1d5a8bf77861e1a13f5574db155700fc1144a6bd60e0e352c82c0e41577f3c5f9ac051c4f9a",
1148 ),
1149 (
1150 "2e67540d47370dec3d8851b3154f494837188c70de87eeb34dc04ce63e36b674b1c234a717f50d227722d154753dcdac2fcf2bcad44ef18e099a831e",
1151 "ac578aa9c9d088a767c3319cedaf7fa33490f8b33653b5fd7a8d6637ebe12c524268ba26d09b4719fc17c2bb4007912148693f8dee0de0423316cde3d94338d2",
1152 ),
1153 (
1154 "2ac01b2c0487597c23c530b39ab210170b18c401fbdcaef14bf6d3d384054ee6e08aedc3cdc3aa6f41df45b2bafda4de6ce56e29c9599a948b64a59702",
1155 "fc45b2571df27392907e1a1fdabbbc1511b03cf8aac4f6976e0837cea36f25816277e0bcc17f33eabe8d110ff48ebc943ff185c33908390a1c204c48a007bfba",
1156 ),
1157 (
1158 "8291e84c4d405a10f51d",
1159 "ffc1bea447c75f994dc9a3dc1d1c7fe4bf7cd078c48c39714712a61391ef6758f8b9d39169a75ad21c4b248363efbc936d9c7f307ed9b6d54d646d4ab089bd22",
1160 ),
1161 (
1162 "532523b95160827b7107b9cbcd4403f2c01e3657b7d9f3bcddb1d931e6db6458c85e1ac6dd082df00f27245e1bdb54ccb7664812c5",
1163 "d6dc8a9a94fd182f38722e4598358efe3da5fa995462742e045cc4227c192d17fa836ec19537c4a19a2a9c93e82a5d3c5e16ab7e1829acf9b8b630e543b8e1de",
1164 ),
1165 (
1166 "1adeda1ea58938399016d56067219bbeabf104b9d2",
1167 "b2cc3d3d87b35dffa72553a44f39a22e4374fbdc8baed39690f718f69bd93ec94df22f03f62fab1d033a890f7b268319aa2af3ab85b6d21287b54e6c27a6dea8",
1168 ),
1169 (
1170 "80eb171256ab9e54bafe968a829c358c632db9e6597f2102c617f4481cf632b236bd43909509919ea64cfb8cbdb3d7c0",
1171 "5ea39eff045dda34732921a443ac91f15845b614b562c839293395ec4db0c3c8975fe8f4a01579652e905113d7786c169be5560315fc23d7000fbc5b67a26650",
1172 ),
1173 (
1174 "276ee98bd73c48df887df85dfc1e5e20a7d1ac43add51f5105dbcf82cd873caa1fdd52ed79841aa62715cd8a9d4a8e04a1567c643067",
1175 "57b2125c21973543aa7c5915a8da3e90d117e71e0c24da10b6c1f2d195d8f4e4f41a5ffec07a2a671325158d58f112ea1d07248fa03c3c506c20d2ed9047d01d",
1176 ),
1177 (
1178 "bab5f8962c0aa3753ef0014695b00d72698d109dc2427367d210fc2293b2d393d91550f429f6179f5e02287dd967c0e6c0e047cae1",
1179 "4824fe1f035cb34f437380289effe4f0811f0f2d9ad89f70e5b49a3a7334242faff1df7e876751a0177655edd6bad26cde40333c796ca5fb0f18c5045ebd24e9",
1180 ),
1181 (
1182 "dabbb397e3fafc83903115ec3f0d5f",
1183 "c743cbfd570222a609a81a4815341119728df8272198741a4d88a3b9aaffc38d7f4018627e61b16441fe16974eb84604f5941ed4f81ec4c18adb5c8fa9fbde58",
1184 ),
1185 (
1186 "1842a64fbf1e3188fcb20c2b5bdbe7f41becdaea1d78b92fb5b7af3e2b",
1187 "7c5d21e951937ab2f92d995ef448a74dad49396a39fdb94def86744bfa7ae6ba2351bdd39c3796c664a1b8fc561be4004470feb4acea3ce8f2d671fc5a3983c6",
1188 ),
1189 (
1190 "fd1c69f5389bc31765a158c90e6d0f9ea19048256c14d50aae74f6696b05b72a0652d75aa2cfbcfa67659cfcdd18f9d3ffc997",
1191 "ef5c5fa591f0b158c9f62668957c0c1d15511ac676271df1be0d8e2f02f1d07f352c62e117f71c01f24f6d6815e627226eef08d75c49168fb7f8c22e3de73b75",
1192 ),
1193 (
1194 "a7d3add30b75c9992298df66da5e4cc0b836ee4374eb95790fc82829f7",
1195 "9b7c460faedf303c5a628730f9e85ba6e3a7346e3a4d5d0912bea27c7eae3f883d15a5f9a44ee73dbf67e92d1a8e33a9363d19d790637d6a74b12c0eaa1c04c2",
1196 ),
1197 (
1198 "c1a191ed422297293a49c9",
1199 "4472619cb7886c792e6db18fbd993d7b43cb7ac3e4dba7807a9025c40cf0f88678a6f82c97691a76e59cc69a1422064dbfd9999a431e57c4c5bdeda3f26c9d5a",
1200 ),
1201 (
1202 "5a03a80edd3fdd3c8d4243477ca4b30b4e9e764b0b3c01a1",
1203 "c549bc5c9a3ddf30399d5a543437bede92c3648a40b0a06fd6ef33ccb107cf5349e6009ac5bbda3b15f32110c1f14d3df06849ea74d736fed45703b97b2bf9a1",
1204 ),
1205 (
1206 "70ef80ab4fa30056d4031b7273264b7ea40359c606160d774717e8755d88",
1207 "8ee0cf58a84d460b19b5b946cf14f8256cc9b4dafd3721a3db020aab8593a394533bea1a6c38324b4303d4f0e906a55aafecba02cffd3c17937c006da18e60cc",
1208 ),
1209 (
1210 "30aaf53dbb17716f06eab025173fcb345e2ad36ed094a192e77af668f493e49b732519661a4acf0f38775878ebb53d07aa1662f05cfd91073a379f1e335171",
1211 "52f4522d307ddea78a1ae9ae27b2c26506149397aabd14d97b6ce47797d44e5c1076516bbe45e24f70c1397b957fe0725d96e2108e4b22ddd3aeeebbdd3adbbc",
1212 ),
1213 (
1214 "efcae94e48cfca76a02996f0f0df3076bfb050fbb209dd8b5ccbee",
1215 "75b71dbfa92043e7a5345280dc987d1d1a445375342db1e272929f5bc1607343c22b06ecf61a639df6a53de200051a1f541444783ee466e93736a187e0f6d5a5",
1216 ),
1217 (
1218 "f82f126e77e9b94514df1d74c9034cdb944f34623566eb6b0e3b5e36190c45cc2b",
1219 "a424dd7737b854b78b4e0efca1ac4b689f60e3a43a3f900d491f747133a788c3256c53cd479162e93965f5443a4a9378f4a0dee3d5c88fc8062d7995e1e1308b",
1220 ),
1221 (
1222 "0430efff4a506010f775730a2dd48a8e2690a6a1ecbcd20edc5ecdd48ce7d9c82a1897",
1223 "a8642c1b5de32da45f73585cfdc236c60b19d435b6debc4eebe3a149d7e3d87915a607872a7c959a6384a3d441edb45af58284bb97496572ddd54e3ddda2a961",
1224 ),
1225 (
1226 "1009af15862d47f202edcc4bc6a43eb07297fc74f3003133bd3869ad9f7a30cb12e2c48e041dd2954e73a28698cf015d6bce",
1227 "ccd0fd9920e90bdca57d81350fd03de1014f8d430f5d49f44ca161e38c445aadabc42961ba440a057e01985d325f887b092a7f84a2fed18cafd9446a50869afa",
1228 ),
1229 (
1230 "9015346faeae9ce56ceeb0b62f10523eb1",
1231 "54518705ca3c08eb8af54db15e76ffe21030c87876b6424bb4411cf8ee95900bab98ed1c0d18983827c39f7ad05254e81364a0d2aeb2406419259c87b5216ceb",
1232 ),
1233 (
1234 "3ea5d44088e86944b114193f90039548297c368e",
1235 "2ad439c41e6eaba88b903cadd8a8030898c67bad08fc48b261ca82f636d15a548f93af1c3d0faff85ffc56788f3cc13dbd2bb1d47a23e8520c7c49e4227d8c78",
1236 ),
1237 (
1238 "6be14e32d8932501a36ae8829ade841a2e6dc326",
1239 "54fee21b421f122640260fa730d011d6782091bf381610a433d889b22507a87d2a64e8476bc828afc6223902a944d7a309bce8de8991ae710c51f312dbb24b8b",
1240 ),
1241 (
1242 "cb7a59e2a978c5d7fb356a0089b28ad26afcb95cabd2a03cdf55f5d12bf7d69fa1f1e137e3783667310ea44df9fe",
1243 "72489e1e38bbd319162ddeb6a9b9dc8d90151e9379b9f59c21cec080d9a29f852c02a611bfdbdddbc363d314c85df136f205b8ae46a1ae207e4585c704bb92ec",
1244 ),
1245 (
1246 "",
1247 "786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce",
1248 ),
1249 (
1250 "59393bddbeb958ded5f1beb967453c",
1251 "7efacaab682eb9473f5702c3f562a92c96ed44225886c14375fd4a3e4ffd46903d4c769ad937b4fa9d95644e60e557f2307db63e3a80cde3676d5bb12e9ef8a2",
1252 ),
1253 (
1254 "03574b",
1255 "93b1c48db2559a24d55e2ebda864c4f74e7f814d27bcf144668e46071393a9853148921c52c35c58e91d73a6434e214349e40c4bbcf7f1f50da49961eff770ca",
1256 ),
1257 (
1258 "b017b23305c5ec04c29f9f3d39fbce93b4d15f",
1259 "aa3f840950c924c9aa070cc0cb6da7f6a30b93ee5c9a08d66fdbeb67808264be47d8a6df88bb5dee80e1cca37a2ec15ee1581d525314bedffad1510b547c5ed0",
1260 ),
1261 (
1262 "e02f8a",
1263 "ad7204c5d5d58fb6b2781ce590bcb4a23551d35a403bc2a94183b8f3ef08d377e3238e11b6aa4b54b4b9ea64084f8829e2df5cf50860dfd929845c72480ad0ba",
1264 ),
1265 (
1266 "fe8c717ecacaa53773f373e39c3e89453a05c070e678dd514056d2212e3d7610",
1267 "046603247879516bff94b4b546e23565fa22521288cd166b82e3670544d21653b72cd569ad5492ff363b6dc0242d330423456218b1eef05bb7681f489ef2d467",
1268 ),
1269 (
1270 "fb711e94e15881594ff12ffb9accd25461d21628be2b097570827b8fca81d2",
1271 "bd54040ffe2323eef566081685aad7a0ec2b22de2fb68c7d615411df2d6136c33a32902c7478ea8887cebda82559ab04c0a8d7d44d804cee764228a7d4523459",
1272 ),
1273 (
1274 "158d5d6461c7fce9766fa2ebcf1674876648a147b4bfbc3807ebb8f28bef",
1275 "f892359ce5983171b40ee3264a24520d042c71adc3f352b686bd1ecba99a93a89d59e16fab50be0adcf176b90bead4129a2c1e23f844e78ad46106c6b8ee8329",
1276 ),
1277 (
1278 "6b8ac5c436c71544d954202e6184497880751ed0d52518d6dfcf6964cf4316266faa92664b5a4ef1240b",
1279 "c9910fd6dbcb11a2767c96afdb6ca0238e9df6e51de8248785a5da88b6b5a2bf2571668f81ad2495797fabdd277246a267c03cea93aa4e66004462284a3d5af6",
1280 ),
1281 (
1282 "91662f7ce4b4dd",
1283 "91c10c45beec8badd71dd6b446d03ed8a8b782f3c4c17b3e6376129c98c46bf1cffe358d4366e6e7b7aa4411ae26a33b0ee47d221a0275869ac4e53f23f62e04",
1284 ),
1285 (
1286 "4df36b626cc25a782d50076b966c85869142",
1287 "236571083a752bf4a8b74572b499334f0c1705acda228d50eab9fd929d4d3af523a93365e3ee7430f59a84dbd6bf3813c23f13655cf615775eb4d6df241171bb",
1288 ),
1289 (
1290 "d28785aa24d3a76269d611286b8b09843b7a70a2635a7a4c6e15a5163b665fbe7298fe33200932",
1291 "fc196cf63874e50ecf0ce5a64a230f878c773cccc6bab463482c0b5857764464af868b329b7fa10694fa774b3ece48c5e3365002ec94eeef0cde4066c1e0003f",
1292 ),
1293 (
1294 "a937b69b73e5fc4d6f5e45c8a4dd",
1295 "0af3954ae01087a1a5965859883cc30bbe39bb536eac42abf1245a7b24a5523cc0643b160776927884eb765969f25041b9606eac0f459bb17e56a7c2a0340654",
1296 ),
1297 (
1298 "2a6bc1b7ca341c958b515e02290e",
1299 "640c24dd11bc895af56e5ecbacf00daf5b5beb8002216e36d961340add0fd7939bcf9fd976d4f00f98792660a8da7ba123b7150a90c14b78e21b64c9d62b0130",
1300 ),
1301 (
1302 "a89eb3ba517254324636ecbf120bdabc324443ff20d3",
1303 "55c4428693c693947f8ff574ea3e7023f9400b2ad63dbca21765715b36ab50e92795d5188cf1661385c0ce2fc9280af212cb7204985792de81b58a78698519cc",
1304 ),
1305 (
1306 "9fa371a70f7210d146be61679f05d4f150b656009d09bede4fa7c088ef1d0b73974505058e7123e3a00e5f0407797afcba2ca5",
1307 "abe57fe29acd304e284f1cd1e3620b439a0d8835b23aeaac58f372c7211081e2f4d45041e023ec24178d92e55afda1a1c4b0251fcb0ead2ab346eb1f3e8bb2be",
1308 ),
1309 (
1310 "909566bd3de1c72338b2d246602946fd3d385df654e64ceb62b6ec2b66b34065a970fb0adc553227224a6bc7af9da4",
1311 "8eca04432053d532e2feafbba19d2fed32f2a137db331464e9fcd8bbbcf87ed24104dddcbd5654c9da0fabfb3d054dad037f86ae9f323553b9a9e5e94632a74e",
1312 ),
1313 (
1314 "9ebb027e4531ea547b31436b89154dbc1cdda9cbb5a1d3f37973197b719855256fa50b711c45f81fb56723c2ac657766d0d94fa7be2f90da845dd811f2a223",
1315 "5a012a516578f42020ef92f6ba0bae471892c1c179b00844faadcb35d7481b9f01b1115bb4e74cc0957afd88556160ec8a633572a32d733af10e6168c54590e0",
1316 ),
1317 (
1318 "582a3e95f2b21af25e41821a48709e8239f9294b5593d1e0c72d46e7",
1319 "6a62f9bb1f6b1117185ce8bb2534cb9bf7a272d75021d2434900da97b7a7e5e2ba51f3b6511425e29b9f821a885ddf90ef2e506f16ace282637a9bff8391ece8",
1320 ),
1321 (
1322 "fb831b939c823f30897ebf4d7d93dcb23d2615fb36",
1323 "37f4823d3fae6ee900d0bd8d99e85a43a5e10b7af7f04f073049ccd7b24affd8f109806f328f778094fd79de6a8320726bc379a28b174c4bc1d567efd7023f8e",
1324 ),
1325 (
1326 "c3baf0c1b8a2cb402920a2eba0b43a5738a56345a5506e16d314b26164af82ac31ba36afd844d993bcb830faffa61243",
1327 "6700b19da6c318d62380ec62690c0152601076e9735497d8411a59f15abe1a99889c12d4e7a2cf3fff1b1cef8d31d049f6b2ee669bcda79456f8a887b4f30094",
1328 ),
1329 (
1330 "d3d1503ee2d0a0774551a2baabfc667713e9e31a77b2126946b10a8237ad0427",
1331 "49f89250e58dc6446e248a1cf827ca53a44b44ea9f120891095dff4bd25d13b36283b859e1542f90d53c74c15cb94dfc01693e0700471ae9752ec8ee652c6aba",
1332 ),
1333 (
1334 "04d0d34f0a9c453f7fdc10f5d9ea9047916f9dc3a8d5ed80",
1335 "f488ab988d4e09ebe9c4d3544f5dfe0a3fbc837f4fac0dfb6047fcd859960f0f7d3fb2beca127a3bf71714361a8c04e0fc49840589557b397f97f1a70ffc3628",
1336 ),
1337 (
1338 "92a506914f87382133e365c4acf795ccc1d0ac531caf6eac9655f854132be144e668fd9ae79e8d45be5b2a6a1f47406a544b92b47677744d645b40c3d104",
1339 "d60a46aa6314ee85e36ba3d5bf916da2bfcc86f95490914761a21e89863eb849c679848c57cddc7bf54cdfca0ca0edaadc65f7ef2c604f28d7f923b8c1a7987a",
1340 ),
1341 ];
1342
1343 for &(input_hex, expected) in test_cases {
1344 let input = decode_hex(input_hex);
1345 let mut h = Blake2b::new();
1346 h.update(&input);
1347 let digest = h.sum();
1348 assert_eq!(hex::encode(digest.as_ref()), expected, "mismatch for input \"{}\"", input_hex);
1349 }
1350 }
1351}