3 use std::cell::{Ref,RefCell};
4 use nihav_core::io::bitreader::*;
6 use nihav_core::codecs::*;
7 use nihav_core::formats::*;
8 use nihav_core::frame::*;
12 pub fn scale_mv(val: i32, scale: u8) -> i32 {
13 (val + (if val > 0 { 1 } else { 0 }) + (scale as i32) - 1) >> scale
17 pub struct IVICodebook {
24 pub fn init(&self) -> Self {
26 let mut base: u32 = 0;
29 base += 1 << cb.bits[i];
35 pub const IVI_CB_ZERO: IVICodebook = IVICodebook { len: 0, bits: [0; 16], offs: [0; 16] };
37 const IVI_REV0: [u32; 1] = [0];
38 const IVI_REV1: [u32; 2] = [0, 1];
39 const IVI_REV2: [u32; 4] = [0, 2, 1, 3];
40 const IVI_REV3: [u32; 8] = [0, 4, 2, 6, 1, 5, 3, 7];
41 const IVI_REV4: [u32; 16] = [ 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15];
42 const IVI_REV5: [u32; 32] = [ 0, 16, 8, 24, 4, 20, 12, 28, 2, 18, 10, 26, 6, 22, 14, 30, 1, 17, 9, 25, 5, 21, 13, 29, 3, 19, 11, 27, 7, 23, 15, 31];
43 const IVI_REV6: [u32; 64] = [ 0, 32, 16, 48, 8, 40, 24, 56, 4, 36, 20, 52, 12, 44, 28, 60, 2, 34, 18, 50, 10, 42, 26, 58, 6, 38, 22, 54, 14, 46, 30, 62, 1, 33, 17, 49, 9, 41, 25, 57, 5, 37, 21, 53, 13, 45, 29, 61, 3, 35, 19, 51, 11, 43, 27, 59, 7, 39, 23, 55, 15, 47, 31, 63];
44 const IVI_REV7: [u32; 128] = [ 0, 64, 32, 96, 16, 80, 48, 112, 8, 72, 40, 104, 24, 88, 56, 120, 4, 68, 36, 100, 20, 84, 52, 116, 12, 76, 44, 108, 28, 92, 60, 124, 2, 66, 34, 98, 18, 82, 50, 114, 10, 74, 42, 106, 26, 90, 58, 122, 6, 70, 38, 102, 22, 86, 54, 118, 14, 78, 46, 110, 30, 94, 62, 126, 1, 65, 33, 97, 17, 81, 49, 113, 9, 73, 41, 105, 25, 89, 57, 121, 5, 69, 37, 101, 21, 85, 53, 117, 13, 77, 45, 109, 29, 93, 61, 125, 3, 67, 35, 99, 19, 83, 51, 115, 11, 75, 43, 107, 27, 91, 59, 123, 7, 71, 39, 103, 23, 87, 55, 119, 15, 79, 47, 111, 31, 95, 63, 127];
45 const IVI_REV8: [u32; 256] = [ 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240, 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248, 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244, 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252, 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242, 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250, 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246, 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254, 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241, 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255];
47 const IVI_REVS: [&[u32]; 9] = [ &IVI_REV0, &IVI_REV1, &IVI_REV2, &IVI_REV3, &IVI_REV4, &IVI_REV5, &IVI_REV6, &IVI_REV7, &IVI_REV8];
49 pub trait IVICodebookReader {
50 fn read_ivi_codebook_desc(&mut self, mb_cb: bool, try_default: bool) -> DecoderResult<IVICodebook>;
51 fn read_ivi_cb(&mut self, cb: &IVICodebook) -> BitReaderResult<u32>;
52 fn read_ivi_cb_s(&mut self, cb: &IVICodebook) -> BitReaderResult<i32>;
55 impl<'a> IVICodebookReader for BitReader<'a> {
56 fn read_ivi_codebook_desc(&mut self, mb_cb: bool, desc_coded: bool) -> DecoderResult<IVICodebook> {
59 Ok(IVI_MB_CB[7].init())
61 Ok(IVI_BLK_CB[7].init())
64 let idx = self.read(3)? as usize;
67 Ok(IVI_MB_CB[idx].init())
69 Ok(IVI_BLK_CB[idx].init())
72 let mut cb = IVI_CB_ZERO;
73 cb.len = self.read(4)? as usize;
74 if cb.len == 0 { return Err(DecoderError::InvalidData); }
76 cb.bits[i] = self.read(4)? as u8;
83 fn read_ivi_cb(&mut self, cb: &IVICodebook) -> BitReaderResult<u32> {
84 /* let pfx = if cb.len == 1 { 0 } else { self.read_code(UintCodeType::LimitedUnary((cb.len - 1) as u32, 0))? as usize };
85 let nbits = cb.bits[pfx];
86 let mut base: u32 = 0;
87 for i in 0..pfx { base += 1 << cb.bits[i]; }
88 let rval = self.read(nbits)?;
89 let add = reverse_bits(rval, nbits);
92 let len = (!self.peek(16)).trailing_zeros() as usize;
94 if len >= cb.len - 1 {
96 self.skip((cb.len - 1) as u32)?;
99 self.skip((len + 1) as u32)?;
101 let nbits = cb.bits[pfx];
102 let base = cb.offs[pfx];
103 let rval = self.read(nbits)?;
104 let add = IVI_REVS[nbits as usize][rval as usize];
107 let nbits = cb.bits[0];
108 return Ok(IVI_REVS[nbits as usize][self.read(nbits)? as usize]);
112 fn read_ivi_cb_s(&mut self, cb: &IVICodebook) -> BitReaderResult<i32> {
113 let v = self.read_ivi_cb(cb)?;
117 let sign = (v & 1) == 1;
118 let val = (v >> 1) as i32;
128 pub const IVI_MB_CB: &[IVICodebook; 8] = &[
129 IVICodebook { len: 8, bits: [ 0, 4, 5, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
130 IVICodebook { len: 12, bits: [ 0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
131 IVICodebook { len: 12, bits: [ 0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
132 IVICodebook { len: 12, bits: [ 0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
133 IVICodebook { len: 13, bits: [ 0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
134 IVICodebook { len: 9, bits: [ 0, 4, 4, 4, 4, 3, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
135 IVICodebook { len: 10, bits: [ 0, 4, 4, 4, 4, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
136 IVICodebook { len: 12, bits: [ 0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] }
139 pub const IVI_BLK_CB: &[IVICodebook; 8] = &[
140 IVICodebook { len: 10, bits: [ 1, 2, 3, 4, 4, 7, 5, 5, 4, 1, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
141 IVICodebook { len: 11, bits: [ 2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2, 0, 0, 0, 0, 0 ], offs: [0; 16] },
142 IVICodebook { len: 12, bits: [ 2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1, 0, 0, 0, 0 ], offs: [0; 16] },
143 IVICodebook { len: 13, bits: [ 3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
144 IVICodebook { len: 11, bits: [ 3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2, 0, 0, 0, 0, 0 ], offs: [0; 16] },
145 IVICodebook { len: 13, bits: [ 3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
146 IVICodebook { len: 13, bits: [ 3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
147 IVICodebook { len: 9, bits: [ 3, 4, 4, 5, 5, 5, 6, 5, 5, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] }
150 #[allow(unused_variables)]
151 fn read_trans_band_header(br: &mut BitReader, w: usize, h: usize, dst: &mut [i16], dstride: usize) -> DecoderResult<()> {
152 let color_plane = br.read(2)?;
153 let bit_depth = br.read(3)?;
154 let dirty_rects = br.read(8)? as usize;
155 for i in 0..dirty_rects {
156 let x = br.read(16)?;
157 let y = br.read(16)?;
158 let l = br.read(16)?;
159 let r = br.read(16)?;
161 let has_trans_color = br.read_bool()?;
170 let mut cb = IVI_CB_ZERO;
171 cb.len = br.read(4)? as usize;
172 if cb.len == 0 { return Err(DecoderError::InvalidData); }
174 cb.bits[i] = br.read(4)? as u8;
178 let tile_start = br.tell();
179 let empty = br.read_bool()?;
182 let mut len = br.read(8)? as usize;
184 len = br.read(24)? as usize;
187 let tile_end = tile_start + len * 8;
189 let first_val = br.read_bool()?;
191 let mut dec_size = 0;
194 let mut fill = if !first_val { 255-128 } else { 0-128 };
195 let tr_w = (w + 31) & !31;
196 while br.tell() < tile_end {
197 let code = br.read_ivi_cb(&cb)? as usize;
201 if (x < w) && (y < h) {
202 dst[x + y * dstride] = fill;
213 if (x < w) && (y < h) {
214 dst[x + y * dstride] = fill;
232 fn decode_block8x8(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tables: &TxParams8x8, is_intra: bool, is_2d: bool, prev_dc: &mut i32, quant: u8, coeffs: &mut [i32; 64], transform: &TrFunc) -> DecoderResult<()> {
233 let mut idx: isize = -1;
234 let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter };
236 let c = br.read_ivi_cb(blk_cb)?;
237 if c == rvmap.eob_sym { break; }
240 if c != rvmap.esc_sym {
242 run = rvmap.runtab[c as usize] as isize;
243 val = rvmap.valtab[c as usize] as i32;
245 run = (br.read_ivi_cb(blk_cb)? as isize) + 1;
246 let lo = br.read_ivi_cb(blk_cb)?;
247 let hi = br.read_ivi_cb(blk_cb)?;
248 let v = (hi << 6) + lo;
250 val = 0; // should not happen but still...
252 let vv = (v >> 1) as i32;
261 validate!((idx >= 0) && (idx < 64));
263 let spos = tables.scan[idx as usize];
264 let q = ((quant_mat[spos] as u32) * (quant as u32)) >> 9;
267 let bias = (((q ^ 1) - 1) >> 1) as i32;
268 coeffs[spos] = val * qq;
269 if val > 0 { coeffs[spos] += bias; }
270 else { coeffs[spos] -= bias; }
275 if is_intra && is_2d {
276 *prev_dc += coeffs[0];
277 coeffs[0] = *prev_dc;
282 fn decode_block4x4(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tables: &TxParams4x4, is_intra: bool, is_2d: bool, prev_dc: &mut i32, quant: u8, coeffs: &mut [i32; 64], transform: &TrFunc) -> DecoderResult<()> {
283 let mut idx: isize = -1;
284 let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter };
286 let c = br.read_ivi_cb(blk_cb)?;
287 if c == rvmap.eob_sym { break; }
290 if c != rvmap.esc_sym {
292 run = rvmap.runtab[c as usize] as isize;
293 val = rvmap.valtab[c as usize] as i32;
295 run = (br.read_ivi_cb(blk_cb)? as isize) + 1;
296 let lo = br.read_ivi_cb(blk_cb)?;
297 let hi = br.read_ivi_cb(blk_cb)?;
298 let v = (hi << 6) + lo;
300 val = 0; // should not happen but still...
303 val = ((v >> 1) as i32) + 1;
305 val = -((v >> 1) as i32);
310 validate!((idx >= 0) && (idx < 16));
312 let spos = tables.scan[idx as usize];
313 let q = ((quant_mat[spos] as u32) * (quant as u32)) >> 9;
316 let bias = (((q ^ 1) - 1) >> 1) as i32;
317 coeffs[spos] = val * qq;
318 if val > 0 { coeffs[spos] += bias; }
319 else { coeffs[spos] -= bias; }
324 if is_intra && is_2d {
325 *prev_dc += coeffs[0];
326 coeffs[0] = *prev_dc;
332 fn put_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) {
334 let mut dptr = frame.as_mut_ptr().offset(offs as isize);
335 for y in 0..blk_size {
336 for x in 0..blk_size {
337 *dptr.offset(x as isize) = blk[x + y * blk_size] as i16;
339 dptr = dptr.offset(stride as isize);
344 fn add_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) {
346 let mut dptr = frame.as_mut_ptr().offset(offs as isize);
347 for y in 0..blk_size {
348 for x in 0..blk_size {
349 *dptr.offset(x as isize) = (*dptr.offset(x as isize)).wrapping_add(blk[x + y * blk_size] as i16);
351 dptr = dptr.offset(stride as isize);
357 plane_buf: [Vec<i16>; 4],
358 plane_stride: [usize; 4],
359 pic_hdr: PictureHeader,
362 fn align(val: usize, bits: u8) -> usize {
363 let mask = (1 << bits) - 1;
368 fn new() -> Rc<RefCell<Self>> {
369 Rc::new(RefCell::new(FrameData {
370 plane_buf: [Vec::new(), Vec::new(), Vec::new(), Vec::new()],
371 plane_stride: [0, 0, 0, 0],
372 pic_hdr: PictureHeader::new_null(IVIFrameType::Intra),
375 fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> {
376 let width = align(pic_hdr.width, 6);
377 let height = align(pic_hdr.height, 6);
380 self.plane_buf[0].resize(stride * height, 0);
381 self.plane_stride[0] = stride;
383 self.plane_buf[plane].resize((stride >> 1) * (height >> 1), 0);
384 self.plane_stride[plane] = stride >> 1;
386 if pic_hdr.transparent {
387 self.plane_buf[3].resize(stride * height, 0);
388 self.plane_stride[3] = stride;
390 self.pic_hdr = *pic_hdr;
393 fn fill_plane(&mut self, vb: &mut NAVideoBuffer<u8>, plane: usize) {
394 let (w, h) = vb.get_dimensions(plane);
395 let mut didx = vb.get_offset(plane);
396 let dstride = vb.get_stride(plane);
397 let mut dst = vb.get_data_mut();
398 let src = &self.plane_buf[plane];
400 let sstride = self.plane_stride[plane];
403 dst[didx + x] = clip8(src[sidx + x] + 128);
411 fn do_mc(dst: &mut [i16], dstride: usize, src: &[i16], sstride: usize, x: usize, y: usize, l: usize, r: usize, t: usize, b: usize, mv_x: i32, mv_y: i32, is_hpel: bool, blk_size: usize) {
412 let (xoff, yoff, mv_mode) = if is_hpel {
413 (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8)
417 let xpos = (x as isize) + (xoff as isize);
418 let ypos = (y as isize) + (yoff as isize);
419 if (xpos < (l as isize)) || ((xpos as usize) + blk_size + ((mv_mode & 1) as usize) > r) ||
420 (ypos < (t as isize)) || ((ypos as usize) + blk_size + ((mv_mode >> 1) as usize) > b) {
421 //println!(" copy from {},{} of {}-{},{}-{} {}x{}!", xpos, ypos, l,r,t,b,blk_size,blk_size);
424 let sidx = (xpos as usize) + (ypos as usize) * sstride;
426 ivi_mc_put(dst, dstride, &src[sidx..], sstride, mv_mode, 8, 8);
428 ivi_mc_put(dst, dstride, &src[sidx..], sstride, mv_mode, 4, 4);
432 fn do_mc_b(dst: &mut [i16], dstride: usize, src1: &[i16], sstride1: usize, src2: &[i16], sstride2: usize, x: usize, y: usize, l: usize, r: usize, t: usize, b: usize, mv_x: i32, mv_y: i32, mv2_x: i32, mv2_y: i32, is_hpel: bool, blk_size: usize) {
433 let (xoff1, yoff1, mv_mode1) = if is_hpel {
434 (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8)
438 let xpos1 = (x as isize) + (xoff1 as isize);
439 let ypos1 = (y as isize) + (yoff1 as isize);
440 if (xpos1 < (l as isize)) || ((xpos1 as usize) + blk_size + ((mv_mode1 & 1) as usize) > r) ||
441 (ypos1 < (t as isize)) || ((ypos1 as usize) + blk_size + ((mv_mode1 >> 1) as usize) > b) {
444 let sidx1 = (xpos1 as usize) + (ypos1 as usize) * sstride1;
445 let (xoff2, yoff2, mv_mode2) = if is_hpel {
446 (mv2_x >> 1, mv2_y >> 1, ((mv2_x & 1) + (mv2_y & 1) * 2) as u8)
450 let xpos2 = (x as isize) + (xoff2 as isize);
451 let ypos2 = (y as isize) + (yoff2 as isize);
452 if (xpos2 < (l as isize)) || ((xpos2 as usize) + blk_size + ((mv_mode2 & 1) as usize) > r) ||
453 (ypos2 < (t as isize)) || ((ypos2 as usize) + blk_size + ((mv_mode2 >> 1) as usize) > b) {
456 let sidx2 = (xpos2 as usize) + (ypos2 as usize) * sstride2;
457 ivi_mc_avg(dst, dstride, &src1[sidx1..], sstride1, mv_mode1, &src2[sidx2..], sstride2, mv_mode2, blk_size, blk_size);
460 pub trait IndeoXParser {
461 fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult<PictureHeader>;
462 fn decode_band_header(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, plane: usize, band: usize) -> DecoderResult<BandHeader>;
463 fn decode_mb_info(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, band_hdr: &BandHeader, tile: &mut IVITile, ref_tile: Option<Ref<IVITile>>, mv_scale: u8) -> DecoderResult<()>;
464 fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize);
467 const MISSING_REF: usize = 42;
469 pub struct IVIDecoder {
471 frames: [Rc<RefCell<FrameData>>; 4],
480 bref: Option<NABufferType>,
482 bands: Vec<BandHeader>,
483 tiles: Vec<Rc<RefCell<IVITile>>>,
484 num_tiles: [[usize; 4]; 4],
485 tile_start: [[usize; 4]; 4],
489 pub fn new() -> Self {
490 let mut bands: Vec<BandHeader> = Vec::with_capacity(12);
491 bands.resize(12, BandHeader::new_empty(42, 42));
493 ftype: IVIFrameType::NULL,
494 frames: [FrameData::new(), FrameData::new(), FrameData::new(), FrameData::new()],
495 cur_frame: 0, prev_frame: MISSING_REF, next_frame: MISSING_REF,
496 iref_0: MISSING_REF, iref_1: MISSING_REF, scal_ref: MISSING_REF,
497 vinfo: NAVideoInfo::new(0, 0, false, YUV410_FORMAT),
498 vinfoa: NAVideoInfo::new(0, 0, false, YUVA410_FORMAT),
502 tiles: Vec::new(), tile_start: [[0; 4]; 4], num_tiles: [[0; 4]; 4],
506 fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> {
507 let planes = if pic_hdr.transparent { 4 } else { 3 };
509 //self.bands.truncate(0);
510 self.tiles.truncate(0);
511 self.num_tiles = [[0; 4]; 4];
512 self.tile_start = [[0; 4]; 4];
513 let mut tstart: usize = 0;
514 for plane in 0..planes {
515 let is_luma = (plane != 1) && (plane != 2);
516 let bands = if is_luma { pic_hdr.luma_bands } else { pic_hdr.chroma_bands };
517 let mut band_w = if is_luma { pic_hdr.width } else { (pic_hdr.width + 3) >> 2 };
518 let mut band_h = if is_luma { pic_hdr.height } else { (pic_hdr.height + 3) >> 2 };
519 let mut tile_w = if is_luma { pic_hdr.slice_w } else { (pic_hdr.slice_w + 3) >> 2 };
520 let mut tile_h = if is_luma { pic_hdr.slice_h } else { (pic_hdr.slice_h + 3) >> 2 };
522 band_w = (band_w + 1) >> 1;
523 band_h = (band_h + 1) >> 1;
525 tile_w = (tile_w + 1) >> 1;
526 tile_h = (tile_h + 1) >> 1;
529 for band in 0..bands {
530 self.tile_start[plane][band] = tstart;
531 let band_xoff = if (band & 1) == 1 { band_w } else { 0 };
532 let band_yoff = if (band & 2) == 2 { band_h } else { 0 };
535 let cur_h = if y + tile_h <= band_h { tile_h } else { band_h - y };
538 let cur_w = if x + tile_w <= band_w { tile_w } else { band_w - x };
539 let tile = IVITile::new(band_xoff + x, band_yoff + y, cur_w, cur_h);
540 self.tiles.push(Rc::new(RefCell::new(tile)));
541 self.num_tiles[plane][band] += 1;
551 fn decode_band(&mut self, pic_hdr: &PictureHeader, dec: &mut IndeoXParser, br: &mut BitReader, plane_no: usize, band_no: usize) -> DecoderResult<()> {
552 let bidx = match plane_no {
554 _ => { pic_hdr.luma_bands + plane_no - 1 },
556 let prev_band = if bidx >= self.bands.len() { BandHeader::new_empty(plane_no, band_no) } else { self.bands[bidx].clone() };
557 let mut band = dec.decode_band_header(br, pic_hdr, plane_no, band_no)?;
558 if let TxType::None = band.ttype {
559 validate!(band.plane_no == prev_band.plane_no);
560 validate!(band.band_no == prev_band.band_no);
561 validate!(band.blk_size == prev_band.blk_size);
562 band.tr = prev_band.tr;
563 band.ttype = prev_band.ttype;
566 let tstart = self.tile_start[band.plane_no][band.band_no];
567 let tend = tstart + self.num_tiles[band.plane_no][band.band_no];
568 let mb_size = band.mb_size;
569 let (tr, tr_dc) = match band.ttype {
570 TxType::Transform4(_) => { ivi_get_transform4x4_funcs(band.tr) },
571 TxType::Transform8(_) => { ivi_get_transform8x8_funcs(band.tr) },
572 _ => { ivi_get_transform4x4_funcs(band.tr) },
574 for tile_no in tstart..tend {
576 let mut tile = self.tiles[tile_no].borrow_mut();
577 let mb_w = (tile.w + mb_size - 1) / mb_size;
578 let mb_h = (tile.h + mb_size - 1) / mb_size;
582 tile.mb.resize(mb_w * mb_h, MB::new(0, 0));
585 let tile_start = br.tell();
586 if !br.read_bool()? {
587 let res = br.read_bool()?;
589 let mut len = br.read(8)? as usize;
591 len = br.read(24)? as usize;
595 let tile_end = tile_start + len * 8;
596 validate!(tile_end > br.tell());
597 validate!(tile_end <= br.tell() + (br.left() as usize));
599 let mut tile = self.tiles[tile_no].borrow_mut();
600 let ref_tile: Option<Ref<IVITile>>;
602 if (plane_no == 0) && (band_no == 0) {
605 mv_scale = (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8;
607 if plane_no != 0 || band_no != 0 {
608 let rtile = self.tiles[0].borrow();
609 if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) {
612 ref_tile = Some(rtile);
617 dec.decode_mb_info(br, pic_hdr, &band, &mut tile, ref_tile, mv_scale)?;
620 self.decode_tile(br, &band, tile_no, &tr, &tr_dc)?;
621 let skip_part = tile_end - br.tell();
622 br.skip(skip_part as u32)?;
625 let mut tile = self.tiles[tile_no].borrow_mut();
626 let ref_tile: Option<Ref<IVITile>>;
628 if (plane_no == 0) && (band_no == 0) {
631 mv_scale = (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8;
633 if plane_no != 0 || band_no != 0 {
634 let rtile = self.tiles[0].borrow();
635 if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) {
638 ref_tile = Some(rtile);
644 for mb_y in 0..tile.mb_h {
645 for mb_x in 0..tile.mb_w {
646 let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size);
647 mb.mtype = MBType::Inter;
650 if let Some(ref tileref) = ref_tile {
651 let mx = tileref.mb[mb_idx].mv_x;
652 let my = tileref.mb[mb_idx].mv_y;
653 mb.mv_x = scale_mv(mx, mv_scale);
654 mb.mv_y = scale_mv(my, mv_scale);
657 tile.mb[mb_idx] = mb;
662 self.decode_tile(br, &band, tile_no, &tr, &tr_dc)?;
665 self.bands[bidx] = band;
669 fn decode_tile(&mut self, br: &mut BitReader, band: &BandHeader, tile_no: usize, tr: &TrFunc, transform_dc: &TrFuncDC) -> DecoderResult<()> {
671 let mut prev_dc: i32 = 0;
672 let mut tile = self.tiles[tile_no].borrow_mut();
673 let mut frame = self.frames[self.cur_frame].borrow_mut();
675 let stride = frame.plane_stride[band.plane_no];
676 let mut dstidx = tile.pos_x + tile.pos_y * stride;
677 let mut dst = &mut frame.plane_buf[band.plane_no];
678 let pos_x = tile.pos_x;
679 let pos_y = tile.pos_y;
680 let tile_w = (tile.w + 15) & !15;
681 let tile_h = (tile.h + 15) & !15;
682 for mb_y in 0..tile.mb_h {
683 for mb_x in 0..tile.mb_w {
684 let mb = &mut tile.mb[mb_idx];
686 let is_intra = mb.mtype == MBType::Intra;
688 if band.mb_size != band.blk_size {
689 let mut cbp = mb.cbp;
691 let mut blk: [i32; 64] = [0; 64];
692 let boff = (blk_no & 1) * 8 + (blk_no & 2) * 4 * stride + mb_x * 16;
694 if mb.mtype != MBType::Bidir {
696 if mb.mtype != MBType::Backward {
697 idx = self.prev_frame;
699 idx = self.next_frame;
701 let pf = self.frames[idx].borrow();
702 do_mc(&mut dst[dstidx + boff..], stride,
703 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
704 pos_x + mb_x * 16 + (blk_no & 1) * 8,
705 pos_y + mb_y * 16 + (blk_no & 2) * 4,
706 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
707 mb.mv_x, mb.mv_y, band.halfpel, 8);
709 let pf = self.frames[self.prev_frame].borrow();
710 let nf = self.frames[self.next_frame].borrow();
711 do_mc_b(&mut dst[dstidx + boff..], stride,
712 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
713 &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no],
714 pos_x + mb_x * 16 + (blk_no & 1) * 8,
715 pos_y + mb_y * 16 + (blk_no & 2) * 4,
716 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
717 mb.mv_x, mb.mv_y, mb.mv2_x, mb.mv2_y, band.halfpel,
722 if let TxType::Transform8(ref params) = band.ttype {
723 decode_block8x8(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
725 put_block(&mut dst, dstidx + boff, stride, &blk, 8);
727 add_block(&mut dst, dstidx + boff, stride, &blk, 8);
732 (transform_dc)(&mut blk, prev_dc);
733 put_block(&mut dst, dstidx + boff, stride, &blk, 8);
739 let mut blk: [i32; 64] = [0; 64];
741 if mb.mtype != MBType::Bidir {
743 if mb.mtype != MBType::Backward {
744 idx = self.prev_frame;
746 idx = self.next_frame;
748 let pf = self.frames[idx].borrow();
749 do_mc(&mut dst[dstidx + mb_x * band.blk_size..], stride,
750 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
751 pos_x + mb_x * band.mb_size,
752 pos_y + mb_y * band.mb_size,
753 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
754 mb.mv_x, mb.mv_y, band.halfpel, band.blk_size);
756 let pf = self.frames[self.prev_frame].borrow();
757 let nf = self.frames[self.next_frame].borrow();
758 do_mc_b(&mut dst[dstidx + mb_x * band.blk_size..], stride,
759 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
760 &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no],
761 pos_x + mb_x * band.mb_size,
762 pos_y + mb_y * band.mb_size,
763 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
764 mb.mv_x, mb.mv_y, mb.mv2_x, mb.mv2_y, band.halfpel,
769 if let TxType::Transform8(ref params) = band.ttype {
770 decode_block8x8(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
772 if let TxType::Transform4(ref params) = band.ttype {
773 decode_block4x4(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
776 if band.blk_size == 8 {
777 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
779 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
782 if band.blk_size == 8 {
783 add_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
785 add_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
790 (transform_dc)(&mut blk, prev_dc);
791 if band.blk_size == 8 {
792 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
794 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
801 dstidx += stride * band.mb_size;
807 fn find_unused_frame(&self) -> usize {
809 if (fno != self.iref_0) && (fno != self.iref_1) && (fno != self.scal_ref) {
816 fn decode_single_frame<'a>(&mut self, dec: &mut IndeoXParser, br: &mut BitReader<'a>) -> DecoderResult<NABufferType> {
817 let pic_hdr = dec.decode_picture_header(br)?;
818 self.ftype = pic_hdr.ftype;
819 if pic_hdr.ftype.is_null() {
820 return Ok(NABufferType::None);
823 self.cur_frame = self.find_unused_frame();
825 IVIFrameType::Inter => {
826 self.prev_frame = self.iref_0;
827 if self.prev_frame == MISSING_REF {
828 return Err(DecoderError::MissingReference);
831 IVIFrameType::InterDroppable => {
832 self.prev_frame = self.scal_ref;
833 if self.prev_frame == MISSING_REF {
834 return Err(DecoderError::MissingReference);
837 IVIFrameType::InterScal => {
838 self.prev_frame = self.scal_ref;
839 if self.prev_frame == MISSING_REF {
840 return Err(DecoderError::MissingReference);
843 IVIFrameType::Bidir => {
844 self.prev_frame = self.iref_1;
845 self.next_frame = self.iref_0;
846 if (self.prev_frame == MISSING_REF) || (self.next_frame == MISSING_REF) {
847 return Err(DecoderError::MissingReference);
854 if pic_hdr.transparent {
855 vinfo = self.vinfoa.clone();
857 vinfo = self.vinfo.clone();
859 vinfo.set_width(pic_hdr.width);
860 vinfo.set_height(pic_hdr.height);
861 let mut buftype = alloc_video_buffer(vinfo, 0)?;
862 self.realloc(&pic_hdr)?;
863 self.frames[self.cur_frame].borrow_mut().realloc(&pic_hdr)?;
866 let num_bands = if plane == 0 { pic_hdr.luma_bands } else { pic_hdr.chroma_bands };
867 for band in 0..num_bands {
868 self.decode_band(&pic_hdr, dec, br, plane, band)?;
870 if let NABufferType::Video(ref mut vb) = buftype {
871 let mut frame = self.frames[self.cur_frame].borrow_mut();
873 frame.fill_plane(vb, plane);
875 let (w, h) = vb.get_dimensions(plane);
876 let dstride = vb.get_stride(plane);
877 let off = vb.get_offset(plane);
878 let mut dst = vb.get_data_mut();
879 dec.recombine_plane(&frame.plane_buf[plane], frame.plane_stride[plane], &mut dst[off..], dstride, w, h);
883 if pic_hdr.transparent {
884 let mut frame = self.frames[self.cur_frame].borrow_mut();
885 let stride = frame.plane_stride[3];
886 read_trans_band_header(br, pic_hdr.width, pic_hdr.height, &mut frame.plane_buf[3], stride)?;
887 if let NABufferType::Video(ref mut vb) = buftype {
888 frame.fill_plane(vb, 3);
893 IVIFrameType::Intra | IVIFrameType::Inter => {
894 self.iref_1 = self.iref_0;
895 self.iref_0 = self.cur_frame;
896 self.scal_ref = self.cur_frame;
898 IVIFrameType::InterScal => {
899 self.scal_ref = self.cur_frame;
907 pub fn decode_frame<'a>(&mut self, dec: &mut IndeoXParser, br: &mut BitReader<'a>) -> DecoderResult<NABufferType> {
908 let res = self.decode_single_frame(dec, br);
909 if res.is_err() { return res; }
910 if (self.ftype == IVIFrameType::Intra) && (br.left() > 16) {
912 if br.left() < 8 { break; }
913 if br.read(8)? == 0 { break; }
916 if br.left() < 8 { break; }
917 if br.peek(8) != 0 { break; }
921 let seq = br.peek(21);
923 let res2 = self.decode_single_frame(dec, br);
925 self.bref = Some(res2.unwrap());
928 self.ftype = IVIFrameType::Intra;
931 if let Ok(NABufferType::None) = res {
932 if self.bref.is_some() {
933 let mut bref: Option<NABufferType> = None;
934 mem::swap(&mut bref, &mut self.bref);
935 self.ftype = IVIFrameType::Inter;
936 return Ok(bref.unwrap());
942 pub fn is_intra(&mut self) -> bool {
943 self.ftype.is_intra()
945 pub fn get_frame_type(&mut self) -> FrameType {
947 IVIFrameType::Intra => { FrameType::I },
948 IVIFrameType::Intra1 => { FrameType::I },
949 IVIFrameType::Inter => { FrameType::P },
950 IVIFrameType::InterDroppable => { FrameType::P },
951 IVIFrameType::InterScal => { FrameType::P },
952 IVIFrameType::Bidir => { FrameType::B },
953 _ => { FrameType::Skip },
961 pub runtab: [u8; 256],
962 pub valtab: [i8; 256],
965 impl Clone for RVMap {
966 fn clone(&self) -> RVMap {
967 let mut runtab: [u8; 256] = [0; 256];
968 let mut valtab: [i8; 256] = [0; 256];
969 runtab.copy_from_slice(&self.runtab);
970 valtab.copy_from_slice(&self.valtab);
971 RVMap { eob_sym: self.eob_sym, esc_sym: self.esc_sym, runtab: runtab, valtab: valtab }
975 pub const IVI_ZERO_RVMAP: RVMap = RVMap { eob_sym: 0, esc_sym: 0, runtab: [0; 256], valtab: [0; 256] };
977 pub static IVI_RVMAPS: [RVMap; 9] = [
978 RVMap { eob_sym: 5, esc_sym: 2, runtab: [
979 1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
980 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
981 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
982 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
983 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
984 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
985 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
986 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
987 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
988 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
989 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
990 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
991 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
992 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
993 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
994 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38 ],
996 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
997 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
998 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
999 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
1000 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
1001 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
1002 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
1003 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
1004 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
1005 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
1006 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
1007 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
1008 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
1009 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
1010 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
1011 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1 ],
1013 RVMap { eob_sym: 0, esc_sym: 38, runtab: [
1014 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
1015 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
1016 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1017 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
1018 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
1019 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
1020 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
1021 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
1022 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
1023 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
1024 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
1025 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
1026 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
1027 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
1028 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
1029 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5 ],
1031 0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
1032 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
1033 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
1034 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
1035 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
1036 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
1037 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
1038 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
1039 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
1040 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
1041 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
1042 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
1043 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
1044 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
1045 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
1046 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4 ],
1048 RVMap { eob_sym: 2, esc_sym: 11, runtab: [
1049 1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
1050 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
1051 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
1052 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
1053 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
1054 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
1055 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
1056 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
1057 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
1058 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
1059 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
1060 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
1061 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
1062 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
1063 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
1064 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62 ],
1066 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
1067 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
1068 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
1069 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
1070 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
1071 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
1072 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
1073 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
1074 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
1075 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
1076 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
1077 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
1078 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
1079 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
1080 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
1081 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1 ]
1083 RVMap { eob_sym: 0, esc_sym: 35, runtab: [
1084 0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
1085 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
1086 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
1087 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
1088 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
1089 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
1090 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
1091 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
1092 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
1093 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
1094 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
1095 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
1096 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
1097 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
1098 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
1099 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16 ],
1101 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
1102 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
1103 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
1104 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
1105 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
1106 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
1107 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
1108 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
1109 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
1110 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
1111 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
1112 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
1113 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
1114 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
1115 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
1116 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3 ]
1118 RVMap { eob_sym: 0, esc_sym: 34, runtab: [
1119 0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
1120 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
1121 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
1122 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
1123 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
1124 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1125 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
1126 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
1127 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
1128 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
1129 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
1130 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
1131 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
1132 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
1133 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
1134 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1 ],
1136 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
1137 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
1138 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
1139 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
1140 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
1141 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
1142 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
1143 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
1144 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
1145 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
1146 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
1147 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
1148 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
1149 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
1150 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
1151 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89 ]
1153 RVMap { eob_sym: 2, esc_sym: 33, runtab: [
1154 1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
1155 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
1156 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
1157 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
1158 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
1159 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
1160 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
1161 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
1162 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
1163 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
1164 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
1165 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
1166 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
1167 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
1168 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
1169 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7 ],
1171 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
1172 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
1173 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
1174 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
1175 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
1176 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
1177 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
1178 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
1179 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
1180 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
1181 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
1182 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
1183 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
1184 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
1185 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
1186 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5 ]
1188 RVMap { eob_sym: 2, esc_sym: 13, runtab: [
1189 1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
1190 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
1191 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
1192 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
1193 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
1194 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
1195 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
1196 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
1197 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
1198 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
1199 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
1200 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
1201 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
1202 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
1203 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
1204 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2 ],
1206 -20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
1207 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
1208 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
1209 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
1210 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
1211 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
1212 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
1213 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
1214 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
1215 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
1216 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
1217 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
1218 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
1219 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
1220 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
1221 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14 ]
1223 RVMap { eob_sym: 2, esc_sym: 38, runtab: [
1224 1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
1225 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
1226 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
1227 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
1228 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
1229 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
1230 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
1231 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
1232 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
1233 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
1234 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
1235 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
1236 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
1237 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
1238 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
1239 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49 ],
1241 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
1242 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
1243 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
1244 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
1245 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
1246 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
1247 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
1248 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
1249 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
1250 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
1251 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
1252 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
1253 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
1254 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
1255 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
1256 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1 ]
1258 RVMap { eob_sym: 4, esc_sym: 11, runtab: [
1259 1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
1260 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
1261 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
1262 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
1263 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
1264 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
1265 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
1266 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
1267 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
1268 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
1269 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
1270 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
1271 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
1272 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
1273 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
1274 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1 ],
1276 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
1277 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
1278 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
1279 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
1280 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
1281 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
1282 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
1283 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
1284 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
1285 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
1286 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
1287 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
1288 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
1289 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
1290 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
1291 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26 ]