1package Crypt::AppleTwoFish;
2
3use strict;
4use warnings;
5use Digest::SHA;
6use Math::BigInt;
7use Carp qw( carp );
8
9our $VERSION = "0.051";
10
11#--- lookup tables declared here are defined after the other package code ---#
12
13my ( @apple_tf_iTMS, @apple_tf_DRMS );
14
15my ( %veggies, @planter_table, %veggie_table );
16
17#-------------- non-member functions ----------------#
18
19sub _combine_keys {
20
21    # note: the arguments are binary bytes and
22    #   two ints: 6, 4, and 4 bytes each
23    my ( $hwID, $keyID, $userID ) = @_;
24    return $hwID . pack( 'N', $keyID ) . pack( 'N', $userID ) . "\xFF\xFF";
25}
26
27sub _compost_cow {
28    my $i = shift;
29    use integer;
30    return $i * 0xA2ED4502 + 0x6CD8D601;
31}
32
33sub _compost_horse {
34    my ( $i, $j, $k ) = @_;
35    use integer;
36    return ( $i + $j ) * 0xA2ED4502 + $k * 0xFFFFFFFE + 0xD9B1AC01;
37}
38
39sub _compost_sheep {
40    my ( $b, $c, $d, $e, $f ) = @_;
41    use integer;
42    return ( $b + $c + $d ) * 0xA2ED4502 + ( $e + $f ) * 0xFFFFFFFE +
43      0x468A8201;
44}
45
46sub _till {
47    my ( $bytes, $veggie ) = @_;
48    use integer;
49    for my $byte ( @{$bytes} ) {
50        $byte = ( $veggie_table{$veggie}->[$byte] ^ 0x5D ) & 0xFF;
51    }
52    return $bytes;
53}
54
55sub _weed {
56    my ( $bytes, $veggie ) = @_;
57    use integer;
58    my ( $i, $j ) = @{ $veggies{$veggie} };
59    for my $byte ( @{$bytes} ) {
60        $byte = ( $byte * $i + $j ) & 0xFF;
61    }
62    return $bytes;
63}
64
65sub _dust {
66    my (@hex_bytes) = @_;
67    use integer;
68    my $num_bytes = scalar @hex_bytes;
69    my $num_ints  = $num_bytes / 4;
70    my @b;
71    my $count;
72    while ( 0 < ( $count = scalar @hex_bytes ) ) {
73        my @digits;
74        if ( $count > 4 ) {
75            @digits    = @hex_bytes[ 0 .. 3 ];
76            @hex_bytes = @hex_bytes[ 4 .. $count - 1 ];
77        }
78        else {
79            @digits    = @hex_bytes;
80            @hex_bytes = ();
81        }
82        my $n = _fumigate(@digits);
83        push @b, sprintf "%02X", ($n) & 0xFF;
84        push @b, sprintf "%02X", ( $n >> 8 ) & 0xFF;
85        push @b, sprintf "%02X", ( $n >> 16 ) & 0xFF;
86        push @b, sprintf "%02X", ( $n >> 24 ) & 0xFF;
87    }
88    return @b;
89}
90
91sub _fumigate {
92    my (@bytes) = @_;
93    use integer;
94    my $i   = 0;
95    my $sum = 0;
96    for my $byte (@bytes) {
97        my $lshifter = $i * 8;
98        my $shifted  = 1 << $lshifter;
99        my $n        = _crop_duster($byte) << $lshifter;
100        my $m        = ( $n + $shifted + 0xFFFFFFFF ) | ( -1 - $sum );
101        $sum += $m - $shifted - $n + 1;
102        ++$i;
103    }
104    return $sum;
105}
106
107sub _crop_duster {
108    my $i = shift;
109    use integer;
110    my $a = $i * 0xFFFFFA29 + 0x307E;
111    my $b = ( $i * 0xFFF38978 + 0x2327B048 ) ^ ( $a | 0xFF );
112    my $c = ( $a | ( $i * 0xC7688 + 0xDCD84FB7 ) ) | 0xFF;
113    return $i * 0xC70B1 + $b * 0xFFFFFFFF + $c * 0xFFFFFFFE + 0xDCD88033;
114}
115
116#-------------- class member methods ---------------------#
117
118sub new {
119    my ( $class, %args ) = @_;
120    my $self = {};
121    bless( $self, $class );
122
123    $self->{DEBUG} = $args{DEBUG};
124
125    # iTMS crypt-apple-twofish scrambler
126    $self->{key} = $args{key};
127
128    # iTunes veggie tales scrambler
129    $self->{veggie}     = $args{veggie};
130    $self->{byte_table} = $args{byte_table};
131    $self->{int_table}  = $args{int_table};
132    $self->{hwID}       = $args{hwID};
133    $self->{keyID}      = $args{keyID};
134    $self->{userID}     = $args{userID};
135
136    return $self;
137}
138
139#------------ iTMS methods ---------------------------------#
140
141sub _process_iTMS_key {
142    my ($self) = @_;
143    my $k      = '';
144    my $key    = $self->{key};
145    my $siz    = length $key;
146    for ( my $i = 0 ; $i < $siz ; $i++ ) {
147        $k .= chr $apple_tf_iTMS[ $i % 16 ]->[ ord substr( $key, $i % 16, 1 ) ];
148    }
149    return $k;
150}
151
152sub decrypted_for_iTMS { return shift->_process_iTMS_key() }
153
154sub _process_DRMS_key {
155    my ($self) = @_;
156    my $k      = '';
157    my $key    = $self->{key};
158    my $siz    = length $key;
159    for ( my $i = 0 ; $i < $siz ; $i++ ) {
160        $k .= chr $apple_tf_DRMS[ $i % 16 ]->[ ord substr( $key, $i % 16, 1 ) ];
161    }
162    return $k;
163}
164
165sub decrypted_for_DRMS { return shift->_process_DRMS_key() }
166
167#-------------- SC Info methods -------------------------------------#
168
169sub key {
170    my ( $self, $new_key ) = @_;
171    $self->{key} = $new_key if defined $new_key;
172    return $self->{key};
173}
174
175sub int_table {
176    my ( $self, $new_table ) = @_;
177    $self->{int_table} = $new_table if defined $new_table;
178    return $self->{int_table};
179}
180
181sub byte_table {
182    my ( $self, $new_table ) = @_;
183    $self->{byte_table} = $new_table if defined $new_table;
184    return $self->{byte_table};
185}
186
187sub veggie {
188    my ( $self, $new_veg ) = @_;
189    $self->{veggie} = $new_veg if defined $new_veg;
190    return $self->{veggie};
191}
192
193sub hwID {
194    my ( $self, $newhwID ) = @_;
195    $self->{hwID} = $newhwID if defined $newhwID;
196    return $self->{hwID};
197}
198
199sub keyID {
200    my ( $self, $newkeyID ) = @_;
201    $self->{keyID} = $newkeyID if defined $newkeyID;
202    return $self->{keyID};
203}
204
205sub userID {
206    my ( $self, $newuser ) = @_;
207    $self->{userID} = $newuser if defined $newuser;
208    return $self->{userID};
209}
210
211sub _hoe_hoe_hoe {
212    my ( $self, $byte, $i, $j, $k, $n ) = @_;
213    use integer;
214    my $offset = 0x24004;
215    my $table_idx =
216      ord( $self->{byte_table}->[ $i * 0x100 + $byte + $offset ] ) + $j * 0x100;
217    return ( $planter_table[$table_idx] * $k + $n ) & 0xFF;
218}
219
220sub plant_veggies {
221    my ($self) = @_;
222    my $table = $self->{int_table};
223    my $combine =
224      _combine_keys( $self->{hwID}, $self->{keyID}, $self->{userID} );
225    $self->{combine_key} = $combine;
226    my @bytes = map { ord } split //, $combine;
227    use integer;
228    for my $i ( 0 .. 8 ) {
229        my @planter;
230        for my $j ( 0 .. 15 ) {
231            my $idx = $i * 0x1000 + $j * 0x100 + $bytes[ ( $j * 5 ) & 0xF ];
232            $planter[$j] = $table->[$idx] * 0x50A19981 + 0x5E39C9C0;
233        }
234        for my $j ( 0 .. 3 ) {
235            my $a = $planter[ $j * 4 ];
236            my $b = $planter[ $j * 4 + 1 ];
237            my $c = $planter[ $j * 4 + 2 ];
238            my $d = $planter[ $j * 4 + 3 ];
239            my $e = _compost_cow($c) | _compost_cow($b);
240            my $f = _compost_horse( $b, $c, $e ) | _compost_cow($d);
241            my $g = _compost_sheep( $b, $c, $d, $e, $f ) | _compost_cow($a);
242            my $h =
243              ( $a + $b + $c + $d + ( $e + $f + $g ) * 0xD3F0627F + 0x8DC2C100 )
244              * 0x2E895D7F + 0xC99394FF;
245
246            for my $k ( 0 .. 3 ) {
247                $bytes[ $j * 4 + $k ] = ( $h >> ( 24 - $k * 8 ) ) & 0xFF;
248            }
249        }
250    }
251    print "\nprecultivation bytes are ", ( join q{}, map { chr } @bytes ), "\n"
252      if $self->{DEBUG};
253    $bytes[0]  = $self->_hoe_hoe_hoe( $bytes[0],  0,  2, 0x99, 0xDF );
254    $bytes[4]  = $self->_hoe_hoe_hoe( $bytes[4],  4,  3, 0xB5, 0xFF );
255    $bytes[8]  = $self->_hoe_hoe_hoe( $bytes[8],  8,  4, 0x59, 0xD3 );
256    $bytes[12] = $self->_hoe_hoe_hoe( $bytes[12], 12, 5, 0x2F, 0x1E );
257    my $tmp = $bytes[1];
258    $bytes[1]  = $self->_hoe_hoe_hoe( $bytes[5],  1,  6,  0x95, 0xFC );
259    $bytes[5]  = $self->_hoe_hoe_hoe( $bytes[9],  5,  7,  0x05, 0x36 );
260    $bytes[9]  = $self->_hoe_hoe_hoe( $bytes[13], 9,  0,  0x05, 0x6D );
261    $bytes[13] = $self->_hoe_hoe_hoe( $tmp,       13, 9,  0x05, 0xE1 );
262    $tmp       = $bytes[2];
263    $bytes[2]  = $self->_hoe_hoe_hoe( $bytes[10], 2,  10, 0x4D, 0xB0 );
264    $bytes[10] = $self->_hoe_hoe_hoe( $tmp,       10, 11, 0x0B, 0x2E );
265    $tmp       = $bytes[6];
266    $bytes[6]  = $self->_hoe_hoe_hoe( $bytes[14], 6,  12, 0x93, 0x4E );
267    $bytes[14] = $self->_hoe_hoe_hoe( $tmp,       14, 13, 0x9b, 0x75 );
268
269    $tmp = $bytes[3];
270    $bytes[3]  = $self->_hoe_hoe_hoe( $bytes[15], 3,  14, 0x93, 0xC8 );
271    $bytes[15] = $self->_hoe_hoe_hoe( $bytes[11], 15, 15, 0x33, 0x8B );
272    $bytes[11] = $self->_hoe_hoe_hoe( $bytes[7],  11, 1,  0x5B, 0x25 );
273    $bytes[7]  = $self->_hoe_hoe_hoe( $tmp,       7,  8,  0xED, 0xC5 );
274    print "cultivated bytes are ", ( join q{}, map { chr } @bytes ), "\n"
275      if $self->{DEBUG};
276    return @bytes;
277}
278
279sub harvest_veggies {
280    my ( $self, @bytes ) = @_;
281    my $veggie = $self->{veggie};
282
283    use integer;
284    if ( $veggie =~ m/carrot|garlic|potato|radish|tomato/ ) {
285        _till( \@bytes, $veggie );
286    }
287
288    _weed( \@bytes, $veggie );
289    my $sha1 = Digest::SHA->new(1);
290    $sha1->add( $self->{combine_key} );
291    my @digest_bytes = map { ord } split //, $sha1->digest;
292    _weed( \@digest_bytes, 'pepcid' );
293
294    for my $i ( 0 .. 13 ) {
295        my $a = $bytes[ $i + 2 ];
296        my $b = $digest_bytes[ $i + 1 ];
297        my $c = ( $a * 0xFFFF9129 + 0xA07E ) | 0xFF;
298        my $d = ( $a * 0xFFAD8735 + 0x109ABD82 ) ^ $c;
299        my $e = ( $a * 0xFFFF9129 + 0xA07E ) | ( $a * 0x5278CB + 0xEF65427D );
300        my $f = $e | 0xFF;
301        my $g = ( $b * 0xFFFFCB29 + 0x417E ) | 0xFF;
302        my $h = ( $b * 0xFFFFCB29 + 0x417E ) | ( $b * 0x698AC6 + 0xD597C97D );
303        my $j = $h | 0xFF;
304        my $k = ( $b * 0xFF96753A + 0x2A683682 ) ^ $g;
305        my $m =
306          ( $b * 0xD2ABDE + $j * 0xFFFFFFFC + $k * 0xFFFFFFFE + 0xAB3015F3 ) |
307          ( $a * 0xA413E8 + $d * 0xFFFFFFFE + $f * 0xFFFFFFFC + 0xDECBC5F3 );
308        $digest_bytes[ $i + 1 ] = (
309            (
310                $a * 0x3FC1ACD4 +
311                  $b * 0x5B76357 +
312                  ( $d + $k + $m ) * 0x71070EE7 +
313                  ( $f + $j ) * 0xE20E1DCE + 0xB7ABCB54
314            )
315        ) & 0xFF;
316    }
317    my $a     = ord substr $self->{hwID}, 4, 1;
318    my $b     = $a * 0xFFFF9CFF + 0xB8FF;
319    my $c     = $b | 0xFF;
320    my $d     = $b | ( $a * 0x32FA52 + 0x21E2D7AB );
321    my $e     = ( $a * 0xFFCD05AE + 0xDE1D2854 ) ^ $c;
322    my $f     = $d | 0xFF;
323    my $nsize = ( $a * 0xFFCD68AF + $e + $f * 2 + 0xDE1C6F57 ) & 0x80000003 + 8;
324    use bigint;
325    my $ndigest_bytes = '0x' . join q{},
326      _dust( @digest_bytes[ 0 .. $nsize - 1 ] );
327    $ndigest_bytes = substr $ndigest_bytes, 0, ( $nsize * 2 ) + 2;
328    my $nd = Math::BigInt->new($ndigest_bytes);
329    my $nbytes_str = '0x' . join q{},
330      map { length $_ > 1 ? $_ : '0' . $_ } _dust(@bytes);
331    my $nbytes = Math::BigInt->new($nbytes_str);
332    # print "nbytes_str is $nbytes_str, nybytes is $nbytes\n" if $self->{DEBUG};
333    my $nB2            = 0xFFFFFFFFFFFFFFF9C31A00000000000933CCD065;
334    my $n00            = 0x100000000000000063CE600000000001DB577CE3F;
335    my $n1             = 1;
336    my $bits_in_digest = length( ( Math::BigInt->new($nd) )->as_bin ) - 2;
337
338    for ( my $i = $bits_in_digest - 1 ; $i >= 0 ; --$i ) {
339        $n1     *= $n1;
340        $nbytes *= $nbytes;
341        if ( $nd & ( 1 << $i ) ) {
342            $n1 = $nbytes - $n1;
343            my $m = ( ( ( $n1 >> 159 ) * $n00 ) >> 161 ) * $nB2;
344            $n1 = ( $n1 - $m ) % $nB2;
345            $m = ( ( ( $nbytes >> 159 ) * $n00 )>> 161 ) * $nB2;
346            $nbytes = ( $nbytes - $m ) % $nB2;
347        }
348        else {
349            $nbytes -= $n1;
350            my $m = ( ( ( $nbytes >> 159 ) * $n00 ) >> 161 )* $nB2;
351            $nbytes = ( $nbytes - $m )% $nB2;
352            $m = ( ( ( $n1 >> 159 ) * $n00 ) >> 161 ) * $nB2;
353            $n1 -= $m;
354            $nbytes %= $nB2;
355        }
356    }    # now $n1 is right
357    my @digits =
358      ( substr( ( Math::BigInt->new($n1) )->as_hex, 2 ) ) =~ m/[\d\w]{2}/g;
359    my $digit_count = scalar @digits;
360    my $digest_fodder = join q{}, map { chr( hex $_ ) } @digits;
361    if ( $digit_count < 32 ) {
362        my $zeroes = "\x00" x ( 32 - $digit_count );
363        $digest_fodder = $zeroes . $digest_fodder;
364    }
365    $sha1->reset;
366    $sha1->add($digest_fodder);
367    my $key_key = substr $sha1->digest, 1, 16;
368    print "The key key (for the priv keys) is $key_key\n" if $self->{DEBUG};
369    return $key_key;
370}
371
372#------------- scramble tables --------------------------------------#
373
374@apple_tf_iTMS = (
375    [
376        4,   145, 105, 51,  65,  245, 121, 233, 87,  85,  24,  110, 118, 149,
377        117, 2,   83,  91,  246, 57,  53,  251, 126, 69,  129, 144, 199, 164,
378        198, 181, 132, 35,  206, 214, 21,  152, 146, 103, 93,  227, 23,  68,
379        44,  248, 169, 217, 50,  92,  131, 224, 14,  204, 140, 114, 124, 143,
380        120, 171, 56,  158, 232, 183, 48,  176, 37,  192, 41,  28,  36,  155,
381        231, 201, 221, 52,  189, 125, 122, 191, 242, 178, 249, 111, 109, 170,
382        6,   180, 237, 174, 254, 202, 17,  223, 230, 195, 141, 47,  67,  182,
383        99,  104, 15,  238, 45,  7,   27,  20,  166, 207, 159, 196, 244, 162,
384        133, 54,  138, 116, 8,   168, 156, 16,  0,   38,  148, 66,  19,  86,
385        115, 73,  239, 188, 136, 61,  108, 33,  247, 142, 193, 39,  90,  82,
386        34,  200, 197, 26,  88,  10,  25,  71,  1,   119, 130, 100, 98,  18,
387        154, 72,  106, 78,  70,  213, 173, 12,  229, 235, 228, 186, 77,  209,
388        84,  147, 160, 127, 76,  64,  139, 112, 60,  222, 177, 253, 49,  30,
389        81,  161, 13,  123, 243, 62,  212, 31,  97,  80,  250, 9,   225, 153,
390        40,  46,  172, 218, 220, 184, 63,  29,  102, 194, 22,  79,  59,  179,
391        96,  55,  11,  157, 175, 95,  113, 107, 185, 210, 208, 167, 236, 89,
392        32,  128, 137, 43,  241, 75,  150, 42,  135, 234, 215, 5,   187, 163,
393        151, 3,   94,  165, 203, 134, 211, 101, 216, 190, 58,  205, 219, 252,
394        74,  226, 255, 240,
395    ],
396    [
397        201, 226, 95,  10,  98,  222, 106, 146, 254, 86,  109, 137, 35,  39,
398        56,  243, 245, 241, 57,  181, 158, 250, 104, 89,  23,  154, 40,  42,
399        132, 179, 195, 48,  76,  22,  167, 34,  25,  68,  62,  58,  235, 209,
400        125, 221, 206, 174, 147, 242, 251, 194, 208, 220, 200, 63,  193, 11,
401        156, 9,   0,   4,   46,  164, 41,  144, 212, 38,  101, 90,  85,  117,
402        28,  186, 159, 18,  183, 173, 97,  213, 207, 94,  187, 72,  114, 157,
403        7,   6,   126, 53,  203, 121, 188, 171, 78,  54,  202, 100, 130, 172,
404        232, 227, 224, 233, 122, 19,  108, 236, 150, 69,  75,  43,  103, 142,
405        123, 70,  238, 45,  169, 211, 44,  120, 71,  140, 124, 148, 197, 133,
406        113, 163, 88,  216, 79,  175, 199, 234, 80,  99,  231, 110, 81,  92,
407        182, 37,  170, 155, 27,  84,  180, 33,  31,  111, 13,  2,   136, 127,
408        105, 196, 59,  102, 184, 249, 73,  165, 237, 185, 15,  160, 239, 112,
409        178, 162, 20,  47,  219, 192, 8,   66,  217, 161, 1,   55,  91,  177,
410        246, 26,  198, 191, 17,  83,  141, 93,  32,  21,  30,  61,  52,  253,
411        36,  96,  119, 116, 139, 252, 74,  51,  151, 145, 77,  255, 225, 176,
412        248, 12,  3,   152, 134, 240, 230, 60,  118, 5,   210, 190, 129, 244,
413        205, 14,  149, 166, 247, 204, 67,  189, 50,  153, 131, 135, 143, 214,
414        128, 223, 229, 228, 64,  218, 138, 87,  29,  49,  168, 82,  215, 65,
415        115, 107, 16,  24,
416    ],
417    [
418        208, 110, 109, 139, 9,   100, 10,  132, 96,  133, 5,   220, 250, 92,
419        36,  61,  244, 117, 171, 68,  52,  8,   144, 162, 146, 67,  107, 200,
420        240, 147, 213, 54,  253, 72,  85,  234, 11,  29,  38,  178, 184, 91,
421        44,  215, 202, 101, 247, 46,  190, 1,   88,  229, 173, 114, 16,  99,
422        104, 26,  186, 148, 89,  183, 137, 53,  185, 206, 175, 164, 218, 20,
423        225, 87,  231, 57,  121, 168, 3,   120, 254, 83,  28,  80,  201, 60,
424        158, 76,  39,  0,   243, 166, 204, 49,  189, 82,  255, 95,  62,  97,
425        69,  224, 63,  156, 154, 199, 246, 212, 237, 56,  32,  149, 176, 163,
426        228, 252, 211, 24,  214, 188, 14,  222, 84,  138, 221, 203, 55,  122,
427        35,  58,  127, 22,  71,  34,  170, 210, 98,  7,   31,  226, 43,  151,
428        191, 59,  152, 23,  90,  66,  42,  223, 12,  187, 33,  130, 118, 113,
429        41,  245, 6,   48,  238, 81,  242, 141, 78,  161, 21,  179, 103, 249,
430        65,  216, 4,   155, 77,  159, 25,  18,  251, 174, 239, 111, 169, 73,
431        230, 209, 241, 129, 160, 196, 2,   192, 150, 47,  45,  125, 75,  30,
432        182, 51,  124, 13,  37,  227, 123, 15,  108, 126, 233, 248, 207, 119,
433        131, 70,  136, 74,  180, 153, 172, 181, 193, 219, 217, 195, 236, 17,
434        143, 79,  102, 19,  128, 235, 198, 27,  115, 194, 112, 177, 157, 165,
435        94,  140, 86,  93,  142, 64,  145, 105, 205, 135, 106, 232, 116, 167,
436        50,  197, 134, 40,
437    ],
438    [
439        117, 161, 170, 193, 109, 111, 58,  80,  55,  160, 8,   56,  106, 239,
440        53,  247, 128, 65,  232, 173, 74,  105, 244, 188, 233, 190, 49,  159,
441        210, 110, 212, 137, 92,  60,  67,  18,  107, 100, 115, 211, 185, 27,
442        31,  230, 7,   32,  102, 77,  44,  199, 217, 13,  150, 252, 23,  62,
443        200, 255, 0,   29,  54,  36,  103, 12,  162, 133, 191, 57,  240, 242,
444        2,   94,  194, 28,  147, 157, 192, 213, 6,   43,  204, 154, 51,  153,
445        222, 121, 11,  254, 151, 180, 71,  172, 225, 123, 127, 97,  25,  171,
446        249, 79,  227, 40,  136, 177, 4,   229, 35,  243, 195, 39,  120, 168,
447        138, 9,   148, 184, 5,   113, 218, 101, 45,  186, 140, 85,  143, 253,
448        181, 63,  228, 134, 75,  112, 219, 95,  108, 96,  33,  201, 37,  3,
449        165, 226, 182, 175, 14,  223, 235, 87,  93,  251, 198, 231, 183, 205,
450        220, 206, 16,  84,  119, 26,  238, 15,  73,  126, 82,  78,  86,  88,
451        207, 141, 118, 89,  10,  236, 68,  216, 187, 114, 130, 144, 131, 59,
452        64,  164, 241, 189, 214, 42,  41,  224, 197, 245, 208, 237, 48,  24,
453        76,  129, 19,  1,   135, 30,  125, 38,  90,  99,  209, 166, 149, 47,
454        83,  174, 203, 234, 46,  132, 142, 98,  202, 50,  81,  91,  248, 34,
455        246, 250, 66,  196, 124, 69,  156, 22,  158, 145, 167, 176, 152, 17,
456        221, 179, 52,  70,  104, 163, 61,  116, 139, 20,  146, 21,  215, 178,
457        72,  122, 169, 155,
458    ],
459    [
460        12,  23,  233, 120, 139, 254, 24,  182, 41,  64,  69,  13,  98,  230,
461        65,  190, 251, 172, 115, 144, 71,  155, 79,  111, 97,  208, 19,  143,
462        192, 209, 219, 57,  250, 39,  119, 116, 34,  2,   134, 215, 84,  141,
463        61,  122, 59,  27,  92,  194, 50,  17,  72,  51,  93,  245, 96,  177,
464        117, 226, 83,  153, 135, 88,  175, 74,  160, 32,  29,  252, 110, 213,
465        114, 229, 63,  66,  1,   113, 179, 176, 62,  90,  253, 157, 21,  5,
466        60,  94,  15,  185, 180, 168, 235, 241, 107, 220, 9,   127, 99,  217,
467        211, 76,  212, 188, 45,  0,   68,  26,  161, 75,  149, 239, 178, 35,
468        10,  214, 218, 131, 159, 20,  224, 30,  199, 148, 163, 228, 195, 58,
469        78,  128, 154, 54,  193, 123, 101, 255, 196, 244, 125, 25,  67,  187,
470        234, 170, 55,  186, 231, 236, 87,  232, 104, 124, 103, 11,  207, 80,
471        138, 95,  109, 38,  223, 202, 47,  173, 189, 204, 4,   147, 150, 200,
472        248, 167, 43,  40,  142, 133, 203, 53,  174, 22,  158, 171, 184, 7,
473        242, 183, 197, 44,  249, 89,  81,  121, 85,  246, 164, 210, 166, 82,
474        52,  18,  31,  151, 206, 49,  46,  238, 145, 240, 14,  130, 112, 3,
475        77,  100, 205, 191, 243, 16,  8,   56,  106, 28,  225, 181, 108, 227,
476        136, 221, 48,  237, 73,  146, 37,  91,  105, 6,   42,  118, 36,  33,
477        137, 156, 247, 222, 216, 165, 86,  152, 140, 129, 169, 70,  126, 162,
478        198, 132, 201, 102,
479    ],
480    [
481        32,  147, 54,  169, 8,   64,  100, 21,  49,  220, 73,  79,  236, 154,
482        232, 210, 14,  132, 204, 188, 39,  241, 121, 170, 237, 224, 95,  126,
483        130, 173, 211, 53,  19,  151, 202, 68,  219, 226, 229, 139, 22,  103,
484        96,  15,  93,  1,   182, 111, 145, 52,  2,   149, 218, 84,  255, 207,
485        125, 178, 233, 90,  28,  118, 193, 69,  75,  209, 5,   253, 26,  194,
486        82,  197, 98,  248, 114, 215, 55,  243, 222, 57,  133, 245, 199, 51,
487        144, 198, 244, 59,  179, 16,  3,   161, 155, 200, 213, 30,  61,  252,
488        135, 235, 146, 136, 143, 33,  113, 124, 203, 206, 94,  238, 105, 36,
489        189, 24,  142, 186, 223, 87,  166, 76,  181, 81,  184, 160, 176, 104,
490        46,  175, 44,  120, 85,  20,  177, 138, 190, 56,  65,  71,  4,   106,
491        196, 134, 247, 108, 60,  109, 246, 48,  153, 119, 62,  122, 250, 195,
492        234, 163, 74,  140, 31,  180, 63,  92,  230, 35,  101, 227, 158, 0,
493        9,   13,  167, 239, 89,  17,  67,  38,  43,  192, 7,   29,  70,  137,
494        240, 102, 117, 12,  172, 187, 34,  171, 99,  141, 150, 165, 97,  41,
495        127, 66,  159, 91,  216, 83,  225, 6,   212, 47,  107, 164, 205, 152,
496        251, 40,  249, 115, 191, 208, 214, 86,  37,  156, 128, 25,  88,  183,
497        116, 129, 77,  157, 112, 221, 45,  174, 50,  123, 217, 27,  18,  168,
498        201, 72,  185, 131, 78,  11,  148, 58,  23,  42,  162, 228, 10,  80,
499        242, 110, 231, 254,
500    ],
501    [
502        240, 192, 203, 158, 19,  171, 135, 225, 193, 126, 67,  121, 100, 246,
503        186, 195, 233, 7,   131, 55,  166, 39,  14,  64,  167, 173, 188, 127,
504        160, 125, 59,  57,  237, 26,  56,  241, 189, 137, 23,  34,  86,  185,
505        37,  44,  17,  8,   245, 165, 80,  35,  199, 175, 169, 43,  48,  176,
506        92,  0,   210, 178, 238, 198, 208, 224, 105, 216, 141, 95,  150, 140,
507        236, 249, 235, 129, 106, 138, 134, 103, 10,  73,  13,  212, 143, 219,
508        211, 252, 112, 229, 142, 155, 108, 183, 244, 170, 18,  128, 184, 214,
509        96,  149, 254, 82,  88,  116, 230, 97,  40,  60,  78,  79,  177, 85,
510        205, 6,   242, 49,  218, 123, 239, 54,  201, 72,  151, 221, 107, 132,
511        75,  84,  94,  154, 182, 215, 174, 248, 213, 99,  28,  231, 22,  70,
512        157, 164, 41,  172, 253, 5,   191, 200, 98,  247, 45,  163, 32,  223,
513        24,  227, 89,  161, 16,  251, 130, 104, 30,  120, 145, 91,  52,  65,
514        122, 4,   27,  93,  111, 124, 181, 250, 255, 217, 21,  29,  179, 190,
515        206, 33,  196, 168, 46,  102, 71,  66,  81,  87,  76,  68,  147, 162,
516        20,  207, 234, 117, 133, 36,  180, 204, 226, 209, 50,  159, 25,  119,
517        101, 197, 15,  2,   202, 232, 31,  11,  113, 194, 38,  243, 9,   51,
518        69,  61,  62,  58,  12,  228, 144, 115, 1,   42,  83,  156, 220, 3,
519        109, 77,  114, 152, 187, 74,  146, 47,  136, 110, 90,  63,  222, 139,
520        148, 153, 53,  118,
521    ],
522    [
523        159, 5,   106, 136, 30,  230, 132, 176, 109, 91,  85,  66,  222, 112,
524        226, 71,  211, 245, 209, 34,  111, 197, 247, 26,  13,  153, 168, 215,
525        167, 121, 194, 203, 244, 239, 148, 126, 69,  80,  7,   115, 0,   33,
526        131, 208, 25,  94,  243, 249, 200, 97,  82,  8,   145, 221, 119, 207,
527        108, 22,  19,  163, 155, 198, 170, 35,  120, 107, 231, 89,  98,  156,
528        86,  4,   241, 195, 44,  157, 186, 224, 219, 164, 165, 54,  135, 143,
529        113, 116, 28,  59,  104, 90,  125, 227, 218, 139, 63,  216, 27,  225,
530        220, 166, 41,  151, 100, 75,  193, 37,  161, 150, 88,  129, 213, 16,
531        242, 147, 64,  49,  171, 117, 180, 29,  252, 192, 60,  238, 114, 237,
532        236, 14,  202, 79,  96,  240, 189, 9,   36,  196, 101, 2,   191, 68,
533        57,  124, 234, 250, 138, 46,  187, 123, 67,  253, 81,  174, 62,  210,
534        169, 205, 146, 51,  162, 199, 23,  72,  178, 179, 18,  160, 47,  184,
535        42,  65,  154, 38,  78,  92,  12,  20,  133, 223, 52,  11,  212, 177,
536        201, 48,  55,  102, 134, 251, 206, 141, 110, 128, 56,  137, 1,   74,
537        173, 158, 83,  255, 144, 181, 217, 17,  15,  127, 31,  190, 228, 24,
538        84,  93,  204, 182, 149, 73,  21,  248, 61,  233, 103, 122, 3,   152,
539        50,  140, 10,  39,  70,  118, 214, 142, 254, 229, 43,  32,  6,   45,
540        53,  235, 246, 183, 99,  232, 87,  95,  185, 76,  188, 105, 77,  175,
541        130, 40,  58,  172,
542    ],
543    [
544        211, 130, 35,  117, 136, 59,  57,  156, 143, 181, 42,  9,   63,  60,
545        132, 195, 150, 183, 221, 33,  249, 171, 226, 191, 111, 68,  194, 229,
546        20,  26,  77,  190, 179, 31,  86,  164, 103, 200, 122, 233, 167, 125,
547        159, 206, 168, 104, 36,  222, 232, 234, 65,  245, 127, 94,  0,   210,
548        14,  67,  4,   173, 16,  217, 186, 38,  92,  64,  43,  85,  71,  116,
549        30,  91,  45,  10,  53,  49,  121, 139, 120, 62,  113, 72,  254, 144,
550        198, 23,  185, 252, 214, 141, 225, 79,  46,  112, 172, 11,  27,  146,
551        81,  131, 74,  3,   213, 248, 95,  8,   138, 51,  238, 18,  239, 178,
552        123, 228, 37,  90,  100, 251, 157, 151, 166, 124, 187, 165, 203, 212,
553        240, 22,  73,  246, 48,  107, 34,  70,  61,  78,  227, 153, 97,  40,
554        101, 69,  21,  50,  155, 25,  66,  148, 175, 205, 242, 12,  87,  184,
555        55,  255, 76,  193, 28,  231, 58,  54,  17,  208, 137, 202, 133, 96,
556        236, 41,  80,  39,  174, 163, 98,  6,   158, 224, 169, 161, 47,  149,
557        147, 106, 189, 29,  89,  176, 152, 145, 83,  32,  2,   250, 52,  118,
558        220, 142, 192, 93,  196, 253, 82,  128, 56,  88,  170, 237, 218, 247,
559        140, 199, 204, 230, 7,   244, 209, 154, 15,  24,  201, 44,  99,  84,
560        223, 135, 182, 243, 180, 160, 177, 129, 19,  119, 102, 115, 5,   219,
561        235, 162, 109, 1,   13,  75,  241, 197, 216, 215, 126, 134, 114, 108,
562        105, 188, 110, 207,
563    ],
564    [
565        90,  102, 154, 161, 197, 61,  105, 120, 16,  230, 127, 128, 36,  23,
566        103, 92,  57,  212, 9,   169, 158, 123, 216, 232, 0,   231, 139, 153,
567        35,  104, 144, 116, 142, 150, 87,  49,  113, 94,  206, 55,  3,   51,
568        151, 84,  214, 133, 165, 201, 38,  60,  202, 54,  176, 119, 195, 166,
569        43,  252, 79,  72,  107, 21,  219, 227, 18,  233, 88,  213, 243, 75,
570        41,  143, 164, 160, 147, 46,  73,  225, 137, 210, 193, 240, 226, 152,
571        25,  218, 203, 101, 11,  254, 220, 141, 209, 135, 115, 207, 148, 248,
572        157, 156, 68,  236, 234, 228, 253, 196, 177, 63,  187, 12,  70,  204,
573        28,  114, 172, 200, 198, 31,  215, 8,   159, 122, 132, 222, 19,  149,
574        44,  191, 26,  45,  7,   124, 192, 171, 67,  29,  69,  24,  10,  199,
575        100, 173, 6,   98,  244, 89,  34,  81,  181, 255, 80,  40,  109, 74,
576        211, 188, 118, 58,  130, 30,  239, 138, 71,  251, 146, 145, 242, 163,
577        246, 66,  235, 97,  245, 167, 178, 241, 249, 221, 247, 53,  62,  121,
578        237, 117, 110, 140, 131, 184, 2,   1,   48,  76,  217, 112, 136, 15,
579        223, 78,  64,  99,  20,  205, 86,  83,  185, 174, 37,  183, 82,  13,
580        65,  129, 125, 134, 186, 208, 27,  47,  190, 126, 52,  85,  155, 93,
581        50,  22,  106, 224, 194, 180, 238, 95,  108, 96,  59,  111, 17,  182,
582        162, 250, 56,  91,  32,  5,   175, 77,  42,  229, 39,  170, 14,  168,
583        4,   189, 33,  179,
584    ],
585    [
586        164, 73,  41,  48,  14,  20,  92,  34,  57,  198, 27,  107, 119, 243,
587        188, 140, 122, 97,  127, 62,  19,  46,  146, 224, 77,  245, 225, 210,
588        123, 230, 26,  176, 191, 6,   169, 89,  218, 180, 227, 182, 148, 120,
589        234, 108, 156, 209, 238, 167, 170, 183, 65,  186, 163, 141, 248, 145,
590        239, 112, 187, 247, 79,  195, 222, 184, 82,  244, 3,   181, 233, 241,
591        11,  236, 161, 5,   117, 153, 175, 205, 152, 98,  85,  76,  162, 40,
592        37,  229, 64,  160, 72,  24,  157, 135, 16,  172, 174, 0,   90,  4,
593        190, 86,  61,  31,  80,  249, 149, 151, 166, 138, 133, 110, 197, 189,
594        171, 78,  52,  214, 173, 54,  226, 116, 237, 32,  179, 105, 22,  70,
595        150, 254, 131, 137, 12,  36,  235, 255, 66,  60,  147, 193, 109, 211,
596        240, 212, 199, 38,  228, 154, 10,  30,  178, 42,  7,   43,  88,  75,
597        130, 21,  47,  55,  231, 139, 124, 84,  177, 253, 196, 29,  102, 39,
598        206, 221, 232, 81,  125, 136, 202, 83,  59,  53,  99,  192, 201, 67,
599        216, 2,   94,  68,  33,  13,  159, 208, 242, 246, 69,  18,  185, 58,
600        63,  104, 9,   252, 158, 115, 8,   118, 103, 132, 100, 194, 91,  87,
601        142, 74,  213, 223, 106, 101, 165, 15,  251, 121, 25,  50,  51,  45,
602        168, 93,  113, 250, 204, 126, 35,  28,  49,  143, 56,  200, 219, 128,
603        17,  207, 95,  111, 215, 217, 96,  155, 144, 1,   129, 134, 220, 44,
604        71,  23,  203, 114,
605    ],
606    [
607        245, 217, 174, 135, 25,  2,   99,  176, 57,  159, 150, 226, 243, 205,
608        55,  109, 129, 203, 42,  253, 138, 105, 120, 111, 254, 74,  207, 110,
609        75,  147, 36,  81,  255, 172, 53,  160, 238, 3,   199, 119, 169, 103,
610        244, 197, 189, 45,  102, 193, 116, 232, 15,  16,  0,   41,  114, 167,
611        173, 247, 151, 158, 191, 101, 68,  60,  54,  154, 77,  61,  219, 96,
612        231, 182, 47,  156, 95,  155, 229, 82,  195, 26,  44,  89,  29,  200,
613        56,  49,  22,  213, 87,  28,  124, 251, 133, 131, 126, 179, 225, 130,
614        220, 184, 67,  214, 187, 198, 65,  218, 175, 48,  234, 71,  141, 127,
615        241, 192, 212, 239, 123, 165, 27,  40,  107, 148, 34,  21,  108, 79,
616        227, 84,  221, 4,   181, 235, 90,  35,  223, 85,  104, 201, 233, 112,
617        106, 190, 118, 146, 216, 248, 33,  163, 8,   24,  73,  194, 246, 121,
618        117, 13,  140, 139, 149, 14,  37,  170, 98,  64,  128, 88,  91,  94,
619        228, 78,  144, 152, 166, 252, 153, 115, 157, 46,  93,  113, 58,  204,
620        177, 72,  188, 38,  183, 39,  11,  242, 145, 100, 164, 186, 132, 66,
621        80,  10,  230, 162, 23,  202, 209, 43,  69,  249, 30,  59,  224, 196,
622        211, 18,  178, 134, 208, 20,  125, 215, 83,  70,  122, 168, 62,  86,
623        92,  143, 19,  206, 237, 97,  236, 6,   185, 180, 52,  76,  137, 12,
624        136, 1,   51,  5,   171, 142, 161, 63,  7,   50,  210, 9,   240, 31,
625        250, 32,  222, 17,
626    ],
627    [
628        194, 224, 115, 126, 70,  203, 214, 192, 157, 97,  146, 200, 10,  61,
629        238, 129, 85,  84,  195, 50,  28,  218, 53,  136, 124, 169, 247, 229,
630        121, 88,  57,  252, 153, 137, 141, 199, 81,  201, 11,  227, 144, 130,
631        120, 234, 216, 98,  172, 119, 34,  46,  95,  44,  83,  249, 168, 72,
632        156, 237, 104, 245, 179, 63,  189, 239, 159, 29,  110, 71,  36,  162,
633        65,  20,  160, 147, 107, 246, 205, 251, 142, 17,  212, 230, 184, 235,
634        67,  41,  190, 128, 133, 92,  102, 25,  22,  58,  149, 161, 174, 196,
635        4,   86,  5,   26,  135, 7,   117, 167, 74,  62,  69,  170, 150, 176,
636        96,  166, 38,  106, 131, 180, 132, 202, 134, 191, 254, 158, 250, 233,
637        78,  89,  109, 197, 105, 64,  68,  178, 118, 240, 47,  56,  18,  209,
638        39,  100, 94,  24,  211, 173, 165, 45,  15,  12,  164, 3,   19,  48,
639        213, 220, 243, 30,  187, 111, 181, 35,  13,  140, 222, 186, 206, 151,
640        6,   113, 255, 145, 215, 54,  175, 55,  99,  125, 228, 27,  101, 217,
641        244, 9,   139, 207, 33,  138, 91,  198, 232, 177, 80,  93,  90,  73,
642        163, 122, 236, 14,  127, 226, 171, 66,  108, 219, 193, 112, 75,  40,
643        223, 248, 60,  79,  210, 123, 32,  116, 52,  2,   114, 87,  204, 148,
644        143, 241, 103, 1,   182, 42,  253, 59,  155, 188, 82,  76,  43,  49,
645        16,  37,  221, 183, 154, 185, 242, 8,   31,  77,  0,   208, 51,  152,
646        231, 21,  23,  225,
647    ],
648    [
649        110, 197, 222, 126, 246, 32,  225, 173, 0,   247, 204, 135, 35,  189,
650        87,  148, 73,  206, 43,  75,  140, 1,   12,  141, 58,  113, 103, 166,
651        20,  33,  236, 46,  172, 233, 229, 227, 85,  40,  152, 186, 223, 104,
652        88,  219, 97,  124, 255, 25,  47,  59,  116, 81,  2,   90,  107, 60,
653        214, 109, 19,  108, 6,   22,  41,  192, 48,  16,  61,  234, 155, 24,
654        118, 163, 147, 131, 7,   72,  251, 79,  17,  162, 242, 129, 171, 184,
655        240, 138, 199, 183, 30,  66,  217, 96,  212, 237, 21,  31,  74,  209,
656        28,  64,  82,  52,  123, 70,  94,  198, 119, 182, 78,  29,  150, 228,
657        49,  5,   196, 215, 62,  9,   133, 232, 65,  105, 159, 137, 180, 93,
658        51,  188, 208, 136, 158, 181, 231, 8,   80,  4,   250, 13,  193, 125,
659        106, 11,  176, 156, 53,  54,  143, 86,  177, 55,  239, 167, 202, 44,
660        238, 226, 187, 221, 15,  134, 178, 244, 216, 99,  114, 207, 102, 38,
661        100, 146, 175, 200, 57,  151, 149, 203, 69,  169, 128, 160, 121, 63,
662        161, 10,  224, 120, 190, 36,  249, 27,  243, 77,  185, 245, 92,  98,
663        254, 165, 18,  101, 145, 170, 195, 39,  174, 76,  252, 95,  130, 248,
664        111, 83,  179, 230, 91,  68,  218, 112, 210, 211, 235, 122, 37,  14,
665        115, 220, 45,  127, 213, 164, 132, 89,  168, 50,  84,  3,   191, 139,
666        157, 154, 194, 205, 67,  201, 142, 34,  153, 117, 26,  71,  241, 144,
667        23,  56,  42,  253,
668    ],
669    [
670        175, 153, 20,  104, 23,  169, 5,   110, 234, 70,  161, 46,  210, 75,
671        254, 174, 133, 225, 237, 118, 88,  59,  224, 68,  111, 69,  143, 87,
672        215, 248, 36,  7,   168, 138, 177, 184, 229, 121, 142, 152, 77,  117,
673        182, 43,  85,  176, 127, 12,  82,  81,  188, 231, 151, 226, 14,  65,
674        228, 206, 38,  211, 204, 124, 180, 19,  22,  191, 157, 27,  9,   49,
675        72,  63,  24,  48,  141, 134, 186, 18,  159, 230, 56,  219, 119, 245,
676        171, 105, 30,  158, 26,  155, 189, 160, 57,  249, 207, 123, 112, 165,
677        251, 131, 154, 29,  95,  172, 192, 200, 6,   67,  92,  106, 144, 255,
678        220, 198, 223, 140, 147, 130, 167, 145, 61,  190, 54,  240, 202, 0,
679        13,  8,   58,  193, 238, 212, 203, 62,  129, 173, 93,  187, 102, 214,
680        45,  47,  32,  40,  178, 170, 185, 205, 78,  218, 103, 99,  16,  21,
681        52,  3,   42,  243, 71,  86,  94,  196, 120, 89,  232, 31,  28,  73,
682        74,  90,  128, 137, 241, 217, 108, 76,  60,  209, 247, 183, 44,  55,
683        125, 79,  4,   156, 233, 239, 216, 235, 98,  11,  15,  132, 181, 163,
684        194, 222, 2,   17,  242, 96,  64,  35,  50,  246, 33,  115, 236, 139,
685        164, 197, 53,  150, 135, 80,  84,  213, 113, 100, 107, 136, 208, 114,
686        97,  166, 83,  25,  41,  66,  109, 10,  122, 1,   51,  91,  37,  250,
687        146, 195, 148, 116, 227, 244, 199, 252, 39,  253, 126, 179, 201, 149,
688        221, 162, 34,  101,
689    ],
690    [
691        10,  243, 251, 143, 29,  186, 72,  113, 185, 127, 94,  13,  47,  220,
692        193, 188, 77,  207, 160, 181, 49,  116, 238, 81,  165, 85,  204, 100,
693        153, 123, 236, 163, 159, 109, 3,   158, 133, 69,  192, 12,  125, 73,
694        48,  215, 247, 245, 103, 146, 219, 168, 30,  52,  40,  120, 218, 101,
695        140, 230, 224, 86,  58,  20,  149, 21,  114, 203, 142, 172, 104, 5,
696        174, 19,  75,  87,  56,  148, 107, 232, 96,  4,   248, 129, 92,  246,
697        183, 249, 170, 57,  214, 226, 150, 198, 144, 175, 110, 179, 233, 83,
698        212, 16,  61,  71,  234, 59,  205, 45,  74,  36,  216, 34,  65,  119,
699        162, 190, 66,  115, 8,   196, 27,  237, 176, 95,  197, 68,  76,  63,
700        108, 189, 97,  223, 187, 222, 79,  173, 199, 126, 253, 89,  42,  156,
701        241, 18,  43,  182, 200, 152, 50,  24,  23,  221, 70,  250, 157, 41,
702        124, 136, 178, 208, 90,  225, 244, 255, 184, 64,  210, 195, 62,  44,
703        145, 78,  84,  242, 28,  130, 93,  213, 155, 132, 60,  154, 161, 25,
704        167, 105, 39,  164, 7,   202, 91,  211, 0,   118, 106, 235, 254, 191,
705        31,  147, 135, 131, 239, 228, 82,  122, 171, 26,  138, 134, 128, 121,
706        33,  53,  54,  169, 88,  112, 55,  6,   117, 102, 252, 2,   206, 17,
707        1,   32,  227, 98,  99,  11,  15,  14,  80,  35,  177, 22,  51,  9,
708        180, 166, 46,  209, 111, 151, 194, 38,  37,  229, 141, 201, 67,  137,
709        240, 139, 231, 217,
710    ]
711);
712
713@apple_tf_DRMS = (
714    [
715        157, 170, 213, 240, 230, 43,  19,  202, 225, 32,  247, 42,  63,  160,
716        132, 182, 233, 244, 228, 187, 104, 245, 198, 140, 46,  231, 72,  16,
717        83,  212, 24,  224, 156, 229, 163, 175, 162, 218, 54,  249, 30,  250,
718        185, 35,  118, 189, 171, 139, 4,   8,   103, 253, 211, 21,  141, 20,
719        165, 128, 146, 243, 114, 2,   93,  242, 10,  74,  84,  121, 34,  3,
720        36,  81,  252, 1,   14,  69,  108, 91,  246, 110, 92,  6,   119, 207,
721        248, 38,  130, 55,  251, 194, 28,  180, 201, 178, 148, 67,  236, 107,
722        22,  222, 147, 142, 18,  123, 197, 59,  190, 78,  125, 109, 127, 186,
723        237, 66,  5,   234, 137, 100, 169, 52,  85,  117, 80,  70,  7,   60,
724        105, 183, 138, 0,   235, 23,  145, 47,  129, 62,  77,  232, 149, 203,
725        172, 12,  68,  181, 73,  255, 133, 53,  40,  45,  15,  150, 82,  90,
726        155, 79,  238, 111, 113, 112, 71,  39,  88,  196, 205, 199, 27,  195,
727        215, 239, 41,  241, 122, 57,  217, 184, 191, 44,  177, 216, 11,  226,
728        65,  50,  76,  95,  158, 136, 159, 210, 254, 134, 151, 98,  61,  89,
729        164, 86,  33,  208, 99,  209, 152, 97,  179, 37,  168, 223, 31,  102,
730        144, 167, 51,  192, 87,  166, 116, 49,  188, 13,  200, 221, 25,  9,
731        64,  153, 219, 154, 94,  214, 204, 131, 220, 26,  75,  29,  227, 161,
732        48,  174, 101, 124, 176, 193, 56,  96,  58,  206, 135, 17,  115, 173,
733        126, 120, 143, 106,
734    ],
735    [
736        79,  114, 199, 94,  3,   36,  212, 117, 193, 121, 182, 76,  32,  137,
737        190, 231, 104, 248, 210, 58,  213, 33,  21,  246, 101, 252, 46,  229,
738        133, 203, 96,  165, 177, 53,  119, 171, 255, 127, 204, 161, 45,  24,
739        184, 111, 34,  55,  61,  168, 202, 200, 169, 20,  142, 245, 150, 19,
740        4,   174, 77,  164, 62,  145, 48,  41,  100, 249, 197, 147, 159, 240,
741        113, 99,  72,  124, 30,  154, 196, 211, 74,  223, 0,   80,  207, 40,
742        185, 17,  37,  81,  15,  110, 148, 152, 160, 106, 85,  130, 225, 22,
743        131, 47,  235, 52,  233, 189, 179, 68,  221, 51,  218, 173, 146, 97,
744        181, 50,  157, 149, 14,  122, 241, 54,  59,  162, 89,  60,  87,  214,
745        39,  134, 69,  5,   250, 139, 216, 11,  56,  31,  198, 155, 129, 67,
746        128, 236, 232, 175, 105, 13,  84,  143, 95,  209, 75,  98,  219, 43,
747        224, 6,   156, 239, 27,  244, 208, 205, 222, 25,  103, 135, 188, 86,
748        26,  228, 220, 2,   215, 8,   153, 186, 115, 191, 195, 194, 243, 237,
749        170, 126, 178, 227, 163, 102, 91,  88,  254, 12,  38,  66,  44,  63,
750        82,  151, 23,  35,  238, 242, 206, 118, 73,  16,  29,  158, 172, 132,
751        42,  57,  138, 247, 234, 166, 176, 125, 116, 141, 107, 49,  78,  1,
752        136, 217, 90,  109, 83,  192, 10,  187, 9,   120, 108, 123, 7,   28,
753        144, 70,  230, 140, 18,  93,  183, 65,  180, 167, 64,  71,  253, 226,
754        201, 251, 92,  112,
755    ],
756    [
757        234, 49,  53,  46,  190, 129, 148, 57,  174, 159, 74,  24,  51,  87,
758        76,  40,  208, 196, 173, 91,  115, 82,  149, 120, 206, 68,  62,  10,
759        204, 209, 79,  253, 108, 188, 214, 104, 243, 36,  164, 160, 21,  230,
760        19,  7,   229, 61,  23,  111, 84,  151, 201, 71,  94,  152, 210, 17,
761        197, 205, 89,  232, 3,   156, 72,  241, 220, 14,  8,   31,  179, 101,
762        110, 213, 216, 116, 75,  170, 70,  222, 227, 142, 73,  6,   48,  167,
763        103, 117, 223, 171, 123, 128, 114, 38,  130, 145, 225, 132, 168, 240,
764        112, 127, 247, 133, 161, 252, 172, 97,  88,  238, 184, 194, 125, 180,
765        249, 66,  106, 9,   99,  203, 144, 33,  29,  195, 69,  22,  126, 176,
766        154, 45,  13,  32,  131, 166, 44,  81,  119, 18,  221, 52,  12,  39,
767        41,  11,  92,  139, 30,  255, 98,  34,  2,   153, 83,  212, 181, 86,
768        100, 239, 236, 85,  27,  54,  141, 102, 250, 182, 163, 147, 96,  215,
769        157, 122, 124, 224, 56,  113, 134, 25,  136, 107, 242, 146, 178, 219,
770        26,  158, 155, 198, 20,  246, 50,  16,  43,  67,  237, 193, 254, 15,
771        140, 95,  1,   42,  105, 137, 218, 60,  187, 231, 47,  217, 202, 162,
772        251, 80,  59,  207, 192, 183, 135, 118, 169, 175, 77,  226, 248, 244,
773        78,  55,  233, 186, 211, 235, 63,  200, 121, 191, 245, 4,   150, 5,
774        109, 189, 143, 0,   185, 28,  37,  93,  35,  199, 90,  165, 138, 65,
775        177, 228, 58,  64,
776    ],
777    [
778        45,  196, 144, 81,  131, 53,  52,  59,  178, 174, 191, 237, 219, 186,
779        109, 125, 247, 235, 19,  106, 1,   165, 95,  221, 38,  63,  117, 83,
780        244, 65,  4,   139, 172, 26,  103, 159, 194, 220, 211, 160, 189, 13,
781        47,  3,   223, 215, 119, 147, 50,  200, 171, 156, 225, 184, 89,  201,
782        169, 222, 78,  175, 255, 98,  15,  182, 116, 213, 10,  249, 66,  21,
783        56,  48,  167, 203, 168, 240, 105, 33,  154, 5,   73,  46,  254, 241,
784        31,  14,  180, 128, 0,   101, 87,  24,  68,  96,  107, 11,  2,   157,
785        40,  250, 121, 236, 227, 140, 60,  64,  239, 115, 177, 179, 207, 246,
786        198, 197, 166, 173, 233, 8,   202, 146, 205, 111, 170, 104, 248, 120,
787        187, 155, 35,  55,  88,  90,  138, 152, 126, 6,   148, 110, 22,  86,
788        145, 124, 224, 84,  62,  242, 39,  228, 135, 51,  85,  232, 226, 41,
789        77,  230, 37,  190, 231, 133, 153, 9,   113, 57,  118, 93,  130, 143,
790        134, 58,  7,   245, 70,  23,  36,  76,  199, 20,  183, 43,  163, 192,
791        136, 185, 92,  209, 72,  195, 204, 97,  251, 216, 44,  214, 149, 34,
792        164, 114, 181, 122, 82,  99,  100, 75,  253, 30,  218, 25,  29,  229,
793        162, 91,  71,  69,  210, 137, 27,  142, 243, 234, 42,  238, 102, 123,
794        17,  193, 28,  151, 217, 252, 80,  61,  212, 54,  176, 94,  79,  18,
795        67,  150, 12,  188, 49,  74,  127, 112, 208, 108, 141, 132, 32,  129,
796        161, 158, 16,  206,
797    ],
798    [
799        240, 230, 183, 118, 16,  224, 217, 82,  219, 153, 156, 157, 5,   126,
800        100, 172, 72,  160, 105, 176, 89,  63,  149, 91,  233, 4,   18,  192,
801        211, 216, 191, 46,  99,  236, 200, 19,  25,  179, 62,  64,  71,  142,
802        237, 202, 108, 28,  54,  234, 181, 50,  162, 39,  167, 141, 81,  229,
803        13,  185, 151, 83,  205, 186, 44,  196, 210, 125, 146, 111, 165, 178,
804        35,  218, 103, 171, 119, 120, 2,   43,  7,   148, 116, 93,  32,  24,
805        56,  232, 169, 70,  33,  241, 137, 253, 6,   98,  94,  128, 154, 96,
806        17,  166, 66,  107, 67,  104, 212, 209, 40,  174, 213, 235, 51,  132,
807        138, 255, 12,  21,  227, 190, 117, 173, 86,  163, 87,  225, 193, 0,
808        244, 27,  243, 135, 139, 215, 187, 246, 97,  75,  80,  175, 206, 76,
809        189, 170, 38,  9,   238, 144, 223, 79,  124, 101, 251, 22,  129, 3,
810        204, 214, 90,  220, 77,  195, 26,  140, 134, 58,  112, 152, 59,  57,
811        68,  95,  245, 222, 41,  11,  31,  55,  113, 102, 208, 45,  85,  250,
812        84,  36,  147, 133, 114, 106, 228, 150, 53,  201, 121, 158, 248, 131,
813        188, 194, 30,  65,  110, 34,  221, 177, 226, 8,   69,  127, 198, 164,
814        254, 109, 123, 14,  74,  61,  92,  161, 115, 88,  252, 231, 15,  155,
815        73,  42,  168, 143, 249, 23,  78,  159, 207, 197, 1,   239, 29,  136,
816        49,  20,  48,  10,  184, 130, 199, 242, 145, 60,  52,  247, 122, 182,
817        180, 47,  37,  203,
818    ],
819    [
820        2,   128, 152, 3,   185, 50,  231, 58,  65,  124, 68,  36,  156, 59,
821        213, 165, 180, 31,  89,  146, 252, 164, 76,  141, 228, 254, 119, 101,
822        183, 48,  159, 212, 5,   86,  225, 221, 9,   195, 30,  20,  78,  81,
823        127, 19,  218, 120, 189, 223, 147, 163, 170, 239, 148, 115, 17,  44,
824        167, 245, 63,  208, 74,  11,  202, 184, 77,  102, 34,  206, 134, 217,
825        16,  246, 149, 140, 109, 25,  190, 151, 186, 236, 69,  53,  203, 153,
826        150, 121, 92,  227, 187, 4,   15,  75,  113, 96,  251, 66,  226, 49,
827        240, 40,  215, 143, 112, 204, 220, 238, 171, 83,  22,  1,   224, 244,
828        234, 47,  242, 194, 41,  229, 26,  166, 100, 7,   211, 118, 80,  255,
829        130, 32,  54,  175, 237, 232, 176, 168, 99,  73,  181, 29,  95,  135,
830        98,  188, 37,  111, 233, 210, 79,  46,  55,  93,  247, 103, 248, 104,
831        137, 169, 154, 88,  117, 21,  198, 173, 33,  132, 230, 178, 14,  38,
832        72,  18,  172, 129, 158, 201, 199, 97,  214, 107, 139, 216, 142, 196,
833        138, 91,  64,  52,  123, 133, 131, 82,  27,  192, 136, 197, 209, 126,
834        12,  191, 56,  243, 193, 110, 174, 6,   235, 253, 177, 61,  122, 42,
835        125, 157, 108, 144, 200, 57,  205, 87,  8,   13,  114, 10,  23,  182,
836        51,  106, 24,  62,  160, 67,  162, 241, 90,  35,  145, 179, 84,  85,
837        28,  250, 116, 161, 94,  155, 71,  39,  222, 60,  43,  70,  105, 207,
838        45,  0,   249, 219,
839    ],
840    [
841        152, 51,  46,  10,  108, 109, 173, 157, 35,  119, 74,  164, 70,  37,
842        254, 174, 147, 183, 62,  99,  165, 248, 205, 145, 59,  223, 21,  246,
843        175, 120, 132, 83,  187, 117, 128, 76,  63,  131, 27,  130, 72,  44,
844        189, 71,  203, 103, 106, 188, 79,  206, 151, 148, 146, 249, 182, 200,
845        167, 125, 141, 49,  234, 38,  242, 171, 22,  111, 34,  8,   82,  96,
846        154, 184, 161, 45,  105, 181, 155, 85,  232, 252, 26,  43,  81,  69,
847        211, 153, 65,  133, 88,  89,  77,  142, 110, 222, 215, 224, 239, 57,
848        0,   13,  66,  235, 9,   127, 163, 243, 238, 162, 75,  41,  11,  54,
849        18,  25,  29,  197, 241, 80,  24,  98,  20,  87,  137, 214, 23,  217,
850        229, 124, 225, 1,   30,  255, 169, 7,   114, 123, 4,   129, 227, 84,
851        28,  210, 190, 50,  55,  101, 126, 247, 3,   186, 236, 115, 170, 212,
852        113, 48,  191, 64,  193, 202, 56,  213, 149, 250, 185, 94,  140, 42,
853        194, 199, 156, 6,   244, 52,  216, 15,  160, 231, 33,  135, 144, 168,
854        228, 97,  92,  172, 245, 104, 209, 220, 68,  230, 195, 180, 138, 118,
855        179, 177, 139, 226, 31,  102, 233, 251, 5,   2,   32,  12,  95,  208,
856        112, 14,  166, 122, 67,  36,  58,  158, 218, 39,  53,  86,  16,  159,
857        107, 93,  192, 221, 207, 91,  237, 240, 198, 121, 196, 134, 73,  116,
858        78,  178, 61,  150, 143, 176, 136, 219, 100, 201, 253, 40,  60,  47,
859        19,  204, 90,  17,
860    ],
861    [
862        17,  92,  106, 71,  15,  76,  148, 14,  184, 69,  182, 145, 165, 189,
863        133, 176, 223, 134, 234, 114, 249, 157, 137, 161, 41,  229, 48,  197,
864        169, 131, 65,  30,  28,  55,  232, 104, 9,   132, 174, 124, 33,  213,
865        73,  190, 45,  151, 250, 116, 154, 105, 158, 218, 98,  81,  27,  89,
866        42,  153, 253, 24,  150, 96,  110, 200, 163, 143, 225, 85,  52,  1,
867        102, 83,  181, 94,  144, 29,  77,  123, 128, 79,  7,   167, 117, 100,
868        194, 224, 210, 59,  171, 46,  62,  173, 159, 78,  51,  139, 187, 162,
869        84,  11,  245, 72,  236, 152, 179, 108, 149, 64,  178, 99,  103, 129,
870        109, 140, 192, 34,  227, 66,  240, 217, 204, 220, 57,  31,  122, 47,
871        22,  246, 135, 39,  40,  2,   199, 231, 146, 3,   10,  58,  203, 242,
872        243, 170, 18,  138, 172, 130, 191, 255, 221, 119, 202, 82,  118, 198,
873        97,  87,  86,  75,  25,  209, 37,  16,  248, 20,  141, 80,  193, 74,
874        188, 201, 8,   19,  251, 233, 32,  70,  147, 212, 126, 208, 230, 196,
875        219, 237, 186, 4,   120, 43,  26,  50,  35,  23,  244, 222, 0,   226,
876        211, 53,  155, 254, 205, 195, 56,  91,  164, 241, 206, 160, 107, 115,
877        235, 185, 38,  125, 13,  61,  238, 63,  111, 112, 252, 239, 90,  175,
878        183, 101, 156, 67,  214, 121, 177, 168, 180, 54,  127, 207, 166, 228,
879        68,  93,  44,  215, 142, 88,  49,  60,  113, 21,  36,  6,   216, 136,
880        247, 95,  12,  5,
881    ],
882    [
883        213, 255, 153, 71,  239, 226, 145, 120, 124, 97,  233, 245, 121, 177,
884        212, 85,  218, 112, 251, 180, 225, 73,  42,  94,  221, 95,  27,  47,
885        205, 165, 111, 98,  247, 183, 2,   141, 56,  93,  129, 198, 31,  119,
886        7,   248, 211, 184, 171, 250, 249, 66,  26,  9,   38,  133, 96,  228,
887        53,  237, 122, 50,  105, 37,  139, 11,  219, 104, 126, 68,  18,  147,
888        25,  206, 240, 82,  158, 170, 178, 227, 234, 163, 3,   208, 216, 176,
889        203, 92,  217, 128, 229, 109, 181, 215, 182, 114, 156, 75,  10,  241,
890        244, 6,   34,  54,  232, 19,  209, 134, 195, 21,  159, 1,   67,  155,
891        102, 46,  152, 90,  99,  74,  231, 35,  107, 58,  61,  127, 236, 235,
892        220, 57,  254, 138, 223, 91,  191, 117, 130, 169, 62,  188, 36,  40,
893        246, 115, 135, 199, 81,  100, 200, 230, 146, 150, 45,  222, 157, 72,
894        43,  15,  83,  214, 197, 175, 39,  5,   193, 78,  161, 185, 55,  137,
895        101, 253, 87,  194, 166, 252, 210, 154, 88,  41,  84,  140, 201, 143,
896        204, 60,  44,  123, 142, 192, 190, 187, 202, 80,  12,  13,  29,  89,
897        33,  172, 242, 125, 160, 28,  76,  23,  64,  103, 52,  69,  113, 136,
898        189, 167, 174, 164, 16,  168, 22,  24,  108, 59,  30,  32,  106, 79,
899        173, 162, 224, 77,  86,  148, 63,  116, 179, 131, 238, 8,   48,  14,
900        149, 65,  144, 20,  243, 196, 151, 118, 186, 110, 4,   207, 70,  51,
901        49,  0,   17,  132,
902    ],
903    [
904        195, 179, 81,  140, 48,  69,  167, 183, 86,  26,  24,  161, 231, 2,
905        219, 133, 254, 114, 240, 230, 128, 27,  163, 165, 82,  221, 17,  97,
906        202, 95,  223, 182, 215, 246, 136, 15,  217, 113, 229, 177, 243, 239,
907        242, 213, 91,  11,  210, 204, 160, 12,  200, 63,  252, 116, 33,  45,
908        147, 52,  3,   170, 162, 249, 1,   4,   255, 209, 212, 85,  174, 236,
909        184, 18,  164, 145, 110, 238, 55,  60,  218, 74,  67,  234, 20,  31,
910        0,   137, 142, 130, 253, 157, 192, 155, 190, 108, 84,  14,  54,  40,
911        197, 92,  65,  119, 43,  208, 152, 94,  191, 189, 214, 25,  104, 80,
912        153, 211, 76,  10,  90,  44,  149, 154, 121, 41,  247, 34,  58,  194,
913        127, 206, 241, 22,  169, 248, 98,  88,  146, 46,  175, 102, 109, 68,
914        132, 126, 50,  232, 235, 158, 135, 225, 101, 237, 23,  37,  13,  32,
915        185, 61,  173, 99,  47,  7,   233, 205, 59,  123, 77,  124, 39,  6,
916        251, 49,  199, 115, 181, 62,  56,  203, 66,  19,  228, 207, 138, 78,
917        141, 166, 122, 111, 73,  151, 134, 112, 87,  53,  72,  156, 226, 148,
918        159, 89,  178, 196, 75,  139, 5,   168, 8,   9,   21,  188, 131, 28,
919        16,  103, 176, 150, 96,  172, 180, 227, 117, 144, 79,  57,  143, 107,
920        105, 93,  51,  245, 220, 186, 38,  35,  193, 64,  42,  201, 71,  120,
921        216, 244, 198, 171, 83,  70,  250, 125, 129, 36,  118, 100, 222, 106,
922        187, 30,  224, 29,
923    ],
924    [
925        122, 103, 120, 2,   33,  215, 203, 170, 76,  174, 61,  232, 183, 60,
926        42,  82,  137, 84,  246, 96,  223, 62,  55,  228, 48,  193, 151, 123,
927        133, 64,  6,   58,  30,  87,  16,  191, 105, 218, 165, 239, 107, 97,
928        206, 19,  175, 126, 116, 187, 222, 69,  237, 88,  135, 98,  238, 155,
929        171, 247, 91,  149, 66,  169, 93,  241, 44,  160, 54,  0,   176, 113,
930        75,  125, 202, 4,   45,  199, 121, 118, 8,   94,  51,  12,  147, 243,
931        73,  15,  65,  31,  146, 158, 159, 225, 46,  28,  86,  13,  172, 140,
932        251, 230, 26,  185, 161, 21,  178, 106, 198, 144, 108, 85,  227, 119,
933        109, 49,  217, 67,  205, 81,  102, 139, 134, 29,  233, 209, 71,  131,
934        186, 130, 14,  250, 40,  92,  179, 212, 127, 34,  25,  214, 150, 167,
935        7,   95,  195, 182, 240, 52,  37,  77,  138, 156, 115, 22,  90,  111,
936        63,  79,  249, 18,  245, 190, 173, 177, 197, 236, 252, 216, 57,  201,
937        10,  80,  229, 89,  180, 196, 74,  9,   213, 153, 157, 117, 100, 253,
938        208, 78,  56,  11,  224, 184, 143, 39,  124, 242, 168, 38,  59,  41,
939        235, 23,  164, 43,  83,  136, 145, 112, 53,  194, 110, 254, 1,   5,
940        181, 221, 207, 162, 204, 72,  104, 99,  101, 154, 210, 152, 129, 255,
941        244, 141, 163, 220, 20,  50,  192, 36,  219, 47,  24,  211, 188, 142,
942        70,  231, 3,   68,  226, 148, 234, 132, 17,  248, 200, 32,  27,  166,
943        35,  128, 114, 189,
944    ],
945    [
946        59,  55,  181, 60,  64,  203, 17,  19,  4,   100, 248, 43,  96,  148,
947        38,  173, 91,  182, 110, 141, 13,  87,  193, 134, 185, 40,  174, 68,
948        168, 10,  66,  81,  71,  241, 57,  105, 90,  254, 221, 124, 192, 200,
949        160, 218, 189, 121, 247, 27,  42,  99,  226, 191, 210, 211, 177, 135,
950        30,  48,  164, 97,  8,   5,   183, 33,  171, 11,  122, 21,  46,  94,
951        18,  41,  109, 147, 49,  229, 154, 9,   178, 236, 239, 184, 116, 199,
952        132, 88,  216, 194, 54,  227, 86,  80,  158, 67,  228, 25,  166, 22,
953        215, 212, 39,  136, 157, 152, 198, 85,  83,  172, 7,   26,  204, 61,
954        34,  225, 169, 65,  126, 220, 98,  250, 156, 235, 159, 240, 69,  77,
955        186, 107, 79,  31,  252, 104, 155, 29,  75,  78,  20,  163, 133, 249,
956        84,  3,   139, 108, 230, 103, 222, 76,  12,  93,  195, 50,  35,  162,
957        117, 52,  58,  232, 47,  245, 234, 202, 89,  246, 196, 112, 170, 62,
958        201, 131, 238, 111, 53,  56,  253, 114, 140, 231, 153, 118, 180, 28,
959        143, 73,  37,  72,  237, 190, 208, 150, 179, 244, 197, 146, 206, 113,
960        217, 142, 224, 138, 92,  74,  119, 63,  137, 32,  255, 125, 24,  82,
961        144, 0,   102, 161, 149, 129, 151, 123, 95,  188, 242, 214, 223, 70,
962        187, 2,   14,  120, 36,  16,  15,  128, 207, 6,   44,  106, 127, 45,
963        167, 101, 1,   205, 251, 130, 51,  209, 243, 115, 165, 219, 175, 213,
964        145, 233, 176, 23,
965    ],
966    [
967        251, 31,  207, 102, 22,  224, 76,  54,  108, 41,  70,  242, 104, 120,
968        160, 98,  221, 48,  131, 121, 93,  79,  223, 141, 219, 177, 149, 36,
969        71,  17,  243, 62,  164, 97,  56,  6,   55,  103, 234, 241, 38,  186,
970        53,  45,  231, 25,  193, 172, 250, 27,  96,  249, 208, 2,   167, 145,
971        125, 150, 142, 137, 99,  138, 248, 205, 80,  12,  107, 240, 105, 201,
972        85,  106, 86,  40,  34,  73,  196, 128, 52,  130, 140, 233, 153, 65,
973        78,  47,  163, 44,  229, 169, 132, 174, 162, 21,  23,  225, 237, 109,
974        139, 188, 58,  214, 143, 4,   7,   16,  67,  32,  185, 147, 89,  61,
975        91,  247, 175, 14,  244, 90,  230, 181, 228, 220, 18,  178, 19,  37,
976        113, 134, 235, 171, 168, 253, 199, 15,  66,  77,  211, 226, 83,  95,
977        239, 254, 69,  24,  115, 42,  64,  245, 135, 10,  92,  206, 116, 51,
978        192, 252, 9,   82,  203, 100, 212, 28,  176, 127, 200, 60,  26,  46,
979        33,  94,  72,  173, 119, 43,  101, 110, 213, 136, 222, 122, 155, 59,
980        20,  146, 232, 0,   81,  50,  216, 148, 183, 154, 210, 152, 227, 35,
981        187, 112, 118, 88,  3,   170, 1,   114, 158, 39,  191, 184, 124, 218,
982        215, 182, 166, 133, 49,  194, 117, 159, 126, 202, 63,  11,  29,  75,
983        8,   156, 68,  123, 30,  111, 5,   189, 84,  204, 157, 190, 13,  197,
984        144, 57,  255, 151, 236, 165, 238, 217, 209, 161, 87,  246, 180, 179,
985        198, 74,  195, 129,
986    ],
987    [
988        216, 20,  160, 73,  253, 2,   47,  246, 49,  159, 12,  76,  100, 69,
989        105, 213, 0,   113, 143, 85,  94,  64,  180, 174, 40,  184, 254, 166,
990        83,  17,  252, 203, 68,  16,  212, 13,  1,   206, 151, 177, 35,  176,
991        175, 54,  56,  89,  31,  157, 240, 61,  59,  104, 186, 15,  82,  164,
992        133, 210, 72,  167, 170, 250, 226, 62,  232, 245, 9,   211, 130, 162,
993        101, 168, 43,  75,  219, 197, 185, 200, 191, 107, 215, 14,  91,  205,
994        63,  50,  96,  21,  58,  207, 106, 209, 111, 172, 204, 178, 224, 169,
995        214, 201, 255, 229, 29,  146, 145, 22,  165, 150, 7,   27,  99,  87,
996        41,  19,  26,  188, 92,  46,  81,  52,  51,  225, 187, 117, 93,  241,
997        28,  228, 251, 235, 182, 227, 98,  67,  115, 221, 244, 102, 142, 114,
998        116, 153, 4,   34,  33,  218, 6,   5,   154, 161, 42,  152, 132, 192,
999        247, 23,  121, 70,  148, 48,  238, 103, 39,  144, 11,  230, 84,  136,
1000        198, 60,  128, 38,  122, 208, 45,  149, 119, 202, 127, 53,  24,  118,
1001        36,  66,  195, 135, 141, 222, 179, 171, 239, 88,  110, 220, 44,  234,
1002        80,  125, 112, 37,  139, 134, 126, 183, 190, 131, 86,  10,  173, 147,
1003        78,  193, 248, 231, 8,   25,  140, 129, 95,  223, 236, 77,  18,  32,
1004        237, 249, 156, 243, 79,  196, 109, 155, 124, 137, 57,  217, 3,   97,
1005        158, 199, 120, 55,  30,  242, 65,  163, 194, 108, 90,  138, 123, 71,
1006        233, 189, 181, 74,
1007    ],
1008    [
1009        46,  125, 92,  69,  40,  159, 217, 37,  43,  186, 19,  250, 247, 16,
1010        205, 50,  156, 103, 68,  187, 132, 184, 70,  11,  130, 163, 200, 74,
1011        105, 89,  44,  248, 77,  212, 143, 101, 98,  39,  241, 53,  116, 29,
1012        84,  166, 1,   14,  23,  237, 177, 196, 85,  142, 236, 6,   65,  88,
1013        73,  117, 128, 172, 102, 213, 90,  233, 180, 118, 107, 9,   173, 157,
1014        195, 144, 160, 15,  243, 71,  136, 227, 152, 87,  232, 223, 216, 79,
1015        140, 182, 104, 194, 149, 168, 100, 93,  191, 120, 228, 175, 51,  218,
1016        34,  58,  208, 78,  48,  28,  226, 75,  113, 17,  225, 192, 244, 246,
1017        134, 253, 82,  60,  176, 52,  170, 126, 167, 30,  178, 8,   5,   188,
1018        121, 4,   135, 235, 10,  183, 59,  252, 27,  31,  76,  179, 254, 45,
1019        222, 220, 138, 99,  122, 209, 41,  202, 238, 33,  197, 147, 131, 38,
1020        171, 239, 26,  215, 127, 63,  169, 21,  151, 111, 207, 106, 229, 129,
1021        133, 20,  83,  2,   193, 112, 13,  139, 124, 119, 49,  245, 12,  95,
1022        7,   224, 62,  240, 249, 55,  109, 36,  206, 198, 108, 148, 165, 203,
1023        61,  137, 96,  22,  164, 189, 158, 35,  153, 97,  154, 242, 86,  24,
1024        221, 91,  115, 3,   94,  72,  201, 161, 42,  123, 255, 64,  230, 204,
1025        150, 251, 146, 210, 162, 114, 190, 185, 66,  25,  67,  234, 145, 54,
1026        110, 56,  81,  32,  155, 219, 174, 0,   214, 47,  57,  181, 211, 18,
1027        231, 141, 199, 80,
1028    ],
1029    [
1030        55,  223, 107, 214, 197, 109, 99,  16,  239, 155, 33,  188, 217, 96,
1031        241, 69,  4,   52,  122, 208, 179, 92,  141, 64,  173, 160, 63,  50,
1032        86,  162, 201, 46,  0,   140, 98,  85,  71,  75,  175, 195, 41,  167,
1033        60,  131, 249, 245, 135, 228, 9,   56,  84,  58,  221, 205, 233, 77,
1034        13,  111, 49,  161, 152, 8,   32,  19,  82,  106, 231, 229, 235, 67,
1035        171, 124, 150, 80,  35,  73,  7,   242, 66,  211, 236, 114, 250, 27,
1036        51,  100, 14,  207, 1,   237, 138, 15,  157, 213, 72,  137, 209, 177,
1037        128, 47,  230, 108, 43,  119, 42,  127, 248, 144, 110, 24,  168, 74,
1038        54,  65,  184, 17,  206, 218, 104, 199, 253, 97,  11,  181, 126, 102,
1039        191, 225, 18,  254, 133, 81,  23,  232, 129, 26,  227, 186, 12,  244,
1040        243, 22,  2,   123, 185, 76,  154, 120, 178, 174, 116, 238, 89,  37,
1041        193, 117, 166, 203, 31,  222, 40,  25,  148, 79,  240, 113, 134, 83,
1042        251, 139, 164, 130, 44,  48,  101, 61,  182, 255, 147, 53,  183, 210,
1043        192, 190, 39,  59,  176, 158, 95,  115, 216, 94,  196, 34,  172, 118,
1044        136, 88,  5,   252, 28,  151, 156, 112, 146, 247, 165, 93,  21,  163,
1045        215, 234, 212, 202, 194, 20,  159, 87,  200, 170, 125, 70,  38,  180,
1046        224, 132, 45,  62,  143, 121, 105, 226, 149, 246, 91,  30,  145, 142,
1047        90,  103, 220, 3,   189, 219, 78,  57,  10,  204, 153, 187, 169, 29,
1048        198, 36,  68,  6,
1049    ],
1050);
1051
1052#----------  lookup tables for veggie tales crypto -------------#
1053
1054%veggies = (
1055    carrot => [ 113, 28 ],
1056    celery => [ 235, 135 ],
1057    fennel => [ 197, 217 ],
1058    garlic => [ 197, 240 ],
1059    peanut => [ 103, 109 ],
1060    potato => [ 55,  250 ],
1061    radish => [ 155, 70 ],
1062    squash => [ 249, 74 ],
1063    tomato => [ 23,  239 ],
1064    turnip => [ 239, 4 ],
1065    pepcid => [ 231, 153 ],    # not a real veggie, therein lies a tale
1066);
1067
1068# 4096 byte table
1069@planter_table = (
1070    210, 245, 177, 209, 93,  29,  141, 138, 162, 14,  70,  204, 5,   253,
1071    2,   28,  251, 51,  81,  115, 50,  110, 250, 167, 255, 195, 241, 65,
1072    8,   139, 242, 236, 113, 72,  107, 0,   32,  85,  198, 132, 127, 38,
1073    230, 73,  172, 225, 82,  17,  171, 21,  202, 170, 48,  125, 120, 67,
1074    159, 121, 131, 156, 114, 47,  66,  239, 89,  160, 183, 122, 146, 190,
1075    104, 154, 134, 105, 192, 10,  39,  232, 49,  83,  228, 108, 116, 74,
1076    235, 151, 194, 22,  33,  133, 52,  27,  244, 174, 35,  91,  3,   103,
1077    135, 80,  130, 178, 30,  191, 203, 237, 64,  180, 211, 20,  161, 112,
1078    119, 79,  247, 212, 164, 199, 186, 143, 173, 168, 185, 24,  84,  166,
1079    252, 36,  106, 7,   31,  90,  53,  176, 61,  254, 23,  99,  100, 109,
1080    62,  140, 102, 87,  34,  95,  157, 163, 220, 42,  11,  19,  249, 25,
1081    136, 226, 165, 181, 196, 152, 137, 76,  207, 200, 96,  12,  215, 213,
1082    18,  231, 63,  78,  15,  188, 234, 55,  37,  46,  58,  184, 1,   92,
1083    60,  187, 9,   44,  71,  13,  153, 148, 246, 224, 169, 205, 69,  147,
1084    123, 214, 26,  155, 45,  43,  41,  68,  189, 118, 217, 216, 223, 238,
1085    6,   101, 175, 221, 218, 59,  233, 222, 57,  201, 193, 117, 144, 98,
1086    54,  248, 142, 243, 111, 182, 158, 229, 129, 179, 219, 75,  94,  97,
1087    124, 197, 206, 240, 16,  227, 208, 126, 149, 4,   128, 56,  150, 88,
1088    77,  40,  145, 86,  198, 3,   199, 167, 155, 219, 107, 14,  246, 10,
1089    210, 12,  243, 251, 150, 188, 189, 133, 39,  69,  102, 170, 158, 145,
1090    57,  245, 135, 55,  80,  45,  166, 236, 7,   16,  77,  88,  56,  163,
1091    82,  84,  185, 242, 50,  47,  44,  151, 70,  103, 13,  227, 206, 238,
1092    40,  123, 224, 117, 153, 255, 53,  60,  38,  9,   86,  73,  31,  184,
1093    129, 30,  6,   90,  240, 254, 146, 15,  152, 142, 17,  112, 71,  101,
1094    244, 108, 100, 78,  205, 161, 214, 2,   87,  115, 164, 157, 228, 106,
1095    149, 93,  181, 209, 177, 8,   22,  230, 250, 121, 237, 11,  24,  36,
1096    229, 196, 215, 232, 193, 233, 65,  4,   52,  113, 222, 169, 75,  176,
1097    191, 64,  132, 114, 220, 180, 46,  49,  25,  62,  195, 168, 187, 26,
1098    33,  85,  116, 139, 218, 76,  178, 225, 118, 217, 91,  21,  252, 110,
1099    173, 165, 127, 95,  208, 182, 83,  67,  20,  192, 239, 140, 105, 144,
1100    248, 204, 97,  35,  134, 81,  249, 202, 41,  28,  174, 1,   211, 234,
1101    94,  160, 119, 124, 156, 253, 111, 172, 241, 235, 223, 68,  34,  120,
1102    207, 43,  179, 37,  61,  66,  126, 29,  203, 141, 79,  148, 59,  162,
1103    159, 128, 89,  42,  18,  147, 137, 27,  190, 125, 143, 58,  63,  175,
1104    183, 131, 200, 54,  226, 96,  138, 197, 201, 98,  122, 19,  247, 5,
1105    221, 109, 186, 23,  92,  51,  74,  104, 72,  213, 136, 154, 99,  212,
1106    216, 32,  130, 0,   171, 48,  231, 194, 232, 111, 251, 155, 183, 119,
1107    39,  64,  120, 244, 204, 26,  63,  215, 88,  42,  61,  21,  27,  85,
1108    200, 212, 240, 249, 113, 101, 59,  75,  38,  141, 136, 186, 187, 102,
1109    237, 190, 94,  79,  76,  114, 241, 44,  236, 179, 122, 107, 104, 219,
1110    45,  15,  128, 224, 46,  87,  214, 229, 145, 35,  37,  170, 8,   225,
1111    152, 161, 131, 222, 201, 112, 168, 228, 6,   16,  12,  83,  126, 192,
1112    121, 134, 123, 181, 82,  58,  162, 0,   109, 41,  24,  92,  171, 191,
1113    98,  221, 34,  20,  69,  29,  165, 185, 89,  206, 216, 72,  196, 49,
1114    205, 7,   254, 226, 53,  194, 43,  110, 137, 129, 9,   130, 18,  153,
1115    176, 193, 199, 70,  99,  246, 2,   172, 138, 146, 160, 217, 17,  208,
1116    175, 174, 23,  36,  169, 133, 210, 135, 100, 218, 108, 233, 248, 81,
1117    247, 197, 234, 96,  13,  117, 163, 67,  166, 184, 95,  47,  178, 118,
1118    243, 154, 1,   230, 158, 90,  105, 207, 40,  57,  177, 52,  65,  74,
1119    32,  73,  223, 148, 48,  22,  11,  106, 202, 253, 115, 250, 25,  167,
1120    195, 66,  188, 30,  147, 103, 127, 245, 189, 28,  144, 93,  71,  173,
1121    19,  50,  151, 60,  3,   182, 209, 84,  140, 31,  97,  55,  80,  125,
1122    211, 132, 227, 51,  203, 239, 14,  56,  252, 86,  116, 213, 33,  124,
1123    68,  159, 139, 149, 157, 77,  4,   235, 10,  255, 180, 238, 142, 5,
1124    78,  164, 143, 242, 62,  150, 220, 54,  231, 198, 91,  156, 104, 187,
1125    55,  87,  163, 99,  211, 160, 56,  100, 28,  2,   203, 67,  152, 82,
1126    33,  217, 215, 25,  200, 196, 16,  141, 101, 105, 119, 199, 254, 177,
1127    136, 34,  247, 62,  145, 118, 150, 27,  156, 58,  229, 252, 188, 79,
1128    226, 103, 232, 151, 209, 219, 224, 192, 166, 195, 110, 233, 5,   127,
1129    41,  210, 8,   149, 216, 85,  95,  22,  157, 144, 40,  20,  94,  176,
1130    92,  111, 54,  32,  13,  222, 183, 249, 154, 162, 42,  96,  17,  125,
1131    88,  236, 167, 75,  234, 65,  170, 4,   201, 129, 169, 77,  109, 198,
1132    24,  72,  116, 37,  241, 51,  182, 106, 121, 202, 39,  230, 93,  181,
1133    221, 138, 90,  173, 208, 245, 243, 158, 191, 14,  10,  124, 50,  218,
1134    128, 237, 133, 112, 251, 38,  131, 84,  253, 9,   26,  179, 148, 194,
1135    60,  61,  184, 197, 227, 73,  18,  64,  49,  185, 255, 31,  126, 120,
1136    107, 123, 122, 142, 143, 130, 53,  190, 214, 66,  189, 155, 168, 205,
1137    165, 164, 117, 242, 0,   29,  235, 132, 80,  174, 135, 146, 114, 225,
1138    15,  98,  45,  83,  159, 74,  204, 86,  175, 19,  11,  57,  161, 172,
1139    48,  193, 115, 81,  47,  250, 3,   76,  223, 206, 69,  68,  220, 43,
1140    21,  35,  240, 97,  239, 52,  63,  207, 71,  59,  6,   248, 12,  238,
1141    228, 153, 213, 140, 244, 171, 7,   89,  1,   113, 180, 231, 178, 139,
1142    36,  102, 134, 137, 70,  212, 91,  186, 246, 46,  108, 78,  147, 30,
1143    23,  44,  212, 27,  167, 71,  99,  35,  211, 44,  100, 224, 184, 134,
1144    235, 131, 68,  150, 105, 65,  199, 129, 180, 192, 220, 37,  157, 145,
1145    231, 247, 146, 185, 116, 38,  103, 210, 25,  42,  202, 251, 56,  222,
1146    29,  24,  216, 95,  230, 23,  84,  135, 89,  187, 108, 204, 154, 3,
1147    66,  17,  189, 207, 81,  22,  244, 13,  132, 205, 47,  74,  245, 92,
1148    148, 208, 114, 252, 248, 255, 234, 172, 165, 242, 39,  225, 190, 166,
1149    14,  236, 153, 85,  4,   72,  87,  107, 206, 9,   142, 0,   113, 73,
1150    209, 229, 133, 58,  196, 52,  176, 93,  249, 179, 106, 78,  97,  46,
1151    215, 218, 181, 173, 53,  238, 126, 197, 156, 237, 115, 178, 15,  98,
1152    110, 152, 246, 254, 140, 5,   61,  188, 91,  26,  195, 16,  213, 177,
1153    62,  51,  80,  70,  88,  21,  228, 125, 163, 241, 86,  76,  57,  161,
1154    79,  239, 18,  164, 11,  219, 30,  226, 159, 6,   45,  82,  10,  198,
1155    149, 123, 20,  101, 221, 32,  109, 182, 12,  117, 139, 128, 28,  130,
1156    183, 214, 54,  41,  31,  102, 69,  83,  111, 174, 168, 138, 63,  19,
1157    43,  33,  233, 8,   124, 137, 243, 217, 191, 158, 67,  40,  175, 34,
1158    253, 64,  120, 203, 141, 227, 60,  169, 127, 112, 143, 223, 119, 155,
1159    122, 36,  232, 194, 96,  1,   77,  104, 48,  75,  55,  193, 201, 121,
1160    240, 151, 118, 171, 160, 90,  250, 49,  186, 144, 59,  94,  170, 2,
1161    200, 162, 147, 50,  7,   136, 231, 104, 124, 220, 224, 32,  240, 207,
1162    215, 123, 227, 165, 24,  192, 247, 21,  170, 18,  92,  210, 7,   155,
1163    159, 14,  214, 66,  60,  172, 57,  218, 71,  5,   188, 249, 122, 225,
1164    65,  136, 99,  141, 86,  131, 195, 4,   69,  140, 103, 156, 58,  200,
1165    143, 47,  241, 64,  9,   194, 182, 20,  130, 149, 199, 230, 183, 38,
1166    180, 193, 190, 31,  39,  11,  89,  127, 163, 100, 33,  79,  142, 217,
1167    252, 114, 173, 133, 221, 15,  250, 94,  55,  211, 76,  152, 29,  10,
1168    93,  91,  98,  202, 2,   78,  174, 81,  119, 135, 43,  22,  154, 16,
1169    161, 157, 242, 189, 204, 177, 254, 70,  126, 253, 237, 110, 223, 6,
1170    80,  25,  212, 233, 125, 3,   181, 109, 111, 46,  54,  191, 40,  113,
1171    128, 203, 222, 34,  45,  144, 139, 229, 67,  158, 87,  246, 160, 226,
1172    85,  175, 90,  178, 148, 244, 185, 151, 248, 168, 77,  105, 196, 37,
1173    198, 121, 1,   101, 30,  8,   167, 206, 150, 59,  134, 245, 239, 62,
1174    120, 219, 95,  201, 236, 213, 117, 234, 68,  197, 238, 112, 116, 61,
1175    115, 129, 36,  176, 216, 50,  42,  19,  255, 138, 208, 186, 164, 205,
1176    0,   243, 52,  41,  118, 27,  35,  56,  102, 96,  63,  106, 228, 107,
1177    84,  132, 44,  232, 17,  23,  51,  137, 251, 82,  166, 179, 171, 184,
1178    108, 146, 74,  26,  235, 12,  53,  88,  187, 49,  145, 162, 209, 75,
1179    72,  13,  97,  73,  83,  169, 48,  153, 28,  147, 159, 210, 206, 238,
1180    186, 122, 234, 215, 111, 27,  211, 121, 226, 90,  207, 201, 248, 176,
1181    110, 240, 255, 123, 71,  228, 188, 64,  14,  94,  245, 136, 191, 153,
1182    142, 53,  104, 109, 141, 50,  83,  177, 60,  179, 115, 230, 89,  254,
1183    31,  46,  168, 242, 23,  247, 157, 218, 101, 192, 92,  22,  0,   73,
1184    63,  236, 15,  172, 246, 13,  244, 199, 95,  203, 85,  231, 19,  6,
1185    45,  87,  100, 213, 78,  208, 17,  25,  161, 151, 232, 212, 143, 163,
1186    62,  98,  97,  24,  33,  187, 160, 88,  128, 164, 196, 189, 79,  127,
1187    43,  124, 200, 74,  173, 225, 80,  65,  190, 221, 180, 12,  52,  1,
1188    209, 4,   7,   76,  10,  149, 86,  5,   129, 51,  169, 81,  183, 68,
1189    220, 167, 18,  29,  154, 11,  84,  224, 145, 202, 75,  57,  243, 148,
1190    239, 28,  250, 32,  137, 119, 8,   144, 150, 182, 117, 175, 130, 146,
1191    241, 133, 38,  249, 140, 181, 205, 185, 20,  178, 223, 36,  252, 91,
1192    204, 105, 55,  116, 2,   59,  135, 165, 30,  9,   233, 184, 166, 217,
1193    132, 106, 54,  193, 131, 77,  70,  42,  34,  16,  120, 99,  103, 152,
1194    138, 40,  198, 113, 26,  3,   118, 197, 156, 251, 147, 66,  108, 58,
1195    39,  56,  134, 235, 214, 102, 222, 82,  253, 47,  195, 229, 155, 112,
1196    44,  67,  171, 194, 158, 48,  216, 72,  107, 126, 41,  162, 219, 93,
1197    125, 96,  61,  139, 114, 49,  237, 37,  35,  69,  170, 21,  174, 227,
1198    221, 0,   188, 220, 104, 40,  152, 149, 173, 25,  81,  215, 16,  8,
1199    13,  39,  6,   62,  92,  126, 61,  121, 5,   178, 10,  206, 252, 76,
1200    19,  150, 253, 247, 124, 83,  118, 11,  43,  96,  209, 143, 138, 49,
1201    241, 84,  183, 236, 93,  28,  182, 32,  213, 181, 59,  136, 131, 78,
1202    170, 132, 142, 167, 125, 58,  77,  250, 100, 171, 194, 133, 157, 201,
1203    115, 165, 145, 116, 203, 21,  50,  243, 60,  94,  239, 119, 127, 85,
1204    246, 162, 205, 33,  44,  144, 63,  38,  255, 185, 46,  102, 14,  114,
1205    146, 91,  141, 189, 41,  202, 214, 248, 75,  191, 222, 31,  172, 123,
1206    130, 90,  2,   223, 175, 210, 197, 154, 184, 179, 196, 35,  95,  177,
1207    7,   47,  117, 18,  42,  101, 64,  187, 72,  9,   34,  110, 111, 120,
1208    73,  151, 113, 98,  45,  106, 168, 174, 231, 53,  22,  30,  4,   36,
1209    147, 237, 176, 192, 207, 163, 148, 87,  218, 211, 107, 23,  226, 224,
1210    29,  242, 74,  89,  26,  199, 245, 66,  48,  57,  69,  195, 12,  103,
1211    71,  198, 20,  55,  82,  24,  164, 159, 1,   235, 180, 216, 80,  158,
1212    134, 225, 37,  166, 56,  54,  52,  79,  200, 129, 228, 227, 234, 249,
1213    17,  112, 186, 232, 229, 70,  244, 233, 68,  212, 204, 128, 155, 109,
1214    65,  3,   153, 254, 122, 193, 169, 240, 140, 190, 230, 86,  105, 108,
1215    135, 208, 217, 251, 27,  238, 219, 137, 160, 15,  139, 67,  161, 99,
1216    88,  51,  156, 97,  138, 21,  241, 17,  61,  253, 237, 130, 218, 230,
1217    94,  180, 165, 221, 58,  132, 235, 99,  145, 163, 234, 70,  114, 55,
1218    207, 115, 49,  1,   16,  251, 170, 212, 177, 80,  219, 72,  104, 117,
1219    222, 172, 79,  62,  254, 201, 148, 161, 10,  81,  27,  53,  194, 162,
1220    248, 93,  0,   243, 111, 121, 51,  4,   42,  127, 122, 63,  89,  232,
1221    199, 242, 74,  22,  112, 18,  158, 233, 8,   2,   183, 240, 113, 131,
1222    12,  84,  28,  66,  91,  167, 250, 174, 225, 37,  220, 11,  156, 134,
1223    211, 75,  179, 247, 23,  24,  186, 106, 118, 143, 59,  77,  136, 92,
1224    3,   188, 97,  56,  135, 159, 7,   124, 204, 87,  50,  223, 13,  176,
1225    185, 160, 252, 190, 100, 76,  98,  151, 239, 210, 85,  120, 29,  86,
1226    39,  19,  140, 205, 150, 116, 126, 103, 90,  47,  125, 83,  68,  34,
1227    123, 67,  249, 25,  144, 26,  69,  213, 236, 32,  9,   52,  31,  208,
1228    168, 244, 231, 245, 202, 119, 15,  38,  95,  36,  226, 71,  197, 6,
1229    178, 64,  193, 196, 164, 171, 137, 20,  215, 109, 153, 60,  142, 40,
1230    41,  45,  229, 195, 107, 110, 146, 139, 141, 155, 169, 108, 157, 14,
1231    217, 96,  175, 198, 30,  5,   255, 189, 82,  43,  105, 54,  57,  73,
1232    129, 149, 88,  154, 206, 128, 102, 35,  191, 78,  246, 133, 65,  227,
1233    203, 187, 182, 33,  228, 101, 166, 184, 216, 147, 152, 214, 181, 44,
1234    200, 192, 46,  224, 173, 48,  209, 238, 238, 17,  205, 237, 121, 57,
1235    169, 166, 190, 42,  98,  232, 33,  25,  30,  56,  23,  79,  109, 143,
1236    78,  138, 22,  195, 27,  223, 13,  93,  36,  167, 14,  8,   141, 100,
1237    135, 28,  60,  113, 226, 160, 155, 66,  2,   101, 200, 253, 110, 45,
1238    199, 49,  230, 198, 76,  153, 148, 95,  187, 149, 159, 184, 142, 75,
1239    94,  11,  117, 188, 211, 150, 174, 218, 132, 182, 162, 133, 220, 38,
1240    67,  4,   77,  111, 0,   136, 144, 102, 7,   179, 222, 50,  61,  161,
1241    80,  55,  16,  202, 63,  119, 31,  131, 163, 108, 158, 206, 58,  219,
1242    231, 9,   92,  208, 239, 48,  189, 140, 147, 107, 19,  240, 192, 227,
1243    214, 171, 201, 196, 213, 52,  112, 194, 24,  64,  134, 35,  59,  118,
1244    81,  204, 89,  26,  51,  127, 128, 137, 90,  168, 130, 115, 62,  123,
1245    185, 191, 248, 70,  39,  47,  21,  53,  164, 254, 193, 209, 224, 180,
1246    165, 104, 235, 228, 124, 40,  243, 241, 46,  3,   91,  106, 43,  216,
1247    6,   83,  65,  74,  86,  212, 29,  120, 88,  215, 37,  72,  99,  41,
1248    181, 176, 18,  252, 197, 233, 97,  175, 151, 242, 54,  183, 73,  71,
1249    69,  96,  217, 146, 245, 244, 251, 10,  34,  129, 203, 249, 246, 87,
1250    5,   250, 85,  229, 221, 145, 172, 126, 82,  20,  170, 15,  139, 210,
1251    186, 1,   157, 207, 247, 103, 122, 125, 152, 225, 234, 12,  44,  255,
1252    236, 154, 177, 32,  156, 84,  178, 116, 105, 68,  173, 114, 179, 158,
1253    250, 26,  198, 134, 118, 171, 3,   143, 7,   29,  46,  102, 99,  237,
1254    52,  172, 154, 236, 19,  239, 155, 0,   152, 188, 58,  10,  249, 68,
1255    211, 61,  186, 57,  36,  49,  81,  254, 135, 21,  24,  231, 167, 210,
1256    253, 170, 51,  90,  100, 190, 235, 203, 225, 230, 233, 60,  56,  130,
1257    124, 109, 83,  72,  163, 8,   98,  209, 144, 27,  115, 191, 89,  59,
1258    71,  242, 241, 43,  128, 217, 122, 204, 117, 189, 133, 107, 164, 112,
1259    35,  87,  234, 174, 69,  84,  5,   47,  28,  148, 252, 192, 224, 1,
1260    227, 147, 31,  88,  132, 214, 113, 197, 76,  37,  106, 33,  80,  104,
1261    208, 229, 53,  32,  91,  168, 150, 153, 194, 137, 101, 103, 205, 181,
1262    139, 96,  184, 251, 222, 97,  166, 255, 240, 92,  245, 86,  63,  221,
1263    39,  48,  131, 248, 6,   156, 173, 75,  196, 140, 2,   34,  121, 67,
1264    206, 94,  85,  9,   18,  157, 232, 185, 145, 93,  176, 126, 243, 64,
1265    216, 207, 40,  141, 11,  16,  78,  175, 219, 41,  202, 45,  13,  244,
1266    146, 125, 160, 246, 162, 165, 55,  17,  50,  182, 110, 12,  180, 23,
1267    187, 212, 22,  228, 178, 213, 38,  183, 226, 73,  120, 111, 199, 142,
1268    200, 70,  123, 116, 114, 223, 66,  82,  138, 30,  65,  195, 119, 105,
1269    15,  108, 136, 247, 159, 14,  74,  44,  20,  4,   95,  42,  77,  238,
1270    79,  161, 193, 220, 129, 127, 62,  149, 177, 169, 215, 201, 54,  25,
1271    218, 151, 171, 24,  156, 124, 48,  112, 0,   115, 219, 175, 247, 145,
1272    8,   144, 123, 65,  50,  122, 252, 58,  75,  79,  3,   198, 238, 234,
1273    92,  12,  149, 162, 139, 113, 220, 85,  194, 29,  253, 184, 119, 89,
1274    110, 23,  87,  132, 177, 108, 43,  60,  130, 248, 51,  83,  237, 16,
1275    37,  106, 78,  84,  42,  193, 11,  190, 59,  254, 116, 125, 182, 131,
1276    235, 255, 53,  99,  183, 100, 93,  243, 70,  181, 28,  90,  249, 241,
1277    105, 179, 66,  214, 187, 39,  44,  136, 169, 18,  233, 15,  138, 210,
1278    170, 6,   230, 205, 251, 203, 159, 46,  98,  160, 221, 41,  218, 201,
1279    172, 173, 246, 158, 118, 9,   57,  166, 67,  94,  224, 245, 20,  133,
1280    137, 151, 97,  185, 147, 102, 206, 163, 216, 109, 80,  191, 86,  74,
1281    121, 32,  127, 209, 215, 22,  91,  142, 240, 10,  129, 211, 34,  154,
1282    212, 180, 21,  155, 104, 88,  25,  5,   68,  17,  30,  213, 189, 81,
1283    150, 56,  107, 134, 174, 111, 222, 161, 19,  54,  232, 143, 195, 229,
1284    76,  1,   33,  114, 196, 49,  38,  128, 52,  73,  71,  61,  36,  192,
1285    200, 26,  178, 103, 227, 146, 96,  2,   164, 153, 208, 199, 244, 197,
1286    14,  207, 55,  168, 62,  176, 35,  242, 228, 223, 148, 4,   140, 152,
1287    141, 27,  7,   165, 47,  186, 126, 135, 31,  40,  204, 250, 82,  226,
1288    95,  236, 225, 72,  239, 45,  13,  202, 77,  63,  120, 217, 157, 101,
1289    167, 69,  64,  117, 188, 231, 131, 120, 156, 124, 80,  144, 160, 139,
1290    51,  39,  175, 89,  232, 176, 211, 137, 162, 42,  252, 234, 35,  199,
1291    155, 86,  190, 26,  92,  140, 253, 146, 99,  57,  220, 189, 178, 197,
1292    165, 24,  47,  97,  62,  207, 15,  196, 121, 236, 3,   60,  114, 88,
1293    75,  107, 21,  48,  13,  154, 30,  20,  90,  9,   227, 14,  147, 78,
1294    52,  37,  198, 27,  195, 247, 157, 251, 111, 164, 5,   11,  214, 29,
1295    28,  10,  1,   185, 241, 203, 50,  230, 19,  95,  172, 104, 49,  130,
1296    113, 135, 186, 66,  218, 150, 118, 245, 83,  163, 151, 254, 82,  64,
1297    133, 177, 138, 81,  44,  213, 6,   238, 134, 145, 65,  54,  219, 174,
1298    128, 93,  212, 109, 17,  79,  169, 193, 171, 246, 158, 59,  56,  149,
1299    112, 183, 102, 122, 129, 192, 119, 153, 143, 38,  179, 94,  16,  58,
1300    201, 235, 18,  74,  148, 116, 125, 243, 72,  184, 33,  237, 132, 217,
1301    110, 61,  101, 25,  166, 152, 67,  22,  126, 231, 46,  233, 43,  70,
1302    200, 7,   91,  205, 204, 73,  105, 226, 4,   249, 182, 32,  244, 209,
1303    127, 229, 100, 96,  168, 202, 34,  159, 123, 2,   0,   242, 228, 161,
1304    240, 255, 180, 173, 222, 71,  239, 136, 142, 208, 187, 98,  36,  215,
1305    84,  68,  12,  248, 181, 115, 63,  141, 167, 106, 206, 191, 23,  8,
1306    76,  170, 194, 210, 87,  108, 41,  40,  103, 85,  53,  250, 117, 55,
1307    216, 225, 69,  77,  223, 45,  224, 221, 188, 31,  86,  211, 151, 119,
1308    107, 171, 59,  158, 134, 154, 98,  28,  195, 203, 38,  204, 13,  213,
1309    247, 149, 246, 58,  46,  225, 137, 69,  87,  7,   96,  125, 54,  252,
1310    215, 32,  157, 104, 72,  115, 226, 100, 9,   130, 194, 255, 60,  103,
1311    214, 55,  93,  179, 94,  126, 56,  75,  240, 197, 233, 207, 133, 76,
1312    182, 89,  230, 153, 239, 200, 209, 174, 150, 234, 0,   142, 34,  223,
1313    168, 30,  97,  128, 23,  181, 4,   124, 116, 222, 29,  241, 102, 146,
1314    39,  67,  180, 237, 244, 250, 229, 173, 5,   33,  1,   24,  166, 118,
1315    138, 201, 61,  219, 40,  52,  53,  212, 167, 248, 17,  57,  145, 20,
1316    68,  193, 110, 249, 27,  192, 143, 80,  148, 2,   236, 196, 190, 129,
1317    105, 206, 147, 184, 139, 170, 113, 165, 132, 91,  106, 92,  66,  49,
1318    6,   41,  43,  101, 12,  254, 253, 245, 79,  47,  224, 70,  35,  19,
1319    36,  208, 191, 156, 185, 160, 8,   220, 177, 243, 22,  161, 73,  90,
1320    121, 44,  62,  81,  163, 122, 238, 176, 71,  140, 172, 77,  63,  188,
1321    65,  187, 175, 84,  178, 136, 159, 251, 131, 117, 141, 210, 14,  109,
1322    155, 221, 31,  164, 11,  50,  111, 144, 169, 186, 162, 99,  217, 235,
1323    78,  205, 95,  202, 15,  127, 135, 83,  216, 198, 114, 112, 26,  21,
1324    25,  242, 10,  227, 199, 85,  45,  189, 74,  231, 108, 3,   218, 120,
1325    88,  37,  152, 42,  51,  228, 232, 48,  18,  16,  123, 64,  183, 82,
1326    165, 154, 190, 158, 114, 178, 194, 173, 85,  73,  209, 123, 10,  210,
1327    245, 171, 196, 76,  30,  12,  69,  233, 189, 120, 224, 60,  126, 174,
1328    31,  180, 133, 91,  254, 223, 212, 231, 199, 58,  81,  131, 96,  241,
1329    49,  230, 155, 14,  37,  94,  148, 122, 109, 141, 55,  82,  47,  188,
1330    64,  54,  124, 43,  5,   48,  181, 112, 86,  71,  232, 61,  229, 25,
1331    191, 29,  145, 198, 39,  45,  248, 63,  62,  44,  35,  219, 19,  237,
1332    84,  8,   53,  129, 206, 138, 83,  164, 147, 169, 220, 100, 252, 184,
1333    152, 23,  117, 197, 185, 32,  116, 98,  167, 211, 172, 115, 78,  247,
1334    40,  16,  168, 179, 99,  88,  253, 208, 162, 127, 246, 143, 51,  113,
1335    203, 227, 205, 24,  192, 93,  90,  183, 146, 217, 136, 156, 163, 226,
1336    153, 187, 177, 72,  213, 128, 50,  92,  235, 13,  52,  108, 182, 150,
1337    159, 21,  106, 218, 67,  15,  166, 251, 144, 95,  135, 59,  200, 186,
1338    101, 56,  160, 9,   80,  11,  77,  104, 234, 41,  125, 239, 238, 107,
1339    139, 4,   38,  27,  216, 66,  22,  243, 161, 7,   134, 130, 202, 236,
1340    68,  193, 157, 36,  34,  20,  6,   195, 18,  33,  214, 207, 0,   105,
1341    17,  170, 176, 242, 221, 132, 70,  249, 118, 102, 46,  26,  215, 149,
1342    97,  175, 201, 140, 240, 225, 57,  42,  110, 204, 228, 244, 121, 142,
1343    75,  74,  137, 119, 87,  28,  151, 89,  250, 3,   103, 111, 1,   79,
1344    2,   255, 222, 65,  20,  169, 77,  45,  129, 193, 209, 28,  196, 56,
1345    192, 170, 25,  225, 100, 218, 19,  155, 173, 91,  180, 216, 44,  71,
1346    175, 139, 13,  61,  206, 3,   244, 138, 141, 142, 35,  150, 118, 73,
1347    64,  178, 47,  224, 32,  117, 202, 157, 148, 237, 227, 137, 220, 252,
1348    230, 97,  222, 11,  15,  197, 203, 90,  116, 255, 36,  63,  229, 246,
1349    183, 172, 84,  8,   110, 140, 128, 85,  214, 156, 199, 238, 205, 123,
1350    82,  10,  66,  92,  163, 215, 164, 112, 93,  153, 130, 243, 194, 152,
1351    43,  179, 75,  135, 103, 198, 228, 52,  168, 239, 195, 113, 86,  2,
1352    251, 162, 221, 166, 247, 223, 119, 226, 146, 39,  108, 159, 177, 46,
1353    133, 62,  98,  96,  250, 18,  60,  231, 143, 204, 105, 102, 161, 200,
1354    87,  235, 210, 241, 136, 234, 160, 23,  68,  79,  65,  171, 26,  124,
1355    131, 187, 69,  37,  78,  132, 121, 233, 114, 190, 53,  42,  95,  14,
1356    54,  106, 151, 201, 212, 7,   111, 248, 31,  58,  188, 55,  249, 24,
1357    236, 158, 125, 154, 186, 83,  181, 74,  167, 81,  165, 34,  144, 182,
1358    21,  145, 217, 59,  147, 176, 12,  115, 49,  99,  149, 242, 33,  16,
1359    101, 126, 207, 88,  0,   185, 127, 1,   76,  211, 213, 232, 5,   245,
1360    189, 41,  134, 4,   80,  94,  184, 219, 191, 208, 40,  57,  253, 27,
1361    51,  67,  104, 29,  122, 89,  120, 38,  6,   107, 70,  72,  9,   50,
1362    22,  30,  240, 254, 17,  174, 109, 48,
1363);
1364
1365%veggie_table = (
1366    tomato => [
1367        168, 144, 40,  133, 43,  117, 252, 212, 147, 148, 94,  211, 113, 84,
1368        185, 178, 201, 114, 88,  245, 71,  5,   171, 53,  135, 163, 165, 96,
1369        118, 210, 125, 59,  173, 204, 219, 246, 105, 169, 115, 214, 131, 110,
1370        34,  140, 0,   66,  167, 194, 166, 227, 142, 7,   223, 254, 75,  159,
1371        41,  78,  130, 99,  209, 9,   180, 63,  67,  205, 104, 164, 70,  55,
1372        153, 137, 208, 42,  4,   82,  149, 61,  16,  31,  25,  73,  215, 126,
1373        207, 17,  8,   150, 224, 183, 199, 3,   18,  11,  120, 36,  30,  10,
1374        20,  24,  49,  106, 161, 37,  217, 83,  200, 57,  181, 249, 128, 162,
1375        62,  175, 48,  127, 233, 50,  151, 111, 87,  44,  14,  187, 172, 229,
1376        69,  56,  85,  232, 247, 170, 155, 33,  81,  1,   154, 251, 191, 184,
1377        58,  77,  51,  39,  19,  203, 60,  236, 23,  29,  255, 74,  116, 157,
1378        12,  202, 64,  101, 193, 145, 242, 38,  89,  225, 152, 76,  65,  143,
1379        15,  237, 47,  98,  79,  121, 2,   156, 213, 238, 28,  240, 198, 93,
1380        26,  206, 253, 241, 221, 160, 32,  46,  239, 248, 216, 177, 189, 123,
1381        119, 134, 220, 243, 192, 54,  139, 186, 68,  91,  190, 146, 250, 100,
1382        174, 138, 231, 218, 92,  112, 235, 197, 97,  234, 136, 226, 6,   108,
1383        107, 21,  103, 176, 179, 35,  228, 195, 22,  109, 27,  188, 52,  230,
1384        122, 95,  72,  132, 222, 182, 158, 80,  102, 86,  244, 196, 13,  45,
1385        141, 90,  124, 129,
1386    ],
1387    carrot => [
1388        207, 110, 211, 170, 253, 115, 1,   88,  142, 252, 80,  24,  113, 25,
1389        50,  238, 244, 78,  166, 151, 210, 206, 177, 127, 150, 198, 216, 148,
1390        137, 81,  220, 232, 191, 75,  90,  235, 102, 186, 212, 122, 70,  248,
1391        96,  241, 42,  183, 169, 143, 41,  217, 6,   134, 161, 132, 84,  199,
1392        171, 230, 116, 93,  77,  99,  229, 62,  233, 164, 46,  94,  213, 52,
1393        129, 35,  152, 100, 228, 33,  63,  218, 9,   15,  136, 173, 49,  181,
1394        121, 112, 43,  146, 26,  71,  67,  97,  56,  225, 221, 240, 195, 89,
1395        201, 141, 250, 107, 231, 120, 27,  74,  4,   239, 13,  160, 126, 82,
1396        234, 36,  209, 123, 249, 7,   45,  247, 53,  202, 51,  87,  105, 158,
1397        255, 22,  47,  59,  193, 243, 60,  34,  196, 182, 106, 69,  203, 138,
1398        153, 145, 215, 73,  162, 208, 251, 222, 130, 223, 224, 165, 95,  131,
1399        135, 156, 174, 157, 189, 61,  55,  254, 32,  28,  194, 30,  17,  139,
1400        109, 37,  16,  65,  192, 178, 39,  2,   58,  40,  204, 101, 175, 111,
1401        3,   219, 167, 237, 119, 124, 23,  172, 72,  57,  188, 5,   104, 10,
1402        19,  133, 246, 44,  21,  31,  149, 8,   180, 76,  187, 200, 48,  245,
1403        185, 0,   242, 159, 179, 205, 20,  226, 18,  155, 227, 118, 168, 197,
1404        86,  214, 103, 190, 128, 140, 147, 108, 184, 236, 144, 125, 54,  64,
1405        14,  66,  11,  83,  85,  38,  163, 154, 91,  114, 29,  98,  12,  79,
1406        92,  117, 68,  176,
1407    ],
1408    potato => [
1409        207, 150, 249, 92,  224, 35,  18,  80,  131, 86,  163, 23,  149, 217,
1410        42,  110, 173, 177, 143, 214, 154, 83,  45,  8,   219, 232, 128, 209,
1411        30,  28,  221, 245, 192, 85,  79,  168, 213, 63,  97,  51,  243, 114,
1412        171, 255, 194, 230, 153, 200, 20,  37,  169, 111, 74,  117, 135, 246,
1413        98,  147, 127, 29,  157, 183, 189, 184, 62,  215, 115, 138, 34,  82,
1414        238, 90,  130, 237, 195, 102, 166, 71,  109, 68,  226, 47,  229, 233,
1415        14,  1,   65,  96,  99,  43,  24,  212, 146, 118, 156, 197, 59,  190,
1416        12,  227, 39,  126, 91,  134, 142, 58,  236, 223, 179, 199, 54,  50,
1417        60,  176, 133, 242, 164, 125, 105, 208, 21,  172, 103, 228, 57,  75,
1418        95,  252, 89,  141, 113, 234, 175, 148, 106, 101, 48,  76,  36,  132,
1419        38,  187, 139, 140, 202, 162, 193, 26,  196, 205, 165, 7,   136, 185,
1420        56,  121, 55,  52,  94,  61,  152, 174, 203, 53,  22,  248, 123, 4,
1421        9,   129, 120, 27,  87,  44,  137, 201, 222, 15,  198, 72,  244, 220,
1422        124, 6,   3,   254, 112, 235, 218, 64,  151, 225, 160, 81,  5,   10,
1423        181, 25,  250, 122, 247, 32,  69,  66,  67,  78,  88,  0,   231, 167,
1424        239, 144, 182, 211, 70,  49,  180, 178, 159, 108, 241, 84,  11,  16,
1425        161, 41,  158, 216, 145, 253, 251, 33,  116, 77,  104, 13,  119, 19,
1426        191, 204, 170, 206, 31,  107, 93,  240, 186, 210, 17,  73,  46,  155,
1427        100, 2,   40,  188,
1428    ],
1429    radish => [
1430        68,  94,  16,  181, 225, 234, 166, 157, 57,  78,  106, 62,  158, 52,
1431        201, 211, 10,  88,  87,  193, 191, 194, 38,  243, 169, 253, 204, 95,
1432        152, 31,  76,  241, 147, 131, 221, 29,  50,  163, 86,  232, 216, 127,
1433        197, 233, 214, 173, 164, 224, 145, 123, 167, 92,  49,  215, 160, 161,
1434        44,  80,  3,   17,  61,  120, 144, 110, 151, 178, 6,   89,  250, 71,
1435        99,  226, 190, 19,  183, 26,  236, 200, 125, 230, 112, 34,  2,   235,
1436        205, 247, 65,  217, 22,  149, 227, 67,  46,  82,  208, 240, 5,   195,
1437        251, 90,  138, 121, 101, 117, 115, 32,  207, 129, 206, 107, 244, 126,
1438        220, 218, 45,  185, 242, 134, 43,  72,  189, 177, 136, 20,  79,  150,
1439        7,   24,  30,  27,  0,   202, 25,  60,  14,  248, 159, 70,  182, 223,
1440        102, 114, 245, 11,  12,  73,  93,  40,  51,  156, 56,  55,  142, 8,
1441        21,  48,  198, 254, 135, 13,  84,  41,  239, 176, 238, 85,  255, 168,
1442        128, 228, 180, 59,  213, 219, 222, 53,  47,  231, 209, 122, 137, 187,
1443        15,  83,  109, 39,  174, 192, 141, 58,  9,   113, 28,  116, 1,   103,
1444        75,  210, 153, 165, 172, 140, 111, 130, 199, 196, 42,  118, 74,  91,
1445        37,  23,  146, 252, 64,  203, 108, 98,  96,  63,  179, 69,  246, 4,
1446        188, 81,  104, 162, 124, 54,  171, 237, 132, 133, 249, 148, 139, 18,
1447        77,  170, 154, 100, 119, 186, 33,  155, 212, 66,  175, 97,  105, 35,
1448        36,  184, 143, 229,
1449    ],
1450    garlic => [
1451        64,  125, 53,  199, 27,  95,  196, 166, 146, 139, 238, 67,  98,  239,
1452        158, 85,  255, 180, 66,  204, 150, 112, 163, 236, 216, 226, 74,  90,
1453        73,  47,  171, 54,  41,  108, 22,  75,  51,  227, 229, 44,  93,  11,
1454        164, 113, 96,  38,  59,  220, 176, 23,  88,  182, 173, 230, 133, 21,
1455        42,  121, 107, 179, 198, 8,   170, 242, 246, 50,  245, 135, 29,  68,
1456        80,  76,  48,  91,  141, 177, 203, 45,  190, 186, 213, 62,  195, 30,
1457        222, 52,  253, 55,  148, 254, 243, 5,   202, 123, 117, 58,  153, 120,
1458        56,  234, 144, 14,  24,  140, 126, 178, 212, 20,  157, 210, 69,  110,
1459        127, 1,   240, 183, 237, 3,   197, 191, 15,  241, 231, 78,  156, 102,
1460        10,  128, 167, 206, 218, 60,  28,  181, 247, 37,  81,  71,  134, 49,
1461        248, 0,   97,  94,  217, 89,  215, 228, 131, 4,   205, 132, 40,  36,
1462        63,  116, 145, 159, 82,  46,  143, 18,  165, 100, 223, 147, 65,  192,
1463        9,   39,  225, 168, 32,  154, 233, 136, 194, 169, 7,   235, 12,  103,
1464        209, 87,  25,  119, 26,  31,  252, 172, 201, 188, 57,  249, 130, 250,
1465        17,  79,  70,  6,   35,  211, 61,  72,  142, 214, 122, 232, 101, 84,
1466        16,  105, 137, 155, 193, 224, 208, 86,  138, 118, 152, 161, 151, 124,
1467        104, 184, 187, 34,  160, 207, 13,  175, 83,  185, 77,  19,  219, 244,
1468        109, 92,  251, 43,  221, 149, 33,  162, 200, 2,   174, 115, 111, 106,
1469        129, 189, 99,  114,
1470    ],
1471);
1472
1473=head1 NAME
1474
1475Crypt::AppleTwoFish -- two Apple iTMS/iTunes key descrambling algorithms
1476
1477=head1 DESCRIPTION
1478
1479The first algorithm appears to have only cursory resemblance to Bruce Schneier's
1480blowfish and twofish algorithms in that it too has a table-based decoder.
1481
1482The second algorithm is more standard encryption using S-box type permutations
1483and lookup tables, and might have started out something like Twofish or Blowfish.
1484
1485=head1 SYNOPSIS
1486
1487    for iTMS usages:
1488
1489    use Crypt::AppleTwoFish;
1490
1491    my $scrambled_key = '=sixteen uchars=';
1492
1493    my $apple_twofish = new Crypt::AppleTwoFish(key => $scrambled_key);
1494
1495    my $descrambled_key = $apple_twofish->decrypted_for_iTMS;
1496
1497    my $descrambled_another_way = $apple_twofish->decrypted_for_DRMS;
1498
1499
1500    ..and for iTunes 7 compatible usages:
1501
1502    Functions cloned from lower level compiled code which was likely intended
1503    to be difficult to reconstruct cannot easily be given sensible names. Ada
1504    Pro is good, but dull.  We chose to be amused during the tedium by coming
1505    up with function names from a vegetable farm.
1506
1507    For actual usage, see also:
1508
1509L<iTunes::Sid>.
1510
1511=head1 METHODS
1512
1513=over 4
1514
1515=item B<new>
1516
1517Call with the key as a scalar argument. When passed (LWP simulating iTunes) over iTMS,
1518encrypted M4P keys for your purchased music are currently 16 unsigned chars in length.
1519
1520=item B<decrypted_for_iTMS>
1521
1522Returns the unscrambled key for use with the Apple Music Store.
1523
1524=item B<decrypted_for_DRMS>
1525
1526Returns the unscrambled key for use with iTunes/iPod DRM.
1527
1528=item B<key>
1529
1530    Get/set initial key.
1531
1532=item B<int_table>
1533
1534    Get/set veggie integer table.
1535
1536=item B<byte_table>
1537
1538    Get/set veggie byte table.
1539
1540=item B<veggie>
1541
1542    Get/set veggie.
1543
1544=item B<hwID>
1545
1546    Get/set hardware ID (MAC address or other machine based data). 6 bytes.
1547
1548=item B<keyID>
1549
1550    Get/set key ID.  4 bytes.
1551
1552=item B<userID>
1553
1554    Get/set user ID.  4 bytes.
1555
1556=item B<plant_veggies>
1557
1558    Key munging, spring season
1559
1560=item B<harvest_veggies>
1561
1562    Key munging, harvest season
1563
1564=back
1565
1566=head1 AUTHOR
1567
1568   iTMS decrambler adapted from FairKeys 0.5, by Jon Lech Johansen, and from
1569   the alterate scramble table found by FutureProof.
1570
1571   Veggie Tales algorithm courtesy of Ada and other anonymous pros :-).
1572
1573=head1 SUPPORT
1574
1575Questions, feature requests and bug reports should go to
1576<wherrera@skylightview.com>.
1577
1578=head1 COPYRIGHT
1579
1580=over 4
1581
1582    Copyright (c) 2005, 2008 William Herrera. All rights reserved.
1583
1584    Licensing Terms
1585
1586    a) The terms of Perl itself, plus the following:
1587
1588    b) UNDER NO CIRCUMSTANCES CAN THIS CODE BE USED FOR CIRCUMVENTION OF ANY
1589    TECHNOLOGICAL MEASURE WHICH EFFECTIVELY CONTROLS A PROTECTED MEDIA WORK
1590    UNDER THE DCMA (USA, 1998) OR EU COPYRIGHT DIRECTIVE (EUCD, ARTICLE 6,
1591    OF 2001), UNDER ANY OPERATING SYSTEM PLATFORM SUPPORTED BY APPLE COMPUTER
1592    CORPORATION FOR ITS ITUNES OR IPOD PLAYER SOFTWARE IN ANY APPLE CORPORATION
1593    DISTRIBUTED BINARY FORMAT OF ITUNES FOR THE PLATFORM UNDER WHICH THAT MEDIA
1594    IS TO BE PLAYED. AS OF 2008, PROHIBITED PLATFORMS INCLUDE THE IPOD, IPHONE,
1595    APPLE OS X, AND MICROSOFT WINDOWS, BUT NOT LINUX, BSD, OR SOLARIS.  UNDER NO
1596    CIRCUMSTANCES CAN THE AUTHOR(S) OF THIS CODE BE HELD LIABLE FOR ANY
1597    INFRINGEMENT INVOLVING THE PROHIBITED PLATFORMS ABOVE.
1598
1599    c) Use, storage, or distribution of this code implies that you accept that
1600    its intended purpose is legal and legitimate under any applicable US or EU
1601    law, as above, and agree that any and all risk as to the quality,
1602    performance, and legality of this code lies with you.
1603
1604=back
1605
1606=cut
1607
1608return 1;
1609