2 * common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5)
4 * Copyright (c) 2009 Maxim Poliakovski
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * @file libavcodec/ivi_common.c
25 * This file contains functions and data shared by both Indeo4 and
29 #define ALT_BITSTREAM_READER_LE
32 #include "ivi_common.h"
33 #include "libavutil/common.h"
36 extern const IVIHuffDesc ff_ivi_mb_huff_desc
[8]; ///< static macroblock huffman tables
37 extern const IVIHuffDesc ff_ivi_blk_huff_desc
[8]; ///< static block huffman tables
39 VLC ff_ivi_mb_vlc_tabs
[8];
40 VLC ff_ivi_blk_vlc_tabs
[8];
43 * Reverses "nbits" bits of the value "val" and returns the result
44 * in the least significant bits.
46 static uint16_t inv_bits(uint16_t val
, int nbits
)
51 res
= av_reverse
[val
] >> (8-nbits
);
53 res
= ((av_reverse
[val
& 0xFF] << 8) + (av_reverse
[val
>> 8])) >> (16-nbits
);
58 int ff_ivi_create_huff_from_desc(const IVIHuffDesc
*cb
, VLC
*vlc
, int flag
)
60 int pos
, i
, j
, codes_per_row
, prefix
, not_last_row
;
61 uint16_t codewords
[256]; /* FIXME: move this temporal storage out? */
64 pos
= 0; /* current position = 0 */
66 for (i
= 0; i
< cb
->num_rows
; i
++) {
67 codes_per_row
= 1 << cb
->xbits
[i
];
68 not_last_row
= (i
!= cb
->num_rows
- 1);
69 prefix
= ((1 << i
) - 1) << (cb
->xbits
[i
] + not_last_row
);
71 for (j
= 0; j
< codes_per_row
; j
++) {
72 if (pos
>= 256) /* Some Indeo5 codebooks can have more than 256 */
73 break; /* elements, but only 256 codes are allowed! */
75 bits
[pos
] = i
+ cb
->xbits
[i
] + not_last_row
;
76 if (bits
[pos
] > IVI_VLC_BITS
)
77 return -1; /* invalid descriptor */
79 codewords
[pos
] = inv_bits((prefix
| j
), bits
[pos
]);
87 /* number of codewords = pos */
88 return init_vlc(vlc
, IVI_VLC_BITS
, pos
, bits
, 1, 1, codewords
, 2, 2,
89 (flag ? INIT_VLC_USE_NEW_STATIC
: 0) | INIT_VLC_LE
);
92 void ff_ivi_init_static_vlc()
95 static VLC_TYPE table_data
[8192 * 16][2];
96 static int initialized_vlcs
= 0;
100 for (i
= 0; i
< 8; i
++) {
101 ff_ivi_mb_vlc_tabs
[i
].table
= table_data
+ i
* 2 * 8192;
102 ff_ivi_mb_vlc_tabs
[i
].table_allocated
= 8192;
103 ff_ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc
[i
], &ff_ivi_mb_vlc_tabs
[i
], 1);
104 ff_ivi_blk_vlc_tabs
[i
].table
= table_data
+ (i
* 2 + 1) * 8192;
105 ff_ivi_blk_vlc_tabs
[i
].table_allocated
= 8192;
106 ff_ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc
[i
], &ff_ivi_blk_vlc_tabs
[i
], 1);
108 initialized_vlcs
= 1;
111 int ff_ivi_dec_huff_desc(GetBitContext
*gb
, IVIHuffDesc
*desc
)
115 tab_sel
= get_bits(gb
, 3);
117 /* custom huffman table (explicitly encoded) */
118 desc
->num_rows
= get_bits(gb
, 4);
120 for (i
= 0; i
< desc
->num_rows
; i
++)
121 desc
->xbits
[i
] = get_bits(gb
, 4);
127 int ff_ivi_huff_desc_cmp(const IVIHuffDesc
*desc1
, const IVIHuffDesc
*desc2
)
129 return desc1
->num_rows
!= desc2
->num_rows
130 || memcmp(desc1
->xbits
, desc2
->xbits
, desc1
->num_rows
);
133 void ff_ivi_huff_desc_copy(IVIHuffDesc
*dst
, const IVIHuffDesc
*src
)
135 dst
->num_rows
= src
->num_rows
;
136 memcpy(dst
->xbits
, src
->xbits
, src
->num_rows
);
139 int av_cold
ff_ivi_init_planes(IVIPlaneDesc
*planes
, const IVIPicConfig
*cfg
)
142 uint32_t b_width
, b_height
, align_fac
, width_aligned
, height_aligned
, buf_size
;
145 ff_ivi_free_buffers(planes
);
147 /* fill in the descriptor of the luminance plane */
148 planes
[0].width
= cfg
->pic_width
;
149 planes
[0].height
= cfg
->pic_height
;
150 planes
[0].num_bands
= cfg
->luma_bands
;
152 /* fill in the descriptors of the chrominance planes */
153 planes
[1].width
= planes
[2].width
= (cfg
->pic_width
+ 3) >> 2;
154 planes
[1].height
= planes
[2].height
= (cfg
->pic_height
+ 3) >> 2;
155 planes
[1].num_bands
= planes
[2].num_bands
= cfg
->chroma_bands
;
157 for (p
= 0; p
< 3; p
++) {
158 planes
[p
].bands
= av_mallocz(planes
[p
].num_bands
* sizeof(IVIBandDesc
));
159 if (!planes
[p
].bands
)
160 return AVERROR(ENOMEM
);
162 /* select band dimensions: if there is only one band then it
163 * has the full size, if there are several bands each of them
164 * has only half size */
165 b_width
= planes
[p
].num_bands
== 1 ? planes
[p
].width
: (planes
[p
].width
+ 1) >> 1;
166 b_height
= planes
[p
].num_bands
== 1 ? planes
[p
].height
: (planes
[p
].height
+ 1) >> 1;
168 /* luma band buffers will be aligned on 16x16 (max macroblock size) */
169 /* chroma band buffers will be aligned on 8x8 (max macroblock size) */
170 align_fac
= p ?
8 : 16;
171 width_aligned
= FFALIGN(b_width
, align_fac
);
172 height_aligned
= FFALIGN(b_height
, align_fac
);
173 buf_size
= width_aligned
* height_aligned
* sizeof(int16_t);
175 for (b
= 0; b
< planes
[p
].num_bands
; b
++) {
176 band
= &planes
[p
].bands
[b
]; /* select appropriate plane/band */
179 band
->width
= b_width
;
180 band
->height
= b_height
;
181 band
->pitch
= width_aligned
;
182 band
->bufs
[0] = av_malloc(buf_size
);
183 band
->bufs
[1] = av_malloc(buf_size
);
184 if (!band
->bufs
[0] || !band
->bufs
[1])
185 return AVERROR(ENOMEM
);
187 /* allocate the 3rd band buffer for scalability mode */
188 if (cfg
->luma_bands
> 1) {
189 band
->bufs
[2] = av_malloc(buf_size
);
191 return AVERROR(ENOMEM
);
194 planes
[p
].bands
[0].huff_desc
.num_rows
= 0; /* reset custom vlc */
201 void av_cold
ff_ivi_free_buffers(IVIPlaneDesc
*planes
)
205 for (p
= 0; p
< 3; p
++) {
206 for (b
= 0; b
< planes
[p
].num_bands
; b
++) {
207 av_freep(&planes
[p
].bands
[b
].bufs
[0]);
208 av_freep(&planes
[p
].bands
[b
].bufs
[1]);
209 av_freep(&planes
[p
].bands
[b
].bufs
[2]);
211 for (t
= 0; t
< planes
[p
].bands
[b
].num_tiles
; t
++)
212 av_freep(&planes
[p
].bands
[b
].tiles
[t
].mbs
);
213 av_freep(&planes
[p
].bands
[b
].tiles
);
215 av_freep(&planes
[p
].bands
);
219 int av_cold
ff_ivi_init_tiles(IVIPlaneDesc
*planes
, int tile_width
, int tile_height
)
221 int p
, b
, x
, y
, x_tiles
, y_tiles
, t_width
, t_height
;
223 IVITile
*tile
, *ref_tile
;
225 for (p
= 0; p
< 3; p
++) {
226 t_width
= !p ? tile_width
: (tile_width
+ 3) >> 2;
227 t_height
= !p ? tile_height
: (tile_height
+ 3) >> 2;
229 for (b
= 0; b
< planes
[p
].num_bands
; b
++) {
230 band
= &planes
[p
].bands
[b
];
231 x_tiles
= IVI_NUM_TILES(band
->width
, t_width
);
232 y_tiles
= IVI_NUM_TILES(band
->height
, t_height
);
233 band
->num_tiles
= x_tiles
* y_tiles
;
235 av_freep(&band
->tiles
);
236 band
->tiles
= av_mallocz(band
->num_tiles
* sizeof(IVITile
));
238 return AVERROR(ENOMEM
);
242 /* use the first luma band as reference for motion vectors
244 ref_tile
= planes
[0].bands
[0].tiles
;
246 for (y
= 0; y
< band
->height
; y
+= t_height
) {
247 for (x
= 0; x
< band
->width
; x
+= t_width
) {
250 tile
->width
= FFMIN(band
->width
- x
, t_width
);
251 tile
->height
= FFMIN(band
->height
- y
, t_height
);
252 tile
->is_empty
= tile
->data_size
= 0;
253 /* calculate number of macroblocks */
254 tile
->num_MBs
= IVI_MBs_PER_TILE(tile
->width
, tile
->height
,
257 av_freep(&tile
->mbs
);
258 tile
->mbs
= av_malloc(tile
->num_MBs
* sizeof(IVIMbInfo
));
260 return AVERROR(ENOMEM
);
264 tile
->ref_mbs
= ref_tile
->mbs
;
278 int ff_ivi_dec_tile_data_size(GetBitContext
*gb
)
284 len
= get_bits(gb
, 8);
286 len
= get_bits_long(gb
, 24);
289 /* align the bitstream reader on the byte boundary */
295 int ff_ivi_decode_blocks(GetBitContext
*gb
, IVIBandDesc
*band
, IVITile
*tile
)
297 int mbn
, blk
, num_blocks
, num_coeffs
, blk_size
, scan_pos
, run
, val
,
298 pos
, is_intra
, mc_type
, mv_x
, mv_y
, col_mask
;
299 uint8_t col_flags
[8];
300 int32_t prev_dc
, trvec
[64];
301 uint32_t cbp
, sym
, lo
, hi
, quant
, buf_offs
, q
;
303 RVMapDesc
*rvmap
= band
->rv_map
;
304 void (*mc_with_delta_func
)(int16_t *buf
, const int16_t *ref_buf
, uint32_t pitch
, int mc_type
);
305 void (*mc_no_delta_func
) (int16_t *buf
, const int16_t *ref_buf
, uint32_t pitch
, int mc_type
);
306 const uint8_t *base_tab
, *scale_tab
;
308 prev_dc
= 0; /* init intra prediction for the DC coefficient */
310 blk_size
= band
->blk_size
;
311 col_mask
= blk_size
- 1; /* column mask for tracking non-zero coeffs */
312 num_blocks
= (band
->mb_size
!= blk_size
) ?
4 : 1; /* number of blocks per mb */
313 num_coeffs
= blk_size
* blk_size
;
315 mc_with_delta_func
= ff_ivi_mc_8x8_delta
;
316 mc_no_delta_func
= ff_ivi_mc_8x8_no_delta
;
318 mc_with_delta_func
= ff_ivi_mc_4x4_delta
;
319 mc_no_delta_func
= ff_ivi_mc_4x4_no_delta
;
322 for (mbn
= 0, mb
= tile
->mbs
; mbn
< tile
->num_MBs
; mb
++, mbn
++) {
323 is_intra
= !mb
->type
;
325 buf_offs
= mb
->buf_offs
;
327 quant
= av_clip(band
->glob_quant
+ mb
->q_delta
, 0, 23);
329 base_tab
= is_intra ? band
->intra_base
: band
->inter_base
;
330 scale_tab
= is_intra ? band
->intra_scale
: band
->inter_scale
;
335 if (!band
->is_halfpel
) {
336 mc_type
= 0; /* we have only fullpel vectors */
338 mc_type
= ((mv_y
& 1) << 1) | (mv_x
& 1);
340 mv_y
>>= 1; /* convert halfpel vectors into fullpel ones */
344 for (blk
= 0; blk
< num_blocks
; blk
++) {
345 /* adjust block position in the buffer according to its number */
347 buf_offs
+= blk_size
;
348 } else if (blk
== 2) {
349 buf_offs
-= blk_size
;
350 buf_offs
+= blk_size
* band
->pitch
;
353 if (cbp
& 1) { /* block coded ? */
355 memset(trvec
, 0, num_coeffs
*sizeof(trvec
[0])); /* zero transform vector */
356 memset(col_flags
, 0, sizeof(col_flags
)); /* zero column flags */
358 while (scan_pos
<= num_coeffs
) {
359 sym
= get_vlc2(gb
, band
->blk_vlc
->table
, IVI_VLC_BITS
, 1);
360 if (sym
== rvmap
->eob_sym
)
361 break; /* End of block */
363 if (sym
== rvmap
->esc_sym
) { /* Escape - run/val explicitly coded using 3 vlc codes */
364 run
= get_vlc2(gb
, band
->blk_vlc
->table
, IVI_VLC_BITS
, 1) + 1;
365 lo
= get_vlc2(gb
, band
->blk_vlc
->table
, IVI_VLC_BITS
, 1);
366 hi
= get_vlc2(gb
, band
->blk_vlc
->table
, IVI_VLC_BITS
, 1);
367 val
= IVI_TOSIGNED((hi
<< 6) | lo
); /* merge them and convert into signed val */
369 run
= rvmap
->runtab
[sym
];
370 val
= rvmap
->valtab
[sym
];
373 /* de-zigzag and dequantize */
375 if (scan_pos
>= num_coeffs
)
377 pos
= band
->scan
[scan_pos
];
379 if (IVI_DEBUG
&& !val
)
380 av_log(NULL
, AV_LOG_ERROR
, "Val = 0 encountered!\n");
382 q
= (base_tab
[pos
] * scale_tab
[quant
]) >> 8;
384 val
= val
* q
+ FFSIGN(val
) * ((q
>> 1) - (q
& 1));
386 col_flags
[pos
& col_mask
] |= val
; /* track columns containing non-zero coeffs */
389 if (scan_pos
>= num_coeffs
&& sym
!= rvmap
->eob_sym
)
390 return -1; /* corrupt block data */
392 /* undoing DC coeff prediction for intra-blocks */
393 if (is_intra
&& band
->is_2d_trans
) {
396 col_flags
[0] |= !!prev_dc
;
399 /* apply inverse transform */
400 band
->inv_transform(trvec
, band
->buf
+ buf_offs
,
401 band
->pitch
, col_flags
);
403 /* apply motion compensation */
405 mc_with_delta_func(band
->buf
+ buf_offs
,
406 band
->ref_buf
+ buf_offs
+ mv_y
* band
->pitch
+ mv_x
,
407 band
->pitch
, mc_type
);
409 /* block not coded */
410 /* for intra blocks apply the dc slant transform */
411 /* for inter - perform the motion compensation without delta */
412 if (is_intra
&& band
->dc_transform
) {
413 band
->dc_transform(&prev_dc
, band
->buf
+ buf_offs
,
414 band
->pitch
, blk_size
);
416 mc_no_delta_func(band
->buf
+ buf_offs
,
417 band
->ref_buf
+ buf_offs
+ mv_y
* band
->pitch
+ mv_x
,
418 band
->pitch
, mc_type
);
430 void ff_ivi_process_empty_tile(AVCodecContext
*avctx
, IVIBandDesc
*band
,
431 IVITile
*tile
, int32_t mv_scale
)
433 int x
, y
, need_mc
, mbn
, blk
, num_blocks
, mv_x
, mv_y
, mc_type
;
434 int offs
, mb_offset
, row_offset
;
435 IVIMbInfo
*mb
, *ref_mb
;
438 void (*mc_no_delta_func
)(int16_t *buf
, const int16_t *ref_buf
, uint32_t pitch
,
441 offs
= tile
->ypos
* band
->pitch
+ tile
->xpos
;
443 ref_mb
= tile
->ref_mbs
;
444 row_offset
= band
->mb_size
* band
->pitch
;
445 need_mc
= 0; /* reset the mc tracking flag */
447 for (y
= tile
->ypos
; y
< (tile
->ypos
+ tile
->height
); y
+= band
->mb_size
) {
450 for (x
= tile
->xpos
; x
< (tile
->xpos
+ tile
->width
); x
+= band
->mb_size
) {
453 mb
->buf_offs
= mb_offset
;
455 mb
->type
= 1; /* set the macroblocks type = INTER */
456 mb
->cbp
= 0; /* all blocks are empty */
458 if (!band
->qdelta_present
&& !band
->plane
&& !band
->band_num
) {
459 mb
->q_delta
= band
->glob_quant
;
464 if (band
->inherit_qdelta
&& ref_mb
)
465 mb
->q_delta
= ref_mb
->q_delta
;
467 if (band
->inherit_mv
) {
468 /* motion vector inheritance */
470 mb
->mv_x
= ivi_scale_mv(ref_mb
->mv_x
, mv_scale
);
471 mb
->mv_y
= ivi_scale_mv(ref_mb
->mv_y
, mv_scale
);
473 mb
->mv_x
= ref_mb
->mv_x
;
474 mb
->mv_y
= ref_mb
->mv_y
;
476 need_mc
|= mb
->mv_x
|| mb
->mv_y
; /* tracking non-zero motion vectors */
482 mb_offset
+= band
->mb_size
;
487 if (band
->inherit_mv
&& need_mc
) { /* apply motion compensation if there is at least one non-zero motion vector */
488 num_blocks
= (band
->mb_size
!= band
->blk_size
) ?
4 : 1; /* number of blocks per mb */
489 mc_no_delta_func
= (band
->blk_size
== 8) ? ff_ivi_mc_8x8_no_delta
490 : ff_ivi_mc_4x4_no_delta
;
492 for (mbn
= 0, mb
= tile
->mbs
; mbn
< tile
->num_MBs
; mb
++, mbn
++) {
495 if (!band
->is_halfpel
) {
496 mc_type
= 0; /* we have only fullpel vectors */
498 mc_type
= ((mv_y
& 1) << 1) | (mv_x
& 1);
500 mv_y
>>= 1; /* convert halfpel vectors into fullpel ones */
503 for (blk
= 0; blk
< num_blocks
; blk
++) {
504 /* adjust block position in the buffer according with its number */
505 offs
= mb
->buf_offs
+ band
->blk_size
* ((blk
& 1) + !!(blk
& 2) * band
->pitch
);
506 mc_no_delta_func(band
->buf
+ offs
,
507 band
->ref_buf
+ offs
+ mv_y
* band
->pitch
+ mv_x
,
508 band
->pitch
, mc_type
);
512 /* copy data from the reference tile into the current one */
513 src
= band
->ref_buf
+ tile
->ypos
* band
->pitch
+ tile
->xpos
;
514 dst
= band
->buf
+ tile
->ypos
* band
->pitch
+ tile
->xpos
;
515 for (y
= 0; y
< tile
->height
; y
++) {
516 memcpy(dst
, src
, tile
->width
*sizeof(band
->buf
[0]));
525 uint16_t ivi_calc_band_checksum (IVIBandDesc
*band
)
528 int16_t *src
, checksum
;
533 for (y
= 0; y
< band
->height
; src
+= band
->pitch
, y
++)
534 for (x
= 0; x
< band
->width
; x
++)
540 int ivi_check_band (IVIBandDesc
*band
, const uint8_t *ref
, int pitch
)
549 for (y
= 0; y
< band
->height
; src
+= band
->pitch
, y
++) {
550 for (x
= 0; x
< band
->width
; x
++) {
551 t1
= av_clip(src
[x
] + 128, 0, 255);
554 av_log(NULL
, AV_LOG_ERROR
, "Data mismatch: row %d, column %d\n",
555 y
/ band
->blk_size
, x
/ band
->blk_size
);
566 void ff_ivi_output_plane(IVIPlaneDesc
*plane
, uint8_t *dst
, int dst_pitch
)
569 const int16_t *src
= plane
->bands
[0].buf
;
570 uint32_t pitch
= plane
->bands
[0].pitch
;
572 for (y
= 0; y
< plane
->height
; y
++) {
573 for (x
= 0; x
< plane
->width
; x
++)
574 dst
[x
] = av_clip_uint8(src
[x
] + 128);
582 * These are 2x8 predefined Huffman codebooks for coding macroblock/block
583 * signals. They are specified using "huffman descriptors" in order to
584 * avoid huge static tables. The decoding tables will be generated at
585 * startup from these descriptors.
587 const IVIHuffDesc ff_ivi_mb_huff_desc
[8] = {
588 {8, {0, 4, 5, 4, 4, 4, 6, 6}},
589 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
590 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
591 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
592 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
593 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}},
594 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
595 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
598 const IVIHuffDesc ff_ivi_blk_huff_desc
[8] = {
599 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
600 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
601 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
602 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
603 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
604 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
605 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
606 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}}
611 * Run-value (RLE) tables.
613 const RVMapDesc ff_ivi_rvmap_tabs
[9] = {
618 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
619 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
620 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
621 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
622 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
623 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
624 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
625 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
626 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
627 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
628 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
629 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
630 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
631 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
632 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
633 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
636 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
637 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
638 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
639 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
640 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
641 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
642 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
643 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
644 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
645 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
646 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
647 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
648 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
649 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
650 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
651 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
657 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
658 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
659 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
660 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
661 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
662 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
663 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
664 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
665 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
666 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
667 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
668 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
669 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
670 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
671 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
672 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
675 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
676 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
677 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
678 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
679 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
680 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
681 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
682 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
683 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
684 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
685 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
686 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
687 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
688 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
689 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
690 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
696 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
697 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
698 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
699 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
700 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
701 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
702 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
703 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
704 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
705 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
706 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
707 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
708 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
709 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
710 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
711 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
714 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
715 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
716 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
717 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
718 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
719 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
720 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
721 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
722 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
723 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
724 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
725 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
726 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
727 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
728 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
729 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
735 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
736 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
737 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
738 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
739 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
740 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
741 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
742 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
743 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
744 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
745 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
746 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
747 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
748 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
749 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
750 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
753 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
754 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
755 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
756 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
757 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
758 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
759 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
760 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
761 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
762 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
763 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
764 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
765 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
766 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
767 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
768 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
774 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
775 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
776 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
777 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
778 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
779 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
780 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
781 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
782 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
783 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
784 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
785 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
786 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
787 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
788 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
789 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
792 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
793 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
794 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
795 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
796 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
797 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
798 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
799 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
800 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
801 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
802 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
803 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
804 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
805 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
806 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
807 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
813 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
814 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
815 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
816 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
817 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
818 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
819 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
820 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
821 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
822 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
823 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
824 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
825 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
826 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
827 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
828 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
831 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
832 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
833 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
834 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
835 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
836 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
837 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
838 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
839 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
840 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
841 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
842 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
843 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
844 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
845 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
846 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
852 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
853 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
854 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
855 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
856 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
857 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
858 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
859 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
860 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
861 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
862 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
863 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
864 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
865 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
866 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
867 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
870 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
871 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
872 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
873 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
874 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
875 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
876 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
877 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
878 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
879 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
880 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
881 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
882 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
883 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
884 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
885 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
891 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
892 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
893 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
894 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
895 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
896 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
897 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
898 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
899 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
900 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
901 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
902 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
903 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
904 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
905 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
906 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
909 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
910 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
911 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
912 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
913 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
914 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
915 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
916 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
917 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
918 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
919 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
920 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
921 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
922 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
923 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
924 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
930 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
931 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
932 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
933 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
934 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
935 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
936 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
937 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
938 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
939 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
940 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
941 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
942 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
943 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
944 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
945 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
948 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
949 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
950 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
951 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
952 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
953 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
954 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
955 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
956 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
957 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
958 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
959 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
960 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
961 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
962 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
963 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}