From 2caa5edc256cb2b3dbbff41e79ea2b16b3b69f06 Mon Sep 17 00:00:00 2001 From: Matthew Duggan Date: Thu, 7 Nov 2013 17:35:04 +0900 Subject: [PATCH] PEP8: Whitespace changes to match pep8 --- pdfminer/__init__.py | 3 +- pdfminer/arcfour.py | 1 + pdfminer/ascii85.py | 7 +- pdfminer/ccitt.py | 135 ++-- pdfminer/cmapdb.py | 66 +- pdfminer/converter.py | 49 +- pdfminer/encodingdb.py | 31 +- pdfminer/image.py | 8 +- pdfminer/layout.py | 117 ++-- pdfminer/lzw.py | 14 +- pdfminer/pdfcolor.py | 23 +- pdfminer/pdfdevice.py | 22 +- pdfminer/pdfdocument.py | 130 ++-- pdfminer/pdffont.py | 118 ++-- pdfminer/pdfinterp.py | 180 ++++-- pdfminer/pdfpage.py | 18 +- pdfminer/pdfparser.py | 12 +- pdfminer/pdftypes.py | 54 +- pdfminer/psparser.py | 62 +- pdfminer/rijndael.py | 1326 ++++++++++++++++++++------------------- pdfminer/runlength.py | 3 +- pdfminer/utils.py | 141 +++-- 22 files changed, 1395 insertions(+), 1125 deletions(-) diff --git a/pdfminer/__init__.py b/pdfminer/__init__.py index 4244f11..a2f2971 100644 --- a/pdfminer/__init__.py +++ b/pdfminer/__init__.py @@ -1,4 +1,5 @@ #!/usr/bin/env python __version__ = '20131022' -if __name__ == '__main__': print __version__ +if __name__ == '__main__': + print __version__ diff --git a/pdfminer/arcfour.py b/pdfminer/arcfour.py index 0675ee9..7adcf60 100644 --- a/pdfminer/arcfour.py +++ b/pdfminer/arcfour.py @@ -6,6 +6,7 @@ This code is in the public domain. """ + ## Arcfour ## class Arcfour(object): diff --git a/pdfminer/ascii85.py b/pdfminer/ascii85.py index 249cdf9..80df0ba 100644 --- a/pdfminer/ascii85.py +++ b/pdfminer/ascii85.py @@ -9,6 +9,7 @@ This code is in the public domain. import re import struct + # ascii85decode(data) def ascii85decode(data): """ @@ -35,7 +36,7 @@ def ascii85decode(data): n += 1 b = b*85+(ord(c)-33) if n == 5: - out += struct.pack('>L',b) + out += struct.pack('>L', b) n = b = 0 elif c == 'z': assert n == 0 @@ -44,13 +45,15 @@ def ascii85decode(data): if n: for _ in range(5-n): b = b*85+84 - out += struct.pack('>L',b)[:n-1] + out += struct.pack('>L', b)[:n-1] break return out # asciihexdecode(data) hex_re = re.compile(r'([a-f\d]{2})', re.IGNORECASE) trail_re = re.compile(r'^(?:[a-f\d]{2}|\s)*([a-f\d])[\s>]*$', re.IGNORECASE) + + def asciihexdecode(data): """ ASCIIHexDecode filter: PDFReference v1.4 section 3.3.1 diff --git a/pdfminer/ccitt.py b/pdfminer/ccitt.py index 4d764f5..5c7f695 100644 --- a/pdfminer/ccitt.py +++ b/pdfminer/ccitt.py @@ -25,10 +25,11 @@ class BitParser(object): @classmethod def add(klass, root, v, bits): p = root + b = None for i in xrange(len(bits)): if 0 < i: if p[b] is None: - p[b] = [None,None] + p[b] = [None, None] p = p[b] if bits[i] == '1': b = 1 @@ -40,7 +41,7 @@ class BitParser(object): def feedbytes(self, data): for c in data: b = ord(c) - for m in (128,64,32,16,8,4,2,1): + for m in (128, 64, 32, 16, 8, 4, 2, 1): self._parse_bit(b & m) return @@ -61,7 +62,7 @@ class BitParser(object): ## class CCITTG4Parser(BitParser): - MODE = [None,None] + MODE = [None, None] BitParser.add(MODE, 0, '1') BitParser.add(MODE, +1, '011') BitParser.add(MODE, -1, '010') @@ -81,7 +82,7 @@ class CCITTG4Parser(BitParser): BitParser.add(MODE, 'x7', '0000001110') BitParser.add(MODE, 'e', '000000000001000000000001') - WHITE = [None,None] + WHITE = [None, None] BitParser.add(WHITE, 0 , '00110101') BitParser.add(WHITE, 1 , '000111') BitParser.add(WHITE, 2 , '0111') @@ -187,7 +188,7 @@ class CCITTG4Parser(BitParser): BitParser.add(WHITE, 2496, '000000011110') BitParser.add(WHITE, 2560, '000000011111') - BLACK = [None,None] + BLACK = [None, None] BitParser.add(BLACK, 0 , '0000110111') BitParser.add(BLACK, 1 , '010') BitParser.add(BLACK, 2 , '11') @@ -293,25 +294,30 @@ class CCITTG4Parser(BitParser): BitParser.add(BLACK, 2496, '000000011110') BitParser.add(BLACK, 2560, '000000011111') - UNCOMPRESSED = [None,None] - BitParser.add(UNCOMPRESSED, '1' , '1') - BitParser.add(UNCOMPRESSED, '01' , '01') - BitParser.add(UNCOMPRESSED, '001' , '001') - BitParser.add(UNCOMPRESSED, '0001' , '0001') - BitParser.add(UNCOMPRESSED, '00001' , '00001') - BitParser.add(UNCOMPRESSED, '00000' , '000001') - BitParser.add(UNCOMPRESSED, 'T00' , '00000011') - BitParser.add(UNCOMPRESSED, 'T10' , '00000010') - BitParser.add(UNCOMPRESSED, 'T000' , '000000011') - BitParser.add(UNCOMPRESSED, 'T100' , '000000010') - BitParser.add(UNCOMPRESSED, 'T0000' , '0000000011') - BitParser.add(UNCOMPRESSED, 'T1000' , '0000000010') - BitParser.add(UNCOMPRESSED, 'T00000' , '00000000011') - BitParser.add(UNCOMPRESSED, 'T10000' , '00000000010') + UNCOMPRESSED = [None, None] + BitParser.add(UNCOMPRESSED, '1', '1') + BitParser.add(UNCOMPRESSED, '01', '01') + BitParser.add(UNCOMPRESSED, '001', '001') + BitParser.add(UNCOMPRESSED, '0001', '0001') + BitParser.add(UNCOMPRESSED, '00001', '00001') + BitParser.add(UNCOMPRESSED, '00000', '000001') + BitParser.add(UNCOMPRESSED, 'T00', '00000011') + BitParser.add(UNCOMPRESSED, 'T10', '00000010') + BitParser.add(UNCOMPRESSED, 'T000', '000000011') + BitParser.add(UNCOMPRESSED, 'T100', '000000010') + BitParser.add(UNCOMPRESSED, 'T0000', '0000000011') + BitParser.add(UNCOMPRESSED, 'T1000', '0000000010') + BitParser.add(UNCOMPRESSED, 'T00000', '00000000011') + BitParser.add(UNCOMPRESSED, 'T10000', '00000000010') - class EOFB(Exception): pass - class InvalidData(Exception): pass - class ByteSkip(Exception): pass + class EOFB(Exception): + pass + + class InvalidData(Exception): + pass + + class ByteSkip(Exception): + pass def __init__(self, width, bytealign=False): BitParser.__init__(self) @@ -324,7 +330,7 @@ class CCITTG4Parser(BitParser): for c in data: b = ord(c) try: - for m in (128,64,32,16,8,4,2,1): + for m in (128, 64, 32, 16, 8, 4, 2, 1): self._parse_bit(b & m) except self.ByteSkip: self._accept = self._parse_mode @@ -358,7 +364,8 @@ class CCITTG4Parser(BitParser): raise self.InvalidData(mode) def _parse_horiz1(self, n): - if n is None: raise self.InvalidData + if n is None: + raise self.InvalidData self._n1 += n if n < 64: self._n2 = 0 @@ -370,7 +377,8 @@ class CCITTG4Parser(BitParser): return self.BLACK def _parse_horiz2(self, n): - if n is None: raise self.InvalidData + if n is None: + raise self.InvalidData self._n2 += n if n < 64: self._color = 1-self._color @@ -384,7 +392,8 @@ class CCITTG4Parser(BitParser): return self.BLACK def _parse_uncompressed(self, bits): - if not bits: raise self.InvalidData + if not bits: + raise self.InvalidData if bits.startswith('T'): self._accept = self._parse_mode self._color = int(bits[1]) @@ -395,17 +404,17 @@ class CCITTG4Parser(BitParser): return self.UNCOMPRESSED def _get_bits(self): - return ''.join( str(b) for b in self._curline[:self._curpos] ) + return ''.join(str(b) for b in self._curline[:self._curpos]) def _get_refline(self, i): if i < 0: - return '[]'+''.join( str(b) for b in self._refline ) + return '[]'+''.join(str(b) for b in self._refline) elif len(self._refline) <= i: - return ''.join( str(b) for b in self._refline )+'[]' + return ''.join(str(b) for b in self._refline)+'[]' else: - return (''.join( str(b) for b in self._refline[:i] )+ - '['+str(self._refline[i])+']'+ - ''.join( str(b) for b in self._refline[i+1:] )) + return (''.join(str(b) for b in self._refline[:i]) + + '['+str(self._refline[i])+']' + + ''.join(str(b) for b in self._refline[i+1:])) def reset(self): self._y = 0 @@ -416,7 +425,7 @@ class CCITTG4Parser(BitParser): return def output_line(self, y, bits): - print y, ''.join( str(b) for b in bits ) + print y, ''.join(str(b) for b in bits) return def _reset_line(self): @@ -441,12 +450,13 @@ class CCITTG4Parser(BitParser): x1 = self._curpos+1 while 1: if x1 == 0: - if (self._color == 1 and - self._refline[x1] != self._color): break + if (self._color == 1 and self._refline[x1] != self._color): + break elif x1 == len(self._refline): break elif (self._refline[x1-1] == self._color and - self._refline[x1] != self._color): break + self._refline[x1] != self._color): + break x1 += 1 x1 += dx x0 = max(0, self._curpos) @@ -467,21 +477,23 @@ class CCITTG4Parser(BitParser): x1 = self._curpos+1 while 1: if x1 == 0: - if (self._color == 1 and - self._refline[x1] != self._color): break + if (self._color == 1 and self._refline[x1] != self._color): + break elif x1 == len(self._refline): break elif (self._refline[x1-1] == self._color and - self._refline[x1] != self._color): break + self._refline[x1] != self._color): + break x1 += 1 while 1: if x1 == 0: - if (self._color == 0 and - self._refline[x1] == self._color): break + if (self._color == 0 and self._refline[x1] == self._color): + break elif x1 == len(self._refline): break elif (self._refline[x1-1] != self._color and - self._refline[x1] == self._color): break + self._refline[x1] == self._color): + break x1 += 1 for x in xrange(self._curpos, x1): self._curline[x] = self._color @@ -494,11 +506,13 @@ class CCITTG4Parser(BitParser): self._curpos = 0 x = self._curpos for _ in xrange(n1): - if len(self._curline) <= x: break + if len(self._curline) <= x: + break self._curline[x] = self._color x += 1 for _ in xrange(n2): - if len(self._curline) <= x: break + if len(self._curline) <= x: + break self._curline[x] = 1-self._color x += 1 self._curpos = x @@ -512,15 +526,16 @@ class CCITTG4Parser(BitParser): self._flush_line() return +import unittest + ## Test cases ## -import unittest class TestCCITTG4Parser(unittest.TestCase): def get_parser(self, bits): parser = CCITTG4Parser(len(bits)) - parser._curline = [ int(c) for c in bits ] + parser._curline = [int(c) for c in bits] parser._reset_line() return parser @@ -655,7 +670,7 @@ class TestCCITTG4Parser(unittest.TestCase): parser._do_vertical(-1) parser._do_vertical(-1) parser._do_vertical(1) - parser._do_horizontal(1,1) + parser._do_horizontal(1, 1) self.assertEqual(parser._get_bits(), '011101') return @@ -685,10 +700,10 @@ class CCITTFaxDecoder(CCITTG4Parser): def output_line(self, y, bits): bytes = array.array('B', [0]*((len(bits)+7)/8)) if self.reversed: - bits = [ 1-b for b in bits ] - for (i,b) in enumerate(bits): + bits = [1-b for b in bits] + for (i, b) in enumerate(bits): if b: - bytes[i/8] += (128,64,32,16,8,4,2,1)[i%8] + bytes[i/8] += (128, 64, 32, 16, 8, 4, 2, 1)[i % 8] self._buf += bytes.tostring() return @@ -711,28 +726,32 @@ def main(argv): import pygame if not argv[1:]: return unittest.main() + class Parser(CCITTG4Parser): def __init__(self, width, bytealign=False): CCITTG4Parser.__init__(self, width, bytealign=bytealign) - self.img = pygame.Surface((self.width,1000)) + self.img = pygame.Surface((self.width, 1000)) return + def output_line(self, y, bits): - for (x,b) in enumerate(bits): + for (x, b) in enumerate(bits): if b: - self.img.set_at((x,y), (255,255,255)) + self.img.set_at((x, y), (255, 255, 255)) else: - self.img.set_at((x,y), (0,0,0)) + self.img.set_at((x, y), (0, 0, 0)) return + def close(self): pygame.image.save(self.img, 'out.bmp') return for path in argv[1:]: - fp = file(path,'rb') - (_,_,k,w,h,_) = path.split('.') + fp = file(path, 'rb') + (_, _, k, w, h, _) = path.split('.') parser = Parser(int(w)) parser.feedbytes(fp.read()) parser.close() fp.close() return -if __name__ == '__main__': sys.exit(main(sys.argv)) +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/pdfminer/cmapdb.py b/pdfminer/cmapdb.py index 3525248..64f1d4f 100644 --- a/pdfminer/cmapdb.py +++ b/pdfminer/cmapdb.py @@ -26,7 +26,8 @@ from encodingdb import name2unicode from utils import choplist, nunpack -class CMapError(Exception): pass +class CMapError(Exception): + pass ## CMap @@ -44,8 +45,9 @@ class CMap(object): def use_cmap(self, cmap): assert isinstance(cmap, CMap) + def copy(dst, src): - for (k,v) in src.iteritems(): + for (k, v) in src.iteritems(): if isinstance(v, dict): d = {} dst[k] = d @@ -74,10 +76,10 @@ class CMap(object): if code2cid is None: code2cid = self.code2cid code = () - for (k,v) in sorted(code2cid.iteritems()): + for (k, v) in sorted(code2cid.iteritems()): c = code+(k,) if isinstance(v, int): - out.write('code %r = cid %d\n' % (c,v)) + out.write('code %r = cid %d\n' % (c, v)) else: self.dump(out=out, code2cid=v, code=c) return @@ -102,7 +104,6 @@ class IdentityCMap(object): return () - ## UnicodeMap ## class UnicodeMap(object): @@ -119,8 +120,8 @@ class UnicodeMap(object): return self.cid2unichr[cid] def dump(self, out=sys.stdout): - for (k,v) in sorted(self.cid2unichr.iteritems()): - out.write('cid %d = unicode %r\n' % (k,v)) + for (k, v) in sorted(self.cid2unichr.iteritems()): + out.write('cid %d = unicode %r\n' % (k, v)) return @@ -153,7 +154,7 @@ class FileCMap(CMap): else: t = {} d[c] = t - d =t + d = t c = ord(code[-1]) d[c] = cid return @@ -232,17 +233,16 @@ class CMapDB(object): _cmap_cache = {} _umap_cache = {} - class CMapNotFound(CMapError): pass + class CMapNotFound(CMapError): + pass @classmethod def _load_data(klass, name): filename = '%s.pickle.gz' % name if klass.debug: print >>sys.stderr, 'loading:', name - cmap_paths = ( - os.environ.get('CMAP_PATH', '/usr/share/pdfminer/'), - os.path.join(os.path.dirname(__file__), 'cmap'), - ) + cmap_paths = (os.environ.get('CMAP_PATH', '/usr/share/pdfminer/'), + os.path.join(os.path.dirname(__file__), 'cmap'),) for directory in cmap_paths: path = os.path.join(directory, filename) if os.path.exists(path): @@ -306,11 +306,12 @@ class CMapParser(PSStackParser): elif name == 'endcmap': self._in_cmap = False return - if not self._in_cmap: return + if not self._in_cmap: + return # if name == 'def': try: - ((_,k),(_,v)) = self.pop(2) + ((_, k), (_, v)) = self.pop(2) self.cmap.set_attr(literal_name(k), v) except PSSyntaxError: pass @@ -318,7 +319,7 @@ class CMapParser(PSStackParser): if name == 'usecmap': try: - ((_,cmapname),) = self.pop(1) + ((_, cmapname),) = self.pop(1) self.cmap.use_cmap(CMapDB.get_cmap(literal_name(cmapname))) except PSSyntaxError: pass @@ -337,13 +338,15 @@ class CMapParser(PSStackParser): self.popall() return if name == 'endcidrange': - objs = [ obj for (_,obj) in self.popall() ] - for (s,e,cid) in choplist(3, objs): + objs = [obj for (__, obj) in self.popall()] + for (s, e, cid) in choplist(3, objs): if (not isinstance(s, str) or not isinstance(e, str) or - not isinstance(cid, int) or len(s) != len(e)): continue + not isinstance(cid, int) or len(s) != len(e)): + continue sprefix = s[:-4] eprefix = e[:-4] - if sprefix != eprefix: continue + if sprefix != eprefix: + continue svar = s[-4:] evar = e[-4:] s1 = nunpack(svar) @@ -351,7 +354,7 @@ class CMapParser(PSStackParser): vlen = len(svar) #assert s1 <= e1 for i in xrange(e1-s1+1): - x = sprefix+struct.pack('>L',s1+i)[-vlen:] + x = sprefix+struct.pack('>L', s1+i)[-vlen:] self.cmap.add_code2cid(x, cid+i) return @@ -359,8 +362,8 @@ class CMapParser(PSStackParser): self.popall() return if name == 'endcidchar': - objs = [ obj for (_,obj) in self.popall() ] - for (cid,code) in choplist(2, objs): + objs = [obj for (__, obj) in self.popall()] + for (cid, code) in choplist(2, objs): if isinstance(code, str) and isinstance(cid, str): self.cmap.add_code2cid(code, nunpack(cid)) return @@ -369,10 +372,11 @@ class CMapParser(PSStackParser): self.popall() return if name == 'endbfrange': - objs = [ obj for (_,obj) in self.popall() ] - for (s,e,code) in choplist(3, objs): + objs = [obj for (__, obj) in self.popall()] + for (s, e, code) in choplist(3, objs): if (not isinstance(s, str) or not isinstance(e, str) or - len(s) != len(e)): continue + len(s) != len(e)): + continue s1 = nunpack(s) e1 = nunpack(e) #assert s1 <= e1 @@ -385,7 +389,7 @@ class CMapParser(PSStackParser): prefix = code[:-4] vlen = len(var) for i in xrange(e1-s1+1): - x = prefix+struct.pack('>L',base+i)[-vlen:] + x = prefix+struct.pack('>L', base+i)[-vlen:] self.cmap.add_cid2unichr(s1+i, x) return @@ -393,8 +397,8 @@ class CMapParser(PSStackParser): self.popall() return if name == 'endbfchar': - objs = [ obj for (_,obj) in self.popall() ] - for (cid,code) in choplist(2, objs): + objs = [obj for (__, obj) in self.popall()] + for (cid, code) in choplist(2, objs): if isinstance(cid, str) and isinstance(code, str): self.cmap.add_cid2unichr(nunpack(cid), code) return @@ -409,6 +413,7 @@ class CMapParser(PSStackParser): self.push((pos, token)) return + # test def main(argv): args = argv[1:] @@ -421,4 +426,5 @@ def main(argv): cmap.dump() return -if __name__ == '__main__': sys.exit(main(sys.argv)) +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/pdfminer/converter.py b/pdfminer/converter.py index a474801..7d834a8 100644 --- a/pdfminer/converter.py +++ b/pdfminer/converter.py @@ -21,9 +21,9 @@ class PDFLayoutAnalyzer(PDFTextDevice): return def begin_page(self, page, ctm): - (x0,y0,x1,y1) = page.mediabox - (x0,y0) = apply_matrix_pt(ctm, (x0,y0)) - (x1,y1) = apply_matrix_pt(ctm, (x1,y1)) + (x0, y0, x1, y1) = page.mediabox + (x0, y0) = apply_matrix_pt(ctm, (x0, y0)) + (x1, y1) = apply_matrix_pt(ctm, (x1, y1)) mediabox = (0, 0, abs(x0-x1), abs(y0-y1)) self.cur_item = LTPage(self.pageno, mediabox) return @@ -61,26 +61,26 @@ class PDFLayoutAnalyzer(PDFTextDevice): shape = ''.join(x[0] for x in path) if shape == 'ml': # horizontal/vertical line - (_,x0,y0) = path[0] - (_,x1,y1) = path[1] - (x0,y0) = apply_matrix_pt(self.ctm, (x0,y0)) - (x1,y1) = apply_matrix_pt(self.ctm, (x1,y1)) + (_, x0, y0) = path[0] + (_, x1, y1) = path[1] + (x0, y0) = apply_matrix_pt(self.ctm, (x0, y0)) + (x1, y1) = apply_matrix_pt(self.ctm, (x1, y1)) if x0 == x1 or y0 == y1: - self.cur_item.add(LTLine(gstate.linewidth, (x0,y0), (x1,y1))) + self.cur_item.add(LTLine(gstate.linewidth, (x0, y0), (x1, y1))) return if shape == 'mlllh': # rectangle - (_,x0,y0) = path[0] - (_,x1,y1) = path[1] - (_,x2,y2) = path[2] - (_,x3,y3) = path[3] - (x0,y0) = apply_matrix_pt(self.ctm, (x0,y0)) - (x1,y1) = apply_matrix_pt(self.ctm, (x1,y1)) - (x2,y2) = apply_matrix_pt(self.ctm, (x2,y2)) - (x3,y3) = apply_matrix_pt(self.ctm, (x3,y3)) + (_, x0, y0) = path[0] + (_, x1, y1) = path[1] + (_, x2, y2) = path[2] + (_, x3, y3) = path[3] + (x0, y0) = apply_matrix_pt(self.ctm, (x0, y0)) + (x1, y1) = apply_matrix_pt(self.ctm, (x1, y1)) + (x2, y2) = apply_matrix_pt(self.ctm, (x2, y2)) + (x3, y3) = apply_matrix_pt(self.ctm, (x3, y3)) if ((x0 == x1 and y1 == y2 and x2 == x3 and y3 == y0) or (y0 == y1 and x1 == x2 and y2 == y3 and x3 == x0)): - self.cur_item.add(LTRect(gstate.linewidth, (x0,y0,x2,y2))) + self.cur_item.add(LTRect(gstate.linewidth, (x0, y0, x2, y2))) return # other shapes pts = [] @@ -176,7 +176,8 @@ class TextConverter(PDFConverter): # is text. This stops all the image and drawing ouput from being # recorded and taking up RAM. def render_image(self, name, stream): - if self.imagewriter is None: return + if self.imagewriter is None: + return PDFConverter.render_image(self, name, stream) return @@ -196,18 +197,18 @@ class HTMLConverter(PDFConverter): 'textgroup': 'red', 'curve': 'black', 'page': 'gray', - } + } TEXT_COLORS = { 'textbox': 'blue', 'char': 'black', - } + } def __init__(self, rsrcmgr, outfp, codec='utf-8', pageno=1, laparams=None, scale=1, fontscale=1.0, layoutmode='normal', showpageno=True, pagemargin=50, imagewriter=None, - rect_colors={'curve':'black', 'page':'gray'}, - text_colors={'char':'black'}): + rect_colors={'curve': 'black', 'page': 'gray'}, + text_colors={'char': 'black'}): PDFConverter.__init__(self, rsrcmgr, outfp, codec=codec, pageno=pageno, laparams=laparams) self.scale = scale self.fontscale = fontscale @@ -238,7 +239,7 @@ class HTMLConverter(PDFConverter): def write_footer(self): self.write('
Page: %s
\n' % - ', '.join('%s' % (i,i) for i in xrange(1,self.pageno))) + ', '.join('%s' % (i, i) for i in xrange(1, self.pageno))) self.write('\n') return @@ -318,6 +319,7 @@ class HTMLConverter(PDFConverter): for child in item: show_group(child) return + def render(item): if isinstance(item, LTPage): self._yoffset += item.y1 @@ -415,6 +417,7 @@ class XMLConverter(PDFConverter): show_group(child) self.outfp.write('\n') return + def render(item): if isinstance(item, LTPage): self.outfp.write('\n' % diff --git a/pdfminer/encodingdb.py b/pdfminer/encodingdb.py index 9ee3bc8..61a161e 100644 --- a/pdfminer/encodingdb.py +++ b/pdfminer/encodingdb.py @@ -6,15 +6,18 @@ from glyphlist import glyphname2unicode from latin_enc import ENCODING +STRIP_NAME = re.compile(r'[0-9]+') + + ## name2unicode ## -STRIP_NAME = re.compile(r'[0-9]+') def name2unicode(name): """Converts Adobe glyph names to Unicode numbers.""" if name in glyphname2unicode: return glyphname2unicode[name] m = STRIP_NAME.search(name) - if not m: raise KeyError(name) + if not m: + raise KeyError(name) return unichr(int(m.group(0))) @@ -26,19 +29,23 @@ class EncodingDB(object): mac2unicode = {} win2unicode = {} pdf2unicode = {} - for (name,std,mac,win,pdf) in ENCODING: + for (name, std, mac, win, pdf) in ENCODING: c = name2unicode(name) - if std: std2unicode[std] = c - if mac: mac2unicode[mac] = c - if win: win2unicode[win] = c - if pdf: pdf2unicode[pdf] = c + if std: + std2unicode[std] = c + if mac: + mac2unicode[mac] = c + if win: + win2unicode[win] = c + if pdf: + pdf2unicode[pdf] = c encodings = { - 'StandardEncoding': std2unicode, - 'MacRomanEncoding': mac2unicode, - 'WinAnsiEncoding': win2unicode, - 'PDFDocEncoding': pdf2unicode, - } + 'StandardEncoding': std2unicode, + 'MacRomanEncoding': mac2unicode, + 'WinAnsiEncoding': win2unicode, + 'PDFDocEncoding': pdf2unicode, + } @classmethod def get_encoding(klass, name, diff=None): diff --git a/pdfminer/image.py b/pdfminer/image.py index 782bcc6..641999a 100644 --- a/pdfminer/image.py +++ b/pdfminer/image.py @@ -7,9 +7,11 @@ import os, os.path from pdftypes import LITERALS_DCT_DECODE from pdfcolor import LITERAL_DEVICE_GRAY, LITERAL_DEVICE_RGB, LITERAL_DEVICE_CMYK + def align32(x): return ((x+3)/4)*4 + ## BMPWriter ## class BMPWriter(object): @@ -38,12 +40,12 @@ class BMPWriter(object): self.fp.write(info) if ncols == 2: # B&W color table - for i in (0,255): - self.fp.write(struct.pack('BBBx', i,i,i)) + for i in (0, 255): + self.fp.write(struct.pack('BBBx', i, i, i)) elif ncols == 256: # grayscale color table for i in xrange(256): - self.fp.write(struct.pack('BBBx', i,i,i)) + self.fp.write(struct.pack('BBBx', i, i, i)) self.pos0 = self.fp.tell() self.pos1 = self.pos0 + self.datasize return diff --git a/pdfminer/layout.py b/pdfminer/layout.py index 0522452..1782a9e 100644 --- a/pdfminer/layout.py +++ b/pdfminer/layout.py @@ -82,7 +82,7 @@ class LTComponent(LTItem): return ('<%s %s>' % (self.__class__.__name__, bbox2str(self.bbox))) - def set_bbox(self, (x0,y0,x1,y1)): + def set_bbox(self, (x0, y0, x1, y1)): self.x0 = x0 self.y0 = y0 self.x1 = x1 @@ -143,7 +143,7 @@ class LTCurve(LTComponent): return def get_pts(self): - return ','.join( '%.3f,%.3f' % p for p in self.pts ) + return ','.join('%.3f,%.3f' % p for p in self.pts) ## LTLine @@ -159,8 +159,8 @@ class LTLine(LTCurve): ## class LTRect(LTCurve): - def __init__(self, linewidth, (x0,y0,x1,y1)): - LTCurve.__init__(self, linewidth, [(x0,y0), (x1,y0), (x1,y1), (x0,y1)]) + def __init__(self, linewidth, (x0, y0, x1, y1)): + LTCurve.__init__(self, linewidth, [(x0, y0), (x1, y0), (x1, y1), (x0, y1)]) return @@ -213,7 +213,7 @@ class LTChar(LTComponent, LTText): if font.is_vertical(): # vertical width = font.get_width() * fontsize - (vx,vy) = textdisp + (vx, vy) = textdisp if vx is None: vx = width/2 else: @@ -230,15 +230,15 @@ class LTChar(LTComponent, LTText): ty = descent + rise bll = (0, ty) bur = (self.adv, ty+height) - (a,b,c,d,e,f) = self.matrix + (a, b, c, d, e, f) = self.matrix self.upright = (0 < a*d*scaling and b*c <= 0) - (x0,y0) = apply_matrix_pt(self.matrix, bll) - (x1,y1) = apply_matrix_pt(self.matrix, bur) + (x0, y0) = apply_matrix_pt(self.matrix, bll) + (x1, y1) = apply_matrix_pt(self.matrix, bur) if x1 < x0: - (x0,x1) = (x1,x0) + (x0, x1) = (x1, x0) if y1 < y0: - (y0,y1) = (y1,y0) - LTComponent.__init__(self, (x0,y0,x1,y1)) + (y0, y1) = (y1, y0) + LTComponent.__init__(self, (x0, y0, x1, y1)) if font.is_vertical(): self.size = self.width else: @@ -294,7 +294,7 @@ class LTContainer(LTComponent): class LTExpandableContainer(LTContainer): def __init__(self): - LTContainer.__init__(self, (+INF,+INF,-INF,-INF)) + LTContainer.__init__(self, (+INF, +INF, -INF, -INF)) return def add(self, obj): @@ -314,7 +314,7 @@ class LTTextContainer(LTExpandableContainer, LTText): return def get_text(self): - return ''.join( obj.get_text() for obj in self if isinstance(obj, LTText) ) + return ''.join(obj.get_text() for obj in self if isinstance(obj, LTText)) ## LTTextLine @@ -339,6 +339,7 @@ class LTTextLine(LTTextContainer): def find_neighbors(self, plane, ratio): raise NotImplementedError + class LTTextLineHorizontal(LTTextLine): def __init__(self, word_margin): @@ -358,11 +359,12 @@ class LTTextLineHorizontal(LTTextLine): def find_neighbors(self, plane, ratio): d = ratio*self.height objs = plane.find((self.x0, self.y0-d, self.x1, self.y1+d)) - return [ obj for obj in objs - if (isinstance(obj, LTTextLineHorizontal) and - abs(obj.height-self.height) < d and - (abs(obj.x0-self.x0) < d or - abs(obj.x1-self.x1) < d)) ] + return [obj for obj in objs + if (isinstance(obj, LTTextLineHorizontal) and + abs(obj.height-self.height) < d and + (abs(obj.x0-self.x0) < d or + abs(obj.x1-self.x1) < d))] + class LTTextLineVertical(LTTextLine): @@ -383,11 +385,11 @@ class LTTextLineVertical(LTTextLine): def find_neighbors(self, plane, ratio): d = ratio*self.width objs = plane.find((self.x0-d, self.y0, self.x1+d, self.y1)) - return [ obj for obj in objs - if (isinstance(obj, LTTextLineVertical) and - abs(obj.width-self.width) < d and - (abs(obj.y0-self.y0) < d or - abs(obj.y1-self.y1) < d)) ] + return [obj for obj in objs + if (isinstance(obj, LTTextLineVertical) and + abs(obj.width-self.width) < d and + (abs(obj.y0-self.y0) < d or + abs(obj.y1-self.y1) < d))] ## LTTextBox @@ -407,6 +409,7 @@ class LTTextBox(LTTextContainer): (self.__class__.__name__, self.index, bbox2str(self.bbox), self.get_text())) + class LTTextBoxHorizontal(LTTextBox): def analyze(self, laparams): @@ -417,6 +420,7 @@ class LTTextBoxHorizontal(LTTextBox): def get_writing_mode(self): return 'lr-tb' + class LTTextBoxVertical(LTTextBox): def analyze(self, laparams): @@ -437,6 +441,7 @@ class LTTextGroup(LTTextContainer): self.extend(objs) return + class LTTextGroupLRTB(LTTextGroup): def analyze(self, laparams): @@ -447,6 +452,7 @@ class LTTextGroupLRTB(LTTextGroup): (1+laparams.boxes_flow)*(obj.y0+obj.y1)) return + class LTTextGroupTBRL(LTTextGroup): def analyze(self, laparams): @@ -454,7 +460,7 @@ class LTTextGroupTBRL(LTTextGroup): # reorder the objects from top-right to bottom-left. self._objs = csort(self._objs, key=lambda obj: -(1+laparams.boxes_flow)*(obj.x0+obj.x1) - -(1-laparams.boxes_flow)*(obj.y1)) + - (1-laparams.boxes_flow)*(obj.y1)) return @@ -506,8 +512,8 @@ class LTLayoutContainer(LTContainer): # |<-->| # (line_overlap) k |= 2 - if ( (k & 1 and isinstance(line, LTTextLineHorizontal)) or - (k & 2 and isinstance(line, LTTextLineVertical)) ): + if ((k & 1 and isinstance(line, LTTextLineHorizontal)) or + (k & 2 and isinstance(line, LTTextLineVertical))): line.add(obj1) elif line is not None: yield line @@ -555,7 +561,8 @@ class LTLayoutContainer(LTContainer): done = set() for line in lines: box = boxes[line] - if box in done: continue + if box in done: + continue done.add(box) if not box.is_empty(): yield box @@ -563,32 +570,34 @@ class LTLayoutContainer(LTContainer): def group_textboxes(self, laparams, boxes): assert boxes + def dist(obj1, obj2): """A distance function between two TextBoxes. Consider the bounding rectangle for obj1 and obj2. Return its area less the areas of obj1 and obj2, shown as 'www' below. This value may be negative. - +------+..........+ (x1,y1) + +------+..........+ (x1, y1) | obj1 |wwwwwwwwww: +------+www+------+ :wwwwwwwwww| obj2 | - (x0,y0) +..........+------+ + (x0, y0) +..........+------+ """ - x0 = min(obj1.x0,obj2.x0) - y0 = min(obj1.y0,obj2.y0) - x1 = max(obj1.x1,obj2.x1) - y1 = max(obj1.y1,obj2.y1) + x0 = min(obj1.x0, obj2.x0) + y0 = min(obj1.y0, obj2.y0) + x1 = max(obj1.x1, obj2.x1) + y1 = max(obj1.y1, obj2.y1) return ((x1-x0)*(y1-y0) - obj1.width*obj1.height - obj2.width*obj2.height) + def isany(obj1, obj2): """Check if there's any other object between obj1 and obj2. """ - x0 = min(obj1.x0,obj2.x0) - y0 = min(obj1.y0,obj2.y0) - x1 = max(obj1.x1,obj2.x1) - y1 = max(obj1.y1,obj2.y1) - objs = set(plane.find((x0,y0,x1,y1))) - return objs.difference((obj1,obj2)) + x0 = min(obj1.x0, obj2.x0) + y0 = min(obj1.y0, obj2.y0) + x1 = max(obj1.x1, obj2.x1) + y1 = max(obj1.y1, obj2.y1) + objs = set(plane.find((x0, y0, x1, y1))) + return objs.difference((obj1, obj2)) # XXX this still takes O(n^2) :( dists = [] for i in xrange(len(boxes)): @@ -600,23 +609,23 @@ class LTLayoutContainer(LTContainer): plane = Plane(self.bbox) plane.extend(boxes) while dists: - (c,d,obj1,obj2) = dists.pop(0) + (c, d, obj1, obj2) = dists.pop(0) if c == 0 and isany(obj1, obj2): - dists.append((1,d,obj1,obj2)) + dists.append((1, d, obj1, obj2)) continue if (isinstance(obj1, LTTextBoxVertical) or isinstance(obj1, LTTextGroupTBRL) or isinstance(obj2, LTTextBoxVertical) or isinstance(obj2, LTTextGroupTBRL)): - group = LTTextGroupTBRL([obj1,obj2]) + group = LTTextGroupTBRL([obj1, obj2]) else: - group = LTTextGroupLRTB([obj1,obj2]) + group = LTTextGroupLRTB([obj1, obj2]) plane.remove(obj1) plane.remove(obj2) # this line is optimized -- don't change without profiling - dists = [ n for n in dists if n[2] in plane._objs and n[3] in plane._objs ] + dists = [n for n in dists if n[2] in plane._objs and n[3] in plane._objs] for other in plane: - dists.append((0, dist(group,other), group, other)) + dists.append((0, dist(group, other), group, other)) dists.sort() plane.add(group) assert len(plane) == 1 @@ -628,21 +637,22 @@ class LTLayoutContainer(LTContainer): (textobjs, otherobjs) = fsplit(lambda obj: isinstance(obj, LTChar), self._objs) for obj in otherobjs: obj.analyze(laparams) - if not textobjs: return + if not textobjs: + return textlines = list(self.get_textlines(laparams, textobjs)) - assert len(textobjs) <= sum( len(line._objs) for line in textlines ) + assert len(textobjs) <= sum(len(line._objs) for line in textlines) (empties, textlines) = fsplit(lambda obj: obj.is_empty(), textlines) for obj in empties: obj.analyze(laparams) textboxes = list(self.get_textboxes(laparams, textlines)) - assert len(textlines) == sum( len(box._objs) for box in textboxes ) + assert len(textlines) == sum(len(box._objs) for box in textboxes) if textboxes: self.groups = self.group_textboxes(laparams, textboxes) assigner = IndexAssigner() for group in self.groups: group.analyze(laparams) assigner.run(group) - textboxes.sort(key=lambda box:box.index) + textboxes.sort(key=lambda box: box.index) self._objs = textboxes + otherobjs + empties return @@ -654,9 +664,9 @@ class LTFigure(LTLayoutContainer): def __init__(self, name, bbox, matrix): self.name = name self.matrix = matrix - (x,y,w,h) = bbox - bbox = get_bound( apply_matrix_pt(matrix, (p,q)) - for (p,q) in ((x,y), (x+w,y), (x,y+h), (x+w,y+h)) ) + (x, y, w, h) = bbox + bbox = get_bound(apply_matrix_pt(matrix, (p, q)) + for (p, q) in ((x, y), (x+w, y), (x, y+h), (x+w, y+h))) LTLayoutContainer.__init__(self, bbox) return @@ -666,7 +676,8 @@ class LTFigure(LTLayoutContainer): bbox2str(self.bbox), matrix2str(self.matrix))) def analyze(self, laparams): - if not laparams.all_texts: return + if not laparams.all_texts: + return LTLayoutContainer.analyze(self, laparams) return diff --git a/pdfminer/lzw.py b/pdfminer/lzw.py index 56c86e3..29e1795 100644 --- a/pdfminer/lzw.py +++ b/pdfminer/lzw.py @@ -34,17 +34,18 @@ class LZWDecoder(object): # |-----8-bits-----| # |-bpos-|-bits-| | # | |----r----| - v = (v<>(r-bits)) & ((1<> (r-bits)) & ((1 << bits)-1)) self.bpos += bits break else: # |-----8-bits-----| # |-bpos-|---bits----... # | |----r----| - v = (v<' % (enc(tag.name), s)) self._stack.append(tag) return diff --git a/pdfminer/pdfdocument.py b/pdfminer/pdfdocument.py index be6c243..a5d2942 100644 --- a/pdfminer/pdfdocument.py +++ b/pdfminer/pdfdocument.py @@ -23,11 +23,24 @@ from utils import decode_text ## Exceptions ## -class PDFNoValidXRef(PDFSyntaxError): pass -class PDFNoOutlines(PDFException): pass -class PDFDestinationNotFound(PDFException): pass -class PDFEncryptionError(PDFException): pass -class PDFPasswordIncorrect(PDFEncryptionError): pass +class PDFNoValidXRef(PDFSyntaxError): + pass + + +class PDFNoOutlines(PDFException): + pass + + +class PDFDestinationNotFound(PDFException): + pass + + +class PDFEncryptionError(PDFException): + pass + + +class PDFPasswordIncorrect(PDFEncryptionError): + pass # some predefined literals and keywords. LITERAL_OBJSTM = LIT('ObjStm') @@ -68,7 +81,8 @@ class PDFXRef(PDFBaseXRef): while 1: try: (pos, line) = parser.nextline() - if not line.strip(): continue + if not line.strip(): + continue except PSEOF: raise PDFNoValidXRef('Unexpected EOF - file corrupted?') if not line: @@ -92,7 +106,8 @@ class PDFXRef(PDFBaseXRef): if len(f) != 3: raise PDFNoValidXRef('Invalid XRef format: %r, line=%r' % (parser, line)) (pos, genno, use) = f - if use != 'n': continue + if use != 'n': + continue self.offsets[objid] = (None, long(pos), int(genno)) if 1 <= debug: print >>sys.stderr, 'xref objects:', self.offsets @@ -100,16 +115,17 @@ class PDFXRef(PDFBaseXRef): return KEYWORD_TRAILER = KWD('trailer') + def load_trailer(self, parser): try: - (_,kwd) = parser.nexttoken() + (_, kwd) = parser.nexttoken() assert kwd is self.KEYWORD_TRAILER - (_,dic) = parser.nextobject() + (_, dic) = parser.nextobject() except PSEOF: x = parser.pop(1) if not x: raise PDFNoValidXRef('Unexpected EOF - file corrupted') - (_,dic) = x[0] + (_, dic) = x[0] self.trailer.update(dict_value(dic)) return @@ -134,6 +150,7 @@ class PDFXRefFallback(PDFXRef): return '' % (self.offsets.keys()) PDFOBJ_CUE = re.compile(r'^(\d+)\s+(\d+)\s+obj\b') + def load(self, parser, debug=0): parser.seek(0) while 1: @@ -148,14 +165,15 @@ class PDFXRefFallback(PDFXRef): print >>sys.stderr, 'trailer: %r' % self.get_trailer() break m = self.PDFOBJ_CUE.match(line) - if not m: continue + if not m: + continue (objid, genno) = m.groups() objid = int(objid) genno = int(genno) self.offsets[objid] = (None, pos, genno) # expand ObjStm. parser.seek(pos) - (_,obj) = parser.nextobject() + (_, obj) = parser.nextobject() if isinstance(obj, PDFStream) and obj.get('Type') is LITERAL_OBJSTM: stream = stream_value(obj) try: @@ -168,7 +186,7 @@ class PDFXRefFallback(PDFXRef): objs = [] try: while 1: - (_,obj) = parser1.nextobject() + (_, obj) = parser1.nextobject() objs.append(obj) except PSEOF: pass @@ -193,14 +211,14 @@ class PDFXRefStream(PDFBaseXRef): return '' % (self.ranges) def load(self, parser, debug=0): - (_,objid) = parser.nexttoken() # ignored - (_,genno) = parser.nexttoken() # ignored - (_,kwd) = parser.nexttoken() - (_,stream) = parser.nextobject() + (_, objid) = parser.nexttoken() # ignored + (_, genno) = parser.nexttoken() # ignored + (_, kwd) = parser.nexttoken() + (_, stream) = parser.nextobject() if not isinstance(stream, PDFStream) or stream['Type'] is not LITERAL_XREF: raise PDFNoValidXRef('Invalid PDF stream spec.') size = stream['Size'] - index_array = stream.get('Index', (1,size)) + index_array = stream.get('Index', (1, size)) if len(index_array) % 2 != 0: raise PDFSyntaxError('Invalid index number') self.ranges.extend(choplist(2, index_array)) @@ -210,22 +228,22 @@ class PDFXRefStream(PDFBaseXRef): self.trailer = stream.attrs if 1 <= debug: print >>sys.stderr, ('xref stream: objid=%s, fields=%d,%d,%d' % - (', '.join(map(repr, self.ranges)), - self.fl1, self.fl2, self.fl3)) + (', '.join(map(repr, self.ranges)), + self.fl1, self.fl2, self.fl3)) return def get_trailer(self): return self.trailer def get_objids(self): - for (start,nobjs) in self.ranges: + for (start, nobjs) in self.ranges: for i in xrange(nobjs): yield start+i return def get_pos(self, objid): index = 0 - for (start,nobjs) in self.ranges: + for (start, nobjs) in self.ranges: if start <= objid and objid < start+nobjs: index += objid - start else: @@ -292,7 +310,8 @@ class PDFDocument(object): self.xrefs.append(xref) for xref in self.xrefs: trailer = xref.get_trailer() - if not trailer: continue + if not trailer: + continue # If there's an encryption info, remember it. if 'Encrypt' in trailer: #assert not self.encryption @@ -316,6 +335,7 @@ class PDFDocument(object): # This step is mandatory even if there's no password associated # with the document. PASSWORD_PADDING = '(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08..\x00\xb6\xd0h>\x80/\x0c\xa9\xfedSiz' + def initialize(self, password=''): if not self.encryption: self.is_printable = self.is_modifiable = self.is_extractable = True @@ -326,9 +346,9 @@ class PDFDocument(object): V = int_value(param.get('V', 0)) if not (V == 1 or V == 2): raise PDFEncryptionError('Unknown algorithm: param=%r' % param) - length = int_value(param.get('Length', 40)) # Key length (bits) + length = int_value(param.get('Length', 40)) # Key length (bits) O = str_value(param['O']) - R = int_value(param['R']) # Revision + R = int_value(param['R']) # Revision if 5 <= R: raise PDFEncryptionError('Unknown revision: %r' % R) U = str_value(param['U']) @@ -337,11 +357,11 @@ class PDFDocument(object): self.is_modifiable = bool(P & 8) self.is_extractable = bool(P & 16) # Algorithm 3.2 - password = (password+self.PASSWORD_PADDING)[:32] # 1 - hash = md5.md5(password) # 2 - hash.update(O) # 3 - hash.update(struct.pack('>sys.stderr, 'find_xref: %r' % line - if line == 'startxref': break + if line == 'startxref': + break if line: prev = line else: diff --git a/pdfminer/pdffont.py b/pdfminer/pdffont.py index 7435499..0d0c87d 100644 --- a/pdfminer/pdffont.py +++ b/pdfminer/pdffont.py @@ -25,13 +25,13 @@ def get_widths(seq): if isinstance(v, list): if r: char1 = r[-1] - for (i,w) in enumerate(v): + for (i, w) in enumerate(v): widths[char1+i] = w r = [] elif isinstance(v, int): r.append(v) if len(r) == 3: - (char1,char2,w) = r + (char1, char2, w) = r for i in xrange(char1, char2+1): widths[i] = w r = [] @@ -40,6 +40,7 @@ def get_widths(seq): #assert get_widths([1,2,3]) == {1:3, 2:3} #assert get_widths([1,[2,3],6,[7,8]]) == {1:2,2:3, 6:7,7:8} + def get_widths2(seq): widths = {} r = [] @@ -47,20 +48,20 @@ def get_widths2(seq): if isinstance(v, list): if r: char1 = r[-1] - for (i,(w,vx,vy)) in enumerate(choplist(3,v)): - widths[char1+i] = (w,(vx,vy)) + for (i, (w, vx, vy)) in enumerate(choplist(3, v)): + widths[char1+i] = (w, (vx, vy)) r = [] elif isinstance(v, int): r.append(v) if len(r) == 5: - (char1,char2,w,vx,vy) = r + (char1, char2, w, vx, vy) = r for i in xrange(char1, char2+1): - widths[i] = (w,(vx,vy)) + widths[i] = (w, (vx, vy)) r = [] return widths #assert get_widths2([1]) == {} -#assert get_widths2([1,2,3,4,5]) == {1:(3,(4,5)), 2:(3,(4,5))} -#assert get_widths2([1,[2,3,4,5],6,[7,8,9]]) == {1:(2,(3,4)), 6:(7,(8,9))} +#assert get_widths2([1,2,3,4,5]) == {1:(3, (4,5)), 2:(3, (4,5))} +#assert get_widths2([1,[2,3,4,5],6,[7,8,9]]) == {1:(2, (3,4)), 6:(7, (8,9))} ## FontMetricsDB @@ -94,7 +95,7 @@ class Type1FontHeaderParser(PSStackParser): def get_encoding(self): while 1: try: - (cid,name) = self.nextobject() + (cid, name) = self.nextobject() except PSEOF: break try: @@ -105,25 +106,28 @@ class Type1FontHeaderParser(PSStackParser): def do_keyword(self, pos, token): if token is self.KEYWORD_PUT: - ((_,key),(_,value)) = self.pop(2) + ((_, key), (_, value)) = self.pop(2) if (isinstance(key, int) and isinstance(value, PSLiteral)): self.add_results((key, literal_name(value))) return +NIBBLES = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'e', 'e-', None, '-') + + ## CFFFont ## (Format specified in Adobe Technical Note: #5176 ## "The Compact Font Format Specification") ## -NIBBLES = ('0','1','2','3','4','5','6','7','8','9','.','e','e-',None,'-') def getdict(data): d = {} fp = StringIO(data) stack = [] while 1: c = fp.read(1) - if not c: break + if not c: + break b0 = ord(c) if b0 <= 21: d[b0] = stack @@ -145,19 +149,21 @@ def getdict(data): else: b1 = ord(fp.read(1)) if 247 <= b0 and b0 <= 250: - value = ((b0-247)<<8)+b1+108 + value = ((b0-247) << 8)+b1+108 elif 251 <= b0 and b0 <= 254: - value = -((b0-251)<<8)-b1-108 + value = -((b0-251) << 8)-b1-108 else: b2 = ord(fp.read(1)) - if 128 <= b1: b1 -= 256 + if 128 <= b1: + b1 -= 256 if b0 == 28: - value = b1<<8 | b2 + value = b1 << 8 | b2 else: - value = b1<<24 | b2<<16 | struct.unpack('>H', fp.read(2))[0] + value = b1 << 24 | b2 << 16 | struct.unpack('>H', fp.read(2))[0] stack.append(value) return d + class CFFFont(object): STANDARD_STRINGS = ( @@ -239,7 +245,7 @@ class CFFFont(object): 'Yacutesmall', 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003', 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold', - ) + ) class INDEX(object): @@ -264,13 +270,13 @@ class CFFFont(object): return self.fp.read(self.offsets[i+1]-self.offsets[i]) def __iter__(self): - return iter( self[i] for i in xrange(len(self)) ) + return iter(self[i] for i in xrange(len(self))) def __init__(self, name, fp): self.name = name self.fp = fp # Header - (_major,_minor,hdrsize,offsize) = struct.unpack('BBBB', self.fp.read(4)) + (_major, _minor, hdrsize, offsize) = struct.unpack('BBBB', self.fp.read(4)) self.fp.read(hdrsize-4) # Name INDEX self.name_index = self.INDEX(self.fp) @@ -297,7 +303,7 @@ class CFFFont(object): if format == '\x00': # Format 0 (n,) = struct.unpack('B', self.fp.read(1)) - for (code,gid) in enumerate(struct.unpack('B'*n, self.fp.read(n))): + for (code, gid) in enumerate(struct.unpack('B'*n, self.fp.read(n))): self.code2gid[code] = gid self.gid2code[gid] = code elif format == '\x01': @@ -305,8 +311,8 @@ class CFFFont(object): (n,) = struct.unpack('B', self.fp.read(1)) code = 0 for i in xrange(n): - (first,nleft) = struct.unpack('BB', self.fp.read(2)) - for gid in xrange(first,first+nleft+1): + (first, nleft) = struct.unpack('BB', self.fp.read(2)) + for gid in xrange(first, first+nleft+1): self.code2gid[code] = gid self.gid2code[gid] = code code += 1 @@ -320,7 +326,7 @@ class CFFFont(object): if format == '\x00': # Format 0 n = self.nglyphs-1 - for (gid,sid) in enumerate(struct.unpack('>'+'H'*n, self.fp.read(2*n))): + for (gid, sid) in enumerate(struct.unpack('>'+'H'*n, self.fp.read(2*n))): gid += 1 name = self.getstr(sid) self.name2gid[name] = gid @@ -330,8 +336,8 @@ class CFFFont(object): (n,) = struct.unpack('B', self.fp.read(1)) sid = 0 for i in xrange(n): - (first,nleft) = struct.unpack('BB', self.fp.read(2)) - for gid in xrange(first,first+nleft+1): + (first, nleft) = struct.unpack('BB', self.fp.read(2)) + for gid in xrange(first, first+nleft+1): name = self.getstr(sid) self.name2gid[name] = gid self.gid2name[gid] = name @@ -356,7 +362,8 @@ class CFFFont(object): ## class TrueTypeFont(object): - class CMapNotFound(Exception): pass + class CMapNotFound(Exception): + pass def __init__(self, name, fp): self.name = name @@ -389,15 +396,16 @@ class TrueTypeFont(object): elif fmttype == 2: subheaderkeys = struct.unpack('>256H', fp.read(512)) firstbytes = [0]*8192 - for (i,k) in enumerate(subheaderkeys): + for (i, k) in enumerate(subheaderkeys): firstbytes[k/8] = i nhdrs = max(subheaderkeys)/8 + 1 hdrs = [] for i in xrange(nhdrs): - (firstcode,entcount,delta,offset) = struct.unpack('>HHhH', fp.read(8)) - hdrs.append((i,firstcode,entcount,delta,fp.tell()-2+offset)) - for (i,firstcode,entcount,delta,pos) in hdrs: - if not entcount: continue + (firstcode, entcount, delta, offset) = struct.unpack('>HHhH', fp.read(8)) + hdrs.append((i, firstcode, entcount, delta, fp.tell()-2+offset)) + for (i, firstcode, entcount, delta, pos) in hdrs: + if not entcount: + continue first = firstcode + (firstbytes[i] << 8) fp.seek(pos) for c in xrange(entcount): @@ -414,7 +422,7 @@ class TrueTypeFont(object): idds = struct.unpack('>%dh' % segcount, fp.read(2*segcount)) pos = fp.tell() idrs = struct.unpack('>%dH' % segcount, fp.read(2*segcount)) - for (ec,sc,idd,idr) in zip(ecs, scs, idds, idrs): + for (ec, sc, idd, idr) in zip(ecs, scs, idds, idrs): if idr: fp.seek(pos+idr) for c in xrange(sc, ec+1): @@ -426,16 +434,19 @@ class TrueTypeFont(object): assert 0 # create unicode map unicode_map = FileUnicodeMap() - for (char,gid) in char2gid.iteritems(): + for (char, gid) in char2gid.iteritems(): unicode_map.add_cid2unichr(gid, char) return unicode_map ## Fonts ## +class PDFFontError(PDFException): + pass -class PDFFontError(PDFException): pass -class PDFUnicodeNotDefined(PDFFontError): pass + +class PDFUnicodeNotDefined(PDFFontError): + pass LITERAL_STANDARD_ENCODING = LIT('StandardEncoding') LITERAL_TYPE1C = LIT('Type1C') @@ -456,7 +467,7 @@ class PDFFont(object): self.italic_angle = num_value(descriptor.get('ItalicAngle', 0)) self.default_width = default_width or num_value(descriptor.get('MissingWidth', 0)) self.leading = num_value(descriptor.get('Leading', 0)) - self.bbox = list_value(descriptor.get('FontBBox', (0,0,0,0))) + self.bbox = list_value(descriptor.get('FontBBox', (0, 0, 0, 0))) self.hscale = self.vscale = .001 return @@ -474,6 +485,7 @@ class PDFFont(object): def get_ascent(self): return self.ascent * self.vscale + def get_descent(self): return self.descent * self.vscale @@ -482,6 +494,7 @@ class PDFFont(object): if w == 0: w = -self.default_width return w * self.hscale + def get_height(self): h = self.bbox[3]-self.bbox[1] if h == 0: @@ -501,7 +514,7 @@ class PDFFont(object): return 0 def string_width(self, s): - return sum( self.char_width(cid) for cid in self.decode(s) ) + return sum(self.char_width(cid) for cid in self.decode(s)) # PDFSimpleFont @@ -540,6 +553,7 @@ class PDFSimpleFont(PDFFont): except KeyError: raise PDFUnicodeNotDefined(None, cid) + # PDFType1Font class PDFType1Font(PDFSimpleFont): @@ -557,7 +571,7 @@ class PDFType1Font(PDFSimpleFont): firstchar = int_value(spec.get('FirstChar', 0)) lastchar = int_value(spec.get('LastChar', 255)) widths = list_value(spec.get('Widths', [0]*256)) - widths = dict( (i+firstchar,w) for (i,w) in enumerate(widths) ) + widths = dict((i+firstchar, w) for (i, w) in enumerate(widths)) PDFSimpleFont.__init__(self, descriptor, widths, spec) if 'Encoding' not in spec and 'FontFile' in descriptor: # try to recover the missing encoding info from the font file. @@ -571,12 +585,14 @@ class PDFType1Font(PDFSimpleFont): def __repr__(self): return '' % self.basefont + # PDFTrueTypeFont class PDFTrueTypeFont(PDFType1Font): def __repr__(self): return '' % self.basefont + # PDFType3Font class PDFType3Font(PDFSimpleFont): @@ -584,16 +600,16 @@ class PDFType3Font(PDFSimpleFont): firstchar = int_value(spec.get('FirstChar', 0)) lastchar = int_value(spec.get('LastChar', 0)) widths = list_value(spec.get('Widths', [0]*256)) - widths = dict( (i+firstchar,w) for (i,w) in enumerate(widths)) + widths = dict((i+firstchar, w) for (i, w) in enumerate(widths)) if 'FontDescriptor' in spec: descriptor = dict_value(spec['FontDescriptor']) else: - descriptor = {'Ascent':0, 'Descent':0, - 'FontBBox':spec['FontBBox']} + descriptor = {'Ascent': 0, 'Descent': 0, + 'FontBBox': spec['FontBBox']} PDFSimpleFont.__init__(self, descriptor, widths, spec) self.matrix = tuple(list_value(spec.get('FontMatrix'))) - (_,self.descent,_,self.ascent) = self.bbox - (self.hscale,self.vscale) = apply_matrix_norm(self.matrix, (1,1)) + (_, self.descent, _, self.ascent) = self.bbox + (self.hscale, self.vscale) = apply_matrix_norm(self.matrix, (1, 1)) return def __repr__(self): @@ -657,10 +673,10 @@ class PDFCIDFont(PDFFont): if self.vertical: # writing mode: vertical widths = get_widths2(list_value(spec.get('W2', []))) - self.disps = dict( (cid,(vx,vy)) for (cid,(_,(vx,vy))) in widths.iteritems() ) - (vy,w) = spec.get('DW2', [880, -1000]) - self.default_disp = (None,vy) - widths = dict( (cid,w) for (cid,(w,_)) in widths.iteritems() ) + self.disps = dict((cid, (vx, vy)) for (cid, (_, (vx, vy))) in widths.iteritems()) + (vy, w) = spec.get('DW2', [880, -1000]) + self.default_disp = (None, vy) + widths = dict((cid, w) for (cid, (w, _)) in widths.iteritems()) default_width = w else: # writing mode: horizontal @@ -689,7 +705,8 @@ class PDFCIDFont(PDFFont): def to_unichr(self, cid): try: - if not self.unicode_map: raise KeyError(cid) + if not self.unicode_map: + raise KeyError(cid) return self.unicode_map.get_unichr(cid) except KeyError: raise PDFUnicodeNotDefined(self.cidcoding, cid) @@ -705,4 +722,5 @@ def main(argv): fp.close() return -if __name__ == '__main__': sys.exit(main(sys.argv)) +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/pdfminer/pdfinterp.py b/pdfminer/pdfinterp.py index 3c3e629..ebb54fe 100644 --- a/pdfminer/pdfinterp.py +++ b/pdfminer/pdfinterp.py @@ -30,8 +30,12 @@ from utils import mult_matrix, MATRIX_IDENTITY ## Exceptions ## -class PDFResourceError(PDFException): pass -class PDFInterpreterError(PDFException): pass +class PDFResourceError(PDFException): + pass + + +class PDFInterpreterError(PDFException): + pass ## Constants @@ -120,6 +124,7 @@ class PDFGraphicState(object): (self.linewidth, self.linecap, self.linejoin, self.miterlimit, self.dash, self.intent, self.flatness)) + ## Resource Manager ## class PDFResourceManager(object): @@ -152,7 +157,8 @@ class PDFResourceManager(object): try: return CMapDB.get_cmap(cmapname) except CMapDB.CMapNotFound: - if strict: raise + if strict: + raise return CMap() def get_font(self, objid, spec): @@ -195,7 +201,7 @@ class PDFResourceManager(object): else: if STRICT: raise PDFFontError('Invalid Font spec: %r' % spec) - font = PDFType1Font(self, spec) # this is so wrong! + font = PDFType1Font(self, spec) # this is so wrong! if objid and self.caching: self._cached_fonts[objid] = font return font @@ -227,12 +233,14 @@ class PDFContentParser(PSStackParser): return def fillbuf(self): - if self.charpos < len(self.buf): return + if self.charpos < len(self.buf): + return while 1: self.fillfp() self.bufpos = self.fp.tell() self.buf = self.fp.read(self.BUFSIZ) - if self.buf: break + if self.buf: + break self.fp = None self.charpos = 0 return @@ -263,7 +271,7 @@ class PDFContentParser(PSStackParser): except ValueError: data += self.buf[self.charpos:] self.charpos = len(self.buf) - data = data[:-(len(target)+1)] # strip the last part + data = data[:-(len(target)+1)] # strip the last part data = re.sub(r'(\x0d\x0a|[\x0d\x0a])$', '', data) return (pos, data) @@ -274,6 +282,7 @@ class PDFContentParser(PSStackParser): KEYWORD_BI = KWD('BI') KEYWORD_ID = KWD('ID') KEYWORD_EI = KWD('EI') + def do_keyword(self, pos, token): if token is self.KEYWORD_BI: # inline image within a content stream @@ -283,13 +292,14 @@ class PDFContentParser(PSStackParser): (_, objs) = self.end_type('inline') if len(objs) % 2 != 0: raise PSTypeError('Invalid dictionary construct: %r' % objs) - d = dict( (literal_name(k), v) for (k,v) in choplist(2, objs) ) + d = dict((literal_name(k), v) for (k, v) in choplist(2, objs)) (pos, data) = self.get_inline_data(pos+len('ID ')) obj = PDFStream(d, data) self.push((pos, obj)) self.push((pos, self.KEYWORD_EI)) except PSTypeError: - if STRICT: raise + if STRICT: + raise else: self.push((pos, token)) return @@ -316,7 +326,9 @@ class PDFPageInterpreter(object): self.fontmap = {} self.xobjmap = {} self.csmap = PREDEFINED_COLORSPACE.copy() - if not resources: return + if not resources: + return + def get_colorspace(spec): if isinstance(spec, list): name = literal_name(spec[0]) @@ -328,23 +340,23 @@ class PDFPageInterpreter(object): return PDFColorSpace(name, len(list_value(spec[1]))) else: return PREDEFINED_COLORSPACE.get(name) - for (k,v) in dict_value(resources).iteritems(): + for (k, v) in dict_value(resources).iteritems(): if 2 <= self.debug: - print >>sys.stderr, 'Resource: %r: %r' % (k,v) + print >>sys.stderr, 'Resource: %r: %r' % (k, v) if k == 'Font': - for (fontid,spec) in dict_value(v).iteritems(): + for (fontid, spec) in dict_value(v).iteritems(): objid = None if isinstance(spec, PDFObjRef): objid = spec.objid spec = dict_value(spec) self.fontmap[fontid] = self.rsrcmgr.get_font(objid, spec) elif k == 'ColorSpace': - for (csid,spec) in dict_value(v).iteritems(): + for (csid, spec) in dict_value(v).iteritems(): self.csmap[csid] = get_colorspace(resolve1(spec)) elif k == 'ProcSet': self.rsrcmgr.get_procset(list_value(v)) elif k == 'XObject': - for (xobjid,xobjstrm) in dict_value(v).iteritems(): + for (xobjid, xobjstrm) in dict_value(v).iteritems(): self.xobjmap[xobjid] = xobjstrm return @@ -371,7 +383,8 @@ class PDFPageInterpreter(object): return def pop(self, n): - if n == 0: return [] + if n == 0: + return [] x = self.argstack[-n:] self.argstack = self.argstack[:-n] return x @@ -388,6 +401,7 @@ class PDFPageInterpreter(object): def do_q(self): self.gstack.append(self.get_current_state()) return + # grestore def do_Q(self): if self.gstack: @@ -396,7 +410,7 @@ class PDFPageInterpreter(object): # concat-matrix def do_cm(self, a1, b1, c1, d1, e1, f1): - self.ctm = mult_matrix((a1,b1,c1,d1,e1,f1), self.ctm) + self.ctm = mult_matrix((a1, b1, c1, d1, e1, f1), self.ctm) self.device.set_ctm(self.ctm) return @@ -404,30 +418,37 @@ class PDFPageInterpreter(object): def do_w(self, linewidth): self.graphicstate.linewidth = linewidth return + # setlinecap def do_J(self, linecap): self.graphicstate.linecap = linecap return + # setlinejoin def do_j(self, linejoin): self.graphicstate.linejoin = linejoin return + # setmiterlimit def do_M(self, miterlimit): self.graphicstate.miterlimit = miterlimit return + # setdash def do_d(self, dash, phase): self.graphicstate.dash = (dash, phase) return + # setintent def do_ri(self, intent): self.graphicstate.intent = intent return + # setflatness def do_i(self, flatness): self.graphicstate.flatness = flatness return + # load-gstate def do_gs(self, name): #XXX @@ -435,34 +456,40 @@ class PDFPageInterpreter(object): # moveto def do_m(self, x, y): - self.curpath.append(('m',x,y)) + self.curpath.append(('m', x, y)) return + # lineto def do_l(self, x, y): - self.curpath.append(('l',x,y)) + self.curpath.append(('l', x, y)) return + # curveto def do_c(self, x1, y1, x2, y2, x3, y3): - self.curpath.append(('c',x1,y1,x2,y2,x3,y3)) + self.curpath.append(('c', x1, y1, x2, y2, x3, y3)) return + # urveto def do_v(self, x2, y2, x3, y3): - self.curpath.append(('v',x2,y2,x3,y3)) + self.curpath.append(('v', x2, y2, x3, y3)) return + # rveto def do_y(self, x1, y1, x3, y3): - self.curpath.append(('y',x1,y1,x3,y3)) + self.curpath.append(('y', x1, y1, x3, y3)) return + # closepath def do_h(self): self.curpath.append(('h',)) return + # rectangle def do_re(self, x, y, w, h): - self.curpath.append(('m',x,y)) - self.curpath.append(('l',x+w,y)) - self.curpath.append(('l',x+w,y+h)) - self.curpath.append(('l',x,y+h)) + self.curpath.append(('m', x, y)) + self.curpath.append(('l', x+w, y)) + self.curpath.append(('l', x+w, y+h)) + self.curpath.append(('l', x, y+h)) self.curpath.append(('h',)) return @@ -471,11 +498,13 @@ class PDFPageInterpreter(object): self.device.paint_path(self.graphicstate, True, False, False, self.curpath) self.curpath = [] return + # close-and-stroke def do_s(self): self.do_h() self.do_S() return + # fill def do_f(self): self.device.paint_path(self.graphicstate, False, True, False, self.curpath) @@ -483,68 +512,85 @@ class PDFPageInterpreter(object): return # fill (obsolete) do_F = do_f + # fill-even-odd def do_f_a(self): self.device.paint_path(self.graphicstate, False, True, True, self.curpath) self.curpath = [] return + # fill-and-stroke def do_B(self): self.device.paint_path(self.graphicstate, True, True, False, self.curpath) self.curpath = [] return + # fill-and-stroke-even-odd def do_B_a(self): self.device.paint_path(self.graphicstate, True, True, True, self.curpath) self.curpath = [] return + # close-fill-and-stroke def do_b(self): self.do_h() self.do_B() return + # close-fill-and-stroke-even-odd def do_b_a(self): self.do_h() self.do_B_a() return + # close-only def do_n(self): self.curpath = [] return + # clip - def do_W(self): return + def do_W(self): + return + # clip-even-odd - def do_W_a(self): return + def do_W_a(self): + return # setcolorspace-stroking def do_CS(self, name): self.scs = self.csmap[literal_name(name)] return + # setcolorspace-non-strokine def do_cs(self, name): self.ncs = self.csmap[literal_name(name)] return + # setgray-stroking def do_G(self, gray): #self.do_CS(LITERAL_DEVICE_GRAY) return + # setgray-non-stroking def do_g(self, gray): #self.do_cs(LITERAL_DEVICE_GRAY) return + # setrgb-stroking def do_RG(self, r, g, b): #self.do_CS(LITERAL_DEVICE_RGB) return + # setrgb-non-stroking def do_rg(self, r, g, b): #self.do_cs(LITERAL_DEVICE_RGB) return + # setcmyk-stroking def do_K(self, c, m, y, k): #self.do_CS(LITERAL_DEVICE_CMYK) return + # setcmyk-non-stroking def do_k(self, c, m, y, k): #self.do_cs(LITERAL_DEVICE_CMYK) @@ -560,6 +606,7 @@ class PDFPageInterpreter(object): n = 1 self.pop(n) return + def do_scn(self): if self.ncs: n = self.ncs.ncomponents @@ -569,42 +616,53 @@ class PDFPageInterpreter(object): n = 1 self.pop(n) return + def do_SC(self): self.do_SCN() return + def do_sc(self): self.do_scn() return # sharing-name - def do_sh(self, name): return + def do_sh(self, name): + return # begin-text def do_BT(self): self.textstate.reset() return + # end-text def do_ET(self): return # begin-compat - def do_BX(self): return + def do_BX(self): + return + # end-compat - def do_EX(self): return + def do_EX(self): + return # marked content operators def do_MP(self, tag): self.device.do_tag(tag) return + def do_DP(self, tag, props): self.device.do_tag(tag, props) return + def do_BMC(self, tag): self.device.begin_tag(tag) return + def do_BDC(self, tag, props): self.device.begin_tag(tag, props) return + def do_EMC(self): self.device.end_tag() return @@ -613,18 +671,22 @@ class PDFPageInterpreter(object): def do_Tc(self, space): self.textstate.charspace = space return + # setwordspace def do_Tw(self, space): self.textstate.wordspace = space return + # textscale def do_Tz(self, scale): self.textstate.scaling = scale return + # setleading def do_TL(self, leading): self.textstate.leading = -leading return + # selectfont def do_Tf(self, fontid, fontsize): try: @@ -635,10 +697,12 @@ class PDFPageInterpreter(object): self.textstate.font = self.rsrcmgr.get_font(None, {}) self.textstate.fontsize = fontsize return + # setrendering def do_Tr(self, render): self.textstate.render = render return + # settextrise def do_Ts(self, rise): self.textstate.rise = rise @@ -646,49 +710,55 @@ class PDFPageInterpreter(object): # text-move def do_Td(self, tx, ty): - (a,b,c,d,e,f) = self.textstate.matrix - self.textstate.matrix = (a,b,c,d,tx*a+ty*c+e,tx*b+ty*d+f) + (a, b, c, d, e, f) = self.textstate.matrix + self.textstate.matrix = (a, b, c, d, tx*a+ty*c+e, tx*b+ty*d+f) self.textstate.linematrix = (0, 0) - #print >>sys.stderr, 'Td(%r,%r): %r' % (tx,ty,self.textstate) + #print >>sys.stderr, 'Td(%r,%r): %r' % (tx, ty, self.textstate) return + # text-move def do_TD(self, tx, ty): - (a,b,c,d,e,f) = self.textstate.matrix - self.textstate.matrix = (a,b,c,d,tx*a+ty*c+e,tx*b+ty*d+f) + (a, b, c, d, e, f) = self.textstate.matrix + self.textstate.matrix = (a, b, c, d, tx*a+ty*c+e, tx*b+ty*d+f) self.textstate.leading = ty self.textstate.linematrix = (0, 0) - #print >>sys.stderr, 'TD(%r,%r): %r' % (tx,ty,self.textstate) + #print >>sys.stderr, 'TD(%r,%r): %r' % (tx, ty, self.textstate) return + # textmatrix - def do_Tm(self, a,b,c,d,e,f): - self.textstate.matrix = (a,b,c,d,e,f) + def do_Tm(self, a, b, c, d, e, f): + self.textstate.matrix = (a, b, c, d, e, f) self.textstate.linematrix = (0, 0) return + # nextline def do_T_a(self): - (a,b,c,d,e,f) = self.textstate.matrix - self.textstate.matrix = (a,b,c,d,self.textstate.leading*c+e,self.textstate.leading*d+f) + (a, b, c, d, e, f) = self.textstate.matrix + self.textstate.matrix = (a, b, c, d, self.textstate.leading*c+e, self.textstate.leading*d+f) self.textstate.linematrix = (0, 0) return # show-pos def do_TJ(self, seq): - #print >>sys.stderr, 'TJ(%r): %r' % (seq,self.textstate) + #print >>sys.stderr, 'TJ(%r): %r' % (seq, self.textstate) if self.textstate.font is None: if STRICT: raise PDFInterpreterError('No font specified!') return self.device.render_string(self.textstate, seq) return + # show def do_Tj(self, s): self.do_TJ([s]) return + # quote def do__q(self, s): self.do_T_a() self.do_TJ([s]) return + # doublequote def do__w(self, aw, ac, s): self.do_Tw(aw) @@ -697,14 +767,16 @@ class PDFPageInterpreter(object): return # inline image - def do_BI(self): # never called + def do_BI(self): # never called return - def do_ID(self): # never called + + def do_ID(self): # never called return + def do_EI(self, obj): if 'W' in obj and 'H' in obj: iobjid = str(id(obj)) - self.device.begin_figure(iobjid, (0,0,1,1), MATRIX_IDENTITY) + self.device.begin_figure(iobjid, (0, 0, 1, 1), MATRIX_IDENTITY) self.device.render_image(iobjid, obj) self.device.end_figure(iobjid) return @@ -733,7 +805,7 @@ class PDFPageInterpreter(object): interpreter.render_contents(resources, [xobj], ctm=mult_matrix(matrix, self.ctm)) self.device.end_figure(xobjid) elif subtype is LITERAL_IMAGE and 'Width' in xobj and 'Height' in xobj: - self.device.begin_figure(xobjid, (0,0,1,1), MATRIX_IDENTITY) + self.device.begin_figure(xobjid, (0, 0, 1, 1), MATRIX_IDENTITY) self.device.render_image(xobjid, xobj) self.device.end_figure(xobjid) else: @@ -744,15 +816,15 @@ class PDFPageInterpreter(object): def process_page(self, page): if 1 <= self.debug: print >>sys.stderr, 'Processing page: %r' % page - (x0,y0,x1,y1) = page.mediabox + (x0, y0, x1, y1) = page.mediabox if page.rotate == 90: - ctm = (0,-1,1,0, -y0,x1) + ctm = (0, -1, 1, 0, -y0, x1) elif page.rotate == 180: - ctm = (-1,0,0,-1, x1,y1) + ctm = (-1, 0, 0, -1, x1, y1) elif page.rotate == 270: - ctm = (0,1,-1,0, y1,-x0) + ctm = (0, 1, -1, 0, y1, -x0) else: - ctm = (1,0,0,1, -x0,-y0) + ctm = (1, 0, 0, 1, -x0, -y0) self.device.begin_page(page, ctm) self.render_contents(page.resources, page.contents, ctm=ctm) self.device.end_page(page) @@ -764,7 +836,7 @@ class PDFPageInterpreter(object): def render_contents(self, resources, streams, ctm=MATRIX_IDENTITY): if 1 <= self.debug: print >>sys.stderr, ('render_contents: resources=%r, streams=%r, ctm=%r' % - (resources, streams, ctm)) + (resources, streams, ctm)) self.init_resources(resources) self.init_state(ctm) self.execute(list_value(streams)) @@ -778,12 +850,12 @@ class PDFPageInterpreter(object): return while 1: try: - (_,obj) = parser.nextobject() + (_, obj) = parser.nextobject() except PSEOF: break if isinstance(obj, PSKeyword): name = keyword_name(obj) - method = 'do_%s' % name.replace('*','_a').replace('"','_w').replace("'",'_q') + method = 'do_%s' % name.replace('*', '_a').replace('"', '_w').replace("'", '_q') if hasattr(self, method): func = getattr(self, method) nargs = func.func_code.co_argcount-1 diff --git a/pdfminer/pdfpage.py b/pdfminer/pdfpage.py index b4ae84d..8956d02 100644 --- a/pdfminer/pdfpage.py +++ b/pdfminer/pdfpage.py @@ -63,7 +63,7 @@ class PDFPage(object): else: contents = [] if not isinstance(contents, list): - contents = [ contents ] + contents = [contents] self.contents = contents return @@ -71,6 +71,7 @@ class PDFPage(object): return '' % (self.resources, self.mediabox) INHERITABLE_ATTRS = set(['Resources', 'MediaBox', 'CropBox', 'Rotate']) + @classmethod def create_pages(klass, document, debug=0): def search(obj, parent): @@ -80,7 +81,7 @@ class PDFPage(object): else: objid = obj.objid tree = dict_value(obj).copy() - for (k,v) in parent.iteritems(): + for (k, v) in parent.iteritems(): if k in klass.INHERITABLE_ATTRS and k not in tree: tree[k] = v if tree.get('Type') is LITERAL_PAGES and 'Kids' in tree: @@ -95,7 +96,7 @@ class PDFPage(object): yield (objid, tree) pages = False if 'Pages' in document.catalog: - for (objid,tree) in search(document.catalog['Pages'], document.catalog): + for (objid, tree) in search(document.catalog['Pages'], document.catalog): yield klass(document, objid, tree) pages = True if not pages: @@ -110,7 +111,8 @@ class PDFPage(object): pass return - class PDFTextExtractionNotAllowed(PDFEncryptionError): pass + class PDFTextExtractionNotAllowed(PDFEncryptionError): + pass @classmethod def get_pages(klass, fp, @@ -127,8 +129,10 @@ class PDFPage(object): if check_extractable and not doc.is_extractable: raise klass.PDFTextExtractionNotAllowed('Text extraction is not allowed: %r' % fp) # Process each page contained in the document. - for (pageno,page) in enumerate(klass.create_pages(doc)): - if pagenos and (pageno not in pagenos): continue + for (pageno, page) in enumerate(klass.create_pages(doc)): + if pagenos and (pageno not in pagenos): + continue yield page - if maxpages and maxpages <= pageno+1: break + if maxpages and maxpages <= pageno+1: + break return diff --git a/pdfminer/pdfparser.py b/pdfminer/pdfparser.py index a47123e..9e9aaa0 100644 --- a/pdfminer/pdfparser.py +++ b/pdfminer/pdfparser.py @@ -15,7 +15,8 @@ from pdftypes import str_value, list_value, dict_value, stream_value ## Exceptions ## -class PDFSyntaxError(PDFException): pass +class PDFSyntaxError(PDFException): + pass ## PDFParser @@ -55,6 +56,7 @@ class PDFParser(PSStackParser): KEYWORD_STREAM = KWD('stream') KEYWORD_XREF = KWD('xref') KEYWORD_STARTXREF = KWD('startxref') + def do_keyword(self, pos, token): """Handles PDF-related keywords.""" @@ -71,7 +73,7 @@ class PDFParser(PSStackParser): elif token is self.KEYWORD_R: # reference to indirect object try: - ((_,objid), (_,genno)) = self.pop(2) + ((_, objid), (_, genno)) = self.pop(2) (objid, genno) = (int(objid), int(genno)) obj = PDFObjRef(self.doc, objid, genno) self.push((pos, obj)) @@ -80,7 +82,7 @@ class PDFParser(PSStackParser): elif token is self.KEYWORD_STREAM: # stream object - ((_,dic),) = self.pop(1) + ((_, dic),) = self.pop(1) dic = dict_value(dic) objlen = 0 if not self.fallback: @@ -118,7 +120,7 @@ class PDFParser(PSStackParser): # XXX limit objlen not to exceed object boundary if 2 <= self.debug: print >>sys.stderr, 'Stream: pos=%d, objlen=%d, dic=%r, data=%r...' % \ - (pos, objlen, dic, data[:10]) + (pos, objlen, dic, data[:10]) obj = PDFStream(dic, data, self.doc.decipher) self.push((pos, obj)) @@ -153,7 +155,7 @@ class PDFStreamParser(PDFParser): if token is self.KEYWORD_R: # reference to indirect object try: - ((_,objid), (_,genno)) = self.pop(2) + ((_, objid), (_, genno)) = self.pop(2) (objid, genno) = (int(objid), int(genno)) obj = PDFObjRef(self.doc, objid, genno) self.push((pos, obj)) diff --git a/pdfminer/pdftypes.py b/pdfminer/pdftypes.py index f1d605f..e832f0a 100644 --- a/pdfminer/pdftypes.py +++ b/pdfminer/pdftypes.py @@ -23,13 +23,28 @@ LITERALS_DCT_DECODE = (LIT('DCTDecode'), LIT('DCT')) ## PDF Objects ## -class PDFObject(PSObject): pass +class PDFObject(PSObject): + pass -class PDFException(PSException): pass -class PDFTypeError(PDFException): pass -class PDFValueError(PDFException): pass -class PDFObjectNotFound(PDFException): pass -class PDFNotImplementedError(PDFException): pass + +class PDFException(PSException): + pass + + +class PDFTypeError(PDFException): + pass + + +class PDFValueError(PDFException): + pass + + +class PDFObjectNotFound(PDFException): + pass + + +class PDFNotImplementedError(PDFException): + pass ## PDFObjRef @@ -66,6 +81,7 @@ def resolve1(x, default=None): x = x.resolve(default=default) return x + def resolve_all(x, default=None): """Recursively resolves the given object and all the internals. @@ -75,24 +91,26 @@ def resolve_all(x, default=None): while isinstance(x, PDFObjRef): x = x.resolve(default=default) if isinstance(x, list): - x = [ resolve_all(v, default=default) for v in x ] + x = [resolve_all(v, default=default) for v in x] elif isinstance(x, dict): - for (k,v) in x.iteritems(): + for (k, v) in x.iteritems(): x[k] = resolve_all(v, default=default) return x + def decipher_all(decipher, objid, genno, x): """Recursively deciphers the given object. """ if isinstance(x, str): return decipher(objid, genno, x) if isinstance(x, list): - x = [ decipher_all(decipher, objid, genno, v) for v in x ] + x = [decipher_all(decipher, objid, genno, v) for v in x] elif isinstance(x, dict): - for (k,v) in x.iteritems(): + for (k, v) in x.iteritems(): x[k] = decipher_all(decipher, objid, genno, v) return x + # Type cheking def int_value(x): x = resolve1(x) @@ -102,6 +120,7 @@ def int_value(x): return 0 return x + def float_value(x): x = resolve1(x) if not isinstance(x, float): @@ -110,6 +129,7 @@ def float_value(x): return 0.0 return x + def num_value(x): x = resolve1(x) if not (isinstance(x, int) or isinstance(x, float)): @@ -118,6 +138,7 @@ def num_value(x): return 0 return x + def str_value(x): x = resolve1(x) if not isinstance(x, str): @@ -126,6 +147,7 @@ def str_value(x): return '' return x + def list_value(x): x = resolve1(x) if not (isinstance(x, list) or isinstance(x, tuple)): @@ -134,6 +156,7 @@ def list_value(x): return [] return x + def dict_value(x): x = resolve1(x) if not isinstance(x, dict): @@ -142,6 +165,7 @@ def dict_value(x): return {} return x + def stream_value(x): x = resolve1(x) if not isinstance(x, PDFStream): @@ -195,12 +219,14 @@ class PDFStream(PDFObject): def get_filters(self): filters = self.get_any(('F', 'Filter')) - if not filters: return [] - if isinstance(filters, list): return filters - return [ filters ] + if not filters: + return [] + if isinstance(filters, list): + return filters + return [filters] def decode(self): - assert self.data is None and self.rawdata != None + assert self.data is None and self.rawdata is not None data = self.rawdata if self.decipher: # Handle encryption diff --git a/pdfminer/psparser.py b/pdfminer/psparser.py index 98434bb..f71fc22 100644 --- a/pdfminer/psparser.py +++ b/pdfminer/psparser.py @@ -8,11 +8,24 @@ STRICT = 0 ## PS Exceptions ## -class PSException(Exception): pass -class PSEOF(PSException): pass -class PSSyntaxError(PSException): pass -class PSTypeError(PSException): pass -class PSValueError(PSException): pass +class PSException(Exception): + pass + + +class PSEOF(PSException): + pass + + +class PSSyntaxError(PSException): + pass + + +class PSTypeError(PSException): + pass + + +class PSValueError(PSException): + pass ## Basic PostScript Types @@ -114,6 +127,7 @@ def literal_name(x): return str(x) return x.name + def keyword_name(x): if not isinstance(x, PSKeyword): if STRICT: @@ -136,7 +150,9 @@ END_NUMBER = re.compile(r'[^0-9]') END_KEYWORD = re.compile(r'[#/%\[\]()<>{}\s]') END_STRING = re.compile(r'[()\134]') OCT_STRING = re.compile(r'[0-7]') -ESC_STRING = { 'b':8, 't':9, 'n':10, 'f':12, 'r':13, '(':40, ')':41, '\\':92 } +ESC_STRING = {'b': 8, 't': 9, 'n': 10, 'f': 12, 'r': 13, '(': 40, ')': 41, '\\': 92} + + class PSBaseParser(object): """Most basic PostScript parser that performs only tokenization. @@ -190,7 +206,8 @@ class PSBaseParser(object): return def fillbuf(self): - if self.charpos < len(self.buf): return + if self.charpos < len(self.buf): + return # fetch next chunk. self.bufpos = self.fp.tell() self.buf = self.fp.read(self.BUFSIZ) @@ -242,7 +259,8 @@ class PSBaseParser(object): pos = max(0, pos-self.BUFSIZ) self.fp.seek(pos) s = self.fp.read(prevpos-pos) - if not s: break + if not s: + break while 1: n = max(s.rfind('\r'), s.rfind('\n')) if n == -1: @@ -407,7 +425,7 @@ class PSBaseParser(object): return j+1 if c == ')': self.paren -= 1 - if self.paren: # WTF, they said balanced parens need no special treatment. + if self.paren: # WTF, they said balanced parens need no special treatment. self._curtoken += c return j+1 self._add_token(self._curtoken) @@ -520,7 +538,7 @@ class PSStackParser(PSBaseParser): def end_type(self, type): if self.curtype != type: raise PSTypeError('Type mismatch: %r != %r' % (self.curtype, type)) - objs = [ obj for (_,obj) in self.curstack ] + objs = [obj for (_, obj) in self.curstack] (pos, self.curtype, self.curstack) = self.context.pop() if 2 <= self.debug: print >>sys.stderr, 'end_type: pos=%r, type=%r, objs=%r' % (pos, type, objs) @@ -553,7 +571,8 @@ class PSStackParser(PSBaseParser): try: self.push(self.end_type('a')) except PSTypeError: - if STRICT: raise + if STRICT: + raise elif token == KEYWORD_DICT_BEGIN: # begin dictionary self.start_type(pos, 'd') @@ -564,10 +583,11 @@ class PSStackParser(PSBaseParser): if len(objs) % 2 != 0: raise PSSyntaxError('Invalid dictionary construct: %r' % objs) # construct a Python dictionary. - d = dict( (literal_name(k), v) for (k,v) in choplist(2, objs) if v is not None ) + d = dict((literal_name(k), v) for (k, v) in choplist(2, objs) if v is not None) self.push((pos, d)) except PSTypeError: - if STRICT: raise + if STRICT: + raise elif token == KEYWORD_PROC_BEGIN: # begin proc self.start_type(pos, 'p') @@ -576,7 +596,8 @@ class PSStackParser(PSBaseParser): try: self.push(self.end_type('p')) except PSTypeError: - if STRICT: raise + if STRICT: + raise else: if 2 <= self.debug: print >>sys.stderr, 'do_keyword: pos=%r, token=%r, stack=%r' % \ @@ -592,9 +613,11 @@ class PSStackParser(PSBaseParser): return obj +import unittest + + ## Simplistic Test cases ## -import unittest class TestPSBaseParser(unittest.TestCase): TESTDATA = r'''%!PS @@ -630,7 +653,7 @@ func/a/b{(c)do*}def (242, KWD('def')), (246, KWD('[')), (248, 1), (250, 'z'), (254, KWD('!')), (256, KWD(']')), (258, KWD('<<')), (261, LIT('foo')), (266, 'bar'), (272, KWD('>>')) - ] + ] OBJS = [ (23, LIT('a')), (25, LIT('BCD')), (30, LIT('Some_Name')), @@ -641,10 +664,11 @@ func/a/b{(c)do*}def (191, ''), (194, ' '), (199, '@@ '), (211, '\xab\xcd\x00\x124\x05'), (230, LIT('a')), (232, LIT('b')), (234, ['c']), (246, [1, 'z']), (258, {'foo': 'bar'}), - ] + ] def get_tokens(self, s): import StringIO + class MyParser(PSBaseParser): def flush(self): self.add_results(*self.popall()) @@ -659,6 +683,7 @@ func/a/b{(c)do*}def def get_objects(self, s): import StringIO + class MyParser(PSStackParser): def flush(self): self.add_results(*self.popall()) @@ -683,4 +708,5 @@ func/a/b{(c)do*}def self.assertEqual(objs, self.OBJS) return -if __name__ == '__main__': unittest.main() +if __name__ == '__main__': + unittest.main() diff --git a/pdfminer/rijndael.py b/pdfminer/rijndael.py index 39895bf..113afcc 100644 --- a/pdfminer/rijndael.py +++ b/pdfminer/rijndael.py @@ -13,686 +13,694 @@ by Philip J. Erdelsky: import sys import struct -def KEYLENGTH(keybits): return (keybits)/8 -def RKLENGTH(keybits): return (keybits)/8+28 -def NROUNDS(keybits): return (keybits)/32+6 + +def KEYLENGTH(keybits): + return (keybits)/8 + + +def RKLENGTH(keybits): + return (keybits)/8+28 + + +def NROUNDS(keybits): + return (keybits)/32+6 Te0 = [ - 0xc66363a5L, 0xf87c7c84L, 0xee777799L, 0xf67b7b8dL, - 0xfff2f20dL, 0xd66b6bbdL, 0xde6f6fb1L, 0x91c5c554L, - 0x60303050L, 0x02010103L, 0xce6767a9L, 0x562b2b7dL, - 0xe7fefe19L, 0xb5d7d762L, 0x4dababe6L, 0xec76769aL, - 0x8fcaca45L, 0x1f82829dL, 0x89c9c940L, 0xfa7d7d87L, - 0xeffafa15L, 0xb25959ebL, 0x8e4747c9L, 0xfbf0f00bL, - 0x41adadecL, 0xb3d4d467L, 0x5fa2a2fdL, 0x45afafeaL, - 0x239c9cbfL, 0x53a4a4f7L, 0xe4727296L, 0x9bc0c05bL, - 0x75b7b7c2L, 0xe1fdfd1cL, 0x3d9393aeL, 0x4c26266aL, - 0x6c36365aL, 0x7e3f3f41L, 0xf5f7f702L, 0x83cccc4fL, - 0x6834345cL, 0x51a5a5f4L, 0xd1e5e534L, 0xf9f1f108L, - 0xe2717193L, 0xabd8d873L, 0x62313153L, 0x2a15153fL, - 0x0804040cL, 0x95c7c752L, 0x46232365L, 0x9dc3c35eL, - 0x30181828L, 0x379696a1L, 0x0a05050fL, 0x2f9a9ab5L, - 0x0e070709L, 0x24121236L, 0x1b80809bL, 0xdfe2e23dL, - 0xcdebeb26L, 0x4e272769L, 0x7fb2b2cdL, 0xea75759fL, - 0x1209091bL, 0x1d83839eL, 0x582c2c74L, 0x341a1a2eL, - 0x361b1b2dL, 0xdc6e6eb2L, 0xb45a5aeeL, 0x5ba0a0fbL, - 0xa45252f6L, 0x763b3b4dL, 0xb7d6d661L, 0x7db3b3ceL, - 0x5229297bL, 0xdde3e33eL, 0x5e2f2f71L, 0x13848497L, - 0xa65353f5L, 0xb9d1d168L, 0x00000000L, 0xc1eded2cL, - 0x40202060L, 0xe3fcfc1fL, 0x79b1b1c8L, 0xb65b5bedL, - 0xd46a6abeL, 0x8dcbcb46L, 0x67bebed9L, 0x7239394bL, - 0x944a4adeL, 0x984c4cd4L, 0xb05858e8L, 0x85cfcf4aL, - 0xbbd0d06bL, 0xc5efef2aL, 0x4faaaae5L, 0xedfbfb16L, - 0x864343c5L, 0x9a4d4dd7L, 0x66333355L, 0x11858594L, - 0x8a4545cfL, 0xe9f9f910L, 0x04020206L, 0xfe7f7f81L, - 0xa05050f0L, 0x783c3c44L, 0x259f9fbaL, 0x4ba8a8e3L, - 0xa25151f3L, 0x5da3a3feL, 0x804040c0L, 0x058f8f8aL, - 0x3f9292adL, 0x219d9dbcL, 0x70383848L, 0xf1f5f504L, - 0x63bcbcdfL, 0x77b6b6c1L, 0xafdada75L, 0x42212163L, - 0x20101030L, 0xe5ffff1aL, 0xfdf3f30eL, 0xbfd2d26dL, - 0x81cdcd4cL, 0x180c0c14L, 0x26131335L, 0xc3ecec2fL, - 0xbe5f5fe1L, 0x359797a2L, 0x884444ccL, 0x2e171739L, - 0x93c4c457L, 0x55a7a7f2L, 0xfc7e7e82L, 0x7a3d3d47L, - 0xc86464acL, 0xba5d5de7L, 0x3219192bL, 0xe6737395L, - 0xc06060a0L, 0x19818198L, 0x9e4f4fd1L, 0xa3dcdc7fL, - 0x44222266L, 0x542a2a7eL, 0x3b9090abL, 0x0b888883L, - 0x8c4646caL, 0xc7eeee29L, 0x6bb8b8d3L, 0x2814143cL, - 0xa7dede79L, 0xbc5e5ee2L, 0x160b0b1dL, 0xaddbdb76L, - 0xdbe0e03bL, 0x64323256L, 0x743a3a4eL, 0x140a0a1eL, - 0x924949dbL, 0x0c06060aL, 0x4824246cL, 0xb85c5ce4L, - 0x9fc2c25dL, 0xbdd3d36eL, 0x43acacefL, 0xc46262a6L, - 0x399191a8L, 0x319595a4L, 0xd3e4e437L, 0xf279798bL, - 0xd5e7e732L, 0x8bc8c843L, 0x6e373759L, 0xda6d6db7L, - 0x018d8d8cL, 0xb1d5d564L, 0x9c4e4ed2L, 0x49a9a9e0L, - 0xd86c6cb4L, 0xac5656faL, 0xf3f4f407L, 0xcfeaea25L, - 0xca6565afL, 0xf47a7a8eL, 0x47aeaee9L, 0x10080818L, - 0x6fbabad5L, 0xf0787888L, 0x4a25256fL, 0x5c2e2e72L, - 0x381c1c24L, 0x57a6a6f1L, 0x73b4b4c7L, 0x97c6c651L, - 0xcbe8e823L, 0xa1dddd7cL, 0xe874749cL, 0x3e1f1f21L, - 0x964b4bddL, 0x61bdbddcL, 0x0d8b8b86L, 0x0f8a8a85L, - 0xe0707090L, 0x7c3e3e42L, 0x71b5b5c4L, 0xcc6666aaL, - 0x904848d8L, 0x06030305L, 0xf7f6f601L, 0x1c0e0e12L, - 0xc26161a3L, 0x6a35355fL, 0xae5757f9L, 0x69b9b9d0L, - 0x17868691L, 0x99c1c158L, 0x3a1d1d27L, 0x279e9eb9L, - 0xd9e1e138L, 0xebf8f813L, 0x2b9898b3L, 0x22111133L, - 0xd26969bbL, 0xa9d9d970L, 0x078e8e89L, 0x339494a7L, - 0x2d9b9bb6L, 0x3c1e1e22L, 0x15878792L, 0xc9e9e920L, - 0x87cece49L, 0xaa5555ffL, 0x50282878L, 0xa5dfdf7aL, - 0x038c8c8fL, 0x59a1a1f8L, 0x09898980L, 0x1a0d0d17L, - 0x65bfbfdaL, 0xd7e6e631L, 0x844242c6L, 0xd06868b8L, - 0x824141c3L, 0x299999b0L, 0x5a2d2d77L, 0x1e0f0f11L, - 0x7bb0b0cbL, 0xa85454fcL, 0x6dbbbbd6L, 0x2c16163aL, - ] + 0xc66363a5L, 0xf87c7c84L, 0xee777799L, 0xf67b7b8dL, + 0xfff2f20dL, 0xd66b6bbdL, 0xde6f6fb1L, 0x91c5c554L, + 0x60303050L, 0x02010103L, 0xce6767a9L, 0x562b2b7dL, + 0xe7fefe19L, 0xb5d7d762L, 0x4dababe6L, 0xec76769aL, + 0x8fcaca45L, 0x1f82829dL, 0x89c9c940L, 0xfa7d7d87L, + 0xeffafa15L, 0xb25959ebL, 0x8e4747c9L, 0xfbf0f00bL, + 0x41adadecL, 0xb3d4d467L, 0x5fa2a2fdL, 0x45afafeaL, + 0x239c9cbfL, 0x53a4a4f7L, 0xe4727296L, 0x9bc0c05bL, + 0x75b7b7c2L, 0xe1fdfd1cL, 0x3d9393aeL, 0x4c26266aL, + 0x6c36365aL, 0x7e3f3f41L, 0xf5f7f702L, 0x83cccc4fL, + 0x6834345cL, 0x51a5a5f4L, 0xd1e5e534L, 0xf9f1f108L, + 0xe2717193L, 0xabd8d873L, 0x62313153L, 0x2a15153fL, + 0x0804040cL, 0x95c7c752L, 0x46232365L, 0x9dc3c35eL, + 0x30181828L, 0x379696a1L, 0x0a05050fL, 0x2f9a9ab5L, + 0x0e070709L, 0x24121236L, 0x1b80809bL, 0xdfe2e23dL, + 0xcdebeb26L, 0x4e272769L, 0x7fb2b2cdL, 0xea75759fL, + 0x1209091bL, 0x1d83839eL, 0x582c2c74L, 0x341a1a2eL, + 0x361b1b2dL, 0xdc6e6eb2L, 0xb45a5aeeL, 0x5ba0a0fbL, + 0xa45252f6L, 0x763b3b4dL, 0xb7d6d661L, 0x7db3b3ceL, + 0x5229297bL, 0xdde3e33eL, 0x5e2f2f71L, 0x13848497L, + 0xa65353f5L, 0xb9d1d168L, 0x00000000L, 0xc1eded2cL, + 0x40202060L, 0xe3fcfc1fL, 0x79b1b1c8L, 0xb65b5bedL, + 0xd46a6abeL, 0x8dcbcb46L, 0x67bebed9L, 0x7239394bL, + 0x944a4adeL, 0x984c4cd4L, 0xb05858e8L, 0x85cfcf4aL, + 0xbbd0d06bL, 0xc5efef2aL, 0x4faaaae5L, 0xedfbfb16L, + 0x864343c5L, 0x9a4d4dd7L, 0x66333355L, 0x11858594L, + 0x8a4545cfL, 0xe9f9f910L, 0x04020206L, 0xfe7f7f81L, + 0xa05050f0L, 0x783c3c44L, 0x259f9fbaL, 0x4ba8a8e3L, + 0xa25151f3L, 0x5da3a3feL, 0x804040c0L, 0x058f8f8aL, + 0x3f9292adL, 0x219d9dbcL, 0x70383848L, 0xf1f5f504L, + 0x63bcbcdfL, 0x77b6b6c1L, 0xafdada75L, 0x42212163L, + 0x20101030L, 0xe5ffff1aL, 0xfdf3f30eL, 0xbfd2d26dL, + 0x81cdcd4cL, 0x180c0c14L, 0x26131335L, 0xc3ecec2fL, + 0xbe5f5fe1L, 0x359797a2L, 0x884444ccL, 0x2e171739L, + 0x93c4c457L, 0x55a7a7f2L, 0xfc7e7e82L, 0x7a3d3d47L, + 0xc86464acL, 0xba5d5de7L, 0x3219192bL, 0xe6737395L, + 0xc06060a0L, 0x19818198L, 0x9e4f4fd1L, 0xa3dcdc7fL, + 0x44222266L, 0x542a2a7eL, 0x3b9090abL, 0x0b888883L, + 0x8c4646caL, 0xc7eeee29L, 0x6bb8b8d3L, 0x2814143cL, + 0xa7dede79L, 0xbc5e5ee2L, 0x160b0b1dL, 0xaddbdb76L, + 0xdbe0e03bL, 0x64323256L, 0x743a3a4eL, 0x140a0a1eL, + 0x924949dbL, 0x0c06060aL, 0x4824246cL, 0xb85c5ce4L, + 0x9fc2c25dL, 0xbdd3d36eL, 0x43acacefL, 0xc46262a6L, + 0x399191a8L, 0x319595a4L, 0xd3e4e437L, 0xf279798bL, + 0xd5e7e732L, 0x8bc8c843L, 0x6e373759L, 0xda6d6db7L, + 0x018d8d8cL, 0xb1d5d564L, 0x9c4e4ed2L, 0x49a9a9e0L, + 0xd86c6cb4L, 0xac5656faL, 0xf3f4f407L, 0xcfeaea25L, + 0xca6565afL, 0xf47a7a8eL, 0x47aeaee9L, 0x10080818L, + 0x6fbabad5L, 0xf0787888L, 0x4a25256fL, 0x5c2e2e72L, + 0x381c1c24L, 0x57a6a6f1L, 0x73b4b4c7L, 0x97c6c651L, + 0xcbe8e823L, 0xa1dddd7cL, 0xe874749cL, 0x3e1f1f21L, + 0x964b4bddL, 0x61bdbddcL, 0x0d8b8b86L, 0x0f8a8a85L, + 0xe0707090L, 0x7c3e3e42L, 0x71b5b5c4L, 0xcc6666aaL, + 0x904848d8L, 0x06030305L, 0xf7f6f601L, 0x1c0e0e12L, + 0xc26161a3L, 0x6a35355fL, 0xae5757f9L, 0x69b9b9d0L, + 0x17868691L, 0x99c1c158L, 0x3a1d1d27L, 0x279e9eb9L, + 0xd9e1e138L, 0xebf8f813L, 0x2b9898b3L, 0x22111133L, + 0xd26969bbL, 0xa9d9d970L, 0x078e8e89L, 0x339494a7L, + 0x2d9b9bb6L, 0x3c1e1e22L, 0x15878792L, 0xc9e9e920L, + 0x87cece49L, 0xaa5555ffL, 0x50282878L, 0xa5dfdf7aL, + 0x038c8c8fL, 0x59a1a1f8L, 0x09898980L, 0x1a0d0d17L, + 0x65bfbfdaL, 0xd7e6e631L, 0x844242c6L, 0xd06868b8L, + 0x824141c3L, 0x299999b0L, 0x5a2d2d77L, 0x1e0f0f11L, + 0x7bb0b0cbL, 0xa85454fcL, 0x6dbbbbd6L, 0x2c16163aL, +] Te1 = [ - 0xa5c66363L, 0x84f87c7cL, 0x99ee7777L, 0x8df67b7bL, - 0x0dfff2f2L, 0xbdd66b6bL, 0xb1de6f6fL, 0x5491c5c5L, - 0x50603030L, 0x03020101L, 0xa9ce6767L, 0x7d562b2bL, - 0x19e7fefeL, 0x62b5d7d7L, 0xe64dababL, 0x9aec7676L, - 0x458fcacaL, 0x9d1f8282L, 0x4089c9c9L, 0x87fa7d7dL, - 0x15effafaL, 0xebb25959L, 0xc98e4747L, 0x0bfbf0f0L, - 0xec41adadL, 0x67b3d4d4L, 0xfd5fa2a2L, 0xea45afafL, - 0xbf239c9cL, 0xf753a4a4L, 0x96e47272L, 0x5b9bc0c0L, - 0xc275b7b7L, 0x1ce1fdfdL, 0xae3d9393L, 0x6a4c2626L, - 0x5a6c3636L, 0x417e3f3fL, 0x02f5f7f7L, 0x4f83ccccL, - 0x5c683434L, 0xf451a5a5L, 0x34d1e5e5L, 0x08f9f1f1L, - 0x93e27171L, 0x73abd8d8L, 0x53623131L, 0x3f2a1515L, - 0x0c080404L, 0x5295c7c7L, 0x65462323L, 0x5e9dc3c3L, - 0x28301818L, 0xa1379696L, 0x0f0a0505L, 0xb52f9a9aL, - 0x090e0707L, 0x36241212L, 0x9b1b8080L, 0x3ddfe2e2L, - 0x26cdebebL, 0x694e2727L, 0xcd7fb2b2L, 0x9fea7575L, - 0x1b120909L, 0x9e1d8383L, 0x74582c2cL, 0x2e341a1aL, - 0x2d361b1bL, 0xb2dc6e6eL, 0xeeb45a5aL, 0xfb5ba0a0L, - 0xf6a45252L, 0x4d763b3bL, 0x61b7d6d6L, 0xce7db3b3L, - 0x7b522929L, 0x3edde3e3L, 0x715e2f2fL, 0x97138484L, - 0xf5a65353L, 0x68b9d1d1L, 0x00000000L, 0x2cc1ededL, - 0x60402020L, 0x1fe3fcfcL, 0xc879b1b1L, 0xedb65b5bL, - 0xbed46a6aL, 0x468dcbcbL, 0xd967bebeL, 0x4b723939L, - 0xde944a4aL, 0xd4984c4cL, 0xe8b05858L, 0x4a85cfcfL, - 0x6bbbd0d0L, 0x2ac5efefL, 0xe54faaaaL, 0x16edfbfbL, - 0xc5864343L, 0xd79a4d4dL, 0x55663333L, 0x94118585L, - 0xcf8a4545L, 0x10e9f9f9L, 0x06040202L, 0x81fe7f7fL, - 0xf0a05050L, 0x44783c3cL, 0xba259f9fL, 0xe34ba8a8L, - 0xf3a25151L, 0xfe5da3a3L, 0xc0804040L, 0x8a058f8fL, - 0xad3f9292L, 0xbc219d9dL, 0x48703838L, 0x04f1f5f5L, - 0xdf63bcbcL, 0xc177b6b6L, 0x75afdadaL, 0x63422121L, - 0x30201010L, 0x1ae5ffffL, 0x0efdf3f3L, 0x6dbfd2d2L, - 0x4c81cdcdL, 0x14180c0cL, 0x35261313L, 0x2fc3ececL, - 0xe1be5f5fL, 0xa2359797L, 0xcc884444L, 0x392e1717L, - 0x5793c4c4L, 0xf255a7a7L, 0x82fc7e7eL, 0x477a3d3dL, - 0xacc86464L, 0xe7ba5d5dL, 0x2b321919L, 0x95e67373L, - 0xa0c06060L, 0x98198181L, 0xd19e4f4fL, 0x7fa3dcdcL, - 0x66442222L, 0x7e542a2aL, 0xab3b9090L, 0x830b8888L, - 0xca8c4646L, 0x29c7eeeeL, 0xd36bb8b8L, 0x3c281414L, - 0x79a7dedeL, 0xe2bc5e5eL, 0x1d160b0bL, 0x76addbdbL, - 0x3bdbe0e0L, 0x56643232L, 0x4e743a3aL, 0x1e140a0aL, - 0xdb924949L, 0x0a0c0606L, 0x6c482424L, 0xe4b85c5cL, - 0x5d9fc2c2L, 0x6ebdd3d3L, 0xef43acacL, 0xa6c46262L, - 0xa8399191L, 0xa4319595L, 0x37d3e4e4L, 0x8bf27979L, - 0x32d5e7e7L, 0x438bc8c8L, 0x596e3737L, 0xb7da6d6dL, - 0x8c018d8dL, 0x64b1d5d5L, 0xd29c4e4eL, 0xe049a9a9L, - 0xb4d86c6cL, 0xfaac5656L, 0x07f3f4f4L, 0x25cfeaeaL, - 0xafca6565L, 0x8ef47a7aL, 0xe947aeaeL, 0x18100808L, - 0xd56fbabaL, 0x88f07878L, 0x6f4a2525L, 0x725c2e2eL, - 0x24381c1cL, 0xf157a6a6L, 0xc773b4b4L, 0x5197c6c6L, - 0x23cbe8e8L, 0x7ca1ddddL, 0x9ce87474L, 0x213e1f1fL, - 0xdd964b4bL, 0xdc61bdbdL, 0x860d8b8bL, 0x850f8a8aL, - 0x90e07070L, 0x427c3e3eL, 0xc471b5b5L, 0xaacc6666L, - 0xd8904848L, 0x05060303L, 0x01f7f6f6L, 0x121c0e0eL, - 0xa3c26161L, 0x5f6a3535L, 0xf9ae5757L, 0xd069b9b9L, - 0x91178686L, 0x5899c1c1L, 0x273a1d1dL, 0xb9279e9eL, - 0x38d9e1e1L, 0x13ebf8f8L, 0xb32b9898L, 0x33221111L, - 0xbbd26969L, 0x70a9d9d9L, 0x89078e8eL, 0xa7339494L, - 0xb62d9b9bL, 0x223c1e1eL, 0x92158787L, 0x20c9e9e9L, - 0x4987ceceL, 0xffaa5555L, 0x78502828L, 0x7aa5dfdfL, - 0x8f038c8cL, 0xf859a1a1L, 0x80098989L, 0x171a0d0dL, - 0xda65bfbfL, 0x31d7e6e6L, 0xc6844242L, 0xb8d06868L, - 0xc3824141L, 0xb0299999L, 0x775a2d2dL, 0x111e0f0fL, - 0xcb7bb0b0L, 0xfca85454L, 0xd66dbbbbL, 0x3a2c1616L, - ] + 0xa5c66363L, 0x84f87c7cL, 0x99ee7777L, 0x8df67b7bL, + 0x0dfff2f2L, 0xbdd66b6bL, 0xb1de6f6fL, 0x5491c5c5L, + 0x50603030L, 0x03020101L, 0xa9ce6767L, 0x7d562b2bL, + 0x19e7fefeL, 0x62b5d7d7L, 0xe64dababL, 0x9aec7676L, + 0x458fcacaL, 0x9d1f8282L, 0x4089c9c9L, 0x87fa7d7dL, + 0x15effafaL, 0xebb25959L, 0xc98e4747L, 0x0bfbf0f0L, + 0xec41adadL, 0x67b3d4d4L, 0xfd5fa2a2L, 0xea45afafL, + 0xbf239c9cL, 0xf753a4a4L, 0x96e47272L, 0x5b9bc0c0L, + 0xc275b7b7L, 0x1ce1fdfdL, 0xae3d9393L, 0x6a4c2626L, + 0x5a6c3636L, 0x417e3f3fL, 0x02f5f7f7L, 0x4f83ccccL, + 0x5c683434L, 0xf451a5a5L, 0x34d1e5e5L, 0x08f9f1f1L, + 0x93e27171L, 0x73abd8d8L, 0x53623131L, 0x3f2a1515L, + 0x0c080404L, 0x5295c7c7L, 0x65462323L, 0x5e9dc3c3L, + 0x28301818L, 0xa1379696L, 0x0f0a0505L, 0xb52f9a9aL, + 0x090e0707L, 0x36241212L, 0x9b1b8080L, 0x3ddfe2e2L, + 0x26cdebebL, 0x694e2727L, 0xcd7fb2b2L, 0x9fea7575L, + 0x1b120909L, 0x9e1d8383L, 0x74582c2cL, 0x2e341a1aL, + 0x2d361b1bL, 0xb2dc6e6eL, 0xeeb45a5aL, 0xfb5ba0a0L, + 0xf6a45252L, 0x4d763b3bL, 0x61b7d6d6L, 0xce7db3b3L, + 0x7b522929L, 0x3edde3e3L, 0x715e2f2fL, 0x97138484L, + 0xf5a65353L, 0x68b9d1d1L, 0x00000000L, 0x2cc1ededL, + 0x60402020L, 0x1fe3fcfcL, 0xc879b1b1L, 0xedb65b5bL, + 0xbed46a6aL, 0x468dcbcbL, 0xd967bebeL, 0x4b723939L, + 0xde944a4aL, 0xd4984c4cL, 0xe8b05858L, 0x4a85cfcfL, + 0x6bbbd0d0L, 0x2ac5efefL, 0xe54faaaaL, 0x16edfbfbL, + 0xc5864343L, 0xd79a4d4dL, 0x55663333L, 0x94118585L, + 0xcf8a4545L, 0x10e9f9f9L, 0x06040202L, 0x81fe7f7fL, + 0xf0a05050L, 0x44783c3cL, 0xba259f9fL, 0xe34ba8a8L, + 0xf3a25151L, 0xfe5da3a3L, 0xc0804040L, 0x8a058f8fL, + 0xad3f9292L, 0xbc219d9dL, 0x48703838L, 0x04f1f5f5L, + 0xdf63bcbcL, 0xc177b6b6L, 0x75afdadaL, 0x63422121L, + 0x30201010L, 0x1ae5ffffL, 0x0efdf3f3L, 0x6dbfd2d2L, + 0x4c81cdcdL, 0x14180c0cL, 0x35261313L, 0x2fc3ececL, + 0xe1be5f5fL, 0xa2359797L, 0xcc884444L, 0x392e1717L, + 0x5793c4c4L, 0xf255a7a7L, 0x82fc7e7eL, 0x477a3d3dL, + 0xacc86464L, 0xe7ba5d5dL, 0x2b321919L, 0x95e67373L, + 0xa0c06060L, 0x98198181L, 0xd19e4f4fL, 0x7fa3dcdcL, + 0x66442222L, 0x7e542a2aL, 0xab3b9090L, 0x830b8888L, + 0xca8c4646L, 0x29c7eeeeL, 0xd36bb8b8L, 0x3c281414L, + 0x79a7dedeL, 0xe2bc5e5eL, 0x1d160b0bL, 0x76addbdbL, + 0x3bdbe0e0L, 0x56643232L, 0x4e743a3aL, 0x1e140a0aL, + 0xdb924949L, 0x0a0c0606L, 0x6c482424L, 0xe4b85c5cL, + 0x5d9fc2c2L, 0x6ebdd3d3L, 0xef43acacL, 0xa6c46262L, + 0xa8399191L, 0xa4319595L, 0x37d3e4e4L, 0x8bf27979L, + 0x32d5e7e7L, 0x438bc8c8L, 0x596e3737L, 0xb7da6d6dL, + 0x8c018d8dL, 0x64b1d5d5L, 0xd29c4e4eL, 0xe049a9a9L, + 0xb4d86c6cL, 0xfaac5656L, 0x07f3f4f4L, 0x25cfeaeaL, + 0xafca6565L, 0x8ef47a7aL, 0xe947aeaeL, 0x18100808L, + 0xd56fbabaL, 0x88f07878L, 0x6f4a2525L, 0x725c2e2eL, + 0x24381c1cL, 0xf157a6a6L, 0xc773b4b4L, 0x5197c6c6L, + 0x23cbe8e8L, 0x7ca1ddddL, 0x9ce87474L, 0x213e1f1fL, + 0xdd964b4bL, 0xdc61bdbdL, 0x860d8b8bL, 0x850f8a8aL, + 0x90e07070L, 0x427c3e3eL, 0xc471b5b5L, 0xaacc6666L, + 0xd8904848L, 0x05060303L, 0x01f7f6f6L, 0x121c0e0eL, + 0xa3c26161L, 0x5f6a3535L, 0xf9ae5757L, 0xd069b9b9L, + 0x91178686L, 0x5899c1c1L, 0x273a1d1dL, 0xb9279e9eL, + 0x38d9e1e1L, 0x13ebf8f8L, 0xb32b9898L, 0x33221111L, + 0xbbd26969L, 0x70a9d9d9L, 0x89078e8eL, 0xa7339494L, + 0xb62d9b9bL, 0x223c1e1eL, 0x92158787L, 0x20c9e9e9L, + 0x4987ceceL, 0xffaa5555L, 0x78502828L, 0x7aa5dfdfL, + 0x8f038c8cL, 0xf859a1a1L, 0x80098989L, 0x171a0d0dL, + 0xda65bfbfL, 0x31d7e6e6L, 0xc6844242L, 0xb8d06868L, + 0xc3824141L, 0xb0299999L, 0x775a2d2dL, 0x111e0f0fL, + 0xcb7bb0b0L, 0xfca85454L, 0xd66dbbbbL, 0x3a2c1616L, +] Te2 = [ - 0x63a5c663L, 0x7c84f87cL, 0x7799ee77L, 0x7b8df67bL, - 0xf20dfff2L, 0x6bbdd66bL, 0x6fb1de6fL, 0xc55491c5L, - 0x30506030L, 0x01030201L, 0x67a9ce67L, 0x2b7d562bL, - 0xfe19e7feL, 0xd762b5d7L, 0xabe64dabL, 0x769aec76L, - 0xca458fcaL, 0x829d1f82L, 0xc94089c9L, 0x7d87fa7dL, - 0xfa15effaL, 0x59ebb259L, 0x47c98e47L, 0xf00bfbf0L, - 0xadec41adL, 0xd467b3d4L, 0xa2fd5fa2L, 0xafea45afL, - 0x9cbf239cL, 0xa4f753a4L, 0x7296e472L, 0xc05b9bc0L, - 0xb7c275b7L, 0xfd1ce1fdL, 0x93ae3d93L, 0x266a4c26L, - 0x365a6c36L, 0x3f417e3fL, 0xf702f5f7L, 0xcc4f83ccL, - 0x345c6834L, 0xa5f451a5L, 0xe534d1e5L, 0xf108f9f1L, - 0x7193e271L, 0xd873abd8L, 0x31536231L, 0x153f2a15L, - 0x040c0804L, 0xc75295c7L, 0x23654623L, 0xc35e9dc3L, - 0x18283018L, 0x96a13796L, 0x050f0a05L, 0x9ab52f9aL, - 0x07090e07L, 0x12362412L, 0x809b1b80L, 0xe23ddfe2L, - 0xeb26cdebL, 0x27694e27L, 0xb2cd7fb2L, 0x759fea75L, - 0x091b1209L, 0x839e1d83L, 0x2c74582cL, 0x1a2e341aL, - 0x1b2d361bL, 0x6eb2dc6eL, 0x5aeeb45aL, 0xa0fb5ba0L, - 0x52f6a452L, 0x3b4d763bL, 0xd661b7d6L, 0xb3ce7db3L, - 0x297b5229L, 0xe33edde3L, 0x2f715e2fL, 0x84971384L, - 0x53f5a653L, 0xd168b9d1L, 0x00000000L, 0xed2cc1edL, - 0x20604020L, 0xfc1fe3fcL, 0xb1c879b1L, 0x5bedb65bL, - 0x6abed46aL, 0xcb468dcbL, 0xbed967beL, 0x394b7239L, - 0x4ade944aL, 0x4cd4984cL, 0x58e8b058L, 0xcf4a85cfL, - 0xd06bbbd0L, 0xef2ac5efL, 0xaae54faaL, 0xfb16edfbL, - 0x43c58643L, 0x4dd79a4dL, 0x33556633L, 0x85941185L, - 0x45cf8a45L, 0xf910e9f9L, 0x02060402L, 0x7f81fe7fL, - 0x50f0a050L, 0x3c44783cL, 0x9fba259fL, 0xa8e34ba8L, - 0x51f3a251L, 0xa3fe5da3L, 0x40c08040L, 0x8f8a058fL, - 0x92ad3f92L, 0x9dbc219dL, 0x38487038L, 0xf504f1f5L, - 0xbcdf63bcL, 0xb6c177b6L, 0xda75afdaL, 0x21634221L, - 0x10302010L, 0xff1ae5ffL, 0xf30efdf3L, 0xd26dbfd2L, - 0xcd4c81cdL, 0x0c14180cL, 0x13352613L, 0xec2fc3ecL, - 0x5fe1be5fL, 0x97a23597L, 0x44cc8844L, 0x17392e17L, - 0xc45793c4L, 0xa7f255a7L, 0x7e82fc7eL, 0x3d477a3dL, - 0x64acc864L, 0x5de7ba5dL, 0x192b3219L, 0x7395e673L, - 0x60a0c060L, 0x81981981L, 0x4fd19e4fL, 0xdc7fa3dcL, - 0x22664422L, 0x2a7e542aL, 0x90ab3b90L, 0x88830b88L, - 0x46ca8c46L, 0xee29c7eeL, 0xb8d36bb8L, 0x143c2814L, - 0xde79a7deL, 0x5ee2bc5eL, 0x0b1d160bL, 0xdb76addbL, - 0xe03bdbe0L, 0x32566432L, 0x3a4e743aL, 0x0a1e140aL, - 0x49db9249L, 0x060a0c06L, 0x246c4824L, 0x5ce4b85cL, - 0xc25d9fc2L, 0xd36ebdd3L, 0xacef43acL, 0x62a6c462L, - 0x91a83991L, 0x95a43195L, 0xe437d3e4L, 0x798bf279L, - 0xe732d5e7L, 0xc8438bc8L, 0x37596e37L, 0x6db7da6dL, - 0x8d8c018dL, 0xd564b1d5L, 0x4ed29c4eL, 0xa9e049a9L, - 0x6cb4d86cL, 0x56faac56L, 0xf407f3f4L, 0xea25cfeaL, - 0x65afca65L, 0x7a8ef47aL, 0xaee947aeL, 0x08181008L, - 0xbad56fbaL, 0x7888f078L, 0x256f4a25L, 0x2e725c2eL, - 0x1c24381cL, 0xa6f157a6L, 0xb4c773b4L, 0xc65197c6L, - 0xe823cbe8L, 0xdd7ca1ddL, 0x749ce874L, 0x1f213e1fL, - 0x4bdd964bL, 0xbddc61bdL, 0x8b860d8bL, 0x8a850f8aL, - 0x7090e070L, 0x3e427c3eL, 0xb5c471b5L, 0x66aacc66L, - 0x48d89048L, 0x03050603L, 0xf601f7f6L, 0x0e121c0eL, - 0x61a3c261L, 0x355f6a35L, 0x57f9ae57L, 0xb9d069b9L, - 0x86911786L, 0xc15899c1L, 0x1d273a1dL, 0x9eb9279eL, - 0xe138d9e1L, 0xf813ebf8L, 0x98b32b98L, 0x11332211L, - 0x69bbd269L, 0xd970a9d9L, 0x8e89078eL, 0x94a73394L, - 0x9bb62d9bL, 0x1e223c1eL, 0x87921587L, 0xe920c9e9L, - 0xce4987ceL, 0x55ffaa55L, 0x28785028L, 0xdf7aa5dfL, - 0x8c8f038cL, 0xa1f859a1L, 0x89800989L, 0x0d171a0dL, - 0xbfda65bfL, 0xe631d7e6L, 0x42c68442L, 0x68b8d068L, - 0x41c38241L, 0x99b02999L, 0x2d775a2dL, 0x0f111e0fL, - 0xb0cb7bb0L, 0x54fca854L, 0xbbd66dbbL, 0x163a2c16L, - ] + 0x63a5c663L, 0x7c84f87cL, 0x7799ee77L, 0x7b8df67bL, + 0xf20dfff2L, 0x6bbdd66bL, 0x6fb1de6fL, 0xc55491c5L, + 0x30506030L, 0x01030201L, 0x67a9ce67L, 0x2b7d562bL, + 0xfe19e7feL, 0xd762b5d7L, 0xabe64dabL, 0x769aec76L, + 0xca458fcaL, 0x829d1f82L, 0xc94089c9L, 0x7d87fa7dL, + 0xfa15effaL, 0x59ebb259L, 0x47c98e47L, 0xf00bfbf0L, + 0xadec41adL, 0xd467b3d4L, 0xa2fd5fa2L, 0xafea45afL, + 0x9cbf239cL, 0xa4f753a4L, 0x7296e472L, 0xc05b9bc0L, + 0xb7c275b7L, 0xfd1ce1fdL, 0x93ae3d93L, 0x266a4c26L, + 0x365a6c36L, 0x3f417e3fL, 0xf702f5f7L, 0xcc4f83ccL, + 0x345c6834L, 0xa5f451a5L, 0xe534d1e5L, 0xf108f9f1L, + 0x7193e271L, 0xd873abd8L, 0x31536231L, 0x153f2a15L, + 0x040c0804L, 0xc75295c7L, 0x23654623L, 0xc35e9dc3L, + 0x18283018L, 0x96a13796L, 0x050f0a05L, 0x9ab52f9aL, + 0x07090e07L, 0x12362412L, 0x809b1b80L, 0xe23ddfe2L, + 0xeb26cdebL, 0x27694e27L, 0xb2cd7fb2L, 0x759fea75L, + 0x091b1209L, 0x839e1d83L, 0x2c74582cL, 0x1a2e341aL, + 0x1b2d361bL, 0x6eb2dc6eL, 0x5aeeb45aL, 0xa0fb5ba0L, + 0x52f6a452L, 0x3b4d763bL, 0xd661b7d6L, 0xb3ce7db3L, + 0x297b5229L, 0xe33edde3L, 0x2f715e2fL, 0x84971384L, + 0x53f5a653L, 0xd168b9d1L, 0x00000000L, 0xed2cc1edL, + 0x20604020L, 0xfc1fe3fcL, 0xb1c879b1L, 0x5bedb65bL, + 0x6abed46aL, 0xcb468dcbL, 0xbed967beL, 0x394b7239L, + 0x4ade944aL, 0x4cd4984cL, 0x58e8b058L, 0xcf4a85cfL, + 0xd06bbbd0L, 0xef2ac5efL, 0xaae54faaL, 0xfb16edfbL, + 0x43c58643L, 0x4dd79a4dL, 0x33556633L, 0x85941185L, + 0x45cf8a45L, 0xf910e9f9L, 0x02060402L, 0x7f81fe7fL, + 0x50f0a050L, 0x3c44783cL, 0x9fba259fL, 0xa8e34ba8L, + 0x51f3a251L, 0xa3fe5da3L, 0x40c08040L, 0x8f8a058fL, + 0x92ad3f92L, 0x9dbc219dL, 0x38487038L, 0xf504f1f5L, + 0xbcdf63bcL, 0xb6c177b6L, 0xda75afdaL, 0x21634221L, + 0x10302010L, 0xff1ae5ffL, 0xf30efdf3L, 0xd26dbfd2L, + 0xcd4c81cdL, 0x0c14180cL, 0x13352613L, 0xec2fc3ecL, + 0x5fe1be5fL, 0x97a23597L, 0x44cc8844L, 0x17392e17L, + 0xc45793c4L, 0xa7f255a7L, 0x7e82fc7eL, 0x3d477a3dL, + 0x64acc864L, 0x5de7ba5dL, 0x192b3219L, 0x7395e673L, + 0x60a0c060L, 0x81981981L, 0x4fd19e4fL, 0xdc7fa3dcL, + 0x22664422L, 0x2a7e542aL, 0x90ab3b90L, 0x88830b88L, + 0x46ca8c46L, 0xee29c7eeL, 0xb8d36bb8L, 0x143c2814L, + 0xde79a7deL, 0x5ee2bc5eL, 0x0b1d160bL, 0xdb76addbL, + 0xe03bdbe0L, 0x32566432L, 0x3a4e743aL, 0x0a1e140aL, + 0x49db9249L, 0x060a0c06L, 0x246c4824L, 0x5ce4b85cL, + 0xc25d9fc2L, 0xd36ebdd3L, 0xacef43acL, 0x62a6c462L, + 0x91a83991L, 0x95a43195L, 0xe437d3e4L, 0x798bf279L, + 0xe732d5e7L, 0xc8438bc8L, 0x37596e37L, 0x6db7da6dL, + 0x8d8c018dL, 0xd564b1d5L, 0x4ed29c4eL, 0xa9e049a9L, + 0x6cb4d86cL, 0x56faac56L, 0xf407f3f4L, 0xea25cfeaL, + 0x65afca65L, 0x7a8ef47aL, 0xaee947aeL, 0x08181008L, + 0xbad56fbaL, 0x7888f078L, 0x256f4a25L, 0x2e725c2eL, + 0x1c24381cL, 0xa6f157a6L, 0xb4c773b4L, 0xc65197c6L, + 0xe823cbe8L, 0xdd7ca1ddL, 0x749ce874L, 0x1f213e1fL, + 0x4bdd964bL, 0xbddc61bdL, 0x8b860d8bL, 0x8a850f8aL, + 0x7090e070L, 0x3e427c3eL, 0xb5c471b5L, 0x66aacc66L, + 0x48d89048L, 0x03050603L, 0xf601f7f6L, 0x0e121c0eL, + 0x61a3c261L, 0x355f6a35L, 0x57f9ae57L, 0xb9d069b9L, + 0x86911786L, 0xc15899c1L, 0x1d273a1dL, 0x9eb9279eL, + 0xe138d9e1L, 0xf813ebf8L, 0x98b32b98L, 0x11332211L, + 0x69bbd269L, 0xd970a9d9L, 0x8e89078eL, 0x94a73394L, + 0x9bb62d9bL, 0x1e223c1eL, 0x87921587L, 0xe920c9e9L, + 0xce4987ceL, 0x55ffaa55L, 0x28785028L, 0xdf7aa5dfL, + 0x8c8f038cL, 0xa1f859a1L, 0x89800989L, 0x0d171a0dL, + 0xbfda65bfL, 0xe631d7e6L, 0x42c68442L, 0x68b8d068L, + 0x41c38241L, 0x99b02999L, 0x2d775a2dL, 0x0f111e0fL, + 0xb0cb7bb0L, 0x54fca854L, 0xbbd66dbbL, 0x163a2c16L, +] Te3 = [ - 0x6363a5c6L, 0x7c7c84f8L, 0x777799eeL, 0x7b7b8df6L, - 0xf2f20dffL, 0x6b6bbdd6L, 0x6f6fb1deL, 0xc5c55491L, - 0x30305060L, 0x01010302L, 0x6767a9ceL, 0x2b2b7d56L, - 0xfefe19e7L, 0xd7d762b5L, 0xababe64dL, 0x76769aecL, - 0xcaca458fL, 0x82829d1fL, 0xc9c94089L, 0x7d7d87faL, - 0xfafa15efL, 0x5959ebb2L, 0x4747c98eL, 0xf0f00bfbL, - 0xadadec41L, 0xd4d467b3L, 0xa2a2fd5fL, 0xafafea45L, - 0x9c9cbf23L, 0xa4a4f753L, 0x727296e4L, 0xc0c05b9bL, - 0xb7b7c275L, 0xfdfd1ce1L, 0x9393ae3dL, 0x26266a4cL, - 0x36365a6cL, 0x3f3f417eL, 0xf7f702f5L, 0xcccc4f83L, - 0x34345c68L, 0xa5a5f451L, 0xe5e534d1L, 0xf1f108f9L, - 0x717193e2L, 0xd8d873abL, 0x31315362L, 0x15153f2aL, - 0x04040c08L, 0xc7c75295L, 0x23236546L, 0xc3c35e9dL, - 0x18182830L, 0x9696a137L, 0x05050f0aL, 0x9a9ab52fL, - 0x0707090eL, 0x12123624L, 0x80809b1bL, 0xe2e23ddfL, - 0xebeb26cdL, 0x2727694eL, 0xb2b2cd7fL, 0x75759feaL, - 0x09091b12L, 0x83839e1dL, 0x2c2c7458L, 0x1a1a2e34L, - 0x1b1b2d36L, 0x6e6eb2dcL, 0x5a5aeeb4L, 0xa0a0fb5bL, - 0x5252f6a4L, 0x3b3b4d76L, 0xd6d661b7L, 0xb3b3ce7dL, - 0x29297b52L, 0xe3e33eddL, 0x2f2f715eL, 0x84849713L, - 0x5353f5a6L, 0xd1d168b9L, 0x00000000L, 0xeded2cc1L, - 0x20206040L, 0xfcfc1fe3L, 0xb1b1c879L, 0x5b5bedb6L, - 0x6a6abed4L, 0xcbcb468dL, 0xbebed967L, 0x39394b72L, - 0x4a4ade94L, 0x4c4cd498L, 0x5858e8b0L, 0xcfcf4a85L, - 0xd0d06bbbL, 0xefef2ac5L, 0xaaaae54fL, 0xfbfb16edL, - 0x4343c586L, 0x4d4dd79aL, 0x33335566L, 0x85859411L, - 0x4545cf8aL, 0xf9f910e9L, 0x02020604L, 0x7f7f81feL, - 0x5050f0a0L, 0x3c3c4478L, 0x9f9fba25L, 0xa8a8e34bL, - 0x5151f3a2L, 0xa3a3fe5dL, 0x4040c080L, 0x8f8f8a05L, - 0x9292ad3fL, 0x9d9dbc21L, 0x38384870L, 0xf5f504f1L, - 0xbcbcdf63L, 0xb6b6c177L, 0xdada75afL, 0x21216342L, - 0x10103020L, 0xffff1ae5L, 0xf3f30efdL, 0xd2d26dbfL, - 0xcdcd4c81L, 0x0c0c1418L, 0x13133526L, 0xecec2fc3L, - 0x5f5fe1beL, 0x9797a235L, 0x4444cc88L, 0x1717392eL, - 0xc4c45793L, 0xa7a7f255L, 0x7e7e82fcL, 0x3d3d477aL, - 0x6464acc8L, 0x5d5de7baL, 0x19192b32L, 0x737395e6L, - 0x6060a0c0L, 0x81819819L, 0x4f4fd19eL, 0xdcdc7fa3L, - 0x22226644L, 0x2a2a7e54L, 0x9090ab3bL, 0x8888830bL, - 0x4646ca8cL, 0xeeee29c7L, 0xb8b8d36bL, 0x14143c28L, - 0xdede79a7L, 0x5e5ee2bcL, 0x0b0b1d16L, 0xdbdb76adL, - 0xe0e03bdbL, 0x32325664L, 0x3a3a4e74L, 0x0a0a1e14L, - 0x4949db92L, 0x06060a0cL, 0x24246c48L, 0x5c5ce4b8L, - 0xc2c25d9fL, 0xd3d36ebdL, 0xacacef43L, 0x6262a6c4L, - 0x9191a839L, 0x9595a431L, 0xe4e437d3L, 0x79798bf2L, - 0xe7e732d5L, 0xc8c8438bL, 0x3737596eL, 0x6d6db7daL, - 0x8d8d8c01L, 0xd5d564b1L, 0x4e4ed29cL, 0xa9a9e049L, - 0x6c6cb4d8L, 0x5656faacL, 0xf4f407f3L, 0xeaea25cfL, - 0x6565afcaL, 0x7a7a8ef4L, 0xaeaee947L, 0x08081810L, - 0xbabad56fL, 0x787888f0L, 0x25256f4aL, 0x2e2e725cL, - 0x1c1c2438L, 0xa6a6f157L, 0xb4b4c773L, 0xc6c65197L, - 0xe8e823cbL, 0xdddd7ca1L, 0x74749ce8L, 0x1f1f213eL, - 0x4b4bdd96L, 0xbdbddc61L, 0x8b8b860dL, 0x8a8a850fL, - 0x707090e0L, 0x3e3e427cL, 0xb5b5c471L, 0x6666aaccL, - 0x4848d890L, 0x03030506L, 0xf6f601f7L, 0x0e0e121cL, - 0x6161a3c2L, 0x35355f6aL, 0x5757f9aeL, 0xb9b9d069L, - 0x86869117L, 0xc1c15899L, 0x1d1d273aL, 0x9e9eb927L, - 0xe1e138d9L, 0xf8f813ebL, 0x9898b32bL, 0x11113322L, - 0x6969bbd2L, 0xd9d970a9L, 0x8e8e8907L, 0x9494a733L, - 0x9b9bb62dL, 0x1e1e223cL, 0x87879215L, 0xe9e920c9L, - 0xcece4987L, 0x5555ffaaL, 0x28287850L, 0xdfdf7aa5L, - 0x8c8c8f03L, 0xa1a1f859L, 0x89898009L, 0x0d0d171aL, - 0xbfbfda65L, 0xe6e631d7L, 0x4242c684L, 0x6868b8d0L, - 0x4141c382L, 0x9999b029L, 0x2d2d775aL, 0x0f0f111eL, - 0xb0b0cb7bL, 0x5454fca8L, 0xbbbbd66dL, 0x16163a2cL, - ] + 0x6363a5c6L, 0x7c7c84f8L, 0x777799eeL, 0x7b7b8df6L, + 0xf2f20dffL, 0x6b6bbdd6L, 0x6f6fb1deL, 0xc5c55491L, + 0x30305060L, 0x01010302L, 0x6767a9ceL, 0x2b2b7d56L, + 0xfefe19e7L, 0xd7d762b5L, 0xababe64dL, 0x76769aecL, + 0xcaca458fL, 0x82829d1fL, 0xc9c94089L, 0x7d7d87faL, + 0xfafa15efL, 0x5959ebb2L, 0x4747c98eL, 0xf0f00bfbL, + 0xadadec41L, 0xd4d467b3L, 0xa2a2fd5fL, 0xafafea45L, + 0x9c9cbf23L, 0xa4a4f753L, 0x727296e4L, 0xc0c05b9bL, + 0xb7b7c275L, 0xfdfd1ce1L, 0x9393ae3dL, 0x26266a4cL, + 0x36365a6cL, 0x3f3f417eL, 0xf7f702f5L, 0xcccc4f83L, + 0x34345c68L, 0xa5a5f451L, 0xe5e534d1L, 0xf1f108f9L, + 0x717193e2L, 0xd8d873abL, 0x31315362L, 0x15153f2aL, + 0x04040c08L, 0xc7c75295L, 0x23236546L, 0xc3c35e9dL, + 0x18182830L, 0x9696a137L, 0x05050f0aL, 0x9a9ab52fL, + 0x0707090eL, 0x12123624L, 0x80809b1bL, 0xe2e23ddfL, + 0xebeb26cdL, 0x2727694eL, 0xb2b2cd7fL, 0x75759feaL, + 0x09091b12L, 0x83839e1dL, 0x2c2c7458L, 0x1a1a2e34L, + 0x1b1b2d36L, 0x6e6eb2dcL, 0x5a5aeeb4L, 0xa0a0fb5bL, + 0x5252f6a4L, 0x3b3b4d76L, 0xd6d661b7L, 0xb3b3ce7dL, + 0x29297b52L, 0xe3e33eddL, 0x2f2f715eL, 0x84849713L, + 0x5353f5a6L, 0xd1d168b9L, 0x00000000L, 0xeded2cc1L, + 0x20206040L, 0xfcfc1fe3L, 0xb1b1c879L, 0x5b5bedb6L, + 0x6a6abed4L, 0xcbcb468dL, 0xbebed967L, 0x39394b72L, + 0x4a4ade94L, 0x4c4cd498L, 0x5858e8b0L, 0xcfcf4a85L, + 0xd0d06bbbL, 0xefef2ac5L, 0xaaaae54fL, 0xfbfb16edL, + 0x4343c586L, 0x4d4dd79aL, 0x33335566L, 0x85859411L, + 0x4545cf8aL, 0xf9f910e9L, 0x02020604L, 0x7f7f81feL, + 0x5050f0a0L, 0x3c3c4478L, 0x9f9fba25L, 0xa8a8e34bL, + 0x5151f3a2L, 0xa3a3fe5dL, 0x4040c080L, 0x8f8f8a05L, + 0x9292ad3fL, 0x9d9dbc21L, 0x38384870L, 0xf5f504f1L, + 0xbcbcdf63L, 0xb6b6c177L, 0xdada75afL, 0x21216342L, + 0x10103020L, 0xffff1ae5L, 0xf3f30efdL, 0xd2d26dbfL, + 0xcdcd4c81L, 0x0c0c1418L, 0x13133526L, 0xecec2fc3L, + 0x5f5fe1beL, 0x9797a235L, 0x4444cc88L, 0x1717392eL, + 0xc4c45793L, 0xa7a7f255L, 0x7e7e82fcL, 0x3d3d477aL, + 0x6464acc8L, 0x5d5de7baL, 0x19192b32L, 0x737395e6L, + 0x6060a0c0L, 0x81819819L, 0x4f4fd19eL, 0xdcdc7fa3L, + 0x22226644L, 0x2a2a7e54L, 0x9090ab3bL, 0x8888830bL, + 0x4646ca8cL, 0xeeee29c7L, 0xb8b8d36bL, 0x14143c28L, + 0xdede79a7L, 0x5e5ee2bcL, 0x0b0b1d16L, 0xdbdb76adL, + 0xe0e03bdbL, 0x32325664L, 0x3a3a4e74L, 0x0a0a1e14L, + 0x4949db92L, 0x06060a0cL, 0x24246c48L, 0x5c5ce4b8L, + 0xc2c25d9fL, 0xd3d36ebdL, 0xacacef43L, 0x6262a6c4L, + 0x9191a839L, 0x9595a431L, 0xe4e437d3L, 0x79798bf2L, + 0xe7e732d5L, 0xc8c8438bL, 0x3737596eL, 0x6d6db7daL, + 0x8d8d8c01L, 0xd5d564b1L, 0x4e4ed29cL, 0xa9a9e049L, + 0x6c6cb4d8L, 0x5656faacL, 0xf4f407f3L, 0xeaea25cfL, + 0x6565afcaL, 0x7a7a8ef4L, 0xaeaee947L, 0x08081810L, + 0xbabad56fL, 0x787888f0L, 0x25256f4aL, 0x2e2e725cL, + 0x1c1c2438L, 0xa6a6f157L, 0xb4b4c773L, 0xc6c65197L, + 0xe8e823cbL, 0xdddd7ca1L, 0x74749ce8L, 0x1f1f213eL, + 0x4b4bdd96L, 0xbdbddc61L, 0x8b8b860dL, 0x8a8a850fL, + 0x707090e0L, 0x3e3e427cL, 0xb5b5c471L, 0x6666aaccL, + 0x4848d890L, 0x03030506L, 0xf6f601f7L, 0x0e0e121cL, + 0x6161a3c2L, 0x35355f6aL, 0x5757f9aeL, 0xb9b9d069L, + 0x86869117L, 0xc1c15899L, 0x1d1d273aL, 0x9e9eb927L, + 0xe1e138d9L, 0xf8f813ebL, 0x9898b32bL, 0x11113322L, + 0x6969bbd2L, 0xd9d970a9L, 0x8e8e8907L, 0x9494a733L, + 0x9b9bb62dL, 0x1e1e223cL, 0x87879215L, 0xe9e920c9L, + 0xcece4987L, 0x5555ffaaL, 0x28287850L, 0xdfdf7aa5L, + 0x8c8c8f03L, 0xa1a1f859L, 0x89898009L, 0x0d0d171aL, + 0xbfbfda65L, 0xe6e631d7L, 0x4242c684L, 0x6868b8d0L, + 0x4141c382L, 0x9999b029L, 0x2d2d775aL, 0x0f0f111eL, + 0xb0b0cb7bL, 0x5454fca8L, 0xbbbbd66dL, 0x16163a2cL, +] Te4 = [ - 0x63636363L, 0x7c7c7c7cL, 0x77777777L, 0x7b7b7b7bL, - 0xf2f2f2f2L, 0x6b6b6b6bL, 0x6f6f6f6fL, 0xc5c5c5c5L, - 0x30303030L, 0x01010101L, 0x67676767L, 0x2b2b2b2bL, - 0xfefefefeL, 0xd7d7d7d7L, 0xababababL, 0x76767676L, - 0xcacacacaL, 0x82828282L, 0xc9c9c9c9L, 0x7d7d7d7dL, - 0xfafafafaL, 0x59595959L, 0x47474747L, 0xf0f0f0f0L, - 0xadadadadL, 0xd4d4d4d4L, 0xa2a2a2a2L, 0xafafafafL, - 0x9c9c9c9cL, 0xa4a4a4a4L, 0x72727272L, 0xc0c0c0c0L, - 0xb7b7b7b7L, 0xfdfdfdfdL, 0x93939393L, 0x26262626L, - 0x36363636L, 0x3f3f3f3fL, 0xf7f7f7f7L, 0xccccccccL, - 0x34343434L, 0xa5a5a5a5L, 0xe5e5e5e5L, 0xf1f1f1f1L, - 0x71717171L, 0xd8d8d8d8L, 0x31313131L, 0x15151515L, - 0x04040404L, 0xc7c7c7c7L, 0x23232323L, 0xc3c3c3c3L, - 0x18181818L, 0x96969696L, 0x05050505L, 0x9a9a9a9aL, - 0x07070707L, 0x12121212L, 0x80808080L, 0xe2e2e2e2L, - 0xebebebebL, 0x27272727L, 0xb2b2b2b2L, 0x75757575L, - 0x09090909L, 0x83838383L, 0x2c2c2c2cL, 0x1a1a1a1aL, - 0x1b1b1b1bL, 0x6e6e6e6eL, 0x5a5a5a5aL, 0xa0a0a0a0L, - 0x52525252L, 0x3b3b3b3bL, 0xd6d6d6d6L, 0xb3b3b3b3L, - 0x29292929L, 0xe3e3e3e3L, 0x2f2f2f2fL, 0x84848484L, - 0x53535353L, 0xd1d1d1d1L, 0x00000000L, 0xededededL, - 0x20202020L, 0xfcfcfcfcL, 0xb1b1b1b1L, 0x5b5b5b5bL, - 0x6a6a6a6aL, 0xcbcbcbcbL, 0xbebebebeL, 0x39393939L, - 0x4a4a4a4aL, 0x4c4c4c4cL, 0x58585858L, 0xcfcfcfcfL, - 0xd0d0d0d0L, 0xefefefefL, 0xaaaaaaaaL, 0xfbfbfbfbL, - 0x43434343L, 0x4d4d4d4dL, 0x33333333L, 0x85858585L, - 0x45454545L, 0xf9f9f9f9L, 0x02020202L, 0x7f7f7f7fL, - 0x50505050L, 0x3c3c3c3cL, 0x9f9f9f9fL, 0xa8a8a8a8L, - 0x51515151L, 0xa3a3a3a3L, 0x40404040L, 0x8f8f8f8fL, - 0x92929292L, 0x9d9d9d9dL, 0x38383838L, 0xf5f5f5f5L, - 0xbcbcbcbcL, 0xb6b6b6b6L, 0xdadadadaL, 0x21212121L, - 0x10101010L, 0xffffffffL, 0xf3f3f3f3L, 0xd2d2d2d2L, - 0xcdcdcdcdL, 0x0c0c0c0cL, 0x13131313L, 0xececececL, - 0x5f5f5f5fL, 0x97979797L, 0x44444444L, 0x17171717L, - 0xc4c4c4c4L, 0xa7a7a7a7L, 0x7e7e7e7eL, 0x3d3d3d3dL, - 0x64646464L, 0x5d5d5d5dL, 0x19191919L, 0x73737373L, - 0x60606060L, 0x81818181L, 0x4f4f4f4fL, 0xdcdcdcdcL, - 0x22222222L, 0x2a2a2a2aL, 0x90909090L, 0x88888888L, - 0x46464646L, 0xeeeeeeeeL, 0xb8b8b8b8L, 0x14141414L, - 0xdedededeL, 0x5e5e5e5eL, 0x0b0b0b0bL, 0xdbdbdbdbL, - 0xe0e0e0e0L, 0x32323232L, 0x3a3a3a3aL, 0x0a0a0a0aL, - 0x49494949L, 0x06060606L, 0x24242424L, 0x5c5c5c5cL, - 0xc2c2c2c2L, 0xd3d3d3d3L, 0xacacacacL, 0x62626262L, - 0x91919191L, 0x95959595L, 0xe4e4e4e4L, 0x79797979L, - 0xe7e7e7e7L, 0xc8c8c8c8L, 0x37373737L, 0x6d6d6d6dL, - 0x8d8d8d8dL, 0xd5d5d5d5L, 0x4e4e4e4eL, 0xa9a9a9a9L, - 0x6c6c6c6cL, 0x56565656L, 0xf4f4f4f4L, 0xeaeaeaeaL, - 0x65656565L, 0x7a7a7a7aL, 0xaeaeaeaeL, 0x08080808L, - 0xbabababaL, 0x78787878L, 0x25252525L, 0x2e2e2e2eL, - 0x1c1c1c1cL, 0xa6a6a6a6L, 0xb4b4b4b4L, 0xc6c6c6c6L, - 0xe8e8e8e8L, 0xddddddddL, 0x74747474L, 0x1f1f1f1fL, - 0x4b4b4b4bL, 0xbdbdbdbdL, 0x8b8b8b8bL, 0x8a8a8a8aL, - 0x70707070L, 0x3e3e3e3eL, 0xb5b5b5b5L, 0x66666666L, - 0x48484848L, 0x03030303L, 0xf6f6f6f6L, 0x0e0e0e0eL, - 0x61616161L, 0x35353535L, 0x57575757L, 0xb9b9b9b9L, - 0x86868686L, 0xc1c1c1c1L, 0x1d1d1d1dL, 0x9e9e9e9eL, - 0xe1e1e1e1L, 0xf8f8f8f8L, 0x98989898L, 0x11111111L, - 0x69696969L, 0xd9d9d9d9L, 0x8e8e8e8eL, 0x94949494L, - 0x9b9b9b9bL, 0x1e1e1e1eL, 0x87878787L, 0xe9e9e9e9L, - 0xcecececeL, 0x55555555L, 0x28282828L, 0xdfdfdfdfL, - 0x8c8c8c8cL, 0xa1a1a1a1L, 0x89898989L, 0x0d0d0d0dL, - 0xbfbfbfbfL, 0xe6e6e6e6L, 0x42424242L, 0x68686868L, - 0x41414141L, 0x99999999L, 0x2d2d2d2dL, 0x0f0f0f0fL, - 0xb0b0b0b0L, 0x54545454L, 0xbbbbbbbbL, 0x16161616L, - ] + 0x63636363L, 0x7c7c7c7cL, 0x77777777L, 0x7b7b7b7bL, + 0xf2f2f2f2L, 0x6b6b6b6bL, 0x6f6f6f6fL, 0xc5c5c5c5L, + 0x30303030L, 0x01010101L, 0x67676767L, 0x2b2b2b2bL, + 0xfefefefeL, 0xd7d7d7d7L, 0xababababL, 0x76767676L, + 0xcacacacaL, 0x82828282L, 0xc9c9c9c9L, 0x7d7d7d7dL, + 0xfafafafaL, 0x59595959L, 0x47474747L, 0xf0f0f0f0L, + 0xadadadadL, 0xd4d4d4d4L, 0xa2a2a2a2L, 0xafafafafL, + 0x9c9c9c9cL, 0xa4a4a4a4L, 0x72727272L, 0xc0c0c0c0L, + 0xb7b7b7b7L, 0xfdfdfdfdL, 0x93939393L, 0x26262626L, + 0x36363636L, 0x3f3f3f3fL, 0xf7f7f7f7L, 0xccccccccL, + 0x34343434L, 0xa5a5a5a5L, 0xe5e5e5e5L, 0xf1f1f1f1L, + 0x71717171L, 0xd8d8d8d8L, 0x31313131L, 0x15151515L, + 0x04040404L, 0xc7c7c7c7L, 0x23232323L, 0xc3c3c3c3L, + 0x18181818L, 0x96969696L, 0x05050505L, 0x9a9a9a9aL, + 0x07070707L, 0x12121212L, 0x80808080L, 0xe2e2e2e2L, + 0xebebebebL, 0x27272727L, 0xb2b2b2b2L, 0x75757575L, + 0x09090909L, 0x83838383L, 0x2c2c2c2cL, 0x1a1a1a1aL, + 0x1b1b1b1bL, 0x6e6e6e6eL, 0x5a5a5a5aL, 0xa0a0a0a0L, + 0x52525252L, 0x3b3b3b3bL, 0xd6d6d6d6L, 0xb3b3b3b3L, + 0x29292929L, 0xe3e3e3e3L, 0x2f2f2f2fL, 0x84848484L, + 0x53535353L, 0xd1d1d1d1L, 0x00000000L, 0xededededL, + 0x20202020L, 0xfcfcfcfcL, 0xb1b1b1b1L, 0x5b5b5b5bL, + 0x6a6a6a6aL, 0xcbcbcbcbL, 0xbebebebeL, 0x39393939L, + 0x4a4a4a4aL, 0x4c4c4c4cL, 0x58585858L, 0xcfcfcfcfL, + 0xd0d0d0d0L, 0xefefefefL, 0xaaaaaaaaL, 0xfbfbfbfbL, + 0x43434343L, 0x4d4d4d4dL, 0x33333333L, 0x85858585L, + 0x45454545L, 0xf9f9f9f9L, 0x02020202L, 0x7f7f7f7fL, + 0x50505050L, 0x3c3c3c3cL, 0x9f9f9f9fL, 0xa8a8a8a8L, + 0x51515151L, 0xa3a3a3a3L, 0x40404040L, 0x8f8f8f8fL, + 0x92929292L, 0x9d9d9d9dL, 0x38383838L, 0xf5f5f5f5L, + 0xbcbcbcbcL, 0xb6b6b6b6L, 0xdadadadaL, 0x21212121L, + 0x10101010L, 0xffffffffL, 0xf3f3f3f3L, 0xd2d2d2d2L, + 0xcdcdcdcdL, 0x0c0c0c0cL, 0x13131313L, 0xececececL, + 0x5f5f5f5fL, 0x97979797L, 0x44444444L, 0x17171717L, + 0xc4c4c4c4L, 0xa7a7a7a7L, 0x7e7e7e7eL, 0x3d3d3d3dL, + 0x64646464L, 0x5d5d5d5dL, 0x19191919L, 0x73737373L, + 0x60606060L, 0x81818181L, 0x4f4f4f4fL, 0xdcdcdcdcL, + 0x22222222L, 0x2a2a2a2aL, 0x90909090L, 0x88888888L, + 0x46464646L, 0xeeeeeeeeL, 0xb8b8b8b8L, 0x14141414L, + 0xdedededeL, 0x5e5e5e5eL, 0x0b0b0b0bL, 0xdbdbdbdbL, + 0xe0e0e0e0L, 0x32323232L, 0x3a3a3a3aL, 0x0a0a0a0aL, + 0x49494949L, 0x06060606L, 0x24242424L, 0x5c5c5c5cL, + 0xc2c2c2c2L, 0xd3d3d3d3L, 0xacacacacL, 0x62626262L, + 0x91919191L, 0x95959595L, 0xe4e4e4e4L, 0x79797979L, + 0xe7e7e7e7L, 0xc8c8c8c8L, 0x37373737L, 0x6d6d6d6dL, + 0x8d8d8d8dL, 0xd5d5d5d5L, 0x4e4e4e4eL, 0xa9a9a9a9L, + 0x6c6c6c6cL, 0x56565656L, 0xf4f4f4f4L, 0xeaeaeaeaL, + 0x65656565L, 0x7a7a7a7aL, 0xaeaeaeaeL, 0x08080808L, + 0xbabababaL, 0x78787878L, 0x25252525L, 0x2e2e2e2eL, + 0x1c1c1c1cL, 0xa6a6a6a6L, 0xb4b4b4b4L, 0xc6c6c6c6L, + 0xe8e8e8e8L, 0xddddddddL, 0x74747474L, 0x1f1f1f1fL, + 0x4b4b4b4bL, 0xbdbdbdbdL, 0x8b8b8b8bL, 0x8a8a8a8aL, + 0x70707070L, 0x3e3e3e3eL, 0xb5b5b5b5L, 0x66666666L, + 0x48484848L, 0x03030303L, 0xf6f6f6f6L, 0x0e0e0e0eL, + 0x61616161L, 0x35353535L, 0x57575757L, 0xb9b9b9b9L, + 0x86868686L, 0xc1c1c1c1L, 0x1d1d1d1dL, 0x9e9e9e9eL, + 0xe1e1e1e1L, 0xf8f8f8f8L, 0x98989898L, 0x11111111L, + 0x69696969L, 0xd9d9d9d9L, 0x8e8e8e8eL, 0x94949494L, + 0x9b9b9b9bL, 0x1e1e1e1eL, 0x87878787L, 0xe9e9e9e9L, + 0xcecececeL, 0x55555555L, 0x28282828L, 0xdfdfdfdfL, + 0x8c8c8c8cL, 0xa1a1a1a1L, 0x89898989L, 0x0d0d0d0dL, + 0xbfbfbfbfL, 0xe6e6e6e6L, 0x42424242L, 0x68686868L, + 0x41414141L, 0x99999999L, 0x2d2d2d2dL, 0x0f0f0f0fL, + 0xb0b0b0b0L, 0x54545454L, 0xbbbbbbbbL, 0x16161616L, +] Td0 = [ - 0x51f4a750L, 0x7e416553L, 0x1a17a4c3L, 0x3a275e96L, - 0x3bab6bcbL, 0x1f9d45f1L, 0xacfa58abL, 0x4be30393L, - 0x2030fa55L, 0xad766df6L, 0x88cc7691L, 0xf5024c25L, - 0x4fe5d7fcL, 0xc52acbd7L, 0x26354480L, 0xb562a38fL, - 0xdeb15a49L, 0x25ba1b67L, 0x45ea0e98L, 0x5dfec0e1L, - 0xc32f7502L, 0x814cf012L, 0x8d4697a3L, 0x6bd3f9c6L, - 0x038f5fe7L, 0x15929c95L, 0xbf6d7aebL, 0x955259daL, - 0xd4be832dL, 0x587421d3L, 0x49e06929L, 0x8ec9c844L, - 0x75c2896aL, 0xf48e7978L, 0x99583e6bL, 0x27b971ddL, - 0xbee14fb6L, 0xf088ad17L, 0xc920ac66L, 0x7dce3ab4L, - 0x63df4a18L, 0xe51a3182L, 0x97513360L, 0x62537f45L, - 0xb16477e0L, 0xbb6bae84L, 0xfe81a01cL, 0xf9082b94L, - 0x70486858L, 0x8f45fd19L, 0x94de6c87L, 0x527bf8b7L, - 0xab73d323L, 0x724b02e2L, 0xe31f8f57L, 0x6655ab2aL, - 0xb2eb2807L, 0x2fb5c203L, 0x86c57b9aL, 0xd33708a5L, - 0x302887f2L, 0x23bfa5b2L, 0x02036abaL, 0xed16825cL, - 0x8acf1c2bL, 0xa779b492L, 0xf307f2f0L, 0x4e69e2a1L, - 0x65daf4cdL, 0x0605bed5L, 0xd134621fL, 0xc4a6fe8aL, - 0x342e539dL, 0xa2f355a0L, 0x058ae132L, 0xa4f6eb75L, - 0x0b83ec39L, 0x4060efaaL, 0x5e719f06L, 0xbd6e1051L, - 0x3e218af9L, 0x96dd063dL, 0xdd3e05aeL, 0x4de6bd46L, - 0x91548db5L, 0x71c45d05L, 0x0406d46fL, 0x605015ffL, - 0x1998fb24L, 0xd6bde997L, 0x894043ccL, 0x67d99e77L, - 0xb0e842bdL, 0x07898b88L, 0xe7195b38L, 0x79c8eedbL, - 0xa17c0a47L, 0x7c420fe9L, 0xf8841ec9L, 0x00000000L, - 0x09808683L, 0x322bed48L, 0x1e1170acL, 0x6c5a724eL, - 0xfd0efffbL, 0x0f853856L, 0x3daed51eL, 0x362d3927L, - 0x0a0fd964L, 0x685ca621L, 0x9b5b54d1L, 0x24362e3aL, - 0x0c0a67b1L, 0x9357e70fL, 0xb4ee96d2L, 0x1b9b919eL, - 0x80c0c54fL, 0x61dc20a2L, 0x5a774b69L, 0x1c121a16L, - 0xe293ba0aL, 0xc0a02ae5L, 0x3c22e043L, 0x121b171dL, - 0x0e090d0bL, 0xf28bc7adL, 0x2db6a8b9L, 0x141ea9c8L, - 0x57f11985L, 0xaf75074cL, 0xee99ddbbL, 0xa37f60fdL, - 0xf701269fL, 0x5c72f5bcL, 0x44663bc5L, 0x5bfb7e34L, - 0x8b432976L, 0xcb23c6dcL, 0xb6edfc68L, 0xb8e4f163L, - 0xd731dccaL, 0x42638510L, 0x13972240L, 0x84c61120L, - 0x854a247dL, 0xd2bb3df8L, 0xaef93211L, 0xc729a16dL, - 0x1d9e2f4bL, 0xdcb230f3L, 0x0d8652ecL, 0x77c1e3d0L, - 0x2bb3166cL, 0xa970b999L, 0x119448faL, 0x47e96422L, - 0xa8fc8cc4L, 0xa0f03f1aL, 0x567d2cd8L, 0x223390efL, - 0x87494ec7L, 0xd938d1c1L, 0x8ccaa2feL, 0x98d40b36L, - 0xa6f581cfL, 0xa57ade28L, 0xdab78e26L, 0x3fadbfa4L, - 0x2c3a9de4L, 0x5078920dL, 0x6a5fcc9bL, 0x547e4662L, - 0xf68d13c2L, 0x90d8b8e8L, 0x2e39f75eL, 0x82c3aff5L, - 0x9f5d80beL, 0x69d0937cL, 0x6fd52da9L, 0xcf2512b3L, - 0xc8ac993bL, 0x10187da7L, 0xe89c636eL, 0xdb3bbb7bL, - 0xcd267809L, 0x6e5918f4L, 0xec9ab701L, 0x834f9aa8L, - 0xe6956e65L, 0xaaffe67eL, 0x21bccf08L, 0xef15e8e6L, - 0xbae79bd9L, 0x4a6f36ceL, 0xea9f09d4L, 0x29b07cd6L, - 0x31a4b2afL, 0x2a3f2331L, 0xc6a59430L, 0x35a266c0L, - 0x744ebc37L, 0xfc82caa6L, 0xe090d0b0L, 0x33a7d815L, - 0xf104984aL, 0x41ecdaf7L, 0x7fcd500eL, 0x1791f62fL, - 0x764dd68dL, 0x43efb04dL, 0xccaa4d54L, 0xe49604dfL, - 0x9ed1b5e3L, 0x4c6a881bL, 0xc12c1fb8L, 0x4665517fL, - 0x9d5eea04L, 0x018c355dL, 0xfa877473L, 0xfb0b412eL, - 0xb3671d5aL, 0x92dbd252L, 0xe9105633L, 0x6dd64713L, - 0x9ad7618cL, 0x37a10c7aL, 0x59f8148eL, 0xeb133c89L, - 0xcea927eeL, 0xb761c935L, 0xe11ce5edL, 0x7a47b13cL, - 0x9cd2df59L, 0x55f2733fL, 0x1814ce79L, 0x73c737bfL, - 0x53f7cdeaL, 0x5ffdaa5bL, 0xdf3d6f14L, 0x7844db86L, - 0xcaaff381L, 0xb968c43eL, 0x3824342cL, 0xc2a3405fL, - 0x161dc372L, 0xbce2250cL, 0x283c498bL, 0xff0d9541L, - 0x39a80171L, 0x080cb3deL, 0xd8b4e49cL, 0x6456c190L, - 0x7bcb8461L, 0xd532b670L, 0x486c5c74L, 0xd0b85742L, - ] + 0x51f4a750L, 0x7e416553L, 0x1a17a4c3L, 0x3a275e96L, + 0x3bab6bcbL, 0x1f9d45f1L, 0xacfa58abL, 0x4be30393L, + 0x2030fa55L, 0xad766df6L, 0x88cc7691L, 0xf5024c25L, + 0x4fe5d7fcL, 0xc52acbd7L, 0x26354480L, 0xb562a38fL, + 0xdeb15a49L, 0x25ba1b67L, 0x45ea0e98L, 0x5dfec0e1L, + 0xc32f7502L, 0x814cf012L, 0x8d4697a3L, 0x6bd3f9c6L, + 0x038f5fe7L, 0x15929c95L, 0xbf6d7aebL, 0x955259daL, + 0xd4be832dL, 0x587421d3L, 0x49e06929L, 0x8ec9c844L, + 0x75c2896aL, 0xf48e7978L, 0x99583e6bL, 0x27b971ddL, + 0xbee14fb6L, 0xf088ad17L, 0xc920ac66L, 0x7dce3ab4L, + 0x63df4a18L, 0xe51a3182L, 0x97513360L, 0x62537f45L, + 0xb16477e0L, 0xbb6bae84L, 0xfe81a01cL, 0xf9082b94L, + 0x70486858L, 0x8f45fd19L, 0x94de6c87L, 0x527bf8b7L, + 0xab73d323L, 0x724b02e2L, 0xe31f8f57L, 0x6655ab2aL, + 0xb2eb2807L, 0x2fb5c203L, 0x86c57b9aL, 0xd33708a5L, + 0x302887f2L, 0x23bfa5b2L, 0x02036abaL, 0xed16825cL, + 0x8acf1c2bL, 0xa779b492L, 0xf307f2f0L, 0x4e69e2a1L, + 0x65daf4cdL, 0x0605bed5L, 0xd134621fL, 0xc4a6fe8aL, + 0x342e539dL, 0xa2f355a0L, 0x058ae132L, 0xa4f6eb75L, + 0x0b83ec39L, 0x4060efaaL, 0x5e719f06L, 0xbd6e1051L, + 0x3e218af9L, 0x96dd063dL, 0xdd3e05aeL, 0x4de6bd46L, + 0x91548db5L, 0x71c45d05L, 0x0406d46fL, 0x605015ffL, + 0x1998fb24L, 0xd6bde997L, 0x894043ccL, 0x67d99e77L, + 0xb0e842bdL, 0x07898b88L, 0xe7195b38L, 0x79c8eedbL, + 0xa17c0a47L, 0x7c420fe9L, 0xf8841ec9L, 0x00000000L, + 0x09808683L, 0x322bed48L, 0x1e1170acL, 0x6c5a724eL, + 0xfd0efffbL, 0x0f853856L, 0x3daed51eL, 0x362d3927L, + 0x0a0fd964L, 0x685ca621L, 0x9b5b54d1L, 0x24362e3aL, + 0x0c0a67b1L, 0x9357e70fL, 0xb4ee96d2L, 0x1b9b919eL, + 0x80c0c54fL, 0x61dc20a2L, 0x5a774b69L, 0x1c121a16L, + 0xe293ba0aL, 0xc0a02ae5L, 0x3c22e043L, 0x121b171dL, + 0x0e090d0bL, 0xf28bc7adL, 0x2db6a8b9L, 0x141ea9c8L, + 0x57f11985L, 0xaf75074cL, 0xee99ddbbL, 0xa37f60fdL, + 0xf701269fL, 0x5c72f5bcL, 0x44663bc5L, 0x5bfb7e34L, + 0x8b432976L, 0xcb23c6dcL, 0xb6edfc68L, 0xb8e4f163L, + 0xd731dccaL, 0x42638510L, 0x13972240L, 0x84c61120L, + 0x854a247dL, 0xd2bb3df8L, 0xaef93211L, 0xc729a16dL, + 0x1d9e2f4bL, 0xdcb230f3L, 0x0d8652ecL, 0x77c1e3d0L, + 0x2bb3166cL, 0xa970b999L, 0x119448faL, 0x47e96422L, + 0xa8fc8cc4L, 0xa0f03f1aL, 0x567d2cd8L, 0x223390efL, + 0x87494ec7L, 0xd938d1c1L, 0x8ccaa2feL, 0x98d40b36L, + 0xa6f581cfL, 0xa57ade28L, 0xdab78e26L, 0x3fadbfa4L, + 0x2c3a9de4L, 0x5078920dL, 0x6a5fcc9bL, 0x547e4662L, + 0xf68d13c2L, 0x90d8b8e8L, 0x2e39f75eL, 0x82c3aff5L, + 0x9f5d80beL, 0x69d0937cL, 0x6fd52da9L, 0xcf2512b3L, + 0xc8ac993bL, 0x10187da7L, 0xe89c636eL, 0xdb3bbb7bL, + 0xcd267809L, 0x6e5918f4L, 0xec9ab701L, 0x834f9aa8L, + 0xe6956e65L, 0xaaffe67eL, 0x21bccf08L, 0xef15e8e6L, + 0xbae79bd9L, 0x4a6f36ceL, 0xea9f09d4L, 0x29b07cd6L, + 0x31a4b2afL, 0x2a3f2331L, 0xc6a59430L, 0x35a266c0L, + 0x744ebc37L, 0xfc82caa6L, 0xe090d0b0L, 0x33a7d815L, + 0xf104984aL, 0x41ecdaf7L, 0x7fcd500eL, 0x1791f62fL, + 0x764dd68dL, 0x43efb04dL, 0xccaa4d54L, 0xe49604dfL, + 0x9ed1b5e3L, 0x4c6a881bL, 0xc12c1fb8L, 0x4665517fL, + 0x9d5eea04L, 0x018c355dL, 0xfa877473L, 0xfb0b412eL, + 0xb3671d5aL, 0x92dbd252L, 0xe9105633L, 0x6dd64713L, + 0x9ad7618cL, 0x37a10c7aL, 0x59f8148eL, 0xeb133c89L, + 0xcea927eeL, 0xb761c935L, 0xe11ce5edL, 0x7a47b13cL, + 0x9cd2df59L, 0x55f2733fL, 0x1814ce79L, 0x73c737bfL, + 0x53f7cdeaL, 0x5ffdaa5bL, 0xdf3d6f14L, 0x7844db86L, + 0xcaaff381L, 0xb968c43eL, 0x3824342cL, 0xc2a3405fL, + 0x161dc372L, 0xbce2250cL, 0x283c498bL, 0xff0d9541L, + 0x39a80171L, 0x080cb3deL, 0xd8b4e49cL, 0x6456c190L, + 0x7bcb8461L, 0xd532b670L, 0x486c5c74L, 0xd0b85742L, +] Td1 = [ - 0x5051f4a7L, 0x537e4165L, 0xc31a17a4L, 0x963a275eL, - 0xcb3bab6bL, 0xf11f9d45L, 0xabacfa58L, 0x934be303L, - 0x552030faL, 0xf6ad766dL, 0x9188cc76L, 0x25f5024cL, - 0xfc4fe5d7L, 0xd7c52acbL, 0x80263544L, 0x8fb562a3L, - 0x49deb15aL, 0x6725ba1bL, 0x9845ea0eL, 0xe15dfec0L, - 0x02c32f75L, 0x12814cf0L, 0xa38d4697L, 0xc66bd3f9L, - 0xe7038f5fL, 0x9515929cL, 0xebbf6d7aL, 0xda955259L, - 0x2dd4be83L, 0xd3587421L, 0x2949e069L, 0x448ec9c8L, - 0x6a75c289L, 0x78f48e79L, 0x6b99583eL, 0xdd27b971L, - 0xb6bee14fL, 0x17f088adL, 0x66c920acL, 0xb47dce3aL, - 0x1863df4aL, 0x82e51a31L, 0x60975133L, 0x4562537fL, - 0xe0b16477L, 0x84bb6baeL, 0x1cfe81a0L, 0x94f9082bL, - 0x58704868L, 0x198f45fdL, 0x8794de6cL, 0xb7527bf8L, - 0x23ab73d3L, 0xe2724b02L, 0x57e31f8fL, 0x2a6655abL, - 0x07b2eb28L, 0x032fb5c2L, 0x9a86c57bL, 0xa5d33708L, - 0xf2302887L, 0xb223bfa5L, 0xba02036aL, 0x5ced1682L, - 0x2b8acf1cL, 0x92a779b4L, 0xf0f307f2L, 0xa14e69e2L, - 0xcd65daf4L, 0xd50605beL, 0x1fd13462L, 0x8ac4a6feL, - 0x9d342e53L, 0xa0a2f355L, 0x32058ae1L, 0x75a4f6ebL, - 0x390b83ecL, 0xaa4060efL, 0x065e719fL, 0x51bd6e10L, - 0xf93e218aL, 0x3d96dd06L, 0xaedd3e05L, 0x464de6bdL, - 0xb591548dL, 0x0571c45dL, 0x6f0406d4L, 0xff605015L, - 0x241998fbL, 0x97d6bde9L, 0xcc894043L, 0x7767d99eL, - 0xbdb0e842L, 0x8807898bL, 0x38e7195bL, 0xdb79c8eeL, - 0x47a17c0aL, 0xe97c420fL, 0xc9f8841eL, 0x00000000L, - 0x83098086L, 0x48322bedL, 0xac1e1170L, 0x4e6c5a72L, - 0xfbfd0effL, 0x560f8538L, 0x1e3daed5L, 0x27362d39L, - 0x640a0fd9L, 0x21685ca6L, 0xd19b5b54L, 0x3a24362eL, - 0xb10c0a67L, 0x0f9357e7L, 0xd2b4ee96L, 0x9e1b9b91L, - 0x4f80c0c5L, 0xa261dc20L, 0x695a774bL, 0x161c121aL, - 0x0ae293baL, 0xe5c0a02aL, 0x433c22e0L, 0x1d121b17L, - 0x0b0e090dL, 0xadf28bc7L, 0xb92db6a8L, 0xc8141ea9L, - 0x8557f119L, 0x4caf7507L, 0xbbee99ddL, 0xfda37f60L, - 0x9ff70126L, 0xbc5c72f5L, 0xc544663bL, 0x345bfb7eL, - 0x768b4329L, 0xdccb23c6L, 0x68b6edfcL, 0x63b8e4f1L, - 0xcad731dcL, 0x10426385L, 0x40139722L, 0x2084c611L, - 0x7d854a24L, 0xf8d2bb3dL, 0x11aef932L, 0x6dc729a1L, - 0x4b1d9e2fL, 0xf3dcb230L, 0xec0d8652L, 0xd077c1e3L, - 0x6c2bb316L, 0x99a970b9L, 0xfa119448L, 0x2247e964L, - 0xc4a8fc8cL, 0x1aa0f03fL, 0xd8567d2cL, 0xef223390L, - 0xc787494eL, 0xc1d938d1L, 0xfe8ccaa2L, 0x3698d40bL, - 0xcfa6f581L, 0x28a57adeL, 0x26dab78eL, 0xa43fadbfL, - 0xe42c3a9dL, 0x0d507892L, 0x9b6a5fccL, 0x62547e46L, - 0xc2f68d13L, 0xe890d8b8L, 0x5e2e39f7L, 0xf582c3afL, - 0xbe9f5d80L, 0x7c69d093L, 0xa96fd52dL, 0xb3cf2512L, - 0x3bc8ac99L, 0xa710187dL, 0x6ee89c63L, 0x7bdb3bbbL, - 0x09cd2678L, 0xf46e5918L, 0x01ec9ab7L, 0xa8834f9aL, - 0x65e6956eL, 0x7eaaffe6L, 0x0821bccfL, 0xe6ef15e8L, - 0xd9bae79bL, 0xce4a6f36L, 0xd4ea9f09L, 0xd629b07cL, - 0xaf31a4b2L, 0x312a3f23L, 0x30c6a594L, 0xc035a266L, - 0x37744ebcL, 0xa6fc82caL, 0xb0e090d0L, 0x1533a7d8L, - 0x4af10498L, 0xf741ecdaL, 0x0e7fcd50L, 0x2f1791f6L, - 0x8d764dd6L, 0x4d43efb0L, 0x54ccaa4dL, 0xdfe49604L, - 0xe39ed1b5L, 0x1b4c6a88L, 0xb8c12c1fL, 0x7f466551L, - 0x049d5eeaL, 0x5d018c35L, 0x73fa8774L, 0x2efb0b41L, - 0x5ab3671dL, 0x5292dbd2L, 0x33e91056L, 0x136dd647L, - 0x8c9ad761L, 0x7a37a10cL, 0x8e59f814L, 0x89eb133cL, - 0xeecea927L, 0x35b761c9L, 0xede11ce5L, 0x3c7a47b1L, - 0x599cd2dfL, 0x3f55f273L, 0x791814ceL, 0xbf73c737L, - 0xea53f7cdL, 0x5b5ffdaaL, 0x14df3d6fL, 0x867844dbL, - 0x81caaff3L, 0x3eb968c4L, 0x2c382434L, 0x5fc2a340L, - 0x72161dc3L, 0x0cbce225L, 0x8b283c49L, 0x41ff0d95L, - 0x7139a801L, 0xde080cb3L, 0x9cd8b4e4L, 0x906456c1L, - 0x617bcb84L, 0x70d532b6L, 0x74486c5cL, 0x42d0b857L, - ] + 0x5051f4a7L, 0x537e4165L, 0xc31a17a4L, 0x963a275eL, + 0xcb3bab6bL, 0xf11f9d45L, 0xabacfa58L, 0x934be303L, + 0x552030faL, 0xf6ad766dL, 0x9188cc76L, 0x25f5024cL, + 0xfc4fe5d7L, 0xd7c52acbL, 0x80263544L, 0x8fb562a3L, + 0x49deb15aL, 0x6725ba1bL, 0x9845ea0eL, 0xe15dfec0L, + 0x02c32f75L, 0x12814cf0L, 0xa38d4697L, 0xc66bd3f9L, + 0xe7038f5fL, 0x9515929cL, 0xebbf6d7aL, 0xda955259L, + 0x2dd4be83L, 0xd3587421L, 0x2949e069L, 0x448ec9c8L, + 0x6a75c289L, 0x78f48e79L, 0x6b99583eL, 0xdd27b971L, + 0xb6bee14fL, 0x17f088adL, 0x66c920acL, 0xb47dce3aL, + 0x1863df4aL, 0x82e51a31L, 0x60975133L, 0x4562537fL, + 0xe0b16477L, 0x84bb6baeL, 0x1cfe81a0L, 0x94f9082bL, + 0x58704868L, 0x198f45fdL, 0x8794de6cL, 0xb7527bf8L, + 0x23ab73d3L, 0xe2724b02L, 0x57e31f8fL, 0x2a6655abL, + 0x07b2eb28L, 0x032fb5c2L, 0x9a86c57bL, 0xa5d33708L, + 0xf2302887L, 0xb223bfa5L, 0xba02036aL, 0x5ced1682L, + 0x2b8acf1cL, 0x92a779b4L, 0xf0f307f2L, 0xa14e69e2L, + 0xcd65daf4L, 0xd50605beL, 0x1fd13462L, 0x8ac4a6feL, + 0x9d342e53L, 0xa0a2f355L, 0x32058ae1L, 0x75a4f6ebL, + 0x390b83ecL, 0xaa4060efL, 0x065e719fL, 0x51bd6e10L, + 0xf93e218aL, 0x3d96dd06L, 0xaedd3e05L, 0x464de6bdL, + 0xb591548dL, 0x0571c45dL, 0x6f0406d4L, 0xff605015L, + 0x241998fbL, 0x97d6bde9L, 0xcc894043L, 0x7767d99eL, + 0xbdb0e842L, 0x8807898bL, 0x38e7195bL, 0xdb79c8eeL, + 0x47a17c0aL, 0xe97c420fL, 0xc9f8841eL, 0x00000000L, + 0x83098086L, 0x48322bedL, 0xac1e1170L, 0x4e6c5a72L, + 0xfbfd0effL, 0x560f8538L, 0x1e3daed5L, 0x27362d39L, + 0x640a0fd9L, 0x21685ca6L, 0xd19b5b54L, 0x3a24362eL, + 0xb10c0a67L, 0x0f9357e7L, 0xd2b4ee96L, 0x9e1b9b91L, + 0x4f80c0c5L, 0xa261dc20L, 0x695a774bL, 0x161c121aL, + 0x0ae293baL, 0xe5c0a02aL, 0x433c22e0L, 0x1d121b17L, + 0x0b0e090dL, 0xadf28bc7L, 0xb92db6a8L, 0xc8141ea9L, + 0x8557f119L, 0x4caf7507L, 0xbbee99ddL, 0xfda37f60L, + 0x9ff70126L, 0xbc5c72f5L, 0xc544663bL, 0x345bfb7eL, + 0x768b4329L, 0xdccb23c6L, 0x68b6edfcL, 0x63b8e4f1L, + 0xcad731dcL, 0x10426385L, 0x40139722L, 0x2084c611L, + 0x7d854a24L, 0xf8d2bb3dL, 0x11aef932L, 0x6dc729a1L, + 0x4b1d9e2fL, 0xf3dcb230L, 0xec0d8652L, 0xd077c1e3L, + 0x6c2bb316L, 0x99a970b9L, 0xfa119448L, 0x2247e964L, + 0xc4a8fc8cL, 0x1aa0f03fL, 0xd8567d2cL, 0xef223390L, + 0xc787494eL, 0xc1d938d1L, 0xfe8ccaa2L, 0x3698d40bL, + 0xcfa6f581L, 0x28a57adeL, 0x26dab78eL, 0xa43fadbfL, + 0xe42c3a9dL, 0x0d507892L, 0x9b6a5fccL, 0x62547e46L, + 0xc2f68d13L, 0xe890d8b8L, 0x5e2e39f7L, 0xf582c3afL, + 0xbe9f5d80L, 0x7c69d093L, 0xa96fd52dL, 0xb3cf2512L, + 0x3bc8ac99L, 0xa710187dL, 0x6ee89c63L, 0x7bdb3bbbL, + 0x09cd2678L, 0xf46e5918L, 0x01ec9ab7L, 0xa8834f9aL, + 0x65e6956eL, 0x7eaaffe6L, 0x0821bccfL, 0xe6ef15e8L, + 0xd9bae79bL, 0xce4a6f36L, 0xd4ea9f09L, 0xd629b07cL, + 0xaf31a4b2L, 0x312a3f23L, 0x30c6a594L, 0xc035a266L, + 0x37744ebcL, 0xa6fc82caL, 0xb0e090d0L, 0x1533a7d8L, + 0x4af10498L, 0xf741ecdaL, 0x0e7fcd50L, 0x2f1791f6L, + 0x8d764dd6L, 0x4d43efb0L, 0x54ccaa4dL, 0xdfe49604L, + 0xe39ed1b5L, 0x1b4c6a88L, 0xb8c12c1fL, 0x7f466551L, + 0x049d5eeaL, 0x5d018c35L, 0x73fa8774L, 0x2efb0b41L, + 0x5ab3671dL, 0x5292dbd2L, 0x33e91056L, 0x136dd647L, + 0x8c9ad761L, 0x7a37a10cL, 0x8e59f814L, 0x89eb133cL, + 0xeecea927L, 0x35b761c9L, 0xede11ce5L, 0x3c7a47b1L, + 0x599cd2dfL, 0x3f55f273L, 0x791814ceL, 0xbf73c737L, + 0xea53f7cdL, 0x5b5ffdaaL, 0x14df3d6fL, 0x867844dbL, + 0x81caaff3L, 0x3eb968c4L, 0x2c382434L, 0x5fc2a340L, + 0x72161dc3L, 0x0cbce225L, 0x8b283c49L, 0x41ff0d95L, + 0x7139a801L, 0xde080cb3L, 0x9cd8b4e4L, 0x906456c1L, + 0x617bcb84L, 0x70d532b6L, 0x74486c5cL, 0x42d0b857L, +] Td2 = [ - 0xa75051f4L, 0x65537e41L, 0xa4c31a17L, 0x5e963a27L, - 0x6bcb3babL, 0x45f11f9dL, 0x58abacfaL, 0x03934be3L, - 0xfa552030L, 0x6df6ad76L, 0x769188ccL, 0x4c25f502L, - 0xd7fc4fe5L, 0xcbd7c52aL, 0x44802635L, 0xa38fb562L, - 0x5a49deb1L, 0x1b6725baL, 0x0e9845eaL, 0xc0e15dfeL, - 0x7502c32fL, 0xf012814cL, 0x97a38d46L, 0xf9c66bd3L, - 0x5fe7038fL, 0x9c951592L, 0x7aebbf6dL, 0x59da9552L, - 0x832dd4beL, 0x21d35874L, 0x692949e0L, 0xc8448ec9L, - 0x896a75c2L, 0x7978f48eL, 0x3e6b9958L, 0x71dd27b9L, - 0x4fb6bee1L, 0xad17f088L, 0xac66c920L, 0x3ab47dceL, - 0x4a1863dfL, 0x3182e51aL, 0x33609751L, 0x7f456253L, - 0x77e0b164L, 0xae84bb6bL, 0xa01cfe81L, 0x2b94f908L, - 0x68587048L, 0xfd198f45L, 0x6c8794deL, 0xf8b7527bL, - 0xd323ab73L, 0x02e2724bL, 0x8f57e31fL, 0xab2a6655L, - 0x2807b2ebL, 0xc2032fb5L, 0x7b9a86c5L, 0x08a5d337L, - 0x87f23028L, 0xa5b223bfL, 0x6aba0203L, 0x825ced16L, - 0x1c2b8acfL, 0xb492a779L, 0xf2f0f307L, 0xe2a14e69L, - 0xf4cd65daL, 0xbed50605L, 0x621fd134L, 0xfe8ac4a6L, - 0x539d342eL, 0x55a0a2f3L, 0xe132058aL, 0xeb75a4f6L, - 0xec390b83L, 0xefaa4060L, 0x9f065e71L, 0x1051bd6eL, - 0x8af93e21L, 0x063d96ddL, 0x05aedd3eL, 0xbd464de6L, - 0x8db59154L, 0x5d0571c4L, 0xd46f0406L, 0x15ff6050L, - 0xfb241998L, 0xe997d6bdL, 0x43cc8940L, 0x9e7767d9L, - 0x42bdb0e8L, 0x8b880789L, 0x5b38e719L, 0xeedb79c8L, - 0x0a47a17cL, 0x0fe97c42L, 0x1ec9f884L, 0x00000000L, - 0x86830980L, 0xed48322bL, 0x70ac1e11L, 0x724e6c5aL, - 0xfffbfd0eL, 0x38560f85L, 0xd51e3daeL, 0x3927362dL, - 0xd9640a0fL, 0xa621685cL, 0x54d19b5bL, 0x2e3a2436L, - 0x67b10c0aL, 0xe70f9357L, 0x96d2b4eeL, 0x919e1b9bL, - 0xc54f80c0L, 0x20a261dcL, 0x4b695a77L, 0x1a161c12L, - 0xba0ae293L, 0x2ae5c0a0L, 0xe0433c22L, 0x171d121bL, - 0x0d0b0e09L, 0xc7adf28bL, 0xa8b92db6L, 0xa9c8141eL, - 0x198557f1L, 0x074caf75L, 0xddbbee99L, 0x60fda37fL, - 0x269ff701L, 0xf5bc5c72L, 0x3bc54466L, 0x7e345bfbL, - 0x29768b43L, 0xc6dccb23L, 0xfc68b6edL, 0xf163b8e4L, - 0xdccad731L, 0x85104263L, 0x22401397L, 0x112084c6L, - 0x247d854aL, 0x3df8d2bbL, 0x3211aef9L, 0xa16dc729L, - 0x2f4b1d9eL, 0x30f3dcb2L, 0x52ec0d86L, 0xe3d077c1L, - 0x166c2bb3L, 0xb999a970L, 0x48fa1194L, 0x642247e9L, - 0x8cc4a8fcL, 0x3f1aa0f0L, 0x2cd8567dL, 0x90ef2233L, - 0x4ec78749L, 0xd1c1d938L, 0xa2fe8ccaL, 0x0b3698d4L, - 0x81cfa6f5L, 0xde28a57aL, 0x8e26dab7L, 0xbfa43fadL, - 0x9de42c3aL, 0x920d5078L, 0xcc9b6a5fL, 0x4662547eL, - 0x13c2f68dL, 0xb8e890d8L, 0xf75e2e39L, 0xaff582c3L, - 0x80be9f5dL, 0x937c69d0L, 0x2da96fd5L, 0x12b3cf25L, - 0x993bc8acL, 0x7da71018L, 0x636ee89cL, 0xbb7bdb3bL, - 0x7809cd26L, 0x18f46e59L, 0xb701ec9aL, 0x9aa8834fL, - 0x6e65e695L, 0xe67eaaffL, 0xcf0821bcL, 0xe8e6ef15L, - 0x9bd9bae7L, 0x36ce4a6fL, 0x09d4ea9fL, 0x7cd629b0L, - 0xb2af31a4L, 0x23312a3fL, 0x9430c6a5L, 0x66c035a2L, - 0xbc37744eL, 0xcaa6fc82L, 0xd0b0e090L, 0xd81533a7L, - 0x984af104L, 0xdaf741ecL, 0x500e7fcdL, 0xf62f1791L, - 0xd68d764dL, 0xb04d43efL, 0x4d54ccaaL, 0x04dfe496L, - 0xb5e39ed1L, 0x881b4c6aL, 0x1fb8c12cL, 0x517f4665L, - 0xea049d5eL, 0x355d018cL, 0x7473fa87L, 0x412efb0bL, - 0x1d5ab367L, 0xd25292dbL, 0x5633e910L, 0x47136dd6L, - 0x618c9ad7L, 0x0c7a37a1L, 0x148e59f8L, 0x3c89eb13L, - 0x27eecea9L, 0xc935b761L, 0xe5ede11cL, 0xb13c7a47L, - 0xdf599cd2L, 0x733f55f2L, 0xce791814L, 0x37bf73c7L, - 0xcdea53f7L, 0xaa5b5ffdL, 0x6f14df3dL, 0xdb867844L, - 0xf381caafL, 0xc43eb968L, 0x342c3824L, 0x405fc2a3L, - 0xc372161dL, 0x250cbce2L, 0x498b283cL, 0x9541ff0dL, - 0x017139a8L, 0xb3de080cL, 0xe49cd8b4L, 0xc1906456L, - 0x84617bcbL, 0xb670d532L, 0x5c74486cL, 0x5742d0b8L, - ] + 0xa75051f4L, 0x65537e41L, 0xa4c31a17L, 0x5e963a27L, + 0x6bcb3babL, 0x45f11f9dL, 0x58abacfaL, 0x03934be3L, + 0xfa552030L, 0x6df6ad76L, 0x769188ccL, 0x4c25f502L, + 0xd7fc4fe5L, 0xcbd7c52aL, 0x44802635L, 0xa38fb562L, + 0x5a49deb1L, 0x1b6725baL, 0x0e9845eaL, 0xc0e15dfeL, + 0x7502c32fL, 0xf012814cL, 0x97a38d46L, 0xf9c66bd3L, + 0x5fe7038fL, 0x9c951592L, 0x7aebbf6dL, 0x59da9552L, + 0x832dd4beL, 0x21d35874L, 0x692949e0L, 0xc8448ec9L, + 0x896a75c2L, 0x7978f48eL, 0x3e6b9958L, 0x71dd27b9L, + 0x4fb6bee1L, 0xad17f088L, 0xac66c920L, 0x3ab47dceL, + 0x4a1863dfL, 0x3182e51aL, 0x33609751L, 0x7f456253L, + 0x77e0b164L, 0xae84bb6bL, 0xa01cfe81L, 0x2b94f908L, + 0x68587048L, 0xfd198f45L, 0x6c8794deL, 0xf8b7527bL, + 0xd323ab73L, 0x02e2724bL, 0x8f57e31fL, 0xab2a6655L, + 0x2807b2ebL, 0xc2032fb5L, 0x7b9a86c5L, 0x08a5d337L, + 0x87f23028L, 0xa5b223bfL, 0x6aba0203L, 0x825ced16L, + 0x1c2b8acfL, 0xb492a779L, 0xf2f0f307L, 0xe2a14e69L, + 0xf4cd65daL, 0xbed50605L, 0x621fd134L, 0xfe8ac4a6L, + 0x539d342eL, 0x55a0a2f3L, 0xe132058aL, 0xeb75a4f6L, + 0xec390b83L, 0xefaa4060L, 0x9f065e71L, 0x1051bd6eL, + 0x8af93e21L, 0x063d96ddL, 0x05aedd3eL, 0xbd464de6L, + 0x8db59154L, 0x5d0571c4L, 0xd46f0406L, 0x15ff6050L, + 0xfb241998L, 0xe997d6bdL, 0x43cc8940L, 0x9e7767d9L, + 0x42bdb0e8L, 0x8b880789L, 0x5b38e719L, 0xeedb79c8L, + 0x0a47a17cL, 0x0fe97c42L, 0x1ec9f884L, 0x00000000L, + 0x86830980L, 0xed48322bL, 0x70ac1e11L, 0x724e6c5aL, + 0xfffbfd0eL, 0x38560f85L, 0xd51e3daeL, 0x3927362dL, + 0xd9640a0fL, 0xa621685cL, 0x54d19b5bL, 0x2e3a2436L, + 0x67b10c0aL, 0xe70f9357L, 0x96d2b4eeL, 0x919e1b9bL, + 0xc54f80c0L, 0x20a261dcL, 0x4b695a77L, 0x1a161c12L, + 0xba0ae293L, 0x2ae5c0a0L, 0xe0433c22L, 0x171d121bL, + 0x0d0b0e09L, 0xc7adf28bL, 0xa8b92db6L, 0xa9c8141eL, + 0x198557f1L, 0x074caf75L, 0xddbbee99L, 0x60fda37fL, + 0x269ff701L, 0xf5bc5c72L, 0x3bc54466L, 0x7e345bfbL, + 0x29768b43L, 0xc6dccb23L, 0xfc68b6edL, 0xf163b8e4L, + 0xdccad731L, 0x85104263L, 0x22401397L, 0x112084c6L, + 0x247d854aL, 0x3df8d2bbL, 0x3211aef9L, 0xa16dc729L, + 0x2f4b1d9eL, 0x30f3dcb2L, 0x52ec0d86L, 0xe3d077c1L, + 0x166c2bb3L, 0xb999a970L, 0x48fa1194L, 0x642247e9L, + 0x8cc4a8fcL, 0x3f1aa0f0L, 0x2cd8567dL, 0x90ef2233L, + 0x4ec78749L, 0xd1c1d938L, 0xa2fe8ccaL, 0x0b3698d4L, + 0x81cfa6f5L, 0xde28a57aL, 0x8e26dab7L, 0xbfa43fadL, + 0x9de42c3aL, 0x920d5078L, 0xcc9b6a5fL, 0x4662547eL, + 0x13c2f68dL, 0xb8e890d8L, 0xf75e2e39L, 0xaff582c3L, + 0x80be9f5dL, 0x937c69d0L, 0x2da96fd5L, 0x12b3cf25L, + 0x993bc8acL, 0x7da71018L, 0x636ee89cL, 0xbb7bdb3bL, + 0x7809cd26L, 0x18f46e59L, 0xb701ec9aL, 0x9aa8834fL, + 0x6e65e695L, 0xe67eaaffL, 0xcf0821bcL, 0xe8e6ef15L, + 0x9bd9bae7L, 0x36ce4a6fL, 0x09d4ea9fL, 0x7cd629b0L, + 0xb2af31a4L, 0x23312a3fL, 0x9430c6a5L, 0x66c035a2L, + 0xbc37744eL, 0xcaa6fc82L, 0xd0b0e090L, 0xd81533a7L, + 0x984af104L, 0xdaf741ecL, 0x500e7fcdL, 0xf62f1791L, + 0xd68d764dL, 0xb04d43efL, 0x4d54ccaaL, 0x04dfe496L, + 0xb5e39ed1L, 0x881b4c6aL, 0x1fb8c12cL, 0x517f4665L, + 0xea049d5eL, 0x355d018cL, 0x7473fa87L, 0x412efb0bL, + 0x1d5ab367L, 0xd25292dbL, 0x5633e910L, 0x47136dd6L, + 0x618c9ad7L, 0x0c7a37a1L, 0x148e59f8L, 0x3c89eb13L, + 0x27eecea9L, 0xc935b761L, 0xe5ede11cL, 0xb13c7a47L, + 0xdf599cd2L, 0x733f55f2L, 0xce791814L, 0x37bf73c7L, + 0xcdea53f7L, 0xaa5b5ffdL, 0x6f14df3dL, 0xdb867844L, + 0xf381caafL, 0xc43eb968L, 0x342c3824L, 0x405fc2a3L, + 0xc372161dL, 0x250cbce2L, 0x498b283cL, 0x9541ff0dL, + 0x017139a8L, 0xb3de080cL, 0xe49cd8b4L, 0xc1906456L, + 0x84617bcbL, 0xb670d532L, 0x5c74486cL, 0x5742d0b8L, +] Td3 = [ - 0xf4a75051L, 0x4165537eL, 0x17a4c31aL, 0x275e963aL, - 0xab6bcb3bL, 0x9d45f11fL, 0xfa58abacL, 0xe303934bL, - 0x30fa5520L, 0x766df6adL, 0xcc769188L, 0x024c25f5L, - 0xe5d7fc4fL, 0x2acbd7c5L, 0x35448026L, 0x62a38fb5L, - 0xb15a49deL, 0xba1b6725L, 0xea0e9845L, 0xfec0e15dL, - 0x2f7502c3L, 0x4cf01281L, 0x4697a38dL, 0xd3f9c66bL, - 0x8f5fe703L, 0x929c9515L, 0x6d7aebbfL, 0x5259da95L, - 0xbe832dd4L, 0x7421d358L, 0xe0692949L, 0xc9c8448eL, - 0xc2896a75L, 0x8e7978f4L, 0x583e6b99L, 0xb971dd27L, - 0xe14fb6beL, 0x88ad17f0L, 0x20ac66c9L, 0xce3ab47dL, - 0xdf4a1863L, 0x1a3182e5L, 0x51336097L, 0x537f4562L, - 0x6477e0b1L, 0x6bae84bbL, 0x81a01cfeL, 0x082b94f9L, - 0x48685870L, 0x45fd198fL, 0xde6c8794L, 0x7bf8b752L, - 0x73d323abL, 0x4b02e272L, 0x1f8f57e3L, 0x55ab2a66L, - 0xeb2807b2L, 0xb5c2032fL, 0xc57b9a86L, 0x3708a5d3L, - 0x2887f230L, 0xbfa5b223L, 0x036aba02L, 0x16825cedL, - 0xcf1c2b8aL, 0x79b492a7L, 0x07f2f0f3L, 0x69e2a14eL, - 0xdaf4cd65L, 0x05bed506L, 0x34621fd1L, 0xa6fe8ac4L, - 0x2e539d34L, 0xf355a0a2L, 0x8ae13205L, 0xf6eb75a4L, - 0x83ec390bL, 0x60efaa40L, 0x719f065eL, 0x6e1051bdL, - 0x218af93eL, 0xdd063d96L, 0x3e05aeddL, 0xe6bd464dL, - 0x548db591L, 0xc45d0571L, 0x06d46f04L, 0x5015ff60L, - 0x98fb2419L, 0xbde997d6L, 0x4043cc89L, 0xd99e7767L, - 0xe842bdb0L, 0x898b8807L, 0x195b38e7L, 0xc8eedb79L, - 0x7c0a47a1L, 0x420fe97cL, 0x841ec9f8L, 0x00000000L, - 0x80868309L, 0x2bed4832L, 0x1170ac1eL, 0x5a724e6cL, - 0x0efffbfdL, 0x8538560fL, 0xaed51e3dL, 0x2d392736L, - 0x0fd9640aL, 0x5ca62168L, 0x5b54d19bL, 0x362e3a24L, - 0x0a67b10cL, 0x57e70f93L, 0xee96d2b4L, 0x9b919e1bL, - 0xc0c54f80L, 0xdc20a261L, 0x774b695aL, 0x121a161cL, - 0x93ba0ae2L, 0xa02ae5c0L, 0x22e0433cL, 0x1b171d12L, - 0x090d0b0eL, 0x8bc7adf2L, 0xb6a8b92dL, 0x1ea9c814L, - 0xf1198557L, 0x75074cafL, 0x99ddbbeeL, 0x7f60fda3L, - 0x01269ff7L, 0x72f5bc5cL, 0x663bc544L, 0xfb7e345bL, - 0x4329768bL, 0x23c6dccbL, 0xedfc68b6L, 0xe4f163b8L, - 0x31dccad7L, 0x63851042L, 0x97224013L, 0xc6112084L, - 0x4a247d85L, 0xbb3df8d2L, 0xf93211aeL, 0x29a16dc7L, - 0x9e2f4b1dL, 0xb230f3dcL, 0x8652ec0dL, 0xc1e3d077L, - 0xb3166c2bL, 0x70b999a9L, 0x9448fa11L, 0xe9642247L, - 0xfc8cc4a8L, 0xf03f1aa0L, 0x7d2cd856L, 0x3390ef22L, - 0x494ec787L, 0x38d1c1d9L, 0xcaa2fe8cL, 0xd40b3698L, - 0xf581cfa6L, 0x7ade28a5L, 0xb78e26daL, 0xadbfa43fL, - 0x3a9de42cL, 0x78920d50L, 0x5fcc9b6aL, 0x7e466254L, - 0x8d13c2f6L, 0xd8b8e890L, 0x39f75e2eL, 0xc3aff582L, - 0x5d80be9fL, 0xd0937c69L, 0xd52da96fL, 0x2512b3cfL, - 0xac993bc8L, 0x187da710L, 0x9c636ee8L, 0x3bbb7bdbL, - 0x267809cdL, 0x5918f46eL, 0x9ab701ecL, 0x4f9aa883L, - 0x956e65e6L, 0xffe67eaaL, 0xbccf0821L, 0x15e8e6efL, - 0xe79bd9baL, 0x6f36ce4aL, 0x9f09d4eaL, 0xb07cd629L, - 0xa4b2af31L, 0x3f23312aL, 0xa59430c6L, 0xa266c035L, - 0x4ebc3774L, 0x82caa6fcL, 0x90d0b0e0L, 0xa7d81533L, - 0x04984af1L, 0xecdaf741L, 0xcd500e7fL, 0x91f62f17L, - 0x4dd68d76L, 0xefb04d43L, 0xaa4d54ccL, 0x9604dfe4L, - 0xd1b5e39eL, 0x6a881b4cL, 0x2c1fb8c1L, 0x65517f46L, - 0x5eea049dL, 0x8c355d01L, 0x877473faL, 0x0b412efbL, - 0x671d5ab3L, 0xdbd25292L, 0x105633e9L, 0xd647136dL, - 0xd7618c9aL, 0xa10c7a37L, 0xf8148e59L, 0x133c89ebL, - 0xa927eeceL, 0x61c935b7L, 0x1ce5ede1L, 0x47b13c7aL, - 0xd2df599cL, 0xf2733f55L, 0x14ce7918L, 0xc737bf73L, - 0xf7cdea53L, 0xfdaa5b5fL, 0x3d6f14dfL, 0x44db8678L, - 0xaff381caL, 0x68c43eb9L, 0x24342c38L, 0xa3405fc2L, - 0x1dc37216L, 0xe2250cbcL, 0x3c498b28L, 0x0d9541ffL, - 0xa8017139L, 0x0cb3de08L, 0xb4e49cd8L, 0x56c19064L, - 0xcb84617bL, 0x32b670d5L, 0x6c5c7448L, 0xb85742d0L, - ] + 0xf4a75051L, 0x4165537eL, 0x17a4c31aL, 0x275e963aL, + 0xab6bcb3bL, 0x9d45f11fL, 0xfa58abacL, 0xe303934bL, + 0x30fa5520L, 0x766df6adL, 0xcc769188L, 0x024c25f5L, + 0xe5d7fc4fL, 0x2acbd7c5L, 0x35448026L, 0x62a38fb5L, + 0xb15a49deL, 0xba1b6725L, 0xea0e9845L, 0xfec0e15dL, + 0x2f7502c3L, 0x4cf01281L, 0x4697a38dL, 0xd3f9c66bL, + 0x8f5fe703L, 0x929c9515L, 0x6d7aebbfL, 0x5259da95L, + 0xbe832dd4L, 0x7421d358L, 0xe0692949L, 0xc9c8448eL, + 0xc2896a75L, 0x8e7978f4L, 0x583e6b99L, 0xb971dd27L, + 0xe14fb6beL, 0x88ad17f0L, 0x20ac66c9L, 0xce3ab47dL, + 0xdf4a1863L, 0x1a3182e5L, 0x51336097L, 0x537f4562L, + 0x6477e0b1L, 0x6bae84bbL, 0x81a01cfeL, 0x082b94f9L, + 0x48685870L, 0x45fd198fL, 0xde6c8794L, 0x7bf8b752L, + 0x73d323abL, 0x4b02e272L, 0x1f8f57e3L, 0x55ab2a66L, + 0xeb2807b2L, 0xb5c2032fL, 0xc57b9a86L, 0x3708a5d3L, + 0x2887f230L, 0xbfa5b223L, 0x036aba02L, 0x16825cedL, + 0xcf1c2b8aL, 0x79b492a7L, 0x07f2f0f3L, 0x69e2a14eL, + 0xdaf4cd65L, 0x05bed506L, 0x34621fd1L, 0xa6fe8ac4L, + 0x2e539d34L, 0xf355a0a2L, 0x8ae13205L, 0xf6eb75a4L, + 0x83ec390bL, 0x60efaa40L, 0x719f065eL, 0x6e1051bdL, + 0x218af93eL, 0xdd063d96L, 0x3e05aeddL, 0xe6bd464dL, + 0x548db591L, 0xc45d0571L, 0x06d46f04L, 0x5015ff60L, + 0x98fb2419L, 0xbde997d6L, 0x4043cc89L, 0xd99e7767L, + 0xe842bdb0L, 0x898b8807L, 0x195b38e7L, 0xc8eedb79L, + 0x7c0a47a1L, 0x420fe97cL, 0x841ec9f8L, 0x00000000L, + 0x80868309L, 0x2bed4832L, 0x1170ac1eL, 0x5a724e6cL, + 0x0efffbfdL, 0x8538560fL, 0xaed51e3dL, 0x2d392736L, + 0x0fd9640aL, 0x5ca62168L, 0x5b54d19bL, 0x362e3a24L, + 0x0a67b10cL, 0x57e70f93L, 0xee96d2b4L, 0x9b919e1bL, + 0xc0c54f80L, 0xdc20a261L, 0x774b695aL, 0x121a161cL, + 0x93ba0ae2L, 0xa02ae5c0L, 0x22e0433cL, 0x1b171d12L, + 0x090d0b0eL, 0x8bc7adf2L, 0xb6a8b92dL, 0x1ea9c814L, + 0xf1198557L, 0x75074cafL, 0x99ddbbeeL, 0x7f60fda3L, + 0x01269ff7L, 0x72f5bc5cL, 0x663bc544L, 0xfb7e345bL, + 0x4329768bL, 0x23c6dccbL, 0xedfc68b6L, 0xe4f163b8L, + 0x31dccad7L, 0x63851042L, 0x97224013L, 0xc6112084L, + 0x4a247d85L, 0xbb3df8d2L, 0xf93211aeL, 0x29a16dc7L, + 0x9e2f4b1dL, 0xb230f3dcL, 0x8652ec0dL, 0xc1e3d077L, + 0xb3166c2bL, 0x70b999a9L, 0x9448fa11L, 0xe9642247L, + 0xfc8cc4a8L, 0xf03f1aa0L, 0x7d2cd856L, 0x3390ef22L, + 0x494ec787L, 0x38d1c1d9L, 0xcaa2fe8cL, 0xd40b3698L, + 0xf581cfa6L, 0x7ade28a5L, 0xb78e26daL, 0xadbfa43fL, + 0x3a9de42cL, 0x78920d50L, 0x5fcc9b6aL, 0x7e466254L, + 0x8d13c2f6L, 0xd8b8e890L, 0x39f75e2eL, 0xc3aff582L, + 0x5d80be9fL, 0xd0937c69L, 0xd52da96fL, 0x2512b3cfL, + 0xac993bc8L, 0x187da710L, 0x9c636ee8L, 0x3bbb7bdbL, + 0x267809cdL, 0x5918f46eL, 0x9ab701ecL, 0x4f9aa883L, + 0x956e65e6L, 0xffe67eaaL, 0xbccf0821L, 0x15e8e6efL, + 0xe79bd9baL, 0x6f36ce4aL, 0x9f09d4eaL, 0xb07cd629L, + 0xa4b2af31L, 0x3f23312aL, 0xa59430c6L, 0xa266c035L, + 0x4ebc3774L, 0x82caa6fcL, 0x90d0b0e0L, 0xa7d81533L, + 0x04984af1L, 0xecdaf741L, 0xcd500e7fL, 0x91f62f17L, + 0x4dd68d76L, 0xefb04d43L, 0xaa4d54ccL, 0x9604dfe4L, + 0xd1b5e39eL, 0x6a881b4cL, 0x2c1fb8c1L, 0x65517f46L, + 0x5eea049dL, 0x8c355d01L, 0x877473faL, 0x0b412efbL, + 0x671d5ab3L, 0xdbd25292L, 0x105633e9L, 0xd647136dL, + 0xd7618c9aL, 0xa10c7a37L, 0xf8148e59L, 0x133c89ebL, + 0xa927eeceL, 0x61c935b7L, 0x1ce5ede1L, 0x47b13c7aL, + 0xd2df599cL, 0xf2733f55L, 0x14ce7918L, 0xc737bf73L, + 0xf7cdea53L, 0xfdaa5b5fL, 0x3d6f14dfL, 0x44db8678L, + 0xaff381caL, 0x68c43eb9L, 0x24342c38L, 0xa3405fc2L, + 0x1dc37216L, 0xe2250cbcL, 0x3c498b28L, 0x0d9541ffL, + 0xa8017139L, 0x0cb3de08L, 0xb4e49cd8L, 0x56c19064L, + 0xcb84617bL, 0x32b670d5L, 0x6c5c7448L, 0xb85742d0L, +] Td4 = [ - 0x52525252L, 0x09090909L, 0x6a6a6a6aL, 0xd5d5d5d5L, - 0x30303030L, 0x36363636L, 0xa5a5a5a5L, 0x38383838L, - 0xbfbfbfbfL, 0x40404040L, 0xa3a3a3a3L, 0x9e9e9e9eL, - 0x81818181L, 0xf3f3f3f3L, 0xd7d7d7d7L, 0xfbfbfbfbL, - 0x7c7c7c7cL, 0xe3e3e3e3L, 0x39393939L, 0x82828282L, - 0x9b9b9b9bL, 0x2f2f2f2fL, 0xffffffffL, 0x87878787L, - 0x34343434L, 0x8e8e8e8eL, 0x43434343L, 0x44444444L, - 0xc4c4c4c4L, 0xdedededeL, 0xe9e9e9e9L, 0xcbcbcbcbL, - 0x54545454L, 0x7b7b7b7bL, 0x94949494L, 0x32323232L, - 0xa6a6a6a6L, 0xc2c2c2c2L, 0x23232323L, 0x3d3d3d3dL, - 0xeeeeeeeeL, 0x4c4c4c4cL, 0x95959595L, 0x0b0b0b0bL, - 0x42424242L, 0xfafafafaL, 0xc3c3c3c3L, 0x4e4e4e4eL, - 0x08080808L, 0x2e2e2e2eL, 0xa1a1a1a1L, 0x66666666L, - 0x28282828L, 0xd9d9d9d9L, 0x24242424L, 0xb2b2b2b2L, - 0x76767676L, 0x5b5b5b5bL, 0xa2a2a2a2L, 0x49494949L, - 0x6d6d6d6dL, 0x8b8b8b8bL, 0xd1d1d1d1L, 0x25252525L, - 0x72727272L, 0xf8f8f8f8L, 0xf6f6f6f6L, 0x64646464L, - 0x86868686L, 0x68686868L, 0x98989898L, 0x16161616L, - 0xd4d4d4d4L, 0xa4a4a4a4L, 0x5c5c5c5cL, 0xccccccccL, - 0x5d5d5d5dL, 0x65656565L, 0xb6b6b6b6L, 0x92929292L, - 0x6c6c6c6cL, 0x70707070L, 0x48484848L, 0x50505050L, - 0xfdfdfdfdL, 0xededededL, 0xb9b9b9b9L, 0xdadadadaL, - 0x5e5e5e5eL, 0x15151515L, 0x46464646L, 0x57575757L, - 0xa7a7a7a7L, 0x8d8d8d8dL, 0x9d9d9d9dL, 0x84848484L, - 0x90909090L, 0xd8d8d8d8L, 0xababababL, 0x00000000L, - 0x8c8c8c8cL, 0xbcbcbcbcL, 0xd3d3d3d3L, 0x0a0a0a0aL, - 0xf7f7f7f7L, 0xe4e4e4e4L, 0x58585858L, 0x05050505L, - 0xb8b8b8b8L, 0xb3b3b3b3L, 0x45454545L, 0x06060606L, - 0xd0d0d0d0L, 0x2c2c2c2cL, 0x1e1e1e1eL, 0x8f8f8f8fL, - 0xcacacacaL, 0x3f3f3f3fL, 0x0f0f0f0fL, 0x02020202L, - 0xc1c1c1c1L, 0xafafafafL, 0xbdbdbdbdL, 0x03030303L, - 0x01010101L, 0x13131313L, 0x8a8a8a8aL, 0x6b6b6b6bL, - 0x3a3a3a3aL, 0x91919191L, 0x11111111L, 0x41414141L, - 0x4f4f4f4fL, 0x67676767L, 0xdcdcdcdcL, 0xeaeaeaeaL, - 0x97979797L, 0xf2f2f2f2L, 0xcfcfcfcfL, 0xcecececeL, - 0xf0f0f0f0L, 0xb4b4b4b4L, 0xe6e6e6e6L, 0x73737373L, - 0x96969696L, 0xacacacacL, 0x74747474L, 0x22222222L, - 0xe7e7e7e7L, 0xadadadadL, 0x35353535L, 0x85858585L, - 0xe2e2e2e2L, 0xf9f9f9f9L, 0x37373737L, 0xe8e8e8e8L, - 0x1c1c1c1cL, 0x75757575L, 0xdfdfdfdfL, 0x6e6e6e6eL, - 0x47474747L, 0xf1f1f1f1L, 0x1a1a1a1aL, 0x71717171L, - 0x1d1d1d1dL, 0x29292929L, 0xc5c5c5c5L, 0x89898989L, - 0x6f6f6f6fL, 0xb7b7b7b7L, 0x62626262L, 0x0e0e0e0eL, - 0xaaaaaaaaL, 0x18181818L, 0xbebebebeL, 0x1b1b1b1bL, - 0xfcfcfcfcL, 0x56565656L, 0x3e3e3e3eL, 0x4b4b4b4bL, - 0xc6c6c6c6L, 0xd2d2d2d2L, 0x79797979L, 0x20202020L, - 0x9a9a9a9aL, 0xdbdbdbdbL, 0xc0c0c0c0L, 0xfefefefeL, - 0x78787878L, 0xcdcdcdcdL, 0x5a5a5a5aL, 0xf4f4f4f4L, - 0x1f1f1f1fL, 0xddddddddL, 0xa8a8a8a8L, 0x33333333L, - 0x88888888L, 0x07070707L, 0xc7c7c7c7L, 0x31313131L, - 0xb1b1b1b1L, 0x12121212L, 0x10101010L, 0x59595959L, - 0x27272727L, 0x80808080L, 0xececececL, 0x5f5f5f5fL, - 0x60606060L, 0x51515151L, 0x7f7f7f7fL, 0xa9a9a9a9L, - 0x19191919L, 0xb5b5b5b5L, 0x4a4a4a4aL, 0x0d0d0d0dL, - 0x2d2d2d2dL, 0xe5e5e5e5L, 0x7a7a7a7aL, 0x9f9f9f9fL, - 0x93939393L, 0xc9c9c9c9L, 0x9c9c9c9cL, 0xefefefefL, - 0xa0a0a0a0L, 0xe0e0e0e0L, 0x3b3b3b3bL, 0x4d4d4d4dL, - 0xaeaeaeaeL, 0x2a2a2a2aL, 0xf5f5f5f5L, 0xb0b0b0b0L, - 0xc8c8c8c8L, 0xebebebebL, 0xbbbbbbbbL, 0x3c3c3c3cL, - 0x83838383L, 0x53535353L, 0x99999999L, 0x61616161L, - 0x17171717L, 0x2b2b2b2bL, 0x04040404L, 0x7e7e7e7eL, - 0xbabababaL, 0x77777777L, 0xd6d6d6d6L, 0x26262626L, - 0xe1e1e1e1L, 0x69696969L, 0x14141414L, 0x63636363L, - 0x55555555L, 0x21212121L, 0x0c0c0c0cL, 0x7d7d7d7dL, - ] + 0x52525252L, 0x09090909L, 0x6a6a6a6aL, 0xd5d5d5d5L, + 0x30303030L, 0x36363636L, 0xa5a5a5a5L, 0x38383838L, + 0xbfbfbfbfL, 0x40404040L, 0xa3a3a3a3L, 0x9e9e9e9eL, + 0x81818181L, 0xf3f3f3f3L, 0xd7d7d7d7L, 0xfbfbfbfbL, + 0x7c7c7c7cL, 0xe3e3e3e3L, 0x39393939L, 0x82828282L, + 0x9b9b9b9bL, 0x2f2f2f2fL, 0xffffffffL, 0x87878787L, + 0x34343434L, 0x8e8e8e8eL, 0x43434343L, 0x44444444L, + 0xc4c4c4c4L, 0xdedededeL, 0xe9e9e9e9L, 0xcbcbcbcbL, + 0x54545454L, 0x7b7b7b7bL, 0x94949494L, 0x32323232L, + 0xa6a6a6a6L, 0xc2c2c2c2L, 0x23232323L, 0x3d3d3d3dL, + 0xeeeeeeeeL, 0x4c4c4c4cL, 0x95959595L, 0x0b0b0b0bL, + 0x42424242L, 0xfafafafaL, 0xc3c3c3c3L, 0x4e4e4e4eL, + 0x08080808L, 0x2e2e2e2eL, 0xa1a1a1a1L, 0x66666666L, + 0x28282828L, 0xd9d9d9d9L, 0x24242424L, 0xb2b2b2b2L, + 0x76767676L, 0x5b5b5b5bL, 0xa2a2a2a2L, 0x49494949L, + 0x6d6d6d6dL, 0x8b8b8b8bL, 0xd1d1d1d1L, 0x25252525L, + 0x72727272L, 0xf8f8f8f8L, 0xf6f6f6f6L, 0x64646464L, + 0x86868686L, 0x68686868L, 0x98989898L, 0x16161616L, + 0xd4d4d4d4L, 0xa4a4a4a4L, 0x5c5c5c5cL, 0xccccccccL, + 0x5d5d5d5dL, 0x65656565L, 0xb6b6b6b6L, 0x92929292L, + 0x6c6c6c6cL, 0x70707070L, 0x48484848L, 0x50505050L, + 0xfdfdfdfdL, 0xededededL, 0xb9b9b9b9L, 0xdadadadaL, + 0x5e5e5e5eL, 0x15151515L, 0x46464646L, 0x57575757L, + 0xa7a7a7a7L, 0x8d8d8d8dL, 0x9d9d9d9dL, 0x84848484L, + 0x90909090L, 0xd8d8d8d8L, 0xababababL, 0x00000000L, + 0x8c8c8c8cL, 0xbcbcbcbcL, 0xd3d3d3d3L, 0x0a0a0a0aL, + 0xf7f7f7f7L, 0xe4e4e4e4L, 0x58585858L, 0x05050505L, + 0xb8b8b8b8L, 0xb3b3b3b3L, 0x45454545L, 0x06060606L, + 0xd0d0d0d0L, 0x2c2c2c2cL, 0x1e1e1e1eL, 0x8f8f8f8fL, + 0xcacacacaL, 0x3f3f3f3fL, 0x0f0f0f0fL, 0x02020202L, + 0xc1c1c1c1L, 0xafafafafL, 0xbdbdbdbdL, 0x03030303L, + 0x01010101L, 0x13131313L, 0x8a8a8a8aL, 0x6b6b6b6bL, + 0x3a3a3a3aL, 0x91919191L, 0x11111111L, 0x41414141L, + 0x4f4f4f4fL, 0x67676767L, 0xdcdcdcdcL, 0xeaeaeaeaL, + 0x97979797L, 0xf2f2f2f2L, 0xcfcfcfcfL, 0xcecececeL, + 0xf0f0f0f0L, 0xb4b4b4b4L, 0xe6e6e6e6L, 0x73737373L, + 0x96969696L, 0xacacacacL, 0x74747474L, 0x22222222L, + 0xe7e7e7e7L, 0xadadadadL, 0x35353535L, 0x85858585L, + 0xe2e2e2e2L, 0xf9f9f9f9L, 0x37373737L, 0xe8e8e8e8L, + 0x1c1c1c1cL, 0x75757575L, 0xdfdfdfdfL, 0x6e6e6e6eL, + 0x47474747L, 0xf1f1f1f1L, 0x1a1a1a1aL, 0x71717171L, + 0x1d1d1d1dL, 0x29292929L, 0xc5c5c5c5L, 0x89898989L, + 0x6f6f6f6fL, 0xb7b7b7b7L, 0x62626262L, 0x0e0e0e0eL, + 0xaaaaaaaaL, 0x18181818L, 0xbebebebeL, 0x1b1b1b1bL, + 0xfcfcfcfcL, 0x56565656L, 0x3e3e3e3eL, 0x4b4b4b4bL, + 0xc6c6c6c6L, 0xd2d2d2d2L, 0x79797979L, 0x20202020L, + 0x9a9a9a9aL, 0xdbdbdbdbL, 0xc0c0c0c0L, 0xfefefefeL, + 0x78787878L, 0xcdcdcdcdL, 0x5a5a5a5aL, 0xf4f4f4f4L, + 0x1f1f1f1fL, 0xddddddddL, 0xa8a8a8a8L, 0x33333333L, + 0x88888888L, 0x07070707L, 0xc7c7c7c7L, 0x31313131L, + 0xb1b1b1b1L, 0x12121212L, 0x10101010L, 0x59595959L, + 0x27272727L, 0x80808080L, 0xececececL, 0x5f5f5f5fL, + 0x60606060L, 0x51515151L, 0x7f7f7f7fL, 0xa9a9a9a9L, + 0x19191919L, 0xb5b5b5b5L, 0x4a4a4a4aL, 0x0d0d0d0dL, + 0x2d2d2d2dL, 0xe5e5e5e5L, 0x7a7a7a7aL, 0x9f9f9f9fL, + 0x93939393L, 0xc9c9c9c9L, 0x9c9c9c9cL, 0xefefefefL, + 0xa0a0a0a0L, 0xe0e0e0e0L, 0x3b3b3b3bL, 0x4d4d4d4dL, + 0xaeaeaeaeL, 0x2a2a2a2aL, 0xf5f5f5f5L, 0xb0b0b0b0L, + 0xc8c8c8c8L, 0xebebebebL, 0xbbbbbbbbL, 0x3c3c3c3cL, + 0x83838383L, 0x53535353L, 0x99999999L, 0x61616161L, + 0x17171717L, 0x2b2b2b2bL, 0x04040404L, 0x7e7e7e7eL, + 0xbabababaL, 0x77777777L, 0xd6d6d6d6L, 0x26262626L, + 0xe1e1e1e1L, 0x69696969L, 0x14141414L, 0x63636363L, + 0x55555555L, 0x21212121L, 0x0c0c0c0cL, 0x7d7d7d7dL, +] rcon = [ - 0x01000000, 0x02000000, 0x04000000, 0x08000000, - 0x10000000, 0x20000000, 0x40000000, 0x80000000, - 0x1B000000, 0x36000000, - # 128-bit blocks, Rijndael never uses more than 10 rcon values - ] + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1B000000, 0x36000000, + # 128-bit blocks, Rijndael never uses more than 10 rcon values +] if len(struct.pack('L',0)) == 4: # 32bit @@ -703,6 +711,7 @@ else: def GETU32(x): return struct.unpack('>I', x)[0] def PUTU32(x): return struct.pack('>I', x) + # Expand the cipher key into the encryption key schedule. # # @return the number of rounds for the given cipher key size. @@ -1051,6 +1060,7 @@ class RijndaelDecryptor(object): assert len(ciphertext) == 16 return rijndaelDecrypt(self.rk, self.nrounds, ciphertext) + # encrypt(key, fin, fout, keybits=256) class RijndaelEncryptor(object): diff --git a/pdfminer/runlength.py b/pdfminer/runlength.py index e17389e..768d64a 100644 --- a/pdfminer/runlength.py +++ b/pdfminer/runlength.py @@ -8,6 +8,7 @@ import sys + def rldecode(data): """ RunLength decoder (Adobe version) implementation based on PDF Reference @@ -26,7 +27,7 @@ def rldecode(data): '1234567777777abcde' """ decoded = [] - i=0 + i = 0 while i < len(data): #print "data[%d]=:%d:" % (i,ord(data[i])) length = ord(data[i]) diff --git a/pdfminer/utils.py b/pdfminer/utils.py index d6452cb..8a46cd0 100644 --- a/pdfminer/utils.py +++ b/pdfminer/utils.py @@ -32,13 +32,13 @@ def apply_png_predictor(pred, colors, columns, bitspercomponent, data): buf += chr(c) elif pred == '\x02': # PNG up - for (a,b) in zip(line0,line1): + for (a, b) in zip(line0, line1): c = (ord(a)+ord(b)) & 255 buf += chr(c) elif pred == '\x03': # PNG average (UNTESTED) c = 0 - for (a,b) in zip(line0,line1): + for (a, b) in zip(line0, line1): c = ((c+ord(a)+ord(b))/2) & 255 buf += chr(c) else: @@ -52,21 +52,25 @@ def apply_png_predictor(pred, colors, columns, bitspercomponent, data): ## MATRIX_IDENTITY = (1, 0, 0, 1, 0, 0) -def mult_matrix((a1,b1,c1,d1,e1,f1), (a0,b0,c0,d0,e0,f0)): + +def mult_matrix((a1, b1, c1, d1, e1, f1), (a0, b0, c0, d0, e0, f0)): """Returns the multiplication of two matrices.""" return (a0*a1+c0*b1, b0*a1+d0*b1, a0*c1+c0*d1, b0*c1+d0*d1, a0*e1+c0*f1+e0, b0*e1+d0*f1+f0) -def translate_matrix((a,b,c,d,e,f), (x,y)): - """Translates a matrix by (x,y).""" - return (a,b,c,d,x*a+y*c+e,x*b+y*d+f) -def apply_matrix_pt((a,b,c,d,e,f), (x,y)): +def translate_matrix((a, b, c, d, e, f), (x, y)): + """Translates a matrix by (x, y).""" + return (a, b, c, d, x*a+y*c+e, x*b+y*d+f) + + +def apply_matrix_pt((a, b, c, d, e, f), (x, y)): """Applies a matrix to a point.""" return (a*x+c*y+e, b*x+d*y+f) -def apply_matrix_norm((a,b,c,d,e,f), (p,q)): + +def apply_matrix_norm((a, b, c, d, e, f), (p, q)): """Equivalent to apply_matrix_pt(M, (p,q)) - apply_matrix_pt(M, (0,0))""" return (a*p+c*q, b*p+d*q) @@ -79,17 +83,20 @@ def uniq(objs): """Eliminates duplicated elements.""" done = set() for obj in objs: - if obj in done: continue + if obj in done: + continue done.add(obj) yield obj return + # csort -def csort(objs, key=lambda x:x): +def csort(objs, key=lambda x: x): """Order-preserving sorting function.""" - idxs = dict( (obj,i) for (i,obj) in enumerate(objs) ) + idxs = dict((obj, i) for (i, obj) in enumerate(objs)) return sorted(objs, key=lambda obj: (key(obj), idxs[obj])) + # fsplit def fsplit(pred, objs): """Split a list into two classes according to the predicate.""" @@ -100,7 +107,8 @@ def fsplit(pred, objs): t.append(obj) else: f.append(obj) - return (t,f) + return (t, f) + # drange def drange(v0, v1, d): @@ -108,16 +116,18 @@ def drange(v0, v1, d): assert v0 < v1 return xrange(int(v0)/d, int(v1+d)/d) + # get_bound def get_bound(pts): """Compute a minimal rectangle that covers all the points.""" (x0, y0, x1, y1) = (INF, INF, -INF, -INF) - for (x,y) in pts: + for (x, y) in pts: x0 = min(x0, x) y0 = min(y0, y) x1 = max(x1, x) y1 = max(y1, y) - return (x0,y0,x1,y1) + return (x0, y0, x1, y1) + # pick def pick(seq, func, maxobj=None): @@ -126,9 +136,10 @@ def pick(seq, func, maxobj=None): for obj in seq: score = func(obj) if maxscore is None or maxscore < score: - (maxscore,maxobj) = (score,obj) + (maxscore, maxobj) = (score, obj) return maxobj + # choplist def choplist(n, seq): """Groups every n elements of the list.""" @@ -140,6 +151,7 @@ def choplist(n, seq): r = [] return + # nunpack def nunpack(s, default=0): """Unpacks 1 to 4 byte integers (big endian).""" @@ -157,59 +169,65 @@ def nunpack(s, default=0): else: raise TypeError('invalid length: %d' % l) + # decode_text -PDFDocEncoding = ''.join( unichr(x) for x in ( - 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, - 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, - 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0017, 0x0017, - 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, - 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, - 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, - 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, - 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, - 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000, - 0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, - 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, - 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, +PDFDocEncoding = ''.join(unichr(x) for x in ( + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0017, 0x0017, + 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, + 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, + 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, + 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, + 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000, + 0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, )) + + def decode_text(s): """Decodes a PDFDocEncoding string to Unicode.""" if s.startswith('\xfe\xff'): return unicode(s[2:], 'utf-16be', 'ignore') else: - return ''.join( PDFDocEncoding[ord(c)] for c in s ) + return ''.join(PDFDocEncoding[ord(c)] for c in s) + # enc def enc(x, codec='ascii'): """Encodes a string for SGML/XML/HTML""" - x = x.replace('&','&').replace('>','>').replace('<','<').replace('"','"') + x = x.replace('&', '&').replace('>', '>').replace('<', '<').replace('"', '"') return x.encode(codec, 'xmlcharrefreplace') -def bbox2str((x0,y0,x1,y1)): + +def bbox2str((x0, y0, x1, y1)): return '%.3f,%.3f,%.3f,%.3f' % (x0, y0, x1, y1) -def matrix2str((a,b,c,d,e,f)): - return '[%.2f,%.2f,%.2f,%.2f, (%.2f,%.2f)]' % (a,b,c,d,e,f) + +def matrix2str((a, b, c, d, e, f)): + return '[%.2f,%.2f,%.2f,%.2f, (%.2f,%.2f)]' % (a, b, c, d, e, f) ## Plane @@ -240,14 +258,14 @@ class Plane(object): def __contains__(self, obj): return obj in self._objs - def _getrange(self, (x0,y0,x1,y1)): + def _getrange(self, (x0, y0, x1, y1)): x0 = max(self.x0, x0) y0 = max(self.y0, y0) x1 = min(self.x1, x1) y1 = min(self.y1, y1) for y in drange(y0, y1, self.gridsize): for x in drange(x0, x1, self.gridsize): - yield (x,y) + yield (x, y) return # extend(objs) @@ -279,14 +297,17 @@ class Plane(object): return # find(): finds objects that are in a certain area. - def find(self, (x0,y0,x1,y1)): + def find(self, (x0, y0, x1, y1)): done = set() - for k in self._getrange((x0,y0,x1,y1)): - if k not in self._grid: continue + for k in self._getrange((x0, y0, x1, y1)): + if k not in self._grid: + continue for obj in self._grid[k]: - if obj in done: continue + if obj in done: + continue done.add(obj) if (obj.x1 <= x0 or x1 <= obj.x0 or - obj.y1 <= y0 or y1 <= obj.y0): continue + obj.y1 <= y0 or y1 <= obj.y0): + continue yield obj return