/* @(#)Tiger.java 1.11 2004-04-26
* This file was freely contributed to the LimeWire project and is covered
* by its existing GPL licence, but it may be used individually as a public
* domain implementation of a published algorithm (see below for references).
* It was also freely contributed to the Bitzi public domain sources.
* @author Philippe Verdy
*/
/* Sun may wish to change the following package name, if integrating this
* class in the Sun JCE Security Provider for Java 1.5 (code-named Tiger).
*
* You can include it in your own Secrurty Provider by inserting
* these properties in your Provider derived class:
* put("MessageDigest.Tiger", "com.limegroup.gnutella.security.Tiger");
*/
package com.limegroup.gnutella.security;
import java.security.DigestException;
import java.security.MessageDigest;
//--+---+1--+---+--2+---+---+3--+---+--4+---+---+5--+---+--6+---+---+7--+---+--
//34567890123456789012345678901234567890123456789012345678901234567890123456789
/**
* Tiger is a fast new hash function, by Ross Anderson and Eli Biham.
* This class is a simple Java implementation of the 192-bit Tiger
* algorithm, based on the sample C code published by Eli Biham on
* http://www.cs.technion.ac.il/~biham/Reports/Tiger/
* in its HTML reference Appendix.
*
* It computes a 192-bit digest that is considered stronger, but faster to
* compute than 160-bit SHA-1. Its input is a set of 64-bytes blocks.
* The last block of a digested message must include a required padding byte
* which must be 0x01, the remaining padding bytes must be set to 0x00.
*
* May be in the future, this class will be part of the standard JCE (Java
* Cryptography Environment) included in Java 1.5, code named... Tiger!
* For now Java 1.4, code named Merlin, does not have this digest
* algorithm, and only includes Adler32 or CRC32 (in java.util.zip),
* and MD4, MD5 or SHA1 (in javax.crypto.Mac, included in the SUN JCE).
*/
public final class Tiger extends MessageDigest implements Cloneable {
/**
* This implementation returns a fixed-size digest.
*/
private static final int HASH_LENGTH = 24; /* bytes (192 bits) */
/**
* Private context for incomplete blocks and padding bytes.
* INVARIANT: padding must be in 0..63.
* When the padding reaches 64, a new block is computed, and
* the 56 last bytes are kept in the padding history.
*/
private byte[] pad;
private int padding;
/**
* Private Contextual byte count, send in the next block,
* after the ending padding block.
*/
private long bytes;
/**
* Private context that contains the current digest key.
*/
private long hA, hB, hC;
/**
* Creates a Tiger object with default initial state.
*/
public Tiger() {
super("Tiger");
pad = new byte[64];
init();
}
/**
* Clones this object.
*/
public Object clone() throws CloneNotSupportedException {
Tiger that = (Tiger)super.clone();
that.pad = (byte[])this.pad.clone();
return that;
}
/**
* Returns the digest length in bytes.
*
* Can be used to allocate your own output buffer when
* computing multiple digests.
*
* Overrides the protected abstract method of
* java.security.MessageDigestSpi.
* @return the digest length in bytes.
*/
public int engineGetDigestLength() {
return HASH_LENGTH;
}
/**
* Reset then initialize the digest context.
*
* Overrides the protected abstract method of
* <code>java.security.MessageDigestSpi</code>.
*/
public void engineReset() {
int i = 60;
do {
pad[i ] = (byte)0x00;
pad[i + 1] = (byte)0x00;
pad[i + 2] = (byte)0x00;
pad[i + 3] = (byte)0x00;
} while ((i -= 4) >= 0);
padding = 0;
bytes = 0;
init();
}
/**
* Initialize the digest context.
*/
protected void init() {
hA = 0x0123456789abcdefL;
hB = 0xfedcba9876543210L;
hC = 0xf096a5b4c3b2e187L;
}
/**
* Updates the digest using the specified byte.
* Requires internal buffering, and may be slow.
*
* Overrides the protected abstract method of
* java.security.MessageDigestSpi.
* @param input the byte to use for the update.
*/
public void engineUpdate(byte input) {
bytes++;
if (padding < 63) {
pad[padding++] = input;
return;
}
pad[63] = input;
computeBlock(pad, 0);
padding = 0;
}
/**
* Updates the digest using the specified array of bytes,
* starting at the specified offset.
*
* Input length can be any size. May require internal buffering,
* if input blocks are not multiple of 64 bytes.
*
* Overrides the protected abstract method of
* java.security.MessageDigestSpi.
* @param input the array of bytes to use for the update.
* @param offset the offset to start from in the array of bytes.
* @param length the number of bytes to use, starting at offset.
*/
public void engineUpdate(byte[] input, int offset, int len) {
if (offset >= 0 && len >= 0 && offset + len <= input.length) {
bytes += len;
/* Terminate the previous block. */
int padlen = 64 - padding;
if (padding > 0 && len >= padlen) {
System.arraycopy(input, offset, pad, padding, padlen);
computeBlock(pad, 0);
padding = 0;
offset += padlen;
len -= padlen;
}
/* Loop on large sets of complete blocks. */
while (len >= 512) {
computeBlock(input, offset);
computeBlock(input, offset + 64);
computeBlock(input, offset + 128);
computeBlock(input, offset + 192);
computeBlock(input, offset + 256);
computeBlock(input, offset + 320);
computeBlock(input, offset + 384);
computeBlock(input, offset + 448);
offset += 512;
len -= 512;
}
/* Loop on remaining complete blocks. */
while (len >= 64) {
computeBlock(input, offset);
offset += 64;
len -= 64;
}
/* remaining bytes kept for next block. */
if (len > 0) {
System.arraycopy(input, offset, pad, padding, len);
padding += len;
}
return;
}
throw new ArrayIndexOutOfBoundsException(offset);
}
/**
* Completes the hash computation by performing final operations
* such as padding. Computes the final hash and returns the final
* value as a byte[24] array. Once engineDigest has been called,
* the engine will be automatically reset as specified in the
* JavaSecurity MessageDigest specification.
*
* For faster operations with multiple digests, allocate your own
* array and use engineDigest(byte[], int offset, int len).
* * Overrides the protected abstract method of
* java.security.MessageDigestSpi.
* @return the length of the digest stored in the output buffer.
*/
public byte[] engineDigest() {
try {
final byte hashvalue[] = new byte[HASH_LENGTH];
engineDigest(hashvalue, 0, HASH_LENGTH);
return hashvalue;
} catch (DigestException e) {
return null;
}
}
/**
* Completes the hash computation by performing final operations
* such as padding. Once engineDigest has been called, the engine
* will be automatically reset (see engineReset).
*
* Overrides the protected abstract method of
* java.security.MessageDigestSpi.
* @param hashvalue the output buffer in which to store the digest.
* @param offset offset to start from in the output buffer
* @param len number of bytes within buf allotted for the digest.
* Both this default implementation and the SUN provider
* do not return partial digests. The presence of this
* parameter is solely for consistency in our API's.
* If the value of this parameter is less than the
* actual digest length, the method will throw a
* DigestException. This parameter is ignored if its
* value is greater than or equal to the actual digest
* length.
* @return the length of the digest stored in the output buffer.
*/
public int engineDigest(byte[] hashvalue, int offset, int len)
throws DigestException {
if (len >= HASH_LENGTH) {
if (hashvalue.length - offset >= HASH_LENGTH) {
/* Flush the trailing bytes, adding padding bytes into last
* blocks. */
int i;
/* Add padding null bytes but replace the last 8 padding bytes
* by the little-endian 64-bit digested message bit-length. */
pad[i = padding] = (byte)0x01; /* required 1st padding byte */
/* Check if 8 bytes available in pad to store the total
* message size */
switch (i) { /* INVARIANT: i must be in [0..63] */
case 52: pad[53] = (byte)0x00; /* no break; falls thru */
case 53: pad[54] = (byte)0x00; /* no break; falls thru */
case 54: pad[55] = (byte)0x00; /* no break; falls thru */
case 55: break;
case 56: pad[57] = (byte)0x00; /* no break; falls thru */
case 57: pad[58] = (byte)0x00; /* no break; falls thru */
case 58: pad[59] = (byte)0x00; /* no break; falls thru */
case 59: pad[60] = (byte)0x00; /* no break; falls thru */
case 60: pad[61] = (byte)0x00; /* no break; falls thru */
case 61: pad[62] = (byte)0x00; /* no break; falls thru */
case 62: pad[63] = (byte)0x00; /* no break; falls thru */
case 63:
computeBlock(pad, 0);
/* Clear the 56 first bytes of pad[]. */
i = 52;
do {
pad[i ] = (byte)0x00;
pad[i + 1] = (byte)0x00;
pad[i + 2] = (byte)0x00;
pad[i + 3] = (byte)0x00;
} while ((i -= 4) >= 0);
break;
default:
/* Clear the rest of 56 first bytes of pad[]. */
switch (i & 3) {
case 3: i++;
break;
case 2: pad[(i += 2) - 1] = (byte)0x00;
break;
case 1: pad[(i += 3) - 2] = (byte)0x00;
pad[ i - 1] = (byte)0x00;
break;
case 0: pad[(i += 4) - 3] = (byte)0x00;
pad[ i - 2] = (byte)0x00;
pad[ i - 1] = (byte)0x00;
}
do {
pad[i ] = (byte)0x00;
pad[i + 1] = (byte)0x00;
pad[i + 2] = (byte)0x00;
pad[i + 3] = (byte)0x00;
} while ((i += 4) < 56);
}
/* Convert the message size from bytes to little-endian bits. */
pad[56] = (byte)(i = (int)bytes << 3);
pad[57] = (byte)(i >>> 8);
pad[58] = (byte)(i >>> 16);
pad[59] = (byte)(i >>> 24);
pad[60] = (byte)(i = (int)(bytes >>> 29));
pad[61] = (byte)(i >>> 8);
pad[62] = (byte)(i >>> 16);
pad[63] = (byte)(i >>> 24);
computeBlock(pad, 0);
/* Return the computed digest in little-endian byte order. */
hashvalue[offset ] = (byte)(i = (int) hA);
hashvalue[offset + 1] = (byte)(i >>> 8);
hashvalue[offset + 2] = (byte)(i >>> 16);
hashvalue[offset + 3] = (byte)(i >>> 24);
hashvalue[offset + 4] = (byte)(i = (int)(hA >>> 32));
hashvalue[offset += 5] = (byte)(i >>> 8);
hashvalue[offset + 1] = (byte)(i >>> 16);
hashvalue[offset + 2] = (byte)(i >>> 24);
hashvalue[offset + 3] = (byte)(i = (int) hB);
hashvalue[offset + 4] = (byte)(i >>> 8);
hashvalue[offset += 5] = (byte)(i >>> 16);
hashvalue[offset + 1] = (byte)(i >>> 24);
hashvalue[offset + 2] = (byte)(i = (int)(hB >>> 32));
hashvalue[offset + 3] = (byte)(i >>> 8);
hashvalue[offset + 4] = (byte)(i >>> 16);
hashvalue[offset += 5] = (byte)(i >>> 24);
hashvalue[offset + 1] = (byte)(i = (int) hC);
hashvalue[offset + 2] = (byte)(i >>> 8);
hashvalue[offset + 3] = (byte)(i >>> 16);
hashvalue[offset + 4] = (byte)(i >>> 24);
hashvalue[offset += 5] = (byte)(i = (int)(hC >>> 32));
hashvalue[offset + 1] = (byte)(i >>> 8);
hashvalue[offset + 2] = (byte)(i >>> 16);
hashvalue[offset + 3] = (byte)(i >>> 24);
engineReset(); /* clear the evidence */
return HASH_LENGTH;
}
throw new DigestException(
"insufficient space in output buffer to store the digest");
}
throw new DigestException("partial digests not returned");
}
/**
* Updates the digest using the specified array of bytes,
* starting at the specified offset, but an implied length
* of exactly 64 bytes.
*
* Requires no internal buffering, but assumes a fixed input size,
* in which the required padding bytes may have been added.
*
* @param input the array of bytes to use for the update.
* @param offset the offset to start from in the array of bytes.
*/
private void computeBlock(final byte[] input, int offset) {
/* Local temporary work variables for intermediate digests. */
int lo, hi;
long a, b, c;
/* Cache the input block into the local working set of 64-bit
* values, in little-endian byte order. Be careful when
* widening bytes or integers due to sign extension! */
long w0, w1, w2, w3, w4, w5, w6, w7;
/* First pass on little endian input, with multiplier equal to 5. */
c = hC
^ (w0 = ((long)( (input[offset ] & 0xff)
| ((input[offset + 1] & 0xff) << 8)
| ((input[offset + 2] & 0xff) << 16)
| ( input[offset + 3] << 24)) & 0xffffffffL)
| ((long)( (input[offset + 4] & 0xff)
| ((input[offset += 5] & 0xff) << 8)
| ((input[offset + 1] & 0xff) << 16)
| ( input[offset + 2] << 24)) << 32));
a = ( hA
- (S0[(lo=(int) c ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(c>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w1 = ((long)( (input[offset + 3] & 0xff)
| ((input[offset + 4] & 0xff) << 8)
| ((input[offset += 5] & 0xff) << 16)
| ( input[offset + 1] << 24)) & 0xffffffffL)
| ((long)( (input[offset + 2] & 0xff)
| ((input[offset + 3] & 0xff) << 8)
| ((input[offset + 4] & 0xff) << 16)
| ( input[offset += 5] << 24)) << 32));
b = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + hB) * 5
- (S0[(lo=(int) a ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(a>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w2 = ((long)( (input[offset + 1] & 0xff)
| ((input[offset + 2] & 0xff) << 8)
| ((input[offset + 3] & 0xff) << 16)
| ( input[offset + 4] << 24)) & 0xffffffffL)
| ((long)( (input[offset += 5] & 0xff)
| ((input[offset + 1] & 0xff) << 8)
| ((input[offset + 2] & 0xff) << 16)
| ( input[offset + 3] << 24)) << 32));
c = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + c) * 5
- (S0[(lo=(int) b ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(b>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w3 = ((long)( (input[offset + 4] & 0xff)
| ((input[offset += 5] & 0xff) << 8)
| ((input[offset + 1] & 0xff) << 16)
| ( input[offset + 2] << 24)) & 0xffffffffL)
| ((long)( (input[offset + 3] & 0xff)
| ((input[offset + 4] & 0xff) << 8)
| ((input[offset += 5] & 0xff) << 16)
| ( input[offset + 1] << 24)) << 32));
a = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + a) * 5
- (S0[(lo=(int) c ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(c>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w4 = ((long)( (input[offset + 2] & 0xff)
| ((input[offset + 3] & 0xff) << 8)
| ((input[offset + 4] & 0xff) << 16)
| ( input[offset += 5] << 24)) & 0xffffffffL)
| ((long)( (input[offset + 1] & 0xff)
| ((input[offset + 2] & 0xff) << 8)
| ((input[offset + 3] & 0xff) << 16)
| ( input[offset + 4] << 24)) << 32));
b = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + b) * 5
- (S0[(lo=(int) a ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(a>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w5 = ((long)( (input[offset += 5] & 0xff)
| ((input[offset + 1] & 0xff) << 8)
| ((input[offset + 2] & 0xff) << 16)
| ( input[offset + 3] << 24)) & 0xffffffffL)
| ((long)( (input[offset + 4] & 0xff)
| ((input[offset += 5] & 0xff) << 8)
| ((input[offset + 1] & 0xff) << 16)
| ( input[offset + 2] << 24)) << 32));
c = (((S3[(lo>>> 8 ) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8 ) & 0xff] ^ S0[ hi>>>24 ]) + c) * 5
- (S0[(lo=(int) b ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(b>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w6 = ((long)( (input[offset + 3] & 0xff)
| ((input[offset + 4] & 0xff) << 8)
| ((input[offset += 5] & 0xff) << 16)
| ( input[offset + 1] << 24)) & 0xffffffffL)
| ((long)( (input[offset + 2] & 0xff)
| ((input[offset + 3] & 0xff) << 8)
| ((input[offset + 4] & 0xff) << 16)
| ( input[offset += 5] << 24)) << 32));
a = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + a) * 5
- (S0[(lo=(int) c ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(c>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w7 = ((long)( (input[offset + 1] & 0xff)
| ((input[offset + 2] & 0xff) << 8)
| ((input[offset + 3] & 0xff) << 16)
| ( input[offset + 4] << 24)) & 0xffffffffL)
| ((long)( (input[offset += 5] & 0xff)
| ((input[offset + 1] & 0xff) << 8)
| ((input[offset + 2] & 0xff) << 16)
| ( input[offset + 3] << 24)) << 32));
b = ((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + b) * 5
- (S0[(lo=(int) a ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(a>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]);
c = ((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + c) * 5;
/* Start scheduling the current input set before next pass. */
w7 ^= w6 -= (w5 += w4 ^= w3 -= (w2 += w1 ^= w0 -= w7
^ 0xa5a5a5a5a5a5a5a5L
) ^ ((~w1) << 19)
) ^ ((~w4) >>> 23);
/* Second pass on scheduled input, with multiplier equal to 7. */
c = ( c
- (S0[(lo=(int)(b ^= w0 += w7)) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(b>>>32) ) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w1 -= (w0) ^ ((~w7) << 19));
a = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + a) * 7
- (S0[(lo=(int) c ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(c>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w2 ^= w1);
b = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + b) * 7
- (S0[(lo=(int) a ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(a>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w3 += w2);
c = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + c) * 7
- (S0[(lo=(int) b ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(b>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w4 -= w3 ^ ((~w2) >>> 23));
a = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + a) * 7
- (S0[(lo=(int) c ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(c>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w5 ^= w4);
b = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + b) * 7
- (S0[(lo=(int) a ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(a>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w6 += w5);
c = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + c) * 7
- (S0[(lo=(int) b ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(b>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w7 -= w6 ^ 0x0123456789abcdefL);
a = ((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + a) * 7
- (S0[(lo=(int) c ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(c>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]);
b = ((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + b) * 7;
/* Start scheduling the current input set before next pass. */
w7 ^= w6 -= (w5 += w4 ^= w3 -= (w2 += w1 ^= w0 -= w7
^ 0xa5a5a5a5a5a5a5a5L
) ^ ((~w1) << 19)
) ^ ((~w4) >>> 23);
/* Third pass on scheduled input, with multiplier equal to 9.
* The standard Tiger algorithm currently perform only
* one pass of this type with this schedule. */
b = ( b
- (S0[(lo=(int)(a ^= w0 += w7)) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(a>>>32) ) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w1 -= w0 ^ ((~w7) << 19));
c = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + c) * 9
- (S0[(lo=(int) b ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(b>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w2 ^= w1);
a = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + a) * 9
- (S0[(lo=(int) c ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(c>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w3 += w2);
b = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + b) * 9
- (S0[(lo=(int) a ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(a>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w4 -= w3 ^ ((~w2) >>> 23));
c = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + c) * 9
- (S0[(lo=(int) b ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(b>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w5 ^= w4);
a = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + a) * 9
- (S0[(lo=(int) c ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(c>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w6 += w5);
hB = (
b = (((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + b) * 9
- (S0[(lo=(int) a ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(a>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]))
^ (w7 - (w6 ^ 0x0123456789abcdefL))
) - hB;
hC +=((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + c) * 9
- (S0[(lo=(int) b ) & 0xff] ^ S1[(lo>>>16) & 0xff] ^
S2[(hi=(int)(b>>>32)) & 0xff] ^ S3[(hi>>>16) & 0xff]);
hA ^=((S3[(lo>>> 8) & 0xff] ^ S2[ lo>>>24 ] ^
S1[(hi>>> 8) & 0xff] ^ S0[ hi>>>24 ]) + a) * 9;
}
/**
* Precomputed constant Tiger "S-Boxes" in 64-bit format.
* Each of these four table have 256 elements.
*/
private static final long[] S0 = {
/* 0 */ 0x02aab17cf7e90c5eL, /* 1 */ 0xac424b03e243a8ecL,
/* 2 */ 0x72cd5be30dd5fcd3L, /* 3 */ 0x6d019b93f6f97f3aL,
/* 4 */ 0xcd9978ffd21f9193L, /* 5 */ 0x7573a1c9708029e2L,
/* 6 */ 0xb164326b922a83c3L, /* 7 */ 0x46883eee04915870L,
/* 8 */ 0xeaace3057103ece6L, /* 9 */ 0xc54169b808a3535cL,
/* 10 */ 0x4ce754918ddec47cL, /* 11 */ 0x0aa2f4dfdc0df40cL,
/* 12 */ 0x10b76f18a74dbefaL, /* 13 */ 0xc6ccb6235ad1ab6aL,
/* 14 */ 0x13726121572fe2ffL, /* 15 */ 0x1a488c6f199d921eL,
/* 16 */ 0x4bc9f9f4da0007caL, /* 17 */ 0x26f5e6f6e85241c7L,
/* 18 */ 0x859079dbea5947b6L, /* 19 */ 0x4f1885c5c99e8c92L,
/* 20 */ 0xd78e761ea96f864bL, /* 21 */ 0x8e36428c52b5c17dL,
/* 22 */ 0x69cf6827373063c1L, /* 23 */ 0xb607c93d9bb4c56eL,
/* 24 */ 0x7d820e760e76b5eaL, /* 25 */ 0x645c9cc6f07fdc42L,
/* 26 */ 0xbf38a078243342e0L, /* 27 */ 0x5f6b343c9d2e7d04L,
/* 28 */ 0xf2c28aeb600b0ec6L, /* 29 */ 0x6c0ed85f7254bcacL,
/* 30 */ 0x71592281a4db4fe5L, /* 31 */ 0x1967fa69ce0fed9fL,
/* 32 */ 0xfd5293f8b96545dbL, /* 33 */ 0xc879e9d7f2a7600bL,
/* 34 */ 0x860248920193194eL, /* 35 */ 0xa4f9533b2d9cc0b3L,
/* 36 */ 0x9053836c15957613L, /* 37 */ 0xdb6dcf8afc357bf1L,
/* 38 */ 0x18beea7a7a370f57L, /* 39 */ 0x037117ca50b99066L,
/* 40 */ 0x6ab30a9774424a35L, /* 41 */ 0xf4e92f02e325249bL,
/* 42 */ 0x7739db07061ccae1L, /* 43 */ 0xd8f3b49ceca42a05L,
/* 44 */ 0xbd56be3f51382f73L, /* 45 */ 0x45faed5843b0bb28L,
/* 46 */ 0x1c813d5c11bf1f83L, /* 47 */ 0x8af0e4b6d75fa169L,
/* 48 */ 0x33ee18a487ad9999L, /* 49 */ 0x3c26e8eab1c94410L,
/* 50 */ 0xb510102bc0a822f9L, /* 51 */ 0x141eef310ce6123bL,
/* 52 */ 0xfc65b90059ddb154L, /* 53 */ 0xe0158640c5e0e607L,
/* 54 */ 0x884e079826c3a3cfL, /* 55 */ 0x930d0d9523c535fdL,
/* 56 */ 0x35638d754e9a2b00L, /* 57 */ 0x4085fccf40469dd5L,
/* 58 */ 0xc4b17ad28be23a4cL, /* 59 */ 0xcab2f0fc6a3e6a2eL,
/* 60 */ 0x2860971a6b943fcdL, /* 61 */ 0x3dde6ee212e30446L,
/* 62 */ 0x6222f32ae01765aeL, /* 63 */ 0x5d550bb5478308feL,
/* 64 */ 0xa9efa98da0eda22aL, /* 65 */ 0xc351a71686c40da7L,
/* 66 */ 0x1105586d9c867c84L, /* 67 */ 0xdcffee85fda22853L,
/* 68 */ 0xccfbd0262c5eef76L, /* 69 */ 0xbaf294cb8990d201L,
/* 70 */ 0xe69464f52afad975L, /* 71 */ 0x94b013afdf133e14L,
/* 72 */ 0x06a7d1a32823c958L, /* 73 */ 0x6f95fe5130f61119L,
/* 74 */ 0xd92ab34e462c06c0L, /* 75 */ 0xed7bde33887c71d2L,
/* 76 */ 0x79746d6e6518393eL, /* 77 */ 0x5ba419385d713329L,
/* 78 */ 0x7c1ba6b948a97564L, /* 79 */ 0x31987c197bfdac67L,
/* 80 */ 0xde6c23c44b053d02L, /* 81 */ 0x581c49fed002d64dL,
/* 82 */ 0xdd474d6338261571L, /* 83 */ 0xaa4546c3e473d062L,
/* 84 */ 0x928fce349455f860L, /* 85 */ 0x48161bbacaab94d9L,
/* 86 */ 0x63912430770e6f68L, /* 87 */ 0x6ec8a5e602c6641cL,
/* 88 */ 0x87282515337ddd2bL, /* 89 */ 0x2cda6b42034b701bL,
/* 90 */ 0xb03d37c181cb096dL, /* 91 */ 0xe108438266c71c6fL,
/* 92 */ 0x2b3180c7eb51b255L, /* 93 */ 0xdf92b82f96c08bbcL,
/* 94 */ 0x5c68c8c0a632f3baL, /* 95 */ 0x5504cc861c3d0556L,
/* 96 */ 0xabbfa4e55fb26b8fL, /* 97 */ 0x41848b0ab3baceb4L,
/* 98 */ 0xb334a273aa445d32L, /* 99 */ 0xbca696f0a85ad881L,
/* 100 */ 0x24f6ec65b528d56cL, /* 101 */ 0x0ce1512e90f4524aL,
/* 102 */ 0x4e9dd79d5506d35aL, /* 103 */ 0x258905fac6ce9779L,
/* 104 */ 0x2019295b3e109b33L, /* 105 */ 0xf8a9478b73a054ccL,
/* 106 */ 0x2924f2f934417eb0L, /* 107 */ 0x3993357d536d1bc4L,
/* 108 */ 0x38a81ac21db6ff8bL, /* 109 */ 0x47c4fbf17d6016bfL,
/* 110 */ 0x1e0faadd7667e3f5L, /* 111 */ 0x7abcff62938beb96L,
/* 112 */ 0xa78dad948fc179c9L, /* 113 */ 0x8f1f98b72911e50dL,
/* 114 */ 0x61e48eae27121a91L, /* 115 */ 0x4d62f7ad31859808L,
/* 116 */ 0xeceba345ef5ceaebL, /* 117 */ 0xf5ceb25ebc9684ceL,
/* 118 */ 0xf633e20cb7f76221L, /* 119 */ 0xa32cdf06ab8293e4L,
/* 120 */ 0x985a202ca5ee2ca4L, /* 121 */ 0xcf0b8447cc8a8fb1L,
/* 122 */ 0x9f765244979859a3L, /* 123 */ 0xa8d516b1a1240017L,
/* 124 */ 0x0bd7ba3ebb5dc726L, /* 125 */ 0xe54bca55b86adb39L,
/* 126 */ 0x1d7a3afd6c478063L, /* 127 */ 0x519ec608e7669eddL,
/* 128 */ 0x0e5715a2d149aa23L, /* 129 */ 0x177d4571848ff194L,
/* 130 */ 0xeeb55f3241014c22L, /* 131 */ 0x0f5e5ca13a6e2ec2L,
/* 132 */ 0x8029927b75f5c361L, /* 133 */ 0xad139fabc3d6e436L,
/* 134 */ 0x0d5df1a94ccf402fL, /* 135 */ 0x3e8bd948bea5dfc8L,
/* 136 */ 0xa5a0d357bd3ff77eL, /* 137 */ 0xa2d12e251f74f645L,
/* 138 */ 0x66fd9e525e81a082L, /* 139 */ 0x2e0c90ce7f687a49L,
/* 140 */ 0xc2e8bcbeba973bc5L, /* 141 */ 0x000001bce509745fL,
/* 142 */ 0x423777bbe6dab3d6L, /* 143 */ 0xd1661c7eaef06eb5L,
/* 144 */ 0xa1781f354daacfd8L, /* 145 */ 0x2d11284a2b16affcL,
/* 146 */ 0xf1fc4f67fa891d1fL, /* 147 */ 0x73ecc25dcb920adaL,
/* 148 */ 0xae610c22c2a12651L, /* 149 */ 0x96e0a810d356b78aL,
/* 150 */ 0x5a9a381f2fe7870fL, /* 151 */ 0xd5ad62ede94e5530L,
/* 152 */ 0xd225e5e8368d1427L, /* 153 */ 0x65977b70c7af4631L,
/* 154 */ 0x99f889b2de39d74fL, /* 155 */ 0x233f30bf54e1d143L,
/* 156 */ 0x9a9675d3d9a63c97L, /* 157 */ 0x5470554ff334f9a8L,
/* 158 */ 0x166acb744a4f5688L, /* 159 */ 0x70c74caab2e4aeadL,
/* 160 */ 0xf0d091646f294d12L, /* 161 */ 0x57b82a89684031d1L,
/* 162 */ 0xefd95a5a61be0b6bL, /* 163 */ 0x2fbd12e969f2f29aL,
/* 164 */ 0x9bd37013feff9fe8L, /* 165 */ 0x3f9b0404d6085a06L,
/* 166 */ 0x4940c1f3166cfe15L, /* 167 */ 0x09542c4dcdf3defbL,
/* 168 */ 0xb4c5218385cd5ce3L, /* 169 */ 0xc935b7dc4462a641L,
/* 170 */ 0x3417f8a68ed3b63fL, /* 171 */ 0xb80959295b215b40L,
/* 172 */ 0xf99cdaef3b8c8572L, /* 173 */ 0x018c0614f8fcb95dL,
/* 174 */ 0x1b14accd1a3acdf3L, /* 175 */ 0x84d471f200bb732dL,
/* 176 */ 0xc1a3110e95e8da16L, /* 177 */ 0x430a7220bf1a82b8L,
/* 178 */ 0xb77e090d39df210eL, /* 179 */ 0x5ef4bd9f3cd05e9dL,
/* 180 */ 0x9d4ff6da7e57a444L, /* 181 */ 0xda1d60e183d4a5f8L,
/* 182 */ 0xb287c38417998e47L, /* 183 */ 0xfe3edc121bb31886L,
/* 184 */ 0xc7fe3ccc980ccbefL, /* 185 */ 0xe46fb590189bfd03L,
/* 186 */ 0x3732fd469a4c57dcL, /* 187 */ 0x7ef700a07cf1ad65L,
/* 188 */ 0x59c64468a31d8859L, /* 189 */ 0x762fb0b4d45b61f6L,
/* 190 */ 0x155baed099047718L, /* 191 */ 0x68755e4c3d50baa6L,
/* 192 */ 0xe9214e7f22d8b4dfL, /* 193 */ 0x2addbf532eac95f4L,
/* 194 */ 0x32ae3909b4bd0109L, /* 195 */ 0x834df537b08e3450L,
/* 196 */ 0xfa209da84220728dL, /* 197 */ 0x9e691d9b9efe23f7L,
/* 198 */ 0x0446d288c4ae8d7fL, /* 199 */ 0x7b4cc524e169785bL,
/* 200 */ 0x21d87f0135ca1385L, /* 201 */ 0xcebb400f137b8aa5L,
/* 202 */ 0x272e2b66580796beL, /* 203 */ 0x3612264125c2b0deL,
/* 204 */ 0x057702bdad1efbb2L, /* 205 */ 0xd4babb8eacf84be9L,
/* 206 */ 0x91583139641bc67bL, /* 207 */ 0x8bdc2de08036e024L,
/* 208 */ 0x603c8156f49f68edL, /* 209 */ 0xf7d236f7dbef5111L,
/* 210 */ 0x9727c4598ad21e80L, /* 211 */ 0xa08a0896670a5fd7L,
/* 212 */ 0xcb4a8f4309eba9cbL, /* 213 */ 0x81af564b0f7036a1L,
/* 214 */ 0xc0b99aa778199abdL, /* 215 */ 0x959f1ec83fc8e952L,
/* 216 */ 0x8c505077794a81b9L, /* 217 */ 0x3acaaf8f056338f0L,
/* 218 */ 0x07b43f50627a6778L, /* 219 */ 0x4a44ab49f5eccc77L,
/* 220 */ 0x3bc3d6e4b679ee98L, /* 221 */ 0x9cc0d4d1cf14108cL,
/* 222 */ 0x4406c00b206bc8a0L, /* 223 */ 0x82a18854c8d72d89L,
/* 224 */ 0x67e366b35c3c432cL, /* 225 */ 0xb923dd61102b37f2L,
/* 226 */ 0x56ab2779d884271dL, /* 227 */ 0xbe83e1b0ff1525afL,
/* 228 */ 0xfb7c65d4217e49a9L, /* 229 */ 0x6bdbe0e76d48e7d4L,
/* 230 */ 0x08df828745d9179eL, /* 231 */ 0x22ea6a9add53bd34L,
/* 232 */ 0xe36e141c5622200aL, /* 233 */ 0x7f805d1b8cb750eeL,
/* 234 */ 0xafe5c7a59f58e837L, /* 235 */ 0xe27f996a4fb1c23cL,
/* 236 */ 0xd3867dfb0775f0d0L, /* 237 */ 0xd0e673de6e88891aL,
/* 238 */ 0x123aeb9eafb86c25L, /* 239 */ 0x30f1d5d5c145b895L,
/* 240 */ 0xbb434a2dee7269e7L, /* 241 */ 0x78cb67ecf931fa38L,
/* 242 */ 0xf33b0372323bbf9cL, /* 243 */ 0x52d66336fb279c74L,
/* 244 */ 0x505f33ac0afb4eaaL, /* 245 */ 0xe8a5cd99a2cce187L,
/* 246 */ 0x534974801e2d30bbL, /* 247 */ 0x8d2d5711d5876d90L,
/* 248 */ 0x1f1a412891bc038eL, /* 249 */ 0xd6e2e71d82e56648L,
/* 250 */ 0x74036c3a497732b7L, /* 251 */ 0x89b67ed96361f5abL,
/* 252 */ 0xffed95d8f1ea02a2L, /* 253 */ 0xe72b3bd61464d43dL,
/* 254 */ 0xa6300f170bdc4820L, /* 255 */ 0xebc18760ed78a77aL};
private static final long[] S1 = {
/* 256 */ 0xe6a6be5a05a12138L, /* 257 */ 0xb5a122a5b4f87c98L,
/* 258 */ 0x563c6089140b6990L, /* 259 */ 0x4c46cb2e391f5dd5L,
/* 260 */ 0xd932addbc9b79434L, /* 261 */ 0x08ea70e42015aff5L,
/* 262 */ 0xd765a6673e478cf1L, /* 263 */ 0xc4fb757eab278d99L,
/* 264 */ 0xdf11c6862d6e0692L, /* 265 */ 0xddeb84f10d7f3b16L,
/* 266 */ 0x6f2ef604a665ea04L, /* 267 */ 0x4a8e0f0ff0e0dfb3L,
/* 268 */ 0xa5edeef83dbcba51L, /* 269 */ 0xfc4f0a2a0ea4371eL,
/* 270 */ 0xe83e1da85cb38429L, /* 271 */ 0xdc8ff882ba1b1ce2L,
/* 272 */ 0xcd45505e8353e80dL, /* 273 */ 0x18d19a00d4db0717L,
/* 274 */ 0x34a0cfeda5f38101L, /* 275 */ 0x0be77e518887caf2L,
/* 276 */ 0x1e341438b3c45136L, /* 277 */ 0xe05797f49089ccf9L,
/* 278 */ 0xffd23f9df2591d14L, /* 279 */ 0x543dda228595c5cdL,
/* 280 */ 0x661f81fd99052a33L, /* 281 */ 0x8736e641db0f7b76L,
/* 282 */ 0x15227725418e5307L, /* 283 */ 0xe25f7f46162eb2faL,
/* 284 */ 0x48a8b2126c13d9feL, /* 285 */ 0xafdc541792e76eeaL,
/* 286 */ 0x03d912bfc6d1898fL, /* 287 */ 0x31b1aafa1b83f51bL,
/* 288 */ 0xf1ac2796e42ab7d9L, /* 289 */ 0x40a3a7d7fcd2ebacL,
/* 290 */ 0x1056136d0afbbcc5L, /* 291 */ 0x7889e1dd9a6d0c85L,
/* 292 */ 0xd33525782a7974aaL, /* 293 */ 0xa7e25d09078ac09bL,
/* 294 */ 0xbd4138b3eac6edd0L, /* 295 */ 0x920abfbe71eb9e70L,
/* 296 */ 0xa2a5d0f54fc2625cL, /* 297 */ 0xc054e36b0b1290a3L,
/* 298 */ 0xf6dd59ff62fe932bL, /* 299 */ 0x3537354511a8ac7dL,
/* 300 */ 0xca845e9172fadcd4L, /* 301 */ 0x84f82b60329d20dcL,
/* 302 */ 0x79c62ce1cd672f18L, /* 303 */ 0x8b09a2add124642cL,
/* 304 */ 0xd0c1e96a19d9e726L, /* 305 */ 0x5a786a9b4ba9500cL,
/* 306 */ 0x0e020336634c43f3L, /* 307 */ 0xc17b474aeb66d822L,
/* 308 */ 0x6a731ae3ec9baac2L, /* 309 */ 0x8226667ae0840258L,
/* 310 */ 0x67d4567691caeca5L, /* 311 */ 0x1d94155c4875adb5L,
/* 312 */ 0x6d00fd985b813fdfL, /* 313 */ 0x51286efcb774cd06L,
/* 314 */ 0x5e8834471fa744afL, /* 315 */ 0xf72ca0aee761ae2eL,
/* 316 */ 0xbe40e4cdaee8e09aL, /* 317 */ 0xe9970bbb5118f665L,
/* 318 */ 0x726e4beb33df1964L, /* 319 */ 0x703b000729199762L,
/* 320 */ 0x4631d816f5ef30a7L, /* 321 */ 0xb880b5b51504a6beL,
/* 322 */ 0x641793c37ed84b6cL, /* 323 */ 0x7b21ed77f6e97d96L,
/* 324 */ 0x776306312ef96b73L, /* 325 */ 0xae528948e86ff3f4L,
/* 326 */ 0x53dbd7f286a3f8f8L, /* 327 */ 0x16cadce74cfc1063L,
/* 328 */ 0x005c19bdfa52c6ddL, /* 329 */ 0x68868f5d64d46ad3L,
/* 330 */ 0x3a9d512ccf1e186aL, /* 331 */ 0x367e62c2385660aeL,
/* 332 */ 0xe359e7ea77dcb1d7L, /* 333 */ 0x526c0773749abe6eL,
/* 334 */ 0x735ae5f9d09f734bL, /* 335 */ 0x493fc7cc8a558ba8L,
/* 336 */ 0xb0b9c1533041ab45L, /* 337 */ 0x321958ba470a59bdL,
/* 338 */ 0x852db00b5f46c393L, /* 339 */ 0x91209b2bd336b0e5L,
/* 340 */ 0x6e604f7d659ef19fL, /* 341 */ 0xb99a8ae2782ccb24L,
/* 342 */ 0xccf52ab6c814c4c7L, /* 343 */ 0x4727d9afbe11727bL,
/* 344 */ 0x7e950d0c0121b34dL, /* 345 */ 0x756f435670ad471fL,
/* 346 */ 0xf5add442615a6849L, /* 347 */ 0x4e87e09980b9957aL,
/* 348 */ 0x2acfa1df50aee355L, /* 349 */ 0xd898263afd2fd556L,
/* 350 */ 0xc8f4924dd80c8fd6L, /* 351 */ 0xcf99ca3d754a173aL,
/* 352 */ 0xfe477bacaf91bf3cL, /* 353 */ 0xed5371f6d690c12dL,
/* 354 */ 0x831a5c285e687094L, /* 355 */ 0xc5d3c90a3708a0a4L,
/* 356 */ 0x0f7f903717d06580L, /* 357 */ 0x19f9bb13b8fdf27fL,
/* 358 */ 0xb1bd6f1b4d502843L, /* 359 */ 0x1c761ba38fff4012L,
/* 360 */ 0x0d1530c4e2e21f3bL, /* 361 */ 0x8943ce69a7372c8aL,
/* 362 */ 0xe5184e11feb5ce66L, /* 363 */ 0x618bdb80bd736621L,
/* 364 */ 0x7d29bad68b574d0bL, /* 365 */ 0x81bb613e25e6fe5bL,
/* 366 */ 0x071c9c10bc07913fL, /* 367 */ 0xc7beeb7909ac2d97L,
/* 368 */ 0xc3e58d353bc5d757L, /* 369 */ 0xeb017892f38f61e8L,
/* 370 */ 0xd4effb9c9b1cc21aL, /* 371 */ 0x99727d26f494f7abL,
/* 372 */ 0xa3e063a2956b3e03L, /* 373 */ 0x9d4a8b9a4aa09c30L,
/* 374 */ 0x3f6ab7d500090fb4L, /* 375 */ 0x9cc0f2a057268ac0L,
/* 376 */ 0x3dee9d2dedbf42d1L, /* 377 */ 0x330f49c87960a972L,
/* 378 */ 0xc6b2720287421b41L, /* 379 */ 0x0ac59ec07c00369cL,
/* 380 */ 0xef4eac49cb353425L, /* 381 */ 0xf450244eef0129d8L,
/* 382 */ 0x8acc46e5caf4deb6L, /* 383 */ 0x2ffeab63989263f7L,
/* 384 */ 0x8f7cb9fe5d7a4578L, /* 385 */ 0x5bd8f7644e634635L,
/* 386 */ 0x427a7315bf2dc900L, /* 387 */ 0x17d0c4aa2125261cL,
/* 388 */ 0x3992486c93518e50L, /* 389 */ 0xb4cbfee0a2d7d4c3L,
/* 390 */ 0x7c75d6202c5ddd8dL, /* 391 */ 0xdbc295d8e35b6c61L,
/* 392 */ 0x60b369d302032b19L, /* 393 */ 0xce42685fdce44132L,
/* 394 */ 0x06f3ddb9ddf65610L, /* 395 */ 0x8ea4d21db5e148f0L,
/* 396 */ 0x20b0fce62fcd496fL, /* 397 */ 0x2c1b912358b0ee31L,
/* 398 */ 0xb28317b818f5a308L, /* 399 */ 0xa89c1e189ca6d2cfL,
/* 400 */ 0x0c6b18576aaadbc8L, /* 401 */ 0xb65deaa91299fae3L,
/* 402 */ 0xfb2b794b7f1027e7L, /* 403 */ 0x04e4317f443b5bebL,
/* 404 */ 0x4b852d325939d0a6L, /* 405 */ 0xd5ae6beefb207ffcL,
/* 406 */ 0x309682b281c7d374L, /* 407 */ 0xbae309a194c3b475L,
/* 408 */ 0x8cc3f97b13b49f05L, /* 409 */ 0x98a9422ff8293967L,
/* 410 */ 0x244b16b01076ff7cL, /* 411 */ 0xf8bf571c663d67eeL,
/* 412 */ 0x1f0d6758eee30da1L, /* 413 */ 0xc9b611d97adeb9b7L,
/* 414 */ 0xb7afd5887b6c57a2L, /* 415 */ 0x6290ae846b984fe1L,
/* 416 */ 0x94df4cdeacc1a5fdL, /* 417 */ 0x058a5bd1c5483affL,
/* 418 */ 0x63166cc142ba3c37L, /* 419 */ 0x8db8526eb2f76f40L,
/* 420 */ 0xe10880036f0d6d4eL, /* 421 */ 0x9e0523c9971d311dL,
/* 422 */ 0x45ec2824cc7cd691L, /* 423 */ 0x575b8359e62382c9L,
/* 424 */ 0xfa9e400dc4889995L, /* 425 */ 0xd1823ecb45721568L,
/* 426 */ 0xdafd983b8206082fL, /* 427 */ 0xaa7d29082386a8cbL,
/* 428 */ 0x269fcd4403b87588L, /* 429 */ 0x1b91f5f728bdd1e0L,
/* 430 */ 0xe4669f39040201f6L, /* 431 */ 0x7a1d7c218cf04adeL,
/* 432 */ 0x65623c29d79ce5ceL, /* 433 */ 0x2368449096c00bb1L,
/* 434 */ 0xab9bf1879da503baL, /* 435 */ 0xbc23ecb1a458058eL,
/* 436 */ 0x9a58df01bb401eccL, /* 437 */ 0xa070e868a85f143dL,
/* 438 */ 0x4ff188307df2239eL, /* 439 */ 0x14d565b41a641183L,
/* 440 */ 0xee13337452701602L, /* 441 */ 0x950e3dcf3f285e09L,
/* 442 */ 0x59930254b9c80953L, /* 443 */ 0x3bf299408930da6dL,
/* 444 */ 0xa955943f53691387L, /* 445 */ 0xa15edecaa9cb8784L,
/* 446 */ 0x29142127352be9a0L, /* 447 */ 0x76f0371fff4e7afbL,
/* 448 */ 0x0239f450274f2228L, /* 449 */ 0xbb073af01d5e868bL,
/* 450 */ 0xbfc80571c10e96c1L, /* 451 */ 0xd267088568222e23L,
/* 452 */ 0x9671a3d48e80b5b0L, /* 453 */ 0x55b5d38ae193bb81L,
/* 454 */ 0x693ae2d0a18b04b8L, /* 455 */ 0x5c48b4ecadd5335fL,
/* 456 */ 0xfd743b194916a1caL, /* 457 */ 0x2577018134be98c4L,
/* 458 */ 0xe77987e83c54a4adL, /* 459 */ 0x28e11014da33e1b9L,
/* 460 */ 0x270cc59e226aa213L, /* 461 */ 0x71495f756d1a5f60L,
/* 462 */ 0x9be853fb60afef77L, /* 463 */ 0xadc786a7f7443dbfL,
/* 464 */ 0x0904456173b29a82L, /* 465 */ 0x58bc7a66c232bd5eL,
/* 466 */ 0xf306558c673ac8b2L, /* 467 */ 0x41f639c6b6c9772aL,
/* 468 */ 0x216defe99fda35daL, /* 469 */ 0x11640cc71c7be615L,
/* 470 */ 0x93c43694565c5527L, /* 471 */ 0xea038e6246777839L,
/* 472 */ 0xf9abf3ce5a3e2469L, /* 473 */ 0x741e768d0fd312d2L,
/* 474 */ 0x0144b883ced652c6L, /* 475 */ 0xc20b5a5ba33f8552L,
/* 476 */ 0x1ae69633c3435a9dL, /* 477 */ 0x97a28ca4088cfdecL,
/* 478 */ 0x8824a43c1e96f420L, /* 479 */ 0x37612fa66eeea746L,
/* 480 */ 0x6b4cb165f9cf0e5aL, /* 481 */ 0x43aa1c06a0abfb4aL,
/* 482 */ 0x7f4dc26ff162796bL, /* 483 */ 0x6cbacc8e54ed9b0fL,
/* 484 */ 0xa6b7ffefd2bb253eL, /* 485 */ 0x2e25bc95b0a29d4fL,
/* 486 */ 0x86d6a58bdef1388cL, /* 487 */ 0xded74ac576b6f054L,
/* 488 */ 0x8030bdbc2b45805dL, /* 489 */ 0x3c81af70e94d9289L,
/* 490 */ 0x3eff6dda9e3100dbL, /* 491 */ 0xb38dc39fdfcc8847L,
/* 492 */ 0x123885528d17b87eL, /* 493 */ 0xf2da0ed240b1b642L,
/* 494 */ 0x44cefadcd54bf9a9L, /* 495 */ 0x1312200e433c7ee6L,
/* 496 */ 0x9ffcc84f3a78c748L, /* 497 */ 0xf0cd1f72248576bbL,
/* 498 */ 0xec6974053638cfe4L, /* 499 */ 0x2ba7b67c0cec4e4cL,
/* 500 */ 0xac2f4df3e5ce32edL, /* 501 */ 0xcb33d14326ea4c11L,
/* 502 */ 0xa4e9044cc77e58bcL, /* 503 */ 0x5f513293d934fcefL,
/* 504 */ 0x5dc9645506e55444L, /* 505 */ 0x50de418f317de40aL,
/* 506 */ 0x388cb31a69dde259L, /* 507 */ 0x2db4a83455820a86L,
/* 508 */ 0x9010a91e84711ae9L, /* 509 */ 0x4df7f0b7b1498371L,
/* 510 */ 0xd62a2eabc0977179L, /* 511 */ 0x22fac097aa8d5c0eL};
private static final long[] S2 = {
/* 512 */ 0xf49fcc2ff1daf39bL, /* 513 */ 0x487fd5c66ff29281L,
/* 514 */ 0xe8a30667fcdca83fL, /* 515 */ 0x2c9b4be3d2fcce63L,
/* 516 */ 0xda3ff74b93fbbbc2L, /* 517 */ 0x2fa165d2fe70ba66L,
/* 518 */ 0xa103e279970e93d4L, /* 519 */ 0xbecdec77b0e45e71L,
/* 520 */ 0xcfb41e723985e497L, /* 521 */ 0xb70aaa025ef75017L,
/* 522 */ 0xd42309f03840b8e0L, /* 523 */ 0x8efc1ad035898579L,
/* 524 */ 0x96c6920be2b2abc5L, /* 525 */ 0x66af4163375a9172L,
/* 526 */ 0x2174abdcca7127fbL, /* 527 */ 0xb33ccea64a72ff41L,
/* 528 */ 0xf04a4933083066a5L, /* 529 */ 0x8d970acdd7289af5L,
/* 530 */ 0x8f96e8e031c8c25eL, /* 531 */ 0xf3fec02276875d47L,
/* 532 */ 0xec7bf310056190ddL, /* 533 */ 0xf5adb0aebb0f1491L,
/* 534 */ 0x9b50f8850fd58892L, /* 535 */ 0x4975488358b74de8L,
/* 536 */ 0xa3354ff691531c61L, /* 537 */ 0x0702bbe481d2c6eeL,
/* 538 */ 0x89fb24057deded98L, /* 539 */ 0xac3075138596e902L,
/* 540 */ 0x1d2d3580172772edL, /* 541 */ 0xeb738fc28e6bc30dL,
/* 542 */ 0x5854ef8f63044326L, /* 543 */ 0x9e5c52325add3bbeL,
/* 544 */ 0x90aa53cf325c4623L, /* 545 */ 0xc1d24d51349dd067L,
/* 546 */ 0x2051cfeea69ea624L, /* 547 */ 0x13220f0a862e7e4fL,
/* 548 */ 0xce39399404e04864L, /* 549 */ 0xd9c42ca47086fcb7L,
/* 550 */ 0x685ad2238a03e7ccL, /* 551 */ 0x066484b2ab2ff1dbL,
/* 552 */ 0xfe9d5d70efbf79ecL, /* 553 */ 0x5b13b9dd9c481854L,
/* 554 */ 0x15f0d475ed1509adL, /* 555 */ 0x0bebcd060ec79851L,
/* 556 */ 0xd58c6791183ab7f8L, /* 557 */ 0xd1187c5052f3eee4L,
/* 558 */ 0xc95d1192e54e82ffL, /* 559 */ 0x86eea14cb9ac6ca2L,
/* 560 */ 0x3485beb153677d5dL, /* 561 */ 0xdd191d781f8c492aL,
/* 562 */ 0xf60866baa784ebf9L, /* 563 */ 0x518f643ba2d08c74L,
/* 564 */ 0x8852e956e1087c22L, /* 565 */ 0xa768cb8dc410ae8dL,
/* 566 */ 0x38047726bfec8e1aL, /* 567 */ 0xa67738b4cd3b45aaL,
/* 568 */ 0xad16691cec0dde19L, /* 569 */ 0xc6d4319380462e07L,
/* 570 */ 0xc5a5876d0ba61938L, /* 571 */ 0x16b9fa1fa58fd840L,
/* 572 */ 0x188ab1173ca74f18L, /* 573 */ 0xabda2f98c99c021fL,
/* 574 */ 0x3e0580ab134ae816L, /* 575 */ 0x5f3b05b773645abbL,
/* 576 */ 0x2501a2be5575f2f6L, /* 577 */ 0x1b2f74004e7e8ba9L,
/* 578 */ 0x1cd7580371e8d953L, /* 579 */ 0x7f6ed89562764e30L,
/* 580 */ 0xb15926ff596f003dL, /* 581 */ 0x9f65293da8c5d6b9L,
/* 582 */ 0x6ecef04dd690f84cL, /* 583 */ 0x4782275fff33af88L,
/* 584 */ 0xe41433083f820801L, /* 585 */ 0xfd0dfe409a1af9b5L,
/* 586 */ 0x4325a3342cdb396bL, /* 587 */ 0x8ae77e62b301b252L,
/* 588 */ 0xc36f9e9f6655615aL, /* 589 */ 0x85455a2d92d32c09L,
/* 590 */ 0xf2c7dea949477485L, /* 591 */ 0x63cfb4c133a39ebaL,
/* 592 */ 0x83b040cc6ebc5462L, /* 593 */ 0x3b9454c8fdb326b0L,
/* 594 */ 0x56f56a9e87ffd78cL, /* 595 */ 0x2dc2940d99f42bc6L,
/* 596 */ 0x98f7df096b096e2dL, /* 597 */ 0x19a6e01e3ad852bfL,
/* 598 */ 0x42a99ccbdbd4b40bL, /* 599 */ 0xa59998af45e9c559L,
/* 600 */ 0x366295e807d93186L, /* 601 */ 0x6b48181bfaa1f773L,
/* 602 */ 0x1fec57e2157a0a1dL, /* 603 */ 0x4667446af6201ad5L,
/* 604 */ 0xe615ebcacfb0f075L, /* 605 */ 0xb8f31f4f68290778L,
/* 606 */ 0x22713ed6ce22d11eL, /* 607 */ 0x3057c1a72ec3c93bL,
/* 608 */ 0xcb46acc37c3f1f2fL, /* 609 */ 0xdbb893fd02aaf50eL,
/* 610 */ 0x331fd92e600b9fcfL, /* 611 */ 0xa498f96148ea3ad6L,
/* 612 */ 0xa8d8426e8b6a83eaL, /* 613 */ 0xa089b274b7735cdcL,
/* 614 */ 0x87f6b3731e524a11L, /* 615 */ 0x118808e5cbc96749L,
/* 616 */ 0x9906e4c7b19bd394L, /* 617 */ 0xafed7f7e9b24a20cL,
/* 618 */ 0x6509eadeeb3644a7L, /* 619 */ 0x6c1ef1d3e8ef0edeL,
/* 620 */ 0xb9c97d43e9798fb4L, /* 621 */ 0xa2f2d784740c28a3L,
/* 622 */ 0x7b8496476197566fL, /* 623 */ 0x7a5be3e6b65f069dL,
/* 624 */ 0xf96330ed78be6f10L, /* 625 */ 0xeee60de77a076a15L,
/* 626 */ 0x2b4bee4aa08b9bd0L, /* 627 */ 0x6a56a63ec7b8894eL,
/* 628 */ 0x02121359ba34fef4L, /* 629 */ 0x4cbf99f8283703fcL,
/* 630 */ 0x398071350caf30c8L, /* 631 */ 0xd0a77a89f017687aL,
/* 632 */ 0xf1c1a9eb9e423569L, /* 633 */ 0x8c7976282dee8199L,
/* 634 */ 0x5d1737a5dd1f7abdL, /* 635 */ 0x4f53433c09a9fa80L,
/* 636 */ 0xfa8b0c53df7ca1d9L, /* 637 */ 0x3fd9dcbc886ccb77L,
/* 638 */ 0xc040917ca91b4720L, /* 639 */ 0x7dd00142f9d1dcdfL,
/* 640 */ 0x8476fc1d4f387b58L, /* 641 */ 0x23f8e7c5f3316503L,
/* 642 */ 0x032a2244e7e37339L, /* 643 */ 0x5c87a5d750f5a74bL,
/* 644 */ 0x082b4cc43698992eL, /* 645 */ 0xdf917becb858f63cL,
/* 646 */ 0x3270b8fc5bf86ddaL, /* 647 */ 0x10ae72bb29b5dd76L,
/* 648 */ 0x576ac94e7700362bL, /* 649 */ 0x1ad112dac61efb8fL,
/* 650 */ 0x691bc30ec5faa427L, /* 651 */ 0xff246311cc327143L,
/* 652 */ 0x3142368e30e53206L, /* 653 */ 0x71380e31e02ca396L,
/* 654 */ 0x958d5c960aad76f1L, /* 655 */ 0xf8d6f430c16da536L,
/* 656 */ 0xc8ffd13f1be7e1d2L, /* 657 */ 0x7578ae66004ddbe1L,
/* 658 */ 0x05833f01067be646L, /* 659 */ 0xbb34b5ad3bfe586dL,
/* 660 */ 0x095f34c9a12b97f0L, /* 661 */ 0x247ab64525d60ca8L,
/* 662 */ 0xdcdbc6f3017477d1L, /* 663 */ 0x4a2e14d4decad24dL,
/* 664 */ 0xbdb5e6d9be0a1eebL, /* 665 */ 0x2a7e70f7794301abL,
/* 666 */ 0xdef42d8a270540fdL, /* 667 */ 0x01078ec0a34c22c1L,
/* 668 */ 0xe5de511af4c16387L, /* 669 */ 0x7ebb3a52bd9a330aL,
/* 670 */ 0x77697857aa7d6435L, /* 671 */ 0x004e831603ae4c32L,
/* 672 */ 0xe7a21020ad78e312L, /* 673 */ 0x9d41a70c6ab420f2L,
/* 674 */ 0x28e06c18ea1141e6L, /* 675 */ 0xd2b28cbd984f6b28L,
/* 676 */ 0x26b75f6c446e9d83L, /* 677 */ 0xba47568c4d418d7fL,
/* 678 */ 0xd80badbfe6183d8eL, /* 679 */ 0x0e206d7f5f166044L,
/* 680 */ 0xe258a43911cbca3eL, /* 681 */ 0x723a1746b21dc0bcL,
/* 682 */ 0xc7caa854f5d7cdd3L, /* 683 */ 0x7cac32883d261d9cL,
/* 684 */ 0x7690c26423ba942cL, /* 685 */ 0x17e55524478042b8L,
/* 686 */ 0xe0be477656a2389fL, /* 687 */ 0x4d289b5e67ab2da0L,
/* 688 */ 0x44862b9c8fbbfd31L, /* 689 */ 0xb47cc8049d141365L,
/* 690 */ 0x822c1b362b91c793L, /* 691 */ 0x4eb14655fb13dfd8L,
/* 692 */ 0x1ecbba0714e2a97bL, /* 693 */ 0x6143459d5cde5f14L,
/* 694 */ 0x53a8fbf1d5f0ac89L, /* 695 */ 0x97ea04d81c5e5b00L,
/* 696 */ 0x622181a8d4fdb3f3L, /* 697 */ 0xe9bcd341572a1208L,
/* 698 */ 0x1411258643cce58aL, /* 699 */ 0x9144c5fea4c6e0a4L,
/* 700 */ 0x0d33d06565cf620fL, /* 701 */ 0x54a48d489f219ca1L,
/* 702 */ 0xc43e5eac6d63c821L, /* 703 */ 0xa9728b3a72770dafL,
/* 704 */ 0xd7934e7b20df87efL, /* 705 */ 0xe35503b61a3e86e5L,
/* 706 */ 0xcae321fbc819d504L, /* 707 */ 0x129a50b3ac60bfa6L,
/* 708 */ 0xcd5e68ea7e9fb6c3L, /* 709 */ 0xb01c90199483b1c7L,
/* 710 */ 0x3de93cd5c295376cL, /* 711 */ 0xaed52edf2ab9ad13L,
/* 712 */ 0x2e60f512c0a07884L, /* 713 */ 0xbc3d86a3e36210c9L,
/* 714 */ 0x35269d9b163951ceL, /* 715 */ 0x0c7d6e2ad0cdb5faL,
/* 716 */ 0x59e86297d87f5733L, /* 717 */ 0x298ef221898db0e7L,
/* 718 */ 0x55000029d1a5aa7eL, /* 719 */ 0x8bc08ae1b5061b45L,
/* 720 */ 0xc2c31c2b6c92703aL, /* 721 */ 0x94cc596baf25ef42L,
/* 722 */ 0x0a1d73db22540456L, /* 723 */ 0x04b6a0f9d9c4179aL,
/* 724 */ 0xeffdafa2ae3d3c60L, /* 725 */ 0xf7c8075bb49496c4L,
/* 726 */ 0x9cc5c7141d1cd4e3L, /* 727 */ 0x78bd1638218e5534L,
/* 728 */ 0xb2f11568f850246aL, /* 729 */ 0xedfabcfa9502bc29L,
/* 730 */ 0x796ce5f2da23051bL, /* 731 */ 0xaae128b0dc93537cL,
/* 732 */ 0x3a493da0ee4b29aeL, /* 733 */ 0xb5df6b2c416895d7L,
/* 734 */ 0xfcabbd25122d7f37L, /* 735 */ 0x70810b58105dc4b1L,
/* 736 */ 0xe10fdd37f7882a90L, /* 737 */ 0x524dcab5518a3f5cL,
/* 738 */ 0x3c9e85878451255bL, /* 739 */ 0x4029828119bd34e2L,
/* 740 */ 0x74a05b6f5d3ceccbL, /* 741 */ 0xb610021542e13ecaL,
/* 742 */ 0x0ff979d12f59e2acL, /* 743 */ 0x6037da27e4f9cc50L,
/* 744 */ 0x5e92975a0df1847dL, /* 745 */ 0xd66de190d3e623feL,
/* 746 */ 0x5032d6b87b568048L, /* 747 */ 0x9a36b7ce8235216eL,
/* 748 */ 0x80272a7a24f64b4aL, /* 749 */ 0x93efed8b8c6916f7L,
/* 750 */ 0x37ddbff44cce1555L, /* 751 */ 0x4b95db5d4b99bd25L,
/* 752 */ 0x92d3fda169812fc0L, /* 753 */ 0xfb1a4a9a90660bb6L,
/* 754 */ 0x730c196946a4b9b2L, /* 755 */ 0x81e289aa7f49da68L,
/* 756 */ 0x64669a0f83b1a05fL, /* 757 */ 0x27b3ff7d9644f48bL,
/* 758 */ 0xcc6b615c8db675b3L, /* 759 */ 0x674f20b9bcebbe95L,
/* 760 */ 0x6f31238275655982L, /* 761 */ 0x5ae488713e45cf05L,
/* 762 */ 0xbf619f9954c21157L, /* 763 */ 0xeabac46040a8eae9L,
/* 764 */ 0x454c6fe9f2c0c1cdL, /* 765 */ 0x419cf6496412691cL,
/* 766 */ 0xd3dc3bef265b0f70L, /* 767 */ 0x6d0e60f5c3578a9eL};
private static final long[] S3 = {
/* 768 */ 0x5b0e608526323c55L, /* 769 */ 0x1a46c1a9fa1b59f5L,
/* 770 */ 0xa9e245a17c4c8ffaL, /* 771 */ 0x65ca5159db2955d7L,
/* 772 */ 0x05db0a76ce35afc2L, /* 773 */ 0x81eac77ea9113d45L,
/* 774 */ 0x528ef88ab6ac0a0dL, /* 775 */ 0xa09ea253597be3ffL,
/* 776 */ 0x430ddfb3ac48cd56L, /* 777 */ 0xc4b3a67af45ce46fL,
/* 778 */ 0x4ececfd8fbe2d05eL, /* 779 */ 0x3ef56f10b39935f0L,
/* 780 */ 0x0b22d6829cd619c6L, /* 781 */ 0x17fd460a74df2069L,
/* 782 */ 0x6cf8cc8e8510ed40L, /* 783 */ 0xd6c824bf3a6ecaa7L,
/* 784 */ 0x61243d581a817049L, /* 785 */ 0x048bacb6bbc163a2L,
/* 786 */ 0xd9a38ac27d44cc32L, /* 787 */ 0x7fddff5baaf410abL,
/* 788 */ 0xad6d495aa804824bL, /* 789 */ 0xe1a6a74f2d8c9f94L,
/* 790 */ 0xd4f7851235dee8e3L, /* 791 */ 0xfd4b7f886540d893L,
/* 792 */ 0x247c20042aa4bfdaL, /* 793 */ 0x096ea1c517d1327cL,
/* 794 */ 0xd56966b4361a6685L, /* 795 */ 0x277da5c31221057dL,
/* 796 */ 0x94d59893a43acff7L, /* 797 */ 0x64f0c51ccdc02281L,
/* 798 */ 0x3d33bcc4ff6189dbL, /* 799 */ 0xe005cb184ce66af1L,
/* 800 */ 0xff5ccd1d1db99beaL, /* 801 */ 0xb0b854a7fe42980fL,
/* 802 */ 0x7bd46a6a718d4b9fL, /* 803 */ 0xd10fa8cc22a5fd8cL,
/* 804 */ 0xd31484952be4bd31L, /* 805 */ 0xc7fa975fcb243847L,
/* 806 */ 0x4886ed1e5846c407L, /* 807 */ 0x28cddb791eb70b04L,
/* 808 */ 0xc2b00be2f573417fL, /* 809 */ 0x5c9590452180f877L,
/* 810 */ 0x7a6bddfff370eb00L, /* 811 */ 0xce509e38d6d9d6a4L,
/* 812 */ 0xebeb0f00647fa702L, /* 813 */ 0x1dcc06cf76606f06L,
/* 814 */ 0xe4d9f28ba286ff0aL, /* 815 */ 0xd85a305dc918c262L,
/* 816 */ 0x475b1d8732225f54L, /* 817 */ 0x2d4fb51668ccb5feL,
/* 818 */ 0xa679b9d9d72bba20L, /* 819 */ 0x53841c0d912d43a5L,
/* 820 */ 0x3b7eaa48bf12a4e8L, /* 821 */ 0x781e0e47f22f1ddfL,
/* 822 */ 0xeff20ce60ab50973L, /* 823 */ 0x20d261d19dffb742L,
/* 824 */ 0x16a12b03062a2e39L, /* 825 */ 0x1960eb2239650495L,
/* 826 */ 0x251c16fed50eb8b8L, /* 827 */ 0x9ac0c330f826016eL,
/* 828 */ 0xed152665953e7671L, /* 829 */ 0x02d63194a6369570L,
/* 830 */ 0x5074f08394b1c987L, /* 831 */ 0x70ba598c90b25ce1L,
/* 832 */ 0x794a15810b9742f6L, /* 833 */ 0x0d5925e9fcaf8c6cL,
/* 834 */ 0x3067716cd868744eL, /* 835 */ 0x910ab077e8d7731bL,
/* 836 */ 0x6a61bbdb5ac42f61L, /* 837 */ 0x93513efbf0851567L,
/* 838 */ 0xf494724b9e83e9d5L, /* 839 */ 0xe887e1985c09648dL,
/* 840 */ 0x34b1d3c675370cfdL, /* 841 */ 0xdc35e433bc0d255dL,
/* 842 */ 0xd0aab84234131be0L, /* 843 */ 0x08042a50b48b7eafL,
/* 844 */ 0x9997c4ee44a3ab35L, /* 845 */ 0x829a7b49201799d0L,
/* 846 */ 0x263b8307b7c54441L, /* 847 */ 0x752f95f4fd6a6ca6L,
/* 848 */ 0x927217402c08c6e5L, /* 849 */ 0x2a8ab754a795d9eeL,
/* 850 */ 0xa442f7552f72943dL, /* 851 */ 0x2c31334e19781208L,
/* 852 */ 0x4fa98d7ceaee6291L, /* 853 */ 0x55c3862f665db309L,
/* 854 */ 0xbd0610175d53b1f3L, /* 855 */ 0x46fe6cb840413f27L,
/* 856 */ 0x3fe03792df0cfa59L, /* 857 */ 0xcfe700372eb85e8fL,
/* 858 */ 0xa7be29e7adbce118L, /* 859 */ 0xe544ee5cde8431ddL,
/* 860 */ 0x8a781b1b41f1873eL, /* 861 */ 0xa5c94c78a0d2f0e7L,
/* 862 */ 0x39412e2877b60728L, /* 863 */ 0xa1265ef3afc9a62cL,
/* 864 */ 0xbcc2770c6a2506c5L, /* 865 */ 0x3ab66dd5dce1ce12L,
/* 866 */ 0xe65499d04a675b37L, /* 867 */ 0x7d8f523481bfd216L,
/* 868 */ 0x0f6f64fcec15f389L, /* 869 */ 0x74efbe618b5b13c8L,
/* 870 */ 0xacdc82b714273e1dL, /* 871 */ 0xdd40bfe003199d17L,
/* 872 */ 0x37e99257e7e061f8L, /* 873 */ 0xfa52626904775aaaL,
/* 874 */ 0x8bbbf63a463d56f9L, /* 875 */ 0xf0013f1543a26e64L,
/* 876 */ 0xa8307e9f879ec898L, /* 877 */ 0xcc4c27a4150177ccL,
/* 878 */ 0x1b432f2cca1d3348L, /* 879 */ 0xde1d1f8f9f6fa013L,
/* 880 */ 0x606602a047a7ddd6L, /* 881 */ 0xd237ab64cc1cb2c7L,
/* 882 */ 0x9b938e7225fcd1d3L, /* 883 */ 0xec4e03708e0ff476L,
/* 884 */ 0xfeb2fbda3d03c12dL, /* 885 */ 0xae0bced2ee43889aL,
/* 886 */ 0x22cb8923ebfb4f43L, /* 887 */ 0x69360d013cf7396dL,
/* 888 */ 0x855e3602d2d4e022L, /* 889 */ 0x073805bad01f784cL,
/* 890 */ 0x33e17a133852f546L, /* 891 */ 0xdf4874058ac7b638L,
/* 892 */ 0xba92b29c678aa14aL, /* 893 */ 0x0ce89fc76cfaadcdL,
/* 894 */ 0x5f9d4e0908339e34L, /* 895 */ 0xf1afe9291f5923b9L,
/* 896 */ 0x6e3480f60f4a265fL, /* 897 */ 0xeebf3a2ab29b841cL,
/* 898 */ 0xe21938a88f91b4adL, /* 899 */ 0x57dfeff845c6d3c3L,
/* 900 */ 0x2f006b0bf62caaf2L, /* 901 */ 0x62f479ef6f75ee78L,
/* 902 */ 0x11a55ad41c8916a9L, /* 903 */ 0xf229d29084fed453L,
/* 904 */ 0x42f1c27b16b000e6L, /* 905 */ 0x2b1f76749823c074L,
/* 906 */ 0x4b76eca3c2745360L, /* 907 */ 0x8c98f463b91691bdL,
/* 908 */ 0x14bcc93cf1ade66aL, /* 909 */ 0x8885213e6d458397L,
/* 910 */ 0x8e177df0274d4711L, /* 911 */ 0xb49b73b5503f2951L,
/* 912 */ 0x10168168c3f96b6bL, /* 913 */ 0x0e3d963b63cab0aeL,
/* 914 */ 0x8dfc4b5655a1db14L, /* 915 */ 0xf789f1356e14de5cL,
/* 916 */ 0x683e68af4e51dac1L, /* 917 */ 0xc9a84f9d8d4b0fd9L,
/* 918 */ 0x3691e03f52a0f9d1L, /* 919 */ 0x5ed86e46e1878e80L,
/* 920 */ 0x3c711a0e99d07150L, /* 921 */ 0x5a0865b20c4e9310L,
/* 922 */ 0x56fbfc1fe4f0682eL, /* 923 */ 0xea8d5de3105edf9bL,
/* 924 */ 0x71abfdb12379187aL, /* 925 */ 0x2eb99de1bee77b9cL,
/* 926 */ 0x21ecc0ea33cf4523L, /* 927 */ 0x59a4d7521805c7a1L,
/* 928 */ 0x3896f5eb56ae7c72L, /* 929 */ 0xaa638f3db18f75dcL,
/* 930 */ 0x9f39358dabe9808eL, /* 931 */ 0xb7defa91c00b72acL,
/* 932 */ 0x6b5541fd62492d92L, /* 933 */ 0x6dc6dee8f92e4d5bL,
/* 934 */ 0x353f57abc4beea7eL, /* 935 */ 0x735769d6da5690ceL,
/* 936 */ 0x0a234aa642391484L, /* 937 */ 0xf6f9508028f80d9dL,
/* 938 */ 0xb8e319a27ab3f215L, /* 939 */ 0x31ad9c1151341a4dL,
/* 940 */ 0x773c22a57bef5805L, /* 941 */ 0x45c7561a07968633L,
/* 942 */ 0xf913da9e249dbe36L, /* 943 */ 0xda652d9b78a64c68L,
/* 944 */ 0x4c27a97f3bc334efL, /* 945 */ 0x76621220e66b17f4L,
/* 946 */ 0x967743899acd7d0bL, /* 947 */ 0xf3ee5bcae0ed6782L,
/* 948 */ 0x409f753600c879fcL, /* 949 */ 0x06d09a39b5926db6L,
/* 950 */ 0x6f83aeb0317ac588L, /* 951 */ 0x01e6ca4a86381f21L,
/* 952 */ 0x66ff3462d19f3025L, /* 953 */ 0x72207c24ddfd3bfbL,
/* 954 */ 0x4af6b6d3e2ece2ebL, /* 955 */ 0x9c994dbec7ea08deL,
/* 956 */ 0x49ace597b09a8bc4L, /* 957 */ 0xb38c4766cf0797baL,
/* 958 */ 0x131b9373c57c2a75L, /* 959 */ 0xb1822cce61931e58L,
/* 960 */ 0x9d7555b909ba1c0cL, /* 961 */ 0x127fafdd937d11d2L,
/* 962 */ 0x29da3badc66d92e4L, /* 963 */ 0xa2c1d57154c2ecbcL,
/* 964 */ 0x58c5134d82f6fe24L, /* 965 */ 0x1c3ae3515b62274fL,
/* 966 */ 0xe907c82e01cb8126L, /* 967 */ 0xf8ed091913e37fcbL,
/* 968 */ 0x3249d8f9c80046c9L, /* 969 */ 0x80cf9bede388fb63L,
/* 970 */ 0x1881539a116cf19eL, /* 971 */ 0x5103f3f76bd52457L,
/* 972 */ 0x15b7e6f5ae47f7a8L, /* 973 */ 0xdbd7c6ded47e9ccfL,
/* 974 */ 0x44e55c410228bb1aL, /* 975 */ 0xb647d4255edb4e99L,
/* 976 */ 0x5d11882bb8aafc30L, /* 977 */ 0xf5098bbb29d3212aL,
/* 978 */ 0x8fb5ea14e90296b3L, /* 979 */ 0x677b942157dd025aL,
/* 980 */ 0xfb58e7c0a390acb5L, /* 981 */ 0x89d3674c83bd4a01L,
/* 982 */ 0x9e2da4df4bf3b93bL, /* 983 */ 0xfcc41e328cab4829L,
/* 984 */ 0x03f38c96ba582c52L, /* 985 */ 0xcad1bdbd7fd85db2L,
/* 986 */ 0xbbb442c16082ae83L, /* 987 */ 0xb95fe86ba5da9ab0L,
/* 988 */ 0xb22e04673771a93fL, /* 989 */ 0x845358c9493152d8L,
/* 990 */ 0xbe2a488697b4541eL, /* 991 */ 0x95a2dc2dd38e6966L,
/* 992 */ 0xc02c11ac923c852bL, /* 993 */ 0x2388b1990df2a87bL,
/* 994 */ 0x7c8008fa1b4f37beL, /* 995 */ 0x1f70d0c84d54e503L,
/* 996 */ 0x5490adec7ece57d4L, /* 997 */ 0x002b3c27d9063a3aL,
/* 998 */ 0x7eaea3848030a2bfL, /* 999 */ 0xc602326ded2003c0L,
/* 1000 */ 0x83a7287d69a94086L, /* 1001 */ 0xc57a5fcb30f57a8aL,
/* 1002 */ 0xb56844e479ebe779L, /* 1003 */ 0xa373b40f05dcbce9L,
/* 1004 */ 0xd71a786e88570ee2L, /* 1005 */ 0x879cbacdbde8f6a0L,
/* 1006 */ 0x976ad1bcc164a32fL, /* 1007 */ 0xab21e25e9666d78bL,
/* 1008 */ 0x901063aae5e5c33cL, /* 1009 */ 0x9818b34448698d90L,
/* 1010 */ 0xe36487ae3e1e8abbL, /* 1011 */ 0xafbdf931893bdcb4L,
/* 1012 */ 0x6345a0dc5fbbd519L, /* 1013 */ 0x8628fe269b9465caL,
/* 1014 */ 0x1e5d01603f9c51ecL, /* 1015 */ 0x4de44006a15049b7L,
/* 1016 */ 0xbf6c70e5f776cbb1L, /* 1017 */ 0x411218f2ef552bedL,
/* 1018 */ 0xcb0c0708705a36a3L, /* 1019 */ 0xe74d14754f986044L,
/* 1020 */ 0xcd56d9430ea8280eL, /* 1021 */ 0xc12591d7535f5065L,
/* 1022 */ 0xc83223f1720aef96L, /* 1023 */ 0xc3a0396f7363a51fL};
}