aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile13
-rw-r--r--lib/blake2/README.md7
-rw-r--r--lib/blake2/blake2s.c123
-rw-r--r--lib/blake2/blake2s.h56
-rw-r--r--lib/blake2/rfc7693.txt1683
-rw-r--r--lib/endian.h17
-rw-r--r--lib/endian/little.c43
-rwxr-xr-xlib/tst/blake2s_genkat.py40
-rw-r--r--lib/tst/blake2s_kat.h1032
-rw-r--r--lib/tst/blake2s_selftest.cc117
-rw-r--r--lib/tst/endian_little.cc38
11 files changed, 3165 insertions, 4 deletions
diff --git a/lib/Makefile b/lib/Makefile
index 9b34c20..385e5ba 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -1,10 +1,15 @@
include ../Makefile.config
-libk.SRCS = stdio/printf.c stdio/fprintf.c stdio/vfprintf.cpp \
- stdlib/memcpy.c stdlib/memset.c stdlib/linked_list_allocator.c \
- string/itoa.c
+libk.SRCS = \
+ endian/little.c \
+ stdio/printf.c stdio/fprintf.c stdio/vfprintf.cpp \
+ stdlib/memcpy.c stdlib/memset.c stdlib/linked_list_allocator.c \
+ string/itoa.c
-TESTS += tst/test_mem tst/test_string tst/test_linked_list_allocator
+TESTS += tst/test_endian_little tst/test_mem tst/test_string tst/test_linked_list_allocator
+
+blake2.SRCS = blake2/blake2s.c
+TESTS += tst/test_blake2s_selftest
include ../rules.mk
diff --git a/lib/blake2/README.md b/lib/blake2/README.md
new file mode 100644
index 0000000..223324e
--- /dev/null
+++ b/lib/blake2/README.md
@@ -0,0 +1,7 @@
+## BLAKE2
+BLAKE2 is a cryptographic hash function faster than MD5, SHA-1, SHA-2, and SHA-3, yet is at least as secure as the
+latest standard SHA-3.
+
+## BLAKE2s
+BLAKE2s is optimized for 8 to 32-bit platforms and produces digests of any size between 1 and 32 bytes.
+
diff --git a/lib/blake2/blake2s.c b/lib/blake2/blake2s.c
new file mode 100644
index 0000000..b924a1e
--- /dev/null
+++ b/lib/blake2/blake2s.c
@@ -0,0 +1,123 @@
+#include "blake2s.h"
+#include <endian.h>
+#include <stdlib.h>
+#include <string.h>
+
+const uint32_t IV[8] = {0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19};
+
+const uint8_t SIGMA[10][16] = {
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, {14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3},
+ {11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4}, {7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8},
+ {9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13}, {2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9},
+ {12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11}, {13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10},
+ {6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5}, {10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0}};
+
+uint32_t
+rotr_u32(uint32_t word, uint8_t c)
+{
+ return (word >> c) | (word << (32 - c));
+}
+
+void
+G(uint32_t v[16], unsigned a, unsigned b, unsigned c, unsigned d, uint32_t x, uint32_t y)
+{
+ v[a] = v[a] + v[b] + x;
+ v[d] = rotr_u32(v[d] ^ v[a], 16);
+ v[c] = v[c] + v[d];
+ v[b] = rotr_u32(v[b] ^ v[c], 12);
+ v[a] = v[a] + v[b] + y;
+ v[d] = rotr_u32(v[d] ^ v[a], 8);
+ v[c] = v[c] + v[d];
+ v[b] = rotr_u32(v[b] ^ v[c], 7);
+}
+
+void
+F(struct BLAKE2s_ctx *ctx, uint32_t m[16], uint32_t f)
+{
+ // Initialize local work vector v
+ uint32_t v[16] = {ctx->h[0], ctx->h[1], ctx->h[2], ctx->h[3], ctx->h[4], ctx->h[5],
+ ctx->h[6], ctx->h[7], IV[0], IV[1], IV[2], IV[3],
+ IV[4] ^ ctx->t[0], IV[5] ^ ctx->t[1], IV[6], IV[7]};
+ if (f) v[14] = ~v[14]; // if last block flag, invert all bits
+
+ // cryptographic mixing
+ for (unsigned i = 0; i < 10; ++i) {
+ G(v, 0, 4, 8, 12, m[SIGMA[i][0]], m[SIGMA[i][1]]);
+ G(v, 1, 5, 9, 13, m[SIGMA[i][2]], m[SIGMA[i][3]]);
+ G(v, 2, 6, 10, 14, m[SIGMA[i][4]], m[SIGMA[i][5]]);
+ G(v, 3, 7, 11, 15, m[SIGMA[i][6]], m[SIGMA[i][7]]);
+
+ G(v, 0, 5, 10, 15, m[SIGMA[i][8]], m[SIGMA[i][9]]);
+ G(v, 1, 6, 11, 12, m[SIGMA[i][10]], m[SIGMA[i][11]]);
+ G(v, 2, 7, 8, 13, m[SIGMA[i][12]], m[SIGMA[i][13]]);
+ G(v, 3, 4, 9, 14, m[SIGMA[i][14]], m[SIGMA[i][15]]);
+ }
+
+ // xor the two halves
+ for (unsigned i = 0; i < 8; ++i) ctx->h[i] ^= (v[i] ^ v[i + 8]);
+}
+
+int
+BLAKE2s_init(struct BLAKE2s_ctx *ctx, uint8_t outlen, const void *key, uint8_t keylen)
+{
+ if (outlen == 0 || outlen > 32 || keylen > 32) {
+ return -1;
+ }
+
+ memset(ctx, 0, sizeof(struct BLAKE2s_ctx));
+ ctx->param.outlen = outlen;
+ ctx->param.keylen = keylen;
+ ctx->param.fanout = 1;
+ ctx->param.depth = 1;
+
+ // copy IV into state vector h
+ memcpy(ctx->h, IV, 32);
+ // copy param block 0 onto h[0]
+ ctx->h[0] ^= (ctx->param.depth << 24) ^ (ctx->param.fanout << 16) ^ (keylen << 8) ^ outlen;
+
+ if (keylen > 0) {
+ BLAKE2s_update(ctx, key, keylen);
+ ctx->c = 64; // at the end
+ }
+
+ return 0;
+}
+
+#define MIN(a, b) ((a < b) ? a : b)
+
+void
+BLAKE2s_update(struct BLAKE2s_ctx *ctx, const void *d, size_t dd)
+{
+ for (unsigned i = 0; i < dd;) {
+
+ if (ctx->c == 64) { // if block is full, consume block
+ ctx->t[0] += ctx->c;
+ if (ctx->t[0] < ctx->c) ctx->t[1] += 1;
+ ctx->c = 0; // reset counter
+
+ uint32_t *m = (uint32_t *)ctx->b;
+ for (unsigned j = 0; j < 16; ++j) m[j] = htole32(m[j]);
+ F(ctx, m, 0);
+ }
+
+ const uint8_t len = MIN(64 - ctx->c, dd - i);
+ memcpy(&ctx->b[ctx->c], &((uint8_t *)d)[i], len);
+ ctx->c += len;
+ i += len;
+ }
+}
+
+void
+BLAKE2s_final(struct BLAKE2s_ctx *ctx, void *out)
+{
+ ctx->t[0] += ctx->c;
+ if (ctx->t[0] < ctx->c) ctx->t[1] += 1;
+ for (; ctx->c < 64; ++(ctx->c)) ctx->b[ctx->c] = 0; // fill up block with zeroes
+
+ uint32_t *m = (uint32_t *)ctx->b;
+ for (unsigned i = 0; i < 16; ++i) m[i] = htole32(m[i]);
+ F(ctx, m, 1);
+
+ for (unsigned i = 0; i < ctx->param.outlen; ++i) ((uint8_t *)out)[i] = (ctx->h[i >> 2] >> (8 * (i & 3))) & 0xff;
+}
+
diff --git a/lib/blake2/blake2s.h b/lib/blake2/blake2s.h
new file mode 100644
index 0000000..64b4156
--- /dev/null
+++ b/lib/blake2/blake2s.h
@@ -0,0 +1,56 @@
+#pragma once
+
+#include <stddef.h>
+#include <stdint.h>
+
+struct BLAKE2s_param {
+ uint8_t outlen; // digest length
+ uint8_t keylen; // key length
+ uint8_t fanout;
+ uint8_t depth;
+ uint32_t leaf_length;
+ uint32_t node_offset;
+ uint16_t node_offset_ex;
+ uint8_t node_depth;
+ uint8_t inner_length;
+ uint64_t salt;
+ uint64_t personalization;
+};
+
+struct BLAKE2s_ctx {
+ uint8_t b[64]; // input buffer
+ size_t c; // pointer for b[]
+ uint32_t h[8]; // chained state vector h
+ uint32_t t[2]; // total number of bytes
+ struct BLAKE2s_param param; // parameter block
+};
+
+/**
+ * 3.1 Mixing Function G
+ */
+void G(uint32_t V[16], unsigned a, unsigned b, unsigned c, unsigned d, uint32_t x, uint32_t y);
+
+/**
+ * 3.2 Compression Function F
+ * @param t: 2w-bit offset counter t
+ * @param f: final block indicator flag f
+ */
+void F(struct BLAKE2s_ctx *context, uint32_t m[16], uint32_t f);
+
+int BLAKE2s_init(struct BLAKE2s_ctx *ctx, uint8_t outlen, const void *key, uint8_t keylen);
+void BLAKE2s_update(struct BLAKE2s_ctx *ctx, const void *d, size_t dd);
+void BLAKE2s_final(struct BLAKE2s_ctx *ctx, void *out);
+
+// All-in-one convenience function.
+static inline int
+BLAKE2s(void *out, uint8_t outlen, // return buffer for digest
+ const void *key, uint8_t keylen, // optional secret key
+ const void *in, size_t inlen) // data to be hashed
+{
+ struct BLAKE2s_ctx ctx;
+ if (BLAKE2s_init(&ctx, outlen, key, keylen)) return -1;
+ BLAKE2s_update(&ctx, in, inlen);
+ BLAKE2s_final(&ctx, out);
+
+ return 0;
+}
diff --git a/lib/blake2/rfc7693.txt b/lib/blake2/rfc7693.txt
new file mode 100644
index 0000000..d9d3b97
--- /dev/null
+++ b/lib/blake2/rfc7693.txt
@@ -0,0 +1,1683 @@
+
+
+
+
+
+
+Independent Submission M-J. Saarinen, Ed.
+Request for Comments: 7693 Queen's University Belfast
+Category: Informational J-P. Aumasson
+ISSN: 2070-1721 Kudelski Security
+ November 2015
+
+
+ The BLAKE2 Cryptographic Hash and Message Authentication Code (MAC)
+
+Abstract
+
+ This document describes the cryptographic hash function BLAKE2 and
+ makes the algorithm specification and C source code conveniently
+ available to the Internet community. BLAKE2 comes in two main
+ flavors: BLAKE2b is optimized for 64-bit platforms and BLAKE2s for
+ smaller architectures. BLAKE2 can be directly keyed, making it
+ functionally equivalent to a Message Authentication Code (MAC).
+
+Status of This Memo
+
+ This document is not an Internet Standards Track specification; it is
+ published for informational purposes.
+
+ This is a contribution to the RFC Series, independently of any other
+ RFC stream. The RFC Editor has chosen to publish this document at
+ its discretion and makes no statement about its value for
+ implementation or deployment. Documents approved for publication by
+ the RFC Editor are not a candidate for any level of Internet
+ Standard; see Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc7693.
+
+Copyright Notice
+
+ Copyright (c) 2015 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document.
+
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 1]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+Table of Contents
+
+ 1. Introduction and Terminology . . . . . . . . . . . . . . . . 3
+ 2. Conventions, Variables, and Constants . . . . . . . . . . . . 4
+ 2.1. Parameters . . . . . . . . . . . . . . . . . . . . . . . 4
+ 2.2. Other Constants and Variables . . . . . . . . . . . . . . 4
+ 2.3. Arithmetic Notation . . . . . . . . . . . . . . . . . . . 4
+ 2.4. Little-Endian Interpretation of Words as Bytes . . . . . 5
+ 2.5. Parameter Block . . . . . . . . . . . . . . . . . . . . . 5
+ 2.6. Initialization Vector . . . . . . . . . . . . . . . . . . 6
+ 2.7. Message Schedule SIGMA . . . . . . . . . . . . . . . . . 6
+ 3. BLAKE2 Processing . . . . . . . . . . . . . . . . . . . . . . 7
+ 3.1. Mixing Function G . . . . . . . . . . . . . . . . . . . . 7
+ 3.2. Compression Function F . . . . . . . . . . . . . . . . . 8
+ 3.3. Padding Data and Computing a BLAKE2 Digest . . . . . . . 9
+ 4. Standard Parameter Sets and Algorithm Identifiers . . . . . . 10
+ 5. Security Considerations . . . . . . . . . . . . . . . . . . . 11
+ 6. References . . . . . . . . . . . . . . . . . . . . . . . . . 11
+ 6.1. Normative References . . . . . . . . . . . . . . . . . . 11
+ 6.2. Informative References . . . . . . . . . . . . . . . . . 11
+ Appendix A. Example of BLAKE2b Computation . . . . . . . . . . . 13
+ Appendix B. Example of BLAKE2s Computation . . . . . . . . . . . 15
+ Appendix C. BLAKE2b Implementation C Source . . . . . . . . . . 16
+ C.1. blake2b.h . . . . . . . . . . . . . . . . . . . . . . . . 16
+ C.2. blake2b.c . . . . . . . . . . . . . . . . . . . . . . . . 17
+ Appendix D. BLAKE2s Implementation C Source . . . . . . . . . . 21
+ D.1. blake2s.h . . . . . . . . . . . . . . . . . . . . . . . . 21
+ D.2. blake2s.c . . . . . . . . . . . . . . . . . . . . . . . . 22
+ Appendix E. BLAKE2b and BLAKE2s Self-Test Module C Source . . . 26
+ Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 29
+ Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 2]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+1. Introduction and Terminology
+
+ The BLAKE2 cryptographic hash function [BLAKE2] was designed by Jean-
+ Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn, and Christian
+ Winnerlein.
+
+ BLAKE2 comes in two basic flavors:
+
+ o BLAKE2b (or just BLAKE2) is optimized for 64-bit platforms and
+ produces digests of any size between 1 and 64 bytes.
+
+ o BLAKE2s is optimized for 8- to 32-bit platforms and produces
+ digests of any size between 1 and 32 bytes.
+
+ Both BLAKE2b and BLAKE2s are believed to be highly secure and perform
+ well on any platform, software, or hardware. BLAKE2 does not require
+ a special "HMAC" (Hashed Message Authentication Code) construction
+ for keyed message authentication as it has a built-in keying
+ mechanism.
+
+ The BLAKE2 hash function may be used by digital signature algorithms
+ and message authentication and integrity protection mechanisms in
+ applications such as Public Key Infrastructure (PKI), secure
+ communication protocols, cloud storage, intrusion detection, forensic
+ suites, and version control systems.
+
+ The BLAKE2 suite provides a more efficient alternative to US Secure
+ Hash Algorithms SHA and HMAC-SHA [RFC6234]. BLAKE2s-128 is
+ especially suited as a fast and more secure drop-in replacement to
+ MD5 and HMAC-MD5 in legacy applications [RFC6151].
+
+ To aid implementation, we provide a trace of BLAKE2b-512 hash
+ computation in Appendix A and a trace of BLAKE2s-256 hash computation
+ in Appendix B. Due to space constraints, this document does not
+ contain a full set of test vectors for BLAKE2.
+
+ A reference implementation in C programming language for BLAKE2b can
+ be found in Appendix C and for BLAKE2s in Appendix D of this
+ document. These implementations MAY be validated with the more
+ exhaustive Test Module contained in Appendix E.
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 3]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+2. Conventions, Variables, and Constants
+
+2.1. Parameters
+
+ The following table summarizes various parameters and their ranges:
+
+ | BLAKE2b | BLAKE2s |
+ --------------+------------------+------------------+
+ Bits in word | w = 64 | w = 32 |
+ Rounds in F | r = 12 | r = 10 |
+ Block bytes | bb = 128 | bb = 64 |
+ Hash bytes | 1 <= nn <= 64 | 1 <= nn <= 32 |
+ Key bytes | 0 <= kk <= 64 | 0 <= kk <= 32 |
+ Input bytes | 0 <= ll < 2**128 | 0 <= ll < 2**64 |
+ --------------+------------------+------------------+
+ G Rotation | (R1, R2, R3, R4) | (R1, R2, R3, R4) |
+ constants = | (32, 24, 16, 63) | (16, 12, 8, 7) |
+ --------------+------------------+------------------+
+
+2.2. Other Constants and Variables
+
+ These variables are used in the algorithm description:
+
+ IV[0..7] Initialization Vector (constant).
+
+ SIGMA[0..9] Message word permutations (constant).
+
+ p[0..7] Parameter block (defines hash and key sizes).
+
+ m[0..15] Sixteen words of a single message block.
+
+ h[0..7] Internal state of the hash.
+
+ d[0..dd-1] Padded input blocks. Each has "bb" bytes.
+
+ t Message byte offset at the end of the current block.
+
+ f Flag indicating the last block.
+
+2.3. Arithmetic Notation
+
+ For real-valued x, we define the following functions:
+
+ floor(x) Floor, the largest integer <= x.
+
+ ceil(x) Ceiling, the smallest integer >= x.
+
+ frac(x) Positive fractional part of x, frac(x) = x - floor(x).
+
+
+
+Saarinen & Aumasson Informational [Page 4]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ Operator notation in pseudocode:
+
+ 2**n = 2 to the power "n". 2**0=1, 2**1=2, 2**2=4, 2**3=8, etc.
+
+ a ^ b = Bitwise exclusive-or operation between "a" and "b".
+
+ a mod b = Remainder "a" modulo "b", always in range [0, b-1].
+
+ x >> n = floor(x / 2**n). Logical shift "x" right by "n" bits.
+
+ x << n = (x * 2**n) mod (2**w). Logical shift "x" left by "n".
+
+ x >>> n = (x >> n) ^ (x << (w - n)). Rotate "x" right by "n".
+
+2.4. Little-Endian Interpretation of Words as Bytes
+
+ All mathematical operations are on 64-bit words in BLAKE2b and on
+ 32-bit words in BLAKE2s.
+
+ We may also perform operations on vectors of words. Vector indexing
+ is zero based; the first element of an n-element vector "v" is v[0]
+ and the last one is v[n - 1]. All elements are denoted by v[0..n-1].
+
+ Byte (octet) streams are interpreted as words in little-endian order,
+ with the least-significant byte first. Consider this sequence of
+ eight hexadecimal bytes:
+
+ x[0..7] = 0x01 0x23 0x45 0x67 0x89 0xAB 0xCD 0xEF
+
+ When interpreted as a 32-bit word from the beginning memory address,
+ x[0..3] has a numerical value of 0x67452301 or 1732584193.
+
+ When interpreted as a 64-bit word, bytes x[0..7] have a numerical
+ value of 0xEFCDAB8967452301 or 17279655951921914625.
+
+2.5. Parameter Block
+
+ We specify the parameter block words p[0..7] as follows:
+
+ byte offset: 3 2 1 0 (otherwise zero)
+ p[0] = 0x0101kknn p[1..7] = 0
+
+ Here the "nn" byte specifies the hash size in bytes. The second
+ (little-endian) byte of the parameter block, "kk", specifies the key
+ size in bytes. Set kk = 00 for unkeyed hashing. Bytes 2 and 3 are
+ set as 01. All other bytes in the parameter block are set as zero.
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 5]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ Note: [BLAKE2] defines additional variants of BLAKE2 with features
+ such as salting, personalized hashes, and tree hashing. These
+ OPTIONAL features use fields in the parameter block that are not
+ defined in this document.
+
+2.6. Initialization Vector
+
+ We define the Initialization Vector constant IV mathematically as:
+
+ IV[i] = floor(2**w * frac(sqrt(prime(i+1)))), where prime(i)
+ is the i:th prime number ( 2, 3, 5, 7, 11, 13, 17, 19 )
+ and sqrt(x) is the square root of x.
+
+ The numerical values of IV can also be found in implementations in
+ Appendices C and D for BLAKE2b and BLAKE2s, respectively.
+
+ Note: BLAKE2b IV is the same as SHA-512 IV, and BLAKE2s IV is the
+ same as SHA-256 IV; see [RFC6234].
+
+2.7. Message Schedule SIGMA
+
+ Message word schedule permutations for each round of both BLAKE2b and
+ BLAKE2s are defined by SIGMA. For BLAKE2b, the two extra
+ permutations for rounds 10 and 11 are SIGMA[10..11] = SIGMA[0..1].
+
+ Round | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
+ ----------+-------------------------------------------------+
+ SIGMA[0] | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
+ SIGMA[1] | 14 10 4 8 9 15 13 6 1 12 0 2 11 7 5 3 |
+ SIGMA[2] | 11 8 12 0 5 2 15 13 10 14 3 6 7 1 9 4 |
+ SIGMA[3] | 7 9 3 1 13 12 11 14 2 6 5 10 4 0 15 8 |
+ SIGMA[4] | 9 0 5 7 2 4 10 15 14 1 11 12 6 8 3 13 |
+ SIGMA[5] | 2 12 6 10 0 11 8 3 4 13 7 5 15 14 1 9 |
+ SIGMA[6] | 12 5 1 15 14 13 4 10 0 7 6 3 9 2 8 11 |
+ SIGMA[7] | 13 11 7 14 12 1 3 9 5 0 15 4 8 6 2 10 |
+ SIGMA[8] | 6 15 14 9 11 3 0 8 12 2 13 7 1 4 10 5 |
+ SIGMA[9] | 10 2 8 4 7 6 1 5 15 11 9 14 3 12 13 0 |
+ ----------+-------------------------------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 6]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+3. BLAKE2 Processing
+
+3.1. Mixing Function G
+
+ The G primitive function mixes two input words, "x" and "y", into
+ four words indexed by "a", "b", "c", and "d" in the working vector
+ v[0..15]. The full modified vector is returned. The rotation
+ constants (R1, R2, R3, R4) are given in Section 2.1.
+
+ FUNCTION G( v[0..15], a, b, c, d, x, y )
+ |
+ | v[a] := (v[a] + v[b] + x) mod 2**w
+ | v[d] := (v[d] ^ v[a]) >>> R1
+ | v[c] := (v[c] + v[d]) mod 2**w
+ | v[b] := (v[b] ^ v[c]) >>> R2
+ | v[a] := (v[a] + v[b] + y) mod 2**w
+ | v[d] := (v[d] ^ v[a]) >>> R3
+ | v[c] := (v[c] + v[d]) mod 2**w
+ | v[b] := (v[b] ^ v[c]) >>> R4
+ |
+ | RETURN v[0..15]
+ |
+ END FUNCTION.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 7]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+3.2. Compression Function F
+
+ Compression function F takes as an argument the state vector "h",
+ message block vector "m" (last block is padded with zeros to full
+ block size, if required), 2w-bit offset counter "t", and final block
+ indicator flag "f". Local vector v[0..15] is used in processing. F
+ returns a new state vector. The number of rounds, "r", is 12 for
+ BLAKE2b and 10 for BLAKE2s. Rounds are numbered from 0 to r - 1.
+
+ FUNCTION F( h[0..7], m[0..15], t, f )
+ |
+ | // Initialize local work vector v[0..15]
+ | v[0..7] := h[0..7] // First half from state.
+ | v[8..15] := IV[0..7] // Second half from IV.
+ |
+ | v[12] := v[12] ^ (t mod 2**w) // Low word of the offset.
+ | v[13] := v[13] ^ (t >> w) // High word.
+ |
+ | IF f = TRUE THEN // last block flag?
+ | | v[14] := v[14] ^ 0xFF..FF // Invert all bits.
+ | END IF.
+ |
+ | // Cryptographic mixing
+ | FOR i = 0 TO r - 1 DO // Ten or twelve rounds.
+ | |
+ | | // Message word selection permutation for this round.
+ | | s[0..15] := SIGMA[i mod 10][0..15]
+ | |
+ | | v := G( v, 0, 4, 8, 12, m[s[ 0]], m[s[ 1]] )
+ | | v := G( v, 1, 5, 9, 13, m[s[ 2]], m[s[ 3]] )
+ | | v := G( v, 2, 6, 10, 14, m[s[ 4]], m[s[ 5]] )
+ | | v := G( v, 3, 7, 11, 15, m[s[ 6]], m[s[ 7]] )
+ | |
+ | | v := G( v, 0, 5, 10, 15, m[s[ 8]], m[s[ 9]] )
+ | | v := G( v, 1, 6, 11, 12, m[s[10]], m[s[11]] )
+ | | v := G( v, 2, 7, 8, 13, m[s[12]], m[s[13]] )
+ | | v := G( v, 3, 4, 9, 14, m[s[14]], m[s[15]] )
+ | |
+ | END FOR
+ |
+ | FOR i = 0 TO 7 DO // XOR the two halves.
+ | | h[i] := h[i] ^ v[i] ^ v[i + 8]
+ | END FOR.
+ |
+ | RETURN h[0..7] // New state.
+ |
+ END FUNCTION.
+
+
+
+
+Saarinen & Aumasson Informational [Page 8]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+3.3. Padding Data and Computing a BLAKE2 Digest
+
+ We refer the reader to Appendices C and D for reference C language
+ implementations of BLAKE2b and BLAKE2s, respectively.
+
+ Key and data input are split and padded into "dd" message blocks
+ d[0..dd-1], each consisting of 16 words (or "bb" bytes).
+
+ If a secret key is used (kk > 0), it is padded with zero bytes and
+ set as d[0]. Otherwise, d[0] is the first data block. The final
+ data block d[dd-1] is also padded with zero to "bb" bytes (16 words).
+
+ The number of blocks is therefore dd = ceil(kk / bb) + ceil(ll / bb).
+ However, in the special case of an unkeyed empty message (kk = 0 and
+ ll = 0), we still set dd = 1 and d[0] consists of all zeros.
+
+ The following procedure processes the padded data blocks into an
+ "nn"-byte final hash value. See Section 2 for a description of
+ various variables and constants used.
+
+ FUNCTION BLAKE2( d[0..dd-1], ll, kk, nn )
+ |
+ | h[0..7] := IV[0..7] // Initialization Vector.
+ |
+ | // Parameter block p[0]
+ | h[0] := h[0] ^ 0x01010000 ^ (kk << 8) ^ nn
+ |
+ | // Process padded key and data blocks
+ | IF dd > 1 THEN
+ | | FOR i = 0 TO dd - 2 DO
+ | | | h := F( h, d[i], (i + 1) * bb, FALSE )
+ | | END FOR.
+ | END IF.
+ |
+ | // Final block.
+ | IF kk = 0 THEN
+ | | h := F( h, d[dd - 1], ll, TRUE )
+ | ELSE
+ | | h := F( h, d[dd - 1], ll + bb, TRUE )
+ | END IF.
+ |
+ | RETURN first "nn" bytes from little-endian word array h[].
+ |
+ END FUNCTION.
+
+
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 9]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+4. Standard Parameter Sets and Algorithm Identifiers
+
+ An implementation of BLAKE2b and/or BLAKE2s MAY support the following
+ digest size parameters for interoperability (e.g., digital
+ signatures), as long as a sufficient level of security is attained by
+ the parameter selections. These parameters and identifiers are
+ intended to be suitable as drop-in replacements to MD5 and
+ corresponding SHA algorithms.
+
+ Developers adapting BLAKE2 to ASN.1-based message formats SHOULD use
+ the OID tree at x = 1.3.6.1.4.1.1722.12.2. The same OID can be used
+ for both keyed and unkeyed hashing since in the latter case the key
+ simply has zero length.
+
+ Algorithm | Target | Collision | Hash | Hash ASN.1 |
+ Identifier | Arch | Security | nn | OID Suffix |
+ ---------------+--------+-----------+------+------------+
+ id-blake2b160 | 64-bit | 2**80 | 20 | x.1.5 |
+ id-blake2b256 | 64-bit | 2**128 | 32 | x.1.8 |
+ id-blake2b384 | 64-bit | 2**192 | 48 | x.1.12 |
+ id-blake2b512 | 64-bit | 2**256 | 64 | x.1.16 |
+ ---------------+--------+-----------+------+------------+
+ id-blake2s128 | 32-bit | 2**64 | 16 | x.2.4 |
+ id-blake2s160 | 32-bit | 2**80 | 20 | x.2.5 |
+ id-blake2s224 | 32-bit | 2**112 | 28 | x.2.7 |
+ id-blake2s256 | 32-bit | 2**128 | 32 | x.2.8 |
+ ---------------+--------+-----------+------+------------+
+
+ hashAlgs OBJECT IDENTIFIER ::= {
+ iso(1) identified-organization(3) dod(6) internet(1)
+ private(4) enterprise(1) kudelski(1722) cryptography(12) 2
+ }
+ macAlgs OBJECT IDENTIFIER ::= {
+ iso(1) identified-organization(3) dod(6) internet(1)
+ private(4) enterprise(1) kudelski(1722) cryptography(12) 3
+ }
+
+ -- the two BLAKE2 variants --
+ blake2b OBJECT IDENTIFIER ::= { hashAlgs 1 }
+ blake2s OBJECT IDENTIFIER ::= { hashAlgs 2 }
+
+ -- BLAKE2b Identifiers --
+ id-blake2b160 OBJECT IDENTIFIER ::= { blake2b 5 }
+ id-blake2b256 OBJECT IDENTIFIER ::= { blake2b 8 }
+ id-blake2b384 OBJECT IDENTIFIER ::= { blake2b 12 }
+ id-blake2b512 OBJECT IDENTIFIER ::= { blake2b 16 }
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 10]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ -- BLAKE2s Identifiers --
+ id-blake2s128 OBJECT IDENTIFIER ::= { blake2s 4 }
+ id-blake2s160 OBJECT IDENTIFIER ::= { blake2s 5 }
+ id-blake2s224 OBJECT IDENTIFIER ::= { blake2s 7 }
+ id-blake2s256 OBJECT IDENTIFIER ::= { blake2s 8 }
+
+5. Security Considerations
+
+ This document is intended to provide convenient open-source access by
+ the Internet community to the BLAKE2 cryptographic hash algorithm.
+ We wish to make no independent assertion to its security in this
+ document. We refer the reader to [BLAKE] and [BLAKE2] for detailed
+ cryptanalytic rationale behind its design.
+
+ In order to avoid bloat, the reference implementations in Appendices
+ C and D may not erase all sensitive data (such as secret keys)
+ immediately from process memory after use. Such cleanup can be added
+ if needed.
+
+6. References
+
+6.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119,
+ DOI 10.17487/RFC2119, March 1997,
+ <http://www.rfc-editor.org/info/rfc2119>.
+
+6.2. Informative References
+
+ [BLAKE] Aumasson, J-P., Meier, W., Phan, R., and L. Henzen, "The
+ Hash Function BLAKE", January 2015,
+ <https://131002.net/blake/book>.
+
+ [BLAKE2] Aumasson, J-P., Neves, S., Wilcox-O'Hearn, Z., and C.
+ Winnerlein, "BLAKE2: simpler, smaller, fast as MD5",
+ January 2013, <https://blake2.net/blake2.pdf>.
+
+ [FIPS140-2IG]
+ NIST, "Implementation Guidance for FIPS PUB 140-2 and the
+ Cryptographic Module Validation Program", September 2015,
+ <http://csrc.nist.gov/groups/STM/cmvp/documents/fips140-2/
+ FIPS1402IG.pdf/>.
+
+ [RFC6151] Turner, S. and L. Chen, "Updated Security Considerations
+ for the MD5 Message-Digest and the HMAC-MD5 Algorithms",
+ RFC 6151, DOI 10.17487/RFC6151, March 2011,
+ <http://www.rfc-editor.org/info/rfc6151>.
+
+
+
+Saarinen & Aumasson Informational [Page 11]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ [RFC6234] Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms
+ (SHA and SHA-based HMAC and HKDF)", RFC 6234,
+ DOI 10.17487/RFC6234, May 2011,
+ <http://www.rfc-editor.org/info/rfc6234>.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 12]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+Appendix A. Example of BLAKE2b Computation
+
+ We compute the unkeyed hash of three ASCII bytes "abc" with
+ BLAKE2b-512 and show internal values during computation.
+
+ m[16] = 0000000000636261 0000000000000000 0000000000000000
+ 0000000000000000 0000000000000000 0000000000000000
+ 0000000000000000 0000000000000000 0000000000000000
+ 0000000000000000 0000000000000000 0000000000000000
+ 0000000000000000 0000000000000000 0000000000000000
+ 0000000000000000
+
+ (i= 0) v[16] = 6A09E667F2BDC948 BB67AE8584CAA73B 3C6EF372FE94F82B
+ A54FF53A5F1D36F1 510E527FADE682D1 9B05688C2B3E6C1F
+ 1F83D9ABFB41BD6B 5BE0CD19137E2179 6A09E667F3BCC908
+ BB67AE8584CAA73B 3C6EF372FE94F82B A54FF53A5F1D36F1
+ 510E527FADE682D2 9B05688C2B3E6C1F E07C265404BE4294
+ 5BE0CD19137E2179
+
+ (i= 1) v[16] = 86B7C1568029BB79 C12CBCC809FF59F3 C6A5214CC0EACA8E
+ 0C87CD524C14CC5D 44EE6039BD86A9F7 A447C850AA694A7E
+ DE080F1BB1C0F84B 595CB8A9A1ACA66C BEC3AE837EAC4887
+ 6267FC79DF9D6AD1 FA87B01273FA6DBE 521A715C63E08D8A
+ E02D0975B8D37A83 1C7B754F08B7D193 8F885A76B6E578FE
+ 2318A24E2140FC64
+
+ (i= 2) v[16] = 53281E83806010F2 3594B403F81B4393 8CD63C7462DE0DFF
+ 85F693F3DA53F974 BAABDBB2F386D9AE CA5425AEC65A10A8
+ C6A22E2FF0F7AA48 C6A56A51CB89C595 224E6A3369224F96
+ 500E125E58A92923 E9E4AD0D0E1A0D48 85DF9DC143C59A74
+ 92A3AAAA6D952B7F C5FDF71090FAE853 2A8A40F15A462DD0
+ 572D17EFFDD37358
+
+ (i= 3) v[16] = 60ED96AA7AD41725 E46A743C71800B9D 1A04B543A01F156B
+ A2F8716E775C4877 DA0A61BCDE4267EA B1DD230754D7BDEE
+ 25A1422779E06D14 E6823AE4C3FF58A5 A1677E19F37FD5DA
+ 22BDCE6976B08C51 F1DE8696BEC11BF1 A0EBD586A4A1D2C8
+ C804EBAB11C99FA9 8E0CEC959C715793 7C45557FAE0D4D89
+ 716343F52FDD265E
+
+ (i= 4) v[16] = BB2A77D3A8382351 45EB47971F23B103 98BE297F6E45C684
+ A36077DEE3370B89 8A03C4CB7E97590A 24192E49EBF54EA0
+ 4F82C9401CB32D7A 8CCD013726420DC4 A9C9A8F17B1FC614
+ 55908187977514A0 5B44273E66B19D27 B6D5C9FCA2579327
+ 086092CFB858437E 5C4BE2156DBEECF9 2EFEDE99ED4EFF16
+ 3E7B5F234CD1F804
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 13]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ (i= 5) v[16] = C79C15B3D423B099 2DA2224E8DA97556 77D2B26DF1C45C55
+ 8934EB09A3456052 0F6D9EEED157DA2A 6FE66467AF88C0A9
+ 4EB0B76284C7AAFB 299C8E725D954697 B2240B59E6D567D3
+ 2643C2370E49EBFD 79E02EEF20CDB1AE 64B3EED7BB602F39
+ B97D2D439E4DF63D C718E755294C9111 1F0893F2772BB373
+ 1205EA4A7859807D
+
+ (i= 6) v[16] = E58F97D6385BAEE4 7640AA9764DA137A DEB4C7C23EFE287E
+ 70F6F41C8783C9F6 7127CD48C76A7708 9E472AF0BE3DB3F6
+ 0F244C62DDF71788 219828AA83880842 41CCA9073C8C4D0D
+ 5C7912BC10DF3B4B A2C3ABBD37510EE2 CB5668CC2A9F7859
+ 8733794F07AC1500 C67A6BE42335AA6F ACB22B28681E4C82
+ DB2161604CBC9828
+
+ (i= 7) v[16] = 6E2D286EEADEDC81 BCF02C0787E86358 57D56A56DD015EDF
+ 55D899D40A5D0D0A 819415B56220C459 B63C479A6A769F02
+ 258E55E0EC1F362A 3A3B4EC60E19DFDC 04D769B3FCB048DB
+ B78A9A33E9BFF4DD 5777272AE1E930C0 5A387849E578DBF6
+ 92AAC307CF2C0AFC 30AACCC4F06DAFAA 483893CC094F8863
+ E03C6CC89C26BF92
+
+ (i= 8) v[16] = FFC83ECE76024D01 1BE7BFFB8C5CC5F9 A35A18CBAC4C65B7
+ B7C2C7E6D88C285F 81937DA314A50838 E1179523A2541963
+ 3A1FAD7106232B8F 1C7EDE92AB8B9C46 A3C2D35E4F685C10
+ A53D3F73AA619624 30BBCC0285A22F65 BCEFBB6A81539E5D
+ 3841DEF6F4C9848A 98662C85FBA726D4 7762439BD5A851BD
+ B0B9F0D443D1A889
+
+ (i= 9) v[16] = 753A70A1E8FAEADD 6B0D43CA2C25D629 F8343BA8B94F8C0B
+ BC7D062B0DB5CF35 58540EE1B1AEBC47 63C5B9B80D294CB9
+ 490870ECAD27DEBD B2A90DDF667287FE 316CC9EBEEFAD8FC
+ 4A466BCD021526A4 5DA7F7638CEC5669 D9C8826727D306FC
+ 88ED6C4F3BD7A537 19AE688DDF67F026 4D8707AAB40F7E6D
+ FD3F572687FEA4F1
+
+ (i=10) v[16] = E630C747CCD59C4F BC713D41127571CA 46DB183025025078
+ 6727E81260610140 2D04185EAC2A8CBA 5F311B88904056EC
+ 40BD313009201AAB 0099D4F82A2A1EAB 6DD4FBC1DE60165D
+ B3B0B51DE3C86270 900AEE2F233B08E5 A07199D87AD058D8
+ 2C6B25593D717852 37E8CA471BEAA5F8 2CFC1BAC10EF4457
+ 01369EC18746E775
+
+ (i=11) v[16] = E801F73B9768C760 35C6D22320BE511D 306F27584F65495E
+ B51776ADF569A77B F4F1BE86690B3C34 3CC88735D1475E4B
+ 5DAC67921FF76949 1CDB9D31AD70CC4E 35BA354A9C7DF448
+ 4929CBE45679D73E 733D1A17248F39DB 92D57B736F5F170A
+ 61B5C0A41D491399 B5C333457E12844A BD696BE010D0D889
+ 02231E1A917FE0BD
+
+
+
+Saarinen & Aumasson Informational [Page 14]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ (i=12) v[16] = 12EF8A641EC4F6D6 BCED5DE977C9FAF5 733CA476C5148639
+ 97DF596B0610F6FC F42C16519AD5AFA7 AA5AC1888E10467E
+ 217D930AA51787F3 906A6FF19E573942 75AB709BD3DCBF24
+ EE7CE1F345947AA4 F8960D6C2FAF5F5E E332538A36B6D246
+ 885BEF040EF6AA0B A4939A417BFB78A3 646CBB7AF6DCE980
+ E813A23C60AF3B82
+
+ h[8] = 0D4D1C983FA580BA E9F6129FB697276A B7C45A68142F214C
+ D1A2FFDB6FBB124B 2D79AB2A39C5877D 95CC3345DED552C2
+ 5A92F1DBA88AD318 239900D4ED8623B9
+
+ BLAKE2b-512("abc") = BA 80 A5 3F 98 1C 4D 0D 6A 27 97 B6 9F 12 F6 E9
+ 4C 21 2F 14 68 5A C4 B7 4B 12 BB 6F DB FF A2 D1
+ 7D 87 C5 39 2A AB 79 2D C2 52 D5 DE 45 33 CC 95
+ 18 D3 8A A8 DB F1 92 5A B9 23 86 ED D4 00 99 23
+
+Appendix B. Example of BLAKE2s Computation
+
+ We compute the unkeyed hash of three ASCII bytes "abc" with
+ BLAKE2s-256 and show internal values during computation.
+
+ m[16] = 00636261 00000000 00000000 00000000 00000000 00000000
+ 00000000 00000000 00000000 00000000 00000000 00000000
+ 00000000 00000000 00000000 00000000
+
+ (i=0) v[16] = 6B08E647 BB67AE85 3C6EF372 A54FF53A 510E527F 9B05688C
+ 1F83D9AB 5BE0CD19 6A09E667 BB67AE85 3C6EF372 A54FF53A
+ 510E527C 9B05688C E07C2654 5BE0CD19
+
+ (i=1) v[16] = 16A3242E D7B5E238 CE8CE24B 927AEDE1 A7B430D9 93A4A14E
+ A44E7C31 41D4759B 95BF33D3 9A99C181 608A3A6B B666383E
+ 7A8DD50F BE378ED7 353D1EE6 3BB44C6B
+
+ (i=2) v[16] = 3AE30FE3 0982A96B E88185B4 3E339B16 F24338CD 0E66D326
+ E005ED0C D591A277 180B1F3A FCF43914 30DB62D6 4847831C
+ 7F00C58E FB847886 C544E836 524AB0E2
+
+ (i=3) v[16] = 7A3BE783 997546C1 D45246DF EDB5F821 7F98A742 10E864E2
+ D4AB70D0 C63CB1AB 6038DA9E 414594B0 F2C218B5 8DA0DCB7
+ D7CD7AF5 AB4909DF 85031A52 C4EDFC98
+
+ (i=4) v[16] = 2A8B8CB7 1ACA82B2 14045D7F CC7258ED 383CF67C E090E7F9
+ 3025D276 57D04DE4 994BACF0 F0982759 F17EE300 D48FC2D5
+ DC854C10 523898A9 C03A0F89 47D6CD88
+
+ (i=5) v[16] = C4AA2DDB 111343A3 D54A700A 574A00A9 857D5A48 B1E11989
+ 6F5C52DF DD2C53A3 678E5F8E 9718D4E9 622CB684 92976076
+ 0E41A517 359DC2BE 87A87DDD 643F9CEC
+
+
+
+Saarinen & Aumasson Informational [Page 15]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ (i=6) v[16] = 3453921C D7595EE1 592E776D 3ED6A974 4D997CB3 DE9212C3
+ 35ADF5C9 9916FD65 96562E89 4EAD0792 EBFC2712 2385F5B2
+ F34600FB D7BC20FB EB452A7B ECE1AA40
+
+ (i=7) v[16] = BE851B2D A85F6358 81E6FC3B 0BB28000 FA55A33A 87BE1FAD
+ 4119370F 1E2261AA A1318FD3 F4329816 071783C2 6E536A8D
+ 9A81A601 E7EC80F1 ACC09948 F849A584
+
+ (i=8) v[16] = 07E5B85A 069CC164 F9DE3141 A56F4680 9E440AD2 9AB659EA
+ 3C84B971 21DBD9CF 46699F8C 765257EC AF1D998C 75E4C3B6
+ 523878DC 30715015 397FEE81 4F1FA799
+
+ (i=9) v[16] = 435148C4 A5AA2D11 4B354173 D543BC9E BDA2591C BF1D2569
+ 4FCB3120 707ADA48 565B3FDE 32C9C916 EAF4A1AB B1018F28
+ 8078D978 68ADE4B5 9778FDA3 2863B92E
+
+ (i=10) v[16] = D9C994AA CFEC3AA6 700D0AB2 2C38670E AF6A1F66 1D023EF3
+ 1D9EC27D 945357A5 3E9FFEBD 969FE811 EF485E21 A632797A
+ DEEF082E AF3D80E1 4E86829B 4DEAFD3A
+
+ h[8] = 8C5E8C50 E2147C32 A32BA7E1 2F45EB4E 208B4537 293AD69E
+ 4C9B994D 82596786
+
+ BLAKE2s-256("abc") = 50 8C 5E 8C 32 7C 14 E2 E1 A7 2B A3 4E EB 45 2F
+ 37 45 8B 20 9E D6 3A 29 4D 99 9B 4C 86 67 59 82
+
+Appendix C. BLAKE2b Implementation C Source
+
+C.1. blake2b.h
+
+ <CODE BEGINS>
+ // blake2b.h
+ // BLAKE2b Hashing Context and API Prototypes
+
+ #ifndef BLAKE2B_H
+ #define BLAKE2B_H
+
+ #include <stdint.h>
+ #include <stddef.h>
+
+ // state context
+ typedef struct {
+ uint8_t b[128]; // input buffer
+ uint64_t h[8]; // chained state
+ uint64_t t[2]; // total number of bytes
+ size_t c; // pointer for b[]
+ size_t outlen; // digest size
+ } blake2b_ctx;
+
+
+
+Saarinen & Aumasson Informational [Page 16]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ // Initialize the hashing context "ctx" with optional key "key".
+ // 1 <= outlen <= 64 gives the digest size in bytes.
+ // Secret key (also <= 64 bytes) is optional (keylen = 0).
+ int blake2b_init(blake2b_ctx *ctx, size_t outlen,
+ const void *key, size_t keylen); // secret key
+
+ // Add "inlen" bytes from "in" into the hash.
+ void blake2b_update(blake2b_ctx *ctx, // context
+ const void *in, size_t inlen); // data to be hashed
+
+ // Generate the message digest (size given in init).
+ // Result placed in "out".
+ void blake2b_final(blake2b_ctx *ctx, void *out);
+
+ // All-in-one convenience function.
+ int blake2b(void *out, size_t outlen, // return buffer for digest
+ const void *key, size_t keylen, // optional secret key
+ const void *in, size_t inlen); // data to be hashed
+
+ #endif
+ <CODE ENDS>
+
+C.2. blake2b.c
+
+ <CODE BEGINS>
+ // blake2b.c
+ // A simple BLAKE2b Reference Implementation.
+
+ #include "blake2b.h"
+
+ // Cyclic right rotation.
+
+ #ifndef ROTR64
+ #define ROTR64(x, y) (((x) >> (y)) ^ ((x) << (64 - (y))))
+ #endif
+
+ // Little-endian byte access.
+
+ #define B2B_GET64(p) \
+ (((uint64_t) ((uint8_t *) (p))[0]) ^ \
+ (((uint64_t) ((uint8_t *) (p))[1]) << 8) ^ \
+ (((uint64_t) ((uint8_t *) (p))[2]) << 16) ^ \
+ (((uint64_t) ((uint8_t *) (p))[3]) << 24) ^ \
+ (((uint64_t) ((uint8_t *) (p))[4]) << 32) ^ \
+ (((uint64_t) ((uint8_t *) (p))[5]) << 40) ^ \
+ (((uint64_t) ((uint8_t *) (p))[6]) << 48) ^ \
+ (((uint64_t) ((uint8_t *) (p))[7]) << 56))
+
+
+
+
+Saarinen & Aumasson Informational [Page 17]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ // G Mixing function.
+
+ #define B2B_G(a, b, c, d, x, y) { \
+ v[a] = v[a] + v[b] + x; \
+ v[d] = ROTR64(v[d] ^ v[a], 32); \
+ v[c] = v[c] + v[d]; \
+ v[b] = ROTR64(v[b] ^ v[c], 24); \
+ v[a] = v[a] + v[b] + y; \
+ v[d] = ROTR64(v[d] ^ v[a], 16); \
+ v[c] = v[c] + v[d]; \
+ v[b] = ROTR64(v[b] ^ v[c], 63); }
+
+ // Initialization Vector.
+
+ static const uint64_t blake2b_iv[8] = {
+ 0x6A09E667F3BCC908, 0xBB67AE8584CAA73B,
+ 0x3C6EF372FE94F82B, 0xA54FF53A5F1D36F1,
+ 0x510E527FADE682D1, 0x9B05688C2B3E6C1F,
+ 0x1F83D9ABFB41BD6B, 0x5BE0CD19137E2179
+ };
+
+ // Compression function. "last" flag indicates last block.
+
+ static void blake2b_compress(blake2b_ctx *ctx, int last)
+ {
+ const uint8_t sigma[12][16] = {
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
+ { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 },
+ { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 },
+ { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 },
+ { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 },
+ { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 },
+ { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 },
+ { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 },
+ { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 },
+ { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 },
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
+ { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }
+ };
+ int i;
+ uint64_t v[16], m[16];
+
+ for (i = 0; i < 8; i++) { // init work variables
+ v[i] = ctx->h[i];
+ v[i + 8] = blake2b_iv[i];
+ }
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 18]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ v[12] ^= ctx->t[0]; // low 64 bits of offset
+ v[13] ^= ctx->t[1]; // high 64 bits
+ if (last) // last block flag set ?
+ v[14] = ~v[14];
+
+ for (i = 0; i < 16; i++) // get little-endian words
+ m[i] = B2B_GET64(&ctx->b[8 * i]);
+
+ for (i = 0; i < 12; i++) { // twelve rounds
+ B2B_G( 0, 4, 8, 12, m[sigma[i][ 0]], m[sigma[i][ 1]]);
+ B2B_G( 1, 5, 9, 13, m[sigma[i][ 2]], m[sigma[i][ 3]]);
+ B2B_G( 2, 6, 10, 14, m[sigma[i][ 4]], m[sigma[i][ 5]]);
+ B2B_G( 3, 7, 11, 15, m[sigma[i][ 6]], m[sigma[i][ 7]]);
+ B2B_G( 0, 5, 10, 15, m[sigma[i][ 8]], m[sigma[i][ 9]]);
+ B2B_G( 1, 6, 11, 12, m[sigma[i][10]], m[sigma[i][11]]);
+ B2B_G( 2, 7, 8, 13, m[sigma[i][12]], m[sigma[i][13]]);
+ B2B_G( 3, 4, 9, 14, m[sigma[i][14]], m[sigma[i][15]]);
+ }
+
+ for( i = 0; i < 8; ++i )
+ ctx->h[i] ^= v[i] ^ v[i + 8];
+ }
+
+ // Initialize the hashing context "ctx" with optional key "key".
+ // 1 <= outlen <= 64 gives the digest size in bytes.
+ // Secret key (also <= 64 bytes) is optional (keylen = 0).
+
+ int blake2b_init(blake2b_ctx *ctx, size_t outlen,
+ const void *key, size_t keylen) // (keylen=0: no key)
+ {
+ size_t i;
+
+ if (outlen == 0 || outlen > 64 || keylen > 64)
+ return -1; // illegal parameters
+
+ for (i = 0; i < 8; i++) // state, "param block"
+ ctx->h[i] = blake2b_iv[i];
+ ctx->h[0] ^= 0x01010000 ^ (keylen << 8) ^ outlen;
+
+ ctx->t[0] = 0; // input count low word
+ ctx->t[1] = 0; // input count high word
+ ctx->c = 0; // pointer within buffer
+ ctx->outlen = outlen;
+
+
+
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 19]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ for (i = keylen; i < 128; i++) // zero input block
+ ctx->b[i] = 0;
+ if (keylen > 0) {
+ blake2b_update(ctx, key, keylen);
+ ctx->c = 128; // at the end
+ }
+
+ return 0;
+ }
+
+ // Add "inlen" bytes from "in" into the hash.
+
+ void blake2b_update(blake2b_ctx *ctx,
+ const void *in, size_t inlen) // data bytes
+ {
+ size_t i;
+
+ for (i = 0; i < inlen; i++) {
+ if (ctx->c == 128) { // buffer full ?
+ ctx->t[0] += ctx->c; // add counters
+ if (ctx->t[0] < ctx->c) // carry overflow ?
+ ctx->t[1]++; // high word
+ blake2b_compress(ctx, 0); // compress (not last)
+ ctx->c = 0; // counter to zero
+ }
+ ctx->b[ctx->c++] = ((const uint8_t *) in)[i];
+ }
+ }
+
+ // Generate the message digest (size given in init).
+ // Result placed in "out".
+
+ void blake2b_final(blake2b_ctx *ctx, void *out)
+ {
+ size_t i;
+
+ ctx->t[0] += ctx->c; // mark last block offset
+ if (ctx->t[0] < ctx->c) // carry overflow
+ ctx->t[1]++; // high word
+
+ while (ctx->c < 128) // fill up with zeros
+ ctx->b[ctx->c++] = 0;
+ blake2b_compress(ctx, 1); // final block flag = 1
+
+
+
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 20]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ // little endian convert and store
+ for (i = 0; i < ctx->outlen; i++) {
+ ((uint8_t *) out)[i] =
+ (ctx->h[i >> 3] >> (8 * (i & 7))) & 0xFF;
+ }
+ }
+
+ // Convenience function for all-in-one computation.
+
+ int blake2b(void *out, size_t outlen,
+ const void *key, size_t keylen,
+ const void *in, size_t inlen)
+ {
+ blake2b_ctx ctx;
+
+ if (blake2b_init(&ctx, outlen, key, keylen))
+ return -1;
+ blake2b_update(&ctx, in, inlen);
+ blake2b_final(&ctx, out);
+
+ return 0;
+ }
+ <CODE ENDS>
+
+Appendix D. BLAKE2s Implementation C Source
+
+D.1. blake2s.h
+
+ <CODE BEGINS>
+ // blake2s.h
+ // BLAKE2s Hashing Context and API Prototypes
+
+ #ifndef BLAKE2S_H
+ #define BLAKE2S_H
+
+ #include <stdint.h>
+ #include <stddef.h>
+
+ // state context
+ typedef struct {
+ uint8_t b[64]; // input buffer
+ uint32_t h[8]; // chained state
+ uint32_t t[2]; // total number of bytes
+ size_t c; // pointer for b[]
+ size_t outlen; // digest size
+ } blake2s_ctx;
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 21]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ // Initialize the hashing context "ctx" with optional key "key".
+ // 1 <= outlen <= 32 gives the digest size in bytes.
+ // Secret key (also <= 32 bytes) is optional (keylen = 0).
+ int blake2s_init(blake2s_ctx *ctx, size_t outlen,
+ const void *key, size_t keylen); // secret key
+
+ // Add "inlen" bytes from "in" into the hash.
+ void blake2s_update(blake2s_ctx *ctx, // context
+ const void *in, size_t inlen); // data to be hashed
+
+ // Generate the message digest (size given in init).
+ // Result placed in "out".
+ void blake2s_final(blake2s_ctx *ctx, void *out);
+
+ // All-in-one convenience function.
+ int blake2s(void *out, size_t outlen, // return buffer for digest
+ const void *key, size_t keylen, // optional secret key
+ const void *in, size_t inlen); // data to be hashed
+
+ #endif
+ <CODE ENDS>
+
+D.2. blake2s.c
+
+ <CODE BEGINS>
+ // blake2s.c
+ // A simple blake2s Reference Implementation.
+
+ #include "blake2s.h"
+
+ // Cyclic right rotation.
+
+ #ifndef ROTR32
+ #define ROTR32(x, y) (((x) >> (y)) ^ ((x) << (32 - (y))))
+ #endif
+
+ // Little-endian byte access.
+
+ #define B2S_GET32(p) \
+ (((uint32_t) ((uint8_t *) (p))[0]) ^ \
+ (((uint32_t) ((uint8_t *) (p))[1]) << 8) ^ \
+ (((uint32_t) ((uint8_t *) (p))[2]) << 16) ^ \
+ (((uint32_t) ((uint8_t *) (p))[3]) << 24))
+
+
+
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 22]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ // Mixing function G.
+
+ #define B2S_G(a, b, c, d, x, y) { \
+ v[a] = v[a] + v[b] + x; \
+ v[d] = ROTR32(v[d] ^ v[a], 16); \
+ v[c] = v[c] + v[d]; \
+ v[b] = ROTR32(v[b] ^ v[c], 12); \
+ v[a] = v[a] + v[b] + y; \
+ v[d] = ROTR32(v[d] ^ v[a], 8); \
+ v[c] = v[c] + v[d]; \
+ v[b] = ROTR32(v[b] ^ v[c], 7); }
+
+ // Initialization Vector.
+
+ static const uint32_t blake2s_iv[8] =
+ {
+ 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A,
+ 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19
+ };
+
+ // Compression function. "last" flag indicates last block.
+
+ static void blake2s_compress(blake2s_ctx *ctx, int last)
+ {
+ const uint8_t sigma[10][16] = {
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
+ { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 },
+ { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 },
+ { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 },
+ { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 },
+ { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 },
+ { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 },
+ { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 },
+ { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 },
+ { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 }
+ };
+ int i;
+ uint32_t v[16], m[16];
+
+ for (i = 0; i < 8; i++) { // init work variables
+ v[i] = ctx->h[i];
+ v[i + 8] = blake2s_iv[i];
+ }
+
+ v[12] ^= ctx->t[0]; // low 32 bits of offset
+ v[13] ^= ctx->t[1]; // high 32 bits
+ if (last) // last block flag set ?
+ v[14] = ~v[14];
+
+
+
+Saarinen & Aumasson Informational [Page 23]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ for (i = 0; i < 16; i++) // get little-endian words
+ m[i] = B2S_GET32(&ctx->b[4 * i]);
+
+ for (i = 0; i < 10; i++) { // ten rounds
+ B2S_G( 0, 4, 8, 12, m[sigma[i][ 0]], m[sigma[i][ 1]]);
+ B2S_G( 1, 5, 9, 13, m[sigma[i][ 2]], m[sigma[i][ 3]]);
+ B2S_G( 2, 6, 10, 14, m[sigma[i][ 4]], m[sigma[i][ 5]]);
+ B2S_G( 3, 7, 11, 15, m[sigma[i][ 6]], m[sigma[i][ 7]]);
+ B2S_G( 0, 5, 10, 15, m[sigma[i][ 8]], m[sigma[i][ 9]]);
+ B2S_G( 1, 6, 11, 12, m[sigma[i][10]], m[sigma[i][11]]);
+ B2S_G( 2, 7, 8, 13, m[sigma[i][12]], m[sigma[i][13]]);
+ B2S_G( 3, 4, 9, 14, m[sigma[i][14]], m[sigma[i][15]]);
+ }
+
+ for( i = 0; i < 8; ++i )
+ ctx->h[i] ^= v[i] ^ v[i + 8];
+ }
+
+ // Initialize the hashing context "ctx" with optional key "key".
+ // 1 <= outlen <= 32 gives the digest size in bytes.
+ // Secret key (also <= 32 bytes) is optional (keylen = 0).
+
+ int blake2s_init(blake2s_ctx *ctx, size_t outlen,
+ const void *key, size_t keylen) // (keylen=0: no key)
+ {
+ size_t i;
+
+ if (outlen == 0 || outlen > 32 || keylen > 32)
+ return -1; // illegal parameters
+
+ for (i = 0; i < 8; i++) // state, "param block"
+ ctx->h[i] = blake2s_iv[i];
+ ctx->h[0] ^= 0x01010000 ^ (keylen << 8) ^ outlen;
+
+ ctx->t[0] = 0; // input count low word
+ ctx->t[1] = 0; // input count high word
+ ctx->c = 0; // pointer within buffer
+ ctx->outlen = outlen;
+
+ for (i = keylen; i < 64; i++) // zero input block
+ ctx->b[i] = 0;
+ if (keylen > 0) {
+ blake2s_update(ctx, key, keylen);
+ ctx->c = 64; // at the end
+ }
+
+ return 0;
+ }
+
+
+
+Saarinen & Aumasson Informational [Page 24]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ // Add "inlen" bytes from "in" into the hash.
+
+ void blake2s_update(blake2s_ctx *ctx,
+ const void *in, size_t inlen) // data bytes
+ {
+ size_t i;
+
+ for (i = 0; i < inlen; i++) {
+ if (ctx->c == 64) { // buffer full ?
+ ctx->t[0] += ctx->c; // add counters
+ if (ctx->t[0] < ctx->c) // carry overflow ?
+ ctx->t[1]++; // high word
+ blake2s_compress(ctx, 0); // compress (not last)
+ ctx->c = 0; // counter to zero
+ }
+ ctx->b[ctx->c++] = ((const uint8_t *) in)[i];
+ }
+ }
+
+ // Generate the message digest (size given in init).
+ // Result placed in "out".
+
+ void blake2s_final(blake2s_ctx *ctx, void *out)
+ {
+ size_t i;
+
+ ctx->t[0] += ctx->c; // mark last block offset
+ if (ctx->t[0] < ctx->c) // carry overflow
+ ctx->t[1]++; // high word
+
+ while (ctx->c < 64) // fill up with zeros
+ ctx->b[ctx->c++] = 0;
+ blake2s_compress(ctx, 1); // final block flag = 1
+
+ // little endian convert and store
+ for (i = 0; i < ctx->outlen; i++) {
+ ((uint8_t *) out)[i] =
+ (ctx->h[i >> 2] >> (8 * (i & 3))) & 0xFF;
+ }
+ }
+
+ // Convenience function for all-in-one computation.
+
+ int blake2s(void *out, size_t outlen,
+ const void *key, size_t keylen,
+ const void *in, size_t inlen)
+ {
+ blake2s_ctx ctx;
+
+
+
+Saarinen & Aumasson Informational [Page 25]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ if (blake2s_init(&ctx, outlen, key, keylen))
+ return -1;
+ blake2s_update(&ctx, in, inlen);
+ blake2s_final(&ctx, out);
+
+ return 0;
+ }
+ <CODE ENDS>
+
+Appendix E. BLAKE2b and BLAKE2s Self-Test Module C Source
+
+ This module computes a series of keyed and unkeyed hashes from
+ deterministically generated pseudorandom data and computes a hash
+ over those results. This is a fairly exhaustive, yet compact and
+ fast method for verifying that the hashing module is functioning
+ correctly.
+
+ Such testing is RECOMMENDED, especially when compiling the
+ implementation for a new a target platform configuration.
+ Furthermore, some security standards, such as FIPS-140, may require a
+ Power-On Self Test (POST) to be performed every time the
+ cryptographic module is loaded [FIPS140-2IG].
+
+ <CODE BEGINS>
+ // test_main.c
+ // Self test Modules for BLAKE2b and BLAKE2s -- and a stub main().
+
+ #include <stdio.h>
+
+ #include "blake2b.h"
+ #include "blake2s.h"
+
+ // Deterministic sequences (Fibonacci generator).
+
+ static void selftest_seq(uint8_t *out, size_t len, uint32_t seed)
+ {
+ size_t i;
+ uint32_t t, a , b;
+
+ a = 0xDEAD4BAD * seed; // prime
+ b = 1;
+
+ for (i = 0; i < len; i++) { // fill the buf
+ t = a + b;
+ a = b;
+ b = t;
+ out[i] = (t >> 24) & 0xFF;
+ }
+
+
+
+Saarinen & Aumasson Informational [Page 26]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ }
+
+ // BLAKE2b self-test validation. Return 0 when OK.
+
+ int blake2b_selftest()
+ {
+ // grand hash of hash results
+ const uint8_t blake2b_res[32] = {
+ 0xC2, 0x3A, 0x78, 0x00, 0xD9, 0x81, 0x23, 0xBD,
+ 0x10, 0xF5, 0x06, 0xC6, 0x1E, 0x29, 0xDA, 0x56,
+ 0x03, 0xD7, 0x63, 0xB8, 0xBB, 0xAD, 0x2E, 0x73,
+ 0x7F, 0x5E, 0x76, 0x5A, 0x7B, 0xCC, 0xD4, 0x75
+ };
+ // parameter sets
+ const size_t b2b_md_len[4] = { 20, 32, 48, 64 };
+ const size_t b2b_in_len[6] = { 0, 3, 128, 129, 255, 1024 };
+
+ size_t i, j, outlen, inlen;
+ uint8_t in[1024], md[64], key[64];
+ blake2b_ctx ctx;
+
+ // 256-bit hash for testing
+ if (blake2b_init(&ctx, 32, NULL, 0))
+ return -1;
+
+ for (i = 0; i < 4; i++) {
+ outlen = b2b_md_len[i];
+ for (j = 0; j < 6; j++) {
+ inlen = b2b_in_len[j];
+
+ selftest_seq(in, inlen, inlen); // unkeyed hash
+ blake2b(md, outlen, NULL, 0, in, inlen);
+ blake2b_update(&ctx, md, outlen); // hash the hash
+
+ selftest_seq(key, outlen, outlen); // keyed hash
+ blake2b(md, outlen, key, outlen, in, inlen);
+ blake2b_update(&ctx, md, outlen); // hash the hash
+ }
+ }
+
+ // compute and compare the hash of hashes
+ blake2b_final(&ctx, md);
+ for (i = 0; i < 32; i++) {
+ if (md[i] != blake2b_res[i])
+ return -1;
+ }
+
+ return 0;
+
+
+
+Saarinen & Aumasson Informational [Page 27]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ }
+
+ // BLAKE2s self-test validation. Return 0 when OK.
+
+ int blake2s_selftest()
+ {
+ // Grand hash of hash results.
+ const uint8_t blake2s_res[32] = {
+ 0x6A, 0x41, 0x1F, 0x08, 0xCE, 0x25, 0xAD, 0xCD,
+ 0xFB, 0x02, 0xAB, 0xA6, 0x41, 0x45, 0x1C, 0xEC,
+ 0x53, 0xC5, 0x98, 0xB2, 0x4F, 0x4F, 0xC7, 0x87,
+ 0xFB, 0xDC, 0x88, 0x79, 0x7F, 0x4C, 0x1D, 0xFE
+ };
+ // Parameter sets.
+ const size_t b2s_md_len[4] = { 16, 20, 28, 32 };
+ const size_t b2s_in_len[6] = { 0, 3, 64, 65, 255, 1024 };
+
+ size_t i, j, outlen, inlen;
+ uint8_t in[1024], md[32], key[32];
+ blake2s_ctx ctx;
+
+ // 256-bit hash for testing.
+ if (blake2s_init(&ctx, 32, NULL, 0))
+ return -1;
+
+ for (i = 0; i < 4; i++) {
+ outlen = b2s_md_len[i];
+ for (j = 0; j < 6; j++) {
+ inlen = b2s_in_len[j];
+
+ selftest_seq(in, inlen, inlen); // unkeyed hash
+ blake2s(md, outlen, NULL, 0, in, inlen);
+ blake2s_update(&ctx, md, outlen); // hash the hash
+
+ selftest_seq(key, outlen, outlen); // keyed hash
+ blake2s(md, outlen, key, outlen, in, inlen);
+ blake2s_update(&ctx, md, outlen); // hash the hash
+ }
+ }
+
+ // Compute and compare the hash of hashes.
+ blake2s_final(&ctx, md);
+ for (i = 0; i < 32; i++) {
+ if (md[i] != blake2s_res[i])
+ return -1;
+ }
+
+ return 0;
+
+
+
+Saarinen & Aumasson Informational [Page 28]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+ }
+
+ // Test driver.
+
+ int main(int argc, char **argv)
+ {
+ printf("blake2b_selftest() = %s\n",
+ blake2b_selftest() ? "FAIL" : "OK");
+ printf("blake2s_selftest() = %s\n",
+ blake2s_selftest() ? "FAIL" : "OK");
+
+ return 0;
+ }
+ <CODE ENDS>
+
+Acknowledgements
+
+ The editor wishes to thank the [BLAKE2] team for their encouragement:
+ Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn, and
+ Christian Winnerlein. We have borrowed passages from [BLAKE] and
+ [BLAKE2] with permission.
+
+ [BLAKE2] is based on the SHA-3 proposal [BLAKE], designed by Jean-
+ Philippe Aumasson, Luca Henzen, Willi Meier, and Raphael C.-W. Phan.
+ BLAKE2, like BLAKE, relies on a core algorithm borrowed from the
+ ChaCha stream cipher, designed by Daniel J. Bernstein.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 29]
+
+RFC 7693 BLAKE2 Crypto Hash and MAC November 2015
+
+
+Authors' Addresses
+
+ Markku-Juhani O. Saarinen (editor)
+ Queen's University Belfast
+ Centre for Secure Information Technologies, ECIT
+ Northern Ireland Science Park
+ Queen's Road, Queen's Island
+ Belfast BT3 9DT
+ United Kingdom
+
+ Email: m.saarinen@qub.ac.uk
+ URI: http://www.csit.qub.ac.uk
+
+
+ Jean-Philippe Aumasson
+ Kudelski Security
+ 22-24, Route de Geneve
+ Case Postale 134
+ Cheseaux 1033
+ Switzerland
+
+ Email: jean-philippe.aumasson@nagra.com
+ URI: https://www.kudelskisecurity.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Saarinen & Aumasson Informational [Page 30]
+
diff --git a/lib/endian.h b/lib/endian.h
new file mode 100644
index 0000000..70bc5f7
--- /dev/null
+++ b/lib/endian.h
@@ -0,0 +1,17 @@
+//=====================================================================
+// spdx-license-identifier: ISC
+//=====================================================================
+
+#pragma once
+
+#include <stdint.h>
+
+// These functions convert the byte encoding of integer values from host byte order to and from little-endian and
+// big-endian byte order
+uint16_t htole16(uint16_t host_16b);
+uint32_t htole32(uint32_t host_32b);
+uint64_t htole64(uint64_t host_64b);
+
+uint16_t htobe16(uint16_t host_16b);
+uint32_t htobe32(uint32_t host_32b);
+uint64_t htobe64(uint64_t host_64b);
diff --git a/lib/endian/little.c b/lib/endian/little.c
new file mode 100644
index 0000000..042bb55
--- /dev/null
+++ b/lib/endian/little.c
@@ -0,0 +1,43 @@
+//=====================================================================
+// spdx-license-identifier: ISC
+//=====================================================================
+
+#include "endian.h"
+
+#if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
+#error little.c included in build on big endian target
+#endif
+
+uint16_t
+htole16(uint16_t host_16b)
+{
+ return host_16b;
+}
+
+uint32_t
+htole32(uint32_t host_32b)
+{
+ return host_32b;
+}
+
+uint64_t
+htole64(uint64_t host_64b)
+{
+ return host_64b;
+}
+
+uint16_t
+htobe16(uint16_t host_16b)
+{
+ return __builtin_bswap16(host_16b);
+}
+uint32_t
+htobe32(uint32_t host_32b)
+{
+ return __builtin_bswap32(host_32b);
+}
+uint64_t
+htobe64(uint64_t host_64b)
+{
+ return __builtin_bswap64(host_64b);
+}
diff --git a/lib/tst/blake2s_genkat.py b/lib/tst/blake2s_genkat.py
new file mode 100755
index 0000000..2dd5370
--- /dev/null
+++ b/lib/tst/blake2s_genkat.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python3
+# Known Answer Test generator
+
+import json
+import hashlib
+import secrets
+
+def blake2s(w, key):
+ ctx = hashlib.blake2s(key=key)
+ ctx.update(w)
+ return ctx.digest().hex()
+
+def out(s):
+ o = [s[i:i+2] for i in range(0, len(s), 2)] # split into pairs
+ o = [f'0x{i}' for i in o] # prepend 0x and join
+ return ', '.join(o)
+
+if __name__ == '__main__':
+ w = b''
+ for i in range(0, 256):
+ w += i.to_bytes(1, 'little')
+ k = secrets.token_bytes(32)
+
+ print('#pragma once\n')
+ print(f'static const unsigned KATs_len = 256;')
+ print(f'static const uint8_t KAT_secret[32] = {{ {", ".join([hex(i) for i in k])} }};')
+
+ print(f'static const uint8_t KATs[256][32] = {{')
+ for i in range(0, 256):
+ o = blake2s(w[0:i], b'')
+ print(f' // {i}')
+ print(f' {{ {out(o)} }},')
+ print(f'}};')
+
+ print(f'static const uint8_t secret_KATs[256][32] = {{')
+ for i in range(0, 256):
+ o = blake2s(w[0:i], k)
+ print(f' // {i}')
+ print(f' {{ {out(o)} }},')
+ print(f'}};')
diff --git a/lib/tst/blake2s_kat.h b/lib/tst/blake2s_kat.h
new file mode 100644
index 0000000..aa42ef5
--- /dev/null
+++ b/lib/tst/blake2s_kat.h
@@ -0,0 +1,1032 @@
+#pragma once
+
+static const unsigned KATs_len = 256;
+static const uint8_t KAT_secret[32] = { 0xba, 0x80, 0xfb, 0x8f, 0x1b, 0x7b, 0xa1, 0x49, 0x3c, 0x6a, 0xe8, 0x8f, 0xd, 0x66, 0xa1, 0xae, 0xff, 0xa2, 0x5c, 0x8a, 0x7d, 0x4c, 0x1f, 0xb6, 0x81, 0x1, 0xb5, 0xe4, 0xc2, 0x8e, 0x37, 0x3 };
+static const uint8_t KATs[256][32] = {
+ // 0
+ { 0x69, 0x21, 0x7a, 0x30, 0x79, 0x90, 0x80, 0x94, 0xe1, 0x11, 0x21, 0xd0, 0x42, 0x35, 0x4a, 0x7c, 0x1f, 0x55, 0xb6, 0x48, 0x2c, 0xa1, 0xa5, 0x1e, 0x1b, 0x25, 0x0d, 0xfd, 0x1e, 0xd0, 0xee, 0xf9 },
+ // 1
+ { 0xe3, 0x4d, 0x74, 0xdb, 0xaf, 0x4f, 0xf4, 0xc6, 0xab, 0xd8, 0x71, 0xcc, 0x22, 0x04, 0x51, 0xd2, 0xea, 0x26, 0x48, 0x84, 0x6c, 0x77, 0x57, 0xfb, 0xaa, 0xc8, 0x2f, 0xe5, 0x1a, 0xd6, 0x4b, 0xea },
+ // 2
+ { 0xdd, 0xad, 0x9a, 0xb1, 0x5d, 0xac, 0x45, 0x49, 0xba, 0x42, 0xf4, 0x9d, 0x26, 0x24, 0x96, 0xbe, 0xf6, 0xc0, 0xba, 0xe1, 0xdd, 0x34, 0x2a, 0x88, 0x08, 0xf8, 0xea, 0x26, 0x7c, 0x6e, 0x21, 0x0c },
+ // 3
+ { 0xe8, 0xf9, 0x1c, 0x6e, 0xf2, 0x32, 0xa0, 0x41, 0x45, 0x2a, 0xb0, 0xe1, 0x49, 0x07, 0x0c, 0xdd, 0x7d, 0xd1, 0x76, 0x9e, 0x75, 0xb3, 0xa5, 0x92, 0x1b, 0xe3, 0x78, 0x76, 0xc4, 0x5c, 0x99, 0x00 },
+ // 4
+ { 0x0c, 0xc7, 0x0e, 0x00, 0x34, 0x8b, 0x86, 0xba, 0x29, 0x44, 0xd0, 0xc3, 0x20, 0x38, 0xb2, 0x5c, 0x55, 0x58, 0x4f, 0x90, 0xdf, 0x23, 0x04, 0xf5, 0x5f, 0xa3, 0x32, 0xaf, 0x5f, 0xb0, 0x1e, 0x20 },
+ // 5
+ { 0xec, 0x19, 0x64, 0x19, 0x10, 0x87, 0xa4, 0xfe, 0x9d, 0xf1, 0xc7, 0x95, 0x34, 0x2a, 0x02, 0xff, 0xc1, 0x91, 0xa5, 0xb2, 0x51, 0x76, 0x48, 0x56, 0xae, 0x5b, 0x8b, 0x57, 0x69, 0xf0, 0xc6, 0xcd },
+ // 6
+ { 0xe1, 0xfa, 0x51, 0x61, 0x8d, 0x7d, 0xf4, 0xeb, 0x70, 0xcf, 0x0d, 0x5a, 0x9e, 0x90, 0x6f, 0x80, 0x6e, 0x9d, 0x19, 0xf7, 0xf4, 0xf0, 0x1e, 0x3b, 0x62, 0x12, 0x88, 0xe4, 0x12, 0x04, 0x05, 0xd6 },
+ // 7
+ { 0x59, 0x80, 0x01, 0xfa, 0xfb, 0xe8, 0xf9, 0x4e, 0xc6, 0x6d, 0xc8, 0x27, 0xd0, 0x12, 0xcf, 0xcb, 0xba, 0x22, 0x28, 0x56, 0x9f, 0x44, 0x8e, 0x89, 0xea, 0x22, 0x08, 0xc8, 0xbf, 0x76, 0x92, 0x93 },
+ // 8
+ { 0xc7, 0xe8, 0x87, 0xb5, 0x46, 0x62, 0x36, 0x35, 0xe9, 0x3e, 0x04, 0x95, 0x59, 0x8f, 0x17, 0x26, 0x82, 0x19, 0x96, 0xc2, 0x37, 0x77, 0x05, 0xb9, 0x3a, 0x1f, 0x63, 0x6f, 0x87, 0x2b, 0xfa, 0x2d },
+ // 9
+ { 0xc3, 0x15, 0xa4, 0x37, 0xdd, 0x28, 0x06, 0x2a, 0x77, 0x0d, 0x48, 0x19, 0x67, 0x13, 0x6b, 0x1b, 0x5e, 0xb8, 0x8b, 0x21, 0xee, 0x53, 0xd0, 0x32, 0x9c, 0x58, 0x97, 0x12, 0x6e, 0x9d, 0xb0, 0x2c },
+ // 10
+ { 0xbb, 0x47, 0x3d, 0xed, 0xdc, 0x05, 0x5f, 0xea, 0x62, 0x28, 0xf2, 0x07, 0xda, 0x57, 0x53, 0x47, 0xbb, 0x00, 0x40, 0x4c, 0xd3, 0x49, 0xd3, 0x8c, 0x18, 0x02, 0x63, 0x07, 0xa2, 0x24, 0xcb, 0xff },
+ // 11
+ { 0x68, 0x7e, 0x18, 0x73, 0xa8, 0x27, 0x75, 0x91, 0xbb, 0x33, 0xd9, 0xad, 0xf9, 0xa1, 0x39, 0x12, 0xef, 0xef, 0xe5, 0x57, 0xca, 0xfc, 0x39, 0xa7, 0x95, 0x26, 0x23, 0xe4, 0x72, 0x55, 0xf1, 0x6d },
+ // 12
+ { 0x1a, 0xc7, 0xba, 0x75, 0x4d, 0x6e, 0x2f, 0x94, 0xe0, 0xe8, 0x6c, 0x46, 0xbf, 0xb2, 0x62, 0xab, 0xbb, 0x74, 0xf4, 0x50, 0xef, 0x45, 0x6d, 0x6b, 0x4d, 0x97, 0xaa, 0x80, 0xce, 0x6d, 0xa7, 0x67 },
+ // 13
+ { 0x01, 0x2c, 0x97, 0x80, 0x96, 0x14, 0x81, 0x6b, 0x5d, 0x94, 0x94, 0x47, 0x7d, 0x4b, 0x68, 0x7d, 0x15, 0xb9, 0x6e, 0xb6, 0x9c, 0x0e, 0x80, 0x74, 0xa8, 0x51, 0x6f, 0x31, 0x22, 0x4b, 0x5c, 0x98 },
+ // 14
+ { 0x91, 0xff, 0xd2, 0x6c, 0xfa, 0x4d, 0xa5, 0x13, 0x4c, 0x7e, 0xa2, 0x62, 0xf7, 0x88, 0x9c, 0x32, 0x9f, 0x61, 0xf6, 0xa6, 0x57, 0x22, 0x5c, 0xc2, 0x12, 0xf4, 0x00, 0x56, 0xd9, 0x86, 0xb3, 0xf4 },
+ // 15
+ { 0xd9, 0x7c, 0x82, 0x8d, 0x81, 0x82, 0xa7, 0x21, 0x80, 0xa0, 0x6a, 0x78, 0x26, 0x83, 0x30, 0x67, 0x3f, 0x7c, 0x4e, 0x06, 0x35, 0x94, 0x7c, 0x04, 0xc0, 0x23, 0x23, 0xfd, 0x45, 0xc0, 0xa5, 0x2d },
+ // 16
+ { 0xef, 0xc0, 0x4c, 0xdc, 0x39, 0x1c, 0x7e, 0x91, 0x19, 0xbd, 0x38, 0x66, 0x8a, 0x53, 0x4e, 0x65, 0xfe, 0x31, 0x03, 0x6d, 0x6a, 0x62, 0x11, 0x2e, 0x44, 0xeb, 0xeb, 0x11, 0xf9, 0xc5, 0x70, 0x80 },
+ // 17
+ { 0x99, 0x2c, 0xf5, 0xc0, 0x53, 0x44, 0x2a, 0x5f, 0xbc, 0x4f, 0xaf, 0x58, 0x3e, 0x04, 0xe5, 0x0b, 0xb7, 0x0d, 0x2f, 0x39, 0xfb, 0xb6, 0xa5, 0x03, 0xf8, 0x9e, 0x56, 0xa6, 0x3e, 0x18, 0x57, 0x8a },
+ // 18
+ { 0x38, 0x64, 0x0e, 0x9f, 0x21, 0x98, 0x3e, 0x67, 0xb5, 0x39, 0xca, 0xcc, 0xae, 0x5e, 0xcf, 0x61, 0x5a, 0xe2, 0x76, 0x4f, 0x75, 0xa0, 0x9c, 0x9c, 0x59, 0xb7, 0x64, 0x83, 0xc1, 0xfb, 0xc7, 0x35 },
+ // 19
+ { 0x21, 0x3d, 0xd3, 0x4c, 0x7e, 0xfe, 0x4f, 0xb2, 0x7a, 0x6b, 0x35, 0xf6, 0xb4, 0x00, 0x0d, 0x1f, 0xe0, 0x32, 0x81, 0xaf, 0x3c, 0x72, 0x3e, 0x5c, 0x9f, 0x94, 0x74, 0x7a, 0x5f, 0x31, 0xcd, 0x3b },
+ // 20
+ { 0xec, 0x24, 0x6e, 0xee, 0xb9, 0xce, 0xd3, 0xf7, 0xad, 0x33, 0xed, 0x28, 0x66, 0x0d, 0xd9, 0xbb, 0x07, 0x32, 0x51, 0x3d, 0xb4, 0xe2, 0xfa, 0x27, 0x8b, 0x60, 0xcd, 0xe3, 0x68, 0x2a, 0x4c, 0xcd },
+ // 21
+ { 0xac, 0x9b, 0x61, 0xd4, 0x46, 0x64, 0x8c, 0x30, 0x05, 0xd7, 0x89, 0x2b, 0xf3, 0xa8, 0x71, 0x9f, 0x4c, 0x81, 0x81, 0xcf, 0xdc, 0xbc, 0x2b, 0x79, 0xfe, 0xf1, 0x0a, 0x27, 0x9b, 0x91, 0x10, 0x95 },
+ // 22
+ { 0x7b, 0xf8, 0xb2, 0x29, 0x59, 0xe3, 0x4e, 0x3a, 0x43, 0xf7, 0x07, 0x92, 0x23, 0xe8, 0x3a, 0x97, 0x54, 0x61, 0x7d, 0x39, 0x1e, 0x21, 0x3d, 0xfd, 0x80, 0x8e, 0x41, 0xb9, 0xbe, 0xad, 0x4c, 0xe7 },
+ // 23
+ { 0x68, 0xd4, 0xb5, 0xd4, 0xfa, 0x0e, 0x30, 0x2b, 0x64, 0xcc, 0xc5, 0xaf, 0x79, 0x29, 0x13, 0xac, 0x4c, 0x88, 0xec, 0x95, 0xc0, 0x7d, 0xdf, 0x40, 0x69, 0x42, 0x56, 0xeb, 0x88, 0xce, 0x9f, 0x3d },
+ // 24
+ { 0xb2, 0xc2, 0x42, 0x0f, 0x05, 0xf9, 0xab, 0xe3, 0x63, 0x15, 0x91, 0x93, 0x36, 0xb3, 0x7e, 0x4e, 0x0f, 0xa3, 0x3f, 0xf7, 0xe7, 0x6a, 0x49, 0x27, 0x67, 0x00, 0x6f, 0xdb, 0x5d, 0x93, 0x54, 0x62 },
+ // 25
+ { 0x13, 0x4f, 0x61, 0xbb, 0xd0, 0xbb, 0xb6, 0x9a, 0xed, 0x53, 0x43, 0x90, 0x45, 0x51, 0xa3, 0xe6, 0xc1, 0xaa, 0x7d, 0xcd, 0xd7, 0x7e, 0x90, 0x3e, 0x70, 0x23, 0xeb, 0x7c, 0x60, 0x32, 0x0a, 0xa7 },
+ // 26
+ { 0x46, 0x93, 0xf9, 0xbf, 0xf7, 0xd4, 0xf3, 0x98, 0x6a, 0x7d, 0x17, 0x6e, 0x6e, 0x06, 0xf7, 0x2a, 0xd1, 0x49, 0x0d, 0x80, 0x5c, 0x99, 0xe2, 0x53, 0x47, 0xb8, 0xde, 0x77, 0xb4, 0xdb, 0x6d, 0x9b },
+ // 27
+ { 0x85, 0x3e, 0x26, 0xf7, 0x41, 0x95, 0x3b, 0x0f, 0xd5, 0xbd, 0xb4, 0x24, 0xe8, 0xab, 0x9e, 0x8b, 0x37, 0x50, 0xea, 0xa8, 0xef, 0x61, 0xe4, 0x79, 0x02, 0xc9, 0x1e, 0x55, 0x4e, 0x9c, 0x73, 0xb9 },
+ // 28
+ { 0xf7, 0xde, 0x53, 0x63, 0x61, 0xab, 0xaa, 0x0e, 0x15, 0x81, 0x56, 0xcf, 0x0e, 0xa4, 0xf6, 0x3a, 0x99, 0xb5, 0xe4, 0x05, 0x4f, 0x8f, 0xa4, 0xc9, 0xd4, 0x5f, 0x62, 0x85, 0xca, 0xd5, 0x56, 0x94 },
+ // 29
+ { 0x4c, 0x23, 0x06, 0x08, 0x86, 0x0a, 0x99, 0xae, 0x8d, 0x7b, 0xd5, 0xc2, 0xcc, 0x17, 0xfa, 0x52, 0x09, 0x6b, 0x9a, 0x61, 0xbe, 0xdb, 0x17, 0xcb, 0x76, 0x17, 0x86, 0x4a, 0xd2, 0x9c, 0xa7, 0xa6 },
+ // 30
+ { 0xae, 0xb9, 0x20, 0xea, 0x87, 0x95, 0x2d, 0xad, 0xb1, 0xfb, 0x75, 0x92, 0x91, 0xe3, 0x38, 0x81, 0x39, 0xa8, 0x72, 0x86, 0x50, 0x01, 0x88, 0x6e, 0xd8, 0x47, 0x52, 0xe9, 0x3c, 0x25, 0x0c, 0x2a },
+ // 31
+ { 0xab, 0xa4, 0xad, 0x9b, 0x48, 0x0b, 0x9d, 0xf3, 0xd0, 0x8c, 0xa5, 0xe8, 0x7b, 0x0c, 0x24, 0x40, 0xd4, 0xe4, 0xea, 0x21, 0x22, 0x4c, 0x2e, 0xb4, 0x2c, 0xba, 0xe4, 0x69, 0xd0, 0x89, 0xb9, 0x31 },
+ // 32
+ { 0x05, 0x82, 0x56, 0x07, 0xd7, 0xfd, 0xf2, 0xd8, 0x2e, 0xf4, 0xc3, 0xc8, 0xc2, 0xae, 0xa9, 0x61, 0xad, 0x98, 0xd6, 0x0e, 0xdf, 0xf7, 0xd0, 0x18, 0x98, 0x3e, 0x21, 0x20, 0x4c, 0x0d, 0x93, 0xd1 },
+ // 33
+ { 0xa7, 0x42, 0xf8, 0xb6, 0xaf, 0x82, 0xd8, 0xa6, 0xca, 0x23, 0x57, 0xc5, 0xf1, 0xcf, 0x91, 0xde, 0xfb, 0xd0, 0x66, 0x26, 0x7d, 0x75, 0xc0, 0x48, 0xb3, 0x52, 0x36, 0x65, 0x85, 0x02, 0x59, 0x62 },
+ // 34
+ { 0x2b, 0xca, 0xc8, 0x95, 0x99, 0x00, 0x0b, 0x42, 0xc9, 0x5a, 0xe2, 0x38, 0x35, 0xa7, 0x13, 0x70, 0x4e, 0xd7, 0x97, 0x89, 0xc8, 0x4f, 0xef, 0x14, 0x9a, 0x87, 0x4f, 0xf7, 0x33, 0xf0, 0x17, 0xa2 },
+ // 35
+ { 0xac, 0x1e, 0xd0, 0x7d, 0x04, 0x8f, 0x10, 0x5a, 0x9e, 0x5b, 0x7a, 0xb8, 0x5b, 0x09, 0xa4, 0x92, 0xd5, 0xba, 0xff, 0x14, 0xb8, 0xbf, 0xb0, 0xe9, 0xfd, 0x78, 0x94, 0x86, 0xee, 0xa2, 0xb9, 0x74 },
+ // 36
+ { 0xe4, 0x8d, 0x0e, 0xcf, 0xaf, 0x49, 0x7d, 0x5b, 0x27, 0xc2, 0x5d, 0x99, 0xe1, 0x56, 0xcb, 0x05, 0x79, 0xd4, 0x40, 0xd6, 0xe3, 0x1f, 0xb6, 0x24, 0x73, 0x69, 0x6d, 0xbf, 0x95, 0xe0, 0x10, 0xe4 },
+ // 37
+ { 0x12, 0xa9, 0x1f, 0xad, 0xf8, 0xb2, 0x16, 0x44, 0xfd, 0x0f, 0x93, 0x4f, 0x3c, 0x4a, 0x8f, 0x62, 0xba, 0x86, 0x2f, 0xfd, 0x20, 0xe8, 0xe9, 0x61, 0x15, 0x4c, 0x15, 0xc1, 0x38, 0x84, 0xed, 0x3d },
+ // 38
+ { 0x7c, 0xbe, 0xe9, 0x6e, 0x13, 0x98, 0x97, 0xdc, 0x98, 0xfb, 0xef, 0x3b, 0xe8, 0x1a, 0xd4, 0xd9, 0x64, 0xd2, 0x35, 0xcb, 0x12, 0x14, 0x1f, 0xb6, 0x67, 0x27, 0xe6, 0xe5, 0xdf, 0x73, 0xa8, 0x78 },
+ // 39
+ { 0xeb, 0xf6, 0x6a, 0xbb, 0x59, 0x7a, 0xe5, 0x72, 0xa7, 0x29, 0x7c, 0xb0, 0x87, 0x1e, 0x35, 0x5a, 0xcc, 0xaf, 0xad, 0x83, 0x77, 0xb8, 0xe7, 0x8b, 0xf1, 0x64, 0xce, 0x2a, 0x18, 0xde, 0x4b, 0xaf },
+ // 40
+ { 0x71, 0xb9, 0x33, 0xb0, 0x7e, 0x4f, 0xf7, 0x81, 0x8c, 0xe0, 0x59, 0xd0, 0x08, 0x82, 0x9e, 0x45, 0x3c, 0x6f, 0xf0, 0x2e, 0xc0, 0xa7, 0xdb, 0x39, 0x3f, 0xc2, 0xd8, 0x70, 0xf3, 0x7a, 0x72, 0x86 },
+ // 41
+ { 0x7c, 0xf7, 0xc5, 0x13, 0x31, 0x22, 0x0b, 0x8d, 0x3e, 0xba, 0xed, 0x9c, 0x29, 0x39, 0x8a, 0x16, 0xd9, 0x81, 0x56, 0xe2, 0x61, 0x3c, 0xb0, 0x88, 0xf2, 0xb0, 0xe0, 0x8a, 0x1b, 0xe4, 0xcf, 0x4f },
+ // 42
+ { 0x3e, 0x41, 0xa1, 0x08, 0xe0, 0xf6, 0x4a, 0xd2, 0x76, 0xb9, 0x79, 0xe1, 0xce, 0x06, 0x82, 0x79, 0xe1, 0x6f, 0x7b, 0xc7, 0xe4, 0xaa, 0x1d, 0x21, 0x1e, 0x17, 0xb8, 0x11, 0x61, 0xdf, 0x16, 0x02 },
+ // 43
+ { 0x88, 0x65, 0x02, 0xa8, 0x2a, 0xb4, 0x7b, 0xa8, 0xd8, 0x67, 0x10, 0xaa, 0x9d, 0xe3, 0xd4, 0x6e, 0xa6, 0x5c, 0x47, 0xaf, 0x6e, 0xe8, 0xde, 0x45, 0x0c, 0xce, 0xb8, 0xb1, 0x1b, 0x04, 0x5f, 0x50 },
+ // 44
+ { 0xc0, 0x21, 0xbc, 0x5f, 0x09, 0x54, 0xfe, 0xe9, 0x4f, 0x46, 0xea, 0x09, 0x48, 0x7e, 0x10, 0xa8, 0x48, 0x40, 0xd0, 0x2f, 0x64, 0x81, 0x0b, 0xc0, 0x8d, 0x9e, 0x55, 0x1f, 0x7d, 0x41, 0x68, 0x14 },
+ // 45
+ { 0x20, 0x30, 0x51, 0x6e, 0x8a, 0x5f, 0xe1, 0x9a, 0xe7, 0x9c, 0x33, 0x6f, 0xce, 0x26, 0x38, 0x2a, 0x74, 0x9d, 0x3f, 0xd0, 0xec, 0x91, 0xe5, 0x37, 0xd4, 0xbd, 0x23, 0x58, 0xc1, 0x2d, 0xfb, 0x22 },
+ // 46
+ { 0x55, 0x66, 0x98, 0xda, 0xc8, 0x31, 0x7f, 0xd3, 0x6d, 0xfb, 0xdf, 0x25, 0xa7, 0x9c, 0xb1, 0x12, 0xd5, 0x42, 0x58, 0x60, 0x60, 0x5c, 0xba, 0xf5, 0x07, 0xf2, 0x3b, 0xf7, 0xe9, 0xf4, 0x2a, 0xfe },
+ // 47
+ { 0x2f, 0x86, 0x7b, 0xa6, 0x77, 0x73, 0xfd, 0xc3, 0xe9, 0x2f, 0xce, 0xd9, 0x9a, 0x64, 0x09, 0xad, 0x39, 0xd0, 0xb8, 0x80, 0xfd, 0xe8, 0xf1, 0x09, 0xa8, 0x17, 0x30, 0xc4, 0x45, 0x1d, 0x01, 0x78 },
+ // 48
+ { 0x17, 0x2e, 0xc2, 0x18, 0xf1, 0x19, 0xdf, 0xae, 0x98, 0x89, 0x6d, 0xff, 0x29, 0xdd, 0x98, 0x76, 0xc9, 0x4a, 0xf8, 0x74, 0x17, 0xf9, 0xae, 0x4c, 0x70, 0x14, 0xbb, 0x4e, 0x4b, 0x96, 0xaf, 0xc7 },
+ // 49
+ { 0x3f, 0x85, 0x81, 0x4a, 0x18, 0x19, 0x5f, 0x87, 0x9a, 0xa9, 0x62, 0xf9, 0x5d, 0x26, 0xbd, 0x82, 0xa2, 0x78, 0xf2, 0xb8, 0x23, 0x20, 0x21, 0x8f, 0x6b, 0x3b, 0xd6, 0xf7, 0xf6, 0x67, 0xa6, 0xd9 },
+ // 50
+ { 0x1b, 0x61, 0x8f, 0xba, 0xa5, 0x66, 0xb3, 0xd4, 0x98, 0xc1, 0x2e, 0x98, 0x2c, 0x9e, 0xc5, 0x2e, 0x4d, 0xa8, 0x5a, 0x8c, 0x54, 0xf3, 0x8f, 0x34, 0xc0, 0x90, 0x39, 0x4f, 0x23, 0xc1, 0x84, 0xc1 },
+ // 51
+ { 0x0c, 0x75, 0x8f, 0xb5, 0x69, 0x2f, 0xfd, 0x41, 0xa3, 0x57, 0x5d, 0x0a, 0xf0, 0x0c, 0xc7, 0xfb, 0xf2, 0xcb, 0xe5, 0x90, 0x5a, 0x58, 0x32, 0x3a, 0x88, 0xae, 0x42, 0x44, 0xf6, 0xe4, 0xc9, 0x93 },
+ // 52
+ { 0xa9, 0x31, 0x36, 0x0c, 0xad, 0x62, 0x8c, 0x7f, 0x12, 0xa6, 0xc1, 0xc4, 0xb7, 0x53, 0xb0, 0xf4, 0x06, 0x2a, 0xef, 0x3c, 0xe6, 0x5a, 0x1a, 0xe3, 0xf1, 0x93, 0x69, 0xda, 0xdf, 0x3a, 0xe2, 0x3d },
+ // 53
+ { 0xcb, 0xac, 0x7d, 0x77, 0x3b, 0x1e, 0x3b, 0x3c, 0x66, 0x91, 0xd7, 0xab, 0xb7, 0xe9, 0xdf, 0x04, 0x5c, 0x8b, 0xa1, 0x92, 0x68, 0xde, 0xd1, 0x53, 0x20, 0x7f, 0x5e, 0x80, 0x43, 0x52, 0xec, 0x5d },
+ // 54
+ { 0x23, 0xa1, 0x96, 0xd3, 0x80, 0x2e, 0xd3, 0xc1, 0xb3, 0x84, 0x01, 0x9a, 0x82, 0x32, 0x58, 0x40, 0xd3, 0x2f, 0x71, 0x95, 0x0c, 0x45, 0x80, 0xb0, 0x34, 0x45, 0xe0, 0x89, 0x8e, 0x14, 0x05, 0x3c },
+ // 55
+ { 0xf4, 0x49, 0x54, 0x70, 0xf2, 0x26, 0xc8, 0xc2, 0x14, 0xbe, 0x08, 0xfd, 0xfa, 0xd4, 0xbc, 0x4a, 0x2a, 0x9d, 0xbe, 0xa9, 0x13, 0x6a, 0x21, 0x0d, 0xf0, 0xd4, 0xb6, 0x49, 0x29, 0xe6, 0xfc, 0x14 },
+ // 56
+ { 0xe2, 0x90, 0xdd, 0x27, 0x0b, 0x46, 0x7f, 0x34, 0xab, 0x1c, 0x00, 0x2d, 0x34, 0x0f, 0xa0, 0x16, 0x25, 0x7f, 0xf1, 0x9e, 0x58, 0x33, 0xfd, 0xbb, 0xf2, 0xcb, 0x40, 0x1c, 0x3b, 0x28, 0x17, 0xde },
+ // 57
+ { 0x9f, 0xc7, 0xb5, 0xde, 0xd3, 0xc1, 0x50, 0x42, 0xb2, 0xa6, 0x58, 0x2d, 0xc3, 0x9b, 0xe0, 0x16, 0xd2, 0x4a, 0x68, 0x2d, 0x5e, 0x61, 0xad, 0x1e, 0xff, 0x9c, 0x63, 0x30, 0x98, 0x48, 0xf7, 0x06 },
+ // 58
+ { 0x8c, 0xca, 0x67, 0xa3, 0x6d, 0x17, 0xd5, 0xe6, 0x34, 0x1c, 0xb5, 0x92, 0xfd, 0x7b, 0xef, 0x99, 0x26, 0xc9, 0xe3, 0xaa, 0x10, 0x27, 0xea, 0x11, 0xa7, 0xd8, 0xbd, 0x26, 0x0b, 0x57, 0x6e, 0x04 },
+ // 59
+ { 0x40, 0x93, 0x92, 0xf5, 0x60, 0xf8, 0x68, 0x31, 0xda, 0x43, 0x73, 0xee, 0x5e, 0x00, 0x74, 0x26, 0x05, 0x95, 0xd7, 0xbc, 0x24, 0x18, 0x3b, 0x60, 0xed, 0x70, 0x0d, 0x45, 0x83, 0xd3, 0xf6, 0xf0 },
+ // 60
+ { 0x28, 0x02, 0x16, 0x5d, 0xe0, 0x90, 0x91, 0x55, 0x46, 0xf3, 0x39, 0x8c, 0xd8, 0x49, 0x16, 0x4a, 0x19, 0xf9, 0x2a, 0xdb, 0xc3, 0x61, 0xad, 0xc9, 0x9b, 0x0f, 0x20, 0xc8, 0xea, 0x07, 0x10, 0x54 },
+ // 61
+ { 0xad, 0x83, 0x91, 0x68, 0xd9, 0xf8, 0xa4, 0xbe, 0x95, 0xba, 0x9e, 0xf9, 0xa6, 0x92, 0xf0, 0x72, 0x56, 0xae, 0x43, 0xfe, 0x6f, 0x98, 0x64, 0xe2, 0x90, 0x69, 0x1b, 0x02, 0x56, 0xce, 0x50, 0xa9 },
+ // 62
+ { 0x75, 0xfd, 0xaa, 0x50, 0x38, 0xc2, 0x84, 0xb8, 0x6d, 0x6e, 0x8a, 0xff, 0xe8, 0xb2, 0x80, 0x7e, 0x46, 0x7b, 0x86, 0x60, 0x0e, 0x79, 0xaf, 0x36, 0x89, 0xfb, 0xc0, 0x63, 0x28, 0xcb, 0xf8, 0x94 },
+ // 63
+ { 0xe5, 0x7c, 0xb7, 0x94, 0x87, 0xdd, 0x57, 0x90, 0x24, 0x32, 0xb2, 0x50, 0x73, 0x38, 0x13, 0xbd, 0x96, 0xa8, 0x4e, 0xfc, 0xe5, 0x9f, 0x65, 0x0f, 0xac, 0x26, 0xe6, 0x69, 0x6a, 0xef, 0xaf, 0xc3 },
+ // 64
+ { 0x56, 0xf3, 0x4e, 0x8b, 0x96, 0x55, 0x7e, 0x90, 0xc1, 0xf2, 0x4b, 0x52, 0xd0, 0xc8, 0x9d, 0x51, 0x08, 0x6a, 0xcf, 0x1b, 0x00, 0xf6, 0x34, 0xcf, 0x1d, 0xde, 0x92, 0x33, 0xb8, 0xea, 0xaa, 0x3e },
+ // 65
+ { 0x1b, 0x53, 0xee, 0x94, 0xaa, 0xf3, 0x4e, 0x4b, 0x15, 0x9d, 0x48, 0xde, 0x35, 0x2c, 0x7f, 0x06, 0x61, 0xd0, 0xa4, 0x0e, 0xdf, 0xf9, 0x5a, 0x0b, 0x16, 0x39, 0xb4, 0x09, 0x0e, 0x97, 0x44, 0x72 },
+ // 66
+ { 0x05, 0x70, 0x5e, 0x2a, 0x81, 0x75, 0x7c, 0x14, 0xbd, 0x38, 0x3e, 0xa9, 0x8d, 0xda, 0x54, 0x4e, 0xb1, 0x0e, 0x6b, 0xc0, 0x7b, 0xae, 0x43, 0x5e, 0x25, 0x18, 0xdb, 0xe1, 0x33, 0x52, 0x53, 0x75 },
+ // 67
+ { 0xd8, 0xb2, 0x86, 0x6e, 0x8a, 0x30, 0x9d, 0xb5, 0x3e, 0x52, 0x9e, 0xc3, 0x29, 0x11, 0xd8, 0x2f, 0x5c, 0xa1, 0x6c, 0xff, 0x76, 0x21, 0x68, 0x91, 0xa9, 0x67, 0x6a, 0xa3, 0x1a, 0xaa, 0x6c, 0x42 },
+ // 68
+ { 0xf5, 0x04, 0x1c, 0x24, 0x12, 0x70, 0xeb, 0x04, 0xc7, 0x1e, 0xc2, 0xc9, 0x5d, 0x4c, 0x38, 0xd8, 0x03, 0xb1, 0x23, 0x7b, 0x0f, 0x29, 0xfd, 0x4d, 0xb3, 0xeb, 0x39, 0x76, 0x69, 0xe8, 0x86, 0x99 },
+ // 69
+ { 0x9a, 0x4c, 0xe0, 0x77, 0xc3, 0x49, 0x32, 0x2f, 0x59, 0x5e, 0x0e, 0xe7, 0x9e, 0xd0, 0xda, 0x5f, 0xab, 0x66, 0x75, 0x2c, 0xbf, 0xef, 0x8f, 0x87, 0xd0, 0xe9, 0xd0, 0x72, 0x3c, 0x75, 0x30, 0xdd },
+ // 70
+ { 0x65, 0x7b, 0x09, 0xf3, 0xd0, 0xf5, 0x2b, 0x5b, 0x8f, 0x2f, 0x97, 0x16, 0x3a, 0x0e, 0xdf, 0x0c, 0x04, 0xf0, 0x75, 0x40, 0x8a, 0x07, 0xbb, 0xeb, 0x3a, 0x41, 0x01, 0xa8, 0x91, 0x99, 0x0d, 0x62 },
+ // 71
+ { 0x1e, 0x3f, 0x7b, 0xd5, 0xa5, 0x8f, 0xa5, 0x33, 0x34, 0x4a, 0xa8, 0xed, 0x3a, 0xc1, 0x22, 0xbb, 0x9e, 0x70, 0xd4, 0xef, 0x50, 0xd0, 0x04, 0x53, 0x08, 0x21, 0x94, 0x8f, 0x5f, 0xe6, 0x31, 0x5a },
+ // 72
+ { 0x80, 0xdc, 0xcf, 0x3f, 0xd8, 0x3d, 0xfd, 0x0d, 0x35, 0xaa, 0x28, 0x58, 0x59, 0x22, 0xab, 0x89, 0xd5, 0x31, 0x39, 0x97, 0x67, 0x3e, 0xaf, 0x90, 0x5c, 0xea, 0x9c, 0x0b, 0x22, 0x5c, 0x7b, 0x5f },
+ // 73
+ { 0x8a, 0x0d, 0x0f, 0xbf, 0x63, 0x77, 0xd8, 0x3b, 0xb0, 0x8b, 0x51, 0x4b, 0x4b, 0x1c, 0x43, 0xac, 0xc9, 0x5d, 0x75, 0x17, 0x14, 0xf8, 0x92, 0x56, 0x45, 0xcb, 0x6b, 0xc8, 0x56, 0xca, 0x15, 0x0a },
+ // 74
+ { 0x9f, 0xa5, 0xb4, 0x87, 0x73, 0x8a, 0xd2, 0x84, 0x4c, 0xc6, 0x34, 0x8a, 0x90, 0x19, 0x18, 0xf6, 0x59, 0xa3, 0xb8, 0x9e, 0x9c, 0x0d, 0xfe, 0xea, 0xd3, 0x0d, 0xd9, 0x4b, 0xcf, 0x42, 0xef, 0x8e },
+ // 75
+ { 0x80, 0x83, 0x2c, 0x4a, 0x16, 0x77, 0xf5, 0xea, 0x25, 0x60, 0xf6, 0x68, 0xe9, 0x35, 0x4d, 0xd3, 0x69, 0x97, 0xf0, 0x37, 0x28, 0xcf, 0xa5, 0x5e, 0x1b, 0x38, 0x33, 0x7c, 0x0c, 0x9e, 0xf8, 0x18 },
+ // 76
+ { 0xab, 0x37, 0xdd, 0xb6, 0x83, 0x13, 0x7e, 0x74, 0x08, 0x0d, 0x02, 0x6b, 0x59, 0x0b, 0x96, 0xae, 0x9b, 0xb4, 0x47, 0x72, 0x2f, 0x30, 0x5a, 0x5a, 0xc5, 0x70, 0xec, 0x1d, 0xf9, 0xb1, 0x74, 0x3c },
+ // 77
+ { 0x3e, 0xe7, 0x35, 0xa6, 0x94, 0xc2, 0x55, 0x9b, 0x69, 0x3a, 0xa6, 0x86, 0x29, 0x36, 0x1e, 0x15, 0xd1, 0x22, 0x65, 0xad, 0x6a, 0x3d, 0xed, 0xf4, 0x88, 0xb0, 0xb0, 0x0f, 0xac, 0x97, 0x54, 0xba },
+ // 78
+ { 0xd6, 0xfc, 0xd2, 0x32, 0x19, 0xb6, 0x47, 0xe4, 0xcb, 0xd5, 0xeb, 0x2d, 0x0a, 0xd0, 0x1e, 0xc8, 0x83, 0x8a, 0x4b, 0x29, 0x01, 0xfc, 0x32, 0x5c, 0xc3, 0x70, 0x19, 0x81, 0xca, 0x6c, 0x88, 0x8b },
+ // 79
+ { 0x05, 0x20, 0xec, 0x2f, 0x5b, 0xf7, 0xa7, 0x55, 0xda, 0xcb, 0x50, 0xc6, 0xbf, 0x23, 0x3e, 0x35, 0x15, 0x43, 0x47, 0x63, 0xdb, 0x01, 0x39, 0xcc, 0xd9, 0xfa, 0xef, 0xbb, 0x82, 0x07, 0x61, 0x2d },
+ // 80
+ { 0xaf, 0xf3, 0xb7, 0x5f, 0x3f, 0x58, 0x12, 0x64, 0xd7, 0x66, 0x16, 0x62, 0xb9, 0x2f, 0x5a, 0xd3, 0x7c, 0x1d, 0x32, 0xbd, 0x45, 0xff, 0x81, 0xa4, 0xed, 0x8a, 0xdc, 0x9e, 0xf3, 0x0d, 0xd9, 0x89 },
+ // 81
+ { 0xd0, 0xdd, 0x65, 0x0b, 0xef, 0xd3, 0xba, 0x63, 0xdc, 0x25, 0x10, 0x2c, 0x62, 0x7c, 0x92, 0x1b, 0x9c, 0xbe, 0xb0, 0xb1, 0x30, 0x68, 0x69, 0x35, 0xb5, 0xc9, 0x27, 0xcb, 0x7c, 0xcd, 0x5e, 0x3b },
+ // 82
+ { 0xe1, 0x14, 0x98, 0x16, 0xb1, 0x0a, 0x85, 0x14, 0xfb, 0x3e, 0x2c, 0xab, 0x2c, 0x08, 0xbe, 0xe9, 0xf7, 0x3c, 0xe7, 0x62, 0x21, 0x70, 0x12, 0x46, 0xa5, 0x89, 0xbb, 0xb6, 0x73, 0x02, 0xd8, 0xa9 },
+ // 83
+ { 0x7d, 0xa3, 0xf4, 0x41, 0xde, 0x90, 0x54, 0x31, 0x7e, 0x72, 0xb5, 0xdb, 0xf9, 0x79, 0xda, 0x01, 0xe6, 0xbc, 0xee, 0xbb, 0x84, 0x78, 0xea, 0xe6, 0xa2, 0x28, 0x49, 0xd9, 0x02, 0x92, 0x63, 0x5c },
+ // 84
+ { 0x12, 0x30, 0xb1, 0xfc, 0x8a, 0x7d, 0x92, 0x15, 0xed, 0xc2, 0xd4, 0xa2, 0xde, 0xcb, 0xdd, 0x0a, 0x6e, 0x21, 0x6c, 0x92, 0x42, 0x78, 0xc9, 0x1f, 0xc5, 0xd1, 0x0e, 0x7d, 0x60, 0x19, 0x2d, 0x94 },
+ // 85
+ { 0x57, 0x50, 0xd7, 0x16, 0xb4, 0x80, 0x8f, 0x75, 0x1f, 0xeb, 0xc3, 0x88, 0x06, 0xba, 0x17, 0x0b, 0xf6, 0xd5, 0x19, 0x9a, 0x78, 0x16, 0xbe, 0x51, 0x4e, 0x3f, 0x93, 0x2f, 0xbe, 0x0c, 0xb8, 0x71 },
+ // 86
+ { 0x6f, 0xc5, 0x9b, 0x2f, 0x10, 0xfe, 0xba, 0x95, 0x4a, 0xa6, 0x82, 0x0b, 0x3c, 0xa9, 0x87, 0xee, 0x81, 0xd5, 0xcc, 0x1d, 0xa3, 0xc6, 0x3c, 0xe8, 0x27, 0x30, 0x1c, 0x56, 0x9d, 0xfb, 0x39, 0xce },
+ // 87
+ { 0xc7, 0xc3, 0xfe, 0x1e, 0xeb, 0xdc, 0x7b, 0x5a, 0x93, 0x93, 0x26, 0xe8, 0xdd, 0xb8, 0x3e, 0x8b, 0xf2, 0xb7, 0x80, 0xb6, 0x56, 0x78, 0xcb, 0x62, 0xf2, 0x08, 0xb0, 0x40, 0xab, 0xdd, 0x35, 0xe2 },
+ // 88
+ { 0x0c, 0x75, 0xc1, 0xa1, 0x5c, 0xf3, 0x4a, 0x31, 0x4e, 0xe4, 0x78, 0xf4, 0xa5, 0xce, 0x0b, 0x8a, 0x6b, 0x36, 0x52, 0x8e, 0xf7, 0xa8, 0x20, 0x69, 0x6c, 0x3e, 0x42, 0x46, 0xc5, 0xa1, 0x58, 0x64 },
+ // 89
+ { 0x21, 0x6d, 0xc1, 0x2a, 0x10, 0x85, 0x69, 0xa3, 0xc7, 0xcd, 0xde, 0x4a, 0xed, 0x43, 0xa6, 0xc3, 0x30, 0x13, 0x9d, 0xda, 0x3c, 0xcc, 0x4a, 0x10, 0x89, 0x05, 0xdb, 0x38, 0x61, 0x89, 0x90, 0x50 },
+ // 90
+ { 0xa5, 0x7b, 0xe6, 0xae, 0x67, 0x56, 0xf2, 0x8b, 0x02, 0xf5, 0x9d, 0xad, 0xf7, 0xe0, 0xd7, 0xd8, 0x80, 0x7f, 0x10, 0xfa, 0x15, 0xce, 0xd1, 0xad, 0x35, 0x85, 0x52, 0x1a, 0x1d, 0x99, 0x5a, 0x89 },
+ // 91
+ { 0x81, 0x6a, 0xef, 0x87, 0x59, 0x53, 0x71, 0x6c, 0xd7, 0xa5, 0x81, 0xf7, 0x32, 0xf5, 0x3d, 0xd4, 0x35, 0xda, 0xb6, 0x6d, 0x09, 0xc3, 0x61, 0xd2, 0xd6, 0x59, 0x2d, 0xe1, 0x77, 0x55, 0xd8, 0xa8 },
+ // 92
+ { 0x9a, 0x76, 0x89, 0x32, 0x26, 0x69, 0x3b, 0x6e, 0xa9, 0x7e, 0x6a, 0x73, 0x8f, 0x9d, 0x10, 0xfb, 0x3d, 0x0b, 0x43, 0xae, 0x0e, 0x8b, 0x7d, 0x81, 0x23, 0xea, 0x76, 0xce, 0x97, 0x98, 0x9c, 0x7e },
+ // 93
+ { 0x8d, 0xae, 0xdb, 0x9a, 0x27, 0x15, 0x29, 0xdb, 0xb7, 0xdc, 0x3b, 0x60, 0x7f, 0xe5, 0xeb, 0x2d, 0x32, 0x11, 0x77, 0x07, 0x58, 0xdd, 0x3b, 0x0a, 0x35, 0x93, 0xd2, 0xd7, 0x95, 0x4e, 0x2d, 0x5b },
+ // 94
+ { 0x16, 0xdb, 0xc0, 0xaa, 0x5d, 0xd2, 0xc7, 0x74, 0xf5, 0x05, 0x10, 0x0f, 0x73, 0x37, 0x86, 0xd8, 0xa1, 0x75, 0xfc, 0xbb, 0xb5, 0x9c, 0x43, 0xe1, 0xfb, 0xff, 0x3e, 0x1e, 0xaf, 0x31, 0xcb, 0x4a },
+ // 95
+ { 0x86, 0x06, 0xcb, 0x89, 0x9c, 0x6a, 0xea, 0xf5, 0x1b, 0x9d, 0xb0, 0xfe, 0x49, 0x24, 0xa9, 0xfd, 0x5d, 0xab, 0xc1, 0x9f, 0x88, 0x26, 0xf2, 0xbc, 0x1c, 0x1d, 0x7d, 0xa1, 0x4d, 0x2c, 0x2c, 0x99 },
+ // 96
+ { 0x84, 0x79, 0x73, 0x1a, 0xed, 0xa5, 0x7b, 0xd3, 0x7e, 0xad, 0xb5, 0x1a, 0x50, 0x7e, 0x30, 0x7f, 0x3b, 0xd9, 0x5e, 0x69, 0xdb, 0xca, 0x94, 0xf3, 0xbc, 0x21, 0x72, 0x60, 0x66, 0xad, 0x6d, 0xfd },
+ // 97
+ { 0x58, 0x47, 0x3a, 0x9e, 0xa8, 0x2e, 0xfa, 0x3f, 0x3b, 0x3d, 0x8f, 0xc8, 0x3e, 0xd8, 0x86, 0x31, 0x27, 0xb3, 0x3a, 0xe8, 0xde, 0xae, 0x63, 0x07, 0x20, 0x1e, 0xdb, 0x6d, 0xde, 0x61, 0xde, 0x29 },
+ // 98
+ { 0x9a, 0x92, 0x55, 0xd5, 0x3a, 0xf1, 0x16, 0xde, 0x8b, 0xa2, 0x7c, 0xe3, 0x5b, 0x4c, 0x7e, 0x15, 0x64, 0x06, 0x57, 0xa0, 0xfc, 0xb8, 0x88, 0xc7, 0x0d, 0x95, 0x43, 0x1d, 0xac, 0xd8, 0xf8, 0x30 },
+ // 99
+ { 0x9e, 0xb0, 0x5f, 0xfb, 0xa3, 0x9f, 0xd8, 0x59, 0x6a, 0x45, 0x49, 0x3e, 0x18, 0xd2, 0x51, 0x0b, 0xf3, 0xef, 0x06, 0x5c, 0x51, 0xd6, 0xe1, 0x3a, 0xbe, 0x66, 0xaa, 0x57, 0xe0, 0x5c, 0xfd, 0xb7 },
+ // 100
+ { 0x81, 0xdc, 0xc3, 0xa5, 0x05, 0xea, 0xce, 0x3f, 0x87, 0x9d, 0x8f, 0x70, 0x27, 0x76, 0x77, 0x0f, 0x9d, 0xf5, 0x0e, 0x52, 0x1d, 0x14, 0x28, 0xa8, 0x5d, 0xaf, 0x04, 0xf9, 0xad, 0x21, 0x50, 0xe0 },
+ // 101
+ { 0xe3, 0xe3, 0xc4, 0xaa, 0x3a, 0xcb, 0xbc, 0x85, 0x33, 0x2a, 0xf9, 0xd5, 0x64, 0xbc, 0x24, 0x16, 0x5e, 0x16, 0x87, 0xf6, 0xb1, 0xad, 0xcb, 0xfa, 0xe7, 0x7a, 0x8f, 0x03, 0xc7, 0x2a, 0xc2, 0x8c },
+ // 102
+ { 0x67, 0x46, 0xc8, 0x0b, 0x4e, 0xb5, 0x6a, 0xea, 0x45, 0xe6, 0x4e, 0x72, 0x89, 0xbb, 0xa3, 0xed, 0xbf, 0x45, 0xec, 0xf8, 0x20, 0x64, 0x81, 0xff, 0x63, 0x02, 0x12, 0x29, 0x84, 0xcd, 0x52, 0x6a },
+ // 103
+ { 0x2b, 0x62, 0x8e, 0x52, 0x76, 0x4d, 0x7d, 0x62, 0xc0, 0x86, 0x8b, 0x21, 0x23, 0x57, 0xcd, 0xd1, 0x2d, 0x91, 0x49, 0x82, 0x2f, 0x4e, 0x98, 0x45, 0xd9, 0x18, 0xa0, 0x8d, 0x1a, 0xe9, 0x90, 0xc0 },
+ // 104
+ { 0xe4, 0xbf, 0xe8, 0x0d, 0x58, 0xc9, 0x19, 0x94, 0x61, 0x39, 0x09, 0xdc, 0x4b, 0x1a, 0x12, 0x49, 0x68, 0x96, 0xc0, 0x04, 0xaf, 0x7b, 0x57, 0x01, 0x48, 0x3d, 0xe4, 0x5d, 0x28, 0x23, 0xd7, 0x8e },
+ // 105
+ { 0xeb, 0xb4, 0xba, 0x15, 0x0c, 0xef, 0x27, 0x34, 0x34, 0x5b, 0x5d, 0x64, 0x1b, 0xbe, 0xd0, 0x3a, 0x21, 0xea, 0xfa, 0xe9, 0x33, 0xc9, 0x9e, 0x00, 0x92, 0x12, 0xef, 0x04, 0x57, 0x4a, 0x85, 0x30 },
+ // 106
+ { 0x39, 0x66, 0xec, 0x73, 0xb1, 0x54, 0xac, 0xc6, 0x97, 0xac, 0x5c, 0xf5, 0xb2, 0x4b, 0x40, 0xbd, 0xb0, 0xdb, 0x9e, 0x39, 0x88, 0x36, 0xd7, 0x6d, 0x4b, 0x88, 0x0e, 0x3b, 0x2a, 0xf1, 0xaa, 0x27 },
+ // 107
+ { 0xef, 0x7e, 0x48, 0x31, 0xb3, 0xa8, 0x46, 0x36, 0x51, 0x8d, 0x6e, 0x4b, 0xfc, 0xe6, 0x4a, 0x43, 0xdb, 0x2a, 0x5d, 0xda, 0x9c, 0xca, 0x2b, 0x44, 0xf3, 0x90, 0x33, 0xbd, 0xc4, 0x0d, 0x62, 0x43 },
+ // 108
+ { 0x7a, 0xbf, 0x6a, 0xcf, 0x5c, 0x8e, 0x54, 0x9d, 0xdb, 0xb1, 0x5a, 0xe8, 0xd8, 0xb3, 0x88, 0xc1, 0xc1, 0x97, 0xe6, 0x98, 0x73, 0x7c, 0x97, 0x85, 0x50, 0x1e, 0xd1, 0xf9, 0x49, 0x30, 0xb7, 0xd9 },
+ // 109
+ { 0x88, 0x01, 0x8d, 0xed, 0x66, 0x81, 0x3f, 0x0c, 0xa9, 0x5d, 0xef, 0x47, 0x4c, 0x63, 0x06, 0x92, 0x01, 0x99, 0x67, 0xb9, 0xe3, 0x68, 0x88, 0xda, 0xdd, 0x94, 0x12, 0x47, 0x19, 0xb6, 0x82, 0xf6 },
+ // 110
+ { 0x39, 0x30, 0x87, 0x6b, 0x9f, 0xc7, 0x52, 0x90, 0x36, 0xb0, 0x08, 0xb1, 0xb8, 0xbb, 0x99, 0x75, 0x22, 0xa4, 0x41, 0x63, 0x5a, 0x0c, 0x25, 0xec, 0x02, 0xfb, 0x6d, 0x90, 0x26, 0xe5, 0x5a, 0x97 },
+ // 111
+ { 0x0a, 0x40, 0x49, 0xd5, 0x7e, 0x83, 0x3b, 0x56, 0x95, 0xfa, 0xc9, 0x3d, 0xd1, 0xfb, 0xef, 0x31, 0x66, 0xb4, 0x4b, 0x12, 0xad, 0x11, 0x24, 0x86, 0x62, 0x38, 0x3a, 0xe0, 0x51, 0xe1, 0x58, 0x27 },
+ // 112
+ { 0x81, 0xdc, 0xc0, 0x67, 0x8b, 0xb6, 0xa7, 0x65, 0xe4, 0x8c, 0x32, 0x09, 0x65, 0x4f, 0xe9, 0x00, 0x89, 0xce, 0x44, 0xff, 0x56, 0x18, 0x47, 0x7e, 0x39, 0xab, 0x28, 0x64, 0x76, 0xdf, 0x05, 0x2b },
+ // 113
+ { 0xe6, 0x9b, 0x3a, 0x36, 0xa4, 0x46, 0x19, 0x12, 0xdc, 0x08, 0x34, 0x6b, 0x11, 0xdd, 0xcb, 0x9d, 0xb7, 0x96, 0xf8, 0x85, 0xfd, 0x01, 0x93, 0x6e, 0x66, 0x2f, 0xe2, 0x92, 0x97, 0xb0, 0x99, 0xa4 },
+ // 114
+ { 0x5a, 0xc6, 0x50, 0x3b, 0x0d, 0x8d, 0xa6, 0x91, 0x76, 0x46, 0xe6, 0xdc, 0xc8, 0x7e, 0xdc, 0x58, 0xe9, 0x42, 0x45, 0x32, 0x4c, 0xc2, 0x04, 0xf4, 0xdd, 0x4a, 0xf0, 0x15, 0x63, 0xac, 0xd4, 0x27 },
+ // 115
+ { 0xdf, 0x6d, 0xda, 0x21, 0x35, 0x9a, 0x30, 0xbc, 0x27, 0x17, 0x80, 0x97, 0x1c, 0x1a, 0xbd, 0x56, 0xa6, 0xef, 0x16, 0x7e, 0x48, 0x08, 0x87, 0x88, 0x8e, 0x73, 0xa8, 0x6d, 0x3b, 0xf6, 0x05, 0xe9 },
+ // 116
+ { 0xe8, 0xe6, 0xe4, 0x70, 0x71, 0xe7, 0xb7, 0xdf, 0x25, 0x80, 0xf2, 0x25, 0xcf, 0xbb, 0xed, 0xf8, 0x4c, 0xe6, 0x77, 0x46, 0x62, 0x66, 0x28, 0xd3, 0x30, 0x97, 0xe4, 0xb7, 0xdc, 0x57, 0x11, 0x07 },
+ // 117
+ { 0x53, 0xe4, 0x0e, 0xad, 0x62, 0x05, 0x1e, 0x19, 0xcb, 0x9b, 0xa8, 0x13, 0x3e, 0x3e, 0x5c, 0x1c, 0xe0, 0x0d, 0xdc, 0xad, 0x8a, 0xcf, 0x34, 0x2a, 0x22, 0x43, 0x60, 0xb0, 0xac, 0xc1, 0x47, 0x77 },
+ // 118
+ { 0x9c, 0xcd, 0x53, 0xfe, 0x80, 0xbe, 0x78, 0x6a, 0xa9, 0x84, 0x63, 0x84, 0x62, 0xfb, 0x28, 0xaf, 0xdf, 0x12, 0x2b, 0x34, 0xd7, 0x8f, 0x46, 0x87, 0xec, 0x63, 0x2b, 0xb1, 0x9d, 0xe2, 0x37, 0x1a },
+ // 119
+ { 0xcb, 0xd4, 0x80, 0x52, 0xc4, 0x8d, 0x78, 0x84, 0x66, 0xa3, 0xe8, 0x11, 0x8c, 0x56, 0xc9, 0x7f, 0xe1, 0x46, 0xe5, 0x54, 0x6f, 0xaa, 0xf9, 0x3e, 0x2b, 0xc3, 0xc4, 0x7e, 0x45, 0x93, 0x97, 0x53 },
+ // 120
+ { 0x25, 0x68, 0x83, 0xb1, 0x4e, 0x2a, 0xf4, 0x4d, 0xad, 0xb2, 0x8e, 0x1b, 0x34, 0xb2, 0xac, 0x0f, 0x0f, 0x4c, 0x91, 0xc3, 0x4e, 0xc9, 0x16, 0x9e, 0x29, 0x03, 0x61, 0x58, 0xac, 0xaa, 0x95, 0xb9 },
+ // 121
+ { 0x44, 0x71, 0xb9, 0x1a, 0xb4, 0x2d, 0xb7, 0xc4, 0xdd, 0x84, 0x90, 0xab, 0x95, 0xa2, 0xee, 0x8d, 0x04, 0xe3, 0xef, 0x5c, 0x3d, 0x6f, 0xc7, 0x1a, 0xc7, 0x4b, 0x2b, 0x26, 0x91, 0x4d, 0x16, 0x41 },
+ // 122
+ { 0xa5, 0xeb, 0x08, 0x03, 0x8f, 0x8f, 0x11, 0x55, 0xed, 0x86, 0xe6, 0x31, 0x90, 0x6f, 0xc1, 0x30, 0x95, 0xf6, 0xbb, 0xa4, 0x1d, 0xe5, 0xd4, 0xe7, 0x95, 0x75, 0x8e, 0xc8, 0xc8, 0xdf, 0x8a, 0xf1 },
+ // 123
+ { 0xdc, 0x1d, 0xb6, 0x4e, 0xd8, 0xb4, 0x8a, 0x91, 0x0e, 0x06, 0x0a, 0x6b, 0x86, 0x63, 0x74, 0xc5, 0x78, 0x78, 0x4e, 0x9a, 0xc4, 0x9a, 0xb2, 0x77, 0x40, 0x92, 0xac, 0x71, 0x50, 0x19, 0x34, 0xac },
+ // 124
+ { 0x28, 0x54, 0x13, 0xb2, 0xf2, 0xee, 0x87, 0x3d, 0x34, 0x31, 0x9e, 0xe0, 0xbb, 0xfb, 0xb9, 0x0f, 0x32, 0xda, 0x43, 0x4c, 0xc8, 0x7e, 0x3d, 0xb5, 0xed, 0x12, 0x1b, 0xb3, 0x98, 0xed, 0x96, 0x4b },
+ // 125
+ { 0x02, 0x16, 0xe0, 0xf8, 0x1f, 0x75, 0x0f, 0x26, 0xf1, 0x99, 0x8b, 0xc3, 0x93, 0x4e, 0x3e, 0x12, 0x4c, 0x99, 0x45, 0xe6, 0x85, 0xa6, 0x0b, 0x25, 0xe8, 0xfb, 0xd9, 0x62, 0x5a, 0xb6, 0xb5, 0x99 },
+ // 126
+ { 0x38, 0xc4, 0x10, 0xf5, 0xb9, 0xd4, 0x07, 0x20, 0x50, 0x75, 0x5b, 0x31, 0xdc, 0xa8, 0x9f, 0xd5, 0x39, 0x5c, 0x67, 0x85, 0xee, 0xb3, 0xd7, 0x90, 0xf3, 0x20, 0xff, 0x94, 0x1c, 0x5a, 0x93, 0xbf },
+ // 127
+ { 0xf1, 0x84, 0x17, 0xb3, 0x9d, 0x61, 0x7a, 0xb1, 0xc1, 0x8f, 0xdf, 0x91, 0xeb, 0xd0, 0xfc, 0x6d, 0x55, 0x16, 0xbb, 0x34, 0xcf, 0x39, 0x36, 0x40, 0x37, 0xbc, 0xe8, 0x1f, 0xa0, 0x4c, 0xec, 0xb1 },
+ // 128
+ { 0x1f, 0xa8, 0x77, 0xde, 0x67, 0x25, 0x9d, 0x19, 0x86, 0x3a, 0x2a, 0x34, 0xbc, 0xc6, 0x96, 0x2a, 0x2b, 0x25, 0xfc, 0xbf, 0x5c, 0xbe, 0xcd, 0x7e, 0xde, 0x8f, 0x1f, 0xa3, 0x66, 0x88, 0xa7, 0x96 },
+ // 129
+ { 0x5b, 0xd1, 0x69, 0xe6, 0x7c, 0x82, 0xc2, 0xc2, 0xe9, 0x8e, 0xf7, 0x00, 0x8b, 0xdf, 0x26, 0x1f, 0x2d, 0xdf, 0x30, 0xb1, 0xc0, 0x0f, 0x9e, 0x7f, 0x27, 0x5b, 0xb3, 0xe8, 0xa2, 0x8d, 0xc9, 0xa2 },
+ // 130
+ { 0xc8, 0x0a, 0xbe, 0xeb, 0xb6, 0x69, 0xad, 0x5d, 0xee, 0xb5, 0xf5, 0xec, 0x8e, 0xa6, 0xb7, 0xa0, 0x5d, 0xdf, 0x7d, 0x31, 0xec, 0x4c, 0x0a, 0x2e, 0xe2, 0x0b, 0x0b, 0x98, 0xca, 0xec, 0x67, 0x46 },
+ // 131
+ { 0xe7, 0x6d, 0x3f, 0xbd, 0xa5, 0xba, 0x37, 0x4e, 0x6b, 0xf8, 0xe5, 0x0f, 0xad, 0xc3, 0xbb, 0xb9, 0xba, 0x5c, 0x20, 0x6e, 0xbd, 0xec, 0x89, 0xa3, 0xa5, 0x4c, 0xf3, 0xdd, 0x84, 0xa0, 0x70, 0x16 },
+ // 132
+ { 0x7b, 0xba, 0x9d, 0xc5, 0xb5, 0xdb, 0x20, 0x71, 0xd1, 0x77, 0x52, 0xb1, 0x04, 0x4c, 0x1e, 0xce, 0xd9, 0x6a, 0xaf, 0x2d, 0xd4, 0x6e, 0x9b, 0x43, 0x37, 0x50, 0xe8, 0xea, 0x0d, 0xcc, 0x18, 0x70 },
+ // 133
+ { 0xf2, 0x9b, 0x1b, 0x1a, 0xb9, 0xba, 0xb1, 0x63, 0x01, 0x8e, 0xe3, 0xda, 0x15, 0x23, 0x2c, 0xca, 0x78, 0xec, 0x52, 0xdb, 0xc3, 0x4e, 0xda, 0x5b, 0x82, 0x2e, 0xc1, 0xd8, 0x0f, 0xc2, 0x1b, 0xd0 },
+ // 134
+ { 0x9e, 0xe3, 0xe3, 0xe7, 0xe9, 0x00, 0xf1, 0xe1, 0x1d, 0x30, 0x8c, 0x4b, 0x2b, 0x30, 0x76, 0xd2, 0x72, 0xcf, 0x70, 0x12, 0x4f, 0x9f, 0x51, 0xe1, 0xda, 0x60, 0xf3, 0x78, 0x46, 0xcd, 0xd2, 0xf4 },
+ // 135
+ { 0x70, 0xea, 0x3b, 0x01, 0x76, 0x92, 0x7d, 0x90, 0x96, 0xa1, 0x85, 0x08, 0xcd, 0x12, 0x3a, 0x29, 0x03, 0x25, 0x92, 0x0a, 0x9d, 0x00, 0xa8, 0x9b, 0x5d, 0xe0, 0x42, 0x73, 0xfb, 0xc7, 0x6b, 0x85 },
+ // 136
+ { 0x67, 0xde, 0x25, 0xc0, 0x2a, 0x4a, 0xab, 0xa2, 0x3b, 0xdc, 0x97, 0x3c, 0x8b, 0xb0, 0xb5, 0x79, 0x6d, 0x47, 0xcc, 0x06, 0x59, 0xd4, 0x3d, 0xff, 0x1f, 0x97, 0xde, 0x17, 0x49, 0x63, 0xb6, 0x8e },
+ // 137
+ { 0xb2, 0x16, 0x8e, 0x4e, 0x0f, 0x18, 0xb0, 0xe6, 0x41, 0x00, 0xb5, 0x17, 0xed, 0x95, 0x25, 0x7d, 0x73, 0xf0, 0x62, 0x0d, 0xf8, 0x85, 0xc1, 0x3d, 0x2e, 0xcf, 0x79, 0x36, 0x7b, 0x38, 0x4c, 0xee },
+ // 138
+ { 0x2e, 0x7d, 0xec, 0x24, 0x28, 0x85, 0x3b, 0x2c, 0x71, 0x76, 0x07, 0x45, 0x54, 0x1f, 0x7a, 0xfe, 0x98, 0x25, 0xb5, 0xdd, 0x77, 0xdf, 0x06, 0x51, 0x1d, 0x84, 0x41, 0xa9, 0x4b, 0xac, 0xc9, 0x27 },
+ // 139
+ { 0xca, 0x9f, 0xfa, 0xc4, 0xc4, 0x3f, 0x0b, 0x48, 0x46, 0x1d, 0xc5, 0xc2, 0x63, 0xbe, 0xa3, 0xf6, 0xf0, 0x06, 0x11, 0xce, 0xac, 0xab, 0xf6, 0xf8, 0x95, 0xba, 0x2b, 0x01, 0x01, 0xdb, 0xb6, 0x8d },
+ // 140
+ { 0x74, 0x10, 0xd4, 0x2d, 0x8f, 0xd1, 0xd5, 0xe9, 0xd2, 0xf5, 0x81, 0x5c, 0xb9, 0x34, 0x17, 0x99, 0x88, 0x28, 0xef, 0x3c, 0x42, 0x30, 0xbf, 0xbd, 0x41, 0x2d, 0xf0, 0xa4, 0xa7, 0xa2, 0x50, 0x7a },
+ // 141
+ { 0x50, 0x10, 0xf6, 0x84, 0x51, 0x6d, 0xcc, 0xd0, 0xb6, 0xee, 0x08, 0x52, 0xc2, 0x51, 0x2b, 0x4d, 0xc0, 0x06, 0x6c, 0xf0, 0xd5, 0x6f, 0x35, 0x30, 0x29, 0x78, 0xdb, 0x8a, 0xe3, 0x2c, 0x6a, 0x81 },
+ // 142
+ { 0xac, 0xaa, 0xb5, 0x85, 0xf7, 0xb7, 0x9b, 0x71, 0x99, 0x35, 0xce, 0xb8, 0x95, 0x23, 0xdd, 0xc5, 0x48, 0x27, 0xf7, 0x5c, 0x56, 0x88, 0x38, 0x56, 0x15, 0x4a, 0x56, 0xcd, 0xcd, 0x5e, 0xe9, 0x88 },
+ // 143
+ { 0x66, 0x6d, 0xe5, 0xd1, 0x44, 0x0f, 0xee, 0x73, 0x31, 0xaa, 0xf0, 0x12, 0x3a, 0x62, 0xef, 0x2d, 0x8b, 0xa5, 0x74, 0x53, 0xa0, 0x76, 0x96, 0x35, 0xac, 0x6c, 0xd0, 0x1e, 0x63, 0x3f, 0x77, 0x12 },
+ // 144
+ { 0xa6, 0xf9, 0x86, 0x58, 0xf6, 0xea, 0xba, 0xf9, 0x02, 0xd8, 0xb3, 0x87, 0x1a, 0x4b, 0x10, 0x1d, 0x16, 0x19, 0x6e, 0x8a, 0x4b, 0x24, 0x1e, 0x15, 0x58, 0xfe, 0x29, 0x96, 0x6e, 0x10, 0x3e, 0x8d },
+ // 145
+ { 0x89, 0x15, 0x46, 0xa8, 0xb2, 0x9f, 0x30, 0x47, 0xdd, 0xcf, 0xe5, 0xb0, 0x0e, 0x45, 0xfd, 0x55, 0x75, 0x63, 0x73, 0x10, 0x5e, 0xa8, 0x63, 0x7d, 0xfc, 0xff, 0x54, 0x7b, 0x6e, 0xa9, 0x53, 0x5f },
+ // 146
+ { 0x18, 0xdf, 0xbc, 0x1a, 0xc5, 0xd2, 0x5b, 0x07, 0x61, 0x13, 0x7d, 0xbd, 0x22, 0xc1, 0x7c, 0x82, 0x9d, 0x0f, 0x0e, 0xf1, 0xd8, 0x23, 0x44, 0xe9, 0xc8, 0x9c, 0x28, 0x66, 0x94, 0xda, 0x24, 0xe8 },
+ // 147
+ { 0xb5, 0x4b, 0x9b, 0x67, 0xf8, 0xfe, 0xd5, 0x4b, 0xbf, 0x5a, 0x26, 0x66, 0xdb, 0xdf, 0x4b, 0x23, 0xcf, 0xf1, 0xd1, 0xb6, 0xf4, 0xaf, 0xc9, 0x85, 0xb2, 0xe6, 0xd3, 0x30, 0x5a, 0x9f, 0xf8, 0x0f },
+ // 148
+ { 0x7d, 0xb4, 0x42, 0xe1, 0x32, 0xba, 0x59, 0xbc, 0x12, 0x89, 0xaa, 0x98, 0xb0, 0xd3, 0xe8, 0x06, 0x00, 0x4f, 0x8e, 0xc1, 0x28, 0x11, 0xaf, 0x1e, 0x2e, 0x33, 0xc6, 0x9b, 0xfd, 0xe7, 0x29, 0xe1 },
+ // 149
+ { 0x25, 0x0f, 0x37, 0xcd, 0xc1, 0x5e, 0x81, 0x7d, 0x2f, 0x16, 0x0d, 0x99, 0x56, 0xc7, 0x1f, 0xe3, 0xeb, 0x5d, 0xb7, 0x45, 0x56, 0xe4, 0xad, 0xf9, 0xa4, 0xff, 0xaf, 0xba, 0x74, 0x01, 0x03, 0x96 },
+ // 150
+ { 0x4a, 0xb8, 0xa3, 0xdd, 0x1d, 0xdf, 0x8a, 0xd4, 0x3d, 0xab, 0x13, 0xa2, 0x7f, 0x66, 0xa6, 0x54, 0x4f, 0x29, 0x05, 0x97, 0xfa, 0x96, 0x04, 0x0e, 0x0e, 0x1d, 0xb9, 0x26, 0x3a, 0xa4, 0x79, 0xf8 },
+ // 151
+ { 0xee, 0x61, 0x72, 0x7a, 0x07, 0x66, 0xdf, 0x93, 0x9c, 0xcd, 0xc8, 0x60, 0x33, 0x40, 0x44, 0xc7, 0x9a, 0x3c, 0x9b, 0x15, 0x62, 0x00, 0xbc, 0x3a, 0xa3, 0x29, 0x73, 0x48, 0x3d, 0x83, 0x41, 0xae },
+ // 152
+ { 0x3f, 0x68, 0xc7, 0xec, 0x63, 0xac, 0x11, 0xeb, 0xb9, 0x8f, 0x94, 0xb3, 0x39, 0xb0, 0x5c, 0x10, 0x49, 0x84, 0xfd, 0xa5, 0x01, 0x03, 0x06, 0x01, 0x44, 0xe5, 0xa2, 0xbf, 0xcc, 0xc9, 0xda, 0x95 },
+ // 153
+ { 0x05, 0x6f, 0x29, 0x81, 0x6b, 0x8a, 0xf8, 0xf5, 0x66, 0x82, 0xbc, 0x4d, 0x7c, 0xf0, 0x94, 0x11, 0x1d, 0xa7, 0x73, 0x3e, 0x72, 0x6c, 0xd1, 0x3d, 0x6b, 0x3e, 0x8e, 0xa0, 0x3e, 0x92, 0xa0, 0xd5 },
+ // 154
+ { 0xf5, 0xec, 0x43, 0xa2, 0x8a, 0xcb, 0xef, 0xf1, 0xf3, 0x31, 0x8a, 0x5b, 0xca, 0xc7, 0xc6, 0x6d, 0xdb, 0x52, 0x30, 0xb7, 0x9d, 0xb2, 0xd1, 0x05, 0xbc, 0xbe, 0x15, 0xf3, 0xc1, 0x14, 0x8d, 0x69 },
+ // 155
+ { 0x2a, 0x69, 0x60, 0xad, 0x1d, 0x8d, 0xd5, 0x47, 0x55, 0x5c, 0xfb, 0xd5, 0xe4, 0x60, 0x0f, 0x1e, 0xaa, 0x1c, 0x8e, 0xda, 0x34, 0xde, 0x03, 0x74, 0xec, 0x4a, 0x26, 0xea, 0xaa, 0xa3, 0x3b, 0x4e },
+ // 156
+ { 0xdc, 0xc1, 0xea, 0x7b, 0xaa, 0xb9, 0x33, 0x84, 0xf7, 0x6b, 0x79, 0x68, 0x66, 0x19, 0x97, 0x54, 0x74, 0x2f, 0x7b, 0x96, 0xd6, 0xb4, 0xc1, 0x20, 0x16, 0x5c, 0x04, 0xa6, 0xc4, 0xf5, 0xce, 0x10 },
+ // 157
+ { 0x13, 0xd5, 0xdf, 0x17, 0x92, 0x21, 0x37, 0x9c, 0x6a, 0x78, 0xc0, 0x7c, 0x79, 0x3f, 0xf5, 0x34, 0x87, 0xca, 0xe6, 0xbf, 0x9f, 0xe8, 0x82, 0x54, 0x1a, 0xb0, 0xe7, 0x35, 0xe3, 0xea, 0xda, 0x3b },
+ // 158
+ { 0x8c, 0x59, 0xe4, 0x40, 0x76, 0x41, 0xa0, 0x1e, 0x8f, 0xf9, 0x1f, 0x99, 0x80, 0xdc, 0x23, 0x6f, 0x4e, 0xcd, 0x6f, 0xcf, 0x52, 0x58, 0x9a, 0x09, 0x9a, 0x96, 0x16, 0x33, 0x96, 0x77, 0x14, 0xe1 },
+ // 159
+ { 0x83, 0x3b, 0x1a, 0xc6, 0xa2, 0x51, 0xfd, 0x08, 0xfd, 0x6d, 0x90, 0x8f, 0xea, 0x2a, 0x4e, 0xe1, 0xe0, 0x40, 0xbc, 0xa9, 0x3f, 0xc1, 0xa3, 0x8e, 0xc3, 0x82, 0x0e, 0x0c, 0x10, 0xbd, 0x82, 0xea },
+ // 160
+ { 0xa2, 0x44, 0xf9, 0x27, 0xf3, 0xb4, 0x0b, 0x8f, 0x6c, 0x39, 0x15, 0x70, 0xc7, 0x65, 0x41, 0x8f, 0x2f, 0x6e, 0x70, 0x8e, 0xac, 0x90, 0x06, 0xc5, 0x1a, 0x7f, 0xef, 0xf4, 0xaf, 0x3b, 0x2b, 0x9e },
+ // 161
+ { 0x3d, 0x99, 0xed, 0x95, 0x50, 0xcf, 0x11, 0x96, 0xe6, 0xc4, 0xd2, 0x0c, 0x25, 0x96, 0x20, 0xf8, 0x58, 0xc3, 0xd7, 0x03, 0x37, 0x4c, 0x12, 0x8c, 0xe7, 0xb5, 0x90, 0x31, 0x0c, 0x83, 0x04, 0x6d },
+ // 162
+ { 0x2b, 0x35, 0xc4, 0x7d, 0x7b, 0x87, 0x76, 0x1f, 0x0a, 0xe4, 0x3a, 0xc5, 0x6a, 0xc2, 0x7b, 0x9f, 0x25, 0x83, 0x03, 0x67, 0xb5, 0x95, 0xbe, 0x8c, 0x24, 0x0e, 0x94, 0x60, 0x0c, 0x6e, 0x33, 0x12 },
+ // 163
+ { 0x5d, 0x11, 0xed, 0x37, 0xd2, 0x4d, 0xc7, 0x67, 0x30, 0x5c, 0xb7, 0xe1, 0x46, 0x7d, 0x87, 0xc0, 0x65, 0xac, 0x4b, 0xc8, 0xa4, 0x26, 0xde, 0x38, 0x99, 0x1f, 0xf5, 0x9a, 0xa8, 0x73, 0x5d, 0x02 },
+ // 164
+ { 0xb8, 0x36, 0x47, 0x8e, 0x1c, 0xa0, 0x64, 0x0d, 0xce, 0x6f, 0xd9, 0x10, 0xa5, 0x09, 0x62, 0x72, 0xc8, 0x33, 0x09, 0x90, 0xcd, 0x97, 0x86, 0x4a, 0xc2, 0xbf, 0x14, 0xef, 0x6b, 0x23, 0x91, 0x4a },
+ // 165
+ { 0x91, 0x00, 0xf9, 0x46, 0xd6, 0xcc, 0xde, 0x3a, 0x59, 0x7f, 0x90, 0xd3, 0x9f, 0xc1, 0x21, 0x5b, 0xad, 0xdc, 0x74, 0x13, 0x64, 0x3d, 0x85, 0xc2, 0x1c, 0x3e, 0xee, 0x5d, 0x2d, 0xd3, 0x28, 0x94 },
+ // 166
+ { 0xda, 0x70, 0xee, 0xdd, 0x23, 0xe6, 0x63, 0xaa, 0x1a, 0x74, 0xb9, 0x76, 0x69, 0x35, 0xb4, 0x79, 0x22, 0x2a, 0x72, 0xaf, 0xba, 0x5c, 0x79, 0x51, 0x58, 0xda, 0xd4, 0x1a, 0x3b, 0xd7, 0x7e, 0x40 },
+ // 167
+ { 0xf0, 0x67, 0xed, 0x6a, 0x0d, 0xbd, 0x43, 0xaa, 0x0a, 0x92, 0x54, 0xe6, 0x9f, 0xd6, 0x6b, 0xdd, 0x8a, 0xcb, 0x87, 0xde, 0x93, 0x6c, 0x25, 0x8c, 0xfb, 0x02, 0x28, 0x5f, 0x2c, 0x11, 0xfa, 0x79 },
+ // 168
+ { 0x71, 0x5c, 0x99, 0xc7, 0xd5, 0x75, 0x80, 0xcf, 0x97, 0x53, 0xb4, 0xc1, 0xd7, 0x95, 0xe4, 0x5a, 0x83, 0xfb, 0xb2, 0x28, 0xc0, 0xd3, 0x6f, 0xbe, 0x20, 0xfa, 0xf3, 0x9b, 0xdd, 0x6d, 0x4e, 0x85 },
+ // 169
+ { 0xe4, 0x57, 0xd6, 0xad, 0x1e, 0x67, 0xcb, 0x9b, 0xbd, 0x17, 0xcb, 0xd6, 0x98, 0xfa, 0x6d, 0x7d, 0xae, 0x0c, 0x9b, 0x7a, 0xd6, 0xcb, 0xd6, 0x53, 0x96, 0x34, 0xe3, 0x2a, 0x71, 0x9c, 0x84, 0x92 },
+ // 170
+ { 0xec, 0xe3, 0xea, 0x81, 0x03, 0xe0, 0x24, 0x83, 0xc6, 0x4a, 0x70, 0xa4, 0xbd, 0xce, 0xe8, 0xce, 0xb6, 0x27, 0x8f, 0x25, 0x33, 0xf3, 0xf4, 0x8d, 0xbe, 0xed, 0xfb, 0xa9, 0x45, 0x31, 0xd4, 0xae },
+ // 171
+ { 0x38, 0x8a, 0xa5, 0xd3, 0x66, 0x7a, 0x97, 0xc6, 0x8d, 0x3d, 0x56, 0xf8, 0xf3, 0xee, 0x8d, 0x3d, 0x36, 0x09, 0x1f, 0x17, 0xfe, 0x5d, 0x1b, 0x0d, 0x5d, 0x84, 0xc9, 0x3b, 0x2f, 0xfe, 0x40, 0xbd },
+ // 172
+ { 0x8b, 0x6b, 0x31, 0xb9, 0xad, 0x7c, 0x3d, 0x5c, 0xd8, 0x4b, 0xf9, 0x89, 0x47, 0xb9, 0xcd, 0xb5, 0x9d, 0xf8, 0xa2, 0x5f, 0xf7, 0x38, 0x10, 0x10, 0x13, 0xbe, 0x4f, 0xd6, 0x5e, 0x1d, 0xd1, 0xa3 },
+ // 173
+ { 0x06, 0x62, 0x91, 0xf6, 0xbb, 0xd2, 0x5f, 0x3c, 0x85, 0x3d, 0xb7, 0xd8, 0xb9, 0x5c, 0x9a, 0x1c, 0xfb, 0x9b, 0xf1, 0xc1, 0xc9, 0x9f, 0xb9, 0x5a, 0x9b, 0x78, 0x69, 0xd9, 0x0f, 0x1c, 0x29, 0x03 },
+ // 174
+ { 0xa7, 0x07, 0xef, 0xbc, 0xcd, 0xce, 0xed, 0x42, 0x96, 0x7a, 0x66, 0xf5, 0x53, 0x9b, 0x93, 0xed, 0x75, 0x60, 0xd4, 0x67, 0x30, 0x40, 0x16, 0xc4, 0x78, 0x0d, 0x77, 0x55, 0xa5, 0x65, 0xd4, 0xc4 },
+ // 175
+ { 0x38, 0xc5, 0x3d, 0xfb, 0x70, 0xbe, 0x7e, 0x79, 0x2b, 0x07, 0xa6, 0xa3, 0x5b, 0x8a, 0x6a, 0x0a, 0xba, 0x02, 0xc5, 0xc5, 0xf3, 0x8b, 0xaf, 0x5c, 0x82, 0x3f, 0xdf, 0xd9, 0xe4, 0x2d, 0x65, 0x7e },
+ // 176
+ { 0xf2, 0x91, 0x13, 0x86, 0x50, 0x1d, 0x9a, 0xb9, 0xd7, 0x20, 0xcf, 0x8a, 0xd1, 0x05, 0x03, 0xd5, 0x63, 0x4b, 0xf4, 0xb7, 0xd1, 0x2b, 0x56, 0xdf, 0xb7, 0x4f, 0xec, 0xc6, 0xe4, 0x09, 0x3f, 0x68 },
+ // 177
+ { 0xc6, 0xf2, 0xbd, 0xd5, 0x2b, 0x81, 0xe6, 0xe4, 0xf6, 0x59, 0x5a, 0xbd, 0x4d, 0x7f, 0xb3, 0x1f, 0x65, 0x11, 0x69, 0xd0, 0x0f, 0xf3, 0x26, 0x92, 0x6b, 0x34, 0x94, 0x7b, 0x28, 0xa8, 0x39, 0x59 },
+ // 178
+ { 0x29, 0x3d, 0x94, 0xb1, 0x8c, 0x98, 0xbb, 0x32, 0x23, 0x36, 0x6b, 0x8c, 0xe7, 0x4c, 0x28, 0xfb, 0xdf, 0x28, 0xe1, 0xf8, 0x4a, 0x33, 0x50, 0xb0, 0xeb, 0x2d, 0x18, 0x04, 0xa5, 0x77, 0x57, 0x9b },
+ // 179
+ { 0x2c, 0x2f, 0xa5, 0xc0, 0xb5, 0x15, 0x33, 0x16, 0x5b, 0xc3, 0x75, 0xc2, 0x2e, 0x27, 0x81, 0x76, 0x82, 0x70, 0xa3, 0x83, 0x98, 0x5d, 0x13, 0xbd, 0x6b, 0x67, 0xb6, 0xfd, 0x67, 0xf8, 0x89, 0xeb },
+ // 180
+ { 0xca, 0xa0, 0x9b, 0x82, 0xb7, 0x25, 0x62, 0xe4, 0x3f, 0x4b, 0x22, 0x75, 0xc0, 0x91, 0x91, 0x8e, 0x62, 0x4d, 0x91, 0x16, 0x61, 0xcc, 0x81, 0x1b, 0xb5, 0xfa, 0xec, 0x51, 0xf6, 0x08, 0x8e, 0xf7 },
+ // 181
+ { 0x24, 0x76, 0x1e, 0x45, 0xe6, 0x74, 0x39, 0x53, 0x79, 0xfb, 0x17, 0x72, 0x9c, 0x78, 0xcb, 0x93, 0x9e, 0x6f, 0x74, 0xc5, 0xdf, 0xfb, 0x9c, 0x96, 0x1f, 0x49, 0x59, 0x82, 0xc3, 0xed, 0x1f, 0xe3 },
+ // 182
+ { 0x55, 0xb7, 0x0a, 0x82, 0x13, 0x1e, 0xc9, 0x48, 0x88, 0xd7, 0xab, 0x54, 0xa7, 0xc5, 0x15, 0x25, 0x5c, 0x39, 0x38, 0xbb, 0x10, 0xbc, 0x78, 0x4d, 0xc9, 0xb6, 0x7f, 0x07, 0x6e, 0x34, 0x1a, 0x73 },
+ // 183
+ { 0x6a, 0xb9, 0x05, 0x7b, 0x97, 0x7e, 0xbc, 0x3c, 0xa4, 0xd4, 0xce, 0x74, 0x50, 0x6c, 0x25, 0xcc, 0xcd, 0xc5, 0x66, 0x49, 0x7c, 0x45, 0x0b, 0x54, 0x15, 0xa3, 0x94, 0x86, 0xf8, 0x65, 0x7a, 0x03 },
+ // 184
+ { 0x24, 0x06, 0x6d, 0xee, 0xe0, 0xec, 0xee, 0x15, 0xa4, 0x5f, 0x0a, 0x32, 0x6d, 0x0f, 0x8d, 0xbc, 0x79, 0x76, 0x1e, 0xbb, 0x93, 0xcf, 0x8c, 0x03, 0x77, 0xaf, 0x44, 0x09, 0x78, 0xfc, 0xf9, 0x94 },
+ // 185
+ { 0x20, 0x00, 0x0d, 0x3f, 0x66, 0xba, 0x76, 0x86, 0x0d, 0x5a, 0x95, 0x06, 0x88, 0xb9, 0xaa, 0x0d, 0x76, 0xcf, 0xea, 0x59, 0xb0, 0x05, 0xd8, 0x59, 0x91, 0x4b, 0x1a, 0x46, 0x65, 0x3a, 0x93, 0x9b },
+ // 186
+ { 0xb9, 0x2d, 0xaa, 0x79, 0x60, 0x3e, 0x3b, 0xdb, 0xc3, 0xbf, 0xe0, 0xf4, 0x19, 0xe4, 0x09, 0xb2, 0xea, 0x10, 0xdc, 0x43, 0x5b, 0xee, 0xfe, 0x29, 0x59, 0xda, 0x16, 0x89, 0x5d, 0x5d, 0xca, 0x1c },
+ // 187
+ { 0xe9, 0x47, 0x94, 0x87, 0x05, 0xb2, 0x06, 0xd5, 0x72, 0xb0, 0xe8, 0xf6, 0x2f, 0x66, 0xa6, 0x55, 0x1c, 0xbd, 0x6b, 0xc3, 0x05, 0xd2, 0x6c, 0xe7, 0x53, 0x9a, 0x12, 0xf9, 0xaa, 0xdf, 0x75, 0x71 },
+ // 188
+ { 0x3d, 0x67, 0xc1, 0xb3, 0xf9, 0xb2, 0x39, 0x10, 0xe3, 0xd3, 0x5e, 0x6b, 0x0f, 0x2c, 0xcf, 0x44, 0xa0, 0xb5, 0x40, 0xa4, 0x5c, 0x18, 0xba, 0x3c, 0x36, 0x26, 0x4d, 0xd4, 0x8e, 0x96, 0xaf, 0x6a },
+ // 189
+ { 0xc7, 0x55, 0x8b, 0xab, 0xda, 0x04, 0xbc, 0xcb, 0x76, 0x4d, 0x0b, 0xbf, 0x33, 0x58, 0x42, 0x51, 0x41, 0x90, 0x2d, 0x22, 0x39, 0x1d, 0x9f, 0x8c, 0x59, 0x15, 0x9f, 0xec, 0x9e, 0x49, 0xb1, 0x51 },
+ // 190
+ { 0x0b, 0x73, 0x2b, 0xb0, 0x35, 0x67, 0x5a, 0x50, 0xff, 0x58, 0xf2, 0xc2, 0x42, 0xe4, 0x71, 0x0a, 0xec, 0xe6, 0x46, 0x70, 0x07, 0x9c, 0x13, 0x04, 0x4c, 0x79, 0xc9, 0xb7, 0x49, 0x1f, 0x70, 0x00 },
+ // 191
+ { 0xd1, 0x20, 0xb5, 0xef, 0x6d, 0x57, 0xeb, 0xf0, 0x6e, 0xaf, 0x96, 0xbc, 0x93, 0x3c, 0x96, 0x7b, 0x16, 0xcb, 0xe6, 0xe2, 0xbf, 0x00, 0x74, 0x1c, 0x30, 0xaa, 0x1c, 0x54, 0xba, 0x64, 0x80, 0x1f },
+ // 192
+ { 0x58, 0xd2, 0x12, 0xad, 0x6f, 0x58, 0xae, 0xf0, 0xf8, 0x01, 0x16, 0xb4, 0x41, 0xe5, 0x7f, 0x61, 0x95, 0xbf, 0xef, 0x26, 0xb6, 0x14, 0x63, 0xed, 0xec, 0x11, 0x83, 0xcd, 0xb0, 0x4f, 0xe7, 0x6d },
+ // 193
+ { 0xb8, 0x83, 0x6f, 0x51, 0xd1, 0xe2, 0x9b, 0xdf, 0xdb, 0xa3, 0x25, 0x56, 0x53, 0x60, 0x26, 0x8b, 0x8f, 0xad, 0x62, 0x74, 0x73, 0xed, 0xec, 0xef, 0x7e, 0xae, 0xfe, 0xe8, 0x37, 0xc7, 0x40, 0x03 },
+ // 194
+ { 0xc5, 0x47, 0xa3, 0xc1, 0x24, 0xae, 0x56, 0x85, 0xff, 0xa7, 0xb8, 0xed, 0xaf, 0x96, 0xec, 0x86, 0xf8, 0xb2, 0xd0, 0xd5, 0x0c, 0xee, 0x8b, 0xe3, 0xb1, 0xf0, 0xc7, 0x67, 0x63, 0x06, 0x9d, 0x9c },
+ // 195
+ { 0x5d, 0x16, 0x8b, 0x76, 0x9a, 0x2f, 0x67, 0x85, 0x3d, 0x62, 0x95, 0xf7, 0x56, 0x8b, 0xe4, 0x0b, 0xb7, 0xa1, 0x6b, 0x8d, 0x65, 0xba, 0x87, 0x63, 0x5d, 0x19, 0x78, 0xd2, 0xab, 0x11, 0xba, 0x2a },
+ // 196
+ { 0xa2, 0xf6, 0x75, 0xdc, 0x73, 0x02, 0x63, 0x8c, 0xb6, 0x02, 0x01, 0x06, 0x4c, 0xa5, 0x50, 0x77, 0x71, 0x4d, 0x71, 0xfe, 0x09, 0x6a, 0x31, 0x5f, 0x2f, 0xe7, 0x40, 0x12, 0x77, 0xca, 0xa5, 0xaf },
+ // 197
+ { 0xc8, 0xaa, 0xb5, 0xcd, 0x01, 0x60, 0xae, 0x78, 0xcd, 0x2e, 0x8a, 0xc5, 0xfb, 0x0e, 0x09, 0x3c, 0xdb, 0x5c, 0x4b, 0x60, 0x52, 0xa0, 0xa9, 0x7b, 0xb0, 0x42, 0x16, 0x82, 0x6f, 0xa7, 0xa4, 0x37 },
+ // 198
+ { 0xff, 0x68, 0xca, 0x40, 0x35, 0xbf, 0xeb, 0x43, 0xfb, 0xf1, 0x45, 0xfd, 0xdd, 0x5e, 0x43, 0xf1, 0xce, 0xa5, 0x4f, 0x11, 0xf7, 0xbe, 0xe1, 0x30, 0x58, 0xf0, 0x27, 0x32, 0x9a, 0x4a, 0x5f, 0xa4 },
+ // 199
+ { 0x1d, 0x4e, 0x54, 0x87, 0xae, 0x3c, 0x74, 0x0f, 0x2b, 0xa6, 0xe5, 0x41, 0xac, 0x91, 0xbc, 0x2b, 0xfc, 0xd2, 0x99, 0x9c, 0x51, 0x8d, 0x80, 0x7b, 0x42, 0x67, 0x48, 0x80, 0x3a, 0x35, 0x0f, 0xd4 },
+ // 200
+ { 0x6d, 0x24, 0x4e, 0x1a, 0x06, 0xce, 0x4e, 0xf5, 0x78, 0xdd, 0x0f, 0x63, 0xaf, 0xf0, 0x93, 0x67, 0x06, 0x73, 0x51, 0x19, 0xca, 0x9c, 0x8d, 0x22, 0xd8, 0x6c, 0x80, 0x14, 0x14, 0xab, 0x97, 0x41 },
+ // 201
+ { 0xde, 0xcf, 0x73, 0x29, 0xdb, 0xcc, 0x82, 0x7b, 0x8f, 0xc5, 0x24, 0xc9, 0x43, 0x1e, 0x89, 0x98, 0x02, 0x9e, 0xce, 0x12, 0xce, 0x93, 0xb7, 0xb2, 0xf3, 0xe7, 0x69, 0xa9, 0x41, 0xfb, 0x8c, 0xea },
+ // 202
+ { 0x2f, 0xaf, 0xcc, 0x0f, 0x2e, 0x63, 0xcb, 0xd0, 0x77, 0x55, 0xbe, 0x7b, 0x75, 0xec, 0xea, 0x0a, 0xdf, 0xf9, 0xaa, 0x5e, 0xde, 0x2a, 0x52, 0xfd, 0xab, 0x4d, 0xfd, 0x03, 0x74, 0xcd, 0x48, 0x3f },
+ // 203
+ { 0xaa, 0x85, 0x01, 0x0d, 0xd4, 0x6a, 0x54, 0x6b, 0x53, 0x5e, 0xf4, 0xcf, 0x5f, 0x07, 0xd6, 0x51, 0x61, 0xe8, 0x98, 0x28, 0xf3, 0xa7, 0x7d, 0xb7, 0xb9, 0xb5, 0x6f, 0x0d, 0xf5, 0x9a, 0xae, 0x45 },
+ // 204
+ { 0x07, 0xe8, 0xe1, 0xee, 0x73, 0x2c, 0xb0, 0xd3, 0x56, 0xc9, 0xc0, 0xd1, 0x06, 0x9c, 0x89, 0xd1, 0x7a, 0xdf, 0x6a, 0x9a, 0x33, 0x4f, 0x74, 0x5e, 0xc7, 0x86, 0x73, 0x32, 0x54, 0x8c, 0xa8, 0xe9 },
+ // 205
+ { 0x0e, 0x01, 0xe8, 0x1c, 0xad, 0xa8, 0x16, 0x2b, 0xfd, 0x5f, 0x8a, 0x8c, 0x81, 0x8a, 0x6c, 0x69, 0xfe, 0xdf, 0x02, 0xce, 0xb5, 0x20, 0x85, 0x23, 0xcb, 0xe5, 0x31, 0x3b, 0x89, 0xca, 0x10, 0x53 },
+ // 206
+ { 0x6b, 0xb6, 0xc6, 0x47, 0x26, 0x55, 0x08, 0x43, 0x99, 0x85, 0x2e, 0x00, 0x24, 0x9f, 0x8c, 0xb2, 0x47, 0x89, 0x6d, 0x39, 0x2b, 0x02, 0xd7, 0x3b, 0x7f, 0x0d, 0xd8, 0x18, 0xe1, 0xe2, 0x9b, 0x07 },
+ // 207
+ { 0x42, 0xd4, 0x63, 0x6e, 0x20, 0x60, 0xf0, 0x8f, 0x41, 0xc8, 0x82, 0xe7, 0x6b, 0x39, 0x6b, 0x11, 0x2e, 0xf6, 0x27, 0xcc, 0x24, 0xc4, 0x3d, 0xd5, 0xf8, 0x3a, 0x1d, 0x1a, 0x7e, 0xad, 0x71, 0x1a },
+ // 208
+ { 0x48, 0x58, 0xc9, 0xa1, 0x88, 0xb0, 0x23, 0x4f, 0xb9, 0xa8, 0xd4, 0x7d, 0x0b, 0x41, 0x33, 0x65, 0x0a, 0x03, 0x0b, 0xd0, 0x61, 0x1b, 0x87, 0xc3, 0x89, 0x2e, 0x94, 0x95, 0x1f, 0x8d, 0xf8, 0x52 },
+ // 209
+ { 0x3f, 0xab, 0x3e, 0x36, 0x98, 0x8d, 0x44, 0x5a, 0x51, 0xc8, 0x78, 0x3e, 0x53, 0x1b, 0xe3, 0xa0, 0x2b, 0xe4, 0x0c, 0xd0, 0x47, 0x96, 0xcf, 0xb6, 0x1d, 0x40, 0x34, 0x74, 0x42, 0xd3, 0xf7, 0x94 },
+ // 210
+ { 0xeb, 0xab, 0xc4, 0x96, 0x36, 0xbd, 0x43, 0x3d, 0x2e, 0xc8, 0xf0, 0xe5, 0x18, 0x73, 0x2e, 0xf8, 0xfa, 0x21, 0xd4, 0xd0, 0x71, 0xcc, 0x3b, 0xc4, 0x6c, 0xd7, 0x9f, 0xa3, 0x8a, 0x28, 0xb8, 0x10 },
+ // 211
+ { 0xa1, 0xd0, 0x34, 0x35, 0x23, 0xb8, 0x93, 0xfc, 0xa8, 0x4f, 0x47, 0xfe, 0xb4, 0xa6, 0x4d, 0x35, 0x0a, 0x17, 0xd8, 0xee, 0xf5, 0x49, 0x7e, 0xce, 0x69, 0x7d, 0x02, 0xd7, 0x91, 0x78, 0xb5, 0x91 },
+ // 212
+ { 0x26, 0x2e, 0xbf, 0xd9, 0x13, 0x0b, 0x7d, 0x28, 0x76, 0x0d, 0x08, 0xef, 0x8b, 0xfd, 0x3b, 0x86, 0xcd, 0xd3, 0xb2, 0x11, 0x3d, 0x2c, 0xae, 0xf7, 0xea, 0x95, 0x1a, 0x30, 0x3d, 0xfa, 0x38, 0x46 },
+ // 213
+ { 0xf7, 0x61, 0x58, 0xed, 0xd5, 0x0a, 0x15, 0x4f, 0xa7, 0x82, 0x03, 0xed, 0x23, 0x62, 0x93, 0x2f, 0xcb, 0x82, 0x53, 0xaa, 0xe3, 0x78, 0x90, 0x3e, 0xde, 0xd1, 0xe0, 0x3f, 0x70, 0x21, 0xa2, 0x57 },
+ // 214
+ { 0x26, 0x17, 0x8e, 0x95, 0x0a, 0xc7, 0x22, 0xf6, 0x7a, 0xe5, 0x6e, 0x57, 0x1b, 0x28, 0x4c, 0x02, 0x07, 0x68, 0x4a, 0x63, 0x34, 0xa1, 0x77, 0x48, 0xa9, 0x4d, 0x26, 0x0b, 0xc5, 0xf5, 0x52, 0x74 },
+ // 215
+ { 0xc3, 0x78, 0xd1, 0xe4, 0x93, 0xb4, 0x0e, 0xf1, 0x1f, 0xe6, 0xa1, 0x5d, 0x9c, 0x27, 0x37, 0xa3, 0x78, 0x09, 0x63, 0x4c, 0x5a, 0xba, 0xd5, 0xb3, 0x3d, 0x7e, 0x39, 0x3b, 0x4a, 0xe0, 0x5d, 0x03 },
+ // 216
+ { 0x98, 0x4b, 0xd8, 0x37, 0x91, 0x01, 0xbe, 0x8f, 0xd8, 0x06, 0x12, 0xd8, 0xea, 0x29, 0x59, 0xa7, 0x86, 0x5e, 0xc9, 0x71, 0x85, 0x23, 0x55, 0x01, 0x07, 0xae, 0x39, 0x38, 0xdf, 0x32, 0x01, 0x1b },
+ // 217
+ { 0xc6, 0xf2, 0x5a, 0x81, 0x2a, 0x14, 0x48, 0x58, 0xac, 0x5c, 0xed, 0x37, 0xa9, 0x3a, 0x9f, 0x47, 0x59, 0xba, 0x0b, 0x1c, 0x0f, 0xdc, 0x43, 0x1d, 0xce, 0x35, 0xf9, 0xec, 0x1f, 0x1f, 0x4a, 0x99 },
+ // 218
+ { 0x92, 0x4c, 0x75, 0xc9, 0x44, 0x24, 0xff, 0x75, 0xe7, 0x4b, 0x8b, 0x4e, 0x94, 0x35, 0x89, 0x58, 0xb0, 0x27, 0xb1, 0x71, 0xdf, 0x5e, 0x57, 0x89, 0x9a, 0xd0, 0xd4, 0xda, 0xc3, 0x73, 0x53, 0xb6 },
+ // 219
+ { 0x0a, 0xf3, 0x58, 0x92, 0xa6, 0x3f, 0x45, 0x93, 0x1f, 0x68, 0x46, 0xed, 0x19, 0x03, 0x61, 0xcd, 0x07, 0x30, 0x89, 0xe0, 0x77, 0x16, 0x57, 0x14, 0xb5, 0x0b, 0x81, 0xa2, 0xe3, 0xdd, 0x9b, 0xa1 },
+ // 220
+ { 0xcc, 0x80, 0xce, 0xfb, 0x26, 0xc3, 0xb2, 0xb0, 0xda, 0xef, 0x23, 0x3e, 0x60, 0x6d, 0x5f, 0xfc, 0x80, 0xfa, 0x17, 0x42, 0x7d, 0x18, 0xe3, 0x04, 0x89, 0x67, 0x3e, 0x06, 0xef, 0x4b, 0x87, 0xf7 },
+ // 221
+ { 0xc2, 0xf8, 0xc8, 0x11, 0x74, 0x47, 0xf3, 0x97, 0x8b, 0x08, 0x18, 0xdc, 0xf6, 0xf7, 0x01, 0x16, 0xac, 0x56, 0xfd, 0x18, 0x4d, 0xd1, 0x27, 0x84, 0x94, 0xe1, 0x03, 0xfc, 0x6d, 0x74, 0xa8, 0x87 },
+ // 222
+ { 0xbd, 0xec, 0xf6, 0xbf, 0xc1, 0xba, 0x0d, 0xf6, 0xe8, 0x62, 0xc8, 0x31, 0x99, 0x22, 0x07, 0x79, 0x6a, 0xcc, 0x79, 0x79, 0x68, 0x35, 0x88, 0x28, 0xc0, 0x6e, 0x7a, 0x51, 0xe0, 0x90, 0x09, 0x8f },
+ // 223
+ { 0x24, 0xd1, 0xa2, 0x6e, 0x3d, 0xab, 0x02, 0xfe, 0x45, 0x72, 0xd2, 0xaa, 0x7d, 0xbd, 0x3e, 0xc3, 0x0f, 0x06, 0x93, 0xdb, 0x26, 0xf2, 0x73, 0xd0, 0xab, 0x2c, 0xb0, 0xc1, 0x3b, 0x5e, 0x64, 0x51 },
+ // 224
+ { 0xec, 0x56, 0xf5, 0x8b, 0x09, 0x29, 0x9a, 0x30, 0x0b, 0x14, 0x05, 0x65, 0xd7, 0xd3, 0xe6, 0x87, 0x82, 0xb6, 0xe2, 0xfb, 0xeb, 0x4b, 0x7e, 0xa9, 0x7a, 0xc0, 0x57, 0x98, 0x90, 0x61, 0xdd, 0x3f },
+ // 225
+ { 0x11, 0xa4, 0x37, 0xc1, 0xab, 0xa3, 0xc1, 0x19, 0xdd, 0xfa, 0xb3, 0x1b, 0x3e, 0x8c, 0x84, 0x1d, 0xee, 0xeb, 0x91, 0x3e, 0xf5, 0x7f, 0x7e, 0x48, 0xf2, 0xc9, 0xcf, 0x5a, 0x28, 0xfa, 0x42, 0xbc },
+ // 226
+ { 0x53, 0xc7, 0xe6, 0x11, 0x4b, 0x85, 0x0a, 0x2c, 0xb4, 0x96, 0xc9, 0xb3, 0xc6, 0x9a, 0x62, 0x3e, 0xae, 0xa2, 0xcb, 0x1d, 0x33, 0xdd, 0x81, 0x7e, 0x47, 0x65, 0xed, 0xaa, 0x68, 0x23, 0xc2, 0x28 },
+ // 227
+ { 0x15, 0x4c, 0x3e, 0x96, 0xfe, 0xe5, 0xdb, 0x14, 0xf8, 0x77, 0x3e, 0x18, 0xaf, 0x14, 0x85, 0x79, 0x13, 0x50, 0x9d, 0xa9, 0x99, 0xb4, 0x6c, 0xdd, 0x3d, 0x4c, 0x16, 0x97, 0x60, 0xc8, 0x3a, 0xd2 },
+ // 228
+ { 0x40, 0xb9, 0x91, 0x6f, 0x09, 0x3e, 0x02, 0x7a, 0x87, 0x86, 0x64, 0x18, 0x18, 0x92, 0x06, 0x20, 0x47, 0x2f, 0xbc, 0xf6, 0x8f, 0x70, 0x1d, 0x1b, 0x68, 0x06, 0x32, 0xe6, 0x99, 0x6b, 0xde, 0xd3 },
+ // 229
+ { 0x24, 0xc4, 0xcb, 0xba, 0x07, 0x11, 0x98, 0x31, 0xa7, 0x26, 0xb0, 0x53, 0x05, 0xd9, 0x6d, 0xa0, 0x2f, 0xf8, 0xb1, 0x48, 0xf0, 0xda, 0x44, 0x0f, 0xe2, 0x33, 0xbc, 0xaa, 0x32, 0xc7, 0x2f, 0x6f },
+ // 230
+ { 0x5d, 0x20, 0x15, 0x10, 0x25, 0x00, 0x20, 0xb7, 0x83, 0x68, 0x96, 0x88, 0xab, 0xbf, 0x8e, 0xcf, 0x25, 0x94, 0xa9, 0x6a, 0x08, 0xf2, 0xbf, 0xec, 0x6c, 0xe0, 0x57, 0x44, 0x65, 0xdd, 0xed, 0x71 },
+ // 231
+ { 0x04, 0x3b, 0x97, 0xe3, 0x36, 0xee, 0x6f, 0xdb, 0xbe, 0x2b, 0x50, 0xf2, 0x2a, 0xf8, 0x32, 0x75, 0xa4, 0x08, 0x48, 0x05, 0xd2, 0xd5, 0x64, 0x59, 0x62, 0x45, 0x4b, 0x6c, 0x9b, 0x80, 0x53, 0xa0 },
+ // 232
+ { 0x56, 0x48, 0x35, 0xcb, 0xae, 0xa7, 0x74, 0x94, 0x85, 0x68, 0xbe, 0x36, 0xcf, 0x52, 0xfc, 0xdd, 0x83, 0x93, 0x4e, 0xb0, 0xa2, 0x75, 0x12, 0xdb, 0xe3, 0xe2, 0xdb, 0x47, 0xb9, 0xe6, 0x63, 0x5a },
+ // 233
+ { 0xf2, 0x1c, 0x33, 0xf4, 0x7b, 0xde, 0x40, 0xa2, 0xa1, 0x01, 0xc9, 0xcd, 0xe8, 0x02, 0x7a, 0xaf, 0x61, 0xa3, 0x13, 0x7d, 0xe2, 0x42, 0x2b, 0x30, 0x03, 0x5a, 0x04, 0xc2, 0x70, 0x89, 0x41, 0x83 },
+ // 234
+ { 0x9d, 0xb0, 0xef, 0x74, 0xe6, 0x6c, 0xbb, 0x84, 0x2e, 0xb0, 0xe0, 0x73, 0x43, 0xa0, 0x3c, 0x5c, 0x56, 0x7e, 0x37, 0x2b, 0x3f, 0x23, 0xb9, 0x43, 0xc7, 0x88, 0xa4, 0xf2, 0x50, 0xf6, 0x78, 0x91 },
+ // 235
+ { 0xab, 0x8d, 0x08, 0x65, 0x5f, 0xf1, 0xd3, 0xfe, 0x87, 0x58, 0xd5, 0x62, 0x23, 0x5f, 0xd2, 0x3e, 0x7c, 0xf9, 0xdc, 0xaa, 0xd6, 0x58, 0x87, 0x2a, 0x49, 0xe5, 0xd3, 0x18, 0x3b, 0x6c, 0xce, 0xbd },
+ // 236
+ { 0x6f, 0x27, 0xf7, 0x7e, 0x7b, 0xcf, 0x46, 0xa1, 0xe9, 0x63, 0xad, 0xe0, 0x30, 0x97, 0x33, 0x54, 0x30, 0x31, 0xdc, 0xcd, 0xd4, 0x7c, 0xaa, 0xc1, 0x74, 0xd7, 0xd2, 0x7c, 0xe8, 0x07, 0x7e, 0x8b },
+ // 237
+ { 0xe3, 0xcd, 0x54, 0xda, 0x7e, 0x44, 0x4c, 0xaa, 0x62, 0x07, 0x56, 0x95, 0x25, 0xa6, 0x70, 0xeb, 0xae, 0x12, 0x78, 0xde, 0x4e, 0x3f, 0xe2, 0x68, 0x4b, 0x3e, 0x33, 0xf5, 0xef, 0x90, 0xcc, 0x1b },
+ // 238
+ { 0xb2, 0xc3, 0xe3, 0x3a, 0x51, 0xd2, 0x2c, 0x4c, 0x08, 0xfc, 0x09, 0x89, 0xc8, 0x73, 0xc9, 0xcc, 0x41, 0x50, 0x57, 0x9b, 0x1e, 0x61, 0x63, 0xfa, 0x69, 0x4a, 0xd5, 0x1d, 0x53, 0xd7, 0x12, 0xdc },
+ // 239
+ { 0xbe, 0x7f, 0xda, 0x98, 0x3e, 0x13, 0x18, 0x9b, 0x4c, 0x77, 0xe0, 0xa8, 0x09, 0x20, 0xb6, 0xe0, 0xe0, 0xea, 0x80, 0xc3, 0xb8, 0x4d, 0xbe, 0x7e, 0x71, 0x17, 0xd2, 0x53, 0xf4, 0x81, 0x12, 0xf4 },
+ // 240
+ { 0xb6, 0x00, 0x8c, 0x28, 0xfa, 0xe0, 0x8a, 0xa4, 0x27, 0xe5, 0xbd, 0x3a, 0xad, 0x36, 0xf1, 0x00, 0x21, 0xf1, 0x6c, 0x77, 0xcf, 0xea, 0xbe, 0xd0, 0x7f, 0x97, 0xcc, 0x7d, 0xc1, 0xf1, 0x28, 0x4a },
+ // 241
+ { 0x6e, 0x4e, 0x67, 0x60, 0xc5, 0x38, 0xf2, 0xe9, 0x7b, 0x3a, 0xdb, 0xfb, 0xbc, 0xde, 0x57, 0xf8, 0x96, 0x6b, 0x7e, 0xa8, 0xfc, 0xb5, 0xbf, 0x7e, 0xfe, 0xc9, 0x13, 0xfd, 0x2a, 0x2b, 0x0c, 0x55 },
+ // 242
+ { 0x4a, 0xe5, 0x1f, 0xd1, 0x83, 0x4a, 0xa5, 0xbd, 0x9a, 0x6f, 0x7e, 0xc3, 0x9f, 0xc6, 0x63, 0x33, 0x8d, 0xc5, 0xd2, 0xe2, 0x07, 0x61, 0x56, 0x6d, 0x90, 0xcc, 0x68, 0xb1, 0xcb, 0x87, 0x5e, 0xd8 },
+ // 243
+ { 0xb6, 0x73, 0xaa, 0xd7, 0x5a, 0xb1, 0xfd, 0xb5, 0x40, 0x1a, 0xbf, 0xa1, 0xbf, 0x89, 0xf3, 0xad, 0xd2, 0xeb, 0xc4, 0x68, 0xdf, 0x36, 0x24, 0xa4, 0x78, 0xf4, 0xfe, 0x85, 0x9d, 0x8d, 0x55, 0xe2 },
+ // 244
+ { 0x13, 0xc9, 0x47, 0x1a, 0x98, 0x55, 0x91, 0x35, 0x39, 0x83, 0x66, 0x60, 0x39, 0x8d, 0xa0, 0xf3, 0xf9, 0x9a, 0xda, 0x08, 0x47, 0x9c, 0x69, 0xd1, 0xb7, 0xfc, 0xaa, 0x34, 0x61, 0xdd, 0x7e, 0x59 },
+ // 245
+ { 0x2c, 0x11, 0xf4, 0xa7, 0xf9, 0x9a, 0x1d, 0x23, 0xa5, 0x8b, 0xb6, 0x36, 0x35, 0x0f, 0xe8, 0x49, 0xf2, 0x9c, 0xba, 0xc1, 0xb2, 0xa1, 0x11, 0x2d, 0x9f, 0x1e, 0xd5, 0xbc, 0x5b, 0x31, 0x3c, 0xcd },
+ // 246
+ { 0xc7, 0xd3, 0xc0, 0x70, 0x6b, 0x11, 0xae, 0x74, 0x1c, 0x05, 0xa1, 0xef, 0x15, 0x0d, 0xd6, 0x5b, 0x54, 0x94, 0xd6, 0xd5, 0x4c, 0x9a, 0x86, 0xe2, 0x61, 0x78, 0x54, 0xe6, 0xae, 0xee, 0xbb, 0xd9 },
+ // 247
+ { 0x19, 0x4e, 0x10, 0xc9, 0x38, 0x93, 0xaf, 0xa0, 0x64, 0xc3, 0xac, 0x04, 0xc0, 0xdd, 0x80, 0x8d, 0x79, 0x1c, 0x3d, 0x4b, 0x75, 0x56, 0xe8, 0x9d, 0x8d, 0x9c, 0xb2, 0x25, 0xc4, 0xb3, 0x33, 0x39 },
+ // 248
+ { 0x6f, 0xc4, 0x98, 0x8b, 0x8f, 0x78, 0x54, 0x6b, 0x16, 0x88, 0x99, 0x18, 0x45, 0x90, 0x8f, 0x13, 0x4b, 0x6a, 0x48, 0x2e, 0x69, 0x94, 0xb3, 0xd4, 0x83, 0x17, 0xbf, 0x08, 0xdb, 0x29, 0x21, 0x85 },
+ // 249
+ { 0x56, 0x65, 0xbe, 0xb8, 0xb0, 0x95, 0x55, 0x25, 0x81, 0x3b, 0x59, 0x81, 0xcd, 0x14, 0x2e, 0xd4, 0xd0, 0x3f, 0xba, 0x38, 0xa6, 0xf3, 0xe5, 0xad, 0x26, 0x8e, 0x0c, 0xc2, 0x70, 0xd1, 0xcd, 0x11 },
+ // 250
+ { 0xb8, 0x83, 0xd6, 0x8f, 0x5f, 0xe5, 0x19, 0x36, 0x43, 0x1b, 0xa4, 0x25, 0x67, 0x38, 0x05, 0x3b, 0x1d, 0x04, 0x26, 0xd4, 0xcb, 0x64, 0xb1, 0x6e, 0x83, 0xba, 0xdc, 0x5e, 0x9f, 0xbe, 0x3b, 0x81 },
+ // 251
+ { 0x53, 0xe7, 0xb2, 0x7e, 0xa5, 0x9c, 0x2f, 0x6d, 0xbb, 0x50, 0x76, 0x9e, 0x43, 0x55, 0x4d, 0xf3, 0x5a, 0xf8, 0x9f, 0x48, 0x22, 0xd0, 0x46, 0x6b, 0x00, 0x7d, 0xd6, 0xf6, 0xde, 0xaf, 0xff, 0x02 },
+ // 252
+ { 0x1f, 0x1a, 0x02, 0x29, 0xd4, 0x64, 0x0f, 0x01, 0x90, 0x15, 0x88, 0xd9, 0xde, 0xc2, 0x2d, 0x13, 0xfc, 0x3e, 0xb3, 0x4a, 0x61, 0xb3, 0x29, 0x38, 0xef, 0xbf, 0x53, 0x34, 0xb2, 0x80, 0x0a, 0xfa },
+ // 253
+ { 0xc2, 0xb4, 0x05, 0xaf, 0xa0, 0xfa, 0x66, 0x68, 0x85, 0x2a, 0xee, 0x4d, 0x88, 0x04, 0x08, 0x53, 0xfa, 0xb8, 0x00, 0xe7, 0x2b, 0x57, 0x58, 0x14, 0x18, 0xe5, 0x50, 0x6f, 0x21, 0x4c, 0x7d, 0x1f },
+ // 254
+ { 0xc0, 0x8a, 0xa1, 0xc2, 0x86, 0xd7, 0x09, 0xfd, 0xc7, 0x47, 0x37, 0x44, 0x97, 0x71, 0x88, 0xc8, 0x95, 0xba, 0x01, 0x10, 0x14, 0x24, 0x7e, 0x4e, 0xfa, 0x8d, 0x07, 0xe7, 0x8f, 0xec, 0x69, 0x5c },
+ // 255
+ { 0xf0, 0x3f, 0x57, 0x89, 0xd3, 0x33, 0x6b, 0x80, 0xd0, 0x02, 0xd5, 0x9f, 0xdf, 0x91, 0x8b, 0xdb, 0x77, 0x5b, 0x00, 0x95, 0x6e, 0xd5, 0x52, 0x8e, 0x86, 0xaa, 0x99, 0x4a, 0xcb, 0x38, 0xfe, 0x2d },
+};
+static const uint8_t secret_KATs[256][32] = {
+ // 0
+ { 0xc2, 0x46, 0x11, 0x1b, 0x7f, 0xd2, 0xad, 0x01, 0x78, 0xfa, 0x71, 0xa3, 0x2d, 0xd6, 0xc3, 0x85, 0x3f, 0x0b, 0xb5, 0x27, 0xbb, 0x7e, 0x7f, 0x43, 0x11, 0x31, 0xe5, 0xea, 0xd8, 0x44, 0x98, 0x09 },
+ // 1
+ { 0xea, 0x7d, 0x63, 0x3f, 0xd6, 0x97, 0x31, 0xbd, 0x1c, 0xff, 0x95, 0x42, 0xe9, 0x11, 0xdf, 0x43, 0xa2, 0x2a, 0x32, 0x8c, 0x59, 0x25, 0x73, 0x23, 0xd0, 0x62, 0x9a, 0xa2, 0xb7, 0x25, 0x61, 0x85 },
+ // 2
+ { 0x2b, 0x12, 0x3b, 0x56, 0x40, 0x76, 0xc9, 0xbd, 0xfe, 0xd5, 0x16, 0x21, 0x38, 0xe3, 0xd5, 0xfa, 0x9e, 0x7b, 0x79, 0xc6, 0xd2, 0xfc, 0x1c, 0xf0, 0x14, 0x31, 0x1e, 0xbb, 0xd3, 0x8d, 0x32, 0x32 },
+ // 3
+ { 0x0d, 0x93, 0xb5, 0xb5, 0x26, 0xc7, 0x2b, 0xd9, 0x8e, 0xc1, 0x20, 0xe9, 0xd8, 0x50, 0x18, 0x00, 0x86, 0x7a, 0x60, 0x98, 0x5a, 0x91, 0xeb, 0x53, 0x92, 0x02, 0x5b, 0x3e, 0x57, 0xe4, 0x30, 0x8b },
+ // 4
+ { 0x24, 0x6c, 0x1e, 0x43, 0x3f, 0xfc, 0x88, 0x36, 0x05, 0x6d, 0x86, 0xa5, 0xef, 0xa4, 0x83, 0x10, 0x7a, 0x5f, 0xb7, 0x6b, 0x15, 0xcd, 0xdd, 0x41, 0x75, 0x49, 0x8e, 0xb5, 0x52, 0x8f, 0x09, 0x7a },
+ // 5
+ { 0x9a, 0x3d, 0xbe, 0xcc, 0x68, 0x23, 0x3c, 0x75, 0x33, 0x7f, 0x13, 0xe7, 0xce, 0x2a, 0x67, 0x61, 0x8d, 0xcd, 0x9e, 0x12, 0xf6, 0x17, 0xaa, 0xb1, 0xae, 0x0d, 0xaa, 0xac, 0xa7, 0xdf, 0x16, 0xaa },
+ // 6
+ { 0xd9, 0x97, 0xf9, 0x97, 0x8a, 0x46, 0x52, 0x67, 0xc5, 0xef, 0x9f, 0xad, 0x38, 0x62, 0xca, 0x5a, 0x40, 0x59, 0xa6, 0xd7, 0xf1, 0x41, 0x92, 0x34, 0xa8, 0xf3, 0xd2, 0x2b, 0xa2, 0xaa, 0x96, 0x79 },
+ // 7
+ { 0x1d, 0xcc, 0xda, 0x90, 0x6c, 0xa9, 0x1e, 0xcd, 0xbb, 0x17, 0x55, 0x70, 0xd9, 0xcb, 0xe3, 0x4c, 0x32, 0xd5, 0x68, 0xb0, 0x98, 0x23, 0x25, 0xb9, 0x54, 0xa0, 0x2a, 0x77, 0x37, 0x13, 0xd6, 0x9a },
+ // 8
+ { 0x92, 0x33, 0x0f, 0x59, 0x33, 0x77, 0xd1, 0x7a, 0x93, 0x4f, 0x14, 0x7e, 0x7e, 0x7d, 0xff, 0x42, 0xf4, 0x23, 0xf7, 0x6c, 0xc3, 0x3c, 0xd0, 0xb6, 0x93, 0xe6, 0xa7, 0x8d, 0xea, 0x25, 0xb3, 0x67 },
+ // 9
+ { 0xa3, 0xc6, 0xe0, 0x9c, 0x34, 0xd7, 0x15, 0x50, 0x22, 0xd9, 0xd8, 0xc7, 0xe8, 0x83, 0x81, 0x08, 0xf5, 0xd8, 0xf8, 0xc9, 0x48, 0xc3, 0xa3, 0x91, 0xe9, 0x75, 0x3f, 0x17, 0xf8, 0x37, 0x32, 0x0a },
+ // 10
+ { 0x35, 0x50, 0xd0, 0xbe, 0x66, 0xa1, 0x17, 0x48, 0x7a, 0x6b, 0x09, 0x2e, 0x85, 0x29, 0xce, 0x85, 0x4c, 0x03, 0x83, 0xc5, 0xfb, 0xc5, 0xcc, 0x8f, 0x25, 0x9b, 0xc7, 0x35, 0x24, 0xde, 0x8e, 0x95 },
+ // 11
+ { 0x39, 0xe9, 0xfc, 0x92, 0x42, 0x33, 0x42, 0xa4, 0xf9, 0xbf, 0x07, 0xbb, 0x19, 0x4c, 0x5f, 0x82, 0x60, 0x6c, 0xe0, 0x54, 0x05, 0x2e, 0xf9, 0xff, 0xc2, 0x66, 0xe1, 0x7e, 0xf2, 0xbd, 0x7f, 0x7f },
+ // 12
+ { 0x13, 0xc0, 0xc0, 0x24, 0xf3, 0x58, 0x81, 0xc8, 0x38, 0xa3, 0x30, 0x4f, 0x9d, 0x5c, 0x84, 0xce, 0x29, 0x95, 0xfa, 0xe3, 0x78, 0x86, 0x47, 0x33, 0xd1, 0x2e, 0x36, 0x95, 0x9f, 0xa4, 0x19, 0xcd },
+ // 13
+ { 0xc0, 0xf4, 0x98, 0x5d, 0xd9, 0x82, 0xae, 0xde, 0xb4, 0xcb, 0x4e, 0x1c, 0x8e, 0x21, 0x6d, 0x30, 0xd2, 0x46, 0xdf, 0x5d, 0xd3, 0x46, 0xe3, 0xb9, 0xbe, 0xaa, 0x39, 0x99, 0xd9, 0x1c, 0xa9, 0xaf },
+ // 14
+ { 0xc7, 0x42, 0x6a, 0x25, 0x9f, 0xf5, 0x0c, 0x43, 0xba, 0x85, 0xe8, 0x49, 0x1d, 0x99, 0x7c, 0xc2, 0xbf, 0x69, 0x79, 0xe9, 0x45, 0xd5, 0x6d, 0xcb, 0xf8, 0x5f, 0x57, 0xfe, 0x23, 0x48, 0x97, 0x9e },
+ // 15
+ { 0xa0, 0x23, 0x5d, 0x3c, 0xc3, 0x69, 0x6f, 0x61, 0xc0, 0xf0, 0xea, 0xe1, 0xe9, 0x74, 0x05, 0xcb, 0xd8, 0x41, 0x01, 0x31, 0xe7, 0x35, 0xac, 0xf4, 0x8f, 0xf2, 0x40, 0x3b, 0x16, 0xa5, 0x37, 0xaa },
+ // 16
+ { 0xb4, 0xfc, 0xec, 0x34, 0x89, 0x1f, 0x0a, 0xd4, 0xf2, 0xce, 0x4d, 0xd3, 0xc2, 0x5e, 0x09, 0x1f, 0xe9, 0x80, 0xd0, 0xfc, 0xb1, 0x00, 0xcd, 0xdf, 0xc8, 0x63, 0x4c, 0xa1, 0x6f, 0x9b, 0x15, 0x5f },
+ // 17
+ { 0x7d, 0xb4, 0xe5, 0xfa, 0x52, 0xa6, 0xd9, 0x19, 0xa8, 0xd5, 0x18, 0x0e, 0xfb, 0xea, 0xe4, 0x9c, 0xf4, 0xd7, 0xbb, 0xad, 0xd3, 0x79, 0xa7, 0x0d, 0x26, 0xc9, 0x4f, 0xc9, 0xff, 0xc6, 0xd2, 0xd3 },
+ // 18
+ { 0xa6, 0x09, 0xee, 0x20, 0xcb, 0xda, 0xe8, 0x5d, 0xc3, 0x7c, 0x14, 0xca, 0x68, 0x15, 0x88, 0x8e, 0x97, 0xe6, 0x91, 0xb5, 0x5b, 0x2f, 0xe9, 0x5f, 0x61, 0x4d, 0x89, 0x24, 0x75, 0x94, 0xb6, 0xb9 },
+ // 19
+ { 0x56, 0x5e, 0xeb, 0xd2, 0xda, 0x80, 0x11, 0x43, 0x6d, 0xfd, 0xf3, 0xa4, 0x92, 0xa7, 0x76, 0xdf, 0x67, 0xef, 0x6f, 0x4c, 0xf5, 0xfa, 0x0c, 0xf4, 0x63, 0xee, 0x2e, 0x56, 0x4d, 0x71, 0x41, 0xa4 },
+ // 20
+ { 0x5f, 0x28, 0x99, 0x4b, 0xb2, 0x30, 0x63, 0xe6, 0x48, 0x1b, 0xf4, 0x09, 0x64, 0x77, 0x6a, 0x03, 0x0d, 0x74, 0xe8, 0xc9, 0xb0, 0x91, 0xc3, 0xd9, 0x3a, 0x06, 0xd3, 0x74, 0x00, 0x95, 0x79, 0x86 },
+ // 21
+ { 0xc9, 0x94, 0x5f, 0x3f, 0x70, 0xee, 0x67, 0x5f, 0x1c, 0x9a, 0xc6, 0x93, 0x7e, 0x21, 0x0a, 0x50, 0x30, 0xaa, 0x56, 0x76, 0xdd, 0x72, 0x12, 0xe9, 0x57, 0x02, 0x19, 0x01, 0x8a, 0x85, 0xd5, 0x67 },
+ // 22
+ { 0xca, 0xd4, 0xa9, 0x7f, 0xff, 0xcb, 0x34, 0x4d, 0xfa, 0x85, 0x95, 0x23, 0x0e, 0x12, 0xc2, 0x04, 0x66, 0x63, 0x38, 0x7b, 0xa9, 0x83, 0xd5, 0x60, 0x52, 0x16, 0xe7, 0xf4, 0xff, 0xc6, 0xe9, 0xeb },
+ // 23
+ { 0xb1, 0xa4, 0x50, 0xec, 0xee, 0xe0, 0x71, 0x04, 0xd8, 0x2b, 0x16, 0x29, 0x6a, 0xf5, 0xa3, 0x99, 0x8f, 0xd7, 0x33, 0x76, 0x8e, 0x63, 0xa6, 0x80, 0x69, 0x60, 0xa1, 0x8c, 0x6c, 0x52, 0x81, 0xc1 },
+ // 24
+ { 0x06, 0x17, 0xc8, 0x44, 0xcd, 0x2c, 0xa8, 0xe7, 0x5d, 0xfb, 0xcc, 0x79, 0x26, 0x52, 0xfc, 0x73, 0x4e, 0x7e, 0x9c, 0x5e, 0x3d, 0x45, 0x65, 0xea, 0x2d, 0xe9, 0x83, 0xcb, 0x15, 0xe5, 0x95, 0x73 },
+ // 25
+ { 0xac, 0xef, 0x33, 0xd2, 0x25, 0x0e, 0xfc, 0x67, 0x28, 0x29, 0x7a, 0xda, 0xba, 0xa1, 0x1f, 0xc1, 0xb8, 0xab, 0x16, 0x4c, 0x3a, 0xa6, 0xa7, 0x9b, 0xd4, 0xe5, 0x3a, 0x1a, 0x0a, 0x89, 0x2a, 0xb9 },
+ // 26
+ { 0x16, 0x20, 0x23, 0x53, 0xf1, 0xc9, 0x17, 0xac, 0x67, 0x69, 0x73, 0xdc, 0x20, 0x55, 0x1d, 0xe2, 0x80, 0x9f, 0x4e, 0x63, 0xe3, 0x2a, 0x98, 0xf9, 0xe5, 0xa7, 0x90, 0xde, 0x79, 0x64, 0x9c, 0xef },
+ // 27
+ { 0x96, 0xab, 0xbc, 0x8b, 0x77, 0xfa, 0x09, 0x07, 0x69, 0xcc, 0x11, 0x75, 0x86, 0xd9, 0x9e, 0xdc, 0x6d, 0xeb, 0xc1, 0x12, 0x21, 0x73, 0x4d, 0x61, 0xfe, 0x87, 0xdc, 0xf2, 0x30, 0xf3, 0x93, 0xef },
+ // 28
+ { 0xc6, 0x18, 0x1d, 0xe0, 0x78, 0x94, 0xa3, 0xba, 0x37, 0x19, 0x1f, 0x7d, 0xd9, 0xb3, 0x17, 0xf7, 0xc0, 0xbe, 0x5b, 0xb3, 0x95, 0xab, 0x34, 0xb8, 0xb1, 0x53, 0xfa, 0xd8, 0x08, 0xc6, 0x8b, 0x3f },
+ // 29
+ { 0x9a, 0xfa, 0x47, 0x90, 0xd6, 0x75, 0x6f, 0x5a, 0x48, 0xa0, 0xd5, 0x7f, 0x20, 0x1a, 0x18, 0x44, 0xd6, 0x8b, 0x31, 0xa6, 0x44, 0xa2, 0x5b, 0x9f, 0x18, 0x53, 0xea, 0xa9, 0xd8, 0xb3, 0xcb, 0x73 },
+ // 30
+ { 0x78, 0x3f, 0x50, 0x46, 0x64, 0x8c, 0x0f, 0x5b, 0x8b, 0xc1, 0xfe, 0x09, 0xa8, 0xa0, 0x11, 0x71, 0xd4, 0xad, 0x60, 0x40, 0x69, 0x70, 0xf0, 0xd8, 0xbd, 0x29, 0x7d, 0x36, 0x0c, 0xfb, 0xe7, 0x40 },
+ // 31
+ { 0x32, 0x5a, 0x19, 0x6e, 0xc9, 0x08, 0xa9, 0x4b, 0x54, 0x10, 0x52, 0x3c, 0x03, 0x0d, 0xf7, 0xb2, 0xed, 0x5b, 0x69, 0x3d, 0xb3, 0x8f, 0x32, 0x6c, 0x82, 0xd7, 0x00, 0x01, 0xeb, 0x14, 0xd0, 0x41 },
+ // 32
+ { 0x64, 0xdb, 0x7e, 0xf8, 0x98, 0x4a, 0xf4, 0x77, 0x0e, 0xaf, 0xc2, 0x01, 0xfc, 0x7b, 0xc6, 0x11, 0x06, 0xe5, 0x09, 0xc7, 0xd8, 0xc7, 0x64, 0x8b, 0x13, 0x76, 0x1a, 0x15, 0xd9, 0x73, 0x07, 0xc7 },
+ // 33
+ { 0xbc, 0x20, 0x71, 0x1f, 0x33, 0x8c, 0x9a, 0xb8, 0x0d, 0x3e, 0x80, 0x36, 0x6b, 0x1b, 0x96, 0xf0, 0xd2, 0x72, 0x27, 0x03, 0xc3, 0x47, 0xe1, 0xbc, 0x6a, 0x0a, 0xeb, 0xc3, 0x5b, 0x5d, 0xda, 0x05 },
+ // 34
+ { 0x4a, 0xc6, 0xf4, 0x2f, 0xf0, 0x92, 0xfd, 0x36, 0xa9, 0x23, 0x95, 0xa4, 0xf8, 0x8a, 0xd0, 0xb2, 0xcd, 0xd6, 0x0c, 0x94, 0x9d, 0x15, 0x27, 0xa3, 0x12, 0x28, 0xc2, 0x06, 0x85, 0xdb, 0x71, 0x70 },
+ // 35
+ { 0x3d, 0x7e, 0x4a, 0xc9, 0x98, 0x0d, 0x55, 0x6e, 0x31, 0x18, 0x78, 0x0e, 0xc9, 0xcc, 0x69, 0x96, 0xa1, 0xc4, 0xbd, 0x84, 0x43, 0x8b, 0xea, 0x42, 0x2b, 0x05, 0x1e, 0x8f, 0xda, 0xd3, 0x13, 0xc4 },
+ // 36
+ { 0x36, 0x87, 0x8f, 0xd5, 0x4d, 0x00, 0x43, 0x24, 0x1a, 0xfc, 0xa0, 0x88, 0x85, 0xe5, 0xf0, 0x89, 0x23, 0x92, 0xed, 0x26, 0xaf, 0xf1, 0xe9, 0x90, 0x13, 0x25, 0x75, 0xc0, 0x54, 0x3b, 0x2b, 0x5d },
+ // 37
+ { 0xb2, 0x53, 0xa4, 0x7f, 0x48, 0x01, 0xdd, 0x13, 0xd8, 0x09, 0xd0, 0xd4, 0x40, 0x34, 0xf0, 0x02, 0xac, 0xd1, 0x5a, 0x51, 0x97, 0xe7, 0x0c, 0x38, 0xc0, 0x51, 0xe6, 0xc3, 0xbb, 0xd7, 0xab, 0xa5 },
+ // 38
+ { 0x62, 0x29, 0x7a, 0x40, 0x4a, 0x20, 0x15, 0x80, 0x6f, 0xa5, 0x2e, 0xd4, 0x16, 0xe9, 0x5a, 0x50, 0xbf, 0x78, 0x2e, 0x39, 0x09, 0x5c, 0x2e, 0x0d, 0x6c, 0x1c, 0xb9, 0x28, 0x23, 0xdb, 0xf9, 0x0c },
+ // 39
+ { 0xfb, 0x2e, 0x9d, 0x06, 0xf2, 0xe7, 0x04, 0x4f, 0xf8, 0xd4, 0x6e, 0x78, 0xe2, 0xdc, 0x86, 0xee, 0x38, 0xc0, 0xd5, 0x51, 0x48, 0x03, 0xbb, 0x00, 0xfe, 0x9c, 0xc0, 0x82, 0x55, 0xcf, 0x90, 0x8f },
+ // 40
+ { 0x78, 0xab, 0x0d, 0x99, 0x08, 0x57, 0xec, 0xad, 0x91, 0xb9, 0x34, 0x5f, 0xe3, 0x1a, 0x74, 0x3b, 0x16, 0x26, 0x3f, 0xab, 0x7f, 0x16, 0x83, 0xfb, 0xbc, 0xae, 0x7a, 0x03, 0xc6, 0x46, 0xd3, 0x83 },
+ // 41
+ { 0x18, 0xfd, 0x18, 0xa5, 0xf4, 0xda, 0x12, 0xb5, 0x01, 0x6c, 0xed, 0xd2, 0x81, 0x66, 0xf9, 0x58, 0x16, 0x64, 0x02, 0x83, 0xdc, 0xa0, 0x08, 0x6e, 0x86, 0x61, 0x31, 0x2e, 0x18, 0xd4, 0xed, 0xa2 },
+ // 42
+ { 0xa4, 0xa2, 0x49, 0x3b, 0x02, 0x9e, 0x2f, 0x07, 0x2b, 0xa5, 0xc1, 0x2e, 0xf3, 0x1a, 0x30, 0xe1, 0xbd, 0xb3, 0x83, 0x5b, 0xf1, 0x98, 0x3f, 0xd9, 0x5d, 0x80, 0x5c, 0xa3, 0xd0, 0xf1, 0x5b, 0x54 },
+ // 43
+ { 0x5e, 0x31, 0x5c, 0x0d, 0x8a, 0x87, 0x55, 0x76, 0xfb, 0xe7, 0x6a, 0x9d, 0xf1, 0x5a, 0x54, 0x0b, 0xde, 0x24, 0x08, 0x9b, 0x41, 0x87, 0x58, 0xfd, 0x5a, 0x15, 0xb8, 0x3f, 0x3d, 0x87, 0x7d, 0xa9 },
+ // 44
+ { 0x07, 0xc8, 0x70, 0x54, 0xcb, 0x5c, 0x60, 0x13, 0x41, 0x3f, 0xe7, 0x2d, 0xfc, 0x96, 0xfc, 0x54, 0x6b, 0x2a, 0x8f, 0xba, 0x01, 0x85, 0x55, 0x6d, 0x56, 0xd6, 0xad, 0xb4, 0x14, 0x35, 0x19, 0x76 },
+ // 45
+ { 0x32, 0x0e, 0xcc, 0x42, 0x8f, 0xc7, 0xb3, 0xb5, 0x6c, 0x1f, 0x9f, 0x7b, 0xb2, 0x7a, 0x15, 0x0c, 0xd4, 0x04, 0x64, 0xd4, 0x3f, 0x77, 0x49, 0x06, 0x2c, 0x7e, 0xcc, 0x29, 0x2e, 0xaf, 0x5c, 0x3d },
+ // 46
+ { 0xcb, 0xed, 0xbd, 0xd2, 0x04, 0xb7, 0x9e, 0x23, 0x36, 0x88, 0xaf, 0x8f, 0x7e, 0xa8, 0x64, 0xd2, 0x31, 0x0a, 0x6c, 0x25, 0xcc, 0x07, 0xb9, 0x6d, 0xb3, 0x21, 0xc3, 0x24, 0xa7, 0x89, 0x78, 0x20 },
+ // 47
+ { 0x34, 0x33, 0x98, 0x96, 0x32, 0x42, 0x65, 0xf4, 0xfc, 0xf0, 0x5a, 0x4f, 0x46, 0xb8, 0x3f, 0x81, 0xb6, 0x81, 0xcd, 0xa2, 0xf4, 0xbc, 0x3e, 0xf7, 0x90, 0xcc, 0x00, 0x7e, 0x39, 0x3a, 0x05, 0xce },
+ // 48
+ { 0x8d, 0x8f, 0xaa, 0x4d, 0xd2, 0xe3, 0x83, 0x1f, 0x1d, 0x86, 0x58, 0xe7, 0xc9, 0x77, 0x2e, 0x61, 0x44, 0x3c, 0x0d, 0xde, 0x83, 0x34, 0xae, 0xba, 0xab, 0x1d, 0xd7, 0x44, 0xe5, 0xbb, 0xe1, 0x97 },
+ // 49
+ { 0xe3, 0x93, 0xa9, 0xd5, 0xbf, 0xd1, 0x7f, 0x71, 0x0a, 0x08, 0x5b, 0x66, 0x5f, 0x39, 0x0c, 0x75, 0xd2, 0xc5, 0x3c, 0xe6, 0xa8, 0xbe, 0xfa, 0x75, 0x82, 0xf0, 0xbd, 0xbc, 0x33, 0x9f, 0x4e, 0x19 },
+ // 50
+ { 0x3c, 0xb1, 0xaf, 0xca, 0x1b, 0x82, 0xe9, 0xe0, 0x38, 0x3a, 0x55, 0x2b, 0x18, 0x2f, 0xdf, 0x73, 0x27, 0xa1, 0xf8, 0x1b, 0x11, 0x57, 0x20, 0x85, 0xb5, 0x22, 0x09, 0x75, 0x67, 0x9a, 0x60, 0xb3 },
+ // 51
+ { 0xa6, 0xae, 0x0f, 0x6b, 0x88, 0xc9, 0x6d, 0x39, 0xce, 0x38, 0x46, 0xfa, 0x49, 0xb1, 0xfb, 0x86, 0xb5, 0x81, 0xba, 0xae, 0x82, 0xfa, 0x5f, 0x07, 0x69, 0xd0, 0x6a, 0x9c, 0x87, 0x40, 0xc7, 0x14 },
+ // 52
+ { 0xd7, 0x50, 0xa2, 0x22, 0x98, 0xd7, 0x4e, 0xdf, 0xe7, 0xb9, 0x79, 0x93, 0x19, 0x4d, 0x77, 0xc2, 0x7c, 0x9c, 0x08, 0xb3, 0xb4, 0x72, 0xef, 0xec, 0xa4, 0xf8, 0xa9, 0xa4, 0xad, 0xf9, 0xce, 0xe5 },
+ // 53
+ { 0x9b, 0xc8, 0xdb, 0x4a, 0x2a, 0x43, 0x22, 0xfe, 0x50, 0x52, 0xf5, 0x07, 0x55, 0xd2, 0xce, 0x18, 0x30, 0xef, 0xbd, 0x9a, 0xdc, 0xba, 0x37, 0xe2, 0x68, 0x0a, 0x37, 0x4e, 0x7f, 0xf2, 0xfb, 0x4e },
+ // 54
+ { 0x68, 0x88, 0x0c, 0x43, 0x40, 0xea, 0x93, 0xbd, 0x3e, 0x7d, 0x67, 0x33, 0x9d, 0x61, 0xfe, 0xa4, 0x82, 0x0d, 0x9a, 0x46, 0xa9, 0x4e, 0xc0, 0x40, 0x65, 0x48, 0x91, 0xa0, 0x98, 0x17, 0x1b, 0x95 },
+ // 55
+ { 0x8a, 0xaf, 0x20, 0xa8, 0x6a, 0x94, 0xda, 0xc0, 0x54, 0x74, 0x1f, 0x68, 0x1f, 0x60, 0xee, 0x47, 0xe3, 0xda, 0x8f, 0x67, 0x23, 0xea, 0x07, 0x4f, 0x51, 0x59, 0x46, 0xa6, 0x89, 0x31, 0x4d, 0x4d },
+ // 56
+ { 0x7b, 0xe0, 0xd2, 0x2f, 0xd6, 0xbc, 0xcd, 0x54, 0x10, 0xd4, 0xcb, 0xc9, 0xeb, 0x55, 0x4f, 0x73, 0xcd, 0xbd, 0x83, 0xd1, 0x53, 0xfb, 0x2b, 0x82, 0x38, 0x3f, 0x38, 0x49, 0xfe, 0xdd, 0x3f, 0x07 },
+ // 57
+ { 0x56, 0xcd, 0x01, 0x32, 0x3c, 0x7e, 0x07, 0x3c, 0x40, 0xcb, 0x7e, 0x8a, 0x80, 0xf1, 0xdf, 0x15, 0xdf, 0x79, 0xc8, 0x59, 0xc1, 0x91, 0x37, 0xb3, 0xf0, 0xc8, 0xa4, 0x01, 0xe2, 0x6a, 0x97, 0x91 },
+ // 58
+ { 0x17, 0x2e, 0x6e, 0x3b, 0xc8, 0x1e, 0x5f, 0x15, 0xdd, 0x56, 0xa8, 0xc1, 0x2c, 0xed, 0xb7, 0xd3, 0x8e, 0x1e, 0xbb, 0x84, 0x32, 0xef, 0xee, 0x0f, 0x31, 0xba, 0xbb, 0xc8, 0xc6, 0xc1, 0xcc, 0xad },
+ // 59
+ { 0xbf, 0xca, 0xef, 0x58, 0x3f, 0xfe, 0x4d, 0x1f, 0x12, 0x84, 0xda, 0xb9, 0x93, 0xcb, 0xfd, 0x23, 0xba, 0x55, 0x9c, 0x9c, 0x9b, 0x4c, 0xf7, 0x01, 0xde, 0x05, 0xf6, 0x60, 0xaa, 0xef, 0xb9, 0x03 },
+ // 60
+ { 0xf1, 0xaf, 0x7b, 0x0a, 0xd9, 0xfa, 0x3b, 0x04, 0xb5, 0x09, 0x56, 0x2e, 0x59, 0x6b, 0x47, 0x73, 0x72, 0x09, 0xf5, 0x72, 0x9d, 0x89, 0xfa, 0xa9, 0xe9, 0x9f, 0xbd, 0xe1, 0x73, 0xd6, 0xaa, 0xb7 },
+ // 61
+ { 0x8b, 0xf0, 0xeb, 0xa2, 0xf2, 0x58, 0x0e, 0xfc, 0xaa, 0xdc, 0x2b, 0x02, 0xc0, 0x3a, 0x95, 0x7e, 0x03, 0x19, 0x1a, 0x82, 0xed, 0x68, 0x0c, 0xce, 0x87, 0x5e, 0x57, 0x5a, 0xa9, 0x24, 0x34, 0x60 },
+ // 62
+ { 0x16, 0xcd, 0xc9, 0x38, 0x54, 0x7e, 0x66, 0x1f, 0x9d, 0xde, 0xb5, 0xea, 0x29, 0x16, 0x86, 0x9c, 0x12, 0xc2, 0x04, 0xe7, 0x70, 0x87, 0x77, 0x90, 0x8b, 0x17, 0x23, 0x33, 0x72, 0x3a, 0x10, 0x38 },
+ // 63
+ { 0xc8, 0xb5, 0xca, 0x98, 0x82, 0x11, 0x71, 0x05, 0xe2, 0x40, 0x41, 0xa3, 0xd5, 0xce, 0x90, 0xa6, 0xb4, 0x5c, 0xe4, 0xdc, 0x5d, 0x1a, 0x5e, 0x60, 0x70, 0xb4, 0x75, 0x89, 0xa9, 0x5e, 0x88, 0x8a },
+ // 64
+ { 0xbd, 0x37, 0x91, 0xa7, 0x43, 0xee, 0x8e, 0x71, 0x66, 0x7f, 0xa7, 0xa1, 0x7f, 0x9a, 0xde, 0x86, 0x45, 0xd8, 0x8e, 0xd1, 0xa2, 0x45, 0x31, 0x17, 0xc9, 0x48, 0x69, 0x40, 0xa8, 0x28, 0x48, 0x67 },
+ // 65
+ { 0xdc, 0x08, 0x75, 0xd9, 0xb1, 0xb8, 0xe8, 0xa3, 0x9a, 0x94, 0x00, 0xf3, 0x07, 0x8a, 0x34, 0xdd, 0xa1, 0xcb, 0xf5, 0x06, 0x3e, 0x14, 0xf6, 0x05, 0xaf, 0xa1, 0xb7, 0x3b, 0x19, 0xc2, 0x19, 0x68 },
+ // 66
+ { 0x09, 0x5b, 0x03, 0xf6, 0x90, 0x1b, 0x78, 0x2a, 0x01, 0x1c, 0x92, 0x63, 0xfc, 0x5b, 0x48, 0x9b, 0x5b, 0x16, 0xba, 0xc7, 0x73, 0xe6, 0x8c, 0x80, 0x78, 0x3d, 0x12, 0x86, 0x25, 0xb7, 0xd6, 0x3b },
+ // 67
+ { 0xa1, 0x77, 0x95, 0x5d, 0x67, 0x98, 0x26, 0x12, 0xae, 0x67, 0xc8, 0x7a, 0xe0, 0x8f, 0x42, 0x6a, 0x23, 0xef, 0x69, 0x26, 0x8e, 0xb1, 0x29, 0x44, 0x83, 0xdd, 0xa0, 0x64, 0xe6, 0x9c, 0xda, 0x18 },
+ // 68
+ { 0xb3, 0x81, 0xae, 0xf4, 0x11, 0xf8, 0x22, 0x25, 0xa8, 0xa9, 0x6f, 0xf1, 0xdf, 0x49, 0xf2, 0xa5, 0xd0, 0x84, 0xfd, 0xe5, 0x8b, 0x87, 0x7f, 0x04, 0x4e, 0xf4, 0x69, 0x6f, 0x90, 0xac, 0x0c, 0x9e },
+ // 69
+ { 0x2f, 0x86, 0x5e, 0xd6, 0x08, 0xd4, 0x27, 0x18, 0xfb, 0x9f, 0xe6, 0x8e, 0xaa, 0x13, 0x68, 0x28, 0x3b, 0x62, 0x2c, 0x1a, 0xeb, 0x5b, 0x03, 0x78, 0x16, 0x7a, 0x87, 0xa1, 0xd0, 0x73, 0x3d, 0xf7 },
+ // 70
+ { 0x35, 0x3b, 0xe9, 0x81, 0xf8, 0xc7, 0x7a, 0x2a, 0x78, 0x91, 0xef, 0xad, 0x34, 0xf7, 0x93, 0x91, 0xd1, 0x96, 0x3b, 0xfb, 0xb0, 0x37, 0x56, 0x0f, 0x51, 0x0b, 0x74, 0xea, 0x7e, 0xc3, 0x12, 0xcd },
+ // 71
+ { 0x6f, 0x17, 0x2f, 0x10, 0x31, 0x9d, 0xa2, 0xeb, 0x79, 0xd9, 0x89, 0xc6, 0x16, 0x9a, 0x69, 0xfd, 0x24, 0xbd, 0xd0, 0x03, 0x25, 0x90, 0x8f, 0x16, 0x83, 0x0f, 0x2f, 0x25, 0x23, 0x2f, 0xcc, 0x0e },
+ // 72
+ { 0x17, 0x89, 0x4b, 0x34, 0x63, 0x88, 0x1a, 0xfa, 0x90, 0x85, 0x21, 0x74, 0xfe, 0x41, 0x1d, 0x3b, 0x10, 0xf6, 0xf1, 0x6a, 0x15, 0x3a, 0x85, 0x35, 0x0d, 0x94, 0xe7, 0xf8, 0xb9, 0x9d, 0xd0, 0xe6 },
+ // 73
+ { 0xfa, 0xe5, 0x95, 0x85, 0x72, 0x0a, 0x79, 0x83, 0x5b, 0x25, 0x52, 0x66, 0x47, 0xcb, 0x9c, 0x31, 0x5b, 0x62, 0xe8, 0x1d, 0x75, 0x62, 0xf9, 0xfd, 0xc8, 0x2a, 0x77, 0x92, 0xad, 0x35, 0x6d, 0x6c },
+ // 74
+ { 0x14, 0x39, 0x47, 0x13, 0x4d, 0x14, 0x01, 0x85, 0x39, 0xaf, 0xde, 0xf3, 0x3e, 0x51, 0xc4, 0x19, 0x6b, 0x29, 0x5f, 0xa7, 0xda, 0x46, 0x0a, 0x81, 0xa6, 0x31, 0xd8, 0x29, 0xdc, 0xd7, 0x86, 0xca },
+ // 75
+ { 0x4e, 0x99, 0xa0, 0x4b, 0x08, 0xaa, 0x14, 0x60, 0x2f, 0x39, 0xdf, 0x6c, 0x6f, 0x68, 0xa2, 0x95, 0xee, 0x5c, 0x84, 0x51, 0x7b, 0x06, 0x76, 0xdc, 0xda, 0xa7, 0x3e, 0x0b, 0x17, 0xaf, 0x34, 0x4d },
+ // 76
+ { 0xa7, 0x0e, 0x23, 0xb3, 0x00, 0x6d, 0x50, 0x2f, 0x0a, 0x3f, 0x4b, 0xcb, 0x93, 0x30, 0xc4, 0x9b, 0x7e, 0xb3, 0x05, 0x2a, 0xae, 0x31, 0x9d, 0xcf, 0xad, 0x92, 0x22, 0xa9, 0xd5, 0xc7, 0x94, 0xad },
+ // 77
+ { 0x4e, 0x45, 0x02, 0xfb, 0xf8, 0x95, 0x67, 0x23, 0x82, 0x58, 0x79, 0x52, 0x08, 0x2e, 0x5d, 0xb8, 0x8b, 0x17, 0x62, 0xc3, 0x9d, 0x18, 0xd0, 0xec, 0xfc, 0x46, 0x1d, 0xbb, 0x64, 0x13, 0xba, 0xfd },
+ // 78
+ { 0x74, 0xd5, 0x5f, 0x5f, 0xe6, 0xc5, 0x60, 0x7e, 0x74, 0xbb, 0x7e, 0xbb, 0xdc, 0x47, 0x94, 0xe6, 0x30, 0x31, 0x80, 0x55, 0x14, 0x6c, 0x2b, 0x71, 0xc7, 0x53, 0x4c, 0x5f, 0x76, 0x7e, 0x3f, 0x76 },
+ // 79
+ { 0xa0, 0x09, 0x98, 0xf4, 0x5e, 0xf1, 0x0e, 0xc8, 0x9f, 0x84, 0xa6, 0xbe, 0xfe, 0x15, 0xba, 0x5a, 0x2f, 0x40, 0x35, 0xcf, 0x13, 0x1f, 0x6c, 0xbb, 0xbb, 0xd2, 0xdb, 0x53, 0xf2, 0x95, 0x13, 0x9a },
+ // 80
+ { 0x24, 0x94, 0xf9, 0xfb, 0xd5, 0x6f, 0x25, 0x1d, 0x5b, 0xff, 0xf1, 0x07, 0xed, 0x9f, 0x37, 0x08, 0x60, 0xd9, 0x8d, 0x70, 0x7b, 0xfd, 0xab, 0x92, 0xfc, 0x15, 0x67, 0x3f, 0xd1, 0x4c, 0x0a, 0x94 },
+ // 81
+ { 0x94, 0xca, 0xc7, 0xbc, 0x48, 0x18, 0x29, 0xf8, 0x7d, 0x47, 0xd3, 0x01, 0x4b, 0x21, 0xce, 0xed, 0xbb, 0x58, 0x1d, 0x74, 0x68, 0x87, 0x94, 0xf6, 0x12, 0x93, 0x1a, 0x0d, 0xd9, 0xd5, 0x22, 0xc9 },
+ // 82
+ { 0xb4, 0x3e, 0xa1, 0xf6, 0xd7, 0x76, 0xaf, 0x3b, 0x84, 0xe3, 0x81, 0x6e, 0x29, 0x26, 0x44, 0xcf, 0x2b, 0xdd, 0x37, 0x0d, 0x21, 0x41, 0x27, 0x82, 0x98, 0x81, 0x55, 0x70, 0x1f, 0x35, 0x09, 0x98 },
+ // 83
+ { 0xa2, 0x20, 0xe3, 0xdd, 0xcb, 0xed, 0xec, 0xf3, 0xb5, 0xf0, 0xe7, 0x97, 0x85, 0x9e, 0x14, 0x21, 0xd1, 0xde, 0x9b, 0x51, 0xea, 0xb4, 0xd1, 0x5c, 0xbd, 0xd4, 0xd7, 0xe4, 0xe7, 0x18, 0xef, 0x5b },
+ // 84
+ { 0x67, 0xb9, 0xc9, 0x28, 0x22, 0x9a, 0x1c, 0x57, 0x29, 0x7e, 0x81, 0xcb, 0xb8, 0x7b, 0x0c, 0xe0, 0x1e, 0x2d, 0xe7, 0xa1, 0x86, 0x92, 0xc1, 0x94, 0x8d, 0x9f, 0x12, 0xed, 0xbe, 0x3e, 0xb2, 0xc5 },
+ // 85
+ { 0x45, 0xc6, 0xdf, 0xf3, 0xd2, 0x17, 0x5a, 0x48, 0xce, 0x25, 0x85, 0x7d, 0x29, 0x7e, 0x9c, 0xc0, 0x39, 0x8a, 0x23, 0xcb, 0x4b, 0x8e, 0x81, 0x15, 0x4b, 0x6a, 0x59, 0xcb, 0x62, 0x5c, 0x64, 0xa9 },
+ // 86
+ { 0xdb, 0x3c, 0x05, 0x9f, 0xef, 0x5f, 0x16, 0x61, 0x2f, 0x73, 0xfe, 0x9e, 0xe1, 0xb7, 0x49, 0x74, 0x9d, 0x93, 0xf5, 0x50, 0x9f, 0xd5, 0xc4, 0xfc, 0xbb, 0xc8, 0x8c, 0x1f, 0x74, 0x41, 0x9d, 0x79 },
+ // 87
+ { 0x76, 0xe3, 0xf9, 0x6a, 0x0d, 0x6d, 0x95, 0x79, 0xf6, 0xf8, 0x34, 0x6e, 0x55, 0xcd, 0x2d, 0x84, 0x26, 0xc8, 0xc4, 0xfb, 0x83, 0x1e, 0x3b, 0xd5, 0x51, 0x44, 0x11, 0x41, 0x36, 0xd4, 0x4c, 0x93 },
+ // 88
+ { 0x79, 0xfa, 0x5f, 0xf0, 0x47, 0x87, 0xda, 0xef, 0x23, 0x89, 0x46, 0x08, 0x90, 0xba, 0xfd, 0x2a, 0x62, 0x13, 0x36, 0xc6, 0xc8, 0x38, 0xd4, 0xc8, 0x7f, 0xdd, 0x91, 0x7a, 0x20, 0x32, 0x2c, 0x16 },
+ // 89
+ { 0xda, 0xfe, 0x80, 0x2f, 0x02, 0x95, 0x2d, 0xca, 0x70, 0x4a, 0x85, 0x51, 0x64, 0xfa, 0x7e, 0xfd, 0xb5, 0xcb, 0xce, 0x48, 0xe9, 0xe0, 0xb4, 0x53, 0xd0, 0xb0, 0x18, 0xc5, 0x5d, 0x3a, 0x3f, 0xe2 },
+ // 90
+ { 0x34, 0x48, 0xa3, 0x40, 0xba, 0x2a, 0x13, 0x57, 0xcc, 0xe2, 0xdf, 0x8d, 0xb0, 0x0f, 0x60, 0x1c, 0x70, 0x00, 0xaf, 0xc1, 0xb9, 0x99, 0xc9, 0xc5, 0xab, 0x23, 0xf2, 0x86, 0x24, 0xf6, 0xe7, 0xfe },
+ // 91
+ { 0x0e, 0x21, 0x66, 0xcc, 0x61, 0x82, 0x08, 0xf4, 0x70, 0x6c, 0x02, 0xcf, 0x73, 0x09, 0xab, 0x2f, 0xd5, 0x97, 0xbf, 0x42, 0x01, 0x91, 0xab, 0xb2, 0x67, 0x4d, 0xd5, 0xd3, 0xaf, 0xc9, 0x14, 0x30 },
+ // 92
+ { 0x77, 0x7e, 0xa2, 0xac, 0xc9, 0x7b, 0x5a, 0x08, 0xa5, 0x06, 0x69, 0x8f, 0xdd, 0xf2, 0xfb, 0x42, 0xda, 0x37, 0xd5, 0x03, 0x62, 0x1e, 0x5e, 0x90, 0xee, 0xf3, 0xed, 0x62, 0x7a, 0xb5, 0x2e, 0x50 },
+ // 93
+ { 0x4c, 0x2e, 0x2a, 0x25, 0xb7, 0x17, 0xcc, 0xfd, 0xda, 0xf1, 0xe6, 0x0e, 0xb1, 0x87, 0x45, 0x1b, 0xf7, 0x67, 0xe6, 0x7c, 0xe4, 0x6c, 0x59, 0xf0, 0x64, 0x98, 0x8b, 0xd4, 0xf7, 0x6d, 0x46, 0x6b },
+ // 94
+ { 0xda, 0x42, 0xbd, 0x90, 0xad, 0xb6, 0x5e, 0x14, 0x3d, 0x48, 0x09, 0x65, 0xdb, 0x72, 0x38, 0x46, 0x35, 0x06, 0xc6, 0xd1, 0x42, 0xf5, 0xca, 0xa3, 0x13, 0x6b, 0xad, 0x11, 0xb3, 0x6f, 0x5e, 0x9f },
+ // 95
+ { 0x45, 0xc6, 0xb8, 0x9a, 0x0e, 0x4b, 0x8a, 0xcb, 0x18, 0x69, 0x57, 0x43, 0x90, 0x30, 0x54, 0x54, 0x1d, 0x4f, 0xfe, 0x13, 0x31, 0x97, 0x94, 0x45, 0xf0, 0xff, 0xc8, 0xe9, 0x52, 0x2f, 0x25, 0x0c },
+ // 96
+ { 0x4c, 0x85, 0x95, 0xe0, 0x0b, 0x57, 0xa5, 0x9e, 0x57, 0xd8, 0x85, 0x15, 0xe8, 0xcf, 0xe5, 0x52, 0xab, 0x7d, 0xd7, 0xe8, 0x71, 0x9c, 0x1b, 0x71, 0x1b, 0x8f, 0xa3, 0x92, 0xcc, 0x36, 0x37, 0x90 },
+ // 97
+ { 0xc3, 0xdc, 0xdb, 0x87, 0xad, 0xee, 0xc1, 0x5b, 0xd1, 0x90, 0xa8, 0x8b, 0x21, 0xf6, 0x2f, 0xe5, 0x2e, 0xbf, 0x18, 0xed, 0xc0, 0x6e, 0x5a, 0xe9, 0xb6, 0x02, 0xf9, 0xbe, 0x56, 0x49, 0x20, 0x10 },
+ // 98
+ { 0xed, 0x58, 0xcb, 0x0a, 0x82, 0xc2, 0xb3, 0xf1, 0xc1, 0xff, 0xf0, 0x9a, 0x22, 0xa1, 0x2b, 0x74, 0x80, 0xe6, 0x1f, 0xac, 0x5a, 0xa3, 0x90, 0xeb, 0x33, 0xdd, 0x73, 0x63, 0x12, 0x9d, 0x09, 0xdc },
+ // 99
+ { 0xcf, 0x7d, 0xdb, 0x1b, 0x76, 0xe7, 0xa6, 0x27, 0xf9, 0x5e, 0x32, 0x59, 0x74, 0x16, 0x06, 0xb2, 0xfb, 0x9d, 0x88, 0x72, 0x0d, 0x6e, 0xf0, 0xe5, 0xe5, 0xad, 0xbf, 0x26, 0xe5, 0xde, 0x88, 0xc5 },
+ // 100
+ { 0x3e, 0xef, 0xd3, 0x0f, 0xc5, 0x20, 0xa2, 0xd0, 0xae, 0x28, 0xca, 0x37, 0x14, 0xfb, 0x5e, 0xfd, 0x62, 0xc2, 0xec, 0xea, 0x47, 0x59, 0xfb, 0x4c, 0x25, 0xbf, 0x28, 0x2b, 0xd4, 0x2f, 0x60, 0x65 },
+ // 101
+ { 0x88, 0x52, 0x26, 0x4d, 0x4d, 0x34, 0x95, 0xca, 0xd7, 0x83, 0x30, 0xb3, 0x4e, 0x4e, 0xfa, 0x1a, 0x5d, 0x28, 0x22, 0xb5, 0x8b, 0x45, 0x0f, 0x47, 0x50, 0xb8, 0x90, 0xbf, 0xe5, 0x83, 0xbe, 0x41 },
+ // 102
+ { 0x09, 0x6f, 0x8d, 0x55, 0x5d, 0x5e, 0x3a, 0x7f, 0x07, 0x3e, 0x96, 0xa1, 0x34, 0xb4, 0xc8, 0xde, 0x08, 0x71, 0x30, 0x03, 0x73, 0x5d, 0x11, 0x90, 0x74, 0x51, 0x06, 0x78, 0x44, 0x5d, 0xb9, 0x28 },
+ // 103
+ { 0x97, 0x27, 0xe4, 0x65, 0xc3, 0x47, 0x4f, 0xfa, 0x85, 0x02, 0x99, 0xf8, 0x18, 0x05, 0x8d, 0x96, 0xc4, 0xf5, 0xd0, 0x56, 0x5c, 0x4d, 0xf0, 0x66, 0xba, 0x60, 0x19, 0x78, 0x54, 0xa1, 0x7b, 0x96 },
+ // 104
+ { 0x58, 0x7b, 0x5b, 0x7c, 0xaa, 0x11, 0x68, 0xbd, 0xe4, 0x74, 0x0a, 0x2d, 0xec, 0x64, 0x20, 0xe3, 0x9e, 0xa7, 0x60, 0x5c, 0x02, 0xcd, 0x76, 0x68, 0xe4, 0x6a, 0x56, 0x92, 0xcb, 0x25, 0xfc, 0xbe },
+ // 105
+ { 0xda, 0x78, 0x04, 0x16, 0x5a, 0x91, 0x5e, 0x9e, 0xf5, 0x4b, 0xd6, 0x59, 0x32, 0xf5, 0xea, 0xba, 0xf9, 0x77, 0x5c, 0xe0, 0xa3, 0x3e, 0xf4, 0xaa, 0x12, 0xa5, 0xf4, 0xf3, 0x80, 0x2d, 0xac, 0x4a },
+ // 106
+ { 0x80, 0xda, 0x72, 0x59, 0x5b, 0x0b, 0xc0, 0x13, 0x62, 0x11, 0xab, 0x44, 0xf4, 0xa3, 0xeb, 0xff, 0xac, 0xf6, 0x9c, 0x5d, 0x75, 0xe2, 0x6c, 0xde, 0xf8, 0x6a, 0x06, 0xb5, 0x24, 0xf8, 0xec, 0xd8 },
+ // 107
+ { 0xa3, 0x2c, 0xf1, 0x24, 0xe0, 0x1a, 0x55, 0x97, 0x5c, 0x95, 0x30, 0x6c, 0xdd, 0x5a, 0xf6, 0x44, 0x16, 0x50, 0x9a, 0x14, 0x18, 0xba, 0x27, 0x95, 0x9c, 0xdb, 0x5a, 0xd5, 0xb7, 0xf7, 0x51, 0x3d },
+ // 108
+ { 0x5b, 0x69, 0xf8, 0x14, 0xb7, 0xe6, 0x4a, 0xf1, 0xaf, 0x79, 0xa8, 0xe5, 0x1a, 0x4f, 0x0f, 0x72, 0x90, 0x0a, 0xb2, 0x60, 0xa2, 0xaf, 0xda, 0x69, 0xa9, 0x98, 0x32, 0x61, 0x38, 0xce, 0xb0, 0x23 },
+ // 109
+ { 0xf5, 0x30, 0x48, 0x01, 0x51, 0x4f, 0x7b, 0x60, 0x7e, 0x9d, 0x91, 0x60, 0x88, 0x84, 0xb0, 0x48, 0x31, 0x7e, 0x37, 0xe0, 0x5b, 0xe9, 0xde, 0x01, 0x17, 0x91, 0x50, 0x65, 0x66, 0x72, 0xb4, 0x6d },
+ // 110
+ { 0xc8, 0x0f, 0x51, 0x38, 0xc2, 0x1c, 0x99, 0x45, 0x96, 0xf9, 0x60, 0xa8, 0x25, 0x67, 0x2a, 0x69, 0x20, 0x75, 0x1f, 0x85, 0xb8, 0xd5, 0xd5, 0x4b, 0x74, 0x4c, 0x07, 0x0a, 0x16, 0x16, 0xb8, 0xf4 },
+ // 111
+ { 0xb4, 0xd1, 0x09, 0x9d, 0xcc, 0x5b, 0x62, 0x96, 0xad, 0x9e, 0x20, 0x34, 0x6c, 0x25, 0x78, 0xaf, 0x80, 0x70, 0xb3, 0x90, 0x1d, 0xda, 0x78, 0x4c, 0x9d, 0xf7, 0xdb, 0xb7, 0xe6, 0xcb, 0x15, 0x64 },
+ // 112
+ { 0x00, 0xc8, 0x89, 0x72, 0xb7, 0x30, 0xf5, 0xdd, 0xaf, 0x3a, 0x78, 0x0e, 0x9d, 0x57, 0x8a, 0xf1, 0x0a, 0xcc, 0x14, 0x48, 0xc8, 0xb2, 0x59, 0x84, 0x8a, 0xf9, 0x37, 0xa2, 0x08, 0x4a, 0x53, 0x27 },
+ // 113
+ { 0xc8, 0x04, 0x8c, 0xaf, 0x2b, 0xa6, 0x01, 0x91, 0x9e, 0xe4, 0x42, 0x01, 0x87, 0x0b, 0xbf, 0xec, 0x2b, 0x18, 0xfa, 0xf3, 0xb4, 0x03, 0x73, 0x29, 0x96, 0x82, 0xcf, 0xae, 0xf6, 0x90, 0xee, 0x9e },
+ // 114
+ { 0x44, 0x2d, 0xc9, 0x0e, 0x4e, 0xe3, 0x68, 0x07, 0x95, 0x1e, 0x4e, 0x5e, 0x66, 0x80, 0xab, 0x35, 0x43, 0x54, 0x53, 0x33, 0x0a, 0x04, 0xdc, 0x22, 0x3c, 0xbb, 0x03, 0x6c, 0x13, 0x27, 0x68, 0xd7 },
+ // 115
+ { 0x68, 0xdd, 0x32, 0xa3, 0x6a, 0xb1, 0x95, 0x91, 0x52, 0xb0, 0xb1, 0x90, 0x78, 0xca, 0x5d, 0x63, 0x7d, 0x4d, 0xe9, 0xa0, 0xa9, 0x7f, 0x2c, 0xeb, 0x9c, 0x05, 0xcd, 0xa0, 0xe3, 0xe5, 0xd5, 0x7f },
+ // 116
+ { 0x9c, 0xd4, 0xf4, 0x15, 0x01, 0xdc, 0x7a, 0xe4, 0x26, 0x13, 0x39, 0xa9, 0x72, 0x83, 0x5a, 0x80, 0xa4, 0x08, 0xf1, 0x60, 0x5c, 0x77, 0x70, 0xba, 0xfe, 0x04, 0xc5, 0xdf, 0x13, 0x92, 0x27, 0x3d },
+ // 117
+ { 0x62, 0x82, 0xbf, 0xb6, 0x95, 0x87, 0xeb, 0xde, 0x24, 0x7e, 0x10, 0x58, 0x27, 0x74, 0xea, 0x30, 0x23, 0x8b, 0x2f, 0xd5, 0x85, 0x44, 0xa0, 0xb3, 0xf4, 0xac, 0x86, 0x18, 0x03, 0x8f, 0x8b, 0x5f },
+ // 118
+ { 0xbb, 0x34, 0x47, 0x38, 0x29, 0x24, 0x46, 0xe2, 0xba, 0x2f, 0x62, 0x03, 0x13, 0x29, 0xc3, 0xec, 0xce, 0x3b, 0xc6, 0x08, 0xca, 0xeb, 0xc8, 0xac, 0x13, 0x64, 0x1f, 0xe7, 0x02, 0x25, 0x33, 0x58 },
+ // 119
+ { 0x2e, 0xd0, 0x98, 0xff, 0x9e, 0xd5, 0x34, 0x8e, 0xeb, 0xbb, 0x17, 0x33, 0xd5, 0x0a, 0x0e, 0xeb, 0x32, 0x77, 0xa3, 0x0a, 0xce, 0x12, 0x00, 0x6e, 0x94, 0x7b, 0x40, 0x58, 0xb1, 0x7b, 0x73, 0x4f },
+ // 120
+ { 0xc9, 0x5a, 0xe5, 0xdd, 0x38, 0x1c, 0xa8, 0x6b, 0xec, 0xb3, 0x87, 0x8a, 0xbf, 0xfc, 0xec, 0x4c, 0xfc, 0xd9, 0xf3, 0xa9, 0xed, 0xb5, 0x23, 0xba, 0xfc, 0xea, 0xd7, 0xb6, 0xcc, 0x9f, 0xc2, 0xcf },
+ // 121
+ { 0xa9, 0xf8, 0xe1, 0x65, 0xc1, 0xd0, 0x63, 0x90, 0x8b, 0x9f, 0xe4, 0xae, 0x37, 0x45, 0x0c, 0xba, 0x5f, 0x3c, 0x82, 0x61, 0x61, 0x80, 0x52, 0x93, 0x78, 0x66, 0xbf, 0x7e, 0x0e, 0xda, 0x55, 0xed },
+ // 122
+ { 0x1a, 0x55, 0x54, 0x55, 0x4e, 0x31, 0x4c, 0x95, 0x36, 0xec, 0x11, 0x2c, 0xb4, 0xd2, 0x66, 0x78, 0xe7, 0x4a, 0xdd, 0xd0, 0xbf, 0x91, 0xe1, 0x3b, 0xba, 0x8d, 0x92, 0x90, 0x8c, 0x62, 0x16, 0x1c },
+ // 123
+ { 0xe8, 0x36, 0xfb, 0x83, 0xd4, 0x80, 0x83, 0xd5, 0xc1, 0x3f, 0x13, 0x2b, 0x03, 0x37, 0x12, 0x4e, 0x83, 0x9f, 0xf1, 0xfd, 0x38, 0xde, 0xc0, 0x9d, 0xce, 0x2f, 0xba, 0xdc, 0x52, 0x93, 0x9b, 0x35 },
+ // 124
+ { 0x04, 0x68, 0xed, 0x5f, 0xe3, 0x58, 0x17, 0x35, 0x77, 0x4a, 0x96, 0x2c, 0x27, 0xc2, 0x26, 0x7f, 0xb8, 0xee, 0x59, 0xa9, 0x5d, 0x00, 0xc0, 0x8c, 0x92, 0x4b, 0x52, 0xa4, 0xc7, 0x68, 0x80, 0x50 },
+ // 125
+ { 0x03, 0xc9, 0xfc, 0xce, 0x9c, 0x7c, 0x07, 0x6a, 0x84, 0xfd, 0xeb, 0x51, 0x3c, 0x02, 0xf4, 0x88, 0x13, 0xeb, 0x06, 0x6e, 0x08, 0xc6, 0x0f, 0x8f, 0xca, 0xf6, 0x2f, 0x38, 0xfb, 0xf3, 0x92, 0x68 },
+ // 126
+ { 0xf8, 0x47, 0xa7, 0x26, 0x89, 0x06, 0xd8, 0x6b, 0x4d, 0xbb, 0x29, 0xfb, 0xcd, 0x2e, 0x30, 0x1a, 0xbb, 0xf1, 0x38, 0x3e, 0x54, 0xbd, 0xf6, 0x04, 0x82, 0x77, 0x9f, 0x0e, 0xec, 0x93, 0xae, 0x01 },
+ // 127
+ { 0xa6, 0xd5, 0x1c, 0x7e, 0xd9, 0x58, 0x2c, 0xfe, 0x77, 0x5d, 0x7f, 0x24, 0x2a, 0x7b, 0x47, 0x09, 0x07, 0x12, 0xd6, 0x83, 0x08, 0xa2, 0x5d, 0x1e, 0xda, 0x51, 0xa2, 0x30, 0x41, 0xce, 0x33, 0x30 },
+ // 128
+ { 0x78, 0x01, 0x38, 0xa5, 0xbd, 0x9e, 0xd6, 0x7e, 0x12, 0x46, 0x4b, 0x52, 0xa7, 0xfb, 0xea, 0xe5, 0xf0, 0xcc, 0xce, 0xba, 0x83, 0xcb, 0xb9, 0xb0, 0xc0, 0xcf, 0x28, 0xba, 0x1b, 0xde, 0x47, 0x43 },
+ // 129
+ { 0xe1, 0x1a, 0x06, 0x8e, 0x7b, 0x9d, 0xd1, 0xa1, 0xb7, 0xea, 0x91, 0x12, 0xf8, 0x90, 0x89, 0x23, 0x50, 0xec, 0xe6, 0xd9, 0xbe, 0x35, 0xfe, 0x30, 0x5e, 0x74, 0x00, 0x1a, 0x19, 0xd1, 0xa4, 0x81 },
+ // 130
+ { 0xb5, 0x98, 0x40, 0x7d, 0x03, 0xb1, 0x23, 0x47, 0x44, 0x86, 0x06, 0x16, 0xb1, 0xbe, 0xa4, 0x9b, 0x89, 0x11, 0xb3, 0x5c, 0x16, 0xac, 0x69, 0x17, 0x39, 0x35, 0xca, 0x8a, 0xda, 0x26, 0x90, 0x88 },
+ // 131
+ { 0xf4, 0x9c, 0x65, 0x98, 0xc9, 0xbc, 0x44, 0xd5, 0xd3, 0xb5, 0x18, 0x4d, 0xeb, 0x99, 0xfd, 0xee, 0x0e, 0x86, 0x78, 0x2d, 0x80, 0x0b, 0x4e, 0x69, 0x05, 0x71, 0x4c, 0x51, 0x15, 0x24, 0x26, 0xec },
+ // 132
+ { 0x0c, 0xcf, 0xcf, 0x4a, 0x6b, 0xe2, 0x03, 0x1b, 0xf6, 0x04, 0xd4, 0x92, 0x95, 0x20, 0xd6, 0xf7, 0x51, 0xc6, 0x44, 0x4c, 0x05, 0xdd, 0x2b, 0x68, 0x9e, 0x66, 0x01, 0x47, 0xed, 0xc4, 0xa7, 0x0d },
+ // 133
+ { 0x8b, 0x91, 0xbc, 0x5f, 0xae, 0xc9, 0x02, 0x81, 0xde, 0x18, 0x54, 0xcb, 0x58, 0x86, 0xdd, 0x30, 0x72, 0x15, 0x97, 0xac, 0x38, 0x91, 0x0e, 0xec, 0x1d, 0x20, 0x49, 0x41, 0xb2, 0x7e, 0xa7, 0xef },
+ // 134
+ { 0x5d, 0xff, 0xb0, 0xdf, 0x96, 0xc5, 0x3e, 0xd1, 0xb9, 0x40, 0x04, 0xe2, 0xa6, 0xb5, 0x4f, 0x09, 0x00, 0x9b, 0xa2, 0x93, 0x03, 0xa7, 0xe8, 0x36, 0x72, 0x2c, 0xc9, 0x74, 0x70, 0x2b, 0xc0, 0xed },
+ // 135
+ { 0xc5, 0x57, 0x03, 0xe3, 0xf4, 0xc2, 0xef, 0x3b, 0xfe, 0x97, 0x85, 0xe1, 0x47, 0xe1, 0x13, 0x98, 0x3b, 0x25, 0x15, 0x1b, 0x97, 0x86, 0x9a, 0x0f, 0xd5, 0x52, 0xfa, 0xb9, 0x90, 0x5d, 0x1d, 0x46 },
+ // 136
+ { 0xb2, 0x36, 0x80, 0x94, 0xb0, 0xf2, 0x20, 0xff, 0x7d, 0xd4, 0x4d, 0xf3, 0xd1, 0x50, 0x03, 0xcf, 0x36, 0x79, 0xb1, 0x73, 0x43, 0xeb, 0x7f, 0x0e, 0x21, 0x6c, 0x55, 0xc9, 0x26, 0xbe, 0x91, 0x6f },
+ // 137
+ { 0x5d, 0x54, 0x4b, 0x39, 0xc5, 0xfe, 0x1f, 0x38, 0xcd, 0xac, 0xc8, 0xaf, 0xc8, 0x25, 0x23, 0x35, 0x71, 0x58, 0x04, 0x72, 0x86, 0xcf, 0xeb, 0xca, 0x2a, 0x77, 0xac, 0x8f, 0x1f, 0xf7, 0x86, 0x9c },
+ // 138
+ { 0xf3, 0x03, 0x24, 0x9d, 0xfc, 0xdd, 0x40, 0x55, 0xa8, 0x77, 0x22, 0xbe, 0x63, 0xda, 0x44, 0x6e, 0xff, 0x0d, 0x1e, 0xa3, 0x7e, 0x6f, 0xbe, 0x68, 0x84, 0x0b, 0xc0, 0x67, 0x4e, 0x80, 0x3b, 0xf2 },
+ // 139
+ { 0x3f, 0xf7, 0xa7, 0xb0, 0x41, 0x2f, 0xa6, 0xee, 0x33, 0xd0, 0x64, 0x27, 0xf7, 0x7d, 0xb2, 0xd1, 0xf7, 0x60, 0xb6, 0xe8, 0xe7, 0x73, 0x88, 0x64, 0xa5, 0x52, 0x04, 0xfc, 0xd4, 0x19, 0x71, 0x22 },
+ // 140
+ { 0x30, 0x08, 0x27, 0x60, 0xae, 0x65, 0x90, 0x74, 0xb6, 0x42, 0x40, 0xf4, 0xcb, 0x75, 0x33, 0xf3, 0x9d, 0x62, 0x79, 0x81, 0x09, 0xfd, 0xcf, 0xdd, 0x0d, 0xe5, 0xbc, 0xdd, 0x42, 0x8d, 0xc7, 0xf6 },
+ // 141
+ { 0xa3, 0x4b, 0xb2, 0x62, 0x84, 0x36, 0x51, 0xb2, 0x9d, 0xe0, 0xff, 0xd3, 0x96, 0xb7, 0x81, 0x52, 0x00, 0x28, 0x5c, 0x91, 0x40, 0x48, 0x69, 0xf5, 0x5f, 0x89, 0x8c, 0xe2, 0x91, 0x23, 0xf3, 0xf9 },
+ // 142
+ { 0x15, 0x23, 0x64, 0x72, 0x47, 0xaa, 0x95, 0x48, 0x54, 0xc6, 0x93, 0x84, 0x96, 0xa8, 0x97, 0x6f, 0x2a, 0xe7, 0x0b, 0x70, 0xc6, 0x33, 0x77, 0x6a, 0x07, 0x51, 0x23, 0x24, 0x4d, 0x01, 0x53, 0xff },
+ // 143
+ { 0x54, 0x63, 0x03, 0x6b, 0x1a, 0xd8, 0x85, 0x19, 0x72, 0x2e, 0x63, 0x65, 0x98, 0x4e, 0x30, 0xa3, 0xb7, 0x58, 0xfe, 0x18, 0x98, 0x08, 0xd6, 0x7b, 0xed, 0xd8, 0xc4, 0xc4, 0xc9, 0x8f, 0x23, 0x7a },
+ // 144
+ { 0x60, 0x09, 0x8e, 0xd2, 0xa3, 0x10, 0x8a, 0xcd, 0x5b, 0xaa, 0x0e, 0x91, 0xb3, 0x18, 0xea, 0x08, 0x0f, 0x28, 0x26, 0x2f, 0xce, 0xfb, 0x5a, 0x36, 0x3f, 0x00, 0xe0, 0x23, 0xb2, 0xc9, 0x6e, 0x95 },
+ // 145
+ { 0x3e, 0x71, 0xfc, 0xbf, 0x19, 0xd9, 0xab, 0x2a, 0x6a, 0xf9, 0xe4, 0xcc, 0xdb, 0x1c, 0x5f, 0xdd, 0xe5, 0x19, 0x2d, 0x6a, 0xc9, 0xd1, 0x5e, 0x2d, 0x62, 0xad, 0x98, 0xca, 0x8c, 0x29, 0x13, 0x10 },
+ // 146
+ { 0x7f, 0x0a, 0x34, 0xda, 0xe7, 0x17, 0xcb, 0x8a, 0xb1, 0x69, 0xb9, 0xf0, 0x7e, 0xea, 0x05, 0x2a, 0x4a, 0x78, 0xe6, 0xc2, 0x60, 0x4d, 0x8b, 0x8d, 0xaf, 0x88, 0x9a, 0x5d, 0x64, 0x42, 0x8a, 0x1d },
+ // 147
+ { 0x16, 0xaa, 0xa8, 0x4d, 0x80, 0xe0, 0x5e, 0x60, 0xec, 0x08, 0x6d, 0x39, 0x8e, 0xb8, 0x5c, 0x24, 0x55, 0x4c, 0xac, 0x8d, 0x18, 0x6a, 0x5d, 0xcc, 0x98, 0xef, 0xe6, 0x77, 0x2f, 0xc7, 0x3a, 0x7a },
+ // 148
+ { 0x46, 0x6c, 0xfc, 0x50, 0x85, 0x6b, 0xbd, 0xd8, 0xb8, 0x65, 0xec, 0xd0, 0xcc, 0x49, 0x3e, 0x97, 0x5c, 0xd6, 0x39, 0x74, 0x6a, 0xe3, 0x14, 0x87, 0x8e, 0x84, 0x31, 0xa0, 0x72, 0x27, 0x67, 0x5a },
+ // 149
+ { 0xfa, 0x14, 0xaf, 0x2f, 0xc8, 0x74, 0xea, 0x85, 0xe7, 0x54, 0xee, 0x0d, 0xb0, 0x59, 0x0c, 0x61, 0xc2, 0xa5, 0x1a, 0xe0, 0x9f, 0xde, 0x55, 0xa9, 0x9b, 0xe4, 0x1a, 0x88, 0x3b, 0x18, 0x6d, 0x68 },
+ // 150
+ { 0xfb, 0xa2, 0x63, 0x2a, 0xe8, 0x5d, 0xf4, 0xf0, 0xa3, 0x7e, 0xb0, 0x5c, 0xeb, 0xf0, 0x20, 0xad, 0x9d, 0x8e, 0x17, 0x2b, 0x4d, 0x01, 0xaf, 0xea, 0xaf, 0xc6, 0xcc, 0x65, 0x42, 0x25, 0xef, 0x2f },
+ // 151
+ { 0x05, 0xb9, 0x29, 0x91, 0xd4, 0x95, 0xb0, 0xea, 0x99, 0xf0, 0x29, 0xa2, 0xc6, 0xbf, 0x2a, 0x2a, 0x38, 0x47, 0x79, 0xd5, 0x10, 0xf3, 0x4a, 0xd8, 0x32, 0x15, 0x32, 0x04, 0x1e, 0xef, 0x49, 0x01 },
+ // 152
+ { 0xf9, 0x5f, 0x06, 0xe3, 0x92, 0x6f, 0xb6, 0x52, 0x35, 0xf2, 0xdf, 0xbc, 0x2d, 0x7b, 0x2c, 0xae, 0x37, 0x4c, 0x33, 0x00, 0x7a, 0xf3, 0xa6, 0xf3, 0x0a, 0xd9, 0xb9, 0x59, 0xf6, 0x0b, 0xa5, 0x9c },
+ // 153
+ { 0x41, 0xe5, 0xcc, 0x0f, 0x82, 0x70, 0x2f, 0xa8, 0xc0, 0x72, 0xb7, 0xf5, 0xfe, 0x45, 0xa1, 0x7b, 0xae, 0x17, 0x63, 0x12, 0xee, 0x83, 0x1d, 0xbe, 0x24, 0x69, 0xa2, 0x3e, 0x16, 0xa2, 0x2d, 0xe0 },
+ // 154
+ { 0xfe, 0xc5, 0x29, 0x21, 0x63, 0x7b, 0x16, 0x81, 0xb9, 0x09, 0x5d, 0x0e, 0xa5, 0xa7, 0x51, 0x9b, 0x11, 0xf8, 0x71, 0x81, 0xb5, 0x9e, 0x0c, 0x03, 0xa0, 0xd1, 0x98, 0x0a, 0x97, 0xb7, 0x1e, 0xef },
+ // 155
+ { 0x1f, 0xcb, 0x5c, 0xbd, 0x45, 0xc1, 0xd7, 0xea, 0x77, 0x5d, 0x0d, 0xf9, 0x3d, 0x2d, 0xf2, 0xe8, 0x43, 0x35, 0x56, 0x3c, 0x9a, 0x5c, 0x42, 0x17, 0x2f, 0x17, 0x89, 0xde, 0x02, 0x53, 0x2e, 0xb9 },
+ // 156
+ { 0xdb, 0x14, 0x4d, 0xd9, 0x9b, 0xdb, 0x52, 0x3b, 0xcc, 0xf0, 0x3e, 0x19, 0xb0, 0x8b, 0x3c, 0x18, 0xa1, 0xe7, 0x5f, 0x44, 0x45, 0xda, 0x7b, 0xeb, 0x19, 0xde, 0x29, 0xaa, 0x78, 0xa8, 0x40, 0xcb },
+ // 157
+ { 0x94, 0x57, 0x65, 0x8b, 0x6d, 0xaf, 0x3f, 0x0c, 0xf8, 0x31, 0x66, 0x0f, 0xfb, 0x49, 0x85, 0x13, 0xa7, 0x70, 0x61, 0x80, 0x6a, 0xfe, 0x18, 0x7e, 0x59, 0xdf, 0x9d, 0x0c, 0x46, 0xc6, 0x73, 0xcd },
+ // 158
+ { 0xa0, 0xc2, 0x22, 0x51, 0x09, 0x52, 0xaa, 0x1d, 0x5c, 0x2e, 0x05, 0xb9, 0x8c, 0x24, 0xa9, 0x40, 0x4f, 0x57, 0xc7, 0xf5, 0xab, 0x24, 0xbd, 0x50, 0xf9, 0x2d, 0x1b, 0xd8, 0x7b, 0x47, 0x7e, 0xf6 },
+ // 159
+ { 0x6d, 0xd0, 0xba, 0xde, 0x12, 0x9a, 0x01, 0x01, 0xb5, 0x7f, 0x11, 0xa3, 0x9e, 0x59, 0x29, 0x96, 0x4e, 0xd8, 0x64, 0x15, 0x86, 0xbb, 0x81, 0xfb, 0x8c, 0x37, 0x63, 0x8c, 0x6f, 0x0d, 0x94, 0x0c },
+ // 160
+ { 0x27, 0x52, 0x31, 0x20, 0x50, 0x27, 0x8d, 0xdd, 0x74, 0xe8, 0x6c, 0x7d, 0xf7, 0x0e, 0xd1, 0x12, 0x3d, 0x89, 0x9f, 0x2d, 0x2e, 0xbe, 0x03, 0x45, 0x20, 0x10, 0xc4, 0x45, 0x90, 0xf9, 0xc9, 0x60 },
+ // 161
+ { 0xbf, 0x7e, 0xc7, 0xdf, 0xf4, 0xa6, 0x6e, 0x96, 0xf4, 0x55, 0xb7, 0x08, 0x2a, 0x41, 0xfb, 0x58, 0xae, 0x29, 0xa9, 0x06, 0x99, 0xdf, 0x02, 0x8e, 0x2a, 0x4f, 0x36, 0xb5, 0xeb, 0x9a, 0xa4, 0xbf },
+ // 162
+ { 0xc8, 0xad, 0x0c, 0xa3, 0xf5, 0x9a, 0x57, 0x32, 0xf7, 0xad, 0x4f, 0xd4, 0xdf, 0x4e, 0xec, 0x58, 0xdb, 0xc2, 0x8c, 0x14, 0x79, 0x3a, 0xb3, 0x08, 0xce, 0x3b, 0xaf, 0x01, 0xdf, 0x9f, 0xe4, 0x21 },
+ // 163
+ { 0xe7, 0xa2, 0x92, 0x35, 0xb6, 0x86, 0xe9, 0x34, 0x82, 0x7d, 0x54, 0xbe, 0x48, 0xc8, 0x40, 0xfb, 0x33, 0xff, 0x58, 0x3c, 0x8b, 0x6a, 0xcd, 0x68, 0xc7, 0x46, 0x56, 0xdb, 0xad, 0xfb, 0x9a, 0x9f },
+ // 164
+ { 0x21, 0x1d, 0xbe, 0x8a, 0x12, 0xe3, 0x93, 0x19, 0x7d, 0x25, 0x75, 0x7b, 0x44, 0x45, 0x94, 0x56, 0xf6, 0x3e, 0xfc, 0x4c, 0x82, 0xf5, 0x7e, 0x1f, 0x66, 0x9d, 0x28, 0x3c, 0x78, 0x12, 0x41, 0x80 },
+ // 165
+ { 0x50, 0x54, 0x8b, 0x91, 0x59, 0xf9, 0x98, 0x2a, 0x9c, 0x8b, 0x50, 0x64, 0x1e, 0x58, 0x03, 0x45, 0x14, 0x0f, 0x7c, 0xa6, 0xbb, 0x37, 0x91, 0x75, 0x03, 0x90, 0xb7, 0x7f, 0x40, 0x49, 0x3a, 0x15 },
+ // 166
+ { 0x65, 0xda, 0x83, 0x93, 0xa1, 0xb7, 0x58, 0x1c, 0xc5, 0x98, 0x76, 0x50, 0x2f, 0x55, 0x96, 0x90, 0xbc, 0x90, 0xc8, 0x6c, 0x0c, 0x7d, 0xd9, 0xaa, 0xdb, 0xa0, 0xb0, 0xd3, 0xe4, 0x3d, 0x31, 0xc7 },
+ // 167
+ { 0xf2, 0x80, 0xad, 0x5c, 0xac, 0x65, 0x52, 0x7d, 0xef, 0xee, 0x90, 0xe4, 0xe9, 0xe5, 0x48, 0x83, 0x37, 0x58, 0xe1, 0x6e, 0xa3, 0x79, 0x2a, 0x31, 0x09, 0x79, 0x80, 0xeb, 0xbf, 0x2d, 0xce, 0xfa },
+ // 168
+ { 0x19, 0xe4, 0x21, 0x35, 0x0f, 0x81, 0xc1, 0xba, 0x14, 0xd2, 0xd3, 0x6b, 0xe8, 0x31, 0x8c, 0x74, 0xde, 0x61, 0xe6, 0x25, 0x9b, 0xa5, 0x8e, 0x9a, 0x3f, 0xf2, 0xed, 0xc9, 0x27, 0xe5, 0xbb, 0xfc },
+ // 169
+ { 0x16, 0x5a, 0x59, 0x15, 0x6e, 0x5e, 0xa1, 0xc9, 0xe5, 0x5a, 0x95, 0xc0, 0x8c, 0x7c, 0x2f, 0x54, 0xcd, 0x2b, 0xc5, 0x3d, 0x32, 0xbe, 0x9d, 0x51, 0x07, 0x8c, 0x8d, 0x6e, 0xcd, 0x73, 0x39, 0x96 },
+ // 170
+ { 0x4f, 0x55, 0x4e, 0xed, 0xfa, 0x74, 0x27, 0x0f, 0xd3, 0xd9, 0xe7, 0xaa, 0xc5, 0xa6, 0x47, 0xc5, 0x97, 0xd2, 0x63, 0x63, 0x80, 0xf3, 0x40, 0xa1, 0x0d, 0xd1, 0x18, 0xfa, 0x40, 0x3b, 0xdc, 0x92 },
+ // 171
+ { 0xb0, 0xd6, 0x7f, 0x9a, 0x90, 0xc4, 0x77, 0xf5, 0x0c, 0xbc, 0x78, 0x9a, 0x11, 0x94, 0x9e, 0xdf, 0x29, 0x50, 0x86, 0x1a, 0xaa, 0x7e, 0x01, 0xcd, 0xc0, 0x85, 0xba, 0x8d, 0x22, 0xf0, 0x00, 0xbb },
+ // 172
+ { 0x67, 0x4b, 0x05, 0x21, 0xd5, 0x63, 0x37, 0xee, 0x8b, 0x69, 0xba, 0x1f, 0xb8, 0xa1, 0xe3, 0x6e, 0x47, 0xf0, 0x2d, 0x4d, 0x58, 0x54, 0xaa, 0x4d, 0xf8, 0x7f, 0xf3, 0xec, 0x45, 0x38, 0x87, 0x72 },
+ // 173
+ { 0xde, 0x81, 0x0a, 0xea, 0xf7, 0xa6, 0x63, 0x93, 0x54, 0x31, 0xb8, 0x1f, 0x57, 0x6a, 0x74, 0x6a, 0xb3, 0xbc, 0x49, 0xd0, 0x22, 0x53, 0xe0, 0x8d, 0x8d, 0x36, 0x2e, 0x40, 0x4e, 0x1f, 0x42, 0xbe },
+ // 174
+ { 0xdc, 0xb0, 0x28, 0x4e, 0x8c, 0xc6, 0xf1, 0x59, 0x41, 0xff, 0xc3, 0x6d, 0xf7, 0x7d, 0x1e, 0xfa, 0x90, 0xea, 0x8f, 0x8a, 0x6c, 0x5a, 0x37, 0x9e, 0xe6, 0x87, 0x65, 0x36, 0x1a, 0x9a, 0xb4, 0xbe },
+ // 175
+ { 0x40, 0xf8, 0xbe, 0x21, 0x39, 0xf0, 0xaf, 0xf0, 0x57, 0x1f, 0x68, 0x09, 0xfb, 0x48, 0x1b, 0xf3, 0x2e, 0x5f, 0x03, 0x8f, 0xc5, 0x4c, 0x82, 0x2b, 0x4b, 0x21, 0x29, 0x32, 0xab, 0xbd, 0x6e, 0xc5 },
+ // 176
+ { 0xf0, 0xed, 0xa1, 0xc5, 0xce, 0xd8, 0x11, 0xaf, 0x5a, 0x0d, 0x84, 0xec, 0x62, 0xb3, 0xb5, 0xa8, 0x6d, 0xb0, 0xaa, 0x94, 0x2f, 0x17, 0x58, 0xd8, 0xe4, 0x87, 0x6b, 0x1c, 0x38, 0xf0, 0x2e, 0x9a },
+ // 177
+ { 0xf5, 0xc5, 0xc5, 0x22, 0xd1, 0x4a, 0x4c, 0xee, 0xa3, 0xa2, 0x76, 0x4a, 0x88, 0x3e, 0xdb, 0x75, 0xf8, 0x9b, 0x2c, 0xe8, 0xb6, 0xf4, 0xd9, 0x71, 0x95, 0x1d, 0xd2, 0xae, 0x9d, 0x5a, 0x4d, 0x6f },
+ // 178
+ { 0x0a, 0x73, 0xc7, 0x11, 0x0a, 0x6d, 0xa1, 0x0e, 0x38, 0x70, 0xe5, 0x17, 0x3c, 0x9b, 0x62, 0xe3, 0x49, 0xcf, 0x36, 0xc4, 0xf6, 0x83, 0x3b, 0xab, 0x56, 0xb4, 0xb4, 0x06, 0x49, 0x59, 0x27, 0x85 },
+ // 179
+ { 0x8c, 0x27, 0xeb, 0xbb, 0xee, 0x4b, 0x48, 0x17, 0x98, 0x5c, 0x0c, 0xd1, 0xf8, 0xc3, 0xaf, 0x72, 0x9a, 0xd0, 0x4d, 0x0e, 0xea, 0xa3, 0x0b, 0xb0, 0x53, 0x3c, 0x5e, 0x41, 0x96, 0x86, 0xde, 0x17 },
+ // 180
+ { 0x19, 0x4a, 0x23, 0x38, 0x93, 0x23, 0x86, 0x43, 0x5e, 0x45, 0x77, 0x35, 0x0b, 0x1e, 0x8b, 0x7f, 0xe5, 0xfb, 0x4a, 0xa4, 0x2c, 0xf0, 0x59, 0x75, 0x7e, 0x81, 0xd4, 0x90, 0xc7, 0x93, 0x73, 0xbc },
+ // 181
+ { 0x95, 0xa6, 0xb2, 0x20, 0x6e, 0xa8, 0x75, 0xbd, 0xd5, 0x7c, 0xe0, 0xa6, 0xae, 0x0a, 0x7b, 0x77, 0x24, 0xef, 0xe2, 0x63, 0x5b, 0xdb, 0x21, 0xa3, 0xdf, 0xca, 0x0f, 0xde, 0x23, 0x9c, 0x46, 0x9b },
+ // 182
+ { 0xbf, 0x80, 0x60, 0xc7, 0x1a, 0xaa, 0xd7, 0x74, 0xd3, 0x56, 0xd5, 0x0f, 0x48, 0x9a, 0x51, 0x84, 0xd3, 0xd2, 0xf7, 0x45, 0x10, 0x53, 0x40, 0xd3, 0x86, 0xe0, 0x9a, 0x25, 0xcf, 0x59, 0xb8, 0xf3 },
+ // 183
+ { 0x67, 0xbe, 0xcd, 0x70, 0x10, 0x9e, 0x2b, 0x70, 0xee, 0xfd, 0x86, 0xdf, 0x9a, 0x30, 0x72, 0xfd, 0xaa, 0x9b, 0x30, 0xd6, 0x02, 0x7c, 0xdd, 0x84, 0x6f, 0x44, 0x63, 0x28, 0x63, 0xb1, 0xbb, 0x02 },
+ // 184
+ { 0x07, 0x4a, 0x1b, 0xb9, 0xf3, 0x09, 0x02, 0xeb, 0x65, 0xed, 0xa7, 0x06, 0x62, 0x85, 0x38, 0x1f, 0x92, 0x95, 0x27, 0x3a, 0x17, 0xbc, 0xab, 0xb0, 0x57, 0x8c, 0xc4, 0xca, 0x40, 0x4c, 0xc8, 0x5e },
+ // 185
+ { 0x0c, 0x52, 0x02, 0x72, 0xc2, 0x5c, 0xa8, 0x70, 0xac, 0x1e, 0x96, 0xe8, 0xc8, 0x0c, 0x2b, 0xc8, 0xa9, 0x59, 0x35, 0x8c, 0xad, 0x72, 0x38, 0xc6, 0xf0, 0xf1, 0x48, 0x92, 0x8e, 0x5a, 0xd3, 0xea },
+ // 186
+ { 0x86, 0xc8, 0x8c, 0x18, 0x4f, 0xb6, 0x6f, 0xf7, 0xfa, 0x38, 0x9e, 0xa8, 0x1f, 0xfd, 0x15, 0xf4, 0x39, 0x27, 0x6a, 0x3e, 0x46, 0x37, 0x0c, 0x43, 0x94, 0x6a, 0x2d, 0x1d, 0x36, 0xe9, 0x3c, 0xb5 },
+ // 187
+ { 0x4a, 0xe6, 0x3d, 0x00, 0xe6, 0xda, 0x51, 0xb9, 0xba, 0x7b, 0xdb, 0xf7, 0x09, 0x6b, 0xbc, 0xd2, 0x91, 0xae, 0x94, 0xbd, 0x86, 0xed, 0x69, 0x8d, 0x25, 0x01, 0x33, 0xde, 0x41, 0xa5, 0xd2, 0x1f },
+ // 188
+ { 0x2d, 0x13, 0x87, 0xa3, 0x00, 0xd7, 0x03, 0x97, 0x77, 0x59, 0x47, 0xe7, 0x1b, 0x76, 0x3d, 0x4a, 0x5d, 0x36, 0x3d, 0x1a, 0xf2, 0x67, 0x61, 0x31, 0x3f, 0x8a, 0xf8, 0x58, 0x25, 0xb4, 0x6b, 0x40 },
+ // 189
+ { 0xbd, 0x75, 0x4e, 0x74, 0x38, 0xf2, 0xfd, 0x8a, 0xc1, 0x53, 0x70, 0xe7, 0x3f, 0xaf, 0xd5, 0x5c, 0xa3, 0xc7, 0xdc, 0x40, 0xc7, 0x80, 0xe4, 0x58, 0x1f, 0x17, 0x18, 0xb1, 0x30, 0x1b, 0xf6, 0x26 },
+ // 190
+ { 0xb3, 0x51, 0xfd, 0x0d, 0xc1, 0x44, 0xb7, 0xa2, 0x03, 0xdc, 0xea, 0x73, 0x2b, 0xac, 0xfe, 0xc6, 0xc3, 0x42, 0x53, 0x3f, 0x72, 0x84, 0xf6, 0xbd, 0x49, 0x19, 0xa7, 0x83, 0xb3, 0xe6, 0xdd, 0xbc },
+ // 191
+ { 0xe3, 0x7b, 0x56, 0xeb, 0x7a, 0x35, 0x87, 0x8c, 0x86, 0xaa, 0x1e, 0x31, 0x5c, 0xe1, 0x6f, 0x13, 0xe6, 0x34, 0xc8, 0xf5, 0x77, 0xd4, 0x96, 0x85, 0xec, 0x5a, 0x2c, 0x91, 0x0f, 0xcd, 0x4a, 0x66 },
+ // 192
+ { 0xf3, 0xef, 0xf1, 0x7e, 0x9d, 0xc2, 0xdc, 0x16, 0xd7, 0xd9, 0x66, 0xf7, 0x55, 0xfa, 0x24, 0x0f, 0xde, 0x18, 0x98, 0x4e, 0xe5, 0x58, 0x5a, 0x44, 0xa5, 0x86, 0xa4, 0x08, 0xff, 0x2c, 0xd9, 0x26 },
+ // 193
+ { 0xd2, 0x56, 0x88, 0x56, 0x0a, 0x17, 0x19, 0xe2, 0x1d, 0x0f, 0xad, 0xd5, 0x70, 0xf0, 0xf9, 0x38, 0xca, 0xb5, 0x49, 0x88, 0xdb, 0xff, 0x9f, 0xc8, 0x31, 0xbc, 0xe5, 0x80, 0xbb, 0x8a, 0xb0, 0x3f },
+ // 194
+ { 0x14, 0xb9, 0x6c, 0x51, 0xb1, 0x55, 0x8b, 0xb1, 0x4b, 0x01, 0x0c, 0x63, 0x66, 0xf0, 0x77, 0x07, 0x07, 0xd1, 0xcd, 0x1f, 0xdb, 0xf0, 0xa1, 0x97, 0x03, 0x8a, 0xe3, 0x6f, 0x22, 0x15, 0x36, 0x3d },
+ // 195
+ { 0x08, 0x7e, 0x0f, 0xe6, 0xb3, 0x9f, 0x40, 0xcd, 0x85, 0x2d, 0xff, 0x0d, 0xc4, 0xf4, 0x8b, 0x2a, 0xf0, 0x35, 0x23, 0xd1, 0x5e, 0x5b, 0xa0, 0xec, 0xd4, 0x03, 0x9e, 0x20, 0x07, 0x47, 0x9d, 0x5e },
+ // 196
+ { 0x95, 0x45, 0x53, 0xd2, 0x73, 0x38, 0xae, 0xc7, 0x34, 0xd3, 0x87, 0xe7, 0xba, 0xeb, 0xa5, 0xe7, 0x0d, 0xbd, 0x62, 0xa8, 0xed, 0x5e, 0x91, 0x67, 0x3c, 0x23, 0x42, 0xd5, 0x7c, 0x43, 0x44, 0x1c },
+ // 197
+ { 0x84, 0xfc, 0x7f, 0x19, 0xd8, 0x72, 0xf9, 0x89, 0xbf, 0xa0, 0x9d, 0x9e, 0x85, 0x03, 0x5e, 0xdb, 0x82, 0x23, 0xfc, 0x13, 0xfd, 0x66, 0x35, 0xcb, 0x7c, 0x47, 0xbb, 0xdd, 0x10, 0xa8, 0x5d, 0x13 },
+ // 198
+ { 0x23, 0x08, 0x9f, 0x31, 0xc4, 0xaf, 0x0e, 0xe5, 0xc6, 0x98, 0xc3, 0x55, 0x1c, 0x77, 0x59, 0x10, 0x66, 0xc2, 0x3c, 0x27, 0xdd, 0xae, 0xd3, 0x60, 0x0a, 0x3a, 0x92, 0x19, 0xea, 0x93, 0x03, 0x2a },
+ // 199
+ { 0x31, 0x62, 0x66, 0xb9, 0xc0, 0xf4, 0x5a, 0x25, 0xf5, 0x2d, 0x36, 0x2b, 0x7a, 0xdf, 0xdb, 0x1a, 0xec, 0xd1, 0x04, 0xc2, 0x96, 0xf9, 0x38, 0x04, 0x05, 0x80, 0xff, 0xf7, 0x4a, 0x33, 0xdf, 0x02 },
+ // 200
+ { 0xae, 0x62, 0x4c, 0x17, 0xfb, 0xd9, 0x62, 0x0b, 0x88, 0x11, 0xf0, 0x2e, 0x1e, 0x4d, 0x00, 0x6c, 0xb8, 0xf0, 0xdc, 0xa5, 0xf9, 0x6a, 0x14, 0xbe, 0xb5, 0xea, 0x13, 0x5d, 0x1d, 0xf5, 0xc9, 0xef },
+ // 201
+ { 0x3f, 0xa4, 0xe6, 0x42, 0xb7, 0xf6, 0xaa, 0x9f, 0x63, 0x57, 0x16, 0x8d, 0xd7, 0x5f, 0x5e, 0x3e, 0x11, 0x4e, 0x02, 0x6b, 0x46, 0xa3, 0xd7, 0x5d, 0xe2, 0xf3, 0xd5, 0xa0, 0xe2, 0x31, 0x7e, 0x54 },
+ // 202
+ { 0x68, 0xd3, 0xe6, 0xea, 0x92, 0x83, 0xc6, 0xe4, 0x77, 0x97, 0x9d, 0x32, 0x22, 0xfb, 0x15, 0x31, 0x18, 0x55, 0x33, 0xa8, 0x9f, 0x43, 0x3e, 0xd4, 0x1a, 0x0f, 0xa0, 0xbc, 0xec, 0x9e, 0x0d, 0x15 },
+ // 203
+ { 0x39, 0xee, 0x8d, 0x4e, 0xab, 0x74, 0x22, 0x24, 0x71, 0x6b, 0x2e, 0x66, 0xc9, 0xf9, 0x85, 0x32, 0xb4, 0x39, 0xb0, 0x27, 0x3c, 0xfd, 0xbe, 0x02, 0x0b, 0xe6, 0x4c, 0x04, 0x87, 0x9e, 0x67, 0x87 },
+ // 204
+ { 0xda, 0x77, 0x3c, 0x43, 0x56, 0x15, 0xf0, 0x51, 0xa1, 0x37, 0xc2, 0xb1, 0x56, 0x0f, 0x15, 0xc3, 0x63, 0xe8, 0xbc, 0x5a, 0x9b, 0x7b, 0x96, 0x30, 0xb8, 0xad, 0x81, 0x4a, 0x0b, 0x13, 0x24, 0x80 },
+ // 205
+ { 0xcc, 0xf5, 0x94, 0x15, 0x5a, 0xff, 0x2f, 0xb0, 0xfe, 0x76, 0xf7, 0x15, 0xe6, 0xaa, 0x76, 0x1b, 0x6d, 0xe3, 0x19, 0xd3, 0xcc, 0x52, 0xf9, 0xb3, 0x4a, 0xad, 0x04, 0xdc, 0x41, 0xeb, 0x2f, 0xeb },
+ // 206
+ { 0x24, 0xcb, 0x9a, 0xda, 0x6c, 0x3b, 0xff, 0x8e, 0x91, 0xc3, 0x98, 0x3b, 0xc5, 0x9d, 0x66, 0xf0, 0x59, 0xb6, 0xe2, 0x4f, 0xe2, 0x5e, 0x57, 0x72, 0xb8, 0x92, 0x90, 0xb5, 0x25, 0x0f, 0x23, 0x2d },
+ // 207
+ { 0x6d, 0x02, 0xcd, 0x3d, 0x1f, 0xe2, 0xd2, 0xfb, 0xa9, 0x23, 0x27, 0xb3, 0x6b, 0x53, 0x8f, 0x49, 0xa4, 0xb0, 0x47, 0x37, 0x5e, 0xc4, 0x44, 0x77, 0x02, 0x3f, 0xea, 0xdd, 0x40, 0x59, 0xd5, 0x6e },
+ // 208
+ { 0x4e, 0xf1, 0x9b, 0x67, 0x70, 0x3e, 0xc8, 0xae, 0xa4, 0xbb, 0x73, 0x94, 0xee, 0xca, 0x0d, 0xa2, 0x81, 0x50, 0xad, 0x9b, 0xb3, 0x00, 0x36, 0x38, 0x73, 0x40, 0x63, 0xb5, 0xae, 0x93, 0x21, 0x86 },
+ // 209
+ { 0x9f, 0x76, 0x1e, 0xce, 0xd1, 0x3c, 0xa4, 0x5a, 0xdd, 0x32, 0x70, 0x3f, 0x76, 0xd9, 0x2a, 0x75, 0xc2, 0x72, 0x2e, 0x5a, 0x4e, 0x87, 0x68, 0xa8, 0x54, 0xcf, 0x87, 0x61, 0xc9, 0x51, 0xc6, 0xc6 },
+ // 210
+ { 0xef, 0x97, 0x1b, 0x56, 0xa9, 0x79, 0x3c, 0x99, 0x62, 0x17, 0x8c, 0x8d, 0x73, 0x51, 0x9d, 0x2c, 0x98, 0xba, 0x4f, 0x4e, 0x3a, 0x6e, 0xab, 0xc8, 0x6a, 0xc1, 0x71, 0xee, 0xbe, 0x71, 0xc5, 0xd5 },
+ // 211
+ { 0x58, 0x08, 0x1a, 0x13, 0xe6, 0xe0, 0xc4, 0x97, 0x57, 0x2f, 0xf7, 0xeb, 0x1f, 0xa6, 0x5c, 0x80, 0x32, 0x19, 0x8c, 0x83, 0x44, 0xeb, 0x68, 0x60, 0x6e, 0x3a, 0x61, 0x83, 0xcb, 0x43, 0x63, 0xe0 },
+ // 212
+ { 0x18, 0xd7, 0x2c, 0xaa, 0x3e, 0xe3, 0x7b, 0x0a, 0x36, 0xaa, 0xd8, 0x35, 0x22, 0x8d, 0x98, 0xa0, 0x3d, 0xcb, 0xf4, 0x82, 0x94, 0xff, 0x65, 0xae, 0x9c, 0xb2, 0xb5, 0xaa, 0x1e, 0x93, 0x53, 0xa8 },
+ // 213
+ { 0xc3, 0x48, 0x5b, 0xa6, 0xe1, 0x47, 0x01, 0x0d, 0xc3, 0x2c, 0x00, 0xfc, 0x83, 0xf5, 0xd3, 0xa3, 0xdd, 0x0b, 0xc2, 0xea, 0x72, 0x9b, 0xb1, 0x5a, 0x8f, 0x09, 0x6f, 0x48, 0xd9, 0xe6, 0x0c, 0x21 },
+ // 214
+ { 0x78, 0xdb, 0x66, 0xcd, 0x0c, 0x43, 0x9e, 0xf8, 0xfd, 0x1f, 0xf5, 0x38, 0x33, 0xec, 0x74, 0xf9, 0xf2, 0x79, 0x5c, 0x63, 0xba, 0x73, 0x6b, 0xee, 0xc6, 0xae, 0x2d, 0xa9, 0xf6, 0x3a, 0x18, 0x3f },
+ // 215
+ { 0xfe, 0x5a, 0xf5, 0xe1, 0x2b, 0xe3, 0xf4, 0x51, 0xab, 0x5d, 0x20, 0x6b, 0xee, 0xbc, 0x83, 0xaf, 0x1a, 0xe7, 0xc9, 0xc1, 0x2f, 0xac, 0xc3, 0x73, 0xc8, 0x49, 0x99, 0x69, 0xc2, 0x34, 0x1e, 0xa1 },
+ // 216
+ { 0xcc, 0x01, 0x0f, 0xc7, 0xd8, 0x55, 0x19, 0x22, 0x18, 0x90, 0x64, 0xc5, 0x80, 0x5c, 0x4b, 0xd7, 0xee, 0xf0, 0xe1, 0x24, 0xe0, 0x04, 0xf9, 0x09, 0x91, 0x9d, 0xb3, 0x85, 0xd8, 0xbb, 0xa2, 0x83 },
+ // 217
+ { 0x54, 0xe7, 0x92, 0xcb, 0x3d, 0x39, 0x35, 0xa9, 0x1b, 0x5d, 0xb6, 0xf8, 0x85, 0xf1, 0xc3, 0x4e, 0x3f, 0x71, 0xdf, 0xa4, 0xc6, 0xb6, 0x68, 0xe2, 0xe5, 0x38, 0xc4, 0x0c, 0x0e, 0x1d, 0xa2, 0xe2 },
+ // 218
+ { 0x96, 0x63, 0x15, 0x3b, 0xe2, 0x52, 0x03, 0xa7, 0xf2, 0xc1, 0x17, 0x9a, 0x38, 0x74, 0xc7, 0x62, 0x42, 0x77, 0x4e, 0xf4, 0x4b, 0xce, 0x90, 0x51, 0x1d, 0x1d, 0x78, 0x42, 0xf7, 0xde, 0x58, 0xab },
+ // 219
+ { 0xfa, 0x78, 0x6d, 0x04, 0x8c, 0x43, 0xde, 0xbc, 0xf5, 0x54, 0xb8, 0x53, 0xce, 0x5d, 0xc7, 0x97, 0xb0, 0x20, 0xa2, 0x4b, 0x88, 0x8c, 0xa9, 0x79, 0x33, 0x7e, 0xfa, 0xb4, 0x73, 0xef, 0x86, 0xdf },
+ // 220
+ { 0xe9, 0x83, 0x25, 0x91, 0xbc, 0x85, 0x0d, 0xe9, 0x9a, 0xc1, 0x24, 0x9f, 0xd7, 0xc8, 0x93, 0x63, 0xcf, 0x44, 0x4e, 0xce, 0xe7, 0xcb, 0xf3, 0xa8, 0x91, 0x92, 0xd9, 0xa1, 0xb4, 0xae, 0xa0, 0xbd },
+ // 221
+ { 0x10, 0xa9, 0x4e, 0x35, 0x03, 0xcc, 0xe7, 0x67, 0x75, 0x74, 0x1c, 0x2a, 0x82, 0xaf, 0x43, 0xee, 0x06, 0x42, 0x20, 0x75, 0xc5, 0xb3, 0xb6, 0x51, 0xe4, 0x2d, 0xe8, 0xd8, 0x2f, 0xc5, 0xc9, 0x38 },
+ // 222
+ { 0xc9, 0x7a, 0x23, 0x5d, 0xe0, 0xb6, 0x21, 0x5c, 0xdf, 0xd9, 0xb5, 0xff, 0xe7, 0xad, 0x45, 0x77, 0x55, 0x30, 0xb7, 0x18, 0xcb, 0x54, 0x89, 0xa3, 0x61, 0x88, 0x83, 0x26, 0x83, 0x3c, 0xac, 0x13 },
+ // 223
+ { 0xe5, 0x6f, 0x66, 0x7d, 0xb8, 0xc7, 0xd2, 0x71, 0xda, 0x7c, 0x0f, 0x11, 0xd2, 0xc7, 0x5b, 0xc7, 0x06, 0xbe, 0xd2, 0xb2, 0xf8, 0x66, 0x1a, 0x1f, 0xb6, 0xf2, 0x9d, 0xeb, 0x78, 0xc2, 0xcd, 0x5f },
+ // 224
+ { 0xe0, 0xdc, 0xa7, 0xc4, 0x48, 0xe4, 0x6a, 0x50, 0x6b, 0x16, 0x75, 0x06, 0x41, 0x46, 0x89, 0xef, 0x2d, 0xc8, 0x50, 0xd2, 0xee, 0x0b, 0x57, 0x67, 0xdb, 0x7a, 0xeb, 0xa6, 0xcf, 0xb9, 0xe8, 0x50 },
+ // 225
+ { 0x81, 0xef, 0x43, 0x64, 0x2d, 0xf9, 0x2f, 0x91, 0xa0, 0x51, 0xf0, 0xa4, 0x9d, 0xe5, 0x65, 0x31, 0x9a, 0xaa, 0x03, 0x50, 0x13, 0x44, 0xaf, 0x3c, 0xd0, 0x51, 0x83, 0x40, 0xa4, 0x76, 0x99, 0x75 },
+ // 226
+ { 0xb1, 0x1c, 0x25, 0xc1, 0x85, 0x08, 0xdb, 0x61, 0x7e, 0x00, 0x7f, 0xd6, 0xda, 0x1f, 0x52, 0x6a, 0x8a, 0x4c, 0x35, 0x1b, 0xa7, 0x8a, 0x09, 0xcf, 0xc0, 0xbf, 0xd1, 0x75, 0xc2, 0x4d, 0xbb, 0xc9 },
+ // 227
+ { 0x65, 0x7d, 0xc9, 0x98, 0x1d, 0xc1, 0x6f, 0xca, 0x11, 0x70, 0xed, 0x35, 0xa5, 0xb2, 0x7e, 0x96, 0x0c, 0x53, 0x95, 0x52, 0x1d, 0x7d, 0x9d, 0xf3, 0x25, 0x57, 0x63, 0xe2, 0xfb, 0xf2, 0x2a, 0xd7 },
+ // 228
+ { 0x29, 0x34, 0xc5, 0xf6, 0xe7, 0x1f, 0x6e, 0x39, 0x04, 0x81, 0x88, 0x39, 0x27, 0xa0, 0xd9, 0xd6, 0xeb, 0x93, 0xc5, 0xba, 0xd4, 0xf1, 0xa5, 0xff, 0x5b, 0x09, 0x7c, 0xff, 0x5e, 0x08, 0x1d, 0x67 },
+ // 229
+ { 0x1b, 0xc4, 0x7f, 0xac, 0xbd, 0x45, 0xfd, 0x59, 0xc7, 0x00, 0x31, 0x94, 0x96, 0xa0, 0x23, 0x14, 0xf3, 0x8a, 0xef, 0x86, 0xb9, 0x1c, 0x37, 0xac, 0x47, 0xbc, 0x7d, 0x2a, 0x17, 0xcc, 0x2a, 0x0f },
+ // 230
+ { 0x7c, 0x04, 0x49, 0xae, 0xe6, 0x69, 0x06, 0x44, 0xeb, 0x9a, 0x67, 0x3e, 0xda, 0x8d, 0xfa, 0xd6, 0x5d, 0x1f, 0xef, 0x8d, 0xab, 0x2c, 0xc4, 0x1d, 0x8e, 0x52, 0xe6, 0xf7, 0xaa, 0xbd, 0xda, 0x36 },
+ // 231
+ { 0x19, 0x75, 0x61, 0xfb, 0x26, 0x0b, 0x09, 0xfd, 0x29, 0xe7, 0x74, 0x44, 0x42, 0x27, 0x40, 0xa5, 0xfa, 0x8d, 0x17, 0xbc, 0xf6, 0x0a, 0x34, 0xd7, 0x4b, 0x63, 0x49, 0x2d, 0xc3, 0xd4, 0x54, 0x14 },
+ // 232
+ { 0xc9, 0xf0, 0xed, 0x80, 0x1e, 0xfc, 0xd0, 0x01, 0xf0, 0x0b, 0xcc, 0x4e, 0xd2, 0xff, 0x2e, 0x76, 0xfb, 0xd6, 0xac, 0x91, 0xd3, 0x89, 0x92, 0x0d, 0xab, 0x9e, 0x12, 0xd5, 0xeb, 0x63, 0x60, 0x18 },
+ // 233
+ { 0x46, 0x5e, 0x55, 0x03, 0x02, 0x92, 0xd0, 0x21, 0x53, 0xbf, 0xe3, 0xc5, 0x2f, 0x67, 0x36, 0x91, 0x27, 0xd8, 0xae, 0xc5, 0xb5, 0x77, 0x8a, 0x0b, 0x06, 0x43, 0x00, 0x08, 0xbb, 0xa0, 0xc5, 0xda },
+ // 234
+ { 0x0e, 0x44, 0x3f, 0x10, 0x30, 0xdc, 0xbc, 0x18, 0xd8, 0xf2, 0x99, 0x7a, 0xe2, 0x1d, 0x29, 0xe8, 0x91, 0xd0, 0x48, 0x7a, 0x79, 0x09, 0x89, 0x67, 0x72, 0x9e, 0xd3, 0xe5, 0xef, 0x61, 0x93, 0xfe },
+ // 235
+ { 0x61, 0xda, 0xf8, 0x42, 0x13, 0xc2, 0xe7, 0xa5, 0x5f, 0x8d, 0xbb, 0xcd, 0x3c, 0x87, 0x23, 0xf6, 0xef, 0xdc, 0x7e, 0x81, 0xfc, 0x8b, 0x79, 0x8a, 0xcc, 0x4c, 0xa5, 0xc8, 0x25, 0xf9, 0x1c, 0x6d },
+ // 236
+ { 0x2c, 0x1b, 0x5b, 0x64, 0xe9, 0x9a, 0x37, 0xee, 0x1c, 0xa8, 0xdc, 0xd4, 0x49, 0xa4, 0x77, 0x88, 0x29, 0x60, 0x88, 0x74, 0xaf, 0xae, 0x35, 0x2a, 0xe9, 0xa3, 0xb0, 0xaa, 0xfb, 0xab, 0x2b, 0x65 },
+ // 237
+ { 0x68, 0x4f, 0xca, 0x80, 0x09, 0x53, 0x1a, 0x9d, 0xa1, 0xed, 0x81, 0xb3, 0xda, 0x96, 0xa3, 0x9e, 0x86, 0x2f, 0x1a, 0xd7, 0x31, 0x0e, 0x18, 0xf5, 0xf9, 0x60, 0xc5, 0xb0, 0xff, 0xd6, 0x36, 0x5d },
+ // 238
+ { 0xda, 0x78, 0x5f, 0x50, 0x37, 0xe5, 0x91, 0x89, 0x72, 0x90, 0xec, 0x30, 0x6e, 0x5b, 0x5c, 0x3a, 0xd7, 0x1a, 0x68, 0x7f, 0x58, 0xd7, 0x2e, 0xe9, 0xb0, 0xa1, 0xfb, 0x92, 0xe8, 0xf6, 0xfa, 0xb6 },
+ // 239
+ { 0xa9, 0xc5, 0xc7, 0x66, 0x49, 0x0a, 0xaf, 0xd6, 0x2e, 0x4d, 0x28, 0x14, 0x82, 0x85, 0xcf, 0x91, 0x41, 0x82, 0xbc, 0x78, 0x33, 0x13, 0x90, 0xf8, 0xd1, 0x2a, 0xa2, 0xe2, 0xcd, 0xcf, 0xe2, 0x85 },
+ // 240
+ { 0x24, 0x91, 0xdd, 0xa5, 0xef, 0x34, 0x97, 0xf3, 0x17, 0x2d, 0x9a, 0xd6, 0xb9, 0x43, 0x38, 0xdd, 0x9b, 0x00, 0x33, 0x30, 0xeb, 0xdc, 0xf3, 0xd2, 0xd2, 0xef, 0x93, 0x4b, 0x56, 0x87, 0x2a, 0xc2 },
+ // 241
+ { 0x77, 0x5a, 0xc5, 0x10, 0x4a, 0x23, 0x49, 0x57, 0xa5, 0xd9, 0x5b, 0x3f, 0x6a, 0x66, 0xc9, 0x55, 0x4c, 0x72, 0xeb, 0xb8, 0x1d, 0x79, 0x05, 0xe0, 0x22, 0x97, 0x5d, 0x1c, 0xea, 0x4b, 0xfb, 0x1b },
+ // 242
+ { 0x5d, 0x53, 0x12, 0x8c, 0xa0, 0x64, 0x60, 0x6e, 0xb9, 0x5a, 0x49, 0x6d, 0x67, 0x4b, 0x20, 0x5c, 0x23, 0xa3, 0x07, 0xcc, 0x0d, 0x49, 0xf0, 0x2e, 0xfc, 0xc3, 0x00, 0xcd, 0x5c, 0x74, 0xac, 0x38 },
+ // 243
+ { 0x30, 0x4f, 0xa6, 0xbc, 0x45, 0x5d, 0xee, 0x95, 0x77, 0xca, 0x55, 0x5d, 0xe5, 0x5c, 0xf0, 0xeb, 0xd9, 0x38, 0xaf, 0xbe, 0xed, 0x8e, 0x7e, 0xd8, 0x57, 0x2a, 0xb7, 0x07, 0xff, 0x4e, 0x56, 0x23 },
+ // 244
+ { 0xa8, 0x7c, 0xca, 0x54, 0x3b, 0xcc, 0xe9, 0x80, 0xac, 0xce, 0x17, 0x62, 0x00, 0xd2, 0xc1, 0x71, 0x95, 0xc0, 0xc9, 0x0c, 0xd5, 0x0b, 0xaf, 0x0a, 0x46, 0x99, 0xc8, 0xc4, 0x5a, 0xb1, 0x18, 0x20 },
+ // 245
+ { 0x5c, 0xd2, 0x7f, 0x0e, 0x3b, 0x80, 0xeb, 0x1a, 0xcd, 0x65, 0x14, 0xd5, 0x4e, 0x03, 0x95, 0x40, 0x99, 0x52, 0xd2, 0xe1, 0xed, 0xf9, 0xb1, 0x88, 0x11, 0x37, 0xed, 0x01, 0x47, 0xa9, 0xa1, 0xc1 },
+ // 246
+ { 0xc2, 0x44, 0xcd, 0xe0, 0x2f, 0x02, 0x12, 0xf0, 0xb6, 0x37, 0x9a, 0x91, 0x23, 0x16, 0x77, 0x36, 0x7d, 0x6c, 0xfd, 0xaf, 0x25, 0x60, 0xd5, 0x98, 0x63, 0xa1, 0x85, 0xf8, 0xaf, 0x3d, 0x56, 0x7b },
+ // 247
+ { 0xa7, 0x87, 0x64, 0x76, 0x7e, 0xda, 0x2b, 0xd4, 0xac, 0x8c, 0xd5, 0x91, 0xa0, 0xf9, 0xf2, 0xf2, 0x41, 0x83, 0x38, 0xda, 0xa9, 0x63, 0xe3, 0x91, 0xe0, 0x34, 0xfd, 0x87, 0xbe, 0xf5, 0x39, 0x58 },
+ // 248
+ { 0x4f, 0x8f, 0x58, 0xd9, 0xa4, 0xe8, 0xbf, 0x0a, 0x23, 0x48, 0x0c, 0xc0, 0x06, 0x0a, 0x54, 0x82, 0x2d, 0x04, 0x78, 0xd2, 0x63, 0x13, 0x9b, 0x75, 0x3d, 0x47, 0x41, 0xd1, 0xe6, 0x65, 0xfe, 0xb7 },
+ // 249
+ { 0xb8, 0x5f, 0xd3, 0x4e, 0x1c, 0x1a, 0x8c, 0x06, 0x9b, 0x47, 0x4d, 0x67, 0x06, 0xbe, 0x56, 0xe5, 0xfd, 0x66, 0xe4, 0x7a, 0x31, 0x6d, 0x4f, 0x05, 0x20, 0xf4, 0x4a, 0x6a, 0xc4, 0xf8, 0x69, 0x88 },
+ // 250
+ { 0x03, 0xe6, 0x91, 0x51, 0x38, 0xa2, 0x2f, 0x5a, 0x97, 0x0b, 0x2c, 0xdb, 0xa5, 0x0a, 0x55, 0x17, 0x19, 0xf9, 0x13, 0x6f, 0x1c, 0x18, 0xc4, 0xce, 0x2b, 0x73, 0x8e, 0x2a, 0xe1, 0x86, 0x8b, 0xee },
+ // 251
+ { 0xd3, 0xed, 0xa9, 0xd6, 0xdc, 0x8b, 0xe0, 0xad, 0xb5, 0x13, 0x43, 0xb8, 0xb3, 0x00, 0x3d, 0xb5, 0x9c, 0xb0, 0x28, 0x4b, 0xbc, 0x50, 0x4e, 0x74, 0xbf, 0xf3, 0xc0, 0x49, 0x63, 0x6a, 0x0b, 0xb7 },
+ // 252
+ { 0x21, 0x13, 0x71, 0x98, 0xb5, 0x06, 0x06, 0x03, 0x22, 0x4a, 0x74, 0x94, 0x9b, 0x1d, 0x42, 0x91, 0x32, 0x13, 0xb2, 0xb6, 0x49, 0xb2, 0x8a, 0xaf, 0xb8, 0xc0, 0xca, 0x18, 0xe2, 0x7f, 0x94, 0xf0 },
+ // 253
+ { 0xd5, 0x25, 0x71, 0x5b, 0x56, 0xa6, 0xc3, 0xb6, 0x8d, 0xd6, 0xb9, 0xf3, 0x13, 0x1e, 0x41, 0x2d, 0xfb, 0x1f, 0x83, 0x20, 0xd1, 0x3f, 0x47, 0x30, 0x72, 0xc7, 0xa2, 0xf7, 0x23, 0xc3, 0xad, 0x08 },
+ // 254
+ { 0x87, 0x1a, 0x9e, 0x83, 0x8a, 0xbd, 0x11, 0x24, 0x22, 0xa5, 0x20, 0x1f, 0x6c, 0x5b, 0xb8, 0x53, 0x6a, 0x57, 0x57, 0x1a, 0x5c, 0xc2, 0x61, 0x1e, 0x5f, 0x03, 0x53, 0x2b, 0x81, 0xaf, 0x4b, 0x92 },
+ // 255
+ { 0xeb, 0xe8, 0x11, 0x0a, 0x3d, 0x2d, 0x07, 0x4b, 0x85, 0x49, 0x56, 0x76, 0xbb, 0x0d, 0x98, 0x16, 0x16, 0x07, 0xb5, 0x5d, 0xb6, 0x19, 0x15, 0x40, 0xfe, 0x4d, 0x53, 0x5a, 0xc3, 0x8a, 0xaf, 0xb1 },
+};
diff --git a/lib/tst/blake2s_selftest.cc b/lib/tst/blake2s_selftest.cc
new file mode 100644
index 0000000..58199f6
--- /dev/null
+++ b/lib/tst/blake2s_selftest.cc
@@ -0,0 +1,117 @@
+// Self test Modules for BLAKE2s
+#include <gtest/gtest.h>
+
+#include "../blake2/blake2s.c"
+#include "blake2s_kat.h"
+
+static_assert(sizeof(BLAKE2s_param) == (8 * sizeof(uint32_t)), "sizeof struct BLAKE2s_param");
+
+// Deterministic sequences (Fibonacci generator).
+static void
+selftest_seq(uint8_t *out, size_t len, uint32_t seed)
+{
+ size_t i;
+ uint32_t t, a, b;
+
+ a = 0xDEAD4BAD * seed; // prime
+ b = 1;
+
+ for (i = 0; i < len; i++) { // fill the buf
+ t = a + b;
+ a = b;
+ b = t;
+ out[i] = (t >> 24) & 0xFF;
+ }
+}
+
+// BLAKE2s self-test validation. Return 0 when OK.
+int
+blake2s_selftest()
+{
+ // Grand hash of hash results.
+ const uint8_t blake2s_res[32] = {0x6A, 0x41, 0x1F, 0x08, 0xCE, 0x25, 0xAD, 0xCD, 0xFB, 0x02, 0xAB,
+ 0xA6, 0x41, 0x45, 0x1C, 0xEC, 0x53, 0xC5, 0x98, 0xB2, 0x4F, 0x4F,
+ 0xC7, 0x87, 0xFB, 0xDC, 0x88, 0x79, 0x7F, 0x4C, 0x1D, 0xFE};
+ // Parameter sets.
+ const size_t b2s_md_len[4] = {16, 20, 28, 32};
+ const size_t b2s_in_len[6] = {0, 3, 64, 65, 255, 1024};
+
+ size_t i, j, outlen, inlen;
+ uint8_t in[1024], md[32], key[32];
+ struct BLAKE2s_ctx ctx;
+
+ // 256-bit hash for testing.
+ if (BLAKE2s_init(&ctx, 32, NULL, 0)) return -1;
+
+ for (i = 0; i < 4; i++) {
+ outlen = b2s_md_len[i];
+ for (j = 0; j < 6; j++) {
+ inlen = b2s_in_len[j];
+
+ selftest_seq(in, inlen, inlen); // unkeyed hash
+ BLAKE2s(md, outlen, NULL, 0, in, inlen);
+ BLAKE2s_update(&ctx, md, outlen); // hash the hash
+
+ selftest_seq(key, outlen, outlen); // keyed hash
+ BLAKE2s(md, outlen, key, outlen, in, inlen);
+ BLAKE2s_update(&ctx, md, outlen); // hash the hash
+ }
+ }
+
+ // Compute and compare the hash of hashes.
+ BLAKE2s_final(&ctx, md);
+ for (i = 0; i < 32; i++) {
+ if (md[i] != blake2s_res[i]) return -1;
+ }
+
+ return 0;
+}
+
+TEST(blake2s, rotr_u32)
+{
+ EXPECT_EQ(rotr_u32(0xdecafade, 16), 0xfadedeca);
+ EXPECT_EQ(rotr_u32(0xdecafade, 8), 0xdedecafa);
+}
+
+TEST(blake2s, selftest) { EXPECT_EQ(blake2s_selftest(), 0); }
+
+TEST(blake2s, selftestAllInOne)
+{
+ const char *in = "abc";
+ size_t inlen = 3;
+
+ uint8_t out[32];
+ BLAKE2s(out, 32, NULL, 0, in, inlen);
+
+ const uint8_t blake2s_res[32] = {0x50, 0x8C, 0x5E, 0x8C, 0x32, 0x7C, 0x14, 0xE2, 0xE1, 0xA7, 0x2B,
+ 0xA3, 0x4E, 0xEB, 0x45, 0x2F, 0x37, 0x45, 0x8B, 0x20, 0x9E, 0xD6,
+ 0x3A, 0x29, 0x4D, 0x99, 0x9B, 0x4C, 0x86, 0x67, 0x59, 0x82};
+
+ for (unsigned i = 0; i < 32; i++) {
+ EXPECT_EQ(out[i], blake2s_res[i]) << "position=" << i;
+ }
+}
+
+TEST(blake2s, KnownAnswerTest)
+{
+ uint8_t in[256];
+ for (int i = 0; i < 256; ++i) in[i] = i;
+ uint8_t out[32];
+
+ for (unsigned i = 0; i < KATs_len; ++i) {
+ EXPECT_EQ(BLAKE2s(out, 32, NULL, 0, in, i), 0);
+ for (unsigned j = 0; j < 32; ++j) EXPECT_EQ(out[j], KATs[i][j]) << "on test=" << i << " pos=" << j;
+ }
+}
+
+TEST(blake2s, KnownAnswerTestKeyed)
+{
+ uint8_t in[256];
+ for (int i = 0; i < 256; ++i) in[i] = i;
+ uint8_t out[32];
+
+ for (unsigned i = 0; i < KATs_len; ++i) {
+ EXPECT_EQ(BLAKE2s(out, 32, KAT_secret, 32, in, i), 0);
+ for (unsigned j = 0; j < 32; ++j) EXPECT_EQ(out[j], secret_KATs[i][j]) << "on test=" << i << " pos=" << j;
+ }
+}
diff --git a/lib/tst/endian_little.cc b/lib/tst/endian_little.cc
new file mode 100644
index 0000000..f28e0e6
--- /dev/null
+++ b/lib/tst/endian_little.cc
@@ -0,0 +1,38 @@
+#include <endian.h>
+#include <gtest/gtest.h>
+
+namespace libk {
+#include "../endian/little.c"
+} // namespace libk
+
+TEST(endian_little, htole16)
+{
+ EXPECT_EQ(static_cast<uint16_t>(0xabcd), libk::htole16(0xabcd));
+ EXPECT_EQ(libk::htole16(0xabcd), htole16(0xabcd));
+}
+TEST(endian_little, htole32)
+{
+ EXPECT_EQ(static_cast<uint32_t>(0xabcd0123), libk::htole32(0xabcd0123));
+ EXPECT_EQ(libk::htole32(0xabcd0123), htole32(0xabcd0123));
+}
+TEST(endian_little, htole64)
+{
+ EXPECT_EQ(static_cast<uint64_t>(0x0123456789abcdef), libk::htole64(0x0123456789abcdef));
+ EXPECT_EQ(libk::htole64(0xabcdef0123456789), htole64(0xabcdef0123456789));
+}
+
+TEST(endian_little, htobe16)
+{
+ EXPECT_EQ(static_cast<uint16_t>(0xabcd), libk::htobe16(0xcdab));
+ EXPECT_EQ(libk::htobe16(0xabcd), htobe16(0xabcd));
+}
+TEST(endian_little, htobe32)
+{
+ EXPECT_EQ(static_cast<uint32_t>(0xabcd0123), libk::htobe32(0x2301cdab));
+ EXPECT_EQ(libk::htobe32(0xabcd0123), htobe32(0xabcd0123));
+}
+TEST(endian_little, htobe64)
+{
+ EXPECT_EQ(static_cast<uint64_t>(0x0123456789abcdef), libk::htobe64(0xefcdab8967452301));
+ EXPECT_EQ(libk::htobe64(0xabcdef0123456789), htobe64(0xabcdef0123456789));
+}