From 2d339ba00a0b06a9d4035c95deb66129bdacc742 Mon Sep 17 00:00:00 2001 From: qianlifeng Date: Sat, 21 Dec 2013 01:22:42 +0800 Subject: [PATCH] add portable python environment --- PythonEnv/2.7/Include/Python-ast.h | 535 +++ PythonEnv/2.7/Include/Python.h | 178 + PythonEnv/2.7/Include/abstract.h | 1396 ++++++ PythonEnv/2.7/Include/asdl.h | 45 + PythonEnv/2.7/Include/ast.h | 13 + PythonEnv/2.7/Include/bitset.h | 32 + PythonEnv/2.7/Include/boolobject.h | 36 + PythonEnv/2.7/Include/bufferobject.h | 33 + PythonEnv/2.7/Include/bytearrayobject.h | 57 + PythonEnv/2.7/Include/bytes_methods.h | 75 + PythonEnv/2.7/Include/bytesobject.h | 27 + PythonEnv/2.7/Include/cStringIO.h | 73 + PythonEnv/2.7/Include/cellobject.h | 28 + PythonEnv/2.7/Include/ceval.h | 153 + PythonEnv/2.7/Include/classobject.h | 83 + PythonEnv/2.7/Include/cobject.h | 89 + PythonEnv/2.7/Include/code.h | 107 + PythonEnv/2.7/Include/codecs.h | 167 + PythonEnv/2.7/Include/compile.h | 40 + PythonEnv/2.7/Include/complexobject.h | 66 + PythonEnv/2.7/Include/datetime.h | 239 + PythonEnv/2.7/Include/descrobject.h | 94 + PythonEnv/2.7/Include/dictobject.h | 156 + PythonEnv/2.7/Include/dtoa.h | 15 + PythonEnv/2.7/Include/enumobject.h | 17 + PythonEnv/2.7/Include/errcode.h | 36 + PythonEnv/2.7/Include/eval.h | 25 + PythonEnv/2.7/Include/fileobject.h | 97 + PythonEnv/2.7/Include/floatobject.h | 140 + PythonEnv/2.7/Include/frameobject.h | 89 + PythonEnv/2.7/Include/funcobject.h | 76 + PythonEnv/2.7/Include/genobject.h | 40 + PythonEnv/2.7/Include/graminit.h | 87 + PythonEnv/2.7/Include/grammar.h | 93 + PythonEnv/2.7/Include/import.h | 71 + PythonEnv/2.7/Include/intobject.h | 81 + PythonEnv/2.7/Include/intrcheck.h | 15 + PythonEnv/2.7/Include/iterobject.h | 23 + PythonEnv/2.7/Include/listobject.h | 68 + PythonEnv/2.7/Include/longintrepr.h | 103 + PythonEnv/2.7/Include/longobject.h | 135 + PythonEnv/2.7/Include/marshal.h | 25 + PythonEnv/2.7/Include/memoryobject.h | 74 + PythonEnv/2.7/Include/metagrammar.h | 18 + PythonEnv/2.7/Include/methodobject.h | 93 + PythonEnv/2.7/Include/modsupport.h | 134 + PythonEnv/2.7/Include/moduleobject.h | 24 + PythonEnv/2.7/Include/node.h | 43 + PythonEnv/2.7/Include/object.h | 1011 +++++ PythonEnv/2.7/Include/objimpl.h | 354 ++ PythonEnv/2.7/Include/opcode.h | 162 + PythonEnv/2.7/Include/osdefs.h | 63 + PythonEnv/2.7/Include/parsetok.h | 64 + PythonEnv/2.7/Include/patchlevel.h | 43 + PythonEnv/2.7/Include/pgen.h | 18 + PythonEnv/2.7/Include/pgenheaders.h | 42 + PythonEnv/2.7/Include/py_curses.h | 176 + PythonEnv/2.7/Include/pyarena.h | 62 + PythonEnv/2.7/Include/pycapsule.h | 56 + PythonEnv/2.7/Include/pyconfig.h | 759 ++++ PythonEnv/2.7/Include/pyctype.h | 31 + PythonEnv/2.7/Include/pydebug.h | 41 + PythonEnv/2.7/Include/pyerrors.h | 328 ++ PythonEnv/2.7/Include/pyexpat.h | 48 + PythonEnv/2.7/Include/pyfpe.h | 176 + PythonEnv/2.7/Include/pygetopt.h | 18 + PythonEnv/2.7/Include/pymacconfig.h | 102 + PythonEnv/2.7/Include/pymactoolbox.h | 217 + PythonEnv/2.7/Include/pymath.h | 192 + PythonEnv/2.7/Include/pymem.h | 122 + PythonEnv/2.7/Include/pyport.h | 941 ++++ PythonEnv/2.7/Include/pystate.h | 200 + PythonEnv/2.7/Include/pystrcmp.h | 23 + PythonEnv/2.7/Include/pystrtod.h | 45 + PythonEnv/2.7/Include/pythonrun.h | 181 + PythonEnv/2.7/Include/pythread.h | 41 + PythonEnv/2.7/Include/rangeobject.h | 28 + PythonEnv/2.7/Include/setobject.h | 99 + PythonEnv/2.7/Include/sliceobject.h | 44 + PythonEnv/2.7/Include/stringobject.h | 210 + PythonEnv/2.7/Include/structmember.h | 99 + PythonEnv/2.7/Include/structseq.h | 41 + PythonEnv/2.7/Include/symtable.h | 98 + PythonEnv/2.7/Include/sysmodule.h | 29 + PythonEnv/2.7/Include/timefuncs.h | 26 + PythonEnv/2.7/Include/token.h | 85 + PythonEnv/2.7/Include/traceback.h | 31 + PythonEnv/2.7/Include/tupleobject.h | 61 + PythonEnv/2.7/Include/ucnhash.h | 33 + PythonEnv/2.7/Include/unicodeobject.h | 1413 ++++++ PythonEnv/2.7/Include/warnings.h | 23 + PythonEnv/2.7/Include/weakrefobject.h | 85 + PythonEnv/2.7/Lib/UserDict.py | 180 + PythonEnv/2.7/Lib/UserDict.pyc | Bin 0 -> 10485 bytes PythonEnv/2.7/Lib/_abcoll.py | 671 +++ PythonEnv/2.7/Lib/_abcoll.pyc | Bin 0 -> 28758 bytes PythonEnv/2.7/Lib/_weakrefset.py | 196 + PythonEnv/2.7/Lib/_weakrefset.pyc | Bin 0 -> 11216 bytes PythonEnv/2.7/Lib/abc.py | 185 + PythonEnv/2.7/Lib/abc.pyc | Bin 0 -> 6550 bytes PythonEnv/2.7/Lib/codecs.py | 1098 +++++ PythonEnv/2.7/Lib/codecs.pyc | Bin 0 -> 40080 bytes PythonEnv/2.7/Lib/copy_reg.py | 201 + PythonEnv/2.7/Lib/copy_reg.pyc | Bin 0 -> 5520 bytes PythonEnv/2.7/Lib/distutils/__init__.py | 101 + PythonEnv/2.7/Lib/distutils/__init__.pyc | Bin 0 -> 3876 bytes PythonEnv/2.7/Lib/distutils/distutils.cfg | 6 + PythonEnv/2.7/Lib/encodings/__init__.py | 157 + PythonEnv/2.7/Lib/encodings/__init__.pyc | Bin 0 -> 4358 bytes PythonEnv/2.7/Lib/encodings/__init__.pyo | Bin 0 -> 4358 bytes PythonEnv/2.7/Lib/encodings/aliases.py | 527 +++ PythonEnv/2.7/Lib/encodings/aliases.pyc | Bin 0 -> 8765 bytes PythonEnv/2.7/Lib/encodings/aliases.pyo | Bin 0 -> 8765 bytes PythonEnv/2.7/Lib/encodings/ascii.py | 50 + PythonEnv/2.7/Lib/encodings/ascii.pyc | Bin 0 -> 2231 bytes PythonEnv/2.7/Lib/encodings/base64_codec.py | 79 + PythonEnv/2.7/Lib/encodings/base64_codec.pyc | Bin 0 -> 3763 bytes PythonEnv/2.7/Lib/encodings/big5.py | 39 + PythonEnv/2.7/Lib/encodings/big5.pyc | Bin 0 -> 1735 bytes PythonEnv/2.7/Lib/encodings/big5hkscs.py | 39 + PythonEnv/2.7/Lib/encodings/big5hkscs.pyc | Bin 0 -> 1775 bytes PythonEnv/2.7/Lib/encodings/bz2_codec.py | 102 + PythonEnv/2.7/Lib/encodings/bz2_codec.pyc | Bin 0 -> 4643 bytes PythonEnv/2.7/Lib/encodings/charmap.py | 69 + PythonEnv/2.7/Lib/encodings/charmap.pyc | Bin 0 -> 3428 bytes PythonEnv/2.7/Lib/encodings/cp037.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp037.pyc | Bin 0 -> 2804 bytes PythonEnv/2.7/Lib/encodings/cp1006.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp1006.pyc | Bin 0 -> 2890 bytes PythonEnv/2.7/Lib/encodings/cp1026.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp1026.pyc | Bin 0 -> 2818 bytes PythonEnv/2.7/Lib/encodings/cp1140.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp1140.pyc | Bin 0 -> 2804 bytes PythonEnv/2.7/Lib/encodings/cp1250.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp1250.pyc | Bin 0 -> 2841 bytes PythonEnv/2.7/Lib/encodings/cp1251.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp1251.pyc | Bin 0 -> 2838 bytes PythonEnv/2.7/Lib/encodings/cp1252.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp1252.pyc | Bin 0 -> 2841 bytes PythonEnv/2.7/Lib/encodings/cp1253.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp1253.pyc | Bin 0 -> 2854 bytes PythonEnv/2.7/Lib/encodings/cp1254.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp1254.pyc | Bin 0 -> 2843 bytes PythonEnv/2.7/Lib/encodings/cp1255.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp1255.pyc | Bin 0 -> 2862 bytes PythonEnv/2.7/Lib/encodings/cp1256.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp1256.pyc | Bin 0 -> 2840 bytes PythonEnv/2.7/Lib/encodings/cp1257.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp1257.pyc | Bin 0 -> 2848 bytes PythonEnv/2.7/Lib/encodings/cp1258.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp1258.pyc | Bin 0 -> 2846 bytes PythonEnv/2.7/Lib/encodings/cp424.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp424.pyc | Bin 0 -> 2834 bytes PythonEnv/2.7/Lib/encodings/cp437.py | 698 +++ PythonEnv/2.7/Lib/encodings/cp437.pyc | Bin 0 -> 8039 bytes PythonEnv/2.7/Lib/encodings/cp500.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp500.pyc | Bin 0 -> 2804 bytes PythonEnv/2.7/Lib/encodings/cp720.py | 309 ++ PythonEnv/2.7/Lib/encodings/cp720.pyc | Bin 0 -> 2901 bytes PythonEnv/2.7/Lib/encodings/cp737.py | 698 +++ PythonEnv/2.7/Lib/encodings/cp737.pyc | Bin 0 -> 8267 bytes PythonEnv/2.7/Lib/encodings/cp775.py | 697 +++ PythonEnv/2.7/Lib/encodings/cp775.pyc | Bin 0 -> 8053 bytes PythonEnv/2.7/Lib/encodings/cp850.py | 698 +++ PythonEnv/2.7/Lib/encodings/cp850.pyc | Bin 0 -> 7786 bytes PythonEnv/2.7/Lib/encodings/cp852.py | 698 +++ PythonEnv/2.7/Lib/encodings/cp852.pyc | Bin 0 -> 8055 bytes PythonEnv/2.7/Lib/encodings/cp855.py | 698 +++ PythonEnv/2.7/Lib/encodings/cp855.pyc | Bin 0 -> 8236 bytes PythonEnv/2.7/Lib/encodings/cp856.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp856.pyc | Bin 0 -> 2866 bytes PythonEnv/2.7/Lib/encodings/cp857.py | 694 +++ PythonEnv/2.7/Lib/encodings/cp857.pyc | Bin 0 -> 7776 bytes PythonEnv/2.7/Lib/encodings/cp858.py | 698 +++ PythonEnv/2.7/Lib/encodings/cp858.pyc | Bin 0 -> 7756 bytes PythonEnv/2.7/Lib/encodings/cp860.py | 698 +++ PythonEnv/2.7/Lib/encodings/cp860.pyc | Bin 0 -> 8022 bytes PythonEnv/2.7/Lib/encodings/cp861.py | 698 +++ PythonEnv/2.7/Lib/encodings/cp861.pyc | Bin 0 -> 8033 bytes PythonEnv/2.7/Lib/encodings/cp862.py | 698 +++ PythonEnv/2.7/Lib/encodings/cp862.pyc | Bin 0 -> 8168 bytes PythonEnv/2.7/Lib/encodings/cp863.py | 698 +++ PythonEnv/2.7/Lib/encodings/cp863.pyc | Bin 0 -> 8033 bytes PythonEnv/2.7/Lib/encodings/cp864.py | 690 +++ PythonEnv/2.7/Lib/encodings/cp864.pyc | Bin 0 -> 8164 bytes PythonEnv/2.7/Lib/encodings/cp865.py | 698 +++ PythonEnv/2.7/Lib/encodings/cp865.pyc | Bin 0 -> 8033 bytes PythonEnv/2.7/Lib/encodings/cp866.py | 698 +++ PythonEnv/2.7/Lib/encodings/cp866.pyc | Bin 0 -> 8268 bytes PythonEnv/2.7/Lib/encodings/cp869.py | 689 +++ PythonEnv/2.7/Lib/encodings/cp869.pyc | Bin 0 -> 8080 bytes PythonEnv/2.7/Lib/encodings/cp874.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp874.pyc | Bin 0 -> 2932 bytes PythonEnv/2.7/Lib/encodings/cp875.py | 307 ++ PythonEnv/2.7/Lib/encodings/cp875.pyc | Bin 0 -> 2801 bytes PythonEnv/2.7/Lib/encodings/cp932.py | 39 + PythonEnv/2.7/Lib/encodings/cp932.pyc | Bin 0 -> 1743 bytes PythonEnv/2.7/Lib/encodings/cp949.py | 39 + PythonEnv/2.7/Lib/encodings/cp949.pyc | Bin 0 -> 1743 bytes PythonEnv/2.7/Lib/encodings/cp950.py | 39 + PythonEnv/2.7/Lib/encodings/cp950.pyc | Bin 0 -> 1743 bytes PythonEnv/2.7/Lib/encodings/euc_jis_2004.py | 39 + PythonEnv/2.7/Lib/encodings/euc_jis_2004.pyc | Bin 0 -> 1799 bytes PythonEnv/2.7/Lib/encodings/euc_jisx0213.py | 39 + PythonEnv/2.7/Lib/encodings/euc_jisx0213.pyc | Bin 0 -> 1799 bytes PythonEnv/2.7/Lib/encodings/euc_jp.py | 39 + PythonEnv/2.7/Lib/encodings/euc_jp.pyc | Bin 0 -> 1751 bytes PythonEnv/2.7/Lib/encodings/euc_kr.py | 39 + PythonEnv/2.7/Lib/encodings/euc_kr.pyc | Bin 0 -> 1751 bytes PythonEnv/2.7/Lib/encodings/gb18030.py | 39 + PythonEnv/2.7/Lib/encodings/gb18030.pyc | Bin 0 -> 1759 bytes PythonEnv/2.7/Lib/encodings/gb2312.py | 39 + PythonEnv/2.7/Lib/encodings/gb2312.pyc | Bin 0 -> 1751 bytes PythonEnv/2.7/Lib/encodings/gbk.py | 39 + PythonEnv/2.7/Lib/encodings/gbk.pyc | Bin 0 -> 1727 bytes PythonEnv/2.7/Lib/encodings/gbk.pyo | Bin 0 -> 1727 bytes PythonEnv/2.7/Lib/encodings/hex_codec.py | 79 + PythonEnv/2.7/Lib/encodings/hex_codec.pyc | Bin 0 -> 3715 bytes PythonEnv/2.7/Lib/encodings/hp_roman8.py | 152 + PythonEnv/2.7/Lib/encodings/hp_roman8.pyc | Bin 0 -> 4087 bytes PythonEnv/2.7/Lib/encodings/hz.py | 39 + PythonEnv/2.7/Lib/encodings/hz.pyc | Bin 0 -> 1719 bytes PythonEnv/2.7/Lib/encodings/idna.py | 288 ++ PythonEnv/2.7/Lib/encodings/idna.pyc | Bin 0 -> 6334 bytes PythonEnv/2.7/Lib/encodings/iso2022_jp.py | 39 + PythonEnv/2.7/Lib/encodings/iso2022_jp.pyc | Bin 0 -> 1788 bytes PythonEnv/2.7/Lib/encodings/iso2022_jp_1.py | 39 + PythonEnv/2.7/Lib/encodings/iso2022_jp_1.pyc | Bin 0 -> 1804 bytes PythonEnv/2.7/Lib/encodings/iso2022_jp_2.py | 39 + PythonEnv/2.7/Lib/encodings/iso2022_jp_2.pyc | Bin 0 -> 1804 bytes .../2.7/Lib/encodings/iso2022_jp_2004.py | 39 + .../2.7/Lib/encodings/iso2022_jp_2004.pyc | Bin 0 -> 1828 bytes PythonEnv/2.7/Lib/encodings/iso2022_jp_3.py | 39 + PythonEnv/2.7/Lib/encodings/iso2022_jp_3.pyc | Bin 0 -> 1804 bytes PythonEnv/2.7/Lib/encodings/iso2022_jp_ext.py | 39 + .../2.7/Lib/encodings/iso2022_jp_ext.pyc | Bin 0 -> 1820 bytes PythonEnv/2.7/Lib/encodings/iso2022_kr.py | 39 + PythonEnv/2.7/Lib/encodings/iso2022_kr.pyc | Bin 0 -> 1788 bytes PythonEnv/2.7/Lib/encodings/iso8859_1.py | 307 ++ PythonEnv/2.7/Lib/encodings/iso8859_1.pyc | Bin 0 -> 2843 bytes PythonEnv/2.7/Lib/encodings/iso8859_10.py | 307 ++ PythonEnv/2.7/Lib/encodings/iso8859_10.pyc | Bin 0 -> 2858 bytes PythonEnv/2.7/Lib/encodings/iso8859_11.py | 307 ++ PythonEnv/2.7/Lib/encodings/iso8859_11.pyc | Bin 0 -> 2952 bytes PythonEnv/2.7/Lib/encodings/iso8859_13.py | 307 ++ PythonEnv/2.7/Lib/encodings/iso8859_13.pyc | Bin 0 -> 2861 bytes PythonEnv/2.7/Lib/encodings/iso8859_14.py | 307 ++ PythonEnv/2.7/Lib/encodings/iso8859_14.pyc | Bin 0 -> 2879 bytes PythonEnv/2.7/Lib/encodings/iso8859_15.py | 307 ++ PythonEnv/2.7/Lib/encodings/iso8859_15.pyc | Bin 0 -> 2858 bytes PythonEnv/2.7/Lib/encodings/iso8859_16.py | 307 ++ PythonEnv/2.7/Lib/encodings/iso8859_16.pyc | Bin 0 -> 2860 bytes PythonEnv/2.7/Lib/encodings/iso8859_2.py | 307 ++ PythonEnv/2.7/Lib/encodings/iso8859_2.pyc | Bin 0 -> 2843 bytes PythonEnv/2.7/Lib/encodings/iso8859_3.py | 307 ++ PythonEnv/2.7/Lib/encodings/iso8859_3.pyc | Bin 0 -> 2850 bytes PythonEnv/2.7/Lib/encodings/iso8859_4.py | 307 ++ PythonEnv/2.7/Lib/encodings/iso8859_4.pyc | Bin 0 -> 2843 bytes PythonEnv/2.7/Lib/encodings/iso8859_5.py | 307 ++ PythonEnv/2.7/Lib/encodings/iso8859_5.pyc | Bin 0 -> 2844 bytes PythonEnv/2.7/Lib/encodings/iso8859_6.py | 307 ++ PythonEnv/2.7/Lib/encodings/iso8859_6.pyc | Bin 0 -> 2888 bytes PythonEnv/2.7/Lib/encodings/iso8859_7.py | 307 ++ PythonEnv/2.7/Lib/encodings/iso8859_7.pyc | Bin 0 -> 2851 bytes PythonEnv/2.7/Lib/encodings/iso8859_8.py | 307 ++ PythonEnv/2.7/Lib/encodings/iso8859_8.pyc | Bin 0 -> 2882 bytes PythonEnv/2.7/Lib/encodings/iso8859_9.py | 307 ++ PythonEnv/2.7/Lib/encodings/iso8859_9.pyc | Bin 0 -> 2843 bytes PythonEnv/2.7/Lib/encodings/johab.py | 39 + PythonEnv/2.7/Lib/encodings/johab.pyc | Bin 0 -> 1743 bytes PythonEnv/2.7/Lib/encodings/koi8_r.py | 307 ++ PythonEnv/2.7/Lib/encodings/koi8_r.pyc | Bin 0 -> 2865 bytes PythonEnv/2.7/Lib/encodings/koi8_u.py | 307 ++ PythonEnv/2.7/Lib/encodings/koi8_u.pyc | Bin 0 -> 2851 bytes PythonEnv/2.7/Lib/encodings/latin_1.py | 50 + PythonEnv/2.7/Lib/encodings/latin_1.pyc | Bin 0 -> 2261 bytes PythonEnv/2.7/Lib/encodings/mac_arabic.py | 698 +++ PythonEnv/2.7/Lib/encodings/mac_arabic.pyc | Bin 0 -> 7989 bytes PythonEnv/2.7/Lib/encodings/mac_centeuro.py | 307 ++ PythonEnv/2.7/Lib/encodings/mac_centeuro.pyc | Bin 0 -> 2912 bytes PythonEnv/2.7/Lib/encodings/mac_croatian.py | 307 ++ PythonEnv/2.7/Lib/encodings/mac_croatian.pyc | Bin 0 -> 2920 bytes PythonEnv/2.7/Lib/encodings/mac_cyrillic.py | 307 ++ PythonEnv/2.7/Lib/encodings/mac_cyrillic.pyc | Bin 0 -> 2910 bytes PythonEnv/2.7/Lib/encodings/mac_farsi.py | 307 ++ PythonEnv/2.7/Lib/encodings/mac_farsi.pyc | Bin 0 -> 2824 bytes PythonEnv/2.7/Lib/encodings/mac_greek.py | 307 ++ PythonEnv/2.7/Lib/encodings/mac_greek.pyc | Bin 0 -> 2864 bytes PythonEnv/2.7/Lib/encodings/mac_iceland.py | 307 ++ PythonEnv/2.7/Lib/encodings/mac_iceland.pyc | Bin 0 -> 2903 bytes PythonEnv/2.7/Lib/encodings/mac_latin2.py | 183 + PythonEnv/2.7/Lib/encodings/mac_latin2.pyc | Bin 0 -> 4882 bytes PythonEnv/2.7/Lib/encodings/mac_roman.py | 307 ++ PythonEnv/2.7/Lib/encodings/mac_roman.pyc | Bin 0 -> 2881 bytes PythonEnv/2.7/Lib/encodings/mac_romanian.py | 307 ++ PythonEnv/2.7/Lib/encodings/mac_romanian.pyc | Bin 0 -> 2921 bytes PythonEnv/2.7/Lib/encodings/mac_turkish.py | 307 ++ PythonEnv/2.7/Lib/encodings/mac_turkish.pyc | Bin 0 -> 2904 bytes PythonEnv/2.7/Lib/encodings/mbcs.py | 47 + PythonEnv/2.7/Lib/encodings/mbcs.pyc | Bin 0 -> 2003 bytes PythonEnv/2.7/Lib/encodings/palmos.py | 83 + PythonEnv/2.7/Lib/encodings/palmos.pyc | Bin 0 -> 3041 bytes PythonEnv/2.7/Lib/encodings/ptcp154.py | 175 + PythonEnv/2.7/Lib/encodings/ptcp154.pyc | Bin 0 -> 4865 bytes PythonEnv/2.7/Lib/encodings/punycode.py | 238 + PythonEnv/2.7/Lib/encodings/punycode.pyc | Bin 0 -> 7915 bytes PythonEnv/2.7/Lib/encodings/quopri_codec.py | 75 + PythonEnv/2.7/Lib/encodings/quopri_codec.pyc | Bin 0 -> 3560 bytes .../2.7/Lib/encodings/raw_unicode_escape.py | 45 + .../2.7/Lib/encodings/raw_unicode_escape.pyc | Bin 0 -> 2183 bytes PythonEnv/2.7/Lib/encodings/rot_13.py | 118 + PythonEnv/2.7/Lib/encodings/rot_13.pyc | Bin 0 -> 3593 bytes PythonEnv/2.7/Lib/encodings/shift_jis.py | 39 + PythonEnv/2.7/Lib/encodings/shift_jis.pyc | Bin 0 -> 1775 bytes PythonEnv/2.7/Lib/encodings/shift_jis_2004.py | 39 + .../2.7/Lib/encodings/shift_jis_2004.pyc | Bin 0 -> 1815 bytes PythonEnv/2.7/Lib/encodings/shift_jisx0213.py | 39 + .../2.7/Lib/encodings/shift_jisx0213.pyc | Bin 0 -> 1815 bytes PythonEnv/2.7/Lib/encodings/string_escape.py | 38 + PythonEnv/2.7/Lib/encodings/string_escape.pyc | Bin 0 -> 2042 bytes PythonEnv/2.7/Lib/encodings/tis_620.py | 307 ++ PythonEnv/2.7/Lib/encodings/tis_620.pyc | Bin 0 -> 2913 bytes PythonEnv/2.7/Lib/encodings/undefined.py | 49 + PythonEnv/2.7/Lib/encodings/undefined.pyc | Bin 0 -> 2564 bytes PythonEnv/2.7/Lib/encodings/unicode_escape.py | 45 + .../2.7/Lib/encodings/unicode_escape.pyc | Bin 0 -> 2131 bytes .../2.7/Lib/encodings/unicode_internal.py | 45 + .../2.7/Lib/encodings/unicode_internal.pyc | Bin 0 -> 2157 bytes PythonEnv/2.7/Lib/encodings/utf_16.py | 126 + PythonEnv/2.7/Lib/encodings/utf_16.pyc | Bin 0 -> 5108 bytes PythonEnv/2.7/Lib/encodings/utf_16_be.py | 42 + PythonEnv/2.7/Lib/encodings/utf_16_be.pyc | Bin 0 -> 1974 bytes PythonEnv/2.7/Lib/encodings/utf_16_le.py | 42 + PythonEnv/2.7/Lib/encodings/utf_16_le.pyc | Bin 0 -> 1974 bytes PythonEnv/2.7/Lib/encodings/utf_32.py | 150 + PythonEnv/2.7/Lib/encodings/utf_32.pyc | Bin 0 -> 5666 bytes PythonEnv/2.7/Lib/encodings/utf_32_be.py | 37 + PythonEnv/2.7/Lib/encodings/utf_32_be.pyc | Bin 0 -> 1867 bytes PythonEnv/2.7/Lib/encodings/utf_32_le.py | 37 + PythonEnv/2.7/Lib/encodings/utf_32_le.pyc | Bin 0 -> 1867 bytes PythonEnv/2.7/Lib/encodings/utf_7.py | 38 + PythonEnv/2.7/Lib/encodings/utf_7.pyc | Bin 0 -> 1867 bytes PythonEnv/2.7/Lib/encodings/utf_8.py | 42 + PythonEnv/2.7/Lib/encodings/utf_8.pyc | Bin 0 -> 1926 bytes PythonEnv/2.7/Lib/encodings/utf_8_sig.py | 117 + PythonEnv/2.7/Lib/encodings/utf_8_sig.pyc | Bin 0 -> 4925 bytes PythonEnv/2.7/Lib/encodings/uu_codec.py | 129 + PythonEnv/2.7/Lib/encodings/uu_codec.pyc | Bin 0 -> 4841 bytes PythonEnv/2.7/Lib/encodings/zlib_codec.py | 102 + PythonEnv/2.7/Lib/encodings/zlib_codec.pyc | Bin 0 -> 4563 bytes PythonEnv/2.7/Lib/fnmatch.py | 116 + PythonEnv/2.7/Lib/fnmatch.pyc | Bin 0 -> 3756 bytes PythonEnv/2.7/Lib/genericpath.py | 105 + PythonEnv/2.7/Lib/genericpath.pyc | Bin 0 -> 3633 bytes PythonEnv/2.7/Lib/linecache.py | 135 + PythonEnv/2.7/Lib/linecache.pyc | Bin 0 -> 3433 bytes PythonEnv/2.7/Lib/locale.py | 1882 ++++++++ PythonEnv/2.7/Lib/locale.pyc | Bin 0 -> 51088 bytes PythonEnv/2.7/Lib/no-global-site-packages.txt | 0 PythonEnv/2.7/Lib/ntpath.py | 533 +++ PythonEnv/2.7/Lib/ntpath.pyc | Bin 0 -> 12621 bytes PythonEnv/2.7/Lib/orig-prefix.txt | 1 + PythonEnv/2.7/Lib/os.py | 740 ++++ PythonEnv/2.7/Lib/os.pyc | Bin 0 -> 27518 bytes PythonEnv/2.7/Lib/posixpath.py | 431 ++ PythonEnv/2.7/Lib/posixpath.pyc | Bin 0 -> 12185 bytes PythonEnv/2.7/Lib/re.py | 324 ++ PythonEnv/2.7/Lib/re.pyc | Bin 0 -> 13871 bytes .../Lib/site-packages/_markerlib/__init__.py | 16 + .../Lib/site-packages/_markerlib/__init__.pyc | Bin 0 -> 1292 bytes .../Lib/site-packages/_markerlib/markers.py | 119 + .../Lib/site-packages/_markerlib/markers.pyc | Bin 0 -> 5570 bytes .../2.7/Lib/site-packages/easy_install.py | 5 + .../2.7/Lib/site-packages/easy_install.pyc | Bin 0 -> 354 bytes .../pip-1.4.1-py2.7.egg-info/PKG-INFO | 87 + .../pip-1.4.1-py2.7.egg-info/SOURCES.txt | 116 + .../dependency_links.txt | 1 + .../pip-1.4.1-py2.7.egg-info/entry_points.txt | 4 + .../pip-1.4.1-py2.7.egg-info/not-zip-safe | 1 + .../pip-1.4.1-py2.7.egg-info/requires.txt | 7 + .../pip-1.4.1-py2.7.egg-info/top_level.txt | 1 + .../2.7/Lib/site-packages/pip/__init__.py | 235 + .../2.7/Lib/site-packages/pip/__init__.pyc | Bin 0 -> 8247 bytes .../2.7/Lib/site-packages/pip/__main__.py | 7 + .../2.7/Lib/site-packages/pip/__main__.pyc | Bin 0 -> 340 bytes .../pip/backwardcompat/__init__.py | 125 + .../pip/backwardcompat/__init__.pyc | Bin 0 -> 5529 bytes .../pip/backwardcompat/ssl_match_hostname.py | 68 + .../pip/backwardcompat/ssl_match_hostname.pyc | Bin 0 -> 2610 bytes .../2.7/Lib/site-packages/pip/basecommand.py | 207 + .../2.7/Lib/site-packages/pip/basecommand.pyc | Bin 0 -> 7170 bytes .../2.7/Lib/site-packages/pip/baseparser.py | 368 ++ .../2.7/Lib/site-packages/pip/baseparser.pyc | Bin 0 -> 13258 bytes .../2.7/Lib/site-packages/pip/cacert.pem | 3895 +++++++++++++++++ .../2.7/Lib/site-packages/pip/cmdoptions.py | 190 + .../2.7/Lib/site-packages/pip/cmdoptions.pyc | Bin 0 -> 4780 bytes .../site-packages/pip/commands/__init__.py | 88 + .../site-packages/pip/commands/__init__.pyc | Bin 0 -> 2808 bytes .../Lib/site-packages/pip/commands/bundle.py | 53 + .../Lib/site-packages/pip/commands/bundle.pyc | Bin 0 -> 2755 bytes .../site-packages/pip/commands/completion.py | 59 + .../site-packages/pip/commands/completion.pyc | Bin 0 -> 2537 bytes .../Lib/site-packages/pip/commands/freeze.py | 113 + .../Lib/site-packages/pip/commands/freeze.pyc | Bin 0 -> 4705 bytes .../Lib/site-packages/pip/commands/help.py | 33 + .../Lib/site-packages/pip/commands/help.pyc | Bin 0 -> 1428 bytes .../Lib/site-packages/pip/commands/install.py | 271 ++ .../site-packages/pip/commands/install.pyc | Bin 0 -> 8887 bytes .../Lib/site-packages/pip/commands/list.py | 147 + .../Lib/site-packages/pip/commands/list.pyc | Bin 0 -> 6463 bytes .../Lib/site-packages/pip/commands/search.py | 130 + .../Lib/site-packages/pip/commands/search.pyc | Bin 0 -> 5726 bytes .../Lib/site-packages/pip/commands/show.py | 79 + .../Lib/site-packages/pip/commands/show.pyc | Bin 0 -> 3547 bytes .../site-packages/pip/commands/uninstall.py | 54 + .../site-packages/pip/commands/uninstall.pyc | Bin 0 -> 2743 bytes .../Lib/site-packages/pip/commands/unzip.py | 7 + .../Lib/site-packages/pip/commands/unzip.pyc | Bin 0 -> 586 bytes .../Lib/site-packages/pip/commands/wheel.py | 158 + .../Lib/site-packages/pip/commands/wheel.pyc | Bin 0 -> 5527 bytes .../2.7/Lib/site-packages/pip/commands/zip.py | 348 ++ .../Lib/site-packages/pip/commands/zip.pyc | Bin 0 -> 12107 bytes .../2.7/Lib/site-packages/pip/download.py | 653 +++ .../2.7/Lib/site-packages/pip/download.pyc | Bin 0 -> 23806 bytes .../2.7/Lib/site-packages/pip/exceptions.py | 38 + .../2.7/Lib/site-packages/pip/exceptions.pyc | Bin 0 -> 2880 bytes PythonEnv/2.7/Lib/site-packages/pip/index.py | 1041 +++++ PythonEnv/2.7/Lib/site-packages/pip/index.pyc | Bin 0 -> 37796 bytes .../2.7/Lib/site-packages/pip/locations.py | 156 + .../2.7/Lib/site-packages/pip/locations.pyc | Bin 0 -> 5460 bytes PythonEnv/2.7/Lib/site-packages/pip/log.py | 187 + PythonEnv/2.7/Lib/site-packages/pip/log.pyc | Bin 0 -> 7579 bytes .../2.7/Lib/site-packages/pip/pep425tags.py | 102 + .../2.7/Lib/site-packages/pip/pep425tags.pyc | Bin 0 -> 3346 bytes PythonEnv/2.7/Lib/site-packages/pip/req.py | 1734 ++++++++ PythonEnv/2.7/Lib/site-packages/pip/req.pyc | Bin 0 -> 60020 bytes PythonEnv/2.7/Lib/site-packages/pip/runner.py | 18 + .../2.7/Lib/site-packages/pip/runner.pyc | Bin 0 -> 677 bytes .../2.7/Lib/site-packages/pip/status_codes.py | 5 + .../Lib/site-packages/pip/status_codes.pyc | Bin 0 -> 327 bytes PythonEnv/2.7/Lib/site-packages/pip/util.py | 693 +++ PythonEnv/2.7/Lib/site-packages/pip/util.pyc | Bin 0 -> 26305 bytes .../2.7/Lib/site-packages/pip/vcs/__init__.py | 251 ++ .../Lib/site-packages/pip/vcs/__init__.pyc | Bin 0 -> 11818 bytes .../2.7/Lib/site-packages/pip/vcs/bazaar.py | 131 + .../2.7/Lib/site-packages/pip/vcs/bazaar.pyc | Bin 0 -> 6339 bytes .../2.7/Lib/site-packages/pip/vcs/git.py | 194 + .../2.7/Lib/site-packages/pip/vcs/git.pyc | Bin 0 -> 8737 bytes .../Lib/site-packages/pip/vcs/mercurial.py | 151 + .../Lib/site-packages/pip/vcs/mercurial.pyc | Bin 0 -> 7095 bytes .../Lib/site-packages/pip/vcs/subversion.py | 273 ++ .../Lib/site-packages/pip/vcs/subversion.pyc | Bin 0 -> 10698 bytes .../Lib/site-packages/pip/vendor/__init__.py | 8 + .../Lib/site-packages/pip/vendor/__init__.pyc | Bin 0 -> 490 bytes .../pip/vendor/distlib/__init__.py | 22 + .../pip/vendor/distlib/__init__.pyc | Bin 0 -> 1338 bytes .../pip/vendor/distlib/_backport/__init__.py | 6 + .../pip/vendor/distlib/_backport/__init__.pyc | Bin 0 -> 489 bytes .../pip/vendor/distlib/_backport/misc.py | 41 + .../pip/vendor/distlib/_backport/misc.pyc | Bin 0 -> 1580 bytes .../pip/vendor/distlib/_backport/shutil.py | 761 ++++ .../pip/vendor/distlib/_backport/shutil.pyc | Bin 0 -> 28060 bytes .../pip/vendor/distlib/_backport/sysconfig.py | 787 ++++ .../vendor/distlib/_backport/sysconfig.pyc | Bin 0 -> 22090 bytes .../pip/vendor/distlib/_backport/tarfile.py | 2607 +++++++++++ .../pip/vendor/distlib/_backport/tarfile.pyc | Bin 0 -> 85592 bytes .../pip/vendor/distlib/compat.py | 754 ++++ .../pip/vendor/distlib/compat.pyc | Bin 0 -> 31683 bytes .../pip/vendor/distlib/database.py | 1301 ++++++ .../pip/vendor/distlib/database.pyc | Bin 0 -> 52143 bytes .../site-packages/pip/vendor/distlib/index.py | 515 +++ .../pip/vendor/distlib/index.pyc | Bin 0 -> 21368 bytes .../pip/vendor/distlib/locators.py | 1131 +++++ .../pip/vendor/distlib/locators.pyc | Bin 0 -> 45269 bytes .../pip/vendor/distlib/manifest.py | 361 ++ .../pip/vendor/distlib/manifest.pyc | Bin 0 -> 12454 bytes .../pip/vendor/distlib/markers.py | 189 + .../pip/vendor/distlib/markers.pyc | Bin 0 -> 9174 bytes .../pip/vendor/distlib/metadata.py | 708 +++ .../pip/vendor/distlib/metadata.pyc | Bin 0 -> 27613 bytes .../pip/vendor/distlib/resources.py | 304 ++ .../pip/vendor/distlib/resources.pyc | Bin 0 -> 14530 bytes .../pip/vendor/distlib/scripts.py | 253 ++ .../pip/vendor/distlib/scripts.pyc | Bin 0 -> 8838 bytes .../site-packages/pip/vendor/distlib/util.py | 1313 ++++++ .../site-packages/pip/vendor/distlib/util.pyc | Bin 0 -> 51522 bytes .../pip/vendor/distlib/version.py | 719 +++ .../pip/vendor/distlib/version.pyc | Bin 0 -> 29953 bytes .../site-packages/pip/vendor/distlib/wheel.py | 638 +++ .../pip/vendor/distlib/wheel.pyc | Bin 0 -> 21389 bytes .../pip/vendor/html5lib/__init__.py | 23 + .../pip/vendor/html5lib/__init__.pyc | Bin 0 -> 1135 bytes .../pip/vendor/html5lib/constants.py | 3086 +++++++++++++ .../pip/vendor/html5lib/constants.pyc | Bin 0 -> 86306 bytes .../pip/vendor/html5lib/filters/__init__.py | 0 .../pip/vendor/html5lib/filters/__init__.pyc | Bin 0 -> 198 bytes .../pip/vendor/html5lib/filters/_base.py | 12 + .../pip/vendor/html5lib/filters/_base.pyc | Bin 0 -> 1301 bytes .../filters/alphabeticalattributes.py | 20 + .../filters/alphabeticalattributes.pyc | Bin 0 -> 1547 bytes .../html5lib/filters/inject_meta_charset.py | 65 + .../html5lib/filters/inject_meta_charset.pyc | Bin 0 -> 2406 bytes .../pip/vendor/html5lib/filters/lint.py | 93 + .../pip/vendor/html5lib/filters/lint.pyc | Bin 0 -> 3643 bytes .../vendor/html5lib/filters/optionaltags.py | 205 + .../vendor/html5lib/filters/optionaltags.pyc | Bin 0 -> 4616 bytes .../pip/vendor/html5lib/filters/sanitizer.py | 12 + .../pip/vendor/html5lib/filters/sanitizer.pyc | Bin 0 -> 1025 bytes .../pip/vendor/html5lib/filters/whitespace.py | 38 + .../vendor/html5lib/filters/whitespace.pyc | Bin 0 -> 1816 bytes .../pip/vendor/html5lib/html5parser.py | 2725 ++++++++++++ .../pip/vendor/html5lib/html5parser.pyc | Bin 0 -> 134117 bytes .../pip/vendor/html5lib/ihatexml.py | 285 ++ .../pip/vendor/html5lib/ihatexml.pyc | Bin 0 -> 16158 bytes .../pip/vendor/html5lib/inputstream.py | 881 ++++ .../pip/vendor/html5lib/inputstream.pyc | Bin 0 -> 29629 bytes .../pip/vendor/html5lib/sanitizer.py | 271 ++ .../pip/vendor/html5lib/sanitizer.pyc | Bin 0 -> 14580 bytes .../vendor/html5lib/serializer/__init__.py | 16 + .../vendor/html5lib/serializer/__init__.pyc | Bin 0 -> 942 bytes .../html5lib/serializer/htmlserializer.py | 309 ++ .../html5lib/serializer/htmlserializer.pyc | Bin 0 -> 11408 bytes .../pip/vendor/html5lib/tokenizer.py | 1731 ++++++++ .../pip/vendor/html5lib/tokenizer.pyc | Bin 0 -> 56828 bytes .../vendor/html5lib/treebuilders/__init__.py | 76 + .../vendor/html5lib/treebuilders/__init__.pyc | Bin 0 -> 3457 bytes .../pip/vendor/html5lib/treebuilders/_base.py | 377 ++ .../vendor/html5lib/treebuilders/_base.pyc | Bin 0 -> 15572 bytes .../pip/vendor/html5lib/treebuilders/dom.py | 290 ++ .../pip/vendor/html5lib/treebuilders/dom.pyc | Bin 0 -> 14622 bytes .../pip/vendor/html5lib/treebuilders/etree.py | 337 ++ .../vendor/html5lib/treebuilders/etree.pyc | Bin 0 -> 16360 bytes .../html5lib/treebuilders/etree_lxml.py | 369 ++ .../html5lib/treebuilders/etree_lxml.pyc | Bin 0 -> 16624 bytes .../vendor/html5lib/treewalkers/__init__.py | 57 + .../vendor/html5lib/treewalkers/__init__.pyc | Bin 0 -> 2548 bytes .../pip/vendor/html5lib/treewalkers/_base.py | 196 + .../pip/vendor/html5lib/treewalkers/_base.pyc | Bin 0 -> 9344 bytes .../pip/vendor/html5lib/treewalkers/dom.py | 46 + .../pip/vendor/html5lib/treewalkers/dom.pyc | Bin 0 -> 2507 bytes .../pip/vendor/html5lib/treewalkers/etree.py | 131 + .../pip/vendor/html5lib/treewalkers/etree.pyc | Bin 0 -> 4626 bytes .../html5lib/treewalkers/genshistream.py | 69 + .../html5lib/treewalkers/genshistream.pyc | Bin 0 -> 2601 bytes .../vendor/html5lib/treewalkers/lxmletree.py | 208 + .../vendor/html5lib/treewalkers/lxmletree.pyc | Bin 0 -> 10348 bytes .../vendor/html5lib/treewalkers/pulldom.py | 63 + .../vendor/html5lib/treewalkers/pulldom.pyc | Bin 0 -> 2520 bytes .../pip/vendor/html5lib/trie/__init__.py | 12 + .../pip/vendor/html5lib/trie/__init__.pyc | Bin 0 -> 479 bytes .../pip/vendor/html5lib/trie/_base.py | 37 + .../pip/vendor/html5lib/trie/_base.pyc | Bin 0 -> 1973 bytes .../pip/vendor/html5lib/trie/datrie.py | 44 + .../pip/vendor/html5lib/trie/datrie.pyc | Bin 0 -> 3185 bytes .../pip/vendor/html5lib/trie/py.py | 67 + .../pip/vendor/html5lib/trie/py.pyc | Bin 0 -> 3388 bytes .../pip/vendor/html5lib/utils.py | 78 + .../pip/vendor/html5lib/utils.pyc | Bin 0 -> 3434 bytes .../2.7/Lib/site-packages/pip/vendor/six.py | 404 ++ .../2.7/Lib/site-packages/pip/vendor/six.pyc | Bin 0 -> 15686 bytes PythonEnv/2.7/Lib/site-packages/pip/wheel.py | 335 ++ PythonEnv/2.7/Lib/site-packages/pip/wheel.pyc | Bin 0 -> 14032 bytes .../2.7/Lib/site-packages/pkg_resources.py | 3029 +++++++++++++ .../2.7/Lib/site-packages/pkg_resources.pyc | Bin 0 -> 118433 bytes .../setuptools-0.9.8-py2.7.egg-info/PKG-INFO | 960 ++++ .../SOURCES.txt | 132 + .../dependency_links.txt | 6 + .../entry_points.txt | 62 + .../entry_points.txt.orig | 62 + .../requires.txt | 13 + .../top_level.txt | 4 + .../setuptools-0.9.8-py2.7.egg-info/zip-safe | 1 + .../Lib/site-packages/setuptools/__init__.py | 94 + .../Lib/site-packages/setuptools/__init__.pyc | Bin 0 -> 4216 bytes .../setuptools/_backport/__init__.py | 0 .../setuptools/_backport/__init__.pyc | Bin 0 -> 191 bytes .../setuptools/_backport/hashlib/__init__.py | 146 + .../setuptools/_backport/hashlib/__init__.pyc | Bin 0 -> 4847 bytes .../setuptools/_backport/hashlib/_sha.py | 359 ++ .../setuptools/_backport/hashlib/_sha.pyc | Bin 0 -> 9874 bytes .../setuptools/_backport/hashlib/_sha256.py | 260 ++ .../setuptools/_backport/hashlib/_sha256.pyc | Bin 0 -> 16462 bytes .../setuptools/_backport/hashlib/_sha512.py | 288 ++ .../setuptools/_backport/hashlib/_sha512.pyc | Bin 0 -> 19417 bytes .../site-packages/setuptools/archive_util.py | 210 + .../site-packages/setuptools/archive_util.pyc | Bin 0 -> 6449 bytes .../Lib/site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli-arm-32.exe | Bin 0 -> 69120 bytes .../2.7/Lib/site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 21 + .../setuptools/command/__init__.pyc | Bin 0 -> 959 bytes .../site-packages/setuptools/command/alias.py | 82 + .../setuptools/command/alias.pyc | Bin 0 -> 3504 bytes .../setuptools/command/bdist_egg.py | 553 +++ .../setuptools/command/bdist_egg.pyc | Bin 0 -> 19633 bytes .../setuptools/command/bdist_rpm.py | 82 + .../setuptools/command/bdist_rpm.pyc | Bin 0 -> 2527 bytes .../setuptools/command/bdist_wininst.py | 82 + .../setuptools/command/bdist_wininst.pyc | Bin 0 -> 2671 bytes .../setuptools/command/build_ext.py | 298 ++ .../setuptools/command/build_ext.pyc | Bin 0 -> 10990 bytes .../setuptools/command/build_py.py | 280 ++ .../setuptools/command/build_py.pyc | Bin 0 -> 12692 bytes .../setuptools/command/develop.py | 167 + .../setuptools/command/develop.pyc | Bin 0 -> 6131 bytes .../setuptools/command/easy_install.py | 2002 +++++++++ .../setuptools/command/easy_install.pyc | Bin 0 -> 71108 bytes .../setuptools/command/egg_info.py | 489 +++ .../setuptools/command/egg_info.pyc | Bin 0 -> 18970 bytes .../setuptools/command/install.py | 124 + .../setuptools/command/install.pyc | Bin 0 -> 4114 bytes .../setuptools/command/install_egg_info.py | 125 + .../setuptools/command/install_egg_info.pyc | Bin 0 -> 5057 bytes .../setuptools/command/install_lib.py | 82 + .../setuptools/command/install_lib.pyc | Bin 0 -> 3532 bytes .../setuptools/command/install_scripts.py | 54 + .../setuptools/command/install_scripts.pyc | Bin 0 -> 2796 bytes .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/register.py | 10 + .../setuptools/command/register.pyc | Bin 0 -> 809 bytes .../setuptools/command/rotate.py | 83 + .../setuptools/command/rotate.pyc | Bin 0 -> 3146 bytes .../setuptools/command/saveopts.py | 24 + .../setuptools/command/saveopts.pyc | Bin 0 -> 1348 bytes .../site-packages/setuptools/command/sdist.py | 304 ++ .../setuptools/command/sdist.pyc | Bin 0 -> 10827 bytes .../setuptools/command/setopt.py | 164 + .../setuptools/command/setopt.pyc | Bin 0 -> 6440 bytes .../site-packages/setuptools/command/test.py | 198 + .../site-packages/setuptools/command/test.pyc | Bin 0 -> 6289 bytes .../setuptools/command/upload.py | 184 + .../setuptools/command/upload.pyc | Bin 0 -> 6669 bytes .../setuptools/command/upload_docs.py | 203 + .../setuptools/command/upload_docs.pyc | Bin 0 -> 7529 bytes .../Lib/site-packages/setuptools/compat.py | 97 + .../Lib/site-packages/setuptools/compat.pyc | Bin 0 -> 5090 bytes .../Lib/site-packages/setuptools/depends.py | 246 ++ .../Lib/site-packages/setuptools/depends.pyc | Bin 0 -> 7233 bytes .../2.7/Lib/site-packages/setuptools/dist.py | 892 ++++ .../2.7/Lib/site-packages/setuptools/dist.pyc | Bin 0 -> 33320 bytes .../Lib/site-packages/setuptools/extension.py | 46 + .../site-packages/setuptools/extension.pyc | Bin 0 -> 2585 bytes .../Lib/site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui-arm-32.exe | Bin 0 -> 69120 bytes .../2.7/Lib/site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/package_index.py | 988 +++++ .../setuptools/package_index.pyc | Bin 0 -> 38296 bytes .../site-packages/setuptools/py24compat.py | 17 + .../site-packages/setuptools/py24compat.pyc | Bin 0 -> 883 bytes .../site-packages/setuptools/py27compat.py | 15 + .../site-packages/setuptools/py27compat.pyc | Bin 0 -> 860 bytes .../Lib/site-packages/setuptools/sandbox.py | 324 ++ .../Lib/site-packages/setuptools/sandbox.pyc | Bin 0 -> 13316 bytes .../setuptools/script template (dev).py | 9 + .../setuptools/script template (dev).pyc | Bin 0 -> 488 bytes .../setuptools/script template.py | 4 + .../setuptools/script template.pyc | Bin 0 -> 314 bytes .../site-packages/setuptools/site-patch.py | 83 + .../site-packages/setuptools/site-patch.pyc | Bin 0 -> 1839 bytes .../site-packages/setuptools/ssl_support.py | 255 ++ .../site-packages/setuptools/ssl_support.pyc | Bin 0 -> 9114 bytes .../setuptools/tests/__init__.py | 352 ++ .../setuptools/tests/__init__.pyc | Bin 0 -> 15315 bytes .../site-packages/setuptools/tests/doctest.py | 2683 ++++++++++++ .../setuptools/tests/doctest.pyc | Bin 0 -> 86303 bytes .../setuptools/tests/py26compat.py | 14 + .../setuptools/tests/py26compat.pyc | Bin 0 -> 951 bytes .../site-packages/setuptools/tests/server.py | 82 + .../site-packages/setuptools/tests/server.pyc | Bin 0 -> 4663 bytes .../setuptools/tests/test_bdist_egg.py | 69 + .../setuptools/tests/test_bdist_egg.pyc | Bin 0 -> 3182 bytes .../setuptools/tests/test_build_ext.py | 20 + .../setuptools/tests/test_build_ext.pyc | Bin 0 -> 1267 bytes .../setuptools/tests/test_develop.py | 122 + .../setuptools/tests/test_develop.pyc | Bin 0 -> 4315 bytes .../setuptools/tests/test_dist_info.py | 83 + .../setuptools/tests/test_dist_info.pyc | Bin 0 -> 3740 bytes .../setuptools/tests/test_easy_install.py | 426 ++ .../setuptools/tests/test_easy_install.pyc | Bin 0 -> 18379 bytes .../setuptools/tests/test_egg_info.py | 40 + .../setuptools/tests/test_egg_info.pyc | Bin 0 -> 2419 bytes .../setuptools/tests/test_markerlib.py | 68 + .../setuptools/tests/test_markerlib.pyc | Bin 0 -> 3044 bytes .../setuptools/tests/test_packageindex.py | 187 + .../setuptools/tests/test_packageindex.pyc | Bin 0 -> 10016 bytes .../setuptools/tests/test_resources.py | 615 +++ .../setuptools/tests/test_resources.pyc | Bin 0 -> 29508 bytes .../setuptools/tests/test_sandbox.py | 66 + .../setuptools/tests/test_sandbox.pyc | Bin 0 -> 3411 bytes .../setuptools/tests/test_sdist.py | 400 ++ .../setuptools/tests/test_sdist.pyc | Bin 0 -> 11272 bytes .../setuptools/tests/test_test.py | 124 + .../setuptools/tests/test_test.pyc | Bin 0 -> 4197 bytes .../setuptools/tests/test_upload_docs.py | 72 + .../setuptools/tests/test_upload_docs.pyc | Bin 0 -> 2853 bytes PythonEnv/2.7/Lib/site.py | 758 ++++ PythonEnv/2.7/Lib/site.pyc | Bin 0 -> 25343 bytes PythonEnv/2.7/Lib/sre.py | 13 + PythonEnv/2.7/Lib/sre_compile.py | 525 +++ PythonEnv/2.7/Lib/sre_compile.pyc | Bin 0 -> 11569 bytes PythonEnv/2.7/Lib/sre_constants.py | 259 ++ PythonEnv/2.7/Lib/sre_constants.pyc | Bin 0 -> 6302 bytes PythonEnv/2.7/Lib/sre_parse.py | 803 ++++ PythonEnv/2.7/Lib/sre_parse.pyc | Bin 0 -> 20820 bytes PythonEnv/2.7/Lib/stat.py | 96 + PythonEnv/2.7/Lib/stat.pyc | Bin 0 -> 3121 bytes PythonEnv/2.7/Lib/types.py | 84 + PythonEnv/2.7/Lib/types.pyc | Bin 0 -> 2728 bytes PythonEnv/2.7/Lib/warnings.py | 400 ++ PythonEnv/2.7/Lib/warnings.pyc | Bin 0 -> 13991 bytes PythonEnv/2.7/Scripts/activate | 80 + PythonEnv/2.7/Scripts/activate.bat | 26 + PythonEnv/2.7/Scripts/activate.ps1 | 148 + PythonEnv/2.7/Scripts/activate_this.py | 34 + PythonEnv/2.7/Scripts/deactivate.bat | 20 + .../2.7/Scripts/easy_install-2.7-script.py | 10 + PythonEnv/2.7/Scripts/easy_install-2.7.exe | Bin 0 -> 74752 bytes PythonEnv/2.7/Scripts/easy_install-script.py | 10 + PythonEnv/2.7/Scripts/easy_install.exe | Bin 0 -> 74752 bytes PythonEnv/2.7/Scripts/pip-2.7-script.py | 10 + PythonEnv/2.7/Scripts/pip-2.7.exe | Bin 0 -> 74752 bytes PythonEnv/2.7/Scripts/pip-script.py | 10 + PythonEnv/2.7/Scripts/pip.exe | Bin 0 -> 74752 bytes PythonEnv/2.7/Scripts/python.exe | Bin 0 -> 27136 bytes PythonEnv/2.7/Scripts/pythonw.exe | Bin 0 -> 27648 bytes 727 files changed, 111572 insertions(+) create mode 100644 PythonEnv/2.7/Include/Python-ast.h create mode 100644 PythonEnv/2.7/Include/Python.h create mode 100644 PythonEnv/2.7/Include/abstract.h create mode 100644 PythonEnv/2.7/Include/asdl.h create mode 100644 PythonEnv/2.7/Include/ast.h create mode 100644 PythonEnv/2.7/Include/bitset.h create mode 100644 PythonEnv/2.7/Include/boolobject.h create mode 100644 PythonEnv/2.7/Include/bufferobject.h create mode 100644 PythonEnv/2.7/Include/bytearrayobject.h create mode 100644 PythonEnv/2.7/Include/bytes_methods.h create mode 100644 PythonEnv/2.7/Include/bytesobject.h create mode 100644 PythonEnv/2.7/Include/cStringIO.h create mode 100644 PythonEnv/2.7/Include/cellobject.h create mode 100644 PythonEnv/2.7/Include/ceval.h create mode 100644 PythonEnv/2.7/Include/classobject.h create mode 100644 PythonEnv/2.7/Include/cobject.h create mode 100644 PythonEnv/2.7/Include/code.h create mode 100644 PythonEnv/2.7/Include/codecs.h create mode 100644 PythonEnv/2.7/Include/compile.h create mode 100644 PythonEnv/2.7/Include/complexobject.h create mode 100644 PythonEnv/2.7/Include/datetime.h create mode 100644 PythonEnv/2.7/Include/descrobject.h create mode 100644 PythonEnv/2.7/Include/dictobject.h create mode 100644 PythonEnv/2.7/Include/dtoa.h create mode 100644 PythonEnv/2.7/Include/enumobject.h create mode 100644 PythonEnv/2.7/Include/errcode.h create mode 100644 PythonEnv/2.7/Include/eval.h create mode 100644 PythonEnv/2.7/Include/fileobject.h create mode 100644 PythonEnv/2.7/Include/floatobject.h create mode 100644 PythonEnv/2.7/Include/frameobject.h create mode 100644 PythonEnv/2.7/Include/funcobject.h create mode 100644 PythonEnv/2.7/Include/genobject.h create mode 100644 PythonEnv/2.7/Include/graminit.h create mode 100644 PythonEnv/2.7/Include/grammar.h create mode 100644 PythonEnv/2.7/Include/import.h create mode 100644 PythonEnv/2.7/Include/intobject.h create mode 100644 PythonEnv/2.7/Include/intrcheck.h create mode 100644 PythonEnv/2.7/Include/iterobject.h create mode 100644 PythonEnv/2.7/Include/listobject.h create mode 100644 PythonEnv/2.7/Include/longintrepr.h create mode 100644 PythonEnv/2.7/Include/longobject.h create mode 100644 PythonEnv/2.7/Include/marshal.h create mode 100644 PythonEnv/2.7/Include/memoryobject.h create mode 100644 PythonEnv/2.7/Include/metagrammar.h create mode 100644 PythonEnv/2.7/Include/methodobject.h create mode 100644 PythonEnv/2.7/Include/modsupport.h create mode 100644 PythonEnv/2.7/Include/moduleobject.h create mode 100644 PythonEnv/2.7/Include/node.h create mode 100644 PythonEnv/2.7/Include/object.h create mode 100644 PythonEnv/2.7/Include/objimpl.h create mode 100644 PythonEnv/2.7/Include/opcode.h create mode 100644 PythonEnv/2.7/Include/osdefs.h create mode 100644 PythonEnv/2.7/Include/parsetok.h create mode 100644 PythonEnv/2.7/Include/patchlevel.h create mode 100644 PythonEnv/2.7/Include/pgen.h create mode 100644 PythonEnv/2.7/Include/pgenheaders.h create mode 100644 PythonEnv/2.7/Include/py_curses.h create mode 100644 PythonEnv/2.7/Include/pyarena.h create mode 100644 PythonEnv/2.7/Include/pycapsule.h create mode 100644 PythonEnv/2.7/Include/pyconfig.h create mode 100644 PythonEnv/2.7/Include/pyctype.h create mode 100644 PythonEnv/2.7/Include/pydebug.h create mode 100644 PythonEnv/2.7/Include/pyerrors.h create mode 100644 PythonEnv/2.7/Include/pyexpat.h create mode 100644 PythonEnv/2.7/Include/pyfpe.h create mode 100644 PythonEnv/2.7/Include/pygetopt.h create mode 100644 PythonEnv/2.7/Include/pymacconfig.h create mode 100644 PythonEnv/2.7/Include/pymactoolbox.h create mode 100644 PythonEnv/2.7/Include/pymath.h create mode 100644 PythonEnv/2.7/Include/pymem.h create mode 100644 PythonEnv/2.7/Include/pyport.h create mode 100644 PythonEnv/2.7/Include/pystate.h create mode 100644 PythonEnv/2.7/Include/pystrcmp.h create mode 100644 PythonEnv/2.7/Include/pystrtod.h create mode 100644 PythonEnv/2.7/Include/pythonrun.h create mode 100644 PythonEnv/2.7/Include/pythread.h create mode 100644 PythonEnv/2.7/Include/rangeobject.h create mode 100644 PythonEnv/2.7/Include/setobject.h create mode 100644 PythonEnv/2.7/Include/sliceobject.h create mode 100644 PythonEnv/2.7/Include/stringobject.h create mode 100644 PythonEnv/2.7/Include/structmember.h create mode 100644 PythonEnv/2.7/Include/structseq.h create mode 100644 PythonEnv/2.7/Include/symtable.h create mode 100644 PythonEnv/2.7/Include/sysmodule.h create mode 100644 PythonEnv/2.7/Include/timefuncs.h create mode 100644 PythonEnv/2.7/Include/token.h create mode 100644 PythonEnv/2.7/Include/traceback.h create mode 100644 PythonEnv/2.7/Include/tupleobject.h create mode 100644 PythonEnv/2.7/Include/ucnhash.h create mode 100644 PythonEnv/2.7/Include/unicodeobject.h create mode 100644 PythonEnv/2.7/Include/warnings.h create mode 100644 PythonEnv/2.7/Include/weakrefobject.h create mode 100644 PythonEnv/2.7/Lib/UserDict.py create mode 100644 PythonEnv/2.7/Lib/UserDict.pyc create mode 100644 PythonEnv/2.7/Lib/_abcoll.py create mode 100644 PythonEnv/2.7/Lib/_abcoll.pyc create mode 100644 PythonEnv/2.7/Lib/_weakrefset.py create mode 100644 PythonEnv/2.7/Lib/_weakrefset.pyc create mode 100644 PythonEnv/2.7/Lib/abc.py create mode 100644 PythonEnv/2.7/Lib/abc.pyc create mode 100644 PythonEnv/2.7/Lib/codecs.py create mode 100644 PythonEnv/2.7/Lib/codecs.pyc create mode 100644 PythonEnv/2.7/Lib/copy_reg.py create mode 100644 PythonEnv/2.7/Lib/copy_reg.pyc create mode 100644 PythonEnv/2.7/Lib/distutils/__init__.py create mode 100644 PythonEnv/2.7/Lib/distutils/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/distutils/distutils.cfg create mode 100644 PythonEnv/2.7/Lib/encodings/__init__.py create mode 100644 PythonEnv/2.7/Lib/encodings/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/__init__.pyo create mode 100644 PythonEnv/2.7/Lib/encodings/aliases.py create mode 100644 PythonEnv/2.7/Lib/encodings/aliases.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/aliases.pyo create mode 100644 PythonEnv/2.7/Lib/encodings/ascii.py create mode 100644 PythonEnv/2.7/Lib/encodings/ascii.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/base64_codec.py create mode 100644 PythonEnv/2.7/Lib/encodings/base64_codec.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/big5.py create mode 100644 PythonEnv/2.7/Lib/encodings/big5.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/big5hkscs.py create mode 100644 PythonEnv/2.7/Lib/encodings/big5hkscs.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/bz2_codec.py create mode 100644 PythonEnv/2.7/Lib/encodings/bz2_codec.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/charmap.py create mode 100644 PythonEnv/2.7/Lib/encodings/charmap.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp037.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp037.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp1006.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp1006.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp1026.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp1026.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp1140.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp1140.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp1250.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp1250.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp1251.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp1251.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp1252.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp1252.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp1253.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp1253.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp1254.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp1254.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp1255.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp1255.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp1256.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp1256.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp1257.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp1257.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp1258.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp1258.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp424.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp424.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp437.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp437.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp500.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp500.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp720.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp720.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp737.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp737.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp775.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp775.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp850.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp850.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp852.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp852.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp855.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp855.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp856.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp856.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp857.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp857.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp858.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp858.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp860.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp860.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp861.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp861.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp862.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp862.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp863.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp863.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp864.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp864.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp865.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp865.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp866.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp866.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp869.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp869.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp874.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp874.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp875.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp875.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp932.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp932.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp949.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp949.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/cp950.py create mode 100644 PythonEnv/2.7/Lib/encodings/cp950.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/euc_jis_2004.py create mode 100644 PythonEnv/2.7/Lib/encodings/euc_jis_2004.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/euc_jisx0213.py create mode 100644 PythonEnv/2.7/Lib/encodings/euc_jisx0213.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/euc_jp.py create mode 100644 PythonEnv/2.7/Lib/encodings/euc_jp.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/euc_kr.py create mode 100644 PythonEnv/2.7/Lib/encodings/euc_kr.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/gb18030.py create mode 100644 PythonEnv/2.7/Lib/encodings/gb18030.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/gb2312.py create mode 100644 PythonEnv/2.7/Lib/encodings/gb2312.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/gbk.py create mode 100644 PythonEnv/2.7/Lib/encodings/gbk.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/gbk.pyo create mode 100644 PythonEnv/2.7/Lib/encodings/hex_codec.py create mode 100644 PythonEnv/2.7/Lib/encodings/hex_codec.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/hp_roman8.py create mode 100644 PythonEnv/2.7/Lib/encodings/hp_roman8.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/hz.py create mode 100644 PythonEnv/2.7/Lib/encodings/hz.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/idna.py create mode 100644 PythonEnv/2.7/Lib/encodings/idna.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_1.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_1.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_2.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_2.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_2004.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_2004.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_3.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_3.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_ext.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_ext.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_kr.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_kr.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_1.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_1.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_10.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_10.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_11.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_11.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_13.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_13.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_14.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_14.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_15.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_15.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_16.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_16.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_2.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_2.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_3.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_3.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_4.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_4.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_5.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_5.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_6.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_6.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_7.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_7.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_8.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_8.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_9.py create mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_9.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/johab.py create mode 100644 PythonEnv/2.7/Lib/encodings/johab.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/koi8_r.py create mode 100644 PythonEnv/2.7/Lib/encodings/koi8_r.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/koi8_u.py create mode 100644 PythonEnv/2.7/Lib/encodings/koi8_u.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/latin_1.py create mode 100644 PythonEnv/2.7/Lib/encodings/latin_1.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/mac_arabic.py create mode 100644 PythonEnv/2.7/Lib/encodings/mac_arabic.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/mac_centeuro.py create mode 100644 PythonEnv/2.7/Lib/encodings/mac_centeuro.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/mac_croatian.py create mode 100644 PythonEnv/2.7/Lib/encodings/mac_croatian.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/mac_cyrillic.py create mode 100644 PythonEnv/2.7/Lib/encodings/mac_cyrillic.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/mac_farsi.py create mode 100644 PythonEnv/2.7/Lib/encodings/mac_farsi.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/mac_greek.py create mode 100644 PythonEnv/2.7/Lib/encodings/mac_greek.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/mac_iceland.py create mode 100644 PythonEnv/2.7/Lib/encodings/mac_iceland.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/mac_latin2.py create mode 100644 PythonEnv/2.7/Lib/encodings/mac_latin2.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/mac_roman.py create mode 100644 PythonEnv/2.7/Lib/encodings/mac_roman.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/mac_romanian.py create mode 100644 PythonEnv/2.7/Lib/encodings/mac_romanian.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/mac_turkish.py create mode 100644 PythonEnv/2.7/Lib/encodings/mac_turkish.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/mbcs.py create mode 100644 PythonEnv/2.7/Lib/encodings/mbcs.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/palmos.py create mode 100644 PythonEnv/2.7/Lib/encodings/palmos.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/ptcp154.py create mode 100644 PythonEnv/2.7/Lib/encodings/ptcp154.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/punycode.py create mode 100644 PythonEnv/2.7/Lib/encodings/punycode.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/quopri_codec.py create mode 100644 PythonEnv/2.7/Lib/encodings/quopri_codec.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/raw_unicode_escape.py create mode 100644 PythonEnv/2.7/Lib/encodings/raw_unicode_escape.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/rot_13.py create mode 100644 PythonEnv/2.7/Lib/encodings/rot_13.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/shift_jis.py create mode 100644 PythonEnv/2.7/Lib/encodings/shift_jis.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/shift_jis_2004.py create mode 100644 PythonEnv/2.7/Lib/encodings/shift_jis_2004.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/shift_jisx0213.py create mode 100644 PythonEnv/2.7/Lib/encodings/shift_jisx0213.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/string_escape.py create mode 100644 PythonEnv/2.7/Lib/encodings/string_escape.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/tis_620.py create mode 100644 PythonEnv/2.7/Lib/encodings/tis_620.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/undefined.py create mode 100644 PythonEnv/2.7/Lib/encodings/undefined.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/unicode_escape.py create mode 100644 PythonEnv/2.7/Lib/encodings/unicode_escape.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/unicode_internal.py create mode 100644 PythonEnv/2.7/Lib/encodings/unicode_internal.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/utf_16.py create mode 100644 PythonEnv/2.7/Lib/encodings/utf_16.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/utf_16_be.py create mode 100644 PythonEnv/2.7/Lib/encodings/utf_16_be.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/utf_16_le.py create mode 100644 PythonEnv/2.7/Lib/encodings/utf_16_le.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/utf_32.py create mode 100644 PythonEnv/2.7/Lib/encodings/utf_32.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/utf_32_be.py create mode 100644 PythonEnv/2.7/Lib/encodings/utf_32_be.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/utf_32_le.py create mode 100644 PythonEnv/2.7/Lib/encodings/utf_32_le.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/utf_7.py create mode 100644 PythonEnv/2.7/Lib/encodings/utf_7.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/utf_8.py create mode 100644 PythonEnv/2.7/Lib/encodings/utf_8.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/utf_8_sig.py create mode 100644 PythonEnv/2.7/Lib/encodings/utf_8_sig.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/uu_codec.py create mode 100644 PythonEnv/2.7/Lib/encodings/uu_codec.pyc create mode 100644 PythonEnv/2.7/Lib/encodings/zlib_codec.py create mode 100644 PythonEnv/2.7/Lib/encodings/zlib_codec.pyc create mode 100644 PythonEnv/2.7/Lib/fnmatch.py create mode 100644 PythonEnv/2.7/Lib/fnmatch.pyc create mode 100644 PythonEnv/2.7/Lib/genericpath.py create mode 100644 PythonEnv/2.7/Lib/genericpath.pyc create mode 100644 PythonEnv/2.7/Lib/linecache.py create mode 100644 PythonEnv/2.7/Lib/linecache.pyc create mode 100644 PythonEnv/2.7/Lib/locale.py create mode 100644 PythonEnv/2.7/Lib/locale.pyc create mode 100644 PythonEnv/2.7/Lib/no-global-site-packages.txt create mode 100644 PythonEnv/2.7/Lib/ntpath.py create mode 100644 PythonEnv/2.7/Lib/ntpath.pyc create mode 100644 PythonEnv/2.7/Lib/orig-prefix.txt create mode 100644 PythonEnv/2.7/Lib/os.py create mode 100644 PythonEnv/2.7/Lib/os.pyc create mode 100644 PythonEnv/2.7/Lib/posixpath.py create mode 100644 PythonEnv/2.7/Lib/posixpath.pyc create mode 100644 PythonEnv/2.7/Lib/re.py create mode 100644 PythonEnv/2.7/Lib/re.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/_markerlib/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/_markerlib/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/_markerlib/markers.py create mode 100644 PythonEnv/2.7/Lib/site-packages/_markerlib/markers.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/easy_install.py create mode 100644 PythonEnv/2.7/Lib/site-packages/easy_install.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/PKG-INFO create mode 100644 PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/SOURCES.txt create mode 100644 PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/dependency_links.txt create mode 100644 PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/entry_points.txt create mode 100644 PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/not-zip-safe create mode 100644 PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/requires.txt create mode 100644 PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/top_level.txt create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/__main__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/__main__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/ssl_match_hostname.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/ssl_match_hostname.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/basecommand.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/basecommand.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/baseparser.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/baseparser.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/cacert.pem create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/cmdoptions.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/cmdoptions.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/bundle.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/bundle.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/completion.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/completion.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/freeze.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/freeze.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/help.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/help.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/install.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/install.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/list.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/list.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/search.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/search.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/show.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/show.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/uninstall.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/uninstall.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/unzip.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/unzip.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/wheel.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/wheel.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/zip.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/zip.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/download.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/download.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/exceptions.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/exceptions.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/index.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/index.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/locations.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/locations.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/log.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/log.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/pep425tags.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/pep425tags.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/req.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/req.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/runner.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/runner.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/status_codes.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/status_codes.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/util.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/util.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/bazaar.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/bazaar.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/git.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/git.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/mercurial.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/mercurial.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/subversion.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/subversion.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/misc.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/misc.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/shutil.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/shutil.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/sysconfig.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/sysconfig.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/tarfile.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/tarfile.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/compat.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/compat.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/database.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/database.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/index.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/index.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/locators.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/locators.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/manifest.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/manifest.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/markers.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/markers.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/metadata.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/metadata.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/resources.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/resources.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/scripts.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/scripts.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/util.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/util.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/version.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/version.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/wheel.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/wheel.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/constants.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/constants.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/_base.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/_base.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/alphabeticalattributes.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/inject_meta_charset.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/inject_meta_charset.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/lint.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/lint.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/optionaltags.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/optionaltags.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/sanitizer.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/sanitizer.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/whitespace.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/whitespace.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/html5parser.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/html5parser.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/ihatexml.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/ihatexml.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/inputstream.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/inputstream.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/sanitizer.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/sanitizer.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/htmlserializer.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/htmlserializer.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/tokenizer.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/tokenizer.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/_base.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/_base.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/dom.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/dom.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree_lxml.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/_base.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/_base.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/dom.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/dom.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/etree.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/etree.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/genshistream.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/genshistream.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/lxmletree.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/lxmletree.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/pulldom.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/pulldom.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/_base.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/_base.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/datrie.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/datrie.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/py.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/py.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/utils.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/utils.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/six.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/six.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/wheel.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pip/wheel.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/pkg_resources.py create mode 100644 PythonEnv/2.7/Lib/site-packages/pkg_resources.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/PKG-INFO create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/SOURCES.txt create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/dependency_links.txt create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt.orig create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/requires.txt create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/top_level.txt create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/zip-safe create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha256.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha256.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha512.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha512.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/archive_util.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/archive_util.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/cli-32.exe create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/cli-64.exe create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/cli-arm-32.exe create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/cli.exe create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/alias.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/alias.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_egg.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_egg.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_rpm.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_rpm.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_wininst.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_wininst.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/build_ext.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/build_ext.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/build_py.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/build_py.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/develop.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/develop.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/easy_install.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/easy_install.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/egg_info.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/egg_info.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/install.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/install.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/install_egg_info.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/install_egg_info.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/install_lib.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/install_lib.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/install_scripts.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/install_scripts.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/launcher manifest.xml create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/register.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/register.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/rotate.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/rotate.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/saveopts.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/saveopts.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/sdist.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/sdist.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/setopt.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/setopt.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/test.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/test.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/upload.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/upload.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/upload_docs.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/upload_docs.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/compat.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/compat.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/depends.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/depends.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/dist.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/dist.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/extension.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/extension.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/gui-32.exe create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/gui-64.exe create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/gui-arm-32.exe create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/gui.exe create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/package_index.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/package_index.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/py24compat.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/py24compat.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/py27compat.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/py27compat.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/sandbox.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/sandbox.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/script template (dev).py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/script template (dev).pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/script template.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/script template.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/site-patch.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/site-patch.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/ssl_support.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/ssl_support.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/__init__.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/__init__.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/doctest.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/doctest.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/py26compat.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/py26compat.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/server.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/server.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_bdist_egg.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_bdist_egg.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_build_ext.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_build_ext.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_develop.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_develop.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_dist_info.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_dist_info.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_easy_install.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_easy_install.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_egg_info.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_egg_info.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_markerlib.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_markerlib.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_packageindex.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_packageindex.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_resources.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_resources.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sandbox.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sandbox.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sdist.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sdist.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_test.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_test.pyc create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_upload_docs.py create mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_upload_docs.pyc create mode 100644 PythonEnv/2.7/Lib/site.py create mode 100644 PythonEnv/2.7/Lib/site.pyc create mode 100644 PythonEnv/2.7/Lib/sre.py create mode 100644 PythonEnv/2.7/Lib/sre_compile.py create mode 100644 PythonEnv/2.7/Lib/sre_compile.pyc create mode 100644 PythonEnv/2.7/Lib/sre_constants.py create mode 100644 PythonEnv/2.7/Lib/sre_constants.pyc create mode 100644 PythonEnv/2.7/Lib/sre_parse.py create mode 100644 PythonEnv/2.7/Lib/sre_parse.pyc create mode 100644 PythonEnv/2.7/Lib/stat.py create mode 100644 PythonEnv/2.7/Lib/stat.pyc create mode 100644 PythonEnv/2.7/Lib/types.py create mode 100644 PythonEnv/2.7/Lib/types.pyc create mode 100644 PythonEnv/2.7/Lib/warnings.py create mode 100644 PythonEnv/2.7/Lib/warnings.pyc create mode 100644 PythonEnv/2.7/Scripts/activate create mode 100644 PythonEnv/2.7/Scripts/activate.bat create mode 100644 PythonEnv/2.7/Scripts/activate.ps1 create mode 100644 PythonEnv/2.7/Scripts/activate_this.py create mode 100644 PythonEnv/2.7/Scripts/deactivate.bat create mode 100644 PythonEnv/2.7/Scripts/easy_install-2.7-script.py create mode 100644 PythonEnv/2.7/Scripts/easy_install-2.7.exe create mode 100644 PythonEnv/2.7/Scripts/easy_install-script.py create mode 100644 PythonEnv/2.7/Scripts/easy_install.exe create mode 100644 PythonEnv/2.7/Scripts/pip-2.7-script.py create mode 100644 PythonEnv/2.7/Scripts/pip-2.7.exe create mode 100644 PythonEnv/2.7/Scripts/pip-script.py create mode 100644 PythonEnv/2.7/Scripts/pip.exe create mode 100644 PythonEnv/2.7/Scripts/python.exe create mode 100644 PythonEnv/2.7/Scripts/pythonw.exe diff --git a/PythonEnv/2.7/Include/Python-ast.h b/PythonEnv/2.7/Include/Python-ast.h new file mode 100644 index 0000000000..3f35bbb634 --- /dev/null +++ b/PythonEnv/2.7/Include/Python-ast.h @@ -0,0 +1,535 @@ +/* File automatically generated by Parser/asdl_c.py. */ + +#include "asdl.h" + +typedef struct _mod *mod_ty; + +typedef struct _stmt *stmt_ty; + +typedef struct _expr *expr_ty; + +typedef enum _expr_context { Load=1, Store=2, Del=3, AugLoad=4, AugStore=5, + Param=6 } expr_context_ty; + +typedef struct _slice *slice_ty; + +typedef enum _boolop { And=1, Or=2 } boolop_ty; + +typedef enum _operator { Add=1, Sub=2, Mult=3, Div=4, Mod=5, Pow=6, LShift=7, + RShift=8, BitOr=9, BitXor=10, BitAnd=11, FloorDiv=12 } + operator_ty; + +typedef enum _unaryop { Invert=1, Not=2, UAdd=3, USub=4 } unaryop_ty; + +typedef enum _cmpop { Eq=1, NotEq=2, Lt=3, LtE=4, Gt=5, GtE=6, Is=7, IsNot=8, + In=9, NotIn=10 } cmpop_ty; + +typedef struct _comprehension *comprehension_ty; + +typedef struct _excepthandler *excepthandler_ty; + +typedef struct _arguments *arguments_ty; + +typedef struct _keyword *keyword_ty; + +typedef struct _alias *alias_ty; + + +enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3, + Suite_kind=4}; +struct _mod { + enum _mod_kind kind; + union { + struct { + asdl_seq *body; + } Module; + + struct { + asdl_seq *body; + } Interactive; + + struct { + expr_ty body; + } Expression; + + struct { + asdl_seq *body; + } Suite; + + } v; +}; + +enum _stmt_kind {FunctionDef_kind=1, ClassDef_kind=2, Return_kind=3, + Delete_kind=4, Assign_kind=5, AugAssign_kind=6, Print_kind=7, + For_kind=8, While_kind=9, If_kind=10, With_kind=11, + Raise_kind=12, TryExcept_kind=13, TryFinally_kind=14, + Assert_kind=15, Import_kind=16, ImportFrom_kind=17, + Exec_kind=18, Global_kind=19, Expr_kind=20, Pass_kind=21, + Break_kind=22, Continue_kind=23}; +struct _stmt { + enum _stmt_kind kind; + union { + struct { + identifier name; + arguments_ty args; + asdl_seq *body; + asdl_seq *decorator_list; + } FunctionDef; + + struct { + identifier name; + asdl_seq *bases; + asdl_seq *body; + asdl_seq *decorator_list; + } ClassDef; + + struct { + expr_ty value; + } Return; + + struct { + asdl_seq *targets; + } Delete; + + struct { + asdl_seq *targets; + expr_ty value; + } Assign; + + struct { + expr_ty target; + operator_ty op; + expr_ty value; + } AugAssign; + + struct { + expr_ty dest; + asdl_seq *values; + bool nl; + } Print; + + struct { + expr_ty target; + expr_ty iter; + asdl_seq *body; + asdl_seq *orelse; + } For; + + struct { + expr_ty test; + asdl_seq *body; + asdl_seq *orelse; + } While; + + struct { + expr_ty test; + asdl_seq *body; + asdl_seq *orelse; + } If; + + struct { + expr_ty context_expr; + expr_ty optional_vars; + asdl_seq *body; + } With; + + struct { + expr_ty type; + expr_ty inst; + expr_ty tback; + } Raise; + + struct { + asdl_seq *body; + asdl_seq *handlers; + asdl_seq *orelse; + } TryExcept; + + struct { + asdl_seq *body; + asdl_seq *finalbody; + } TryFinally; + + struct { + expr_ty test; + expr_ty msg; + } Assert; + + struct { + asdl_seq *names; + } Import; + + struct { + identifier module; + asdl_seq *names; + int level; + } ImportFrom; + + struct { + expr_ty body; + expr_ty globals; + expr_ty locals; + } Exec; + + struct { + asdl_seq *names; + } Global; + + struct { + expr_ty value; + } Expr; + + } v; + int lineno; + int col_offset; +}; + +enum _expr_kind {BoolOp_kind=1, BinOp_kind=2, UnaryOp_kind=3, Lambda_kind=4, + IfExp_kind=5, Dict_kind=6, Set_kind=7, ListComp_kind=8, + SetComp_kind=9, DictComp_kind=10, GeneratorExp_kind=11, + Yield_kind=12, Compare_kind=13, Call_kind=14, Repr_kind=15, + Num_kind=16, Str_kind=17, Attribute_kind=18, + Subscript_kind=19, Name_kind=20, List_kind=21, Tuple_kind=22}; +struct _expr { + enum _expr_kind kind; + union { + struct { + boolop_ty op; + asdl_seq *values; + } BoolOp; + + struct { + expr_ty left; + operator_ty op; + expr_ty right; + } BinOp; + + struct { + unaryop_ty op; + expr_ty operand; + } UnaryOp; + + struct { + arguments_ty args; + expr_ty body; + } Lambda; + + struct { + expr_ty test; + expr_ty body; + expr_ty orelse; + } IfExp; + + struct { + asdl_seq *keys; + asdl_seq *values; + } Dict; + + struct { + asdl_seq *elts; + } Set; + + struct { + expr_ty elt; + asdl_seq *generators; + } ListComp; + + struct { + expr_ty elt; + asdl_seq *generators; + } SetComp; + + struct { + expr_ty key; + expr_ty value; + asdl_seq *generators; + } DictComp; + + struct { + expr_ty elt; + asdl_seq *generators; + } GeneratorExp; + + struct { + expr_ty value; + } Yield; + + struct { + expr_ty left; + asdl_int_seq *ops; + asdl_seq *comparators; + } Compare; + + struct { + expr_ty func; + asdl_seq *args; + asdl_seq *keywords; + expr_ty starargs; + expr_ty kwargs; + } Call; + + struct { + expr_ty value; + } Repr; + + struct { + object n; + } Num; + + struct { + string s; + } Str; + + struct { + expr_ty value; + identifier attr; + expr_context_ty ctx; + } Attribute; + + struct { + expr_ty value; + slice_ty slice; + expr_context_ty ctx; + } Subscript; + + struct { + identifier id; + expr_context_ty ctx; + } Name; + + struct { + asdl_seq *elts; + expr_context_ty ctx; + } List; + + struct { + asdl_seq *elts; + expr_context_ty ctx; + } Tuple; + + } v; + int lineno; + int col_offset; +}; + +enum _slice_kind {Ellipsis_kind=1, Slice_kind=2, ExtSlice_kind=3, Index_kind=4}; +struct _slice { + enum _slice_kind kind; + union { + struct { + expr_ty lower; + expr_ty upper; + expr_ty step; + } Slice; + + struct { + asdl_seq *dims; + } ExtSlice; + + struct { + expr_ty value; + } Index; + + } v; +}; + +struct _comprehension { + expr_ty target; + expr_ty iter; + asdl_seq *ifs; +}; + +enum _excepthandler_kind {ExceptHandler_kind=1}; +struct _excepthandler { + enum _excepthandler_kind kind; + union { + struct { + expr_ty type; + expr_ty name; + asdl_seq *body; + } ExceptHandler; + + } v; + int lineno; + int col_offset; +}; + +struct _arguments { + asdl_seq *args; + identifier vararg; + identifier kwarg; + asdl_seq *defaults; +}; + +struct _keyword { + identifier arg; + expr_ty value; +}; + +struct _alias { + identifier name; + identifier asname; +}; + + +#define Module(a0, a1) _Py_Module(a0, a1) +mod_ty _Py_Module(asdl_seq * body, PyArena *arena); +#define Interactive(a0, a1) _Py_Interactive(a0, a1) +mod_ty _Py_Interactive(asdl_seq * body, PyArena *arena); +#define Expression(a0, a1) _Py_Expression(a0, a1) +mod_ty _Py_Expression(expr_ty body, PyArena *arena); +#define Suite(a0, a1) _Py_Suite(a0, a1) +mod_ty _Py_Suite(asdl_seq * body, PyArena *arena); +#define FunctionDef(a0, a1, a2, a3, a4, a5, a6) _Py_FunctionDef(a0, a1, a2, a3, a4, a5, a6) +stmt_ty _Py_FunctionDef(identifier name, arguments_ty args, asdl_seq * body, + asdl_seq * decorator_list, int lineno, int col_offset, + PyArena *arena); +#define ClassDef(a0, a1, a2, a3, a4, a5, a6) _Py_ClassDef(a0, a1, a2, a3, a4, a5, a6) +stmt_ty _Py_ClassDef(identifier name, asdl_seq * bases, asdl_seq * body, + asdl_seq * decorator_list, int lineno, int col_offset, + PyArena *arena); +#define Return(a0, a1, a2, a3) _Py_Return(a0, a1, a2, a3) +stmt_ty _Py_Return(expr_ty value, int lineno, int col_offset, PyArena *arena); +#define Delete(a0, a1, a2, a3) _Py_Delete(a0, a1, a2, a3) +stmt_ty _Py_Delete(asdl_seq * targets, int lineno, int col_offset, PyArena + *arena); +#define Assign(a0, a1, a2, a3, a4) _Py_Assign(a0, a1, a2, a3, a4) +stmt_ty _Py_Assign(asdl_seq * targets, expr_ty value, int lineno, int + col_offset, PyArena *arena); +#define AugAssign(a0, a1, a2, a3, a4, a5) _Py_AugAssign(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_AugAssign(expr_ty target, operator_ty op, expr_ty value, int + lineno, int col_offset, PyArena *arena); +#define Print(a0, a1, a2, a3, a4, a5) _Py_Print(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_Print(expr_ty dest, asdl_seq * values, bool nl, int lineno, int + col_offset, PyArena *arena); +#define For(a0, a1, a2, a3, a4, a5, a6) _Py_For(a0, a1, a2, a3, a4, a5, a6) +stmt_ty _Py_For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * + orelse, int lineno, int col_offset, PyArena *arena); +#define While(a0, a1, a2, a3, a4, a5) _Py_While(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, + int col_offset, PyArena *arena); +#define If(a0, a1, a2, a3, a4, a5) _Py_If(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, + int col_offset, PyArena *arena); +#define With(a0, a1, a2, a3, a4, a5) _Py_With(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_With(expr_ty context_expr, expr_ty optional_vars, asdl_seq * body, + int lineno, int col_offset, PyArena *arena); +#define Raise(a0, a1, a2, a3, a4, a5) _Py_Raise(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno, int + col_offset, PyArena *arena); +#define TryExcept(a0, a1, a2, a3, a4, a5) _Py_TryExcept(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, + int lineno, int col_offset, PyArena *arena); +#define TryFinally(a0, a1, a2, a3, a4) _Py_TryFinally(a0, a1, a2, a3, a4) +stmt_ty _Py_TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, int + col_offset, PyArena *arena); +#define Assert(a0, a1, a2, a3, a4) _Py_Assert(a0, a1, a2, a3, a4) +stmt_ty _Py_Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, + PyArena *arena); +#define Import(a0, a1, a2, a3) _Py_Import(a0, a1, a2, a3) +stmt_ty _Py_Import(asdl_seq * names, int lineno, int col_offset, PyArena + *arena); +#define ImportFrom(a0, a1, a2, a3, a4, a5) _Py_ImportFrom(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_ImportFrom(identifier module, asdl_seq * names, int level, int + lineno, int col_offset, PyArena *arena); +#define Exec(a0, a1, a2, a3, a4, a5) _Py_Exec(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno, int + col_offset, PyArena *arena); +#define Global(a0, a1, a2, a3) _Py_Global(a0, a1, a2, a3) +stmt_ty _Py_Global(asdl_seq * names, int lineno, int col_offset, PyArena + *arena); +#define Expr(a0, a1, a2, a3) _Py_Expr(a0, a1, a2, a3) +stmt_ty _Py_Expr(expr_ty value, int lineno, int col_offset, PyArena *arena); +#define Pass(a0, a1, a2) _Py_Pass(a0, a1, a2) +stmt_ty _Py_Pass(int lineno, int col_offset, PyArena *arena); +#define Break(a0, a1, a2) _Py_Break(a0, a1, a2) +stmt_ty _Py_Break(int lineno, int col_offset, PyArena *arena); +#define Continue(a0, a1, a2) _Py_Continue(a0, a1, a2) +stmt_ty _Py_Continue(int lineno, int col_offset, PyArena *arena); +#define BoolOp(a0, a1, a2, a3, a4) _Py_BoolOp(a0, a1, a2, a3, a4) +expr_ty _Py_BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, + PyArena *arena); +#define BinOp(a0, a1, a2, a3, a4, a5) _Py_BinOp(a0, a1, a2, a3, a4, a5) +expr_ty _Py_BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int + col_offset, PyArena *arena); +#define UnaryOp(a0, a1, a2, a3, a4) _Py_UnaryOp(a0, a1, a2, a3, a4) +expr_ty _Py_UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, + PyArena *arena); +#define Lambda(a0, a1, a2, a3, a4) _Py_Lambda(a0, a1, a2, a3, a4) +expr_ty _Py_Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, + PyArena *arena); +#define IfExp(a0, a1, a2, a3, a4, a5) _Py_IfExp(a0, a1, a2, a3, a4, a5) +expr_ty _Py_IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int + col_offset, PyArena *arena); +#define Dict(a0, a1, a2, a3, a4) _Py_Dict(a0, a1, a2, a3, a4) +expr_ty _Py_Dict(asdl_seq * keys, asdl_seq * values, int lineno, int + col_offset, PyArena *arena); +#define Set(a0, a1, a2, a3) _Py_Set(a0, a1, a2, a3) +expr_ty _Py_Set(asdl_seq * elts, int lineno, int col_offset, PyArena *arena); +#define ListComp(a0, a1, a2, a3, a4) _Py_ListComp(a0, a1, a2, a3, a4) +expr_ty _Py_ListComp(expr_ty elt, asdl_seq * generators, int lineno, int + col_offset, PyArena *arena); +#define SetComp(a0, a1, a2, a3, a4) _Py_SetComp(a0, a1, a2, a3, a4) +expr_ty _Py_SetComp(expr_ty elt, asdl_seq * generators, int lineno, int + col_offset, PyArena *arena); +#define DictComp(a0, a1, a2, a3, a4, a5) _Py_DictComp(a0, a1, a2, a3, a4, a5) +expr_ty _Py_DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int + lineno, int col_offset, PyArena *arena); +#define GeneratorExp(a0, a1, a2, a3, a4) _Py_GeneratorExp(a0, a1, a2, a3, a4) +expr_ty _Py_GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int + col_offset, PyArena *arena); +#define Yield(a0, a1, a2, a3) _Py_Yield(a0, a1, a2, a3) +expr_ty _Py_Yield(expr_ty value, int lineno, int col_offset, PyArena *arena); +#define Compare(a0, a1, a2, a3, a4, a5) _Py_Compare(a0, a1, a2, a3, a4, a5) +expr_ty _Py_Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, + int lineno, int col_offset, PyArena *arena); +#define Call(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Call(a0, a1, a2, a3, a4, a5, a6, a7) +expr_ty _Py_Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty + starargs, expr_ty kwargs, int lineno, int col_offset, PyArena + *arena); +#define Repr(a0, a1, a2, a3) _Py_Repr(a0, a1, a2, a3) +expr_ty _Py_Repr(expr_ty value, int lineno, int col_offset, PyArena *arena); +#define Num(a0, a1, a2, a3) _Py_Num(a0, a1, a2, a3) +expr_ty _Py_Num(object n, int lineno, int col_offset, PyArena *arena); +#define Str(a0, a1, a2, a3) _Py_Str(a0, a1, a2, a3) +expr_ty _Py_Str(string s, int lineno, int col_offset, PyArena *arena); +#define Attribute(a0, a1, a2, a3, a4, a5) _Py_Attribute(a0, a1, a2, a3, a4, a5) +expr_ty _Py_Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int + lineno, int col_offset, PyArena *arena); +#define Subscript(a0, a1, a2, a3, a4, a5) _Py_Subscript(a0, a1, a2, a3, a4, a5) +expr_ty _Py_Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int + lineno, int col_offset, PyArena *arena); +#define Name(a0, a1, a2, a3, a4) _Py_Name(a0, a1, a2, a3, a4) +expr_ty _Py_Name(identifier id, expr_context_ty ctx, int lineno, int + col_offset, PyArena *arena); +#define List(a0, a1, a2, a3, a4) _Py_List(a0, a1, a2, a3, a4) +expr_ty _Py_List(asdl_seq * elts, expr_context_ty ctx, int lineno, int + col_offset, PyArena *arena); +#define Tuple(a0, a1, a2, a3, a4) _Py_Tuple(a0, a1, a2, a3, a4) +expr_ty _Py_Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int + col_offset, PyArena *arena); +#define Ellipsis(a0) _Py_Ellipsis(a0) +slice_ty _Py_Ellipsis(PyArena *arena); +#define Slice(a0, a1, a2, a3) _Py_Slice(a0, a1, a2, a3) +slice_ty _Py_Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena); +#define ExtSlice(a0, a1) _Py_ExtSlice(a0, a1) +slice_ty _Py_ExtSlice(asdl_seq * dims, PyArena *arena); +#define Index(a0, a1) _Py_Index(a0, a1) +slice_ty _Py_Index(expr_ty value, PyArena *arena); +#define comprehension(a0, a1, a2, a3) _Py_comprehension(a0, a1, a2, a3) +comprehension_ty _Py_comprehension(expr_ty target, expr_ty iter, asdl_seq * + ifs, PyArena *arena); +#define ExceptHandler(a0, a1, a2, a3, a4, a5) _Py_ExceptHandler(a0, a1, a2, a3, a4, a5) +excepthandler_ty _Py_ExceptHandler(expr_ty type, expr_ty name, asdl_seq * body, + int lineno, int col_offset, PyArena *arena); +#define arguments(a0, a1, a2, a3, a4) _Py_arguments(a0, a1, a2, a3, a4) +arguments_ty _Py_arguments(asdl_seq * args, identifier vararg, identifier + kwarg, asdl_seq * defaults, PyArena *arena); +#define keyword(a0, a1, a2) _Py_keyword(a0, a1, a2) +keyword_ty _Py_keyword(identifier arg, expr_ty value, PyArena *arena); +#define alias(a0, a1, a2) _Py_alias(a0, a1, a2) +alias_ty _Py_alias(identifier name, identifier asname, PyArena *arena); + +PyObject* PyAST_mod2obj(mod_ty t); +mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode); +int PyAST_Check(PyObject* obj); diff --git a/PythonEnv/2.7/Include/Python.h b/PythonEnv/2.7/Include/Python.h new file mode 100644 index 0000000000..775412b8c4 --- /dev/null +++ b/PythonEnv/2.7/Include/Python.h @@ -0,0 +1,178 @@ +#ifndef Py_PYTHON_H +#define Py_PYTHON_H +/* Since this is a "meta-include" file, no #ifdef __cplusplus / extern "C" { */ + +/* Include nearly all Python header files */ + +#include "patchlevel.h" +#include "pyconfig.h" +#include "pymacconfig.h" + +/* Cyclic gc is always enabled, starting with release 2.3a1. Supply the + * old symbol for the benefit of extension modules written before then + * that may be conditionalizing on it. The core doesn't use it anymore. + */ +#ifndef WITH_CYCLE_GC +#define WITH_CYCLE_GC 1 +#endif + +#include + +#ifndef UCHAR_MAX +#error "Something's broken. UCHAR_MAX should be defined in limits.h." +#endif + +#if UCHAR_MAX != 255 +#error "Python's source code assumes C's unsigned char is an 8-bit type." +#endif + +#if defined(__sgi) && defined(WITH_THREAD) && !defined(_SGI_MP_SOURCE) +#define _SGI_MP_SOURCE +#endif + +#include +#ifndef NULL +# error "Python.h requires that stdio.h define NULL." +#endif + +#include +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +/* For size_t? */ +#ifdef HAVE_STDDEF_H +#include +#endif + +/* CAUTION: Build setups should ensure that NDEBUG is defined on the + * compiler command line when building Python in release mode; else + * assert() calls won't be removed. + */ +#include + +#include "pyport.h" + +/* pyconfig.h or pyport.h may or may not define DL_IMPORT */ +#ifndef DL_IMPORT /* declarations for DLL import/export */ +#define DL_IMPORT(RTYPE) RTYPE +#endif +#ifndef DL_EXPORT /* declarations for DLL import/export */ +#define DL_EXPORT(RTYPE) RTYPE +#endif + +/* Debug-mode build with pymalloc implies PYMALLOC_DEBUG. + * PYMALLOC_DEBUG is in error if pymalloc is not in use. + */ +#if defined(Py_DEBUG) && defined(WITH_PYMALLOC) && !defined(PYMALLOC_DEBUG) +#define PYMALLOC_DEBUG +#endif +#if defined(PYMALLOC_DEBUG) && !defined(WITH_PYMALLOC) +#error "PYMALLOC_DEBUG requires WITH_PYMALLOC" +#endif +#include "pymath.h" +#include "pymem.h" + +#include "object.h" +#include "objimpl.h" + +#include "pydebug.h" + +#include "unicodeobject.h" +#include "intobject.h" +#include "boolobject.h" +#include "longobject.h" +#include "floatobject.h" +#ifndef WITHOUT_COMPLEX +#include "complexobject.h" +#endif +#include "rangeobject.h" +#include "stringobject.h" +#include "memoryobject.h" +#include "bufferobject.h" +#include "bytesobject.h" +#include "bytearrayobject.h" +#include "tupleobject.h" +#include "listobject.h" +#include "dictobject.h" +#include "enumobject.h" +#include "setobject.h" +#include "methodobject.h" +#include "moduleobject.h" +#include "funcobject.h" +#include "classobject.h" +#include "fileobject.h" +#include "cobject.h" +#include "pycapsule.h" +#include "traceback.h" +#include "sliceobject.h" +#include "cellobject.h" +#include "iterobject.h" +#include "genobject.h" +#include "descrobject.h" +#include "warnings.h" +#include "weakrefobject.h" + +#include "codecs.h" +#include "pyerrors.h" + +#include "pystate.h" + +#include "pyarena.h" +#include "modsupport.h" +#include "pythonrun.h" +#include "ceval.h" +#include "sysmodule.h" +#include "intrcheck.h" +#include "import.h" + +#include "abstract.h" + +#include "compile.h" +#include "eval.h" + +#include "pyctype.h" +#include "pystrtod.h" +#include "pystrcmp.h" +#include "dtoa.h" + +/* _Py_Mangle is defined in compile.c */ +PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name); + +/* PyArg_GetInt is deprecated and should not be used, use PyArg_Parse(). */ +#define PyArg_GetInt(v, a) PyArg_Parse((v), "i", (a)) + +/* PyArg_NoArgs should not be necessary. + Set ml_flags in the PyMethodDef to METH_NOARGS. */ +#define PyArg_NoArgs(v) PyArg_Parse(v, "") + +/* Argument must be a char or an int in [-128, 127] or [0, 255]. */ +#define Py_CHARMASK(c) ((unsigned char)((c) & 0xff)) + +#include "pyfpe.h" + +/* These definitions must match corresponding definitions in graminit.h. + There's code in compile.c that checks that they are the same. */ +#define Py_single_input 256 +#define Py_file_input 257 +#define Py_eval_input 258 + +#ifdef HAVE_PTH +/* GNU pth user-space thread support */ +#include +#endif + +/* Define macros for inline documentation. */ +#define PyDoc_VAR(name) static char name[] +#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str) +#ifdef WITH_DOC_STRINGS +#define PyDoc_STR(str) str +#else +#define PyDoc_STR(str) "" +#endif + +#endif /* !Py_PYTHON_H */ diff --git a/PythonEnv/2.7/Include/abstract.h b/PythonEnv/2.7/Include/abstract.h new file mode 100644 index 0000000000..a377423868 --- /dev/null +++ b/PythonEnv/2.7/Include/abstract.h @@ -0,0 +1,1396 @@ +#ifndef Py_ABSTRACTOBJECT_H +#define Py_ABSTRACTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef PY_SSIZE_T_CLEAN +#define PyObject_CallFunction _PyObject_CallFunction_SizeT +#define PyObject_CallMethod _PyObject_CallMethod_SizeT +#endif + +/* Abstract Object Interface (many thanks to Jim Fulton) */ + +/* + PROPOSAL: A Generic Python Object Interface for Python C Modules + +Problem + + Python modules written in C that must access Python objects must do + so through routines whose interfaces are described by a set of + include files. Unfortunately, these routines vary according to the + object accessed. To use these routines, the C programmer must check + the type of the object being used and must call a routine based on + the object type. For example, to access an element of a sequence, + the programmer must determine whether the sequence is a list or a + tuple: + + if(is_tupleobject(o)) + e=gettupleitem(o,i) + else if(is_listitem(o)) + e=getlistitem(o,i) + + If the programmer wants to get an item from another type of object + that provides sequence behavior, there is no clear way to do it + correctly. + + The persistent programmer may peruse object.h and find that the + _typeobject structure provides a means of invoking up to (currently + about) 41 special operators. So, for example, a routine can get an + item from any object that provides sequence behavior. However, to + use this mechanism, the programmer must make their code dependent on + the current Python implementation. + + Also, certain semantics, especially memory management semantics, may + differ by the type of object being used. Unfortunately, these + semantics are not clearly described in the current include files. + An abstract interface providing more consistent semantics is needed. + +Proposal + + I propose the creation of a standard interface (with an associated + library of routines and/or macros) for generically obtaining the + services of Python objects. This proposal can be viewed as one + components of a Python C interface consisting of several components. + + From the viewpoint of C access to Python services, we have (as + suggested by Guido in off-line discussions): + + - "Very high level layer": two or three functions that let you exec or + eval arbitrary Python code given as a string in a module whose name is + given, passing C values in and getting C values out using + mkvalue/getargs style format strings. This does not require the user + to declare any variables of type "PyObject *". This should be enough + to write a simple application that gets Python code from the user, + execs it, and returns the output or errors. (Error handling must also + be part of this API.) + + - "Abstract objects layer": which is the subject of this proposal. + It has many functions operating on objects, and lest you do many + things from C that you can also write in Python, without going + through the Python parser. + + - "Concrete objects layer": This is the public type-dependent + interface provided by the standard built-in types, such as floats, + strings, and lists. This interface exists and is currently + documented by the collection of include files provided with the + Python distributions. + + From the point of view of Python accessing services provided by C + modules: + + - "Python module interface": this interface consist of the basic + routines used to define modules and their members. Most of the + current extensions-writing guide deals with this interface. + + - "Built-in object interface": this is the interface that a new + built-in type must provide and the mechanisms and rules that a + developer of a new built-in type must use and follow. + + This proposal is a "first-cut" that is intended to spur + discussion. See especially the lists of notes. + + The Python C object interface will provide four protocols: object, + numeric, sequence, and mapping. Each protocol consists of a + collection of related operations. If an operation that is not + provided by a particular type is invoked, then a standard exception, + NotImplementedError is raised with a operation name as an argument. + In addition, for convenience this interface defines a set of + constructors for building objects of built-in types. This is needed + so new objects can be returned from C functions that otherwise treat + objects generically. + +Memory Management + + For all of the functions described in this proposal, if a function + retains a reference to a Python object passed as an argument, then the + function will increase the reference count of the object. It is + unnecessary for the caller to increase the reference count of an + argument in anticipation of the object's retention. + + All Python objects returned from functions should be treated as new + objects. Functions that return objects assume that the caller will + retain a reference and the reference count of the object has already + been incremented to account for this fact. A caller that does not + retain a reference to an object that is returned from a function + must decrement the reference count of the object (using + DECREF(object)) to prevent memory leaks. + + Note that the behavior mentioned here is different from the current + behavior for some objects (e.g. lists and tuples) when certain + type-specific routines are called directly (e.g. setlistitem). The + proposed abstraction layer will provide a consistent memory + management interface, correcting for inconsistent behavior for some + built-in types. + +Protocols + +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ + +/* Object Protocol: */ + + /* Implemented elsewhere: + + int PyObject_Print(PyObject *o, FILE *fp, int flags); + + Print an object, o, on file, fp. Returns -1 on + error. The flags argument is used to enable certain printing + options. The only option currently supported is Py_Print_RAW. + + (What should be said about Py_Print_RAW?) + + */ + + /* Implemented elsewhere: + + int PyObject_HasAttrString(PyObject *o, char *attr_name); + + Returns 1 if o has the attribute attr_name, and 0 otherwise. + This is equivalent to the Python expression: + hasattr(o,attr_name). + + This function always succeeds. + + */ + + /* Implemented elsewhere: + + PyObject* PyObject_GetAttrString(PyObject *o, char *attr_name); + + Retrieve an attributed named attr_name form object o. + Returns the attribute value on success, or NULL on failure. + This is the equivalent of the Python expression: o.attr_name. + + */ + + /* Implemented elsewhere: + + int PyObject_HasAttr(PyObject *o, PyObject *attr_name); + + Returns 1 if o has the attribute attr_name, and 0 otherwise. + This is equivalent to the Python expression: + hasattr(o,attr_name). + + This function always succeeds. + + */ + + /* Implemented elsewhere: + + PyObject* PyObject_GetAttr(PyObject *o, PyObject *attr_name); + + Retrieve an attributed named attr_name form object o. + Returns the attribute value on success, or NULL on failure. + This is the equivalent of the Python expression: o.attr_name. + + */ + + + /* Implemented elsewhere: + + int PyObject_SetAttrString(PyObject *o, char *attr_name, PyObject *v); + + Set the value of the attribute named attr_name, for object o, + to the value, v. Returns -1 on failure. This is + the equivalent of the Python statement: o.attr_name=v. + + */ + + /* Implemented elsewhere: + + int PyObject_SetAttr(PyObject *o, PyObject *attr_name, PyObject *v); + + Set the value of the attribute named attr_name, for object o, + to the value, v. Returns -1 on failure. This is + the equivalent of the Python statement: o.attr_name=v. + + */ + + /* implemented as a macro: + + int PyObject_DelAttrString(PyObject *o, char *attr_name); + + Delete attribute named attr_name, for object o. Returns + -1 on failure. This is the equivalent of the Python + statement: del o.attr_name. + + */ +#define PyObject_DelAttrString(O,A) PyObject_SetAttrString((O),(A),NULL) + + /* implemented as a macro: + + int PyObject_DelAttr(PyObject *o, PyObject *attr_name); + + Delete attribute named attr_name, for object o. Returns -1 + on failure. This is the equivalent of the Python + statement: del o.attr_name. + + */ +#define PyObject_DelAttr(O,A) PyObject_SetAttr((O),(A),NULL) + + PyAPI_FUNC(int) PyObject_Cmp(PyObject *o1, PyObject *o2, int *result); + + /* + Compare the values of o1 and o2 using a routine provided by + o1, if one exists, otherwise with a routine provided by o2. + The result of the comparison is returned in result. Returns + -1 on failure. This is the equivalent of the Python + statement: result=cmp(o1,o2). + + */ + + /* Implemented elsewhere: + + int PyObject_Compare(PyObject *o1, PyObject *o2); + + Compare the values of o1 and o2 using a routine provided by + o1, if one exists, otherwise with a routine provided by o2. + Returns the result of the comparison on success. On error, + the value returned is undefined. This is equivalent to the + Python expression: cmp(o1,o2). + + */ + + /* Implemented elsewhere: + + PyObject *PyObject_Repr(PyObject *o); + + Compute the string representation of object, o. Returns the + string representation on success, NULL on failure. This is + the equivalent of the Python expression: repr(o). + + Called by the repr() built-in function and by reverse quotes. + + */ + + /* Implemented elsewhere: + + PyObject *PyObject_Str(PyObject *o); + + Compute the string representation of object, o. Returns the + string representation on success, NULL on failure. This is + the equivalent of the Python expression: str(o).) + + Called by the str() built-in function and by the print + statement. + + */ + + /* Implemented elsewhere: + + PyObject *PyObject_Unicode(PyObject *o); + + Compute the unicode representation of object, o. Returns the + unicode representation on success, NULL on failure. This is + the equivalent of the Python expression: unistr(o).) + + Called by the unistr() built-in function. + + */ + + /* Declared elsewhere + + PyAPI_FUNC(int) PyCallable_Check(PyObject *o); + + Determine if the object, o, is callable. Return 1 if the + object is callable and 0 otherwise. + + This function always succeeds. + + */ + + + + PyAPI_FUNC(PyObject *) PyObject_Call(PyObject *callable_object, + PyObject *args, PyObject *kw); + + /* + Call a callable Python object, callable_object, with + arguments and keywords arguments. The 'args' argument can not be + NULL, but the 'kw' argument can be NULL. + + */ + + PyAPI_FUNC(PyObject *) PyObject_CallObject(PyObject *callable_object, + PyObject *args); + + /* + Call a callable Python object, callable_object, with + arguments given by the tuple, args. If no arguments are + needed, then args may be NULL. Returns the result of the + call on success, or NULL on failure. This is the equivalent + of the Python expression: apply(o,args). + + */ + + PyAPI_FUNC(PyObject *) PyObject_CallFunction(PyObject *callable_object, + char *format, ...); + + /* + Call a callable Python object, callable_object, with a + variable number of C arguments. The C arguments are described + using a mkvalue-style format string. The format may be NULL, + indicating that no arguments are provided. Returns the + result of the call on success, or NULL on failure. This is + the equivalent of the Python expression: apply(o,args). + + */ + + + PyAPI_FUNC(PyObject *) PyObject_CallMethod(PyObject *o, char *m, + char *format, ...); + + /* + Call the method named m of object o with a variable number of + C arguments. The C arguments are described by a mkvalue + format string. The format may be NULL, indicating that no + arguments are provided. Returns the result of the call on + success, or NULL on failure. This is the equivalent of the + Python expression: o.method(args). + */ + + PyAPI_FUNC(PyObject *) _PyObject_CallFunction_SizeT(PyObject *callable, + char *format, ...); + PyAPI_FUNC(PyObject *) _PyObject_CallMethod_SizeT(PyObject *o, + char *name, + char *format, ...); + + PyAPI_FUNC(PyObject *) PyObject_CallFunctionObjArgs(PyObject *callable, + ...); + + /* + Call a callable Python object, callable_object, with a + variable number of C arguments. The C arguments are provided + as PyObject * values, terminated by a NULL. Returns the + result of the call on success, or NULL on failure. This is + the equivalent of the Python expression: apply(o,args). + */ + + + PyAPI_FUNC(PyObject *) PyObject_CallMethodObjArgs(PyObject *o, + PyObject *m, ...); + + /* + Call the method named m of object o with a variable number of + C arguments. The C arguments are provided as PyObject * + values, terminated by NULL. Returns the result of the call + on success, or NULL on failure. This is the equivalent of + the Python expression: o.method(args). + */ + + + /* Implemented elsewhere: + + long PyObject_Hash(PyObject *o); + + Compute and return the hash, hash_value, of an object, o. On + failure, return -1. This is the equivalent of the Python + expression: hash(o). + + */ + + + /* Implemented elsewhere: + + int PyObject_IsTrue(PyObject *o); + + Returns 1 if the object, o, is considered to be true, 0 if o is + considered to be false and -1 on failure. This is equivalent to the + Python expression: not not o + + */ + + /* Implemented elsewhere: + + int PyObject_Not(PyObject *o); + + Returns 0 if the object, o, is considered to be true, 1 if o is + considered to be false and -1 on failure. This is equivalent to the + Python expression: not o + + */ + + PyAPI_FUNC(PyObject *) PyObject_Type(PyObject *o); + + /* + On success, returns a type object corresponding to the object + type of object o. On failure, returns NULL. This is + equivalent to the Python expression: type(o). + */ + + PyAPI_FUNC(Py_ssize_t) PyObject_Size(PyObject *o); + + /* + Return the size of object o. If the object, o, provides + both sequence and mapping protocols, the sequence size is + returned. On error, -1 is returned. This is the equivalent + to the Python expression: len(o). + + */ + + /* For DLL compatibility */ +#undef PyObject_Length + PyAPI_FUNC(Py_ssize_t) PyObject_Length(PyObject *o); +#define PyObject_Length PyObject_Size + + PyAPI_FUNC(Py_ssize_t) _PyObject_LengthHint(PyObject *o, Py_ssize_t); + + /* + Guess the size of object o using len(o) or o.__length_hint__(). + If neither of those return a non-negative value, then return the + default value. If one of the calls fails, this function returns -1. + */ + + PyAPI_FUNC(PyObject *) PyObject_GetItem(PyObject *o, PyObject *key); + + /* + Return element of o corresponding to the object, key, or NULL + on failure. This is the equivalent of the Python expression: + o[key]. + + */ + + PyAPI_FUNC(int) PyObject_SetItem(PyObject *o, PyObject *key, PyObject *v); + + /* + Map the object, key, to the value, v. Returns + -1 on failure. This is the equivalent of the Python + statement: o[key]=v. + */ + + PyAPI_FUNC(int) PyObject_DelItemString(PyObject *o, char *key); + + /* + Remove the mapping for object, key, from the object *o. + Returns -1 on failure. This is equivalent to + the Python statement: del o[key]. + */ + + PyAPI_FUNC(int) PyObject_DelItem(PyObject *o, PyObject *key); + + /* + Delete the mapping for key from *o. Returns -1 on failure. + This is the equivalent of the Python statement: del o[key]. + */ + + PyAPI_FUNC(int) PyObject_AsCharBuffer(PyObject *obj, + const char **buffer, + Py_ssize_t *buffer_len); + + /* + Takes an arbitrary object which must support the (character, + single segment) buffer interface and returns a pointer to a + read-only memory location useable as character based input + for subsequent processing. + + 0 is returned on success. buffer and buffer_len are only + set in case no error occurs. Otherwise, -1 is returned and + an exception set. + + */ + + PyAPI_FUNC(int) PyObject_CheckReadBuffer(PyObject *obj); + + /* + Checks whether an arbitrary object supports the (character, + single segment) buffer interface. Returns 1 on success, 0 + on failure. + + */ + + PyAPI_FUNC(int) PyObject_AsReadBuffer(PyObject *obj, + const void **buffer, + Py_ssize_t *buffer_len); + + /* + Same as PyObject_AsCharBuffer() except that this API expects + (readable, single segment) buffer interface and returns a + pointer to a read-only memory location which can contain + arbitrary data. + + 0 is returned on success. buffer and buffer_len are only + set in case no error occurs. Otherwise, -1 is returned and + an exception set. + + */ + + PyAPI_FUNC(int) PyObject_AsWriteBuffer(PyObject *obj, + void **buffer, + Py_ssize_t *buffer_len); + + /* + Takes an arbitrary object which must support the (writeable, + single segment) buffer interface and returns a pointer to a + writeable memory location in buffer of size buffer_len. + + 0 is returned on success. buffer and buffer_len are only + set in case no error occurs. Otherwise, -1 is returned and + an exception set. + + */ + + /* new buffer API */ + +#define PyObject_CheckBuffer(obj) \ + (((obj)->ob_type->tp_as_buffer != NULL) && \ + (PyType_HasFeature((obj)->ob_type, Py_TPFLAGS_HAVE_NEWBUFFER)) && \ + ((obj)->ob_type->tp_as_buffer->bf_getbuffer != NULL)) + + /* Return 1 if the getbuffer function is available, otherwise + return 0 */ + + PyAPI_FUNC(int) PyObject_GetBuffer(PyObject *obj, Py_buffer *view, + int flags); + + /* This is a C-API version of the getbuffer function call. It checks + to make sure object has the required function pointer and issues the + call. Returns -1 and raises an error on failure and returns 0 on + success + */ + + + PyAPI_FUNC(void *) PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices); + + /* Get the memory area pointed to by the indices for the buffer given. + Note that view->ndim is the assumed size of indices + */ + + PyAPI_FUNC(int) PyBuffer_SizeFromFormat(const char *); + + /* Return the implied itemsize of the data-format area from a + struct-style description */ + + + + PyAPI_FUNC(int) PyBuffer_ToContiguous(void *buf, Py_buffer *view, + Py_ssize_t len, char fort); + + PyAPI_FUNC(int) PyBuffer_FromContiguous(Py_buffer *view, void *buf, + Py_ssize_t len, char fort); + + + /* Copy len bytes of data from the contiguous chunk of memory + pointed to by buf into the buffer exported by obj. Return + 0 on success and return -1 and raise a PyBuffer_Error on + error (i.e. the object does not have a buffer interface or + it is not working). + + If fort is 'F' and the object is multi-dimensional, + then the data will be copied into the array in + Fortran-style (first dimension varies the fastest). If + fort is 'C', then the data will be copied into the array + in C-style (last dimension varies the fastest). If fort + is 'A', then it does not matter and the copy will be made + in whatever way is more efficient. + + */ + + PyAPI_FUNC(int) PyObject_CopyData(PyObject *dest, PyObject *src); + + /* Copy the data from the src buffer to the buffer of destination + */ + + PyAPI_FUNC(int) PyBuffer_IsContiguous(Py_buffer *view, char fort); + + + PyAPI_FUNC(void) PyBuffer_FillContiguousStrides(int ndims, + Py_ssize_t *shape, + Py_ssize_t *strides, + int itemsize, + char fort); + + /* Fill the strides array with byte-strides of a contiguous + (Fortran-style if fort is 'F' or C-style otherwise) + array of the given shape with the given number of bytes + per element. + */ + + PyAPI_FUNC(int) PyBuffer_FillInfo(Py_buffer *view, PyObject *o, void *buf, + Py_ssize_t len, int readonly, + int flags); + + /* Fills in a buffer-info structure correctly for an exporter + that can only share a contiguous chunk of memory of + "unsigned bytes" of the given length. Returns 0 on success + and -1 (with raising an error) on error. + */ + + PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view); + + /* Releases a Py_buffer obtained from getbuffer ParseTuple's s*. + */ + + PyAPI_FUNC(PyObject *) PyObject_Format(PyObject* obj, + PyObject *format_spec); + /* + Takes an arbitrary object and returns the result of + calling obj.__format__(format_spec). + */ + +/* Iterators */ + + PyAPI_FUNC(PyObject *) PyObject_GetIter(PyObject *); + /* Takes an object and returns an iterator for it. + This is typically a new iterator but if the argument + is an iterator, this returns itself. */ + +#define PyIter_Check(obj) \ + (PyType_HasFeature((obj)->ob_type, Py_TPFLAGS_HAVE_ITER) && \ + (obj)->ob_type->tp_iternext != NULL && \ + (obj)->ob_type->tp_iternext != &_PyObject_NextNotImplemented) + + PyAPI_FUNC(PyObject *) PyIter_Next(PyObject *); + /* Takes an iterator object and calls its tp_iternext slot, + returning the next value. If the iterator is exhausted, + this returns NULL without setting an exception. + NULL with an exception means an error occurred. */ + +/* Number Protocol:*/ + + PyAPI_FUNC(int) PyNumber_Check(PyObject *o); + + /* + Returns 1 if the object, o, provides numeric protocols, and + false otherwise. + + This function always succeeds. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Add(PyObject *o1, PyObject *o2); + + /* + Returns the result of adding o1 and o2, or null on failure. + This is the equivalent of the Python expression: o1+o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Subtract(PyObject *o1, PyObject *o2); + + /* + Returns the result of subtracting o2 from o1, or null on + failure. This is the equivalent of the Python expression: + o1-o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Multiply(PyObject *o1, PyObject *o2); + + /* + Returns the result of multiplying o1 and o2, or null on + failure. This is the equivalent of the Python expression: + o1*o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Divide(PyObject *o1, PyObject *o2); + + /* + Returns the result of dividing o1 by o2, or null on failure. + This is the equivalent of the Python expression: o1/o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_FloorDivide(PyObject *o1, PyObject *o2); + + /* + Returns the result of dividing o1 by o2 giving an integral result, + or null on failure. + This is the equivalent of the Python expression: o1//o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_TrueDivide(PyObject *o1, PyObject *o2); + + /* + Returns the result of dividing o1 by o2 giving a float result, + or null on failure. + This is the equivalent of the Python expression: o1/o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Remainder(PyObject *o1, PyObject *o2); + + /* + Returns the remainder of dividing o1 by o2, or null on + failure. This is the equivalent of the Python expression: + o1%o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Divmod(PyObject *o1, PyObject *o2); + + /* + See the built-in function divmod. Returns NULL on failure. + This is the equivalent of the Python expression: + divmod(o1,o2). + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Power(PyObject *o1, PyObject *o2, + PyObject *o3); + + /* + See the built-in function pow. Returns NULL on failure. + This is the equivalent of the Python expression: + pow(o1,o2,o3), where o3 is optional. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Negative(PyObject *o); + + /* + Returns the negation of o on success, or null on failure. + This is the equivalent of the Python expression: -o. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Positive(PyObject *o); + + /* + Returns the (what?) of o on success, or NULL on failure. + This is the equivalent of the Python expression: +o. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Absolute(PyObject *o); + + /* + Returns the absolute value of o, or null on failure. This is + the equivalent of the Python expression: abs(o). + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Invert(PyObject *o); + + /* + Returns the bitwise negation of o on success, or NULL on + failure. This is the equivalent of the Python expression: + ~o. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Lshift(PyObject *o1, PyObject *o2); + + /* + Returns the result of left shifting o1 by o2 on success, or + NULL on failure. This is the equivalent of the Python + expression: o1 << o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Rshift(PyObject *o1, PyObject *o2); + + /* + Returns the result of right shifting o1 by o2 on success, or + NULL on failure. This is the equivalent of the Python + expression: o1 >> o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_And(PyObject *o1, PyObject *o2); + + /* + Returns the result of bitwise and of o1 and o2 on success, or + NULL on failure. This is the equivalent of the Python + expression: o1&o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Xor(PyObject *o1, PyObject *o2); + + /* + Returns the bitwise exclusive or of o1 by o2 on success, or + NULL on failure. This is the equivalent of the Python + expression: o1^o2. + + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Or(PyObject *o1, PyObject *o2); + + /* + Returns the result of bitwise or on o1 and o2 on success, or + NULL on failure. This is the equivalent of the Python + expression: o1|o2. + + */ + + /* Implemented elsewhere: + + int PyNumber_Coerce(PyObject **p1, PyObject **p2); + + This function takes the addresses of two variables of type + PyObject*. + + If the objects pointed to by *p1 and *p2 have the same type, + increment their reference count and return 0 (success). + If the objects can be converted to a common numeric type, + replace *p1 and *p2 by their converted value (with 'new' + reference counts), and return 0. + If no conversion is possible, or if some other error occurs, + return -1 (failure) and don't increment the reference counts. + The call PyNumber_Coerce(&o1, &o2) is equivalent to the Python + statement o1, o2 = coerce(o1, o2). + + */ + +#define PyIndex_Check(obj) \ + ((obj)->ob_type->tp_as_number != NULL && \ + PyType_HasFeature((obj)->ob_type, Py_TPFLAGS_HAVE_INDEX) && \ + (obj)->ob_type->tp_as_number->nb_index != NULL) + + PyAPI_FUNC(PyObject *) PyNumber_Index(PyObject *o); + + /* + Returns the object converted to a Python long or int + or NULL with an error raised on failure. + */ + + PyAPI_FUNC(Py_ssize_t) PyNumber_AsSsize_t(PyObject *o, PyObject *exc); + + /* + Returns the Integral instance converted to an int. The + instance is expected to be int or long or have an __int__ + method. Steals integral's reference. error_format will be + used to create the TypeError if integral isn't actually an + Integral instance. error_format should be a format string + that can accept a char* naming integral's type. + */ + + PyAPI_FUNC(PyObject *) _PyNumber_ConvertIntegralToInt( + PyObject *integral, + const char* error_format); + + /* + Returns the object converted to Py_ssize_t by going through + PyNumber_Index first. If an overflow error occurs while + converting the int-or-long to Py_ssize_t, then the second argument + is the error-type to return. If it is NULL, then the overflow error + is cleared and the value is clipped. + */ + + PyAPI_FUNC(PyObject *) PyNumber_Int(PyObject *o); + + /* + Returns the o converted to an integer object on success, or + NULL on failure. This is the equivalent of the Python + expression: int(o). + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Long(PyObject *o); + + /* + Returns the o converted to a long integer object on success, + or NULL on failure. This is the equivalent of the Python + expression: long(o). + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Float(PyObject *o); + + /* + Returns the o converted to a float object on success, or NULL + on failure. This is the equivalent of the Python expression: + float(o). + */ + +/* In-place variants of (some of) the above number protocol functions */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceAdd(PyObject *o1, PyObject *o2); + + /* + Returns the result of adding o2 to o1, possibly in-place, or null + on failure. This is the equivalent of the Python expression: + o1 += o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceSubtract(PyObject *o1, PyObject *o2); + + /* + Returns the result of subtracting o2 from o1, possibly in-place or + null on failure. This is the equivalent of the Python expression: + o1 -= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceMultiply(PyObject *o1, PyObject *o2); + + /* + Returns the result of multiplying o1 by o2, possibly in-place, or + null on failure. This is the equivalent of the Python expression: + o1 *= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceDivide(PyObject *o1, PyObject *o2); + + /* + Returns the result of dividing o1 by o2, possibly in-place, or null + on failure. This is the equivalent of the Python expression: + o1 /= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceFloorDivide(PyObject *o1, + PyObject *o2); + + /* + Returns the result of dividing o1 by o2 giving an integral result, + possibly in-place, or null on failure. + This is the equivalent of the Python expression: + o1 /= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceTrueDivide(PyObject *o1, + PyObject *o2); + + /* + Returns the result of dividing o1 by o2 giving a float result, + possibly in-place, or null on failure. + This is the equivalent of the Python expression: + o1 /= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceRemainder(PyObject *o1, PyObject *o2); + + /* + Returns the remainder of dividing o1 by o2, possibly in-place, or + null on failure. This is the equivalent of the Python expression: + o1 %= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlacePower(PyObject *o1, PyObject *o2, + PyObject *o3); + + /* + Returns the result of raising o1 to the power of o2, possibly + in-place, or null on failure. This is the equivalent of the Python + expression: o1 **= o2, or pow(o1, o2, o3) if o3 is present. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceLshift(PyObject *o1, PyObject *o2); + + /* + Returns the result of left shifting o1 by o2, possibly in-place, or + null on failure. This is the equivalent of the Python expression: + o1 <<= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceRshift(PyObject *o1, PyObject *o2); + + /* + Returns the result of right shifting o1 by o2, possibly in-place or + null on failure. This is the equivalent of the Python expression: + o1 >>= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceAnd(PyObject *o1, PyObject *o2); + + /* + Returns the result of bitwise and of o1 and o2, possibly in-place, + or null on failure. This is the equivalent of the Python + expression: o1 &= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceXor(PyObject *o1, PyObject *o2); + + /* + Returns the bitwise exclusive or of o1 by o2, possibly in-place, or + null on failure. This is the equivalent of the Python expression: + o1 ^= o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceOr(PyObject *o1, PyObject *o2); + + /* + Returns the result of bitwise or of o1 and o2, possibly in-place, + or null on failure. This is the equivalent of the Python + expression: o1 |= o2. + + */ + + + PyAPI_FUNC(PyObject *) PyNumber_ToBase(PyObject *n, int base); + + /* + Returns the integer n converted to a string with a base, with a base + marker of 0b, 0o or 0x prefixed if applicable. + If n is not an int object, it is converted with PyNumber_Index first. + */ + + +/* Sequence protocol:*/ + + PyAPI_FUNC(int) PySequence_Check(PyObject *o); + + /* + Return 1 if the object provides sequence protocol, and zero + otherwise. + + This function always succeeds. + + */ + + PyAPI_FUNC(Py_ssize_t) PySequence_Size(PyObject *o); + + /* + Return the size of sequence object o, or -1 on failure. + + */ + + /* For DLL compatibility */ +#undef PySequence_Length + PyAPI_FUNC(Py_ssize_t) PySequence_Length(PyObject *o); +#define PySequence_Length PySequence_Size + + + PyAPI_FUNC(PyObject *) PySequence_Concat(PyObject *o1, PyObject *o2); + + /* + Return the concatenation of o1 and o2 on success, and NULL on + failure. This is the equivalent of the Python + expression: o1+o2. + + */ + + PyAPI_FUNC(PyObject *) PySequence_Repeat(PyObject *o, Py_ssize_t count); + + /* + Return the result of repeating sequence object o count times, + or NULL on failure. This is the equivalent of the Python + expression: o1*count. + + */ + + PyAPI_FUNC(PyObject *) PySequence_GetItem(PyObject *o, Py_ssize_t i); + + /* + Return the ith element of o, or NULL on failure. This is the + equivalent of the Python expression: o[i]. + */ + + PyAPI_FUNC(PyObject *) PySequence_GetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2); + + /* + Return the slice of sequence object o between i1 and i2, or + NULL on failure. This is the equivalent of the Python + expression: o[i1:i2]. + + */ + + PyAPI_FUNC(int) PySequence_SetItem(PyObject *o, Py_ssize_t i, PyObject *v); + + /* + Assign object v to the ith element of o. Returns + -1 on failure. This is the equivalent of the Python + statement: o[i]=v. + + */ + + PyAPI_FUNC(int) PySequence_DelItem(PyObject *o, Py_ssize_t i); + + /* + Delete the ith element of object v. Returns + -1 on failure. This is the equivalent of the Python + statement: del o[i]. + */ + + PyAPI_FUNC(int) PySequence_SetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2, + PyObject *v); + + /* + Assign the sequence object, v, to the slice in sequence + object, o, from i1 to i2. Returns -1 on failure. This is the + equivalent of the Python statement: o[i1:i2]=v. + */ + + PyAPI_FUNC(int) PySequence_DelSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2); + + /* + Delete the slice in sequence object, o, from i1 to i2. + Returns -1 on failure. This is the equivalent of the Python + statement: del o[i1:i2]. + */ + + PyAPI_FUNC(PyObject *) PySequence_Tuple(PyObject *o); + + /* + Returns the sequence, o, as a tuple on success, and NULL on failure. + This is equivalent to the Python expression: tuple(o) + */ + + + PyAPI_FUNC(PyObject *) PySequence_List(PyObject *o); + /* + Returns the sequence, o, as a list on success, and NULL on failure. + This is equivalent to the Python expression: list(o) + */ + + PyAPI_FUNC(PyObject *) PySequence_Fast(PyObject *o, const char* m); + /* + Returns the sequence, o, as a tuple, unless it's already a + tuple or list. Use PySequence_Fast_GET_ITEM to access the + members of this list, and PySequence_Fast_GET_SIZE to get its length. + + Returns NULL on failure. If the object does not support iteration, + raises a TypeError exception with m as the message text. + */ + +#define PySequence_Fast_GET_SIZE(o) \ + (PyList_Check(o) ? PyList_GET_SIZE(o) : PyTuple_GET_SIZE(o)) + /* + Return the size of o, assuming that o was returned by + PySequence_Fast and is not NULL. + */ + +#define PySequence_Fast_GET_ITEM(o, i)\ + (PyList_Check(o) ? PyList_GET_ITEM(o, i) : PyTuple_GET_ITEM(o, i)) + /* + Return the ith element of o, assuming that o was returned by + PySequence_Fast, and that i is within bounds. + */ + +#define PySequence_ITEM(o, i)\ + ( Py_TYPE(o)->tp_as_sequence->sq_item(o, i) ) + /* Assume tp_as_sequence and sq_item exist and that i does not + need to be corrected for a negative index + */ + +#define PySequence_Fast_ITEMS(sf) \ + (PyList_Check(sf) ? ((PyListObject *)(sf))->ob_item \ + : ((PyTupleObject *)(sf))->ob_item) + /* Return a pointer to the underlying item array for + an object retured by PySequence_Fast */ + + PyAPI_FUNC(Py_ssize_t) PySequence_Count(PyObject *o, PyObject *value); + + /* + Return the number of occurrences on value on o, that is, + return the number of keys for which o[key]==value. On + failure, return -1. This is equivalent to the Python + expression: o.count(value). + */ + + PyAPI_FUNC(int) PySequence_Contains(PyObject *seq, PyObject *ob); + /* + Return -1 if error; 1 if ob in seq; 0 if ob not in seq. + Use __contains__ if possible, else _PySequence_IterSearch(). + */ + +#define PY_ITERSEARCH_COUNT 1 +#define PY_ITERSEARCH_INDEX 2 +#define PY_ITERSEARCH_CONTAINS 3 + PyAPI_FUNC(Py_ssize_t) _PySequence_IterSearch(PyObject *seq, + PyObject *obj, int operation); + /* + Iterate over seq. Result depends on the operation: + PY_ITERSEARCH_COUNT: return # of times obj appears in seq; -1 if + error. + PY_ITERSEARCH_INDEX: return 0-based index of first occurrence of + obj in seq; set ValueError and return -1 if none found; + also return -1 on error. + PY_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on + error. + */ + +/* For DLL-level backwards compatibility */ +#undef PySequence_In + PyAPI_FUNC(int) PySequence_In(PyObject *o, PyObject *value); + +/* For source-level backwards compatibility */ +#define PySequence_In PySequence_Contains + + /* + Determine if o contains value. If an item in o is equal to + X, return 1, otherwise return 0. On error, return -1. This + is equivalent to the Python expression: value in o. + */ + + PyAPI_FUNC(Py_ssize_t) PySequence_Index(PyObject *o, PyObject *value); + + /* + Return the first index for which o[i]=value. On error, + return -1. This is equivalent to the Python + expression: o.index(value). + */ + +/* In-place versions of some of the above Sequence functions. */ + + PyAPI_FUNC(PyObject *) PySequence_InPlaceConcat(PyObject *o1, PyObject *o2); + + /* + Append o2 to o1, in-place when possible. Return the resulting + object, which could be o1, or NULL on failure. This is the + equivalent of the Python expression: o1 += o2. + + */ + + PyAPI_FUNC(PyObject *) PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count); + + /* + Repeat o1 by count, in-place when possible. Return the resulting + object, which could be o1, or NULL on failure. This is the + equivalent of the Python expression: o1 *= count. + + */ + +/* Mapping protocol:*/ + + PyAPI_FUNC(int) PyMapping_Check(PyObject *o); + + /* + Return 1 if the object provides mapping protocol, and zero + otherwise. + + This function always succeeds. + */ + + PyAPI_FUNC(Py_ssize_t) PyMapping_Size(PyObject *o); + + /* + Returns the number of keys in object o on success, and -1 on + failure. For objects that do not provide sequence protocol, + this is equivalent to the Python expression: len(o). + */ + + /* For DLL compatibility */ +#undef PyMapping_Length + PyAPI_FUNC(Py_ssize_t) PyMapping_Length(PyObject *o); +#define PyMapping_Length PyMapping_Size + + + /* implemented as a macro: + + int PyMapping_DelItemString(PyObject *o, char *key); + + Remove the mapping for object, key, from the object *o. + Returns -1 on failure. This is equivalent to + the Python statement: del o[key]. + */ +#define PyMapping_DelItemString(O,K) PyObject_DelItemString((O),(K)) + + /* implemented as a macro: + + int PyMapping_DelItem(PyObject *o, PyObject *key); + + Remove the mapping for object, key, from the object *o. + Returns -1 on failure. This is equivalent to + the Python statement: del o[key]. + */ +#define PyMapping_DelItem(O,K) PyObject_DelItem((O),(K)) + + PyAPI_FUNC(int) PyMapping_HasKeyString(PyObject *o, char *key); + + /* + On success, return 1 if the mapping object has the key, key, + and 0 otherwise. This is equivalent to the Python expression: + o.has_key(key). + + This function always succeeds. + */ + + PyAPI_FUNC(int) PyMapping_HasKey(PyObject *o, PyObject *key); + + /* + Return 1 if the mapping object has the key, key, + and 0 otherwise. This is equivalent to the Python expression: + o.has_key(key). + + This function always succeeds. + + */ + + /* Implemented as macro: + + PyObject *PyMapping_Keys(PyObject *o); + + On success, return a list of the keys in object o. On + failure, return NULL. This is equivalent to the Python + expression: o.keys(). + */ +#define PyMapping_Keys(O) PyObject_CallMethod(O,"keys",NULL) + + /* Implemented as macro: + + PyObject *PyMapping_Values(PyObject *o); + + On success, return a list of the values in object o. On + failure, return NULL. This is equivalent to the Python + expression: o.values(). + */ +#define PyMapping_Values(O) PyObject_CallMethod(O,"values",NULL) + + /* Implemented as macro: + + PyObject *PyMapping_Items(PyObject *o); + + On success, return a list of the items in object o, where + each item is a tuple containing a key-value pair. On + failure, return NULL. This is equivalent to the Python + expression: o.items(). + + */ +#define PyMapping_Items(O) PyObject_CallMethod(O,"items",NULL) + + PyAPI_FUNC(PyObject *) PyMapping_GetItemString(PyObject *o, char *key); + + /* + Return element of o corresponding to the object, key, or NULL + on failure. This is the equivalent of the Python expression: + o[key]. + */ + + PyAPI_FUNC(int) PyMapping_SetItemString(PyObject *o, char *key, + PyObject *value); + + /* + Map the object, key, to the value, v. Returns + -1 on failure. This is the equivalent of the Python + statement: o[key]=v. + */ + + +PyAPI_FUNC(int) PyObject_IsInstance(PyObject *object, PyObject *typeorclass); + /* isinstance(object, typeorclass) */ + +PyAPI_FUNC(int) PyObject_IsSubclass(PyObject *object, PyObject *typeorclass); + /* issubclass(object, typeorclass) */ + + +PyAPI_FUNC(int) _PyObject_RealIsInstance(PyObject *inst, PyObject *cls); + +PyAPI_FUNC(int) _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls); + + +/* For internal use by buffer API functions */ +PyAPI_FUNC(void) _Py_add_one_to_index_F(int nd, Py_ssize_t *index, + const Py_ssize_t *shape); +PyAPI_FUNC(void) _Py_add_one_to_index_C(int nd, Py_ssize_t *index, + const Py_ssize_t *shape); + + +#ifdef __cplusplus +} +#endif +#endif /* Py_ABSTRACTOBJECT_H */ diff --git a/PythonEnv/2.7/Include/asdl.h b/PythonEnv/2.7/Include/asdl.h new file mode 100644 index 0000000000..84e837e752 --- /dev/null +++ b/PythonEnv/2.7/Include/asdl.h @@ -0,0 +1,45 @@ +#ifndef Py_ASDL_H +#define Py_ASDL_H + +typedef PyObject * identifier; +typedef PyObject * string; +typedef PyObject * object; + +#ifndef __cplusplus +typedef enum {false, true} bool; +#endif + +/* It would be nice if the code generated by asdl_c.py was completely + independent of Python, but it is a goal the requires too much work + at this stage. So, for example, I'll represent identifiers as + interned Python strings. +*/ + +/* XXX A sequence should be typed so that its use can be typechecked. */ + +typedef struct { + int size; + void *elements[1]; +} asdl_seq; + +typedef struct { + int size; + int elements[1]; +} asdl_int_seq; + +asdl_seq *asdl_seq_new(int size, PyArena *arena); +asdl_int_seq *asdl_int_seq_new(int size, PyArena *arena); + +#define asdl_seq_GET(S, I) (S)->elements[(I)] +#define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size) +#ifdef Py_DEBUG +#define asdl_seq_SET(S, I, V) { \ + int _asdl_i = (I); \ + assert((S) && _asdl_i < (S)->size); \ + (S)->elements[_asdl_i] = (V); \ +} +#else +#define asdl_seq_SET(S, I, V) (S)->elements[I] = (V) +#endif + +#endif /* !Py_ASDL_H */ diff --git a/PythonEnv/2.7/Include/ast.h b/PythonEnv/2.7/Include/ast.h new file mode 100644 index 0000000000..cc14b7fd76 --- /dev/null +++ b/PythonEnv/2.7/Include/ast.h @@ -0,0 +1,13 @@ +#ifndef Py_AST_H +#define Py_AST_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(mod_ty) PyAST_FromNode(const node *, PyCompilerFlags *flags, + const char *, PyArena *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_AST_H */ diff --git a/PythonEnv/2.7/Include/bitset.h b/PythonEnv/2.7/Include/bitset.h new file mode 100644 index 0000000000..faeb41913d --- /dev/null +++ b/PythonEnv/2.7/Include/bitset.h @@ -0,0 +1,32 @@ + +#ifndef Py_BITSET_H +#define Py_BITSET_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Bitset interface */ + +#define BYTE char + +typedef BYTE *bitset; + +bitset newbitset(int nbits); +void delbitset(bitset bs); +#define testbit(ss, ibit) (((ss)[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0) +int addbit(bitset bs, int ibit); /* Returns 0 if already set */ +int samebitset(bitset bs1, bitset bs2, int nbits); +void mergebitset(bitset bs1, bitset bs2, int nbits); + +#define BITSPERBYTE (8*sizeof(BYTE)) +#define NBYTES(nbits) (((nbits) + BITSPERBYTE - 1) / BITSPERBYTE) + +#define BIT2BYTE(ibit) ((ibit) / BITSPERBYTE) +#define BIT2SHIFT(ibit) ((ibit) % BITSPERBYTE) +#define BIT2MASK(ibit) (1 << BIT2SHIFT(ibit)) +#define BYTE2BIT(ibyte) ((ibyte) * BITSPERBYTE) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BITSET_H */ diff --git a/PythonEnv/2.7/Include/boolobject.h b/PythonEnv/2.7/Include/boolobject.h new file mode 100644 index 0000000000..74e854f706 --- /dev/null +++ b/PythonEnv/2.7/Include/boolobject.h @@ -0,0 +1,36 @@ +/* Boolean object interface */ + +#ifndef Py_BOOLOBJECT_H +#define Py_BOOLOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +typedef PyIntObject PyBoolObject; + +PyAPI_DATA(PyTypeObject) PyBool_Type; + +#define PyBool_Check(x) (Py_TYPE(x) == &PyBool_Type) + +/* Py_False and Py_True are the only two bools in existence. +Don't forget to apply Py_INCREF() when returning either!!! */ + +/* Don't use these directly */ +PyAPI_DATA(PyIntObject) _Py_ZeroStruct, _Py_TrueStruct; + +/* Use these macros */ +#define Py_False ((PyObject *) &_Py_ZeroStruct) +#define Py_True ((PyObject *) &_Py_TrueStruct) + +/* Macros for returning Py_True or Py_False, respectively */ +#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True +#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False + +/* Function to return a bool from a C long */ +PyAPI_FUNC(PyObject *) PyBool_FromLong(long); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BOOLOBJECT_H */ diff --git a/PythonEnv/2.7/Include/bufferobject.h b/PythonEnv/2.7/Include/bufferobject.h new file mode 100644 index 0000000000..6dd83458c5 --- /dev/null +++ b/PythonEnv/2.7/Include/bufferobject.h @@ -0,0 +1,33 @@ + +/* Buffer object interface */ + +/* Note: the object's structure is private */ + +#ifndef Py_BUFFEROBJECT_H +#define Py_BUFFEROBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +PyAPI_DATA(PyTypeObject) PyBuffer_Type; + +#define PyBuffer_Check(op) (Py_TYPE(op) == &PyBuffer_Type) + +#define Py_END_OF_BUFFER (-1) + +PyAPI_FUNC(PyObject *) PyBuffer_FromObject(PyObject *base, + Py_ssize_t offset, Py_ssize_t size); +PyAPI_FUNC(PyObject *) PyBuffer_FromReadWriteObject(PyObject *base, + Py_ssize_t offset, + Py_ssize_t size); + +PyAPI_FUNC(PyObject *) PyBuffer_FromMemory(void *ptr, Py_ssize_t size); +PyAPI_FUNC(PyObject *) PyBuffer_FromReadWriteMemory(void *ptr, Py_ssize_t size); + +PyAPI_FUNC(PyObject *) PyBuffer_New(Py_ssize_t size); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BUFFEROBJECT_H */ diff --git a/PythonEnv/2.7/Include/bytearrayobject.h b/PythonEnv/2.7/Include/bytearrayobject.h new file mode 100644 index 0000000000..e1281a628c --- /dev/null +++ b/PythonEnv/2.7/Include/bytearrayobject.h @@ -0,0 +1,57 @@ +/* ByteArray object interface */ + +#ifndef Py_BYTEARRAYOBJECT_H +#define Py_BYTEARRAYOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* Type PyByteArrayObject represents a mutable array of bytes. + * The Python API is that of a sequence; + * the bytes are mapped to ints in [0, 256). + * Bytes are not characters; they may be used to encode characters. + * The only way to go between bytes and str/unicode is via encoding + * and decoding. + * For the convenience of C programmers, the bytes type is considered + * to contain a char pointer, not an unsigned char pointer. + */ + +/* Object layout */ +typedef struct { + PyObject_VAR_HEAD + /* XXX(nnorwitz): should ob_exports be Py_ssize_t? */ + int ob_exports; /* how many buffer exports */ + Py_ssize_t ob_alloc; /* How many bytes allocated */ + char *ob_bytes; +} PyByteArrayObject; + +/* Type object */ +PyAPI_DATA(PyTypeObject) PyByteArray_Type; +PyAPI_DATA(PyTypeObject) PyByteArrayIter_Type; + +/* Type check macros */ +#define PyByteArray_Check(self) PyObject_TypeCheck(self, &PyByteArray_Type) +#define PyByteArray_CheckExact(self) (Py_TYPE(self) == &PyByteArray_Type) + +/* Direct API functions */ +PyAPI_FUNC(PyObject *) PyByteArray_FromObject(PyObject *); +PyAPI_FUNC(PyObject *) PyByteArray_Concat(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyByteArray_FromStringAndSize(const char *, Py_ssize_t); +PyAPI_FUNC(Py_ssize_t) PyByteArray_Size(PyObject *); +PyAPI_FUNC(char *) PyByteArray_AsString(PyObject *); +PyAPI_FUNC(int) PyByteArray_Resize(PyObject *, Py_ssize_t); + +/* Macros, trading safety for speed */ +#define PyByteArray_AS_STRING(self) \ + (assert(PyByteArray_Check(self)), \ + Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_bytes : _PyByteArray_empty_string) +#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)),Py_SIZE(self)) + +PyAPI_DATA(char) _PyByteArray_empty_string[]; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BYTEARRAYOBJECT_H */ diff --git a/PythonEnv/2.7/Include/bytes_methods.h b/PythonEnv/2.7/Include/bytes_methods.h new file mode 100644 index 0000000000..4125666212 --- /dev/null +++ b/PythonEnv/2.7/Include/bytes_methods.h @@ -0,0 +1,75 @@ +#ifndef Py_BYTES_CTYPE_H +#define Py_BYTES_CTYPE_H + +/* + * The internal implementation behind PyString (bytes) and PyBytes (buffer) + * methods of the given names, they operate on ASCII byte strings. + */ +extern PyObject* _Py_bytes_isspace(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isalpha(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isalnum(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isdigit(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_islower(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isupper(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_istitle(const char *cptr, Py_ssize_t len); + +/* These store their len sized answer in the given preallocated *result arg. */ +extern void _Py_bytes_lower(char *result, const char *cptr, Py_ssize_t len); +extern void _Py_bytes_upper(char *result, const char *cptr, Py_ssize_t len); +extern void _Py_bytes_title(char *result, char *s, Py_ssize_t len); +extern void _Py_bytes_capitalize(char *result, char *s, Py_ssize_t len); +extern void _Py_bytes_swapcase(char *result, char *s, Py_ssize_t len); + +/* Shared __doc__ strings. */ +extern const char _Py_isspace__doc__[]; +extern const char _Py_isalpha__doc__[]; +extern const char _Py_isalnum__doc__[]; +extern const char _Py_isdigit__doc__[]; +extern const char _Py_islower__doc__[]; +extern const char _Py_isupper__doc__[]; +extern const char _Py_istitle__doc__[]; +extern const char _Py_lower__doc__[]; +extern const char _Py_upper__doc__[]; +extern const char _Py_title__doc__[]; +extern const char _Py_capitalize__doc__[]; +extern const char _Py_swapcase__doc__[]; + +/* These are left in for backward compatibility and will be removed + in 2.8/3.2 */ +#define ISLOWER(c) Py_ISLOWER(c) +#define ISUPPER(c) Py_ISUPPER(c) +#define ISALPHA(c) Py_ISALPHA(c) +#define ISDIGIT(c) Py_ISDIGIT(c) +#define ISXDIGIT(c) Py_ISXDIGIT(c) +#define ISALNUM(c) Py_ISALNUM(c) +#define ISSPACE(c) Py_ISSPACE(c) + +#undef islower +#define islower(c) undefined_islower(c) +#undef isupper +#define isupper(c) undefined_isupper(c) +#undef isalpha +#define isalpha(c) undefined_isalpha(c) +#undef isdigit +#define isdigit(c) undefined_isdigit(c) +#undef isxdigit +#define isxdigit(c) undefined_isxdigit(c) +#undef isalnum +#define isalnum(c) undefined_isalnum(c) +#undef isspace +#define isspace(c) undefined_isspace(c) + +/* These are left in for backward compatibility and will be removed + in 2.8/3.2 */ +#define TOLOWER(c) Py_TOLOWER(c) +#define TOUPPER(c) Py_TOUPPER(c) + +#undef tolower +#define tolower(c) undefined_tolower(c) +#undef toupper +#define toupper(c) undefined_toupper(c) + +/* this is needed because some docs are shared from the .o, not static */ +#define PyDoc_STRVAR_shared(name,str) const char name[] = PyDoc_STR(str) + +#endif /* !Py_BYTES_CTYPE_H */ diff --git a/PythonEnv/2.7/Include/bytesobject.h b/PythonEnv/2.7/Include/bytesobject.h new file mode 100644 index 0000000000..1083da9c82 --- /dev/null +++ b/PythonEnv/2.7/Include/bytesobject.h @@ -0,0 +1,27 @@ +#define PyBytesObject PyStringObject +#define PyBytes_Type PyString_Type + +#define PyBytes_Check PyString_Check +#define PyBytes_CheckExact PyString_CheckExact +#define PyBytes_CHECK_INTERNED PyString_CHECK_INTERNED +#define PyBytes_AS_STRING PyString_AS_STRING +#define PyBytes_GET_SIZE PyString_GET_SIZE +#define Py_TPFLAGS_BYTES_SUBCLASS Py_TPFLAGS_STRING_SUBCLASS + +#define PyBytes_FromStringAndSize PyString_FromStringAndSize +#define PyBytes_FromString PyString_FromString +#define PyBytes_FromFormatV PyString_FromFormatV +#define PyBytes_FromFormat PyString_FromFormat +#define PyBytes_Size PyString_Size +#define PyBytes_AsString PyString_AsString +#define PyBytes_Repr PyString_Repr +#define PyBytes_Concat PyString_Concat +#define PyBytes_ConcatAndDel PyString_ConcatAndDel +#define _PyBytes_Resize _PyString_Resize +#define _PyBytes_Eq _PyString_Eq +#define PyBytes_Format PyString_Format +#define _PyBytes_FormatLong _PyString_FormatLong +#define PyBytes_DecodeEscape PyString_DecodeEscape +#define _PyBytes_Join _PyString_Join +#define PyBytes_AsStringAndSize PyString_AsStringAndSize +#define _PyBytes_InsertThousandsGrouping _PyString_InsertThousandsGrouping diff --git a/PythonEnv/2.7/Include/cStringIO.h b/PythonEnv/2.7/Include/cStringIO.h new file mode 100644 index 0000000000..973a471086 --- /dev/null +++ b/PythonEnv/2.7/Include/cStringIO.h @@ -0,0 +1,73 @@ +#ifndef Py_CSTRINGIO_H +#define Py_CSTRINGIO_H +#ifdef __cplusplus +extern "C" { +#endif +/* + + This header provides access to cStringIO objects from C. + Functions are provided for calling cStringIO objects and + macros are provided for testing whether you have cStringIO + objects. + + Before calling any of the functions or macros, you must initialize + the routines with: + + PycString_IMPORT + + This would typically be done in your init function. + +*/ + +#define PycStringIO_CAPSULE_NAME "cStringIO.cStringIO_CAPI" + +#define PycString_IMPORT \ + PycStringIO = ((struct PycStringIO_CAPI*)PyCapsule_Import(\ + PycStringIO_CAPSULE_NAME, 0)) + +/* Basic functions to manipulate cStringIO objects from C */ + +static struct PycStringIO_CAPI { + + /* Read a string from an input object. If the last argument + is -1, the remainder will be read. + */ + int(*cread)(PyObject *, char **, Py_ssize_t); + + /* Read a line from an input object. Returns the length of the read + line as an int and a pointer inside the object buffer as char** (so + the caller doesn't have to provide its own buffer as destination). + */ + int(*creadline)(PyObject *, char **); + + /* Write a string to an output object*/ + int(*cwrite)(PyObject *, const char *, Py_ssize_t); + + /* Get the output object as a Python string (returns new reference). */ + PyObject *(*cgetvalue)(PyObject *); + + /* Create a new output object */ + PyObject *(*NewOutput)(int); + + /* Create an input object from a Python string + (copies the Python string reference). + */ + PyObject *(*NewInput)(PyObject *); + + /* The Python types for cStringIO input and output objects. + Note that you can do input on an output object. + */ + PyTypeObject *InputType, *OutputType; + +} *PycStringIO; + +/* These can be used to test if you have one */ +#define PycStringIO_InputCheck(O) \ + (Py_TYPE(O)==PycStringIO->InputType) +#define PycStringIO_OutputCheck(O) \ + (Py_TYPE(O)==PycStringIO->OutputType) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CSTRINGIO_H */ diff --git a/PythonEnv/2.7/Include/cellobject.h b/PythonEnv/2.7/Include/cellobject.h new file mode 100644 index 0000000000..c927ee5da1 --- /dev/null +++ b/PythonEnv/2.7/Include/cellobject.h @@ -0,0 +1,28 @@ +/* Cell object interface */ + +#ifndef Py_CELLOBJECT_H +#define Py_CELLOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + PyObject *ob_ref; /* Content of the cell or NULL when empty */ +} PyCellObject; + +PyAPI_DATA(PyTypeObject) PyCell_Type; + +#define PyCell_Check(op) (Py_TYPE(op) == &PyCell_Type) + +PyAPI_FUNC(PyObject *) PyCell_New(PyObject *); +PyAPI_FUNC(PyObject *) PyCell_Get(PyObject *); +PyAPI_FUNC(int) PyCell_Set(PyObject *, PyObject *); + +#define PyCell_GET(op) (((PyCellObject *)(op))->ob_ref) +#define PyCell_SET(op, v) (((PyCellObject *)(op))->ob_ref = v) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TUPLEOBJECT_H */ diff --git a/PythonEnv/2.7/Include/ceval.h b/PythonEnv/2.7/Include/ceval.h new file mode 100644 index 0000000000..0e8bd2ab11 --- /dev/null +++ b/PythonEnv/2.7/Include/ceval.h @@ -0,0 +1,153 @@ +#ifndef Py_CEVAL_H +#define Py_CEVAL_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Interface to random parts in ceval.c */ + +PyAPI_FUNC(PyObject *) PyEval_CallObjectWithKeywords( + PyObject *, PyObject *, PyObject *); + +/* Inline this */ +#define PyEval_CallObject(func,arg) \ + PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL) + +PyAPI_FUNC(PyObject *) PyEval_CallFunction(PyObject *obj, + const char *format, ...); +PyAPI_FUNC(PyObject *) PyEval_CallMethod(PyObject *obj, + const char *methodname, + const char *format, ...); + +PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *); +PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *); + +struct _frame; /* Avoid including frameobject.h */ + +PyAPI_FUNC(PyObject *) PyEval_GetBuiltins(void); +PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void); +PyAPI_FUNC(PyObject *) PyEval_GetLocals(void); +PyAPI_FUNC(struct _frame *) PyEval_GetFrame(void); +PyAPI_FUNC(int) PyEval_GetRestricted(void); + +/* Look at the current frame's (if any) code's co_flags, and turn on + the corresponding compiler flags in cf->cf_flags. Return 1 if any + flag was set, else return 0. */ +PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf); + +PyAPI_FUNC(int) Py_FlushLine(void); + +PyAPI_FUNC(int) Py_AddPendingCall(int (*func)(void *), void *arg); +PyAPI_FUNC(int) Py_MakePendingCalls(void); + +/* Protection against deeply nested recursive calls */ +PyAPI_FUNC(void) Py_SetRecursionLimit(int); +PyAPI_FUNC(int) Py_GetRecursionLimit(void); + +#define Py_EnterRecursiveCall(where) \ + (_Py_MakeRecCheck(PyThreadState_GET()->recursion_depth) && \ + _Py_CheckRecursiveCall(where)) +#define Py_LeaveRecursiveCall() \ + (--PyThreadState_GET()->recursion_depth) +PyAPI_FUNC(int) _Py_CheckRecursiveCall(char *where); +PyAPI_DATA(int) _Py_CheckRecursionLimit; +#ifdef USE_STACKCHECK +# define _Py_MakeRecCheck(x) (++(x) > --_Py_CheckRecursionLimit) +#else +# define _Py_MakeRecCheck(x) (++(x) > _Py_CheckRecursionLimit) +#endif + +PyAPI_FUNC(const char *) PyEval_GetFuncName(PyObject *); +PyAPI_FUNC(const char *) PyEval_GetFuncDesc(PyObject *); + +PyAPI_FUNC(PyObject *) PyEval_GetCallStats(PyObject *); +PyAPI_FUNC(PyObject *) PyEval_EvalFrame(struct _frame *); +PyAPI_FUNC(PyObject *) PyEval_EvalFrameEx(struct _frame *f, int exc); + +/* this used to be handled on a per-thread basis - now just two globals */ +PyAPI_DATA(volatile int) _Py_Ticker; +PyAPI_DATA(int) _Py_CheckInterval; + +/* Interface for threads. + + A module that plans to do a blocking system call (or something else + that lasts a long time and doesn't touch Python data) can allow other + threads to run as follows: + + ...preparations here... + Py_BEGIN_ALLOW_THREADS + ...blocking system call here... + Py_END_ALLOW_THREADS + ...interpret result here... + + The Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS pair expands to a + {}-surrounded block. + To leave the block in the middle (e.g., with return), you must insert + a line containing Py_BLOCK_THREADS before the return, e.g. + + if (...premature_exit...) { + Py_BLOCK_THREADS + PyErr_SetFromErrno(PyExc_IOError); + return NULL; + } + + An alternative is: + + Py_BLOCK_THREADS + if (...premature_exit...) { + PyErr_SetFromErrno(PyExc_IOError); + return NULL; + } + Py_UNBLOCK_THREADS + + For convenience, that the value of 'errno' is restored across + Py_END_ALLOW_THREADS and Py_BLOCK_THREADS. + + WARNING: NEVER NEST CALLS TO Py_BEGIN_ALLOW_THREADS AND + Py_END_ALLOW_THREADS!!! + + The function PyEval_InitThreads() should be called only from + initthread() in "threadmodule.c". + + Note that not yet all candidates have been converted to use this + mechanism! +*/ + +PyAPI_FUNC(PyThreadState *) PyEval_SaveThread(void); +PyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *); + +#ifdef WITH_THREAD + +PyAPI_FUNC(int) PyEval_ThreadsInitialized(void); +PyAPI_FUNC(void) PyEval_InitThreads(void); +PyAPI_FUNC(void) PyEval_AcquireLock(void); +PyAPI_FUNC(void) PyEval_ReleaseLock(void); +PyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate); +PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate); +PyAPI_FUNC(void) PyEval_ReInitThreads(void); + +#define Py_BEGIN_ALLOW_THREADS { \ + PyThreadState *_save; \ + _save = PyEval_SaveThread(); +#define Py_BLOCK_THREADS PyEval_RestoreThread(_save); +#define Py_UNBLOCK_THREADS _save = PyEval_SaveThread(); +#define Py_END_ALLOW_THREADS PyEval_RestoreThread(_save); \ + } + +#else /* !WITH_THREAD */ + +#define Py_BEGIN_ALLOW_THREADS { +#define Py_BLOCK_THREADS +#define Py_UNBLOCK_THREADS +#define Py_END_ALLOW_THREADS } + +#endif /* !WITH_THREAD */ + +PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CEVAL_H */ diff --git a/PythonEnv/2.7/Include/classobject.h b/PythonEnv/2.7/Include/classobject.h new file mode 100644 index 0000000000..bc03e0d027 --- /dev/null +++ b/PythonEnv/2.7/Include/classobject.h @@ -0,0 +1,83 @@ + +/* Class object interface */ + +/* Revealing some structures (not for general use) */ + +#ifndef Py_CLASSOBJECT_H +#define Py_CLASSOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + PyObject *cl_bases; /* A tuple of class objects */ + PyObject *cl_dict; /* A dictionary */ + PyObject *cl_name; /* A string */ + /* The following three are functions or NULL */ + PyObject *cl_getattr; + PyObject *cl_setattr; + PyObject *cl_delattr; + PyObject *cl_weakreflist; /* List of weak references */ +} PyClassObject; + +typedef struct { + PyObject_HEAD + PyClassObject *in_class; /* The class object */ + PyObject *in_dict; /* A dictionary */ + PyObject *in_weakreflist; /* List of weak references */ +} PyInstanceObject; + +typedef struct { + PyObject_HEAD + PyObject *im_func; /* The callable object implementing the method */ + PyObject *im_self; /* The instance it is bound to, or NULL */ + PyObject *im_class; /* The class that asked for the method */ + PyObject *im_weakreflist; /* List of weak references */ +} PyMethodObject; + +PyAPI_DATA(PyTypeObject) PyClass_Type, PyInstance_Type, PyMethod_Type; + +#define PyClass_Check(op) ((op)->ob_type == &PyClass_Type) +#define PyInstance_Check(op) ((op)->ob_type == &PyInstance_Type) +#define PyMethod_Check(op) ((op)->ob_type == &PyMethod_Type) + +PyAPI_FUNC(PyObject *) PyClass_New(PyObject *, PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyInstance_New(PyObject *, PyObject *, + PyObject *); +PyAPI_FUNC(PyObject *) PyInstance_NewRaw(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyMethod_New(PyObject *, PyObject *, PyObject *); + +PyAPI_FUNC(PyObject *) PyMethod_Function(PyObject *); +PyAPI_FUNC(PyObject *) PyMethod_Self(PyObject *); +PyAPI_FUNC(PyObject *) PyMethod_Class(PyObject *); + +/* Look up attribute with name (a string) on instance object pinst, using + * only the instance and base class dicts. If a descriptor is found in + * a class dict, the descriptor is returned without calling it. + * Returns NULL if nothing found, else a borrowed reference to the + * value associated with name in the dict in which name was found. + * The point of this routine is that it never calls arbitrary Python + * code, so is always "safe": all it does is dict lookups. The function + * can't fail, never sets an exception, and NULL is not an error (it just + * means "not found"). + */ +PyAPI_FUNC(PyObject *) _PyInstance_Lookup(PyObject *pinst, PyObject *name); + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyMethod_GET_FUNCTION(meth) \ + (((PyMethodObject *)meth) -> im_func) +#define PyMethod_GET_SELF(meth) \ + (((PyMethodObject *)meth) -> im_self) +#define PyMethod_GET_CLASS(meth) \ + (((PyMethodObject *)meth) -> im_class) + +PyAPI_FUNC(int) PyClass_IsSubclass(PyObject *, PyObject *); + +PyAPI_FUNC(int) PyMethod_ClearFreeList(void); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CLASSOBJECT_H */ diff --git a/PythonEnv/2.7/Include/cobject.h b/PythonEnv/2.7/Include/cobject.h new file mode 100644 index 0000000000..ad3cd9c982 --- /dev/null +++ b/PythonEnv/2.7/Include/cobject.h @@ -0,0 +1,89 @@ +/* + CObjects are marked Pending Deprecation as of Python 2.7. + The full schedule for 2.x is as follows: + - CObjects are marked Pending Deprecation in Python 2.7. + - CObjects will be marked Deprecated in Python 2.8 + (if there is one). + - CObjects will be removed in Python 2.9 (if there is one). + + Additionally, for the Python 3.x series: + - CObjects were marked Deprecated in Python 3.1. + - CObjects will be removed in Python 3.2. + + You should switch all use of CObjects to capsules. Capsules + have a safer and more consistent API. For more information, + see Include/pycapsule.h, or read the "Capsules" topic in + the "Python/C API Reference Manual". + + Python 2.7 no longer uses CObjects itself; all objects which + were formerly CObjects are now capsules. Note that this change + does not by itself break binary compatibility with extensions + built for previous versions of Python--PyCObject_AsVoidPtr() + has been changed to also understand capsules. + +*/ + +/* original file header comment follows: */ + +/* C objects to be exported from one extension module to another. + + C objects are used for communication between extension modules. + They provide a way for an extension module to export a C interface + to other extension modules, so that extension modules can use the + Python import mechanism to link to one another. + +*/ + +#ifndef Py_COBJECT_H +#define Py_COBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyCObject_Type; + +#define PyCObject_Check(op) (Py_TYPE(op) == &PyCObject_Type) + +/* Create a PyCObject from a pointer to a C object and an optional + destructor function. If the second argument is non-null, then it + will be called with the first argument if and when the PyCObject is + destroyed. + +*/ +PyAPI_FUNC(PyObject *) PyCObject_FromVoidPtr( + void *cobj, void (*destruct)(void*)); + + +/* Create a PyCObject from a pointer to a C object, a description object, + and an optional destructor function. If the third argument is non-null, + then it will be called with the first and second arguments if and when + the PyCObject is destroyed. +*/ +PyAPI_FUNC(PyObject *) PyCObject_FromVoidPtrAndDesc( + void *cobj, void *desc, void (*destruct)(void*,void*)); + +/* Retrieve a pointer to a C object from a PyCObject. */ +PyAPI_FUNC(void *) PyCObject_AsVoidPtr(PyObject *); + +/* Retrieve a pointer to a description object from a PyCObject. */ +PyAPI_FUNC(void *) PyCObject_GetDesc(PyObject *); + +/* Import a pointer to a C object from a module using a PyCObject. */ +PyAPI_FUNC(void *) PyCObject_Import(char *module_name, char *cobject_name); + +/* Modify a C object. Fails (==0) if object has a destructor. */ +PyAPI_FUNC(int) PyCObject_SetVoidPtr(PyObject *self, void *cobj); + + +typedef struct { + PyObject_HEAD + void *cobject; + void *desc; + void (*destructor)(void *); +} PyCObject; + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_COBJECT_H */ diff --git a/PythonEnv/2.7/Include/code.h b/PythonEnv/2.7/Include/code.h new file mode 100644 index 0000000000..38b2958046 --- /dev/null +++ b/PythonEnv/2.7/Include/code.h @@ -0,0 +1,107 @@ +/* Definitions for bytecode */ + +#ifndef Py_CODE_H +#define Py_CODE_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Bytecode object */ +typedef struct { + PyObject_HEAD + int co_argcount; /* #arguments, except *args */ + int co_nlocals; /* #local variables */ + int co_stacksize; /* #entries needed for evaluation stack */ + int co_flags; /* CO_..., see below */ + PyObject *co_code; /* instruction opcodes */ + PyObject *co_consts; /* list (constants used) */ + PyObject *co_names; /* list of strings (names used) */ + PyObject *co_varnames; /* tuple of strings (local variable names) */ + PyObject *co_freevars; /* tuple of strings (free variable names) */ + PyObject *co_cellvars; /* tuple of strings (cell variable names) */ + /* The rest doesn't count for hash/cmp */ + PyObject *co_filename; /* string (where it was loaded from) */ + PyObject *co_name; /* string (name, for reference) */ + int co_firstlineno; /* first source line number */ + PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See + Objects/lnotab_notes.txt for details. */ + void *co_zombieframe; /* for optimization only (see frameobject.c) */ + PyObject *co_weakreflist; /* to support weakrefs to code objects */ +} PyCodeObject; + +/* Masks for co_flags above */ +#define CO_OPTIMIZED 0x0001 +#define CO_NEWLOCALS 0x0002 +#define CO_VARARGS 0x0004 +#define CO_VARKEYWORDS 0x0008 +#define CO_NESTED 0x0010 +#define CO_GENERATOR 0x0020 +/* The CO_NOFREE flag is set if there are no free or cell variables. + This information is redundant, but it allows a single flag test + to determine whether there is any extra work to be done when the + call frame it setup. +*/ +#define CO_NOFREE 0x0040 + +#if 0 +/* This is no longer used. Stopped defining in 2.5, do not re-use. */ +#define CO_GENERATOR_ALLOWED 0x1000 +#endif +#define CO_FUTURE_DIVISION 0x2000 +#define CO_FUTURE_ABSOLUTE_IMPORT 0x4000 /* do absolute imports by default */ +#define CO_FUTURE_WITH_STATEMENT 0x8000 +#define CO_FUTURE_PRINT_FUNCTION 0x10000 +#define CO_FUTURE_UNICODE_LITERALS 0x20000 + +/* This should be defined if a future statement modifies the syntax. + For example, when a keyword is added. +*/ +#if 1 +#define PY_PARSER_REQUIRES_FUTURE_KEYWORD +#endif + +#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */ + +PyAPI_DATA(PyTypeObject) PyCode_Type; + +#define PyCode_Check(op) (Py_TYPE(op) == &PyCode_Type) +#define PyCode_GetNumFree(op) (PyTuple_GET_SIZE((op)->co_freevars)) + +/* Public interface */ +PyAPI_FUNC(PyCodeObject *) PyCode_New( + int, int, int, int, PyObject *, PyObject *, PyObject *, PyObject *, + PyObject *, PyObject *, PyObject *, PyObject *, int, PyObject *); + /* same as struct above */ + +/* Creates a new empty code object with the specified source location. */ +PyAPI_FUNC(PyCodeObject *) +PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno); + +/* Return the line number associated with the specified bytecode index + in this code object. If you just need the line number of a frame, + use PyFrame_GetLineNumber() instead. */ +PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int); + +/* for internal use only */ +#define _PyCode_GETCODEPTR(co, pp) \ + ((*Py_TYPE((co)->co_code)->tp_as_buffer->bf_getreadbuffer) \ + ((co)->co_code, 0, (void **)(pp))) + +typedef struct _addr_pair { + int ap_lower; + int ap_upper; +} PyAddrPair; + +/* Update *bounds to describe the first and one-past-the-last instructions in the + same line as lasti. Return the number of that line. +*/ +PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co, + int lasti, PyAddrPair *bounds); + +PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts, + PyObject *names, PyObject *lineno_obj); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CODE_H */ diff --git a/PythonEnv/2.7/Include/codecs.h b/PythonEnv/2.7/Include/codecs.h new file mode 100644 index 0000000000..c038c6a92c --- /dev/null +++ b/PythonEnv/2.7/Include/codecs.h @@ -0,0 +1,167 @@ +#ifndef Py_CODECREGISTRY_H +#define Py_CODECREGISTRY_H +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------ + + Python Codec Registry and support functions + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +Copyright (c) Corporation for National Research Initiatives. + + ------------------------------------------------------------------------ */ + +/* Register a new codec search function. + + As side effect, this tries to load the encodings package, if not + yet done, to make sure that it is always first in the list of + search functions. + + The search_function's refcount is incremented by this function. */ + +PyAPI_FUNC(int) PyCodec_Register( + PyObject *search_function + ); + +/* Codec register lookup API. + + Looks up the given encoding and returns a CodecInfo object with + function attributes which implement the different aspects of + processing the encoding. + + The encoding string is looked up converted to all lower-case + characters. This makes encodings looked up through this mechanism + effectively case-insensitive. + + If no codec is found, a KeyError is set and NULL returned. + + As side effect, this tries to load the encodings package, if not + yet done. This is part of the lazy load strategy for the encodings + package. + + */ + +PyAPI_FUNC(PyObject *) _PyCodec_Lookup( + const char *encoding + ); + +/* Generic codec based encoding API. + + object is passed through the encoder function found for the given + encoding using the error handling method defined by errors. errors + may be NULL to use the default method defined for the codec. + + Raises a LookupError in case no encoder can be found. + + */ + +PyAPI_FUNC(PyObject *) PyCodec_Encode( + PyObject *object, + const char *encoding, + const char *errors + ); + +/* Generic codec based decoding API. + + object is passed through the decoder function found for the given + encoding using the error handling method defined by errors. errors + may be NULL to use the default method defined for the codec. + + Raises a LookupError in case no encoder can be found. + + */ + +PyAPI_FUNC(PyObject *) PyCodec_Decode( + PyObject *object, + const char *encoding, + const char *errors + ); + +/* --- Codec Lookup APIs -------------------------------------------------- + + All APIs return a codec object with incremented refcount and are + based on _PyCodec_Lookup(). The same comments w/r to the encoding + name also apply to these APIs. + +*/ + +/* Get an encoder function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_Encoder( + const char *encoding + ); + +/* Get a decoder function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_Decoder( + const char *encoding + ); + +/* Get a IncrementalEncoder object for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_IncrementalEncoder( + const char *encoding, + const char *errors + ); + +/* Get a IncrementalDecoder object function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_IncrementalDecoder( + const char *encoding, + const char *errors + ); + +/* Get a StreamReader factory function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_StreamReader( + const char *encoding, + PyObject *stream, + const char *errors + ); + +/* Get a StreamWriter factory function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_StreamWriter( + const char *encoding, + PyObject *stream, + const char *errors + ); + +/* Unicode encoding error handling callback registry API */ + +/* Register the error handling callback function error under the given + name. This function will be called by the codec when it encounters + unencodable characters/undecodable bytes and doesn't know the + callback name, when name is specified as the error parameter + in the call to the encode/decode function. + Return 0 on success, -1 on error */ +PyAPI_FUNC(int) PyCodec_RegisterError(const char *name, PyObject *error); + +/* Lookup the error handling callback function registered under the given + name. As a special case NULL can be passed, in which case + the error handling callback for "strict" will be returned. */ +PyAPI_FUNC(PyObject *) PyCodec_LookupError(const char *name); + +/* raise exc as an exception */ +PyAPI_FUNC(PyObject *) PyCodec_StrictErrors(PyObject *exc); + +/* ignore the unicode error, skipping the faulty input */ +PyAPI_FUNC(PyObject *) PyCodec_IgnoreErrors(PyObject *exc); + +/* replace the unicode encode error with ? or U+FFFD */ +PyAPI_FUNC(PyObject *) PyCodec_ReplaceErrors(PyObject *exc); + +/* replace the unicode encode error with XML character references */ +PyAPI_FUNC(PyObject *) PyCodec_XMLCharRefReplaceErrors(PyObject *exc); + +/* replace the unicode encode error with backslash escapes (\x, \u and \U) */ +PyAPI_FUNC(PyObject *) PyCodec_BackslashReplaceErrors(PyObject *exc); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CODECREGISTRY_H */ diff --git a/PythonEnv/2.7/Include/compile.h b/PythonEnv/2.7/Include/compile.h new file mode 100644 index 0000000000..61001016aa --- /dev/null +++ b/PythonEnv/2.7/Include/compile.h @@ -0,0 +1,40 @@ + +#ifndef Py_COMPILE_H +#define Py_COMPILE_H + +#include "code.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Public interface */ +struct _node; /* Declare the existence of this type */ +PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *); + +/* Future feature support */ + +typedef struct { + int ff_features; /* flags set by future statements */ + int ff_lineno; /* line number of last future statement */ +} PyFutureFeatures; + +#define FUTURE_NESTED_SCOPES "nested_scopes" +#define FUTURE_GENERATORS "generators" +#define FUTURE_DIVISION "division" +#define FUTURE_ABSOLUTE_IMPORT "absolute_import" +#define FUTURE_WITH_STATEMENT "with_statement" +#define FUTURE_PRINT_FUNCTION "print_function" +#define FUTURE_UNICODE_LITERALS "unicode_literals" + + +struct _mod; /* Declare the existence of this type */ +PyAPI_FUNC(PyCodeObject *) PyAST_Compile(struct _mod *, const char *, + PyCompilerFlags *, PyArena *); +PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_COMPILE_H */ diff --git a/PythonEnv/2.7/Include/complexobject.h b/PythonEnv/2.7/Include/complexobject.h new file mode 100644 index 0000000000..c9a9500fd7 --- /dev/null +++ b/PythonEnv/2.7/Include/complexobject.h @@ -0,0 +1,66 @@ +/* Complex number structure */ + +#ifndef Py_COMPLEXOBJECT_H +#define Py_COMPLEXOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + double real; + double imag; +} Py_complex; + +/* Operations on complex numbers from complexmodule.c */ + +#define c_sum _Py_c_sum +#define c_diff _Py_c_diff +#define c_neg _Py_c_neg +#define c_prod _Py_c_prod +#define c_quot _Py_c_quot +#define c_pow _Py_c_pow +#define c_abs _Py_c_abs + +PyAPI_FUNC(Py_complex) c_sum(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) c_diff(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) c_neg(Py_complex); +PyAPI_FUNC(Py_complex) c_prod(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) c_quot(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) c_pow(Py_complex, Py_complex); +PyAPI_FUNC(double) c_abs(Py_complex); + + +/* Complex object interface */ + +/* +PyComplexObject represents a complex number with double-precision +real and imaginary parts. +*/ + +typedef struct { + PyObject_HEAD + Py_complex cval; +} PyComplexObject; + +PyAPI_DATA(PyTypeObject) PyComplex_Type; + +#define PyComplex_Check(op) PyObject_TypeCheck(op, &PyComplex_Type) +#define PyComplex_CheckExact(op) (Py_TYPE(op) == &PyComplex_Type) + +PyAPI_FUNC(PyObject *) PyComplex_FromCComplex(Py_complex); +PyAPI_FUNC(PyObject *) PyComplex_FromDoubles(double real, double imag); + +PyAPI_FUNC(double) PyComplex_RealAsDouble(PyObject *op); +PyAPI_FUNC(double) PyComplex_ImagAsDouble(PyObject *op); +PyAPI_FUNC(Py_complex) PyComplex_AsCComplex(PyObject *op); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(PyObject *) _PyComplex_FormatAdvanced(PyObject *obj, + char *format_spec, + Py_ssize_t format_spec_len); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_COMPLEXOBJECT_H */ diff --git a/PythonEnv/2.7/Include/datetime.h b/PythonEnv/2.7/Include/datetime.h new file mode 100644 index 0000000000..47abe5cb86 --- /dev/null +++ b/PythonEnv/2.7/Include/datetime.h @@ -0,0 +1,239 @@ +/* datetime.h + */ + +#ifndef DATETIME_H +#define DATETIME_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Fields are packed into successive bytes, each viewed as unsigned and + * big-endian, unless otherwise noted: + * + * byte offset + * 0 year 2 bytes, 1-9999 + * 2 month 1 byte, 1-12 + * 3 day 1 byte, 1-31 + * 4 hour 1 byte, 0-23 + * 5 minute 1 byte, 0-59 + * 6 second 1 byte, 0-59 + * 7 usecond 3 bytes, 0-999999 + * 10 + */ + +/* # of bytes for year, month, and day. */ +#define _PyDateTime_DATE_DATASIZE 4 + +/* # of bytes for hour, minute, second, and usecond. */ +#define _PyDateTime_TIME_DATASIZE 6 + +/* # of bytes for year, month, day, hour, minute, second, and usecond. */ +#define _PyDateTime_DATETIME_DATASIZE 10 + + +typedef struct +{ + PyObject_HEAD + long hashcode; /* -1 when unknown */ + int days; /* -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS */ + int seconds; /* 0 <= seconds < 24*3600 is invariant */ + int microseconds; /* 0 <= microseconds < 1000000 is invariant */ +} PyDateTime_Delta; + +typedef struct +{ + PyObject_HEAD /* a pure abstract base clase */ +} PyDateTime_TZInfo; + + +/* The datetime and time types have hashcodes, and an optional tzinfo member, + * present if and only if hastzinfo is true. + */ +#define _PyTZINFO_HEAD \ + PyObject_HEAD \ + long hashcode; \ + char hastzinfo; /* boolean flag */ + +/* No _PyDateTime_BaseTZInfo is allocated; it's just to have something + * convenient to cast to, when getting at the hastzinfo member of objects + * starting with _PyTZINFO_HEAD. + */ +typedef struct +{ + _PyTZINFO_HEAD +} _PyDateTime_BaseTZInfo; + +/* All time objects are of PyDateTime_TimeType, but that can be allocated + * in two ways, with or without a tzinfo member. Without is the same as + * tzinfo == None, but consumes less memory. _PyDateTime_BaseTime is an + * internal struct used to allocate the right amount of space for the + * "without" case. + */ +#define _PyDateTime_TIMEHEAD \ + _PyTZINFO_HEAD \ + unsigned char data[_PyDateTime_TIME_DATASIZE]; + +typedef struct +{ + _PyDateTime_TIMEHEAD +} _PyDateTime_BaseTime; /* hastzinfo false */ + +typedef struct +{ + _PyDateTime_TIMEHEAD + PyObject *tzinfo; +} PyDateTime_Time; /* hastzinfo true */ + + +/* All datetime objects are of PyDateTime_DateTimeType, but that can be + * allocated in two ways too, just like for time objects above. In addition, + * the plain date type is a base class for datetime, so it must also have + * a hastzinfo member (although it's unused there). + */ +typedef struct +{ + _PyTZINFO_HEAD + unsigned char data[_PyDateTime_DATE_DATASIZE]; +} PyDateTime_Date; + +#define _PyDateTime_DATETIMEHEAD \ + _PyTZINFO_HEAD \ + unsigned char data[_PyDateTime_DATETIME_DATASIZE]; + +typedef struct +{ + _PyDateTime_DATETIMEHEAD +} _PyDateTime_BaseDateTime; /* hastzinfo false */ + +typedef struct +{ + _PyDateTime_DATETIMEHEAD + PyObject *tzinfo; +} PyDateTime_DateTime; /* hastzinfo true */ + + +/* Apply for date and datetime instances. */ +#define PyDateTime_GET_YEAR(o) ((((PyDateTime_Date*)o)->data[0] << 8) | \ + ((PyDateTime_Date*)o)->data[1]) +#define PyDateTime_GET_MONTH(o) (((PyDateTime_Date*)o)->data[2]) +#define PyDateTime_GET_DAY(o) (((PyDateTime_Date*)o)->data[3]) + +#define PyDateTime_DATE_GET_HOUR(o) (((PyDateTime_DateTime*)o)->data[4]) +#define PyDateTime_DATE_GET_MINUTE(o) (((PyDateTime_DateTime*)o)->data[5]) +#define PyDateTime_DATE_GET_SECOND(o) (((PyDateTime_DateTime*)o)->data[6]) +#define PyDateTime_DATE_GET_MICROSECOND(o) \ + ((((PyDateTime_DateTime*)o)->data[7] << 16) | \ + (((PyDateTime_DateTime*)o)->data[8] << 8) | \ + ((PyDateTime_DateTime*)o)->data[9]) + +/* Apply for time instances. */ +#define PyDateTime_TIME_GET_HOUR(o) (((PyDateTime_Time*)o)->data[0]) +#define PyDateTime_TIME_GET_MINUTE(o) (((PyDateTime_Time*)o)->data[1]) +#define PyDateTime_TIME_GET_SECOND(o) (((PyDateTime_Time*)o)->data[2]) +#define PyDateTime_TIME_GET_MICROSECOND(o) \ + ((((PyDateTime_Time*)o)->data[3] << 16) | \ + (((PyDateTime_Time*)o)->data[4] << 8) | \ + ((PyDateTime_Time*)o)->data[5]) + + +/* Define structure for C API. */ +typedef struct { + /* type objects */ + PyTypeObject *DateType; + PyTypeObject *DateTimeType; + PyTypeObject *TimeType; + PyTypeObject *DeltaType; + PyTypeObject *TZInfoType; + + /* constructors */ + PyObject *(*Date_FromDate)(int, int, int, PyTypeObject*); + PyObject *(*DateTime_FromDateAndTime)(int, int, int, int, int, int, int, + PyObject*, PyTypeObject*); + PyObject *(*Time_FromTime)(int, int, int, int, PyObject*, PyTypeObject*); + PyObject *(*Delta_FromDelta)(int, int, int, int, PyTypeObject*); + + /* constructors for the DB API */ + PyObject *(*DateTime_FromTimestamp)(PyObject*, PyObject*, PyObject*); + PyObject *(*Date_FromTimestamp)(PyObject*, PyObject*); + +} PyDateTime_CAPI; + +#define PyDateTime_CAPSULE_NAME "datetime.datetime_CAPI" + + +/* "magic" constant used to partially protect against developer mistakes. */ +#define DATETIME_API_MAGIC 0x414548d5 + +#ifdef Py_BUILD_CORE + +/* Macros for type checking when building the Python core. */ +#define PyDate_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateType) +#define PyDate_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateType) + +#define PyDateTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateTimeType) +#define PyDateTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateTimeType) + +#define PyTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeType) +#define PyTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TimeType) + +#define PyDelta_Check(op) PyObject_TypeCheck(op, &PyDateTime_DeltaType) +#define PyDelta_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DeltaType) + +#define PyTZInfo_Check(op) PyObject_TypeCheck(op, &PyDateTime_TZInfoType) +#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TZInfoType) + +#else + +/* Define global variable for the C API and a macro for setting it. */ +static PyDateTime_CAPI *PyDateTimeAPI = NULL; + +#define PyDateTime_IMPORT \ + PyDateTimeAPI = (PyDateTime_CAPI *)PyCapsule_Import(PyDateTime_CAPSULE_NAME, 0) + +/* Macros for type checking when not building the Python core. */ +#define PyDate_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateType) +#define PyDate_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateType) + +#define PyDateTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateTimeType) +#define PyDateTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateTimeType) + +#define PyTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TimeType) +#define PyTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TimeType) + +#define PyDelta_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DeltaType) +#define PyDelta_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DeltaType) + +#define PyTZInfo_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TZInfoType) +#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TZInfoType) + +/* Macros for accessing constructors in a simplified fashion. */ +#define PyDate_FromDate(year, month, day) \ + PyDateTimeAPI->Date_FromDate(year, month, day, PyDateTimeAPI->DateType) + +#define PyDateTime_FromDateAndTime(year, month, day, hour, min, sec, usec) \ + PyDateTimeAPI->DateTime_FromDateAndTime(year, month, day, hour, \ + min, sec, usec, Py_None, PyDateTimeAPI->DateTimeType) + +#define PyTime_FromTime(hour, minute, second, usecond) \ + PyDateTimeAPI->Time_FromTime(hour, minute, second, usecond, \ + Py_None, PyDateTimeAPI->TimeType) + +#define PyDelta_FromDSU(days, seconds, useconds) \ + PyDateTimeAPI->Delta_FromDelta(days, seconds, useconds, 1, \ + PyDateTimeAPI->DeltaType) + +/* Macros supporting the DB API. */ +#define PyDateTime_FromTimestamp(args) \ + PyDateTimeAPI->DateTime_FromTimestamp( \ + (PyObject*) (PyDateTimeAPI->DateTimeType), args, NULL) + +#define PyDate_FromTimestamp(args) \ + PyDateTimeAPI->Date_FromTimestamp( \ + (PyObject*) (PyDateTimeAPI->DateType), args) + +#endif /* Py_BUILD_CORE */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/PythonEnv/2.7/Include/descrobject.h b/PythonEnv/2.7/Include/descrobject.h new file mode 100644 index 0000000000..b542732b16 --- /dev/null +++ b/PythonEnv/2.7/Include/descrobject.h @@ -0,0 +1,94 @@ +/* Descriptors */ +#ifndef Py_DESCROBJECT_H +#define Py_DESCROBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef PyObject *(*getter)(PyObject *, void *); +typedef int (*setter)(PyObject *, PyObject *, void *); + +typedef struct PyGetSetDef { + char *name; + getter get; + setter set; + char *doc; + void *closure; +} PyGetSetDef; + +typedef PyObject *(*wrapperfunc)(PyObject *self, PyObject *args, + void *wrapped); + +typedef PyObject *(*wrapperfunc_kwds)(PyObject *self, PyObject *args, + void *wrapped, PyObject *kwds); + +struct wrapperbase { + char *name; + int offset; + void *function; + wrapperfunc wrapper; + char *doc; + int flags; + PyObject *name_strobj; +}; + +/* Flags for above struct */ +#define PyWrapperFlag_KEYWORDS 1 /* wrapper function takes keyword args */ + +/* Various kinds of descriptor objects */ + +#define PyDescr_COMMON \ + PyObject_HEAD \ + PyTypeObject *d_type; \ + PyObject *d_name + +typedef struct { + PyDescr_COMMON; +} PyDescrObject; + +typedef struct { + PyDescr_COMMON; + PyMethodDef *d_method; +} PyMethodDescrObject; + +typedef struct { + PyDescr_COMMON; + struct PyMemberDef *d_member; +} PyMemberDescrObject; + +typedef struct { + PyDescr_COMMON; + PyGetSetDef *d_getset; +} PyGetSetDescrObject; + +typedef struct { + PyDescr_COMMON; + struct wrapperbase *d_base; + void *d_wrapped; /* This can be any function pointer */ +} PyWrapperDescrObject; + +PyAPI_DATA(PyTypeObject) PyWrapperDescr_Type; +PyAPI_DATA(PyTypeObject) PyDictProxy_Type; +PyAPI_DATA(PyTypeObject) PyGetSetDescr_Type; +PyAPI_DATA(PyTypeObject) PyMemberDescr_Type; + +PyAPI_FUNC(PyObject *) PyDescr_NewMethod(PyTypeObject *, PyMethodDef *); +PyAPI_FUNC(PyObject *) PyDescr_NewClassMethod(PyTypeObject *, PyMethodDef *); +PyAPI_FUNC(PyObject *) PyDescr_NewMember(PyTypeObject *, + struct PyMemberDef *); +PyAPI_FUNC(PyObject *) PyDescr_NewGetSet(PyTypeObject *, + struct PyGetSetDef *); +PyAPI_FUNC(PyObject *) PyDescr_NewWrapper(PyTypeObject *, + struct wrapperbase *, void *); +#define PyDescr_IsData(d) (Py_TYPE(d)->tp_descr_set != NULL) + +PyAPI_FUNC(PyObject *) PyDictProxy_New(PyObject *); +PyAPI_FUNC(PyObject *) PyWrapper_New(PyObject *, PyObject *); + + +PyAPI_DATA(PyTypeObject) PyProperty_Type; +#ifdef __cplusplus +} +#endif +#endif /* !Py_DESCROBJECT_H */ + diff --git a/PythonEnv/2.7/Include/dictobject.h b/PythonEnv/2.7/Include/dictobject.h new file mode 100644 index 0000000000..ece01c64d6 --- /dev/null +++ b/PythonEnv/2.7/Include/dictobject.h @@ -0,0 +1,156 @@ +#ifndef Py_DICTOBJECT_H +#define Py_DICTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Dictionary object type -- mapping from hashable object to object */ + +/* The distribution includes a separate file, Objects/dictnotes.txt, + describing explorations into dictionary design and optimization. + It covers typical dictionary use patterns, the parameters for + tuning dictionaries, and several ideas for possible optimizations. +*/ + +/* +There are three kinds of slots in the table: + +1. Unused. me_key == me_value == NULL + Does not hold an active (key, value) pair now and never did. Unused can + transition to Active upon key insertion. This is the only case in which + me_key is NULL, and is each slot's initial state. + +2. Active. me_key != NULL and me_key != dummy and me_value != NULL + Holds an active (key, value) pair. Active can transition to Dummy upon + key deletion. This is the only case in which me_value != NULL. + +3. Dummy. me_key == dummy and me_value == NULL + Previously held an active (key, value) pair, but that was deleted and an + active pair has not yet overwritten the slot. Dummy can transition to + Active upon key insertion. Dummy slots cannot be made Unused again + (cannot have me_key set to NULL), else the probe sequence in case of + collision would have no way to know they were once active. + +Note: .popitem() abuses the me_hash field of an Unused or Dummy slot to +hold a search finger. The me_hash field of Unused or Dummy slots has no +meaning otherwise. +*/ + +/* PyDict_MINSIZE is the minimum size of a dictionary. This many slots are + * allocated directly in the dict object (in the ma_smalltable member). + * It must be a power of 2, and at least 4. 8 allows dicts with no more + * than 5 active entries to live in ma_smalltable (and so avoid an + * additional malloc); instrumentation suggested this suffices for the + * majority of dicts (consisting mostly of usually-small instance dicts and + * usually-small dicts created to pass keyword arguments). + */ +#define PyDict_MINSIZE 8 + +typedef struct { + /* Cached hash code of me_key. Note that hash codes are C longs. + * We have to use Py_ssize_t instead because dict_popitem() abuses + * me_hash to hold a search finger. + */ + Py_ssize_t me_hash; + PyObject *me_key; + PyObject *me_value; +} PyDictEntry; + +/* +To ensure the lookup algorithm terminates, there must be at least one Unused +slot (NULL key) in the table. +The value ma_fill is the number of non-NULL keys (sum of Active and Dummy); +ma_used is the number of non-NULL, non-dummy keys (== the number of non-NULL +values == the number of Active items). +To avoid slowing down lookups on a near-full table, we resize the table when +it's two-thirds full. +*/ +typedef struct _dictobject PyDictObject; +struct _dictobject { + PyObject_HEAD + Py_ssize_t ma_fill; /* # Active + # Dummy */ + Py_ssize_t ma_used; /* # Active */ + + /* The table contains ma_mask + 1 slots, and that's a power of 2. + * We store the mask instead of the size because the mask is more + * frequently needed. + */ + Py_ssize_t ma_mask; + + /* ma_table points to ma_smalltable for small tables, else to + * additional malloc'ed memory. ma_table is never NULL! This rule + * saves repeated runtime null-tests in the workhorse getitem and + * setitem calls. + */ + PyDictEntry *ma_table; + PyDictEntry *(*ma_lookup)(PyDictObject *mp, PyObject *key, long hash); + PyDictEntry ma_smalltable[PyDict_MINSIZE]; +}; + +PyAPI_DATA(PyTypeObject) PyDict_Type; +PyAPI_DATA(PyTypeObject) PyDictIterKey_Type; +PyAPI_DATA(PyTypeObject) PyDictIterValue_Type; +PyAPI_DATA(PyTypeObject) PyDictIterItem_Type; +PyAPI_DATA(PyTypeObject) PyDictKeys_Type; +PyAPI_DATA(PyTypeObject) PyDictItems_Type; +PyAPI_DATA(PyTypeObject) PyDictValues_Type; + +#define PyDict_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_DICT_SUBCLASS) +#define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type) +#define PyDictKeys_Check(op) (Py_TYPE(op) == &PyDictKeys_Type) +#define PyDictItems_Check(op) (Py_TYPE(op) == &PyDictItems_Type) +#define PyDictValues_Check(op) (Py_TYPE(op) == &PyDictValues_Type) +/* This excludes Values, since they are not sets. */ +# define PyDictViewSet_Check(op) \ + (PyDictKeys_Check(op) || PyDictItems_Check(op)) + +PyAPI_FUNC(PyObject *) PyDict_New(void); +PyAPI_FUNC(PyObject *) PyDict_GetItem(PyObject *mp, PyObject *key); +PyAPI_FUNC(int) PyDict_SetItem(PyObject *mp, PyObject *key, PyObject *item); +PyAPI_FUNC(int) PyDict_DelItem(PyObject *mp, PyObject *key); +PyAPI_FUNC(void) PyDict_Clear(PyObject *mp); +PyAPI_FUNC(int) PyDict_Next( + PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value); +PyAPI_FUNC(int) _PyDict_Next( + PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value, long *hash); +PyAPI_FUNC(PyObject *) PyDict_Keys(PyObject *mp); +PyAPI_FUNC(PyObject *) PyDict_Values(PyObject *mp); +PyAPI_FUNC(PyObject *) PyDict_Items(PyObject *mp); +PyAPI_FUNC(Py_ssize_t) PyDict_Size(PyObject *mp); +PyAPI_FUNC(PyObject *) PyDict_Copy(PyObject *mp); +PyAPI_FUNC(int) PyDict_Contains(PyObject *mp, PyObject *key); +PyAPI_FUNC(int) _PyDict_Contains(PyObject *mp, PyObject *key, long hash); +PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused); +PyAPI_FUNC(void) _PyDict_MaybeUntrack(PyObject *mp); + +/* PyDict_Update(mp, other) is equivalent to PyDict_Merge(mp, other, 1). */ +PyAPI_FUNC(int) PyDict_Update(PyObject *mp, PyObject *other); + +/* PyDict_Merge updates/merges from a mapping object (an object that + supports PyMapping_Keys() and PyObject_GetItem()). If override is true, + the last occurrence of a key wins, else the first. The Python + dict.update(other) is equivalent to PyDict_Merge(dict, other, 1). +*/ +PyAPI_FUNC(int) PyDict_Merge(PyObject *mp, + PyObject *other, + int override); + +/* PyDict_MergeFromSeq2 updates/merges from an iterable object producing + iterable objects of length 2. If override is true, the last occurrence + of a key wins, else the first. The Python dict constructor dict(seq2) + is equivalent to dict={}; PyDict_MergeFromSeq(dict, seq2, 1). +*/ +PyAPI_FUNC(int) PyDict_MergeFromSeq2(PyObject *d, + PyObject *seq2, + int override); + +PyAPI_FUNC(PyObject *) PyDict_GetItemString(PyObject *dp, const char *key); +PyAPI_FUNC(int) PyDict_SetItemString(PyObject *dp, const char *key, PyObject *item); +PyAPI_FUNC(int) PyDict_DelItemString(PyObject *dp, const char *key); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_DICTOBJECT_H */ diff --git a/PythonEnv/2.7/Include/dtoa.h b/PythonEnv/2.7/Include/dtoa.h new file mode 100644 index 0000000000..9b434b77b6 --- /dev/null +++ b/PythonEnv/2.7/Include/dtoa.h @@ -0,0 +1,15 @@ +#ifndef PY_NO_SHORT_FLOAT_REPR +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(double) _Py_dg_strtod(const char *str, char **ptr); +PyAPI_FUNC(char *) _Py_dg_dtoa(double d, int mode, int ndigits, + int *decpt, int *sign, char **rve); +PyAPI_FUNC(void) _Py_dg_freedtoa(char *s); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/PythonEnv/2.7/Include/enumobject.h b/PythonEnv/2.7/Include/enumobject.h new file mode 100644 index 0000000000..c14dbfc8c3 --- /dev/null +++ b/PythonEnv/2.7/Include/enumobject.h @@ -0,0 +1,17 @@ +#ifndef Py_ENUMOBJECT_H +#define Py_ENUMOBJECT_H + +/* Enumerate Object */ + +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyEnum_Type; +PyAPI_DATA(PyTypeObject) PyReversed_Type; + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_ENUMOBJECT_H */ diff --git a/PythonEnv/2.7/Include/errcode.h b/PythonEnv/2.7/Include/errcode.h new file mode 100644 index 0000000000..becec80c8a --- /dev/null +++ b/PythonEnv/2.7/Include/errcode.h @@ -0,0 +1,36 @@ +#ifndef Py_ERRCODE_H +#define Py_ERRCODE_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Error codes passed around between file input, tokenizer, parser and + interpreter. This is necessary so we can turn them into Python + exceptions at a higher level. Note that some errors have a + slightly different meaning when passed from the tokenizer to the + parser than when passed from the parser to the interpreter; e.g. + the parser only returns E_EOF when it hits EOF immediately, and it + never returns E_OK. */ + +#define E_OK 10 /* No error */ +#define E_EOF 11 /* End Of File */ +#define E_INTR 12 /* Interrupted */ +#define E_TOKEN 13 /* Bad token */ +#define E_SYNTAX 14 /* Syntax error */ +#define E_NOMEM 15 /* Ran out of memory */ +#define E_DONE 16 /* Parsing complete */ +#define E_ERROR 17 /* Execution error */ +#define E_TABSPACE 18 /* Inconsistent mixing of tabs and spaces */ +#define E_OVERFLOW 19 /* Node had too many children */ +#define E_TOODEEP 20 /* Too many indentation levels */ +#define E_DEDENT 21 /* No matching outer block for dedent */ +#define E_DECODE 22 /* Error in decoding into Unicode */ +#define E_EOFS 23 /* EOF in triple-quoted string */ +#define E_EOLS 24 /* EOL in single-quoted string */ +#define E_LINECONT 25 /* Unexpected characters after a line continuation */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ERRCODE_H */ diff --git a/PythonEnv/2.7/Include/eval.h b/PythonEnv/2.7/Include/eval.h new file mode 100644 index 0000000000..b78dfe0fae --- /dev/null +++ b/PythonEnv/2.7/Include/eval.h @@ -0,0 +1,25 @@ + +/* Interface to execute compiled code */ + +#ifndef Py_EVAL_H +#define Py_EVAL_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(PyObject *) PyEval_EvalCode(PyCodeObject *, PyObject *, PyObject *); + +PyAPI_FUNC(PyObject *) PyEval_EvalCodeEx(PyCodeObject *co, + PyObject *globals, + PyObject *locals, + PyObject **args, int argc, + PyObject **kwds, int kwdc, + PyObject **defs, int defc, + PyObject *closure); + +PyAPI_FUNC(PyObject *) _PyEval_CallTracing(PyObject *func, PyObject *args); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_EVAL_H */ diff --git a/PythonEnv/2.7/Include/fileobject.h b/PythonEnv/2.7/Include/fileobject.h new file mode 100644 index 0000000000..1b540f902f --- /dev/null +++ b/PythonEnv/2.7/Include/fileobject.h @@ -0,0 +1,97 @@ + +/* File object interface */ + +#ifndef Py_FILEOBJECT_H +#define Py_FILEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + FILE *f_fp; + PyObject *f_name; + PyObject *f_mode; + int (*f_close)(FILE *); + int f_softspace; /* Flag used by 'print' command */ + int f_binary; /* Flag which indicates whether the file is + open in binary (1) or text (0) mode */ + char* f_buf; /* Allocated readahead buffer */ + char* f_bufend; /* Points after last occupied position */ + char* f_bufptr; /* Current buffer position */ + char *f_setbuf; /* Buffer for setbuf(3) and setvbuf(3) */ + int f_univ_newline; /* Handle any newline convention */ + int f_newlinetypes; /* Types of newlines seen */ + int f_skipnextlf; /* Skip next \n */ + PyObject *f_encoding; + PyObject *f_errors; + PyObject *weakreflist; /* List of weak references */ + int unlocked_count; /* Num. currently running sections of code + using f_fp with the GIL released. */ + int readable; + int writable; +} PyFileObject; + +PyAPI_DATA(PyTypeObject) PyFile_Type; + +#define PyFile_Check(op) PyObject_TypeCheck(op, &PyFile_Type) +#define PyFile_CheckExact(op) (Py_TYPE(op) == &PyFile_Type) + +PyAPI_FUNC(PyObject *) PyFile_FromString(char *, char *); +PyAPI_FUNC(void) PyFile_SetBufSize(PyObject *, int); +PyAPI_FUNC(int) PyFile_SetEncoding(PyObject *, const char *); +PyAPI_FUNC(int) PyFile_SetEncodingAndErrors(PyObject *, const char *, char *errors); +PyAPI_FUNC(PyObject *) PyFile_FromFile(FILE *, char *, char *, + int (*)(FILE *)); +PyAPI_FUNC(FILE *) PyFile_AsFile(PyObject *); +PyAPI_FUNC(void) PyFile_IncUseCount(PyFileObject *); +PyAPI_FUNC(void) PyFile_DecUseCount(PyFileObject *); +PyAPI_FUNC(PyObject *) PyFile_Name(PyObject *); +PyAPI_FUNC(PyObject *) PyFile_GetLine(PyObject *, int); +PyAPI_FUNC(int) PyFile_WriteObject(PyObject *, PyObject *, int); +PyAPI_FUNC(int) PyFile_SoftSpace(PyObject *, int); +PyAPI_FUNC(int) PyFile_WriteString(const char *, PyObject *); +PyAPI_FUNC(int) PyObject_AsFileDescriptor(PyObject *); + +/* The default encoding used by the platform file system APIs + If non-NULL, this is different than the default encoding for strings +*/ +PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding; + +/* Routines to replace fread() and fgets() which accept any of \r, \n + or \r\n as line terminators. +*/ +#define PY_STDIOTEXTMODE "b" +char *Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *); +size_t Py_UniversalNewlineFread(char *, size_t, FILE *, PyObject *); + +/* A routine to do sanity checking on the file mode string. returns + non-zero on if an exception occurred +*/ +int _PyFile_SanitizeMode(char *mode); + +#if defined _MSC_VER && _MSC_VER >= 1400 +/* A routine to check if a file descriptor is valid on Windows. Returns 0 + * and sets errno to EBADF if it isn't. This is to avoid Assertions + * from various functions in the Windows CRT beginning with + * Visual Studio 2005 + */ +int _PyVerify_fd(int fd); +#elif defined _MSC_VER && _MSC_VER >= 1200 +/* fdopen doesn't set errno EBADF and crashes for large fd on debug build */ +#define _PyVerify_fd(fd) (_get_osfhandle(fd) >= 0) +#else +#define _PyVerify_fd(A) (1) /* dummy */ +#endif + +/* A routine to check if a file descriptor can be select()-ed. */ +#ifdef HAVE_SELECT + #define _PyIsSelectable_fd(FD) (((FD) >= 0) && ((FD) < FD_SETSIZE)) +#else + #define _PyIsSelectable_fd(FD) (1) +#endif /* HAVE_SELECT */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FILEOBJECT_H */ diff --git a/PythonEnv/2.7/Include/floatobject.h b/PythonEnv/2.7/Include/floatobject.h new file mode 100644 index 0000000000..54e88256a2 --- /dev/null +++ b/PythonEnv/2.7/Include/floatobject.h @@ -0,0 +1,140 @@ + +/* Float object interface */ + +/* +PyFloatObject represents a (double precision) floating point number. +*/ + +#ifndef Py_FLOATOBJECT_H +#define Py_FLOATOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + double ob_fval; +} PyFloatObject; + +PyAPI_DATA(PyTypeObject) PyFloat_Type; + +#define PyFloat_Check(op) PyObject_TypeCheck(op, &PyFloat_Type) +#define PyFloat_CheckExact(op) (Py_TYPE(op) == &PyFloat_Type) + +/* The str() precision PyFloat_STR_PRECISION is chosen so that in most cases, + the rounding noise created by various operations is suppressed, while + giving plenty of precision for practical use. */ + +#define PyFloat_STR_PRECISION 12 + +#ifdef Py_NAN +#define Py_RETURN_NAN return PyFloat_FromDouble(Py_NAN) +#endif + +#define Py_RETURN_INF(sign) do \ + if (copysign(1., sign) == 1.) { \ + return PyFloat_FromDouble(Py_HUGE_VAL); \ + } else { \ + return PyFloat_FromDouble(-Py_HUGE_VAL); \ + } while(0) + +PyAPI_FUNC(double) PyFloat_GetMax(void); +PyAPI_FUNC(double) PyFloat_GetMin(void); +PyAPI_FUNC(PyObject *) PyFloat_GetInfo(void); + +/* Return Python float from string PyObject. Second argument ignored on + input, and, if non-NULL, NULL is stored into *junk (this tried to serve a + purpose once but can't be made to work as intended). */ +PyAPI_FUNC(PyObject *) PyFloat_FromString(PyObject*, char** junk); + +/* Return Python float from C double. */ +PyAPI_FUNC(PyObject *) PyFloat_FromDouble(double); + +/* Extract C double from Python float. The macro version trades safety for + speed. */ +PyAPI_FUNC(double) PyFloat_AsDouble(PyObject *); +#define PyFloat_AS_DOUBLE(op) (((PyFloatObject *)(op))->ob_fval) + +/* Write repr(v) into the char buffer argument, followed by null byte. The + buffer must be "big enough"; >= 100 is very safe. + PyFloat_AsReprString(buf, x) strives to print enough digits so that + PyFloat_FromString(buf) then reproduces x exactly. */ +PyAPI_FUNC(void) PyFloat_AsReprString(char*, PyFloatObject *v); + +/* Write str(v) into the char buffer argument, followed by null byte. The + buffer must be "big enough"; >= 100 is very safe. Note that it's + unusual to be able to get back the float you started with from + PyFloat_AsString's result -- use PyFloat_AsReprString() if you want to + preserve precision across conversions. */ +PyAPI_FUNC(void) PyFloat_AsString(char*, PyFloatObject *v); + +/* _PyFloat_{Pack,Unpack}{4,8} + * + * The struct and pickle (at least) modules need an efficient platform- + * independent way to store floating-point values as byte strings. + * The Pack routines produce a string from a C double, and the Unpack + * routines produce a C double from such a string. The suffix (4 or 8) + * specifies the number of bytes in the string. + * + * On platforms that appear to use (see _PyFloat_Init()) IEEE-754 formats + * these functions work by copying bits. On other platforms, the formats the + * 4- byte format is identical to the IEEE-754 single precision format, and + * the 8-byte format to the IEEE-754 double precision format, although the + * packing of INFs and NaNs (if such things exist on the platform) isn't + * handled correctly, and attempting to unpack a string containing an IEEE + * INF or NaN will raise an exception. + * + * On non-IEEE platforms with more precision, or larger dynamic range, than + * 754 supports, not all values can be packed; on non-IEEE platforms with less + * precision, or smaller dynamic range, not all values can be unpacked. What + * happens in such cases is partly accidental (alas). + */ + +/* The pack routines write 4 or 8 bytes, starting at p. le is a bool + * argument, true if you want the string in little-endian format (exponent + * last, at p+3 or p+7), false if you want big-endian format (exponent + * first, at p). + * Return value: 0 if all is OK, -1 if error (and an exception is + * set, most likely OverflowError). + * There are two problems on non-IEEE platforms: + * 1): What this does is undefined if x is a NaN or infinity. + * 2): -0.0 and +0.0 produce the same string. + */ +PyAPI_FUNC(int) _PyFloat_Pack4(double x, unsigned char *p, int le); +PyAPI_FUNC(int) _PyFloat_Pack8(double x, unsigned char *p, int le); + +/* Used to get the important decimal digits of a double */ +PyAPI_FUNC(int) _PyFloat_Digits(char *buf, double v, int *signum); +PyAPI_FUNC(void) _PyFloat_DigitsInit(void); + +/* The unpack routines read 4 or 8 bytes, starting at p. le is a bool + * argument, true if the string is in little-endian format (exponent + * last, at p+3 or p+7), false if big-endian (exponent first, at p). + * Return value: The unpacked double. On error, this is -1.0 and + * PyErr_Occurred() is true (and an exception is set, most likely + * OverflowError). Note that on a non-IEEE platform this will refuse + * to unpack a string that represents a NaN or infinity. + */ +PyAPI_FUNC(double) _PyFloat_Unpack4(const unsigned char *p, int le); +PyAPI_FUNC(double) _PyFloat_Unpack8(const unsigned char *p, int le); + +/* free list api */ +PyAPI_FUNC(int) PyFloat_ClearFreeList(void); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(PyObject *) _PyFloat_FormatAdvanced(PyObject *obj, + char *format_spec, + Py_ssize_t format_spec_len); + +/* Round a C double x to the closest multiple of 10**-ndigits. Returns a + Python float on success, or NULL (with an appropriate exception set) on + failure. Used in builtin_round in bltinmodule.c. */ +PyAPI_FUNC(PyObject *) _Py_double_round(double x, int ndigits); + + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FLOATOBJECT_H */ diff --git a/PythonEnv/2.7/Include/frameobject.h b/PythonEnv/2.7/Include/frameobject.h new file mode 100644 index 0000000000..17e7679ac8 --- /dev/null +++ b/PythonEnv/2.7/Include/frameobject.h @@ -0,0 +1,89 @@ + +/* Frame object interface */ + +#ifndef Py_FRAMEOBJECT_H +#define Py_FRAMEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int b_type; /* what kind of block this is */ + int b_handler; /* where to jump to find handler */ + int b_level; /* value stack level to pop to */ +} PyTryBlock; + +typedef struct _frame { + PyObject_VAR_HEAD + struct _frame *f_back; /* previous frame, or NULL */ + PyCodeObject *f_code; /* code segment */ + PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ + PyObject *f_globals; /* global symbol table (PyDictObject) */ + PyObject *f_locals; /* local symbol table (any mapping) */ + PyObject **f_valuestack; /* points after the last local */ + /* Next free slot in f_valuestack. Frame creation sets to f_valuestack. + Frame evaluation usually NULLs it, but a frame that yields sets it + to the current stack top. */ + PyObject **f_stacktop; + PyObject *f_trace; /* Trace function */ + + /* If an exception is raised in this frame, the next three are used to + * record the exception info (if any) originally in the thread state. See + * comments before set_exc_info() -- it's not obvious. + * Invariant: if _type is NULL, then so are _value and _traceback. + * Desired invariant: all three are NULL, or all three are non-NULL. That + * one isn't currently true, but "should be". + */ + PyObject *f_exc_type, *f_exc_value, *f_exc_traceback; + + PyThreadState *f_tstate; + int f_lasti; /* Last instruction if called */ + /* Call PyFrame_GetLineNumber() instead of reading this field + directly. As of 2.3 f_lineno is only valid when tracing is + active (i.e. when f_trace is set). At other times we use + PyCode_Addr2Line to calculate the line from the current + bytecode index. */ + int f_lineno; /* Current line number */ + int f_iblock; /* index in f_blockstack */ + PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ + PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ +} PyFrameObject; + + +/* Standard object interface */ + +PyAPI_DATA(PyTypeObject) PyFrame_Type; + +#define PyFrame_Check(op) ((op)->ob_type == &PyFrame_Type) +#define PyFrame_IsRestricted(f) \ + ((f)->f_builtins != (f)->f_tstate->interp->builtins) + +PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, + PyObject *, PyObject *); + + +/* The rest of the interface is specific for frame objects */ + +/* Block management functions */ + +PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); +PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); + +/* Extend the value stack */ + +PyAPI_FUNC(PyObject **) PyFrame_ExtendStack(PyFrameObject *, int, int); + +/* Conversions between "fast locals" and locals in dictionary */ + +PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); +PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); + +PyAPI_FUNC(int) PyFrame_ClearFreeList(void); + +/* Return the line of code the frame is currently executing. */ +PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FRAMEOBJECT_H */ diff --git a/PythonEnv/2.7/Include/funcobject.h b/PythonEnv/2.7/Include/funcobject.h new file mode 100644 index 0000000000..eb19f4c389 --- /dev/null +++ b/PythonEnv/2.7/Include/funcobject.h @@ -0,0 +1,76 @@ + +/* Function object interface */ + +#ifndef Py_FUNCOBJECT_H +#define Py_FUNCOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Function objects and code objects should not be confused with each other: + * + * Function objects are created by the execution of the 'def' statement. + * They reference a code object in their func_code attribute, which is a + * purely syntactic object, i.e. nothing more than a compiled version of some + * source code lines. There is one code object per source code "fragment", + * but each code object can be referenced by zero or many function objects + * depending only on how many times the 'def' statement in the source was + * executed so far. + */ + +typedef struct { + PyObject_HEAD + PyObject *func_code; /* A code object */ + PyObject *func_globals; /* A dictionary (other mappings won't do) */ + PyObject *func_defaults; /* NULL or a tuple */ + PyObject *func_closure; /* NULL or a tuple of cell objects */ + PyObject *func_doc; /* The __doc__ attribute, can be anything */ + PyObject *func_name; /* The __name__ attribute, a string object */ + PyObject *func_dict; /* The __dict__ attribute, a dict or NULL */ + PyObject *func_weakreflist; /* List of weak references */ + PyObject *func_module; /* The __module__ attribute, can be anything */ + + /* Invariant: + * func_closure contains the bindings for func_code->co_freevars, so + * PyTuple_Size(func_closure) == PyCode_GetNumFree(func_code) + * (func_closure may be NULL if PyCode_GetNumFree(func_code) == 0). + */ +} PyFunctionObject; + +PyAPI_DATA(PyTypeObject) PyFunction_Type; + +#define PyFunction_Check(op) (Py_TYPE(op) == &PyFunction_Type) + +PyAPI_FUNC(PyObject *) PyFunction_New(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetCode(PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetGlobals(PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetModule(PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetDefaults(PyObject *); +PyAPI_FUNC(int) PyFunction_SetDefaults(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetClosure(PyObject *); +PyAPI_FUNC(int) PyFunction_SetClosure(PyObject *, PyObject *); + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyFunction_GET_CODE(func) \ + (((PyFunctionObject *)func) -> func_code) +#define PyFunction_GET_GLOBALS(func) \ + (((PyFunctionObject *)func) -> func_globals) +#define PyFunction_GET_MODULE(func) \ + (((PyFunctionObject *)func) -> func_module) +#define PyFunction_GET_DEFAULTS(func) \ + (((PyFunctionObject *)func) -> func_defaults) +#define PyFunction_GET_CLOSURE(func) \ + (((PyFunctionObject *)func) -> func_closure) + +/* The classmethod and staticmethod types lives here, too */ +PyAPI_DATA(PyTypeObject) PyClassMethod_Type; +PyAPI_DATA(PyTypeObject) PyStaticMethod_Type; + +PyAPI_FUNC(PyObject *) PyClassMethod_New(PyObject *); +PyAPI_FUNC(PyObject *) PyStaticMethod_New(PyObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FUNCOBJECT_H */ diff --git a/PythonEnv/2.7/Include/genobject.h b/PythonEnv/2.7/Include/genobject.h new file mode 100644 index 0000000000..135561b701 --- /dev/null +++ b/PythonEnv/2.7/Include/genobject.h @@ -0,0 +1,40 @@ + +/* Generator object interface */ + +#ifndef Py_GENOBJECT_H +#define Py_GENOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +struct _frame; /* Avoid including frameobject.h */ + +typedef struct { + PyObject_HEAD + /* The gi_ prefix is intended to remind of generator-iterator. */ + + /* Note: gi_frame can be NULL if the generator is "finished" */ + struct _frame *gi_frame; + + /* True if generator is being executed. */ + int gi_running; + + /* The code object backing the generator */ + PyObject *gi_code; + + /* List of weak reference. */ + PyObject *gi_weakreflist; +} PyGenObject; + +PyAPI_DATA(PyTypeObject) PyGen_Type; + +#define PyGen_Check(op) PyObject_TypeCheck(op, &PyGen_Type) +#define PyGen_CheckExact(op) (Py_TYPE(op) == &PyGen_Type) + +PyAPI_FUNC(PyObject *) PyGen_New(struct _frame *); +PyAPI_FUNC(int) PyGen_NeedsFinalizing(PyGenObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GENOBJECT_H */ diff --git a/PythonEnv/2.7/Include/graminit.h b/PythonEnv/2.7/Include/graminit.h new file mode 100644 index 0000000000..40d531e8a1 --- /dev/null +++ b/PythonEnv/2.7/Include/graminit.h @@ -0,0 +1,87 @@ +/* Generated by Parser/pgen */ + +#define single_input 256 +#define file_input 257 +#define eval_input 258 +#define decorator 259 +#define decorators 260 +#define decorated 261 +#define funcdef 262 +#define parameters 263 +#define varargslist 264 +#define fpdef 265 +#define fplist 266 +#define stmt 267 +#define simple_stmt 268 +#define small_stmt 269 +#define expr_stmt 270 +#define augassign 271 +#define print_stmt 272 +#define del_stmt 273 +#define pass_stmt 274 +#define flow_stmt 275 +#define break_stmt 276 +#define continue_stmt 277 +#define return_stmt 278 +#define yield_stmt 279 +#define raise_stmt 280 +#define import_stmt 281 +#define import_name 282 +#define import_from 283 +#define import_as_name 284 +#define dotted_as_name 285 +#define import_as_names 286 +#define dotted_as_names 287 +#define dotted_name 288 +#define global_stmt 289 +#define exec_stmt 290 +#define assert_stmt 291 +#define compound_stmt 292 +#define if_stmt 293 +#define while_stmt 294 +#define for_stmt 295 +#define try_stmt 296 +#define with_stmt 297 +#define with_item 298 +#define except_clause 299 +#define suite 300 +#define testlist_safe 301 +#define old_test 302 +#define old_lambdef 303 +#define test 304 +#define or_test 305 +#define and_test 306 +#define not_test 307 +#define comparison 308 +#define comp_op 309 +#define expr 310 +#define xor_expr 311 +#define and_expr 312 +#define shift_expr 313 +#define arith_expr 314 +#define term 315 +#define factor 316 +#define power 317 +#define atom 318 +#define listmaker 319 +#define testlist_comp 320 +#define lambdef 321 +#define trailer 322 +#define subscriptlist 323 +#define subscript 324 +#define sliceop 325 +#define exprlist 326 +#define testlist 327 +#define dictorsetmaker 328 +#define classdef 329 +#define arglist 330 +#define argument 331 +#define list_iter 332 +#define list_for 333 +#define list_if 334 +#define comp_iter 335 +#define comp_for 336 +#define comp_if 337 +#define testlist1 338 +#define encoding_decl 339 +#define yield_expr 340 diff --git a/PythonEnv/2.7/Include/grammar.h b/PythonEnv/2.7/Include/grammar.h new file mode 100644 index 0000000000..8426da30d9 --- /dev/null +++ b/PythonEnv/2.7/Include/grammar.h @@ -0,0 +1,93 @@ + +/* Grammar interface */ + +#ifndef Py_GRAMMAR_H +#define Py_GRAMMAR_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "bitset.h" /* Sigh... */ + +/* A label of an arc */ + +typedef struct { + int lb_type; + char *lb_str; +} label; + +#define EMPTY 0 /* Label number 0 is by definition the empty label */ + +/* A list of labels */ + +typedef struct { + int ll_nlabels; + label *ll_label; +} labellist; + +/* An arc from one state to another */ + +typedef struct { + short a_lbl; /* Label of this arc */ + short a_arrow; /* State where this arc goes to */ +} arc; + +/* A state in a DFA */ + +typedef struct { + int s_narcs; + arc *s_arc; /* Array of arcs */ + + /* Optional accelerators */ + int s_lower; /* Lowest label index */ + int s_upper; /* Highest label index */ + int *s_accel; /* Accelerator */ + int s_accept; /* Nonzero for accepting state */ +} state; + +/* A DFA */ + +typedef struct { + int d_type; /* Non-terminal this represents */ + char *d_name; /* For printing */ + int d_initial; /* Initial state */ + int d_nstates; + state *d_state; /* Array of states */ + bitset d_first; +} dfa; + +/* A grammar */ + +typedef struct { + int g_ndfas; + dfa *g_dfa; /* Array of DFAs */ + labellist g_ll; + int g_start; /* Start symbol of the grammar */ + int g_accel; /* Set if accelerators present */ +} grammar; + +/* FUNCTIONS */ + +grammar *newgrammar(int start); +dfa *adddfa(grammar *g, int type, char *name); +int addstate(dfa *d); +void addarc(dfa *d, int from, int to, int lbl); +dfa *PyGrammar_FindDFA(grammar *g, int type); + +int addlabel(labellist *ll, int type, char *str); +int findlabel(labellist *ll, int type, char *str); +char *PyGrammar_LabelRepr(label *lb); +void translatelabels(grammar *g); + +void addfirstsets(grammar *g); + +void PyGrammar_AddAccelerators(grammar *g); +void PyGrammar_RemoveAccelerators(grammar *); + +void printgrammar(grammar *g, FILE *fp); +void printnonterminals(grammar *g, FILE *fp); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GRAMMAR_H */ diff --git a/PythonEnv/2.7/Include/import.h b/PythonEnv/2.7/Include/import.h new file mode 100644 index 0000000000..1b7fe0a73c --- /dev/null +++ b/PythonEnv/2.7/Include/import.h @@ -0,0 +1,71 @@ + +/* Module definition and import interface */ + +#ifndef Py_IMPORT_H +#define Py_IMPORT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(long) PyImport_GetMagicNumber(void); +PyAPI_FUNC(PyObject *) PyImport_ExecCodeModule(char *name, PyObject *co); +PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleEx( + char *name, PyObject *co, char *pathname); +PyAPI_FUNC(PyObject *) PyImport_GetModuleDict(void); +PyAPI_FUNC(PyObject *) PyImport_AddModule(const char *name); +PyAPI_FUNC(PyObject *) PyImport_ImportModule(const char *name); +PyAPI_FUNC(PyObject *) PyImport_ImportModuleNoBlock(const char *); +PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevel(char *name, + PyObject *globals, PyObject *locals, PyObject *fromlist, int level); + +#define PyImport_ImportModuleEx(n, g, l, f) \ + PyImport_ImportModuleLevel(n, g, l, f, -1) + +PyAPI_FUNC(PyObject *) PyImport_GetImporter(PyObject *path); +PyAPI_FUNC(PyObject *) PyImport_Import(PyObject *name); +PyAPI_FUNC(PyObject *) PyImport_ReloadModule(PyObject *m); +PyAPI_FUNC(void) PyImport_Cleanup(void); +PyAPI_FUNC(int) PyImport_ImportFrozenModule(char *); + +#ifdef WITH_THREAD +PyAPI_FUNC(void) _PyImport_AcquireLock(void); +PyAPI_FUNC(int) _PyImport_ReleaseLock(void); +#else +#define _PyImport_AcquireLock() +#define _PyImport_ReleaseLock() 1 +#endif + +PyAPI_FUNC(struct filedescr *) _PyImport_FindModule( + const char *, PyObject *, char *, size_t, FILE **, PyObject **); +PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr *); +PyAPI_FUNC(void) _PyImport_ReInitLock(void); + +PyAPI_FUNC(PyObject *)_PyImport_FindExtension(char *, char *); +PyAPI_FUNC(PyObject *)_PyImport_FixupExtension(char *, char *); + +struct _inittab { + char *name; + void (*initfunc)(void); +}; + +PyAPI_DATA(PyTypeObject) PyNullImporter_Type; +PyAPI_DATA(struct _inittab *) PyImport_Inittab; + +PyAPI_FUNC(int) PyImport_AppendInittab(const char *name, void (*initfunc)(void)); +PyAPI_FUNC(int) PyImport_ExtendInittab(struct _inittab *newtab); + +struct _frozen { + char *name; + unsigned char *code; + int size; +}; + +/* Embedding apps may change this pointer to point to their favorite + collection of frozen modules: */ + +PyAPI_DATA(struct _frozen *) PyImport_FrozenModules; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_IMPORT_H */ diff --git a/PythonEnv/2.7/Include/intobject.h b/PythonEnv/2.7/Include/intobject.h new file mode 100644 index 0000000000..252eea9fd9 --- /dev/null +++ b/PythonEnv/2.7/Include/intobject.h @@ -0,0 +1,81 @@ + +/* Integer object interface */ + +/* +PyIntObject represents a (long) integer. This is an immutable object; +an integer cannot change its value after creation. + +There are functions to create new integer objects, to test an object +for integer-ness, and to get the integer value. The latter functions +returns -1 and sets errno to EBADF if the object is not an PyIntObject. +None of the functions should be applied to nil objects. + +The type PyIntObject is (unfortunately) exposed here so we can declare +_Py_TrueStruct and _Py_ZeroStruct in boolobject.h; don't use this. +*/ + +#ifndef Py_INTOBJECT_H +#define Py_INTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + long ob_ival; +} PyIntObject; + +PyAPI_DATA(PyTypeObject) PyInt_Type; + +#define PyInt_Check(op) \ + PyType_FastSubclass((op)->ob_type, Py_TPFLAGS_INT_SUBCLASS) +#define PyInt_CheckExact(op) ((op)->ob_type == &PyInt_Type) + +PyAPI_FUNC(PyObject *) PyInt_FromString(char*, char**, int); +#ifdef Py_USING_UNICODE +PyAPI_FUNC(PyObject *) PyInt_FromUnicode(Py_UNICODE*, Py_ssize_t, int); +#endif +PyAPI_FUNC(PyObject *) PyInt_FromLong(long); +PyAPI_FUNC(PyObject *) PyInt_FromSize_t(size_t); +PyAPI_FUNC(PyObject *) PyInt_FromSsize_t(Py_ssize_t); +PyAPI_FUNC(long) PyInt_AsLong(PyObject *); +PyAPI_FUNC(Py_ssize_t) PyInt_AsSsize_t(PyObject *); +PyAPI_FUNC(int) _PyInt_AsInt(PyObject *); +PyAPI_FUNC(unsigned long) PyInt_AsUnsignedLongMask(PyObject *); +#ifdef HAVE_LONG_LONG +PyAPI_FUNC(unsigned PY_LONG_LONG) PyInt_AsUnsignedLongLongMask(PyObject *); +#endif + +PyAPI_FUNC(long) PyInt_GetMax(void); + +/* Macro, trading safety for speed */ +#define PyInt_AS_LONG(op) (((PyIntObject *)(op))->ob_ival) + +/* These aren't really part of the Int object, but they're handy; the protos + * are necessary for systems that need the magic of PyAPI_FUNC and that want + * to have stropmodule as a dynamically loaded module instead of building it + * into the main Python shared library/DLL. Guido thinks I'm weird for + * building it this way. :-) [cjh] + */ +PyAPI_FUNC(unsigned long) PyOS_strtoul(char *, char **, int); +PyAPI_FUNC(long) PyOS_strtol(char *, char **, int); + +/* free list api */ +PyAPI_FUNC(int) PyInt_ClearFreeList(void); + +/* Convert an integer to the given base. Returns a string. + If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'. + If newstyle is zero, then use the pre-2.6 behavior of octal having + a leading "0" */ +PyAPI_FUNC(PyObject*) _PyInt_Format(PyIntObject* v, int base, int newstyle); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(PyObject *) _PyInt_FormatAdvanced(PyObject *obj, + char *format_spec, + Py_ssize_t format_spec_len); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTOBJECT_H */ diff --git a/PythonEnv/2.7/Include/intrcheck.h b/PythonEnv/2.7/Include/intrcheck.h new file mode 100644 index 0000000000..3b67ed0d5a --- /dev/null +++ b/PythonEnv/2.7/Include/intrcheck.h @@ -0,0 +1,15 @@ + +#ifndef Py_INTRCHECK_H +#define Py_INTRCHECK_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(int) PyOS_InterruptOccurred(void); +PyAPI_FUNC(void) PyOS_InitInterrupts(void); +PyAPI_FUNC(void) PyOS_AfterFork(void); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTRCHECK_H */ diff --git a/PythonEnv/2.7/Include/iterobject.h b/PythonEnv/2.7/Include/iterobject.h new file mode 100644 index 0000000000..4bd19c2909 --- /dev/null +++ b/PythonEnv/2.7/Include/iterobject.h @@ -0,0 +1,23 @@ +#ifndef Py_ITEROBJECT_H +#define Py_ITEROBJECT_H +/* Iterators (the basic kind, over a sequence) */ +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PySeqIter_Type; + +#define PySeqIter_Check(op) (Py_TYPE(op) == &PySeqIter_Type) + +PyAPI_FUNC(PyObject *) PySeqIter_New(PyObject *); + +PyAPI_DATA(PyTypeObject) PyCallIter_Type; + +#define PyCallIter_Check(op) (Py_TYPE(op) == &PyCallIter_Type) + +PyAPI_FUNC(PyObject *) PyCallIter_New(PyObject *, PyObject *); +#ifdef __cplusplus +} +#endif +#endif /* !Py_ITEROBJECT_H */ + diff --git a/PythonEnv/2.7/Include/listobject.h b/PythonEnv/2.7/Include/listobject.h new file mode 100644 index 0000000000..c4458733b9 --- /dev/null +++ b/PythonEnv/2.7/Include/listobject.h @@ -0,0 +1,68 @@ + +/* List object interface */ + +/* +Another generally useful object type is an list of object pointers. +This is a mutable type: the list items can be changed, and items can be +added or removed. Out-of-range indices or non-list objects are ignored. + +*** WARNING *** PyList_SetItem does not increment the new item's reference +count, but does decrement the reference count of the item it replaces, +if not nil. It does *decrement* the reference count if it is *not* +inserted in the list. Similarly, PyList_GetItem does not increment the +returned item's reference count. +*/ + +#ifndef Py_LISTOBJECT_H +#define Py_LISTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_VAR_HEAD + /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ + PyObject **ob_item; + + /* ob_item contains space for 'allocated' elements. The number + * currently in use is ob_size. + * Invariants: + * 0 <= ob_size <= allocated + * len(list) == ob_size + * ob_item == NULL implies ob_size == allocated == 0 + * list.sort() temporarily sets allocated to -1 to detect mutations. + * + * Items must normally not be NULL, except during construction when + * the list is not yet visible outside the function that builds it. + */ + Py_ssize_t allocated; +} PyListObject; + +PyAPI_DATA(PyTypeObject) PyList_Type; + +#define PyList_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LIST_SUBCLASS) +#define PyList_CheckExact(op) (Py_TYPE(op) == &PyList_Type) + +PyAPI_FUNC(PyObject *) PyList_New(Py_ssize_t size); +PyAPI_FUNC(Py_ssize_t) PyList_Size(PyObject *); +PyAPI_FUNC(PyObject *) PyList_GetItem(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyList_SetItem(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(int) PyList_Insert(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(int) PyList_Append(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyList_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); +PyAPI_FUNC(int) PyList_SetSlice(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); +PyAPI_FUNC(int) PyList_Sort(PyObject *); +PyAPI_FUNC(int) PyList_Reverse(PyObject *); +PyAPI_FUNC(PyObject *) PyList_AsTuple(PyObject *); +PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *); + +/* Macro, trading safety for speed */ +#define PyList_GET_ITEM(op, i) (((PyListObject *)(op))->ob_item[i]) +#define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item[i] = (v)) +#define PyList_GET_SIZE(op) Py_SIZE(op) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_LISTOBJECT_H */ diff --git a/PythonEnv/2.7/Include/longintrepr.h b/PythonEnv/2.7/Include/longintrepr.h new file mode 100644 index 0000000000..6425c30f39 --- /dev/null +++ b/PythonEnv/2.7/Include/longintrepr.h @@ -0,0 +1,103 @@ +#ifndef Py_LONGINTREPR_H +#define Py_LONGINTREPR_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* This is published for the benefit of "friend" marshal.c only. */ + +/* Parameters of the long integer representation. There are two different + sets of parameters: one set for 30-bit digits, stored in an unsigned 32-bit + integer type, and one set for 15-bit digits with each digit stored in an + unsigned short. The value of PYLONG_BITS_IN_DIGIT, defined either at + configure time or in pyport.h, is used to decide which digit size to use. + + Type 'digit' should be able to hold 2*PyLong_BASE-1, and type 'twodigits' + should be an unsigned integer type able to hold all integers up to + PyLong_BASE*PyLong_BASE-1. x_sub assumes that 'digit' is an unsigned type, + and that overflow is handled by taking the result modulo 2**N for some N > + PyLong_SHIFT. The majority of the code doesn't care about the precise + value of PyLong_SHIFT, but there are some notable exceptions: + + - long_pow() requires that PyLong_SHIFT be divisible by 5 + + - PyLong_{As,From}ByteArray require that PyLong_SHIFT be at least 8 + + - long_hash() requires that PyLong_SHIFT is *strictly* less than the number + of bits in an unsigned long, as do the PyLong <-> long (or unsigned long) + conversion functions + + - the long <-> size_t/Py_ssize_t conversion functions expect that + PyLong_SHIFT is strictly less than the number of bits in a size_t + + - the marshal code currently expects that PyLong_SHIFT is a multiple of 15 + + The values 15 and 30 should fit all of the above requirements, on any + platform. +*/ + +#if PYLONG_BITS_IN_DIGIT == 30 +#if !(defined HAVE_UINT64_T && defined HAVE_UINT32_T && \ + defined HAVE_INT64_T && defined HAVE_INT32_T) +#error "30-bit long digits requested, but the necessary types are not available on this platform" +#endif +typedef PY_UINT32_T digit; +typedef PY_INT32_T sdigit; /* signed variant of digit */ +typedef PY_UINT64_T twodigits; +typedef PY_INT64_T stwodigits; /* signed variant of twodigits */ +#define PyLong_SHIFT 30 +#define _PyLong_DECIMAL_SHIFT 9 /* max(e such that 10**e fits in a digit) */ +#define _PyLong_DECIMAL_BASE ((digit)1000000000) /* 10 ** DECIMAL_SHIFT */ +#elif PYLONG_BITS_IN_DIGIT == 15 +typedef unsigned short digit; +typedef short sdigit; /* signed variant of digit */ +typedef unsigned long twodigits; +typedef long stwodigits; /* signed variant of twodigits */ +#define PyLong_SHIFT 15 +#define _PyLong_DECIMAL_SHIFT 4 /* max(e such that 10**e fits in a digit) */ +#define _PyLong_DECIMAL_BASE ((digit)10000) /* 10 ** DECIMAL_SHIFT */ +#else +#error "PYLONG_BITS_IN_DIGIT should be 15 or 30" +#endif +#define PyLong_BASE ((digit)1 << PyLong_SHIFT) +#define PyLong_MASK ((digit)(PyLong_BASE - 1)) + +/* b/w compatibility with Python 2.5 */ +#define SHIFT PyLong_SHIFT +#define BASE PyLong_BASE +#define MASK PyLong_MASK + +#if PyLong_SHIFT % 5 != 0 +#error "longobject.c requires that PyLong_SHIFT be divisible by 5" +#endif + +/* Long integer representation. + The absolute value of a number is equal to + SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i) + Negative numbers are represented with ob_size < 0; + zero is represented by ob_size == 0. + In a normalized number, ob_digit[abs(ob_size)-1] (the most significant + digit) is never zero. Also, in all cases, for all valid i, + 0 <= ob_digit[i] <= MASK. + The allocation function takes care of allocating extra memory + so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available. + + CAUTION: Generic code manipulating subtypes of PyVarObject has to + aware that longs abuse ob_size's sign bit. +*/ + +struct _longobject { + PyObject_VAR_HEAD + digit ob_digit[1]; +}; + +PyAPI_FUNC(PyLongObject *) _PyLong_New(Py_ssize_t); + +/* Return a copy of src. */ +PyAPI_FUNC(PyObject *) _PyLong_Copy(PyLongObject *src); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_LONGINTREPR_H */ diff --git a/PythonEnv/2.7/Include/longobject.h b/PythonEnv/2.7/Include/longobject.h new file mode 100644 index 0000000000..8be2345a46 --- /dev/null +++ b/PythonEnv/2.7/Include/longobject.h @@ -0,0 +1,135 @@ +#ifndef Py_LONGOBJECT_H +#define Py_LONGOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Long (arbitrary precision) integer object interface */ + +typedef struct _longobject PyLongObject; /* Revealed in longintrepr.h */ + +PyAPI_DATA(PyTypeObject) PyLong_Type; + +#define PyLong_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LONG_SUBCLASS) +#define PyLong_CheckExact(op) (Py_TYPE(op) == &PyLong_Type) + +PyAPI_FUNC(PyObject *) PyLong_FromLong(long); +PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLong(unsigned long); +PyAPI_FUNC(PyObject *) PyLong_FromDouble(double); +PyAPI_FUNC(PyObject *) PyLong_FromSize_t(size_t); +PyAPI_FUNC(PyObject *) PyLong_FromSsize_t(Py_ssize_t); +PyAPI_FUNC(long) PyLong_AsLong(PyObject *); +PyAPI_FUNC(long) PyLong_AsLongAndOverflow(PyObject *, int *); +PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLong(PyObject *); +PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLongMask(PyObject *); +PyAPI_FUNC(Py_ssize_t) PyLong_AsSsize_t(PyObject *); +PyAPI_FUNC(int) _PyLong_AsInt(PyObject *); +PyAPI_FUNC(PyObject *) PyLong_GetInfo(void); + +/* For use by intobject.c only */ +#define _PyLong_AsSsize_t PyLong_AsSsize_t +#define _PyLong_FromSize_t PyLong_FromSize_t +#define _PyLong_FromSsize_t PyLong_FromSsize_t +PyAPI_DATA(int) _PyLong_DigitValue[256]; + +/* _PyLong_Frexp returns a double x and an exponent e such that the + true value is approximately equal to x * 2**e. e is >= 0. x is + 0.0 if and only if the input is 0 (in which case, e and x are both + zeroes); otherwise, 0.5 <= abs(x) < 1.0. On overflow, which is + possible if the number of bits doesn't fit into a Py_ssize_t, sets + OverflowError and returns -1.0 for x, 0 for e. */ +PyAPI_FUNC(double) _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e); + +PyAPI_FUNC(double) PyLong_AsDouble(PyObject *); +PyAPI_FUNC(PyObject *) PyLong_FromVoidPtr(void *); +PyAPI_FUNC(void *) PyLong_AsVoidPtr(PyObject *); + +#ifdef HAVE_LONG_LONG +PyAPI_FUNC(PyObject *) PyLong_FromLongLong(PY_LONG_LONG); +PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLongLong(unsigned PY_LONG_LONG); +PyAPI_FUNC(PY_LONG_LONG) PyLong_AsLongLong(PyObject *); +PyAPI_FUNC(unsigned PY_LONG_LONG) PyLong_AsUnsignedLongLong(PyObject *); +PyAPI_FUNC(unsigned PY_LONG_LONG) PyLong_AsUnsignedLongLongMask(PyObject *); +PyAPI_FUNC(PY_LONG_LONG) PyLong_AsLongLongAndOverflow(PyObject *, int *); +#endif /* HAVE_LONG_LONG */ + +PyAPI_FUNC(PyObject *) PyLong_FromString(char *, char **, int); +#ifdef Py_USING_UNICODE +PyAPI_FUNC(PyObject *) PyLong_FromUnicode(Py_UNICODE*, Py_ssize_t, int); +#endif + +/* _PyLong_Sign. Return 0 if v is 0, -1 if v < 0, +1 if v > 0. + v must not be NULL, and must be a normalized long. + There are no error cases. +*/ +PyAPI_FUNC(int) _PyLong_Sign(PyObject *v); + + +/* _PyLong_NumBits. Return the number of bits needed to represent the + absolute value of a long. For example, this returns 1 for 1 and -1, 2 + for 2 and -2, and 2 for 3 and -3. It returns 0 for 0. + v must not be NULL, and must be a normalized long. + (size_t)-1 is returned and OverflowError set if the true result doesn't + fit in a size_t. +*/ +PyAPI_FUNC(size_t) _PyLong_NumBits(PyObject *v); + +/* _PyLong_FromByteArray: View the n unsigned bytes as a binary integer in + base 256, and return a Python long with the same numeric value. + If n is 0, the integer is 0. Else: + If little_endian is 1/true, bytes[n-1] is the MSB and bytes[0] the LSB; + else (little_endian is 0/false) bytes[0] is the MSB and bytes[n-1] the + LSB. + If is_signed is 0/false, view the bytes as a non-negative integer. + If is_signed is 1/true, view the bytes as a 2's-complement integer, + non-negative if bit 0x80 of the MSB is clear, negative if set. + Error returns: + + Return NULL with the appropriate exception set if there's not + enough memory to create the Python long. +*/ +PyAPI_FUNC(PyObject *) _PyLong_FromByteArray( + const unsigned char* bytes, size_t n, + int little_endian, int is_signed); + +/* _PyLong_AsByteArray: Convert the least-significant 8*n bits of long + v to a base-256 integer, stored in array bytes. Normally return 0, + return -1 on error. + If little_endian is 1/true, store the MSB at bytes[n-1] and the LSB at + bytes[0]; else (little_endian is 0/false) store the MSB at bytes[0] and + the LSB at bytes[n-1]. + If is_signed is 0/false, it's an error if v < 0; else (v >= 0) n bytes + are filled and there's nothing special about bit 0x80 of the MSB. + If is_signed is 1/true, bytes is filled with the 2's-complement + representation of v's value. Bit 0x80 of the MSB is the sign bit. + Error returns (-1): + + is_signed is 0 and v < 0. TypeError is set in this case, and bytes + isn't altered. + + n isn't big enough to hold the full mathematical value of v. For + example, if is_signed is 0 and there are more digits in the v than + fit in n; or if is_signed is 1, v < 0, and n is just 1 bit shy of + being large enough to hold a sign bit. OverflowError is set in this + case, but bytes holds the least-signficant n bytes of the true value. +*/ +PyAPI_FUNC(int) _PyLong_AsByteArray(PyLongObject* v, + unsigned char* bytes, size_t n, + int little_endian, int is_signed); + +/* _PyLong_Format: Convert the long to a string object with given base, + appending a base prefix of 0[box] if base is 2, 8 or 16. + Add a trailing "L" if addL is non-zero. + If newstyle is zero, then use the pre-2.6 behavior of octal having + a leading "0", instead of the prefix "0o" */ +PyAPI_FUNC(PyObject *) _PyLong_Format(PyObject *aa, int base, int addL, int newstyle); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(PyObject *) _PyLong_FormatAdvanced(PyObject *obj, + char *format_spec, + Py_ssize_t format_spec_len); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_LONGOBJECT_H */ diff --git a/PythonEnv/2.7/Include/marshal.h b/PythonEnv/2.7/Include/marshal.h new file mode 100644 index 0000000000..411fdca367 --- /dev/null +++ b/PythonEnv/2.7/Include/marshal.h @@ -0,0 +1,25 @@ + +/* Interface for marshal.c */ + +#ifndef Py_MARSHAL_H +#define Py_MARSHAL_H +#ifdef __cplusplus +extern "C" { +#endif + +#define Py_MARSHAL_VERSION 2 + +PyAPI_FUNC(void) PyMarshal_WriteLongToFile(long, FILE *, int); +PyAPI_FUNC(void) PyMarshal_WriteObjectToFile(PyObject *, FILE *, int); +PyAPI_FUNC(PyObject *) PyMarshal_WriteObjectToString(PyObject *, int); + +PyAPI_FUNC(long) PyMarshal_ReadLongFromFile(FILE *); +PyAPI_FUNC(int) PyMarshal_ReadShortFromFile(FILE *); +PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromFile(FILE *); +PyAPI_FUNC(PyObject *) PyMarshal_ReadLastObjectFromFile(FILE *); +PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromString(char *, Py_ssize_t); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MARSHAL_H */ diff --git a/PythonEnv/2.7/Include/memoryobject.h b/PythonEnv/2.7/Include/memoryobject.h new file mode 100644 index 0000000000..bf0b621ab9 --- /dev/null +++ b/PythonEnv/2.7/Include/memoryobject.h @@ -0,0 +1,74 @@ +/* Memory view object. In Python this is available as "memoryview". */ + +#ifndef Py_MEMORYOBJECT_H +#define Py_MEMORYOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyMemoryView_Type; + +#define PyMemoryView_Check(op) (Py_TYPE(op) == &PyMemoryView_Type) + +/* Get a pointer to the underlying Py_buffer of a memoryview object. */ +#define PyMemoryView_GET_BUFFER(op) (&((PyMemoryViewObject *)(op))->view) +/* Get a pointer to the PyObject from which originates a memoryview object. */ +#define PyMemoryView_GET_BASE(op) (((PyMemoryViewObject *)(op))->view.obj) + + +PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base, + int buffertype, + char fort); + + /* Return a contiguous chunk of memory representing the buffer + from an object in a memory view object. If a copy is made then the + base object for the memory view will be a *new* bytes object. + + Otherwise, the base-object will be the object itself and no + data-copying will be done. + + The buffertype argument can be PyBUF_READ, PyBUF_WRITE, + PyBUF_SHADOW to determine whether the returned buffer + should be READONLY, WRITABLE, or set to update the + original buffer if a copy must be made. If buffertype is + PyBUF_WRITE and the buffer is not contiguous an error will + be raised. In this circumstance, the user can use + PyBUF_SHADOW to ensure that a a writable temporary + contiguous buffer is returned. The contents of this + contiguous buffer will be copied back into the original + object after the memoryview object is deleted as long as + the original object is writable and allows setting an + exclusive write lock. If this is not allowed by the + original object, then a BufferError is raised. + + If the object is multi-dimensional and if fortran is 'F', + the first dimension of the underlying array will vary the + fastest in the buffer. If fortran is 'C', then the last + dimension will vary the fastest (C-style contiguous). If + fortran is 'A', then it does not matter and you will get + whatever the object decides is more efficient. + + A new reference is returned that must be DECREF'd when finished. + */ + +PyAPI_FUNC(PyObject *) PyMemoryView_FromObject(PyObject *base); + +PyAPI_FUNC(PyObject *) PyMemoryView_FromBuffer(Py_buffer *info); + /* create new if bufptr is NULL + will be a new bytesobject in base */ + + +/* The struct is declared here so that macros can work, but it shouldn't + be considered public. Don't access those fields directly, use the macros + and functions instead! */ +typedef struct { + PyObject_HEAD + PyObject *base; + Py_buffer view; +} PyMemoryViewObject; + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MEMORYOBJECT_H */ diff --git a/PythonEnv/2.7/Include/metagrammar.h b/PythonEnv/2.7/Include/metagrammar.h new file mode 100644 index 0000000000..15c8ef8f3f --- /dev/null +++ b/PythonEnv/2.7/Include/metagrammar.h @@ -0,0 +1,18 @@ +#ifndef Py_METAGRAMMAR_H +#define Py_METAGRAMMAR_H +#ifdef __cplusplus +extern "C" { +#endif + + +#define MSTART 256 +#define RULE 257 +#define RHS 258 +#define ALT 259 +#define ITEM 260 +#define ATOM 261 + +#ifdef __cplusplus +} +#endif +#endif /* !Py_METAGRAMMAR_H */ diff --git a/PythonEnv/2.7/Include/methodobject.h b/PythonEnv/2.7/Include/methodobject.h new file mode 100644 index 0000000000..6e160b6390 --- /dev/null +++ b/PythonEnv/2.7/Include/methodobject.h @@ -0,0 +1,93 @@ + +/* Method object interface */ + +#ifndef Py_METHODOBJECT_H +#define Py_METHODOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* This is about the type 'builtin_function_or_method', + not Python methods in user-defined classes. See classobject.h + for the latter. */ + +PyAPI_DATA(PyTypeObject) PyCFunction_Type; + +#define PyCFunction_Check(op) (Py_TYPE(op) == &PyCFunction_Type) + +typedef PyObject *(*PyCFunction)(PyObject *, PyObject *); +typedef PyObject *(*PyCFunctionWithKeywords)(PyObject *, PyObject *, + PyObject *); +typedef PyObject *(*PyNoArgsFunction)(PyObject *); + +PyAPI_FUNC(PyCFunction) PyCFunction_GetFunction(PyObject *); +PyAPI_FUNC(PyObject *) PyCFunction_GetSelf(PyObject *); +PyAPI_FUNC(int) PyCFunction_GetFlags(PyObject *); + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyCFunction_GET_FUNCTION(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_meth) +#define PyCFunction_GET_SELF(func) \ + (((PyCFunctionObject *)func) -> m_self) +#define PyCFunction_GET_FLAGS(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_flags) +PyAPI_FUNC(PyObject *) PyCFunction_Call(PyObject *, PyObject *, PyObject *); + +struct PyMethodDef { + const char *ml_name; /* The name of the built-in function/method */ + PyCFunction ml_meth; /* The C function that implements it */ + int ml_flags; /* Combination of METH_xxx flags, which mostly + describe the args expected by the C func */ + const char *ml_doc; /* The __doc__ attribute, or NULL */ +}; +typedef struct PyMethodDef PyMethodDef; + +PyAPI_FUNC(PyObject *) Py_FindMethod(PyMethodDef[], PyObject *, const char *); + +#define PyCFunction_New(ML, SELF) PyCFunction_NewEx((ML), (SELF), NULL) +PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *, + PyObject *); + +/* Flag passed to newmethodobject */ +#define METH_OLDARGS 0x0000 +#define METH_VARARGS 0x0001 +#define METH_KEYWORDS 0x0002 +/* METH_NOARGS and METH_O must not be combined with the flags above. */ +#define METH_NOARGS 0x0004 +#define METH_O 0x0008 + +/* METH_CLASS and METH_STATIC are a little different; these control + the construction of methods for a class. These cannot be used for + functions in modules. */ +#define METH_CLASS 0x0010 +#define METH_STATIC 0x0020 + +/* METH_COEXIST allows a method to be entered eventhough a slot has + already filled the entry. When defined, the flag allows a separate + method, "__contains__" for example, to coexist with a defined + slot like sq_contains. */ + +#define METH_COEXIST 0x0040 + +typedef struct PyMethodChain { + PyMethodDef *methods; /* Methods of this type */ + struct PyMethodChain *link; /* NULL or base type */ +} PyMethodChain; + +PyAPI_FUNC(PyObject *) Py_FindMethodInChain(PyMethodChain *, PyObject *, + const char *); + +typedef struct { + PyObject_HEAD + PyMethodDef *m_ml; /* Description of the C function to call */ + PyObject *m_self; /* Passed as 'self' arg to the C func, can be NULL */ + PyObject *m_module; /* The __module__ attribute, can be anything */ +} PyCFunctionObject; + +PyAPI_FUNC(int) PyCFunction_ClearFreeList(void); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_METHODOBJECT_H */ diff --git a/PythonEnv/2.7/Include/modsupport.h b/PythonEnv/2.7/Include/modsupport.h new file mode 100644 index 0000000000..d4dddef0b5 --- /dev/null +++ b/PythonEnv/2.7/Include/modsupport.h @@ -0,0 +1,134 @@ + +#ifndef Py_MODSUPPORT_H +#define Py_MODSUPPORT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Module support interface */ + +#include + +/* If PY_SSIZE_T_CLEAN is defined, each functions treats #-specifier + to mean Py_ssize_t */ +#ifdef PY_SSIZE_T_CLEAN +#define PyArg_Parse _PyArg_Parse_SizeT +#define PyArg_ParseTuple _PyArg_ParseTuple_SizeT +#define PyArg_ParseTupleAndKeywords _PyArg_ParseTupleAndKeywords_SizeT +#define PyArg_VaParse _PyArg_VaParse_SizeT +#define PyArg_VaParseTupleAndKeywords _PyArg_VaParseTupleAndKeywords_SizeT +#define Py_BuildValue _Py_BuildValue_SizeT +#define Py_VaBuildValue _Py_VaBuildValue_SizeT +#else +PyAPI_FUNC(PyObject *) _Py_VaBuildValue_SizeT(const char *, va_list); +#endif + +PyAPI_FUNC(int) PyArg_Parse(PyObject *, const char *, ...); +PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...) Py_FORMAT_PARSETUPLE(PyArg_ParseTuple, 2, 3); +PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *, + const char *, char **, ...); +PyAPI_FUNC(int) PyArg_UnpackTuple(PyObject *, const char *, Py_ssize_t, Py_ssize_t, ...); +PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...); +PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...); +PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kw); + +PyAPI_FUNC(int) PyArg_VaParse(PyObject *, const char *, va_list); +PyAPI_FUNC(int) PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *, + const char *, char **, va_list); +PyAPI_FUNC(PyObject *) Py_VaBuildValue(const char *, va_list); + +PyAPI_FUNC(int) PyModule_AddObject(PyObject *, const char *, PyObject *); +PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, const char *, long); +PyAPI_FUNC(int) PyModule_AddStringConstant(PyObject *, const char *, const char *); +#define PyModule_AddIntMacro(m, c) PyModule_AddIntConstant(m, #c, c) +#define PyModule_AddStringMacro(m, c) PyModule_AddStringConstant(m, #c, c) + +#define PYTHON_API_VERSION 1013 +#define PYTHON_API_STRING "1013" +/* The API version is maintained (independently from the Python version) + so we can detect mismatches between the interpreter and dynamically + loaded modules. These are diagnosed by an error message but + the module is still loaded (because the mismatch can only be tested + after loading the module). The error message is intended to + explain the core dump a few seconds later. + + The symbol PYTHON_API_STRING defines the same value as a string + literal. *** PLEASE MAKE SURE THE DEFINITIONS MATCH. *** + + Please add a line or two to the top of this log for each API + version change: + + 22-Feb-2006 MvL 1013 PEP 353 - long indices for sequence lengths + + 19-Aug-2002 GvR 1012 Changes to string object struct for + interning changes, saving 3 bytes. + + 17-Jul-2001 GvR 1011 Descr-branch, just to be on the safe side + + 25-Jan-2001 FLD 1010 Parameters added to PyCode_New() and + PyFrame_New(); Python 2.1a2 + + 14-Mar-2000 GvR 1009 Unicode API added + + 3-Jan-1999 GvR 1007 Decided to change back! (Don't reuse 1008!) + + 3-Dec-1998 GvR 1008 Python 1.5.2b1 + + 18-Jan-1997 GvR 1007 string interning and other speedups + + 11-Oct-1996 GvR renamed Py_Ellipses to Py_Ellipsis :-( + + 30-Jul-1996 GvR Slice and ellipses syntax added + + 23-Jul-1996 GvR For 1.4 -- better safe than sorry this time :-) + + 7-Nov-1995 GvR Keyword arguments (should've been done at 1.3 :-( ) + + 10-Jan-1995 GvR Renamed globals to new naming scheme + + 9-Jan-1995 GvR Initial version (incompatible with older API) +*/ + +#ifdef MS_WINDOWS +/* Special defines for Windows versions used to live here. Things + have changed, and the "Version" is now in a global string variable. + Reason for this is that this for easier branding of a "custom DLL" + without actually needing a recompile. */ +#endif /* MS_WINDOWS */ + +#if SIZEOF_SIZE_T != SIZEOF_INT +/* On a 64-bit system, rename the Py_InitModule4 so that 2.4 + modules cannot get loaded into a 2.5 interpreter */ +#define Py_InitModule4 Py_InitModule4_64 +#endif + +#ifdef Py_TRACE_REFS + /* When we are tracing reference counts, rename Py_InitModule4 so + modules compiled with incompatible settings will generate a + link-time error. */ + #if SIZEOF_SIZE_T != SIZEOF_INT + #undef Py_InitModule4 + #define Py_InitModule4 Py_InitModule4TraceRefs_64 + #else + #define Py_InitModule4 Py_InitModule4TraceRefs + #endif +#endif + +PyAPI_FUNC(PyObject *) Py_InitModule4(const char *name, PyMethodDef *methods, + const char *doc, PyObject *self, + int apiver); + +#define Py_InitModule(name, methods) \ + Py_InitModule4(name, methods, (char *)NULL, (PyObject *)NULL, \ + PYTHON_API_VERSION) + +#define Py_InitModule3(name, methods, doc) \ + Py_InitModule4(name, methods, doc, (PyObject *)NULL, \ + PYTHON_API_VERSION) + +PyAPI_DATA(char *) _Py_PackageContext; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MODSUPPORT_H */ diff --git a/PythonEnv/2.7/Include/moduleobject.h b/PythonEnv/2.7/Include/moduleobject.h new file mode 100644 index 0000000000..b387f5bfd4 --- /dev/null +++ b/PythonEnv/2.7/Include/moduleobject.h @@ -0,0 +1,24 @@ + +/* Module object interface */ + +#ifndef Py_MODULEOBJECT_H +#define Py_MODULEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyModule_Type; + +#define PyModule_Check(op) PyObject_TypeCheck(op, &PyModule_Type) +#define PyModule_CheckExact(op) (Py_TYPE(op) == &PyModule_Type) + +PyAPI_FUNC(PyObject *) PyModule_New(const char *); +PyAPI_FUNC(PyObject *) PyModule_GetDict(PyObject *); +PyAPI_FUNC(char *) PyModule_GetName(PyObject *); +PyAPI_FUNC(char *) PyModule_GetFilename(PyObject *); +PyAPI_FUNC(void) _PyModule_Clear(PyObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MODULEOBJECT_H */ diff --git a/PythonEnv/2.7/Include/node.h b/PythonEnv/2.7/Include/node.h new file mode 100644 index 0000000000..9f6760c294 --- /dev/null +++ b/PythonEnv/2.7/Include/node.h @@ -0,0 +1,43 @@ + +/* Parse tree node interface */ + +#ifndef Py_NODE_H +#define Py_NODE_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _node { + short n_type; + char *n_str; + int n_lineno; + int n_col_offset; + int n_nchildren; + struct _node *n_child; +} node; + +PyAPI_FUNC(node *) PyNode_New(int type); +PyAPI_FUNC(int) PyNode_AddChild(node *n, int type, + char *str, int lineno, int col_offset); +PyAPI_FUNC(void) PyNode_Free(node *n); +#ifndef Py_LIMITED_API +Py_ssize_t _PyNode_SizeOf(node *n); +#endif + +/* Node access functions */ +#define NCH(n) ((n)->n_nchildren) + +#define CHILD(n, i) (&(n)->n_child[i]) +#define RCHILD(n, i) (CHILD(n, NCH(n) + i)) +#define TYPE(n) ((n)->n_type) +#define STR(n) ((n)->n_str) + +/* Assert that the type of a node is what we expect */ +#define REQ(n, type) assert(TYPE(n) == (type)) + +PyAPI_FUNC(void) PyNode_ListTree(node *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_NODE_H */ diff --git a/PythonEnv/2.7/Include/object.h b/PythonEnv/2.7/Include/object.h new file mode 100644 index 0000000000..afbc68dc04 --- /dev/null +++ b/PythonEnv/2.7/Include/object.h @@ -0,0 +1,1011 @@ +#ifndef Py_OBJECT_H +#define Py_OBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Object and type object interface */ + +/* +Objects are structures allocated on the heap. Special rules apply to +the use of objects to ensure they are properly garbage-collected. +Objects are never allocated statically or on the stack; they must be +accessed through special macros and functions only. (Type objects are +exceptions to the first rule; the standard types are represented by +statically initialized type objects, although work on type/class unification +for Python 2.2 made it possible to have heap-allocated type objects too). + +An object has a 'reference count' that is increased or decreased when a +pointer to the object is copied or deleted; when the reference count +reaches zero there are no references to the object left and it can be +removed from the heap. + +An object has a 'type' that determines what it represents and what kind +of data it contains. An object's type is fixed when it is created. +Types themselves are represented as objects; an object contains a +pointer to the corresponding type object. The type itself has a type +pointer pointing to the object representing the type 'type', which +contains a pointer to itself!). + +Objects do not float around in memory; once allocated an object keeps +the same size and address. Objects that must hold variable-size data +can contain pointers to variable-size parts of the object. Not all +objects of the same type have the same size; but the size cannot change +after allocation. (These restrictions are made so a reference to an +object can be simply a pointer -- moving an object would require +updating all the pointers, and changing an object's size would require +moving it if there was another object right next to it.) + +Objects are always accessed through pointers of the type 'PyObject *'. +The type 'PyObject' is a structure that only contains the reference count +and the type pointer. The actual memory allocated for an object +contains other data that can only be accessed after casting the pointer +to a pointer to a longer structure type. This longer type must start +with the reference count and type fields; the macro PyObject_HEAD should be +used for this (to accommodate for future changes). The implementation +of a particular object type can cast the object pointer to the proper +type and back. + +A standard interface exists for objects that contain an array of items +whose size is determined when the object is allocated. +*/ + +/* Py_DEBUG implies Py_TRACE_REFS. */ +#if defined(Py_DEBUG) && !defined(Py_TRACE_REFS) +#define Py_TRACE_REFS +#endif + +/* Py_TRACE_REFS implies Py_REF_DEBUG. */ +#if defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) +#define Py_REF_DEBUG +#endif + +#ifdef Py_TRACE_REFS +/* Define pointers to support a doubly-linked list of all live heap objects. */ +#define _PyObject_HEAD_EXTRA \ + struct _object *_ob_next; \ + struct _object *_ob_prev; + +#define _PyObject_EXTRA_INIT 0, 0, + +#else +#define _PyObject_HEAD_EXTRA +#define _PyObject_EXTRA_INIT +#endif + +/* PyObject_HEAD defines the initial segment of every PyObject. */ +#define PyObject_HEAD \ + _PyObject_HEAD_EXTRA \ + Py_ssize_t ob_refcnt; \ + struct _typeobject *ob_type; + +#define PyObject_HEAD_INIT(type) \ + _PyObject_EXTRA_INIT \ + 1, type, + +#define PyVarObject_HEAD_INIT(type, size) \ + PyObject_HEAD_INIT(type) size, + +/* PyObject_VAR_HEAD defines the initial segment of all variable-size + * container objects. These end with a declaration of an array with 1 + * element, but enough space is malloc'ed so that the array actually + * has room for ob_size elements. Note that ob_size is an element count, + * not necessarily a byte count. + */ +#define PyObject_VAR_HEAD \ + PyObject_HEAD \ + Py_ssize_t ob_size; /* Number of items in variable part */ +#define Py_INVALID_SIZE (Py_ssize_t)-1 + +/* Nothing is actually declared to be a PyObject, but every pointer to + * a Python object can be cast to a PyObject*. This is inheritance built + * by hand. Similarly every pointer to a variable-size Python object can, + * in addition, be cast to PyVarObject*. + */ +typedef struct _object { + PyObject_HEAD +} PyObject; + +typedef struct { + PyObject_VAR_HEAD +} PyVarObject; + +#define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) +#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) +#define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) + +/* +Type objects contain a string containing the type name (to help somewhat +in debugging), the allocation parameters (see PyObject_New() and +PyObject_NewVar()), +and methods for accessing objects of the type. Methods are optional, a +nil pointer meaning that particular kind of access is not available for +this type. The Py_DECREF() macro uses the tp_dealloc method without +checking for a nil pointer; it should always be implemented except if +the implementation can guarantee that the reference count will never +reach zero (e.g., for statically allocated type objects). + +NB: the methods for certain type groups are now contained in separate +method blocks. +*/ + +typedef PyObject * (*unaryfunc)(PyObject *); +typedef PyObject * (*binaryfunc)(PyObject *, PyObject *); +typedef PyObject * (*ternaryfunc)(PyObject *, PyObject *, PyObject *); +typedef int (*inquiry)(PyObject *); +typedef Py_ssize_t (*lenfunc)(PyObject *); +typedef int (*coercion)(PyObject **, PyObject **); +typedef PyObject *(*intargfunc)(PyObject *, int) Py_DEPRECATED(2.5); +typedef PyObject *(*intintargfunc)(PyObject *, int, int) Py_DEPRECATED(2.5); +typedef PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t); +typedef PyObject *(*ssizessizeargfunc)(PyObject *, Py_ssize_t, Py_ssize_t); +typedef int(*intobjargproc)(PyObject *, int, PyObject *); +typedef int(*intintobjargproc)(PyObject *, int, int, PyObject *); +typedef int(*ssizeobjargproc)(PyObject *, Py_ssize_t, PyObject *); +typedef int(*ssizessizeobjargproc)(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); +typedef int(*objobjargproc)(PyObject *, PyObject *, PyObject *); + + + +/* int-based buffer interface */ +typedef int (*getreadbufferproc)(PyObject *, int, void **); +typedef int (*getwritebufferproc)(PyObject *, int, void **); +typedef int (*getsegcountproc)(PyObject *, int *); +typedef int (*getcharbufferproc)(PyObject *, int, char **); +/* ssize_t-based buffer interface */ +typedef Py_ssize_t (*readbufferproc)(PyObject *, Py_ssize_t, void **); +typedef Py_ssize_t (*writebufferproc)(PyObject *, Py_ssize_t, void **); +typedef Py_ssize_t (*segcountproc)(PyObject *, Py_ssize_t *); +typedef Py_ssize_t (*charbufferproc)(PyObject *, Py_ssize_t, char **); + + +/* Py3k buffer interface */ +typedef struct bufferinfo { + void *buf; + PyObject *obj; /* owned reference */ + Py_ssize_t len; + Py_ssize_t itemsize; /* This is Py_ssize_t so it can be + pointed to by strides in simple case.*/ + int readonly; + int ndim; + char *format; + Py_ssize_t *shape; + Py_ssize_t *strides; + Py_ssize_t *suboffsets; + Py_ssize_t smalltable[2]; /* static store for shape and strides of + mono-dimensional buffers. */ + void *internal; +} Py_buffer; + +typedef int (*getbufferproc)(PyObject *, Py_buffer *, int); +typedef void (*releasebufferproc)(PyObject *, Py_buffer *); + + /* Flags for getting buffers */ +#define PyBUF_SIMPLE 0 +#define PyBUF_WRITABLE 0x0001 +/* we used to include an E, backwards compatible alias */ +#define PyBUF_WRITEABLE PyBUF_WRITABLE +#define PyBUF_FORMAT 0x0004 +#define PyBUF_ND 0x0008 +#define PyBUF_STRIDES (0x0010 | PyBUF_ND) +#define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) +#define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) +#define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) +#define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) + +#define PyBUF_CONTIG (PyBUF_ND | PyBUF_WRITABLE) +#define PyBUF_CONTIG_RO (PyBUF_ND) + +#define PyBUF_STRIDED (PyBUF_STRIDES | PyBUF_WRITABLE) +#define PyBUF_STRIDED_RO (PyBUF_STRIDES) + +#define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_WRITABLE | PyBUF_FORMAT) +#define PyBUF_RECORDS_RO (PyBUF_STRIDES | PyBUF_FORMAT) + +#define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_WRITABLE | PyBUF_FORMAT) +#define PyBUF_FULL_RO (PyBUF_INDIRECT | PyBUF_FORMAT) + + +#define PyBUF_READ 0x100 +#define PyBUF_WRITE 0x200 +#define PyBUF_SHADOW 0x400 +/* end Py3k buffer interface */ + +typedef int (*objobjproc)(PyObject *, PyObject *); +typedef int (*visitproc)(PyObject *, void *); +typedef int (*traverseproc)(PyObject *, visitproc, void *); + +typedef struct { + /* For numbers without flag bit Py_TPFLAGS_CHECKTYPES set, all + arguments are guaranteed to be of the object's type (modulo + coercion hacks -- i.e. if the type's coercion function + returns other types, then these are allowed as well). Numbers that + have the Py_TPFLAGS_CHECKTYPES flag bit set should check *both* + arguments for proper type and implement the necessary conversions + in the slot functions themselves. */ + + binaryfunc nb_add; + binaryfunc nb_subtract; + binaryfunc nb_multiply; + binaryfunc nb_divide; + binaryfunc nb_remainder; + binaryfunc nb_divmod; + ternaryfunc nb_power; + unaryfunc nb_negative; + unaryfunc nb_positive; + unaryfunc nb_absolute; + inquiry nb_nonzero; + unaryfunc nb_invert; + binaryfunc nb_lshift; + binaryfunc nb_rshift; + binaryfunc nb_and; + binaryfunc nb_xor; + binaryfunc nb_or; + coercion nb_coerce; + unaryfunc nb_int; + unaryfunc nb_long; + unaryfunc nb_float; + unaryfunc nb_oct; + unaryfunc nb_hex; + /* Added in release 2.0 */ + binaryfunc nb_inplace_add; + binaryfunc nb_inplace_subtract; + binaryfunc nb_inplace_multiply; + binaryfunc nb_inplace_divide; + binaryfunc nb_inplace_remainder; + ternaryfunc nb_inplace_power; + binaryfunc nb_inplace_lshift; + binaryfunc nb_inplace_rshift; + binaryfunc nb_inplace_and; + binaryfunc nb_inplace_xor; + binaryfunc nb_inplace_or; + + /* Added in release 2.2 */ + /* The following require the Py_TPFLAGS_HAVE_CLASS flag */ + binaryfunc nb_floor_divide; + binaryfunc nb_true_divide; + binaryfunc nb_inplace_floor_divide; + binaryfunc nb_inplace_true_divide; + + /* Added in release 2.5 */ + unaryfunc nb_index; +} PyNumberMethods; + +typedef struct { + lenfunc sq_length; + binaryfunc sq_concat; + ssizeargfunc sq_repeat; + ssizeargfunc sq_item; + ssizessizeargfunc sq_slice; + ssizeobjargproc sq_ass_item; + ssizessizeobjargproc sq_ass_slice; + objobjproc sq_contains; + /* Added in release 2.0 */ + binaryfunc sq_inplace_concat; + ssizeargfunc sq_inplace_repeat; +} PySequenceMethods; + +typedef struct { + lenfunc mp_length; + binaryfunc mp_subscript; + objobjargproc mp_ass_subscript; +} PyMappingMethods; + +typedef struct { + readbufferproc bf_getreadbuffer; + writebufferproc bf_getwritebuffer; + segcountproc bf_getsegcount; + charbufferproc bf_getcharbuffer; + getbufferproc bf_getbuffer; + releasebufferproc bf_releasebuffer; +} PyBufferProcs; + + +typedef void (*freefunc)(void *); +typedef void (*destructor)(PyObject *); +typedef int (*printfunc)(PyObject *, FILE *, int); +typedef PyObject *(*getattrfunc)(PyObject *, char *); +typedef PyObject *(*getattrofunc)(PyObject *, PyObject *); +typedef int (*setattrfunc)(PyObject *, char *, PyObject *); +typedef int (*setattrofunc)(PyObject *, PyObject *, PyObject *); +typedef int (*cmpfunc)(PyObject *, PyObject *); +typedef PyObject *(*reprfunc)(PyObject *); +typedef long (*hashfunc)(PyObject *); +typedef PyObject *(*richcmpfunc) (PyObject *, PyObject *, int); +typedef PyObject *(*getiterfunc) (PyObject *); +typedef PyObject *(*iternextfunc) (PyObject *); +typedef PyObject *(*descrgetfunc) (PyObject *, PyObject *, PyObject *); +typedef int (*descrsetfunc) (PyObject *, PyObject *, PyObject *); +typedef int (*initproc)(PyObject *, PyObject *, PyObject *); +typedef PyObject *(*newfunc)(struct _typeobject *, PyObject *, PyObject *); +typedef PyObject *(*allocfunc)(struct _typeobject *, Py_ssize_t); + +typedef struct _typeobject { + PyObject_VAR_HEAD + const char *tp_name; /* For printing, in format "." */ + Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ + + /* Methods to implement standard operations */ + + destructor tp_dealloc; + printfunc tp_print; + getattrfunc tp_getattr; + setattrfunc tp_setattr; + cmpfunc tp_compare; + reprfunc tp_repr; + + /* Method suites for standard classes */ + + PyNumberMethods *tp_as_number; + PySequenceMethods *tp_as_sequence; + PyMappingMethods *tp_as_mapping; + + /* More standard operations (here for binary compatibility) */ + + hashfunc tp_hash; + ternaryfunc tp_call; + reprfunc tp_str; + getattrofunc tp_getattro; + setattrofunc tp_setattro; + + /* Functions to access object as input/output buffer */ + PyBufferProcs *tp_as_buffer; + + /* Flags to define presence of optional/expanded features */ + long tp_flags; + + const char *tp_doc; /* Documentation string */ + + /* Assigned meaning in release 2.0 */ + /* call function for all accessible objects */ + traverseproc tp_traverse; + + /* delete references to contained objects */ + inquiry tp_clear; + + /* Assigned meaning in release 2.1 */ + /* rich comparisons */ + richcmpfunc tp_richcompare; + + /* weak reference enabler */ + Py_ssize_t tp_weaklistoffset; + + /* Added in release 2.2 */ + /* Iterators */ + getiterfunc tp_iter; + iternextfunc tp_iternext; + + /* Attribute descriptor and subclassing stuff */ + struct PyMethodDef *tp_methods; + struct PyMemberDef *tp_members; + struct PyGetSetDef *tp_getset; + struct _typeobject *tp_base; + PyObject *tp_dict; + descrgetfunc tp_descr_get; + descrsetfunc tp_descr_set; + Py_ssize_t tp_dictoffset; + initproc tp_init; + allocfunc tp_alloc; + newfunc tp_new; + freefunc tp_free; /* Low-level free-memory routine */ + inquiry tp_is_gc; /* For PyObject_IS_GC */ + PyObject *tp_bases; + PyObject *tp_mro; /* method resolution order */ + PyObject *tp_cache; + PyObject *tp_subclasses; + PyObject *tp_weaklist; + destructor tp_del; + + /* Type attribute cache version tag. Added in version 2.6 */ + unsigned int tp_version_tag; + +#ifdef COUNT_ALLOCS + /* these must be last and never explicitly initialized */ + Py_ssize_t tp_allocs; + Py_ssize_t tp_frees; + Py_ssize_t tp_maxalloc; + struct _typeobject *tp_prev; + struct _typeobject *tp_next; +#endif +} PyTypeObject; + + +/* The *real* layout of a type object when allocated on the heap */ +typedef struct _heaptypeobject { + /* Note: there's a dependency on the order of these members + in slotptr() in typeobject.c . */ + PyTypeObject ht_type; + PyNumberMethods as_number; + PyMappingMethods as_mapping; + PySequenceMethods as_sequence; /* as_sequence comes after as_mapping, + so that the mapping wins when both + the mapping and the sequence define + a given operator (e.g. __getitem__). + see add_operators() in typeobject.c . */ + PyBufferProcs as_buffer; + PyObject *ht_name, *ht_slots; + /* here are optional user slots, followed by the members. */ +} PyHeapTypeObject; + +/* access macro to the members which are floating "behind" the object */ +#define PyHeapType_GET_MEMBERS(etype) \ + ((PyMemberDef *)(((char *)etype) + Py_TYPE(etype)->tp_basicsize)) + + +/* Generic type check */ +PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *); +#define PyObject_TypeCheck(ob, tp) \ + (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp))) + +PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */ +PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */ +PyAPI_DATA(PyTypeObject) PySuper_Type; /* built-in 'super' */ + +#define PyType_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS) +#define PyType_CheckExact(op) (Py_TYPE(op) == &PyType_Type) + +PyAPI_FUNC(int) PyType_Ready(PyTypeObject *); +PyAPI_FUNC(PyObject *) PyType_GenericAlloc(PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *, + PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *); +PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, char *, PyObject **); +PyAPI_FUNC(unsigned int) PyType_ClearCache(void); +PyAPI_FUNC(void) PyType_Modified(PyTypeObject *); + +/* Generic operations on objects */ +PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int); +PyAPI_FUNC(void) _PyObject_Dump(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_Repr(PyObject *); +PyAPI_FUNC(PyObject *) _PyObject_Str(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_Str(PyObject *); +#define PyObject_Bytes PyObject_Str +#ifdef Py_USING_UNICODE +PyAPI_FUNC(PyObject *) PyObject_Unicode(PyObject *); +#endif +PyAPI_FUNC(int) PyObject_Compare(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyObject_RichCompare(PyObject *, PyObject *, int); +PyAPI_FUNC(int) PyObject_RichCompareBool(PyObject *, PyObject *, int); +PyAPI_FUNC(PyObject *) PyObject_GetAttrString(PyObject *, const char *); +PyAPI_FUNC(int) PyObject_SetAttrString(PyObject *, const char *, PyObject *); +PyAPI_FUNC(int) PyObject_HasAttrString(PyObject *, const char *); +PyAPI_FUNC(PyObject *) PyObject_GetAttr(PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *); +PyAPI_FUNC(PyObject **) _PyObject_GetDictPtr(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_SelfIter(PyObject *); +PyAPI_FUNC(PyObject *) _PyObject_NextNotImplemented(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, + PyObject *, PyObject *); +PyAPI_FUNC(long) PyObject_Hash(PyObject *); +PyAPI_FUNC(long) PyObject_HashNotImplemented(PyObject *); +PyAPI_FUNC(int) PyObject_IsTrue(PyObject *); +PyAPI_FUNC(int) PyObject_Not(PyObject *); +PyAPI_FUNC(int) PyCallable_Check(PyObject *); +PyAPI_FUNC(int) PyNumber_Coerce(PyObject **, PyObject **); +PyAPI_FUNC(int) PyNumber_CoerceEx(PyObject **, PyObject **); + +PyAPI_FUNC(void) PyObject_ClearWeakRefs(PyObject *); + +/* A slot function whose address we need to compare */ +extern int _PyObject_SlotCompare(PyObject *, PyObject *); +/* Same as PyObject_Generic{Get,Set}Attr, but passing the attributes + dict as the last parameter. */ +PyAPI_FUNC(PyObject *) +_PyObject_GenericGetAttrWithDict(PyObject *, PyObject *, PyObject *); +PyAPI_FUNC(int) +_PyObject_GenericSetAttrWithDict(PyObject *, PyObject *, + PyObject *, PyObject *); + + +/* PyObject_Dir(obj) acts like Python __builtin__.dir(obj), returning a + list of strings. PyObject_Dir(NULL) is like __builtin__.dir(), + returning the names of the current locals. In this case, if there are + no current locals, NULL is returned, and PyErr_Occurred() is false. +*/ +PyAPI_FUNC(PyObject *) PyObject_Dir(PyObject *); + + +/* Helpers for printing recursive container types */ +PyAPI_FUNC(int) Py_ReprEnter(PyObject *); +PyAPI_FUNC(void) Py_ReprLeave(PyObject *); + +/* Helpers for hash functions */ +PyAPI_FUNC(long) _Py_HashDouble(double); +PyAPI_FUNC(long) _Py_HashPointer(void*); + +typedef struct { + long prefix; + long suffix; +} _Py_HashSecret_t; +PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; + +#ifdef Py_DEBUG +PyAPI_DATA(int) _Py_HashSecret_Initialized; +#endif + +/* Helper for passing objects to printf and the like */ +#define PyObject_REPR(obj) PyString_AS_STRING(PyObject_Repr(obj)) + +/* Flag bits for printing: */ +#define Py_PRINT_RAW 1 /* No string quotes etc. */ + +/* +`Type flags (tp_flags) + +These flags are used to extend the type structure in a backwards-compatible +fashion. Extensions can use the flags to indicate (and test) when a given +type structure contains a new feature. The Python core will use these when +introducing new functionality between major revisions (to avoid mid-version +changes in the PYTHON_API_VERSION). + +Arbitration of the flag bit positions will need to be coordinated among +all extension writers who publically release their extensions (this will +be fewer than you might expect!).. + +Python 1.5.2 introduced the bf_getcharbuffer slot into PyBufferProcs. + +Type definitions should use Py_TPFLAGS_DEFAULT for their tp_flags value. + +Code can use PyType_HasFeature(type_ob, flag_value) to test whether the +given type object has a specified feature. + +NOTE: when building the core, Py_TPFLAGS_DEFAULT includes +Py_TPFLAGS_HAVE_VERSION_TAG; outside the core, it doesn't. This is so +that extensions that modify tp_dict of their own types directly don't +break, since this was allowed in 2.5. In 3.0 they will have to +manually remove this flag though! +*/ + +/* PyBufferProcs contains bf_getcharbuffer */ +#define Py_TPFLAGS_HAVE_GETCHARBUFFER (1L<<0) + +/* PySequenceMethods contains sq_contains */ +#define Py_TPFLAGS_HAVE_SEQUENCE_IN (1L<<1) + +/* This is here for backwards compatibility. Extensions that use the old GC + * API will still compile but the objects will not be tracked by the GC. */ +#define Py_TPFLAGS_GC 0 /* used to be (1L<<2) */ + +/* PySequenceMethods and PyNumberMethods contain in-place operators */ +#define Py_TPFLAGS_HAVE_INPLACEOPS (1L<<3) + +/* PyNumberMethods do their own coercion */ +#define Py_TPFLAGS_CHECKTYPES (1L<<4) + +/* tp_richcompare is defined */ +#define Py_TPFLAGS_HAVE_RICHCOMPARE (1L<<5) + +/* Objects which are weakly referencable if their tp_weaklistoffset is >0 */ +#define Py_TPFLAGS_HAVE_WEAKREFS (1L<<6) + +/* tp_iter is defined */ +#define Py_TPFLAGS_HAVE_ITER (1L<<7) + +/* New members introduced by Python 2.2 exist */ +#define Py_TPFLAGS_HAVE_CLASS (1L<<8) + +/* Set if the type object is dynamically allocated */ +#define Py_TPFLAGS_HEAPTYPE (1L<<9) + +/* Set if the type allows subclassing */ +#define Py_TPFLAGS_BASETYPE (1L<<10) + +/* Set if the type is 'ready' -- fully initialized */ +#define Py_TPFLAGS_READY (1L<<12) + +/* Set while the type is being 'readied', to prevent recursive ready calls */ +#define Py_TPFLAGS_READYING (1L<<13) + +/* Objects support garbage collection (see objimp.h) */ +#define Py_TPFLAGS_HAVE_GC (1L<<14) + +/* These two bits are preserved for Stackless Python, next after this is 17 */ +#ifdef STACKLESS +#define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION (3L<<15) +#else +#define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION 0 +#endif + +/* Objects support nb_index in PyNumberMethods */ +#define Py_TPFLAGS_HAVE_INDEX (1L<<17) + +/* Objects support type attribute cache */ +#define Py_TPFLAGS_HAVE_VERSION_TAG (1L<<18) +#define Py_TPFLAGS_VALID_VERSION_TAG (1L<<19) + +/* Type is abstract and cannot be instantiated */ +#define Py_TPFLAGS_IS_ABSTRACT (1L<<20) + +/* Has the new buffer protocol */ +#define Py_TPFLAGS_HAVE_NEWBUFFER (1L<<21) + +/* These flags are used to determine if a type is a subclass. */ +#define Py_TPFLAGS_INT_SUBCLASS (1L<<23) +#define Py_TPFLAGS_LONG_SUBCLASS (1L<<24) +#define Py_TPFLAGS_LIST_SUBCLASS (1L<<25) +#define Py_TPFLAGS_TUPLE_SUBCLASS (1L<<26) +#define Py_TPFLAGS_STRING_SUBCLASS (1L<<27) +#define Py_TPFLAGS_UNICODE_SUBCLASS (1L<<28) +#define Py_TPFLAGS_DICT_SUBCLASS (1L<<29) +#define Py_TPFLAGS_BASE_EXC_SUBCLASS (1L<<30) +#define Py_TPFLAGS_TYPE_SUBCLASS (1L<<31) + +#define Py_TPFLAGS_DEFAULT_EXTERNAL ( \ + Py_TPFLAGS_HAVE_GETCHARBUFFER | \ + Py_TPFLAGS_HAVE_SEQUENCE_IN | \ + Py_TPFLAGS_HAVE_INPLACEOPS | \ + Py_TPFLAGS_HAVE_RICHCOMPARE | \ + Py_TPFLAGS_HAVE_WEAKREFS | \ + Py_TPFLAGS_HAVE_ITER | \ + Py_TPFLAGS_HAVE_CLASS | \ + Py_TPFLAGS_HAVE_STACKLESS_EXTENSION | \ + Py_TPFLAGS_HAVE_INDEX | \ + 0) +#define Py_TPFLAGS_DEFAULT_CORE (Py_TPFLAGS_DEFAULT_EXTERNAL | \ + Py_TPFLAGS_HAVE_VERSION_TAG) + +#ifdef Py_BUILD_CORE +#define Py_TPFLAGS_DEFAULT Py_TPFLAGS_DEFAULT_CORE +#else +#define Py_TPFLAGS_DEFAULT Py_TPFLAGS_DEFAULT_EXTERNAL +#endif + +#define PyType_HasFeature(t,f) (((t)->tp_flags & (f)) != 0) +#define PyType_FastSubclass(t,f) PyType_HasFeature(t,f) + + +/* +The macros Py_INCREF(op) and Py_DECREF(op) are used to increment or decrement +reference counts. Py_DECREF calls the object's deallocator function when +the refcount falls to 0; for +objects that don't contain references to other objects or heap memory +this can be the standard function free(). Both macros can be used +wherever a void expression is allowed. The argument must not be a +NULL pointer. If it may be NULL, use Py_XINCREF/Py_XDECREF instead. +The macro _Py_NewReference(op) initialize reference counts to 1, and +in special builds (Py_REF_DEBUG, Py_TRACE_REFS) performs additional +bookkeeping appropriate to the special build. + +We assume that the reference count field can never overflow; this can +be proven when the size of the field is the same as the pointer size, so +we ignore the possibility. Provided a C int is at least 32 bits (which +is implicitly assumed in many parts of this code), that's enough for +about 2**31 references to an object. + +XXX The following became out of date in Python 2.2, but I'm not sure +XXX what the full truth is now. Certainly, heap-allocated type objects +XXX can and should be deallocated. +Type objects should never be deallocated; the type pointer in an object +is not considered to be a reference to the type object, to save +complications in the deallocation function. (This is actually a +decision that's up to the implementer of each new type so if you want, +you can count such references to the type object.) + +*** WARNING*** The Py_DECREF macro must have a side-effect-free argument +since it may evaluate its argument multiple times. (The alternative +would be to mace it a proper function or assign it to a global temporary +variable first, both of which are slower; and in a multi-threaded +environment the global variable trick is not safe.) +*/ + +/* First define a pile of simple helper macros, one set per special + * build symbol. These either expand to the obvious things, or to + * nothing at all when the special mode isn't in effect. The main + * macros can later be defined just once then, yet expand to different + * things depending on which special build options are and aren't in effect. + * Trust me : while painful, this is 20x easier to understand than, + * e.g, defining _Py_NewReference five different times in a maze of nested + * #ifdefs (we used to do that -- it was impenetrable). + */ +#ifdef Py_REF_DEBUG +PyAPI_DATA(Py_ssize_t) _Py_RefTotal; +PyAPI_FUNC(void) _Py_NegativeRefcount(const char *fname, + int lineno, PyObject *op); +PyAPI_FUNC(PyObject *) _PyDict_Dummy(void); +PyAPI_FUNC(PyObject *) _PySet_Dummy(void); +PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); +#define _Py_INC_REFTOTAL _Py_RefTotal++ +#define _Py_DEC_REFTOTAL _Py_RefTotal-- +#define _Py_REF_DEBUG_COMMA , +#define _Py_CHECK_REFCNT(OP) \ +{ if (((PyObject*)OP)->ob_refcnt < 0) \ + _Py_NegativeRefcount(__FILE__, __LINE__, \ + (PyObject *)(OP)); \ +} +#else +#define _Py_INC_REFTOTAL +#define _Py_DEC_REFTOTAL +#define _Py_REF_DEBUG_COMMA +#define _Py_CHECK_REFCNT(OP) /* a semicolon */; +#endif /* Py_REF_DEBUG */ + +#ifdef COUNT_ALLOCS +PyAPI_FUNC(void) inc_count(PyTypeObject *); +PyAPI_FUNC(void) dec_count(PyTypeObject *); +#define _Py_INC_TPALLOCS(OP) inc_count(Py_TYPE(OP)) +#define _Py_INC_TPFREES(OP) dec_count(Py_TYPE(OP)) +#define _Py_DEC_TPFREES(OP) Py_TYPE(OP)->tp_frees-- +#define _Py_COUNT_ALLOCS_COMMA , +#else +#define _Py_INC_TPALLOCS(OP) +#define _Py_INC_TPFREES(OP) +#define _Py_DEC_TPFREES(OP) +#define _Py_COUNT_ALLOCS_COMMA +#endif /* COUNT_ALLOCS */ + +#ifdef Py_TRACE_REFS +/* Py_TRACE_REFS is such major surgery that we call external routines. */ +PyAPI_FUNC(void) _Py_NewReference(PyObject *); +PyAPI_FUNC(void) _Py_ForgetReference(PyObject *); +PyAPI_FUNC(void) _Py_Dealloc(PyObject *); +PyAPI_FUNC(void) _Py_PrintReferences(FILE *); +PyAPI_FUNC(void) _Py_PrintReferenceAddresses(FILE *); +PyAPI_FUNC(void) _Py_AddToAllObjects(PyObject *, int force); + +#else +/* Without Py_TRACE_REFS, there's little enough to do that we expand code + * inline. + */ +#define _Py_NewReference(op) ( \ + _Py_INC_TPALLOCS(op) _Py_COUNT_ALLOCS_COMMA \ + _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ + Py_REFCNT(op) = 1) + +#define _Py_ForgetReference(op) _Py_INC_TPFREES(op) + +#define _Py_Dealloc(op) ( \ + _Py_INC_TPFREES(op) _Py_COUNT_ALLOCS_COMMA \ + (*Py_TYPE(op)->tp_dealloc)((PyObject *)(op))) +#endif /* !Py_TRACE_REFS */ + +#define Py_INCREF(op) ( \ + _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ + ((PyObject*)(op))->ob_refcnt++) + +#define Py_DECREF(op) \ + do { \ + if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA \ + --((PyObject*)(op))->ob_refcnt != 0) \ + _Py_CHECK_REFCNT(op) \ + else \ + _Py_Dealloc((PyObject *)(op)); \ + } while (0) + +/* Safely decref `op` and set `op` to NULL, especially useful in tp_clear + * and tp_dealloc implementatons. + * + * Note that "the obvious" code can be deadly: + * + * Py_XDECREF(op); + * op = NULL; + * + * Typically, `op` is something like self->containee, and `self` is done + * using its `containee` member. In the code sequence above, suppose + * `containee` is non-NULL with a refcount of 1. Its refcount falls to + * 0 on the first line, which can trigger an arbitrary amount of code, + * possibly including finalizers (like __del__ methods or weakref callbacks) + * coded in Python, which in turn can release the GIL and allow other threads + * to run, etc. Such code may even invoke methods of `self` again, or cause + * cyclic gc to trigger, but-- oops! --self->containee still points to the + * object being torn down, and it may be in an insane state while being torn + * down. This has in fact been a rich historic source of miserable (rare & + * hard-to-diagnose) segfaulting (and other) bugs. + * + * The safe way is: + * + * Py_CLEAR(op); + * + * That arranges to set `op` to NULL _before_ decref'ing, so that any code + * triggered as a side-effect of `op` getting torn down no longer believes + * `op` points to a valid object. + * + * There are cases where it's safe to use the naive code, but they're brittle. + * For example, if `op` points to a Python integer, you know that destroying + * one of those can't cause problems -- but in part that relies on that + * Python integers aren't currently weakly referencable. Best practice is + * to use Py_CLEAR() even if you can't think of a reason for why you need to. + */ +#define Py_CLEAR(op) \ + do { \ + if (op) { \ + PyObject *_py_tmp = (PyObject *)(op); \ + (op) = NULL; \ + Py_DECREF(_py_tmp); \ + } \ + } while (0) + +/* Macros to use in case the object pointer may be NULL: */ +#define Py_XINCREF(op) do { if ((op) == NULL) ; else Py_INCREF(op); } while (0) +#define Py_XDECREF(op) do { if ((op) == NULL) ; else Py_DECREF(op); } while (0) + +/* +These are provided as conveniences to Python runtime embedders, so that +they can have object code that is not dependent on Python compilation flags. +*/ +PyAPI_FUNC(void) Py_IncRef(PyObject *); +PyAPI_FUNC(void) Py_DecRef(PyObject *); + +/* +_Py_NoneStruct is an object of undefined type which can be used in contexts +where NULL (nil) is not suitable (since NULL often means 'error'). + +Don't forget to apply Py_INCREF() when returning this value!!! +*/ +PyAPI_DATA(PyObject) _Py_NoneStruct; /* Don't use this directly */ +#define Py_None (&_Py_NoneStruct) + +/* Macro for returning Py_None from a function */ +#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None + +/* +Py_NotImplemented is a singleton used to signal that an operation is +not implemented for a given type combination. +*/ +PyAPI_DATA(PyObject) _Py_NotImplementedStruct; /* Don't use this directly */ +#define Py_NotImplemented (&_Py_NotImplementedStruct) + +/* Rich comparison opcodes */ +#define Py_LT 0 +#define Py_LE 1 +#define Py_EQ 2 +#define Py_NE 3 +#define Py_GT 4 +#define Py_GE 5 + +/* Maps Py_LT to Py_GT, ..., Py_GE to Py_LE. + * Defined in object.c. + */ +PyAPI_DATA(int) _Py_SwappedOp[]; + +/* +Define staticforward and statichere for source compatibility with old +C extensions. + +The staticforward define was needed to support certain broken C +compilers (notably SCO ODT 3.0, perhaps early AIX as well) botched the +static keyword when it was used with a forward declaration of a static +initialized structure. Standard C allows the forward declaration with +static, and we've decided to stop catering to broken C compilers. +(In fact, we expect that the compilers are all fixed eight years later.) +*/ + +#define staticforward static +#define statichere static + + +/* +More conventions +================ + +Argument Checking +----------------- + +Functions that take objects as arguments normally don't check for nil +arguments, but they do check the type of the argument, and return an +error if the function doesn't apply to the type. + +Failure Modes +------------- + +Functions may fail for a variety of reasons, including running out of +memory. This is communicated to the caller in two ways: an error string +is set (see errors.h), and the function result differs: functions that +normally return a pointer return NULL for failure, functions returning +an integer return -1 (which could be a legal return value too!), and +other functions return 0 for success and -1 for failure. +Callers should always check for errors before using the result. If +an error was set, the caller must either explicitly clear it, or pass +the error on to its caller. + +Reference Counts +---------------- + +It takes a while to get used to the proper usage of reference counts. + +Functions that create an object set the reference count to 1; such new +objects must be stored somewhere or destroyed again with Py_DECREF(). +Some functions that 'store' objects, such as PyTuple_SetItem() and +PyList_SetItem(), +don't increment the reference count of the object, since the most +frequent use is to store a fresh object. Functions that 'retrieve' +objects, such as PyTuple_GetItem() and PyDict_GetItemString(), also +don't increment +the reference count, since most frequently the object is only looked at +quickly. Thus, to retrieve an object and store it again, the caller +must call Py_INCREF() explicitly. + +NOTE: functions that 'consume' a reference count, like +PyList_SetItem(), consume the reference even if the object wasn't +successfully stored, to simplify error handling. + +It seems attractive to make other functions that take an object as +argument consume a reference count; however, this may quickly get +confusing (even the current practice is already confusing). Consider +it carefully, it may save lots of calls to Py_INCREF() and Py_DECREF() at +times. +*/ + + +/* Trashcan mechanism, thanks to Christian Tismer. + +When deallocating a container object, it's possible to trigger an unbounded +chain of deallocations, as each Py_DECREF in turn drops the refcount on "the +next" object in the chain to 0. This can easily lead to stack faults, and +especially in threads (which typically have less stack space to work with). + +A container object that participates in cyclic gc can avoid this by +bracketing the body of its tp_dealloc function with a pair of macros: + +static void +mytype_dealloc(mytype *p) +{ + ... declarations go here ... + + PyObject_GC_UnTrack(p); // must untrack first + Py_TRASHCAN_SAFE_BEGIN(p) + ... The body of the deallocator goes here, including all calls ... + ... to Py_DECREF on contained objects. ... + Py_TRASHCAN_SAFE_END(p) +} + +CAUTION: Never return from the middle of the body! If the body needs to +"get out early", put a label immediately before the Py_TRASHCAN_SAFE_END +call, and goto it. Else the call-depth counter (see below) will stay +above 0 forever, and the trashcan will never get emptied. + +How it works: The BEGIN macro increments a call-depth counter. So long +as this counter is small, the body of the deallocator is run directly without +further ado. But if the counter gets large, it instead adds p to a list of +objects to be deallocated later, skips the body of the deallocator, and +resumes execution after the END macro. The tp_dealloc routine then returns +without deallocating anything (and so unbounded call-stack depth is avoided). + +When the call stack finishes unwinding again, code generated by the END macro +notices this, and calls another routine to deallocate all the objects that +may have been added to the list of deferred deallocations. In effect, a +chain of N deallocations is broken into N / PyTrash_UNWIND_LEVEL pieces, +with the call stack never exceeding a depth of PyTrash_UNWIND_LEVEL. +*/ + +/* This is the old private API, invoked by the macros before 2.7.4. + Kept for binary compatibility of extensions. */ +PyAPI_FUNC(void) _PyTrash_deposit_object(PyObject*); +PyAPI_FUNC(void) _PyTrash_destroy_chain(void); +PyAPI_DATA(int) _PyTrash_delete_nesting; +PyAPI_DATA(PyObject *) _PyTrash_delete_later; + +/* The new thread-safe private API, invoked by the macros below. */ +PyAPI_FUNC(void) _PyTrash_thread_deposit_object(PyObject*); +PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(void); + +#define PyTrash_UNWIND_LEVEL 50 + +/* Note the workaround for when the thread state is NULL (issue #17703) */ +#define Py_TRASHCAN_SAFE_BEGIN(op) \ + do { \ + PyThreadState *_tstate = PyThreadState_GET(); \ + if (!_tstate || \ + _tstate->trash_delete_nesting < PyTrash_UNWIND_LEVEL) { \ + if (_tstate) \ + ++_tstate->trash_delete_nesting; + /* The body of the deallocator is here. */ +#define Py_TRASHCAN_SAFE_END(op) \ + if (_tstate) { \ + --_tstate->trash_delete_nesting; \ + if (_tstate->trash_delete_later \ + && _tstate->trash_delete_nesting <= 0) \ + _PyTrash_thread_destroy_chain(); \ + } \ + } \ + else \ + _PyTrash_thread_deposit_object((PyObject*)op); \ + } while (0); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OBJECT_H */ diff --git a/PythonEnv/2.7/Include/objimpl.h b/PythonEnv/2.7/Include/objimpl.h new file mode 100644 index 0000000000..55e83eced6 --- /dev/null +++ b/PythonEnv/2.7/Include/objimpl.h @@ -0,0 +1,354 @@ +/* The PyObject_ memory family: high-level object memory interfaces. + See pymem.h for the low-level PyMem_ family. +*/ + +#ifndef Py_OBJIMPL_H +#define Py_OBJIMPL_H + +#include "pymem.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* BEWARE: + + Each interface exports both functions and macros. Extension modules should + use the functions, to ensure binary compatibility across Python versions. + Because the Python implementation is free to change internal details, and + the macros may (or may not) expose details for speed, if you do use the + macros you must recompile your extensions with each Python release. + + Never mix calls to PyObject_ memory functions with calls to the platform + malloc/realloc/ calloc/free, or with calls to PyMem_. +*/ + +/* +Functions and macros for modules that implement new object types. + + - PyObject_New(type, typeobj) allocates memory for a new object of the given + type, and initializes part of it. 'type' must be the C structure type used + to represent the object, and 'typeobj' the address of the corresponding + type object. Reference count and type pointer are filled in; the rest of + the bytes of the object are *undefined*! The resulting expression type is + 'type *'. The size of the object is determined by the tp_basicsize field + of the type object. + + - PyObject_NewVar(type, typeobj, n) is similar but allocates a variable-size + object with room for n items. In addition to the refcount and type pointer + fields, this also fills in the ob_size field. + + - PyObject_Del(op) releases the memory allocated for an object. It does not + run a destructor -- it only frees the memory. PyObject_Free is identical. + + - PyObject_Init(op, typeobj) and PyObject_InitVar(op, typeobj, n) don't + allocate memory. Instead of a 'type' parameter, they take a pointer to a + new object (allocated by an arbitrary allocator), and initialize its object + header fields. + +Note that objects created with PyObject_{New, NewVar} are allocated using the +specialized Python allocator (implemented in obmalloc.c), if WITH_PYMALLOC is +enabled. In addition, a special debugging allocator is used if PYMALLOC_DEBUG +is also #defined. + +In case a specific form of memory management is needed (for example, if you +must use the platform malloc heap(s), or shared memory, or C++ local storage or +operator new), you must first allocate the object with your custom allocator, +then pass its pointer to PyObject_{Init, InitVar} for filling in its Python- +specific fields: reference count, type pointer, possibly others. You should +be aware that Python no control over these objects because they don't +cooperate with the Python memory manager. Such objects may not be eligible +for automatic garbage collection and you have to make sure that they are +released accordingly whenever their destructor gets called (cf. the specific +form of memory management you're using). + +Unless you have specific memory management requirements, use +PyObject_{New, NewVar, Del}. +*/ + +/* + * Raw object memory interface + * =========================== + */ + +/* Functions to call the same malloc/realloc/free as used by Python's + object allocator. If WITH_PYMALLOC is enabled, these may differ from + the platform malloc/realloc/free. The Python object allocator is + designed for fast, cache-conscious allocation of many "small" objects, + and with low hidden memory overhead. + + PyObject_Malloc(0) returns a unique non-NULL pointer if possible. + + PyObject_Realloc(NULL, n) acts like PyObject_Malloc(n). + PyObject_Realloc(p != NULL, 0) does not return NULL, or free the memory + at p. + + Returned pointers must be checked for NULL explicitly; no action is + performed on failure other than to return NULL (no warning it printed, no + exception is set, etc). + + For allocating objects, use PyObject_{New, NewVar} instead whenever + possible. The PyObject_{Malloc, Realloc, Free} family is exposed + so that you can exploit Python's small-block allocator for non-object + uses. If you must use these routines to allocate object memory, make sure + the object gets initialized via PyObject_{Init, InitVar} after obtaining + the raw memory. +*/ +PyAPI_FUNC(void *) PyObject_Malloc(size_t); +PyAPI_FUNC(void *) PyObject_Realloc(void *, size_t); +PyAPI_FUNC(void) PyObject_Free(void *); + + +/* Macros */ +#ifdef WITH_PYMALLOC +#ifdef PYMALLOC_DEBUG /* WITH_PYMALLOC && PYMALLOC_DEBUG */ +PyAPI_FUNC(void *) _PyObject_DebugMalloc(size_t nbytes); +PyAPI_FUNC(void *) _PyObject_DebugRealloc(void *p, size_t nbytes); +PyAPI_FUNC(void) _PyObject_DebugFree(void *p); +PyAPI_FUNC(void) _PyObject_DebugDumpAddress(const void *p); +PyAPI_FUNC(void) _PyObject_DebugCheckAddress(const void *p); +PyAPI_FUNC(void) _PyObject_DebugMallocStats(void); +PyAPI_FUNC(void *) _PyObject_DebugMallocApi(char api, size_t nbytes); +PyAPI_FUNC(void *) _PyObject_DebugReallocApi(char api, void *p, size_t nbytes); +PyAPI_FUNC(void) _PyObject_DebugFreeApi(char api, void *p); +PyAPI_FUNC(void) _PyObject_DebugCheckAddressApi(char api, const void *p); +PyAPI_FUNC(void *) _PyMem_DebugMalloc(size_t nbytes); +PyAPI_FUNC(void *) _PyMem_DebugRealloc(void *p, size_t nbytes); +PyAPI_FUNC(void) _PyMem_DebugFree(void *p); +#define PyObject_MALLOC _PyObject_DebugMalloc +#define PyObject_Malloc _PyObject_DebugMalloc +#define PyObject_REALLOC _PyObject_DebugRealloc +#define PyObject_Realloc _PyObject_DebugRealloc +#define PyObject_FREE _PyObject_DebugFree +#define PyObject_Free _PyObject_DebugFree + +#else /* WITH_PYMALLOC && ! PYMALLOC_DEBUG */ +#define PyObject_MALLOC PyObject_Malloc +#define PyObject_REALLOC PyObject_Realloc +#define PyObject_FREE PyObject_Free +#endif + +#else /* ! WITH_PYMALLOC */ +#define PyObject_MALLOC PyMem_MALLOC +#define PyObject_REALLOC PyMem_REALLOC +#define PyObject_FREE PyMem_FREE + +#endif /* WITH_PYMALLOC */ + +#define PyObject_Del PyObject_Free +#define PyObject_DEL PyObject_FREE + +/* for source compatibility with 2.2 */ +#define _PyObject_Del PyObject_Free + +/* + * Generic object allocator interface + * ================================== + */ + +/* Functions */ +PyAPI_FUNC(PyObject *) PyObject_Init(PyObject *, PyTypeObject *); +PyAPI_FUNC(PyVarObject *) PyObject_InitVar(PyVarObject *, + PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(PyObject *) _PyObject_New(PyTypeObject *); +PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); + +#define PyObject_New(type, typeobj) \ + ( (type *) _PyObject_New(typeobj) ) +#define PyObject_NewVar(type, typeobj, n) \ + ( (type *) _PyObject_NewVar((typeobj), (n)) ) + +/* Macros trading binary compatibility for speed. See also pymem.h. + Note that these macros expect non-NULL object pointers.*/ +#define PyObject_INIT(op, typeobj) \ + ( Py_TYPE(op) = (typeobj), _Py_NewReference((PyObject *)(op)), (op) ) +#define PyObject_INIT_VAR(op, typeobj, size) \ + ( Py_SIZE(op) = (size), PyObject_INIT((op), (typeobj)) ) + +#define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize ) + +/* _PyObject_VAR_SIZE returns the number of bytes (as size_t) allocated for a + vrbl-size object with nitems items, exclusive of gc overhead (if any). The + value is rounded up to the closest multiple of sizeof(void *), in order to + ensure that pointer fields at the end of the object are correctly aligned + for the platform (this is of special importance for subclasses of, e.g., + str or long, so that pointers can be stored after the embedded data). + + Note that there's no memory wastage in doing this, as malloc has to + return (at worst) pointer-aligned memory anyway. +*/ +#if ((SIZEOF_VOID_P - 1) & SIZEOF_VOID_P) != 0 +# error "_PyObject_VAR_SIZE requires SIZEOF_VOID_P be a power of 2" +#endif + +#define _PyObject_VAR_SIZE(typeobj, nitems) \ + (size_t) \ + ( ( (typeobj)->tp_basicsize + \ + (nitems)*(typeobj)->tp_itemsize + \ + (SIZEOF_VOID_P - 1) \ + ) & ~(SIZEOF_VOID_P - 1) \ + ) + +#define PyObject_NEW(type, typeobj) \ +( (type *) PyObject_Init( \ + (PyObject *) PyObject_MALLOC( _PyObject_SIZE(typeobj) ), (typeobj)) ) + +#define PyObject_NEW_VAR(type, typeobj, n) \ +( (type *) PyObject_InitVar( \ + (PyVarObject *) PyObject_MALLOC(_PyObject_VAR_SIZE((typeobj),(n)) ),\ + (typeobj), (n)) ) + +/* This example code implements an object constructor with a custom + allocator, where PyObject_New is inlined, and shows the important + distinction between two steps (at least): + 1) the actual allocation of the object storage; + 2) the initialization of the Python specific fields + in this storage with PyObject_{Init, InitVar}. + + PyObject * + YourObject_New(...) + { + PyObject *op; + + op = (PyObject *) Your_Allocator(_PyObject_SIZE(YourTypeStruct)); + if (op == NULL) + return PyErr_NoMemory(); + + PyObject_Init(op, &YourTypeStruct); + + op->ob_field = value; + ... + return op; + } + + Note that in C++, the use of the new operator usually implies that + the 1st step is performed automatically for you, so in a C++ class + constructor you would start directly with PyObject_Init/InitVar +*/ + +/* + * Garbage Collection Support + * ========================== + */ + +/* C equivalent of gc.collect(). */ +PyAPI_FUNC(Py_ssize_t) PyGC_Collect(void); + +/* Test if a type has a GC head */ +#define PyType_IS_GC(t) PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC) + +/* Test if an object has a GC head */ +#define PyObject_IS_GC(o) (PyType_IS_GC(Py_TYPE(o)) && \ + (Py_TYPE(o)->tp_is_gc == NULL || Py_TYPE(o)->tp_is_gc(o))) + +PyAPI_FUNC(PyVarObject *) _PyObject_GC_Resize(PyVarObject *, Py_ssize_t); +#define PyObject_GC_Resize(type, op, n) \ + ( (type *) _PyObject_GC_Resize((PyVarObject *)(op), (n)) ) + +/* for source compatibility with 2.2 */ +#define _PyObject_GC_Del PyObject_GC_Del + +/* GC information is stored BEFORE the object structure. */ +typedef union _gc_head { + struct { + union _gc_head *gc_next; + union _gc_head *gc_prev; + Py_ssize_t gc_refs; + } gc; + long double dummy; /* force worst-case alignment */ +} PyGC_Head; + +extern PyGC_Head *_PyGC_generation0; + +#define _Py_AS_GC(o) ((PyGC_Head *)(o)-1) + +#define _PyGC_REFS_UNTRACKED (-2) +#define _PyGC_REFS_REACHABLE (-3) +#define _PyGC_REFS_TENTATIVELY_UNREACHABLE (-4) + +/* Tell the GC to track this object. NB: While the object is tracked the + * collector it must be safe to call the ob_traverse method. */ +#define _PyObject_GC_TRACK(o) do { \ + PyGC_Head *g = _Py_AS_GC(o); \ + if (g->gc.gc_refs != _PyGC_REFS_UNTRACKED) \ + Py_FatalError("GC object already tracked"); \ + g->gc.gc_refs = _PyGC_REFS_REACHABLE; \ + g->gc.gc_next = _PyGC_generation0; \ + g->gc.gc_prev = _PyGC_generation0->gc.gc_prev; \ + g->gc.gc_prev->gc.gc_next = g; \ + _PyGC_generation0->gc.gc_prev = g; \ + } while (0); + +/* Tell the GC to stop tracking this object. + * gc_next doesn't need to be set to NULL, but doing so is a good + * way to provoke memory errors if calling code is confused. + */ +#define _PyObject_GC_UNTRACK(o) do { \ + PyGC_Head *g = _Py_AS_GC(o); \ + assert(g->gc.gc_refs != _PyGC_REFS_UNTRACKED); \ + g->gc.gc_refs = _PyGC_REFS_UNTRACKED; \ + g->gc.gc_prev->gc.gc_next = g->gc.gc_next; \ + g->gc.gc_next->gc.gc_prev = g->gc.gc_prev; \ + g->gc.gc_next = NULL; \ + } while (0); + +/* True if the object is currently tracked by the GC. */ +#define _PyObject_GC_IS_TRACKED(o) \ + ((_Py_AS_GC(o))->gc.gc_refs != _PyGC_REFS_UNTRACKED) + +/* True if the object may be tracked by the GC in the future, or already is. + This can be useful to implement some optimizations. */ +#define _PyObject_GC_MAY_BE_TRACKED(obj) \ + (PyObject_IS_GC(obj) && \ + (!PyTuple_CheckExact(obj) || _PyObject_GC_IS_TRACKED(obj))) + + +PyAPI_FUNC(PyObject *) _PyObject_GC_Malloc(size_t); +PyAPI_FUNC(PyObject *) _PyObject_GC_New(PyTypeObject *); +PyAPI_FUNC(PyVarObject *) _PyObject_GC_NewVar(PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(void) PyObject_GC_Track(void *); +PyAPI_FUNC(void) PyObject_GC_UnTrack(void *); +PyAPI_FUNC(void) PyObject_GC_Del(void *); + +#define PyObject_GC_New(type, typeobj) \ + ( (type *) _PyObject_GC_New(typeobj) ) +#define PyObject_GC_NewVar(type, typeobj, n) \ + ( (type *) _PyObject_GC_NewVar((typeobj), (n)) ) + + +/* Utility macro to help write tp_traverse functions. + * To use this macro, the tp_traverse function must name its arguments + * "visit" and "arg". This is intended to keep tp_traverse functions + * looking as much alike as possible. + */ +#define Py_VISIT(op) \ + do { \ + if (op) { \ + int vret = visit((PyObject *)(op), arg); \ + if (vret) \ + return vret; \ + } \ + } while (0) + +/* This is here for the sake of backwards compatibility. Extensions that + * use the old GC API will still compile but the objects will not be + * tracked by the GC. */ +#define PyGC_HEAD_SIZE 0 +#define PyObject_GC_Init(op) +#define PyObject_GC_Fini(op) +#define PyObject_AS_GC(op) (op) +#define PyObject_FROM_GC(op) (op) + + +/* Test if a type supports weak references */ +#define PyType_SUPPORTS_WEAKREFS(t) \ + (PyType_HasFeature((t), Py_TPFLAGS_HAVE_WEAKREFS) \ + && ((t)->tp_weaklistoffset > 0)) + +#define PyObject_GET_WEAKREFS_LISTPTR(o) \ + ((PyObject **) (((char *) (o)) + Py_TYPE(o)->tp_weaklistoffset)) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OBJIMPL_H */ diff --git a/PythonEnv/2.7/Include/opcode.h b/PythonEnv/2.7/Include/opcode.h new file mode 100644 index 0000000000..9764109adb --- /dev/null +++ b/PythonEnv/2.7/Include/opcode.h @@ -0,0 +1,162 @@ +#ifndef Py_OPCODE_H +#define Py_OPCODE_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Instruction opcodes for compiled code */ + +#define STOP_CODE 0 +#define POP_TOP 1 +#define ROT_TWO 2 +#define ROT_THREE 3 +#define DUP_TOP 4 +#define ROT_FOUR 5 +#define NOP 9 + +#define UNARY_POSITIVE 10 +#define UNARY_NEGATIVE 11 +#define UNARY_NOT 12 +#define UNARY_CONVERT 13 + +#define UNARY_INVERT 15 + +#define BINARY_POWER 19 + +#define BINARY_MULTIPLY 20 +#define BINARY_DIVIDE 21 +#define BINARY_MODULO 22 +#define BINARY_ADD 23 +#define BINARY_SUBTRACT 24 +#define BINARY_SUBSCR 25 +#define BINARY_FLOOR_DIVIDE 26 +#define BINARY_TRUE_DIVIDE 27 +#define INPLACE_FLOOR_DIVIDE 28 +#define INPLACE_TRUE_DIVIDE 29 + +#define SLICE 30 +/* Also uses 31-33 */ + +#define STORE_SLICE 40 +/* Also uses 41-43 */ + +#define DELETE_SLICE 50 +/* Also uses 51-53 */ + +#define STORE_MAP 54 +#define INPLACE_ADD 55 +#define INPLACE_SUBTRACT 56 +#define INPLACE_MULTIPLY 57 +#define INPLACE_DIVIDE 58 +#define INPLACE_MODULO 59 +#define STORE_SUBSCR 60 +#define DELETE_SUBSCR 61 + +#define BINARY_LSHIFT 62 +#define BINARY_RSHIFT 63 +#define BINARY_AND 64 +#define BINARY_XOR 65 +#define BINARY_OR 66 +#define INPLACE_POWER 67 +#define GET_ITER 68 + +#define PRINT_EXPR 70 +#define PRINT_ITEM 71 +#define PRINT_NEWLINE 72 +#define PRINT_ITEM_TO 73 +#define PRINT_NEWLINE_TO 74 +#define INPLACE_LSHIFT 75 +#define INPLACE_RSHIFT 76 +#define INPLACE_AND 77 +#define INPLACE_XOR 78 +#define INPLACE_OR 79 +#define BREAK_LOOP 80 +#define WITH_CLEANUP 81 +#define LOAD_LOCALS 82 +#define RETURN_VALUE 83 +#define IMPORT_STAR 84 +#define EXEC_STMT 85 +#define YIELD_VALUE 86 +#define POP_BLOCK 87 +#define END_FINALLY 88 +#define BUILD_CLASS 89 + +#define HAVE_ARGUMENT 90 /* Opcodes from here have an argument: */ + +#define STORE_NAME 90 /* Index in name list */ +#define DELETE_NAME 91 /* "" */ +#define UNPACK_SEQUENCE 92 /* Number of sequence items */ +#define FOR_ITER 93 +#define LIST_APPEND 94 + +#define STORE_ATTR 95 /* Index in name list */ +#define DELETE_ATTR 96 /* "" */ +#define STORE_GLOBAL 97 /* "" */ +#define DELETE_GLOBAL 98 /* "" */ +#define DUP_TOPX 99 /* number of items to duplicate */ +#define LOAD_CONST 100 /* Index in const list */ +#define LOAD_NAME 101 /* Index in name list */ +#define BUILD_TUPLE 102 /* Number of tuple items */ +#define BUILD_LIST 103 /* Number of list items */ +#define BUILD_SET 104 /* Number of set items */ +#define BUILD_MAP 105 /* Always zero for now */ +#define LOAD_ATTR 106 /* Index in name list */ +#define COMPARE_OP 107 /* Comparison operator */ +#define IMPORT_NAME 108 /* Index in name list */ +#define IMPORT_FROM 109 /* Index in name list */ +#define JUMP_FORWARD 110 /* Number of bytes to skip */ + +#define JUMP_IF_FALSE_OR_POP 111 /* Target byte offset from beginning + of code */ +#define JUMP_IF_TRUE_OR_POP 112 /* "" */ +#define JUMP_ABSOLUTE 113 /* "" */ +#define POP_JUMP_IF_FALSE 114 /* "" */ +#define POP_JUMP_IF_TRUE 115 /* "" */ + +#define LOAD_GLOBAL 116 /* Index in name list */ + +#define CONTINUE_LOOP 119 /* Start of loop (absolute) */ +#define SETUP_LOOP 120 /* Target address (relative) */ +#define SETUP_EXCEPT 121 /* "" */ +#define SETUP_FINALLY 122 /* "" */ + +#define LOAD_FAST 124 /* Local variable number */ +#define STORE_FAST 125 /* Local variable number */ +#define DELETE_FAST 126 /* Local variable number */ + +#define RAISE_VARARGS 130 /* Number of raise arguments (1, 2 or 3) */ +/* CALL_FUNCTION_XXX opcodes defined below depend on this definition */ +#define CALL_FUNCTION 131 /* #args + (#kwargs<<8) */ +#define MAKE_FUNCTION 132 /* #defaults */ +#define BUILD_SLICE 133 /* Number of items */ + +#define MAKE_CLOSURE 134 /* #free vars */ +#define LOAD_CLOSURE 135 /* Load free variable from closure */ +#define LOAD_DEREF 136 /* Load and dereference from closure cell */ +#define STORE_DEREF 137 /* Store into cell */ + +/* The next 3 opcodes must be contiguous and satisfy + (CALL_FUNCTION_VAR - CALL_FUNCTION) & 3 == 1 */ +#define CALL_FUNCTION_VAR 140 /* #args + (#kwargs<<8) */ +#define CALL_FUNCTION_KW 141 /* #args + (#kwargs<<8) */ +#define CALL_FUNCTION_VAR_KW 142 /* #args + (#kwargs<<8) */ + +#define SETUP_WITH 143 + +/* Support for opargs more than 16 bits long */ +#define EXTENDED_ARG 145 + +#define SET_ADD 146 +#define MAP_ADD 147 + + +enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE, PyCmp_GT=Py_GT, PyCmp_GE=Py_GE, + PyCmp_IN, PyCmp_NOT_IN, PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD}; + +#define HAS_ARG(op) ((op) >= HAVE_ARGUMENT) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OPCODE_H */ diff --git a/PythonEnv/2.7/Include/osdefs.h b/PythonEnv/2.7/Include/osdefs.h new file mode 100644 index 0000000000..77af923754 --- /dev/null +++ b/PythonEnv/2.7/Include/osdefs.h @@ -0,0 +1,63 @@ +#ifndef Py_OSDEFS_H +#define Py_OSDEFS_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Operating system dependencies */ + +/* Mod by chrish: QNX has WATCOM, but isn't DOS */ +#if !defined(__QNX__) +#if defined(MS_WINDOWS) || defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__DJGPP__) || defined(PYOS_OS2) +#if defined(PYOS_OS2) && defined(PYCC_GCC) +#define MAXPATHLEN 260 +#define SEP '/' +#define ALTSEP '\\' +#else +#define SEP '\\' +#define ALTSEP '/' +#define MAXPATHLEN 256 +#endif +#define DELIM ';' +#endif +#endif + +#ifdef RISCOS +#define SEP '.' +#define MAXPATHLEN 256 +#define DELIM ',' +#endif + + +/* Filename separator */ +#ifndef SEP +#define SEP '/' +#endif + +/* Max pathname length */ +#ifdef __hpux +#include +#include +#ifndef PATH_MAX +#define PATH_MAX MAXPATHLEN +#endif +#endif + +#ifndef MAXPATHLEN +#if defined(PATH_MAX) && PATH_MAX > 1024 +#define MAXPATHLEN PATH_MAX +#else +#define MAXPATHLEN 1024 +#endif +#endif + +/* Search path entry delimiter */ +#ifndef DELIM +#define DELIM ':' +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OSDEFS_H */ diff --git a/PythonEnv/2.7/Include/parsetok.h b/PythonEnv/2.7/Include/parsetok.h new file mode 100644 index 0000000000..ec1eb6ff7d --- /dev/null +++ b/PythonEnv/2.7/Include/parsetok.h @@ -0,0 +1,64 @@ + +/* Parser-tokenizer link interface */ + +#ifndef Py_PARSETOK_H +#define Py_PARSETOK_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int error; + const char *filename; + int lineno; + int offset; + char *text; + int token; + int expected; +} perrdetail; + +#if 0 +#define PyPARSE_YIELD_IS_KEYWORD 0x0001 +#endif + +#define PyPARSE_DONT_IMPLY_DEDENT 0x0002 + +#if 0 +#define PyPARSE_WITH_IS_KEYWORD 0x0003 +#endif + +#define PyPARSE_PRINT_IS_FUNCTION 0x0004 +#define PyPARSE_UNICODE_LITERALS 0x0008 + + + +PyAPI_FUNC(node *) PyParser_ParseString(const char *, grammar *, int, + perrdetail *); +PyAPI_FUNC(node *) PyParser_ParseFile (FILE *, const char *, grammar *, int, + char *, char *, perrdetail *); + +PyAPI_FUNC(node *) PyParser_ParseStringFlags(const char *, grammar *, int, + perrdetail *, int); +PyAPI_FUNC(node *) PyParser_ParseFileFlags(FILE *, const char *, grammar *, + int, char *, char *, + perrdetail *, int); +PyAPI_FUNC(node *) PyParser_ParseFileFlagsEx(FILE *, const char *, grammar *, + int, char *, char *, + perrdetail *, int *); + +PyAPI_FUNC(node *) PyParser_ParseStringFlagsFilename(const char *, + const char *, + grammar *, int, + perrdetail *, int); +PyAPI_FUNC(node *) PyParser_ParseStringFlagsFilenameEx(const char *, + const char *, + grammar *, int, + perrdetail *, int *); + +/* Note that he following function is defined in pythonrun.c not parsetok.c. */ +PyAPI_FUNC(void) PyParser_SetError(perrdetail *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PARSETOK_H */ diff --git a/PythonEnv/2.7/Include/patchlevel.h b/PythonEnv/2.7/Include/patchlevel.h new file mode 100644 index 0000000000..bdf179e624 --- /dev/null +++ b/PythonEnv/2.7/Include/patchlevel.h @@ -0,0 +1,43 @@ + +/* Newfangled version identification scheme. + + This scheme was added in Python 1.5.2b2; before that time, only PATCHLEVEL + was available. To test for presence of the scheme, test for + defined(PY_MAJOR_VERSION). + + When the major or minor version changes, the VERSION variable in + configure.ac must also be changed. + + There is also (independent) API version information in modsupport.h. +*/ + +/* Values for PY_RELEASE_LEVEL */ +#define PY_RELEASE_LEVEL_ALPHA 0xA +#define PY_RELEASE_LEVEL_BETA 0xB +#define PY_RELEASE_LEVEL_GAMMA 0xC /* For release candidates */ +#define PY_RELEASE_LEVEL_FINAL 0xF /* Serial should be 0 here */ + /* Higher for patch releases */ + +/* Version parsed out into numeric values */ +/*--start constants--*/ +#define PY_MAJOR_VERSION 2 +#define PY_MINOR_VERSION 7 +#define PY_MICRO_VERSION 5 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL +#define PY_RELEASE_SERIAL 0 + +/* Version as a string */ +#define PY_VERSION "2.7.5" +/*--end constants--*/ + +/* Subversion Revision number of this file (not of the repository). Empty + since Mercurial migration. */ +#define PY_PATCHLEVEL_REVISION "" + +/* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. + Use this for numeric comparisons, e.g. #if PY_VERSION_HEX >= ... */ +#define PY_VERSION_HEX ((PY_MAJOR_VERSION << 24) | \ + (PY_MINOR_VERSION << 16) | \ + (PY_MICRO_VERSION << 8) | \ + (PY_RELEASE_LEVEL << 4) | \ + (PY_RELEASE_SERIAL << 0)) diff --git a/PythonEnv/2.7/Include/pgen.h b/PythonEnv/2.7/Include/pgen.h new file mode 100644 index 0000000000..8a325ed074 --- /dev/null +++ b/PythonEnv/2.7/Include/pgen.h @@ -0,0 +1,18 @@ +#ifndef Py_PGEN_H +#define Py_PGEN_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Parser generator interface */ + +extern grammar *meta_grammar(void); + +struct _node; +extern grammar *pgen(struct _node *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PGEN_H */ diff --git a/PythonEnv/2.7/Include/pgenheaders.h b/PythonEnv/2.7/Include/pgenheaders.h new file mode 100644 index 0000000000..2049ae32bb --- /dev/null +++ b/PythonEnv/2.7/Include/pgenheaders.h @@ -0,0 +1,42 @@ +#ifndef Py_PGENHEADERS_H +#define Py_PGENHEADERS_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Include files and extern declarations used by most of the parser. */ + +#include "Python.h" + +PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(void) PySys_WriteStderr(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); + +#define addarc _Py_addarc +#define addbit _Py_addbit +#define adddfa _Py_adddfa +#define addfirstsets _Py_addfirstsets +#define addlabel _Py_addlabel +#define addstate _Py_addstate +#define delbitset _Py_delbitset +#define dumptree _Py_dumptree +#define findlabel _Py_findlabel +#define mergebitset _Py_mergebitset +#define meta_grammar _Py_meta_grammar +#define newbitset _Py_newbitset +#define newgrammar _Py_newgrammar +#define pgen _Py_pgen +#define printgrammar _Py_printgrammar +#define printnonterminals _Py_printnonterminals +#define printtree _Py_printtree +#define samebitset _Py_samebitset +#define showtree _Py_showtree +#define tok_dump _Py_tok_dump +#define translatelabels _Py_translatelabels + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PGENHEADERS_H */ diff --git a/PythonEnv/2.7/Include/py_curses.h b/PythonEnv/2.7/Include/py_curses.h new file mode 100644 index 0000000000..657816cbd3 --- /dev/null +++ b/PythonEnv/2.7/Include/py_curses.h @@ -0,0 +1,176 @@ + +#ifndef Py_CURSES_H +#define Py_CURSES_H + +#ifdef __APPLE__ +/* +** On Mac OS X 10.2 [n]curses.h and stdlib.h use different guards +** against multiple definition of wchar_t. +*/ +#ifdef _BSD_WCHAR_T_DEFINED_ +#define _WCHAR_T +#endif + +/* the following define is necessary for OS X 10.6; without it, the + Apple-supplied ncurses.h sets NCURSES_OPAQUE to 1, and then Python + can't get at the WINDOW flags field. */ +#define NCURSES_OPAQUE 0 +#endif /* __APPLE__ */ + +#ifdef __FreeBSD__ +/* +** On FreeBSD, [n]curses.h and stdlib.h/wchar.h use different guards +** against multiple definition of wchar_t and wint_t. +*/ +#ifdef _XOPEN_SOURCE_EXTENDED +#ifndef __FreeBSD_version +#include +#endif +#if __FreeBSD_version >= 500000 +#ifndef __wchar_t +#define __wchar_t +#endif +#ifndef __wint_t +#define __wint_t +#endif +#else +#ifndef _WCHAR_T +#define _WCHAR_T +#endif +#ifndef _WINT_T +#define _WINT_T +#endif +#endif +#endif +#endif + +#ifdef HAVE_NCURSES_H +#include +#else +#include +#ifdef HAVE_TERM_H +/* for tigetstr, which is not declared in SysV curses */ +#include +#endif +#endif + +#ifdef HAVE_NCURSES_H +/* configure was checking , but we will + use , which has all these features. */ +#ifndef WINDOW_HAS_FLAGS +#define WINDOW_HAS_FLAGS 1 +#endif +#ifndef MVWDELCH_IS_EXPRESSION +#define MVWDELCH_IS_EXPRESSION 1 +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define PyCurses_API_pointers 4 + +/* Type declarations */ + +typedef struct { + PyObject_HEAD + WINDOW *win; +} PyCursesWindowObject; + +#define PyCursesWindow_Check(v) (Py_TYPE(v) == &PyCursesWindow_Type) + +#define PyCurses_CAPSULE_NAME "_curses._C_API" + + +#ifdef CURSES_MODULE +/* This section is used when compiling _cursesmodule.c */ + +#else +/* This section is used in modules that use the _cursesmodule API */ + +static void **PyCurses_API; + +#define PyCursesWindow_Type (*(PyTypeObject *) PyCurses_API[0]) +#define PyCursesSetupTermCalled {if (! ((int (*)(void))PyCurses_API[1]) () ) return NULL;} +#define PyCursesInitialised {if (! ((int (*)(void))PyCurses_API[2]) () ) return NULL;} +#define PyCursesInitialisedColor {if (! ((int (*)(void))PyCurses_API[3]) () ) return NULL;} + +#define import_curses() \ + PyCurses_API = (void **)PyCapsule_Import(PyCurses_CAPSULE_NAME, 1); + +#endif + +/* general error messages */ +static char *catchall_ERR = "curses function returned ERR"; +static char *catchall_NULL = "curses function returned NULL"; + +/* Function Prototype Macros - They are ugly but very, very useful. ;-) + + X - function name + TYPE - parameter Type + ERGSTR - format string for construction of the return value + PARSESTR - format string for argument parsing + */ + +#define NoArgNoReturnFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + return PyCursesCheckERR(X(), # X); } + +#define NoArgOrFlagNoReturnFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \ +{ \ + int flag = 0; \ + PyCursesInitialised \ + switch(PyTuple_Size(args)) { \ + case 0: \ + return PyCursesCheckERR(X(), # X); \ + case 1: \ + if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL; \ + if (flag) return PyCursesCheckERR(X(), # X); \ + else return PyCursesCheckERR(no ## X (), # X); \ + default: \ + PyErr_SetString(PyExc_TypeError, # X " requires 0 or 1 arguments"); \ + return NULL; } } + +#define NoArgReturnIntFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + return PyInt_FromLong((long) X()); } + + +#define NoArgReturnStringFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + return PyString_FromString(X()); } + +#define NoArgTrueFalseFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + if (X () == FALSE) { \ + Py_INCREF(Py_False); \ + return Py_False; \ + } \ + Py_INCREF(Py_True); \ + return Py_True; } + +#define NoArgNoReturnVoidFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + X(); \ + Py_INCREF(Py_None); \ + return Py_None; } + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(Py_CURSES_H) */ + + diff --git a/PythonEnv/2.7/Include/pyarena.h b/PythonEnv/2.7/Include/pyarena.h new file mode 100644 index 0000000000..5f193fecee --- /dev/null +++ b/PythonEnv/2.7/Include/pyarena.h @@ -0,0 +1,62 @@ +/* An arena-like memory interface for the compiler. + */ + +#ifndef Py_PYARENA_H +#define Py_PYARENA_H + +#ifdef __cplusplus +extern "C" { +#endif + + typedef struct _arena PyArena; + + /* PyArena_New() and PyArena_Free() create a new arena and free it, + respectively. Once an arena has been created, it can be used + to allocate memory via PyArena_Malloc(). Pointers to PyObject can + also be registered with the arena via PyArena_AddPyObject(), and the + arena will ensure that the PyObjects stay alive at least until + PyArena_Free() is called. When an arena is freed, all the memory it + allocated is freed, the arena releases internal references to registered + PyObject*, and none of its pointers are valid. + XXX (tim) What does "none of its pointers are valid" mean? Does it + XXX mean that pointers previously obtained via PyArena_Malloc() are + XXX no longer valid? (That's clearly true, but not sure that's what + XXX the text is trying to say.) + + PyArena_New() returns an arena pointer. On error, it + returns a negative number and sets an exception. + XXX (tim): Not true. On error, PyArena_New() actually returns NULL, + XXX and looks like it may or may not set an exception (e.g., if the + XXX internal PyList_New(0) returns NULL, PyArena_New() passes that on + XXX and an exception is set; OTOH, if the internal + XXX block_new(DEFAULT_BLOCK_SIZE) returns NULL, that's passed on but + XXX an exception is not set in that case). + */ + PyAPI_FUNC(PyArena *) PyArena_New(void); + PyAPI_FUNC(void) PyArena_Free(PyArena *); + + /* Mostly like malloc(), return the address of a block of memory spanning + * `size` bytes, or return NULL (without setting an exception) if enough + * new memory can't be obtained. Unlike malloc(0), PyArena_Malloc() with + * size=0 does not guarantee to return a unique pointer (the pointer + * returned may equal one or more other pointers obtained from + * PyArena_Malloc()). + * Note that pointers obtained via PyArena_Malloc() must never be passed to + * the system free() or realloc(), or to any of Python's similar memory- + * management functions. PyArena_Malloc()-obtained pointers remain valid + * until PyArena_Free(ar) is called, at which point all pointers obtained + * from the arena `ar` become invalid simultaneously. + */ + PyAPI_FUNC(void *) PyArena_Malloc(PyArena *, size_t size); + + /* This routine isn't a proper arena allocation routine. It takes + * a PyObject* and records it so that it can be DECREFed when the + * arena is freed. + */ + PyAPI_FUNC(int) PyArena_AddPyObject(PyArena *, PyObject *); + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYARENA_H */ diff --git a/PythonEnv/2.7/Include/pycapsule.h b/PythonEnv/2.7/Include/pycapsule.h new file mode 100644 index 0000000000..cd682fc7de --- /dev/null +++ b/PythonEnv/2.7/Include/pycapsule.h @@ -0,0 +1,56 @@ + +/* Capsule objects let you wrap a C "void *" pointer in a Python + object. They're a way of passing data through the Python interpreter + without creating your own custom type. + + Capsules are used for communication between extension modules. + They provide a way for an extension module to export a C interface + to other extension modules, so that extension modules can use the + Python import mechanism to link to one another. + + For more information, please see "c-api/capsule.html" in the + documentation. +*/ + +#ifndef Py_CAPSULE_H +#define Py_CAPSULE_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyCapsule_Type; + +typedef void (*PyCapsule_Destructor)(PyObject *); + +#define PyCapsule_CheckExact(op) (Py_TYPE(op) == &PyCapsule_Type) + + +PyAPI_FUNC(PyObject *) PyCapsule_New( + void *pointer, + const char *name, + PyCapsule_Destructor destructor); + +PyAPI_FUNC(void *) PyCapsule_GetPointer(PyObject *capsule, const char *name); + +PyAPI_FUNC(PyCapsule_Destructor) PyCapsule_GetDestructor(PyObject *capsule); + +PyAPI_FUNC(const char *) PyCapsule_GetName(PyObject *capsule); + +PyAPI_FUNC(void *) PyCapsule_GetContext(PyObject *capsule); + +PyAPI_FUNC(int) PyCapsule_IsValid(PyObject *capsule, const char *name); + +PyAPI_FUNC(int) PyCapsule_SetPointer(PyObject *capsule, void *pointer); + +PyAPI_FUNC(int) PyCapsule_SetDestructor(PyObject *capsule, PyCapsule_Destructor destructor); + +PyAPI_FUNC(int) PyCapsule_SetName(PyObject *capsule, const char *name); + +PyAPI_FUNC(int) PyCapsule_SetContext(PyObject *capsule, void *context); + +PyAPI_FUNC(void *) PyCapsule_Import(const char *name, int no_block); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CAPSULE_H */ diff --git a/PythonEnv/2.7/Include/pyconfig.h b/PythonEnv/2.7/Include/pyconfig.h new file mode 100644 index 0000000000..2b1666568b --- /dev/null +++ b/PythonEnv/2.7/Include/pyconfig.h @@ -0,0 +1,759 @@ +#ifndef Py_CONFIG_H +#define Py_CONFIG_H + +/* pyconfig.h. NOT Generated automatically by configure. + +This is a manually maintained version used for the Watcom, +Borland and Microsoft Visual C++ compilers. It is a +standard part of the Python distribution. + +WINDOWS DEFINES: +The code specific to Windows should be wrapped around one of +the following #defines + +MS_WIN64 - Code specific to the MS Win64 API +MS_WIN32 - Code specific to the MS Win32 (and Win64) API (obsolete, this covers all supported APIs) +MS_WINDOWS - Code specific to Windows, but all versions. +MS_WINCE - Code specific to Windows CE +Py_ENABLE_SHARED - Code if the Python core is built as a DLL. + +Also note that neither "_M_IX86" or "_MSC_VER" should be used for +any purpose other than "Windows Intel x86 specific" and "Microsoft +compiler specific". Therefore, these should be very rare. + + +NOTE: The following symbols are deprecated: +NT, USE_DL_EXPORT, USE_DL_IMPORT, DL_EXPORT, DL_IMPORT +MS_CORE_DLL. + +WIN32 is still required for the locale module. + +*/ + +#ifdef _WIN32_WCE +#define MS_WINCE +#endif + +/* Deprecated USE_DL_EXPORT macro - please use Py_BUILD_CORE */ +#ifdef USE_DL_EXPORT +# define Py_BUILD_CORE +#endif /* USE_DL_EXPORT */ + +/* Visual Studio 2005 introduces deprecation warnings for + "insecure" and POSIX functions. The insecure functions should + be replaced by *_s versions (according to Microsoft); the + POSIX functions by _* versions (which, according to Microsoft, + would be ISO C conforming). Neither renaming is feasible, so + we just silence the warnings. */ + +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE 1 +#endif +#ifndef _CRT_NONSTDC_NO_DEPRECATE +#define _CRT_NONSTDC_NO_DEPRECATE 1 +#endif + +/* Windows CE does not have these */ +#ifndef MS_WINCE +#define HAVE_IO_H +#define HAVE_SYS_UTIME_H +#define HAVE_TEMPNAM +#define HAVE_TMPFILE +#define HAVE_TMPNAM +#define HAVE_CLOCK +#define HAVE_STRERROR +#endif + +#ifdef HAVE_IO_H +#include +#endif + +#define HAVE_HYPOT +#define HAVE_STRFTIME +#define DONT_HAVE_SIG_ALARM +#define DONT_HAVE_SIG_PAUSE +#define LONG_BIT 32 +#define WORD_BIT 32 +#define PREFIX "" +#define EXEC_PREFIX "" + +#define MS_WIN32 /* only support win32 and greater. */ +#define MS_WINDOWS +#ifndef PYTHONPATH +# define PYTHONPATH ".\\DLLs;.\\lib;.\\lib\\plat-win;.\\lib\\lib-tk" +#endif +#define NT_THREADS +#define WITH_THREAD +#ifndef NETSCAPE_PI +#define USE_SOCKET +#endif + +/* CE6 doesn't have strdup() but _strdup(). Assume the same for earlier versions. */ +#if defined(MS_WINCE) +# include +# define strdup _strdup +#endif + +#ifdef MS_WINCE +/* Windows CE does not support environment variables */ +#define getenv(v) (NULL) +#define environ (NULL) +#endif + +/* Compiler specific defines */ + +/* ------------------------------------------------------------------------*/ +/* Microsoft C defines _MSC_VER */ +#ifdef _MSC_VER + +/* We want COMPILER to expand to a string containing _MSC_VER's *value*. + * This is horridly tricky, because the stringization operator only works + * on macro arguments, and doesn't evaluate macros passed *as* arguments. + * Attempts simpler than the following appear doomed to produce "_MSC_VER" + * literally in the string. + */ +#define _Py_PASTE_VERSION(SUFFIX) \ + ("[MSC v." _Py_STRINGIZE(_MSC_VER) " " SUFFIX "]") +/* e.g., this produces, after compile-time string catenation, + * ("[MSC v.1200 32 bit (Intel)]") + * + * _Py_STRINGIZE(_MSC_VER) expands to + * _Py_STRINGIZE1((_MSC_VER)) expands to + * _Py_STRINGIZE2(_MSC_VER) but as this call is the result of token-pasting + * it's scanned again for macros and so further expands to (under MSVC 6) + * _Py_STRINGIZE2(1200) which then expands to + * "1200" + */ +#define _Py_STRINGIZE(X) _Py_STRINGIZE1((X)) +#define _Py_STRINGIZE1(X) _Py_STRINGIZE2 ## X +#define _Py_STRINGIZE2(X) #X + +/* MSVC defines _WINxx to differentiate the windows platform types + + Note that for compatibility reasons _WIN32 is defined on Win32 + *and* on Win64. For the same reasons, in Python, MS_WIN32 is + defined on Win32 *and* Win64. Win32 only code must therefore be + guarded as follows: + #if defined(MS_WIN32) && !defined(MS_WIN64) + Some modules are disabled on Itanium processors, therefore we + have MS_WINI64 set for those targets, otherwise MS_WINX64 +*/ +#ifdef _WIN64 +#define MS_WIN64 +#endif + +/* set the COMPILER */ +#ifdef MS_WIN64 +#if defined(_M_IA64) +#define COMPILER _Py_PASTE_VERSION("64 bit (Itanium)") +#define MS_WINI64 +#elif defined(_M_X64) || defined(_M_AMD64) +#define COMPILER _Py_PASTE_VERSION("64 bit (AMD64)") +#define MS_WINX64 +#else +#define COMPILER _Py_PASTE_VERSION("64 bit (Unknown)") +#endif +#endif /* MS_WIN64 */ + +/* set the version macros for the windows headers */ +#ifdef MS_WINX64 +/* 64 bit only runs on XP or greater */ +#define Py_WINVER _WIN32_WINNT_WINXP +#define Py_NTDDI NTDDI_WINXP +#else +/* Python 2.6+ requires Windows 2000 or greater */ +#ifdef _WIN32_WINNT_WIN2K +#define Py_WINVER _WIN32_WINNT_WIN2K +#else +#define Py_WINVER 0x0500 +#endif +#define Py_NTDDI NTDDI_WIN2KSP4 +#endif + +/* We only set these values when building Python - we don't want to force + these values on extensions, as that will affect the prototypes and + structures exposed in the Windows headers. Even when building Python, we + allow a single source file to override this - they may need access to + structures etc so it can optionally use new Windows features if it + determines at runtime they are available. +*/ +#if defined(Py_BUILD_CORE) || defined(Py_BUILD_CORE_MODULE) +#ifndef NTDDI_VERSION +#define NTDDI_VERSION Py_NTDDI +#endif +#ifndef WINVER +#define WINVER Py_WINVER +#endif +#ifndef _WIN32_WINNT +#define _WIN32_WINNT Py_WINVER +#endif +#endif + +/* _W64 is not defined for VC6 or eVC4 */ +#ifndef _W64 +#define _W64 +#endif + +/* Define like size_t, omitting the "unsigned" */ +#ifdef MS_WIN64 +typedef __int64 ssize_t; +#else +typedef _W64 int ssize_t; +#endif +#define HAVE_SSIZE_T 1 + +#if defined(MS_WIN32) && !defined(MS_WIN64) +#ifdef _M_IX86 +#define COMPILER _Py_PASTE_VERSION("32 bit (Intel)") +#else +#define COMPILER _Py_PASTE_VERSION("32 bit (Unknown)") +#endif +#endif /* MS_WIN32 && !MS_WIN64 */ + +typedef int pid_t; + +#include +#define Py_IS_NAN _isnan +#define Py_IS_INFINITY(X) (!_finite(X) && !_isnan(X)) +#define Py_IS_FINITE(X) _finite(X) +#define copysign _copysign +#define hypot _hypot + +#endif /* _MSC_VER */ + +/* define some ANSI types that are not defined in earlier Win headers */ +#if defined(_MSC_VER) && _MSC_VER >= 1200 +/* This file only exists in VC 6.0 or higher */ +#include +#endif + +/* ------------------------------------------------------------------------*/ +/* The Borland compiler defines __BORLANDC__ */ +/* XXX These defines are likely incomplete, but should be easy to fix. */ +#ifdef __BORLANDC__ +#define COMPILER "[Borland]" + +#ifdef _WIN32 +/* tested with BCC 5.5 (__BORLANDC__ >= 0x0550) + */ + +typedef int pid_t; +/* BCC55 seems to understand __declspec(dllimport), it is used in its + own header files (winnt.h, ...) - so we can do nothing and get the default*/ + +#undef HAVE_SYS_UTIME_H +#define HAVE_UTIME_H +#define HAVE_DIRENT_H + +/* rename a few functions for the Borland compiler */ +#include +#define _chsize chsize +#define _setmode setmode + +#else /* !_WIN32 */ +#error "Only Win32 and later are supported" +#endif /* !_WIN32 */ + +#endif /* BORLANDC */ + +/* ------------------------------------------------------------------------*/ +/* egcs/gnu-win32 defines __GNUC__ and _WIN32 */ +#if defined(__GNUC__) && defined(_WIN32) +/* XXX These defines are likely incomplete, but should be easy to fix. + They should be complete enough to build extension modules. */ +/* Suggested by Rene Liebscher to avoid a GCC 2.91.* + bug that requires structure imports. More recent versions of the + compiler don't exhibit this bug. +*/ +#if (__GNUC__==2) && (__GNUC_MINOR__<=91) +#warning "Please use an up-to-date version of gcc! (>2.91 recommended)" +#endif + +#define COMPILER "[gcc]" +#define hypot _hypot +#define PY_LONG_LONG long long +#define PY_LLONG_MIN LLONG_MIN +#define PY_LLONG_MAX LLONG_MAX +#define PY_ULLONG_MAX ULLONG_MAX +#endif /* GNUC */ + +/* ------------------------------------------------------------------------*/ +/* lcc-win32 defines __LCC__ */ +#if defined(__LCC__) +/* XXX These defines are likely incomplete, but should be easy to fix. + They should be complete enough to build extension modules. */ + +#define COMPILER "[lcc-win32]" +typedef int pid_t; +/* __declspec() is supported here too - do nothing to get the defaults */ + +#endif /* LCC */ + +/* ------------------------------------------------------------------------*/ +/* End of compilers - finish up */ + +#ifndef NO_STDIO_H +# include +#endif + +/* 64 bit ints are usually spelt __int64 unless compiler has overridden */ +#define HAVE_LONG_LONG 1 +#ifndef PY_LONG_LONG +# define PY_LONG_LONG __int64 +# define PY_LLONG_MAX _I64_MAX +# define PY_LLONG_MIN _I64_MIN +# define PY_ULLONG_MAX _UI64_MAX +#endif + +/* For Windows the Python core is in a DLL by default. Test +Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ +#if !defined(MS_NO_COREDLL) && !defined(Py_NO_ENABLE_SHARED) +# define Py_ENABLE_SHARED 1 /* standard symbol for shared library */ +# define MS_COREDLL /* deprecated old symbol */ +#endif /* !MS_NO_COREDLL && ... */ + +/* All windows compilers that use this header support __declspec */ +#define HAVE_DECLSPEC_DLL + +/* For an MSVC DLL, we can nominate the .lib files used by extensions */ +#ifdef MS_COREDLL +# ifndef Py_BUILD_CORE /* not building the core - must be an ext */ +# if defined(_MSC_VER) + /* So MSVC users need not specify the .lib file in + their Makefile (other compilers are generally + taken care of by distutils.) */ +# ifdef _DEBUG +# pragma comment(lib,"python27_d.lib") +# else +# pragma comment(lib,"python27.lib") +# endif /* _DEBUG */ +# endif /* _MSC_VER */ +# endif /* Py_BUILD_CORE */ +#endif /* MS_COREDLL */ + +#if defined(MS_WIN64) +/* maintain "win32" sys.platform for backward compatibility of Python code, + the Win64 API should be close enough to the Win32 API to make this + preferable */ +# define PLATFORM "win32" +# define SIZEOF_VOID_P 8 +# define SIZEOF_TIME_T 8 +# define SIZEOF_OFF_T 4 +# define SIZEOF_FPOS_T 8 +# define SIZEOF_HKEY 8 +# define SIZEOF_SIZE_T 8 +/* configure.ac defines HAVE_LARGEFILE_SUPPORT iff HAVE_LONG_LONG, + sizeof(off_t) > sizeof(long), and sizeof(PY_LONG_LONG) >= sizeof(off_t). + On Win64 the second condition is not true, but if fpos_t replaces off_t + then this is true. The uses of HAVE_LARGEFILE_SUPPORT imply that Win64 + should define this. */ +# define HAVE_LARGEFILE_SUPPORT +#elif defined(MS_WIN32) +# define PLATFORM "win32" +# define HAVE_LARGEFILE_SUPPORT +# define SIZEOF_VOID_P 4 +# define SIZEOF_OFF_T 4 +# define SIZEOF_FPOS_T 8 +# define SIZEOF_HKEY 4 +# define SIZEOF_SIZE_T 4 + /* MS VS2005 changes time_t to an 64-bit type on all platforms */ +# if defined(_MSC_VER) && _MSC_VER >= 1400 +# define SIZEOF_TIME_T 8 +# else +# define SIZEOF_TIME_T 4 +# endif +#endif + +#ifdef _DEBUG +# define Py_DEBUG +#endif + + +#ifdef MS_WIN32 + +#define SIZEOF_SHORT 2 +#define SIZEOF_INT 4 +#define SIZEOF_LONG 4 +#define SIZEOF_LONG_LONG 8 +#define SIZEOF_DOUBLE 8 +#define SIZEOF_FLOAT 4 + +/* VC 7.1 has them and VC 6.0 does not. VC 6.0 has a version number of 1200. + Microsoft eMbedded Visual C++ 4.0 has a version number of 1201 and doesn't + define these. + If some compiler does not provide them, modify the #if appropriately. */ +#if defined(_MSC_VER) +#if _MSC_VER > 1300 +#define HAVE_UINTPTR_T 1 +#define HAVE_INTPTR_T 1 +#else +/* VC6, VS 2002 and eVC4 don't support the C99 LL suffix for 64-bit integer literals */ +#define Py_LL(x) x##I64 +#endif /* _MSC_VER > 1200 */ +#endif /* _MSC_VER */ + +#endif + +/* define signed and unsigned exact-width 32-bit and 64-bit types, used in the + implementation of Python long integers. */ +#ifndef PY_UINT32_T +#if SIZEOF_INT == 4 +#define HAVE_UINT32_T 1 +#define PY_UINT32_T unsigned int +#elif SIZEOF_LONG == 4 +#define HAVE_UINT32_T 1 +#define PY_UINT32_T unsigned long +#endif +#endif + +#ifndef PY_UINT64_T +#if SIZEOF_LONG_LONG == 8 +#define HAVE_UINT64_T 1 +#define PY_UINT64_T unsigned PY_LONG_LONG +#endif +#endif + +#ifndef PY_INT32_T +#if SIZEOF_INT == 4 +#define HAVE_INT32_T 1 +#define PY_INT32_T int +#elif SIZEOF_LONG == 4 +#define HAVE_INT32_T 1 +#define PY_INT32_T long +#endif +#endif + +#ifndef PY_INT64_T +#if SIZEOF_LONG_LONG == 8 +#define HAVE_INT64_T 1 +#define PY_INT64_T PY_LONG_LONG +#endif +#endif + +/* Fairly standard from here! */ + +/* Define to 1 if you have the `copysign' function. */ +#define HAVE_COPYSIGN 1 + +/* Define to 1 if you have the `isinf' macro. */ +#define HAVE_DECL_ISINF 1 + +/* Define to 1 if you have the `isnan' function. */ +#define HAVE_DECL_ISNAN 1 + +/* Define if on AIX 3. + System headers sometimes define this. + We just want to avoid a redefinition error message. */ +#ifndef _ALL_SOURCE +/* #undef _ALL_SOURCE */ +#endif + +/* Define to empty if the keyword does not work. */ +/* #define const */ + +/* Define to 1 if you have the header file. */ +#ifndef MS_WINCE +#define HAVE_CONIO_H 1 +#endif + +/* Define to 1 if you have the header file. */ +#ifndef MS_WINCE +#define HAVE_DIRECT_H 1 +#endif + +/* Define if you have dirent.h. */ +/* #define DIRENT 1 */ + +/* Define to the type of elements in the array set by `getgroups'. + Usually this is either `int' or `gid_t'. */ +/* #undef GETGROUPS_T */ + +/* Define to `int' if doesn't define. */ +/* #undef gid_t */ + +/* Define if your struct tm has tm_zone. */ +/* #undef HAVE_TM_ZONE */ + +/* Define if you don't have tm_zone but do have the external array + tzname. */ +#define HAVE_TZNAME + +/* Define to `int' if doesn't define. */ +/* #undef mode_t */ + +/* Define if you don't have dirent.h, but have ndir.h. */ +/* #undef NDIR */ + +/* Define to `long' if doesn't define. */ +/* #undef off_t */ + +/* Define to `int' if doesn't define. */ +/* #undef pid_t */ + +/* Define if the system does not provide POSIX.1 features except + with this defined. */ +/* #undef _POSIX_1_SOURCE */ + +/* Define if you need to in order for stat and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Define as the return type of signal handlers (int or void). */ +#define RETSIGTYPE void + +/* Define to `unsigned' if doesn't define. */ +/* #undef size_t */ + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if you don't have dirent.h, but have sys/dir.h. */ +/* #undef SYSDIR */ + +/* Define if you don't have dirent.h, but have sys/ndir.h. */ +/* #undef SYSNDIR */ + +/* Define if you can safely include both and . */ +/* #undef TIME_WITH_SYS_TIME */ + +/* Define if your declares struct tm. */ +/* #define TM_IN_SYS_TIME 1 */ + +/* Define to `int' if doesn't define. */ +/* #undef uid_t */ + +/* Define if the closedir function returns void instead of int. */ +/* #undef VOID_CLOSEDIR */ + +/* Define if getpgrp() must be called as getpgrp(0) + and (consequently) setpgrp() as setpgrp(0, 0). */ +/* #undef GETPGRP_HAVE_ARGS */ + +/* Define this if your time.h defines altzone */ +/* #define HAVE_ALTZONE */ + +/* Define if you have the putenv function. */ +#ifndef MS_WINCE +#define HAVE_PUTENV +#endif + +/* Define if your compiler supports function prototypes */ +#define HAVE_PROTOTYPES + +/* Define if you can safely include both and + (which you can't on SCO ODT 3.0). */ +/* #undef SYS_SELECT_WITH_SYS_TIME */ + +/* Define if you want documentation strings in extension modules */ +#define WITH_DOC_STRINGS 1 + +/* Define if you want to compile in rudimentary thread support */ +/* #undef WITH_THREAD */ + +/* Define if you want to use the GNU readline library */ +/* #define WITH_READLINE 1 */ + +/* Define if you want to have a Unicode type. */ +#define Py_USING_UNICODE + +/* Define as the size of the unicode type. */ +/* This is enough for unicodeobject.h to do the "right thing" on Windows. */ +#define Py_UNICODE_SIZE 2 + +/* Use Python's own small-block memory-allocator. */ +#define WITH_PYMALLOC 1 + +/* Define if you have clock. */ +/* #define HAVE_CLOCK */ + +/* Define when any dynamic module loading is enabled */ +#define HAVE_DYNAMIC_LOADING + +/* Define if you have ftime. */ +#ifndef MS_WINCE +#define HAVE_FTIME +#endif + +/* Define if you have getpeername. */ +#define HAVE_GETPEERNAME + +/* Define if you have getpgrp. */ +/* #undef HAVE_GETPGRP */ + +/* Define if you have getpid. */ +#ifndef MS_WINCE +#define HAVE_GETPID +#endif + +/* Define if you have gettimeofday. */ +/* #undef HAVE_GETTIMEOFDAY */ + +/* Define if you have getwd. */ +/* #undef HAVE_GETWD */ + +/* Define if you have lstat. */ +/* #undef HAVE_LSTAT */ + +/* Define if you have the mktime function. */ +#define HAVE_MKTIME + +/* Define if you have nice. */ +/* #undef HAVE_NICE */ + +/* Define if you have readlink. */ +/* #undef HAVE_READLINK */ + +/* Define if you have select. */ +/* #undef HAVE_SELECT */ + +/* Define if you have setpgid. */ +/* #undef HAVE_SETPGID */ + +/* Define if you have setpgrp. */ +/* #undef HAVE_SETPGRP */ + +/* Define if you have setsid. */ +/* #undef HAVE_SETSID */ + +/* Define if you have setvbuf. */ +#define HAVE_SETVBUF + +/* Define if you have siginterrupt. */ +/* #undef HAVE_SIGINTERRUPT */ + +/* Define if you have symlink. */ +/* #undef HAVE_SYMLINK */ + +/* Define if you have tcgetpgrp. */ +/* #undef HAVE_TCGETPGRP */ + +/* Define if you have tcsetpgrp. */ +/* #undef HAVE_TCSETPGRP */ + +/* Define if you have times. */ +/* #undef HAVE_TIMES */ + +/* Define if you have uname. */ +/* #undef HAVE_UNAME */ + +/* Define if you have waitpid. */ +/* #undef HAVE_WAITPID */ + +/* Define to 1 if you have the `wcscoll' function. */ +#ifndef MS_WINCE +#define HAVE_WCSCOLL 1 +#endif + +/* Define if the zlib library has inflateCopy */ +#define HAVE_ZLIB_COPY 1 + +/* Define if you have the header file. */ +/* #undef HAVE_DLFCN_H */ + +/* Define to 1 if you have the header file. */ +#ifndef MS_WINCE +#define HAVE_ERRNO_H 1 +#endif + +/* Define if you have the header file. */ +#ifndef MS_WINCE +#define HAVE_FCNTL_H 1 +#endif + +/* Define to 1 if you have the header file. */ +#ifndef MS_WINCE +#define HAVE_PROCESS_H 1 +#endif + +/* Define to 1 if you have the header file. */ +#ifndef MS_WINCE +#define HAVE_SIGNAL_H 1 +#endif + +/* Define if you have the prototypes. */ +#define HAVE_STDARG_PROTOTYPES + +/* Define if you have the header file. */ +#define HAVE_STDDEF_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_AUDIOIO_H */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_PARAM_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_SELECT_H 1 */ + +/* Define to 1 if you have the header file. */ +#ifndef MS_WINCE +#define HAVE_SYS_STAT_H 1 +#endif + +/* Define if you have the header file. */ +/* #define HAVE_SYS_TIME_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_TIMES_H 1 */ + +/* Define to 1 if you have the header file. */ +#ifndef MS_WINCE +#define HAVE_SYS_TYPES_H 1 +#endif + +/* Define if you have the header file. */ +/* #define HAVE_SYS_UN_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_UTIME_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_UTSNAME_H 1 */ + +/* Define if you have the header file. */ +/* #undef HAVE_THREAD_H */ + +/* Define if you have the header file. */ +/* #define HAVE_UNISTD_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_UTIME_H 1 */ + +/* Define if the compiler provides a wchar.h header file. */ +#define HAVE_WCHAR_H 1 + +/* Define if you have the dl library (-ldl). */ +/* #undef HAVE_LIBDL */ + +/* Define if you have the mpc library (-lmpc). */ +/* #undef HAVE_LIBMPC */ + +/* Define if you have the nsl library (-lnsl). */ +#define HAVE_LIBNSL 1 + +/* Define if you have the seq library (-lseq). */ +/* #undef HAVE_LIBSEQ */ + +/* Define if you have the socket library (-lsocket). */ +#define HAVE_LIBSOCKET 1 + +/* Define if you have the sun library (-lsun). */ +/* #undef HAVE_LIBSUN */ + +/* Define if you have the termcap library (-ltermcap). */ +/* #undef HAVE_LIBTERMCAP */ + +/* Define if you have the termlib library (-ltermlib). */ +/* #undef HAVE_LIBTERMLIB */ + +/* Define if you have the thread library (-lthread). */ +/* #undef HAVE_LIBTHREAD */ + +/* WinSock does not use a bitmask in select, and uses + socket handles greater than FD_SETSIZE */ +#define Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE + +/* Define if C doubles are 64-bit IEEE 754 binary format, stored with the + least significant byte first */ +#define DOUBLE_IS_LITTLE_ENDIAN_IEEE754 1 + +#endif /* !Py_CONFIG_H */ diff --git a/PythonEnv/2.7/Include/pyctype.h b/PythonEnv/2.7/Include/pyctype.h new file mode 100644 index 0000000000..673cf2eb00 --- /dev/null +++ b/PythonEnv/2.7/Include/pyctype.h @@ -0,0 +1,31 @@ +#ifndef PYCTYPE_H +#define PYCTYPE_H + +#define PY_CTF_LOWER 0x01 +#define PY_CTF_UPPER 0x02 +#define PY_CTF_ALPHA (PY_CTF_LOWER|PY_CTF_UPPER) +#define PY_CTF_DIGIT 0x04 +#define PY_CTF_ALNUM (PY_CTF_ALPHA|PY_CTF_DIGIT) +#define PY_CTF_SPACE 0x08 +#define PY_CTF_XDIGIT 0x10 + +PyAPI_DATA(const unsigned int) _Py_ctype_table[256]; + +/* Unlike their C counterparts, the following macros are not meant to + * handle an int with any of the values [EOF, 0-UCHAR_MAX]. The argument + * must be a signed/unsigned char. */ +#define Py_ISLOWER(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_LOWER) +#define Py_ISUPPER(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_UPPER) +#define Py_ISALPHA(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_ALPHA) +#define Py_ISDIGIT(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_DIGIT) +#define Py_ISXDIGIT(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_XDIGIT) +#define Py_ISALNUM(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_ALNUM) +#define Py_ISSPACE(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_SPACE) + +PyAPI_DATA(const unsigned char) _Py_ctype_tolower[256]; +PyAPI_DATA(const unsigned char) _Py_ctype_toupper[256]; + +#define Py_TOLOWER(c) (_Py_ctype_tolower[Py_CHARMASK(c)]) +#define Py_TOUPPER(c) (_Py_ctype_toupper[Py_CHARMASK(c)]) + +#endif /* !PYCTYPE_H */ diff --git a/PythonEnv/2.7/Include/pydebug.h b/PythonEnv/2.7/Include/pydebug.h new file mode 100644 index 0000000000..0f45960f90 --- /dev/null +++ b/PythonEnv/2.7/Include/pydebug.h @@ -0,0 +1,41 @@ + +#ifndef Py_PYDEBUG_H +#define Py_PYDEBUG_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(int) Py_DebugFlag; +PyAPI_DATA(int) Py_VerboseFlag; +PyAPI_DATA(int) Py_InteractiveFlag; +PyAPI_DATA(int) Py_InspectFlag; +PyAPI_DATA(int) Py_OptimizeFlag; +PyAPI_DATA(int) Py_NoSiteFlag; +PyAPI_DATA(int) Py_BytesWarningFlag; +PyAPI_DATA(int) Py_UseClassExceptionsFlag; +PyAPI_DATA(int) Py_FrozenFlag; +PyAPI_DATA(int) Py_TabcheckFlag; +PyAPI_DATA(int) Py_UnicodeFlag; +PyAPI_DATA(int) Py_IgnoreEnvironmentFlag; +PyAPI_DATA(int) Py_DivisionWarningFlag; +PyAPI_DATA(int) Py_DontWriteBytecodeFlag; +PyAPI_DATA(int) Py_NoUserSiteDirectory; +/* _XXX Py_QnewFlag should go away in 3.0. It's true iff -Qnew is passed, + on the command line, and is used in 2.2 by ceval.c to make all "/" divisions + true divisions (which they will be in 3.0). */ +PyAPI_DATA(int) _Py_QnewFlag; +/* Warn about 3.x issues */ +PyAPI_DATA(int) Py_Py3kWarningFlag; +PyAPI_DATA(int) Py_HashRandomizationFlag; + +/* this is a wrapper around getenv() that pays attention to + Py_IgnoreEnvironmentFlag. It should be used for getting variables like + PYTHONPATH and PYTHONHOME from the environment */ +#define Py_GETENV(s) (Py_IgnoreEnvironmentFlag ? NULL : getenv(s)) + +PyAPI_FUNC(void) Py_FatalError(const char *message); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYDEBUG_H */ diff --git a/PythonEnv/2.7/Include/pyerrors.h b/PythonEnv/2.7/Include/pyerrors.h new file mode 100644 index 0000000000..dbe3bfa5f2 --- /dev/null +++ b/PythonEnv/2.7/Include/pyerrors.h @@ -0,0 +1,328 @@ +#ifndef Py_ERRORS_H +#define Py_ERRORS_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Error objects */ + +typedef struct { + PyObject_HEAD + PyObject *dict; + PyObject *args; + PyObject *message; +} PyBaseExceptionObject; + +typedef struct { + PyObject_HEAD + PyObject *dict; + PyObject *args; + PyObject *message; + PyObject *msg; + PyObject *filename; + PyObject *lineno; + PyObject *offset; + PyObject *text; + PyObject *print_file_and_line; +} PySyntaxErrorObject; + +#ifdef Py_USING_UNICODE +typedef struct { + PyObject_HEAD + PyObject *dict; + PyObject *args; + PyObject *message; + PyObject *encoding; + PyObject *object; + Py_ssize_t start; + Py_ssize_t end; + PyObject *reason; +} PyUnicodeErrorObject; +#endif + +typedef struct { + PyObject_HEAD + PyObject *dict; + PyObject *args; + PyObject *message; + PyObject *code; +} PySystemExitObject; + +typedef struct { + PyObject_HEAD + PyObject *dict; + PyObject *args; + PyObject *message; + PyObject *myerrno; + PyObject *strerror; + PyObject *filename; +} PyEnvironmentErrorObject; + +#ifdef MS_WINDOWS +typedef struct { + PyObject_HEAD + PyObject *dict; + PyObject *args; + PyObject *message; + PyObject *myerrno; + PyObject *strerror; + PyObject *filename; + PyObject *winerror; +} PyWindowsErrorObject; +#endif + +/* Error handling definitions */ + +PyAPI_FUNC(void) PyErr_SetNone(PyObject *); +PyAPI_FUNC(void) PyErr_SetObject(PyObject *, PyObject *); +PyAPI_FUNC(void) PyErr_SetString(PyObject *, const char *); +PyAPI_FUNC(PyObject *) PyErr_Occurred(void); +PyAPI_FUNC(void) PyErr_Clear(void); +PyAPI_FUNC(void) PyErr_Fetch(PyObject **, PyObject **, PyObject **); +PyAPI_FUNC(void) PyErr_Restore(PyObject *, PyObject *, PyObject *); + +#ifdef Py_DEBUG +#define _PyErr_OCCURRED() PyErr_Occurred() +#else +#define _PyErr_OCCURRED() (_PyThreadState_Current->curexc_type) +#endif + +/* Error testing and normalization */ +PyAPI_FUNC(int) PyErr_GivenExceptionMatches(PyObject *, PyObject *); +PyAPI_FUNC(int) PyErr_ExceptionMatches(PyObject *); +PyAPI_FUNC(void) PyErr_NormalizeException(PyObject**, PyObject**, PyObject**); + +/* */ + +#define PyExceptionClass_Check(x) \ + (PyClass_Check((x)) || (PyType_Check((x)) && \ + PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS))) + +#define PyExceptionInstance_Check(x) \ + (PyInstance_Check((x)) || \ + PyType_FastSubclass((x)->ob_type, Py_TPFLAGS_BASE_EXC_SUBCLASS)) + +#define PyExceptionClass_Name(x) \ + (PyClass_Check((x)) \ + ? PyString_AS_STRING(((PyClassObject*)(x))->cl_name) \ + : (char *)(((PyTypeObject*)(x))->tp_name)) + +#define PyExceptionInstance_Class(x) \ + ((PyInstance_Check((x)) \ + ? (PyObject*)((PyInstanceObject*)(x))->in_class \ + : (PyObject*)((x)->ob_type))) + + +/* Predefined exceptions */ + +PyAPI_DATA(PyObject *) PyExc_BaseException; +PyAPI_DATA(PyObject *) PyExc_Exception; +PyAPI_DATA(PyObject *) PyExc_StopIteration; +PyAPI_DATA(PyObject *) PyExc_GeneratorExit; +PyAPI_DATA(PyObject *) PyExc_StandardError; +PyAPI_DATA(PyObject *) PyExc_ArithmeticError; +PyAPI_DATA(PyObject *) PyExc_LookupError; + +PyAPI_DATA(PyObject *) PyExc_AssertionError; +PyAPI_DATA(PyObject *) PyExc_AttributeError; +PyAPI_DATA(PyObject *) PyExc_EOFError; +PyAPI_DATA(PyObject *) PyExc_FloatingPointError; +PyAPI_DATA(PyObject *) PyExc_EnvironmentError; +PyAPI_DATA(PyObject *) PyExc_IOError; +PyAPI_DATA(PyObject *) PyExc_OSError; +PyAPI_DATA(PyObject *) PyExc_ImportError; +PyAPI_DATA(PyObject *) PyExc_IndexError; +PyAPI_DATA(PyObject *) PyExc_KeyError; +PyAPI_DATA(PyObject *) PyExc_KeyboardInterrupt; +PyAPI_DATA(PyObject *) PyExc_MemoryError; +PyAPI_DATA(PyObject *) PyExc_NameError; +PyAPI_DATA(PyObject *) PyExc_OverflowError; +PyAPI_DATA(PyObject *) PyExc_RuntimeError; +PyAPI_DATA(PyObject *) PyExc_NotImplementedError; +PyAPI_DATA(PyObject *) PyExc_SyntaxError; +PyAPI_DATA(PyObject *) PyExc_IndentationError; +PyAPI_DATA(PyObject *) PyExc_TabError; +PyAPI_DATA(PyObject *) PyExc_ReferenceError; +PyAPI_DATA(PyObject *) PyExc_SystemError; +PyAPI_DATA(PyObject *) PyExc_SystemExit; +PyAPI_DATA(PyObject *) PyExc_TypeError; +PyAPI_DATA(PyObject *) PyExc_UnboundLocalError; +PyAPI_DATA(PyObject *) PyExc_UnicodeError; +PyAPI_DATA(PyObject *) PyExc_UnicodeEncodeError; +PyAPI_DATA(PyObject *) PyExc_UnicodeDecodeError; +PyAPI_DATA(PyObject *) PyExc_UnicodeTranslateError; +PyAPI_DATA(PyObject *) PyExc_ValueError; +PyAPI_DATA(PyObject *) PyExc_ZeroDivisionError; +#ifdef MS_WINDOWS +PyAPI_DATA(PyObject *) PyExc_WindowsError; +#endif +#ifdef __VMS +PyAPI_DATA(PyObject *) PyExc_VMSError; +#endif + +PyAPI_DATA(PyObject *) PyExc_BufferError; + +PyAPI_DATA(PyObject *) PyExc_MemoryErrorInst; +PyAPI_DATA(PyObject *) PyExc_RecursionErrorInst; + +/* Predefined warning categories */ +PyAPI_DATA(PyObject *) PyExc_Warning; +PyAPI_DATA(PyObject *) PyExc_UserWarning; +PyAPI_DATA(PyObject *) PyExc_DeprecationWarning; +PyAPI_DATA(PyObject *) PyExc_PendingDeprecationWarning; +PyAPI_DATA(PyObject *) PyExc_SyntaxWarning; +PyAPI_DATA(PyObject *) PyExc_RuntimeWarning; +PyAPI_DATA(PyObject *) PyExc_FutureWarning; +PyAPI_DATA(PyObject *) PyExc_ImportWarning; +PyAPI_DATA(PyObject *) PyExc_UnicodeWarning; +PyAPI_DATA(PyObject *) PyExc_BytesWarning; + + +/* Convenience functions */ + +PyAPI_FUNC(int) PyErr_BadArgument(void); +PyAPI_FUNC(PyObject *) PyErr_NoMemory(void); +PyAPI_FUNC(PyObject *) PyErr_SetFromErrno(PyObject *); +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObject( + PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilename( + PyObject *, const char *); +#ifdef MS_WINDOWS +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithUnicodeFilename( + PyObject *, const Py_UNICODE *); +#endif /* MS_WINDOWS */ + +PyAPI_FUNC(PyObject *) PyErr_Format(PyObject *, const char *, ...) + Py_GCC_ATTRIBUTE((format(printf, 2, 3))); + +#ifdef MS_WINDOWS +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilenameObject( + int, const char *); +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilename( + int, const char *); +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithUnicodeFilename( + int, const Py_UNICODE *); +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErr(int); +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObject( + PyObject *,int, PyObject *); +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilename( + PyObject *,int, const char *); +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithUnicodeFilename( + PyObject *,int, const Py_UNICODE *); +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErr(PyObject *, int); +#endif /* MS_WINDOWS */ + +/* Export the old function so that the existing API remains available: */ +PyAPI_FUNC(void) PyErr_BadInternalCall(void); +PyAPI_FUNC(void) _PyErr_BadInternalCall(char *filename, int lineno); +/* Mask the old API with a call to the new API for code compiled under + Python 2.0: */ +#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__) + +/* Function to create a new exception */ +PyAPI_FUNC(PyObject *) PyErr_NewException( + char *name, PyObject *base, PyObject *dict); +PyAPI_FUNC(PyObject *) PyErr_NewExceptionWithDoc( + char *name, char *doc, PyObject *base, PyObject *dict); +PyAPI_FUNC(void) PyErr_WriteUnraisable(PyObject *); + +/* In sigcheck.c or signalmodule.c */ +PyAPI_FUNC(int) PyErr_CheckSignals(void); +PyAPI_FUNC(void) PyErr_SetInterrupt(void); + +/* In signalmodule.c */ +int PySignal_SetWakeupFd(int fd); + +/* Support for adding program text to SyntaxErrors */ +PyAPI_FUNC(void) PyErr_SyntaxLocation(const char *, int); +PyAPI_FUNC(PyObject *) PyErr_ProgramText(const char *, int); + +#ifdef Py_USING_UNICODE +/* The following functions are used to create and modify unicode + exceptions from C */ + +/* create a UnicodeDecodeError object */ +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_Create( + const char *, const char *, Py_ssize_t, Py_ssize_t, Py_ssize_t, const char *); + +/* create a UnicodeEncodeError object */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_Create( + const char *, const Py_UNICODE *, Py_ssize_t, Py_ssize_t, Py_ssize_t, const char *); + +/* create a UnicodeTranslateError object */ +PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_Create( + const Py_UNICODE *, Py_ssize_t, Py_ssize_t, Py_ssize_t, const char *); + +/* get the encoding attribute */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetEncoding(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetEncoding(PyObject *); + +/* get the object attribute */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetObject(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetObject(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetObject(PyObject *); + +/* get the value of the start attribute (the int * may not be NULL) + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_GetStart(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeDecodeError_GetStart(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeTranslateError_GetStart(PyObject *, Py_ssize_t *); + +/* assign a new value to the start attribute + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_SetStart(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetStart(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetStart(PyObject *, Py_ssize_t); + +/* get the value of the end attribute (the int *may not be NULL) + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_GetEnd(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeDecodeError_GetEnd(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeTranslateError_GetEnd(PyObject *, Py_ssize_t *); + +/* assign a new value to the end attribute + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_SetEnd(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetEnd(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetEnd(PyObject *, Py_ssize_t); + +/* get the value of the reason attribute */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetReason(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetReason(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetReason(PyObject *); + +/* assign a new value to the reason attribute + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_SetReason( + PyObject *, const char *); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetReason( + PyObject *, const char *); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetReason( + PyObject *, const char *); +#endif + + +/* These APIs aren't really part of the error implementation, but + often needed to format error messages; the native C lib APIs are + not available on all platforms, which is why we provide emulations + for those platforms in Python/mysnprintf.c, + WARNING: The return value of snprintf varies across platforms; do + not rely on any particular behavior; eventually the C99 defn may + be reliable. +*/ +#if defined(MS_WIN32) && !defined(HAVE_SNPRINTF) +# define HAVE_SNPRINTF +# define snprintf _snprintf +# define vsnprintf _vsnprintf +#endif + +#include +PyAPI_FUNC(int) PyOS_snprintf(char *str, size_t size, const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 3, 4))); +PyAPI_FUNC(int) PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) + Py_GCC_ATTRIBUTE((format(printf, 3, 0))); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ERRORS_H */ diff --git a/PythonEnv/2.7/Include/pyexpat.h b/PythonEnv/2.7/Include/pyexpat.h new file mode 100644 index 0000000000..5340ef5fa3 --- /dev/null +++ b/PythonEnv/2.7/Include/pyexpat.h @@ -0,0 +1,48 @@ +/* Stuff to export relevant 'expat' entry points from pyexpat to other + * parser modules, such as cElementTree. */ + +/* note: you must import expat.h before importing this module! */ + +#define PyExpat_CAPI_MAGIC "pyexpat.expat_CAPI 1.0" +#define PyExpat_CAPSULE_NAME "pyexpat.expat_CAPI" + +struct PyExpat_CAPI +{ + char* magic; /* set to PyExpat_CAPI_MAGIC */ + int size; /* set to sizeof(struct PyExpat_CAPI) */ + int MAJOR_VERSION; + int MINOR_VERSION; + int MICRO_VERSION; + /* pointers to selected expat functions. add new functions at + the end, if needed */ + const XML_LChar * (*ErrorString)(enum XML_Error code); + enum XML_Error (*GetErrorCode)(XML_Parser parser); + XML_Size (*GetErrorColumnNumber)(XML_Parser parser); + XML_Size (*GetErrorLineNumber)(XML_Parser parser); + enum XML_Status (*Parse)( + XML_Parser parser, const char *s, int len, int isFinal); + XML_Parser (*ParserCreate_MM)( + const XML_Char *encoding, const XML_Memory_Handling_Suite *memsuite, + const XML_Char *namespaceSeparator); + void (*ParserFree)(XML_Parser parser); + void (*SetCharacterDataHandler)( + XML_Parser parser, XML_CharacterDataHandler handler); + void (*SetCommentHandler)( + XML_Parser parser, XML_CommentHandler handler); + void (*SetDefaultHandlerExpand)( + XML_Parser parser, XML_DefaultHandler handler); + void (*SetElementHandler)( + XML_Parser parser, XML_StartElementHandler start, + XML_EndElementHandler end); + void (*SetNamespaceDeclHandler)( + XML_Parser parser, XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end); + void (*SetProcessingInstructionHandler)( + XML_Parser parser, XML_ProcessingInstructionHandler handler); + void (*SetUnknownEncodingHandler)( + XML_Parser parser, XML_UnknownEncodingHandler handler, + void *encodingHandlerData); + void (*SetUserData)(XML_Parser parser, void *userData); + /* always add new stuff to the end! */ +}; + diff --git a/PythonEnv/2.7/Include/pyfpe.h b/PythonEnv/2.7/Include/pyfpe.h new file mode 100644 index 0000000000..e957119dd5 --- /dev/null +++ b/PythonEnv/2.7/Include/pyfpe.h @@ -0,0 +1,176 @@ +#ifndef Py_PYFPE_H +#define Py_PYFPE_H +#ifdef __cplusplus +extern "C" { +#endif +/* + --------------------------------------------------------------------- + / Copyright (c) 1996. \ + | The Regents of the University of California. | + | All rights reserved. | + | | + | Permission to use, copy, modify, and distribute this software for | + | any purpose without fee is hereby granted, provided that this en- | + | tire notice is included in all copies of any software which is or | + | includes a copy or modification of this software and in all | + | copies of the supporting documentation for such software. | + | | + | This work was produced at the University of California, Lawrence | + | Livermore National Laboratory under contract no. W-7405-ENG-48 | + | between the U.S. Department of Energy and The Regents of the | + | University of California for the operation of UC LLNL. | + | | + | DISCLAIMER | + | | + | This software was prepared as an account of work sponsored by an | + | agency of the United States Government. Neither the United States | + | Government nor the University of California nor any of their em- | + | ployees, makes any warranty, express or implied, or assumes any | + | liability or responsibility for the accuracy, completeness, or | + | usefulness of any information, apparatus, product, or process | + | disclosed, or represents that its use would not infringe | + | privately-owned rights. Reference herein to any specific commer- | + | cial products, process, or service by trade name, trademark, | + | manufacturer, or otherwise, does not necessarily constitute or | + | imply its endorsement, recommendation, or favoring by the United | + | States Government or the University of California. The views and | + | opinions of authors expressed herein do not necessarily state or | + | reflect those of the United States Government or the University | + | of California, and shall not be used for advertising or product | + \ endorsement purposes. / + --------------------------------------------------------------------- +*/ + +/* + * Define macros for handling SIGFPE. + * Lee Busby, LLNL, November, 1996 + * busby1@llnl.gov + * + ********************************************* + * Overview of the system for handling SIGFPE: + * + * This file (Include/pyfpe.h) defines a couple of "wrapper" macros for + * insertion into your Python C code of choice. Their proper use is + * discussed below. The file Python/pyfpe.c defines a pair of global + * variables PyFPE_jbuf and PyFPE_counter which are used by the signal + * handler for SIGFPE to decide if a particular exception was protected + * by the macros. The signal handler itself, and code for enabling the + * generation of SIGFPE in the first place, is in a (new) Python module + * named fpectl. This module is standard in every respect. It can be loaded + * either statically or dynamically as you choose, and like any other + * Python module, has no effect until you import it. + * + * In the general case, there are three steps toward handling SIGFPE in any + * Python code: + * + * 1) Add the *_PROTECT macros to your C code as required to protect + * dangerous floating point sections. + * + * 2) Turn on the inclusion of the code by adding the ``--with-fpectl'' + * flag at the time you run configure. If the fpectl or other modules + * which use the *_PROTECT macros are to be dynamically loaded, be + * sure they are compiled with WANT_SIGFPE_HANDLER defined. + * + * 3) When python is built and running, import fpectl, and execute + * fpectl.turnon_sigfpe(). This sets up the signal handler and enables + * generation of SIGFPE whenever an exception occurs. From this point + * on, any properly trapped SIGFPE should result in the Python + * FloatingPointError exception. + * + * Step 1 has been done already for the Python kernel code, and should be + * done soon for the NumPy array package. Step 2 is usually done once at + * python install time. Python's behavior with respect to SIGFPE is not + * changed unless you also do step 3. Thus you can control this new + * facility at compile time, or run time, or both. + * + ******************************** + * Using the macros in your code: + * + * static PyObject *foobar(PyObject *self,PyObject *args) + * { + * .... + * PyFPE_START_PROTECT("Error in foobar", return 0) + * result = dangerous_op(somearg1, somearg2, ...); + * PyFPE_END_PROTECT(result) + * .... + * } + * + * If a floating point error occurs in dangerous_op, foobar returns 0 (NULL), + * after setting the associated value of the FloatingPointError exception to + * "Error in foobar". ``Dangerous_op'' can be a single operation, or a block + * of code, function calls, or any combination, so long as no alternate + * return is possible before the PyFPE_END_PROTECT macro is reached. + * + * The macros can only be used in a function context where an error return + * can be recognized as signaling a Python exception. (Generally, most + * functions that return a PyObject * will qualify.) + * + * Guido's original design suggestion for PyFPE_START_PROTECT and + * PyFPE_END_PROTECT had them open and close a local block, with a locally + * defined jmp_buf and jmp_buf pointer. This would allow recursive nesting + * of the macros. The Ansi C standard makes it clear that such local + * variables need to be declared with the "volatile" type qualifier to keep + * setjmp from corrupting their values. Some current implementations seem + * to be more restrictive. For example, the HPUX man page for setjmp says + * + * Upon the return from a setjmp() call caused by a longjmp(), the + * values of any non-static local variables belonging to the routine + * from which setjmp() was called are undefined. Code which depends on + * such values is not guaranteed to be portable. + * + * I therefore decided on a more limited form of nesting, using a counter + * variable (PyFPE_counter) to keep track of any recursion. If an exception + * occurs in an ``inner'' pair of macros, the return will apparently + * come from the outermost level. + * + */ + +#ifdef WANT_SIGFPE_HANDLER +#include +#include +#include +extern jmp_buf PyFPE_jbuf; +extern int PyFPE_counter; +extern double PyFPE_dummy(void *); + +#define PyFPE_START_PROTECT(err_string, leave_stmt) \ +if (!PyFPE_counter++ && setjmp(PyFPE_jbuf)) { \ + PyErr_SetString(PyExc_FloatingPointError, err_string); \ + PyFPE_counter = 0; \ + leave_stmt; \ +} + +/* + * This (following) is a heck of a way to decrement a counter. However, + * unless the macro argument is provided, code optimizers will sometimes move + * this statement so that it gets executed *before* the unsafe expression + * which we're trying to protect. That pretty well messes things up, + * of course. + * + * If the expression(s) you're trying to protect don't happen to return a + * value, you will need to manufacture a dummy result just to preserve the + * correct ordering of statements. Note that the macro passes the address + * of its argument (so you need to give it something which is addressable). + * If your expression returns multiple results, pass the last such result + * to PyFPE_END_PROTECT. + * + * Note that PyFPE_dummy returns a double, which is cast to int. + * This seeming insanity is to tickle the Floating Point Unit (FPU). + * If an exception has occurred in a preceding floating point operation, + * some architectures (notably Intel 80x86) will not deliver the interrupt + * until the *next* floating point operation. This is painful if you've + * already decremented PyFPE_counter. + */ +#define PyFPE_END_PROTECT(v) PyFPE_counter -= (int)PyFPE_dummy(&(v)); + +#else + +#define PyFPE_START_PROTECT(err_string, leave_stmt) +#define PyFPE_END_PROTECT(v) + +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYFPE_H */ diff --git a/PythonEnv/2.7/Include/pygetopt.h b/PythonEnv/2.7/Include/pygetopt.h new file mode 100644 index 0000000000..9860d360e1 --- /dev/null +++ b/PythonEnv/2.7/Include/pygetopt.h @@ -0,0 +1,18 @@ + +#ifndef Py_PYGETOPT_H +#define Py_PYGETOPT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(int) _PyOS_opterr; +PyAPI_DATA(int) _PyOS_optind; +PyAPI_DATA(char *) _PyOS_optarg; + +PyAPI_FUNC(void) _PyOS_ResetGetOpt(void); +PyAPI_FUNC(int) _PyOS_GetOpt(int argc, char **argv, char *optstring); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYGETOPT_H */ diff --git a/PythonEnv/2.7/Include/pymacconfig.h b/PythonEnv/2.7/Include/pymacconfig.h new file mode 100644 index 0000000000..24e7b8dac6 --- /dev/null +++ b/PythonEnv/2.7/Include/pymacconfig.h @@ -0,0 +1,102 @@ +#ifndef PYMACCONFIG_H +#define PYMACCONFIG_H + /* + * This file moves some of the autoconf magic to compile-time + * when building on MacOSX. This is needed for building 4-way + * universal binaries and for 64-bit universal binaries because + * the values redefined below aren't configure-time constant but + * only compile-time constant in these scenarios. + */ + +#if defined(__APPLE__) + +# undef SIZEOF_LONG +# undef SIZEOF_PTHREAD_T +# undef SIZEOF_SIZE_T +# undef SIZEOF_TIME_T +# undef SIZEOF_VOID_P +# undef SIZEOF__BOOL +# undef SIZEOF_UINTPTR_T +# undef SIZEOF_PTHREAD_T +# undef WORDS_BIGENDIAN +# undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 +# undef DOUBLE_IS_BIG_ENDIAN_IEEE754 +# undef DOUBLE_IS_LITTLE_ENDIAN_IEEE754 +# undef HAVE_GCC_ASM_FOR_X87 + +# undef VA_LIST_IS_ARRAY +# if defined(__LP64__) && defined(__x86_64__) +# define VA_LIST_IS_ARRAY 1 +# endif + +# undef HAVE_LARGEFILE_SUPPORT +# ifndef __LP64__ +# define HAVE_LARGEFILE_SUPPORT 1 +# endif + +# undef SIZEOF_LONG +# ifdef __LP64__ +# define SIZEOF__BOOL 1 +# define SIZEOF__BOOL 1 +# define SIZEOF_LONG 8 +# define SIZEOF_PTHREAD_T 8 +# define SIZEOF_SIZE_T 8 +# define SIZEOF_TIME_T 8 +# define SIZEOF_VOID_P 8 +# define SIZEOF_UINTPTR_T 8 +# define SIZEOF_PTHREAD_T 8 +# else +# ifdef __ppc__ +# define SIZEOF__BOOL 4 +# else +# define SIZEOF__BOOL 1 +# endif +# define SIZEOF_LONG 4 +# define SIZEOF_PTHREAD_T 4 +# define SIZEOF_SIZE_T 4 +# define SIZEOF_TIME_T 4 +# define SIZEOF_VOID_P 4 +# define SIZEOF_UINTPTR_T 4 +# define SIZEOF_PTHREAD_T 4 +# endif + +# if defined(__LP64__) + /* MacOSX 10.4 (the first release to support 64-bit code + * at all) only supports 64-bit in the UNIX layer. + * Therefore surpress the toolbox-glue in 64-bit mode. + */ + + /* In 64-bit mode setpgrp always has no argments, in 32-bit + * mode that depends on the compilation environment + */ +# undef SETPGRP_HAVE_ARG + +# endif + +#ifdef __BIG_ENDIAN__ +#define WORDS_BIGENDIAN 1 +#define DOUBLE_IS_BIG_ENDIAN_IEEE754 +#else +#define DOUBLE_IS_LITTLE_ENDIAN_IEEE754 +#endif /* __BIG_ENDIAN */ + +#ifdef __i386__ +# define HAVE_GCC_ASM_FOR_X87 +#endif + + /* + * The definition in pyconfig.h is only valid on the OS release + * where configure ran on and not necessarily for all systems where + * the executable can be used on. + * + * Specifically: OSX 10.4 has limited supported for '%zd', while + * 10.5 has full support for '%zd'. A binary built on 10.5 won't + * work properly on 10.4 unless we surpress the definition + * of PY_FORMAT_SIZE_T + */ +#undef PY_FORMAT_SIZE_T + + +#endif /* defined(_APPLE__) */ + +#endif /* PYMACCONFIG_H */ diff --git a/PythonEnv/2.7/Include/pymactoolbox.h b/PythonEnv/2.7/Include/pymactoolbox.h new file mode 100644 index 0000000000..fd15975270 --- /dev/null +++ b/PythonEnv/2.7/Include/pymactoolbox.h @@ -0,0 +1,217 @@ +/* +** pymactoolbox.h - globals defined in mactoolboxglue.c +*/ +#ifndef Py_PYMACTOOLBOX_H +#define Py_PYMACTOOLBOX_H +#ifdef __cplusplus + extern "C" { +#endif + +#include + +#ifndef __LP64__ +#include +#endif /* !__LP64__ */ + +/* +** Helper routines for error codes and such. +*/ +char *PyMac_StrError(int); /* strerror with mac errors */ +extern PyObject *PyMac_OSErrException; /* Exception for OSErr */ +PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ +PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ +PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ +#ifndef __LP64__ +extern OSErr PyMac_GetFullPathname(FSSpec *, char *, int); /* convert + fsspec->path */ +#endif /* __LP64__ */ + +/* +** These conversion routines are defined in mactoolboxglue.c itself. +*/ +int PyMac_GetOSType(PyObject *, OSType *); /* argument parser for OSType */ +PyObject *PyMac_BuildOSType(OSType); /* Convert OSType to PyObject */ + +PyObject *PyMac_BuildNumVersion(NumVersion);/* Convert NumVersion to PyObject */ + +int PyMac_GetStr255(PyObject *, Str255); /* argument parser for Str255 */ +PyObject *PyMac_BuildStr255(Str255); /* Convert Str255 to PyObject */ +PyObject *PyMac_BuildOptStr255(Str255); /* Convert Str255 to PyObject, + NULL to None */ + +int PyMac_GetRect(PyObject *, Rect *); /* argument parser for Rect */ +PyObject *PyMac_BuildRect(Rect *); /* Convert Rect to PyObject */ + +int PyMac_GetPoint(PyObject *, Point *); /* argument parser for Point */ +PyObject *PyMac_BuildPoint(Point); /* Convert Point to PyObject */ + +int PyMac_GetEventRecord(PyObject *, EventRecord *); /* argument parser for + EventRecord */ +PyObject *PyMac_BuildEventRecord(EventRecord *); /* Convert EventRecord to + PyObject */ + +int PyMac_GetFixed(PyObject *, Fixed *); /* argument parser for Fixed */ +PyObject *PyMac_BuildFixed(Fixed); /* Convert Fixed to PyObject */ +int PyMac_Getwide(PyObject *, wide *); /* argument parser for wide */ +PyObject *PyMac_Buildwide(wide *); /* Convert wide to PyObject */ + +/* +** The rest of the routines are implemented by extension modules. If they are +** dynamically loaded mactoolboxglue will contain a stub implementation of the +** routine, which imports the module, whereupon the module's init routine will +** communicate the routine pointer back to the stub. +** If USE_TOOLBOX_OBJECT_GLUE is not defined there is no glue code, and the +** extension modules simply declare the routine. This is the case for static +** builds (and could be the case for MacPython CFM builds, because CFM extension +** modules can reference each other without problems). +*/ + +#ifdef USE_TOOLBOX_OBJECT_GLUE +/* +** These macros are used in the module init code. If we use toolbox object glue +** it sets the function pointer to point to the real function. +*/ +#define PyMac_INIT_TOOLBOX_OBJECT_NEW(object, rtn) { \ + extern PyObject *(*PyMacGluePtr_##rtn)(object); \ + PyMacGluePtr_##rtn = _##rtn; \ +} +#define PyMac_INIT_TOOLBOX_OBJECT_CONVERT(object, rtn) { \ + extern int (*PyMacGluePtr_##rtn)(PyObject *, object *); \ + PyMacGluePtr_##rtn = _##rtn; \ +} +#else +/* +** If we don't use toolbox object glue the init macros are empty. Moreover, we define +** _xxx_New to be the same as xxx_New, and the code in mactoolboxglue isn't included. +*/ +#define PyMac_INIT_TOOLBOX_OBJECT_NEW(object, rtn) +#define PyMac_INIT_TOOLBOX_OBJECT_CONVERT(object, rtn) +#endif /* USE_TOOLBOX_OBJECT_GLUE */ + +/* macfs exports */ +#ifndef __LP64__ +int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */ +PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */ +#endif /* !__LP64__ */ + +int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */ +PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */ + +/* AE exports */ +extern PyObject *AEDesc_New(AppleEvent *); /* XXXX Why passed by address?? */ +extern PyObject *AEDesc_NewBorrowed(AppleEvent *); +extern int AEDesc_Convert(PyObject *, AppleEvent *); + +/* Cm exports */ +extern PyObject *CmpObj_New(Component); +extern int CmpObj_Convert(PyObject *, Component *); +extern PyObject *CmpInstObj_New(ComponentInstance); +extern int CmpInstObj_Convert(PyObject *, ComponentInstance *); + +/* Ctl exports */ +#ifndef __LP64__ +extern PyObject *CtlObj_New(ControlHandle); +extern int CtlObj_Convert(PyObject *, ControlHandle *); +#endif /* !__LP64__ */ + +/* Dlg exports */ +#ifndef __LP64__ +extern PyObject *DlgObj_New(DialogPtr); +extern int DlgObj_Convert(PyObject *, DialogPtr *); +extern PyObject *DlgObj_WhichDialog(DialogPtr); +#endif /* !__LP64__ */ + +/* Drag exports */ +#ifndef __LP64__ +extern PyObject *DragObj_New(DragReference); +extern int DragObj_Convert(PyObject *, DragReference *); +#endif /* !__LP64__ */ + +/* List exports */ +#ifndef __LP64__ +extern PyObject *ListObj_New(ListHandle); +extern int ListObj_Convert(PyObject *, ListHandle *); +#endif /* !__LP64__ */ + +/* Menu exports */ +#ifndef __LP64__ +extern PyObject *MenuObj_New(MenuHandle); +extern int MenuObj_Convert(PyObject *, MenuHandle *); +#endif /* !__LP64__ */ + +/* Qd exports */ +#ifndef __LP64__ +extern PyObject *GrafObj_New(GrafPtr); +extern int GrafObj_Convert(PyObject *, GrafPtr *); +extern PyObject *BMObj_New(BitMapPtr); +extern int BMObj_Convert(PyObject *, BitMapPtr *); +extern PyObject *QdRGB_New(RGBColor *); +extern int QdRGB_Convert(PyObject *, RGBColor *); +#endif /* !__LP64__ */ + +/* Qdoffs exports */ +#ifndef __LP64__ +extern PyObject *GWorldObj_New(GWorldPtr); +extern int GWorldObj_Convert(PyObject *, GWorldPtr *); +#endif /* !__LP64__ */ + +/* Qt exports */ +#ifndef __LP64__ +extern PyObject *TrackObj_New(Track); +extern int TrackObj_Convert(PyObject *, Track *); +extern PyObject *MovieObj_New(Movie); +extern int MovieObj_Convert(PyObject *, Movie *); +extern PyObject *MovieCtlObj_New(MovieController); +extern int MovieCtlObj_Convert(PyObject *, MovieController *); +extern PyObject *TimeBaseObj_New(TimeBase); +extern int TimeBaseObj_Convert(PyObject *, TimeBase *); +extern PyObject *UserDataObj_New(UserData); +extern int UserDataObj_Convert(PyObject *, UserData *); +extern PyObject *MediaObj_New(Media); +extern int MediaObj_Convert(PyObject *, Media *); +#endif /* !__LP64__ */ + +/* Res exports */ +extern PyObject *ResObj_New(Handle); +extern int ResObj_Convert(PyObject *, Handle *); +extern PyObject *OptResObj_New(Handle); +extern int OptResObj_Convert(PyObject *, Handle *); + +/* TE exports */ +#ifndef __LP64__ +extern PyObject *TEObj_New(TEHandle); +extern int TEObj_Convert(PyObject *, TEHandle *); +#endif /* !__LP64__ */ + +/* Win exports */ +#ifndef __LP64__ +extern PyObject *WinObj_New(WindowPtr); +extern int WinObj_Convert(PyObject *, WindowPtr *); +extern PyObject *WinObj_WhichWindow(WindowPtr); +#endif /* !__LP64__ */ + +/* CF exports */ +extern PyObject *CFObj_New(CFTypeRef); +extern int CFObj_Convert(PyObject *, CFTypeRef *); +extern PyObject *CFTypeRefObj_New(CFTypeRef); +extern int CFTypeRefObj_Convert(PyObject *, CFTypeRef *); +extern PyObject *CFStringRefObj_New(CFStringRef); +extern int CFStringRefObj_Convert(PyObject *, CFStringRef *); +extern PyObject *CFMutableStringRefObj_New(CFMutableStringRef); +extern int CFMutableStringRefObj_Convert(PyObject *, CFMutableStringRef *); +extern PyObject *CFArrayRefObj_New(CFArrayRef); +extern int CFArrayRefObj_Convert(PyObject *, CFArrayRef *); +extern PyObject *CFMutableArrayRefObj_New(CFMutableArrayRef); +extern int CFMutableArrayRefObj_Convert(PyObject *, CFMutableArrayRef *); +extern PyObject *CFDictionaryRefObj_New(CFDictionaryRef); +extern int CFDictionaryRefObj_Convert(PyObject *, CFDictionaryRef *); +extern PyObject *CFMutableDictionaryRefObj_New(CFMutableDictionaryRef); +extern int CFMutableDictionaryRefObj_Convert(PyObject *, CFMutableDictionaryRef *); +extern PyObject *CFURLRefObj_New(CFURLRef); +extern int CFURLRefObj_Convert(PyObject *, CFURLRef *); +extern int OptionalCFURLRefObj_Convert(PyObject *, CFURLRef *); + +#ifdef __cplusplus + } +#endif +#endif diff --git a/PythonEnv/2.7/Include/pymath.h b/PythonEnv/2.7/Include/pymath.h new file mode 100644 index 0000000000..e3cf22b823 --- /dev/null +++ b/PythonEnv/2.7/Include/pymath.h @@ -0,0 +1,192 @@ +#ifndef Py_PYMATH_H +#define Py_PYMATH_H + +#include "pyconfig.h" /* include for defines */ + +/************************************************************************** +Symbols and macros to supply platform-independent interfaces to mathematical +functions and constants +**************************************************************************/ + +/* Python provides implementations for copysign, round and hypot in + * Python/pymath.c just in case your math library doesn't provide the + * functions. + * + *Note: PC/pyconfig.h defines copysign as _copysign + */ +#ifndef HAVE_COPYSIGN +extern double copysign(double, double); +#endif + +#ifndef HAVE_ROUND +extern double round(double); +#endif + +#ifndef HAVE_HYPOT +extern double hypot(double, double); +#endif + +/* extra declarations */ +#ifndef _MSC_VER +#ifndef __STDC__ +extern double fmod (double, double); +extern double frexp (double, int *); +extern double ldexp (double, int); +extern double modf (double, double *); +extern double pow(double, double); +#endif /* __STDC__ */ +#endif /* _MSC_VER */ + +#ifdef _OSF_SOURCE +/* OSF1 5.1 doesn't make these available with XOPEN_SOURCE_EXTENDED defined */ +extern int finite(double); +extern double copysign(double, double); +#endif + +/* High precision defintion of pi and e (Euler) + * The values are taken from libc6's math.h. + */ +#ifndef Py_MATH_PIl +#define Py_MATH_PIl 3.1415926535897932384626433832795029L +#endif +#ifndef Py_MATH_PI +#define Py_MATH_PI 3.14159265358979323846 +#endif + +#ifndef Py_MATH_El +#define Py_MATH_El 2.7182818284590452353602874713526625L +#endif + +#ifndef Py_MATH_E +#define Py_MATH_E 2.7182818284590452354 +#endif + +/* On x86, Py_FORCE_DOUBLE forces a floating-point number out of an x87 FPU + register and into a 64-bit memory location, rounding from extended + precision to double precision in the process. On other platforms it does + nothing. */ + +/* we take double rounding as evidence of x87 usage */ +#ifndef Py_FORCE_DOUBLE +# ifdef X87_DOUBLE_ROUNDING +PyAPI_FUNC(double) _Py_force_double(double); +# define Py_FORCE_DOUBLE(X) (_Py_force_double(X)) +# else +# define Py_FORCE_DOUBLE(X) (X) +# endif +#endif + +#ifdef HAVE_GCC_ASM_FOR_X87 +PyAPI_FUNC(unsigned short) _Py_get_387controlword(void); +PyAPI_FUNC(void) _Py_set_387controlword(unsigned short); +#endif + +/* Py_IS_NAN(X) + * Return 1 if float or double arg is a NaN, else 0. + * Caution: + * X is evaluated more than once. + * This may not work on all platforms. Each platform has *some* + * way to spell this, though -- override in pyconfig.h if you have + * a platform where it doesn't work. + * Note: PC/pyconfig.h defines Py_IS_NAN as _isnan + */ +#ifndef Py_IS_NAN +#if defined HAVE_DECL_ISNAN && HAVE_DECL_ISNAN == 1 +#define Py_IS_NAN(X) isnan(X) +#else +#define Py_IS_NAN(X) ((X) != (X)) +#endif +#endif + +/* Py_IS_INFINITY(X) + * Return 1 if float or double arg is an infinity, else 0. + * Caution: + * X is evaluated more than once. + * This implementation may set the underflow flag if |X| is very small; + * it really can't be implemented correctly (& easily) before C99. + * Override in pyconfig.h if you have a better spelling on your platform. + * Py_FORCE_DOUBLE is used to avoid getting false negatives from a + * non-infinite value v sitting in an 80-bit x87 register such that + * v becomes infinite when spilled from the register to 64-bit memory. + * Note: PC/pyconfig.h defines Py_IS_INFINITY as _isinf + */ +#ifndef Py_IS_INFINITY +# if defined HAVE_DECL_ISINF && HAVE_DECL_ISINF == 1 +# define Py_IS_INFINITY(X) isinf(X) +# else +# define Py_IS_INFINITY(X) ((X) && \ + (Py_FORCE_DOUBLE(X)*0.5 == Py_FORCE_DOUBLE(X))) +# endif +#endif + +/* Py_IS_FINITE(X) + * Return 1 if float or double arg is neither infinite nor NAN, else 0. + * Some compilers (e.g. VisualStudio) have intrisics for this, so a special + * macro for this particular test is useful + * Note: PC/pyconfig.h defines Py_IS_FINITE as _finite + */ +#ifndef Py_IS_FINITE +#if defined HAVE_DECL_ISFINITE && HAVE_DECL_ISFINITE == 1 +#define Py_IS_FINITE(X) isfinite(X) +#elif defined HAVE_FINITE +#define Py_IS_FINITE(X) finite(X) +#else +#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X)) +#endif +#endif + +/* HUGE_VAL is supposed to expand to a positive double infinity. Python + * uses Py_HUGE_VAL instead because some platforms are broken in this + * respect. We used to embed code in pyport.h to try to worm around that, + * but different platforms are broken in conflicting ways. If you're on + * a platform where HUGE_VAL is defined incorrectly, fiddle your Python + * config to #define Py_HUGE_VAL to something that works on your platform. + */ +#ifndef Py_HUGE_VAL +#define Py_HUGE_VAL HUGE_VAL +#endif + +/* Py_NAN + * A value that evaluates to a NaN. On IEEE 754 platforms INF*0 or + * INF/INF works. Define Py_NO_NAN in pyconfig.h if your platform + * doesn't support NaNs. + */ +#if !defined(Py_NAN) && !defined(Py_NO_NAN) +#define Py_NAN (Py_HUGE_VAL * 0.) +#endif + +/* Py_OVERFLOWED(X) + * Return 1 iff a libm function overflowed. Set errno to 0 before calling + * a libm function, and invoke this macro after, passing the function + * result. + * Caution: + * This isn't reliable. C99 no longer requires libm to set errno under + * any exceptional condition, but does require +- HUGE_VAL return + * values on overflow. A 754 box *probably* maps HUGE_VAL to a + * double infinity, and we're cool if that's so, unless the input + * was an infinity and an infinity is the expected result. A C89 + * system sets errno to ERANGE, so we check for that too. We're + * out of luck if a C99 754 box doesn't map HUGE_VAL to +Inf, or + * if the returned result is a NaN, or if a C89 box returns HUGE_VAL + * in non-overflow cases. + * X is evaluated more than once. + * Some platforms have better way to spell this, so expect some #ifdef'ery. + * + * OpenBSD uses 'isinf()' because a compiler bug on that platform causes + * the longer macro version to be mis-compiled. This isn't optimal, and + * should be removed once a newer compiler is available on that platform. + * The system that had the failure was running OpenBSD 3.2 on Intel, with + * gcc 2.95.3. + * + * According to Tim's checkin, the FreeBSD systems use isinf() to work + * around a FPE bug on that platform. + */ +#if defined(__FreeBSD__) || defined(__OpenBSD__) +#define Py_OVERFLOWED(X) isinf(X) +#else +#define Py_OVERFLOWED(X) ((X) != 0.0 && (errno == ERANGE || \ + (X) == Py_HUGE_VAL || \ + (X) == -Py_HUGE_VAL)) +#endif + +#endif /* Py_PYMATH_H */ diff --git a/PythonEnv/2.7/Include/pymem.h b/PythonEnv/2.7/Include/pymem.h new file mode 100644 index 0000000000..10b5bea5eb --- /dev/null +++ b/PythonEnv/2.7/Include/pymem.h @@ -0,0 +1,122 @@ +/* The PyMem_ family: low-level memory allocation interfaces. + See objimpl.h for the PyObject_ memory family. +*/ + +#ifndef Py_PYMEM_H +#define Py_PYMEM_H + +#include "pyport.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* BEWARE: + + Each interface exports both functions and macros. Extension modules should + use the functions, to ensure binary compatibility across Python versions. + Because the Python implementation is free to change internal details, and + the macros may (or may not) expose details for speed, if you do use the + macros you must recompile your extensions with each Python release. + + Never mix calls to PyMem_ with calls to the platform malloc/realloc/ + calloc/free. For example, on Windows different DLLs may end up using + different heaps, and if you use PyMem_Malloc you'll get the memory from the + heap used by the Python DLL; it could be a disaster if you free()'ed that + directly in your own extension. Using PyMem_Free instead ensures Python + can return the memory to the proper heap. As another example, in + PYMALLOC_DEBUG mode, Python wraps all calls to all PyMem_ and PyObject_ + memory functions in special debugging wrappers that add additional + debugging info to dynamic memory blocks. The system routines have no idea + what to do with that stuff, and the Python wrappers have no idea what to do + with raw blocks obtained directly by the system routines then. + + The GIL must be held when using these APIs. +*/ + +/* + * Raw memory interface + * ==================== + */ + +/* Functions + + Functions supplying platform-independent semantics for malloc/realloc/ + free. These functions make sure that allocating 0 bytes returns a distinct + non-NULL pointer (whenever possible -- if we're flat out of memory, NULL + may be returned), even if the platform malloc and realloc don't. + Returned pointers must be checked for NULL explicitly. No action is + performed on failure (no exception is set, no warning is printed, etc). +*/ + +PyAPI_FUNC(void *) PyMem_Malloc(size_t); +PyAPI_FUNC(void *) PyMem_Realloc(void *, size_t); +PyAPI_FUNC(void) PyMem_Free(void *); + +/* Starting from Python 1.6, the wrappers Py_{Malloc,Realloc,Free} are + no longer supported. They used to call PyErr_NoMemory() on failure. */ + +/* Macros. */ +#ifdef PYMALLOC_DEBUG +/* Redirect all memory operations to Python's debugging allocator. */ +#define PyMem_MALLOC _PyMem_DebugMalloc +#define PyMem_REALLOC _PyMem_DebugRealloc +#define PyMem_FREE _PyMem_DebugFree + +#else /* ! PYMALLOC_DEBUG */ + +/* PyMem_MALLOC(0) means malloc(1). Some systems would return NULL + for malloc(0), which would be treated as an error. Some platforms + would return a pointer with no memory behind it, which would break + pymalloc. To solve these problems, allocate an extra byte. */ +/* Returns NULL to indicate error if a negative size or size larger than + Py_ssize_t can represent is supplied. Helps prevents security holes. */ +#define PyMem_MALLOC(n) ((size_t)(n) > (size_t)PY_SSIZE_T_MAX ? NULL \ + : malloc((n) ? (n) : 1)) +#define PyMem_REALLOC(p, n) ((size_t)(n) > (size_t)PY_SSIZE_T_MAX ? NULL \ + : realloc((p), (n) ? (n) : 1)) +#define PyMem_FREE free + +#endif /* PYMALLOC_DEBUG */ + +/* + * Type-oriented memory interface + * ============================== + * + * Allocate memory for n objects of the given type. Returns a new pointer + * or NULL if the request was too large or memory allocation failed. Use + * these macros rather than doing the multiplication yourself so that proper + * overflow checking is always done. + */ + +#define PyMem_New(type, n) \ + ( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + ( (type *) PyMem_Malloc((n) * sizeof(type)) ) ) +#define PyMem_NEW(type, n) \ + ( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + ( (type *) PyMem_MALLOC((n) * sizeof(type)) ) ) + +/* + * The value of (p) is always clobbered by this macro regardless of success. + * The caller MUST check if (p) is NULL afterwards and deal with the memory + * error if so. This means the original value of (p) MUST be saved for the + * caller's memory error handler to not lose track of it. + */ +#define PyMem_Resize(p, type, n) \ + ( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + (type *) PyMem_Realloc((p), (n) * sizeof(type)) ) +#define PyMem_RESIZE(p, type, n) \ + ( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + (type *) PyMem_REALLOC((p), (n) * sizeof(type)) ) + +/* PyMem{Del,DEL} are left over from ancient days, and shouldn't be used + * anymore. They're just confusing aliases for PyMem_{Free,FREE} now. + */ +#define PyMem_Del PyMem_Free +#define PyMem_DEL PyMem_FREE + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYMEM_H */ diff --git a/PythonEnv/2.7/Include/pyport.h b/PythonEnv/2.7/Include/pyport.h new file mode 100644 index 0000000000..85e852f8b0 --- /dev/null +++ b/PythonEnv/2.7/Include/pyport.h @@ -0,0 +1,941 @@ +#ifndef Py_PYPORT_H +#define Py_PYPORT_H + +#include "pyconfig.h" /* include for defines */ + +/* Some versions of HP-UX & Solaris need inttypes.h for int32_t, + INT32_MAX, etc. */ +#ifdef HAVE_INTTYPES_H +#include +#endif + +#ifdef HAVE_STDINT_H +#include +#endif + +/************************************************************************** +Symbols and macros to supply platform-independent interfaces to basic +C language & library operations whose spellings vary across platforms. + +Please try to make documentation here as clear as possible: by definition, +the stuff here is trying to illuminate C's darkest corners. + +Config #defines referenced here: + +SIGNED_RIGHT_SHIFT_ZERO_FILLS +Meaning: To be defined iff i>>j does not extend the sign bit when i is a + signed integral type and i < 0. +Used in: Py_ARITHMETIC_RIGHT_SHIFT + +Py_DEBUG +Meaning: Extra checks compiled in for debug mode. +Used in: Py_SAFE_DOWNCAST + +HAVE_UINTPTR_T +Meaning: The C9X type uintptr_t is supported by the compiler +Used in: Py_uintptr_t + +HAVE_LONG_LONG +Meaning: The compiler supports the C type "long long" +Used in: PY_LONG_LONG + +**************************************************************************/ + + +/* For backward compatibility only. Obsolete, do not use. */ +#ifdef HAVE_PROTOTYPES +#define Py_PROTO(x) x +#else +#define Py_PROTO(x) () +#endif +#ifndef Py_FPROTO +#define Py_FPROTO(x) Py_PROTO(x) +#endif + +/* typedefs for some C9X-defined synonyms for integral types. + * + * The names in Python are exactly the same as the C9X names, except with a + * Py_ prefix. Until C9X is universally implemented, this is the only way + * to ensure that Python gets reliable names that don't conflict with names + * in non-Python code that are playing their own tricks to define the C9X + * names. + * + * NOTE: don't go nuts here! Python has no use for *most* of the C9X + * integral synonyms. Only define the ones we actually need. + */ + +#ifdef HAVE_LONG_LONG +#ifndef PY_LONG_LONG +#define PY_LONG_LONG long long +#if defined(LLONG_MAX) +/* If LLONG_MAX is defined in limits.h, use that. */ +#define PY_LLONG_MIN LLONG_MIN +#define PY_LLONG_MAX LLONG_MAX +#define PY_ULLONG_MAX ULLONG_MAX +#elif defined(__LONG_LONG_MAX__) +/* Otherwise, if GCC has a builtin define, use that. */ +#define PY_LLONG_MAX __LONG_LONG_MAX__ +#define PY_LLONG_MIN (-PY_LLONG_MAX-1) +#define PY_ULLONG_MAX (__LONG_LONG_MAX__*2ULL + 1ULL) +#else +/* Otherwise, rely on two's complement. */ +#define PY_ULLONG_MAX (~0ULL) +#define PY_LLONG_MAX ((long long)(PY_ULLONG_MAX>>1)) +#define PY_LLONG_MIN (-PY_LLONG_MAX-1) +#endif /* LLONG_MAX */ +#endif +#endif /* HAVE_LONG_LONG */ + +/* a build with 30-bit digits for Python long integers needs an exact-width + * 32-bit unsigned integer type to store those digits. (We could just use + * type 'unsigned long', but that would be wasteful on a system where longs + * are 64-bits.) On Unix systems, the autoconf macro AC_TYPE_UINT32_T defines + * uint32_t to be such a type unless stdint.h or inttypes.h defines uint32_t. + * However, it doesn't set HAVE_UINT32_T, so we do that here. + */ +#ifdef uint32_t +#define HAVE_UINT32_T 1 +#endif + +#ifdef HAVE_UINT32_T +#ifndef PY_UINT32_T +#define PY_UINT32_T uint32_t +#endif +#endif + +/* Macros for a 64-bit unsigned integer type; used for type 'twodigits' in the + * long integer implementation, when 30-bit digits are enabled. + */ +#ifdef uint64_t +#define HAVE_UINT64_T 1 +#endif + +#ifdef HAVE_UINT64_T +#ifndef PY_UINT64_T +#define PY_UINT64_T uint64_t +#endif +#endif + +/* Signed variants of the above */ +#ifdef int32_t +#define HAVE_INT32_T 1 +#endif + +#ifdef HAVE_INT32_T +#ifndef PY_INT32_T +#define PY_INT32_T int32_t +#endif +#endif + +#ifdef int64_t +#define HAVE_INT64_T 1 +#endif + +#ifdef HAVE_INT64_T +#ifndef PY_INT64_T +#define PY_INT64_T int64_t +#endif +#endif + +/* If PYLONG_BITS_IN_DIGIT is not defined then we'll use 30-bit digits if all + the necessary integer types are available, and we're on a 64-bit platform + (as determined by SIZEOF_VOID_P); otherwise we use 15-bit digits. */ + +#ifndef PYLONG_BITS_IN_DIGIT +#if (defined HAVE_UINT64_T && defined HAVE_INT64_T && \ + defined HAVE_UINT32_T && defined HAVE_INT32_T && SIZEOF_VOID_P >= 8) +#define PYLONG_BITS_IN_DIGIT 30 +#else +#define PYLONG_BITS_IN_DIGIT 15 +#endif +#endif + +/* uintptr_t is the C9X name for an unsigned integral type such that a + * legitimate void* can be cast to uintptr_t and then back to void* again + * without loss of information. Similarly for intptr_t, wrt a signed + * integral type. + */ +#ifdef HAVE_UINTPTR_T +typedef uintptr_t Py_uintptr_t; +typedef intptr_t Py_intptr_t; + +#elif SIZEOF_VOID_P <= SIZEOF_INT +typedef unsigned int Py_uintptr_t; +typedef int Py_intptr_t; + +#elif SIZEOF_VOID_P <= SIZEOF_LONG +typedef unsigned long Py_uintptr_t; +typedef long Py_intptr_t; + +#elif defined(HAVE_LONG_LONG) && (SIZEOF_VOID_P <= SIZEOF_LONG_LONG) +typedef unsigned PY_LONG_LONG Py_uintptr_t; +typedef PY_LONG_LONG Py_intptr_t; + +#else +# error "Python needs a typedef for Py_uintptr_t in pyport.h." +#endif /* HAVE_UINTPTR_T */ + +/* Py_ssize_t is a signed integral type such that sizeof(Py_ssize_t) == + * sizeof(size_t). C99 doesn't define such a thing directly (size_t is an + * unsigned integral type). See PEP 353 for details. + */ +#ifdef HAVE_SSIZE_T +typedef ssize_t Py_ssize_t; +#elif SIZEOF_VOID_P == SIZEOF_SIZE_T +typedef Py_intptr_t Py_ssize_t; +#else +# error "Python needs a typedef for Py_ssize_t in pyport.h." +#endif + +/* Largest possible value of size_t. + SIZE_MAX is part of C99, so it might be defined on some + platforms. If it is not defined, (size_t)-1 is a portable + definition for C89, due to the way signed->unsigned + conversion is defined. */ +#ifdef SIZE_MAX +#define PY_SIZE_MAX SIZE_MAX +#else +#define PY_SIZE_MAX ((size_t)-1) +#endif + +/* Largest positive value of type Py_ssize_t. */ +#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1)) +/* Smallest negative value of type Py_ssize_t. */ +#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1) + +#if SIZEOF_PID_T > SIZEOF_LONG +# error "Python doesn't support sizeof(pid_t) > sizeof(long)" +#endif + +/* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf + * format to convert an argument with the width of a size_t or Py_ssize_t. + * C99 introduced "z" for this purpose, but not all platforms support that; + * e.g., MS compilers use "I" instead. + * + * These "high level" Python format functions interpret "z" correctly on + * all platforms (Python interprets the format string itself, and does whatever + * the platform C requires to convert a size_t/Py_ssize_t argument): + * + * PyString_FromFormat + * PyErr_Format + * PyString_FromFormatV + * + * Lower-level uses require that you interpolate the correct format modifier + * yourself (e.g., calling printf, fprintf, sprintf, PyOS_snprintf); for + * example, + * + * Py_ssize_t index; + * fprintf(stderr, "index %" PY_FORMAT_SIZE_T "d sucks\n", index); + * + * That will expand to %ld, or %Id, or to something else correct for a + * Py_ssize_t on the platform. + */ +#ifndef PY_FORMAT_SIZE_T +# if SIZEOF_SIZE_T == SIZEOF_INT && !defined(__APPLE__) +# define PY_FORMAT_SIZE_T "" +# elif SIZEOF_SIZE_T == SIZEOF_LONG +# define PY_FORMAT_SIZE_T "l" +# elif defined(MS_WINDOWS) +# define PY_FORMAT_SIZE_T "I" +# else +# error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T" +# endif +#endif + +/* PY_FORMAT_LONG_LONG is analogous to PY_FORMAT_SIZE_T above, but for + * the long long type instead of the size_t type. It's only available + * when HAVE_LONG_LONG is defined. The "high level" Python format + * functions listed above will interpret "lld" or "llu" correctly on + * all platforms. + */ +#ifdef HAVE_LONG_LONG +# ifndef PY_FORMAT_LONG_LONG +# if defined(MS_WIN64) || defined(MS_WINDOWS) +# define PY_FORMAT_LONG_LONG "I64" +# else +# error "This platform's pyconfig.h needs to define PY_FORMAT_LONG_LONG" +# endif +# endif +#endif + +/* Py_LOCAL can be used instead of static to get the fastest possible calling + * convention for functions that are local to a given module. + * + * Py_LOCAL_INLINE does the same thing, and also explicitly requests inlining, + * for platforms that support that. + * + * If PY_LOCAL_AGGRESSIVE is defined before python.h is included, more + * "aggressive" inlining/optimizaion is enabled for the entire module. This + * may lead to code bloat, and may slow things down for those reasons. It may + * also lead to errors, if the code relies on pointer aliasing. Use with + * care. + * + * NOTE: You can only use this for functions that are entirely local to a + * module; functions that are exported via method tables, callbacks, etc, + * should keep using static. + */ + +#undef USE_INLINE /* XXX - set via configure? */ + +#if defined(_MSC_VER) +#if defined(PY_LOCAL_AGGRESSIVE) +/* enable more aggressive optimization for visual studio */ +#pragma optimize("agtw", on) +#endif +/* ignore warnings if the compiler decides not to inline a function */ +#pragma warning(disable: 4710) +/* fastest possible local call under MSVC */ +#define Py_LOCAL(type) static type __fastcall +#define Py_LOCAL_INLINE(type) static __inline type __fastcall +#elif defined(USE_INLINE) +#define Py_LOCAL(type) static type +#define Py_LOCAL_INLINE(type) static inline type +#else +#define Py_LOCAL(type) static type +#define Py_LOCAL_INLINE(type) static type +#endif + +/* Py_MEMCPY can be used instead of memcpy in cases where the copied blocks + * are often very short. While most platforms have highly optimized code for + * large transfers, the setup costs for memcpy are often quite high. MEMCPY + * solves this by doing short copies "in line". + */ + +#if defined(_MSC_VER) +#define Py_MEMCPY(target, source, length) do { \ + size_t i_, n_ = (length); \ + char *t_ = (void*) (target); \ + const char *s_ = (void*) (source); \ + if (n_ >= 16) \ + memcpy(t_, s_, n_); \ + else \ + for (i_ = 0; i_ < n_; i_++) \ + t_[i_] = s_[i_]; \ + } while (0) +#else +#define Py_MEMCPY memcpy +#endif + +#include + +#ifdef HAVE_IEEEFP_H +#include /* needed for 'finite' declaration on some platforms */ +#endif + +#include /* Moved here from the math section, before extern "C" */ + +/******************************************** + * WRAPPER FOR and/or * + ********************************************/ + +#ifdef TIME_WITH_SYS_TIME +#include +#include +#else /* !TIME_WITH_SYS_TIME */ +#ifdef HAVE_SYS_TIME_H +#include +#else /* !HAVE_SYS_TIME_H */ +#include +#endif /* !HAVE_SYS_TIME_H */ +#endif /* !TIME_WITH_SYS_TIME */ + + +/****************************** + * WRAPPER FOR * + ******************************/ + +/* NB caller must include */ + +#ifdef HAVE_SYS_SELECT_H + +#include + +#endif /* !HAVE_SYS_SELECT_H */ + +/******************************* + * stat() and fstat() fiddling * + *******************************/ + +/* We expect that stat and fstat exist on most systems. + * It's confirmed on Unix, Mac and Windows. + * If you don't have them, add + * #define DONT_HAVE_STAT + * and/or + * #define DONT_HAVE_FSTAT + * to your pyconfig.h. Python code beyond this should check HAVE_STAT and + * HAVE_FSTAT instead. + * Also + * #define HAVE_SYS_STAT_H + * if exists on your platform, and + * #define HAVE_STAT_H + * if does. + */ +#ifndef DONT_HAVE_STAT +#define HAVE_STAT +#endif + +#ifndef DONT_HAVE_FSTAT +#define HAVE_FSTAT +#endif + +#ifdef RISCOS +#include +#include "unixstuff.h" +#endif + +#ifdef HAVE_SYS_STAT_H +#if defined(PYOS_OS2) && defined(PYCC_GCC) +#include +#endif +#include +#elif defined(HAVE_STAT_H) +#include +#endif + +#if defined(PYCC_VACPP) +/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */ +#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG) +#endif + +#ifndef S_ISREG +#define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) +#endif + +#ifndef S_ISDIR +#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR) +#endif + + +#ifdef __cplusplus +/* Move this down here since some C++ #include's don't like to be included + inside an extern "C" */ +extern "C" { +#endif + + +/* Py_ARITHMETIC_RIGHT_SHIFT + * C doesn't define whether a right-shift of a signed integer sign-extends + * or zero-fills. Here a macro to force sign extension: + * Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) + * Return I >> J, forcing sign extension. Arithmetically, return the + * floor of I/2**J. + * Requirements: + * I should have signed integer type. In the terminology of C99, this can + * be either one of the five standard signed integer types (signed char, + * short, int, long, long long) or an extended signed integer type. + * J is an integer >= 0 and strictly less than the number of bits in the + * type of I (because C doesn't define what happens for J outside that + * range either). + * TYPE used to specify the type of I, but is now ignored. It's been left + * in for backwards compatibility with versions <= 2.6 or 3.0. + * Caution: + * I may be evaluated more than once. + */ +#ifdef SIGNED_RIGHT_SHIFT_ZERO_FILLS +#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) \ + ((I) < 0 ? -1-((-1-(I)) >> (J)) : (I) >> (J)) +#else +#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J)) +#endif + +/* Py_FORCE_EXPANSION(X) + * "Simply" returns its argument. However, macro expansions within the + * argument are evaluated. This unfortunate trickery is needed to get + * token-pasting to work as desired in some cases. + */ +#define Py_FORCE_EXPANSION(X) X + +/* Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) + * Cast VALUE to type NARROW from type WIDE. In Py_DEBUG mode, this + * assert-fails if any information is lost. + * Caution: + * VALUE may be evaluated more than once. + */ +#ifdef Py_DEBUG +#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \ + (assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE)) +#else +#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE) +#endif + +/* Py_SET_ERRNO_ON_MATH_ERROR(x) + * If a libm function did not set errno, but it looks like the result + * overflowed or not-a-number, set errno to ERANGE or EDOM. Set errno + * to 0 before calling a libm function, and invoke this macro after, + * passing the function result. + * Caution: + * This isn't reliable. See Py_OVERFLOWED comments. + * X is evaluated more than once. + */ +#if defined(__FreeBSD__) || defined(__OpenBSD__) || (defined(__hpux) && defined(__ia64)) +#define _Py_SET_EDOM_FOR_NAN(X) if (isnan(X)) errno = EDOM; +#else +#define _Py_SET_EDOM_FOR_NAN(X) ; +#endif +#define Py_SET_ERRNO_ON_MATH_ERROR(X) \ + do { \ + if (errno == 0) { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ + errno = ERANGE; \ + else _Py_SET_EDOM_FOR_NAN(X) \ + } \ + } while(0) + +/* Py_SET_ERANGE_ON_OVERFLOW(x) + * An alias of Py_SET_ERRNO_ON_MATH_ERROR for backward-compatibility. + */ +#define Py_SET_ERANGE_IF_OVERFLOW(X) Py_SET_ERRNO_ON_MATH_ERROR(X) + +/* Py_ADJUST_ERANGE1(x) + * Py_ADJUST_ERANGE2(x, y) + * Set errno to 0 before calling a libm function, and invoke one of these + * macros after, passing the function result(s) (Py_ADJUST_ERANGE2 is useful + * for functions returning complex results). This makes two kinds of + * adjustments to errno: (A) If it looks like the platform libm set + * errno=ERANGE due to underflow, clear errno. (B) If it looks like the + * platform libm overflowed but didn't set errno, force errno to ERANGE. In + * effect, we're trying to force a useful implementation of C89 errno + * behavior. + * Caution: + * This isn't reliable. See Py_OVERFLOWED comments. + * X and Y may be evaluated more than once. + */ +#define Py_ADJUST_ERANGE1(X) \ + do { \ + if (errno == 0) { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ + errno = ERANGE; \ + } \ + else if (errno == ERANGE && (X) == 0.0) \ + errno = 0; \ + } while(0) + +#define Py_ADJUST_ERANGE2(X, Y) \ + do { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL || \ + (Y) == Py_HUGE_VAL || (Y) == -Py_HUGE_VAL) { \ + if (errno == 0) \ + errno = ERANGE; \ + } \ + else if (errno == ERANGE) \ + errno = 0; \ + } while(0) + +/* The functions _Py_dg_strtod and _Py_dg_dtoa in Python/dtoa.c (which are + * required to support the short float repr introduced in Python 3.1) require + * that the floating-point unit that's being used for arithmetic operations + * on C doubles is set to use 53-bit precision. It also requires that the + * FPU rounding mode is round-half-to-even, but that's less often an issue. + * + * If your FPU isn't already set to 53-bit precision/round-half-to-even, and + * you want to make use of _Py_dg_strtod and _Py_dg_dtoa, then you should + * + * #define HAVE_PY_SET_53BIT_PRECISION 1 + * + * and also give appropriate definitions for the following three macros: + * + * _PY_SET_53BIT_PRECISION_START : store original FPU settings, and + * set FPU to 53-bit precision/round-half-to-even + * _PY_SET_53BIT_PRECISION_END : restore original FPU settings + * _PY_SET_53BIT_PRECISION_HEADER : any variable declarations needed to + * use the two macros above. + * + * The macros are designed to be used within a single C function: see + * Python/pystrtod.c for an example of their use. + */ + +/* get and set x87 control word for gcc/x86 */ +#ifdef HAVE_GCC_ASM_FOR_X87 +#define HAVE_PY_SET_53BIT_PRECISION 1 +/* _Py_get/set_387controlword functions are defined in Python/pymath.c */ +#define _Py_SET_53BIT_PRECISION_HEADER \ + unsigned short old_387controlword, new_387controlword +#define _Py_SET_53BIT_PRECISION_START \ + do { \ + old_387controlword = _Py_get_387controlword(); \ + new_387controlword = (old_387controlword & ~0x0f00) | 0x0200; \ + if (new_387controlword != old_387controlword) \ + _Py_set_387controlword(new_387controlword); \ + } while (0) +#define _Py_SET_53BIT_PRECISION_END \ + if (new_387controlword != old_387controlword) \ + _Py_set_387controlword(old_387controlword) +#endif + +/* get and set x87 control word for VisualStudio/x86 */ +#if defined(_MSC_VER) && !defined(_WIN64) /* x87 not supported in 64-bit */ +#define HAVE_PY_SET_53BIT_PRECISION 1 +#define _Py_SET_53BIT_PRECISION_HEADER \ + unsigned int old_387controlword, new_387controlword, out_387controlword +/* We use the __control87_2 function to set only the x87 control word. + The SSE control word is unaffected. */ +#define _Py_SET_53BIT_PRECISION_START \ + do { \ + __control87_2(0, 0, &old_387controlword, NULL); \ + new_387controlword = \ + (old_387controlword & ~(_MCW_PC | _MCW_RC)) | (_PC_53 | _RC_NEAR); \ + if (new_387controlword != old_387controlword) \ + __control87_2(new_387controlword, _MCW_PC | _MCW_RC, \ + &out_387controlword, NULL); \ + } while (0) +#define _Py_SET_53BIT_PRECISION_END \ + do { \ + if (new_387controlword != old_387controlword) \ + __control87_2(old_387controlword, _MCW_PC | _MCW_RC, \ + &out_387controlword, NULL); \ + } while (0) +#endif + +/* default definitions are empty */ +#ifndef HAVE_PY_SET_53BIT_PRECISION +#define _Py_SET_53BIT_PRECISION_HEADER +#define _Py_SET_53BIT_PRECISION_START +#define _Py_SET_53BIT_PRECISION_END +#endif + +/* If we can't guarantee 53-bit precision, don't use the code + in Python/dtoa.c, but fall back to standard code. This + means that repr of a float will be long (17 sig digits). + + Realistically, there are two things that could go wrong: + + (1) doubles aren't IEEE 754 doubles, or + (2) we're on x86 with the rounding precision set to 64-bits + (extended precision), and we don't know how to change + the rounding precision. + */ + +#if !defined(DOUBLE_IS_LITTLE_ENDIAN_IEEE754) && \ + !defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) && \ + !defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754) +#define PY_NO_SHORT_FLOAT_REPR +#endif + +/* double rounding is symptomatic of use of extended precision on x86. If + we're seeing double rounding, and we don't have any mechanism available for + changing the FPU rounding precision, then don't use Python/dtoa.c. */ +#if defined(X87_DOUBLE_ROUNDING) && !defined(HAVE_PY_SET_53BIT_PRECISION) +#define PY_NO_SHORT_FLOAT_REPR +#endif + +/* Py_DEPRECATED(version) + * Declare a variable, type, or function deprecated. + * Usage: + * extern int old_var Py_DEPRECATED(2.3); + * typedef int T1 Py_DEPRECATED(2.4); + * extern int x() Py_DEPRECATED(2.5); + */ +#if defined(__GNUC__) && ((__GNUC__ >= 4) || \ + (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)) +#define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__)) +#else +#define Py_DEPRECATED(VERSION_UNUSED) +#endif + +/************************************************************************** +Prototypes that are missing from the standard include files on some systems +(and possibly only some versions of such systems.) + +Please be conservative with adding new ones, document them and enclose them +in platform-specific #ifdefs. +**************************************************************************/ + +#ifdef SOLARIS +/* Unchecked */ +extern int gethostname(char *, int); +#endif + +#ifdef __BEOS__ +/* Unchecked */ +/* It's in the libs, but not the headers... - [cjh] */ +int shutdown( int, int ); +#endif + +#ifdef HAVE__GETPTY +#include /* we need to import mode_t */ +extern char * _getpty(int *, int, mode_t, int); +#endif + +/* On QNX 6, struct termio must be declared by including sys/termio.h + if TCGETA, TCSETA, TCSETAW, or TCSETAF are used. sys/termio.h must + be included before termios.h or it will generate an error. */ +#if defined(HAVE_SYS_TERMIO_H) && !defined(__hpux) +#include +#endif + +#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) +#if !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) && !defined(HAVE_UTIL_H) +/* BSDI does not supply a prototype for the 'openpty' and 'forkpty' + functions, even though they are included in libutil. */ +#include +extern int openpty(int *, int *, char *, struct termios *, struct winsize *); +extern pid_t forkpty(int *, char *, struct termios *, struct winsize *); +#endif /* !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) */ +#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */ + + +/* These are pulled from various places. It isn't obvious on what platforms + they are necessary, nor what the exact prototype should look like (which + is likely to vary between platforms!) If you find you need one of these + declarations, please move them to a platform-specific block and include + proper prototypes. */ +#if 0 + +/* From Modules/resource.c */ +extern int getrusage(); +extern int getpagesize(); + +/* From Python/sysmodule.c and Modules/posixmodule.c */ +extern int fclose(FILE *); + +/* From Modules/posixmodule.c */ +extern int fdatasync(int); +#endif /* 0 */ + + +/* On 4.4BSD-descendants, ctype functions serves the whole range of + * wchar_t character set rather than single byte code points only. + * This characteristic can break some operations of string object + * including str.upper() and str.split() on UTF-8 locales. This + * workaround was provided by Tim Robbins of FreeBSD project. + */ + +#ifdef __FreeBSD__ +#include +#if __FreeBSD_version > 500039 +# define _PY_PORT_CTYPE_UTF8_ISSUE +#endif +#endif + + +#if defined(__APPLE__) +# define _PY_PORT_CTYPE_UTF8_ISSUE +#endif + +#ifdef _PY_PORT_CTYPE_UTF8_ISSUE +#include +#include +#undef isalnum +#define isalnum(c) iswalnum(btowc(c)) +#undef isalpha +#define isalpha(c) iswalpha(btowc(c)) +#undef islower +#define islower(c) iswlower(btowc(c)) +#undef isspace +#define isspace(c) iswspace(btowc(c)) +#undef isupper +#define isupper(c) iswupper(btowc(c)) +#undef tolower +#define tolower(c) towlower(btowc(c)) +#undef toupper +#define toupper(c) towupper(btowc(c)) +#endif + + +/* Declarations for symbol visibility. + + PyAPI_FUNC(type): Declares a public Python API function and return type + PyAPI_DATA(type): Declares public Python data and its type + PyMODINIT_FUNC: A Python module init function. If these functions are + inside the Python core, they are private to the core. + If in an extension module, it may be declared with + external linkage depending on the platform. + + As a number of platforms support/require "__declspec(dllimport/dllexport)", + we support a HAVE_DECLSPEC_DLL macro to save duplication. +*/ + +/* + All windows ports, except cygwin, are handled in PC/pyconfig.h. + + BeOS and cygwin are the only other autoconf platform requiring special + linkage handling and both of these use __declspec(). +*/ +#if defined(__CYGWIN__) || defined(__BEOS__) +# define HAVE_DECLSPEC_DLL +#endif + +/* only get special linkage if built as shared or platform is Cygwin */ +#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__) +# if defined(HAVE_DECLSPEC_DLL) +# ifdef Py_BUILD_CORE +# define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE +# define PyAPI_DATA(RTYPE) extern __declspec(dllexport) RTYPE + /* module init functions inside the core need no external linkage */ + /* except for Cygwin to handle embedding (FIXME: BeOS too?) */ +# if defined(__CYGWIN__) +# define PyMODINIT_FUNC __declspec(dllexport) void +# else /* __CYGWIN__ */ +# define PyMODINIT_FUNC void +# endif /* __CYGWIN__ */ +# else /* Py_BUILD_CORE */ + /* Building an extension module, or an embedded situation */ + /* public Python functions and data are imported */ + /* Under Cygwin, auto-import functions to prevent compilation */ + /* failures similar to those described at the bottom of 4.1: */ + /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ +# if !defined(__CYGWIN__) +# define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE +# endif /* !__CYGWIN__ */ +# define PyAPI_DATA(RTYPE) extern __declspec(dllimport) RTYPE + /* module init functions outside the core must be exported */ +# if defined(__cplusplus) +# define PyMODINIT_FUNC extern "C" __declspec(dllexport) void +# else /* __cplusplus */ +# define PyMODINIT_FUNC __declspec(dllexport) void +# endif /* __cplusplus */ +# endif /* Py_BUILD_CORE */ +# endif /* HAVE_DECLSPEC */ +#endif /* Py_ENABLE_SHARED */ + +/* If no external linkage macros defined by now, create defaults */ +#ifndef PyAPI_FUNC +# define PyAPI_FUNC(RTYPE) RTYPE +#endif +#ifndef PyAPI_DATA +# define PyAPI_DATA(RTYPE) extern RTYPE +#endif +#ifndef PyMODINIT_FUNC +# if defined(__cplusplus) +# define PyMODINIT_FUNC extern "C" void +# else /* __cplusplus */ +# define PyMODINIT_FUNC void +# endif /* __cplusplus */ +#endif + +/* Deprecated DL_IMPORT and DL_EXPORT macros */ +#if defined(Py_ENABLE_SHARED) && defined (HAVE_DECLSPEC_DLL) +# if defined(Py_BUILD_CORE) +# define DL_IMPORT(RTYPE) __declspec(dllexport) RTYPE +# define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE +# else +# define DL_IMPORT(RTYPE) __declspec(dllimport) RTYPE +# define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE +# endif +#endif +#ifndef DL_EXPORT +# define DL_EXPORT(RTYPE) RTYPE +#endif +#ifndef DL_IMPORT +# define DL_IMPORT(RTYPE) RTYPE +#endif +/* End of deprecated DL_* macros */ + +/* If the fd manipulation macros aren't defined, + here is a set that should do the job */ + +#if 0 /* disabled and probably obsolete */ + +#ifndef FD_SETSIZE +#define FD_SETSIZE 256 +#endif + +#ifndef FD_SET + +typedef long fd_mask; + +#define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */ +#ifndef howmany +#define howmany(x, y) (((x)+((y)-1))/(y)) +#endif /* howmany */ + +typedef struct fd_set { + fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)]; +} fd_set; + +#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS))) +#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) +#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) +#define FD_ZERO(p) memset((char *)(p), '\0', sizeof(*(p))) + +#endif /* FD_SET */ + +#endif /* fd manipulation macros */ + + +/* limits.h constants that may be missing */ + +#ifndef INT_MAX +#define INT_MAX 2147483647 +#endif + +#ifndef LONG_MAX +#if SIZEOF_LONG == 4 +#define LONG_MAX 0X7FFFFFFFL +#elif SIZEOF_LONG == 8 +#define LONG_MAX 0X7FFFFFFFFFFFFFFFL +#else +#error "could not set LONG_MAX in pyport.h" +#endif +#endif + +#ifndef LONG_MIN +#define LONG_MIN (-LONG_MAX-1) +#endif + +#ifndef LONG_BIT +#define LONG_BIT (8 * SIZEOF_LONG) +#endif + +#if LONG_BIT != 8 * SIZEOF_LONG +/* 04-Oct-2000 LONG_BIT is apparently (mis)defined as 64 on some recent + * 32-bit platforms using gcc. We try to catch that here at compile-time + * rather than waiting for integer multiplication to trigger bogus + * overflows. + */ +#error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)." +#endif + +#ifdef __cplusplus +} +#endif + +/* + * Hide GCC attributes from compilers that don't support them. + */ +#if (!defined(__GNUC__) || __GNUC__ < 2 || \ + (__GNUC__ == 2 && __GNUC_MINOR__ < 7) ) && \ + !defined(RISCOS) +#define Py_GCC_ATTRIBUTE(x) +#else +#define Py_GCC_ATTRIBUTE(x) __attribute__(x) +#endif + +/* + * Add PyArg_ParseTuple format where available. + */ +#ifdef HAVE_ATTRIBUTE_FORMAT_PARSETUPLE +#define Py_FORMAT_PARSETUPLE(func,p1,p2) __attribute__((format(func,p1,p2))) +#else +#define Py_FORMAT_PARSETUPLE(func,p1,p2) +#endif + +/* + * Specify alignment on compilers that support it. + */ +#if defined(__GNUC__) && __GNUC__ >= 3 +#define Py_ALIGNED(x) __attribute__((aligned(x))) +#else +#define Py_ALIGNED(x) +#endif + +/* Eliminate end-of-loop code not reached warnings from SunPro C + * when using do{...}while(0) macros + */ +#ifdef __SUNPRO_C +#pragma error_messages (off,E_END_OF_LOOP_CODE_NOT_REACHED) +#endif + +/* + * Older Microsoft compilers don't support the C99 long long literal suffixes, + * so these will be defined in PC/pyconfig.h for those compilers. + */ +#ifndef Py_LL +#define Py_LL(x) x##LL +#endif + +#ifndef Py_ULL +#define Py_ULL(x) Py_LL(x##U) +#endif + +#endif /* Py_PYPORT_H */ diff --git a/PythonEnv/2.7/Include/pystate.h b/PythonEnv/2.7/Include/pystate.h new file mode 100644 index 0000000000..f2cfc30208 --- /dev/null +++ b/PythonEnv/2.7/Include/pystate.h @@ -0,0 +1,200 @@ + +/* Thread and interpreter state structures and their interfaces */ + + +#ifndef Py_PYSTATE_H +#define Py_PYSTATE_H +#ifdef __cplusplus +extern "C" { +#endif + +/* State shared between threads */ + +struct _ts; /* Forward */ +struct _is; /* Forward */ + +typedef struct _is { + + struct _is *next; + struct _ts *tstate_head; + + PyObject *modules; + PyObject *sysdict; + PyObject *builtins; + PyObject *modules_reloading; + + PyObject *codec_search_path; + PyObject *codec_search_cache; + PyObject *codec_error_registry; + +#ifdef HAVE_DLOPEN + int dlopenflags; +#endif +#ifdef WITH_TSC + int tscdump; +#endif + +} PyInterpreterState; + + +/* State unique per thread */ + +struct _frame; /* Avoid including frameobject.h */ + +/* Py_tracefunc return -1 when raising an exception, or 0 for success. */ +typedef int (*Py_tracefunc)(PyObject *, struct _frame *, int, PyObject *); + +/* The following values are used for 'what' for tracefunc functions: */ +#define PyTrace_CALL 0 +#define PyTrace_EXCEPTION 1 +#define PyTrace_LINE 2 +#define PyTrace_RETURN 3 +#define PyTrace_C_CALL 4 +#define PyTrace_C_EXCEPTION 5 +#define PyTrace_C_RETURN 6 + +typedef struct _ts { + /* See Python/ceval.c for comments explaining most fields */ + + struct _ts *next; + PyInterpreterState *interp; + + struct _frame *frame; + int recursion_depth; + /* 'tracing' keeps track of the execution depth when tracing/profiling. + This is to prevent the actual trace/profile code from being recorded in + the trace/profile. */ + int tracing; + int use_tracing; + + Py_tracefunc c_profilefunc; + Py_tracefunc c_tracefunc; + PyObject *c_profileobj; + PyObject *c_traceobj; + + PyObject *curexc_type; + PyObject *curexc_value; + PyObject *curexc_traceback; + + PyObject *exc_type; + PyObject *exc_value; + PyObject *exc_traceback; + + PyObject *dict; /* Stores per-thread state */ + + /* tick_counter is incremented whenever the check_interval ticker + * reaches zero. The purpose is to give a useful measure of the number + * of interpreted bytecode instructions in a given thread. This + * extremely lightweight statistic collector may be of interest to + * profilers (like psyco.jit()), although nothing in the core uses it. + */ + int tick_counter; + + int gilstate_counter; + + PyObject *async_exc; /* Asynchronous exception to raise */ + long thread_id; /* Thread id where this tstate was created */ + + int trash_delete_nesting; + PyObject *trash_delete_later; + + /* XXX signal handlers should also be here */ + +} PyThreadState; + + +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void); +PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *); +PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *); + +PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *); +PyAPI_FUNC(PyThreadState *) _PyThreadState_Prealloc(PyInterpreterState *); +PyAPI_FUNC(void) _PyThreadState_Init(PyThreadState *); +PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *); +PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *); +#ifdef WITH_THREAD +PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void); +#endif + +PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void); +PyAPI_FUNC(PyThreadState *) PyThreadState_Swap(PyThreadState *); +PyAPI_FUNC(PyObject *) PyThreadState_GetDict(void); +PyAPI_FUNC(int) PyThreadState_SetAsyncExc(long, PyObject *); + + +/* Variable and macro for in-line access to current thread state */ + +PyAPI_DATA(PyThreadState *) _PyThreadState_Current; + +#ifdef Py_DEBUG +#define PyThreadState_GET() PyThreadState_Get() +#else +#define PyThreadState_GET() (_PyThreadState_Current) +#endif + +typedef + enum {PyGILState_LOCKED, PyGILState_UNLOCKED} + PyGILState_STATE; + +/* Ensure that the current thread is ready to call the Python + C API, regardless of the current state of Python, or of its + thread lock. This may be called as many times as desired + by a thread so long as each call is matched with a call to + PyGILState_Release(). In general, other thread-state APIs may + be used between _Ensure() and _Release() calls, so long as the + thread-state is restored to its previous state before the Release(). + For example, normal use of the Py_BEGIN_ALLOW_THREADS/ + Py_END_ALLOW_THREADS macros are acceptable. + + The return value is an opaque "handle" to the thread state when + PyGILState_Ensure() was called, and must be passed to + PyGILState_Release() to ensure Python is left in the same state. Even + though recursive calls are allowed, these handles can *not* be shared - + each unique call to PyGILState_Ensure must save the handle for its + call to PyGILState_Release. + + When the function returns, the current thread will hold the GIL. + + Failure is a fatal error. +*/ +PyAPI_FUNC(PyGILState_STATE) PyGILState_Ensure(void); + +/* Release any resources previously acquired. After this call, Python's + state will be the same as it was prior to the corresponding + PyGILState_Ensure() call (but generally this state will be unknown to + the caller, hence the use of the GILState API.) + + Every call to PyGILState_Ensure must be matched by a call to + PyGILState_Release on the same thread. +*/ +PyAPI_FUNC(void) PyGILState_Release(PyGILState_STATE); + +/* Helper/diagnostic function - get the current thread state for + this thread. May return NULL if no GILState API has been used + on the current thread. Note that the main thread always has such a + thread-state, even if no auto-thread-state call has been made + on the main thread. +*/ +PyAPI_FUNC(PyThreadState *) PyGILState_GetThisThreadState(void); + +/* The implementation of sys._current_frames() Returns a dict mapping + thread id to that thread's current frame. +*/ +PyAPI_FUNC(PyObject *) _PyThread_CurrentFrames(void); + +/* Routines for advanced debuggers, requested by David Beazley. + Don't use unless you know what you are doing! */ +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Head(void); +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *); +PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *); +PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *); + +typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_); + +/* hook for PyEval_GetFrame(), requested for Psyco */ +PyAPI_DATA(PyThreadFrameGetter) _PyThreadState_GetFrame; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYSTATE_H */ diff --git a/PythonEnv/2.7/Include/pystrcmp.h b/PythonEnv/2.7/Include/pystrcmp.h new file mode 100644 index 0000000000..369c7e77ff --- /dev/null +++ b/PythonEnv/2.7/Include/pystrcmp.h @@ -0,0 +1,23 @@ +#ifndef Py_STRCMP_H +#define Py_STRCMP_H + +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(int) PyOS_mystrnicmp(const char *, const char *, Py_ssize_t); +PyAPI_FUNC(int) PyOS_mystricmp(const char *, const char *); + +#if defined(MS_WINDOWS) || defined(PYOS_OS2) +#define PyOS_strnicmp strnicmp +#define PyOS_stricmp stricmp +#else +#define PyOS_strnicmp PyOS_mystrnicmp +#define PyOS_stricmp PyOS_mystricmp +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_STRCMP_H */ diff --git a/PythonEnv/2.7/Include/pystrtod.h b/PythonEnv/2.7/Include/pystrtod.h new file mode 100644 index 0000000000..eec434f1bd --- /dev/null +++ b/PythonEnv/2.7/Include/pystrtod.h @@ -0,0 +1,45 @@ +#ifndef Py_STRTOD_H +#define Py_STRTOD_H + +#ifdef __cplusplus +extern "C" { +#endif + + +PyAPI_FUNC(double) PyOS_ascii_strtod(const char *str, char **ptr); +PyAPI_FUNC(double) PyOS_ascii_atof(const char *str); + +/* Deprecated in 2.7 and 3.1. Will disappear in 2.8 (if it exists) and 3.2 */ +PyAPI_FUNC(char *) PyOS_ascii_formatd(char *buffer, size_t buf_len, + const char *format, double d); +PyAPI_FUNC(double) PyOS_string_to_double(const char *str, + char **endptr, + PyObject *overflow_exception); + +/* The caller is responsible for calling PyMem_Free to free the buffer + that's is returned. */ +PyAPI_FUNC(char *) PyOS_double_to_string(double val, + char format_code, + int precision, + int flags, + int *type); + +PyAPI_FUNC(double) _Py_parse_inf_or_nan(const char *p, char **endptr); + + +/* PyOS_double_to_string's "flags" parameter can be set to 0 or more of: */ +#define Py_DTSF_SIGN 0x01 /* always add the sign */ +#define Py_DTSF_ADD_DOT_0 0x02 /* if the result is an integer add ".0" */ +#define Py_DTSF_ALT 0x04 /* "alternate" formatting. it's format_code + specific */ + +/* PyOS_double_to_string's "type", if non-NULL, will be set to one of: */ +#define Py_DTST_FINITE 0 +#define Py_DTST_INFINITE 1 +#define Py_DTST_NAN 2 + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_STRTOD_H */ diff --git a/PythonEnv/2.7/Include/pythonrun.h b/PythonEnv/2.7/Include/pythonrun.h new file mode 100644 index 0000000000..6bfc175050 --- /dev/null +++ b/PythonEnv/2.7/Include/pythonrun.h @@ -0,0 +1,181 @@ + +/* Interfaces to parse and execute pieces of python code */ + +#ifndef Py_PYTHONRUN_H +#define Py_PYTHONRUN_H +#ifdef __cplusplus +extern "C" { +#endif + +#define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | \ + CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | \ + CO_FUTURE_UNICODE_LITERALS) +#define PyCF_MASK_OBSOLETE (CO_NESTED) +#define PyCF_SOURCE_IS_UTF8 0x0100 +#define PyCF_DONT_IMPLY_DEDENT 0x0200 +#define PyCF_ONLY_AST 0x0400 + +typedef struct { + int cf_flags; /* bitmask of CO_xxx flags relevant to future */ +} PyCompilerFlags; + +PyAPI_FUNC(void) Py_SetProgramName(char *); +PyAPI_FUNC(char *) Py_GetProgramName(void); + +PyAPI_FUNC(void) Py_SetPythonHome(char *); +PyAPI_FUNC(char *) Py_GetPythonHome(void); + +PyAPI_FUNC(void) Py_Initialize(void); +PyAPI_FUNC(void) Py_InitializeEx(int); +PyAPI_FUNC(void) Py_Finalize(void); +PyAPI_FUNC(int) Py_IsInitialized(void); +PyAPI_FUNC(PyThreadState *) Py_NewInterpreter(void); +PyAPI_FUNC(void) Py_EndInterpreter(PyThreadState *); + +PyAPI_FUNC(int) PyRun_AnyFileFlags(FILE *, const char *, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_AnyFileExFlags(FILE *, const char *, int, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_SimpleFileExFlags(FILE *, const char *, int, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_InteractiveOneFlags(FILE *, const char *, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_InteractiveLoopFlags(FILE *, const char *, PyCompilerFlags *); + +PyAPI_FUNC(struct _mod *) PyParser_ASTFromString(const char *, const char *, + int, PyCompilerFlags *flags, + PyArena *); +PyAPI_FUNC(struct _mod *) PyParser_ASTFromFile(FILE *, const char *, int, + char *, char *, + PyCompilerFlags *, int *, + PyArena *); +#define PyParser_SimpleParseString(S, B) \ + PyParser_SimpleParseStringFlags(S, B, 0) +#define PyParser_SimpleParseFile(FP, S, B) \ + PyParser_SimpleParseFileFlags(FP, S, B, 0) +PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlags(const char *, int, + int); +PyAPI_FUNC(struct _node *) PyParser_SimpleParseFileFlags(FILE *, const char *, + int, int); + +PyAPI_FUNC(PyObject *) PyRun_StringFlags(const char *, int, PyObject *, + PyObject *, PyCompilerFlags *); + +PyAPI_FUNC(PyObject *) PyRun_FileExFlags(FILE *, const char *, int, + PyObject *, PyObject *, int, + PyCompilerFlags *); + +#define Py_CompileString(str, p, s) Py_CompileStringFlags(str, p, s, NULL) +PyAPI_FUNC(PyObject *) Py_CompileStringFlags(const char *, const char *, int, + PyCompilerFlags *); +PyAPI_FUNC(struct symtable *) Py_SymtableString(const char *, const char *, int); + +PyAPI_FUNC(void) PyErr_Print(void); +PyAPI_FUNC(void) PyErr_PrintEx(int); +PyAPI_FUNC(void) PyErr_Display(PyObject *, PyObject *, PyObject *); + +PyAPI_FUNC(int) Py_AtExit(void (*func)(void)); + +PyAPI_FUNC(void) Py_Exit(int); + +PyAPI_FUNC(int) Py_FdIsInteractive(FILE *, const char *); + +/* Bootstrap */ +PyAPI_FUNC(int) Py_Main(int argc, char **argv); + +/* Use macros for a bunch of old variants */ +#define PyRun_String(str, s, g, l) PyRun_StringFlags(str, s, g, l, NULL) +#define PyRun_AnyFile(fp, name) PyRun_AnyFileExFlags(fp, name, 0, NULL) +#define PyRun_AnyFileEx(fp, name, closeit) \ + PyRun_AnyFileExFlags(fp, name, closeit, NULL) +#define PyRun_AnyFileFlags(fp, name, flags) \ + PyRun_AnyFileExFlags(fp, name, 0, flags) +#define PyRun_SimpleString(s) PyRun_SimpleStringFlags(s, NULL) +#define PyRun_SimpleFile(f, p) PyRun_SimpleFileExFlags(f, p, 0, NULL) +#define PyRun_SimpleFileEx(f, p, c) PyRun_SimpleFileExFlags(f, p, c, NULL) +#define PyRun_InteractiveOne(f, p) PyRun_InteractiveOneFlags(f, p, NULL) +#define PyRun_InteractiveLoop(f, p) PyRun_InteractiveLoopFlags(f, p, NULL) +#define PyRun_File(fp, p, s, g, l) \ + PyRun_FileExFlags(fp, p, s, g, l, 0, NULL) +#define PyRun_FileEx(fp, p, s, g, l, c) \ + PyRun_FileExFlags(fp, p, s, g, l, c, NULL) +#define PyRun_FileFlags(fp, p, s, g, l, flags) \ + PyRun_FileExFlags(fp, p, s, g, l, 0, flags) + +/* In getpath.c */ +PyAPI_FUNC(char *) Py_GetProgramFullPath(void); +PyAPI_FUNC(char *) Py_GetPrefix(void); +PyAPI_FUNC(char *) Py_GetExecPrefix(void); +PyAPI_FUNC(char *) Py_GetPath(void); + +/* In their own files */ +PyAPI_FUNC(const char *) Py_GetVersion(void); +PyAPI_FUNC(const char *) Py_GetPlatform(void); +PyAPI_FUNC(const char *) Py_GetCopyright(void); +PyAPI_FUNC(const char *) Py_GetCompiler(void); +PyAPI_FUNC(const char *) Py_GetBuildInfo(void); +PyAPI_FUNC(const char *) _Py_svnversion(void); +PyAPI_FUNC(const char *) Py_SubversionRevision(void); +PyAPI_FUNC(const char *) Py_SubversionShortBranch(void); +PyAPI_FUNC(const char *) _Py_hgidentifier(void); +PyAPI_FUNC(const char *) _Py_hgversion(void); + +/* Internal -- various one-time initializations */ +PyAPI_FUNC(PyObject *) _PyBuiltin_Init(void); +PyAPI_FUNC(PyObject *) _PySys_Init(void); +PyAPI_FUNC(void) _PyImport_Init(void); +PyAPI_FUNC(void) _PyExc_Init(void); +PyAPI_FUNC(void) _PyImportHooks_Init(void); +PyAPI_FUNC(int) _PyFrame_Init(void); +PyAPI_FUNC(int) _PyInt_Init(void); +PyAPI_FUNC(int) _PyLong_Init(void); +PyAPI_FUNC(void) _PyFloat_Init(void); +PyAPI_FUNC(int) PyByteArray_Init(void); +PyAPI_FUNC(void) _PyRandom_Init(void); + +/* Various internal finalizers */ +PyAPI_FUNC(void) _PyExc_Fini(void); +PyAPI_FUNC(void) _PyImport_Fini(void); +PyAPI_FUNC(void) PyMethod_Fini(void); +PyAPI_FUNC(void) PyFrame_Fini(void); +PyAPI_FUNC(void) PyCFunction_Fini(void); +PyAPI_FUNC(void) PyDict_Fini(void); +PyAPI_FUNC(void) PyTuple_Fini(void); +PyAPI_FUNC(void) PyList_Fini(void); +PyAPI_FUNC(void) PySet_Fini(void); +PyAPI_FUNC(void) PyString_Fini(void); +PyAPI_FUNC(void) PyInt_Fini(void); +PyAPI_FUNC(void) PyFloat_Fini(void); +PyAPI_FUNC(void) PyOS_FiniInterrupts(void); +PyAPI_FUNC(void) PyByteArray_Fini(void); + +/* Stuff with no proper home (yet) */ +PyAPI_FUNC(char *) PyOS_Readline(FILE *, FILE *, char *); +PyAPI_DATA(int) (*PyOS_InputHook)(void); +PyAPI_DATA(char) *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, char *); +PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState; + +/* Stack size, in "pointers" (so we get extra safety margins + on 64-bit platforms). On a 32-bit platform, this translates + to a 8k margin. */ +#define PYOS_STACK_MARGIN 2048 + +#if defined(WIN32) && !defined(MS_WIN64) && defined(_MSC_VER) && _MSC_VER >= 1300 +/* Enable stack checking under Microsoft C */ +#define USE_STACKCHECK +#endif + +#ifdef USE_STACKCHECK +/* Check that we aren't overflowing our stack */ +PyAPI_FUNC(int) PyOS_CheckStack(void); +#endif + +/* Signals */ +typedef void (*PyOS_sighandler_t)(int); +PyAPI_FUNC(PyOS_sighandler_t) PyOS_getsig(int); +PyAPI_FUNC(PyOS_sighandler_t) PyOS_setsig(int, PyOS_sighandler_t); + +/* Random */ +PyAPI_FUNC(int) _PyOS_URandom (void *buffer, Py_ssize_t size); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYTHONRUN_H */ diff --git a/PythonEnv/2.7/Include/pythread.h b/PythonEnv/2.7/Include/pythread.h new file mode 100644 index 0000000000..dfd61575ea --- /dev/null +++ b/PythonEnv/2.7/Include/pythread.h @@ -0,0 +1,41 @@ + +#ifndef Py_PYTHREAD_H +#define Py_PYTHREAD_H + +typedef void *PyThread_type_lock; +typedef void *PyThread_type_sema; + +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(void) PyThread_init_thread(void); +PyAPI_FUNC(long) PyThread_start_new_thread(void (*)(void *), void *); +PyAPI_FUNC(void) PyThread_exit_thread(void); +PyAPI_FUNC(long) PyThread_get_thread_ident(void); + +PyAPI_FUNC(PyThread_type_lock) PyThread_allocate_lock(void); +PyAPI_FUNC(void) PyThread_free_lock(PyThread_type_lock); +PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int); +#define WAIT_LOCK 1 +#define NOWAIT_LOCK 0 +PyAPI_FUNC(void) PyThread_release_lock(PyThread_type_lock); + +PyAPI_FUNC(size_t) PyThread_get_stacksize(void); +PyAPI_FUNC(int) PyThread_set_stacksize(size_t); + +/* Thread Local Storage (TLS) API */ +PyAPI_FUNC(int) PyThread_create_key(void); +PyAPI_FUNC(void) PyThread_delete_key(int); +PyAPI_FUNC(int) PyThread_set_key_value(int, void *); +PyAPI_FUNC(void *) PyThread_get_key_value(int); +PyAPI_FUNC(void) PyThread_delete_key_value(int key); + +/* Cleanup after a fork */ +PyAPI_FUNC(void) PyThread_ReInitTLS(void); + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYTHREAD_H */ diff --git a/PythonEnv/2.7/Include/rangeobject.h b/PythonEnv/2.7/Include/rangeobject.h new file mode 100644 index 0000000000..36c9cee5a8 --- /dev/null +++ b/PythonEnv/2.7/Include/rangeobject.h @@ -0,0 +1,28 @@ + +/* Range object interface */ + +#ifndef Py_RANGEOBJECT_H +#define Py_RANGEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* This is about the type 'xrange', not the built-in function range(), which + returns regular lists. */ + +/* +A range object represents an integer range. This is an immutable object; +a range cannot change its value after creation. + +Range objects behave like the corresponding tuple objects except that +they are represented by a start, stop, and step datamembers. +*/ + +PyAPI_DATA(PyTypeObject) PyRange_Type; + +#define PyRange_Check(op) (Py_TYPE(op) == &PyRange_Type) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_RANGEOBJECT_H */ diff --git a/PythonEnv/2.7/Include/setobject.h b/PythonEnv/2.7/Include/setobject.h new file mode 100644 index 0000000000..52b07d52df --- /dev/null +++ b/PythonEnv/2.7/Include/setobject.h @@ -0,0 +1,99 @@ +/* Set object interface */ + +#ifndef Py_SETOBJECT_H +#define Py_SETOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* +There are three kinds of slots in the table: + +1. Unused: key == NULL +2. Active: key != NULL and key != dummy +3. Dummy: key == dummy + +Note: .pop() abuses the hash field of an Unused or Dummy slot to +hold a search finger. The hash field of Unused or Dummy slots has +no meaning otherwise. +*/ + +#define PySet_MINSIZE 8 + +typedef struct { + long hash; /* cached hash code for the entry key */ + PyObject *key; +} setentry; + + +/* +This data structure is shared by set and frozenset objects. +*/ + +typedef struct _setobject PySetObject; +struct _setobject { + PyObject_HEAD + + Py_ssize_t fill; /* # Active + # Dummy */ + Py_ssize_t used; /* # Active */ + + /* The table contains mask + 1 slots, and that's a power of 2. + * We store the mask instead of the size because the mask is more + * frequently needed. + */ + Py_ssize_t mask; + + /* table points to smalltable for small tables, else to + * additional malloc'ed memory. table is never NULL! This rule + * saves repeated runtime null-tests. + */ + setentry *table; + setentry *(*lookup)(PySetObject *so, PyObject *key, long hash); + setentry smalltable[PySet_MINSIZE]; + + long hash; /* only used by frozenset objects */ + PyObject *weakreflist; /* List of weak references */ +}; + +PyAPI_DATA(PyTypeObject) PySet_Type; +PyAPI_DATA(PyTypeObject) PyFrozenSet_Type; + +/* Invariants for frozensets: + * data is immutable. + * hash is the hash of the frozenset or -1 if not computed yet. + * Invariants for sets: + * hash is -1 + */ + +#define PyFrozenSet_CheckExact(ob) (Py_TYPE(ob) == &PyFrozenSet_Type) +#define PyAnySet_CheckExact(ob) \ + (Py_TYPE(ob) == &PySet_Type || Py_TYPE(ob) == &PyFrozenSet_Type) +#define PyAnySet_Check(ob) \ + (Py_TYPE(ob) == &PySet_Type || Py_TYPE(ob) == &PyFrozenSet_Type || \ + PyType_IsSubtype(Py_TYPE(ob), &PySet_Type) || \ + PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) +#define PySet_Check(ob) \ + (Py_TYPE(ob) == &PySet_Type || \ + PyType_IsSubtype(Py_TYPE(ob), &PySet_Type)) +#define PyFrozenSet_Check(ob) \ + (Py_TYPE(ob) == &PyFrozenSet_Type || \ + PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) + +PyAPI_FUNC(PyObject *) PySet_New(PyObject *); +PyAPI_FUNC(PyObject *) PyFrozenSet_New(PyObject *); +PyAPI_FUNC(Py_ssize_t) PySet_Size(PyObject *anyset); +#define PySet_GET_SIZE(so) (((PySetObject *)(so))->used) +PyAPI_FUNC(int) PySet_Clear(PyObject *set); +PyAPI_FUNC(int) PySet_Contains(PyObject *anyset, PyObject *key); +PyAPI_FUNC(int) PySet_Discard(PyObject *set, PyObject *key); +PyAPI_FUNC(int) PySet_Add(PyObject *set, PyObject *key); +PyAPI_FUNC(int) _PySet_Next(PyObject *set, Py_ssize_t *pos, PyObject **key); +PyAPI_FUNC(int) _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, long *hash); +PyAPI_FUNC(PyObject *) PySet_Pop(PyObject *set); +PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SETOBJECT_H */ diff --git a/PythonEnv/2.7/Include/sliceobject.h b/PythonEnv/2.7/Include/sliceobject.h new file mode 100644 index 0000000000..8ab62dd4f8 --- /dev/null +++ b/PythonEnv/2.7/Include/sliceobject.h @@ -0,0 +1,44 @@ +#ifndef Py_SLICEOBJECT_H +#define Py_SLICEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* The unique ellipsis object "..." */ + +PyAPI_DATA(PyObject) _Py_EllipsisObject; /* Don't use this directly */ + +#define Py_Ellipsis (&_Py_EllipsisObject) + +/* Slice object interface */ + +/* + +A slice object containing start, stop, and step data members (the +names are from range). After much talk with Guido, it was decided to +let these be any arbitrary python type. Py_None stands for omitted values. +*/ + +typedef struct { + PyObject_HEAD + PyObject *start, *stop, *step; /* not NULL */ +} PySliceObject; + +PyAPI_DATA(PyTypeObject) PySlice_Type; +PyAPI_DATA(PyTypeObject) PyEllipsis_Type; + +#define PySlice_Check(op) (Py_TYPE(op) == &PySlice_Type) + +PyAPI_FUNC(PyObject *) PySlice_New(PyObject* start, PyObject* stop, + PyObject* step); +PyAPI_FUNC(PyObject *) _PySlice_FromIndices(Py_ssize_t start, Py_ssize_t stop); +PyAPI_FUNC(int) PySlice_GetIndices(PySliceObject *r, Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step); +PyAPI_FUNC(int) PySlice_GetIndicesEx(PySliceObject *r, Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, + Py_ssize_t *step, Py_ssize_t *slicelength); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SLICEOBJECT_H */ diff --git a/PythonEnv/2.7/Include/stringobject.h b/PythonEnv/2.7/Include/stringobject.h new file mode 100644 index 0000000000..18b5b411ac --- /dev/null +++ b/PythonEnv/2.7/Include/stringobject.h @@ -0,0 +1,210 @@ + +/* String (str/bytes) object interface */ + +#ifndef Py_STRINGOBJECT_H +#define Py_STRINGOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* +Type PyStringObject represents a character string. An extra zero byte is +reserved at the end to ensure it is zero-terminated, but a size is +present so strings with null bytes in them can be represented. This +is an immutable object type. + +There are functions to create new string objects, to test +an object for string-ness, and to get the +string value. The latter function returns a null pointer +if the object is not of the proper type. +There is a variant that takes an explicit size as well as a +variant that assumes a zero-terminated string. Note that none of the +functions should be applied to nil objects. +*/ + +/* Caching the hash (ob_shash) saves recalculation of a string's hash value. + Interning strings (ob_sstate) tries to ensure that only one string + object with a given value exists, so equality tests can be one pointer + comparison. This is generally restricted to strings that "look like" + Python identifiers, although the intern() builtin can be used to force + interning of any string. + Together, these sped the interpreter by up to 20%. */ + +typedef struct { + PyObject_VAR_HEAD + long ob_shash; + int ob_sstate; + char ob_sval[1]; + + /* Invariants: + * ob_sval contains space for 'ob_size+1' elements. + * ob_sval[ob_size] == 0. + * ob_shash is the hash of the string or -1 if not computed yet. + * ob_sstate != 0 iff the string object is in stringobject.c's + * 'interned' dictionary; in this case the two references + * from 'interned' to this object are *not counted* in ob_refcnt. + */ +} PyStringObject; + +#define SSTATE_NOT_INTERNED 0 +#define SSTATE_INTERNED_MORTAL 1 +#define SSTATE_INTERNED_IMMORTAL 2 + +PyAPI_DATA(PyTypeObject) PyBaseString_Type; +PyAPI_DATA(PyTypeObject) PyString_Type; + +#define PyString_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_STRING_SUBCLASS) +#define PyString_CheckExact(op) (Py_TYPE(op) == &PyString_Type) + +PyAPI_FUNC(PyObject *) PyString_FromStringAndSize(const char *, Py_ssize_t); +PyAPI_FUNC(PyObject *) PyString_FromString(const char *); +PyAPI_FUNC(PyObject *) PyString_FromFormatV(const char*, va_list) + Py_GCC_ATTRIBUTE((format(printf, 1, 0))); +PyAPI_FUNC(PyObject *) PyString_FromFormat(const char*, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(Py_ssize_t) PyString_Size(PyObject *); +PyAPI_FUNC(char *) PyString_AsString(PyObject *); +PyAPI_FUNC(PyObject *) PyString_Repr(PyObject *, int); +PyAPI_FUNC(void) PyString_Concat(PyObject **, PyObject *); +PyAPI_FUNC(void) PyString_ConcatAndDel(PyObject **, PyObject *); +PyAPI_FUNC(int) _PyString_Resize(PyObject **, Py_ssize_t); +PyAPI_FUNC(int) _PyString_Eq(PyObject *, PyObject*); +PyAPI_FUNC(PyObject *) PyString_Format(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) _PyString_FormatLong(PyObject*, int, int, + int, char**, int*); +PyAPI_FUNC(PyObject *) PyString_DecodeEscape(const char *, Py_ssize_t, + const char *, Py_ssize_t, + const char *); + +PyAPI_FUNC(void) PyString_InternInPlace(PyObject **); +PyAPI_FUNC(void) PyString_InternImmortal(PyObject **); +PyAPI_FUNC(PyObject *) PyString_InternFromString(const char *); +PyAPI_FUNC(void) _Py_ReleaseInternedStrings(void); + +/* Use only if you know it's a string */ +#define PyString_CHECK_INTERNED(op) (((PyStringObject *)(op))->ob_sstate) + +/* Macro, trading safety for speed */ +#define PyString_AS_STRING(op) (((PyStringObject *)(op))->ob_sval) +#define PyString_GET_SIZE(op) Py_SIZE(op) + +/* _PyString_Join(sep, x) is like sep.join(x). sep must be PyStringObject*, + x must be an iterable object. */ +PyAPI_FUNC(PyObject *) _PyString_Join(PyObject *sep, PyObject *x); + +/* --- Generic Codecs ----------------------------------------------------- */ + +/* Create an object by decoding the encoded string s of the + given size. */ + +PyAPI_FUNC(PyObject*) PyString_Decode( + const char *s, /* encoded string */ + Py_ssize_t size, /* size of buffer */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Encodes a char buffer of the given size and returns a + Python object. */ + +PyAPI_FUNC(PyObject*) PyString_Encode( + const char *s, /* string char buffer */ + Py_ssize_t size, /* number of chars to encode */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Encodes a string object and returns the result as Python + object. */ + +PyAPI_FUNC(PyObject*) PyString_AsEncodedObject( + PyObject *str, /* string object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Encodes a string object and returns the result as Python string + object. + + If the codec returns an Unicode object, the object is converted + back to a string using the default encoding. + + DEPRECATED - use PyString_AsEncodedObject() instead. */ + +PyAPI_FUNC(PyObject*) PyString_AsEncodedString( + PyObject *str, /* string object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Decodes a string object and returns the result as Python + object. */ + +PyAPI_FUNC(PyObject*) PyString_AsDecodedObject( + PyObject *str, /* string object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Decodes a string object and returns the result as Python string + object. + + If the codec returns an Unicode object, the object is converted + back to a string using the default encoding. + + DEPRECATED - use PyString_AsDecodedObject() instead. */ + +PyAPI_FUNC(PyObject*) PyString_AsDecodedString( + PyObject *str, /* string object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Provides access to the internal data buffer and size of a string + object or the default encoded version of an Unicode object. Passing + NULL as *len parameter will force the string buffer to be + 0-terminated (passing a string with embedded NULL characters will + cause an exception). */ + +PyAPI_FUNC(int) PyString_AsStringAndSize( + register PyObject *obj, /* string or Unicode object */ + register char **s, /* pointer to buffer variable */ + register Py_ssize_t *len /* pointer to length variable or NULL + (only possible for 0-terminated + strings) */ + ); + + +/* Using the current locale, insert the thousands grouping + into the string pointed to by buffer. For the argument descriptions, + see Objects/stringlib/localeutil.h */ +PyAPI_FUNC(Py_ssize_t) _PyString_InsertThousandsGroupingLocale(char *buffer, + Py_ssize_t n_buffer, + char *digits, + Py_ssize_t n_digits, + Py_ssize_t min_width); + +/* Using explicit passed-in values, insert the thousands grouping + into the string pointed to by buffer. For the argument descriptions, + see Objects/stringlib/localeutil.h */ +PyAPI_FUNC(Py_ssize_t) _PyString_InsertThousandsGrouping(char *buffer, + Py_ssize_t n_buffer, + char *digits, + Py_ssize_t n_digits, + Py_ssize_t min_width, + const char *grouping, + const char *thousands_sep); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(PyObject *) _PyBytes_FormatAdvanced(PyObject *obj, + char *format_spec, + Py_ssize_t format_spec_len); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_STRINGOBJECT_H */ diff --git a/PythonEnv/2.7/Include/structmember.h b/PythonEnv/2.7/Include/structmember.h new file mode 100644 index 0000000000..fe5b44ea34 --- /dev/null +++ b/PythonEnv/2.7/Include/structmember.h @@ -0,0 +1,99 @@ +#ifndef Py_STRUCTMEMBER_H +#define Py_STRUCTMEMBER_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Interface to map C struct members to Python object attributes */ + +#include /* For offsetof */ + +/* The offsetof() macro calculates the offset of a structure member + in its structure. Unfortunately this cannot be written down + portably, hence it is provided by a Standard C header file. + For pre-Standard C compilers, here is a version that usually works + (but watch out!): */ + +#ifndef offsetof +#define offsetof(type, member) ( (int) & ((type*)0) -> member ) +#endif + +/* An array of memberlist structures defines the name, type and offset + of selected members of a C structure. These can be read by + PyMember_Get() and set by PyMember_Set() (except if their READONLY flag + is set). The array must be terminated with an entry whose name + pointer is NULL. */ + +struct memberlist { + /* Obsolete version, for binary backwards compatibility */ + char *name; + int type; + int offset; + int flags; +}; + +typedef struct PyMemberDef { + /* Current version, use this */ + char *name; + int type; + Py_ssize_t offset; + int flags; + char *doc; +} PyMemberDef; + +/* Types */ +#define T_SHORT 0 +#define T_INT 1 +#define T_LONG 2 +#define T_FLOAT 3 +#define T_DOUBLE 4 +#define T_STRING 5 +#define T_OBJECT 6 +/* XXX the ordering here is weird for binary compatibility */ +#define T_CHAR 7 /* 1-character string */ +#define T_BYTE 8 /* 8-bit signed int */ +/* unsigned variants: */ +#define T_UBYTE 9 +#define T_USHORT 10 +#define T_UINT 11 +#define T_ULONG 12 + +/* Added by Jack: strings contained in the structure */ +#define T_STRING_INPLACE 13 + +/* Added by Lillo: bools contained in the structure (assumed char) */ +#define T_BOOL 14 + +#define T_OBJECT_EX 16 /* Like T_OBJECT, but raises AttributeError + when the value is NULL, instead of + converting to None. */ +#ifdef HAVE_LONG_LONG +#define T_LONGLONG 17 +#define T_ULONGLONG 18 +#endif /* HAVE_LONG_LONG */ + +#define T_PYSSIZET 19 /* Py_ssize_t */ + + +/* Flags */ +#define READONLY 1 +#define RO READONLY /* Shorthand */ +#define READ_RESTRICTED 2 +#define PY_WRITE_RESTRICTED 4 +#define RESTRICTED (READ_RESTRICTED | PY_WRITE_RESTRICTED) + + +/* Obsolete API, for binary backwards compatibility */ +PyAPI_FUNC(PyObject *) PyMember_Get(const char *, struct memberlist *, const char *); +PyAPI_FUNC(int) PyMember_Set(char *, struct memberlist *, const char *, PyObject *); + +/* Current API, use this */ +PyAPI_FUNC(PyObject *) PyMember_GetOne(const char *, struct PyMemberDef *); +PyAPI_FUNC(int) PyMember_SetOne(char *, struct PyMemberDef *, PyObject *); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_STRUCTMEMBER_H */ diff --git a/PythonEnv/2.7/Include/structseq.h b/PythonEnv/2.7/Include/structseq.h new file mode 100644 index 0000000000..e662916fe4 --- /dev/null +++ b/PythonEnv/2.7/Include/structseq.h @@ -0,0 +1,41 @@ + +/* Tuple object interface */ + +#ifndef Py_STRUCTSEQ_H +#define Py_STRUCTSEQ_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct PyStructSequence_Field { + char *name; + char *doc; +} PyStructSequence_Field; + +typedef struct PyStructSequence_Desc { + char *name; + char *doc; + struct PyStructSequence_Field *fields; + int n_in_sequence; +} PyStructSequence_Desc; + +extern char* PyStructSequence_UnnamedField; + +PyAPI_FUNC(void) PyStructSequence_InitType(PyTypeObject *type, + PyStructSequence_Desc *desc); + +PyAPI_FUNC(PyObject *) PyStructSequence_New(PyTypeObject* type); + +typedef struct { + PyObject_VAR_HEAD + PyObject *ob_item[1]; +} PyStructSequence; + +/* Macro, *only* to be used to fill in brand new objects */ +#define PyStructSequence_SET_ITEM(op, i, v) \ + (((PyStructSequence *)(op))->ob_item[i] = v) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_STRUCTSEQ_H */ diff --git a/PythonEnv/2.7/Include/symtable.h b/PythonEnv/2.7/Include/symtable.h new file mode 100644 index 0000000000..e0a0be41b5 --- /dev/null +++ b/PythonEnv/2.7/Include/symtable.h @@ -0,0 +1,98 @@ +#ifndef Py_SYMTABLE_H +#define Py_SYMTABLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum _block_type { FunctionBlock, ClassBlock, ModuleBlock } + _Py_block_ty; + +struct _symtable_entry; + +struct symtable { + const char *st_filename; /* name of file being compiled */ + struct _symtable_entry *st_cur; /* current symbol table entry */ + struct _symtable_entry *st_top; /* module entry */ + PyObject *st_symbols; /* dictionary of symbol table entries */ + PyObject *st_stack; /* stack of namespace info */ + PyObject *st_global; /* borrowed ref to MODULE in st_symbols */ + int st_nblocks; /* number of blocks */ + PyObject *st_private; /* name of current class or NULL */ + PyFutureFeatures *st_future; /* module's future features */ +}; + +typedef struct _symtable_entry { + PyObject_HEAD + PyObject *ste_id; /* int: key in st_symbols */ + PyObject *ste_symbols; /* dict: name to flags */ + PyObject *ste_name; /* string: name of block */ + PyObject *ste_varnames; /* list of variable names */ + PyObject *ste_children; /* list of child ids */ + _Py_block_ty ste_type; /* module, class, or function */ + int ste_unoptimized; /* false if namespace is optimized */ + int ste_nested; /* true if block is nested */ + unsigned ste_free : 1; /* true if block has free variables */ + unsigned ste_child_free : 1; /* true if a child block has free vars, + including free refs to globals */ + unsigned ste_generator : 1; /* true if namespace is a generator */ + unsigned ste_varargs : 1; /* true if block has varargs */ + unsigned ste_varkeywords : 1; /* true if block has varkeywords */ + unsigned ste_returns_value : 1; /* true if namespace uses return with + an argument */ + int ste_lineno; /* first line of block */ + int ste_opt_lineno; /* lineno of last exec or import * */ + int ste_tmpname; /* counter for listcomp temp vars */ + struct symtable *ste_table; +} PySTEntryObject; + +PyAPI_DATA(PyTypeObject) PySTEntry_Type; + +#define PySTEntry_Check(op) (Py_TYPE(op) == &PySTEntry_Type) + +PyAPI_FUNC(int) PyST_GetScope(PySTEntryObject *, PyObject *); + +PyAPI_FUNC(struct symtable *) PySymtable_Build(mod_ty, const char *, + PyFutureFeatures *); +PyAPI_FUNC(PySTEntryObject *) PySymtable_Lookup(struct symtable *, void *); + +PyAPI_FUNC(void) PySymtable_Free(struct symtable *); + +/* Flags for def-use information */ + +#define DEF_GLOBAL 1 /* global stmt */ +#define DEF_LOCAL 2 /* assignment in code block */ +#define DEF_PARAM 2<<1 /* formal parameter */ +#define USE 2<<2 /* name is used */ +#define DEF_FREE 2<<3 /* name used but not defined in nested block */ +#define DEF_FREE_CLASS 2<<4 /* free variable from class's method */ +#define DEF_IMPORT 2<<5 /* assignment occurred via import */ + +#define DEF_BOUND (DEF_LOCAL | DEF_PARAM | DEF_IMPORT) + +/* GLOBAL_EXPLICIT and GLOBAL_IMPLICIT are used internally by the symbol + table. GLOBAL is returned from PyST_GetScope() for either of them. + It is stored in ste_symbols at bits 12-14. +*/ +#define SCOPE_OFF 11 +#define SCOPE_MASK 7 + +#define LOCAL 1 +#define GLOBAL_EXPLICIT 2 +#define GLOBAL_IMPLICIT 3 +#define FREE 4 +#define CELL 5 + +/* The following three names are used for the ste_unoptimized bit field */ +#define OPT_IMPORT_STAR 1 +#define OPT_EXEC 2 +#define OPT_BARE_EXEC 4 +#define OPT_TOPLEVEL 8 /* top-level names, including eval and exec */ + +#define GENERATOR 1 +#define GENERATOR_EXPRESSION 2 + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SYMTABLE_H */ diff --git a/PythonEnv/2.7/Include/sysmodule.h b/PythonEnv/2.7/Include/sysmodule.h new file mode 100644 index 0000000000..bf962b5a88 --- /dev/null +++ b/PythonEnv/2.7/Include/sysmodule.h @@ -0,0 +1,29 @@ + +/* System module interface */ + +#ifndef Py_SYSMODULE_H +#define Py_SYSMODULE_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(PyObject *) PySys_GetObject(char *); +PyAPI_FUNC(int) PySys_SetObject(char *, PyObject *); +PyAPI_FUNC(FILE *) PySys_GetFile(char *, FILE *); +PyAPI_FUNC(void) PySys_SetArgv(int, char **); +PyAPI_FUNC(void) PySys_SetArgvEx(int, char **, int); +PyAPI_FUNC(void) PySys_SetPath(char *); + +PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(void) PySys_WriteStderr(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); + +PyAPI_FUNC(void) PySys_ResetWarnOptions(void); +PyAPI_FUNC(void) PySys_AddWarnOption(char *); +PyAPI_FUNC(int) PySys_HasWarnOptions(void); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SYSMODULE_H */ diff --git a/PythonEnv/2.7/Include/timefuncs.h b/PythonEnv/2.7/Include/timefuncs.h new file mode 100644 index 0000000000..a9d26a77a1 --- /dev/null +++ b/PythonEnv/2.7/Include/timefuncs.h @@ -0,0 +1,26 @@ +/* timefuncs.h + */ + +/* Utility function related to timemodule.c. */ + +#ifndef TIMEFUNCS_H +#define TIMEFUNCS_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Cast double x to time_t, but raise ValueError if x is too large + * to fit in a time_t. ValueError is set on return iff the return + * value is (time_t)-1 and PyErr_Occurred(). + */ +PyAPI_FUNC(time_t) _PyTime_DoubleToTimet(double x); + +/* Get the current time since the epoch in seconds */ +PyAPI_FUNC(double) _PyTime_FloatTime(void); + + +#ifdef __cplusplus +} +#endif +#endif /* TIMEFUNCS_H */ diff --git a/PythonEnv/2.7/Include/token.h b/PythonEnv/2.7/Include/token.h new file mode 100644 index 0000000000..72659ac053 --- /dev/null +++ b/PythonEnv/2.7/Include/token.h @@ -0,0 +1,85 @@ + +/* Token types */ + +#ifndef Py_TOKEN_H +#define Py_TOKEN_H +#ifdef __cplusplus +extern "C" { +#endif + +#undef TILDE /* Prevent clash of our definition with system macro. Ex AIX, ioctl.h */ + +#define ENDMARKER 0 +#define NAME 1 +#define NUMBER 2 +#define STRING 3 +#define NEWLINE 4 +#define INDENT 5 +#define DEDENT 6 +#define LPAR 7 +#define RPAR 8 +#define LSQB 9 +#define RSQB 10 +#define COLON 11 +#define COMMA 12 +#define SEMI 13 +#define PLUS 14 +#define MINUS 15 +#define STAR 16 +#define SLASH 17 +#define VBAR 18 +#define AMPER 19 +#define LESS 20 +#define GREATER 21 +#define EQUAL 22 +#define DOT 23 +#define PERCENT 24 +#define BACKQUOTE 25 +#define LBRACE 26 +#define RBRACE 27 +#define EQEQUAL 28 +#define NOTEQUAL 29 +#define LESSEQUAL 30 +#define GREATEREQUAL 31 +#define TILDE 32 +#define CIRCUMFLEX 33 +#define LEFTSHIFT 34 +#define RIGHTSHIFT 35 +#define DOUBLESTAR 36 +#define PLUSEQUAL 37 +#define MINEQUAL 38 +#define STAREQUAL 39 +#define SLASHEQUAL 40 +#define PERCENTEQUAL 41 +#define AMPEREQUAL 42 +#define VBAREQUAL 43 +#define CIRCUMFLEXEQUAL 44 +#define LEFTSHIFTEQUAL 45 +#define RIGHTSHIFTEQUAL 46 +#define DOUBLESTAREQUAL 47 +#define DOUBLESLASH 48 +#define DOUBLESLASHEQUAL 49 +#define AT 50 +/* Don't forget to update the table _PyParser_TokenNames in tokenizer.c! */ +#define OP 51 +#define ERRORTOKEN 52 +#define N_TOKENS 53 + +/* Special definitions for cooperation with parser */ + +#define NT_OFFSET 256 + +#define ISTERMINAL(x) ((x) < NT_OFFSET) +#define ISNONTERMINAL(x) ((x) >= NT_OFFSET) +#define ISEOF(x) ((x) == ENDMARKER) + + +PyAPI_DATA(char *) _PyParser_TokenNames[]; /* Token names */ +PyAPI_FUNC(int) PyToken_OneChar(int); +PyAPI_FUNC(int) PyToken_TwoChars(int, int); +PyAPI_FUNC(int) PyToken_ThreeChars(int, int, int); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TOKEN_H */ diff --git a/PythonEnv/2.7/Include/traceback.h b/PythonEnv/2.7/Include/traceback.h new file mode 100644 index 0000000000..e7943dae96 --- /dev/null +++ b/PythonEnv/2.7/Include/traceback.h @@ -0,0 +1,31 @@ + +#ifndef Py_TRACEBACK_H +#define Py_TRACEBACK_H +#ifdef __cplusplus +extern "C" { +#endif + +struct _frame; + +/* Traceback interface */ + +typedef struct _traceback { + PyObject_HEAD + struct _traceback *tb_next; + struct _frame *tb_frame; + int tb_lasti; + int tb_lineno; +} PyTracebackObject; + +PyAPI_FUNC(int) PyTraceBack_Here(struct _frame *); +PyAPI_FUNC(int) PyTraceBack_Print(PyObject *, PyObject *); +PyAPI_FUNC(int) _Py_DisplaySourceLine(PyObject *, const char *, int, int); + +/* Reveal traceback type so we can typecheck traceback objects */ +PyAPI_DATA(PyTypeObject) PyTraceBack_Type; +#define PyTraceBack_Check(v) (Py_TYPE(v) == &PyTraceBack_Type) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TRACEBACK_H */ diff --git a/PythonEnv/2.7/Include/tupleobject.h b/PythonEnv/2.7/Include/tupleobject.h new file mode 100644 index 0000000000..a5ab733208 --- /dev/null +++ b/PythonEnv/2.7/Include/tupleobject.h @@ -0,0 +1,61 @@ + +/* Tuple object interface */ + +#ifndef Py_TUPLEOBJECT_H +#define Py_TUPLEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* +Another generally useful object type is a tuple of object pointers. +For Python, this is an immutable type. C code can change the tuple items +(but not their number), and even use tuples are general-purpose arrays of +object references, but in general only brand new tuples should be mutated, +not ones that might already have been exposed to Python code. + +*** WARNING *** PyTuple_SetItem does not increment the new item's reference +count, but does decrement the reference count of the item it replaces, +if not nil. It does *decrement* the reference count if it is *not* +inserted in the tuple. Similarly, PyTuple_GetItem does not increment the +returned item's reference count. +*/ + +typedef struct { + PyObject_VAR_HEAD + PyObject *ob_item[1]; + + /* ob_item contains space for 'ob_size' elements. + * Items must normally not be NULL, except during construction when + * the tuple is not yet visible outside the function that builds it. + */ +} PyTupleObject; + +PyAPI_DATA(PyTypeObject) PyTuple_Type; + +#define PyTuple_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TUPLE_SUBCLASS) +#define PyTuple_CheckExact(op) (Py_TYPE(op) == &PyTuple_Type) + +PyAPI_FUNC(PyObject *) PyTuple_New(Py_ssize_t size); +PyAPI_FUNC(Py_ssize_t) PyTuple_Size(PyObject *); +PyAPI_FUNC(PyObject *) PyTuple_GetItem(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyTuple_SetItem(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(PyObject *) PyTuple_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); +PyAPI_FUNC(int) _PyTuple_Resize(PyObject **, Py_ssize_t); +PyAPI_FUNC(PyObject *) PyTuple_Pack(Py_ssize_t, ...); +PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *); + +/* Macro, trading safety for speed */ +#define PyTuple_GET_ITEM(op, i) (((PyTupleObject *)(op))->ob_item[i]) +#define PyTuple_GET_SIZE(op) Py_SIZE(op) + +/* Macro, *only* to be used to fill in brand new tuples */ +#define PyTuple_SET_ITEM(op, i, v) (((PyTupleObject *)(op))->ob_item[i] = v) + +PyAPI_FUNC(int) PyTuple_ClearFreeList(void); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TUPLEOBJECT_H */ diff --git a/PythonEnv/2.7/Include/ucnhash.h b/PythonEnv/2.7/Include/ucnhash.h new file mode 100644 index 0000000000..69b7774a97 --- /dev/null +++ b/PythonEnv/2.7/Include/ucnhash.h @@ -0,0 +1,33 @@ +/* Unicode name database interface */ + +#ifndef Py_UCNHASH_H +#define Py_UCNHASH_H +#ifdef __cplusplus +extern "C" { +#endif + +/* revised ucnhash CAPI interface (exported through a "wrapper") */ + +#define PyUnicodeData_CAPSULE_NAME "unicodedata.ucnhash_CAPI" + +typedef struct { + + /* Size of this struct */ + int size; + + /* Get name for a given character code. Returns non-zero if + success, zero if not. Does not set Python exceptions. + If self is NULL, data come from the default version of the database. + If it is not NULL, it should be a unicodedata.ucd_X_Y_Z object */ + int (*getname)(PyObject *self, Py_UCS4 code, char* buffer, int buflen); + + /* Get character code for a given name. Same error handling + as for getname. */ + int (*getcode)(PyObject *self, const char* name, int namelen, Py_UCS4* code); + +} _PyUnicode_Name_CAPI; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_UCNHASH_H */ diff --git a/PythonEnv/2.7/Include/unicodeobject.h b/PythonEnv/2.7/Include/unicodeobject.h new file mode 100644 index 0000000000..9ab724aa6e --- /dev/null +++ b/PythonEnv/2.7/Include/unicodeobject.h @@ -0,0 +1,1413 @@ +#ifndef Py_UNICODEOBJECT_H +#define Py_UNICODEOBJECT_H + +#include + +/* + +Unicode implementation based on original code by Fredrik Lundh, +modified by Marc-Andre Lemburg (mal@lemburg.com) according to the +Unicode Integration Proposal (see file Misc/unicode.txt). + +Copyright (c) Corporation for National Research Initiatives. + + + Original header: + -------------------------------------------------------------------- + + * Yet another Unicode string type for Python. This type supports the + * 16-bit Basic Multilingual Plane (BMP) only. + * + * Written by Fredrik Lundh, January 1999. + * + * Copyright (c) 1999 by Secret Labs AB. + * Copyright (c) 1999 by Fredrik Lundh. + * + * fredrik@pythonware.com + * http://www.pythonware.com + * + * -------------------------------------------------------------------- + * This Unicode String Type is + * + * Copyright (c) 1999 by Secret Labs AB + * Copyright (c) 1999 by Fredrik Lundh + * + * By obtaining, using, and/or copying this software and/or its + * associated documentation, you agree that you have read, understood, + * and will comply with the following terms and conditions: + * + * Permission to use, copy, modify, and distribute this software and its + * associated documentation for any purpose and without fee is hereby + * granted, provided that the above copyright notice appears in all + * copies, and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of Secret Labs + * AB or the author not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. + * + * SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * -------------------------------------------------------------------- */ + +#include + +/* === Internal API ======================================================= */ + +/* --- Internal Unicode Format -------------------------------------------- */ + +#ifndef Py_USING_UNICODE + +#define PyUnicode_Check(op) 0 +#define PyUnicode_CheckExact(op) 0 + +#else + +/* FIXME: MvL's new implementation assumes that Py_UNICODE_SIZE is + properly set, but the default rules below doesn't set it. I'll + sort this out some other day -- fredrik@pythonware.com */ + +#ifndef Py_UNICODE_SIZE +#error Must define Py_UNICODE_SIZE +#endif + +/* Setting Py_UNICODE_WIDE enables UCS-4 storage. Otherwise, Unicode + strings are stored as UCS-2 (with limited support for UTF-16) */ + +#if Py_UNICODE_SIZE >= 4 +#define Py_UNICODE_WIDE +#endif + +/* Set these flags if the platform has "wchar.h", "wctype.h" and the + wchar_t type is a 16-bit unsigned type */ +/* #define HAVE_WCHAR_H */ +/* #define HAVE_USABLE_WCHAR_T */ + +/* Defaults for various platforms */ +#ifndef PY_UNICODE_TYPE + +/* Windows has a usable wchar_t type (unless we're using UCS-4) */ +# if defined(MS_WIN32) && Py_UNICODE_SIZE == 2 +# define HAVE_USABLE_WCHAR_T +# define PY_UNICODE_TYPE wchar_t +# endif + +# if defined(Py_UNICODE_WIDE) +# define PY_UNICODE_TYPE Py_UCS4 +# endif + +#endif + +/* If the compiler provides a wchar_t type we try to support it + through the interface functions PyUnicode_FromWideChar() and + PyUnicode_AsWideChar(). */ + +#ifdef HAVE_USABLE_WCHAR_T +# ifndef HAVE_WCHAR_H +# define HAVE_WCHAR_H +# endif +#endif + +#ifdef HAVE_WCHAR_H +/* Work around a cosmetic bug in BSDI 4.x wchar.h; thanks to Thomas Wouters */ +# ifdef _HAVE_BSDI +# include +# endif +# include +#endif + +/* + * Use this typedef when you need to represent a UTF-16 surrogate pair + * as single unsigned integer. + */ +#if SIZEOF_INT >= 4 +typedef unsigned int Py_UCS4; +#elif SIZEOF_LONG >= 4 +typedef unsigned long Py_UCS4; +#endif + +/* Py_UNICODE is the native Unicode storage format (code unit) used by + Python and represents a single Unicode element in the Unicode + type. */ + +typedef PY_UNICODE_TYPE Py_UNICODE; + +/* --- UCS-2/UCS-4 Name Mangling ------------------------------------------ */ + +/* Unicode API names are mangled to assure that UCS-2 and UCS-4 builds + produce different external names and thus cause import errors in + case Python interpreters and extensions with mixed compiled in + Unicode width assumptions are combined. */ + +#ifndef Py_UNICODE_WIDE + +# define PyUnicode_AsASCIIString PyUnicodeUCS2_AsASCIIString +# define PyUnicode_AsCharmapString PyUnicodeUCS2_AsCharmapString +# define PyUnicode_AsEncodedObject PyUnicodeUCS2_AsEncodedObject +# define PyUnicode_AsEncodedString PyUnicodeUCS2_AsEncodedString +# define PyUnicode_AsLatin1String PyUnicodeUCS2_AsLatin1String +# define PyUnicode_AsRawUnicodeEscapeString PyUnicodeUCS2_AsRawUnicodeEscapeString +# define PyUnicode_AsUTF32String PyUnicodeUCS2_AsUTF32String +# define PyUnicode_AsUTF16String PyUnicodeUCS2_AsUTF16String +# define PyUnicode_AsUTF8String PyUnicodeUCS2_AsUTF8String +# define PyUnicode_AsUnicode PyUnicodeUCS2_AsUnicode +# define PyUnicode_AsUnicodeEscapeString PyUnicodeUCS2_AsUnicodeEscapeString +# define PyUnicode_AsWideChar PyUnicodeUCS2_AsWideChar +# define PyUnicode_ClearFreeList PyUnicodeUCS2_ClearFreelist +# define PyUnicode_Compare PyUnicodeUCS2_Compare +# define PyUnicode_Concat PyUnicodeUCS2_Concat +# define PyUnicode_Contains PyUnicodeUCS2_Contains +# define PyUnicode_Count PyUnicodeUCS2_Count +# define PyUnicode_Decode PyUnicodeUCS2_Decode +# define PyUnicode_DecodeASCII PyUnicodeUCS2_DecodeASCII +# define PyUnicode_DecodeCharmap PyUnicodeUCS2_DecodeCharmap +# define PyUnicode_DecodeLatin1 PyUnicodeUCS2_DecodeLatin1 +# define PyUnicode_DecodeRawUnicodeEscape PyUnicodeUCS2_DecodeRawUnicodeEscape +# define PyUnicode_DecodeUTF32 PyUnicodeUCS2_DecodeUTF32 +# define PyUnicode_DecodeUTF32Stateful PyUnicodeUCS2_DecodeUTF32Stateful +# define PyUnicode_DecodeUTF16 PyUnicodeUCS2_DecodeUTF16 +# define PyUnicode_DecodeUTF16Stateful PyUnicodeUCS2_DecodeUTF16Stateful +# define PyUnicode_DecodeUTF8 PyUnicodeUCS2_DecodeUTF8 +# define PyUnicode_DecodeUTF8Stateful PyUnicodeUCS2_DecodeUTF8Stateful +# define PyUnicode_DecodeUnicodeEscape PyUnicodeUCS2_DecodeUnicodeEscape +# define PyUnicode_Encode PyUnicodeUCS2_Encode +# define PyUnicode_EncodeASCII PyUnicodeUCS2_EncodeASCII +# define PyUnicode_EncodeCharmap PyUnicodeUCS2_EncodeCharmap +# define PyUnicode_EncodeDecimal PyUnicodeUCS2_EncodeDecimal +# define PyUnicode_EncodeLatin1 PyUnicodeUCS2_EncodeLatin1 +# define PyUnicode_EncodeRawUnicodeEscape PyUnicodeUCS2_EncodeRawUnicodeEscape +# define PyUnicode_EncodeUTF32 PyUnicodeUCS2_EncodeUTF32 +# define PyUnicode_EncodeUTF16 PyUnicodeUCS2_EncodeUTF16 +# define PyUnicode_EncodeUTF8 PyUnicodeUCS2_EncodeUTF8 +# define PyUnicode_EncodeUnicodeEscape PyUnicodeUCS2_EncodeUnicodeEscape +# define PyUnicode_Find PyUnicodeUCS2_Find +# define PyUnicode_Format PyUnicodeUCS2_Format +# define PyUnicode_FromEncodedObject PyUnicodeUCS2_FromEncodedObject +# define PyUnicode_FromFormat PyUnicodeUCS2_FromFormat +# define PyUnicode_FromFormatV PyUnicodeUCS2_FromFormatV +# define PyUnicode_FromObject PyUnicodeUCS2_FromObject +# define PyUnicode_FromOrdinal PyUnicodeUCS2_FromOrdinal +# define PyUnicode_FromString PyUnicodeUCS2_FromString +# define PyUnicode_FromStringAndSize PyUnicodeUCS2_FromStringAndSize +# define PyUnicode_FromUnicode PyUnicodeUCS2_FromUnicode +# define PyUnicode_FromWideChar PyUnicodeUCS2_FromWideChar +# define PyUnicode_GetDefaultEncoding PyUnicodeUCS2_GetDefaultEncoding +# define PyUnicode_GetMax PyUnicodeUCS2_GetMax +# define PyUnicode_GetSize PyUnicodeUCS2_GetSize +# define PyUnicode_Join PyUnicodeUCS2_Join +# define PyUnicode_Partition PyUnicodeUCS2_Partition +# define PyUnicode_RPartition PyUnicodeUCS2_RPartition +# define PyUnicode_RSplit PyUnicodeUCS2_RSplit +# define PyUnicode_Replace PyUnicodeUCS2_Replace +# define PyUnicode_Resize PyUnicodeUCS2_Resize +# define PyUnicode_RichCompare PyUnicodeUCS2_RichCompare +# define PyUnicode_SetDefaultEncoding PyUnicodeUCS2_SetDefaultEncoding +# define PyUnicode_Split PyUnicodeUCS2_Split +# define PyUnicode_Splitlines PyUnicodeUCS2_Splitlines +# define PyUnicode_Tailmatch PyUnicodeUCS2_Tailmatch +# define PyUnicode_Translate PyUnicodeUCS2_Translate +# define PyUnicode_TranslateCharmap PyUnicodeUCS2_TranslateCharmap +# define _PyUnicode_AsDefaultEncodedString _PyUnicodeUCS2_AsDefaultEncodedString +# define _PyUnicode_Fini _PyUnicodeUCS2_Fini +# define _PyUnicode_Init _PyUnicodeUCS2_Init +# define _PyUnicode_IsAlpha _PyUnicodeUCS2_IsAlpha +# define _PyUnicode_IsDecimalDigit _PyUnicodeUCS2_IsDecimalDigit +# define _PyUnicode_IsDigit _PyUnicodeUCS2_IsDigit +# define _PyUnicode_IsLinebreak _PyUnicodeUCS2_IsLinebreak +# define _PyUnicode_IsLowercase _PyUnicodeUCS2_IsLowercase +# define _PyUnicode_IsNumeric _PyUnicodeUCS2_IsNumeric +# define _PyUnicode_IsTitlecase _PyUnicodeUCS2_IsTitlecase +# define _PyUnicode_IsUppercase _PyUnicodeUCS2_IsUppercase +# define _PyUnicode_IsWhitespace _PyUnicodeUCS2_IsWhitespace +# define _PyUnicode_ToDecimalDigit _PyUnicodeUCS2_ToDecimalDigit +# define _PyUnicode_ToDigit _PyUnicodeUCS2_ToDigit +# define _PyUnicode_ToLowercase _PyUnicodeUCS2_ToLowercase +# define _PyUnicode_ToNumeric _PyUnicodeUCS2_ToNumeric +# define _PyUnicode_ToTitlecase _PyUnicodeUCS2_ToTitlecase +# define _PyUnicode_ToUppercase _PyUnicodeUCS2_ToUppercase + +#else + +# define PyUnicode_AsASCIIString PyUnicodeUCS4_AsASCIIString +# define PyUnicode_AsCharmapString PyUnicodeUCS4_AsCharmapString +# define PyUnicode_AsEncodedObject PyUnicodeUCS4_AsEncodedObject +# define PyUnicode_AsEncodedString PyUnicodeUCS4_AsEncodedString +# define PyUnicode_AsLatin1String PyUnicodeUCS4_AsLatin1String +# define PyUnicode_AsRawUnicodeEscapeString PyUnicodeUCS4_AsRawUnicodeEscapeString +# define PyUnicode_AsUTF32String PyUnicodeUCS4_AsUTF32String +# define PyUnicode_AsUTF16String PyUnicodeUCS4_AsUTF16String +# define PyUnicode_AsUTF8String PyUnicodeUCS4_AsUTF8String +# define PyUnicode_AsUnicode PyUnicodeUCS4_AsUnicode +# define PyUnicode_AsUnicodeEscapeString PyUnicodeUCS4_AsUnicodeEscapeString +# define PyUnicode_AsWideChar PyUnicodeUCS4_AsWideChar +# define PyUnicode_ClearFreeList PyUnicodeUCS4_ClearFreelist +# define PyUnicode_Compare PyUnicodeUCS4_Compare +# define PyUnicode_Concat PyUnicodeUCS4_Concat +# define PyUnicode_Contains PyUnicodeUCS4_Contains +# define PyUnicode_Count PyUnicodeUCS4_Count +# define PyUnicode_Decode PyUnicodeUCS4_Decode +# define PyUnicode_DecodeASCII PyUnicodeUCS4_DecodeASCII +# define PyUnicode_DecodeCharmap PyUnicodeUCS4_DecodeCharmap +# define PyUnicode_DecodeLatin1 PyUnicodeUCS4_DecodeLatin1 +# define PyUnicode_DecodeRawUnicodeEscape PyUnicodeUCS4_DecodeRawUnicodeEscape +# define PyUnicode_DecodeUTF32 PyUnicodeUCS4_DecodeUTF32 +# define PyUnicode_DecodeUTF32Stateful PyUnicodeUCS4_DecodeUTF32Stateful +# define PyUnicode_DecodeUTF16 PyUnicodeUCS4_DecodeUTF16 +# define PyUnicode_DecodeUTF16Stateful PyUnicodeUCS4_DecodeUTF16Stateful +# define PyUnicode_DecodeUTF8 PyUnicodeUCS4_DecodeUTF8 +# define PyUnicode_DecodeUTF8Stateful PyUnicodeUCS4_DecodeUTF8Stateful +# define PyUnicode_DecodeUnicodeEscape PyUnicodeUCS4_DecodeUnicodeEscape +# define PyUnicode_Encode PyUnicodeUCS4_Encode +# define PyUnicode_EncodeASCII PyUnicodeUCS4_EncodeASCII +# define PyUnicode_EncodeCharmap PyUnicodeUCS4_EncodeCharmap +# define PyUnicode_EncodeDecimal PyUnicodeUCS4_EncodeDecimal +# define PyUnicode_EncodeLatin1 PyUnicodeUCS4_EncodeLatin1 +# define PyUnicode_EncodeRawUnicodeEscape PyUnicodeUCS4_EncodeRawUnicodeEscape +# define PyUnicode_EncodeUTF32 PyUnicodeUCS4_EncodeUTF32 +# define PyUnicode_EncodeUTF16 PyUnicodeUCS4_EncodeUTF16 +# define PyUnicode_EncodeUTF8 PyUnicodeUCS4_EncodeUTF8 +# define PyUnicode_EncodeUnicodeEscape PyUnicodeUCS4_EncodeUnicodeEscape +# define PyUnicode_Find PyUnicodeUCS4_Find +# define PyUnicode_Format PyUnicodeUCS4_Format +# define PyUnicode_FromEncodedObject PyUnicodeUCS4_FromEncodedObject +# define PyUnicode_FromFormat PyUnicodeUCS4_FromFormat +# define PyUnicode_FromFormatV PyUnicodeUCS4_FromFormatV +# define PyUnicode_FromObject PyUnicodeUCS4_FromObject +# define PyUnicode_FromOrdinal PyUnicodeUCS4_FromOrdinal +# define PyUnicode_FromString PyUnicodeUCS4_FromString +# define PyUnicode_FromStringAndSize PyUnicodeUCS4_FromStringAndSize +# define PyUnicode_FromUnicode PyUnicodeUCS4_FromUnicode +# define PyUnicode_FromWideChar PyUnicodeUCS4_FromWideChar +# define PyUnicode_GetDefaultEncoding PyUnicodeUCS4_GetDefaultEncoding +# define PyUnicode_GetMax PyUnicodeUCS4_GetMax +# define PyUnicode_GetSize PyUnicodeUCS4_GetSize +# define PyUnicode_Join PyUnicodeUCS4_Join +# define PyUnicode_Partition PyUnicodeUCS4_Partition +# define PyUnicode_RPartition PyUnicodeUCS4_RPartition +# define PyUnicode_RSplit PyUnicodeUCS4_RSplit +# define PyUnicode_Replace PyUnicodeUCS4_Replace +# define PyUnicode_Resize PyUnicodeUCS4_Resize +# define PyUnicode_RichCompare PyUnicodeUCS4_RichCompare +# define PyUnicode_SetDefaultEncoding PyUnicodeUCS4_SetDefaultEncoding +# define PyUnicode_Split PyUnicodeUCS4_Split +# define PyUnicode_Splitlines PyUnicodeUCS4_Splitlines +# define PyUnicode_Tailmatch PyUnicodeUCS4_Tailmatch +# define PyUnicode_Translate PyUnicodeUCS4_Translate +# define PyUnicode_TranslateCharmap PyUnicodeUCS4_TranslateCharmap +# define _PyUnicode_AsDefaultEncodedString _PyUnicodeUCS4_AsDefaultEncodedString +# define _PyUnicode_Fini _PyUnicodeUCS4_Fini +# define _PyUnicode_Init _PyUnicodeUCS4_Init +# define _PyUnicode_IsAlpha _PyUnicodeUCS4_IsAlpha +# define _PyUnicode_IsDecimalDigit _PyUnicodeUCS4_IsDecimalDigit +# define _PyUnicode_IsDigit _PyUnicodeUCS4_IsDigit +# define _PyUnicode_IsLinebreak _PyUnicodeUCS4_IsLinebreak +# define _PyUnicode_IsLowercase _PyUnicodeUCS4_IsLowercase +# define _PyUnicode_IsNumeric _PyUnicodeUCS4_IsNumeric +# define _PyUnicode_IsTitlecase _PyUnicodeUCS4_IsTitlecase +# define _PyUnicode_IsUppercase _PyUnicodeUCS4_IsUppercase +# define _PyUnicode_IsWhitespace _PyUnicodeUCS4_IsWhitespace +# define _PyUnicode_ToDecimalDigit _PyUnicodeUCS4_ToDecimalDigit +# define _PyUnicode_ToDigit _PyUnicodeUCS4_ToDigit +# define _PyUnicode_ToLowercase _PyUnicodeUCS4_ToLowercase +# define _PyUnicode_ToNumeric _PyUnicodeUCS4_ToNumeric +# define _PyUnicode_ToTitlecase _PyUnicodeUCS4_ToTitlecase +# define _PyUnicode_ToUppercase _PyUnicodeUCS4_ToUppercase + + +#endif + +/* --- Internal Unicode Operations ---------------------------------------- */ + +/* If you want Python to use the compiler's wctype.h functions instead + of the ones supplied with Python, define WANT_WCTYPE_FUNCTIONS or + configure Python using --with-wctype-functions. This reduces the + interpreter's code size. */ + +#if defined(HAVE_USABLE_WCHAR_T) && defined(WANT_WCTYPE_FUNCTIONS) + +#include + +#define Py_UNICODE_ISSPACE(ch) iswspace(ch) + +#define Py_UNICODE_ISLOWER(ch) iswlower(ch) +#define Py_UNICODE_ISUPPER(ch) iswupper(ch) +#define Py_UNICODE_ISTITLE(ch) _PyUnicode_IsTitlecase(ch) +#define Py_UNICODE_ISLINEBREAK(ch) _PyUnicode_IsLinebreak(ch) + +#define Py_UNICODE_TOLOWER(ch) towlower(ch) +#define Py_UNICODE_TOUPPER(ch) towupper(ch) +#define Py_UNICODE_TOTITLE(ch) _PyUnicode_ToTitlecase(ch) + +#define Py_UNICODE_ISDECIMAL(ch) _PyUnicode_IsDecimalDigit(ch) +#define Py_UNICODE_ISDIGIT(ch) _PyUnicode_IsDigit(ch) +#define Py_UNICODE_ISNUMERIC(ch) _PyUnicode_IsNumeric(ch) + +#define Py_UNICODE_TODECIMAL(ch) _PyUnicode_ToDecimalDigit(ch) +#define Py_UNICODE_TODIGIT(ch) _PyUnicode_ToDigit(ch) +#define Py_UNICODE_TONUMERIC(ch) _PyUnicode_ToNumeric(ch) + +#define Py_UNICODE_ISALPHA(ch) iswalpha(ch) + +#else + +/* Since splitting on whitespace is an important use case, and + whitespace in most situations is solely ASCII whitespace, we + optimize for the common case by using a quick look-up table + _Py_ascii_whitespace (see below) with an inlined check. + + */ +#define Py_UNICODE_ISSPACE(ch) \ + ((ch) < 128U ? _Py_ascii_whitespace[(ch)] : _PyUnicode_IsWhitespace(ch)) + +#define Py_UNICODE_ISLOWER(ch) _PyUnicode_IsLowercase(ch) +#define Py_UNICODE_ISUPPER(ch) _PyUnicode_IsUppercase(ch) +#define Py_UNICODE_ISTITLE(ch) _PyUnicode_IsTitlecase(ch) +#define Py_UNICODE_ISLINEBREAK(ch) _PyUnicode_IsLinebreak(ch) + +#define Py_UNICODE_TOLOWER(ch) _PyUnicode_ToLowercase(ch) +#define Py_UNICODE_TOUPPER(ch) _PyUnicode_ToUppercase(ch) +#define Py_UNICODE_TOTITLE(ch) _PyUnicode_ToTitlecase(ch) + +#define Py_UNICODE_ISDECIMAL(ch) _PyUnicode_IsDecimalDigit(ch) +#define Py_UNICODE_ISDIGIT(ch) _PyUnicode_IsDigit(ch) +#define Py_UNICODE_ISNUMERIC(ch) _PyUnicode_IsNumeric(ch) + +#define Py_UNICODE_TODECIMAL(ch) _PyUnicode_ToDecimalDigit(ch) +#define Py_UNICODE_TODIGIT(ch) _PyUnicode_ToDigit(ch) +#define Py_UNICODE_TONUMERIC(ch) _PyUnicode_ToNumeric(ch) + +#define Py_UNICODE_ISALPHA(ch) _PyUnicode_IsAlpha(ch) + +#endif + +#define Py_UNICODE_ISALNUM(ch) \ + (Py_UNICODE_ISALPHA(ch) || \ + Py_UNICODE_ISDECIMAL(ch) || \ + Py_UNICODE_ISDIGIT(ch) || \ + Py_UNICODE_ISNUMERIC(ch)) + +#define Py_UNICODE_COPY(target, source, length) \ + Py_MEMCPY((target), (source), (length)*sizeof(Py_UNICODE)) + +#define Py_UNICODE_FILL(target, value, length) \ + do {Py_ssize_t i_; Py_UNICODE *t_ = (target); Py_UNICODE v_ = (value);\ + for (i_ = 0; i_ < (length); i_++) t_[i_] = v_;\ + } while (0) + +/* Check if substring matches at given offset. the offset must be + valid, and the substring must not be empty */ + +#define Py_UNICODE_MATCH(string, offset, substring) \ + ((*((string)->str + (offset)) == *((substring)->str)) && \ + ((*((string)->str + (offset) + (substring)->length-1) == *((substring)->str + (substring)->length-1))) && \ + !memcmp((string)->str + (offset), (substring)->str, (substring)->length*sizeof(Py_UNICODE))) + +#ifdef __cplusplus +extern "C" { +#endif + +/* --- Unicode Type ------------------------------------------------------- */ + +typedef struct { + PyObject_HEAD + Py_ssize_t length; /* Length of raw Unicode data in buffer */ + Py_UNICODE *str; /* Raw Unicode buffer */ + long hash; /* Hash value; -1 if not set */ + PyObject *defenc; /* (Default) Encoded version as Python + string, or NULL; this is used for + implementing the buffer protocol */ +} PyUnicodeObject; + +PyAPI_DATA(PyTypeObject) PyUnicode_Type; + +#define PyUnicode_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_UNICODE_SUBCLASS) +#define PyUnicode_CheckExact(op) (Py_TYPE(op) == &PyUnicode_Type) + +/* Fast access macros */ +#define PyUnicode_GET_SIZE(op) \ + (((PyUnicodeObject *)(op))->length) +#define PyUnicode_GET_DATA_SIZE(op) \ + (((PyUnicodeObject *)(op))->length * sizeof(Py_UNICODE)) +#define PyUnicode_AS_UNICODE(op) \ + (((PyUnicodeObject *)(op))->str) +#define PyUnicode_AS_DATA(op) \ + ((const char *)((PyUnicodeObject *)(op))->str) + +/* --- Constants ---------------------------------------------------------- */ + +/* This Unicode character will be used as replacement character during + decoding if the errors argument is set to "replace". Note: the + Unicode character U+FFFD is the official REPLACEMENT CHARACTER in + Unicode 3.0. */ + +#define Py_UNICODE_REPLACEMENT_CHARACTER ((Py_UNICODE) 0xFFFD) + +/* === Public API ========================================================= */ + +/* --- Plain Py_UNICODE --------------------------------------------------- */ + +/* Create a Unicode Object from the Py_UNICODE buffer u of the given + size. + + u may be NULL which causes the contents to be undefined. It is the + user's responsibility to fill in the needed data afterwards. Note + that modifying the Unicode object contents after construction is + only allowed if u was set to NULL. + + The buffer is copied into the new object. */ + +PyAPI_FUNC(PyObject*) PyUnicode_FromUnicode( + const Py_UNICODE *u, /* Unicode buffer */ + Py_ssize_t size /* size of buffer */ + ); + +/* Similar to PyUnicode_FromUnicode(), but u points to Latin-1 encoded bytes */ +PyAPI_FUNC(PyObject*) PyUnicode_FromStringAndSize( + const char *u, /* char buffer */ + Py_ssize_t size /* size of buffer */ + ); + +/* Similar to PyUnicode_FromUnicode(), but u points to null-terminated + Latin-1 encoded bytes */ +PyAPI_FUNC(PyObject*) PyUnicode_FromString( + const char *u /* string */ + ); + +/* Return a read-only pointer to the Unicode object's internal + Py_UNICODE buffer. */ + +PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode( + PyObject *unicode /* Unicode object */ + ); + +/* Get the length of the Unicode object. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_GetSize( + PyObject *unicode /* Unicode object */ + ); + +/* Get the maximum ordinal for a Unicode character. */ +PyAPI_FUNC(Py_UNICODE) PyUnicode_GetMax(void); + +/* Resize an already allocated Unicode object to the new size length. + + *unicode is modified to point to the new (resized) object and 0 + returned on success. + + This API may only be called by the function which also called the + Unicode constructor. The refcount on the object must be 1. Otherwise, + an error is returned. + + Error handling is implemented as follows: an exception is set, -1 + is returned and *unicode left untouched. + +*/ + +PyAPI_FUNC(int) PyUnicode_Resize( + PyObject **unicode, /* Pointer to the Unicode object */ + Py_ssize_t length /* New length */ + ); + +/* Coerce obj to an Unicode object and return a reference with + *incremented* refcount. + + Coercion is done in the following way: + + 1. String and other char buffer compatible objects are decoded + under the assumptions that they contain data using the current + default encoding. Decoding is done in "strict" mode. + + 2. All other objects (including Unicode objects) raise an + exception. + + The API returns NULL in case of an error. The caller is responsible + for decref'ing the returned objects. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_FromEncodedObject( + register PyObject *obj, /* Object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Coerce obj to an Unicode object and return a reference with + *incremented* refcount. + + Unicode objects are passed back as-is (subclasses are converted to + true Unicode objects), all other objects are delegated to + PyUnicode_FromEncodedObject(obj, NULL, "strict") which results in + using the default encoding as basis for decoding the object. + + The API returns NULL in case of an error. The caller is responsible + for decref'ing the returned objects. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_FromObject( + register PyObject *obj /* Object */ + ); + +PyAPI_FUNC(PyObject *) PyUnicode_FromFormatV(const char*, va_list); +PyAPI_FUNC(PyObject *) PyUnicode_FromFormat(const char*, ...); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(PyObject *) _PyUnicode_FormatAdvanced(PyObject *obj, + Py_UNICODE *format_spec, + Py_ssize_t format_spec_len); + +/* --- wchar_t support for platforms which support it --------------------- */ + +#ifdef HAVE_WCHAR_H + +/* Create a Unicode Object from the whcar_t buffer w of the given + size. + + The buffer is copied into the new object. */ + +PyAPI_FUNC(PyObject*) PyUnicode_FromWideChar( + register const wchar_t *w, /* wchar_t buffer */ + Py_ssize_t size /* size of buffer */ + ); + +/* Copies the Unicode Object contents into the wchar_t buffer w. At + most size wchar_t characters are copied. + + Note that the resulting wchar_t string may or may not be + 0-terminated. It is the responsibility of the caller to make sure + that the wchar_t string is 0-terminated in case this is required by + the application. + + Returns the number of wchar_t characters copied (excluding a + possibly trailing 0-termination character) or -1 in case of an + error. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_AsWideChar( + PyUnicodeObject *unicode, /* Unicode object */ + register wchar_t *w, /* wchar_t buffer */ + Py_ssize_t size /* size of buffer */ + ); + +#endif + +/* --- Unicode ordinals --------------------------------------------------- */ + +/* Create a Unicode Object from the given Unicode code point ordinal. + + The ordinal must be in range(0x10000) on narrow Python builds + (UCS2), and range(0x110000) on wide builds (UCS4). A ValueError is + raised in case it is not. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_FromOrdinal(int ordinal); + +/* --- Free-list management ----------------------------------------------- */ + +/* Clear the free list used by the Unicode implementation. + + This can be used to release memory used for objects on the free + list back to the Python memory allocator. + +*/ + +PyAPI_FUNC(int) PyUnicode_ClearFreeList(void); + +/* === Builtin Codecs ===================================================== + + Many of these APIs take two arguments encoding and errors. These + parameters encoding and errors have the same semantics as the ones + of the builtin unicode() API. + + Setting encoding to NULL causes the default encoding to be used. + + Error handling is set by errors which may also be set to NULL + meaning to use the default handling defined for the codec. Default + error handling for all builtin codecs is "strict" (ValueErrors are + raised). + + The codecs all use a similar interface. Only deviation from the + generic ones are documented. + +*/ + +/* --- Manage the default encoding ---------------------------------------- */ + +/* Return a Python string holding the default encoded value of the + Unicode object. + + The resulting string is cached in the Unicode object for subsequent + usage by this function. The cached version is needed to implement + the character buffer interface and will live (at least) as long as + the Unicode object itself. + + The refcount of the string is *not* incremented. + + *** Exported for internal use by the interpreter only !!! *** + +*/ + +PyAPI_FUNC(PyObject *) _PyUnicode_AsDefaultEncodedString( + PyObject *, const char *); + +/* Returns the currently active default encoding. + + The default encoding is currently implemented as run-time settable + process global. This may change in future versions of the + interpreter to become a parameter which is managed on a per-thread + basis. + + */ + +PyAPI_FUNC(const char*) PyUnicode_GetDefaultEncoding(void); + +/* Sets the currently active default encoding. + + Returns 0 on success, -1 in case of an error. + + */ + +PyAPI_FUNC(int) PyUnicode_SetDefaultEncoding( + const char *encoding /* Encoding name in standard form */ + ); + +/* --- Generic Codecs ----------------------------------------------------- */ + +/* Create a Unicode object by decoding the encoded string s of the + given size. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Decode( + const char *s, /* encoded string */ + Py_ssize_t size, /* size of buffer */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Encodes a Py_UNICODE buffer of the given size and returns a + Python string object. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Encode( + const Py_UNICODE *s, /* Unicode char buffer */ + Py_ssize_t size, /* number of Py_UNICODE chars to encode */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Encodes a Unicode object and returns the result as Python + object. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedObject( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Encodes a Unicode object and returns the result as Python string + object. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedString( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_BuildEncodingMap( + PyObject* string /* 256 character map */ + ); + + +/* --- UTF-7 Codecs ------------------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF7( + const char *string, /* UTF-7 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF7Stateful( + const char *string, /* UTF-7 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF7( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + int base64SetO, /* Encode RFC2152 Set O characters in base64 */ + int base64WhiteSpace, /* Encode whitespace (sp, ht, nl, cr) in base64 */ + const char *errors /* error handling */ + ); + +/* --- UTF-8 Codecs ------------------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF8( + const char *string, /* UTF-8 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF8Stateful( + const char *string, /* UTF-8 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsUTF8String( + PyObject *unicode /* Unicode object */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF8( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ); + +/* --- UTF-32 Codecs ------------------------------------------------------ */ + +/* Decodes length bytes from a UTF-32 encoded buffer string and returns + the corresponding Unicode object. + + errors (if non-NULL) defines the error handling. It defaults + to "strict". + + If byteorder is non-NULL, the decoder starts decoding using the + given byte order: + + *byteorder == -1: little endian + *byteorder == 0: native order + *byteorder == 1: big endian + + In native mode, the first four bytes of the stream are checked for a + BOM mark. If found, the BOM mark is analysed, the byte order + adjusted and the BOM skipped. In the other modes, no BOM mark + interpretation is done. After completion, *byteorder is set to the + current byte order at the end of input data. + + If byteorder is NULL, the codec starts in native order mode. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF32( + const char *string, /* UTF-32 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF32Stateful( + const char *string, /* UTF-32 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder, /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +/* Returns a Python string using the UTF-32 encoding in native byte + order. The string always starts with a BOM mark. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsUTF32String( + PyObject *unicode /* Unicode object */ + ); + +/* Returns a Python string object holding the UTF-32 encoded value of + the Unicode data. + + If byteorder is not 0, output is written according to the following + byte order: + + byteorder == -1: little endian + byteorder == 0: native byte order (writes a BOM mark) + byteorder == 1: big endian + + If byteorder is 0, the output string will always start with the + Unicode BOM mark (U+FEFF). In the other two modes, no BOM mark is + prepended. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF32( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors, /* error handling */ + int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + ); + +/* --- UTF-16 Codecs ------------------------------------------------------ */ + +/* Decodes length bytes from a UTF-16 encoded buffer string and returns + the corresponding Unicode object. + + errors (if non-NULL) defines the error handling. It defaults + to "strict". + + If byteorder is non-NULL, the decoder starts decoding using the + given byte order: + + *byteorder == -1: little endian + *byteorder == 0: native order + *byteorder == 1: big endian + + In native mode, the first two bytes of the stream are checked for a + BOM mark. If found, the BOM mark is analysed, the byte order + adjusted and the BOM skipped. In the other modes, no BOM mark + interpretation is done. After completion, *byteorder is set to the + current byte order at the end of input data. + + If byteorder is NULL, the codec starts in native order mode. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF16( + const char *string, /* UTF-16 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF16Stateful( + const char *string, /* UTF-16 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder, /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +/* Returns a Python string using the UTF-16 encoding in native byte + order. The string always starts with a BOM mark. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsUTF16String( + PyObject *unicode /* Unicode object */ + ); + +/* Returns a Python string object holding the UTF-16 encoded value of + the Unicode data. + + If byteorder is not 0, output is written according to the following + byte order: + + byteorder == -1: little endian + byteorder == 0: native byte order (writes a BOM mark) + byteorder == 1: big endian + + If byteorder is 0, the output string will always start with the + Unicode BOM mark (U+FEFF). In the other two modes, no BOM mark is + prepended. + + Note that Py_UNICODE data is being interpreted as UTF-16 reduced to + UCS-2. This trick makes it possible to add full UTF-16 capabilities + at a later point without compromising the APIs. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF16( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors, /* error handling */ + int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + ); + +/* --- Unicode-Escape Codecs ---------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUnicodeEscape( + const char *string, /* Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsUnicodeEscapeString( + PyObject *unicode /* Unicode object */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUnicodeEscape( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length /* Number of Py_UNICODE chars to encode */ + ); + +/* --- Raw-Unicode-Escape Codecs ------------------------------------------ */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeRawUnicodeEscape( + const char *string, /* Raw-Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsRawUnicodeEscapeString( + PyObject *unicode /* Unicode object */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeRawUnicodeEscape( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length /* Number of Py_UNICODE chars to encode */ + ); + +/* --- Unicode Internal Codec --------------------------------------------- + + Only for internal use in _codecsmodule.c */ + +PyObject *_PyUnicode_DecodeUnicodeInternal( + const char *string, + Py_ssize_t length, + const char *errors + ); + +/* --- Latin-1 Codecs ----------------------------------------------------- + + Note: Latin-1 corresponds to the first 256 Unicode ordinals. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeLatin1( + const char *string, /* Latin-1 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsLatin1String( + PyObject *unicode /* Unicode object */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeLatin1( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ); + +/* --- ASCII Codecs ------------------------------------------------------- + + Only 7-bit ASCII data is excepted. All other codes generate errors. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeASCII( + const char *string, /* ASCII encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsASCIIString( + PyObject *unicode /* Unicode object */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeASCII( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ); + +/* --- Character Map Codecs ----------------------------------------------- + + This codec uses mappings to encode and decode characters. + + Decoding mappings must map single string characters to single + Unicode characters, integers (which are then interpreted as Unicode + ordinals) or None (meaning "undefined mapping" and causing an + error). + + Encoding mappings must map single Unicode characters to single + string characters, integers (which are then interpreted as Latin-1 + ordinals) or None (meaning "undefined mapping" and causing an + error). + + If a character lookup fails with a LookupError, the character is + copied as-is meaning that its ordinal value will be interpreted as + Unicode or Latin-1 ordinal resp. Because of this mappings only need + to contain those mappings which map characters to different code + points. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeCharmap( + const char *string, /* Encoded string */ + Py_ssize_t length, /* size of string */ + PyObject *mapping, /* character mapping + (char ordinal -> unicode ordinal) */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsCharmapString( + PyObject *unicode, /* Unicode object */ + PyObject *mapping /* character mapping + (unicode ordinal -> char ordinal) */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeCharmap( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + PyObject *mapping, /* character mapping + (unicode ordinal -> char ordinal) */ + const char *errors /* error handling */ + ); + +/* Translate a Py_UNICODE buffer of the given length by applying a + character mapping table to it and return the resulting Unicode + object. + + The mapping table must map Unicode ordinal integers to Unicode + ordinal integers or None (causing deletion of the character). + + Mapping tables may be dictionaries or sequences. Unmapped character + ordinals (ones which cause a LookupError) are left untouched and + are copied as-is. + +*/ + +PyAPI_FUNC(PyObject *) PyUnicode_TranslateCharmap( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + PyObject *table, /* Translate table */ + const char *errors /* error handling */ + ); + +#ifdef MS_WIN32 + +/* --- MBCS codecs for Windows -------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeMBCS( + const char *string, /* MBCS encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeMBCSStateful( + const char *string, /* MBCS encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsMBCSString( + PyObject *unicode /* Unicode object */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeMBCS( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ); + +#endif /* MS_WIN32 */ + +/* --- Decimal Encoder ---------------------------------------------------- */ + +/* Takes a Unicode string holding a decimal value and writes it into + an output buffer using standard ASCII digit codes. + + The output buffer has to provide at least length+1 bytes of storage + area. The output string is 0-terminated. + + The encoder converts whitespace to ' ', decimal characters to their + corresponding ASCII digit and all other Latin-1 characters except + \0 as-is. Characters outside this range (Unicode ordinals 1-256) + are treated as errors. This includes embedded NULL bytes. + + Error handling is defined by the errors argument: + + NULL or "strict": raise a ValueError + "ignore": ignore the wrong characters (these are not copied to the + output buffer) + "replace": replaces illegal characters with '?' + + Returns 0 on success, -1 on failure. + +*/ + +PyAPI_FUNC(int) PyUnicode_EncodeDecimal( + Py_UNICODE *s, /* Unicode buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + char *output, /* Output buffer; must have size >= length */ + const char *errors /* error handling */ + ); + +/* --- Methods & Slots ---------------------------------------------------- + + These are capable of handling Unicode objects and strings on input + (we refer to them as strings in the descriptions) and return + Unicode objects or integers as apporpriate. */ + +/* Concat two strings giving a new Unicode string. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Concat( + PyObject *left, /* Left string */ + PyObject *right /* Right string */ + ); + +/* Split a string giving a list of Unicode strings. + + If sep is NULL, splitting will be done at all whitespace + substrings. Otherwise, splits occur at the given separator. + + At most maxsplit splits will be done. If negative, no limit is set. + + Separators are not included in the resulting list. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_Split( + PyObject *s, /* String to split */ + PyObject *sep, /* String separator */ + Py_ssize_t maxsplit /* Maxsplit count */ + ); + +/* Dito, but split at line breaks. + + CRLF is considered to be one line break. Line breaks are not + included in the resulting list. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Splitlines( + PyObject *s, /* String to split */ + int keepends /* If true, line end markers are included */ + ); + +/* Partition a string using a given separator. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Partition( + PyObject *s, /* String to partition */ + PyObject *sep /* String separator */ + ); + +/* Partition a string using a given separator, searching from the end of the + string. */ + +PyAPI_FUNC(PyObject*) PyUnicode_RPartition( + PyObject *s, /* String to partition */ + PyObject *sep /* String separator */ + ); + +/* Split a string giving a list of Unicode strings. + + If sep is NULL, splitting will be done at all whitespace + substrings. Otherwise, splits occur at the given separator. + + At most maxsplit splits will be done. But unlike PyUnicode_Split + PyUnicode_RSplit splits from the end of the string. If negative, + no limit is set. + + Separators are not included in the resulting list. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_RSplit( + PyObject *s, /* String to split */ + PyObject *sep, /* String separator */ + Py_ssize_t maxsplit /* Maxsplit count */ + ); + +/* Translate a string by applying a character mapping table to it and + return the resulting Unicode object. + + The mapping table must map Unicode ordinal integers to Unicode + ordinal integers or None (causing deletion of the character). + + Mapping tables may be dictionaries or sequences. Unmapped character + ordinals (ones which cause a LookupError) are left untouched and + are copied as-is. + +*/ + +PyAPI_FUNC(PyObject *) PyUnicode_Translate( + PyObject *str, /* String */ + PyObject *table, /* Translate table */ + const char *errors /* error handling */ + ); + +/* Join a sequence of strings using the given separator and return + the resulting Unicode string. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Join( + PyObject *separator, /* Separator string */ + PyObject *seq /* Sequence object */ + ); + +/* Return 1 if substr matches str[start:end] at the given tail end, 0 + otherwise. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_Tailmatch( + PyObject *str, /* String */ + PyObject *substr, /* Prefix or Suffix string */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end, /* Stop index */ + int direction /* Tail end: -1 prefix, +1 suffix */ + ); + +/* Return the first position of substr in str[start:end] using the + given search direction or -1 if not found. -2 is returned in case + an error occurred and an exception is set. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_Find( + PyObject *str, /* String */ + PyObject *substr, /* Substring to find */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end, /* Stop index */ + int direction /* Find direction: +1 forward, -1 backward */ + ); + +/* Count the number of occurrences of substr in str[start:end]. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_Count( + PyObject *str, /* String */ + PyObject *substr, /* Substring to count */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end /* Stop index */ + ); + +/* Replace at most maxcount occurrences of substr in str with replstr + and return the resulting Unicode object. */ + +PyAPI_FUNC(PyObject *) PyUnicode_Replace( + PyObject *str, /* String */ + PyObject *substr, /* Substring to find */ + PyObject *replstr, /* Substring to replace */ + Py_ssize_t maxcount /* Max. number of replacements to apply; + -1 = all */ + ); + +/* Compare two strings and return -1, 0, 1 for less than, equal, + greater than resp. */ + +PyAPI_FUNC(int) PyUnicode_Compare( + PyObject *left, /* Left string */ + PyObject *right /* Right string */ + ); + +/* Rich compare two strings and return one of the following: + + - NULL in case an exception was raised + - Py_True or Py_False for successfuly comparisons + - Py_NotImplemented in case the type combination is unknown + + Note that Py_EQ and Py_NE comparisons can cause a UnicodeWarning in + case the conversion of the arguments to Unicode fails with a + UnicodeDecodeError. + + Possible values for op: + + Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE + +*/ + +PyAPI_FUNC(PyObject *) PyUnicode_RichCompare( + PyObject *left, /* Left string */ + PyObject *right, /* Right string */ + int op /* Operation: Py_EQ, Py_NE, Py_GT, etc. */ + ); + +/* Apply a argument tuple or dictionary to a format string and return + the resulting Unicode string. */ + +PyAPI_FUNC(PyObject *) PyUnicode_Format( + PyObject *format, /* Format string */ + PyObject *args /* Argument tuple or dictionary */ + ); + +/* Checks whether element is contained in container and return 1/0 + accordingly. + + element has to coerce to an one element Unicode string. -1 is + returned in case of an error. */ + +PyAPI_FUNC(int) PyUnicode_Contains( + PyObject *container, /* Container string */ + PyObject *element /* Element string */ + ); + +/* Externally visible for str.strip(unicode) */ +PyAPI_FUNC(PyObject *) _PyUnicode_XStrip( + PyUnicodeObject *self, + int striptype, + PyObject *sepobj + ); + +/* === Characters Type APIs =============================================== */ + +/* Helper array used by Py_UNICODE_ISSPACE(). */ + +PyAPI_DATA(const unsigned char) _Py_ascii_whitespace[]; + +/* These should not be used directly. Use the Py_UNICODE_IS* and + Py_UNICODE_TO* macros instead. + + These APIs are implemented in Objects/unicodectype.c. + +*/ + +PyAPI_FUNC(int) _PyUnicode_IsLowercase( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsUppercase( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsTitlecase( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsWhitespace( + const Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsLinebreak( + const Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(Py_UNICODE) _PyUnicode_ToLowercase( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(Py_UNICODE) _PyUnicode_ToUppercase( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(Py_UNICODE) _PyUnicode_ToTitlecase( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_ToDecimalDigit( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_ToDigit( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(double) _PyUnicode_ToNumeric( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsDecimalDigit( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsDigit( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsNumeric( + Py_UNICODE ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsAlpha( + Py_UNICODE ch /* Unicode character */ + ); + +#ifdef __cplusplus +} +#endif +#endif /* Py_USING_UNICODE */ +#endif /* !Py_UNICODEOBJECT_H */ diff --git a/PythonEnv/2.7/Include/warnings.h b/PythonEnv/2.7/Include/warnings.h new file mode 100644 index 0000000000..0818d7a117 --- /dev/null +++ b/PythonEnv/2.7/Include/warnings.h @@ -0,0 +1,23 @@ +#ifndef Py_WARNINGS_H +#define Py_WARNINGS_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(void) _PyWarnings_Init(void); + +PyAPI_FUNC(int) PyErr_WarnEx(PyObject *, const char *, Py_ssize_t); +PyAPI_FUNC(int) PyErr_WarnExplicit(PyObject *, const char *, const char *, int, + const char *, PyObject *); + +#define PyErr_WarnPy3k(msg, stacklevel) \ + (Py_Py3kWarningFlag ? PyErr_WarnEx(PyExc_DeprecationWarning, msg, stacklevel) : 0) + +/* DEPRECATED: Use PyErr_WarnEx() instead. */ +#define PyErr_Warn(category, msg) PyErr_WarnEx(category, msg, 1) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_WARNINGS_H */ + diff --git a/PythonEnv/2.7/Include/weakrefobject.h b/PythonEnv/2.7/Include/weakrefobject.h new file mode 100644 index 0000000000..e46aecf385 --- /dev/null +++ b/PythonEnv/2.7/Include/weakrefobject.h @@ -0,0 +1,85 @@ +/* Weak references objects for Python. */ + +#ifndef Py_WEAKREFOBJECT_H +#define Py_WEAKREFOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct _PyWeakReference PyWeakReference; + +/* PyWeakReference is the base struct for the Python ReferenceType, ProxyType, + * and CallableProxyType. + */ +struct _PyWeakReference { + PyObject_HEAD + + /* The object to which this is a weak reference, or Py_None if none. + * Note that this is a stealth reference: wr_object's refcount is + * not incremented to reflect this pointer. + */ + PyObject *wr_object; + + /* A callable to invoke when wr_object dies, or NULL if none. */ + PyObject *wr_callback; + + /* A cache for wr_object's hash code. As usual for hashes, this is -1 + * if the hash code isn't known yet. + */ + long hash; + + /* If wr_object is weakly referenced, wr_object has a doubly-linked NULL- + * terminated list of weak references to it. These are the list pointers. + * If wr_object goes away, wr_object is set to Py_None, and these pointers + * have no meaning then. + */ + PyWeakReference *wr_prev; + PyWeakReference *wr_next; +}; + +PyAPI_DATA(PyTypeObject) _PyWeakref_RefType; +PyAPI_DATA(PyTypeObject) _PyWeakref_ProxyType; +PyAPI_DATA(PyTypeObject) _PyWeakref_CallableProxyType; + +#define PyWeakref_CheckRef(op) PyObject_TypeCheck(op, &_PyWeakref_RefType) +#define PyWeakref_CheckRefExact(op) \ + (Py_TYPE(op) == &_PyWeakref_RefType) +#define PyWeakref_CheckProxy(op) \ + ((Py_TYPE(op) == &_PyWeakref_ProxyType) || \ + (Py_TYPE(op) == &_PyWeakref_CallableProxyType)) + +/* This macro calls PyWeakref_CheckRef() last since that can involve a + function call; this makes it more likely that the function call + will be avoided. */ +#define PyWeakref_Check(op) \ + (PyWeakref_CheckRef(op) || PyWeakref_CheckProxy(op)) + + +PyAPI_FUNC(PyObject *) PyWeakref_NewRef(PyObject *ob, + PyObject *callback); +PyAPI_FUNC(PyObject *) PyWeakref_NewProxy(PyObject *ob, + PyObject *callback); +PyAPI_FUNC(PyObject *) PyWeakref_GetObject(PyObject *ref); + +PyAPI_FUNC(Py_ssize_t) _PyWeakref_GetWeakrefCount(PyWeakReference *head); + +PyAPI_FUNC(void) _PyWeakref_ClearRef(PyWeakReference *self); + +/* Explanation for the Py_REFCNT() check: when a weakref's target is part + of a long chain of deallocations which triggers the trashcan mechanism, + clearing the weakrefs can be delayed long after the target's refcount + has dropped to zero. In the meantime, code accessing the weakref will + be able to "see" the target object even though it is supposed to be + unreachable. See issue #16602. */ + +#define PyWeakref_GET_OBJECT(ref) \ + (Py_REFCNT(((PyWeakReference *)(ref))->wr_object) > 0 \ + ? ((PyWeakReference *)(ref))->wr_object \ + : Py_None) + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_WEAKREFOBJECT_H */ diff --git a/PythonEnv/2.7/Lib/UserDict.py b/PythonEnv/2.7/Lib/UserDict.py new file mode 100644 index 0000000000..bb2218ab6c --- /dev/null +++ b/PythonEnv/2.7/Lib/UserDict.py @@ -0,0 +1,180 @@ +"""A more or less complete user-defined wrapper around dictionary objects.""" + +class UserDict: + def __init__(self, dict=None, **kwargs): + self.data = {} + if dict is not None: + self.update(dict) + if len(kwargs): + self.update(kwargs) + def __repr__(self): return repr(self.data) + def __cmp__(self, dict): + if isinstance(dict, UserDict): + return cmp(self.data, dict.data) + else: + return cmp(self.data, dict) + __hash__ = None # Avoid Py3k warning + def __len__(self): return len(self.data) + def __getitem__(self, key): + if key in self.data: + return self.data[key] + if hasattr(self.__class__, "__missing__"): + return self.__class__.__missing__(self, key) + raise KeyError(key) + def __setitem__(self, key, item): self.data[key] = item + def __delitem__(self, key): del self.data[key] + def clear(self): self.data.clear() + def copy(self): + if self.__class__ is UserDict: + return UserDict(self.data.copy()) + import copy + data = self.data + try: + self.data = {} + c = copy.copy(self) + finally: + self.data = data + c.update(self) + return c + def keys(self): return self.data.keys() + def items(self): return self.data.items() + def iteritems(self): return self.data.iteritems() + def iterkeys(self): return self.data.iterkeys() + def itervalues(self): return self.data.itervalues() + def values(self): return self.data.values() + def has_key(self, key): return key in self.data + def update(self, dict=None, **kwargs): + if dict is None: + pass + elif isinstance(dict, UserDict): + self.data.update(dict.data) + elif isinstance(dict, type({})) or not hasattr(dict, 'items'): + self.data.update(dict) + else: + for k, v in dict.items(): + self[k] = v + if len(kwargs): + self.data.update(kwargs) + def get(self, key, failobj=None): + if key not in self: + return failobj + return self[key] + def setdefault(self, key, failobj=None): + if key not in self: + self[key] = failobj + return self[key] + def pop(self, key, *args): + return self.data.pop(key, *args) + def popitem(self): + return self.data.popitem() + def __contains__(self, key): + return key in self.data + @classmethod + def fromkeys(cls, iterable, value=None): + d = cls() + for key in iterable: + d[key] = value + return d + +class IterableUserDict(UserDict): + def __iter__(self): + return iter(self.data) + +import _abcoll +_abcoll.MutableMapping.register(IterableUserDict) + + +class DictMixin: + # Mixin defining all dictionary methods for classes that already have + # a minimum dictionary interface including getitem, setitem, delitem, + # and keys. Without knowledge of the subclass constructor, the mixin + # does not define __init__() or copy(). In addition to the four base + # methods, progressively more efficiency comes with defining + # __contains__(), __iter__(), and iteritems(). + + # second level definitions support higher levels + def __iter__(self): + for k in self.keys(): + yield k + def has_key(self, key): + try: + self[key] + except KeyError: + return False + return True + def __contains__(self, key): + return self.has_key(key) + + # third level takes advantage of second level definitions + def iteritems(self): + for k in self: + yield (k, self[k]) + def iterkeys(self): + return self.__iter__() + + # fourth level uses definitions from lower levels + def itervalues(self): + for _, v in self.iteritems(): + yield v + def values(self): + return [v for _, v in self.iteritems()] + def items(self): + return list(self.iteritems()) + def clear(self): + for key in self.keys(): + del self[key] + def setdefault(self, key, default=None): + try: + return self[key] + except KeyError: + self[key] = default + return default + def pop(self, key, *args): + if len(args) > 1: + raise TypeError, "pop expected at most 2 arguments, got "\ + + repr(1 + len(args)) + try: + value = self[key] + except KeyError: + if args: + return args[0] + raise + del self[key] + return value + def popitem(self): + try: + k, v = self.iteritems().next() + except StopIteration: + raise KeyError, 'container is empty' + del self[k] + return (k, v) + def update(self, other=None, **kwargs): + # Make progressively weaker assumptions about "other" + if other is None: + pass + elif hasattr(other, 'iteritems'): # iteritems saves memory and lookups + for k, v in other.iteritems(): + self[k] = v + elif hasattr(other, 'keys'): + for k in other.keys(): + self[k] = other[k] + else: + for k, v in other: + self[k] = v + if kwargs: + self.update(kwargs) + def get(self, key, default=None): + try: + return self[key] + except KeyError: + return default + def __repr__(self): + return repr(dict(self.iteritems())) + def __cmp__(self, other): + if other is None: + return 1 + if isinstance(other, DictMixin): + other = dict(other.iteritems()) + return cmp(dict(self.iteritems()), other) + def __len__(self): + return len(self.keys()) diff --git a/PythonEnv/2.7/Lib/UserDict.pyc b/PythonEnv/2.7/Lib/UserDict.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5793af1bfe4f59175fe347e9dc18842b3c0a04fb GIT binary patch literal 10485 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 UK9pL7axGYkKV8b>r(U`L0xu~mlmGw# literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/_abcoll.py b/PythonEnv/2.7/Lib/_abcoll.py new file mode 100644 index 0000000000..0438afda28 --- /dev/null +++ b/PythonEnv/2.7/Lib/_abcoll.py @@ -0,0 +1,671 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Abstract Base Classes (ABCs) for collections, according to PEP 3119. + +DON'T USE THIS MODULE DIRECTLY! The classes here should be imported +via collections; they are defined here only to alleviate certain +bootstrapping issues. Unit tests are in test_collections. +""" + +from abc import ABCMeta, abstractmethod +import sys + +__all__ = ["Hashable", "Iterable", "Iterator", + "Sized", "Container", "Callable", + "Set", "MutableSet", + "Mapping", "MutableMapping", + "MappingView", "KeysView", "ItemsView", "ValuesView", + "Sequence", "MutableSequence", + ] + +### ONE-TRICK PONIES ### + +def _hasattr(C, attr): + try: + return any(attr in B.__dict__ for B in C.__mro__) + except AttributeError: + # Old-style class + return hasattr(C, attr) + + +class Hashable: + __metaclass__ = ABCMeta + + @abstractmethod + def __hash__(self): + return 0 + + @classmethod + def __subclasshook__(cls, C): + if cls is Hashable: + try: + for B in C.__mro__: + if "__hash__" in B.__dict__: + if B.__dict__["__hash__"]: + return True + break + except AttributeError: + # Old-style class + if getattr(C, "__hash__", None): + return True + return NotImplemented + + +class Iterable: + __metaclass__ = ABCMeta + + @abstractmethod + def __iter__(self): + while False: + yield None + + @classmethod + def __subclasshook__(cls, C): + if cls is Iterable: + if _hasattr(C, "__iter__"): + return True + return NotImplemented + +Iterable.register(str) + + +class Iterator(Iterable): + + @abstractmethod + def next(self): + 'Return the next item from the iterator. When exhausted, raise StopIteration' + raise StopIteration + + def __iter__(self): + return self + + @classmethod + def __subclasshook__(cls, C): + if cls is Iterator: + if _hasattr(C, "next") and _hasattr(C, "__iter__"): + return True + return NotImplemented + + +class Sized: + __metaclass__ = ABCMeta + + @abstractmethod + def __len__(self): + return 0 + + @classmethod + def __subclasshook__(cls, C): + if cls is Sized: + if _hasattr(C, "__len__"): + return True + return NotImplemented + + +class Container: + __metaclass__ = ABCMeta + + @abstractmethod + def __contains__(self, x): + return False + + @classmethod + def __subclasshook__(cls, C): + if cls is Container: + if _hasattr(C, "__contains__"): + return True + return NotImplemented + + +class Callable: + __metaclass__ = ABCMeta + + @abstractmethod + def __call__(self, *args, **kwds): + return False + + @classmethod + def __subclasshook__(cls, C): + if cls is Callable: + if _hasattr(C, "__call__"): + return True + return NotImplemented + + +### SETS ### + + +class Set(Sized, Iterable, Container): + """A set is a finite, iterable container. + + This class provides concrete generic implementations of all + methods except for __contains__, __iter__ and __len__. + + To override the comparisons (presumably for speed, as the + semantics are fixed), all you have to do is redefine __le__ and + then the other operations will automatically follow suit. + """ + + def __le__(self, other): + if not isinstance(other, Set): + return NotImplemented + if len(self) > len(other): + return False + for elem in self: + if elem not in other: + return False + return True + + def __lt__(self, other): + if not isinstance(other, Set): + return NotImplemented + return len(self) < len(other) and self.__le__(other) + + def __gt__(self, other): + if not isinstance(other, Set): + return NotImplemented + return other < self + + def __ge__(self, other): + if not isinstance(other, Set): + return NotImplemented + return other <= self + + def __eq__(self, other): + if not isinstance(other, Set): + return NotImplemented + return len(self) == len(other) and self.__le__(other) + + def __ne__(self, other): + return not (self == other) + + @classmethod + def _from_iterable(cls, it): + '''Construct an instance of the class from any iterable input. + + Must override this method if the class constructor signature + does not accept an iterable for an input. + ''' + return cls(it) + + def __and__(self, other): + if not isinstance(other, Iterable): + return NotImplemented + return self._from_iterable(value for value in other if value in self) + + def isdisjoint(self, other): + 'Return True if two sets have a null intersection.' + for value in other: + if value in self: + return False + return True + + def __or__(self, other): + if not isinstance(other, Iterable): + return NotImplemented + chain = (e for s in (self, other) for e in s) + return self._from_iterable(chain) + + def __sub__(self, other): + if not isinstance(other, Set): + if not isinstance(other, Iterable): + return NotImplemented + other = self._from_iterable(other) + return self._from_iterable(value for value in self + if value not in other) + + def __xor__(self, other): + if not isinstance(other, Set): + if not isinstance(other, Iterable): + return NotImplemented + other = self._from_iterable(other) + return (self - other) | (other - self) + + # Sets are not hashable by default, but subclasses can change this + __hash__ = None + + def _hash(self): + """Compute the hash value of a set. + + Note that we don't define __hash__: not all sets are hashable. + But if you define a hashable set type, its __hash__ should + call this function. + + This must be compatible __eq__. + + All sets ought to compare equal if they contain the same + elements, regardless of how they are implemented, and + regardless of the order of the elements; so there's not much + freedom for __eq__ or __hash__. We match the algorithm used + by the built-in frozenset type. + """ + MAX = sys.maxint + MASK = 2 * MAX + 1 + n = len(self) + h = 1927868237 * (n + 1) + h &= MASK + for x in self: + hx = hash(x) + h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167 + h &= MASK + h = h * 69069 + 907133923 + h &= MASK + if h > MAX: + h -= MASK + 1 + if h == -1: + h = 590923713 + return h + +Set.register(frozenset) + + +class MutableSet(Set): + """A mutable set is a finite, iterable container. + + This class provides concrete generic implementations of all + methods except for __contains__, __iter__, __len__, + add(), and discard(). + + To override the comparisons (presumably for speed, as the + semantics are fixed), all you have to do is redefine __le__ and + then the other operations will automatically follow suit. + """ + + @abstractmethod + def add(self, value): + """Add an element.""" + raise NotImplementedError + + @abstractmethod + def discard(self, value): + """Remove an element. Do not raise an exception if absent.""" + raise NotImplementedError + + def remove(self, value): + """Remove an element. If not a member, raise a KeyError.""" + if value not in self: + raise KeyError(value) + self.discard(value) + + def pop(self): + """Return the popped value. Raise KeyError if empty.""" + it = iter(self) + try: + value = next(it) + except StopIteration: + raise KeyError + self.discard(value) + return value + + def clear(self): + """This is slow (creates N new iterators!) but effective.""" + try: + while True: + self.pop() + except KeyError: + pass + + def __ior__(self, it): + for value in it: + self.add(value) + return self + + def __iand__(self, it): + for value in (self - it): + self.discard(value) + return self + + def __ixor__(self, it): + if it is self: + self.clear() + else: + if not isinstance(it, Set): + it = self._from_iterable(it) + for value in it: + if value in self: + self.discard(value) + else: + self.add(value) + return self + + def __isub__(self, it): + if it is self: + self.clear() + else: + for value in it: + self.discard(value) + return self + +MutableSet.register(set) + + +### MAPPINGS ### + + +class Mapping(Sized, Iterable, Container): + + """A Mapping is a generic container for associating key/value + pairs. + + This class provides concrete generic implementations of all + methods except for __getitem__, __iter__, and __len__. + + """ + + @abstractmethod + def __getitem__(self, key): + raise KeyError + + def get(self, key, default=None): + 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.' + try: + return self[key] + except KeyError: + return default + + def __contains__(self, key): + try: + self[key] + except KeyError: + return False + else: + return True + + def iterkeys(self): + 'D.iterkeys() -> an iterator over the keys of D' + return iter(self) + + def itervalues(self): + 'D.itervalues() -> an iterator over the values of D' + for key in self: + yield self[key] + + def iteritems(self): + 'D.iteritems() -> an iterator over the (key, value) items of D' + for key in self: + yield (key, self[key]) + + def keys(self): + "D.keys() -> list of D's keys" + return list(self) + + def items(self): + "D.items() -> list of D's (key, value) pairs, as 2-tuples" + return [(key, self[key]) for key in self] + + def values(self): + "D.values() -> list of D's values" + return [self[key] for key in self] + + # Mappings are not hashable by default, but subclasses can change this + __hash__ = None + + def __eq__(self, other): + if not isinstance(other, Mapping): + return NotImplemented + return dict(self.items()) == dict(other.items()) + + def __ne__(self, other): + return not (self == other) + +class MappingView(Sized): + + def __init__(self, mapping): + self._mapping = mapping + + def __len__(self): + return len(self._mapping) + + def __repr__(self): + return '{0.__class__.__name__}({0._mapping!r})'.format(self) + + +class KeysView(MappingView, Set): + + @classmethod + def _from_iterable(self, it): + return set(it) + + def __contains__(self, key): + return key in self._mapping + + def __iter__(self): + for key in self._mapping: + yield key + + +class ItemsView(MappingView, Set): + + @classmethod + def _from_iterable(self, it): + return set(it) + + def __contains__(self, item): + key, value = item + try: + v = self._mapping[key] + except KeyError: + return False + else: + return v == value + + def __iter__(self): + for key in self._mapping: + yield (key, self._mapping[key]) + + +class ValuesView(MappingView): + + def __contains__(self, value): + for key in self._mapping: + if value == self._mapping[key]: + return True + return False + + def __iter__(self): + for key in self._mapping: + yield self._mapping[key] + + +class MutableMapping(Mapping): + + """A MutableMapping is a generic container for associating + key/value pairs. + + This class provides concrete generic implementations of all + methods except for __getitem__, __setitem__, __delitem__, + __iter__, and __len__. + + """ + + @abstractmethod + def __setitem__(self, key, value): + raise KeyError + + @abstractmethod + def __delitem__(self, key): + raise KeyError + + __marker = object() + + def pop(self, key, default=__marker): + '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + ''' + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def popitem(self): + '''D.popitem() -> (k, v), remove and return some (key, value) pair + as a 2-tuple; but raise KeyError if D is empty. + ''' + try: + key = next(iter(self)) + except StopIteration: + raise KeyError + value = self[key] + del self[key] + return key, value + + def clear(self): + 'D.clear() -> None. Remove all items from D.' + try: + while True: + self.popitem() + except KeyError: + pass + + def update(*args, **kwds): + ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F. + If E present and has a .keys() method, does: for k in E: D[k] = E[k] + If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v + In either case, this is followed by: for k, v in F.items(): D[k] = v + ''' + if len(args) > 2: + raise TypeError("update() takes at most 2 positional " + "arguments ({} given)".format(len(args))) + elif not args: + raise TypeError("update() takes at least 1 argument (0 given)") + self = args[0] + other = args[1] if len(args) >= 2 else () + + if isinstance(other, Mapping): + for key in other: + self[key] = other[key] + elif hasattr(other, "keys"): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + def setdefault(self, key, default=None): + 'D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D' + try: + return self[key] + except KeyError: + self[key] = default + return default + +MutableMapping.register(dict) + + +### SEQUENCES ### + + +class Sequence(Sized, Iterable, Container): + """All the operations on a read-only sequence. + + Concrete subclasses must override __new__ or __init__, + __getitem__, and __len__. + """ + + @abstractmethod + def __getitem__(self, index): + raise IndexError + + def __iter__(self): + i = 0 + try: + while True: + v = self[i] + yield v + i += 1 + except IndexError: + return + + def __contains__(self, value): + for v in self: + if v == value: + return True + return False + + def __reversed__(self): + for i in reversed(range(len(self))): + yield self[i] + + def index(self, value): + '''S.index(value) -> integer -- return first index of value. + Raises ValueError if the value is not present. + ''' + for i, v in enumerate(self): + if v == value: + return i + raise ValueError + + def count(self, value): + 'S.count(value) -> integer -- return number of occurrences of value' + return sum(1 for v in self if v == value) + +Sequence.register(tuple) +Sequence.register(basestring) +Sequence.register(buffer) +Sequence.register(xrange) + + +class MutableSequence(Sequence): + + """All the operations on a read-only sequence. + + Concrete subclasses must provide __new__ or __init__, + __getitem__, __setitem__, __delitem__, __len__, and insert(). + + """ + + @abstractmethod + def __setitem__(self, index, value): + raise IndexError + + @abstractmethod + def __delitem__(self, index): + raise IndexError + + @abstractmethod + def insert(self, index, value): + 'S.insert(index, object) -- insert object before index' + raise IndexError + + def append(self, value): + 'S.append(object) -- append object to the end of the sequence' + self.insert(len(self), value) + + def reverse(self): + 'S.reverse() -- reverse *IN PLACE*' + n = len(self) + for i in range(n//2): + self[i], self[n-i-1] = self[n-i-1], self[i] + + def extend(self, values): + 'S.extend(iterable) -- extend sequence by appending elements from the iterable' + for v in values: + self.append(v) + + def pop(self, index=-1): + '''S.pop([index]) -> item -- remove and return item at index (default last). + Raise IndexError if list is empty or index is out of range. + ''' + v = self[index] + del self[index] + return v + + def remove(self, value): + '''S.remove(value) -- remove first occurrence of value. + Raise ValueError if the value is not present. + ''' + del self[self.index(value)] + + def __iadd__(self, values): + self.extend(values) + return self + +MutableSequence.register(list) diff --git a/PythonEnv/2.7/Lib/_abcoll.pyc b/PythonEnv/2.7/Lib/_abcoll.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f16f8ed19c277b0e85b0f44c3f824d739b4ae9c GIT binary patch literal 28758 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 Q-p1KjKjaMmazm&87g)`&KmY&$ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/_weakrefset.py b/PythonEnv/2.7/Lib/_weakrefset.py new file mode 100644 index 0000000000..43f9a6e447 --- /dev/null +++ b/PythonEnv/2.7/Lib/_weakrefset.py @@ -0,0 +1,196 @@ +# Access WeakSet through the weakref module. +# This code is separated-out because it is needed +# by abc.py to load everything else at startup. + +from _weakref import ref + +__all__ = ['WeakSet'] + + +class _IterationGuard(object): + # This context manager registers itself in the current iterators of the + # weak container, such as to delay all removals until the context manager + # exits. + # This technique should be relatively thread-safe (since sets are). + + def __init__(self, weakcontainer): + # Don't create cycles + self.weakcontainer = ref(weakcontainer) + + def __enter__(self): + w = self.weakcontainer() + if w is not None: + w._iterating.add(self) + return self + + def __exit__(self, e, t, b): + w = self.weakcontainer() + if w is not None: + s = w._iterating + s.remove(self) + if not s: + w._commit_removals() + + +class WeakSet(object): + def __init__(self, data=None): + self.data = set() + def _remove(item, selfref=ref(self)): + self = selfref() + if self is not None: + if self._iterating: + self._pending_removals.append(item) + else: + self.data.discard(item) + self._remove = _remove + # A list of keys to be removed + self._pending_removals = [] + self._iterating = set() + if data is not None: + self.update(data) + + def _commit_removals(self): + l = self._pending_removals + discard = self.data.discard + while l: + discard(l.pop()) + + def __iter__(self): + with _IterationGuard(self): + for itemref in self.data: + item = itemref() + if item is not None: + yield item + + def __len__(self): + return len(self.data) - len(self._pending_removals) + + def __contains__(self, item): + try: + wr = ref(item) + except TypeError: + return False + return wr in self.data + + def __reduce__(self): + return (self.__class__, (list(self),), + getattr(self, '__dict__', None)) + + __hash__ = None + + def add(self, item): + if self._pending_removals: + self._commit_removals() + self.data.add(ref(item, self._remove)) + + def clear(self): + if self._pending_removals: + self._commit_removals() + self.data.clear() + + def copy(self): + return self.__class__(self) + + def pop(self): + if self._pending_removals: + self._commit_removals() + while True: + try: + itemref = self.data.pop() + except KeyError: + raise KeyError('pop from empty WeakSet') + item = itemref() + if item is not None: + return item + + def remove(self, item): + if self._pending_removals: + self._commit_removals() + self.data.remove(ref(item)) + + def discard(self, item): + if self._pending_removals: + self._commit_removals() + self.data.discard(ref(item)) + + def update(self, other): + if self._pending_removals: + self._commit_removals() + for element in other: + self.add(element) + + def __ior__(self, other): + self.update(other) + return self + + def difference(self, other): + newset = self.copy() + newset.difference_update(other) + return newset + __sub__ = difference + + def difference_update(self, other): + self.__isub__(other) + def __isub__(self, other): + if self._pending_removals: + self._commit_removals() + if self is other: + self.data.clear() + else: + self.data.difference_update(ref(item) for item in other) + return self + + def intersection(self, other): + return self.__class__(item for item in other if item in self) + __and__ = intersection + + def intersection_update(self, other): + self.__iand__(other) + def __iand__(self, other): + if self._pending_removals: + self._commit_removals() + self.data.intersection_update(ref(item) for item in other) + return self + + def issubset(self, other): + return self.data.issubset(ref(item) for item in other) + __le__ = issubset + + def __lt__(self, other): + return self.data < set(ref(item) for item in other) + + def issuperset(self, other): + return self.data.issuperset(ref(item) for item in other) + __ge__ = issuperset + + def __gt__(self, other): + return self.data > set(ref(item) for item in other) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + return self.data == set(ref(item) for item in other) + + def symmetric_difference(self, other): + newset = self.copy() + newset.symmetric_difference_update(other) + return newset + __xor__ = symmetric_difference + + def symmetric_difference_update(self, other): + self.__ixor__(other) + def __ixor__(self, other): + if self._pending_removals: + self._commit_removals() + if self is other: + self.data.clear() + else: + self.data.symmetric_difference_update(ref(item, self._remove) for item in other) + return self + + def union(self, other): + return self.__class__(e for s in (self, other) for e in s) + __or__ = union + + def isdisjoint(self, other): + return len(self.intersection(other)) == 0 diff --git a/PythonEnv/2.7/Lib/_weakrefset.pyc b/PythonEnv/2.7/Lib/_weakrefset.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b444974cccb113c4edbb1ef2ef021e8ddfb4d99 GIT binary patch literal 11216 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 QH<;yUB%Lf&iZk>71|&N4Bme*a literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/abc.py b/PythonEnv/2.7/Lib/abc.py new file mode 100644 index 0000000000..02e48a1bb3 --- /dev/null +++ b/PythonEnv/2.7/Lib/abc.py @@ -0,0 +1,185 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Abstract Base Classes (ABCs) according to PEP 3119.""" + +import types + +from _weakrefset import WeakSet + +# Instance of old-style class +class _C: pass +_InstanceType = type(_C()) + + +def abstractmethod(funcobj): + """A decorator indicating abstract methods. + + Requires that the metaclass is ABCMeta or derived from it. A + class that has a metaclass derived from ABCMeta cannot be + instantiated unless all of its abstract methods are overridden. + The abstract methods can be called using any of the normal + 'super' call mechanisms. + + Usage: + + class C: + __metaclass__ = ABCMeta + @abstractmethod + def my_abstract_method(self, ...): + ... + """ + funcobj.__isabstractmethod__ = True + return funcobj + + +class abstractproperty(property): + """A decorator indicating abstract properties. + + Requires that the metaclass is ABCMeta or derived from it. A + class that has a metaclass derived from ABCMeta cannot be + instantiated unless all of its abstract properties are overridden. + The abstract properties can be called using any of the normal + 'super' call mechanisms. + + Usage: + + class C: + __metaclass__ = ABCMeta + @abstractproperty + def my_abstract_property(self): + ... + + This defines a read-only property; you can also define a read-write + abstract property using the 'long' form of property declaration: + + class C: + __metaclass__ = ABCMeta + def getx(self): ... + def setx(self, value): ... + x = abstractproperty(getx, setx) + """ + __isabstractmethod__ = True + + +class ABCMeta(type): + + """Metaclass for defining Abstract Base Classes (ABCs). + + Use this metaclass to create an ABC. An ABC can be subclassed + directly, and then acts as a mix-in class. You can also register + unrelated concrete classes (even built-in classes) and unrelated + ABCs as 'virtual subclasses' -- these and their descendants will + be considered subclasses of the registering ABC by the built-in + issubclass() function, but the registering ABC won't show up in + their MRO (Method Resolution Order) nor will method + implementations defined by the registering ABC be callable (not + even via super()). + + """ + + # A global counter that is incremented each time a class is + # registered as a virtual subclass of anything. It forces the + # negative cache to be cleared before its next use. + _abc_invalidation_counter = 0 + + def __new__(mcls, name, bases, namespace): + cls = super(ABCMeta, mcls).__new__(mcls, name, bases, namespace) + # Compute set of abstract method names + abstracts = set(name + for name, value in namespace.items() + if getattr(value, "__isabstractmethod__", False)) + for base in bases: + for name in getattr(base, "__abstractmethods__", set()): + value = getattr(cls, name, None) + if getattr(value, "__isabstractmethod__", False): + abstracts.add(name) + cls.__abstractmethods__ = frozenset(abstracts) + # Set up inheritance registry + cls._abc_registry = WeakSet() + cls._abc_cache = WeakSet() + cls._abc_negative_cache = WeakSet() + cls._abc_negative_cache_version = ABCMeta._abc_invalidation_counter + return cls + + def register(cls, subclass): + """Register a virtual subclass of an ABC.""" + if not isinstance(subclass, (type, types.ClassType)): + raise TypeError("Can only register classes") + if issubclass(subclass, cls): + return # Already a subclass + # Subtle: test for cycles *after* testing for "already a subclass"; + # this means we allow X.register(X) and interpret it as a no-op. + if issubclass(cls, subclass): + # This would create a cycle, which is bad for the algorithm below + raise RuntimeError("Refusing to create an inheritance cycle") + cls._abc_registry.add(subclass) + ABCMeta._abc_invalidation_counter += 1 # Invalidate negative cache + + def _dump_registry(cls, file=None): + """Debug helper to print the ABC registry.""" + print >> file, "Class: %s.%s" % (cls.__module__, cls.__name__) + print >> file, "Inv.counter: %s" % ABCMeta._abc_invalidation_counter + for name in sorted(cls.__dict__.keys()): + if name.startswith("_abc_"): + value = getattr(cls, name) + print >> file, "%s: %r" % (name, value) + + def __instancecheck__(cls, instance): + """Override for isinstance(instance, cls).""" + # Inline the cache checking when it's simple. + subclass = getattr(instance, '__class__', None) + if subclass is not None and subclass in cls._abc_cache: + return True + subtype = type(instance) + # Old-style instances + if subtype is _InstanceType: + subtype = subclass + if subtype is subclass or subclass is None: + if (cls._abc_negative_cache_version == + ABCMeta._abc_invalidation_counter and + subtype in cls._abc_negative_cache): + return False + # Fall back to the subclass check. + return cls.__subclasscheck__(subtype) + return (cls.__subclasscheck__(subclass) or + cls.__subclasscheck__(subtype)) + + def __subclasscheck__(cls, subclass): + """Override for issubclass(subclass, cls).""" + # Check cache + if subclass in cls._abc_cache: + return True + # Check negative cache; may have to invalidate + if cls._abc_negative_cache_version < ABCMeta._abc_invalidation_counter: + # Invalidate the negative cache + cls._abc_negative_cache = WeakSet() + cls._abc_negative_cache_version = ABCMeta._abc_invalidation_counter + elif subclass in cls._abc_negative_cache: + return False + # Check the subclass hook + ok = cls.__subclasshook__(subclass) + if ok is not NotImplemented: + assert isinstance(ok, bool) + if ok: + cls._abc_cache.add(subclass) + else: + cls._abc_negative_cache.add(subclass) + return ok + # Check if it's a direct subclass + if cls in getattr(subclass, '__mro__', ()): + cls._abc_cache.add(subclass) + return True + # Check if it's a subclass of a registered class (recursive) + for rcls in cls._abc_registry: + if issubclass(subclass, rcls): + cls._abc_cache.add(subclass) + return True + # Check if it's a subclass of a subclass (recursive) + for scls in cls.__subclasses__(): + if issubclass(subclass, scls): + cls._abc_cache.add(subclass) + return True + # No dice; update negative cache + cls._abc_negative_cache.add(subclass) + return False diff --git a/PythonEnv/2.7/Lib/abc.pyc b/PythonEnv/2.7/Lib/abc.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24f8fc38c9765c35aa91b19205fd82b94e1b0f1e GIT binary patch literal 6550 zcmdT}&r=-774F$xRxCmi5|&D~m8wqJ3QHnwBHM`)?6`!GQl(T0DT8bx3fFjcrh$Rk z8JO+`HW5`Rqf;)vHNNJMKOp(OH#^HB+3^KeCBTgO=j+$~zW2S?qx!!t zOnvdk{^Ljuf9m-69v*vySFF?;-kyqUD)rPF3izw5w5ED>wN_VN+)(j(6;G&_N*ycp ze669(gfb0QjxnRD;wJmn&Z+pEGLvcp0wzbJTPkjG0$Zm>ty5fYr9DkG-p6aPYh4jW zPTvo$(MxG)t+Bejcz?;x>oAJ)B2KbR?Q;F};ZyzoojbqiB>%?Ga@)gfcMh*r6Yi`S z=V~YiOQYSg|2`f&iI;(zp7K}PD62L{IyMJE7WPaKxGAah^0=R(T8=`Kl9IiLQoOLf znYgWfcYQU<7SoNw#ABsylC3{5-TvnK(}CN{vxnLK`g@(b>uJ(m54%xkci>Z>^LQ** zZ>orOKCCX`u@~@iO1*$u9^WgnMf*<-TGX+@QG_lpbdtqM6gr+tSRG!^VA0rirlvH0 ze6!b23LK-`3LRcXqd$yzwmPvIXZsj+4Oy`%l6@2FjUw;q#C5b@6ba>6nZ6ZT9gYb& zHKh_2g;|z6-8C{h$*c=AmxK$MtWA_fU3XDg*w%ApAt}ZwL9<*#BLeS62S7 zNUsJ7*1rMfBH-B;=m>t2WFV_h7bc8v=UFFVu1wUC5QmoMO_LLOdsNgdWl{XB;Qz@tdffs znS$%u1acpb0vQZi;(EIT|$Ba0DWyF9+@b;3!+euc25(s)ej@!a)Cf1okr1Z1Gq!JpV zJj41}zFY)pkJ*RJZa+!gNS0w9gylxlL^UNj)=?JHz&DtuSR%*)$-(S+*frQygKT#yH)x7q+W*DMF-NGKq z#N$;F2YEKZj=lwT(Nd$DkU_ob)aX-hPflS)av5Qygohz_;rG5o!H*GE=8GPp_j!QEy zmu_K7p)h%!Nn&GLSmC2hlbOTa;^XJ2l!WFXrhV5@w6O#<5mc-%~L6rA1aF2Vt>ODOxK;muTXu`3g zX)j8x&(u%0(Z#*Yimo(?-3=onJHQ}mt)i8cxg6~?NjzhV`BxzGQ#|$tUdsD^t>w+u zE_gS*EBL+cU8+rchJY0+3Lw`o(!7|YyoWGY}9O2Et}9)17s?7ttW@_jX5|ctDkT7OM7^cNsiDd%teyzfnIiH7pHpM0_eu zhVo8J6?eokuq&!fR>5s6G_{Zd?T2tXp>`%!;d3ZjKoe+08I5+E1NhOtsulnLl9BGBnh$cyD_RZyEuig}~56 zSO5_qR1D!kHs&LtAp}8|gbxZJ0A?8@#43`JA$!|Vs<=lC9AhYs0rr)wj^&!lW~=#4 znZLrV%ls-YE8zyy5N>}V0)QB1WQae<3RH^7gO(wBfQ<`7@Oc?BG1Qx5O&Cbw@CRr; zLNpcsyNn&5&W#*?AkCM+RrACyzSwZPz#dlo>T9R$eWg|p?@HHY?pbCcr!8k9o5f7+ zQL$GS+tc3as|xcpz7fY2pxRZT!ZA}se10qP>QgME{}_I6uzCVi)YKSS839hvx|Qbu zt1!rN?jBWF1{3@5V4QGQH_uZUu!xV(1#cY^^~!+8=vl@$0=ZySBL+55Vl14j z%?|&a@s`_ih}5`@3lbq1y(QoBf5eh-$9pXOoG&hWvK1+vNlq^IT!e7T)U$c9Ink`O zW?L7hTdg`1W6z4JOd2D*4FnlivIf_#%)bq*dQi{7E)**Wbk+ cWT}tJ|3&y%>@It$P1k1XIQ4q#>b39v2YGEY+5i9m literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/codecs.py b/PythonEnv/2.7/Lib/codecs.py new file mode 100644 index 0000000000..f4cd60a14f --- /dev/null +++ b/PythonEnv/2.7/Lib/codecs.py @@ -0,0 +1,1098 @@ +""" codecs -- Python Codec Registry, API and helpers. + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +"""#" + +import __builtin__, sys + +### Registry and builtin stateless codec functions + +try: + from _codecs import * +except ImportError, why: + raise SystemError('Failed to load the builtin codecs: %s' % why) + +__all__ = ["register", "lookup", "open", "EncodedFile", "BOM", "BOM_BE", + "BOM_LE", "BOM32_BE", "BOM32_LE", "BOM64_BE", "BOM64_LE", + "BOM_UTF8", "BOM_UTF16", "BOM_UTF16_LE", "BOM_UTF16_BE", + "BOM_UTF32", "BOM_UTF32_LE", "BOM_UTF32_BE", + "strict_errors", "ignore_errors", "replace_errors", + "xmlcharrefreplace_errors", + "register_error", "lookup_error"] + +### Constants + +# +# Byte Order Mark (BOM = ZERO WIDTH NO-BREAK SPACE = U+FEFF) +# and its possible byte string values +# for UTF8/UTF16/UTF32 output and little/big endian machines +# + +# UTF-8 +BOM_UTF8 = '\xef\xbb\xbf' + +# UTF-16, little endian +BOM_LE = BOM_UTF16_LE = '\xff\xfe' + +# UTF-16, big endian +BOM_BE = BOM_UTF16_BE = '\xfe\xff' + +# UTF-32, little endian +BOM_UTF32_LE = '\xff\xfe\x00\x00' + +# UTF-32, big endian +BOM_UTF32_BE = '\x00\x00\xfe\xff' + +if sys.byteorder == 'little': + + # UTF-16, native endianness + BOM = BOM_UTF16 = BOM_UTF16_LE + + # UTF-32, native endianness + BOM_UTF32 = BOM_UTF32_LE + +else: + + # UTF-16, native endianness + BOM = BOM_UTF16 = BOM_UTF16_BE + + # UTF-32, native endianness + BOM_UTF32 = BOM_UTF32_BE + +# Old broken names (don't use in new code) +BOM32_LE = BOM_UTF16_LE +BOM32_BE = BOM_UTF16_BE +BOM64_LE = BOM_UTF32_LE +BOM64_BE = BOM_UTF32_BE + + +### Codec base classes (defining the API) + +class CodecInfo(tuple): + + def __new__(cls, encode, decode, streamreader=None, streamwriter=None, + incrementalencoder=None, incrementaldecoder=None, name=None): + self = tuple.__new__(cls, (encode, decode, streamreader, streamwriter)) + self.name = name + self.encode = encode + self.decode = decode + self.incrementalencoder = incrementalencoder + self.incrementaldecoder = incrementaldecoder + self.streamwriter = streamwriter + self.streamreader = streamreader + return self + + def __repr__(self): + return "<%s.%s object for encoding %s at 0x%x>" % (self.__class__.__module__, self.__class__.__name__, self.name, id(self)) + +class Codec: + + """ Defines the interface for stateless encoders/decoders. + + The .encode()/.decode() methods may use different error + handling schemes by providing the errors argument. These + string values are predefined: + + 'strict' - raise a ValueError error (or a subclass) + 'ignore' - ignore the character and continue with the next + 'replace' - replace with a suitable replacement character; + Python will use the official U+FFFD REPLACEMENT + CHARACTER for the builtin Unicode codecs on + decoding and '?' on encoding. + 'xmlcharrefreplace' - Replace with the appropriate XML + character reference (only for encoding). + 'backslashreplace' - Replace with backslashed escape sequences + (only for encoding). + + The set of allowed values can be extended via register_error. + + """ + def encode(self, input, errors='strict'): + + """ Encodes the object input and returns a tuple (output + object, length consumed). + + errors defines the error handling to apply. It defaults to + 'strict' handling. + + The method may not store state in the Codec instance. Use + StreamCodec for codecs which have to keep state in order to + make encoding/decoding efficient. + + The encoder must be able to handle zero length input and + return an empty object of the output object type in this + situation. + + """ + raise NotImplementedError + + def decode(self, input, errors='strict'): + + """ Decodes the object input and returns a tuple (output + object, length consumed). + + input must be an object which provides the bf_getreadbuf + buffer slot. Python strings, buffer objects and memory + mapped files are examples of objects providing this slot. + + errors defines the error handling to apply. It defaults to + 'strict' handling. + + The method may not store state in the Codec instance. Use + StreamCodec for codecs which have to keep state in order to + make encoding/decoding efficient. + + The decoder must be able to handle zero length input and + return an empty object of the output object type in this + situation. + + """ + raise NotImplementedError + +class IncrementalEncoder(object): + """ + An IncrementalEncoder encodes an input in multiple steps. The input can be + passed piece by piece to the encode() method. The IncrementalEncoder remembers + the state of the Encoding process between calls to encode(). + """ + def __init__(self, errors='strict'): + """ + Creates an IncrementalEncoder instance. + + The IncrementalEncoder may use different error handling schemes by + providing the errors keyword argument. See the module docstring + for a list of possible values. + """ + self.errors = errors + self.buffer = "" + + def encode(self, input, final=False): + """ + Encodes input and returns the resulting object. + """ + raise NotImplementedError + + def reset(self): + """ + Resets the encoder to the initial state. + """ + + def getstate(self): + """ + Return the current state of the encoder. + """ + return 0 + + def setstate(self, state): + """ + Set the current state of the encoder. state must have been + returned by getstate(). + """ + +class BufferedIncrementalEncoder(IncrementalEncoder): + """ + This subclass of IncrementalEncoder can be used as the baseclass for an + incremental encoder if the encoder must keep some of the output in a + buffer between calls to encode(). + """ + def __init__(self, errors='strict'): + IncrementalEncoder.__init__(self, errors) + self.buffer = "" # unencoded input that is kept between calls to encode() + + def _buffer_encode(self, input, errors, final): + # Overwrite this method in subclasses: It must encode input + # and return an (output, length consumed) tuple + raise NotImplementedError + + def encode(self, input, final=False): + # encode input (taking the buffer into account) + data = self.buffer + input + (result, consumed) = self._buffer_encode(data, self.errors, final) + # keep unencoded input until the next call + self.buffer = data[consumed:] + return result + + def reset(self): + IncrementalEncoder.reset(self) + self.buffer = "" + + def getstate(self): + return self.buffer or 0 + + def setstate(self, state): + self.buffer = state or "" + +class IncrementalDecoder(object): + """ + An IncrementalDecoder decodes an input in multiple steps. The input can be + passed piece by piece to the decode() method. The IncrementalDecoder + remembers the state of the decoding process between calls to decode(). + """ + def __init__(self, errors='strict'): + """ + Creates a IncrementalDecoder instance. + + The IncrementalDecoder may use different error handling schemes by + providing the errors keyword argument. See the module docstring + for a list of possible values. + """ + self.errors = errors + + def decode(self, input, final=False): + """ + Decodes input and returns the resulting object. + """ + raise NotImplementedError + + def reset(self): + """ + Resets the decoder to the initial state. + """ + + def getstate(self): + """ + Return the current state of the decoder. + + This must be a (buffered_input, additional_state_info) tuple. + buffered_input must be a bytes object containing bytes that + were passed to decode() that have not yet been converted. + additional_state_info must be a non-negative integer + representing the state of the decoder WITHOUT yet having + processed the contents of buffered_input. In the initial state + and after reset(), getstate() must return (b"", 0). + """ + return (b"", 0) + + def setstate(self, state): + """ + Set the current state of the decoder. + + state must have been returned by getstate(). The effect of + setstate((b"", 0)) must be equivalent to reset(). + """ + +class BufferedIncrementalDecoder(IncrementalDecoder): + """ + This subclass of IncrementalDecoder can be used as the baseclass for an + incremental decoder if the decoder must be able to handle incomplete byte + sequences. + """ + def __init__(self, errors='strict'): + IncrementalDecoder.__init__(self, errors) + self.buffer = "" # undecoded input that is kept between calls to decode() + + def _buffer_decode(self, input, errors, final): + # Overwrite this method in subclasses: It must decode input + # and return an (output, length consumed) tuple + raise NotImplementedError + + def decode(self, input, final=False): + # decode input (taking the buffer into account) + data = self.buffer + input + (result, consumed) = self._buffer_decode(data, self.errors, final) + # keep undecoded input until the next call + self.buffer = data[consumed:] + return result + + def reset(self): + IncrementalDecoder.reset(self) + self.buffer = "" + + def getstate(self): + # additional state info is always 0 + return (self.buffer, 0) + + def setstate(self, state): + # ignore additional state info + self.buffer = state[0] + +# +# The StreamWriter and StreamReader class provide generic working +# interfaces which can be used to implement new encoding submodules +# very easily. See encodings/utf_8.py for an example on how this is +# done. +# + +class StreamWriter(Codec): + + def __init__(self, stream, errors='strict'): + + """ Creates a StreamWriter instance. + + stream must be a file-like object open for writing + (binary) data. + + The StreamWriter may use different error handling + schemes by providing the errors keyword argument. These + parameters are predefined: + + 'strict' - raise a ValueError (or a subclass) + 'ignore' - ignore the character and continue with the next + 'replace'- replace with a suitable replacement character + 'xmlcharrefreplace' - Replace with the appropriate XML + character reference. + 'backslashreplace' - Replace with backslashed escape + sequences (only for encoding). + + The set of allowed parameter values can be extended via + register_error. + """ + self.stream = stream + self.errors = errors + + def write(self, object): + + """ Writes the object's contents encoded to self.stream. + """ + data, consumed = self.encode(object, self.errors) + self.stream.write(data) + + def writelines(self, list): + + """ Writes the concatenated list of strings to the stream + using .write(). + """ + self.write(''.join(list)) + + def reset(self): + + """ Flushes and resets the codec buffers used for keeping state. + + Calling this method should ensure that the data on the + output is put into a clean state, that allows appending + of new fresh data without having to rescan the whole + stream to recover state. + + """ + pass + + def seek(self, offset, whence=0): + self.stream.seek(offset, whence) + if whence == 0 and offset == 0: + self.reset() + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.stream.close() + +### + +class StreamReader(Codec): + + def __init__(self, stream, errors='strict'): + + """ Creates a StreamReader instance. + + stream must be a file-like object open for reading + (binary) data. + + The StreamReader may use different error handling + schemes by providing the errors keyword argument. These + parameters are predefined: + + 'strict' - raise a ValueError (or a subclass) + 'ignore' - ignore the character and continue with the next + 'replace'- replace with a suitable replacement character; + + The set of allowed parameter values can be extended via + register_error. + """ + self.stream = stream + self.errors = errors + self.bytebuffer = "" + # For str->str decoding this will stay a str + # For str->unicode decoding the first read will promote it to unicode + self.charbuffer = "" + self.linebuffer = None + + def decode(self, input, errors='strict'): + raise NotImplementedError + + def read(self, size=-1, chars=-1, firstline=False): + + """ Decodes data from the stream self.stream and returns the + resulting object. + + chars indicates the number of characters to read from the + stream. read() will never return more than chars + characters, but it might return less, if there are not enough + characters available. + + size indicates the approximate maximum number of bytes to + read from the stream for decoding purposes. The decoder + can modify this setting as appropriate. The default value + -1 indicates to read and decode as much as possible. size + is intended to prevent having to decode huge files in one + step. + + If firstline is true, and a UnicodeDecodeError happens + after the first line terminator in the input only the first line + will be returned, the rest of the input will be kept until the + next call to read(). + + The method should use a greedy read strategy meaning that + it should read as much data as is allowed within the + definition of the encoding and the given size, e.g. if + optional encoding endings or state markers are available + on the stream, these should be read too. + """ + # If we have lines cached, first merge them back into characters + if self.linebuffer: + self.charbuffer = "".join(self.linebuffer) + self.linebuffer = None + + # read until we get the required number of characters (if available) + while True: + # can the request can be satisfied from the character buffer? + if chars < 0: + if size < 0: + if self.charbuffer: + break + elif len(self.charbuffer) >= size: + break + else: + if len(self.charbuffer) >= chars: + break + # we need more data + if size < 0: + newdata = self.stream.read() + else: + newdata = self.stream.read(size) + # decode bytes (those remaining from the last call included) + data = self.bytebuffer + newdata + try: + newchars, decodedbytes = self.decode(data, self.errors) + except UnicodeDecodeError, exc: + if firstline: + newchars, decodedbytes = self.decode(data[:exc.start], self.errors) + lines = newchars.splitlines(True) + if len(lines)<=1: + raise + else: + raise + # keep undecoded bytes until the next call + self.bytebuffer = data[decodedbytes:] + # put new characters in the character buffer + self.charbuffer += newchars + # there was no data available + if not newdata: + break + if chars < 0: + # Return everything we've got + result = self.charbuffer + self.charbuffer = "" + else: + # Return the first chars characters + result = self.charbuffer[:chars] + self.charbuffer = self.charbuffer[chars:] + return result + + def readline(self, size=None, keepends=True): + + """ Read one line from the input stream and return the + decoded data. + + size, if given, is passed as size argument to the + read() method. + + """ + # If we have lines cached from an earlier read, return + # them unconditionally + if self.linebuffer: + line = self.linebuffer[0] + del self.linebuffer[0] + if len(self.linebuffer) == 1: + # revert to charbuffer mode; we might need more data + # next time + self.charbuffer = self.linebuffer[0] + self.linebuffer = None + if not keepends: + line = line.splitlines(False)[0] + return line + + readsize = size or 72 + line = "" + # If size is given, we call read() only once + while True: + data = self.read(readsize, firstline=True) + if data: + # If we're at a "\r" read one extra character (which might + # be a "\n") to get a proper line ending. If the stream is + # temporarily exhausted we return the wrong line ending. + if data.endswith("\r"): + data += self.read(size=1, chars=1) + + line += data + lines = line.splitlines(True) + if lines: + if len(lines) > 1: + # More than one line result; the first line is a full line + # to return + line = lines[0] + del lines[0] + if len(lines) > 1: + # cache the remaining lines + lines[-1] += self.charbuffer + self.linebuffer = lines + self.charbuffer = None + else: + # only one remaining line, put it back into charbuffer + self.charbuffer = lines[0] + self.charbuffer + if not keepends: + line = line.splitlines(False)[0] + break + line0withend = lines[0] + line0withoutend = lines[0].splitlines(False)[0] + if line0withend != line0withoutend: # We really have a line end + # Put the rest back together and keep it until the next call + self.charbuffer = "".join(lines[1:]) + self.charbuffer + if keepends: + line = line0withend + else: + line = line0withoutend + break + # we didn't get anything or this was our only try + if not data or size is not None: + if line and not keepends: + line = line.splitlines(False)[0] + break + if readsize<8000: + readsize *= 2 + return line + + def readlines(self, sizehint=None, keepends=True): + + """ Read all lines available on the input stream + and return them as list of lines. + + Line breaks are implemented using the codec's decoder + method and are included in the list entries. + + sizehint, if given, is ignored since there is no efficient + way to finding the true end-of-line. + + """ + data = self.read() + return data.splitlines(keepends) + + def reset(self): + + """ Resets the codec buffers used for keeping state. + + Note that no stream repositioning should take place. + This method is primarily intended to be able to recover + from decoding errors. + + """ + self.bytebuffer = "" + self.charbuffer = u"" + self.linebuffer = None + + def seek(self, offset, whence=0): + """ Set the input stream's current position. + + Resets the codec buffers used for keeping state. + """ + self.stream.seek(offset, whence) + self.reset() + + def next(self): + + """ Return the next decoded line from the input stream.""" + line = self.readline() + if line: + return line + raise StopIteration + + def __iter__(self): + return self + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.stream.close() + +### + +class StreamReaderWriter: + + """ StreamReaderWriter instances allow wrapping streams which + work in both read and write modes. + + The design is such that one can use the factory functions + returned by the codec.lookup() function to construct the + instance. + + """ + # Optional attributes set by the file wrappers below + encoding = 'unknown' + + def __init__(self, stream, Reader, Writer, errors='strict'): + + """ Creates a StreamReaderWriter instance. + + stream must be a Stream-like object. + + Reader, Writer must be factory functions or classes + providing the StreamReader, StreamWriter interface resp. + + Error handling is done in the same way as defined for the + StreamWriter/Readers. + + """ + self.stream = stream + self.reader = Reader(stream, errors) + self.writer = Writer(stream, errors) + self.errors = errors + + def read(self, size=-1): + + return self.reader.read(size) + + def readline(self, size=None): + + return self.reader.readline(size) + + def readlines(self, sizehint=None): + + return self.reader.readlines(sizehint) + + def next(self): + + """ Return the next decoded line from the input stream.""" + return self.reader.next() + + def __iter__(self): + return self + + def write(self, data): + + return self.writer.write(data) + + def writelines(self, list): + + return self.writer.writelines(list) + + def reset(self): + + self.reader.reset() + self.writer.reset() + + def seek(self, offset, whence=0): + self.stream.seek(offset, whence) + self.reader.reset() + if whence == 0 and offset == 0: + self.writer.reset() + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + + # these are needed to make "with codecs.open(...)" work properly + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.stream.close() + +### + +class StreamRecoder: + + """ StreamRecoder instances provide a frontend - backend + view of encoding data. + + They use the complete set of APIs returned by the + codecs.lookup() function to implement their task. + + Data written to the stream is first decoded into an + intermediate format (which is dependent on the given codec + combination) and then written to the stream using an instance + of the provided Writer class. + + In the other direction, data is read from the stream using a + Reader instance and then return encoded data to the caller. + + """ + # Optional attributes set by the file wrappers below + data_encoding = 'unknown' + file_encoding = 'unknown' + + def __init__(self, stream, encode, decode, Reader, Writer, + errors='strict'): + + """ Creates a StreamRecoder instance which implements a two-way + conversion: encode and decode work on the frontend (the + input to .read() and output of .write()) while + Reader and Writer work on the backend (reading and + writing to the stream). + + You can use these objects to do transparent direct + recodings from e.g. latin-1 to utf-8 and back. + + stream must be a file-like object. + + encode, decode must adhere to the Codec interface, Reader, + Writer must be factory functions or classes providing the + StreamReader, StreamWriter interface resp. + + encode and decode are needed for the frontend translation, + Reader and Writer for the backend translation. Unicode is + used as intermediate encoding. + + Error handling is done in the same way as defined for the + StreamWriter/Readers. + + """ + self.stream = stream + self.encode = encode + self.decode = decode + self.reader = Reader(stream, errors) + self.writer = Writer(stream, errors) + self.errors = errors + + def read(self, size=-1): + + data = self.reader.read(size) + data, bytesencoded = self.encode(data, self.errors) + return data + + def readline(self, size=None): + + if size is None: + data = self.reader.readline() + else: + data = self.reader.readline(size) + data, bytesencoded = self.encode(data, self.errors) + return data + + def readlines(self, sizehint=None): + + data = self.reader.read() + data, bytesencoded = self.encode(data, self.errors) + return data.splitlines(1) + + def next(self): + + """ Return the next decoded line from the input stream.""" + data = self.reader.next() + data, bytesencoded = self.encode(data, self.errors) + return data + + def __iter__(self): + return self + + def write(self, data): + + data, bytesdecoded = self.decode(data, self.errors) + return self.writer.write(data) + + def writelines(self, list): + + data = ''.join(list) + data, bytesdecoded = self.decode(data, self.errors) + return self.writer.write(data) + + def reset(self): + + self.reader.reset() + self.writer.reset() + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.stream.close() + +### Shortcuts + +def open(filename, mode='rb', encoding=None, errors='strict', buffering=1): + + """ Open an encoded file using the given mode and return + a wrapped version providing transparent encoding/decoding. + + Note: The wrapped version will only accept the object format + defined by the codecs, i.e. Unicode objects for most builtin + codecs. Output is also codec dependent and will usually be + Unicode as well. + + Files are always opened in binary mode, even if no binary mode + was specified. This is done to avoid data loss due to encodings + using 8-bit values. The default file mode is 'rb' meaning to + open the file in binary read mode. + + encoding specifies the encoding which is to be used for the + file. + + errors may be given to define the error handling. It defaults + to 'strict' which causes ValueErrors to be raised in case an + encoding error occurs. + + buffering has the same meaning as for the builtin open() API. + It defaults to line buffered. + + The returned wrapped file object provides an extra attribute + .encoding which allows querying the used encoding. This + attribute is only available if an encoding was specified as + parameter. + + """ + if encoding is not None: + if 'U' in mode: + # No automatic conversion of '\n' is done on reading and writing + mode = mode.strip().replace('U', '') + if mode[:1] not in set('rwa'): + mode = 'r' + mode + if 'b' not in mode: + # Force opening of the file in binary mode + mode = mode + 'b' + file = __builtin__.open(filename, mode, buffering) + if encoding is None: + return file + info = lookup(encoding) + srw = StreamReaderWriter(file, info.streamreader, info.streamwriter, errors) + # Add attributes to simplify introspection + srw.encoding = encoding + return srw + +def EncodedFile(file, data_encoding, file_encoding=None, errors='strict'): + + """ Return a wrapped version of file which provides transparent + encoding translation. + + Strings written to the wrapped file are interpreted according + to the given data_encoding and then written to the original + file as string using file_encoding. The intermediate encoding + will usually be Unicode but depends on the specified codecs. + + Strings are read from the file using file_encoding and then + passed back to the caller as string using data_encoding. + + If file_encoding is not given, it defaults to data_encoding. + + errors may be given to define the error handling. It defaults + to 'strict' which causes ValueErrors to be raised in case an + encoding error occurs. + + The returned wrapped file object provides two extra attributes + .data_encoding and .file_encoding which reflect the given + parameters of the same name. The attributes can be used for + introspection by Python programs. + + """ + if file_encoding is None: + file_encoding = data_encoding + data_info = lookup(data_encoding) + file_info = lookup(file_encoding) + sr = StreamRecoder(file, data_info.encode, data_info.decode, + file_info.streamreader, file_info.streamwriter, errors) + # Add attributes to simplify introspection + sr.data_encoding = data_encoding + sr.file_encoding = file_encoding + return sr + +### Helpers for codec lookup + +def getencoder(encoding): + + """ Lookup up the codec for the given encoding and return + its encoder function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding).encode + +def getdecoder(encoding): + + """ Lookup up the codec for the given encoding and return + its decoder function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding).decode + +def getincrementalencoder(encoding): + + """ Lookup up the codec for the given encoding and return + its IncrementalEncoder class or factory function. + + Raises a LookupError in case the encoding cannot be found + or the codecs doesn't provide an incremental encoder. + + """ + encoder = lookup(encoding).incrementalencoder + if encoder is None: + raise LookupError(encoding) + return encoder + +def getincrementaldecoder(encoding): + + """ Lookup up the codec for the given encoding and return + its IncrementalDecoder class or factory function. + + Raises a LookupError in case the encoding cannot be found + or the codecs doesn't provide an incremental decoder. + + """ + decoder = lookup(encoding).incrementaldecoder + if decoder is None: + raise LookupError(encoding) + return decoder + +def getreader(encoding): + + """ Lookup up the codec for the given encoding and return + its StreamReader class or factory function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding).streamreader + +def getwriter(encoding): + + """ Lookup up the codec for the given encoding and return + its StreamWriter class or factory function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding).streamwriter + +def iterencode(iterator, encoding, errors='strict', **kwargs): + """ + Encoding iterator. + + Encodes the input strings from the iterator using a IncrementalEncoder. + + errors and kwargs are passed through to the IncrementalEncoder + constructor. + """ + encoder = getincrementalencoder(encoding)(errors, **kwargs) + for input in iterator: + output = encoder.encode(input) + if output: + yield output + output = encoder.encode("", True) + if output: + yield output + +def iterdecode(iterator, encoding, errors='strict', **kwargs): + """ + Decoding iterator. + + Decodes the input strings from the iterator using a IncrementalDecoder. + + errors and kwargs are passed through to the IncrementalDecoder + constructor. + """ + decoder = getincrementaldecoder(encoding)(errors, **kwargs) + for input in iterator: + output = decoder.decode(input) + if output: + yield output + output = decoder.decode("", True) + if output: + yield output + +### Helpers for charmap-based codecs + +def make_identity_dict(rng): + + """ make_identity_dict(rng) -> dict + + Return a dictionary where elements of the rng sequence are + mapped to themselves. + + """ + res = {} + for i in rng: + res[i]=i + return res + +def make_encoding_map(decoding_map): + + """ Creates an encoding map from a decoding map. + + If a target mapping in the decoding map occurs multiple + times, then that target is mapped to None (undefined mapping), + causing an exception when encountered by the charmap codec + during translation. + + One example where this happens is cp875.py which decodes + multiple character to \u001a. + + """ + m = {} + for k,v in decoding_map.items(): + if not v in m: + m[v] = k + else: + m[v] = None + return m + +### error handlers + +try: + strict_errors = lookup_error("strict") + ignore_errors = lookup_error("ignore") + replace_errors = lookup_error("replace") + xmlcharrefreplace_errors = lookup_error("xmlcharrefreplace") + backslashreplace_errors = lookup_error("backslashreplace") +except LookupError: + # In --disable-unicode builds, these error handler are missing + strict_errors = None + ignore_errors = None + replace_errors = None + xmlcharrefreplace_errors = None + backslashreplace_errors = None + +# Tell modulefinder that using codecs probably needs the encodings +# package +_false = 0 +if _false: + import encodings + +### Tests + +if __name__ == '__main__': + + # Make stdout translate Latin-1 output into UTF-8 output + sys.stdout = EncodedFile(sys.stdout, 'latin-1', 'utf-8') + + # Have stdin translate Latin-1 input into UTF-8 input + sys.stdin = EncodedFile(sys.stdin, 'utf-8', 'latin-1') diff --git a/PythonEnv/2.7/Lib/codecs.pyc b/PythonEnv/2.7/Lib/codecs.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1a3fce111f4a23d15236d1a6fbc37addd9aac0d GIT binary patch literal 40080 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 HsPg{-;}eQA literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/copy_reg.py b/PythonEnv/2.7/Lib/copy_reg.py new file mode 100644 index 0000000000..db1715092c --- /dev/null +++ b/PythonEnv/2.7/Lib/copy_reg.py @@ -0,0 +1,201 @@ +"""Helper to provide extensibility for pickle/cPickle. + +This is only useful to add pickle support for extension types defined in +C, not for instances of user-defined classes. +""" + +from types import ClassType as _ClassType + +__all__ = ["pickle", "constructor", + "add_extension", "remove_extension", "clear_extension_cache"] + +dispatch_table = {} + +def pickle(ob_type, pickle_function, constructor_ob=None): + if type(ob_type) is _ClassType: + raise TypeError("copy_reg is not intended for use with classes") + + if not hasattr(pickle_function, '__call__'): + raise TypeError("reduction functions must be callable") + dispatch_table[ob_type] = pickle_function + + # The constructor_ob function is a vestige of safe for unpickling. + # There is no reason for the caller to pass it anymore. + if constructor_ob is not None: + constructor(constructor_ob) + +def constructor(object): + if not hasattr(object, '__call__'): + raise TypeError("constructors must be callable") + +# Example: provide pickling support for complex numbers. + +try: + complex +except NameError: + pass +else: + + def pickle_complex(c): + return complex, (c.real, c.imag) + + pickle(complex, pickle_complex, complex) + +# Support for pickling new-style objects + +def _reconstructor(cls, base, state): + if base is object: + obj = object.__new__(cls) + else: + obj = base.__new__(cls, state) + if base.__init__ != object.__init__: + base.__init__(obj, state) + return obj + +_HEAPTYPE = 1<<9 + +# Python code for object.__reduce_ex__ for protocols 0 and 1 + +def _reduce_ex(self, proto): + assert proto < 2 + for base in self.__class__.__mro__: + if hasattr(base, '__flags__') and not base.__flags__ & _HEAPTYPE: + break + else: + base = object # not really reachable + if base is object: + state = None + else: + if base is self.__class__: + raise TypeError, "can't pickle %s objects" % base.__name__ + state = base(self) + args = (self.__class__, base, state) + try: + getstate = self.__getstate__ + except AttributeError: + if getattr(self, "__slots__", None): + raise TypeError("a class that defines __slots__ without " + "defining __getstate__ cannot be pickled") + try: + dict = self.__dict__ + except AttributeError: + dict = None + else: + dict = getstate() + if dict: + return _reconstructor, args, dict + else: + return _reconstructor, args + +# Helper for __reduce_ex__ protocol 2 + +def __newobj__(cls, *args): + return cls.__new__(cls, *args) + +def _slotnames(cls): + """Return a list of slot names for a given class. + + This needs to find slots defined by the class and its bases, so we + can't simply return the __slots__ attribute. We must walk down + the Method Resolution Order and concatenate the __slots__ of each + class found there. (This assumes classes don't modify their + __slots__ attribute to misrepresent their slots after the class is + defined.) + """ + + # Get the value from a cache in the class if possible + names = cls.__dict__.get("__slotnames__") + if names is not None: + return names + + # Not cached -- calculate the value + names = [] + if not hasattr(cls, "__slots__"): + # This class has no slots + pass + else: + # Slots found -- gather slot names from all base classes + for c in cls.__mro__: + if "__slots__" in c.__dict__: + slots = c.__dict__['__slots__'] + # if class has a single slot, it can be given as a string + if isinstance(slots, basestring): + slots = (slots,) + for name in slots: + # special descriptors + if name in ("__dict__", "__weakref__"): + continue + # mangled names + elif name.startswith('__') and not name.endswith('__'): + names.append('_%s%s' % (c.__name__, name)) + else: + names.append(name) + + # Cache the outcome in the class if at all possible + try: + cls.__slotnames__ = names + except: + pass # But don't die if we can't + + return names + +# A registry of extension codes. This is an ad-hoc compression +# mechanism. Whenever a global reference to , is about +# to be pickled, the (, ) tuple is looked up here to see +# if it is a registered extension code for it. Extension codes are +# universal, so that the meaning of a pickle does not depend on +# context. (There are also some codes reserved for local use that +# don't have this restriction.) Codes are positive ints; 0 is +# reserved. + +_extension_registry = {} # key -> code +_inverted_registry = {} # code -> key +_extension_cache = {} # code -> object +# Don't ever rebind those names: cPickle grabs a reference to them when +# it's initialized, and won't see a rebinding. + +def add_extension(module, name, code): + """Register an extension code.""" + code = int(code) + if not 1 <= code <= 0x7fffffff: + raise ValueError, "code out of range" + key = (module, name) + if (_extension_registry.get(key) == code and + _inverted_registry.get(code) == key): + return # Redundant registrations are benign + if key in _extension_registry: + raise ValueError("key %s is already registered with code %s" % + (key, _extension_registry[key])) + if code in _inverted_registry: + raise ValueError("code %s is already in use for key %s" % + (code, _inverted_registry[code])) + _extension_registry[key] = code + _inverted_registry[code] = key + +def remove_extension(module, name, code): + """Unregister an extension code. For testing only.""" + key = (module, name) + if (_extension_registry.get(key) != code or + _inverted_registry.get(code) != key): + raise ValueError("key %s is not registered with code %s" % + (key, code)) + del _extension_registry[key] + del _inverted_registry[code] + if code in _extension_cache: + del _extension_cache[code] + +def clear_extension_cache(): + _extension_cache.clear() + +# Standard extension code assignments + +# Reserved ranges + +# First Last Count Purpose +# 1 127 127 Reserved for Python standard library +# 128 191 64 Reserved for Zope +# 192 239 48 Reserved for 3rd parties +# 240 255 16 Reserved for private use (will never be assigned) +# 256 Inf Inf Reserved for future assignment + +# Extension codes are assigned by the Python Software Foundation. diff --git a/PythonEnv/2.7/Lib/copy_reg.pyc b/PythonEnv/2.7/Lib/copy_reg.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a86612e361cb093adc93ee6353df40086324ec0 GIT binary patch literal 5520 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/distutils/distutils.cfg b/PythonEnv/2.7/Lib/distutils/distutils.cfg new file mode 100644 index 0000000000..1af230ec91 --- /dev/null +++ b/PythonEnv/2.7/Lib/distutils/distutils.cfg @@ -0,0 +1,6 @@ +# This is a config file local to this virtualenv installation +# You may include options that will be used by all distutils commands, +# and by easy_install. For instance: +# +# [easy_install] +# find_links = http://mylocalsite diff --git a/PythonEnv/2.7/Lib/encodings/__init__.py b/PythonEnv/2.7/Lib/encodings/__init__.py new file mode 100644 index 0000000000..b85ca823ae --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/__init__.py @@ -0,0 +1,157 @@ +""" Standard "encodings" Package + + Standard Python encoding modules are stored in this package + directory. + + Codec modules must have names corresponding to normalized encoding + names as defined in the normalize_encoding() function below, e.g. + 'utf-8' must be implemented by the module 'utf_8.py'. + + Each codec module must export the following interface: + + * getregentry() -> codecs.CodecInfo object + The getregentry() API must a CodecInfo object with encoder, decoder, + incrementalencoder, incrementaldecoder, streamwriter and streamreader + atttributes which adhere to the Python Codec Interface Standard. + + In addition, a module may optionally also define the following + APIs which are then used by the package's codec search function: + + * getaliases() -> sequence of encoding name strings to use as aliases + + Alias names returned by getaliases() must be normalized encoding + names as defined by normalize_encoding(). + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +"""#" + +import codecs +from encodings import aliases +import __builtin__ + +_cache = {} +_unknown = '--unknown--' +_import_tail = ['*'] +_norm_encoding_map = (' . ' + '0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ ' + ' abcdefghijklmnopqrstuvwxyz ' + ' ' + ' ' + ' ') +_aliases = aliases.aliases + +class CodecRegistryError(LookupError, SystemError): + pass + +def normalize_encoding(encoding): + + """ Normalize an encoding name. + + Normalization works as follows: all non-alphanumeric + characters except the dot used for Python package names are + collapsed and replaced with a single underscore, e.g. ' -;#' + becomes '_'. Leading and trailing underscores are removed. + + Note that encoding names should be ASCII only; if they do use + non-ASCII characters, these must be Latin-1 compatible. + + """ + # Make sure we have an 8-bit string, because .translate() works + # differently for Unicode strings. + if hasattr(__builtin__, "unicode") and isinstance(encoding, unicode): + # Note that .encode('latin-1') does *not* use the codec + # registry, so this call doesn't recurse. (See unicodeobject.c + # PyUnicode_AsEncodedString() for details) + encoding = encoding.encode('latin-1') + return '_'.join(encoding.translate(_norm_encoding_map).split()) + +def search_function(encoding): + + # Cache lookup + entry = _cache.get(encoding, _unknown) + if entry is not _unknown: + return entry + + # Import the module: + # + # First try to find an alias for the normalized encoding + # name and lookup the module using the aliased name, then try to + # lookup the module using the standard import scheme, i.e. first + # try in the encodings package, then at top-level. + # + norm_encoding = normalize_encoding(encoding) + aliased_encoding = _aliases.get(norm_encoding) or \ + _aliases.get(norm_encoding.replace('.', '_')) + if aliased_encoding is not None: + modnames = [aliased_encoding, + norm_encoding] + else: + modnames = [norm_encoding] + for modname in modnames: + if not modname or '.' in modname: + continue + try: + # Import is absolute to prevent the possibly malicious import of a + # module with side-effects that is not in the 'encodings' package. + mod = __import__('encodings.' + modname, fromlist=_import_tail, + level=0) + except ImportError: + pass + else: + break + else: + mod = None + + try: + getregentry = mod.getregentry + except AttributeError: + # Not a codec module + mod = None + + if mod is None: + # Cache misses + _cache[encoding] = None + return None + + # Now ask the module for the registry entry + entry = getregentry() + if not isinstance(entry, codecs.CodecInfo): + if not 4 <= len(entry) <= 7: + raise CodecRegistryError,\ + 'module "%s" (%s) failed to register' % \ + (mod.__name__, mod.__file__) + if not hasattr(entry[0], '__call__') or \ + not hasattr(entry[1], '__call__') or \ + (entry[2] is not None and not hasattr(entry[2], '__call__')) or \ + (entry[3] is not None and not hasattr(entry[3], '__call__')) or \ + (len(entry) > 4 and entry[4] is not None and not hasattr(entry[4], '__call__')) or \ + (len(entry) > 5 and entry[5] is not None and not hasattr(entry[5], '__call__')): + raise CodecRegistryError,\ + 'incompatible codecs in module "%s" (%s)' % \ + (mod.__name__, mod.__file__) + if len(entry)<7 or entry[6] is None: + entry += (None,)*(6-len(entry)) + (mod.__name__.split(".", 1)[1],) + entry = codecs.CodecInfo(*entry) + + # Cache the codec registry entry + _cache[encoding] = entry + + # Register its aliases (without overwriting previously registered + # aliases) + try: + codecaliases = mod.getaliases() + except AttributeError: + pass + else: + for alias in codecaliases: + if alias not in _aliases: + _aliases[alias] = modname + + # Return the registry entry + return entry + +# Register the search_function in the Python codec registry +codecs.register(search_function) diff --git a/PythonEnv/2.7/Lib/encodings/__init__.pyc b/PythonEnv/2.7/Lib/encodings/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eceeb57533db1ca471c460c3077b4c0dedaf40d7 GIT binary patch literal 4358 zcmcInUvt~W5nlilCDN2F$&Q^&+w`K;Lpl{XaoWVLr`$+uJ|CT{wSV zt$+R7>7#&(9|!+G#z+4iOGtEt)uPa**rFp4_;V<>Y3$IELss!!g^nr|fqRKU&{YbT zs1Jc<3afOqLeilj1Zos6ldO}xL_M3r75WX)InmRj28A_#I9jE!ZiveyEgD`Sd6~{F zoMY2L>k`|wRUr}wnV*Ed3dN>Of;5bhzTOo3elYU;vR)VXnRD#VvO$`Nl244&a2iW3 zd?kg>QYAwXB_bO{T1*NBEFVTn2Kai`$@T4|p$z82Ej2T@iqVXh_W0_=7*qz}rvanPzr+2qAnKg@hJn(}7%w1e2S0Ya)smhFGFO6{; z-y?!T)$;>+FZaPaqAxQg`#4C=U|;*AT$An?@9ZYMRHWS@{AR3t3^QI9*xujGkMqU9 zN{Hhq8|1!{Y76dR8`YLk6eWQ&*YjiJ9cH+&SMnm9O8Vnt6~SzQ1SvMK2~|dupJkbf zy3-6XJ03)Eg&z(iG65lDuNBE+j1#-%_2O3A=KA*xzQl!0k z;+Y&}UvQc5O>vMw3KoKSY`0lUkWdbN=VPQaKXih0d}R__|HZ>cd!O(B(miw$eY;%rBXF-5$vf?@X;$+ zBtY9D_n-xuS~ix9w>^)M&hxUmdB{Q6^Kve1k)iZWP&@aYeO3aXe&%^m z5@ntT_;Oiu2OrHu)e6`M{-7Js4nF!JmJENUN1fZG-lfc@Q|vgDKY|`sxRs%yoDn7H zY-meM%rmTVa$tYB!VL+;L5nr(KXE?nmEa6edAX_zK;U4MOuj+v<5Z1MVOr#9s_&uN zV$?#?_T$OGPo`t3qQF1_3kL&V`2k={3waXANsh!}n&qI-OH~O?1uztqiYB(u0o?W{ zj3EqtN={-RcbManxiL)9AB`gACmQ;tDIAXhZ;o}|*q>x9 zttWAmB9YNR%qK0vvkAh<+q!abSWRLtay#UqL)AN-(#IU(Zku*h08(-7%Hdxeskp}|w3 zlP;ZB=+j?4rZW`X5;gQWs{u8tlKLY(Kj)g9362aZ6Z^UI<3;MPG`&Dy#d}!hIbjPR?d=G^aMO??+R|syKoCG zeIL}pDR2Oq;FX5)%_#SW zMg-u`=6RjMwS{+Izn1G7UNebyiTxGAOFfHj+(B&EohC52((g>Pumie?<7~~?@|ua{ zN|7^p9@HGs%W7BdIowRx4DShUW5Xs$e>A+DZKiWuvZM?7>mnsbgn;Qa}DzBwXTCSIOYX- z50I#JB20MsdBrT`t}zpXlvm731}Te%0@uJ1X(Efxj#m%7H~=vlEKodUxRHU>UGuFO zAI$TG*MaOZ1h&g@+_1O?P1#&C^lF2yW)R_53u7!^0L&=hvgL)FdT^iTx$IzZ(t}`z$NFEFT7l9fXT+W8!9KFo}h?jY5GhQejj4hzuH(4!T-B?`ui_bCi z{{-)BYCi9K<-GqHZ^c;1*{~W`rPi>nSloty)*Ds^vIWL9JR9d&#ca4%2qs zZrF9J;?%4SYZKg#b=|s#-yh)j1N`PYo7Vf*hEuON)|!!Dh30jqWfFni>Um)rz{LWz z3CcY2UF?v{$>P4o%MD(>%L{wheI1Jl{KGUIO(%;)IG7>N$9dE_wN28wZDwa>Wg#s5 pXQ=<8N3xdtd8vK$JsoD+Puwhr>t(sM>*6cT&+V$F({{#p{DC7VD literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/__init__.pyo b/PythonEnv/2.7/Lib/encodings/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..eceeb57533db1ca471c460c3077b4c0dedaf40d7 GIT binary patch literal 4358 zcmcInUvt~W5nlilCDN2F$&Q^&+w`K;Lpl{XaoWVLr`$+uJ|CT{wSV zt$+R7>7#&(9|!+G#z+4iOGtEt)uPa**rFp4_;V<>Y3$IELss!!g^nr|fqRKU&{YbT zs1Jc<3afOqLeilj1Zos6ldO}xL_M3r75WX)InmRj28A_#I9jE!ZiveyEgD`Sd6~{F zoMY2L>k`|wRUr}wnV*Ed3dN>Of;5bhzTOo3elYU;vR)VXnRD#VvO$`Nl244&a2iW3 zd?kg>QYAwXB_bO{T1*NBEFVTn2Kai`$@T4|p$z82Ej2T@iqVXh_W0_=7*qz}rvanPzr+2qAnKg@hJn(}7%w1e2S0Ya)smhFGFO6{; z-y?!T)$;>+FZaPaqAxQg`#4C=U|;*AT$An?@9ZYMRHWS@{AR3t3^QI9*xujGkMqU9 zN{Hhq8|1!{Y76dR8`YLk6eWQ&*YjiJ9cH+&SMnm9O8Vnt6~SzQ1SvMK2~|dupJkbf zy3-6XJ03)Eg&z(iG65lDuNBE+j1#-%_2O3A=KA*xzQl!0k z;+Y&}UvQc5O>vMw3KoKSY`0lUkWdbN=VPQaKXih0d}R__|HZ>cd!O(B(miw$eY;%rBXF-5$vf?@X;$+ zBtY9D_n-xuS~ix9w>^)M&hxUmdB{Q6^Kve1k)iZWP&@aYeO3aXe&%^m z5@ntT_;Oiu2OrHu)e6`M{-7Js4nF!JmJENUN1fZG-lfc@Q|vgDKY|`sxRs%yoDn7H zY-meM%rmTVa$tYB!VL+;L5nr(KXE?nmEa6edAX_zK;U4MOuj+v<5Z1MVOr#9s_&uN zV$?#?_T$OGPo`t3qQF1_3kL&V`2k={3waXANsh!}n&qI-OH~O?1uztqiYB(u0o?W{ zj3EqtN={-RcbManxiL)9AB`gACmQ;tDIAXhZ;o}|*q>x9 zttWAmB9YNR%qK0vvkAh<+q!abSWRLtay#UqL)AN-(#IU(Zku*h08(-7%Hdxeskp}|w3 zlP;ZB=+j?4rZW`X5;gQWs{u8tlKLY(Kj)g9362aZ6Z^UI<3;MPG`&Dy#d}!hIbjPR?d=G^aMO??+R|syKoCG zeIL}pDR2Oq;FX5)%_#SW zMg-u`=6RjMwS{+Izn1G7UNebyiTxGAOFfHj+(B&EohC52((g>Pumie?<7~~?@|ua{ zN|7^p9@HGs%W7BdIowRx4DShUW5Xs$e>A+DZKiWuvZM?7>mnsbgn;Qa}DzBwXTCSIOYX- z50I#JB20MsdBrT`t}zpXlvm731}Te%0@uJ1X(Efxj#m%7H~=vlEKodUxRHU>UGuFO zAI$TG*MaOZ1h&g@+_1O?P1#&C^lF2yW)R_53u7!^0L&=hvgL)FdT^iTx$IzZ(t}`z$NFEFT7l9fXT+W8!9KFo}h?jY5GhQejj4hzuH(4!T-B?`ui_bCi z{{-)BYCi9K<-GqHZ^c;1*{~W`rPi>nSloty)*Ds^vIWL9JR9d&#ca4%2qs zZrF9J;?%4SYZKg#b=|s#-yh)j1N`PYo7Vf*hEuON)|!!Dh30jqWfFni>Um)rz{LWz z3CcY2UF?v{$>P4o%MD(>%L{wheI1Jl{KGUIO(%;)IG7>N$9dE_wN28wZDwa>Wg#s5 pXQ=<8N3xdtd8vK$JsoD+Puwhr>t(sM>*6cT&+V$F({{#p{DC7VD literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/aliases.py b/PythonEnv/2.7/Lib/encodings/aliases.py new file mode 100644 index 0000000000..a54cf774b7 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/aliases.py @@ -0,0 +1,527 @@ +""" Encoding Aliases Support + + This module is used by the encodings package search function to + map encodings names to module names. + + Note that the search function normalizes the encoding names before + doing the lookup, so the mapping will have to map normalized + encoding names to module names. + + Contents: + + The following aliases dictionary contains mappings of all IANA + character set names for which the Python core library provides + codecs. In addition to these, a few Python specific codec + aliases have also been added. + +""" +aliases = { + + # Please keep this list sorted alphabetically by value ! + + # ascii codec + '646' : 'ascii', + 'ansi_x3.4_1968' : 'ascii', + 'ansi_x3_4_1968' : 'ascii', # some email headers use this non-standard name + 'ansi_x3.4_1986' : 'ascii', + 'cp367' : 'ascii', + 'csascii' : 'ascii', + 'ibm367' : 'ascii', + 'iso646_us' : 'ascii', + 'iso_646.irv_1991' : 'ascii', + 'iso_ir_6' : 'ascii', + 'us' : 'ascii', + 'us_ascii' : 'ascii', + + # base64_codec codec + 'base64' : 'base64_codec', + 'base_64' : 'base64_codec', + + # big5 codec + 'big5_tw' : 'big5', + 'csbig5' : 'big5', + + # big5hkscs codec + 'big5_hkscs' : 'big5hkscs', + 'hkscs' : 'big5hkscs', + + # bz2_codec codec + 'bz2' : 'bz2_codec', + + # cp037 codec + '037' : 'cp037', + 'csibm037' : 'cp037', + 'ebcdic_cp_ca' : 'cp037', + 'ebcdic_cp_nl' : 'cp037', + 'ebcdic_cp_us' : 'cp037', + 'ebcdic_cp_wt' : 'cp037', + 'ibm037' : 'cp037', + 'ibm039' : 'cp037', + + # cp1026 codec + '1026' : 'cp1026', + 'csibm1026' : 'cp1026', + 'ibm1026' : 'cp1026', + + # cp1140 codec + '1140' : 'cp1140', + 'ibm1140' : 'cp1140', + + # cp1250 codec + '1250' : 'cp1250', + 'windows_1250' : 'cp1250', + + # cp1251 codec + '1251' : 'cp1251', + 'windows_1251' : 'cp1251', + + # cp1252 codec + '1252' : 'cp1252', + 'windows_1252' : 'cp1252', + + # cp1253 codec + '1253' : 'cp1253', + 'windows_1253' : 'cp1253', + + # cp1254 codec + '1254' : 'cp1254', + 'windows_1254' : 'cp1254', + + # cp1255 codec + '1255' : 'cp1255', + 'windows_1255' : 'cp1255', + + # cp1256 codec + '1256' : 'cp1256', + 'windows_1256' : 'cp1256', + + # cp1257 codec + '1257' : 'cp1257', + 'windows_1257' : 'cp1257', + + # cp1258 codec + '1258' : 'cp1258', + 'windows_1258' : 'cp1258', + + # cp424 codec + '424' : 'cp424', + 'csibm424' : 'cp424', + 'ebcdic_cp_he' : 'cp424', + 'ibm424' : 'cp424', + + # cp437 codec + '437' : 'cp437', + 'cspc8codepage437' : 'cp437', + 'ibm437' : 'cp437', + + # cp500 codec + '500' : 'cp500', + 'csibm500' : 'cp500', + 'ebcdic_cp_be' : 'cp500', + 'ebcdic_cp_ch' : 'cp500', + 'ibm500' : 'cp500', + + # cp775 codec + '775' : 'cp775', + 'cspc775baltic' : 'cp775', + 'ibm775' : 'cp775', + + # cp850 codec + '850' : 'cp850', + 'cspc850multilingual' : 'cp850', + 'ibm850' : 'cp850', + + # cp852 codec + '852' : 'cp852', + 'cspcp852' : 'cp852', + 'ibm852' : 'cp852', + + # cp855 codec + '855' : 'cp855', + 'csibm855' : 'cp855', + 'ibm855' : 'cp855', + + # cp857 codec + '857' : 'cp857', + 'csibm857' : 'cp857', + 'ibm857' : 'cp857', + + # cp858 codec + '858' : 'cp858', + 'csibm858' : 'cp858', + 'ibm858' : 'cp858', + + # cp860 codec + '860' : 'cp860', + 'csibm860' : 'cp860', + 'ibm860' : 'cp860', + + # cp861 codec + '861' : 'cp861', + 'cp_is' : 'cp861', + 'csibm861' : 'cp861', + 'ibm861' : 'cp861', + + # cp862 codec + '862' : 'cp862', + 'cspc862latinhebrew' : 'cp862', + 'ibm862' : 'cp862', + + # cp863 codec + '863' : 'cp863', + 'csibm863' : 'cp863', + 'ibm863' : 'cp863', + + # cp864 codec + '864' : 'cp864', + 'csibm864' : 'cp864', + 'ibm864' : 'cp864', + + # cp865 codec + '865' : 'cp865', + 'csibm865' : 'cp865', + 'ibm865' : 'cp865', + + # cp866 codec + '866' : 'cp866', + 'csibm866' : 'cp866', + 'ibm866' : 'cp866', + + # cp869 codec + '869' : 'cp869', + 'cp_gr' : 'cp869', + 'csibm869' : 'cp869', + 'ibm869' : 'cp869', + + # cp932 codec + '932' : 'cp932', + 'ms932' : 'cp932', + 'mskanji' : 'cp932', + 'ms_kanji' : 'cp932', + + # cp949 codec + '949' : 'cp949', + 'ms949' : 'cp949', + 'uhc' : 'cp949', + + # cp950 codec + '950' : 'cp950', + 'ms950' : 'cp950', + + # euc_jis_2004 codec + 'jisx0213' : 'euc_jis_2004', + 'eucjis2004' : 'euc_jis_2004', + 'euc_jis2004' : 'euc_jis_2004', + + # euc_jisx0213 codec + 'eucjisx0213' : 'euc_jisx0213', + + # euc_jp codec + 'eucjp' : 'euc_jp', + 'ujis' : 'euc_jp', + 'u_jis' : 'euc_jp', + + # euc_kr codec + 'euckr' : 'euc_kr', + 'korean' : 'euc_kr', + 'ksc5601' : 'euc_kr', + 'ks_c_5601' : 'euc_kr', + 'ks_c_5601_1987' : 'euc_kr', + 'ksx1001' : 'euc_kr', + 'ks_x_1001' : 'euc_kr', + + # gb18030 codec + 'gb18030_2000' : 'gb18030', + + # gb2312 codec + 'chinese' : 'gb2312', + 'csiso58gb231280' : 'gb2312', + 'euc_cn' : 'gb2312', + 'euccn' : 'gb2312', + 'eucgb2312_cn' : 'gb2312', + 'gb2312_1980' : 'gb2312', + 'gb2312_80' : 'gb2312', + 'iso_ir_58' : 'gb2312', + + # gbk codec + '936' : 'gbk', + 'cp936' : 'gbk', + 'ms936' : 'gbk', + + # hex_codec codec + 'hex' : 'hex_codec', + + # hp_roman8 codec + 'roman8' : 'hp_roman8', + 'r8' : 'hp_roman8', + 'csHPRoman8' : 'hp_roman8', + + # hz codec + 'hzgb' : 'hz', + 'hz_gb' : 'hz', + 'hz_gb_2312' : 'hz', + + # iso2022_jp codec + 'csiso2022jp' : 'iso2022_jp', + 'iso2022jp' : 'iso2022_jp', + 'iso_2022_jp' : 'iso2022_jp', + + # iso2022_jp_1 codec + 'iso2022jp_1' : 'iso2022_jp_1', + 'iso_2022_jp_1' : 'iso2022_jp_1', + + # iso2022_jp_2 codec + 'iso2022jp_2' : 'iso2022_jp_2', + 'iso_2022_jp_2' : 'iso2022_jp_2', + + # iso2022_jp_2004 codec + 'iso_2022_jp_2004' : 'iso2022_jp_2004', + 'iso2022jp_2004' : 'iso2022_jp_2004', + + # iso2022_jp_3 codec + 'iso2022jp_3' : 'iso2022_jp_3', + 'iso_2022_jp_3' : 'iso2022_jp_3', + + # iso2022_jp_ext codec + 'iso2022jp_ext' : 'iso2022_jp_ext', + 'iso_2022_jp_ext' : 'iso2022_jp_ext', + + # iso2022_kr codec + 'csiso2022kr' : 'iso2022_kr', + 'iso2022kr' : 'iso2022_kr', + 'iso_2022_kr' : 'iso2022_kr', + + # iso8859_10 codec + 'csisolatin6' : 'iso8859_10', + 'iso_8859_10' : 'iso8859_10', + 'iso_8859_10_1992' : 'iso8859_10', + 'iso_ir_157' : 'iso8859_10', + 'l6' : 'iso8859_10', + 'latin6' : 'iso8859_10', + + # iso8859_11 codec + 'thai' : 'iso8859_11', + 'iso_8859_11' : 'iso8859_11', + 'iso_8859_11_2001' : 'iso8859_11', + + # iso8859_13 codec + 'iso_8859_13' : 'iso8859_13', + 'l7' : 'iso8859_13', + 'latin7' : 'iso8859_13', + + # iso8859_14 codec + 'iso_8859_14' : 'iso8859_14', + 'iso_8859_14_1998' : 'iso8859_14', + 'iso_celtic' : 'iso8859_14', + 'iso_ir_199' : 'iso8859_14', + 'l8' : 'iso8859_14', + 'latin8' : 'iso8859_14', + + # iso8859_15 codec + 'iso_8859_15' : 'iso8859_15', + 'l9' : 'iso8859_15', + 'latin9' : 'iso8859_15', + + # iso8859_16 codec + 'iso_8859_16' : 'iso8859_16', + 'iso_8859_16_2001' : 'iso8859_16', + 'iso_ir_226' : 'iso8859_16', + 'l10' : 'iso8859_16', + 'latin10' : 'iso8859_16', + + # iso8859_2 codec + 'csisolatin2' : 'iso8859_2', + 'iso_8859_2' : 'iso8859_2', + 'iso_8859_2_1987' : 'iso8859_2', + 'iso_ir_101' : 'iso8859_2', + 'l2' : 'iso8859_2', + 'latin2' : 'iso8859_2', + + # iso8859_3 codec + 'csisolatin3' : 'iso8859_3', + 'iso_8859_3' : 'iso8859_3', + 'iso_8859_3_1988' : 'iso8859_3', + 'iso_ir_109' : 'iso8859_3', + 'l3' : 'iso8859_3', + 'latin3' : 'iso8859_3', + + # iso8859_4 codec + 'csisolatin4' : 'iso8859_4', + 'iso_8859_4' : 'iso8859_4', + 'iso_8859_4_1988' : 'iso8859_4', + 'iso_ir_110' : 'iso8859_4', + 'l4' : 'iso8859_4', + 'latin4' : 'iso8859_4', + + # iso8859_5 codec + 'csisolatincyrillic' : 'iso8859_5', + 'cyrillic' : 'iso8859_5', + 'iso_8859_5' : 'iso8859_5', + 'iso_8859_5_1988' : 'iso8859_5', + 'iso_ir_144' : 'iso8859_5', + + # iso8859_6 codec + 'arabic' : 'iso8859_6', + 'asmo_708' : 'iso8859_6', + 'csisolatinarabic' : 'iso8859_6', + 'ecma_114' : 'iso8859_6', + 'iso_8859_6' : 'iso8859_6', + 'iso_8859_6_1987' : 'iso8859_6', + 'iso_ir_127' : 'iso8859_6', + + # iso8859_7 codec + 'csisolatingreek' : 'iso8859_7', + 'ecma_118' : 'iso8859_7', + 'elot_928' : 'iso8859_7', + 'greek' : 'iso8859_7', + 'greek8' : 'iso8859_7', + 'iso_8859_7' : 'iso8859_7', + 'iso_8859_7_1987' : 'iso8859_7', + 'iso_ir_126' : 'iso8859_7', + + # iso8859_8 codec + 'csisolatinhebrew' : 'iso8859_8', + 'hebrew' : 'iso8859_8', + 'iso_8859_8' : 'iso8859_8', + 'iso_8859_8_1988' : 'iso8859_8', + 'iso_ir_138' : 'iso8859_8', + + # iso8859_9 codec + 'csisolatin5' : 'iso8859_9', + 'iso_8859_9' : 'iso8859_9', + 'iso_8859_9_1989' : 'iso8859_9', + 'iso_ir_148' : 'iso8859_9', + 'l5' : 'iso8859_9', + 'latin5' : 'iso8859_9', + + # johab codec + 'cp1361' : 'johab', + 'ms1361' : 'johab', + + # koi8_r codec + 'cskoi8r' : 'koi8_r', + + # latin_1 codec + # + # Note that the latin_1 codec is implemented internally in C and a + # lot faster than the charmap codec iso8859_1 which uses the same + # encoding. This is why we discourage the use of the iso8859_1 + # codec and alias it to latin_1 instead. + # + '8859' : 'latin_1', + 'cp819' : 'latin_1', + 'csisolatin1' : 'latin_1', + 'ibm819' : 'latin_1', + 'iso8859' : 'latin_1', + 'iso8859_1' : 'latin_1', + 'iso_8859_1' : 'latin_1', + 'iso_8859_1_1987' : 'latin_1', + 'iso_ir_100' : 'latin_1', + 'l1' : 'latin_1', + 'latin' : 'latin_1', + 'latin1' : 'latin_1', + + # mac_cyrillic codec + 'maccyrillic' : 'mac_cyrillic', + + # mac_greek codec + 'macgreek' : 'mac_greek', + + # mac_iceland codec + 'maciceland' : 'mac_iceland', + + # mac_latin2 codec + 'maccentraleurope' : 'mac_latin2', + 'maclatin2' : 'mac_latin2', + + # mac_roman codec + 'macroman' : 'mac_roman', + + # mac_turkish codec + 'macturkish' : 'mac_turkish', + + # mbcs codec + 'dbcs' : 'mbcs', + + # ptcp154 codec + 'csptcp154' : 'ptcp154', + 'pt154' : 'ptcp154', + 'cp154' : 'ptcp154', + 'cyrillic_asian' : 'ptcp154', + + # quopri_codec codec + 'quopri' : 'quopri_codec', + 'quoted_printable' : 'quopri_codec', + 'quotedprintable' : 'quopri_codec', + + # rot_13 codec + 'rot13' : 'rot_13', + + # shift_jis codec + 'csshiftjis' : 'shift_jis', + 'shiftjis' : 'shift_jis', + 'sjis' : 'shift_jis', + 's_jis' : 'shift_jis', + + # shift_jis_2004 codec + 'shiftjis2004' : 'shift_jis_2004', + 'sjis_2004' : 'shift_jis_2004', + 's_jis_2004' : 'shift_jis_2004', + + # shift_jisx0213 codec + 'shiftjisx0213' : 'shift_jisx0213', + 'sjisx0213' : 'shift_jisx0213', + 's_jisx0213' : 'shift_jisx0213', + + # tactis codec + 'tis260' : 'tactis', + + # tis_620 codec + 'tis620' : 'tis_620', + 'tis_620_0' : 'tis_620', + 'tis_620_2529_0' : 'tis_620', + 'tis_620_2529_1' : 'tis_620', + 'iso_ir_166' : 'tis_620', + + # utf_16 codec + 'u16' : 'utf_16', + 'utf16' : 'utf_16', + + # utf_16_be codec + 'unicodebigunmarked' : 'utf_16_be', + 'utf_16be' : 'utf_16_be', + + # utf_16_le codec + 'unicodelittleunmarked' : 'utf_16_le', + 'utf_16le' : 'utf_16_le', + + # utf_32 codec + 'u32' : 'utf_32', + 'utf32' : 'utf_32', + + # utf_32_be codec + 'utf_32be' : 'utf_32_be', + + # utf_32_le codec + 'utf_32le' : 'utf_32_le', + + # utf_7 codec + 'u7' : 'utf_7', + 'utf7' : 'utf_7', + 'unicode_1_1_utf_7' : 'utf_7', + + # utf_8 codec + 'u8' : 'utf_8', + 'utf' : 'utf_8', + 'utf8' : 'utf_8', + 'utf8_ucs2' : 'utf_8', + 'utf8_ucs4' : 'utf_8', + + # uu_codec codec + 'uu' : 'uu_codec', + + # zlib_codec codec + 'zip' : 'zlib_codec', + 'zlib' : 'zlib_codec', + +} diff --git a/PythonEnv/2.7/Lib/encodings/aliases.pyc b/PythonEnv/2.7/Lib/encodings/aliases.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29d84a61d116e77d8a7369fce4f10cb0d7fe0531 GIT binary patch literal 8765 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 Z^God&@eInfmYr6u<+Pl2d);o;egW`DpF{uv literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/base64_codec.py b/PythonEnv/2.7/Lib/encodings/base64_codec.py new file mode 100644 index 0000000000..f84e7808e9 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/base64_codec.py @@ -0,0 +1,79 @@ +""" Python 'base64_codec' Codec - base64 content transfer encoding + + Unlike most of the other codecs which target Unicode, this codec + will return Python string objects for both encode and decode. + + Written by Marc-Andre Lemburg (mal@lemburg.com). + +""" +import codecs, base64 + +### Codec APIs + +def base64_encode(input,errors='strict'): + + """ Encodes the object input and returns a tuple (output + object, length consumed). + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + output = base64.encodestring(input) + return (output, len(input)) + +def base64_decode(input,errors='strict'): + + """ Decodes the object input and returns a tuple (output + object, length consumed). + + input must be an object which provides the bf_getreadbuf + buffer slot. Python strings, buffer objects and memory + mapped files are examples of objects providing this slot. + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + output = base64.decodestring(input) + return (output, len(input)) + +class Codec(codecs.Codec): + + def encode(self, input,errors='strict'): + return base64_encode(input,errors) + def decode(self, input,errors='strict'): + return base64_decode(input,errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + assert self.errors == 'strict' + return base64.encodestring(input) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + assert self.errors == 'strict' + return base64.decodestring(input) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='base64', + encode=base64_encode, + decode=base64_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/PythonEnv/2.7/Lib/encodings/base64_codec.pyc b/PythonEnv/2.7/Lib/encodings/base64_codec.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e381b63f6cfc0fdea5c162b985aa91e8188074d GIT binary patch literal 3763 zcmdT{+io015Up8zFW&eP3`SU3sKtvnl5GSEAR-jSaU97KvCvouVOd(u&h*;j%w^Tx zgIOuOBzfY)c;R#SfN-jMcgHyJ;5Z-{dwOfSdb+DmovP}Y`+ceV{FmxUOp|L4zYlQR zU(qB)$7lme8k7Ze48h9{I&M%hN69?BL_Y-lH$|SOq(wTQ^Ck^3xJ@sKUJ(6o+@z!< zik2uAW{MUiT~V|}acib%Q?f|9DY^~~vEtH9*Ps#_4<%1pOF$!&f(?y})Wy?1y& zuh6J($L_2w)aD?v`ir~$xJ-1ssrL9sZ7bia;<9kMaLSpeutRN>E-)}HPP<)&>$@UL zpK6tt)~Rx++?iG-8iV&Rja3(CX?&(!WKOli;FPC4Wu3tq zsvMl_*jY6!jT&HLzq(dYktocM$#%RQ-<#CIPBj>-Cy|M_cZYy&)~>_eumH> zH#d2NSB`o-jqL;gc%Pxt)}tajQE4%%oS5(TYgMFNHOjQ=m6d}|0AXbP*0)rqi&JbI zey~-p6E>aId}(7!V*$i4EhfuImpTJJ8RO?l6^%yOct;&L9v4*^&~)W&icP=w&H5GZ zG5AM(S!81sSH^$>kZd&?mB#60_WqUi*iW@{C#Hq~gnIL6+%lS7YqfD{S?sg<;sDPz zw+OA!OMCYNS0e1c$G@(LM&OfI{N6?M!1bUeY3vA+3YkOQW~JNtb41!LHBnAOlS47rd1=P8*K=@ACu*2xU}c0j)IUWzIBq#b zOyBcn2uV2`$XfqnYKL$vg&g}rW1pNnjYFosa5!WRhfJ-o&3(9UN?E_qhnUDyc9|(F zv9iY*IOZkzV#^-lwhE0#IY3^MYQ`lC#RPI=Qoh0?Z!88<%%L~E_aIx24kSY4MP$Ag zobY((hth@}h(20*&sJx{ddqLTTgJ;r<|jNU?}UPD8rH=-epj4i-jY!sd#(}_qkNKM z5c>Th%5}f*c;S9OFOw?6W60=*oCRw%M7mzi3U6VCZQPb&ZZ#GgZWY2o5gVN&RY%#r zlpgcC``^Pj?|v;__a_#(oV_>$l`$4?e+&Vo?p&zCRd9{#A6LN!ouljpTm^m2JFN4( zr}!))LMG4^^o63RTTxacaZL~y%g=EO2o$UZ0)M!IuJAS*S>kb&SuL>F>%0l#d~CYQ zi!n5<;40paB&GjX@Lqt8SMUy*ATjD> z$`o~oS2?vJqvKNqk($i&85Q3oPCiHw82A*y*$Lkuu8j|p_EC>1a|ksNCoU;ub+Qt+ zr*(Gm+1Om|_W96A0YvG8*Dl0smpb^Qp-qpyCTBN3Ajj76>Qb)`ieV{LB;>>ya@2)P zijX}K^7e1!P{)Z=4m_twlV nh95z3GedciuYK9L&oVwgIPZKgzqq`(y53%It~WR4Hky9`a5X;9 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/big5.py b/PythonEnv/2.7/Lib/encodings/big5.py new file mode 100644 index 0000000000..7adeb0e160 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/big5.py @@ -0,0 +1,39 @@ +# +# big5.py: Python Unicode Codec for BIG5 +# +# Written by Hye-Shik Chang +# + +import _codecs_tw, codecs +import _multibytecodec as mbc + +codec = _codecs_tw.getcodec('big5') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='big5', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/big5.pyc b/PythonEnv/2.7/Lib/encodings/big5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2641906c0ae42faeb390777255f4e0ffc81250d4 GIT binary patch literal 1735 zcmc&!O^?$s5S@H9{n&Ji5TFGlBslfN0SO@?gjN&|dsu|r10t#vwXs`LH7QD5t$L-L z_>24uegM3gY}0BNF1<8~o$<`ro;RLn?{~NJ{pad3q3g%T{~WFSg-+vhXh9U!vO|%x z)w>jVWQgWIX_q!IHAq9_&^(|i+7IR0; zt=iln4MQLvC*l#()Fa)gJwnnjR32UNI2Dhu_BbWoeRS_KvoseB4)@Ot!VZNDz_7q3Q(bTX1jX+A4Q9P#sSYsDdkXeGl4 zoVH`{Lb%A2!el15ht|iPt?Wv?gZWK`VK&z`YsRdqI7S z!1$2v?FGj98`{E*GiAow93!MQLO82Ka_lao&qZpF5)xPM<6TH~0rj98u>KsK1^+>H zd| +# + +import _codecs_hk, codecs +import _multibytecodec as mbc + +codec = _codecs_hk.getcodec('big5hkscs') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='big5hkscs', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/big5hkscs.pyc b/PythonEnv/2.7/Lib/encodings/big5hkscs.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c606187b1799217ddc5f4368c53a6559e660f35 GIT binary patch literal 1775 zcmc&!OK;Oa5FS6`JnAF}0V*JI;DB=CfP|0`LKT5S53SJVfUqK2iPuS-CJyp$gmNXE z_>24uegJ$kZk(uv3q929UC++UuIKfQ_p9Cd_G5jP(B>@pc@uTnr$Mg+|FYkB&TSLqIGetl zU6{n!8g~7aPLnDo4mj^H%_A)E7ZFHZntS3t2%jRK)Sw3`_4v4LV2R^=v`pjJwq&zh z>GguQtdQ{iHUO38ObZDX$nq9QNGS6RRR8txMK&JFp)8-8VP*F7FB`>n zhM0zv7&uMG-UV@*Cq=qUb30mmke?OT9phkBjzw+fjvjv4_J=mtOm+JLQ-ZZL$lR3G%%`*X{M$7oXcl41lY z29H!wwy*CJOvP1p39LdQXC$M@Dl&S&_$r~4zX=uvphh}FpRszHPga7j{m&Jbv*M~z zY^36N{69GC5spt&ST_Y!i_H^k4TFV%7QG;PPV~cGgOWv= zXv)OWY@$g?TP9jEab`BrqNGE*A#;l~#1ofibBmO$Oy`zlZgn=dM9Epc*lV-mz3w@- zXFDKL-%s3OS*VS{lkI+7COY0wJN%_CD-5Z)%tuCBn_`VFupliC+HHl;{US>rX_c4O zsdA{?p;je2gIjRBRgVwT_)xjX9B7BdDGy)5vefz&vdQB#%aqY>Y>KHS))_oQm4hQ4 zJFAAJQ3Gu3pRQF@Bntauvn{X3^&}cOov6V?h0!E0G5@W04tqeCp(%6qBufY0wyn{m z((7>q4NdBtE<_RBeJ?Wc$>7V%Qx+Z%Ns>Uv^ zL1d6{+u`9)(LEJpJgSjhBS-WsAO{50=qX|!&@T{b^GHg=I?a*G|Ut@o+; zL8ZlL?8JEQEvq8s#-mKDZaH?C6Dv3_-f@>yri%l(EiMZ?&UM17^E7|7F{QC^<1j6% z$HEigvp{qXyvP+E~g1GObr}Wf=<8UJF)(HwuN{ z845QA>i-=SJg)LFNIYP2Rq&};GBV{)=@f~BVINdBI!XrP;Vh7lhaj5GO1JfQ3foJn znw)Z(xtr^}G?UrwIba6z4$}-kj6gm8bCd(tmUGJVKCg!0lGBGg>n%oeh`>_FbQd&n zHuFg~WULEzL&k2%zzSPDhIV?W`gHjbw(wA0VWeq0=Z9NMTaz zxS*lbK(1BAE$n$Uv5;aW+qCUKw#(>{^N<3OG;`>Fi`T zc{+09wQL3jC)A2*?M>=HdJ`IXuYZQ!Dvf+5WApp{BFc5YFX8X^^D-G{xD45EA*Z^z zA4EDqehSav_D|3(d$(EZ)Z7|`J4I}Cj$|BVzPOlIqrQoCuSQ+t7~`XkV@zGn5Dh~3 zd3#CFlJnT-+$8*45MC{Rj0TvFI#{ElIv;@e5}Q(0`*wZ47vu{=1pd6MW5?Xs+uo^o zg6z*`PHBTQA;mM4(D7Y!|DC{fQc3##v`AgQe+9dEwghXzl1CGpJTvkuTmao>lg&87 zKgj?feZqIRV@X&!%*OW6J9q|0KamzuhGPUwKb3_7 zu&cP;E~2BL3ER%qV&0J3%r;gB{DnzXl!W|K7K_HbHe_Up?w;AK?5Xq;<8aE%4{ykkxbhPfUgnu*YqF81qiZ&~(h`9v}Jg2Y6S~a~g2ExWS7T z(fOi*ngE%6CZ5suH5B?7yWK|<>zlz#%7i$B{?E!NDDrTwObk&zY^b38a|k|X`X2;P zD*^6gfnW0QJAjiP0g%7&`j2-Iy!X2nvTLi?WnAxKnuretax9!51SB1$^WyD~Ip+AV zKWi9q5njv?FMhYh+Y$%R5AeBNn=Z#o-hucHGq#SOE~mgd#jupKS;$8rNsS>xBIGcH z3f<{LDb-ru9S(2=F_Ry$o8_cVD6P$x{<>V&;TS$5C1s2w(M8DKC#<>GjTilsf+1`8 k8d~xbuKL5+*X$R|B?n9hIt!hZ&f0ow{p|Ych5CiYUx8)SdH?_b literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/charmap.py b/PythonEnv/2.7/Lib/encodings/charmap.py new file mode 100644 index 0000000000..81189b161a --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/charmap.py @@ -0,0 +1,69 @@ +""" Generic Python Character Mapping Codec. + + Use this codec directly rather than through the automatic + conversion mechanisms supplied by unicode() and .encode(). + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.charmap_encode + decode = codecs.charmap_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict', mapping=None): + codecs.IncrementalEncoder.__init__(self, errors) + self.mapping = mapping + + def encode(self, input, final=False): + return codecs.charmap_encode(input, self.errors, self.mapping)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def __init__(self, errors='strict', mapping=None): + codecs.IncrementalDecoder.__init__(self, errors) + self.mapping = mapping + + def decode(self, input, final=False): + return codecs.charmap_decode(input, self.errors, self.mapping)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + + def __init__(self,stream,errors='strict',mapping=None): + codecs.StreamWriter.__init__(self,stream,errors) + self.mapping = mapping + + def encode(self,input,errors='strict'): + return Codec.encode(input,errors,self.mapping) + +class StreamReader(Codec,codecs.StreamReader): + + def __init__(self,stream,errors='strict',mapping=None): + codecs.StreamReader.__init__(self,stream,errors) + self.mapping = mapping + + def decode(self,input,errors='strict'): + return Codec.decode(input,errors,self.mapping) + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='charmap', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/PythonEnv/2.7/Lib/encodings/charmap.pyc b/PythonEnv/2.7/Lib/encodings/charmap.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11ed13ce353c4e5b649164881f4c23c38dca1e64 GIT binary patch literal 3428 zcmd5;ZEGY&5U$y`Y&MCfcX}8(q4g9dq6_MWgX55k@r8g{rK23T1eVE6XLrK9EIqv^ z3;C9O@@M!L{Q+7}b@qiNO5Q#=OZQfHO?Ov6^;AvO|Jv$&{Kw=Vrpu?!|1Y^!e{z=) z^|=oysZkbCpM^S^fKF?4!g7Nyh|Y;#_iL0iMNt<;Yp$qMvL=d#DB5#HgOYVJHPJQc zgg5BSbxle(X1bQ>Hs`t)C0iKu*I?9P_!ew^7!au+O<`;rt6!#WR2FJ)6xk?t#;Sv8 zJWh+D+A9+icRL-$&u^7cZj@Fk#-vJ8Yhss8m5tnpm$*?>aA(WOaK!&cMH5%%kxOG) z9hb!$W2=;p$xY1frd3|4YBC;YsY%rFR85K$JBK?eDiYN-g&*&J=j-AhPin zyG3G+`pM+S6FXF49%U~xKj_9~zQaqxc!!N2Pi;CJIknf*`=6`bEK?feN@-IW`^F?) z)%#h!+SPiu_v>q3mj2C8&ovn#x%%A4j23+h+&gMsVFATN_ihGC0`f@0<142Hwz(RkpmEZR$PS<9d^JfiiYKaAItNYy7S z?L9y8&iv}xQI;Mb$v*7K>ge*2?s%%Pv-j;zw_e8k)lKu#Q?Shz8tz*ZAXBv*t;H>^%3Fi^7TOx>rt;8uj!Ksa{zB^Yw!(P~$g2z{+ zn8&PGq!^!H#P(T!L=0#wm+)PsvQPt@S@`VwA&q>{Qi5hpx9Do_-c~;ao zb1Yb)O_co4Sn(b}kbscvJ!ge}7m7uE^5{0X<7-}aKYT!_-YXxl;WL;wOBMghhdX5n z0Q@D60kkdVL(Kp3Aje5WKWD*5g)g NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x9c' # 0x04 -> CONTROL + u'\t' # 0x05 -> HORIZONTAL TABULATION + u'\x86' # 0x06 -> CONTROL + u'\x7f' # 0x07 -> DELETE + u'\x97' # 0x08 -> CONTROL + u'\x8d' # 0x09 -> CONTROL + u'\x8e' # 0x0A -> CONTROL + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x9d' # 0x14 -> CONTROL + u'\x85' # 0x15 -> CONTROL + u'\x08' # 0x16 -> BACKSPACE + u'\x87' # 0x17 -> CONTROL + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x92' # 0x1A -> CONTROL + u'\x8f' # 0x1B -> CONTROL + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u'\x80' # 0x20 -> CONTROL + u'\x81' # 0x21 -> CONTROL + u'\x82' # 0x22 -> CONTROL + u'\x83' # 0x23 -> CONTROL + u'\x84' # 0x24 -> CONTROL + u'\n' # 0x25 -> LINE FEED + u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK + u'\x1b' # 0x27 -> ESCAPE + u'\x88' # 0x28 -> CONTROL + u'\x89' # 0x29 -> CONTROL + u'\x8a' # 0x2A -> CONTROL + u'\x8b' # 0x2B -> CONTROL + u'\x8c' # 0x2C -> CONTROL + u'\x05' # 0x2D -> ENQUIRY + u'\x06' # 0x2E -> ACKNOWLEDGE + u'\x07' # 0x2F -> BELL + u'\x90' # 0x30 -> CONTROL + u'\x91' # 0x31 -> CONTROL + u'\x16' # 0x32 -> SYNCHRONOUS IDLE + u'\x93' # 0x33 -> CONTROL + u'\x94' # 0x34 -> CONTROL + u'\x95' # 0x35 -> CONTROL + u'\x96' # 0x36 -> CONTROL + u'\x04' # 0x37 -> END OF TRANSMISSION + u'\x98' # 0x38 -> CONTROL + u'\x99' # 0x39 -> CONTROL + u'\x9a' # 0x3A -> CONTROL + u'\x9b' # 0x3B -> CONTROL + u'\x14' # 0x3C -> DEVICE CONTROL FOUR + u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + u'\x9e' # 0x3E -> CONTROL + u'\x1a' # 0x3F -> SUBSTITUTE + u' ' # 0x40 -> SPACE + u'\xa0' # 0x41 -> NO-BREAK SPACE + u'\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + u'\xa2' # 0x4A -> CENT SIGN + u'.' # 0x4B -> FULL STOP + u'<' # 0x4C -> LESS-THAN SIGN + u'(' # 0x4D -> LEFT PARENTHESIS + u'+' # 0x4E -> PLUS SIGN + u'|' # 0x4F -> VERTICAL LINE + u'&' # 0x50 -> AMPERSAND + u'\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + u'\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + u'\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + u'!' # 0x5A -> EXCLAMATION MARK + u'$' # 0x5B -> DOLLAR SIGN + u'*' # 0x5C -> ASTERISK + u')' # 0x5D -> RIGHT PARENTHESIS + u';' # 0x5E -> SEMICOLON + u'\xac' # 0x5F -> NOT SIGN + u'-' # 0x60 -> HYPHEN-MINUS + u'/' # 0x61 -> SOLIDUS + u'\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xa6' # 0x6A -> BROKEN BAR + u',' # 0x6B -> COMMA + u'%' # 0x6C -> PERCENT SIGN + u'_' # 0x6D -> LOW LINE + u'>' # 0x6E -> GREATER-THAN SIGN + u'?' # 0x6F -> QUESTION MARK + u'\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + u'\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + u'`' # 0x79 -> GRAVE ACCENT + u':' # 0x7A -> COLON + u'#' # 0x7B -> NUMBER SIGN + u'@' # 0x7C -> COMMERCIAL AT + u"'" # 0x7D -> APOSTROPHE + u'=' # 0x7E -> EQUALS SIGN + u'"' # 0x7F -> QUOTATION MARK + u'\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + u'a' # 0x81 -> LATIN SMALL LETTER A + u'b' # 0x82 -> LATIN SMALL LETTER B + u'c' # 0x83 -> LATIN SMALL LETTER C + u'd' # 0x84 -> LATIN SMALL LETTER D + u'e' # 0x85 -> LATIN SMALL LETTER E + u'f' # 0x86 -> LATIN SMALL LETTER F + u'g' # 0x87 -> LATIN SMALL LETTER G + u'h' # 0x88 -> LATIN SMALL LETTER H + u'i' # 0x89 -> LATIN SMALL LETTER I + u'\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) + u'\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + u'\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) + u'\xb1' # 0x8F -> PLUS-MINUS SIGN + u'\xb0' # 0x90 -> DEGREE SIGN + u'j' # 0x91 -> LATIN SMALL LETTER J + u'k' # 0x92 -> LATIN SMALL LETTER K + u'l' # 0x93 -> LATIN SMALL LETTER L + u'm' # 0x94 -> LATIN SMALL LETTER M + u'n' # 0x95 -> LATIN SMALL LETTER N + u'o' # 0x96 -> LATIN SMALL LETTER O + u'p' # 0x97 -> LATIN SMALL LETTER P + u'q' # 0x98 -> LATIN SMALL LETTER Q + u'r' # 0x99 -> LATIN SMALL LETTER R + u'\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + u'\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + u'\xb8' # 0x9D -> CEDILLA + u'\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + u'\xa4' # 0x9F -> CURRENCY SIGN + u'\xb5' # 0xA0 -> MICRO SIGN + u'~' # 0xA1 -> TILDE + u's' # 0xA2 -> LATIN SMALL LETTER S + u't' # 0xA3 -> LATIN SMALL LETTER T + u'u' # 0xA4 -> LATIN SMALL LETTER U + u'v' # 0xA5 -> LATIN SMALL LETTER V + u'w' # 0xA6 -> LATIN SMALL LETTER W + u'x' # 0xA7 -> LATIN SMALL LETTER X + u'y' # 0xA8 -> LATIN SMALL LETTER Y + u'z' # 0xA9 -> LATIN SMALL LETTER Z + u'\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + u'\xbf' # 0xAB -> INVERTED QUESTION MARK + u'\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) + u'\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) + u'\xae' # 0xAF -> REGISTERED SIGN + u'^' # 0xB0 -> CIRCUMFLEX ACCENT + u'\xa3' # 0xB1 -> POUND SIGN + u'\xa5' # 0xB2 -> YEN SIGN + u'\xb7' # 0xB3 -> MIDDLE DOT + u'\xa9' # 0xB4 -> COPYRIGHT SIGN + u'\xa7' # 0xB5 -> SECTION SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + u'[' # 0xBA -> LEFT SQUARE BRACKET + u']' # 0xBB -> RIGHT SQUARE BRACKET + u'\xaf' # 0xBC -> MACRON + u'\xa8' # 0xBD -> DIAERESIS + u'\xb4' # 0xBE -> ACUTE ACCENT + u'\xd7' # 0xBF -> MULTIPLICATION SIGN + u'{' # 0xC0 -> LEFT CURLY BRACKET + u'A' # 0xC1 -> LATIN CAPITAL LETTER A + u'B' # 0xC2 -> LATIN CAPITAL LETTER B + u'C' # 0xC3 -> LATIN CAPITAL LETTER C + u'D' # 0xC4 -> LATIN CAPITAL LETTER D + u'E' # 0xC5 -> LATIN CAPITAL LETTER E + u'F' # 0xC6 -> LATIN CAPITAL LETTER F + u'G' # 0xC7 -> LATIN CAPITAL LETTER G + u'H' # 0xC8 -> LATIN CAPITAL LETTER H + u'I' # 0xC9 -> LATIN CAPITAL LETTER I + u'\xad' # 0xCA -> SOFT HYPHEN + u'\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + u'\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + u'}' # 0xD0 -> RIGHT CURLY BRACKET + u'J' # 0xD1 -> LATIN CAPITAL LETTER J + u'K' # 0xD2 -> LATIN CAPITAL LETTER K + u'L' # 0xD3 -> LATIN CAPITAL LETTER L + u'M' # 0xD4 -> LATIN CAPITAL LETTER M + u'N' # 0xD5 -> LATIN CAPITAL LETTER N + u'O' # 0xD6 -> LATIN CAPITAL LETTER O + u'P' # 0xD7 -> LATIN CAPITAL LETTER P + u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + u'R' # 0xD9 -> LATIN CAPITAL LETTER R + u'\xb9' # 0xDA -> SUPERSCRIPT ONE + u'\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + u'\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\\' # 0xE0 -> REVERSE SOLIDUS + u'\xf7' # 0xE1 -> DIVISION SIGN + u'S' # 0xE2 -> LATIN CAPITAL LETTER S + u'T' # 0xE3 -> LATIN CAPITAL LETTER T + u'U' # 0xE4 -> LATIN CAPITAL LETTER U + u'V' # 0xE5 -> LATIN CAPITAL LETTER V + u'W' # 0xE6 -> LATIN CAPITAL LETTER W + u'X' # 0xE7 -> LATIN CAPITAL LETTER X + u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + u'\xb2' # 0xEA -> SUPERSCRIPT TWO + u'\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + u'0' # 0xF0 -> DIGIT ZERO + u'1' # 0xF1 -> DIGIT ONE + u'2' # 0xF2 -> DIGIT TWO + u'3' # 0xF3 -> DIGIT THREE + u'4' # 0xF4 -> DIGIT FOUR + u'5' # 0xF5 -> DIGIT FIVE + u'6' # 0xF6 -> DIGIT SIX + u'7' # 0xF7 -> DIGIT SEVEN + u'8' # 0xF8 -> DIGIT EIGHT + u'9' # 0xF9 -> DIGIT NINE + u'\xb3' # 0xFA -> SUPERSCRIPT THREE + u'\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + u'\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp037.pyc b/PythonEnv/2.7/Lib/encodings/cp037.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c6acff7cdc05e022b35531b4dccc76588170f9f GIT binary patch literal 2804 zcmc&$_jemb5MEWwiXEqe69Y;p5zP(>Um|54MjS1OHWAC3N`Bad@9=>isTG45lZBzOsfsGn_1J+rD=qcRxT5o+&H_bsUbQq zRgPo28X`53CR$Y8yr_9{s4FEqczJ?%tIl^<2ZO1{^hBkP zPFH6Xk#&=14m%d2$)pGfK?QCvIZpAD>=rD0gcb{P9;BbYF0E8TCitC)mqvuuqiK>t zEOCjY^ye1REqXi@yNmQuXSwpMAcvDSK_F!GeB5?dsgy`?#HHSrHtkh>LcvTYRS2nU zzEdhcOv}nyg)kX~nhKLhicD{{5uRGxnohN~_U~6{Rmc(|_F4tdFy5F^5U!zwqw&&b z0wK%^ccoI|vw>)w0*xWmN@yCI=k^hd-V@Km437-Z6pv^1j2Vy1pnA#VjLtN@YHZUu zR_8<|4H7VoR*F&@1wP5|F7wDyBs63bmYFfLQcu?_G_3?_)x)^Vp-~t^lT9qTScY)O z#GLpmu`B=Rtc=)zaV!n|!XMUzl5EBH00pn_9l?-XGioE2k|sjQxMLLY3@ zj2g%JG|XBVpH@zj+Ig;?E|>~lXZwGIET?f~{~3PQKwRq-o&FzOIpH?0%%%ajYFy8p zmu1qq-#ELcQa9zYO;?XDowr}6 z*63r#8-DHp)ITNlx&RlQ9#IktGgYFJuOHVRbu(14bqbFncFHLjcEPs>s_oilsl-v2 zp~TT3yq;2YsZ6RP)%}-zxN2(+*5z*FS>uZ`a@o?8Rlc z9D8sjuEs5J@~v0nGe5!GxEA|x9j?I*xDhwu`tPQ{JZtjDlW@1*mN3j@dq)b+!9Bc; z5AY#efy+z2PiL~Z{0|nKg}ZnXZsRIA4mW-)$j%?Te(L@ij=&?_j0f-_T>KV}!3nqp zXW$gvg!}LS9)A4|T!PbZ9e4dQn|{93&z<*a16;uCcoVPUHN5fbXPC6f* NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u06f0' # 0xA1 -> EXTENDED ARABIC-INDIC DIGIT ZERO + u'\u06f1' # 0xA2 -> EXTENDED ARABIC-INDIC DIGIT ONE + u'\u06f2' # 0xA3 -> EXTENDED ARABIC-INDIC DIGIT TWO + u'\u06f3' # 0xA4 -> EXTENDED ARABIC-INDIC DIGIT THREE + u'\u06f4' # 0xA5 -> EXTENDED ARABIC-INDIC DIGIT FOUR + u'\u06f5' # 0xA6 -> EXTENDED ARABIC-INDIC DIGIT FIVE + u'\u06f6' # 0xA7 -> EXTENDED ARABIC-INDIC DIGIT SIX + u'\u06f7' # 0xA8 -> EXTENDED ARABIC-INDIC DIGIT SEVEN + u'\u06f8' # 0xA9 -> EXTENDED ARABIC-INDIC DIGIT EIGHT + u'\u06f9' # 0xAA -> EXTENDED ARABIC-INDIC DIGIT NINE + u'\u060c' # 0xAB -> ARABIC COMMA + u'\u061b' # 0xAC -> ARABIC SEMICOLON + u'\xad' # 0xAD -> SOFT HYPHEN + u'\u061f' # 0xAE -> ARABIC QUESTION MARK + u'\ufe81' # 0xAF -> ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + u'\ufe8d' # 0xB0 -> ARABIC LETTER ALEF ISOLATED FORM + u'\ufe8e' # 0xB1 -> ARABIC LETTER ALEF FINAL FORM + u'\ufe8e' # 0xB2 -> ARABIC LETTER ALEF FINAL FORM + u'\ufe8f' # 0xB3 -> ARABIC LETTER BEH ISOLATED FORM + u'\ufe91' # 0xB4 -> ARABIC LETTER BEH INITIAL FORM + u'\ufb56' # 0xB5 -> ARABIC LETTER PEH ISOLATED FORM + u'\ufb58' # 0xB6 -> ARABIC LETTER PEH INITIAL FORM + u'\ufe93' # 0xB7 -> ARABIC LETTER TEH MARBUTA ISOLATED FORM + u'\ufe95' # 0xB8 -> ARABIC LETTER TEH ISOLATED FORM + u'\ufe97' # 0xB9 -> ARABIC LETTER TEH INITIAL FORM + u'\ufb66' # 0xBA -> ARABIC LETTER TTEH ISOLATED FORM + u'\ufb68' # 0xBB -> ARABIC LETTER TTEH INITIAL FORM + u'\ufe99' # 0xBC -> ARABIC LETTER THEH ISOLATED FORM + u'\ufe9b' # 0xBD -> ARABIC LETTER THEH INITIAL FORM + u'\ufe9d' # 0xBE -> ARABIC LETTER JEEM ISOLATED FORM + u'\ufe9f' # 0xBF -> ARABIC LETTER JEEM INITIAL FORM + u'\ufb7a' # 0xC0 -> ARABIC LETTER TCHEH ISOLATED FORM + u'\ufb7c' # 0xC1 -> ARABIC LETTER TCHEH INITIAL FORM + u'\ufea1' # 0xC2 -> ARABIC LETTER HAH ISOLATED FORM + u'\ufea3' # 0xC3 -> ARABIC LETTER HAH INITIAL FORM + u'\ufea5' # 0xC4 -> ARABIC LETTER KHAH ISOLATED FORM + u'\ufea7' # 0xC5 -> ARABIC LETTER KHAH INITIAL FORM + u'\ufea9' # 0xC6 -> ARABIC LETTER DAL ISOLATED FORM + u'\ufb84' # 0xC7 -> ARABIC LETTER DAHAL ISOLATED FORMN + u'\ufeab' # 0xC8 -> ARABIC LETTER THAL ISOLATED FORM + u'\ufead' # 0xC9 -> ARABIC LETTER REH ISOLATED FORM + u'\ufb8c' # 0xCA -> ARABIC LETTER RREH ISOLATED FORM + u'\ufeaf' # 0xCB -> ARABIC LETTER ZAIN ISOLATED FORM + u'\ufb8a' # 0xCC -> ARABIC LETTER JEH ISOLATED FORM + u'\ufeb1' # 0xCD -> ARABIC LETTER SEEN ISOLATED FORM + u'\ufeb3' # 0xCE -> ARABIC LETTER SEEN INITIAL FORM + u'\ufeb5' # 0xCF -> ARABIC LETTER SHEEN ISOLATED FORM + u'\ufeb7' # 0xD0 -> ARABIC LETTER SHEEN INITIAL FORM + u'\ufeb9' # 0xD1 -> ARABIC LETTER SAD ISOLATED FORM + u'\ufebb' # 0xD2 -> ARABIC LETTER SAD INITIAL FORM + u'\ufebd' # 0xD3 -> ARABIC LETTER DAD ISOLATED FORM + u'\ufebf' # 0xD4 -> ARABIC LETTER DAD INITIAL FORM + u'\ufec1' # 0xD5 -> ARABIC LETTER TAH ISOLATED FORM + u'\ufec5' # 0xD6 -> ARABIC LETTER ZAH ISOLATED FORM + u'\ufec9' # 0xD7 -> ARABIC LETTER AIN ISOLATED FORM + u'\ufeca' # 0xD8 -> ARABIC LETTER AIN FINAL FORM + u'\ufecb' # 0xD9 -> ARABIC LETTER AIN INITIAL FORM + u'\ufecc' # 0xDA -> ARABIC LETTER AIN MEDIAL FORM + u'\ufecd' # 0xDB -> ARABIC LETTER GHAIN ISOLATED FORM + u'\ufece' # 0xDC -> ARABIC LETTER GHAIN FINAL FORM + u'\ufecf' # 0xDD -> ARABIC LETTER GHAIN INITIAL FORM + u'\ufed0' # 0xDE -> ARABIC LETTER GHAIN MEDIAL FORM + u'\ufed1' # 0xDF -> ARABIC LETTER FEH ISOLATED FORM + u'\ufed3' # 0xE0 -> ARABIC LETTER FEH INITIAL FORM + u'\ufed5' # 0xE1 -> ARABIC LETTER QAF ISOLATED FORM + u'\ufed7' # 0xE2 -> ARABIC LETTER QAF INITIAL FORM + u'\ufed9' # 0xE3 -> ARABIC LETTER KAF ISOLATED FORM + u'\ufedb' # 0xE4 -> ARABIC LETTER KAF INITIAL FORM + u'\ufb92' # 0xE5 -> ARABIC LETTER GAF ISOLATED FORM + u'\ufb94' # 0xE6 -> ARABIC LETTER GAF INITIAL FORM + u'\ufedd' # 0xE7 -> ARABIC LETTER LAM ISOLATED FORM + u'\ufedf' # 0xE8 -> ARABIC LETTER LAM INITIAL FORM + u'\ufee0' # 0xE9 -> ARABIC LETTER LAM MEDIAL FORM + u'\ufee1' # 0xEA -> ARABIC LETTER MEEM ISOLATED FORM + u'\ufee3' # 0xEB -> ARABIC LETTER MEEM INITIAL FORM + u'\ufb9e' # 0xEC -> ARABIC LETTER NOON GHUNNA ISOLATED FORM + u'\ufee5' # 0xED -> ARABIC LETTER NOON ISOLATED FORM + u'\ufee7' # 0xEE -> ARABIC LETTER NOON INITIAL FORM + u'\ufe85' # 0xEF -> ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + u'\ufeed' # 0xF0 -> ARABIC LETTER WAW ISOLATED FORM + u'\ufba6' # 0xF1 -> ARABIC LETTER HEH GOAL ISOLATED FORM + u'\ufba8' # 0xF2 -> ARABIC LETTER HEH GOAL INITIAL FORM + u'\ufba9' # 0xF3 -> ARABIC LETTER HEH GOAL MEDIAL FORM + u'\ufbaa' # 0xF4 -> ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM + u'\ufe80' # 0xF5 -> ARABIC LETTER HAMZA ISOLATED FORM + u'\ufe89' # 0xF6 -> ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM + u'\ufe8a' # 0xF7 -> ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM + u'\ufe8b' # 0xF8 -> ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + u'\ufef1' # 0xF9 -> ARABIC LETTER YEH ISOLATED FORM + u'\ufef2' # 0xFA -> ARABIC LETTER YEH FINAL FORM + u'\ufef3' # 0xFB -> ARABIC LETTER YEH INITIAL FORM + u'\ufbb0' # 0xFC -> ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM + u'\ufbae' # 0xFD -> ARABIC LETTER YEH BARREE ISOLATED FORM + u'\ufe7c' # 0xFE -> ARABIC SHADDA ISOLATED FORM + u'\ufe7d' # 0xFF -> ARABIC SHADDA MEDIAL FORM +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp1006.pyc b/PythonEnv/2.7/Lib/encodings/cp1006.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08806bac46348ccdb9a9cfd3c894eddc1acb5444 GIT binary patch literal 2890 zcmc&$>vvN{5Z^qThL$&Ip=uD7_-X+a6cK^&uxdlSK_0al)7+ajn3p%VVilFrqEgEH zZH2<&fT$;thlt&U<2m~u_>FV&N6ZKR0G!!Na{>KO@f=OE+u5CaXJ>x%+nIX)s1NQK z>}gH1+aC}9U5=x84JVzkcAQ;Ice9L(wWHu+hKp@+vlPl+Ho#avW1HLEO!p~;M=AVO zg@@@iO5s(CKvm&odMz{DO6OxKG!U%nd`zD(rt>RZT~+62dOa=LYnVQfwFi^|v=m_d z=wOgMjfE#s02!P@ZM{}^J{O8~C(K0BGR#nGqEJZZxZX`p=!h-qp7lpcvoM9#` zLl33Qd^R+%bwyiSOLT3ldBf`Hs&!hdxwR!0X^ynf!%gcqt)Ca#nzp*>wIrEoD)cr5 zgXvrNiCR89RvE8C>c*XwAD6Wu}u>lGZf5 zI3lz?4JV7SEiSeVe{N>ES-%H^cHw^1d0lx{v?k(i5~I&13US+AwWUPFA#No)Glu;Z zolrC~DHTFGSLm^nABJh>&0-jpOijhPC`FcZ*w8Lq+>uFlc8u98cG!?2B=*Y+p$TM} zU|_EMiASSX?}`LLN8r_#67P;gqa0|2p;m*_eY$R+LHONvJxl;u0i5FTTq0}4<5o~D zvU$BHgG-Hc8U^bdsig5jrs1os7Dthe^1JIi)>IT)a!J$38aXSGS*`FilenusRc=kk zrOhq8R629`M6~!T=(BLwArZ0(dE_A;;bm`#g~@C*jT2Krs|0AoLItQs-YL#FNGsB$ z(z!&&iGAE*6K)jfoj_}KbX+}7%JiBdy!qGDE0p!ODVUJ zB|_bUtVY$$33}Y15)WtM_IRvK4azs z4>ru2-T2VMkA&ttI`^^1pO_bZ@~NkvdA6x}{(^yJM-fWGoYkNzJt$%yN#!Z{s-|2Ywz4-fy&ZKUny1LU_KFDNq`ND^0(dzkV z>&LyHe7fzk&%cn{WuM$3`{jV#DZi9o$*<)uIVg9_A-PBHmHXs=c|abNhvZ>-L>`sL zo9sFOzB73Q?u3cNo=mvlWe*}?1%cpJQpoyeu{S(Su)nxzx literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp1026.py b/PythonEnv/2.7/Lib/encodings/cp1026.py new file mode 100644 index 0000000000..45bbe626fd --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp1026.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1026 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP1026.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1026', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x9c' # 0x04 -> CONTROL + u'\t' # 0x05 -> HORIZONTAL TABULATION + u'\x86' # 0x06 -> CONTROL + u'\x7f' # 0x07 -> DELETE + u'\x97' # 0x08 -> CONTROL + u'\x8d' # 0x09 -> CONTROL + u'\x8e' # 0x0A -> CONTROL + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x9d' # 0x14 -> CONTROL + u'\x85' # 0x15 -> CONTROL + u'\x08' # 0x16 -> BACKSPACE + u'\x87' # 0x17 -> CONTROL + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x92' # 0x1A -> CONTROL + u'\x8f' # 0x1B -> CONTROL + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u'\x80' # 0x20 -> CONTROL + u'\x81' # 0x21 -> CONTROL + u'\x82' # 0x22 -> CONTROL + u'\x83' # 0x23 -> CONTROL + u'\x84' # 0x24 -> CONTROL + u'\n' # 0x25 -> LINE FEED + u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK + u'\x1b' # 0x27 -> ESCAPE + u'\x88' # 0x28 -> CONTROL + u'\x89' # 0x29 -> CONTROL + u'\x8a' # 0x2A -> CONTROL + u'\x8b' # 0x2B -> CONTROL + u'\x8c' # 0x2C -> CONTROL + u'\x05' # 0x2D -> ENQUIRY + u'\x06' # 0x2E -> ACKNOWLEDGE + u'\x07' # 0x2F -> BELL + u'\x90' # 0x30 -> CONTROL + u'\x91' # 0x31 -> CONTROL + u'\x16' # 0x32 -> SYNCHRONOUS IDLE + u'\x93' # 0x33 -> CONTROL + u'\x94' # 0x34 -> CONTROL + u'\x95' # 0x35 -> CONTROL + u'\x96' # 0x36 -> CONTROL + u'\x04' # 0x37 -> END OF TRANSMISSION + u'\x98' # 0x38 -> CONTROL + u'\x99' # 0x39 -> CONTROL + u'\x9a' # 0x3A -> CONTROL + u'\x9b' # 0x3B -> CONTROL + u'\x14' # 0x3C -> DEVICE CONTROL FOUR + u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + u'\x9e' # 0x3E -> CONTROL + u'\x1a' # 0x3F -> SUBSTITUTE + u' ' # 0x40 -> SPACE + u'\xa0' # 0x41 -> NO-BREAK SPACE + u'\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + u'{' # 0x48 -> LEFT CURLY BRACKET + u'\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + u'\xc7' # 0x4A -> LATIN CAPITAL LETTER C WITH CEDILLA + u'.' # 0x4B -> FULL STOP + u'<' # 0x4C -> LESS-THAN SIGN + u'(' # 0x4D -> LEFT PARENTHESIS + u'+' # 0x4E -> PLUS SIGN + u'!' # 0x4F -> EXCLAMATION MARK + u'&' # 0x50 -> AMPERSAND + u'\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + u'\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + u'\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + u'\u011e' # 0x5A -> LATIN CAPITAL LETTER G WITH BREVE + u'\u0130' # 0x5B -> LATIN CAPITAL LETTER I WITH DOT ABOVE + u'*' # 0x5C -> ASTERISK + u')' # 0x5D -> RIGHT PARENTHESIS + u';' # 0x5E -> SEMICOLON + u'^' # 0x5F -> CIRCUMFLEX ACCENT + u'-' # 0x60 -> HYPHEN-MINUS + u'/' # 0x61 -> SOLIDUS + u'\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'[' # 0x68 -> LEFT SQUARE BRACKET + u'\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + u'\u015f' # 0x6A -> LATIN SMALL LETTER S WITH CEDILLA + u',' # 0x6B -> COMMA + u'%' # 0x6C -> PERCENT SIGN + u'_' # 0x6D -> LOW LINE + u'>' # 0x6E -> GREATER-THAN SIGN + u'?' # 0x6F -> QUESTION MARK + u'\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + u'\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + u'\u0131' # 0x79 -> LATIN SMALL LETTER DOTLESS I + u':' # 0x7A -> COLON + u'\xd6' # 0x7B -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\u015e' # 0x7C -> LATIN CAPITAL LETTER S WITH CEDILLA + u"'" # 0x7D -> APOSTROPHE + u'=' # 0x7E -> EQUALS SIGN + u'\xdc' # 0x7F -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + u'a' # 0x81 -> LATIN SMALL LETTER A + u'b' # 0x82 -> LATIN SMALL LETTER B + u'c' # 0x83 -> LATIN SMALL LETTER C + u'd' # 0x84 -> LATIN SMALL LETTER D + u'e' # 0x85 -> LATIN SMALL LETTER E + u'f' # 0x86 -> LATIN SMALL LETTER F + u'g' # 0x87 -> LATIN SMALL LETTER G + u'h' # 0x88 -> LATIN SMALL LETTER H + u'i' # 0x89 -> LATIN SMALL LETTER I + u'\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'}' # 0x8C -> RIGHT CURLY BRACKET + u'`' # 0x8D -> GRAVE ACCENT + u'\xa6' # 0x8E -> BROKEN BAR + u'\xb1' # 0x8F -> PLUS-MINUS SIGN + u'\xb0' # 0x90 -> DEGREE SIGN + u'j' # 0x91 -> LATIN SMALL LETTER J + u'k' # 0x92 -> LATIN SMALL LETTER K + u'l' # 0x93 -> LATIN SMALL LETTER L + u'm' # 0x94 -> LATIN SMALL LETTER M + u'n' # 0x95 -> LATIN SMALL LETTER N + u'o' # 0x96 -> LATIN SMALL LETTER O + u'p' # 0x97 -> LATIN SMALL LETTER P + u'q' # 0x98 -> LATIN SMALL LETTER Q + u'r' # 0x99 -> LATIN SMALL LETTER R + u'\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + u'\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + u'\xb8' # 0x9D -> CEDILLA + u'\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + u'\xa4' # 0x9F -> CURRENCY SIGN + u'\xb5' # 0xA0 -> MICRO SIGN + u'\xf6' # 0xA1 -> LATIN SMALL LETTER O WITH DIAERESIS + u's' # 0xA2 -> LATIN SMALL LETTER S + u't' # 0xA3 -> LATIN SMALL LETTER T + u'u' # 0xA4 -> LATIN SMALL LETTER U + u'v' # 0xA5 -> LATIN SMALL LETTER V + u'w' # 0xA6 -> LATIN SMALL LETTER W + u'x' # 0xA7 -> LATIN SMALL LETTER X + u'y' # 0xA8 -> LATIN SMALL LETTER Y + u'z' # 0xA9 -> LATIN SMALL LETTER Z + u'\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + u'\xbf' # 0xAB -> INVERTED QUESTION MARK + u']' # 0xAC -> RIGHT SQUARE BRACKET + u'$' # 0xAD -> DOLLAR SIGN + u'@' # 0xAE -> COMMERCIAL AT + u'\xae' # 0xAF -> REGISTERED SIGN + u'\xa2' # 0xB0 -> CENT SIGN + u'\xa3' # 0xB1 -> POUND SIGN + u'\xa5' # 0xB2 -> YEN SIGN + u'\xb7' # 0xB3 -> MIDDLE DOT + u'\xa9' # 0xB4 -> COPYRIGHT SIGN + u'\xa7' # 0xB5 -> SECTION SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + u'\xac' # 0xBA -> NOT SIGN + u'|' # 0xBB -> VERTICAL LINE + u'\xaf' # 0xBC -> MACRON + u'\xa8' # 0xBD -> DIAERESIS + u'\xb4' # 0xBE -> ACUTE ACCENT + u'\xd7' # 0xBF -> MULTIPLICATION SIGN + u'\xe7' # 0xC0 -> LATIN SMALL LETTER C WITH CEDILLA + u'A' # 0xC1 -> LATIN CAPITAL LETTER A + u'B' # 0xC2 -> LATIN CAPITAL LETTER B + u'C' # 0xC3 -> LATIN CAPITAL LETTER C + u'D' # 0xC4 -> LATIN CAPITAL LETTER D + u'E' # 0xC5 -> LATIN CAPITAL LETTER E + u'F' # 0xC6 -> LATIN CAPITAL LETTER F + u'G' # 0xC7 -> LATIN CAPITAL LETTER G + u'H' # 0xC8 -> LATIN CAPITAL LETTER H + u'I' # 0xC9 -> LATIN CAPITAL LETTER I + u'\xad' # 0xCA -> SOFT HYPHEN + u'\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'~' # 0xCC -> TILDE + u'\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + u'\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + u'\u011f' # 0xD0 -> LATIN SMALL LETTER G WITH BREVE + u'J' # 0xD1 -> LATIN CAPITAL LETTER J + u'K' # 0xD2 -> LATIN CAPITAL LETTER K + u'L' # 0xD3 -> LATIN CAPITAL LETTER L + u'M' # 0xD4 -> LATIN CAPITAL LETTER M + u'N' # 0xD5 -> LATIN CAPITAL LETTER N + u'O' # 0xD6 -> LATIN CAPITAL LETTER O + u'P' # 0xD7 -> LATIN CAPITAL LETTER P + u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + u'R' # 0xD9 -> LATIN CAPITAL LETTER R + u'\xb9' # 0xDA -> SUPERSCRIPT ONE + u'\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\\' # 0xDC -> REVERSE SOLIDUS + u'\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + u'\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\xfc' # 0xE0 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xf7' # 0xE1 -> DIVISION SIGN + u'S' # 0xE2 -> LATIN CAPITAL LETTER S + u'T' # 0xE3 -> LATIN CAPITAL LETTER T + u'U' # 0xE4 -> LATIN CAPITAL LETTER U + u'V' # 0xE5 -> LATIN CAPITAL LETTER V + u'W' # 0xE6 -> LATIN CAPITAL LETTER W + u'X' # 0xE7 -> LATIN CAPITAL LETTER X + u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + u'\xb2' # 0xEA -> SUPERSCRIPT TWO + u'\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'#' # 0xEC -> NUMBER SIGN + u'\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + u'0' # 0xF0 -> DIGIT ZERO + u'1' # 0xF1 -> DIGIT ONE + u'2' # 0xF2 -> DIGIT TWO + u'3' # 0xF3 -> DIGIT THREE + u'4' # 0xF4 -> DIGIT FOUR + u'5' # 0xF5 -> DIGIT FIVE + u'6' # 0xF6 -> DIGIT SIX + u'7' # 0xF7 -> DIGIT SEVEN + u'8' # 0xF8 -> DIGIT EIGHT + u'9' # 0xF9 -> DIGIT NINE + u'\xb3' # 0xFA -> SUPERSCRIPT THREE + u'\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'"' # 0xFC -> QUOTATION MARK + u'\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + u'\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp1026.pyc b/PythonEnv/2.7/Lib/encodings/cp1026.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b169aa403c19764c71d304091deccac64e8b36a3 GIT binary patch literal 2818 zcmc&$`F|5t5PvzFrY$#Up=uDd@oE7T6cM3m!Ke*&Q#ooiZnK*I&iBp4^+$z&&89+QTs(eU^nWgm z{4JU^AzEm52+b){4$(q_OXv=<%qbEiyG6GUT|z8vaSF{N4K8W$77Z?;l}LkI8hk~A zTWF<1cS@T_BxnPF(dH3a*?`R}ZRJIqS7;Ud(o!O{5u(K>H=vz-qKh2#v!~JENDiPt zQ=qBS?8s&Up$^qh(4SM7PSNF}=pCew*vqA7d2$rViLhi({IBOfHAkW+pNNugP-7RJ+Owx*J8tpoezTPAH0W1 z6E>fi7JmhOB57?B5u1odF6I&4`pRgKw~Zue5;AC+0EJm70ae&L$r&4INt#45qo(ZG zhaEQK#(@q7S}Et_Drk~h&sS4@Iq~O zE^Bts!v>XkIDy9BgQ|=o)4$>>V>y0cf5MaV6*UcAO)oZ*RC9|QWd_#q7dg!qN2$({ zEF{nDMB711Y1ol6bt-AdNQZc$=&JT#dcw82%J!rP0jDs;`nfb&_s(js)L6NG(*>lf z=N^!$OM000nwMJvwNjJXo{wu!mnew_nJy8NFCmv9S!b=PYZoBN?xbBetkQ2hskUmI zA#+FlhH^)P5F4aeE|V$GwCXUQE*o4plgP@7Wgn~XB~zFg3PYiAW}Y&uCiAylC#R^* znnvejdd)Lwg`?Erb(GV`D?f!*OfZMj1&2#v-AdR8TVY#SdBup4qehPz3%|lzAFO}2 z5_ZD&s^^}60an3kSOZTu-6Uy;Q$CF-23TkI0b!hW!X2WbS9ho)_`+x7f-=$Tn8uM2Hwn@h3}Ss-}wU^g$G~0G#4(x zF*pt<;TD{Q({K~+!*B3ATv!2@;S5~IeRz5v{g`Q(zu==VT*T`?<5j$dH~M=&{^Zlf z$ik-26u5);TJa9v#RqsFZ$+CwU$l71(iXUiyQknz+=Y9lPMiML+waVn`R;pg4G+DD z2k;>D202^AQtpjfHcq{eTZqLDn-fe2ix`tw;$mlVg&+8V(pE^OG^@Lib`W!hTMA@% ho^AExIWF2F&wY^^sk_ow>8^BFxvD&+BfXD=`%e)ekLmyb literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp1140.py b/PythonEnv/2.7/Lib/encodings/cp1140.py new file mode 100644 index 0000000000..7e507fd853 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp1140.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1140 generated from 'python-mappings/CP1140.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1140', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x9c' # 0x04 -> CONTROL + u'\t' # 0x05 -> HORIZONTAL TABULATION + u'\x86' # 0x06 -> CONTROL + u'\x7f' # 0x07 -> DELETE + u'\x97' # 0x08 -> CONTROL + u'\x8d' # 0x09 -> CONTROL + u'\x8e' # 0x0A -> CONTROL + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x9d' # 0x14 -> CONTROL + u'\x85' # 0x15 -> CONTROL + u'\x08' # 0x16 -> BACKSPACE + u'\x87' # 0x17 -> CONTROL + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x92' # 0x1A -> CONTROL + u'\x8f' # 0x1B -> CONTROL + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u'\x80' # 0x20 -> CONTROL + u'\x81' # 0x21 -> CONTROL + u'\x82' # 0x22 -> CONTROL + u'\x83' # 0x23 -> CONTROL + u'\x84' # 0x24 -> CONTROL + u'\n' # 0x25 -> LINE FEED + u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK + u'\x1b' # 0x27 -> ESCAPE + u'\x88' # 0x28 -> CONTROL + u'\x89' # 0x29 -> CONTROL + u'\x8a' # 0x2A -> CONTROL + u'\x8b' # 0x2B -> CONTROL + u'\x8c' # 0x2C -> CONTROL + u'\x05' # 0x2D -> ENQUIRY + u'\x06' # 0x2E -> ACKNOWLEDGE + u'\x07' # 0x2F -> BELL + u'\x90' # 0x30 -> CONTROL + u'\x91' # 0x31 -> CONTROL + u'\x16' # 0x32 -> SYNCHRONOUS IDLE + u'\x93' # 0x33 -> CONTROL + u'\x94' # 0x34 -> CONTROL + u'\x95' # 0x35 -> CONTROL + u'\x96' # 0x36 -> CONTROL + u'\x04' # 0x37 -> END OF TRANSMISSION + u'\x98' # 0x38 -> CONTROL + u'\x99' # 0x39 -> CONTROL + u'\x9a' # 0x3A -> CONTROL + u'\x9b' # 0x3B -> CONTROL + u'\x14' # 0x3C -> DEVICE CONTROL FOUR + u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + u'\x9e' # 0x3E -> CONTROL + u'\x1a' # 0x3F -> SUBSTITUTE + u' ' # 0x40 -> SPACE + u'\xa0' # 0x41 -> NO-BREAK SPACE + u'\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + u'\xa2' # 0x4A -> CENT SIGN + u'.' # 0x4B -> FULL STOP + u'<' # 0x4C -> LESS-THAN SIGN + u'(' # 0x4D -> LEFT PARENTHESIS + u'+' # 0x4E -> PLUS SIGN + u'|' # 0x4F -> VERTICAL LINE + u'&' # 0x50 -> AMPERSAND + u'\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + u'\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + u'\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + u'!' # 0x5A -> EXCLAMATION MARK + u'$' # 0x5B -> DOLLAR SIGN + u'*' # 0x5C -> ASTERISK + u')' # 0x5D -> RIGHT PARENTHESIS + u';' # 0x5E -> SEMICOLON + u'\xac' # 0x5F -> NOT SIGN + u'-' # 0x60 -> HYPHEN-MINUS + u'/' # 0x61 -> SOLIDUS + u'\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xa6' # 0x6A -> BROKEN BAR + u',' # 0x6B -> COMMA + u'%' # 0x6C -> PERCENT SIGN + u'_' # 0x6D -> LOW LINE + u'>' # 0x6E -> GREATER-THAN SIGN + u'?' # 0x6F -> QUESTION MARK + u'\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + u'\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + u'`' # 0x79 -> GRAVE ACCENT + u':' # 0x7A -> COLON + u'#' # 0x7B -> NUMBER SIGN + u'@' # 0x7C -> COMMERCIAL AT + u"'" # 0x7D -> APOSTROPHE + u'=' # 0x7E -> EQUALS SIGN + u'"' # 0x7F -> QUOTATION MARK + u'\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + u'a' # 0x81 -> LATIN SMALL LETTER A + u'b' # 0x82 -> LATIN SMALL LETTER B + u'c' # 0x83 -> LATIN SMALL LETTER C + u'd' # 0x84 -> LATIN SMALL LETTER D + u'e' # 0x85 -> LATIN SMALL LETTER E + u'f' # 0x86 -> LATIN SMALL LETTER F + u'g' # 0x87 -> LATIN SMALL LETTER G + u'h' # 0x88 -> LATIN SMALL LETTER H + u'i' # 0x89 -> LATIN SMALL LETTER I + u'\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) + u'\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + u'\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) + u'\xb1' # 0x8F -> PLUS-MINUS SIGN + u'\xb0' # 0x90 -> DEGREE SIGN + u'j' # 0x91 -> LATIN SMALL LETTER J + u'k' # 0x92 -> LATIN SMALL LETTER K + u'l' # 0x93 -> LATIN SMALL LETTER L + u'm' # 0x94 -> LATIN SMALL LETTER M + u'n' # 0x95 -> LATIN SMALL LETTER N + u'o' # 0x96 -> LATIN SMALL LETTER O + u'p' # 0x97 -> LATIN SMALL LETTER P + u'q' # 0x98 -> LATIN SMALL LETTER Q + u'r' # 0x99 -> LATIN SMALL LETTER R + u'\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + u'\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + u'\xb8' # 0x9D -> CEDILLA + u'\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + u'\u20ac' # 0x9F -> EURO SIGN + u'\xb5' # 0xA0 -> MICRO SIGN + u'~' # 0xA1 -> TILDE + u's' # 0xA2 -> LATIN SMALL LETTER S + u't' # 0xA3 -> LATIN SMALL LETTER T + u'u' # 0xA4 -> LATIN SMALL LETTER U + u'v' # 0xA5 -> LATIN SMALL LETTER V + u'w' # 0xA6 -> LATIN SMALL LETTER W + u'x' # 0xA7 -> LATIN SMALL LETTER X + u'y' # 0xA8 -> LATIN SMALL LETTER Y + u'z' # 0xA9 -> LATIN SMALL LETTER Z + u'\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + u'\xbf' # 0xAB -> INVERTED QUESTION MARK + u'\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) + u'\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) + u'\xae' # 0xAF -> REGISTERED SIGN + u'^' # 0xB0 -> CIRCUMFLEX ACCENT + u'\xa3' # 0xB1 -> POUND SIGN + u'\xa5' # 0xB2 -> YEN SIGN + u'\xb7' # 0xB3 -> MIDDLE DOT + u'\xa9' # 0xB4 -> COPYRIGHT SIGN + u'\xa7' # 0xB5 -> SECTION SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + u'[' # 0xBA -> LEFT SQUARE BRACKET + u']' # 0xBB -> RIGHT SQUARE BRACKET + u'\xaf' # 0xBC -> MACRON + u'\xa8' # 0xBD -> DIAERESIS + u'\xb4' # 0xBE -> ACUTE ACCENT + u'\xd7' # 0xBF -> MULTIPLICATION SIGN + u'{' # 0xC0 -> LEFT CURLY BRACKET + u'A' # 0xC1 -> LATIN CAPITAL LETTER A + u'B' # 0xC2 -> LATIN CAPITAL LETTER B + u'C' # 0xC3 -> LATIN CAPITAL LETTER C + u'D' # 0xC4 -> LATIN CAPITAL LETTER D + u'E' # 0xC5 -> LATIN CAPITAL LETTER E + u'F' # 0xC6 -> LATIN CAPITAL LETTER F + u'G' # 0xC7 -> LATIN CAPITAL LETTER G + u'H' # 0xC8 -> LATIN CAPITAL LETTER H + u'I' # 0xC9 -> LATIN CAPITAL LETTER I + u'\xad' # 0xCA -> SOFT HYPHEN + u'\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + u'\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + u'}' # 0xD0 -> RIGHT CURLY BRACKET + u'J' # 0xD1 -> LATIN CAPITAL LETTER J + u'K' # 0xD2 -> LATIN CAPITAL LETTER K + u'L' # 0xD3 -> LATIN CAPITAL LETTER L + u'M' # 0xD4 -> LATIN CAPITAL LETTER M + u'N' # 0xD5 -> LATIN CAPITAL LETTER N + u'O' # 0xD6 -> LATIN CAPITAL LETTER O + u'P' # 0xD7 -> LATIN CAPITAL LETTER P + u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + u'R' # 0xD9 -> LATIN CAPITAL LETTER R + u'\xb9' # 0xDA -> SUPERSCRIPT ONE + u'\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + u'\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\\' # 0xE0 -> REVERSE SOLIDUS + u'\xf7' # 0xE1 -> DIVISION SIGN + u'S' # 0xE2 -> LATIN CAPITAL LETTER S + u'T' # 0xE3 -> LATIN CAPITAL LETTER T + u'U' # 0xE4 -> LATIN CAPITAL LETTER U + u'V' # 0xE5 -> LATIN CAPITAL LETTER V + u'W' # 0xE6 -> LATIN CAPITAL LETTER W + u'X' # 0xE7 -> LATIN CAPITAL LETTER X + u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + u'\xb2' # 0xEA -> SUPERSCRIPT TWO + u'\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + u'0' # 0xF0 -> DIGIT ZERO + u'1' # 0xF1 -> DIGIT ONE + u'2' # 0xF2 -> DIGIT TWO + u'3' # 0xF3 -> DIGIT THREE + u'4' # 0xF4 -> DIGIT FOUR + u'5' # 0xF5 -> DIGIT FIVE + u'6' # 0xF6 -> DIGIT SIX + u'7' # 0xF7 -> DIGIT SEVEN + u'8' # 0xF8 -> DIGIT EIGHT + u'9' # 0xF9 -> DIGIT NINE + u'\xb3' # 0xFA -> SUPERSCRIPT THREE + u'\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + u'\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp1140.pyc b/PythonEnv/2.7/Lib/encodings/cp1140.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc95ddab657fe1b88f60b7a763791d4e8af2cf6c GIT binary patch literal 2804 zcmc&$c~@Ii5WiUoVe77GQB$iDm(o(J)mkf(wu%bk18s|F40$gQ%;w9Bh*m9xZgk)G z-R^W>=-zW?zKLJK4^U_BYw`g71MwV9xR-e|@7_D}o8O&@Tku*4^!Ba3e zg<32$yR^APls51dY%ZaeBwbT8f3CknOKN)9&{Tg^PbK_SX}M~4 z!hAO~C)mWVRky5Ysq%Nnj80w<;SH+OJ=I=s>@j^B4Hq3Kw=IBaCrusu;-^U?rwKHP zXFvH$A(LzuEIWkK9AM}TH@|M^v4|1jXC6)(K~_(u$q=H;CRWj(T^M$eb5OW8(l=Vm zrDqwVoU{>&o1zGr?n;#u34xFiZjWo`Dn22j#iKHWSTdb8q#v5Dr}RvKj6zPCStJD) zwwa*LThJDdwYTN>%e0wb5+vqgiBJje%rFSsc;Zob>4-=ObOK(gq&PAXg>#@VhDs4l z<8<9TgYkRfdVm2kJT!$u$#6mog$%EJNTk$koE{anDIBbIq?E=AnLRf23cQAlX>sVeoCE`>o;9Mx_ZvMOl{G{v{&8S3aED))aN{0dvcNk`-8id#|MYl|*JkzYhe7bCK z^~q>TRxImSg)f=H%upB#g)=kGtQySU4vn0mHf!iTGwCtIq!qSeo7+}OU$^{bdzoN1 zy8{jt!`feAFKmV_C8cHM6%!^-nhb|wjR)2}?Smb#wep!~pM%xV3w@A-e(zH=U_ESr z0oVweT<#*+2HU5>PS^#zVUH8`!G1UZ2d7MhBh&qG3{T*1cnpu@Nj!yT@G6|BUKDtB z)k}B|&*KF=ix=?{UdBN@I`f5BUVaA#XV1Yt?8nvEi#c3_>u@`qe(lB3;`i`2ZomQD zi0g4PZo#d%>6?YKYOCIT9`}XYBdQkd=#0SyxQAEp0X~GQaHZ?pcp{lff2YHFxQnOZ zHm?1>ZxC+&k}hbq9}mFM0H=#+%FR(tMW`8a4>9Rsk%IYP zGGhiyTeFxPir!cFaQ7m literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp1250.py b/PythonEnv/2.7/Lib/encodings/cp1250.py new file mode 100644 index 0000000000..d620b89335 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp1250.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1250 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1250', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\ufffe' # 0x81 -> UNDEFINED + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\ufffe' # 0x83 -> UNDEFINED + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\ufffe' # 0x88 -> UNDEFINED + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u015a' # 0x8C -> LATIN CAPITAL LETTER S WITH ACUTE + u'\u0164' # 0x8D -> LATIN CAPITAL LETTER T WITH CARON + u'\u017d' # 0x8E -> LATIN CAPITAL LETTER Z WITH CARON + u'\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE + u'\ufffe' # 0x90 -> UNDEFINED + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\ufffe' # 0x98 -> UNDEFINED + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\u015b' # 0x9C -> LATIN SMALL LETTER S WITH ACUTE + u'\u0165' # 0x9D -> LATIN SMALL LETTER T WITH CARON + u'\u017e' # 0x9E -> LATIN SMALL LETTER Z WITH CARON + u'\u017a' # 0x9F -> LATIN SMALL LETTER Z WITH ACUTE + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u02c7' # 0xA1 -> CARON + u'\u02d8' # 0xA2 -> BREVE + u'\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\u0104' # 0xA5 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u02db' # 0xB2 -> OGONEK + u'\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\u0105' # 0xB9 -> LATIN SMALL LETTER A WITH OGONEK + u'\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u013d' # 0xBC -> LATIN CAPITAL LETTER L WITH CARON + u'\u02dd' # 0xBD -> DOUBLE ACUTE ACCENT + u'\u013e' # 0xBE -> LATIN SMALL LETTER L WITH CARON + u'\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\u0154' # 0xC0 -> LATIN CAPITAL LETTER R WITH ACUTE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\u0139' # 0xC5 -> LATIN CAPITAL LETTER L WITH ACUTE + u'\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\u011a' # 0xCC -> LATIN CAPITAL LETTER E WITH CARON + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\u010e' # 0xCF -> LATIN CAPITAL LETTER D WITH CARON + u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + u'\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + u'\u0147' # 0xD2 -> LATIN CAPITAL LETTER N WITH CARON + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\u0158' # 0xD8 -> LATIN CAPITAL LETTER R WITH CARON + u'\u016e' # 0xD9 -> LATIN CAPITAL LETTER U WITH RING ABOVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\u0170' # 0xDB -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\u0162' # 0xDE -> LATIN CAPITAL LETTER T WITH CEDILLA + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\u0155' # 0xE0 -> LATIN SMALL LETTER R WITH ACUTE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u013a' # 0xE5 -> LATIN SMALL LETTER L WITH ACUTE + u'\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\u011b' # 0xEC -> LATIN SMALL LETTER E WITH CARON + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\u010f' # 0xEF -> LATIN SMALL LETTER D WITH CARON + u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + u'\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + u'\u0148' # 0xF2 -> LATIN SMALL LETTER N WITH CARON + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\u0159' # 0xF8 -> LATIN SMALL LETTER R WITH CARON + u'\u016f' # 0xF9 -> LATIN SMALL LETTER U WITH RING ABOVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\u0171' # 0xFB -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + u'\u0163' # 0xFE -> LATIN SMALL LETTER T WITH CEDILLA + u'\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp1250.pyc b/PythonEnv/2.7/Lib/encodings/cp1250.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96ee9163795b51511040a8211cbc732e15249c15 GIT binary patch literal 2841 zcmc&$>vt1H6rVhsrVrj|plT4c@zp{VQA8|+7OOVYO{Ea4ahu(=sd>5CQmZJTsn!<= zhl+jhYONp#sBlDT%foYac0TpL$Uoo*{{XyqmS$=7L#^lNrZc^BZ+7P1-~G+KvHelz z?)|c>F+%P>Huzr)BQpt;L`Vo`3z4iOZXqEMY(%z@PAiFmY$tt$)=|8(am0ok+z*wsM<;L}3GW!R8=R$*j%EZKVa9lSpN_2o({joP=C_1K7z$ za^RpFJq`MnU;z7J@;3FT9jT<(-yteuM3oh9qnJ*|lI>o9N|GbqNP1(i+*aSSXA&=nNdxAdPHV}h}@Su4D1Y{uxR6y@I zXH29yX`->D7&l{IaM*|&26`{hLMa|s1{2@9UW{jC4zRiZKf@L?xoq|jr)55}J2|EP zA7nA*2C_(~dB_S_*UX?73@Y+)HH^OpRagq9f5lbAa@FkqfG6fFs4B9UXi;KNbPF6s z2JXNwVww$(LY)JdaGsfoHiP8Sf+I!hcwq2I=XfH>qV!*Sg0;EA^rQd*rqGZ2T9}M` zXY^O-tXRL{0>ag^&&tpy9Y}l0iLC&7sS171g|#O~ih@3*OF+d-h-HY^S)=Nj1&Fgd zX4Va(^egk#MvYT=?x5d5?qC37_b9q~GWnTC9mdmngKJ1eQ@moC#|n7K1Z0MQPzacr zMP^k+{zD;{|8A@90}*FW;;W0k(gpLp`Ar>m+rY^-_a*-g)Fe*T3mFK&Hl+sn1v zcldYK)$e+x;nmk(Zw%~idP4{{zqzMn@4nDmt#7{*ephUZNOH8jBi8v|JdsSL-&Znf z*Z%GgdOrN@c5C=d`ed6AUmXu>wVfe?Y#D*c7dJNE^3#w z%i09HpQm**T1G; z=!5hteV87mNAx55QI=!<^f(=0N9hUr9UEj5beLVCC+R6RM$fQs=_no3b97vv*8Ays z{V=_t57CSI2)#@v^l$WItdD(8f2P;iF?yX&vLW^pon}|*O?r!cKQrXR90GT-V@jzA zbVzJ024_sBAW00mtVIb+po(>W_Ge35S1c|WJqNV+@M)n1g7@sLMwi}ZgDo=HEup>I TJuZ*kW3RAPIEt4z?-2W+aHyeK literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp1251.py b/PythonEnv/2.7/Lib/encodings/cp1251.py new file mode 100644 index 0000000000..216771fa4c --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp1251.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1251 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1251', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u0402' # 0x80 -> CYRILLIC CAPITAL LETTER DJE + u'\u0403' # 0x81 -> CYRILLIC CAPITAL LETTER GJE + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\u0453' # 0x83 -> CYRILLIC SMALL LETTER GJE + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\u20ac' # 0x88 -> EURO SIGN + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\u0409' # 0x8A -> CYRILLIC CAPITAL LETTER LJE + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u040a' # 0x8C -> CYRILLIC CAPITAL LETTER NJE + u'\u040c' # 0x8D -> CYRILLIC CAPITAL LETTER KJE + u'\u040b' # 0x8E -> CYRILLIC CAPITAL LETTER TSHE + u'\u040f' # 0x8F -> CYRILLIC CAPITAL LETTER DZHE + u'\u0452' # 0x90 -> CYRILLIC SMALL LETTER DJE + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\ufffe' # 0x98 -> UNDEFINED + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\u0459' # 0x9A -> CYRILLIC SMALL LETTER LJE + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\u045a' # 0x9C -> CYRILLIC SMALL LETTER NJE + u'\u045c' # 0x9D -> CYRILLIC SMALL LETTER KJE + u'\u045b' # 0x9E -> CYRILLIC SMALL LETTER TSHE + u'\u045f' # 0x9F -> CYRILLIC SMALL LETTER DZHE + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u040e' # 0xA1 -> CYRILLIC CAPITAL LETTER SHORT U + u'\u045e' # 0xA2 -> CYRILLIC SMALL LETTER SHORT U + u'\u0408' # 0xA3 -> CYRILLIC CAPITAL LETTER JE + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\u0490' # 0xA5 -> CYRILLIC CAPITAL LETTER GHE WITH UPTURN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\u0401' # 0xA8 -> CYRILLIC CAPITAL LETTER IO + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u0404' # 0xAA -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\u0407' # 0xAF -> CYRILLIC CAPITAL LETTER YI + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u0406' # 0xB2 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + u'\u0456' # 0xB3 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + u'\u0491' # 0xB4 -> CYRILLIC SMALL LETTER GHE WITH UPTURN + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\u0451' # 0xB8 -> CYRILLIC SMALL LETTER IO + u'\u2116' # 0xB9 -> NUMERO SIGN + u'\u0454' # 0xBA -> CYRILLIC SMALL LETTER UKRAINIAN IE + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u0458' # 0xBC -> CYRILLIC SMALL LETTER JE + u'\u0405' # 0xBD -> CYRILLIC CAPITAL LETTER DZE + u'\u0455' # 0xBE -> CYRILLIC SMALL LETTER DZE + u'\u0457' # 0xBF -> CYRILLIC SMALL LETTER YI + u'\u0410' # 0xC0 -> CYRILLIC CAPITAL LETTER A + u'\u0411' # 0xC1 -> CYRILLIC CAPITAL LETTER BE + u'\u0412' # 0xC2 -> CYRILLIC CAPITAL LETTER VE + u'\u0413' # 0xC3 -> CYRILLIC CAPITAL LETTER GHE + u'\u0414' # 0xC4 -> CYRILLIC CAPITAL LETTER DE + u'\u0415' # 0xC5 -> CYRILLIC CAPITAL LETTER IE + u'\u0416' # 0xC6 -> CYRILLIC CAPITAL LETTER ZHE + u'\u0417' # 0xC7 -> CYRILLIC CAPITAL LETTER ZE + u'\u0418' # 0xC8 -> CYRILLIC CAPITAL LETTER I + u'\u0419' # 0xC9 -> CYRILLIC CAPITAL LETTER SHORT I + u'\u041a' # 0xCA -> CYRILLIC CAPITAL LETTER KA + u'\u041b' # 0xCB -> CYRILLIC CAPITAL LETTER EL + u'\u041c' # 0xCC -> CYRILLIC CAPITAL LETTER EM + u'\u041d' # 0xCD -> CYRILLIC CAPITAL LETTER EN + u'\u041e' # 0xCE -> CYRILLIC CAPITAL LETTER O + u'\u041f' # 0xCF -> CYRILLIC CAPITAL LETTER PE + u'\u0420' # 0xD0 -> CYRILLIC CAPITAL LETTER ER + u'\u0421' # 0xD1 -> CYRILLIC CAPITAL LETTER ES + u'\u0422' # 0xD2 -> CYRILLIC CAPITAL LETTER TE + u'\u0423' # 0xD3 -> CYRILLIC CAPITAL LETTER U + u'\u0424' # 0xD4 -> CYRILLIC CAPITAL LETTER EF + u'\u0425' # 0xD5 -> CYRILLIC CAPITAL LETTER HA + u'\u0426' # 0xD6 -> CYRILLIC CAPITAL LETTER TSE + u'\u0427' # 0xD7 -> CYRILLIC CAPITAL LETTER CHE + u'\u0428' # 0xD8 -> CYRILLIC CAPITAL LETTER SHA + u'\u0429' # 0xD9 -> CYRILLIC CAPITAL LETTER SHCHA + u'\u042a' # 0xDA -> CYRILLIC CAPITAL LETTER HARD SIGN + u'\u042b' # 0xDB -> CYRILLIC CAPITAL LETTER YERU + u'\u042c' # 0xDC -> CYRILLIC CAPITAL LETTER SOFT SIGN + u'\u042d' # 0xDD -> CYRILLIC CAPITAL LETTER E + u'\u042e' # 0xDE -> CYRILLIC CAPITAL LETTER YU + u'\u042f' # 0xDF -> CYRILLIC CAPITAL LETTER YA + u'\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A + u'\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE + u'\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE + u'\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE + u'\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE + u'\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE + u'\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE + u'\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE + u'\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I + u'\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I + u'\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA + u'\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL + u'\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM + u'\u043d' # 0xED -> CYRILLIC SMALL LETTER EN + u'\u043e' # 0xEE -> CYRILLIC SMALL LETTER O + u'\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE + u'\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER + u'\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES + u'\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE + u'\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U + u'\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF + u'\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA + u'\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE + u'\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE + u'\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA + u'\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA + u'\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN + u'\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU + u'\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN + u'\u044d' # 0xFD -> CYRILLIC SMALL LETTER E + u'\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU + u'\u044f' # 0xFF -> CYRILLIC SMALL LETTER YA +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp1251.pyc b/PythonEnv/2.7/Lib/encodings/cp1251.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98d98e57720bbe209741f6bbe4291d17b6455955 GIT binary patch literal 2838 zcmc&$X?qk!5biy*SrWpnfvAh9tXCo^qKF7=5{#N9&PD<;x=waxlf}K9oe-m_LlUll z+=Or+B8VJ<3J54X&-{XFe!~0#KllT%s)y{5=!Y1eM>pwCb=7uv)mv{@#q&pbuy>%V zF~RPCJotAhj>2`E6vkR{b}_}x(k|ADf`_Rtw${y(D0^8yV||RRX>~KjCk!58@D~jp zrj!VSR~Q0CgO@3#Omz#Jk0tSdVA1Ad%7kH?U)aiuHa}C!Y0+B3l!>f0AP&Hj0;~@m z43ej@a0Lah4yRC4kKUQfh9aG^CMR@N3pL95d@9=!isTeE5lZCe&0jDt)S+foP1aQ< zl+<#W(A>slO-&8a6|tICbq@IeC&e&QPTaUkPrn_062g7%vKI&{2o)z?os7)Xa895)f-4!Y!A|i2J zZcnTBF1n$hrjsIsR5stG3qMp%%V~u$8kv|1b5M#bYO_I}zpyQxYHu4puh3?Li;&ox z1ws?(WP*XY#uJZ3TSr8Kpd;`?CB%`DNR$JKFqBGg8mH^_9faR~*TV#m9>6Ic&&nA! z9@m3nk;y4tXB!x5w-Amjp_K6UxdbR!o{aW$Lu) zGah=la^|e6M;?7FH2d*6Pdxe5-0;)SJp0`9)ip27oB!fV3tnFM%BzcBTm1TxH_z`}XA2(0H4t@-_n5XaVGS8T2VS{-N`pxs^ z1@oeL2{xOT%`32p58mBvUNx_o*ZFR%e~|ApZ}B16$oKODunTs>9@q=}U_T7P0T_aV za0m{=5jYCR;5eLslW+>Yfz$9UoPo3O9h`&j;XGV`i*N~kfXi?NeuSUkXSfR2;5z&Q zH{d4Rf?we`xD9u>!8h<;-pBj-M!tz}=3DqyKESu}?fh%LgYOJe0+G1XE|pvY+aq-q zn=lSdh#@vtW|2hoPp6_k{69;3S1PU84F|OkkZG*dK{V{ec8gx(!6ORPDzUeED+86@ QN^g~?%2!(9zsJ0P0$U`Z761SM literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp1252.py b/PythonEnv/2.7/Lib/encodings/cp1252.py new file mode 100644 index 0000000000..e60a328db4 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp1252.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1252 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1252', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\ufffe' # 0x81 -> UNDEFINED + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + u'\ufffe' # 0x8D -> UNDEFINED + u'\u017d' # 0x8E -> LATIN CAPITAL LETTER Z WITH CARON + u'\ufffe' # 0x8F -> UNDEFINED + u'\ufffe' # 0x90 -> UNDEFINED + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\u02dc' # 0x98 -> SMALL TILDE + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + u'\ufffe' # 0x9D -> UNDEFINED + u'\u017e' # 0x9E -> LATIN SMALL LETTER Z WITH CARON + u'\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\xbf' # 0xBF -> INVERTED QUESTION MARK + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH + u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xde' # 0xDE -> LATIN CAPITAL LETTER THORN + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf0' # 0xF0 -> LATIN SMALL LETTER ETH + u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + u'\xfe' # 0xFE -> LATIN SMALL LETTER THORN + u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp1252.pyc b/PythonEnv/2.7/Lib/encodings/cp1252.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca23888b125226c11bf99d3b1a2b952162bdf41e GIT binary patch literal 2841 zcmc&$Yg<%R6y9@X7(l!iN;PK1bc3YKGBb2gqhh2pBudnDm~#fk=GK{mMp>SOtn3bE zYG{Cp_xlY{;Cc3X=!^g2{DD6718l8*WR6-N$eyQW*qgQ2I%n^--u3Ra#`Q;uf5)zl z`WU|lzMB^|681s78tY_pTaQFgO##=02W)a+!6M;Khf;LRIc zOeqisw=nqf1~*d*nd%fa4~ydl{=Ch@l%gq{SJ;a4HZN03Xwh82lo_nqCpN&He5?x{ z^pmHNU?~N#1*bqmr{11P2SV+#CdYJD3)IWmY$Dwj2xSyC7Kmk+R4=U#w5e%TlXX=I z#I;N+P*K0Cp`k9kE>g8&O}KWw6sfAO3q{s8RyEb(vMEv(YM|FD8#gvq1hyvhcG@6D z8&+mJEB*e&P5gv)4>}-@$%E@e&1&*3fRl; zZcVDzTXaHBO~yqCiFCF@7k;RkmeF!SG%_*e7NZne-eQ4Vy{sjfXltPn?zj`BK-UHWVk>e4YyO{r;JPOcGnYBAJ` zPo7(IacOZ2ub0AXJ`pYc3i<-n+9X0YA&*?dBfR!yksxgwPT<5u&>{g6u}}aik#~YK zHqwGL@kClq+ObbNY{HEKy&Y(&n2syKNo>7VPUchru)Y63!&e*+EYmRN~=$9Dfh0G!sq#imQa>ys7;WPs&$B*Hk&xq$RNE<~d3X zTul#Bnk|lEokN)kp4o}EgA~%VBPHsT;SiDD;fbWm%75tz)#h^BlRN~J!Vu|eaI)^5 z)nBo*QvJpYh*!@&C1acP5bYH&wF2y=I`%yu)t)X^5D5}p!a7|-Dnp{qT26>XIv3$GN2FzrLWkE;j9;(#cI+X7Ih-!H$6Mel^cNME%qX2XYxbPE z^XA`of7ybCxuwr9d*Q|9FRgfavnUD2+_^pnY--C-K}~ z)7WPkeWr21GzLwh*EDwD=rg+qCkISpbh4M89iJTL{d|BA@ NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\ufffe' # 0x81 -> UNDEFINED + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\ufffe' # 0x88 -> UNDEFINED + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\ufffe' # 0x8A -> UNDEFINED + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\ufffe' # 0x8C -> UNDEFINED + u'\ufffe' # 0x8D -> UNDEFINED + u'\ufffe' # 0x8E -> UNDEFINED + u'\ufffe' # 0x8F -> UNDEFINED + u'\ufffe' # 0x90 -> UNDEFINED + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\ufffe' # 0x98 -> UNDEFINED + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\ufffe' # 0x9A -> UNDEFINED + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\ufffe' # 0x9C -> UNDEFINED + u'\ufffe' # 0x9D -> UNDEFINED + u'\ufffe' # 0x9E -> UNDEFINED + u'\ufffe' # 0x9F -> UNDEFINED + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0385' # 0xA1 -> GREEK DIALYTIKA TONOS + u'\u0386' # 0xA2 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\ufffe' # 0xAA -> UNDEFINED + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\u2015' # 0xAF -> HORIZONTAL BAR + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\u0384' # 0xB4 -> GREEK TONOS + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\u0388' # 0xB8 -> GREEK CAPITAL LETTER EPSILON WITH TONOS + u'\u0389' # 0xB9 -> GREEK CAPITAL LETTER ETA WITH TONOS + u'\u038a' # 0xBA -> GREEK CAPITAL LETTER IOTA WITH TONOS + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u038c' # 0xBC -> GREEK CAPITAL LETTER OMICRON WITH TONOS + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\u038e' # 0xBE -> GREEK CAPITAL LETTER UPSILON WITH TONOS + u'\u038f' # 0xBF -> GREEK CAPITAL LETTER OMEGA WITH TONOS + u'\u0390' # 0xC0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + u'\u0391' # 0xC1 -> GREEK CAPITAL LETTER ALPHA + u'\u0392' # 0xC2 -> GREEK CAPITAL LETTER BETA + u'\u0393' # 0xC3 -> GREEK CAPITAL LETTER GAMMA + u'\u0394' # 0xC4 -> GREEK CAPITAL LETTER DELTA + u'\u0395' # 0xC5 -> GREEK CAPITAL LETTER EPSILON + u'\u0396' # 0xC6 -> GREEK CAPITAL LETTER ZETA + u'\u0397' # 0xC7 -> GREEK CAPITAL LETTER ETA + u'\u0398' # 0xC8 -> GREEK CAPITAL LETTER THETA + u'\u0399' # 0xC9 -> GREEK CAPITAL LETTER IOTA + u'\u039a' # 0xCA -> GREEK CAPITAL LETTER KAPPA + u'\u039b' # 0xCB -> GREEK CAPITAL LETTER LAMDA + u'\u039c' # 0xCC -> GREEK CAPITAL LETTER MU + u'\u039d' # 0xCD -> GREEK CAPITAL LETTER NU + u'\u039e' # 0xCE -> GREEK CAPITAL LETTER XI + u'\u039f' # 0xCF -> GREEK CAPITAL LETTER OMICRON + u'\u03a0' # 0xD0 -> GREEK CAPITAL LETTER PI + u'\u03a1' # 0xD1 -> GREEK CAPITAL LETTER RHO + u'\ufffe' # 0xD2 -> UNDEFINED + u'\u03a3' # 0xD3 -> GREEK CAPITAL LETTER SIGMA + u'\u03a4' # 0xD4 -> GREEK CAPITAL LETTER TAU + u'\u03a5' # 0xD5 -> GREEK CAPITAL LETTER UPSILON + u'\u03a6' # 0xD6 -> GREEK CAPITAL LETTER PHI + u'\u03a7' # 0xD7 -> GREEK CAPITAL LETTER CHI + u'\u03a8' # 0xD8 -> GREEK CAPITAL LETTER PSI + u'\u03a9' # 0xD9 -> GREEK CAPITAL LETTER OMEGA + u'\u03aa' # 0xDA -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + u'\u03ab' # 0xDB -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + u'\u03ac' # 0xDC -> GREEK SMALL LETTER ALPHA WITH TONOS + u'\u03ad' # 0xDD -> GREEK SMALL LETTER EPSILON WITH TONOS + u'\u03ae' # 0xDE -> GREEK SMALL LETTER ETA WITH TONOS + u'\u03af' # 0xDF -> GREEK SMALL LETTER IOTA WITH TONOS + u'\u03b0' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + u'\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA + u'\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA + u'\u03b3' # 0xE3 -> GREEK SMALL LETTER GAMMA + u'\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA + u'\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON + u'\u03b6' # 0xE6 -> GREEK SMALL LETTER ZETA + u'\u03b7' # 0xE7 -> GREEK SMALL LETTER ETA + u'\u03b8' # 0xE8 -> GREEK SMALL LETTER THETA + u'\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA + u'\u03ba' # 0xEA -> GREEK SMALL LETTER KAPPA + u'\u03bb' # 0xEB -> GREEK SMALL LETTER LAMDA + u'\u03bc' # 0xEC -> GREEK SMALL LETTER MU + u'\u03bd' # 0xED -> GREEK SMALL LETTER NU + u'\u03be' # 0xEE -> GREEK SMALL LETTER XI + u'\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON + u'\u03c0' # 0xF0 -> GREEK SMALL LETTER PI + u'\u03c1' # 0xF1 -> GREEK SMALL LETTER RHO + u'\u03c2' # 0xF2 -> GREEK SMALL LETTER FINAL SIGMA + u'\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA + u'\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU + u'\u03c5' # 0xF5 -> GREEK SMALL LETTER UPSILON + u'\u03c6' # 0xF6 -> GREEK SMALL LETTER PHI + u'\u03c7' # 0xF7 -> GREEK SMALL LETTER CHI + u'\u03c8' # 0xF8 -> GREEK SMALL LETTER PSI + u'\u03c9' # 0xF9 -> GREEK SMALL LETTER OMEGA + u'\u03ca' # 0xFA -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + u'\u03cb' # 0xFB -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + u'\u03cc' # 0xFC -> GREEK SMALL LETTER OMICRON WITH TONOS + u'\u03cd' # 0xFD -> GREEK SMALL LETTER UPSILON WITH TONOS + u'\u03ce' # 0xFE -> GREEK SMALL LETTER OMEGA WITH TONOS + u'\ufffe' # 0xFF -> UNDEFINED +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp1253.pyc b/PythonEnv/2.7/Lib/encodings/cp1253.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e01eaaa544e4b3ba5642fa9624208099fa0a439 GIT binary patch literal 2854 zcmc&$YkLz_5I(s!O>$Jzg|f4~p^0Gv5XvTgN4tJd?kgON##s-a-D}I(SX0C^DwERsPl4NWl85{QWY&?WlWmJVm@vFE%{g< zI_M`)qoL^(z-F9+Exl@2E*lJYiHev|WhK}w=JTm+XE2*C;+l-flG z5@fI@-&^DNr|#k>qI%E)eoP5mC+;+mZ$X@73<5#q`1Ygk2m#7YMzV_u(GaCV_0r?2 zl1iuvTGMdj2-Eg#oK(iT9c(N9oJ@7HJ{N}X!2O8*I`^!gPQ%><;*b&Zam!u4#YIFU zu8JLL*?NmkD9Gs~4kn5JWr&As6MSF#I3tWW6 zdYL0sL6!*y=9o%60=+se5(FKA=UZGHABjLY5C}t|45ul&Zk<8+-E%!e0I5El;_hdI&lj1T)RV@gKstefwU6Y|WFZsqRaTCpKu39~rtR1#9X8=cfsO@QsHEenaN?%dis^#P0k-Y`Gi)i7GmD3K9TSml=uDzcbqQ&L!TOB^Kz zHqe8VW{aa(=TK&xXLh3PAh|T@NQpWD96Zu-o(Qri{g<9lZLYRGDM3If4AXu+PS(A% z`YU!;s^544@#?vYGPX$%(O&XWE5Kf=V&C&o?dfA>(GbxkqS7U#GQ{hwRdwwG#Mzy) z>xNbOm5JL{jZ=8;u-{c*U}h73h))#0-I;5GXTK z%&JQK?Ud0eY_qD;yAYQJA}w>2JG_oc{CfGfXOIZyaJt+cZ<(*$Ur|{#ZTgIvvu4kk zJMX^x1M?SDKk(o~!G#YmdgRf^7Ka{x;>o9;uBm-yN!`+Cmp!-q`4?8axbme{FW0Yb z2sf@-yY7{yS6_R*IkLXx4I$e4=7zS7n__RZzx_`9U9lq}$;r;HRQG%7Og5K)Un!_P zo40(>`{74hKmKH!xqbNeJGV{k=x_T??S!cfnc9G<{lND|_ZkP6`jCD`KdYZZy?$OF)-UK6P3@3AqF>T4 z>sO#(zp7u;M`0K2hCTXC*sI@yeeflG1z*E{H~joyKRzE@QW`$N1dXYkXnsL(?HjC=!|4r<6-zyQD5-5y++uF~;J~0+Og6 zs?-FE|HE|jq|%brfN*yVxh7jJcmrQ)wd_?cG*O_|iM`ex@CDofceSh9Q$F2$m%0B0 D46Lzj literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp1254.py b/PythonEnv/2.7/Lib/encodings/cp1254.py new file mode 100644 index 0000000000..65530ab546 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp1254.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1254 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1254.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1254', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\ufffe' # 0x81 -> UNDEFINED + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + u'\ufffe' # 0x8D -> UNDEFINED + u'\ufffe' # 0x8E -> UNDEFINED + u'\ufffe' # 0x8F -> UNDEFINED + u'\ufffe' # 0x90 -> UNDEFINED + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\u02dc' # 0x98 -> SMALL TILDE + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + u'\ufffe' # 0x9D -> UNDEFINED + u'\ufffe' # 0x9E -> UNDEFINED + u'\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\xbf' # 0xBF -> INVERTED QUESTION MARK + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\u011e' # 0xD0 -> LATIN CAPITAL LETTER G WITH BREVE + u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u0130' # 0xDD -> LATIN CAPITAL LETTER I WITH DOT ABOVE + u'\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\u011f' # 0xF0 -> LATIN SMALL LETTER G WITH BREVE + u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u0131' # 0xFD -> LATIN SMALL LETTER DOTLESS I + u'\u015f' # 0xFE -> LATIN SMALL LETTER S WITH CEDILLA + u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp1254.pyc b/PythonEnv/2.7/Lib/encodings/cp1254.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6bb35c67bd8649179b77d59a1b5f6e813b8c9d0 GIT binary patch literal 2843 zcmc&$Yg<%R6y9@X7{I$0N;PKXbb~a_GBb5Rqhh2pBudnDm~#e(=GK{mMp>SOtnBur zR%!%-iZ{Gp@RmH!UQA#77v~T3p&wvt?IUx5`at$PH8Xp&_FCucz1F+ly%w%N%KSTb zchtq$-H!|ZuECKT#z|qU31R|0o7Dw65x*6+YY)g}qDIQ^P34^y_ za51Gw7~I0(D;V5NDQ2ou*gPzb8~6)04^v9UY+hk2E!ezFDWgSG5mTnICZE^O1weOga#1lQlV}t6HE=&Sn$o)<7tusIfpSyJYF|Wr0>Tt!lEa zDuK9`Nd*?yt*x)G4R454ZK?@ZZDVh{+Tz_%NHM+i`MGLl_PiUcVYx|bf; zwM0yh(VB)EM~Kw3anc!Ucd+gFb28n@x?C8(1NCA1b>Ue~pN85P;*gTFQOjMS5+WiJ z)#a9?YQ04#t%sZ3GGZUFvq>bBhjl9B0(&{B-(A;(1d#5-DH=`7 zDK#3^{bG^IC>=>$N@SBLSo=sJO%*Z;UuDHOa&(l}S?bbfp-`KSX=+MM>vFP2;Hkw> zD?SBo&B3L`ExcX|v-w1{_$%o1QEQV3*@QfD5s&cNmq&uMZ8(7w6G4jvNW?+`s6^fg z&e%u`(!>*KIcdi}<**4i3UoZsQYjr*hLhNOy`0Rc0$_Xpe}*k(a^~0}UdLo)s|BV0 zA7m-z7P3UBNyti6*X*FD3@Y((9*(~URhogOf5lb8a_-pvh$rPMqHC(0YSa=~bPF6M z2CkzADa{r~vCg5)1kdb5+d&Fx%8?Rv%5jKDCwL;MvhrVgLbbWV_M`v-r7%SLH8@%K z&g!q&S*d>G1;nf89+R<6dWiOlms$b#QXTuAk7`dBD~be(E@7Q6A(bIfXRWGh7a+mz zgk3kR(yvWcTQyD-xx;>gxx;~ojZgmd=XO=8|cG>dhRy_a0$`@C?wEE>W zYuAOUYu0agrS{d=Uat#ptbap_G`zW~ar2g@x0>I6C;G135>wQ8Yg?lIy<{q#$-b}U z^p36DKIr`LqwODmvcudt^!vyy(>VCs9@FSGjX~2mWE%aqcbUeyJWAK{d(d9^nZ|z8 zIA9t*rtynu44B4V)7W>r$Lt=+_nXG`{9fzH{8fI4_wxaMm>=Os`5-^WkMk4!BtON6 z_-THIpXKNHd47RkVa2n3Q+0i~Y4;SDfT!PDR1%}}&T!ZUy18$C<&-cMdkg|yErJku|V%Q_8wOFjN zxk5Ct2(y4BDuOyy{;_{tS~?O*#p*h!9mlAtmI%?cS6O{}wF|e%QNP3n>n`_|yUX1b Nt_n}_bnhMJ{u6_Qq|^Wa literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp1255.py b/PythonEnv/2.7/Lib/encodings/cp1255.py new file mode 100644 index 0000000000..fd1456fab6 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp1255.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1255 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1255.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1255', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\ufffe' # 0x81 -> UNDEFINED + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\ufffe' # 0x8A -> UNDEFINED + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\ufffe' # 0x8C -> UNDEFINED + u'\ufffe' # 0x8D -> UNDEFINED + u'\ufffe' # 0x8E -> UNDEFINED + u'\ufffe' # 0x8F -> UNDEFINED + u'\ufffe' # 0x90 -> UNDEFINED + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\u02dc' # 0x98 -> SMALL TILDE + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\ufffe' # 0x9A -> UNDEFINED + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\ufffe' # 0x9C -> UNDEFINED + u'\ufffe' # 0x9D -> UNDEFINED + u'\ufffe' # 0x9E -> UNDEFINED + u'\ufffe' # 0x9F -> UNDEFINED + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\u20aa' # 0xA4 -> NEW SHEQEL SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\xd7' # 0xAA -> MULTIPLICATION SIGN + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\xf7' # 0xBA -> DIVISION SIGN + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\xbf' # 0xBF -> INVERTED QUESTION MARK + u'\u05b0' # 0xC0 -> HEBREW POINT SHEVA + u'\u05b1' # 0xC1 -> HEBREW POINT HATAF SEGOL + u'\u05b2' # 0xC2 -> HEBREW POINT HATAF PATAH + u'\u05b3' # 0xC3 -> HEBREW POINT HATAF QAMATS + u'\u05b4' # 0xC4 -> HEBREW POINT HIRIQ + u'\u05b5' # 0xC5 -> HEBREW POINT TSERE + u'\u05b6' # 0xC6 -> HEBREW POINT SEGOL + u'\u05b7' # 0xC7 -> HEBREW POINT PATAH + u'\u05b8' # 0xC8 -> HEBREW POINT QAMATS + u'\u05b9' # 0xC9 -> HEBREW POINT HOLAM + u'\ufffe' # 0xCA -> UNDEFINED + u'\u05bb' # 0xCB -> HEBREW POINT QUBUTS + u'\u05bc' # 0xCC -> HEBREW POINT DAGESH OR MAPIQ + u'\u05bd' # 0xCD -> HEBREW POINT METEG + u'\u05be' # 0xCE -> HEBREW PUNCTUATION MAQAF + u'\u05bf' # 0xCF -> HEBREW POINT RAFE + u'\u05c0' # 0xD0 -> HEBREW PUNCTUATION PASEQ + u'\u05c1' # 0xD1 -> HEBREW POINT SHIN DOT + u'\u05c2' # 0xD2 -> HEBREW POINT SIN DOT + u'\u05c3' # 0xD3 -> HEBREW PUNCTUATION SOF PASUQ + u'\u05f0' # 0xD4 -> HEBREW LIGATURE YIDDISH DOUBLE VAV + u'\u05f1' # 0xD5 -> HEBREW LIGATURE YIDDISH VAV YOD + u'\u05f2' # 0xD6 -> HEBREW LIGATURE YIDDISH DOUBLE YOD + u'\u05f3' # 0xD7 -> HEBREW PUNCTUATION GERESH + u'\u05f4' # 0xD8 -> HEBREW PUNCTUATION GERSHAYIM + u'\ufffe' # 0xD9 -> UNDEFINED + u'\ufffe' # 0xDA -> UNDEFINED + u'\ufffe' # 0xDB -> UNDEFINED + u'\ufffe' # 0xDC -> UNDEFINED + u'\ufffe' # 0xDD -> UNDEFINED + u'\ufffe' # 0xDE -> UNDEFINED + u'\ufffe' # 0xDF -> UNDEFINED + u'\u05d0' # 0xE0 -> HEBREW LETTER ALEF + u'\u05d1' # 0xE1 -> HEBREW LETTER BET + u'\u05d2' # 0xE2 -> HEBREW LETTER GIMEL + u'\u05d3' # 0xE3 -> HEBREW LETTER DALET + u'\u05d4' # 0xE4 -> HEBREW LETTER HE + u'\u05d5' # 0xE5 -> HEBREW LETTER VAV + u'\u05d6' # 0xE6 -> HEBREW LETTER ZAYIN + u'\u05d7' # 0xE7 -> HEBREW LETTER HET + u'\u05d8' # 0xE8 -> HEBREW LETTER TET + u'\u05d9' # 0xE9 -> HEBREW LETTER YOD + u'\u05da' # 0xEA -> HEBREW LETTER FINAL KAF + u'\u05db' # 0xEB -> HEBREW LETTER KAF + u'\u05dc' # 0xEC -> HEBREW LETTER LAMED + u'\u05dd' # 0xED -> HEBREW LETTER FINAL MEM + u'\u05de' # 0xEE -> HEBREW LETTER MEM + u'\u05df' # 0xEF -> HEBREW LETTER FINAL NUN + u'\u05e0' # 0xF0 -> HEBREW LETTER NUN + u'\u05e1' # 0xF1 -> HEBREW LETTER SAMEKH + u'\u05e2' # 0xF2 -> HEBREW LETTER AYIN + u'\u05e3' # 0xF3 -> HEBREW LETTER FINAL PE + u'\u05e4' # 0xF4 -> HEBREW LETTER PE + u'\u05e5' # 0xF5 -> HEBREW LETTER FINAL TSADI + u'\u05e6' # 0xF6 -> HEBREW LETTER TSADI + u'\u05e7' # 0xF7 -> HEBREW LETTER QOF + u'\u05e8' # 0xF8 -> HEBREW LETTER RESH + u'\u05e9' # 0xF9 -> HEBREW LETTER SHIN + u'\u05ea' # 0xFA -> HEBREW LETTER TAV + u'\ufffe' # 0xFB -> UNDEFINED + u'\ufffe' # 0xFC -> UNDEFINED + u'\u200e' # 0xFD -> LEFT-TO-RIGHT MARK + u'\u200f' # 0xFE -> RIGHT-TO-LEFT MARK + u'\ufffe' # 0xFF -> UNDEFINED +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp1255.pyc b/PythonEnv/2.7/Lib/encodings/cp1255.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b61c4a2315833c3357657c1e1b76c71ef76e887 GIT binary patch literal 2862 zcmc&$+glq&6rWrP;nus-qNY|Q-oT<*t+i4D)TpGm!O|icm+S_Dxw+XC(P~%V^T7u% zZM7F^1#0P4<<`>L7QS!#eZKU4=Y9VHAN&LAIkP1T=mX;S=_WHdGiPV!oZtD)IdS|^ z;_d$;*BmAH9tZr^LCelSClS&Py^TnAlCY6>5FA9dksdpVf$SuMgbWa}zuitG7gspA z!kt$*h*ZE8POk9e6;2`*64}mmE)s(cym_6ANJaBHH`f*Cb#5Y+;Gn&LNTsCR!#9AP zJY)b2^rEFWgN!*3{Pey5y9s zh^j34VoEyct8CuY(h>~q4p;AO3^nW#!qv^eK)9*3x-AI9ws3Wz1(#K|?rW{|^~Tk1 z+#re@R%QCCyx#a-ctWZR4B*G)!L`FoJ=*4jP6j6cM2_zu*bWeYY$qr?h!FN;C{#DT zt}5}U8pSa-C$s=guZ2z}q{l`M!q-kzI~j0*`!<*lSI2p{s_2qktYB;0MDnmxY!c`V;~@gLIHFuG~GM{@w;cb9|2N5&_yCC zF)2qPs+SLvX(^Y0p@2F8owbhS(sCgaU@0ktmc^so_F{*+283WLs>n$>rHYA0j;9iZ zS^ng?wGM_Rx8Qn7#Nrdu;;*1@gjtJ3z$W0419=43zC7&5Z9{SB2zQzXKtL99Kn1jp zbH+lNlO`5Vi3!X1WxI{Ip`#0d7K-t>66pBWO=2P|bAYY={~5Lz$<_0RxNS?3ZQzvp ze~`tHo5&)emLMx&UbCEDHmJzM4bc7`RACjU{uNgd%k}g71D+VKu&T&nvQ3FY(#>-e z8CZ`mVwg>iLY@PeaGqI#ww&bBvOPuWltbg5F0w?BMd`n^1aotRWl0_a3}FE0>!365 zompR@vSR**3kX-wIWI$*bRq2}H7)IyeWiR-`d-@Z-4vS9q+swc~9(&N^-2LJKpntBAH5OK2Wl1 z?m+K{eII>%@RLsu8U2@kpPMzblfNA{w9|$*W@y8PHge~4LmTIc>(DR!8rpF~J7H); zhIY!(Mh)$Vp&h+5WDJh-*MD93E*+*Lbd;Vk`Y+P6bc~*(=jnyp$LJ+`nf^q7roYf} zIzcDt6rHA5=v6vHuhHwbXXp)jlis4UbWR`FC-g~uN}txR=vVa_{hE&U=r{D6`YnA{ zpJN*PjP3(wEX>}&Q7JIs!-qwHJu9XrO3vlHwj`<@N4Q|vVRfeo_} zHp;k)JE;qC<4ecwC{TNsvG?q~*9fh)q)y5=}MIU62$)QasVO~_R z7|j2d>CD9wl39pgb^*zjn>BbL-(i;SoetO{izO6luCv@z?ksm!I4WF)W$wGg`6n_h Byg2{> literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp1256.py b/PythonEnv/2.7/Lib/encodings/cp1256.py new file mode 100644 index 0000000000..302b5fa066 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp1256.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1256 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1256.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1256', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\u067e' # 0x81 -> ARABIC LETTER PEH + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\u0679' # 0x8A -> ARABIC LETTER TTEH + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + u'\u0686' # 0x8D -> ARABIC LETTER TCHEH + u'\u0698' # 0x8E -> ARABIC LETTER JEH + u'\u0688' # 0x8F -> ARABIC LETTER DDAL + u'\u06af' # 0x90 -> ARABIC LETTER GAF + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\u06a9' # 0x98 -> ARABIC LETTER KEHEH + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\u0691' # 0x9A -> ARABIC LETTER RREH + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + u'\u200c' # 0x9D -> ZERO WIDTH NON-JOINER + u'\u200d' # 0x9E -> ZERO WIDTH JOINER + u'\u06ba' # 0x9F -> ARABIC LETTER NOON GHUNNA + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u060c' # 0xA1 -> ARABIC COMMA + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u06be' # 0xAA -> ARABIC LETTER HEH DOACHASHMEE + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\u061b' # 0xBA -> ARABIC SEMICOLON + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\u061f' # 0xBF -> ARABIC QUESTION MARK + u'\u06c1' # 0xC0 -> ARABIC LETTER HEH GOAL + u'\u0621' # 0xC1 -> ARABIC LETTER HAMZA + u'\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + u'\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + u'\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + u'\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + u'\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + u'\u0627' # 0xC7 -> ARABIC LETTER ALEF + u'\u0628' # 0xC8 -> ARABIC LETTER BEH + u'\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA + u'\u062a' # 0xCA -> ARABIC LETTER TEH + u'\u062b' # 0xCB -> ARABIC LETTER THEH + u'\u062c' # 0xCC -> ARABIC LETTER JEEM + u'\u062d' # 0xCD -> ARABIC LETTER HAH + u'\u062e' # 0xCE -> ARABIC LETTER KHAH + u'\u062f' # 0xCF -> ARABIC LETTER DAL + u'\u0630' # 0xD0 -> ARABIC LETTER THAL + u'\u0631' # 0xD1 -> ARABIC LETTER REH + u'\u0632' # 0xD2 -> ARABIC LETTER ZAIN + u'\u0633' # 0xD3 -> ARABIC LETTER SEEN + u'\u0634' # 0xD4 -> ARABIC LETTER SHEEN + u'\u0635' # 0xD5 -> ARABIC LETTER SAD + u'\u0636' # 0xD6 -> ARABIC LETTER DAD + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\u0637' # 0xD8 -> ARABIC LETTER TAH + u'\u0638' # 0xD9 -> ARABIC LETTER ZAH + u'\u0639' # 0xDA -> ARABIC LETTER AIN + u'\u063a' # 0xDB -> ARABIC LETTER GHAIN + u'\u0640' # 0xDC -> ARABIC TATWEEL + u'\u0641' # 0xDD -> ARABIC LETTER FEH + u'\u0642' # 0xDE -> ARABIC LETTER QAF + u'\u0643' # 0xDF -> ARABIC LETTER KAF + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\u0644' # 0xE1 -> ARABIC LETTER LAM + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\u0645' # 0xE3 -> ARABIC LETTER MEEM + u'\u0646' # 0xE4 -> ARABIC LETTER NOON + u'\u0647' # 0xE5 -> ARABIC LETTER HEH + u'\u0648' # 0xE6 -> ARABIC LETTER WAW + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\u0649' # 0xEC -> ARABIC LETTER ALEF MAKSURA + u'\u064a' # 0xED -> ARABIC LETTER YEH + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\u064b' # 0xF0 -> ARABIC FATHATAN + u'\u064c' # 0xF1 -> ARABIC DAMMATAN + u'\u064d' # 0xF2 -> ARABIC KASRATAN + u'\u064e' # 0xF3 -> ARABIC FATHA + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\u064f' # 0xF5 -> ARABIC DAMMA + u'\u0650' # 0xF6 -> ARABIC KASRA + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\u0651' # 0xF8 -> ARABIC SHADDA + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\u0652' # 0xFA -> ARABIC SUKUN + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u200e' # 0xFD -> LEFT-TO-RIGHT MARK + u'\u200f' # 0xFE -> RIGHT-TO-LEFT MARK + u'\u06d2' # 0xFF -> ARABIC LETTER YEH BARREE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp1256.pyc b/PythonEnv/2.7/Lib/encodings/cp1256.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4f1428452865592d396029b6d7dd6f300ad61e4 GIT binary patch literal 2840 zcmc&$`(G4Q6ua}U`P3};a_%`h_nz}T-+Ruw{wVeD zJ95(P5Y#t)b7_)h~t)yV{5~&myjYUM7Ng9281K7z& zI>A9ddKw9qVE{W|3eDt(eUw(k+2dMv`NJSa#X+6)OWRa#~hI zRh9yAC6fv)tzBPNR}`bVw zxIqjztju;)`u&N!@Pt(lIKYo7fa?TJHTo8SNroT*M2>G4_zn<&>?A0=h!6>4DpW6i zT~!h>HHK>(ZWtj{&xJ`Pq|HHg!Jm_;PSWXu@ExEJ+plxaa_UUb#sG(un2lQQaupW= zk*F#*CuQp`JRv71<2-~!I@_*tKV(J8D7hdQ37>LHKnksHvOr$GswtUhZW`M!*JObU zkXSEsgl6E*2m^6UCmsP`oe&9t4#0C27biv{U=9StP$+_Fnyy=CAb$5;4!Tq#U^>rG-ZCv$-9{r?%Zn912=hj<;6k=?*4 z_5UD?DYuYCLQO(ez`AA!J!MdlhYMi*J*dJgF#Rj8B9`;V_6IyMUlCQ2#Z-fmfTCOA zC^E1bzldqJI0|(RWWsr7C)y5@OH+;%sZ$PvM>@e1K^CR|(i5!B6}Be@2rz{q)USid zx_4H8h0cog8!jMRJ@=RlZPJ6Zm%P{tpqHx9_k37;I!RF^h;#|7cnPr#@j7c&UAq8r zb|>t*VU>Pmvf8R~3eO$%8^|3DKx~|1Cr>6n)2hRGI&W|_>3D`$Ec;jiFPVVM5D*Fh zGc(Pss>t6K8JvPPt12CfVVOhH5=XJa>nMSbmw(#7L4rA)F1N>96HTN}1*Z+xri?RTQ@ip?=ej<>WX+TKg1(wXf0 zN=|LxvGaqD4?o)V@h7{@y@ST6seS)jx2gSXYG+LCxT&4^eV?gaFh)#m2*57exNt$E&3}RWxw3n!%nasc9NZ9 zr`Z|S%lcS9JIe;xAUns-vmthYU1XQoWp;&KW!Lm?*)Y4#M%WEQGxivJjZXcz(WUno zpBnp&&y4+guimHk>u2==<8$MHeqJ9kzAz3Nhm6De72}BUr9NyN)klnO{ic4))DD~4 zkvrW%Od(Jg8>W3Ub6^%OaGp0;*W{$9}amwfs gv6}Q+7i^KkW(nQZUG6J)m%A%m6`tZU?_J{l6E{$$CIA2c literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp1257.py b/PythonEnv/2.7/Lib/encodings/cp1257.py new file mode 100644 index 0000000000..53a6b29d5b --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp1257.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1257 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1257.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1257', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\ufffe' # 0x81 -> UNDEFINED + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\ufffe' # 0x83 -> UNDEFINED + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\ufffe' # 0x88 -> UNDEFINED + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\ufffe' # 0x8A -> UNDEFINED + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\ufffe' # 0x8C -> UNDEFINED + u'\xa8' # 0x8D -> DIAERESIS + u'\u02c7' # 0x8E -> CARON + u'\xb8' # 0x8F -> CEDILLA + u'\ufffe' # 0x90 -> UNDEFINED + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\ufffe' # 0x98 -> UNDEFINED + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\ufffe' # 0x9A -> UNDEFINED + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\ufffe' # 0x9C -> UNDEFINED + u'\xaf' # 0x9D -> MACRON + u'\u02db' # 0x9E -> OGONEK + u'\ufffe' # 0x9F -> UNDEFINED + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\ufffe' # 0xA1 -> UNDEFINED + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\ufffe' # 0xA5 -> UNDEFINED + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xd8' # 0xA8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u0156' # 0xAA -> LATIN CAPITAL LETTER R WITH CEDILLA + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xc6' # 0xAF -> LATIN CAPITAL LETTER AE + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xf8' # 0xB8 -> LATIN SMALL LETTER O WITH STROKE + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\u0157' # 0xBA -> LATIN SMALL LETTER R WITH CEDILLA + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\xe6' # 0xBF -> LATIN SMALL LETTER AE + u'\u0104' # 0xC0 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\u012e' # 0xC1 -> LATIN CAPITAL LETTER I WITH OGONEK + u'\u0100' # 0xC2 -> LATIN CAPITAL LETTER A WITH MACRON + u'\u0106' # 0xC3 -> LATIN CAPITAL LETTER C WITH ACUTE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\u0118' # 0xC6 -> LATIN CAPITAL LETTER E WITH OGONEK + u'\u0112' # 0xC7 -> LATIN CAPITAL LETTER E WITH MACRON + u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\u0179' # 0xCA -> LATIN CAPITAL LETTER Z WITH ACUTE + u'\u0116' # 0xCB -> LATIN CAPITAL LETTER E WITH DOT ABOVE + u'\u0122' # 0xCC -> LATIN CAPITAL LETTER G WITH CEDILLA + u'\u0136' # 0xCD -> LATIN CAPITAL LETTER K WITH CEDILLA + u'\u012a' # 0xCE -> LATIN CAPITAL LETTER I WITH MACRON + u'\u013b' # 0xCF -> LATIN CAPITAL LETTER L WITH CEDILLA + u'\u0160' # 0xD0 -> LATIN CAPITAL LETTER S WITH CARON + u'\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + u'\u0145' # 0xD2 -> LATIN CAPITAL LETTER N WITH CEDILLA + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\u014c' # 0xD4 -> LATIN CAPITAL LETTER O WITH MACRON + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\u0172' # 0xD8 -> LATIN CAPITAL LETTER U WITH OGONEK + u'\u0141' # 0xD9 -> LATIN CAPITAL LETTER L WITH STROKE + u'\u015a' # 0xDA -> LATIN CAPITAL LETTER S WITH ACUTE + u'\u016a' # 0xDB -> LATIN CAPITAL LETTER U WITH MACRON + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u017b' # 0xDD -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\u017d' # 0xDE -> LATIN CAPITAL LETTER Z WITH CARON + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\u0105' # 0xE0 -> LATIN SMALL LETTER A WITH OGONEK + u'\u012f' # 0xE1 -> LATIN SMALL LETTER I WITH OGONEK + u'\u0101' # 0xE2 -> LATIN SMALL LETTER A WITH MACRON + u'\u0107' # 0xE3 -> LATIN SMALL LETTER C WITH ACUTE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\u0119' # 0xE6 -> LATIN SMALL LETTER E WITH OGONEK + u'\u0113' # 0xE7 -> LATIN SMALL LETTER E WITH MACRON + u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\u017a' # 0xEA -> LATIN SMALL LETTER Z WITH ACUTE + u'\u0117' # 0xEB -> LATIN SMALL LETTER E WITH DOT ABOVE + u'\u0123' # 0xEC -> LATIN SMALL LETTER G WITH CEDILLA + u'\u0137' # 0xED -> LATIN SMALL LETTER K WITH CEDILLA + u'\u012b' # 0xEE -> LATIN SMALL LETTER I WITH MACRON + u'\u013c' # 0xEF -> LATIN SMALL LETTER L WITH CEDILLA + u'\u0161' # 0xF0 -> LATIN SMALL LETTER S WITH CARON + u'\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + u'\u0146' # 0xF2 -> LATIN SMALL LETTER N WITH CEDILLA + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\u014d' # 0xF4 -> LATIN SMALL LETTER O WITH MACRON + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\u0173' # 0xF8 -> LATIN SMALL LETTER U WITH OGONEK + u'\u0142' # 0xF9 -> LATIN SMALL LETTER L WITH STROKE + u'\u015b' # 0xFA -> LATIN SMALL LETTER S WITH ACUTE + u'\u016b' # 0xFB -> LATIN SMALL LETTER U WITH MACRON + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\u017e' # 0xFE -> LATIN SMALL LETTER Z WITH CARON + u'\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp1257.pyc b/PythonEnv/2.7/Lib/encodings/cp1257.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40d7749c78a33320583f69138d6b6998bb40f1bf GIT binary patch literal 2848 zcmc&$>sK395Wjg6!mDphi<(-M_yUVowAM-qP@|IK21^^!xMVl5n3tQSh*nJ@(4(jQ zBFdu=rL>|gwXMZMDHPAy$0z=a`~!aQ52!PDn=GIo5YN$sJDGcD_uiS`{O$~vKT4c^ zUv)Qy$^DN7ersW*W>{$kCvga5ieNP=h^h zun?|*8m!dd$Q!JLDV z2c76?z*B|+90TEQ?v*+daksaV71^-Fi|!^inH1t3Zf}C)!|rf$clDkccLyKmMONZD zcSKCY+!aj+nwx$8gMq5U4gUH=OrWaC=M6NrRJHnG+8U_xHsfoREk{}^+&zNSi5rA* z!^&iDrPC?ggO6XbfdllIJh*09sYBn~Ab1D@K&1F)z;}QEbTdKSLYRODQz6;$aY+=y zQW)nrtT4Q|ycvWdHtM%mITKG6f*k>AHRf;&dCQy9wu*k>wxWq;qD4t>%R_Q0t ztt~LsxdqpYBL<(47JmhOJFFTc0yY7UEXX6c_O5^jxAhAk2o0JhfI${gKpFIoa>hWK zk|rX=*{Biwn!`riFwo^dGsSpZ2?)A%BO6We6kucje}*k)a%1igyJKy2V^2|uI5hT^t94S)A1%pPq!V`vPx&P7=tj*)}DS+5bz*f{1RS5EJL);>Q&b$K$P8rQ8)C` zFRotJYn(`P2mJ;;ZOXHjuUY1xL2n>KIRy6u4n zUE6n*KlJb;?wybBdhGEhDm+g<_4G5(R#rW?yZZST_Pkj0(#v~a+4t)H*J=;cdFvY* z55DeuE^lrNz&DgUU9%9piac}l)2|14iq2IU*_FY--! zTK-kOCC|vS%58a086J)dBUodO|&^TvC2e$J8P9v~pRyqmHN- z)me2)UC=IQ8EsIR)=n$8lo@4Ko7VcYv)Yuhpe<;NOJg2PB~Ta}Czl9Aqs0EAQ^z0- zaz$s&4%Dy`N?87L|Gl(#3sFvQJ+QirR%@*jv~};(oArJRY>~pI30>Cea=5H6Yq_P| LR#;}gN34GWGzh8c literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp1258.py b/PythonEnv/2.7/Lib/encodings/cp1258.py new file mode 100644 index 0000000000..4b25d8e7e8 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp1258.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1258 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1258.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1258', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\ufffe' # 0x81 -> UNDEFINED + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\ufffe' # 0x8A -> UNDEFINED + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + u'\ufffe' # 0x8D -> UNDEFINED + u'\ufffe' # 0x8E -> UNDEFINED + u'\ufffe' # 0x8F -> UNDEFINED + u'\ufffe' # 0x90 -> UNDEFINED + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\u02dc' # 0x98 -> SMALL TILDE + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\ufffe' # 0x9A -> UNDEFINED + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + u'\ufffe' # 0x9D -> UNDEFINED + u'\ufffe' # 0x9E -> UNDEFINED + u'\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\xbf' # 0xBF -> INVERTED QUESTION MARK + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\u0300' # 0xCC -> COMBINING GRAVE ACCENT + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + u'\u0309' # 0xD2 -> COMBINING HOOK ABOVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\u01a0' # 0xD5 -> LATIN CAPITAL LETTER O WITH HORN + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u01af' # 0xDD -> LATIN CAPITAL LETTER U WITH HORN + u'\u0303' # 0xDE -> COMBINING TILDE + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\u0301' # 0xEC -> COMBINING ACUTE ACCENT + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + u'\u0323' # 0xF2 -> COMBINING DOT BELOW + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\u01a1' # 0xF5 -> LATIN SMALL LETTER O WITH HORN + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u01b0' # 0xFD -> LATIN SMALL LETTER U WITH HORN + u'\u20ab' # 0xFE -> DONG SIGN + u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp1258.pyc b/PythonEnv/2.7/Lib/encodings/cp1258.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd2cbefcfb64d8bd94ece1d963ea10ba0ec95f53 GIT binary patch literal 2846 zcmc&$>sM4&6hHH17{Rv|N;PKX^n#>JGc$F3M8!yVNR+7QGWQOQ&8s^Xjk3G~S=#F1 zW0kK8@GUBsCWt0$oeg}EzvBJ_edrIcz0Z}oKz$%vtM1G>v(MT0oU`|D|IXgy`lHz2 zy1%(9#_l~X{9S`B*N2_LSRM8brZ`#B!RkpV=EHm36mT~S`=WlAv(>I#@Loz?lo2Dp=t zwV{E2vNRH$K@RM|E>PW~H)Ya+P?N05FQK6QeIUVifpVYudT#kZKOO@P0Pw^w$>~O>`drQ zv_XtEEX%f(`TdEz_=I&28X%6zgX_eZb!1xrI~AQk5Cy*NXgflHvXhbQVp1eXq0qhb zx~?T+dW^=@+}J`iJqJ6TvF#4F3%^dLJ6W3x-FM)8*j_Fy%jwf`HikH)?=p?++?T)hP@ zLSiiz2u-7%2?pl4AAclTI>8eJ9f229LY(M{L@|&EL#Y6}`!wA;gYdg&dXNCpeb_~# zX*s1vqq<)VQW>Q=i9?BW5;6oUb)U+-qHwZkn z7|x0(&#k#Qw77-WOJO#jh!%eZeF4teBtkYJk6gqfy!IuLAZ;5?V8?{hA^;MxPyi~C zb%HZC(tgCCY2I(^CeOcsL*1--9a6MAg6IDq%TqY=6X);uX;~RZi7v2~4_q zjuHdc(Tfyji=&w5P-cQ>cA#x1g*0VPi8>|Ngr^fMkyKgvFD;?mTxwgAhk!yDqWLx0 zS@+JWuUJ_rf8zzjtLGk*u}pf1_KKHE0oGC->z}jJO`f)LoF-z2^#)^y4G|kRu~P(7oN47@I$adF%5*#^XDi&41v*k_8J(AA0zaz@kSNKlb<&OM*{6_4G5(mX$xZwBq>}mc6)q#Y-z+UiHfA zSJ$jv7h1nznT+gob4ZmWBz{@wSY@5>D_MU6K$CANQ%Or(kG6o2?grAG~cE$3_mC#!sek#xy!iqw~&Q)94k78^Z_jH~%$_ zBc^fGG)|btkEYRO8i!2d@SPK8dzW~7VEB;r>To~r;GMjSpX8_bX?}*E<>&Z$et~!M zi~JJ5%zJn*zrugvSNS#mE5FYBct5|v2l!2Xi~q)N^Fc6R53~-oLOXm8d*KWC686D< z_-fREui+c`cIZ1eFuD&8!Qqh(_#S?MBXAUs!Erb-(lgoyKSKv}Lf23moPyJE2F}7c zI1d+~dvp(6g3Hh|bO5f5o`kD#ZKM;fLm%|R4H$r%aBHO3Z0&}@AO#W$Ol4Ea#IQ_K zb+L$J(}kE~ab_V&lm~T6{$u}L8k!SH#VR~FJC0OS%@U$;ud+(@Y8P&iqmqd=)?MN& RahJGDU8SDF8Q#0h{U>ZGr%V6< literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp424.py b/PythonEnv/2.7/Lib/encodings/cp424.py new file mode 100644 index 0000000000..d3ade22776 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp424.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp424 generated from 'MAPPINGS/VENDORS/MISC/CP424.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp424', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x9c' # 0x04 -> SELECT + u'\t' # 0x05 -> HORIZONTAL TABULATION + u'\x86' # 0x06 -> REQUIRED NEW LINE + u'\x7f' # 0x07 -> DELETE + u'\x97' # 0x08 -> GRAPHIC ESCAPE + u'\x8d' # 0x09 -> SUPERSCRIPT + u'\x8e' # 0x0A -> REPEAT + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x9d' # 0x14 -> RESTORE/ENABLE PRESENTATION + u'\x85' # 0x15 -> NEW LINE + u'\x08' # 0x16 -> BACKSPACE + u'\x87' # 0x17 -> PROGRAM OPERATOR COMMUNICATION + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x92' # 0x1A -> UNIT BACK SPACE + u'\x8f' # 0x1B -> CUSTOMER USE ONE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u'\x80' # 0x20 -> DIGIT SELECT + u'\x81' # 0x21 -> START OF SIGNIFICANCE + u'\x82' # 0x22 -> FIELD SEPARATOR + u'\x83' # 0x23 -> WORD UNDERSCORE + u'\x84' # 0x24 -> BYPASS OR INHIBIT PRESENTATION + u'\n' # 0x25 -> LINE FEED + u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK + u'\x1b' # 0x27 -> ESCAPE + u'\x88' # 0x28 -> SET ATTRIBUTE + u'\x89' # 0x29 -> START FIELD EXTENDED + u'\x8a' # 0x2A -> SET MODE OR SWITCH + u'\x8b' # 0x2B -> CONTROL SEQUENCE PREFIX + u'\x8c' # 0x2C -> MODIFY FIELD ATTRIBUTE + u'\x05' # 0x2D -> ENQUIRY + u'\x06' # 0x2E -> ACKNOWLEDGE + u'\x07' # 0x2F -> BELL + u'\x90' # 0x30 -> + u'\x91' # 0x31 -> + u'\x16' # 0x32 -> SYNCHRONOUS IDLE + u'\x93' # 0x33 -> INDEX RETURN + u'\x94' # 0x34 -> PRESENTATION POSITION + u'\x95' # 0x35 -> TRANSPARENT + u'\x96' # 0x36 -> NUMERIC BACKSPACE + u'\x04' # 0x37 -> END OF TRANSMISSION + u'\x98' # 0x38 -> SUBSCRIPT + u'\x99' # 0x39 -> INDENT TABULATION + u'\x9a' # 0x3A -> REVERSE FORM FEED + u'\x9b' # 0x3B -> CUSTOMER USE THREE + u'\x14' # 0x3C -> DEVICE CONTROL FOUR + u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + u'\x9e' # 0x3E -> + u'\x1a' # 0x3F -> SUBSTITUTE + u' ' # 0x40 -> SPACE + u'\u05d0' # 0x41 -> HEBREW LETTER ALEF + u'\u05d1' # 0x42 -> HEBREW LETTER BET + u'\u05d2' # 0x43 -> HEBREW LETTER GIMEL + u'\u05d3' # 0x44 -> HEBREW LETTER DALET + u'\u05d4' # 0x45 -> HEBREW LETTER HE + u'\u05d5' # 0x46 -> HEBREW LETTER VAV + u'\u05d6' # 0x47 -> HEBREW LETTER ZAYIN + u'\u05d7' # 0x48 -> HEBREW LETTER HET + u'\u05d8' # 0x49 -> HEBREW LETTER TET + u'\xa2' # 0x4A -> CENT SIGN + u'.' # 0x4B -> FULL STOP + u'<' # 0x4C -> LESS-THAN SIGN + u'(' # 0x4D -> LEFT PARENTHESIS + u'+' # 0x4E -> PLUS SIGN + u'|' # 0x4F -> VERTICAL LINE + u'&' # 0x50 -> AMPERSAND + u'\u05d9' # 0x51 -> HEBREW LETTER YOD + u'\u05da' # 0x52 -> HEBREW LETTER FINAL KAF + u'\u05db' # 0x53 -> HEBREW LETTER KAF + u'\u05dc' # 0x54 -> HEBREW LETTER LAMED + u'\u05dd' # 0x55 -> HEBREW LETTER FINAL MEM + u'\u05de' # 0x56 -> HEBREW LETTER MEM + u'\u05df' # 0x57 -> HEBREW LETTER FINAL NUN + u'\u05e0' # 0x58 -> HEBREW LETTER NUN + u'\u05e1' # 0x59 -> HEBREW LETTER SAMEKH + u'!' # 0x5A -> EXCLAMATION MARK + u'$' # 0x5B -> DOLLAR SIGN + u'*' # 0x5C -> ASTERISK + u')' # 0x5D -> RIGHT PARENTHESIS + u';' # 0x5E -> SEMICOLON + u'\xac' # 0x5F -> NOT SIGN + u'-' # 0x60 -> HYPHEN-MINUS + u'/' # 0x61 -> SOLIDUS + u'\u05e2' # 0x62 -> HEBREW LETTER AYIN + u'\u05e3' # 0x63 -> HEBREW LETTER FINAL PE + u'\u05e4' # 0x64 -> HEBREW LETTER PE + u'\u05e5' # 0x65 -> HEBREW LETTER FINAL TSADI + u'\u05e6' # 0x66 -> HEBREW LETTER TSADI + u'\u05e7' # 0x67 -> HEBREW LETTER QOF + u'\u05e8' # 0x68 -> HEBREW LETTER RESH + u'\u05e9' # 0x69 -> HEBREW LETTER SHIN + u'\xa6' # 0x6A -> BROKEN BAR + u',' # 0x6B -> COMMA + u'%' # 0x6C -> PERCENT SIGN + u'_' # 0x6D -> LOW LINE + u'>' # 0x6E -> GREATER-THAN SIGN + u'?' # 0x6F -> QUESTION MARK + u'\ufffe' # 0x70 -> UNDEFINED + u'\u05ea' # 0x71 -> HEBREW LETTER TAV + u'\ufffe' # 0x72 -> UNDEFINED + u'\ufffe' # 0x73 -> UNDEFINED + u'\xa0' # 0x74 -> NO-BREAK SPACE + u'\ufffe' # 0x75 -> UNDEFINED + u'\ufffe' # 0x76 -> UNDEFINED + u'\ufffe' # 0x77 -> UNDEFINED + u'\u2017' # 0x78 -> DOUBLE LOW LINE + u'`' # 0x79 -> GRAVE ACCENT + u':' # 0x7A -> COLON + u'#' # 0x7B -> NUMBER SIGN + u'@' # 0x7C -> COMMERCIAL AT + u"'" # 0x7D -> APOSTROPHE + u'=' # 0x7E -> EQUALS SIGN + u'"' # 0x7F -> QUOTATION MARK + u'\ufffe' # 0x80 -> UNDEFINED + u'a' # 0x81 -> LATIN SMALL LETTER A + u'b' # 0x82 -> LATIN SMALL LETTER B + u'c' # 0x83 -> LATIN SMALL LETTER C + u'd' # 0x84 -> LATIN SMALL LETTER D + u'e' # 0x85 -> LATIN SMALL LETTER E + u'f' # 0x86 -> LATIN SMALL LETTER F + u'g' # 0x87 -> LATIN SMALL LETTER G + u'h' # 0x88 -> LATIN SMALL LETTER H + u'i' # 0x89 -> LATIN SMALL LETTER I + u'\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\ufffe' # 0x8C -> UNDEFINED + u'\ufffe' # 0x8D -> UNDEFINED + u'\ufffe' # 0x8E -> UNDEFINED + u'\xb1' # 0x8F -> PLUS-MINUS SIGN + u'\xb0' # 0x90 -> DEGREE SIGN + u'j' # 0x91 -> LATIN SMALL LETTER J + u'k' # 0x92 -> LATIN SMALL LETTER K + u'l' # 0x93 -> LATIN SMALL LETTER L + u'm' # 0x94 -> LATIN SMALL LETTER M + u'n' # 0x95 -> LATIN SMALL LETTER N + u'o' # 0x96 -> LATIN SMALL LETTER O + u'p' # 0x97 -> LATIN SMALL LETTER P + u'q' # 0x98 -> LATIN SMALL LETTER Q + u'r' # 0x99 -> LATIN SMALL LETTER R + u'\ufffe' # 0x9A -> UNDEFINED + u'\ufffe' # 0x9B -> UNDEFINED + u'\ufffe' # 0x9C -> UNDEFINED + u'\xb8' # 0x9D -> CEDILLA + u'\ufffe' # 0x9E -> UNDEFINED + u'\xa4' # 0x9F -> CURRENCY SIGN + u'\xb5' # 0xA0 -> MICRO SIGN + u'~' # 0xA1 -> TILDE + u's' # 0xA2 -> LATIN SMALL LETTER S + u't' # 0xA3 -> LATIN SMALL LETTER T + u'u' # 0xA4 -> LATIN SMALL LETTER U + u'v' # 0xA5 -> LATIN SMALL LETTER V + u'w' # 0xA6 -> LATIN SMALL LETTER W + u'x' # 0xA7 -> LATIN SMALL LETTER X + u'y' # 0xA8 -> LATIN SMALL LETTER Y + u'z' # 0xA9 -> LATIN SMALL LETTER Z + u'\ufffe' # 0xAA -> UNDEFINED + u'\ufffe' # 0xAB -> UNDEFINED + u'\ufffe' # 0xAC -> UNDEFINED + u'\ufffe' # 0xAD -> UNDEFINED + u'\ufffe' # 0xAE -> UNDEFINED + u'\xae' # 0xAF -> REGISTERED SIGN + u'^' # 0xB0 -> CIRCUMFLEX ACCENT + u'\xa3' # 0xB1 -> POUND SIGN + u'\xa5' # 0xB2 -> YEN SIGN + u'\xb7' # 0xB3 -> MIDDLE DOT + u'\xa9' # 0xB4 -> COPYRIGHT SIGN + u'\xa7' # 0xB5 -> SECTION SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + u'[' # 0xBA -> LEFT SQUARE BRACKET + u']' # 0xBB -> RIGHT SQUARE BRACKET + u'\xaf' # 0xBC -> MACRON + u'\xa8' # 0xBD -> DIAERESIS + u'\xb4' # 0xBE -> ACUTE ACCENT + u'\xd7' # 0xBF -> MULTIPLICATION SIGN + u'{' # 0xC0 -> LEFT CURLY BRACKET + u'A' # 0xC1 -> LATIN CAPITAL LETTER A + u'B' # 0xC2 -> LATIN CAPITAL LETTER B + u'C' # 0xC3 -> LATIN CAPITAL LETTER C + u'D' # 0xC4 -> LATIN CAPITAL LETTER D + u'E' # 0xC5 -> LATIN CAPITAL LETTER E + u'F' # 0xC6 -> LATIN CAPITAL LETTER F + u'G' # 0xC7 -> LATIN CAPITAL LETTER G + u'H' # 0xC8 -> LATIN CAPITAL LETTER H + u'I' # 0xC9 -> LATIN CAPITAL LETTER I + u'\xad' # 0xCA -> SOFT HYPHEN + u'\ufffe' # 0xCB -> UNDEFINED + u'\ufffe' # 0xCC -> UNDEFINED + u'\ufffe' # 0xCD -> UNDEFINED + u'\ufffe' # 0xCE -> UNDEFINED + u'\ufffe' # 0xCF -> UNDEFINED + u'}' # 0xD0 -> RIGHT CURLY BRACKET + u'J' # 0xD1 -> LATIN CAPITAL LETTER J + u'K' # 0xD2 -> LATIN CAPITAL LETTER K + u'L' # 0xD3 -> LATIN CAPITAL LETTER L + u'M' # 0xD4 -> LATIN CAPITAL LETTER M + u'N' # 0xD5 -> LATIN CAPITAL LETTER N + u'O' # 0xD6 -> LATIN CAPITAL LETTER O + u'P' # 0xD7 -> LATIN CAPITAL LETTER P + u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + u'R' # 0xD9 -> LATIN CAPITAL LETTER R + u'\xb9' # 0xDA -> SUPERSCRIPT ONE + u'\ufffe' # 0xDB -> UNDEFINED + u'\ufffe' # 0xDC -> UNDEFINED + u'\ufffe' # 0xDD -> UNDEFINED + u'\ufffe' # 0xDE -> UNDEFINED + u'\ufffe' # 0xDF -> UNDEFINED + u'\\' # 0xE0 -> REVERSE SOLIDUS + u'\xf7' # 0xE1 -> DIVISION SIGN + u'S' # 0xE2 -> LATIN CAPITAL LETTER S + u'T' # 0xE3 -> LATIN CAPITAL LETTER T + u'U' # 0xE4 -> LATIN CAPITAL LETTER U + u'V' # 0xE5 -> LATIN CAPITAL LETTER V + u'W' # 0xE6 -> LATIN CAPITAL LETTER W + u'X' # 0xE7 -> LATIN CAPITAL LETTER X + u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + u'\xb2' # 0xEA -> SUPERSCRIPT TWO + u'\ufffe' # 0xEB -> UNDEFINED + u'\ufffe' # 0xEC -> UNDEFINED + u'\ufffe' # 0xED -> UNDEFINED + u'\ufffe' # 0xEE -> UNDEFINED + u'\ufffe' # 0xEF -> UNDEFINED + u'0' # 0xF0 -> DIGIT ZERO + u'1' # 0xF1 -> DIGIT ONE + u'2' # 0xF2 -> DIGIT TWO + u'3' # 0xF3 -> DIGIT THREE + u'4' # 0xF4 -> DIGIT FOUR + u'5' # 0xF5 -> DIGIT FIVE + u'6' # 0xF6 -> DIGIT SIX + u'7' # 0xF7 -> DIGIT SEVEN + u'8' # 0xF8 -> DIGIT EIGHT + u'9' # 0xF9 -> DIGIT NINE + u'\xb3' # 0xFA -> SUPERSCRIPT THREE + u'\ufffe' # 0xFB -> UNDEFINED + u'\ufffe' # 0xFC -> UNDEFINED + u'\ufffe' # 0xFD -> UNDEFINED + u'\ufffe' # 0xFE -> UNDEFINED + u'\x9f' # 0xFF -> EIGHT ONES +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp424.pyc b/PythonEnv/2.7/Lib/encodings/cp424.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44f33b0e89e459094b7f8bf8768d71cf94b4d07f GIT binary patch literal 2834 zcmc&$*>)R65N&BBS(dl#;KYCu7K_aWV+e#09Lr8HV8x6~7GV(MnUOt48>1G+5Fo^6 z3tM()PsrwkeK#B+oKyLTe&+{x-~&QcPo%L055}AWlDbq=rS7h}eY;A^A9bOfyNbO! zyZTb_y8}mI8im1F0;Pu;UY7Q-1S$$MJ#56wQmFgb1Y_fjZA*BW;g=3YIs#>f!i*~E z@JUCo?C>$8nwehd^RpB#5Gwop%%~~(0@7Do_63+xM-PcAX4JDpP%eNg1=%!(;_YTv6fKCx`MA5_v5B= z=`x^Rv~*HDVH73?j=)JwCoo=28+9)uU14fGLh$nd{hZsD&UJdG;lmLn^I{a7u@Mj3 zjvp`MUN){^${w`G-03p10gVgf|w)j z(j?W{iKui0DnY1Lp_pIf&K88;)yN|R4-cY9CbL?`OeT3qK4fx6F^!KZ`Bci)-BD_D z1Wd)5tQtpwb_#fF6}||So~&-088geZbhkv)*3l|ogi9xm!V(k?vG6__%q0_X;;)b| zN2|*qq!N-yArj#|Z;VH1*_efb$($wpDp63vsZw;3FfPuLF)1snrQOu$nl+(DdCr7c zt)<=SP{@@xXz79};dPh)N66AKE-dX4@Koa3CF%74;7SMX;7V+&z*VI(=H@(CNQr~X zaQr=_>H>8A8=ex9OH0cmnsiukZkt+Wi)~?rE%TGuC;3Td?C=u{9O_JR%spi{MXAj- zPohmD4w>hyKvYvR{=-11BsaN%lmVdQi;}$qg>&PaR*FrO$~Im-ymY>jjvdiYj5h+* z0kCayY;i#n47*4^rE6q-Av*p2Im%)R>fq2a@ zjLMUgTgv;-X>-}uda|jUELHBdD%~%YXrU4kDxJ&xj+7I1hfItKdn>ocR^nrU_{u!h zo`9zo-vRk9P7%30UImU-!<(6=8zBu+$+2ttk`7>|^&cQTXgemwQeuiJ*(o;{v z7jOZ-y*&By`p#%q_lAv+^uT8oGhcc1vB!I3oBEzm;l~Qsz~$+9|C5`yY~7ZCuPc0a z-Q9Li`@Q$AzW)LEW~K{HM(9wH%G5cHoQ|E6I*h|1mpMclhdwJvqiV>h1C;)}3>K}l s;WQt#&fwP^tA%XcYn^7jPQevq*TgpKYYaB}8huSllfSwlaE1B)1TC4gy#N3J literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp437.py b/PythonEnv/2.7/Lib/encodings/cp437.py new file mode 100644 index 0000000000..52cd882942 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp437.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec cp437 generated from 'VENDORS/MICSFT/PC/CP437.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp437', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00a5, # YEN SIGN + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + u'\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + u'\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xa2' # 0x009b -> CENT SIGN + u'\xa3' # 0x009c -> POUND SIGN + u'\xa5' # 0x009d -> YEN SIGN + u'\u20a7' # 0x009e -> PESETA SIGN + u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK + u'\u2310' # 0x00a9 -> REVERSED NOT SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + u'\u221e' # 0x00ec -> INFINITY + u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + u'\u2229' # 0x00ef -> INTERSECTION + u'\u2261' # 0x00f0 -> IDENTICAL TO + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL + u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\u2248' # 0x00f7 -> ALMOST EQUAL TO + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\u221a' # 0x00fb -> SQUARE ROOT + u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a5: 0x009d, # YEN SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/PythonEnv/2.7/Lib/encodings/cp437.pyc b/PythonEnv/2.7/Lib/encodings/cp437.pyc new file mode 100644 index 0000000000000000000000000000000000000000..287d3ba2b9984316f1eda2795c5526c6150502d4 GIT binary patch literal 8039 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 m=j7*f%kI{sd8 NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x9c' # 0x04 -> CONTROL + u'\t' # 0x05 -> HORIZONTAL TABULATION + u'\x86' # 0x06 -> CONTROL + u'\x7f' # 0x07 -> DELETE + u'\x97' # 0x08 -> CONTROL + u'\x8d' # 0x09 -> CONTROL + u'\x8e' # 0x0A -> CONTROL + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x9d' # 0x14 -> CONTROL + u'\x85' # 0x15 -> CONTROL + u'\x08' # 0x16 -> BACKSPACE + u'\x87' # 0x17 -> CONTROL + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x92' # 0x1A -> CONTROL + u'\x8f' # 0x1B -> CONTROL + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u'\x80' # 0x20 -> CONTROL + u'\x81' # 0x21 -> CONTROL + u'\x82' # 0x22 -> CONTROL + u'\x83' # 0x23 -> CONTROL + u'\x84' # 0x24 -> CONTROL + u'\n' # 0x25 -> LINE FEED + u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK + u'\x1b' # 0x27 -> ESCAPE + u'\x88' # 0x28 -> CONTROL + u'\x89' # 0x29 -> CONTROL + u'\x8a' # 0x2A -> CONTROL + u'\x8b' # 0x2B -> CONTROL + u'\x8c' # 0x2C -> CONTROL + u'\x05' # 0x2D -> ENQUIRY + u'\x06' # 0x2E -> ACKNOWLEDGE + u'\x07' # 0x2F -> BELL + u'\x90' # 0x30 -> CONTROL + u'\x91' # 0x31 -> CONTROL + u'\x16' # 0x32 -> SYNCHRONOUS IDLE + u'\x93' # 0x33 -> CONTROL + u'\x94' # 0x34 -> CONTROL + u'\x95' # 0x35 -> CONTROL + u'\x96' # 0x36 -> CONTROL + u'\x04' # 0x37 -> END OF TRANSMISSION + u'\x98' # 0x38 -> CONTROL + u'\x99' # 0x39 -> CONTROL + u'\x9a' # 0x3A -> CONTROL + u'\x9b' # 0x3B -> CONTROL + u'\x14' # 0x3C -> DEVICE CONTROL FOUR + u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + u'\x9e' # 0x3E -> CONTROL + u'\x1a' # 0x3F -> SUBSTITUTE + u' ' # 0x40 -> SPACE + u'\xa0' # 0x41 -> NO-BREAK SPACE + u'\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + u'[' # 0x4A -> LEFT SQUARE BRACKET + u'.' # 0x4B -> FULL STOP + u'<' # 0x4C -> LESS-THAN SIGN + u'(' # 0x4D -> LEFT PARENTHESIS + u'+' # 0x4E -> PLUS SIGN + u'!' # 0x4F -> EXCLAMATION MARK + u'&' # 0x50 -> AMPERSAND + u'\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + u'\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + u'\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + u']' # 0x5A -> RIGHT SQUARE BRACKET + u'$' # 0x5B -> DOLLAR SIGN + u'*' # 0x5C -> ASTERISK + u')' # 0x5D -> RIGHT PARENTHESIS + u';' # 0x5E -> SEMICOLON + u'^' # 0x5F -> CIRCUMFLEX ACCENT + u'-' # 0x60 -> HYPHEN-MINUS + u'/' # 0x61 -> SOLIDUS + u'\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xa6' # 0x6A -> BROKEN BAR + u',' # 0x6B -> COMMA + u'%' # 0x6C -> PERCENT SIGN + u'_' # 0x6D -> LOW LINE + u'>' # 0x6E -> GREATER-THAN SIGN + u'?' # 0x6F -> QUESTION MARK + u'\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + u'\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + u'`' # 0x79 -> GRAVE ACCENT + u':' # 0x7A -> COLON + u'#' # 0x7B -> NUMBER SIGN + u'@' # 0x7C -> COMMERCIAL AT + u"'" # 0x7D -> APOSTROPHE + u'=' # 0x7E -> EQUALS SIGN + u'"' # 0x7F -> QUOTATION MARK + u'\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + u'a' # 0x81 -> LATIN SMALL LETTER A + u'b' # 0x82 -> LATIN SMALL LETTER B + u'c' # 0x83 -> LATIN SMALL LETTER C + u'd' # 0x84 -> LATIN SMALL LETTER D + u'e' # 0x85 -> LATIN SMALL LETTER E + u'f' # 0x86 -> LATIN SMALL LETTER F + u'g' # 0x87 -> LATIN SMALL LETTER G + u'h' # 0x88 -> LATIN SMALL LETTER H + u'i' # 0x89 -> LATIN SMALL LETTER I + u'\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) + u'\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + u'\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) + u'\xb1' # 0x8F -> PLUS-MINUS SIGN + u'\xb0' # 0x90 -> DEGREE SIGN + u'j' # 0x91 -> LATIN SMALL LETTER J + u'k' # 0x92 -> LATIN SMALL LETTER K + u'l' # 0x93 -> LATIN SMALL LETTER L + u'm' # 0x94 -> LATIN SMALL LETTER M + u'n' # 0x95 -> LATIN SMALL LETTER N + u'o' # 0x96 -> LATIN SMALL LETTER O + u'p' # 0x97 -> LATIN SMALL LETTER P + u'q' # 0x98 -> LATIN SMALL LETTER Q + u'r' # 0x99 -> LATIN SMALL LETTER R + u'\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + u'\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + u'\xb8' # 0x9D -> CEDILLA + u'\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + u'\xa4' # 0x9F -> CURRENCY SIGN + u'\xb5' # 0xA0 -> MICRO SIGN + u'~' # 0xA1 -> TILDE + u's' # 0xA2 -> LATIN SMALL LETTER S + u't' # 0xA3 -> LATIN SMALL LETTER T + u'u' # 0xA4 -> LATIN SMALL LETTER U + u'v' # 0xA5 -> LATIN SMALL LETTER V + u'w' # 0xA6 -> LATIN SMALL LETTER W + u'x' # 0xA7 -> LATIN SMALL LETTER X + u'y' # 0xA8 -> LATIN SMALL LETTER Y + u'z' # 0xA9 -> LATIN SMALL LETTER Z + u'\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + u'\xbf' # 0xAB -> INVERTED QUESTION MARK + u'\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) + u'\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) + u'\xae' # 0xAF -> REGISTERED SIGN + u'\xa2' # 0xB0 -> CENT SIGN + u'\xa3' # 0xB1 -> POUND SIGN + u'\xa5' # 0xB2 -> YEN SIGN + u'\xb7' # 0xB3 -> MIDDLE DOT + u'\xa9' # 0xB4 -> COPYRIGHT SIGN + u'\xa7' # 0xB5 -> SECTION SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + u'\xac' # 0xBA -> NOT SIGN + u'|' # 0xBB -> VERTICAL LINE + u'\xaf' # 0xBC -> MACRON + u'\xa8' # 0xBD -> DIAERESIS + u'\xb4' # 0xBE -> ACUTE ACCENT + u'\xd7' # 0xBF -> MULTIPLICATION SIGN + u'{' # 0xC0 -> LEFT CURLY BRACKET + u'A' # 0xC1 -> LATIN CAPITAL LETTER A + u'B' # 0xC2 -> LATIN CAPITAL LETTER B + u'C' # 0xC3 -> LATIN CAPITAL LETTER C + u'D' # 0xC4 -> LATIN CAPITAL LETTER D + u'E' # 0xC5 -> LATIN CAPITAL LETTER E + u'F' # 0xC6 -> LATIN CAPITAL LETTER F + u'G' # 0xC7 -> LATIN CAPITAL LETTER G + u'H' # 0xC8 -> LATIN CAPITAL LETTER H + u'I' # 0xC9 -> LATIN CAPITAL LETTER I + u'\xad' # 0xCA -> SOFT HYPHEN + u'\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + u'\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + u'}' # 0xD0 -> RIGHT CURLY BRACKET + u'J' # 0xD1 -> LATIN CAPITAL LETTER J + u'K' # 0xD2 -> LATIN CAPITAL LETTER K + u'L' # 0xD3 -> LATIN CAPITAL LETTER L + u'M' # 0xD4 -> LATIN CAPITAL LETTER M + u'N' # 0xD5 -> LATIN CAPITAL LETTER N + u'O' # 0xD6 -> LATIN CAPITAL LETTER O + u'P' # 0xD7 -> LATIN CAPITAL LETTER P + u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + u'R' # 0xD9 -> LATIN CAPITAL LETTER R + u'\xb9' # 0xDA -> SUPERSCRIPT ONE + u'\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + u'\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\\' # 0xE0 -> REVERSE SOLIDUS + u'\xf7' # 0xE1 -> DIVISION SIGN + u'S' # 0xE2 -> LATIN CAPITAL LETTER S + u'T' # 0xE3 -> LATIN CAPITAL LETTER T + u'U' # 0xE4 -> LATIN CAPITAL LETTER U + u'V' # 0xE5 -> LATIN CAPITAL LETTER V + u'W' # 0xE6 -> LATIN CAPITAL LETTER W + u'X' # 0xE7 -> LATIN CAPITAL LETTER X + u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + u'\xb2' # 0xEA -> SUPERSCRIPT TWO + u'\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + u'0' # 0xF0 -> DIGIT ZERO + u'1' # 0xF1 -> DIGIT ONE + u'2' # 0xF2 -> DIGIT TWO + u'3' # 0xF3 -> DIGIT THREE + u'4' # 0xF4 -> DIGIT FOUR + u'5' # 0xF5 -> DIGIT FIVE + u'6' # 0xF6 -> DIGIT SIX + u'7' # 0xF7 -> DIGIT SEVEN + u'8' # 0xF8 -> DIGIT EIGHT + u'9' # 0xF9 -> DIGIT NINE + u'\xb3' # 0xFA -> SUPERSCRIPT THREE + u'\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + u'\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp500.pyc b/PythonEnv/2.7/Lib/encodings/cp500.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6577d43ce993e55d774203777bd695cbbb7b8418 GIT binary patch literal 2804 zcmc&$_jemb5MEWwiXEqe69Y;p5zP*P5C|b8k)2?`iaD7SV-RQE$yQL~w8j_$B(c++ z-h1!8_x9e*pTr*!X7*y8WB9?C_u%AR&&_CeXTJG%MxH;)gDZPG8WQ5^n@5DImJZ!617Y3s-Oe1)4&Q zU9vrw4Mo~@OHWAC3N`5Yd@9=(isTG45lZBzO_>sEGqa|pOVbD?tz0HFxnWLYV|{df ztY%?dw040Ot7)i@#O5{C)Xk05)<rr!P-jZE^YR4mR-Nyv4hBb!$ z34|~w+?7g+&jzA#3N(gLE1_vO*XOUVj03A z6LaFPkdG&=!yuv(k;ua&q6=Rc3-h+o6iq_Ktl-y}f(lNJy;Fp7a8`^-rm}k434O3p zGin@Xf0(s0KCPT4wevhZT`(2A&i4NZSx)1~zBBx;fw8v~nN0(5)wrHH zF%K3}=HNIQe-EiPf=vI0r;Oy-zU>K3PF74>rk+`3rKr>v`N`~4{NxrEbb)o30*RI&Ys$ ztSm~7>l7YE?37b5?1FC%RNJ-9Qi-E3 zLy4n7c=c0ss!XaQ)%}-zxN2+l*fd2EY=lk2%F2gVj2Jm;G#rFg0a){VC2WJu zRWH2w5-f)muoAkVC-~e1SPSc*7uLfDpT7jQz}9iF9d^J@*yV*iuow2h{xM_W(D)D> z!DDy=kKj=}jwkUnUj4dyX86sCui;rdhv)GOUc^gy886`BZ(e!h^^d-Ny9QTc4=%?Q z*o~`j4Q_=~Z@n6y^$Fg=b=ZsRaV>7dO}H61d^h9e*^@t>gnRVXgkdJz+EZ{I?&B4F zh>zeZTv_^kI+M-if3V;j+{06F2Uo)hxcOT_cKq1+Q`gUM6dvOiJcx(j5*&l$a1w6A zSvU>1-~l{@M{r>oT!u4n19$&2hkm})&71#eJzT^acnh!Lb-elOXP!gbt_2XHU$gTrCY z7IBnYqLE8b3*^>elf$6|v%%)Y1eUnWNiOYuze-v=Qfb5PDx~d4oI#cW)stu1U3iv< ac2Mn*`lq)tQ0cAoR(Yy?r4{}s!uu!GG>sPk literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp720.py b/PythonEnv/2.7/Lib/encodings/cp720.py new file mode 100644 index 0000000000..5c96d9813c --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp720.py @@ -0,0 +1,309 @@ +"""Python Character Mapping Codec cp720 generated on Windows: +Vista 6.0.6002 SP2 Multiprocessor Free with the command: + python Tools/unicode/genwincodec.py 720 +"""#" + + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp720', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\x80' + u'\x81' + u'\xe9' # 0x82 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x83 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\x84' + u'\xe0' # 0x85 -> LATIN SMALL LETTER A WITH GRAVE + u'\x86' + u'\xe7' # 0x87 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xea' # 0x88 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x89 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x8A -> LATIN SMALL LETTER E WITH GRAVE + u'\xef' # 0x8B -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xee' # 0x8C -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\x8d' + u'\x8e' + u'\x8f' + u'\x90' + u'\u0651' # 0x91 -> ARABIC SHADDA + u'\u0652' # 0x92 -> ARABIC SUKUN + u'\xf4' # 0x93 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xa4' # 0x94 -> CURRENCY SIGN + u'\u0640' # 0x95 -> ARABIC TATWEEL + u'\xfb' # 0x96 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xf9' # 0x97 -> LATIN SMALL LETTER U WITH GRAVE + u'\u0621' # 0x98 -> ARABIC LETTER HAMZA + u'\u0622' # 0x99 -> ARABIC LETTER ALEF WITH MADDA ABOVE + u'\u0623' # 0x9A -> ARABIC LETTER ALEF WITH HAMZA ABOVE + u'\u0624' # 0x9B -> ARABIC LETTER WAW WITH HAMZA ABOVE + u'\xa3' # 0x9C -> POUND SIGN + u'\u0625' # 0x9D -> ARABIC LETTER ALEF WITH HAMZA BELOW + u'\u0626' # 0x9E -> ARABIC LETTER YEH WITH HAMZA ABOVE + u'\u0627' # 0x9F -> ARABIC LETTER ALEF + u'\u0628' # 0xA0 -> ARABIC LETTER BEH + u'\u0629' # 0xA1 -> ARABIC LETTER TEH MARBUTA + u'\u062a' # 0xA2 -> ARABIC LETTER TEH + u'\u062b' # 0xA3 -> ARABIC LETTER THEH + u'\u062c' # 0xA4 -> ARABIC LETTER JEEM + u'\u062d' # 0xA5 -> ARABIC LETTER HAH + u'\u062e' # 0xA6 -> ARABIC LETTER KHAH + u'\u062f' # 0xA7 -> ARABIC LETTER DAL + u'\u0630' # 0xA8 -> ARABIC LETTER THAL + u'\u0631' # 0xA9 -> ARABIC LETTER REH + u'\u0632' # 0xAA -> ARABIC LETTER ZAIN + u'\u0633' # 0xAB -> ARABIC LETTER SEEN + u'\u0634' # 0xAC -> ARABIC LETTER SHEEN + u'\u0635' # 0xAD -> ARABIC LETTER SAD + u'\xab' # 0xAE -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xAF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0xB0 -> LIGHT SHADE + u'\u2592' # 0xB1 -> MEDIUM SHADE + u'\u2593' # 0xB2 -> DARK SHADE + u'\u2502' # 0xB3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0xB4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0xB5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0xB6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0xB7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0xB8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0xB9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0xBA -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0xBB -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0xBC -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0xBD -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0xBE -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0xBF -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0xC0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0xC1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0xC2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0xC3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0xC4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0xC5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0xC6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0xC7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0xC8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0xC9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0xCA -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0xCB -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0xCC -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0xCD -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0xCE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0xCF -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0xD0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0xD1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0xD2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0xD3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0xD4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0xD5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0xD6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0xD7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0xD8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0xD9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0xDA -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0xDB -> FULL BLOCK + u'\u2584' # 0xDC -> LOWER HALF BLOCK + u'\u258c' # 0xDD -> LEFT HALF BLOCK + u'\u2590' # 0xDE -> RIGHT HALF BLOCK + u'\u2580' # 0xDF -> UPPER HALF BLOCK + u'\u0636' # 0xE0 -> ARABIC LETTER DAD + u'\u0637' # 0xE1 -> ARABIC LETTER TAH + u'\u0638' # 0xE2 -> ARABIC LETTER ZAH + u'\u0639' # 0xE3 -> ARABIC LETTER AIN + u'\u063a' # 0xE4 -> ARABIC LETTER GHAIN + u'\u0641' # 0xE5 -> ARABIC LETTER FEH + u'\xb5' # 0xE6 -> MICRO SIGN + u'\u0642' # 0xE7 -> ARABIC LETTER QAF + u'\u0643' # 0xE8 -> ARABIC LETTER KAF + u'\u0644' # 0xE9 -> ARABIC LETTER LAM + u'\u0645' # 0xEA -> ARABIC LETTER MEEM + u'\u0646' # 0xEB -> ARABIC LETTER NOON + u'\u0647' # 0xEC -> ARABIC LETTER HEH + u'\u0648' # 0xED -> ARABIC LETTER WAW + u'\u0649' # 0xEE -> ARABIC LETTER ALEF MAKSURA + u'\u064a' # 0xEF -> ARABIC LETTER YEH + u'\u2261' # 0xF0 -> IDENTICAL TO + u'\u064b' # 0xF1 -> ARABIC FATHATAN + u'\u064c' # 0xF2 -> ARABIC DAMMATAN + u'\u064d' # 0xF3 -> ARABIC KASRATAN + u'\u064e' # 0xF4 -> ARABIC FATHA + u'\u064f' # 0xF5 -> ARABIC DAMMA + u'\u0650' # 0xF6 -> ARABIC KASRA + u'\u2248' # 0xF7 -> ALMOST EQUAL TO + u'\xb0' # 0xF8 -> DEGREE SIGN + u'\u2219' # 0xF9 -> BULLET OPERATOR + u'\xb7' # 0xFA -> MIDDLE DOT + u'\u221a' # 0xFB -> SQUARE ROOT + u'\u207f' # 0xFC -> SUPERSCRIPT LATIN SMALL LETTER N + u'\xb2' # 0xFD -> SUPERSCRIPT TWO + u'\u25a0' # 0xFE -> BLACK SQUARE + u'\xa0' # 0xFF -> NO-BREAK SPACE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp720.pyc b/PythonEnv/2.7/Lib/encodings/cp720.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3752a3fa9fa24c9042f1d356bcb61968da875078 GIT binary patch literal 2901 zcmc&$d3O{=5br&+SrTrA0OAN9>lI>D(1?fxP}D@6MUWU>Co_{|a4%JNzxq|xhW@CJZ{AjD zQ_0OI1pk-9u&%Ryy+_4v|JL$rycBPK3@n_^@T z42+|t$;2dd;1Eo!`)O}3E4B72rlL~al-iVh-pKYytvO9sB{jdOxk>8Lv%0BJU6bIe z>x`_H>$6(oYYmGk(!$23#)VBy%~Eo8v(#2dQzLKYRNb<2rnJ)3b*aywy%O!!B{i4H zC|Ru~E=hS$>zZ6HZ7nEd4Hc9v04;q+7Dcr&-!FmUxN!rXb{YXgg+0|E1YuBq)c7oJ?TIXcWIrO+%$BzT*hPXvO7eFi}D_1jt7C3lbV6gCT$^ z0PF4kabcT9C&H=hb;Dn5m;{(MLPs=kC$7r{o&FzOYtd7rsf=v816LVKpYQW{Aw?3+gz@)~ z%1G*e!_z5nen#bbKof(Nq^7Q9)|m#BEMSH$>JI?LRaGxi!}}qzV9ruNBvq!sKO~*M6b#V%dh&gQN>rWay$1WV{x|4gjr| zLR*Ys(HSH)$pliRonrc7{SlcVimhLG1hJtlRSJez@Xb4yz1n7qz(JRRz`+2#ZdvFP zkrXOL{!>&g+S;mYcTSWlU#*P!B_l0lL_)^6++9d1QnyD3o1no`vwuFkTF6%ts0~B| zb?}LbPvHuZD-aBYBhi{zZG1vq{lrO=r%atT{hoVg%xsu7d(M4x@0T8!H~+zh9)2Y8 z=wpvR@nqwIrl*>pe&*SQi=KPF<%PvBE_rF`%gb7quUPrYtE*mn{f)NvH&?$UC)d2a zcHKMcJKpVl@BP#VN|&nX-95d=h7Z%3Y%c$iY0<*ReV_Dy`q{?MzxdJ~us4-Ymyg&( zwciAKEZg)@ll6}k_C|@sMa}GO4oTJV$`>1o=IpLgi zPC2KYGtQWE*7?yn=bU#gI6pZTou8dc&SiVdzRpX#d1((X?d8SIym*YW!<-%Ati&1P z>?miuIs2Bg?>Rfj*>}7+!iz;-yu^!VdGR1G4)Ee{oE_rq2hI*~R^;q7XD2ut=b8k?QzcbbGDDOJ)G_3Y>cxrytt1SxAW34FAeb$2qU~S;9PO8I=?vAoL}8d z_GNdoJLnF%U%6Y{uiasHtGkVFJ?wttZg+RMJKbIG2;VwvU*N<0?W=tF0N?bxeUX<& z?a>6r7?_QXRLiN*II-b)l=6v$9P-$N87_(=#fDJ%Ez?yn(wf(cVD%Qdjk9=&PQKXd e-Agd1L=%mM>cS1NhHyi8PH0Y~c2e{P3I7T5*T{YV literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp737.py b/PythonEnv/2.7/Lib/encodings/cp737.py new file mode 100644 index 0000000000..d6544482d2 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp737.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec cp737 generated from 'VENDORS/MICSFT/PC/CP737.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp737', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0391, # GREEK CAPITAL LETTER ALPHA + 0x0081: 0x0392, # GREEK CAPITAL LETTER BETA + 0x0082: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x0083: 0x0394, # GREEK CAPITAL LETTER DELTA + 0x0084: 0x0395, # GREEK CAPITAL LETTER EPSILON + 0x0085: 0x0396, # GREEK CAPITAL LETTER ZETA + 0x0086: 0x0397, # GREEK CAPITAL LETTER ETA + 0x0087: 0x0398, # GREEK CAPITAL LETTER THETA + 0x0088: 0x0399, # GREEK CAPITAL LETTER IOTA + 0x0089: 0x039a, # GREEK CAPITAL LETTER KAPPA + 0x008a: 0x039b, # GREEK CAPITAL LETTER LAMDA + 0x008b: 0x039c, # GREEK CAPITAL LETTER MU + 0x008c: 0x039d, # GREEK CAPITAL LETTER NU + 0x008d: 0x039e, # GREEK CAPITAL LETTER XI + 0x008e: 0x039f, # GREEK CAPITAL LETTER OMICRON + 0x008f: 0x03a0, # GREEK CAPITAL LETTER PI + 0x0090: 0x03a1, # GREEK CAPITAL LETTER RHO + 0x0091: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x0092: 0x03a4, # GREEK CAPITAL LETTER TAU + 0x0093: 0x03a5, # GREEK CAPITAL LETTER UPSILON + 0x0094: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x0095: 0x03a7, # GREEK CAPITAL LETTER CHI + 0x0096: 0x03a8, # GREEK CAPITAL LETTER PSI + 0x0097: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x0098: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x0099: 0x03b2, # GREEK SMALL LETTER BETA + 0x009a: 0x03b3, # GREEK SMALL LETTER GAMMA + 0x009b: 0x03b4, # GREEK SMALL LETTER DELTA + 0x009c: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x009d: 0x03b6, # GREEK SMALL LETTER ZETA + 0x009e: 0x03b7, # GREEK SMALL LETTER ETA + 0x009f: 0x03b8, # GREEK SMALL LETTER THETA + 0x00a0: 0x03b9, # GREEK SMALL LETTER IOTA + 0x00a1: 0x03ba, # GREEK SMALL LETTER KAPPA + 0x00a2: 0x03bb, # GREEK SMALL LETTER LAMDA + 0x00a3: 0x03bc, # GREEK SMALL LETTER MU + 0x00a4: 0x03bd, # GREEK SMALL LETTER NU + 0x00a5: 0x03be, # GREEK SMALL LETTER XI + 0x00a6: 0x03bf, # GREEK SMALL LETTER OMICRON + 0x00a7: 0x03c0, # GREEK SMALL LETTER PI + 0x00a8: 0x03c1, # GREEK SMALL LETTER RHO + 0x00a9: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00aa: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA + 0x00ab: 0x03c4, # GREEK SMALL LETTER TAU + 0x00ac: 0x03c5, # GREEK SMALL LETTER UPSILON + 0x00ad: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ae: 0x03c7, # GREEK SMALL LETTER CHI + 0x00af: 0x03c8, # GREEK SMALL LETTER PSI + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03c9, # GREEK SMALL LETTER OMEGA + 0x00e1: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x00e2: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x00e3: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS + 0x00e4: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x00e5: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS + 0x00e6: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x00e7: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x00e8: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x00e9: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x00ea: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x00eb: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x00ec: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x00ed: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x00ee: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x00ef: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x00f0: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x00f5: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\u0391' # 0x0080 -> GREEK CAPITAL LETTER ALPHA + u'\u0392' # 0x0081 -> GREEK CAPITAL LETTER BETA + u'\u0393' # 0x0082 -> GREEK CAPITAL LETTER GAMMA + u'\u0394' # 0x0083 -> GREEK CAPITAL LETTER DELTA + u'\u0395' # 0x0084 -> GREEK CAPITAL LETTER EPSILON + u'\u0396' # 0x0085 -> GREEK CAPITAL LETTER ZETA + u'\u0397' # 0x0086 -> GREEK CAPITAL LETTER ETA + u'\u0398' # 0x0087 -> GREEK CAPITAL LETTER THETA + u'\u0399' # 0x0088 -> GREEK CAPITAL LETTER IOTA + u'\u039a' # 0x0089 -> GREEK CAPITAL LETTER KAPPA + u'\u039b' # 0x008a -> GREEK CAPITAL LETTER LAMDA + u'\u039c' # 0x008b -> GREEK CAPITAL LETTER MU + u'\u039d' # 0x008c -> GREEK CAPITAL LETTER NU + u'\u039e' # 0x008d -> GREEK CAPITAL LETTER XI + u'\u039f' # 0x008e -> GREEK CAPITAL LETTER OMICRON + u'\u03a0' # 0x008f -> GREEK CAPITAL LETTER PI + u'\u03a1' # 0x0090 -> GREEK CAPITAL LETTER RHO + u'\u03a3' # 0x0091 -> GREEK CAPITAL LETTER SIGMA + u'\u03a4' # 0x0092 -> GREEK CAPITAL LETTER TAU + u'\u03a5' # 0x0093 -> GREEK CAPITAL LETTER UPSILON + u'\u03a6' # 0x0094 -> GREEK CAPITAL LETTER PHI + u'\u03a7' # 0x0095 -> GREEK CAPITAL LETTER CHI + u'\u03a8' # 0x0096 -> GREEK CAPITAL LETTER PSI + u'\u03a9' # 0x0097 -> GREEK CAPITAL LETTER OMEGA + u'\u03b1' # 0x0098 -> GREEK SMALL LETTER ALPHA + u'\u03b2' # 0x0099 -> GREEK SMALL LETTER BETA + u'\u03b3' # 0x009a -> GREEK SMALL LETTER GAMMA + u'\u03b4' # 0x009b -> GREEK SMALL LETTER DELTA + u'\u03b5' # 0x009c -> GREEK SMALL LETTER EPSILON + u'\u03b6' # 0x009d -> GREEK SMALL LETTER ZETA + u'\u03b7' # 0x009e -> GREEK SMALL LETTER ETA + u'\u03b8' # 0x009f -> GREEK SMALL LETTER THETA + u'\u03b9' # 0x00a0 -> GREEK SMALL LETTER IOTA + u'\u03ba' # 0x00a1 -> GREEK SMALL LETTER KAPPA + u'\u03bb' # 0x00a2 -> GREEK SMALL LETTER LAMDA + u'\u03bc' # 0x00a3 -> GREEK SMALL LETTER MU + u'\u03bd' # 0x00a4 -> GREEK SMALL LETTER NU + u'\u03be' # 0x00a5 -> GREEK SMALL LETTER XI + u'\u03bf' # 0x00a6 -> GREEK SMALL LETTER OMICRON + u'\u03c0' # 0x00a7 -> GREEK SMALL LETTER PI + u'\u03c1' # 0x00a8 -> GREEK SMALL LETTER RHO + u'\u03c3' # 0x00a9 -> GREEK SMALL LETTER SIGMA + u'\u03c2' # 0x00aa -> GREEK SMALL LETTER FINAL SIGMA + u'\u03c4' # 0x00ab -> GREEK SMALL LETTER TAU + u'\u03c5' # 0x00ac -> GREEK SMALL LETTER UPSILON + u'\u03c6' # 0x00ad -> GREEK SMALL LETTER PHI + u'\u03c7' # 0x00ae -> GREEK SMALL LETTER CHI + u'\u03c8' # 0x00af -> GREEK SMALL LETTER PSI + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u03c9' # 0x00e0 -> GREEK SMALL LETTER OMEGA + u'\u03ac' # 0x00e1 -> GREEK SMALL LETTER ALPHA WITH TONOS + u'\u03ad' # 0x00e2 -> GREEK SMALL LETTER EPSILON WITH TONOS + u'\u03ae' # 0x00e3 -> GREEK SMALL LETTER ETA WITH TONOS + u'\u03ca' # 0x00e4 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + u'\u03af' # 0x00e5 -> GREEK SMALL LETTER IOTA WITH TONOS + u'\u03cc' # 0x00e6 -> GREEK SMALL LETTER OMICRON WITH TONOS + u'\u03cd' # 0x00e7 -> GREEK SMALL LETTER UPSILON WITH TONOS + u'\u03cb' # 0x00e8 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + u'\u03ce' # 0x00e9 -> GREEK SMALL LETTER OMEGA WITH TONOS + u'\u0386' # 0x00ea -> GREEK CAPITAL LETTER ALPHA WITH TONOS + u'\u0388' # 0x00eb -> GREEK CAPITAL LETTER EPSILON WITH TONOS + u'\u0389' # 0x00ec -> GREEK CAPITAL LETTER ETA WITH TONOS + u'\u038a' # 0x00ed -> GREEK CAPITAL LETTER IOTA WITH TONOS + u'\u038c' # 0x00ee -> GREEK CAPITAL LETTER OMICRON WITH TONOS + u'\u038e' # 0x00ef -> GREEK CAPITAL LETTER UPSILON WITH TONOS + u'\u038f' # 0x00f0 -> GREEK CAPITAL LETTER OMEGA WITH TONOS + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + u'\u03aa' # 0x00f4 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + u'\u03ab' # 0x00f5 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\u2248' # 0x00f7 -> ALMOST EQUAL TO + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\u221a' # 0x00fb -> SQUARE ROOT + u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00f7: 0x00f6, # DIVISION SIGN + 0x0386: 0x00ea, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0388: 0x00eb, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x0389: 0x00ec, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x038a: 0x00ed, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x038c: 0x00ee, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x038e: 0x00ef, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x038f: 0x00f0, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0391: 0x0080, # GREEK CAPITAL LETTER ALPHA + 0x0392: 0x0081, # GREEK CAPITAL LETTER BETA + 0x0393: 0x0082, # GREEK CAPITAL LETTER GAMMA + 0x0394: 0x0083, # GREEK CAPITAL LETTER DELTA + 0x0395: 0x0084, # GREEK CAPITAL LETTER EPSILON + 0x0396: 0x0085, # GREEK CAPITAL LETTER ZETA + 0x0397: 0x0086, # GREEK CAPITAL LETTER ETA + 0x0398: 0x0087, # GREEK CAPITAL LETTER THETA + 0x0399: 0x0088, # GREEK CAPITAL LETTER IOTA + 0x039a: 0x0089, # GREEK CAPITAL LETTER KAPPA + 0x039b: 0x008a, # GREEK CAPITAL LETTER LAMDA + 0x039c: 0x008b, # GREEK CAPITAL LETTER MU + 0x039d: 0x008c, # GREEK CAPITAL LETTER NU + 0x039e: 0x008d, # GREEK CAPITAL LETTER XI + 0x039f: 0x008e, # GREEK CAPITAL LETTER OMICRON + 0x03a0: 0x008f, # GREEK CAPITAL LETTER PI + 0x03a1: 0x0090, # GREEK CAPITAL LETTER RHO + 0x03a3: 0x0091, # GREEK CAPITAL LETTER SIGMA + 0x03a4: 0x0092, # GREEK CAPITAL LETTER TAU + 0x03a5: 0x0093, # GREEK CAPITAL LETTER UPSILON + 0x03a6: 0x0094, # GREEK CAPITAL LETTER PHI + 0x03a7: 0x0095, # GREEK CAPITAL LETTER CHI + 0x03a8: 0x0096, # GREEK CAPITAL LETTER PSI + 0x03a9: 0x0097, # GREEK CAPITAL LETTER OMEGA + 0x03aa: 0x00f4, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x03ab: 0x00f5, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x03ac: 0x00e1, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x03ad: 0x00e2, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x03ae: 0x00e3, # GREEK SMALL LETTER ETA WITH TONOS + 0x03af: 0x00e5, # GREEK SMALL LETTER IOTA WITH TONOS + 0x03b1: 0x0098, # GREEK SMALL LETTER ALPHA + 0x03b2: 0x0099, # GREEK SMALL LETTER BETA + 0x03b3: 0x009a, # GREEK SMALL LETTER GAMMA + 0x03b4: 0x009b, # GREEK SMALL LETTER DELTA + 0x03b5: 0x009c, # GREEK SMALL LETTER EPSILON + 0x03b6: 0x009d, # GREEK SMALL LETTER ZETA + 0x03b7: 0x009e, # GREEK SMALL LETTER ETA + 0x03b8: 0x009f, # GREEK SMALL LETTER THETA + 0x03b9: 0x00a0, # GREEK SMALL LETTER IOTA + 0x03ba: 0x00a1, # GREEK SMALL LETTER KAPPA + 0x03bb: 0x00a2, # GREEK SMALL LETTER LAMDA + 0x03bc: 0x00a3, # GREEK SMALL LETTER MU + 0x03bd: 0x00a4, # GREEK SMALL LETTER NU + 0x03be: 0x00a5, # GREEK SMALL LETTER XI + 0x03bf: 0x00a6, # GREEK SMALL LETTER OMICRON + 0x03c0: 0x00a7, # GREEK SMALL LETTER PI + 0x03c1: 0x00a8, # GREEK SMALL LETTER RHO + 0x03c2: 0x00aa, # GREEK SMALL LETTER FINAL SIGMA + 0x03c3: 0x00a9, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00ab, # GREEK SMALL LETTER TAU + 0x03c5: 0x00ac, # GREEK SMALL LETTER UPSILON + 0x03c6: 0x00ad, # GREEK SMALL LETTER PHI + 0x03c7: 0x00ae, # GREEK SMALL LETTER CHI + 0x03c8: 0x00af, # GREEK SMALL LETTER PSI + 0x03c9: 0x00e0, # GREEK SMALL LETTER OMEGA + 0x03ca: 0x00e4, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x03cb: 0x00e8, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x03cc: 0x00e6, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x03cd: 0x00e7, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x03ce: 0x00e9, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/PythonEnv/2.7/Lib/encodings/cp737.pyc b/PythonEnv/2.7/Lib/encodings/cp737.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0bce77a8fcca0eca7e0c4b571e8b1038791a17d6 GIT binary patch literal 8267 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 NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\u0106' # 0x0080 -> LATIN CAPITAL LETTER C WITH ACUTE + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\u0101' # 0x0083 -> LATIN SMALL LETTER A WITH MACRON + u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u0123' # 0x0085 -> LATIN SMALL LETTER G WITH CEDILLA + u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\u0107' # 0x0087 -> LATIN SMALL LETTER C WITH ACUTE + u'\u0142' # 0x0088 -> LATIN SMALL LETTER L WITH STROKE + u'\u0113' # 0x0089 -> LATIN SMALL LETTER E WITH MACRON + u'\u0156' # 0x008a -> LATIN CAPITAL LETTER R WITH CEDILLA + u'\u0157' # 0x008b -> LATIN SMALL LETTER R WITH CEDILLA + u'\u012b' # 0x008c -> LATIN SMALL LETTER I WITH MACRON + u'\u0179' # 0x008d -> LATIN CAPITAL LETTER Z WITH ACUTE + u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + u'\u014d' # 0x0093 -> LATIN SMALL LETTER O WITH MACRON + u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\u0122' # 0x0095 -> LATIN CAPITAL LETTER G WITH CEDILLA + u'\xa2' # 0x0096 -> CENT SIGN + u'\u015a' # 0x0097 -> LATIN CAPITAL LETTER S WITH ACUTE + u'\u015b' # 0x0098 -> LATIN SMALL LETTER S WITH ACUTE + u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + u'\xa3' # 0x009c -> POUND SIGN + u'\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd7' # 0x009e -> MULTIPLICATION SIGN + u'\xa4' # 0x009f -> CURRENCY SIGN + u'\u0100' # 0x00a0 -> LATIN CAPITAL LETTER A WITH MACRON + u'\u012a' # 0x00a1 -> LATIN CAPITAL LETTER I WITH MACRON + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\u017b' # 0x00a3 -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\u017c' # 0x00a4 -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\u017a' # 0x00a5 -> LATIN SMALL LETTER Z WITH ACUTE + u'\u201d' # 0x00a6 -> RIGHT DOUBLE QUOTATION MARK + u'\xa6' # 0x00a7 -> BROKEN BAR + u'\xa9' # 0x00a8 -> COPYRIGHT SIGN + u'\xae' # 0x00a9 -> REGISTERED SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\u0141' # 0x00ad -> LATIN CAPITAL LETTER L WITH STROKE + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u0104' # 0x00b5 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\u010c' # 0x00b6 -> LATIN CAPITAL LETTER C WITH CARON + u'\u0118' # 0x00b7 -> LATIN CAPITAL LETTER E WITH OGONEK + u'\u0116' # 0x00b8 -> LATIN CAPITAL LETTER E WITH DOT ABOVE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u012e' # 0x00bd -> LATIN CAPITAL LETTER I WITH OGONEK + u'\u0160' # 0x00be -> LATIN CAPITAL LETTER S WITH CARON + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u0172' # 0x00c6 -> LATIN CAPITAL LETTER U WITH OGONEK + u'\u016a' # 0x00c7 -> LATIN CAPITAL LETTER U WITH MACRON + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u017d' # 0x00cf -> LATIN CAPITAL LETTER Z WITH CARON + u'\u0105' # 0x00d0 -> LATIN SMALL LETTER A WITH OGONEK + u'\u010d' # 0x00d1 -> LATIN SMALL LETTER C WITH CARON + u'\u0119' # 0x00d2 -> LATIN SMALL LETTER E WITH OGONEK + u'\u0117' # 0x00d3 -> LATIN SMALL LETTER E WITH DOT ABOVE + u'\u012f' # 0x00d4 -> LATIN SMALL LETTER I WITH OGONEK + u'\u0161' # 0x00d5 -> LATIN SMALL LETTER S WITH CARON + u'\u0173' # 0x00d6 -> LATIN SMALL LETTER U WITH OGONEK + u'\u016b' # 0x00d7 -> LATIN SMALL LETTER U WITH MACRON + u'\u017e' # 0x00d8 -> LATIN SMALL LETTER Z WITH CARON + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S (GERMAN) + u'\u014c' # 0x00e2 -> LATIN CAPITAL LETTER O WITH MACRON + u'\u0143' # 0x00e3 -> LATIN CAPITAL LETTER N WITH ACUTE + u'\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + u'\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\u0144' # 0x00e7 -> LATIN SMALL LETTER N WITH ACUTE + u'\u0136' # 0x00e8 -> LATIN CAPITAL LETTER K WITH CEDILLA + u'\u0137' # 0x00e9 -> LATIN SMALL LETTER K WITH CEDILLA + u'\u013b' # 0x00ea -> LATIN CAPITAL LETTER L WITH CEDILLA + u'\u013c' # 0x00eb -> LATIN SMALL LETTER L WITH CEDILLA + u'\u0146' # 0x00ec -> LATIN SMALL LETTER N WITH CEDILLA + u'\u0112' # 0x00ed -> LATIN CAPITAL LETTER E WITH MACRON + u'\u0145' # 0x00ee -> LATIN CAPITAL LETTER N WITH CEDILLA + u'\u2019' # 0x00ef -> RIGHT SINGLE QUOTATION MARK + u'\xad' # 0x00f0 -> SOFT HYPHEN + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u201c' # 0x00f2 -> LEFT DOUBLE QUOTATION MARK + u'\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + u'\xb6' # 0x00f4 -> PILCROW SIGN + u'\xa7' # 0x00f5 -> SECTION SIGN + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\u201e' # 0x00f7 -> DOUBLE LOW-9 QUOTATION MARK + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\xb9' # 0x00fb -> SUPERSCRIPT ONE + u'\xb3' # 0x00fc -> SUPERSCRIPT THREE + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a2: 0x0096, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x009f, # CURRENCY SIGN + 0x00a6: 0x00a7, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a9: 0x00a8, # COPYRIGHT SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0100: 0x00a0, # LATIN CAPITAL LETTER A WITH MACRON + 0x0101: 0x0083, # LATIN SMALL LETTER A WITH MACRON + 0x0104: 0x00b5, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0x00d0, # LATIN SMALL LETTER A WITH OGONEK + 0x0106: 0x0080, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0x0087, # LATIN SMALL LETTER C WITH ACUTE + 0x010c: 0x00b6, # LATIN CAPITAL LETTER C WITH CARON + 0x010d: 0x00d1, # LATIN SMALL LETTER C WITH CARON + 0x0112: 0x00ed, # LATIN CAPITAL LETTER E WITH MACRON + 0x0113: 0x0089, # LATIN SMALL LETTER E WITH MACRON + 0x0116: 0x00b8, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x0117: 0x00d3, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x0118: 0x00b7, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0x00d2, # LATIN SMALL LETTER E WITH OGONEK + 0x0122: 0x0095, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x0123: 0x0085, # LATIN SMALL LETTER G WITH CEDILLA + 0x012a: 0x00a1, # LATIN CAPITAL LETTER I WITH MACRON + 0x012b: 0x008c, # LATIN SMALL LETTER I WITH MACRON + 0x012e: 0x00bd, # LATIN CAPITAL LETTER I WITH OGONEK + 0x012f: 0x00d4, # LATIN SMALL LETTER I WITH OGONEK + 0x0136: 0x00e8, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x0137: 0x00e9, # LATIN SMALL LETTER K WITH CEDILLA + 0x013b: 0x00ea, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x013c: 0x00eb, # LATIN SMALL LETTER L WITH CEDILLA + 0x0141: 0x00ad, # LATIN CAPITAL LETTER L WITH STROKE + 0x0142: 0x0088, # LATIN SMALL LETTER L WITH STROKE + 0x0143: 0x00e3, # LATIN CAPITAL LETTER N WITH ACUTE + 0x0144: 0x00e7, # LATIN SMALL LETTER N WITH ACUTE + 0x0145: 0x00ee, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x0146: 0x00ec, # LATIN SMALL LETTER N WITH CEDILLA + 0x014c: 0x00e2, # LATIN CAPITAL LETTER O WITH MACRON + 0x014d: 0x0093, # LATIN SMALL LETTER O WITH MACRON + 0x0156: 0x008a, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x0157: 0x008b, # LATIN SMALL LETTER R WITH CEDILLA + 0x015a: 0x0097, # LATIN CAPITAL LETTER S WITH ACUTE + 0x015b: 0x0098, # LATIN SMALL LETTER S WITH ACUTE + 0x0160: 0x00be, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0x00d5, # LATIN SMALL LETTER S WITH CARON + 0x016a: 0x00c7, # LATIN CAPITAL LETTER U WITH MACRON + 0x016b: 0x00d7, # LATIN SMALL LETTER U WITH MACRON + 0x0172: 0x00c6, # LATIN CAPITAL LETTER U WITH OGONEK + 0x0173: 0x00d6, # LATIN SMALL LETTER U WITH OGONEK + 0x0179: 0x008d, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x017a: 0x00a5, # LATIN SMALL LETTER Z WITH ACUTE + 0x017b: 0x00a3, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017c: 0x00a4, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017d: 0x00cf, # LATIN CAPITAL LETTER Z WITH CARON + 0x017e: 0x00d8, # LATIN SMALL LETTER Z WITH CARON + 0x2019: 0x00ef, # RIGHT SINGLE QUOTATION MARK + 0x201c: 0x00f2, # LEFT DOUBLE QUOTATION MARK + 0x201d: 0x00a6, # RIGHT DOUBLE QUOTATION MARK + 0x201e: 0x00f7, # DOUBLE LOW-9 QUOTATION MARK + 0x2219: 0x00f9, # BULLET OPERATOR + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/PythonEnv/2.7/Lib/encodings/cp775.pyc b/PythonEnv/2.7/Lib/encodings/cp775.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49781280d2da66962b7cb6938a81a7b85e455c45 GIT binary patch literal 8053 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 KKHf8ccmH=6o~I4~ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp850.py b/PythonEnv/2.7/Lib/encodings/cp850.py new file mode 100644 index 0000000000..0c8478c8b2 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp850.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP850.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp850', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00b8: 0x00a9, # COPYRIGHT SIGN + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x00a2, # CENT SIGN + 0x00be: 0x00a5, # YEN SIGN + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x00f0, # LATIN SMALL LETTER ETH + 0x00d1: 0x00d0, # LATIN CAPITAL LETTER ETH + 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00d5: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x00a6, # BROKEN BAR + 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x00fe, # LATIN SMALL LETTER THORN + 0x00e8: 0x00de, # LATIN CAPITAL LETTER THORN + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00ec: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x00ed: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00ee: 0x00af, # MACRON + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2017, # DOUBLE LOW LINE + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + u'\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + u'\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + u'\xa3' # 0x009c -> POUND SIGN + u'\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd7' # 0x009e -> MULTIPLICATION SIGN + u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK + u'\xae' # 0x00a9 -> REGISTERED SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc0' # 0x00b7 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xa9' # 0x00b8 -> COPYRIGHT SIGN + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\xa2' # 0x00bd -> CENT SIGN + u'\xa5' # 0x00be -> YEN SIGN + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\xe3' # 0x00c6 -> LATIN SMALL LETTER A WITH TILDE + u'\xc3' # 0x00c7 -> LATIN CAPITAL LETTER A WITH TILDE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\xa4' # 0x00cf -> CURRENCY SIGN + u'\xf0' # 0x00d0 -> LATIN SMALL LETTER ETH + u'\xd0' # 0x00d1 -> LATIN CAPITAL LETTER ETH + u'\xca' # 0x00d2 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0x00d4 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\u0131' # 0x00d5 -> LATIN SMALL LETTER DOTLESS I + u'\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0x00d8 -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\xa6' # 0x00dd -> BROKEN BAR + u'\xcc' # 0x00de -> LATIN CAPITAL LETTER I WITH GRAVE + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd2' # 0x00e3 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + u'\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\xfe' # 0x00e7 -> LATIN SMALL LETTER THORN + u'\xde' # 0x00e8 -> LATIN CAPITAL LETTER THORN + u'\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0x00ea -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xd9' # 0x00eb -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xfd' # 0x00ec -> LATIN SMALL LETTER Y WITH ACUTE + u'\xdd' # 0x00ed -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xaf' # 0x00ee -> MACRON + u'\xb4' # 0x00ef -> ACUTE ACCENT + u'\xad' # 0x00f0 -> SOFT HYPHEN + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2017' # 0x00f2 -> DOUBLE LOW LINE + u'\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + u'\xb6' # 0x00f4 -> PILCROW SIGN + u'\xa7' # 0x00f5 -> SECTION SIGN + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\xb8' # 0x00f7 -> CEDILLA + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\xa8' # 0x00f9 -> DIAERESIS + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\xb9' # 0x00fb -> SUPERSCRIPT ONE + u'\xb3' # 0x00fc -> SUPERSCRIPT THREE + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x00bd, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a5: 0x00be, # YEN SIGN + 0x00a6: 0x00dd, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x00b8, # COPYRIGHT SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00af: 0x00ee, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00f7, # CEDILLA + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x00b7, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x00c7, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x00d4, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x00d2, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cc: 0x00de, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x00d8, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d0: 0x00d1, # LATIN CAPITAL LETTER ETH + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00e3, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00d9: 0x00eb, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00db: 0x00ea, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x00ed, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00de: 0x00e8, # LATIN CAPITAL LETTER THORN + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x00c6, # LATIN SMALL LETTER A WITH TILDE + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f0: 0x00d0, # LATIN SMALL LETTER ETH + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x00ec, # LATIN SMALL LETTER Y WITH ACUTE + 0x00fe: 0x00e7, # LATIN SMALL LETTER THORN + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0131: 0x00d5, # LATIN SMALL LETTER DOTLESS I + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x2017: 0x00f2, # DOUBLE LOW LINE + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/PythonEnv/2.7/Lib/encodings/cp850.pyc b/PythonEnv/2.7/Lib/encodings/cp850.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33fb201462d2faca4209bd428d9a92610f59462a GIT binary patch literal 7786 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 NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u016f' # 0x0085 -> LATIN SMALL LETTER U WITH RING ABOVE + u'\u0107' # 0x0086 -> LATIN SMALL LETTER C WITH ACUTE + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\u0142' # 0x0088 -> LATIN SMALL LETTER L WITH STROKE + u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\u0150' # 0x008a -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + u'\u0151' # 0x008b -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\u0179' # 0x008d -> LATIN CAPITAL LETTER Z WITH ACUTE + u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\u0106' # 0x008f -> LATIN CAPITAL LETTER C WITH ACUTE + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\u0139' # 0x0091 -> LATIN CAPITAL LETTER L WITH ACUTE + u'\u013a' # 0x0092 -> LATIN SMALL LETTER L WITH ACUTE + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\u013d' # 0x0095 -> LATIN CAPITAL LETTER L WITH CARON + u'\u013e' # 0x0096 -> LATIN SMALL LETTER L WITH CARON + u'\u015a' # 0x0097 -> LATIN CAPITAL LETTER S WITH ACUTE + u'\u015b' # 0x0098 -> LATIN SMALL LETTER S WITH ACUTE + u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u0164' # 0x009b -> LATIN CAPITAL LETTER T WITH CARON + u'\u0165' # 0x009c -> LATIN SMALL LETTER T WITH CARON + u'\u0141' # 0x009d -> LATIN CAPITAL LETTER L WITH STROKE + u'\xd7' # 0x009e -> MULTIPLICATION SIGN + u'\u010d' # 0x009f -> LATIN SMALL LETTER C WITH CARON + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\u0104' # 0x00a4 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\u0105' # 0x00a5 -> LATIN SMALL LETTER A WITH OGONEK + u'\u017d' # 0x00a6 -> LATIN CAPITAL LETTER Z WITH CARON + u'\u017e' # 0x00a7 -> LATIN SMALL LETTER Z WITH CARON + u'\u0118' # 0x00a8 -> LATIN CAPITAL LETTER E WITH OGONEK + u'\u0119' # 0x00a9 -> LATIN SMALL LETTER E WITH OGONEK + u'\xac' # 0x00aa -> NOT SIGN + u'\u017a' # 0x00ab -> LATIN SMALL LETTER Z WITH ACUTE + u'\u010c' # 0x00ac -> LATIN CAPITAL LETTER C WITH CARON + u'\u015f' # 0x00ad -> LATIN SMALL LETTER S WITH CEDILLA + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\u011a' # 0x00b7 -> LATIN CAPITAL LETTER E WITH CARON + u'\u015e' # 0x00b8 -> LATIN CAPITAL LETTER S WITH CEDILLA + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u017b' # 0x00bd -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\u017c' # 0x00be -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u0102' # 0x00c6 -> LATIN CAPITAL LETTER A WITH BREVE + u'\u0103' # 0x00c7 -> LATIN SMALL LETTER A WITH BREVE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\xa4' # 0x00cf -> CURRENCY SIGN + u'\u0111' # 0x00d0 -> LATIN SMALL LETTER D WITH STROKE + u'\u0110' # 0x00d1 -> LATIN CAPITAL LETTER D WITH STROKE + u'\u010e' # 0x00d2 -> LATIN CAPITAL LETTER D WITH CARON + u'\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\u010f' # 0x00d4 -> LATIN SMALL LETTER D WITH CARON + u'\u0147' # 0x00d5 -> LATIN CAPITAL LETTER N WITH CARON + u'\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\u011b' # 0x00d8 -> LATIN SMALL LETTER E WITH CARON + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u0162' # 0x00dd -> LATIN CAPITAL LETTER T WITH CEDILLA + u'\u016e' # 0x00de -> LATIN CAPITAL LETTER U WITH RING ABOVE + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\u0143' # 0x00e3 -> LATIN CAPITAL LETTER N WITH ACUTE + u'\u0144' # 0x00e4 -> LATIN SMALL LETTER N WITH ACUTE + u'\u0148' # 0x00e5 -> LATIN SMALL LETTER N WITH CARON + u'\u0160' # 0x00e6 -> LATIN CAPITAL LETTER S WITH CARON + u'\u0161' # 0x00e7 -> LATIN SMALL LETTER S WITH CARON + u'\u0154' # 0x00e8 -> LATIN CAPITAL LETTER R WITH ACUTE + u'\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\u0155' # 0x00ea -> LATIN SMALL LETTER R WITH ACUTE + u'\u0170' # 0x00eb -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + u'\xfd' # 0x00ec -> LATIN SMALL LETTER Y WITH ACUTE + u'\xdd' # 0x00ed -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\u0163' # 0x00ee -> LATIN SMALL LETTER T WITH CEDILLA + u'\xb4' # 0x00ef -> ACUTE ACCENT + u'\xad' # 0x00f0 -> SOFT HYPHEN + u'\u02dd' # 0x00f1 -> DOUBLE ACUTE ACCENT + u'\u02db' # 0x00f2 -> OGONEK + u'\u02c7' # 0x00f3 -> CARON + u'\u02d8' # 0x00f4 -> BREVE + u'\xa7' # 0x00f5 -> SECTION SIGN + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\xb8' # 0x00f7 -> CEDILLA + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\xa8' # 0x00f9 -> DIAERESIS + u'\u02d9' # 0x00fa -> DOT ABOVE + u'\u0171' # 0x00fb -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + u'\u0158' # 0x00fc -> LATIN CAPITAL LETTER R WITH CARON + u'\u0159' # 0x00fd -> LATIN SMALL LETTER R WITH CARON + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b8: 0x00f7, # CEDILLA + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x00ed, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x00ec, # LATIN SMALL LETTER Y WITH ACUTE + 0x0102: 0x00c6, # LATIN CAPITAL LETTER A WITH BREVE + 0x0103: 0x00c7, # LATIN SMALL LETTER A WITH BREVE + 0x0104: 0x00a4, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0x00a5, # LATIN SMALL LETTER A WITH OGONEK + 0x0106: 0x008f, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0x0086, # LATIN SMALL LETTER C WITH ACUTE + 0x010c: 0x00ac, # LATIN CAPITAL LETTER C WITH CARON + 0x010d: 0x009f, # LATIN SMALL LETTER C WITH CARON + 0x010e: 0x00d2, # LATIN CAPITAL LETTER D WITH CARON + 0x010f: 0x00d4, # LATIN SMALL LETTER D WITH CARON + 0x0110: 0x00d1, # LATIN CAPITAL LETTER D WITH STROKE + 0x0111: 0x00d0, # LATIN SMALL LETTER D WITH STROKE + 0x0118: 0x00a8, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0x00a9, # LATIN SMALL LETTER E WITH OGONEK + 0x011a: 0x00b7, # LATIN CAPITAL LETTER E WITH CARON + 0x011b: 0x00d8, # LATIN SMALL LETTER E WITH CARON + 0x0139: 0x0091, # LATIN CAPITAL LETTER L WITH ACUTE + 0x013a: 0x0092, # LATIN SMALL LETTER L WITH ACUTE + 0x013d: 0x0095, # LATIN CAPITAL LETTER L WITH CARON + 0x013e: 0x0096, # LATIN SMALL LETTER L WITH CARON + 0x0141: 0x009d, # LATIN CAPITAL LETTER L WITH STROKE + 0x0142: 0x0088, # LATIN SMALL LETTER L WITH STROKE + 0x0143: 0x00e3, # LATIN CAPITAL LETTER N WITH ACUTE + 0x0144: 0x00e4, # LATIN SMALL LETTER N WITH ACUTE + 0x0147: 0x00d5, # LATIN CAPITAL LETTER N WITH CARON + 0x0148: 0x00e5, # LATIN SMALL LETTER N WITH CARON + 0x0150: 0x008a, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x0151: 0x008b, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x0154: 0x00e8, # LATIN CAPITAL LETTER R WITH ACUTE + 0x0155: 0x00ea, # LATIN SMALL LETTER R WITH ACUTE + 0x0158: 0x00fc, # LATIN CAPITAL LETTER R WITH CARON + 0x0159: 0x00fd, # LATIN SMALL LETTER R WITH CARON + 0x015a: 0x0097, # LATIN CAPITAL LETTER S WITH ACUTE + 0x015b: 0x0098, # LATIN SMALL LETTER S WITH ACUTE + 0x015e: 0x00b8, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015f: 0x00ad, # LATIN SMALL LETTER S WITH CEDILLA + 0x0160: 0x00e6, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0x00e7, # LATIN SMALL LETTER S WITH CARON + 0x0162: 0x00dd, # LATIN CAPITAL LETTER T WITH CEDILLA + 0x0163: 0x00ee, # LATIN SMALL LETTER T WITH CEDILLA + 0x0164: 0x009b, # LATIN CAPITAL LETTER T WITH CARON + 0x0165: 0x009c, # LATIN SMALL LETTER T WITH CARON + 0x016e: 0x00de, # LATIN CAPITAL LETTER U WITH RING ABOVE + 0x016f: 0x0085, # LATIN SMALL LETTER U WITH RING ABOVE + 0x0170: 0x00eb, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x0171: 0x00fb, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x0179: 0x008d, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x017a: 0x00ab, # LATIN SMALL LETTER Z WITH ACUTE + 0x017b: 0x00bd, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017c: 0x00be, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017d: 0x00a6, # LATIN CAPITAL LETTER Z WITH CARON + 0x017e: 0x00a7, # LATIN SMALL LETTER Z WITH CARON + 0x02c7: 0x00f3, # CARON + 0x02d8: 0x00f4, # BREVE + 0x02d9: 0x00fa, # DOT ABOVE + 0x02db: 0x00f2, # OGONEK + 0x02dd: 0x00f1, # DOUBLE ACUTE ACCENT + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/PythonEnv/2.7/Lib/encodings/cp852.pyc b/PythonEnv/2.7/Lib/encodings/cp852.pyc new file mode 100644 index 0000000000000000000000000000000000000000..326fb50e8bbec8c0dd5062b81059ad9069bcb84c GIT binary patch literal 8055 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 RA4+EWXL=1j+ZDj8{~yLNs4oBj literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp855.py b/PythonEnv/2.7/Lib/encodings/cp855.py new file mode 100644 index 0000000000..241ef9d1e8 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp855.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP855.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp855', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0452, # CYRILLIC SMALL LETTER DJE + 0x0081: 0x0402, # CYRILLIC CAPITAL LETTER DJE + 0x0082: 0x0453, # CYRILLIC SMALL LETTER GJE + 0x0083: 0x0403, # CYRILLIC CAPITAL LETTER GJE + 0x0084: 0x0451, # CYRILLIC SMALL LETTER IO + 0x0085: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x0086: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0087: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0088: 0x0455, # CYRILLIC SMALL LETTER DZE + 0x0089: 0x0405, # CYRILLIC CAPITAL LETTER DZE + 0x008a: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x008b: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x008c: 0x0457, # CYRILLIC SMALL LETTER YI + 0x008d: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x008e: 0x0458, # CYRILLIC SMALL LETTER JE + 0x008f: 0x0408, # CYRILLIC CAPITAL LETTER JE + 0x0090: 0x0459, # CYRILLIC SMALL LETTER LJE + 0x0091: 0x0409, # CYRILLIC CAPITAL LETTER LJE + 0x0092: 0x045a, # CYRILLIC SMALL LETTER NJE + 0x0093: 0x040a, # CYRILLIC CAPITAL LETTER NJE + 0x0094: 0x045b, # CYRILLIC SMALL LETTER TSHE + 0x0095: 0x040b, # CYRILLIC CAPITAL LETTER TSHE + 0x0096: 0x045c, # CYRILLIC SMALL LETTER KJE + 0x0097: 0x040c, # CYRILLIC CAPITAL LETTER KJE + 0x0098: 0x045e, # CYRILLIC SMALL LETTER SHORT U + 0x0099: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U + 0x009a: 0x045f, # CYRILLIC SMALL LETTER DZHE + 0x009b: 0x040f, # CYRILLIC CAPITAL LETTER DZHE + 0x009c: 0x044e, # CYRILLIC SMALL LETTER YU + 0x009d: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x009e: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x009f: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00a1: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x00a2: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00a3: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x00a4: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00a5: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x00a6: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00a7: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x00a8: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00a9: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x00aa: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00ab: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x00ac: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00ad: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00b6: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x00b7: 0x0438, # CYRILLIC SMALL LETTER I + 0x00b8: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00be: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00c7: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00d1: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x00d2: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00d3: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x00d4: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00d5: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x00d6: 0x043e, # CYRILLIC SMALL LETTER O + 0x00d7: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x00d8: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x00de: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00e1: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00e2: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x00e3: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00e4: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x00e5: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00e6: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x00e7: 0x0443, # CYRILLIC SMALL LETTER U + 0x00e8: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x00e9: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00ea: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x00eb: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00ec: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x00ed: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00ee: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x00ef: 0x2116, # NUMERO SIGN + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00f2: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x00f3: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00f4: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x00f5: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00f6: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x00f7: 0x044d, # CYRILLIC SMALL LETTER E + 0x00f8: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x00f9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00fa: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x00fb: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00fc: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x00fd: 0x00a7, # SECTION SIGN + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\u0452' # 0x0080 -> CYRILLIC SMALL LETTER DJE + u'\u0402' # 0x0081 -> CYRILLIC CAPITAL LETTER DJE + u'\u0453' # 0x0082 -> CYRILLIC SMALL LETTER GJE + u'\u0403' # 0x0083 -> CYRILLIC CAPITAL LETTER GJE + u'\u0451' # 0x0084 -> CYRILLIC SMALL LETTER IO + u'\u0401' # 0x0085 -> CYRILLIC CAPITAL LETTER IO + u'\u0454' # 0x0086 -> CYRILLIC SMALL LETTER UKRAINIAN IE + u'\u0404' # 0x0087 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + u'\u0455' # 0x0088 -> CYRILLIC SMALL LETTER DZE + u'\u0405' # 0x0089 -> CYRILLIC CAPITAL LETTER DZE + u'\u0456' # 0x008a -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + u'\u0406' # 0x008b -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + u'\u0457' # 0x008c -> CYRILLIC SMALL LETTER YI + u'\u0407' # 0x008d -> CYRILLIC CAPITAL LETTER YI + u'\u0458' # 0x008e -> CYRILLIC SMALL LETTER JE + u'\u0408' # 0x008f -> CYRILLIC CAPITAL LETTER JE + u'\u0459' # 0x0090 -> CYRILLIC SMALL LETTER LJE + u'\u0409' # 0x0091 -> CYRILLIC CAPITAL LETTER LJE + u'\u045a' # 0x0092 -> CYRILLIC SMALL LETTER NJE + u'\u040a' # 0x0093 -> CYRILLIC CAPITAL LETTER NJE + u'\u045b' # 0x0094 -> CYRILLIC SMALL LETTER TSHE + u'\u040b' # 0x0095 -> CYRILLIC CAPITAL LETTER TSHE + u'\u045c' # 0x0096 -> CYRILLIC SMALL LETTER KJE + u'\u040c' # 0x0097 -> CYRILLIC CAPITAL LETTER KJE + u'\u045e' # 0x0098 -> CYRILLIC SMALL LETTER SHORT U + u'\u040e' # 0x0099 -> CYRILLIC CAPITAL LETTER SHORT U + u'\u045f' # 0x009a -> CYRILLIC SMALL LETTER DZHE + u'\u040f' # 0x009b -> CYRILLIC CAPITAL LETTER DZHE + u'\u044e' # 0x009c -> CYRILLIC SMALL LETTER YU + u'\u042e' # 0x009d -> CYRILLIC CAPITAL LETTER YU + u'\u044a' # 0x009e -> CYRILLIC SMALL LETTER HARD SIGN + u'\u042a' # 0x009f -> CYRILLIC CAPITAL LETTER HARD SIGN + u'\u0430' # 0x00a0 -> CYRILLIC SMALL LETTER A + u'\u0410' # 0x00a1 -> CYRILLIC CAPITAL LETTER A + u'\u0431' # 0x00a2 -> CYRILLIC SMALL LETTER BE + u'\u0411' # 0x00a3 -> CYRILLIC CAPITAL LETTER BE + u'\u0446' # 0x00a4 -> CYRILLIC SMALL LETTER TSE + u'\u0426' # 0x00a5 -> CYRILLIC CAPITAL LETTER TSE + u'\u0434' # 0x00a6 -> CYRILLIC SMALL LETTER DE + u'\u0414' # 0x00a7 -> CYRILLIC CAPITAL LETTER DE + u'\u0435' # 0x00a8 -> CYRILLIC SMALL LETTER IE + u'\u0415' # 0x00a9 -> CYRILLIC CAPITAL LETTER IE + u'\u0444' # 0x00aa -> CYRILLIC SMALL LETTER EF + u'\u0424' # 0x00ab -> CYRILLIC CAPITAL LETTER EF + u'\u0433' # 0x00ac -> CYRILLIC SMALL LETTER GHE + u'\u0413' # 0x00ad -> CYRILLIC CAPITAL LETTER GHE + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u0445' # 0x00b5 -> CYRILLIC SMALL LETTER HA + u'\u0425' # 0x00b6 -> CYRILLIC CAPITAL LETTER HA + u'\u0438' # 0x00b7 -> CYRILLIC SMALL LETTER I + u'\u0418' # 0x00b8 -> CYRILLIC CAPITAL LETTER I + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u0439' # 0x00bd -> CYRILLIC SMALL LETTER SHORT I + u'\u0419' # 0x00be -> CYRILLIC CAPITAL LETTER SHORT I + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u043a' # 0x00c6 -> CYRILLIC SMALL LETTER KA + u'\u041a' # 0x00c7 -> CYRILLIC CAPITAL LETTER KA + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\xa4' # 0x00cf -> CURRENCY SIGN + u'\u043b' # 0x00d0 -> CYRILLIC SMALL LETTER EL + u'\u041b' # 0x00d1 -> CYRILLIC CAPITAL LETTER EL + u'\u043c' # 0x00d2 -> CYRILLIC SMALL LETTER EM + u'\u041c' # 0x00d3 -> CYRILLIC CAPITAL LETTER EM + u'\u043d' # 0x00d4 -> CYRILLIC SMALL LETTER EN + u'\u041d' # 0x00d5 -> CYRILLIC CAPITAL LETTER EN + u'\u043e' # 0x00d6 -> CYRILLIC SMALL LETTER O + u'\u041e' # 0x00d7 -> CYRILLIC CAPITAL LETTER O + u'\u043f' # 0x00d8 -> CYRILLIC SMALL LETTER PE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u041f' # 0x00dd -> CYRILLIC CAPITAL LETTER PE + u'\u044f' # 0x00de -> CYRILLIC SMALL LETTER YA + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u042f' # 0x00e0 -> CYRILLIC CAPITAL LETTER YA + u'\u0440' # 0x00e1 -> CYRILLIC SMALL LETTER ER + u'\u0420' # 0x00e2 -> CYRILLIC CAPITAL LETTER ER + u'\u0441' # 0x00e3 -> CYRILLIC SMALL LETTER ES + u'\u0421' # 0x00e4 -> CYRILLIC CAPITAL LETTER ES + u'\u0442' # 0x00e5 -> CYRILLIC SMALL LETTER TE + u'\u0422' # 0x00e6 -> CYRILLIC CAPITAL LETTER TE + u'\u0443' # 0x00e7 -> CYRILLIC SMALL LETTER U + u'\u0423' # 0x00e8 -> CYRILLIC CAPITAL LETTER U + u'\u0436' # 0x00e9 -> CYRILLIC SMALL LETTER ZHE + u'\u0416' # 0x00ea -> CYRILLIC CAPITAL LETTER ZHE + u'\u0432' # 0x00eb -> CYRILLIC SMALL LETTER VE + u'\u0412' # 0x00ec -> CYRILLIC CAPITAL LETTER VE + u'\u044c' # 0x00ed -> CYRILLIC SMALL LETTER SOFT SIGN + u'\u042c' # 0x00ee -> CYRILLIC CAPITAL LETTER SOFT SIGN + u'\u2116' # 0x00ef -> NUMERO SIGN + u'\xad' # 0x00f0 -> SOFT HYPHEN + u'\u044b' # 0x00f1 -> CYRILLIC SMALL LETTER YERU + u'\u042b' # 0x00f2 -> CYRILLIC CAPITAL LETTER YERU + u'\u0437' # 0x00f3 -> CYRILLIC SMALL LETTER ZE + u'\u0417' # 0x00f4 -> CYRILLIC CAPITAL LETTER ZE + u'\u0448' # 0x00f5 -> CYRILLIC SMALL LETTER SHA + u'\u0428' # 0x00f6 -> CYRILLIC CAPITAL LETTER SHA + u'\u044d' # 0x00f7 -> CYRILLIC SMALL LETTER E + u'\u042d' # 0x00f8 -> CYRILLIC CAPITAL LETTER E + u'\u0449' # 0x00f9 -> CYRILLIC SMALL LETTER SHCHA + u'\u0429' # 0x00fa -> CYRILLIC CAPITAL LETTER SHCHA + u'\u0447' # 0x00fb -> CYRILLIC SMALL LETTER CHE + u'\u0427' # 0x00fc -> CYRILLIC CAPITAL LETTER CHE + u'\xa7' # 0x00fd -> SECTION SIGN + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a7: 0x00fd, # SECTION SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x0401: 0x0085, # CYRILLIC CAPITAL LETTER IO + 0x0402: 0x0081, # CYRILLIC CAPITAL LETTER DJE + 0x0403: 0x0083, # CYRILLIC CAPITAL LETTER GJE + 0x0404: 0x0087, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0405: 0x0089, # CYRILLIC CAPITAL LETTER DZE + 0x0406: 0x008b, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0407: 0x008d, # CYRILLIC CAPITAL LETTER YI + 0x0408: 0x008f, # CYRILLIC CAPITAL LETTER JE + 0x0409: 0x0091, # CYRILLIC CAPITAL LETTER LJE + 0x040a: 0x0093, # CYRILLIC CAPITAL LETTER NJE + 0x040b: 0x0095, # CYRILLIC CAPITAL LETTER TSHE + 0x040c: 0x0097, # CYRILLIC CAPITAL LETTER KJE + 0x040e: 0x0099, # CYRILLIC CAPITAL LETTER SHORT U + 0x040f: 0x009b, # CYRILLIC CAPITAL LETTER DZHE + 0x0410: 0x00a1, # CYRILLIC CAPITAL LETTER A + 0x0411: 0x00a3, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0x00ec, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0x00ad, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0x00a7, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0x00a9, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0x00ea, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0x00f4, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0x00b8, # CYRILLIC CAPITAL LETTER I + 0x0419: 0x00be, # CYRILLIC CAPITAL LETTER SHORT I + 0x041a: 0x00c7, # CYRILLIC CAPITAL LETTER KA + 0x041b: 0x00d1, # CYRILLIC CAPITAL LETTER EL + 0x041c: 0x00d3, # CYRILLIC CAPITAL LETTER EM + 0x041d: 0x00d5, # CYRILLIC CAPITAL LETTER EN + 0x041e: 0x00d7, # CYRILLIC CAPITAL LETTER O + 0x041f: 0x00dd, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0x00e2, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0x00e4, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0x00e6, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0x00e8, # CYRILLIC CAPITAL LETTER U + 0x0424: 0x00ab, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0x00b6, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0x00a5, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0x00fc, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0x00f6, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0x00fa, # CYRILLIC CAPITAL LETTER SHCHA + 0x042a: 0x009f, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042b: 0x00f2, # CYRILLIC CAPITAL LETTER YERU + 0x042c: 0x00ee, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042d: 0x00f8, # CYRILLIC CAPITAL LETTER E + 0x042e: 0x009d, # CYRILLIC CAPITAL LETTER YU + 0x042f: 0x00e0, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0x00a0, # CYRILLIC SMALL LETTER A + 0x0431: 0x00a2, # CYRILLIC SMALL LETTER BE + 0x0432: 0x00eb, # CYRILLIC SMALL LETTER VE + 0x0433: 0x00ac, # CYRILLIC SMALL LETTER GHE + 0x0434: 0x00a6, # CYRILLIC SMALL LETTER DE + 0x0435: 0x00a8, # CYRILLIC SMALL LETTER IE + 0x0436: 0x00e9, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0x00f3, # CYRILLIC SMALL LETTER ZE + 0x0438: 0x00b7, # CYRILLIC SMALL LETTER I + 0x0439: 0x00bd, # CYRILLIC SMALL LETTER SHORT I + 0x043a: 0x00c6, # CYRILLIC SMALL LETTER KA + 0x043b: 0x00d0, # CYRILLIC SMALL LETTER EL + 0x043c: 0x00d2, # CYRILLIC SMALL LETTER EM + 0x043d: 0x00d4, # CYRILLIC SMALL LETTER EN + 0x043e: 0x00d6, # CYRILLIC SMALL LETTER O + 0x043f: 0x00d8, # CYRILLIC SMALL LETTER PE + 0x0440: 0x00e1, # CYRILLIC SMALL LETTER ER + 0x0441: 0x00e3, # CYRILLIC SMALL LETTER ES + 0x0442: 0x00e5, # CYRILLIC SMALL LETTER TE + 0x0443: 0x00e7, # CYRILLIC SMALL LETTER U + 0x0444: 0x00aa, # CYRILLIC SMALL LETTER EF + 0x0445: 0x00b5, # CYRILLIC SMALL LETTER HA + 0x0446: 0x00a4, # CYRILLIC SMALL LETTER TSE + 0x0447: 0x00fb, # CYRILLIC SMALL LETTER CHE + 0x0448: 0x00f5, # CYRILLIC SMALL LETTER SHA + 0x0449: 0x00f9, # CYRILLIC SMALL LETTER SHCHA + 0x044a: 0x009e, # CYRILLIC SMALL LETTER HARD SIGN + 0x044b: 0x00f1, # CYRILLIC SMALL LETTER YERU + 0x044c: 0x00ed, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044d: 0x00f7, # CYRILLIC SMALL LETTER E + 0x044e: 0x009c, # CYRILLIC SMALL LETTER YU + 0x044f: 0x00de, # CYRILLIC SMALL LETTER YA + 0x0451: 0x0084, # CYRILLIC SMALL LETTER IO + 0x0452: 0x0080, # CYRILLIC SMALL LETTER DJE + 0x0453: 0x0082, # CYRILLIC SMALL LETTER GJE + 0x0454: 0x0086, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0455: 0x0088, # CYRILLIC SMALL LETTER DZE + 0x0456: 0x008a, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0457: 0x008c, # CYRILLIC SMALL LETTER YI + 0x0458: 0x008e, # CYRILLIC SMALL LETTER JE + 0x0459: 0x0090, # CYRILLIC SMALL LETTER LJE + 0x045a: 0x0092, # CYRILLIC SMALL LETTER NJE + 0x045b: 0x0094, # CYRILLIC SMALL LETTER TSHE + 0x045c: 0x0096, # CYRILLIC SMALL LETTER KJE + 0x045e: 0x0098, # CYRILLIC SMALL LETTER SHORT U + 0x045f: 0x009a, # CYRILLIC SMALL LETTER DZHE + 0x2116: 0x00ef, # NUMERO SIGN + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/PythonEnv/2.7/Lib/encodings/cp855.pyc b/PythonEnv/2.7/Lib/encodings/cp855.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf8f9b2472d4841edbd7c1e2947abe3a88bd9dda GIT binary patch literal 8236 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp856.py b/PythonEnv/2.7/Lib/encodings/cp856.py new file mode 100644 index 0000000000..203c2c4ca0 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp856.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp856 generated from 'MAPPINGS/VENDORS/MISC/CP856.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp856', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u05d0' # 0x80 -> HEBREW LETTER ALEF + u'\u05d1' # 0x81 -> HEBREW LETTER BET + u'\u05d2' # 0x82 -> HEBREW LETTER GIMEL + u'\u05d3' # 0x83 -> HEBREW LETTER DALET + u'\u05d4' # 0x84 -> HEBREW LETTER HE + u'\u05d5' # 0x85 -> HEBREW LETTER VAV + u'\u05d6' # 0x86 -> HEBREW LETTER ZAYIN + u'\u05d7' # 0x87 -> HEBREW LETTER HET + u'\u05d8' # 0x88 -> HEBREW LETTER TET + u'\u05d9' # 0x89 -> HEBREW LETTER YOD + u'\u05da' # 0x8A -> HEBREW LETTER FINAL KAF + u'\u05db' # 0x8B -> HEBREW LETTER KAF + u'\u05dc' # 0x8C -> HEBREW LETTER LAMED + u'\u05dd' # 0x8D -> HEBREW LETTER FINAL MEM + u'\u05de' # 0x8E -> HEBREW LETTER MEM + u'\u05df' # 0x8F -> HEBREW LETTER FINAL NUN + u'\u05e0' # 0x90 -> HEBREW LETTER NUN + u'\u05e1' # 0x91 -> HEBREW LETTER SAMEKH + u'\u05e2' # 0x92 -> HEBREW LETTER AYIN + u'\u05e3' # 0x93 -> HEBREW LETTER FINAL PE + u'\u05e4' # 0x94 -> HEBREW LETTER PE + u'\u05e5' # 0x95 -> HEBREW LETTER FINAL TSADI + u'\u05e6' # 0x96 -> HEBREW LETTER TSADI + u'\u05e7' # 0x97 -> HEBREW LETTER QOF + u'\u05e8' # 0x98 -> HEBREW LETTER RESH + u'\u05e9' # 0x99 -> HEBREW LETTER SHIN + u'\u05ea' # 0x9A -> HEBREW LETTER TAV + u'\ufffe' # 0x9B -> UNDEFINED + u'\xa3' # 0x9C -> POUND SIGN + u'\ufffe' # 0x9D -> UNDEFINED + u'\xd7' # 0x9E -> MULTIPLICATION SIGN + u'\ufffe' # 0x9F -> UNDEFINED + u'\ufffe' # 0xA0 -> UNDEFINED + u'\ufffe' # 0xA1 -> UNDEFINED + u'\ufffe' # 0xA2 -> UNDEFINED + u'\ufffe' # 0xA3 -> UNDEFINED + u'\ufffe' # 0xA4 -> UNDEFINED + u'\ufffe' # 0xA5 -> UNDEFINED + u'\ufffe' # 0xA6 -> UNDEFINED + u'\ufffe' # 0xA7 -> UNDEFINED + u'\ufffe' # 0xA8 -> UNDEFINED + u'\xae' # 0xA9 -> REGISTERED SIGN + u'\xac' # 0xAA -> NOT SIGN + u'\xbd' # 0xAB -> VULGAR FRACTION ONE HALF + u'\xbc' # 0xAC -> VULGAR FRACTION ONE QUARTER + u'\ufffe' # 0xAD -> UNDEFINED + u'\xab' # 0xAE -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xAF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0xB0 -> LIGHT SHADE + u'\u2592' # 0xB1 -> MEDIUM SHADE + u'\u2593' # 0xB2 -> DARK SHADE + u'\u2502' # 0xB3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0xB4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\ufffe' # 0xB5 -> UNDEFINED + u'\ufffe' # 0xB6 -> UNDEFINED + u'\ufffe' # 0xB7 -> UNDEFINED + u'\xa9' # 0xB8 -> COPYRIGHT SIGN + u'\u2563' # 0xB9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0xBA -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0xBB -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0xBC -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\xa2' # 0xBD -> CENT SIGN + u'\xa5' # 0xBE -> YEN SIGN + u'\u2510' # 0xBF -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0xC0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0xC1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0xC2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0xC3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0xC4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0xC5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\ufffe' # 0xC6 -> UNDEFINED + u'\ufffe' # 0xC7 -> UNDEFINED + u'\u255a' # 0xC8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0xC9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0xCA -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0xCB -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0xCC -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0xCD -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0xCE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\xa4' # 0xCF -> CURRENCY SIGN + u'\ufffe' # 0xD0 -> UNDEFINED + u'\ufffe' # 0xD1 -> UNDEFINED + u'\ufffe' # 0xD2 -> UNDEFINED + u'\ufffe' # 0xD3 -> UNDEFINEDS + u'\ufffe' # 0xD4 -> UNDEFINED + u'\ufffe' # 0xD5 -> UNDEFINED + u'\ufffe' # 0xD6 -> UNDEFINEDE + u'\ufffe' # 0xD7 -> UNDEFINED + u'\ufffe' # 0xD8 -> UNDEFINED + u'\u2518' # 0xD9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0xDA -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0xDB -> FULL BLOCK + u'\u2584' # 0xDC -> LOWER HALF BLOCK + u'\xa6' # 0xDD -> BROKEN BAR + u'\ufffe' # 0xDE -> UNDEFINED + u'\u2580' # 0xDF -> UPPER HALF BLOCK + u'\ufffe' # 0xE0 -> UNDEFINED + u'\ufffe' # 0xE1 -> UNDEFINED + u'\ufffe' # 0xE2 -> UNDEFINED + u'\ufffe' # 0xE3 -> UNDEFINED + u'\ufffe' # 0xE4 -> UNDEFINED + u'\ufffe' # 0xE5 -> UNDEFINED + u'\xb5' # 0xE6 -> MICRO SIGN + u'\ufffe' # 0xE7 -> UNDEFINED + u'\ufffe' # 0xE8 -> UNDEFINED + u'\ufffe' # 0xE9 -> UNDEFINED + u'\ufffe' # 0xEA -> UNDEFINED + u'\ufffe' # 0xEB -> UNDEFINED + u'\ufffe' # 0xEC -> UNDEFINED + u'\ufffe' # 0xED -> UNDEFINED + u'\xaf' # 0xEE -> MACRON + u'\xb4' # 0xEF -> ACUTE ACCENT + u'\xad' # 0xF0 -> SOFT HYPHEN + u'\xb1' # 0xF1 -> PLUS-MINUS SIGN + u'\u2017' # 0xF2 -> DOUBLE LOW LINE + u'\xbe' # 0xF3 -> VULGAR FRACTION THREE QUARTERS + u'\xb6' # 0xF4 -> PILCROW SIGN + u'\xa7' # 0xF5 -> SECTION SIGN + u'\xf7' # 0xF6 -> DIVISION SIGN + u'\xb8' # 0xF7 -> CEDILLA + u'\xb0' # 0xF8 -> DEGREE SIGN + u'\xa8' # 0xF9 -> DIAERESIS + u'\xb7' # 0xFA -> MIDDLE DOT + u'\xb9' # 0xFB -> SUPERSCRIPT ONE + u'\xb3' # 0xFC -> SUPERSCRIPT THREE + u'\xb2' # 0xFD -> SUPERSCRIPT TWO + u'\u25a0' # 0xFE -> BLACK SQUARE + u'\xa0' # 0xFF -> NO-BREAK SPACE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp856.pyc b/PythonEnv/2.7/Lib/encodings/cp856.pyc new file mode 100644 index 0000000000000000000000000000000000000000..101d9779eb9f5450663487eea20d9ceb45222c22 GIT binary patch literal 2866 zcmc&$>sK2^6rVf^0ZQLWi<;I4@daA#!&)mP(27cm8|)*Zamj8Vn3tPDM62Z#K6pHS zfOZpVZ52yPTg7)3J!(B?`oTY8zRy442mgS2?`*RR=Isi`r zG6n$#G16GL9upV@5$YbH1NmGiGN2l2lIljNODz=Ax&BZjuj$E9vaoCWj!?gz(+!pC zS}0}Yv!SN0ecj!i(F3uTLmkofgG#KWt1}j9iFCue%{@nYnnJ^AI)JN^=%l$Y(i{w? zZ@?!?eXyx?Z3F6tnKq0k1VV?v0XT{2IK&HSgYG7%dx#PXBmC5luTvwPq)B|n;e`>w z>2)9|A%iY*41R7x-DJ!IDZ5}k>MWO$73nINO+xNjwUDsFl~Ym$6cSYJ%jniB+@Yvv zQZj{ft}sMp9J*oTjba##M2g~8&?38gEnv6p?9HV6dMo~ly%JDB#9Au>szJwy0&%S* z9R-&zN(3+m+~t&17bl|N5hw_uQUzjVky~3JdN(5vBRn(!B9X|cSv`@ULHUr)YeN}$ zRM4hiuFj59TP9!%tR&Siinx>CUF)H1LFvpT4Lz&psG8}JXc|eFl^?{V4MuT22#Z*7 zpETl-2|4j+$Tz{P!yup%kjR51f_vT&3!~d;8U&F!OZXL}poCMw=p71Hz zQeSS?h#Ka(5N4$ocdG*-J?~dDMP0({xc^7U;xVqN?BRDU#kF11>HonM58T2P*|Y># z1TW+36n+6y%&qaYKx~lz$fnZ5)bONyfz~hVHd@Bg+##yZtnkbfSxO#Bu zycHcfq7NCb`LP2)+oaIq0$6m$NL4J1REbi&epr9x&5*^`DLj(cX{TUV1>aaYZPhkI z9vpNTI5-%9*Mf;*d6IHVdH*SHF56mXE|r(1%Gp-I`=uZ)6huP7b6MGuQlxIb4lzM* zrN+n>cq}4ciL2V>ch$nzFTX>-BDq{{kJsm~3RDMcYU@_juU@lu-TDn1Z@IN$)8@w8 zZoeb6W$T@H-F;6}_}=^Of8fF9mWLkR_Q<2#ckJBt*zU*oJhAu5)_rY}_Ky7rp6Y!1 znP;TQNtKFcrh%lr!elqN-KN|esA^X#H9 zCxmGV^QtiCgn3q&qryZl@DrsoqGXB^teF+1X;GRGr8(v}v%T7iFi#8fJyCu~l*idD zx+ss@Mq6Ru+Ui1ueZj7>&)8RDbc$VL-?2;A=h^q{OLm#fvme+u>}ye;X47Fjbf7wR zRxO`|PKq7K;+VrMB$Y+4&8T6uq}U-U|J?Kqr8AnUpuyYVZS*wys_XqXi1!a4n9eT% literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp857.py b/PythonEnv/2.7/Lib/encodings/cp857.py new file mode 100644 index 0000000000..c24191b04d --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp857.py @@ -0,0 +1,694 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP857.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp857', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x0130, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x009f: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x011e, # LATIN CAPITAL LETTER G WITH BREVE + 0x00a7: 0x011f, # LATIN SMALL LETTER G WITH BREVE + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00b8: 0x00a9, # COPYRIGHT SIGN + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x00a2, # CENT SIGN + 0x00be: 0x00a5, # YEN SIGN + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00d1: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00d5: None, # UNDEFINED + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x00a6, # BROKEN BAR + 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: None, # UNDEFINED + 0x00e8: 0x00d7, # MULTIPLICATION SIGN + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00ed: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x00ee: 0x00af, # MACRON + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: None, # UNDEFINED + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + u'\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\u0131' # 0x008d -> LATIN SMALL LETTER DOTLESS I + u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + u'\u0130' # 0x0098 -> LATIN CAPITAL LETTER I WITH DOT ABOVE + u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + u'\xa3' # 0x009c -> POUND SIGN + u'\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + u'\u015e' # 0x009e -> LATIN CAPITAL LETTER S WITH CEDILLA + u'\u015f' # 0x009f -> LATIN SMALL LETTER S WITH CEDILLA + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + u'\u011e' # 0x00a6 -> LATIN CAPITAL LETTER G WITH BREVE + u'\u011f' # 0x00a7 -> LATIN SMALL LETTER G WITH BREVE + u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK + u'\xae' # 0x00a9 -> REGISTERED SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc0' # 0x00b7 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xa9' # 0x00b8 -> COPYRIGHT SIGN + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\xa2' # 0x00bd -> CENT SIGN + u'\xa5' # 0x00be -> YEN SIGN + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\xe3' # 0x00c6 -> LATIN SMALL LETTER A WITH TILDE + u'\xc3' # 0x00c7 -> LATIN CAPITAL LETTER A WITH TILDE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\xa4' # 0x00cf -> CURRENCY SIGN + u'\xba' # 0x00d0 -> MASCULINE ORDINAL INDICATOR + u'\xaa' # 0x00d1 -> FEMININE ORDINAL INDICATOR + u'\xca' # 0x00d2 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0x00d4 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\ufffe' # 0x00d5 -> UNDEFINED + u'\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0x00d8 -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\xa6' # 0x00dd -> BROKEN BAR + u'\xcc' # 0x00de -> LATIN CAPITAL LETTER I WITH GRAVE + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd2' # 0x00e3 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + u'\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\ufffe' # 0x00e7 -> UNDEFINED + u'\xd7' # 0x00e8 -> MULTIPLICATION SIGN + u'\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0x00ea -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xd9' # 0x00eb -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xec' # 0x00ec -> LATIN SMALL LETTER I WITH GRAVE + u'\xff' # 0x00ed -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\xaf' # 0x00ee -> MACRON + u'\xb4' # 0x00ef -> ACUTE ACCENT + u'\xad' # 0x00f0 -> SOFT HYPHEN + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\ufffe' # 0x00f2 -> UNDEFINED + u'\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + u'\xb6' # 0x00f4 -> PILCROW SIGN + u'\xa7' # 0x00f5 -> SECTION SIGN + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\xb8' # 0x00f7 -> CEDILLA + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\xa8' # 0x00f9 -> DIAERESIS + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\xb9' # 0x00fb -> SUPERSCRIPT ONE + u'\xb3' # 0x00fc -> SUPERSCRIPT THREE + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x00bd, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a5: 0x00be, # YEN SIGN + 0x00a6: 0x00dd, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x00b8, # COPYRIGHT SIGN + 0x00aa: 0x00d1, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00af: 0x00ee, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00f7, # CEDILLA + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00ba: 0x00d0, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x00b7, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x00c7, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x00d4, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x00d2, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cc: 0x00de, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x00d8, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00e3, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x00e8, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00d9: 0x00eb, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00db: 0x00ea, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x00c6, # LATIN SMALL LETTER A WITH TILDE + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00ff: 0x00ed, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x011e: 0x00a6, # LATIN CAPITAL LETTER G WITH BREVE + 0x011f: 0x00a7, # LATIN SMALL LETTER G WITH BREVE + 0x0130: 0x0098, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x0131: 0x008d, # LATIN SMALL LETTER DOTLESS I + 0x015e: 0x009e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015f: 0x009f, # LATIN SMALL LETTER S WITH CEDILLA + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/PythonEnv/2.7/Lib/encodings/cp857.pyc b/PythonEnv/2.7/Lib/encodings/cp857.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1a57b1f64c02420f33f043dad12129108776e0c GIT binary patch literal 7776 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 NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + u'\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + u'\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + u'\xa3' # 0x009c -> POUND SIGN + u'\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd7' # 0x009e -> MULTIPLICATION SIGN + u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK + u'\xae' # 0x00a9 -> REGISTERED SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc0' # 0x00b7 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xa9' # 0x00b8 -> COPYRIGHT SIGN + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\xa2' # 0x00bd -> CENT SIGN + u'\xa5' # 0x00be -> YEN SIGN + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\xe3' # 0x00c6 -> LATIN SMALL LETTER A WITH TILDE + u'\xc3' # 0x00c7 -> LATIN CAPITAL LETTER A WITH TILDE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\xa4' # 0x00cf -> CURRENCY SIGN + u'\xf0' # 0x00d0 -> LATIN SMALL LETTER ETH + u'\xd0' # 0x00d1 -> LATIN CAPITAL LETTER ETH + u'\xca' # 0x00d2 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0x00d4 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\u20ac' # 0x00d5 -> EURO SIGN + u'\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0x00d8 -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\xa6' # 0x00dd -> BROKEN BAR + u'\xcc' # 0x00de -> LATIN CAPITAL LETTER I WITH GRAVE + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd2' # 0x00e3 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + u'\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\xfe' # 0x00e7 -> LATIN SMALL LETTER THORN + u'\xde' # 0x00e8 -> LATIN CAPITAL LETTER THORN + u'\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0x00ea -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xd9' # 0x00eb -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xfd' # 0x00ec -> LATIN SMALL LETTER Y WITH ACUTE + u'\xdd' # 0x00ed -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xaf' # 0x00ee -> MACRON + u'\xb4' # 0x00ef -> ACUTE ACCENT + u'\xad' # 0x00f0 -> SOFT HYPHEN + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2017' # 0x00f2 -> DOUBLE LOW LINE + u'\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + u'\xb6' # 0x00f4 -> PILCROW SIGN + u'\xa7' # 0x00f5 -> SECTION SIGN + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\xb8' # 0x00f7 -> CEDILLA + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\xa8' # 0x00f9 -> DIAERESIS + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\xb9' # 0x00fb -> SUPERSCRIPT ONE + u'\xb3' # 0x00fc -> SUPERSCRIPT THREE + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x00bd, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a5: 0x00be, # YEN SIGN + 0x00a6: 0x00dd, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x00b8, # COPYRIGHT SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00af: 0x00ee, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00f7, # CEDILLA + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x00b7, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x00c7, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x00d4, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x00d2, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cc: 0x00de, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x00d8, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d0: 0x00d1, # LATIN CAPITAL LETTER ETH + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00e3, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00d9: 0x00eb, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00db: 0x00ea, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x00ed, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00de: 0x00e8, # LATIN CAPITAL LETTER THORN + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x00c6, # LATIN SMALL LETTER A WITH TILDE + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f0: 0x00d0, # LATIN SMALL LETTER ETH + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x00ec, # LATIN SMALL LETTER Y WITH ACUTE + 0x00fe: 0x00e7, # LATIN SMALL LETTER THORN + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x20ac: 0x00d5, # EURO SIGN + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x2017: 0x00f2, # DOUBLE LOW LINE + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/PythonEnv/2.7/Lib/encodings/cp858.pyc b/PythonEnv/2.7/Lib/encodings/cp858.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7e4f2dabafdf37b4b473bd2a222e5bcac966707 GIT binary patch literal 7756 zcmd^@cYIV;7RS#^148IE7%?DXL_|b5AR+<*6cr2;6bWD$awagC=FCLIihzpPD3gGQ z3WA6jJ9cdE?z+AAzB}7{aeH%rzjuYW?*8GrpU>_eCcpWfGw;nS_ue!2ci-f{(W7|X zrq;Q2^44Dg;xxR{Roz8Qqy`Mc@}wb<8YKCW2xL{B)FUsD4I=AB7S-g56-GPqqa8&@ zcjSw8iFOo3JGvg-Q6Sb$5_!?SLaE0IijVFq6zhIuUs1HLK!{TqHO~?P9To2$zU0LZ}g2jIcy(DZ-^I>99sca9rS+^b!WfU&z2;ReAO)Yb`3tF~TnTD1*gHzM35=zO)C1)Z<9 zQPACr9T;=9Tf{aY+$tCmwcEsQN4P`mPK3>3TM)L2Z9~Y4wIM7NYe(2FwgX{@pxYD& z*CitR+$Bz8B#F0p$Mwh2Z{aV$neaV*A1?Ow6_5O$00LAYORFTy^-fGT?59zfV4 zwjbd^u>%M@1@)&$F_MbYqc#=SL~GO@5|pUoVyI0;pQ5VN4hl+CaS9Zr;wq?V#Z^$S zic6zl)gBhqrs85K3&p6RU=<^S@>Pr|ny45&REJuJpc)nZjml9B7b;az9=NjFBZ7ie zj2becE;{vHY zA&}aW0;xSEklG=E)Sebd?HPg8o)t*#If2xk7f9^|fz)0UNbRsdYA*?-_Od`~uLz{} zsz7S538WSZq~-)t`+z`d9~4OKb%E4AB#_#N1ycKnKx!WqNbO?+seN1^wND77_DO-% zJ|&Rarv*~`j6iCi6-e!K0;zpoAhjHZ0;&B-AhjP0r1lem)P5?E z+Rp@1`?)}BzYs|6mjbE%N+7jg3#9fNfz;j*NbR=*sr^nMwciV*_6LE~{wR>zp9E6- zvp{Np5lHQ?0;&B?Aho{>r1qvjYA6{A)Pev~%L^d2`~Xrb2q3k>08%RoAhj+5q}DZn z)Vc+bT5$lWbq^r5k^oZc5kP7^14yk`0IBs3Aecn}sr3yYct!xJ^$#FeM*yh}3?Mj2 z0I3ZQAQ(visSODr_(=e%l?4!NC4kh11`ymOfYizZ2qqIiYQqBvUK2oSBLWDP6F_Ps z0|?F&Kx!2M1Oo~nwNU{C9||C~(E$WI3Lv#H0R&eHpvYvZ(5;vQVhDBKEY9_2(eBOS zdT$n(I~L<3n1PleoaM~|Q$ZZ>7JIW;=FOtUn+4`gnnm23#fjc5W_h!?*qa5WC7MMa zZx$zbvpCJ0#RP8_7kRV5)UyVkJky)SQg0TR$7mMIy;+zyi)wEcwcac+Ev?2!FjJ-x zuJC5j%bUe$Zx&;`S&a8)(c7EF-QFz5db7C8o5fCV7W=(fO!sDSzBh|G-YhQhX0gbd z#YS%yrQR$Cc(XXho5c)o78iK4IM18KFmD$9yjdLQ&0?lEi}~Ixj`wD9p*M>m-YlxT zSq$`Mak@8)!QL#&yjhI%W--*8#RzW}{k>U~d$Sns&0>@{iA@v*b;Z~KE9>c4UYA#`$*gQ{Dz97_PsQsp ziB$RAcuPyNX+?QuvnA@v>zh;Ml~t1_Od4I@*lfxAWWvhpQ_YR#buE)7j2%;4oO~01 z^D>1vS9HYD1$-X1%)l#M4kWNp4!DfR8h!)T$9Ykn7v=d9tFFk$hcZR{cqWys%hd5b zUj=woa&tc*BeE)xYoI*Ij2#&30=&07_m|)m z-n#P&c2A}&P+Qv+Z%owIW{RUXsD;)Byp3^RjBV|_VwAnh4vXPP>4sODS1QUY$HpKO9B|*StfqJLYpfTy;q@PV^P(CYh=cxp zm&STy*MC!|?8yN~PLJN?U{z;QiFo6}R1(wX(fVZdMfJ%s_VtPB4Y@=$);Y?ZO^mX4 zTRJS8QoN#e{?m=b5^?(<-Uuh;vd$Yh+5sHCN^YM9_-~y5;RZk1aMH$C4_~^1BY6RT zu|dUK5$AvWNR#Oz)|Hdadg)SK!BUx*;n$DzPxQ@*Cfm-5Co1e@=Y-*>`_wx(`?)O@ z4IDfM1BVy->unoWM8<}}qeM^jbjWn=t)#aI?G_C$>1^4^9t!|8KH z0{656GhS-VFuYB(UM1)j6a^*tFN*&0{3??C5O&~aCE%~b4aAR$bwrLpA4~Fk#0KKq z#Er!FiJOQY5;qe+AvO{}C2k>pL~J5{N!&{Og1C+N8F4%D0pbqggT$T0M~KbD4~Q+q z>%>;#x5PH$_e7TX4bevYg=i=KL~JMCBz6#AB<>=CChj4=MBGbk zW!K%u>^sD6;^)L3;tk?{;?KmdiG9RphzE#+#D3xh;z8mS;sEg|@et8LyhJ=q93~zi zUL+nPwwwSw&TK2QCzx$x_9U}BW=}C2!R!#T*NCTyka&i8m3WqTj;P~@pJz6o*+OC| z@iMpdX4an=PmCtY2*&|I?91BFdNJxzQU}8*;kouWcD>?8<>5A**A%`eEThCza#!m{EZk? z4*Y@HZhWNmK8&;kdHDr}MP0gfEAC#>qi3()efsw6KVaaX!KFivDLZ!Papl8?A3x%R zktbH1H0tEhr;Isu>}lgpA3s4SPC8@qnN!Z1diJ#GGb(4!ntjf>bIv>eg1Pf9tePLI zUU1RH3oltzvv|qUOKX?Km)BXMe#Oe>Q0o0?lLPo*=hSFFBr%~e-lbM1B4yPMr% z_mI2a?Q^@`1MWe0&^_!9xX0Y1uET9`H@aKges_~Q5rw z{`yw8$35bnaxb_i+?McQ_(J$f_-NP>z7!q~_k<6JFXq~}vGwB?gqEc ztqmW_we8KdZOOH5&$ZnX-XA`Y%WlqPv$^b{T(%>Z-IdF(&1Da}y>5N3ZD+16n`^@n z`*Ur(b8VY*Z5`o0_qf~aHo05f#@xCNce}g8-I>eo$YpQKwQtO|ZwU80WNY0vcc06; zt?p^p7C!A>cK5oS?rwLNd&%7sJ{BGd9|@nxt=%5J96l31=$;Lq3m*>;gwKZ0hfjr1 z=Gu3MyOS6pNphT$c|<-@Kok;1L>Hnf(Tyl3x)UWt527d0i|9@CA^H;ii2lR?VjwYy z7)+EBLx^LDGU8ZbC~+K7P7EW46UP%H2o#tkM-nFz6~sxzDB@&dG;sNmAHafOCaxi_C9Wf`2P#-OSZDCD#+vK! z7{fAT)8%cp-j{D#N-@?+w4P{;UzVs%8f-e5SyO9xP>oh3sdy9on}vDw$qWye(ZgVC zi^VgESTRq-3TMT<4exT*7d?Va@ef^7`E5xL2JyI5P};S$ptPVYzpSuZj{#UOba`L@ UcP}b>QwsCn*M0E*t^l_FA0pv`_W%F@ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp860.py b/PythonEnv/2.7/Lib/encodings/cp860.py new file mode 100644 index 0000000000..4acb0cf362 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp860.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP860.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp860', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x008c: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x008f: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x0092: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x0099: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0x0084 -> LATIN SMALL LETTER A WITH TILDE + u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + u'\xc1' # 0x0086 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xca' # 0x0089 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + u'\xcd' # 0x008b -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xd4' # 0x008c -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + u'\xc3' # 0x008e -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc2' # 0x008f -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xc0' # 0x0091 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc8' # 0x0092 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0x0094 -> LATIN SMALL LETTER O WITH TILDE + u'\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + u'\xda' # 0x0096 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + u'\xcc' # 0x0098 -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xd5' # 0x0099 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xa2' # 0x009b -> CENT SIGN + u'\xa3' # 0x009c -> POUND SIGN + u'\xd9' # 0x009d -> LATIN CAPITAL LETTER U WITH GRAVE + u'\u20a7' # 0x009e -> PESETA SIGN + u'\xd3' # 0x009f -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK + u'\xd2' # 0x00a9 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + u'\u221e' # 0x00ec -> INFINITY + u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + u'\u2229' # 0x00ef -> INTERSECTION + u'\u2261' # 0x00f0 -> IDENTICAL TO + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL + u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\u2248' # 0x00f7 -> ALMOST EQUAL TO + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\u221a' # 0x00fb -> SQUARE ROOT + u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x0091, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x0086, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x008f, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x008e, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x0092, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x0089, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cc: 0x0098, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x008b, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00a9, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x009f, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x008c, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x0099, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d9: 0x009d, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x0096, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x0084, # LATIN SMALL LETTER A WITH TILDE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x0094, # LATIN SMALL LETTER O WITH TILDE + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/PythonEnv/2.7/Lib/encodings/cp860.pyc b/PythonEnv/2.7/Lib/encodings/cp860.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5926696a1aeff9f8e7b7557911c9e39f250b55a GIT binary patch literal 8022 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 TH}_p>mi@6FgO7Iy@aq2y_uaGB literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp861.py b/PythonEnv/2.7/Lib/encodings/cp861.py new file mode 100644 index 0000000000..0939b5b1ee --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp861.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP861.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp861', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00d0, # LATIN CAPITAL LETTER ETH + 0x008c: 0x00f0, # LATIN SMALL LETTER ETH + 0x008d: 0x00de, # LATIN CAPITAL LETTER THORN + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00fe, # LATIN SMALL LETTER THORN + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x0098: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00a5: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00a6: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00a7: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + u'\xd0' # 0x008b -> LATIN CAPITAL LETTER ETH + u'\xf0' # 0x008c -> LATIN SMALL LETTER ETH + u'\xde' # 0x008d -> LATIN CAPITAL LETTER THORN + u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xfe' # 0x0095 -> LATIN SMALL LETTER THORN + u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xdd' # 0x0097 -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xfd' # 0x0098 -> LATIN SMALL LETTER Y WITH ACUTE + u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + u'\xa3' # 0x009c -> POUND SIGN + u'\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + u'\u20a7' # 0x009e -> PESETA SIGN + u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xc1' # 0x00a4 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xcd' # 0x00a5 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xd3' # 0x00a6 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xda' # 0x00a7 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK + u'\u2310' # 0x00a9 -> REVERSED NOT SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + u'\u221e' # 0x00ec -> INFINITY + u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + u'\u2229' # 0x00ef -> INTERSECTION + u'\u2261' # 0x00f0 -> IDENTICAL TO + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL + u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\u2248' # 0x00f7 -> ALMOST EQUAL TO + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\u221a' # 0x00fb -> SQUARE ROOT + u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a3: 0x009c, # POUND SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c1: 0x00a4, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00cd: 0x00a5, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d0: 0x008b, # LATIN CAPITAL LETTER ETH + 0x00d3: 0x00a6, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00da: 0x00a7, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x0097, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00de: 0x008d, # LATIN CAPITAL LETTER THORN + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00f0: 0x008c, # LATIN SMALL LETTER ETH + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x0098, # LATIN SMALL LETTER Y WITH ACUTE + 0x00fe: 0x0095, # LATIN SMALL LETTER THORN + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/PythonEnv/2.7/Lib/encodings/cp861.pyc b/PythonEnv/2.7/Lib/encodings/cp861.pyc new file mode 100644 index 0000000000000000000000000000000000000000..deb08451765929f03379e1c81288f198dc6eff15 GIT binary patch literal 8033 zcmd^@cX(B0w#L_&gaDye2_l9f1Voy+Ktx0W2q*zhsG)?Abpi*{JUNJ15m3QFhmsQ! z5kZ<1XF$OUmTb$+IEHbYaeCX+dvSX6zVEjO;&|^Lj`w-){loB{-@EqSoU*^Y_WOP3 zWWL)bXYIW!rjw;TPc#bS@C5bg+?Zn!PS_iR?uufu~VO_+!!p;-x2Fn%e4m)402kZi| zp0EqW@?gEhdc*pN^@Uv|)(_TSEFU&NY#{7nu|cp)#0JBLhz*4e6B`b@RBQz7GBJgX z6dMJ*Tx>M#3b8S;E5*jbt`ZvuyIO2KtUzo6Y@*mC*fnC4VN=AW!mbs&4mM4!5H?+G z2JCvV7_3NaCTy1AIcl@T=D_BP&4U$-&4(=zTL@buRsvfrRtj4pRt7V%IILW-L-B&P z6c!g-21|%7hpiB+fK`fB!K%e-U^j>*VYOl@*h;Y*VXMS$f~^+28Fq`^|82g27k&q+syX zHVcMZZ40lt+E%e`usXpNQA>-}!yXXZ4tr2+2kari(5UScdl=D>*!Btk4=e!=Le9S}PRdra&Q?6BZ!sT~nJ3VU2|ebhcB_G#EL!8ofO7kdKsq~L<8oe*4X zwUdI*QF}`4Y1lJ@{!^5=l4{QidQKpkdVlu~%TP3fe;LHL=%WpAq{k>~n(lRa`uK1NM2bH(`x}&QUuf=v1{Y zh`j~-qM%{b-WF7fi;iwo`;yp~VK)nUOzj;(7pr|maDOQ}0bQ*2RY8XsH0-xEkJ6iDs+0;&B#AhjO~r1m3$)P5|G z+D`;h`>8-`KNCpp=K`tyLLjwY3Z(Wcfz*C2klJqqQv0nyYQGam?OlP?elL*P9|ThS zqd;nZ5=iaO0;&B)Aho{=r1m#~)c!7z+CKzR`=>x^?+K)aQ4pu*9Hf@vAhk>fsbx7x zt(k+=vK^$>+(BwB9HiFLL25Y;QfuWPwbl+&YvUlbwhmHj=ODHA4nqDpNUfuT5Q7d< z>+B$;p@Y=AItZcYAhm7|LN+=`t-FH|kq%Pp;UFZXgVcID2!ZJ!wLAwQHyxzb+d+s= z2dVXS5K`1ZYW*C9Fm;exzJrjd4pJNFAVjN!)CM^S3F{!W!45*uI!JA(gOIllQXB3d z#IA$XMmPxR>mW6C5JK2NYNH&4EOwCEXa^yZ9i%qKK}co?sf~3I0@^`p;~a#Xc97b5 z2O+Kz*z+d*oR9fS;bklIuSA<7-3cAbNe=nhgVbP$5wLAZ?^gnV}p zBH2NRc?YS@bP&?sK}dTCsm*Z^Lf=7Z^BjcicaY+S^pnNXXtJ0b%@WI^&@YQZe`1vH zZ$$ZiRg~|;qC}q+Mfvh5wJ~Qfwc}B0mqc+rC(7wTQ8EvXl6gdw%mW#8bdO+3ponFJvtL!b1A9d<3n&sFx$mR=ZCHOn{QE^hBkWB<{41t^ECT!z zXU~2bEhGVcrf=O919b-~fOmmp*6!S1?0%MW?a8+*$>+$n9~(Y z11u2yN@X3aT(EfX%dE|?c7oYoF}Gue_w(gS*iC|!h+@@&wTEI-$JDNv)G@Uy76Vuk zDCT|4{(g108&)q^F8I~f#7F9RHpM{OPu$2!_^m5(L7q@+EiQY zEyEdCme!O+A2-z+yL^drFTwukIeh)vctyECfkai!%9Q^U@no_(S(}f8;!)chRl(>5 z(O?cAxu7DkWWm{2t6fl5!y&3!9X;0%55Ck$EyqCIM>&}opZag7ff2{3`(3`|X{1V* zRK)#>#CQQ>9Kcv};G=!==q)&Q|N7+l9G+AQproX#v@%{&lFIQLmDRSg0-G@&i}75W z-qBYda=>DErnJPPmhY6E(K<8L5yh0MvShq6UX?1XnCM3{S%$s-kK-~PkJ`>a)K>U% zXVTP4?1=w9W><8~4N8^z#4F$nr9FIQt&i?t|kx!MD@@&$#k} zN8`$F`oOrx+HoHq|IwZ2d$22>^gj=2tUV6>Z~BxY+2!oZV>EfOic-mVY2}<`0;zhg zKiPf0KY5L#{zSZ?7T;q{SGnmFef42mhi#LKhdQ^P+sVN@0q(AM?lG z89r>Ag2y*@qA4(RNSyRc?y|7u!eihf!WxLk+m+k-I>#a!QbsWI2 zPQc%ZJBgnXYl)D+7)#;@#Cqbp#9hP>iMxp(6Za55BQ_8}CpHp4A?_ug(ZsM239^zf%QR1(}%fvq7O=3UsHgSOX zI&qMAk$8+~-v>Cv>L_uTI87WOP7#k2pCXkN2ldP7odWzL-R!_5<#p)SWWvrfMbv>)+Sj}OzkXS&>Ctl!z_N+P+FL84Ot3gBq zH+!%OSP82!#3G`EC?-C`qcd40h|h7eoYfnw7PI<1s~M~+h(>NMWp#$tGFJFiOcHN# zGtTOZtmd(rOMHo&F;-t@Rm5rq@fB_^XVs1P8aG?B+CY4Ro9kI^A~q9ii0|;g@l0SF z@e=WU?%T^MAYLI35Zj4E#0jEjZ{QdF&#!UwB=IY54&Z@bvnplvTUK#azhi~pc_oq8 z2k1rof&2bMOy+@H;xF9n&gzalU^hSMd)T+~1vId@jLfWN+09$D%xTrSP1|`3n{q zS({pU$isW+rqlFVcotky(dgR8m8;RbUIA$4bxk~^aEk~;V`{3Og|LX zZ4T?|!nzY--O;daXIQr;tUDE^cZKOk!t{4RbVu`rF7 z-5;hO4Aa}g^wu!FEleK?(}%;l?P1-fuzo{Wzdo!-u{o??(|A01q;cDsHH~}EtZO)V zW_{y<#_f%V8c&29cAdGq@npE+P`GhV!|`zA{&3^IaMSK^)1KhzaN~xCW8sDe8=ej~ z>niPKU4}1jY(t*9yl*knk(+F#82iMpqAE*Q#7h!}#YrNyy2SAH+^@rurBzt9 zurbelAH~;d{}p&;jo~MSSPox?9nOw-nR1q literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp862.py b/PythonEnv/2.7/Lib/encodings/cp862.py new file mode 100644 index 0000000000..ea0405ca1b --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp862.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP862.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp862', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x05d0, # HEBREW LETTER ALEF + 0x0081: 0x05d1, # HEBREW LETTER BET + 0x0082: 0x05d2, # HEBREW LETTER GIMEL + 0x0083: 0x05d3, # HEBREW LETTER DALET + 0x0084: 0x05d4, # HEBREW LETTER HE + 0x0085: 0x05d5, # HEBREW LETTER VAV + 0x0086: 0x05d6, # HEBREW LETTER ZAYIN + 0x0087: 0x05d7, # HEBREW LETTER HET + 0x0088: 0x05d8, # HEBREW LETTER TET + 0x0089: 0x05d9, # HEBREW LETTER YOD + 0x008a: 0x05da, # HEBREW LETTER FINAL KAF + 0x008b: 0x05db, # HEBREW LETTER KAF + 0x008c: 0x05dc, # HEBREW LETTER LAMED + 0x008d: 0x05dd, # HEBREW LETTER FINAL MEM + 0x008e: 0x05de, # HEBREW LETTER MEM + 0x008f: 0x05df, # HEBREW LETTER FINAL NUN + 0x0090: 0x05e0, # HEBREW LETTER NUN + 0x0091: 0x05e1, # HEBREW LETTER SAMEKH + 0x0092: 0x05e2, # HEBREW LETTER AYIN + 0x0093: 0x05e3, # HEBREW LETTER FINAL PE + 0x0094: 0x05e4, # HEBREW LETTER PE + 0x0095: 0x05e5, # HEBREW LETTER FINAL TSADI + 0x0096: 0x05e6, # HEBREW LETTER TSADI + 0x0097: 0x05e7, # HEBREW LETTER QOF + 0x0098: 0x05e8, # HEBREW LETTER RESH + 0x0099: 0x05e9, # HEBREW LETTER SHIN + 0x009a: 0x05ea, # HEBREW LETTER TAV + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00a5, # YEN SIGN + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\u05d0' # 0x0080 -> HEBREW LETTER ALEF + u'\u05d1' # 0x0081 -> HEBREW LETTER BET + u'\u05d2' # 0x0082 -> HEBREW LETTER GIMEL + u'\u05d3' # 0x0083 -> HEBREW LETTER DALET + u'\u05d4' # 0x0084 -> HEBREW LETTER HE + u'\u05d5' # 0x0085 -> HEBREW LETTER VAV + u'\u05d6' # 0x0086 -> HEBREW LETTER ZAYIN + u'\u05d7' # 0x0087 -> HEBREW LETTER HET + u'\u05d8' # 0x0088 -> HEBREW LETTER TET + u'\u05d9' # 0x0089 -> HEBREW LETTER YOD + u'\u05da' # 0x008a -> HEBREW LETTER FINAL KAF + u'\u05db' # 0x008b -> HEBREW LETTER KAF + u'\u05dc' # 0x008c -> HEBREW LETTER LAMED + u'\u05dd' # 0x008d -> HEBREW LETTER FINAL MEM + u'\u05de' # 0x008e -> HEBREW LETTER MEM + u'\u05df' # 0x008f -> HEBREW LETTER FINAL NUN + u'\u05e0' # 0x0090 -> HEBREW LETTER NUN + u'\u05e1' # 0x0091 -> HEBREW LETTER SAMEKH + u'\u05e2' # 0x0092 -> HEBREW LETTER AYIN + u'\u05e3' # 0x0093 -> HEBREW LETTER FINAL PE + u'\u05e4' # 0x0094 -> HEBREW LETTER PE + u'\u05e5' # 0x0095 -> HEBREW LETTER FINAL TSADI + u'\u05e6' # 0x0096 -> HEBREW LETTER TSADI + u'\u05e7' # 0x0097 -> HEBREW LETTER QOF + u'\u05e8' # 0x0098 -> HEBREW LETTER RESH + u'\u05e9' # 0x0099 -> HEBREW LETTER SHIN + u'\u05ea' # 0x009a -> HEBREW LETTER TAV + u'\xa2' # 0x009b -> CENT SIGN + u'\xa3' # 0x009c -> POUND SIGN + u'\xa5' # 0x009d -> YEN SIGN + u'\u20a7' # 0x009e -> PESETA SIGN + u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK + u'\u2310' # 0x00a9 -> REVERSED NOT SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S (GERMAN) + u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + u'\u221e' # 0x00ec -> INFINITY + u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + u'\u2229' # 0x00ef -> INTERSECTION + u'\u2261' # 0x00f0 -> IDENTICAL TO + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL + u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\u2248' # 0x00f7 -> ALMOST EQUAL TO + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\u221a' # 0x00fb -> SQUARE ROOT + u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a5: 0x009d, # YEN SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x05d0: 0x0080, # HEBREW LETTER ALEF + 0x05d1: 0x0081, # HEBREW LETTER BET + 0x05d2: 0x0082, # HEBREW LETTER GIMEL + 0x05d3: 0x0083, # HEBREW LETTER DALET + 0x05d4: 0x0084, # HEBREW LETTER HE + 0x05d5: 0x0085, # HEBREW LETTER VAV + 0x05d6: 0x0086, # HEBREW LETTER ZAYIN + 0x05d7: 0x0087, # HEBREW LETTER HET + 0x05d8: 0x0088, # HEBREW LETTER TET + 0x05d9: 0x0089, # HEBREW LETTER YOD + 0x05da: 0x008a, # HEBREW LETTER FINAL KAF + 0x05db: 0x008b, # HEBREW LETTER KAF + 0x05dc: 0x008c, # HEBREW LETTER LAMED + 0x05dd: 0x008d, # HEBREW LETTER FINAL MEM + 0x05de: 0x008e, # HEBREW LETTER MEM + 0x05df: 0x008f, # HEBREW LETTER FINAL NUN + 0x05e0: 0x0090, # HEBREW LETTER NUN + 0x05e1: 0x0091, # HEBREW LETTER SAMEKH + 0x05e2: 0x0092, # HEBREW LETTER AYIN + 0x05e3: 0x0093, # HEBREW LETTER FINAL PE + 0x05e4: 0x0094, # HEBREW LETTER PE + 0x05e5: 0x0095, # HEBREW LETTER FINAL TSADI + 0x05e6: 0x0096, # HEBREW LETTER TSADI + 0x05e7: 0x0097, # HEBREW LETTER QOF + 0x05e8: 0x0098, # HEBREW LETTER RESH + 0x05e9: 0x0099, # HEBREW LETTER SHIN + 0x05ea: 0x009a, # HEBREW LETTER TAV + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/PythonEnv/2.7/Lib/encodings/cp862.pyc b/PythonEnv/2.7/Lib/encodings/cp862.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2627262e5c835fdd85d14517e926d069d2a49990 GIT binary patch literal 8168 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 NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xc2' # 0x0084 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + u'\xb6' # 0x0086 -> PILCROW SIGN + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + u'\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\u2017' # 0x008d -> DOUBLE LOW LINE + u'\xc0' # 0x008e -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xa7' # 0x008f -> SECTION SIGN + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xc8' # 0x0091 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xca' # 0x0092 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xcb' # 0x0094 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcf' # 0x0095 -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + u'\xa4' # 0x0098 -> CURRENCY SIGN + u'\xd4' # 0x0099 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xa2' # 0x009b -> CENT SIGN + u'\xa3' # 0x009c -> POUND SIGN + u'\xd9' # 0x009d -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xdb' # 0x009e -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + u'\xa6' # 0x00a0 -> BROKEN BAR + u'\xb4' # 0x00a1 -> ACUTE ACCENT + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xa8' # 0x00a4 -> DIAERESIS + u'\xb8' # 0x00a5 -> CEDILLA + u'\xb3' # 0x00a6 -> SUPERSCRIPT THREE + u'\xaf' # 0x00a7 -> MACRON + u'\xce' # 0x00a8 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\u2310' # 0x00a9 -> REVERSED NOT SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xbe' # 0x00ad -> VULGAR FRACTION THREE QUARTERS + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + u'\u221e' # 0x00ec -> INFINITY + u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + u'\u2229' # 0x00ef -> INTERSECTION + u'\u2261' # 0x00f0 -> IDENTICAL TO + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL + u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\u2248' # 0x00f7 -> ALMOST EQUAL TO + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\u221a' # 0x00fb -> SQUARE ROOT + u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x0098, # CURRENCY SIGN + 0x00a6: 0x00a0, # BROKEN BAR + 0x00a7: 0x008f, # SECTION SIGN + 0x00a8: 0x00a4, # DIAERESIS + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00af: 0x00a7, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00a6, # SUPERSCRIPT THREE + 0x00b4: 0x00a1, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x0086, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00a5, # CEDILLA + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00ad, # VULGAR FRACTION THREE QUARTERS + 0x00c0: 0x008e, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c2: 0x0084, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x0091, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x0092, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x0094, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00ce: 0x00a8, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x0095, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d4: 0x0099, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d9: 0x009d, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00db: 0x009e, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x2017: 0x008d, # DOUBLE LOW LINE + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/PythonEnv/2.7/Lib/encodings/cp863.pyc b/PythonEnv/2.7/Lib/encodings/cp863.pyc new file mode 100644 index 0000000000000000000000000000000000000000..521bfc2c12883d160541eeaaaf7c61edae7cad7a GIT binary patch literal 8033 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp864.py b/PythonEnv/2.7/Lib/encodings/cp864.py new file mode 100644 index 0000000000..02a0e733a8 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp864.py @@ -0,0 +1,690 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP864.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp864', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0025: 0x066a, # ARABIC PERCENT SIGN + 0x0080: 0x00b0, # DEGREE SIGN + 0x0081: 0x00b7, # MIDDLE DOT + 0x0082: 0x2219, # BULLET OPERATOR + 0x0083: 0x221a, # SQUARE ROOT + 0x0084: 0x2592, # MEDIUM SHADE + 0x0085: 0x2500, # FORMS LIGHT HORIZONTAL + 0x0086: 0x2502, # FORMS LIGHT VERTICAL + 0x0087: 0x253c, # FORMS LIGHT VERTICAL AND HORIZONTAL + 0x0088: 0x2524, # FORMS LIGHT VERTICAL AND LEFT + 0x0089: 0x252c, # FORMS LIGHT DOWN AND HORIZONTAL + 0x008a: 0x251c, # FORMS LIGHT VERTICAL AND RIGHT + 0x008b: 0x2534, # FORMS LIGHT UP AND HORIZONTAL + 0x008c: 0x2510, # FORMS LIGHT DOWN AND LEFT + 0x008d: 0x250c, # FORMS LIGHT DOWN AND RIGHT + 0x008e: 0x2514, # FORMS LIGHT UP AND RIGHT + 0x008f: 0x2518, # FORMS LIGHT UP AND LEFT + 0x0090: 0x03b2, # GREEK SMALL BETA + 0x0091: 0x221e, # INFINITY + 0x0092: 0x03c6, # GREEK SMALL PHI + 0x0093: 0x00b1, # PLUS-OR-MINUS SIGN + 0x0094: 0x00bd, # FRACTION 1/2 + 0x0095: 0x00bc, # FRACTION 1/4 + 0x0096: 0x2248, # ALMOST EQUAL TO + 0x0097: 0x00ab, # LEFT POINTING GUILLEMET + 0x0098: 0x00bb, # RIGHT POINTING GUILLEMET + 0x0099: 0xfef7, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + 0x009a: 0xfef8, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + 0x009b: None, # UNDEFINED + 0x009c: None, # UNDEFINED + 0x009d: 0xfefb, # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + 0x009e: 0xfefc, # ARABIC LIGATURE LAM WITH ALEF FINAL FORM + 0x009f: None, # UNDEFINED + 0x00a1: 0x00ad, # SOFT HYPHEN + 0x00a2: 0xfe82, # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + 0x00a5: 0xfe84, # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + 0x00a6: None, # UNDEFINED + 0x00a7: None, # UNDEFINED + 0x00a8: 0xfe8e, # ARABIC LETTER ALEF FINAL FORM + 0x00a9: 0xfe8f, # ARABIC LETTER BEH ISOLATED FORM + 0x00aa: 0xfe95, # ARABIC LETTER TEH ISOLATED FORM + 0x00ab: 0xfe99, # ARABIC LETTER THEH ISOLATED FORM + 0x00ac: 0x060c, # ARABIC COMMA + 0x00ad: 0xfe9d, # ARABIC LETTER JEEM ISOLATED FORM + 0x00ae: 0xfea1, # ARABIC LETTER HAH ISOLATED FORM + 0x00af: 0xfea5, # ARABIC LETTER KHAH ISOLATED FORM + 0x00b0: 0x0660, # ARABIC-INDIC DIGIT ZERO + 0x00b1: 0x0661, # ARABIC-INDIC DIGIT ONE + 0x00b2: 0x0662, # ARABIC-INDIC DIGIT TWO + 0x00b3: 0x0663, # ARABIC-INDIC DIGIT THREE + 0x00b4: 0x0664, # ARABIC-INDIC DIGIT FOUR + 0x00b5: 0x0665, # ARABIC-INDIC DIGIT FIVE + 0x00b6: 0x0666, # ARABIC-INDIC DIGIT SIX + 0x00b7: 0x0667, # ARABIC-INDIC DIGIT SEVEN + 0x00b8: 0x0668, # ARABIC-INDIC DIGIT EIGHT + 0x00b9: 0x0669, # ARABIC-INDIC DIGIT NINE + 0x00ba: 0xfed1, # ARABIC LETTER FEH ISOLATED FORM + 0x00bb: 0x061b, # ARABIC SEMICOLON + 0x00bc: 0xfeb1, # ARABIC LETTER SEEN ISOLATED FORM + 0x00bd: 0xfeb5, # ARABIC LETTER SHEEN ISOLATED FORM + 0x00be: 0xfeb9, # ARABIC LETTER SAD ISOLATED FORM + 0x00bf: 0x061f, # ARABIC QUESTION MARK + 0x00c0: 0x00a2, # CENT SIGN + 0x00c1: 0xfe80, # ARABIC LETTER HAMZA ISOLATED FORM + 0x00c2: 0xfe81, # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + 0x00c3: 0xfe83, # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + 0x00c4: 0xfe85, # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + 0x00c5: 0xfeca, # ARABIC LETTER AIN FINAL FORM + 0x00c6: 0xfe8b, # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + 0x00c7: 0xfe8d, # ARABIC LETTER ALEF ISOLATED FORM + 0x00c8: 0xfe91, # ARABIC LETTER BEH INITIAL FORM + 0x00c9: 0xfe93, # ARABIC LETTER TEH MARBUTA ISOLATED FORM + 0x00ca: 0xfe97, # ARABIC LETTER TEH INITIAL FORM + 0x00cb: 0xfe9b, # ARABIC LETTER THEH INITIAL FORM + 0x00cc: 0xfe9f, # ARABIC LETTER JEEM INITIAL FORM + 0x00cd: 0xfea3, # ARABIC LETTER HAH INITIAL FORM + 0x00ce: 0xfea7, # ARABIC LETTER KHAH INITIAL FORM + 0x00cf: 0xfea9, # ARABIC LETTER DAL ISOLATED FORM + 0x00d0: 0xfeab, # ARABIC LETTER THAL ISOLATED FORM + 0x00d1: 0xfead, # ARABIC LETTER REH ISOLATED FORM + 0x00d2: 0xfeaf, # ARABIC LETTER ZAIN ISOLATED FORM + 0x00d3: 0xfeb3, # ARABIC LETTER SEEN INITIAL FORM + 0x00d4: 0xfeb7, # ARABIC LETTER SHEEN INITIAL FORM + 0x00d5: 0xfebb, # ARABIC LETTER SAD INITIAL FORM + 0x00d6: 0xfebf, # ARABIC LETTER DAD INITIAL FORM + 0x00d7: 0xfec1, # ARABIC LETTER TAH ISOLATED FORM + 0x00d8: 0xfec5, # ARABIC LETTER ZAH ISOLATED FORM + 0x00d9: 0xfecb, # ARABIC LETTER AIN INITIAL FORM + 0x00da: 0xfecf, # ARABIC LETTER GHAIN INITIAL FORM + 0x00db: 0x00a6, # BROKEN VERTICAL BAR + 0x00dc: 0x00ac, # NOT SIGN + 0x00dd: 0x00f7, # DIVISION SIGN + 0x00de: 0x00d7, # MULTIPLICATION SIGN + 0x00df: 0xfec9, # ARABIC LETTER AIN ISOLATED FORM + 0x00e0: 0x0640, # ARABIC TATWEEL + 0x00e1: 0xfed3, # ARABIC LETTER FEH INITIAL FORM + 0x00e2: 0xfed7, # ARABIC LETTER QAF INITIAL FORM + 0x00e3: 0xfedb, # ARABIC LETTER KAF INITIAL FORM + 0x00e4: 0xfedf, # ARABIC LETTER LAM INITIAL FORM + 0x00e5: 0xfee3, # ARABIC LETTER MEEM INITIAL FORM + 0x00e6: 0xfee7, # ARABIC LETTER NOON INITIAL FORM + 0x00e7: 0xfeeb, # ARABIC LETTER HEH INITIAL FORM + 0x00e8: 0xfeed, # ARABIC LETTER WAW ISOLATED FORM + 0x00e9: 0xfeef, # ARABIC LETTER ALEF MAKSURA ISOLATED FORM + 0x00ea: 0xfef3, # ARABIC LETTER YEH INITIAL FORM + 0x00eb: 0xfebd, # ARABIC LETTER DAD ISOLATED FORM + 0x00ec: 0xfecc, # ARABIC LETTER AIN MEDIAL FORM + 0x00ed: 0xfece, # ARABIC LETTER GHAIN FINAL FORM + 0x00ee: 0xfecd, # ARABIC LETTER GHAIN ISOLATED FORM + 0x00ef: 0xfee1, # ARABIC LETTER MEEM ISOLATED FORM + 0x00f0: 0xfe7d, # ARABIC SHADDA MEDIAL FORM + 0x00f1: 0x0651, # ARABIC SHADDAH + 0x00f2: 0xfee5, # ARABIC LETTER NOON ISOLATED FORM + 0x00f3: 0xfee9, # ARABIC LETTER HEH ISOLATED FORM + 0x00f4: 0xfeec, # ARABIC LETTER HEH MEDIAL FORM + 0x00f5: 0xfef0, # ARABIC LETTER ALEF MAKSURA FINAL FORM + 0x00f6: 0xfef2, # ARABIC LETTER YEH FINAL FORM + 0x00f7: 0xfed0, # ARABIC LETTER GHAIN MEDIAL FORM + 0x00f8: 0xfed5, # ARABIC LETTER QAF ISOLATED FORM + 0x00f9: 0xfef5, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + 0x00fa: 0xfef6, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + 0x00fb: 0xfedd, # ARABIC LETTER LAM ISOLATED FORM + 0x00fc: 0xfed9, # ARABIC LETTER KAF ISOLATED FORM + 0x00fd: 0xfef1, # ARABIC LETTER YEH ISOLATED FORM + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: None, # UNDEFINED +}) + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'\u066a' # 0x0025 -> ARABIC PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xb0' # 0x0080 -> DEGREE SIGN + u'\xb7' # 0x0081 -> MIDDLE DOT + u'\u2219' # 0x0082 -> BULLET OPERATOR + u'\u221a' # 0x0083 -> SQUARE ROOT + u'\u2592' # 0x0084 -> MEDIUM SHADE + u'\u2500' # 0x0085 -> FORMS LIGHT HORIZONTAL + u'\u2502' # 0x0086 -> FORMS LIGHT VERTICAL + u'\u253c' # 0x0087 -> FORMS LIGHT VERTICAL AND HORIZONTAL + u'\u2524' # 0x0088 -> FORMS LIGHT VERTICAL AND LEFT + u'\u252c' # 0x0089 -> FORMS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x008a -> FORMS LIGHT VERTICAL AND RIGHT + u'\u2534' # 0x008b -> FORMS LIGHT UP AND HORIZONTAL + u'\u2510' # 0x008c -> FORMS LIGHT DOWN AND LEFT + u'\u250c' # 0x008d -> FORMS LIGHT DOWN AND RIGHT + u'\u2514' # 0x008e -> FORMS LIGHT UP AND RIGHT + u'\u2518' # 0x008f -> FORMS LIGHT UP AND LEFT + u'\u03b2' # 0x0090 -> GREEK SMALL BETA + u'\u221e' # 0x0091 -> INFINITY + u'\u03c6' # 0x0092 -> GREEK SMALL PHI + u'\xb1' # 0x0093 -> PLUS-OR-MINUS SIGN + u'\xbd' # 0x0094 -> FRACTION 1/2 + u'\xbc' # 0x0095 -> FRACTION 1/4 + u'\u2248' # 0x0096 -> ALMOST EQUAL TO + u'\xab' # 0x0097 -> LEFT POINTING GUILLEMET + u'\xbb' # 0x0098 -> RIGHT POINTING GUILLEMET + u'\ufef7' # 0x0099 -> ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + u'\ufef8' # 0x009a -> ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + u'\ufffe' # 0x009b -> UNDEFINED + u'\ufffe' # 0x009c -> UNDEFINED + u'\ufefb' # 0x009d -> ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + u'\ufefc' # 0x009e -> ARABIC LIGATURE LAM WITH ALEF FINAL FORM + u'\ufffe' # 0x009f -> UNDEFINED + u'\xa0' # 0x00a0 -> NON-BREAKING SPACE + u'\xad' # 0x00a1 -> SOFT HYPHEN + u'\ufe82' # 0x00a2 -> ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + u'\xa3' # 0x00a3 -> POUND SIGN + u'\xa4' # 0x00a4 -> CURRENCY SIGN + u'\ufe84' # 0x00a5 -> ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + u'\ufffe' # 0x00a6 -> UNDEFINED + u'\ufffe' # 0x00a7 -> UNDEFINED + u'\ufe8e' # 0x00a8 -> ARABIC LETTER ALEF FINAL FORM + u'\ufe8f' # 0x00a9 -> ARABIC LETTER BEH ISOLATED FORM + u'\ufe95' # 0x00aa -> ARABIC LETTER TEH ISOLATED FORM + u'\ufe99' # 0x00ab -> ARABIC LETTER THEH ISOLATED FORM + u'\u060c' # 0x00ac -> ARABIC COMMA + u'\ufe9d' # 0x00ad -> ARABIC LETTER JEEM ISOLATED FORM + u'\ufea1' # 0x00ae -> ARABIC LETTER HAH ISOLATED FORM + u'\ufea5' # 0x00af -> ARABIC LETTER KHAH ISOLATED FORM + u'\u0660' # 0x00b0 -> ARABIC-INDIC DIGIT ZERO + u'\u0661' # 0x00b1 -> ARABIC-INDIC DIGIT ONE + u'\u0662' # 0x00b2 -> ARABIC-INDIC DIGIT TWO + u'\u0663' # 0x00b3 -> ARABIC-INDIC DIGIT THREE + u'\u0664' # 0x00b4 -> ARABIC-INDIC DIGIT FOUR + u'\u0665' # 0x00b5 -> ARABIC-INDIC DIGIT FIVE + u'\u0666' # 0x00b6 -> ARABIC-INDIC DIGIT SIX + u'\u0667' # 0x00b7 -> ARABIC-INDIC DIGIT SEVEN + u'\u0668' # 0x00b8 -> ARABIC-INDIC DIGIT EIGHT + u'\u0669' # 0x00b9 -> ARABIC-INDIC DIGIT NINE + u'\ufed1' # 0x00ba -> ARABIC LETTER FEH ISOLATED FORM + u'\u061b' # 0x00bb -> ARABIC SEMICOLON + u'\ufeb1' # 0x00bc -> ARABIC LETTER SEEN ISOLATED FORM + u'\ufeb5' # 0x00bd -> ARABIC LETTER SHEEN ISOLATED FORM + u'\ufeb9' # 0x00be -> ARABIC LETTER SAD ISOLATED FORM + u'\u061f' # 0x00bf -> ARABIC QUESTION MARK + u'\xa2' # 0x00c0 -> CENT SIGN + u'\ufe80' # 0x00c1 -> ARABIC LETTER HAMZA ISOLATED FORM + u'\ufe81' # 0x00c2 -> ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + u'\ufe83' # 0x00c3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + u'\ufe85' # 0x00c4 -> ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + u'\ufeca' # 0x00c5 -> ARABIC LETTER AIN FINAL FORM + u'\ufe8b' # 0x00c6 -> ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + u'\ufe8d' # 0x00c7 -> ARABIC LETTER ALEF ISOLATED FORM + u'\ufe91' # 0x00c8 -> ARABIC LETTER BEH INITIAL FORM + u'\ufe93' # 0x00c9 -> ARABIC LETTER TEH MARBUTA ISOLATED FORM + u'\ufe97' # 0x00ca -> ARABIC LETTER TEH INITIAL FORM + u'\ufe9b' # 0x00cb -> ARABIC LETTER THEH INITIAL FORM + u'\ufe9f' # 0x00cc -> ARABIC LETTER JEEM INITIAL FORM + u'\ufea3' # 0x00cd -> ARABIC LETTER HAH INITIAL FORM + u'\ufea7' # 0x00ce -> ARABIC LETTER KHAH INITIAL FORM + u'\ufea9' # 0x00cf -> ARABIC LETTER DAL ISOLATED FORM + u'\ufeab' # 0x00d0 -> ARABIC LETTER THAL ISOLATED FORM + u'\ufead' # 0x00d1 -> ARABIC LETTER REH ISOLATED FORM + u'\ufeaf' # 0x00d2 -> ARABIC LETTER ZAIN ISOLATED FORM + u'\ufeb3' # 0x00d3 -> ARABIC LETTER SEEN INITIAL FORM + u'\ufeb7' # 0x00d4 -> ARABIC LETTER SHEEN INITIAL FORM + u'\ufebb' # 0x00d5 -> ARABIC LETTER SAD INITIAL FORM + u'\ufebf' # 0x00d6 -> ARABIC LETTER DAD INITIAL FORM + u'\ufec1' # 0x00d7 -> ARABIC LETTER TAH ISOLATED FORM + u'\ufec5' # 0x00d8 -> ARABIC LETTER ZAH ISOLATED FORM + u'\ufecb' # 0x00d9 -> ARABIC LETTER AIN INITIAL FORM + u'\ufecf' # 0x00da -> ARABIC LETTER GHAIN INITIAL FORM + u'\xa6' # 0x00db -> BROKEN VERTICAL BAR + u'\xac' # 0x00dc -> NOT SIGN + u'\xf7' # 0x00dd -> DIVISION SIGN + u'\xd7' # 0x00de -> MULTIPLICATION SIGN + u'\ufec9' # 0x00df -> ARABIC LETTER AIN ISOLATED FORM + u'\u0640' # 0x00e0 -> ARABIC TATWEEL + u'\ufed3' # 0x00e1 -> ARABIC LETTER FEH INITIAL FORM + u'\ufed7' # 0x00e2 -> ARABIC LETTER QAF INITIAL FORM + u'\ufedb' # 0x00e3 -> ARABIC LETTER KAF INITIAL FORM + u'\ufedf' # 0x00e4 -> ARABIC LETTER LAM INITIAL FORM + u'\ufee3' # 0x00e5 -> ARABIC LETTER MEEM INITIAL FORM + u'\ufee7' # 0x00e6 -> ARABIC LETTER NOON INITIAL FORM + u'\ufeeb' # 0x00e7 -> ARABIC LETTER HEH INITIAL FORM + u'\ufeed' # 0x00e8 -> ARABIC LETTER WAW ISOLATED FORM + u'\ufeef' # 0x00e9 -> ARABIC LETTER ALEF MAKSURA ISOLATED FORM + u'\ufef3' # 0x00ea -> ARABIC LETTER YEH INITIAL FORM + u'\ufebd' # 0x00eb -> ARABIC LETTER DAD ISOLATED FORM + u'\ufecc' # 0x00ec -> ARABIC LETTER AIN MEDIAL FORM + u'\ufece' # 0x00ed -> ARABIC LETTER GHAIN FINAL FORM + u'\ufecd' # 0x00ee -> ARABIC LETTER GHAIN ISOLATED FORM + u'\ufee1' # 0x00ef -> ARABIC LETTER MEEM ISOLATED FORM + u'\ufe7d' # 0x00f0 -> ARABIC SHADDA MEDIAL FORM + u'\u0651' # 0x00f1 -> ARABIC SHADDAH + u'\ufee5' # 0x00f2 -> ARABIC LETTER NOON ISOLATED FORM + u'\ufee9' # 0x00f3 -> ARABIC LETTER HEH ISOLATED FORM + u'\ufeec' # 0x00f4 -> ARABIC LETTER HEH MEDIAL FORM + u'\ufef0' # 0x00f5 -> ARABIC LETTER ALEF MAKSURA FINAL FORM + u'\ufef2' # 0x00f6 -> ARABIC LETTER YEH FINAL FORM + u'\ufed0' # 0x00f7 -> ARABIC LETTER GHAIN MEDIAL FORM + u'\ufed5' # 0x00f8 -> ARABIC LETTER QAF ISOLATED FORM + u'\ufef5' # 0x00f9 -> ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + u'\ufef6' # 0x00fa -> ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + u'\ufedd' # 0x00fb -> ARABIC LETTER LAM ISOLATED FORM + u'\ufed9' # 0x00fc -> ARABIC LETTER KAF ISOLATED FORM + u'\ufef1' # 0x00fd -> ARABIC LETTER YEH ISOLATED FORM + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\ufffe' # 0x00ff -> UNDEFINED +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00a0, # NON-BREAKING SPACE + 0x00a2: 0x00c0, # CENT SIGN + 0x00a3: 0x00a3, # POUND SIGN + 0x00a4: 0x00a4, # CURRENCY SIGN + 0x00a6: 0x00db, # BROKEN VERTICAL BAR + 0x00ab: 0x0097, # LEFT POINTING GUILLEMET + 0x00ac: 0x00dc, # NOT SIGN + 0x00ad: 0x00a1, # SOFT HYPHEN + 0x00b0: 0x0080, # DEGREE SIGN + 0x00b1: 0x0093, # PLUS-OR-MINUS SIGN + 0x00b7: 0x0081, # MIDDLE DOT + 0x00bb: 0x0098, # RIGHT POINTING GUILLEMET + 0x00bc: 0x0095, # FRACTION 1/4 + 0x00bd: 0x0094, # FRACTION 1/2 + 0x00d7: 0x00de, # MULTIPLICATION SIGN + 0x00f7: 0x00dd, # DIVISION SIGN + 0x03b2: 0x0090, # GREEK SMALL BETA + 0x03c6: 0x0092, # GREEK SMALL PHI + 0x060c: 0x00ac, # ARABIC COMMA + 0x061b: 0x00bb, # ARABIC SEMICOLON + 0x061f: 0x00bf, # ARABIC QUESTION MARK + 0x0640: 0x00e0, # ARABIC TATWEEL + 0x0651: 0x00f1, # ARABIC SHADDAH + 0x0660: 0x00b0, # ARABIC-INDIC DIGIT ZERO + 0x0661: 0x00b1, # ARABIC-INDIC DIGIT ONE + 0x0662: 0x00b2, # ARABIC-INDIC DIGIT TWO + 0x0663: 0x00b3, # ARABIC-INDIC DIGIT THREE + 0x0664: 0x00b4, # ARABIC-INDIC DIGIT FOUR + 0x0665: 0x00b5, # ARABIC-INDIC DIGIT FIVE + 0x0666: 0x00b6, # ARABIC-INDIC DIGIT SIX + 0x0667: 0x00b7, # ARABIC-INDIC DIGIT SEVEN + 0x0668: 0x00b8, # ARABIC-INDIC DIGIT EIGHT + 0x0669: 0x00b9, # ARABIC-INDIC DIGIT NINE + 0x066a: 0x0025, # ARABIC PERCENT SIGN + 0x2219: 0x0082, # BULLET OPERATOR + 0x221a: 0x0083, # SQUARE ROOT + 0x221e: 0x0091, # INFINITY + 0x2248: 0x0096, # ALMOST EQUAL TO + 0x2500: 0x0085, # FORMS LIGHT HORIZONTAL + 0x2502: 0x0086, # FORMS LIGHT VERTICAL + 0x250c: 0x008d, # FORMS LIGHT DOWN AND RIGHT + 0x2510: 0x008c, # FORMS LIGHT DOWN AND LEFT + 0x2514: 0x008e, # FORMS LIGHT UP AND RIGHT + 0x2518: 0x008f, # FORMS LIGHT UP AND LEFT + 0x251c: 0x008a, # FORMS LIGHT VERTICAL AND RIGHT + 0x2524: 0x0088, # FORMS LIGHT VERTICAL AND LEFT + 0x252c: 0x0089, # FORMS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x008b, # FORMS LIGHT UP AND HORIZONTAL + 0x253c: 0x0087, # FORMS LIGHT VERTICAL AND HORIZONTAL + 0x2592: 0x0084, # MEDIUM SHADE + 0x25a0: 0x00fe, # BLACK SQUARE + 0xfe7d: 0x00f0, # ARABIC SHADDA MEDIAL FORM + 0xfe80: 0x00c1, # ARABIC LETTER HAMZA ISOLATED FORM + 0xfe81: 0x00c2, # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + 0xfe82: 0x00a2, # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + 0xfe83: 0x00c3, # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + 0xfe84: 0x00a5, # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + 0xfe85: 0x00c4, # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + 0xfe8b: 0x00c6, # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + 0xfe8d: 0x00c7, # ARABIC LETTER ALEF ISOLATED FORM + 0xfe8e: 0x00a8, # ARABIC LETTER ALEF FINAL FORM + 0xfe8f: 0x00a9, # ARABIC LETTER BEH ISOLATED FORM + 0xfe91: 0x00c8, # ARABIC LETTER BEH INITIAL FORM + 0xfe93: 0x00c9, # ARABIC LETTER TEH MARBUTA ISOLATED FORM + 0xfe95: 0x00aa, # ARABIC LETTER TEH ISOLATED FORM + 0xfe97: 0x00ca, # ARABIC LETTER TEH INITIAL FORM + 0xfe99: 0x00ab, # ARABIC LETTER THEH ISOLATED FORM + 0xfe9b: 0x00cb, # ARABIC LETTER THEH INITIAL FORM + 0xfe9d: 0x00ad, # ARABIC LETTER JEEM ISOLATED FORM + 0xfe9f: 0x00cc, # ARABIC LETTER JEEM INITIAL FORM + 0xfea1: 0x00ae, # ARABIC LETTER HAH ISOLATED FORM + 0xfea3: 0x00cd, # ARABIC LETTER HAH INITIAL FORM + 0xfea5: 0x00af, # ARABIC LETTER KHAH ISOLATED FORM + 0xfea7: 0x00ce, # ARABIC LETTER KHAH INITIAL FORM + 0xfea9: 0x00cf, # ARABIC LETTER DAL ISOLATED FORM + 0xfeab: 0x00d0, # ARABIC LETTER THAL ISOLATED FORM + 0xfead: 0x00d1, # ARABIC LETTER REH ISOLATED FORM + 0xfeaf: 0x00d2, # ARABIC LETTER ZAIN ISOLATED FORM + 0xfeb1: 0x00bc, # ARABIC LETTER SEEN ISOLATED FORM + 0xfeb3: 0x00d3, # ARABIC LETTER SEEN INITIAL FORM + 0xfeb5: 0x00bd, # ARABIC LETTER SHEEN ISOLATED FORM + 0xfeb7: 0x00d4, # ARABIC LETTER SHEEN INITIAL FORM + 0xfeb9: 0x00be, # ARABIC LETTER SAD ISOLATED FORM + 0xfebb: 0x00d5, # ARABIC LETTER SAD INITIAL FORM + 0xfebd: 0x00eb, # ARABIC LETTER DAD ISOLATED FORM + 0xfebf: 0x00d6, # ARABIC LETTER DAD INITIAL FORM + 0xfec1: 0x00d7, # ARABIC LETTER TAH ISOLATED FORM + 0xfec5: 0x00d8, # ARABIC LETTER ZAH ISOLATED FORM + 0xfec9: 0x00df, # ARABIC LETTER AIN ISOLATED FORM + 0xfeca: 0x00c5, # ARABIC LETTER AIN FINAL FORM + 0xfecb: 0x00d9, # ARABIC LETTER AIN INITIAL FORM + 0xfecc: 0x00ec, # ARABIC LETTER AIN MEDIAL FORM + 0xfecd: 0x00ee, # ARABIC LETTER GHAIN ISOLATED FORM + 0xfece: 0x00ed, # ARABIC LETTER GHAIN FINAL FORM + 0xfecf: 0x00da, # ARABIC LETTER GHAIN INITIAL FORM + 0xfed0: 0x00f7, # ARABIC LETTER GHAIN MEDIAL FORM + 0xfed1: 0x00ba, # ARABIC LETTER FEH ISOLATED FORM + 0xfed3: 0x00e1, # ARABIC LETTER FEH INITIAL FORM + 0xfed5: 0x00f8, # ARABIC LETTER QAF ISOLATED FORM + 0xfed7: 0x00e2, # ARABIC LETTER QAF INITIAL FORM + 0xfed9: 0x00fc, # ARABIC LETTER KAF ISOLATED FORM + 0xfedb: 0x00e3, # ARABIC LETTER KAF INITIAL FORM + 0xfedd: 0x00fb, # ARABIC LETTER LAM ISOLATED FORM + 0xfedf: 0x00e4, # ARABIC LETTER LAM INITIAL FORM + 0xfee1: 0x00ef, # ARABIC LETTER MEEM ISOLATED FORM + 0xfee3: 0x00e5, # ARABIC LETTER MEEM INITIAL FORM + 0xfee5: 0x00f2, # ARABIC LETTER NOON ISOLATED FORM + 0xfee7: 0x00e6, # ARABIC LETTER NOON INITIAL FORM + 0xfee9: 0x00f3, # ARABIC LETTER HEH ISOLATED FORM + 0xfeeb: 0x00e7, # ARABIC LETTER HEH INITIAL FORM + 0xfeec: 0x00f4, # ARABIC LETTER HEH MEDIAL FORM + 0xfeed: 0x00e8, # ARABIC LETTER WAW ISOLATED FORM + 0xfeef: 0x00e9, # ARABIC LETTER ALEF MAKSURA ISOLATED FORM + 0xfef0: 0x00f5, # ARABIC LETTER ALEF MAKSURA FINAL FORM + 0xfef1: 0x00fd, # ARABIC LETTER YEH ISOLATED FORM + 0xfef2: 0x00f6, # ARABIC LETTER YEH FINAL FORM + 0xfef3: 0x00ea, # ARABIC LETTER YEH INITIAL FORM + 0xfef5: 0x00f9, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + 0xfef6: 0x00fa, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + 0xfef7: 0x0099, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + 0xfef8: 0x009a, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + 0xfefb: 0x009d, # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + 0xfefc: 0x009e, # ARABIC LIGATURE LAM WITH ALEF FINAL FORM +} diff --git a/PythonEnv/2.7/Lib/encodings/cp864.pyc b/PythonEnv/2.7/Lib/encodings/cp864.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4e916e196524145edc2fefe0cac3431d6ece0f8 GIT binary patch literal 8164 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 u3N=l^_`aKw+cY;LH=|Q}r_5$8+F`-h NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + u'\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + u'\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + u'\xa3' # 0x009c -> POUND SIGN + u'\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + u'\u20a7' # 0x009e -> PESETA SIGN + u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK + u'\u2310' # 0x00a9 -> REVERSED NOT SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xa4' # 0x00af -> CURRENCY SIGN + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + u'\u221e' # 0x00ec -> INFINITY + u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + u'\u2229' # 0x00ef -> INTERSECTION + u'\u2261' # 0x00f0 -> IDENTICAL TO + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL + u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\u2248' # 0x00f7 -> ALMOST EQUAL TO + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\u221a' # 0x00fb -> SQUARE ROOT + u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00af, # CURRENCY SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/PythonEnv/2.7/Lib/encodings/cp865.pyc b/PythonEnv/2.7/Lib/encodings/cp865.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb10aa2485b8ab6a097d29abc0155c27cb95c41a GIT binary patch literal 8033 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 laKJs@LGt-2puN{{dS3w}1cu literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp866.py b/PythonEnv/2.7/Lib/encodings/cp866.py new file mode 100644 index 0000000000..29cd85a3f1 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp866.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP866.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp866', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x0081: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x0082: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x0083: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x0084: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x0085: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x0086: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x0087: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x0088: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x0089: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x008a: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x008b: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x008c: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x008d: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x008e: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x008f: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x0090: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x0091: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x0092: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x0093: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x0094: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x0095: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x0096: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x0097: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x0098: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x0099: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x009a: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x009b: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x009c: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x009d: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x009e: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x009f: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00a1: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00a2: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00a3: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00a4: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00a5: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00a6: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00a7: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00a8: 0x0438, # CYRILLIC SMALL LETTER I + 0x00a9: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00aa: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00ab: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00ac: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00ad: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00ae: 0x043e, # CYRILLIC SMALL LETTER O + 0x00af: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00e1: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00e2: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00e3: 0x0443, # CYRILLIC SMALL LETTER U + 0x00e4: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00e5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00e6: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00e7: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00e8: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00e9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00ea: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x00eb: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00ec: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00ed: 0x044d, # CYRILLIC SMALL LETTER E + 0x00ee: 0x044e, # CYRILLIC SMALL LETTER YU + 0x00ef: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00f0: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x00f1: 0x0451, # CYRILLIC SMALL LETTER IO + 0x00f2: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x00f3: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x00f4: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x00f5: 0x0457, # CYRILLIC SMALL LETTER YI + 0x00f6: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U + 0x00f7: 0x045e, # CYRILLIC SMALL LETTER SHORT U + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x2116, # NUMERO SIGN + 0x00fd: 0x00a4, # CURRENCY SIGN + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\u0410' # 0x0080 -> CYRILLIC CAPITAL LETTER A + u'\u0411' # 0x0081 -> CYRILLIC CAPITAL LETTER BE + u'\u0412' # 0x0082 -> CYRILLIC CAPITAL LETTER VE + u'\u0413' # 0x0083 -> CYRILLIC CAPITAL LETTER GHE + u'\u0414' # 0x0084 -> CYRILLIC CAPITAL LETTER DE + u'\u0415' # 0x0085 -> CYRILLIC CAPITAL LETTER IE + u'\u0416' # 0x0086 -> CYRILLIC CAPITAL LETTER ZHE + u'\u0417' # 0x0087 -> CYRILLIC CAPITAL LETTER ZE + u'\u0418' # 0x0088 -> CYRILLIC CAPITAL LETTER I + u'\u0419' # 0x0089 -> CYRILLIC CAPITAL LETTER SHORT I + u'\u041a' # 0x008a -> CYRILLIC CAPITAL LETTER KA + u'\u041b' # 0x008b -> CYRILLIC CAPITAL LETTER EL + u'\u041c' # 0x008c -> CYRILLIC CAPITAL LETTER EM + u'\u041d' # 0x008d -> CYRILLIC CAPITAL LETTER EN + u'\u041e' # 0x008e -> CYRILLIC CAPITAL LETTER O + u'\u041f' # 0x008f -> CYRILLIC CAPITAL LETTER PE + u'\u0420' # 0x0090 -> CYRILLIC CAPITAL LETTER ER + u'\u0421' # 0x0091 -> CYRILLIC CAPITAL LETTER ES + u'\u0422' # 0x0092 -> CYRILLIC CAPITAL LETTER TE + u'\u0423' # 0x0093 -> CYRILLIC CAPITAL LETTER U + u'\u0424' # 0x0094 -> CYRILLIC CAPITAL LETTER EF + u'\u0425' # 0x0095 -> CYRILLIC CAPITAL LETTER HA + u'\u0426' # 0x0096 -> CYRILLIC CAPITAL LETTER TSE + u'\u0427' # 0x0097 -> CYRILLIC CAPITAL LETTER CHE + u'\u0428' # 0x0098 -> CYRILLIC CAPITAL LETTER SHA + u'\u0429' # 0x0099 -> CYRILLIC CAPITAL LETTER SHCHA + u'\u042a' # 0x009a -> CYRILLIC CAPITAL LETTER HARD SIGN + u'\u042b' # 0x009b -> CYRILLIC CAPITAL LETTER YERU + u'\u042c' # 0x009c -> CYRILLIC CAPITAL LETTER SOFT SIGN + u'\u042d' # 0x009d -> CYRILLIC CAPITAL LETTER E + u'\u042e' # 0x009e -> CYRILLIC CAPITAL LETTER YU + u'\u042f' # 0x009f -> CYRILLIC CAPITAL LETTER YA + u'\u0430' # 0x00a0 -> CYRILLIC SMALL LETTER A + u'\u0431' # 0x00a1 -> CYRILLIC SMALL LETTER BE + u'\u0432' # 0x00a2 -> CYRILLIC SMALL LETTER VE + u'\u0433' # 0x00a3 -> CYRILLIC SMALL LETTER GHE + u'\u0434' # 0x00a4 -> CYRILLIC SMALL LETTER DE + u'\u0435' # 0x00a5 -> CYRILLIC SMALL LETTER IE + u'\u0436' # 0x00a6 -> CYRILLIC SMALL LETTER ZHE + u'\u0437' # 0x00a7 -> CYRILLIC SMALL LETTER ZE + u'\u0438' # 0x00a8 -> CYRILLIC SMALL LETTER I + u'\u0439' # 0x00a9 -> CYRILLIC SMALL LETTER SHORT I + u'\u043a' # 0x00aa -> CYRILLIC SMALL LETTER KA + u'\u043b' # 0x00ab -> CYRILLIC SMALL LETTER EL + u'\u043c' # 0x00ac -> CYRILLIC SMALL LETTER EM + u'\u043d' # 0x00ad -> CYRILLIC SMALL LETTER EN + u'\u043e' # 0x00ae -> CYRILLIC SMALL LETTER O + u'\u043f' # 0x00af -> CYRILLIC SMALL LETTER PE + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u0440' # 0x00e0 -> CYRILLIC SMALL LETTER ER + u'\u0441' # 0x00e1 -> CYRILLIC SMALL LETTER ES + u'\u0442' # 0x00e2 -> CYRILLIC SMALL LETTER TE + u'\u0443' # 0x00e3 -> CYRILLIC SMALL LETTER U + u'\u0444' # 0x00e4 -> CYRILLIC SMALL LETTER EF + u'\u0445' # 0x00e5 -> CYRILLIC SMALL LETTER HA + u'\u0446' # 0x00e6 -> CYRILLIC SMALL LETTER TSE + u'\u0447' # 0x00e7 -> CYRILLIC SMALL LETTER CHE + u'\u0448' # 0x00e8 -> CYRILLIC SMALL LETTER SHA + u'\u0449' # 0x00e9 -> CYRILLIC SMALL LETTER SHCHA + u'\u044a' # 0x00ea -> CYRILLIC SMALL LETTER HARD SIGN + u'\u044b' # 0x00eb -> CYRILLIC SMALL LETTER YERU + u'\u044c' # 0x00ec -> CYRILLIC SMALL LETTER SOFT SIGN + u'\u044d' # 0x00ed -> CYRILLIC SMALL LETTER E + u'\u044e' # 0x00ee -> CYRILLIC SMALL LETTER YU + u'\u044f' # 0x00ef -> CYRILLIC SMALL LETTER YA + u'\u0401' # 0x00f0 -> CYRILLIC CAPITAL LETTER IO + u'\u0451' # 0x00f1 -> CYRILLIC SMALL LETTER IO + u'\u0404' # 0x00f2 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + u'\u0454' # 0x00f3 -> CYRILLIC SMALL LETTER UKRAINIAN IE + u'\u0407' # 0x00f4 -> CYRILLIC CAPITAL LETTER YI + u'\u0457' # 0x00f5 -> CYRILLIC SMALL LETTER YI + u'\u040e' # 0x00f6 -> CYRILLIC CAPITAL LETTER SHORT U + u'\u045e' # 0x00f7 -> CYRILLIC SMALL LETTER SHORT U + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\u221a' # 0x00fb -> SQUARE ROOT + u'\u2116' # 0x00fc -> NUMERO SIGN + u'\xa4' # 0x00fd -> CURRENCY SIGN + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00fd, # CURRENCY SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x0401: 0x00f0, # CYRILLIC CAPITAL LETTER IO + 0x0404: 0x00f2, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0407: 0x00f4, # CYRILLIC CAPITAL LETTER YI + 0x040e: 0x00f6, # CYRILLIC CAPITAL LETTER SHORT U + 0x0410: 0x0080, # CYRILLIC CAPITAL LETTER A + 0x0411: 0x0081, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0x0082, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0x0083, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0x0084, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0x0085, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0x0086, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0x0087, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0x0088, # CYRILLIC CAPITAL LETTER I + 0x0419: 0x0089, # CYRILLIC CAPITAL LETTER SHORT I + 0x041a: 0x008a, # CYRILLIC CAPITAL LETTER KA + 0x041b: 0x008b, # CYRILLIC CAPITAL LETTER EL + 0x041c: 0x008c, # CYRILLIC CAPITAL LETTER EM + 0x041d: 0x008d, # CYRILLIC CAPITAL LETTER EN + 0x041e: 0x008e, # CYRILLIC CAPITAL LETTER O + 0x041f: 0x008f, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0x0090, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0x0091, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0x0092, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0x0093, # CYRILLIC CAPITAL LETTER U + 0x0424: 0x0094, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0x0095, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0x0096, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0x0097, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0x0098, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0x0099, # CYRILLIC CAPITAL LETTER SHCHA + 0x042a: 0x009a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042b: 0x009b, # CYRILLIC CAPITAL LETTER YERU + 0x042c: 0x009c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042d: 0x009d, # CYRILLIC CAPITAL LETTER E + 0x042e: 0x009e, # CYRILLIC CAPITAL LETTER YU + 0x042f: 0x009f, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0x00a0, # CYRILLIC SMALL LETTER A + 0x0431: 0x00a1, # CYRILLIC SMALL LETTER BE + 0x0432: 0x00a2, # CYRILLIC SMALL LETTER VE + 0x0433: 0x00a3, # CYRILLIC SMALL LETTER GHE + 0x0434: 0x00a4, # CYRILLIC SMALL LETTER DE + 0x0435: 0x00a5, # CYRILLIC SMALL LETTER IE + 0x0436: 0x00a6, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0x00a7, # CYRILLIC SMALL LETTER ZE + 0x0438: 0x00a8, # CYRILLIC SMALL LETTER I + 0x0439: 0x00a9, # CYRILLIC SMALL LETTER SHORT I + 0x043a: 0x00aa, # CYRILLIC SMALL LETTER KA + 0x043b: 0x00ab, # CYRILLIC SMALL LETTER EL + 0x043c: 0x00ac, # CYRILLIC SMALL LETTER EM + 0x043d: 0x00ad, # CYRILLIC SMALL LETTER EN + 0x043e: 0x00ae, # CYRILLIC SMALL LETTER O + 0x043f: 0x00af, # CYRILLIC SMALL LETTER PE + 0x0440: 0x00e0, # CYRILLIC SMALL LETTER ER + 0x0441: 0x00e1, # CYRILLIC SMALL LETTER ES + 0x0442: 0x00e2, # CYRILLIC SMALL LETTER TE + 0x0443: 0x00e3, # CYRILLIC SMALL LETTER U + 0x0444: 0x00e4, # CYRILLIC SMALL LETTER EF + 0x0445: 0x00e5, # CYRILLIC SMALL LETTER HA + 0x0446: 0x00e6, # CYRILLIC SMALL LETTER TSE + 0x0447: 0x00e7, # CYRILLIC SMALL LETTER CHE + 0x0448: 0x00e8, # CYRILLIC SMALL LETTER SHA + 0x0449: 0x00e9, # CYRILLIC SMALL LETTER SHCHA + 0x044a: 0x00ea, # CYRILLIC SMALL LETTER HARD SIGN + 0x044b: 0x00eb, # CYRILLIC SMALL LETTER YERU + 0x044c: 0x00ec, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044d: 0x00ed, # CYRILLIC SMALL LETTER E + 0x044e: 0x00ee, # CYRILLIC SMALL LETTER YU + 0x044f: 0x00ef, # CYRILLIC SMALL LETTER YA + 0x0451: 0x00f1, # CYRILLIC SMALL LETTER IO + 0x0454: 0x00f3, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0457: 0x00f5, # CYRILLIC SMALL LETTER YI + 0x045e: 0x00f7, # CYRILLIC SMALL LETTER SHORT U + 0x2116: 0x00fc, # NUMERO SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/PythonEnv/2.7/Lib/encodings/cp866.pyc b/PythonEnv/2.7/Lib/encodings/cp866.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87c934c42505dc1f3c5f1c34a74c14cb1fc0d24d GIT binary patch literal 8268 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 NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\ufffe' # 0x0080 -> UNDEFINED + u'\ufffe' # 0x0081 -> UNDEFINED + u'\ufffe' # 0x0082 -> UNDEFINED + u'\ufffe' # 0x0083 -> UNDEFINED + u'\ufffe' # 0x0084 -> UNDEFINED + u'\ufffe' # 0x0085 -> UNDEFINED + u'\u0386' # 0x0086 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + u'\ufffe' # 0x0087 -> UNDEFINED + u'\xb7' # 0x0088 -> MIDDLE DOT + u'\xac' # 0x0089 -> NOT SIGN + u'\xa6' # 0x008a -> BROKEN BAR + u'\u2018' # 0x008b -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x008c -> RIGHT SINGLE QUOTATION MARK + u'\u0388' # 0x008d -> GREEK CAPITAL LETTER EPSILON WITH TONOS + u'\u2015' # 0x008e -> HORIZONTAL BAR + u'\u0389' # 0x008f -> GREEK CAPITAL LETTER ETA WITH TONOS + u'\u038a' # 0x0090 -> GREEK CAPITAL LETTER IOTA WITH TONOS + u'\u03aa' # 0x0091 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + u'\u038c' # 0x0092 -> GREEK CAPITAL LETTER OMICRON WITH TONOS + u'\ufffe' # 0x0093 -> UNDEFINED + u'\ufffe' # 0x0094 -> UNDEFINED + u'\u038e' # 0x0095 -> GREEK CAPITAL LETTER UPSILON WITH TONOS + u'\u03ab' # 0x0096 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + u'\xa9' # 0x0097 -> COPYRIGHT SIGN + u'\u038f' # 0x0098 -> GREEK CAPITAL LETTER OMEGA WITH TONOS + u'\xb2' # 0x0099 -> SUPERSCRIPT TWO + u'\xb3' # 0x009a -> SUPERSCRIPT THREE + u'\u03ac' # 0x009b -> GREEK SMALL LETTER ALPHA WITH TONOS + u'\xa3' # 0x009c -> POUND SIGN + u'\u03ad' # 0x009d -> GREEK SMALL LETTER EPSILON WITH TONOS + u'\u03ae' # 0x009e -> GREEK SMALL LETTER ETA WITH TONOS + u'\u03af' # 0x009f -> GREEK SMALL LETTER IOTA WITH TONOS + u'\u03ca' # 0x00a0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + u'\u0390' # 0x00a1 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + u'\u03cc' # 0x00a2 -> GREEK SMALL LETTER OMICRON WITH TONOS + u'\u03cd' # 0x00a3 -> GREEK SMALL LETTER UPSILON WITH TONOS + u'\u0391' # 0x00a4 -> GREEK CAPITAL LETTER ALPHA + u'\u0392' # 0x00a5 -> GREEK CAPITAL LETTER BETA + u'\u0393' # 0x00a6 -> GREEK CAPITAL LETTER GAMMA + u'\u0394' # 0x00a7 -> GREEK CAPITAL LETTER DELTA + u'\u0395' # 0x00a8 -> GREEK CAPITAL LETTER EPSILON + u'\u0396' # 0x00a9 -> GREEK CAPITAL LETTER ZETA + u'\u0397' # 0x00aa -> GREEK CAPITAL LETTER ETA + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\u0398' # 0x00ac -> GREEK CAPITAL LETTER THETA + u'\u0399' # 0x00ad -> GREEK CAPITAL LETTER IOTA + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u039a' # 0x00b5 -> GREEK CAPITAL LETTER KAPPA + u'\u039b' # 0x00b6 -> GREEK CAPITAL LETTER LAMDA + u'\u039c' # 0x00b7 -> GREEK CAPITAL LETTER MU + u'\u039d' # 0x00b8 -> GREEK CAPITAL LETTER NU + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u039e' # 0x00bd -> GREEK CAPITAL LETTER XI + u'\u039f' # 0x00be -> GREEK CAPITAL LETTER OMICRON + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u03a0' # 0x00c6 -> GREEK CAPITAL LETTER PI + u'\u03a1' # 0x00c7 -> GREEK CAPITAL LETTER RHO + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u03a3' # 0x00cf -> GREEK CAPITAL LETTER SIGMA + u'\u03a4' # 0x00d0 -> GREEK CAPITAL LETTER TAU + u'\u03a5' # 0x00d1 -> GREEK CAPITAL LETTER UPSILON + u'\u03a6' # 0x00d2 -> GREEK CAPITAL LETTER PHI + u'\u03a7' # 0x00d3 -> GREEK CAPITAL LETTER CHI + u'\u03a8' # 0x00d4 -> GREEK CAPITAL LETTER PSI + u'\u03a9' # 0x00d5 -> GREEK CAPITAL LETTER OMEGA + u'\u03b1' # 0x00d6 -> GREEK SMALL LETTER ALPHA + u'\u03b2' # 0x00d7 -> GREEK SMALL LETTER BETA + u'\u03b3' # 0x00d8 -> GREEK SMALL LETTER GAMMA + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u03b4' # 0x00dd -> GREEK SMALL LETTER DELTA + u'\u03b5' # 0x00de -> GREEK SMALL LETTER EPSILON + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u03b6' # 0x00e0 -> GREEK SMALL LETTER ZETA + u'\u03b7' # 0x00e1 -> GREEK SMALL LETTER ETA + u'\u03b8' # 0x00e2 -> GREEK SMALL LETTER THETA + u'\u03b9' # 0x00e3 -> GREEK SMALL LETTER IOTA + u'\u03ba' # 0x00e4 -> GREEK SMALL LETTER KAPPA + u'\u03bb' # 0x00e5 -> GREEK SMALL LETTER LAMDA + u'\u03bc' # 0x00e6 -> GREEK SMALL LETTER MU + u'\u03bd' # 0x00e7 -> GREEK SMALL LETTER NU + u'\u03be' # 0x00e8 -> GREEK SMALL LETTER XI + u'\u03bf' # 0x00e9 -> GREEK SMALL LETTER OMICRON + u'\u03c0' # 0x00ea -> GREEK SMALL LETTER PI + u'\u03c1' # 0x00eb -> GREEK SMALL LETTER RHO + u'\u03c3' # 0x00ec -> GREEK SMALL LETTER SIGMA + u'\u03c2' # 0x00ed -> GREEK SMALL LETTER FINAL SIGMA + u'\u03c4' # 0x00ee -> GREEK SMALL LETTER TAU + u'\u0384' # 0x00ef -> GREEK TONOS + u'\xad' # 0x00f0 -> SOFT HYPHEN + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u03c5' # 0x00f2 -> GREEK SMALL LETTER UPSILON + u'\u03c6' # 0x00f3 -> GREEK SMALL LETTER PHI + u'\u03c7' # 0x00f4 -> GREEK SMALL LETTER CHI + u'\xa7' # 0x00f5 -> SECTION SIGN + u'\u03c8' # 0x00f6 -> GREEK SMALL LETTER PSI + u'\u0385' # 0x00f7 -> GREEK DIALYTIKA TONOS + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\xa8' # 0x00f9 -> DIAERESIS + u'\u03c9' # 0x00fa -> GREEK SMALL LETTER OMEGA + u'\u03cb' # 0x00fb -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + u'\u03b0' # 0x00fc -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + u'\u03ce' # 0x00fd -> GREEK SMALL LETTER OMEGA WITH TONOS + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a3: 0x009c, # POUND SIGN + 0x00a6: 0x008a, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x0097, # COPYRIGHT SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x0089, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x0099, # SUPERSCRIPT TWO + 0x00b3: 0x009a, # SUPERSCRIPT THREE + 0x00b7: 0x0088, # MIDDLE DOT + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x0384: 0x00ef, # GREEK TONOS + 0x0385: 0x00f7, # GREEK DIALYTIKA TONOS + 0x0386: 0x0086, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0388: 0x008d, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x0389: 0x008f, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x038a: 0x0090, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x038c: 0x0092, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x038e: 0x0095, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x038f: 0x0098, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0390: 0x00a1, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x0391: 0x00a4, # GREEK CAPITAL LETTER ALPHA + 0x0392: 0x00a5, # GREEK CAPITAL LETTER BETA + 0x0393: 0x00a6, # GREEK CAPITAL LETTER GAMMA + 0x0394: 0x00a7, # GREEK CAPITAL LETTER DELTA + 0x0395: 0x00a8, # GREEK CAPITAL LETTER EPSILON + 0x0396: 0x00a9, # GREEK CAPITAL LETTER ZETA + 0x0397: 0x00aa, # GREEK CAPITAL LETTER ETA + 0x0398: 0x00ac, # GREEK CAPITAL LETTER THETA + 0x0399: 0x00ad, # GREEK CAPITAL LETTER IOTA + 0x039a: 0x00b5, # GREEK CAPITAL LETTER KAPPA + 0x039b: 0x00b6, # GREEK CAPITAL LETTER LAMDA + 0x039c: 0x00b7, # GREEK CAPITAL LETTER MU + 0x039d: 0x00b8, # GREEK CAPITAL LETTER NU + 0x039e: 0x00bd, # GREEK CAPITAL LETTER XI + 0x039f: 0x00be, # GREEK CAPITAL LETTER OMICRON + 0x03a0: 0x00c6, # GREEK CAPITAL LETTER PI + 0x03a1: 0x00c7, # GREEK CAPITAL LETTER RHO + 0x03a3: 0x00cf, # GREEK CAPITAL LETTER SIGMA + 0x03a4: 0x00d0, # GREEK CAPITAL LETTER TAU + 0x03a5: 0x00d1, # GREEK CAPITAL LETTER UPSILON + 0x03a6: 0x00d2, # GREEK CAPITAL LETTER PHI + 0x03a7: 0x00d3, # GREEK CAPITAL LETTER CHI + 0x03a8: 0x00d4, # GREEK CAPITAL LETTER PSI + 0x03a9: 0x00d5, # GREEK CAPITAL LETTER OMEGA + 0x03aa: 0x0091, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x03ab: 0x0096, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x03ac: 0x009b, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x03ad: 0x009d, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x03ae: 0x009e, # GREEK SMALL LETTER ETA WITH TONOS + 0x03af: 0x009f, # GREEK SMALL LETTER IOTA WITH TONOS + 0x03b0: 0x00fc, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x03b1: 0x00d6, # GREEK SMALL LETTER ALPHA + 0x03b2: 0x00d7, # GREEK SMALL LETTER BETA + 0x03b3: 0x00d8, # GREEK SMALL LETTER GAMMA + 0x03b4: 0x00dd, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00de, # GREEK SMALL LETTER EPSILON + 0x03b6: 0x00e0, # GREEK SMALL LETTER ZETA + 0x03b7: 0x00e1, # GREEK SMALL LETTER ETA + 0x03b8: 0x00e2, # GREEK SMALL LETTER THETA + 0x03b9: 0x00e3, # GREEK SMALL LETTER IOTA + 0x03ba: 0x00e4, # GREEK SMALL LETTER KAPPA + 0x03bb: 0x00e5, # GREEK SMALL LETTER LAMDA + 0x03bc: 0x00e6, # GREEK SMALL LETTER MU + 0x03bd: 0x00e7, # GREEK SMALL LETTER NU + 0x03be: 0x00e8, # GREEK SMALL LETTER XI + 0x03bf: 0x00e9, # GREEK SMALL LETTER OMICRON + 0x03c0: 0x00ea, # GREEK SMALL LETTER PI + 0x03c1: 0x00eb, # GREEK SMALL LETTER RHO + 0x03c2: 0x00ed, # GREEK SMALL LETTER FINAL SIGMA + 0x03c3: 0x00ec, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00ee, # GREEK SMALL LETTER TAU + 0x03c5: 0x00f2, # GREEK SMALL LETTER UPSILON + 0x03c6: 0x00f3, # GREEK SMALL LETTER PHI + 0x03c7: 0x00f4, # GREEK SMALL LETTER CHI + 0x03c8: 0x00f6, # GREEK SMALL LETTER PSI + 0x03c9: 0x00fa, # GREEK SMALL LETTER OMEGA + 0x03ca: 0x00a0, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x03cb: 0x00fb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x03cc: 0x00a2, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x03cd: 0x00a3, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x03ce: 0x00fd, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x2015: 0x008e, # HORIZONTAL BAR + 0x2018: 0x008b, # LEFT SINGLE QUOTATION MARK + 0x2019: 0x008c, # RIGHT SINGLE QUOTATION MARK + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/PythonEnv/2.7/Lib/encodings/cp869.pyc b/PythonEnv/2.7/Lib/encodings/cp869.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7957b81a56b1a589cec2d7334a5cfd4c35cdebbf GIT binary patch literal 8080 zcmd^DcYIW37QJ5@5JE2!0Sz`{0}EV0P>=wMN`wgtMj#Bi6BtZ$W)NeI5EKxRG6_Xc zT#zE5G)1N9*xSqYrf!*ai|(%O>h|WI^WH*ScK>kQ-*5L1lQZX>_r1)U_r7=EJ>Mkr z<95087S9=1F8}z+f{wr|-l?sKiIjq!ScX(ODTT?Dh?ChFQURYO4I=YJt}D$D%l3C< z`a5!t?Z^~s6UICW%dkTqjlvxn6MHYE#6fLQ2J^LCVCY zL&9P+Amw5Pi3rYEtwM0dYBR-VL84-_AvcIsLaGFFsa7pk1F03e5fT%NLlT0+s?8C* z2{Ko30%|vl)j@6%yA^Vq*zJ%z#O{RDi`@m8CpI6_AhrNzRdjzss zYzt(o*fz+cV%s4*#CAd+6MG!8OKdk}kJw(wKCvetPm1k_JSFxtOzIe-l9M69Lq4C~<1e0csfzP|I|HT9yOUvK^q7;{df*4p3|D0JSy_ zP|J0IT3ZLGhF_i38MnI{*#E0cs~Z0DZ*)YJD7l_Tm7wQyqXV;{dhO9e`%z0JXjj zK+kc2+L;bO>v4eE*$zMla)8>o4p8go0JZ)OKqGR1+W8JZKXQQDg$_Vla)8=E2cSDS zKy8o%(4-uoHpBtwRSr-a>HxGX2dG`_0CX+~s10`j8khsrE_DFj3mP2dG`?0JJ&>pw&4*t=IwRcn(k-?*KGD2cYpe0M+dP^gjon zo*jTT=m4}q2dGVU0J@|gxC&mHjln%fH z=KwTJ2cTg(01eXtYO@@GzUct9*$zPabbwl=1JFesfG+9)wHgPYnL0r2MhBp$IzTP% z0JK&IptU+c?Is5(9!Nhdh6nM`I|zh#gFtvc2!w$_AWRFApl6T-ZwE>6UeNpB33~sK zp!W|AdVhY<=BEc8y) zbG-^uBS<7a@a9751gWEl4}^#!J`f^`G(aXO(g2yDNCRYoA`OrUiZnnbDAE9#phyE` z0-iWQ?Bf9vL_3}UL42dw1-XqX7vwg|Taep|Zi$|$h!2E_B0dlziugc?C?Wzup@;|s zg(4e}5Q=O-LMXBU38BaaB!nUxkPwP&Ktd?80STeV1|)?Mbj4LO&BMmC(opOC?1{BdPs0O$B7PARQIij)YfaI}%=znMh7Ws3Y3(JP4K& zilj&0D{>#{uZVaAy&|!Z+o*EE8bXonNO*s3l7QSNhBk^4x0 z#VP=60Y%^=_7wq)7*>QcB3cpE2y8#;!Vn~6Ib^V4k)ud7@@yvudgfie`ml;qpWzRxmDHTN|yOSx{7Ck@A9>k?Ke+oQPOKMXaW(pzpP#i$`4@ zD(OFNY*ERWiT%eH^)DJfScmkRIC)~+4EYwM!xCot3s^!d&__z2G3KhC_6)01co zDl4lFS4GOo61o0HRgKN5#Ab;5LcG?NPxReqoUjnyDQ)nI^OJHi@-h>hVa8UM$0Ajc z>O{D5v_G4%a*X;voR^V!#k+!nvck7Bla^9qMf~fOpNP?x`avO~gfdw|sL1@1LLRm_ z3KIXC{pk;}0R8C<@$8P9XTM@9qSfKbmP`MvSIt@Db$)u9LoCoxJCJ|mG2zO1#Gl@l z!~aJ!%iGxL=x5}(5xf4I zI^|4uJ9>D`CT~_rA{Gf(O^QX)RgcvttIw}b-s7M?(ca+2ud$Z9+;WM&`>dtIvdPEG zzs`R;kx(RT|HBhuL+;gbBF83xx37rfBS66u7yM%e|B_+T#-oRaF6*ez;(ugN@s`8> zkAK1>T8Xu0)0r==N(xyj#R)!s>_7gK;Wyis#^V=uw54GL?LKz=aM0Ug{*6P%;Kt#F z`TEqrT>nn`AL&2;34XXAYGbP_YW!B!^06U4Um=!7h%*u5effO1G{N>cGlFwMvL<46 zeXtp4y^3q&a$FvMbNt_^pt$fKBhX!>c_hrIL>ov8NOxzF=GqJ;koJ<+l6G+K19Tfn>qt8}ww~@Wx(DeVr+bL*HM$LS%jh1adxP#vbZ^ov zCvD>93c5$=R?;O&Te#Usx0SAmZWZZKZXP0SC#~k#8q!W~K1Mn~dYrWUbkHuk6?D7l zR?=mVP9yE(*jgUo3AzX9o}^nxx1RJAH_Q3QPt#4HdxmZj-Bi*+Za&CAeu#9Kn;p61 z2whjYXXyseJx6yAU5c(3-Sc!p_X6E8x)=+tAJFZm`yt&^ zbZNS$>3&4_4BfkQ2k3rGcaZKUbcg7EN_Uv3&7}HR(l;eMI*X-N$q<)BT3-x1?9N`8&D=bib$j1L=>XS2^}4y4UIc zOt*{fFLWN=U+Fe*a{fm5324qX2X+~mS=l+QTDQq zS6q43xZ5*?8oefORqBwp+FO&_o;r|jTAprNk#1U< zPR>gwH+gHl2fTIO`gG&QbmQ`L%RtI+;u-_ob6N(#dt{WPLh$(A(fW zoNip3ZcL^dx1}35ryDn<8<(XUcX%7UP2MBkW^aqP)!XLn_V##t)5+E8FxKP@}Bmd@eX(gy+ht%??`if^IgsJo98t*cnztYsol*Bn(uDDC$*({ zp|>ElE48(GQS-gtuI8obrVXhLQQRwu@{UC_NVusI%_3!!a!9R6tx0W2xumwFJW@MS zdr}8dM^YzJXHpkZS5h}pchU)@9;AHIiKL#SUZmcnlSn6%3P^oOr;tu1okl{@N%Ra- zUs56IOww7Tvq|TW&L#CD^(UQ2I-hg_=|a)~(m;}u29XAnhLA2I4J8dDT}--!G@LYo zbSY^hsfaX+G@3MqbQ$S#(pb_Jq$^2Rk;ajVNmrA`lO~Wtq!Q9Z(lw-ONs~yEN!O7| zN!OF6kfxHRk;+KZNnz3qQaQ;;5mE(dCTSLl)exOcx`9+lsv=dBYDl%D8%Z%zoRlEV zA>BlpOS+jT0?c_CQB*AI`J28 zRpA>VWl_VLD4M7%GyGS;U;f3y)mSXCFpqr=#R!UfCY}Svm(;BM*7;faS-moQWw&Y94Xd NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\ufffe' # 0x81 -> UNDEFINED + u'\ufffe' # 0x82 -> UNDEFINED + u'\ufffe' # 0x83 -> UNDEFINED + u'\ufffe' # 0x84 -> UNDEFINED + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\ufffe' # 0x86 -> UNDEFINED + u'\ufffe' # 0x87 -> UNDEFINED + u'\ufffe' # 0x88 -> UNDEFINED + u'\ufffe' # 0x89 -> UNDEFINED + u'\ufffe' # 0x8A -> UNDEFINED + u'\ufffe' # 0x8B -> UNDEFINED + u'\ufffe' # 0x8C -> UNDEFINED + u'\ufffe' # 0x8D -> UNDEFINED + u'\ufffe' # 0x8E -> UNDEFINED + u'\ufffe' # 0x8F -> UNDEFINED + u'\ufffe' # 0x90 -> UNDEFINED + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\ufffe' # 0x98 -> UNDEFINED + u'\ufffe' # 0x99 -> UNDEFINED + u'\ufffe' # 0x9A -> UNDEFINED + u'\ufffe' # 0x9B -> UNDEFINED + u'\ufffe' # 0x9C -> UNDEFINED + u'\ufffe' # 0x9D -> UNDEFINED + u'\ufffe' # 0x9E -> UNDEFINED + u'\ufffe' # 0x9F -> UNDEFINED + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0e01' # 0xA1 -> THAI CHARACTER KO KAI + u'\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI + u'\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT + u'\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI + u'\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON + u'\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG + u'\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU + u'\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN + u'\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING + u'\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG + u'\u0e0b' # 0xAB -> THAI CHARACTER SO SO + u'\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE + u'\u0e0d' # 0xAD -> THAI CHARACTER YO YING + u'\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA + u'\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK + u'\u0e10' # 0xB0 -> THAI CHARACTER THO THAN + u'\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO + u'\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO + u'\u0e13' # 0xB3 -> THAI CHARACTER NO NEN + u'\u0e14' # 0xB4 -> THAI CHARACTER DO DEK + u'\u0e15' # 0xB5 -> THAI CHARACTER TO TAO + u'\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG + u'\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN + u'\u0e18' # 0xB8 -> THAI CHARACTER THO THONG + u'\u0e19' # 0xB9 -> THAI CHARACTER NO NU + u'\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI + u'\u0e1b' # 0xBB -> THAI CHARACTER PO PLA + u'\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG + u'\u0e1d' # 0xBD -> THAI CHARACTER FO FA + u'\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN + u'\u0e1f' # 0xBF -> THAI CHARACTER FO FAN + u'\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO + u'\u0e21' # 0xC1 -> THAI CHARACTER MO MA + u'\u0e22' # 0xC2 -> THAI CHARACTER YO YAK + u'\u0e23' # 0xC3 -> THAI CHARACTER RO RUA + u'\u0e24' # 0xC4 -> THAI CHARACTER RU + u'\u0e25' # 0xC5 -> THAI CHARACTER LO LING + u'\u0e26' # 0xC6 -> THAI CHARACTER LU + u'\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN + u'\u0e28' # 0xC8 -> THAI CHARACTER SO SALA + u'\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI + u'\u0e2a' # 0xCA -> THAI CHARACTER SO SUA + u'\u0e2b' # 0xCB -> THAI CHARACTER HO HIP + u'\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA + u'\u0e2d' # 0xCD -> THAI CHARACTER O ANG + u'\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK + u'\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI + u'\u0e30' # 0xD0 -> THAI CHARACTER SARA A + u'\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT + u'\u0e32' # 0xD2 -> THAI CHARACTER SARA AA + u'\u0e33' # 0xD3 -> THAI CHARACTER SARA AM + u'\u0e34' # 0xD4 -> THAI CHARACTER SARA I + u'\u0e35' # 0xD5 -> THAI CHARACTER SARA II + u'\u0e36' # 0xD6 -> THAI CHARACTER SARA UE + u'\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE + u'\u0e38' # 0xD8 -> THAI CHARACTER SARA U + u'\u0e39' # 0xD9 -> THAI CHARACTER SARA UU + u'\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU + u'\ufffe' # 0xDB -> UNDEFINED + u'\ufffe' # 0xDC -> UNDEFINED + u'\ufffe' # 0xDD -> UNDEFINED + u'\ufffe' # 0xDE -> UNDEFINED + u'\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT + u'\u0e40' # 0xE0 -> THAI CHARACTER SARA E + u'\u0e41' # 0xE1 -> THAI CHARACTER SARA AE + u'\u0e42' # 0xE2 -> THAI CHARACTER SARA O + u'\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN + u'\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI + u'\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO + u'\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK + u'\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU + u'\u0e48' # 0xE8 -> THAI CHARACTER MAI EK + u'\u0e49' # 0xE9 -> THAI CHARACTER MAI THO + u'\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI + u'\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA + u'\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT + u'\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT + u'\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN + u'\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN + u'\u0e50' # 0xF0 -> THAI DIGIT ZERO + u'\u0e51' # 0xF1 -> THAI DIGIT ONE + u'\u0e52' # 0xF2 -> THAI DIGIT TWO + u'\u0e53' # 0xF3 -> THAI DIGIT THREE + u'\u0e54' # 0xF4 -> THAI DIGIT FOUR + u'\u0e55' # 0xF5 -> THAI DIGIT FIVE + u'\u0e56' # 0xF6 -> THAI DIGIT SIX + u'\u0e57' # 0xF7 -> THAI DIGIT SEVEN + u'\u0e58' # 0xF8 -> THAI DIGIT EIGHT + u'\u0e59' # 0xF9 -> THAI DIGIT NINE + u'\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU + u'\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT + u'\ufffe' # 0xFC -> UNDEFINED + u'\ufffe' # 0xFD -> UNDEFINED + u'\ufffe' # 0xFE -> UNDEFINED + u'\ufffe' # 0xFF -> UNDEFINED +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp874.pyc b/PythonEnv/2.7/Lib/encodings/cp874.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d181808366322ff9325296979028953223fe946 GIT binary patch literal 2932 zcmc&$>2e!I5FVYD6+6xiP7EmFu()gpfrJo(W97hr6|*vNVhm!fUD*n{Sgi?$0E+G0 z_kD8&2v@j|^zegJ@g!Y(0emY%XrE7GYKi<$gDBvvrYR3uegwsc8kz|5PLZkt9VZ548n z=FU}JT^;dtiPjBk;;YwdiPp}JSYmB=YflFadlId&E?U*ny|KGFvL#~=^7<5S*HRpA z35PS|^u+A|9j^|lLhGfOcD5`+ok=bbgbLj;vYY@Q*(+G~2`v%jK-fY4yKQAsc8bT` z{M2GRJ)1i6akEEkrLR}mUNPz;=RGtZcb6;6O7?V`O%Vz?y_j^&RZ~hNJd(EFpEaFT zd_u|0rj-ksd~wKDc9@n`uu4%<3e}YskrZ3r=Rmx8X!OmT>L=5tk(%=J8bdTwH~vFII3+i^hExII@Wpt(jXLMXIYpJq zDW`3^dUWah6EfAt05jeQas{9QYE!WbanczTHHj!wC2sTe;!(uTxCz5a z_}2B)PHwYQ;Hb(_;HVK^lP0#PNU9^%{kQpWRn|K4>4HjC?y(x*FO6xTF%lZb<>o?a zGj#_{vWaS|Z4ED^VTt)FJhh&nr;a{B^%)vxa(TQye;`;Bstr%8tDoL5W9F>cbLP&w z<<`de3z}}b{f@}OMR(qH_dU(gd+)pdfd^Y!A9{H4BTF8AZ0WMcmp`%M$(2vFt!j_0 zUbA-H(;d$|`&?&yeb@6^qWgsnJsUUmzS#HD%gI;t{*+;+2L>~nU(M$7h2m>g$sT%r z%NxUQzP0u3ciydxT>AaWuhnm*e6cFuNT`%gRm!I;<#Uzt`AYdhrF^tfK6ax&|MmgG zHiQv`QG_vs?Fc&%b|UOT*p09UVK2fyg#8Ey5Dp?7LO6_Y1mP&cF@)m?ClF2|oI*H_ za0cNl!a0QV2=5`hk3jo>h;RYnBZQ9;K0&yM@F~J)2%jT-f$$~5C4{dKzDD>4;ai07 z5WYwF0pUl4pAddVxQqY@65*H0ejr>ySw^`HqrcJL N NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x9c' # 0x04 -> CONTROL + u'\t' # 0x05 -> HORIZONTAL TABULATION + u'\x86' # 0x06 -> CONTROL + u'\x7f' # 0x07 -> DELETE + u'\x97' # 0x08 -> CONTROL + u'\x8d' # 0x09 -> CONTROL + u'\x8e' # 0x0A -> CONTROL + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x9d' # 0x14 -> CONTROL + u'\x85' # 0x15 -> CONTROL + u'\x08' # 0x16 -> BACKSPACE + u'\x87' # 0x17 -> CONTROL + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x92' # 0x1A -> CONTROL + u'\x8f' # 0x1B -> CONTROL + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u'\x80' # 0x20 -> CONTROL + u'\x81' # 0x21 -> CONTROL + u'\x82' # 0x22 -> CONTROL + u'\x83' # 0x23 -> CONTROL + u'\x84' # 0x24 -> CONTROL + u'\n' # 0x25 -> LINE FEED + u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK + u'\x1b' # 0x27 -> ESCAPE + u'\x88' # 0x28 -> CONTROL + u'\x89' # 0x29 -> CONTROL + u'\x8a' # 0x2A -> CONTROL + u'\x8b' # 0x2B -> CONTROL + u'\x8c' # 0x2C -> CONTROL + u'\x05' # 0x2D -> ENQUIRY + u'\x06' # 0x2E -> ACKNOWLEDGE + u'\x07' # 0x2F -> BELL + u'\x90' # 0x30 -> CONTROL + u'\x91' # 0x31 -> CONTROL + u'\x16' # 0x32 -> SYNCHRONOUS IDLE + u'\x93' # 0x33 -> CONTROL + u'\x94' # 0x34 -> CONTROL + u'\x95' # 0x35 -> CONTROL + u'\x96' # 0x36 -> CONTROL + u'\x04' # 0x37 -> END OF TRANSMISSION + u'\x98' # 0x38 -> CONTROL + u'\x99' # 0x39 -> CONTROL + u'\x9a' # 0x3A -> CONTROL + u'\x9b' # 0x3B -> CONTROL + u'\x14' # 0x3C -> DEVICE CONTROL FOUR + u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + u'\x9e' # 0x3E -> CONTROL + u'\x1a' # 0x3F -> SUBSTITUTE + u' ' # 0x40 -> SPACE + u'\u0391' # 0x41 -> GREEK CAPITAL LETTER ALPHA + u'\u0392' # 0x42 -> GREEK CAPITAL LETTER BETA + u'\u0393' # 0x43 -> GREEK CAPITAL LETTER GAMMA + u'\u0394' # 0x44 -> GREEK CAPITAL LETTER DELTA + u'\u0395' # 0x45 -> GREEK CAPITAL LETTER EPSILON + u'\u0396' # 0x46 -> GREEK CAPITAL LETTER ZETA + u'\u0397' # 0x47 -> GREEK CAPITAL LETTER ETA + u'\u0398' # 0x48 -> GREEK CAPITAL LETTER THETA + u'\u0399' # 0x49 -> GREEK CAPITAL LETTER IOTA + u'[' # 0x4A -> LEFT SQUARE BRACKET + u'.' # 0x4B -> FULL STOP + u'<' # 0x4C -> LESS-THAN SIGN + u'(' # 0x4D -> LEFT PARENTHESIS + u'+' # 0x4E -> PLUS SIGN + u'!' # 0x4F -> EXCLAMATION MARK + u'&' # 0x50 -> AMPERSAND + u'\u039a' # 0x51 -> GREEK CAPITAL LETTER KAPPA + u'\u039b' # 0x52 -> GREEK CAPITAL LETTER LAMDA + u'\u039c' # 0x53 -> GREEK CAPITAL LETTER MU + u'\u039d' # 0x54 -> GREEK CAPITAL LETTER NU + u'\u039e' # 0x55 -> GREEK CAPITAL LETTER XI + u'\u039f' # 0x56 -> GREEK CAPITAL LETTER OMICRON + u'\u03a0' # 0x57 -> GREEK CAPITAL LETTER PI + u'\u03a1' # 0x58 -> GREEK CAPITAL LETTER RHO + u'\u03a3' # 0x59 -> GREEK CAPITAL LETTER SIGMA + u']' # 0x5A -> RIGHT SQUARE BRACKET + u'$' # 0x5B -> DOLLAR SIGN + u'*' # 0x5C -> ASTERISK + u')' # 0x5D -> RIGHT PARENTHESIS + u';' # 0x5E -> SEMICOLON + u'^' # 0x5F -> CIRCUMFLEX ACCENT + u'-' # 0x60 -> HYPHEN-MINUS + u'/' # 0x61 -> SOLIDUS + u'\u03a4' # 0x62 -> GREEK CAPITAL LETTER TAU + u'\u03a5' # 0x63 -> GREEK CAPITAL LETTER UPSILON + u'\u03a6' # 0x64 -> GREEK CAPITAL LETTER PHI + u'\u03a7' # 0x65 -> GREEK CAPITAL LETTER CHI + u'\u03a8' # 0x66 -> GREEK CAPITAL LETTER PSI + u'\u03a9' # 0x67 -> GREEK CAPITAL LETTER OMEGA + u'\u03aa' # 0x68 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + u'\u03ab' # 0x69 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + u'|' # 0x6A -> VERTICAL LINE + u',' # 0x6B -> COMMA + u'%' # 0x6C -> PERCENT SIGN + u'_' # 0x6D -> LOW LINE + u'>' # 0x6E -> GREATER-THAN SIGN + u'?' # 0x6F -> QUESTION MARK + u'\xa8' # 0x70 -> DIAERESIS + u'\u0386' # 0x71 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + u'\u0388' # 0x72 -> GREEK CAPITAL LETTER EPSILON WITH TONOS + u'\u0389' # 0x73 -> GREEK CAPITAL LETTER ETA WITH TONOS + u'\xa0' # 0x74 -> NO-BREAK SPACE + u'\u038a' # 0x75 -> GREEK CAPITAL LETTER IOTA WITH TONOS + u'\u038c' # 0x76 -> GREEK CAPITAL LETTER OMICRON WITH TONOS + u'\u038e' # 0x77 -> GREEK CAPITAL LETTER UPSILON WITH TONOS + u'\u038f' # 0x78 -> GREEK CAPITAL LETTER OMEGA WITH TONOS + u'`' # 0x79 -> GRAVE ACCENT + u':' # 0x7A -> COLON + u'#' # 0x7B -> NUMBER SIGN + u'@' # 0x7C -> COMMERCIAL AT + u"'" # 0x7D -> APOSTROPHE + u'=' # 0x7E -> EQUALS SIGN + u'"' # 0x7F -> QUOTATION MARK + u'\u0385' # 0x80 -> GREEK DIALYTIKA TONOS + u'a' # 0x81 -> LATIN SMALL LETTER A + u'b' # 0x82 -> LATIN SMALL LETTER B + u'c' # 0x83 -> LATIN SMALL LETTER C + u'd' # 0x84 -> LATIN SMALL LETTER D + u'e' # 0x85 -> LATIN SMALL LETTER E + u'f' # 0x86 -> LATIN SMALL LETTER F + u'g' # 0x87 -> LATIN SMALL LETTER G + u'h' # 0x88 -> LATIN SMALL LETTER H + u'i' # 0x89 -> LATIN SMALL LETTER I + u'\u03b1' # 0x8A -> GREEK SMALL LETTER ALPHA + u'\u03b2' # 0x8B -> GREEK SMALL LETTER BETA + u'\u03b3' # 0x8C -> GREEK SMALL LETTER GAMMA + u'\u03b4' # 0x8D -> GREEK SMALL LETTER DELTA + u'\u03b5' # 0x8E -> GREEK SMALL LETTER EPSILON + u'\u03b6' # 0x8F -> GREEK SMALL LETTER ZETA + u'\xb0' # 0x90 -> DEGREE SIGN + u'j' # 0x91 -> LATIN SMALL LETTER J + u'k' # 0x92 -> LATIN SMALL LETTER K + u'l' # 0x93 -> LATIN SMALL LETTER L + u'm' # 0x94 -> LATIN SMALL LETTER M + u'n' # 0x95 -> LATIN SMALL LETTER N + u'o' # 0x96 -> LATIN SMALL LETTER O + u'p' # 0x97 -> LATIN SMALL LETTER P + u'q' # 0x98 -> LATIN SMALL LETTER Q + u'r' # 0x99 -> LATIN SMALL LETTER R + u'\u03b7' # 0x9A -> GREEK SMALL LETTER ETA + u'\u03b8' # 0x9B -> GREEK SMALL LETTER THETA + u'\u03b9' # 0x9C -> GREEK SMALL LETTER IOTA + u'\u03ba' # 0x9D -> GREEK SMALL LETTER KAPPA + u'\u03bb' # 0x9E -> GREEK SMALL LETTER LAMDA + u'\u03bc' # 0x9F -> GREEK SMALL LETTER MU + u'\xb4' # 0xA0 -> ACUTE ACCENT + u'~' # 0xA1 -> TILDE + u's' # 0xA2 -> LATIN SMALL LETTER S + u't' # 0xA3 -> LATIN SMALL LETTER T + u'u' # 0xA4 -> LATIN SMALL LETTER U + u'v' # 0xA5 -> LATIN SMALL LETTER V + u'w' # 0xA6 -> LATIN SMALL LETTER W + u'x' # 0xA7 -> LATIN SMALL LETTER X + u'y' # 0xA8 -> LATIN SMALL LETTER Y + u'z' # 0xA9 -> LATIN SMALL LETTER Z + u'\u03bd' # 0xAA -> GREEK SMALL LETTER NU + u'\u03be' # 0xAB -> GREEK SMALL LETTER XI + u'\u03bf' # 0xAC -> GREEK SMALL LETTER OMICRON + u'\u03c0' # 0xAD -> GREEK SMALL LETTER PI + u'\u03c1' # 0xAE -> GREEK SMALL LETTER RHO + u'\u03c3' # 0xAF -> GREEK SMALL LETTER SIGMA + u'\xa3' # 0xB0 -> POUND SIGN + u'\u03ac' # 0xB1 -> GREEK SMALL LETTER ALPHA WITH TONOS + u'\u03ad' # 0xB2 -> GREEK SMALL LETTER EPSILON WITH TONOS + u'\u03ae' # 0xB3 -> GREEK SMALL LETTER ETA WITH TONOS + u'\u03ca' # 0xB4 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + u'\u03af' # 0xB5 -> GREEK SMALL LETTER IOTA WITH TONOS + u'\u03cc' # 0xB6 -> GREEK SMALL LETTER OMICRON WITH TONOS + u'\u03cd' # 0xB7 -> GREEK SMALL LETTER UPSILON WITH TONOS + u'\u03cb' # 0xB8 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + u'\u03ce' # 0xB9 -> GREEK SMALL LETTER OMEGA WITH TONOS + u'\u03c2' # 0xBA -> GREEK SMALL LETTER FINAL SIGMA + u'\u03c4' # 0xBB -> GREEK SMALL LETTER TAU + u'\u03c5' # 0xBC -> GREEK SMALL LETTER UPSILON + u'\u03c6' # 0xBD -> GREEK SMALL LETTER PHI + u'\u03c7' # 0xBE -> GREEK SMALL LETTER CHI + u'\u03c8' # 0xBF -> GREEK SMALL LETTER PSI + u'{' # 0xC0 -> LEFT CURLY BRACKET + u'A' # 0xC1 -> LATIN CAPITAL LETTER A + u'B' # 0xC2 -> LATIN CAPITAL LETTER B + u'C' # 0xC3 -> LATIN CAPITAL LETTER C + u'D' # 0xC4 -> LATIN CAPITAL LETTER D + u'E' # 0xC5 -> LATIN CAPITAL LETTER E + u'F' # 0xC6 -> LATIN CAPITAL LETTER F + u'G' # 0xC7 -> LATIN CAPITAL LETTER G + u'H' # 0xC8 -> LATIN CAPITAL LETTER H + u'I' # 0xC9 -> LATIN CAPITAL LETTER I + u'\xad' # 0xCA -> SOFT HYPHEN + u'\u03c9' # 0xCB -> GREEK SMALL LETTER OMEGA + u'\u0390' # 0xCC -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + u'\u03b0' # 0xCD -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + u'\u2018' # 0xCE -> LEFT SINGLE QUOTATION MARK + u'\u2015' # 0xCF -> HORIZONTAL BAR + u'}' # 0xD0 -> RIGHT CURLY BRACKET + u'J' # 0xD1 -> LATIN CAPITAL LETTER J + u'K' # 0xD2 -> LATIN CAPITAL LETTER K + u'L' # 0xD3 -> LATIN CAPITAL LETTER L + u'M' # 0xD4 -> LATIN CAPITAL LETTER M + u'N' # 0xD5 -> LATIN CAPITAL LETTER N + u'O' # 0xD6 -> LATIN CAPITAL LETTER O + u'P' # 0xD7 -> LATIN CAPITAL LETTER P + u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + u'R' # 0xD9 -> LATIN CAPITAL LETTER R + u'\xb1' # 0xDA -> PLUS-MINUS SIGN + u'\xbd' # 0xDB -> VULGAR FRACTION ONE HALF + u'\x1a' # 0xDC -> SUBSTITUTE + u'\u0387' # 0xDD -> GREEK ANO TELEIA + u'\u2019' # 0xDE -> RIGHT SINGLE QUOTATION MARK + u'\xa6' # 0xDF -> BROKEN BAR + u'\\' # 0xE0 -> REVERSE SOLIDUS + u'\x1a' # 0xE1 -> SUBSTITUTE + u'S' # 0xE2 -> LATIN CAPITAL LETTER S + u'T' # 0xE3 -> LATIN CAPITAL LETTER T + u'U' # 0xE4 -> LATIN CAPITAL LETTER U + u'V' # 0xE5 -> LATIN CAPITAL LETTER V + u'W' # 0xE6 -> LATIN CAPITAL LETTER W + u'X' # 0xE7 -> LATIN CAPITAL LETTER X + u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + u'\xb2' # 0xEA -> SUPERSCRIPT TWO + u'\xa7' # 0xEB -> SECTION SIGN + u'\x1a' # 0xEC -> SUBSTITUTE + u'\x1a' # 0xED -> SUBSTITUTE + u'\xab' # 0xEE -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xEF -> NOT SIGN + u'0' # 0xF0 -> DIGIT ZERO + u'1' # 0xF1 -> DIGIT ONE + u'2' # 0xF2 -> DIGIT TWO + u'3' # 0xF3 -> DIGIT THREE + u'4' # 0xF4 -> DIGIT FOUR + u'5' # 0xF5 -> DIGIT FIVE + u'6' # 0xF6 -> DIGIT SIX + u'7' # 0xF7 -> DIGIT SEVEN + u'8' # 0xF8 -> DIGIT EIGHT + u'9' # 0xF9 -> DIGIT NINE + u'\xb3' # 0xFA -> SUPERSCRIPT THREE + u'\xa9' # 0xFB -> COPYRIGHT SIGN + u'\x1a' # 0xFC -> SUBSTITUTE + u'\x1a' # 0xFD -> SUBSTITUTE + u'\xbb' # 0xFE -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/cp875.pyc b/PythonEnv/2.7/Lib/encodings/cp875.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0793175289707f709e74303f4dd1a9cebc58710 GIT binary patch literal 2801 zcmc&$d3RG)5WiWQhL#<)p=!XTacdPt5D|e;uxdknsVub`U-MqtU^ZWFtW}WGw9uA) zDYWb!ltn<<6cy2P?gyCn9ry}<0Gzpx@@V@9n&q+POsl4swhE?AW^F#X0q*2uMRd?l zo<>7cD1bap!ImE0mCXdhU8 zCKQ-sBH<{s^u9n4bHrV$qHkpVMe}z1NTAM*gB_xrHNQ4)@CK{q`BT1Z?j9J335CtWi3VA09W8*9t zlSpRNlpXqbqbAfS&U;~2s_3+8oaD}{)Kp%V@Y>t|BV;L!(@JM}9S`EVQqt-F!Ictj z;Yw_J09S?TnH}?ZAtesZ#_{)%DpS$)Z+J>b&MIw>Xi~DG+|bqZIwOgtw#-jrpX4Xy z*y1M^IFy;>n4M)iL@A9oPNGc>4jJctjwrgS{fCZFNv^dWDFZ<13zL2sPS%aHdMb8P zD%*JV@Y1)qFZKC9x3lXr^97iYsw_DvQ*i}Ds;aTqJ=_8D3q6prIZtO zJ9YF4dn-43=HhFf_{toW4zHsMKVJDMY$kF!oGx*!Qf%8I4vSr4_oS-o$y26In?6Gv z7Xv=A{oxw1U+k%Uw-w@|u8w|pbI0eJ76L!O%j}||^tnT%BFraqC zH9gVUm4qvB6|TW`_yK+tmp6W#N@udUPYk#LKf%xN3*3ZX#q}@qyzpuFXFZ?8E%*(7 zH+#*kW>K7mi*O0PGl$`ObEmn>++prE`^L+(Gt2Y@Y5KUyZxQUF)j#R8H~UVeUTx +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('cp932') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='cp932', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/cp932.pyc b/PythonEnv/2.7/Lib/encodings/cp932.pyc new file mode 100644 index 0000000000000000000000000000000000000000..569f102f2ef9de29fdb342d78319ba1ce4904f8d GIT binary patch literal 1743 zcmc&!JCD;q5FS6`JkCiF0(5{xaaAgcqd0*OIuR(YxD(nG2rH76c%9%Vb|QNtl$KEO z7x@|d0QhEnaiTkD(!}G;DNP}b1%%cg^T>3$@A^H+{q-zvAG^>laK@*#_SBV>>A%M6k;+BXT zmAFM30#7tfM8l_vL%LOI_@p5yHQJ)l5e>i6=#XynBIvSDgI)*zC4cbTm>S4v`TEtl zQ2m9DqbeR2WbZMGXPDqCypL^~IpR79mjaj6pa&`S_#o536o%O-jlawfVZp&M$`ZWIU8jNj5EpV)D!7TCt5jM#0JR ztfplig1E|}JWk`xjOHKZqWr#79E8fLz^)u|z*ja;Lh-o=+E&Nb2N(sP=Gk{G`yhTF z#WK#*qdm(wf&-Jsqg2Hs9UsM}CTuvZY_iPGrq6j|j$;#-@bjHbRS|W;>oflnlR*~% z;PC<14jHrqZ~#$vOQT2B2mk=;QSpGgsgrInTsBl6^w{$o!-dAkQTUT$v?vCOR86w0 z=Mp&iU3LkgT%uM;CXr2Ka*y#%!YH>1?ih7ZVfc2z{Z%$u2%dJAD=uNh)uLEUaXbzK zgE_(0X$;GzfMvdZfn~wqAYj(Be7v5#J!Y1@qckv_EtT*%=wZ5=n`FE;f}O}PMALC3 zjR&X84#klaM-1ogdb{I(QxNz5t8|M`ao;@NKWQH-5}1F9%c_--Deg%J#*KsjwrryB XI2#4y_SEw2uKm<)T2CAvXL$bt@x)FF literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/cp949.py b/PythonEnv/2.7/Lib/encodings/cp949.py new file mode 100644 index 0000000000..627c87125e --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/cp949.py @@ -0,0 +1,39 @@ +# +# cp949.py: Python Unicode Codec for CP949 +# +# Written by Hye-Shik Chang +# + +import _codecs_kr, codecs +import _multibytecodec as mbc + +codec = _codecs_kr.getcodec('cp949') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='cp949', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/cp949.pyc b/PythonEnv/2.7/Lib/encodings/cp949.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8461e7f89523046f3b6e04e0b91f864d09c5b9f5 GIT binary patch literal 1743 zcmc&!OK;Oa5FS6`JnAF}0V*JI=qV=-2niJ-R1rAz&&M6c45RpkN#k>9K@?TALy@!P zyA*k3h~_?Nmo^a9NQ2|hJfI2GeELDOA^IEzq-$h6n%70#povR5sKgD@5J21%aZALF zO57q1K_D7Oq7l->Bi*VrLedbF8g0?&h(=gxbV#>(5p~(8L9YYh$HQ zQ2nJgNfi$VvUeE86HM?G-W!+Zp12Oer^qKY=s`+7KFBsO#c?)DO&r^nEYhW3EqEz6 z@%c7@z+?$%A;AJ!o&pI8Rh)q8zaD;E+b_%P#jD|BHXh2RSvD<(V)FB=wPG7XjDnLF zI8Ddi2XUSyxk*iCM~e?~QGVMg4npNr(?o2^)?pn;g5d=~F(lcViQm@Y9`5RS|W;>oflhlSLN* z;PC<19$B;lZ~#$%OQT2B2mk=;QSpGgt&?srTsBl6^w{%D%Z0|sQTUT$v?vCORLyKx z&n0m3o9q%qxkRmyOd^}ebe z27839Qv=JUfMvdZhGoIvAYe9dLcD>zJ!Y1@qckx7nk(UP(BpKqu(R>n3U(695KYI4 zG#;ETI}}G!9I>3ci|vlvO+noIuhKO>#eMs5|D=7WNMQaYE~{2Trnn~^7&i|7o3e?% X +# + +import _codecs_tw, codecs +import _multibytecodec as mbc + +codec = _codecs_tw.getcodec('cp950') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='cp950', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/cp950.pyc b/PythonEnv/2.7/Lib/encodings/cp950.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a84a54e0d3e193684e7cedcc337782fe16a4f3e GIT binary patch literal 1743 zcmc&!OK;Oa5FS6`JnA$E0V*JI=qV?JkPrePR1rAz&{RwfRjz~+ zf03WT4}fpRjT5zS$tAXTJv%eIJFjoN-|g1-pUaDcZXO^1GmPRFCXLUbIZ;&64n@v} z?^5KEA)5K5U0Op_BMpv2vw+4>^XUiCn&@j3kgk#OXjT_-gT^lDpb|GoLjZA8#4Qmw zDshW61c7KAiAG3ck94cj2uVXwYP3b;STw>)UWRf-}DcjOIrh(T)lbq zLa5$Co1}_|1K9_R;t3}B3h#|eGf!Lx;Zx+3>USZfE+1qYnBq7arY4SUOBU%uFXz0J zoA`ViKwz>2w2)wdEKh-igep!!_1+FXuk5!)_VV>$J{=8Y(=?kD12Ose)k?9AAx6Q; z3!J87?}IqclH8;wv%~o(xhTKu6bGSlDsn4FJn)svlTdu_p0?Go^&UpSrv>h9%RY+V z2eFLv^kBy_j$q&BW|%57)aD>IHDSX^Ws_sKHhsyb_AoYa2|wN1R25MNydLwL;Eqw36qaun+@ELTh2Uv>x#AL5TrG;#6vtyf zFxVq(ofud)0W9;?Gb{@R2LZEz6XFfz?J~3M9i@S>y;j2GpvUQQZl|M_73?IIA)1a7 zX*@Vxb|{XdIAS?>7n>b-n}WFaU!@y-iu?BA?n%2)k-+>*Tvn}wOmR=zGj1IGcV!cO X&)Fy#w +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('euc_jis_2004') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='euc_jis_2004', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/euc_jis_2004.pyc b/PythonEnv/2.7/Lib/encodings/euc_jis_2004.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd716e38b209fc4975d04e9d33aa2cc25c1ad405 GIT binary patch literal 1799 zcmc&!&2G~`5FY=;`Kgm21gL<-fm67kszO3S2vr0QJ+wlb1Hy`ACEiVNlsJ{W5z3Wt z;uU!e9ss@>H*VCzDTmnJ_3X^-?9A+Z8zW-cZBy|1w_@7}Ezc6Wh4$X<8igqY+ zwtSZ&j||bwC+*S(q8e#%9GV3*ftpW0h&DuDqJVUbj7PJ&h#NFNU`8XeIHD~%56HZP(s$29155MTNS&!r7PnpG0d z(jq=RIeBGkVDy*TBvo1*aNc7SPgoaL95OD=JjnnEpCX^spa&`Sc)M+2isNjwFmY^K zvREwjYR*emNZ7s&K$(nbA;AJ!T7iUwDqeu`J z8o0L|{2*C4q=S5U4|W{nd=6}GMhj&|+8olgCR{nLTyvy&OV>WbO4Vm8V5K4v%jU$O=<*;pg#Z3xRoc{W)J)@}}0 zT-SE9z&db3yn(zuW|m#1^fR7aDdBPMTv3!LW+Z}iNhD7;arEBa;7VN`aOS|}y{QOH?*05ww iaogH2eS8&f%dY#5@1|f(A3LGjbszgp=aI+bIo`ht|6=k0 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/euc_jisx0213.py b/PythonEnv/2.7/Lib/encodings/euc_jisx0213.py new file mode 100644 index 0000000000..cc47d04112 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/euc_jisx0213.py @@ -0,0 +1,39 @@ +# +# euc_jisx0213.py: Python Unicode Codec for EUC_JISX0213 +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('euc_jisx0213') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='euc_jisx0213', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/euc_jisx0213.pyc b/PythonEnv/2.7/Lib/encodings/euc_jisx0213.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a17e94a62af54ef568a5c7c5b0e1ddca80502d69 GIT binary patch literal 1799 zcmc&!OOMk)40aw(AKM2)fEJKAa4HwXE(aup(2Bxg54%Fs10t#vwV7#2)uyXtD(IDR z;xFf9hBl4X$T;$i?|`; zS}AUjh9D4)BhhHm*dyI2HJYR$C^TB4(H4znsnI6g;ziiunEKr|;!FPExwK7?W*JA* zB>(o}^yHnJ+(eOW z$YQ?G%NZ|OA!hqF0A*69g#-&^VFeNrDt`v5_j>SgWxp)a(^rF8G8)LHB%S1gUC*Ci ztrWY;5#@Z9fm3(vT@dGKoSC^v?Qr%%&dYAc#wjUd3*9mv4}9hFBoy1-&&4V%+`-7% zXyD#-@V#W=kPh`H^VzqV8P1g%YI8`}>Tu<_bj^|CEnNGQCHA1Mag{&bx>gog z2fQBh&oEi^3$zA&=l~vBG!Ae8W`9GYn^XuGL4N=!&=_o$bd3?UrfR>-3AnUegbXf) zKPd*3Vk}81CEHpru$A3p7dXo#dAZyx?iTmD!}u!Ml+y&7g4f*g={<(-c{*MQ*0zT$ zu4~1$qgYLGKK25NJ%WXafrAquH(NcyGH2irU>!J3yn(!3W)@wh@H3iTDdBPMqxo`X zlhMiwu42n5o{wT_QLrvM6em>Tv3!LWn;p0NhD7;arEBa;7VQ09OS|}y{QOH?)Uaeu jaogH2eS8&fimv;X? +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('euc_jp') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='euc_jp', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/euc_jp.pyc b/PythonEnv/2.7/Lib/encodings/euc_jp.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28bcbe5e4f115e16a3c47fd6bb44520f73c2e1a6 GIT binary patch literal 1751 zcmc&!JCD;q5FS6`JkGfw1n2;X0-975G)M@c6M^E2JE2X1up(KBcM}}N&dJ^gr6pAS zMScc90KOStoahdkG_k$w*_qkhd41#k?smTaTwNw~^Z59mW0b!zX?zYXh@zTyC~~%Z zmm-f0(cCBP(gvaiX>c5x2Q-D6Pd|t@L|>wSbc2jX^QMSfG<8V_wYWtZ0*Kop?ufWm zi#wzt2t?yVG(wtsq&u}nNE(7lqbnMxq7l{_r=+{Qhe5B5ys7!GY=#+fo>ZH{A98%CVfMmct8)aN3#M>2}*`0385x{!L{4VZt9$)Xnk z_V|Eqk1U!3H~^}@rO_!G1QY=KD0_h3Hc7V_GaG6S`|SFaisNx0 zAnXbD&J0YO0h`788I~mjgaF*Y3GoK<_L*6Akjg@IC?!0OdYr8mHl3`k;3u(+(`=GR z`@!k5Lvbj@6U)iF-0ryB8N|Q;D&1gI{I?JHPufR|MCM=Os%|A_iW}3Rf#dMMt$OJ@ X&PU1EJ##|0=RWq^&LfY +# + +import _codecs_kr, codecs +import _multibytecodec as mbc + +codec = _codecs_kr.getcodec('euc_kr') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='euc_kr', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/euc_kr.pyc b/PythonEnv/2.7/Lib/encodings/euc_kr.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ba0fc6a030ce17018a866fde4345810ba4389c3 GIT binary patch literal 1751 zcmc&!JCD;q5FS6`JkGfw1n2;X0-975G)M@c6M^E2JE2X1up(KBcM}|92iY5;w1kSk z$j{&hz&GQI6Wu|RCboAyJ2SgGuW!8H-Ol%)tILG0A0Pj7jPe&IjnAP4QB>0oMb4J* zQsj{#n){?(+CbDG4UR+efTmFM=?Bq<=u;GsZjkY4-V||*rY`BA7Pm-40C8Ky9TB%` zafdVnfoPnFMo3eSbf?w`NkdR+bVcJ-G{RcrlysLDQICBZ_D|to`UlUI4M3Vz5`QUd z1LR<-O;QKM0p~47`G~c!-y!4D+!NnH_!Rl1hJ8q>&)aPaQyk~x%*3(n$Rb^JP0R_N5${wJ%P0}sK%!Zo7KD&Npx!4#!3V%`z8O0El!bx{E zEkH2EO?HK(Lc&%`E|E{qW7e;&>bg z2z!FPGXv9Rz-F<2f@R47ApkdULcD>zeP&i2q_PklN(qmn9%rkCO($zB_(?3|G@B&S zesH?%P#j9}#B%a3w>xfk2J!E|O4k?_|Ly(#llIXfk@=Uns#}Sf;>L7n;5huRt6uts W^HDN(&z#Whxexue^T6Zr6z^ZP{8m)} literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/gb18030.py b/PythonEnv/2.7/Lib/encodings/gb18030.py new file mode 100644 index 0000000000..34fb6c366a --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/gb18030.py @@ -0,0 +1,39 @@ +# +# gb18030.py: Python Unicode Codec for GB18030 +# +# Written by Hye-Shik Chang +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +codec = _codecs_cn.getcodec('gb18030') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='gb18030', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/gb18030.pyc b/PythonEnv/2.7/Lib/encodings/gb18030.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1bae1747911ce605839ab0e663ab85c7db77eb5 GIT binary patch literal 1759 zcmc&!JCD;q5FS6`JkCiF0(5{xfhba;0}2pA=tQ8n;!bE&AgoAM;&p2m1q`|Rh=FtRdF8v@{6MYUm(lv@5n$<FDpe9{n<8g0?&h=yNjbV#>(5p>z7L9YYHJQy?LsiYK7@uZJI3=F1{`{&F}^#zWbZWYc1}G5YD(m0~M> zjKam_Sxw8_262%^d7Q?X8O=Y)RryV~I1rUvfnB-cfUj(xgyM4#wvHow3!~ukJo~zB z@5T2c*~Zzrvu7JeabWUzl&W~7<0DzsgcYZiRhHRV^(jxxv8>`^ez>!$DyA-YedeEI zGUx~ZKR#gGA%oTc4&dr;Y4nR40Sf2{CNhd_?lHbeAmuhepun;)e0!e}dXY^Qf~(!-iVInB#VA%& z9FIdmVNS4l8pF0J0Gh8JVOcOp2W#o zH62INgmAj-P#jBf#c=j6w>xgO2XXMfN*kO?0L+V|b2b +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +codec = _codecs_cn.getcodec('gb2312') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='gb2312', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/gb2312.pyc b/PythonEnv/2.7/Lib/encodings/gb2312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf37d4d6d342d6d8a291592189b5974b09c4e73d GIT binary patch literal 1751 zcmc&!JCD;q5FS6`JkGfw1n2;X0-97vgaQd6bRtk(aVNAX5LP5B@oqw**g^J2C@rDl zFY+_^0r1WE;zW1Qq>1fa&(6&5&g&cRcf0ld=jt+{>&M6c9HaP!N#k>9K@?TALy@!P zyA*k3h~_?Nmo^a9NQ2|hJfI2GeELDOA^IEzq-$h6n%70#povR5sKgD@5J21%aZALF zO57q1K_D6@q7l->Bi*VrLedbF8g0=y6^*dcI3?ZYMbu%R2HjKmH~WL<$_5~(*vr%f|*tTSmF7;}` zOIAque7V$QObZDX$nq5EkWj@lQ2p1#k8As7ne|=`7qjtDHqEkWF)VF<{&lU`$PlC8 z^aW1Sv3EgSWJzvPliAVYgWQzg_KL$$c@?>pCm#69DS!i@`db>EqDDXgu#d6_=xv>JgE6zA`k>3MUs*0ThL6IZ6hlTaM5SnB(i3=jfv11H2A$lGOR*+EJR<0MnUyLQ_g|%JjEevE{{Bh(XpzYLOI+5i#7uExIy7(`{x@YW YearbM7`taq=yu$Pe$#p2@py{&FIvb?2><{9 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/gbk.py b/PythonEnv/2.7/Lib/encodings/gbk.py new file mode 100644 index 0000000000..1b45db8985 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/gbk.py @@ -0,0 +1,39 @@ +# +# gbk.py: Python Unicode Codec for GBK +# +# Written by Hye-Shik Chang +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +codec = _codecs_cn.getcodec('gbk') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='gbk', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/gbk.pyc b/PythonEnv/2.7/Lib/encodings/gbk.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9090f1455129a04a8b89ff9f0705fdb94f21dca GIT binary patch literal 1727 zcmc&!JCD;q5FS6`JkGfw1n2+>A*xgqG)M@c6M^E2JE2X1up(KBcM}|92iY5;w1kSk z$j{&hz&GQI6Wu|RCboAyJ2SgGuW!8H-Ol%)tILG0A0Pj7jPe&IjnAP4QB>0oMb4J* zQsj{#n){?(+CbDG4UR+efTmFM=?Bq<=u;GsZjkY4-V||*rY`BA7Pm-40C8Ky9TB%` zafdVnfoPnFMo3eSbf?w`NkdR+bVcJ-G{RcrlysLDQICBZ_D|to`UlUI^+3)hUu*;a z!BU%~j)nuyTa5A%CU^?pjZ1S+90%c3Ia;KXk!(uySvi8i&%dq}TNq-LoVdVg zJN7P!i##bzW^y}Tyq9Z=+b(ecYL_Cnc7vm#T%LsDa}TntiH&zKN4R)=#i3859Jh22O}Kkhjmws$W#*#YwJ&$03ii)xxHewH3@H(y+2gBFzS; z%MQhH6gMnq?sB{1b}JC){;PD2OL5-b-#=*|BodZ?iK~j0fGO@o2Stqo|GH|MZ#WYr U9?$Up1!mAp2><{9 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/gbk.pyo b/PythonEnv/2.7/Lib/encodings/gbk.pyo new file mode 100644 index 0000000000000000000000000000000000000000..a9090f1455129a04a8b89ff9f0705fdb94f21dca GIT binary patch literal 1727 zcmc&!JCD;q5FS6`JkGfw1n2+>A*xgqG)M@c6M^E2JE2X1up(KBcM}|92iY5;w1kSk z$j{&hz&GQI6Wu|RCboAyJ2SgGuW!8H-Ol%)tILG0A0Pj7jPe&IjnAP4QB>0oMb4J* zQsj{#n){?(+CbDG4UR+efTmFM=?Bq<=u;GsZjkY4-V||*rY`BA7Pm-40C8Ky9TB%` zafdVnfoPnFMo3eSbf?w`NkdR+bVcJ-G{RcrlysLDQICBZ_D|to`UlUI^+3)hUu*;a z!BU%~j)nuyTa5A%CU^?pjZ1S+90%c3Ia;KXk!(uySvi8i&%dq}TNq-LoVdVg zJN7P!i##bzW^y}Tyq9Z=+b(ecYL_Cnc7vm#T%LsDa}TntiH&zKN4R)=#i3859Jh22O}Kkhjmws$W#*#YwJ&$03ii)xxHewH3@H(y+2gBFzS; z%MQhH6gMnq?sB{1b}JC){;PD2OL5-b-#=*|BodZ?iK~j0fGO@o2Stqo|GH|MZ#WYr U9?$Up1!mAp2><{9 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/hex_codec.py b/PythonEnv/2.7/Lib/encodings/hex_codec.py new file mode 100644 index 0000000000..91b38d952e --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/hex_codec.py @@ -0,0 +1,79 @@ +""" Python 'hex_codec' Codec - 2-digit hex content transfer encoding + + Unlike most of the other codecs which target Unicode, this codec + will return Python string objects for both encode and decode. + + Written by Marc-Andre Lemburg (mal@lemburg.com). + +""" +import codecs, binascii + +### Codec APIs + +def hex_encode(input,errors='strict'): + + """ Encodes the object input and returns a tuple (output + object, length consumed). + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + output = binascii.b2a_hex(input) + return (output, len(input)) + +def hex_decode(input,errors='strict'): + + """ Decodes the object input and returns a tuple (output + object, length consumed). + + input must be an object which provides the bf_getreadbuf + buffer slot. Python strings, buffer objects and memory + mapped files are examples of objects providing this slot. + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + output = binascii.a2b_hex(input) + return (output, len(input)) + +class Codec(codecs.Codec): + + def encode(self, input,errors='strict'): + return hex_encode(input,errors) + def decode(self, input,errors='strict'): + return hex_decode(input,errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + assert self.errors == 'strict' + return binascii.b2a_hex(input) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + assert self.errors == 'strict' + return binascii.a2b_hex(input) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='hex', + encode=hex_encode, + decode=hex_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/PythonEnv/2.7/Lib/encodings/hex_codec.pyc b/PythonEnv/2.7/Lib/encodings/hex_codec.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eab581dd9433cd861a99dd6f55db289b2331294e GIT binary patch literal 3715 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/hz.py b/PythonEnv/2.7/Lib/encodings/hz.py new file mode 100644 index 0000000000..383442a3c9 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/hz.py @@ -0,0 +1,39 @@ +# +# hz.py: Python Unicode Codec for HZ +# +# Written by Hye-Shik Chang +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +codec = _codecs_cn.getcodec('hz') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='hz', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/hz.pyc b/PythonEnv/2.7/Lib/encodings/hz.pyc new file mode 100644 index 0000000000000000000000000000000000000000..233b84156f87e3a28bc5dd64db870234d6bb3445 GIT binary patch literal 1719 zcmc&!O>fgc5FLNS`KZ$%1gL-n5~rLvaH)h4st6o-}oCzWrETBy|1w_@AK_KhbG?4$X<8N_Hr6 zwtAN$j||bwC+*S(rW$Ez9GV3*hMP~{i8e%^qkwdcj7PJ&m>V>9Ne7j=K^g{_n__N> zxlx&0q+tle<48P08hfN$l}AV#hSH-g9>?MlRvyQs+dPOmjH%x}2EOz+o=fXOoL<=) ze!ZnONtFx-ns;c$6LbIy=*Fd)C%7T_6#1n3U0A8h(`^G?9B0FYiDTQ6!D6Xba~`ro z!t2`rlF3*W5h{q~DzK19#dAo#*MpC1J6&e4P6zXJG>}PYHYoZA#OodsSRM23p%uJT;NA@Dy&%5( zu=sc$?1ja->)YH67s?E^x%+^c2;ig&$g#VCKIN(X4*_w_KHUXW6;21b9_!E0S#Tco z#s?OA1OjcK0U`aZj2odwsCaN3B@S}iI_U=UV?*_RmtkL8E-t2u!k-k=LoqX?Skhe$ zmrTiTs!P`7lCnb15a)<9+*5p&9LjD&G+|$1dG{U@@jM$Zg+sf|6<4m}I#KMVI3EWP zz#d`V#2~B*c$lxBVOTIB2qX=h5N{xFmzCvBQAQUhnGzjmJYKBkHXW_4@FlU#$;Bv< zYX+;!48>^_6qXO}VmssZEg;zb>2%FW!EPV!ue8q)$;#i%WxYzi6kkGzB#qPlro1oT X@;MaD)e|RlJMLq@={)kdy}qaTX2h z;mMQ901B138U$4iV>A2CBE=t}<*vwPT;Ow70syw^~T6QB9IDLIYdW1)pi5?;{4 zyYJ7&yzlw&`;~g&6|46uQKg#rQSsF%J_^CNgGRlQ1dXuRSSenapPMg6{#q-D{8c|p ziqiqQSg`D(_e|*!dMCrk;v@>fyUoaNCi^%;SWYT;>VEmonIwmLrP=gDFCl(bE6uiS zTK8OQ1fdRUg+aC9`CcWdC`Q9Zw2DLgz}In|DXV9u`x>UFdl#+F^wr+R^-)2{?|+(4gby2J}pBdb^L`1OQW8Tt=wg%(#; z)wz|>yZk{3bcv$yKOom+kg&EW##TY(o=PBk~|Y?W1?SF#@? z;x{-$CTB)X0r`uj;EX#c@A#c`#?dF2A2)^EVRJZB&A8cqnwL!fX*}9!9*SFV zsX}XAmr#l)k?B!rRtZ{*=WDrs`?1`1++ak=6KNS zjmwL(^YibZ7=I0!7$-9UKxMPXP1cM!BU#62-LZ85&?z{>T2rXe>o6(Q2B0-K6{r<= z1fLMSKs>?i09+eWY_EYPI}SueOW`Ddm{lOYM~vW}Il{%wI!v;3%3L0ds)axi~x@ zrWut-m=C*kB*Ip)mbRnik<)bwizTYWf++qniaYr|2#fP`3q{40`z3UVd537aT=W`# zTnrmYF>16z? z?>r@Lm;ObO==nsZ`!eesS#Lb>BRzrwOV@3-BEPKRg$~huTe^(=xK&TOt<%p9L`FE* z8!122=;E&;lT5)3WgIZxFaSAha+wj-2*wFWMx8MLaU?r#4mrB%SsbBS$OmcoTFNB|IwBerN0bWAZ3gcF@3Fqf~MW0@< zcn{914nI`HdD?Wx$P;@PIaQ((-RZVOnaje9uFz{Fu_``p)`LXBBbVBaf8ka|?m#zt0yd5aK+tQH{%$Cc!^A>>maWKe40JN1`<(I_+MFzap3cy8SlOnugX!DlcEomneeuWzejYYOqG+1Ymhh+ zx8)Z}aa(DZwJm`dv`8}4NBLG>*5@pvU63t21wmb4Nnl(3G8t_%FVXJ>IY4_B{mH6; zG^|Lwun8W037a74sr8WbNRPIgqMY3zMAMTX{tOcAQk?}dnb6{#>U}C3Zo_q#{}kK` zY2HX5q?HO+g0NEW1Gl>J7*D7@p*&%bP`=YzS@EN?jV}L)mY84@(dQF`@ZEXTppbb&2jbFwnig>=LrQLH!~|{sAebH_4fPpwDUS@m~V{{H}pM{A}9J z?w+<`BI>4z`roLDfVtzJDPdb@o`;D*0uyP=)kHo^yR3aC5Py-0l@Swatd#ViuFgudFUb0X|Rc^bCXO zVLbyJ0?H|4b!>QV`=BE!;97U?!}Tjq^icnweavAWGrk2FEm|uuk;mk{j{ao zsK435DbjEjZwlPn1HH9v4QPb=bVUt->F=wteo51(%zU`g&^V#HxJxc|i42!VcBzv+ z-Ku_5xa(tMckvl9+L)wb$1t0iAvl2%{1WXsqhAbN2Lk9%B=X(&@z3QIyGZsuS#7K~ zgSv11;Bkt$Dfbw&Bg|fArshpolrSj2qF&1Pc7{B9$fxy5y+xl6+-sO|Z;IeaF4(B< h9UfC(46hizE#VlQq0>XJ51p8rnL0jII^rA|_zzuBtgrw8 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso2022_jp.py b/PythonEnv/2.7/Lib/encodings/iso2022_jp.py new file mode 100644 index 0000000000..ab04060693 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso2022_jp.py @@ -0,0 +1,39 @@ +# +# iso2022_jp.py: Python Unicode Codec for ISO2022_JP +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/iso2022_jp.pyc b/PythonEnv/2.7/Lib/encodings/iso2022_jp.pyc new file mode 100644 index 0000000000000000000000000000000000000000..edf31101150d8500a507de2bcbafc783ecedae74 GIT binary patch literal 1788 zcmc&!JCD;q5FS6`JkCiF0(5{xK|?Bp(jXy(P6Uc8?u0f4!ir=iUMD1qos+#0N=vBt zi~J0J0DLn}?C1`v6tTVQ*_qkhd41#jZnwVwTwg`BdtCf4F!EoRG(L-#L_tYg6j*z{ zO@Tu((ZVHd(-xu{X>crBcr=BYOFxLVL|+1rbd6$%7IhIfXlj%8N^yfU1Q0hx+!Ar4 z6t_r2;EBeWX!taBNViH2pELx8Mq4yGqT!bs9nx)H1YP!N*z3T*`5!#jrp08w>c8su z!^MrMVL4doI4Xl;f%6_Ce}V}PBLuNc3rGA1;Zop|8ulQi9&a}dOktRglQ<0J{4h*b zdcEW&D@1(0@j%5X(?Ws;vN#125-NWIYVcw(*Enway}W!rg=KcN0r?#Z#Iez z^)Yfzqh~cOb05TI8f9@3r)IqTD7R&IJ>zhco&|R4jRU^2c@m1xJ;uN~_TR(E`AE;c zZQcio!0F86v^_X5k7GGBSv*cuJl65)3~R!W^U^TOREB-d=H`TkF?OC-hLwfY1#iIo z3rq$*0_^}FQ16gIvj7JGcK0+oNR5CD^aMZw&A`-2HyB4-st>BuwBou^ ztfn{~M*zf}VgD?Kc{AWO+dRWEXTT7^>{&iuPu?Cg4M#aFtPFRZKvjZdy)^U5#t5h) z!vIbuk@O~9A=?zkR9rHg#jE{}yDdW;{jbsvxDp8S@bIKV_(+KUB`%6sf~UA+9TP#$ c#oMCUzT@QN4Cr&qx4ZUZw`o0ccs$4Z7qN+6HUIzs literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso2022_jp_1.py b/PythonEnv/2.7/Lib/encodings/iso2022_jp_1.py new file mode 100644 index 0000000000..997044dc37 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso2022_jp_1.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_1.py: Python Unicode Codec for ISO2022_JP_1 +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_1') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp_1', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/iso2022_jp_1.pyc b/PythonEnv/2.7/Lib/encodings/iso2022_jp_1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12a4db01168361927fd4b74d60d5047870f0c604 GIT binary patch literal 1804 zcmc&!JCD;q5FS6`JkGfw1n2;Xf+{qKOM`?EIuR(YxD(nG2rH76c%9%Vc24$2C@rDl zFY+_^0r1T@aiTk@QpEPIXJ=-2=k<;AyWRT!b9oif=5g`Az$kuU()cWz69pA*QDANP zHU$pFL^GGPO>2m1q`|Rh=FtRdF8v@{6MYFh(lv@5n$<FDpe9{n<8g0=y6%D`AI3?ZYMbKfN2HjKmm;AwVZG0w+MekLw z7tU_Nb5jGOztC}1g~bBrJx1{a6I@0RVw+};L;!?KflF%8g_OFy-83+TVKz$RFf=V$ zqzk>A^O6-JKHqqt;*4n_!2(&H0tpFKya3gIGyJqNUl&>L^>Chyhq5Wjrp0jI@|QO& z#ip`H1*g)pnwGf_;xdc!IE^zintzo0^1HrqNGjg~yYj~YU)ekf#pfPoVjU;k!zlPr z&%SNo2Z_Ql4dmoK*fWshIWT!VN>x14@i9$n!j!YhG)s!NH0^Vqn4_A;RsM8mT2){j z@cPWZz+})b&>HZe12|;RIKTmz-7Sr7QX^ml{Q;mrV=#5n4MxVqx^;M#BzGPo4} zq!>_&u_UFG>}tKlR(_jZ;w+co6_Quv7J1!ce3NL(Z30cfYhn2IK1261n=AxtyUP{V zwc^@Qtfn{~2LZ*L;Dl)m1E)Z4zIujb!N4KF+OvGTp1fUV8jf>V+8J)Tg4zkv<=iCW zl@V}7hM}B}Bk5DPLbfT6syJmhk5}6rcbkW}`d_6DfF%^>;r>bcAd(>cOI#MRgimqr gIxL2qkGEy(ea8tZ7}#f)Z+Gm+Zqs_?@OX~*FZpX?#sB~S literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso2022_jp_2.py b/PythonEnv/2.7/Lib/encodings/iso2022_jp_2.py new file mode 100644 index 0000000000..9106bf7625 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso2022_jp_2.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_2.py: Python Unicode Codec for ISO2022_JP_2 +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_2') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp_2', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/iso2022_jp_2.pyc b/PythonEnv/2.7/Lib/encodings/iso2022_jp_2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a9aadc2122c68f0bd2053e4c85439145b5e72e1 GIT binary patch literal 1804 zcmc&!JCD;q5FS6`JkCiF0(5{xK@}Q=(jXy(P6Uc8?u0f4!ir=iUMDz;os+#0N=vBt zi~J0J0DLn}oahd!6tTVQ*_qkhd41#jZnwVwTwO)9eO&x6Fp6K8G(L+KL_tMc6j(dH zO@Tu((cC3%(*~j%X>cr>do+cbOFxJ9nx)H1YP!N*z3T**=_ zaDEf^O%05}QpZsh77LvB7{wDza2Y{}ZJIk00T3<)E~#M;QtI(`)4&vl**J~E(6nTc zF7;}`OIC>ZeB*(NGp2{gYruyN;E+M%00&@pcQm?5jersK2Y>>N!PH4N7*QLl4|^PdYr{pz;8OUL zVn8Xzl9W=iuk{jJ`E7QIvs{8#NM4a!&+_ql^7fc%IL={dXSnSOYA;Av3zJON zM!*#rhH^TIq)*`r*`_$E;*{Y$UhQ_=Z64z4f0ecXmQa|7hbJ9^NP_e)aaqU`KE=K3 fxEOLi-j=QR9Ve(@V4qvQ-L)UPP3w`v<2l~H6$oO^ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso2022_jp_2004.py b/PythonEnv/2.7/Lib/encodings/iso2022_jp_2004.py new file mode 100644 index 0000000000..40198bf098 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso2022_jp_2004.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_2004.py: Python Unicode Codec for ISO2022_JP_2004 +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_2004') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp_2004', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/iso2022_jp_2004.pyc b/PythonEnv/2.7/Lib/encodings/iso2022_jp_2004.pyc new file mode 100644 index 0000000000000000000000000000000000000000..367a02fa7f9815c5b0fb2a1821025ee4b0f314c6 GIT binary patch literal 1828 zcmc&!ON$dh5UzP-^4LitqOvM@@RWnd5(Gg+7Ndtf>>{0mI0S}ddJ-ojlVzrZ&edPjyvwcfG!Hem5K6e=e^h+B`1)ml*jkOd6j>GoqlREefnH z-=@H!m}u&fwrLGfg)}%8O+6Yz&7~hiYoafKN4i3>L({5=Yc#e=d!@KW8Ul#xB5sJd zR*D;>A@D@wOf-BNJER+>hEE!TLZc}fEz$5xjTY%9FM>Av)bF(5U-AdfjcGHPFS-}q zZaBRSyB8O)Oa;8&LdQ`V84H~E82J-S@EUQ5ZJIg~1Q0F-E~$P8QtI$_Q^OR7>2My0 zp=roszR=4VFIget^Nj~8PMH=GERe-1kdRRM3sAi`gHJ2-b&+;o4`#_|Ae)kOk`E4y ze|fu7Y^{%xb3#3fA+Bz=!r#tJ) zVq?Vhn16}Mpo5@U;6qPv$e@*g19-bz8vUh0fDAeYFoITLs-$ZSur*ct9ge|`;euqW zDf~$>z7#`CYAV^)eF3%XkX^tollbM5U1S*9-D7-{fXZ!xRDo}9`1T$n`6?YR1b4g3 z6&JYT3R0}5I3CA>#+>1hNemk&0CKi^hGotmBB0!}e7v5#9cD^%3ky@jO`lLZ!F)M0 z$!KK+Xpv!L&qtATE?gno6bDxPGMvim?T)*>M7;g4(gw^D4fAmSq +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_3') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp_3', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/iso2022_jp_3.pyc b/PythonEnv/2.7/Lib/encodings/iso2022_jp_3.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbc495633d951696f9b307e8234b11871da0571f GIT binary patch literal 1804 zcmc&!JCD;q5FS6`JkGfw1n2;Xf+{o!#wqDGFMNCDo|_sN{e_OBDl8T_?=gxenBX#k5Zg3!Bmy8@3S3fyE~M1u?WTb#46{)hhoNc7 zB3!JdH}&wn@#2nQ$uJWfl)2agN zfY)dK1tx=jf!2Tz9l#-j#sLn%>~3jvlNtdd=nnt|8iT2mZZM+OR3CIX0M~|#kin(! zC&hqLj3p_hWLN7Yw({HT5@)#tuaLYVx5(=rMD+g+}> zt`*mgVl~C_I0z`_1Sd>m7&rxT^VKsf3kD7W)}H0#_2lg`({P-_(#~+x71U0UF6Sm0 zuZ(~zG7RN(97&(T6|zlnRK+R7dA!>0xZ6C$)&DAO04$*}5BE>n2ayEnU*fWmC47o| h*I_Z_e7r4N?>kOV!N5MVe7j>mcAM5ChsSfge*rL-V%7iv literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso2022_jp_ext.py b/PythonEnv/2.7/Lib/encodings/iso2022_jp_ext.py new file mode 100644 index 0000000000..752bab9813 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso2022_jp_ext.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_ext.py: Python Unicode Codec for ISO2022_JP_EXT +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_ext') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp_ext', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/iso2022_jp_ext.pyc b/PythonEnv/2.7/Lib/encodings/iso2022_jp_ext.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd861220490c2a9b2a0b628d48a28225c1ee17b4 GIT binary patch literal 1820 zcmc&!OOFyk5UzPJJQfyX)U29#@I+!_3>On)%trLEhuxUwV4RRlfNpRIGi+v>C|B|1 zU-W1A1N5sJ7;sll9GIEzsjjN-uGd%IuU6yRkLBfsG^>iZMiZBGP>O4$A%M6p;)aN8 zrMN*FfXy;xD1Q~&RdN95hgf|Fc_C+p2PrzPoYn$-+`1myxrC?MNv9TOcdFM zERuy@&UwiSV?N&opiIiNkYIry=_-n;1E#GjQsTy$j+Z9cLynsU6PW%Z=G>?>H8vccEK)huiGwxvI zd~D#}H1VB8;#Xl*Zbq0ab=;k z!Rs;q9Fs-wK%2maZs3tc69EUn_O~=TOND?I^a{WOO~O`5*BD!Cs`fh^f-B3#$S_m* zlVWHoMwJv)ysP;FW!X)3fw)Ybg~f4?Jieb z-HPi+v6|v|90(YDf-|NDCQgCjZ1n`ooB>1tc;Gbg2J&{8X*tqSVQIAK5Nan#mUA1A zR#reZwhZcIG?t!)D`cDExQbhrGkLk)al4I(v;S4v09k@z@9&?q4 +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_kr') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_kr', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/iso2022_kr.pyc b/PythonEnv/2.7/Lib/encodings/iso2022_kr.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b05d9c9fc5a545ff4543d62d6167a3cc848e0366 GIT binary patch literal 1788 zcmc&!JCD;q5FS6`JkCiF0(5{xK|?Bp(jXy(P6Uc8?u0f4!ir=iUMDyt4zf2wX$cj7 zk)Od2fN#c$9o<2dBDQxuJ2SgGuWy{+?bi37>#K-%kBk2WM*a(v#%IxjC@5)*0&CB= zDR3wzn!BWJ+Co$#4UR=~kET#_=?Br4=u_a4u2JmJye{GfO>NR%DQ=L40OF>ITOw|h z;udKLJkdB44WFhC=~k)XlZK$sXp2TiH2hMdL%Pk2pvyiDdmZ?f{K0c=T1@7v{)>J; z{F0d(mV=d!qcSKKIBzlXN0{I+LJ-?Dcf@}XE(I>BVGmO3@pjX|6o%<|8Hb^qABM}7 zUN3mb3K5@gJWz4Uw2)wdEKY%hgvy_R8oU~P*qG0&wEuFnNG2oMl%%tKRN4Lf>qfDm zK1R-I^sJ_3?t-{Xqby#=sTnWc%Wc_h&o~^VXMtUM0{dX{OKGL&q zn)gm3a60oiZTAk$<5&(&7LS)I9_#pYhBaZxd1;tsD#Jczi8-NRjGf1oVP#=;!5c9D z0+T_HKs&$()H`I*EWiPP-93#CQX?P(JpoWaGca}14aU)y>cbwpe{Hz<7*Yyrz^o&b-Ch-R$MoV z)fC6$2!NO~?4QLjZw9<(nX5KJ6_*TW@oK;0cFPb)|EshEt^~r|KRoFWJ`$pTiHjnZ;3@7{$3&2G c@w#ZXZ#X$Q1Nz+Z?XLaMZCVc;9#8T91p}g9P5=M^ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_1.py b/PythonEnv/2.7/Lib/encodings/iso8859_1.py new file mode 100644 index 0000000000..71bc13fcbb --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso8859_1.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_1 generated from 'MAPPINGS/ISO8859/8859-1.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-1', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\xbf' # 0xBF -> INVERTED QUESTION MARK + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH (Icelandic) + u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xde' # 0xDE -> LATIN CAPITAL LETTER THORN (Icelandic) + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf0' # 0xF0 -> LATIN SMALL LETTER ETH (Icelandic) + u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + u'\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic) + u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_1.pyc b/PythonEnv/2.7/Lib/encodings/iso8859_1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12848af24c81573d85cd9ea8d71a9d439f194cfb GIT binary patch literal 2843 zcmc&$`Bxl85bix$HbCwu5q0Ac)*~R%n8O$eL z2@$8+BQ&o_dqkWBpU^#`-78Wg`$eA+y+SOHdxaK|3ZGO2^9rBP3Z%j>6`{PsFSJ6T zd!;TQQglE#uL}rm)SxaXbwznyP-w-xh!+U0M8re#06Hlodda~sdm4+5<^bAhiZpiH zZMkfuwoNtFq^+BgdbOj&$hJmmbDExv7*=l9tQoTtRgqRbtDCB=YmtIzpGVC^fBguzUbaYpQ!^TtkG}r+$Dv!ZP3;_9sG< zPL30B64O5Nm%=95D_HgkB^G7)?I1sHn?}-3@|uUAMlElTr^yzg-6K}epI6vk(d(m- zJ+$B8zAinp>=N2dQtTPEBjLC!x1>lYBy6=MtvheA1xrt-WC%vKqtljt=%$%7ttcsl zoUExN)y`>lfSo?GIc>Bw51wZ==K&>DocAS2qxf(}LU^7hB!yoc77XD|*vl;`4i84* zG$;(CQb5!5d+(TG6bHPIGE8=erbHsEX7ohD4$DO*r*)=jsjyDrcwMVf8Ub($y)6o9 zSZpomE%MppNT|yuO+BM$Z8g16qG~2-SAOy&n?Os4WOTPQ;S!7a@ptGa)2_=Vq7@O! z$AqFgUmA<@u?+@ILdGrApfDXJtO|Q4$>ZWJ*^@G|YT6BdB#|?E9P3cHl_IuSOp`o) zk(#!23A1Zr#0Yar#}3*FdY;91fuz^}gD)rE!Izo!4897NHaG5(K+Bw*MB|^KRmPC& z-}06boj7QMQ02tMY*SY=OHG5SZ=SEr#u|Q*^X>4JiXX{Ba?Z`T8>*B>5--!Jl!lCV zm@|s5YX7k_T(-+xXYxRBI%|2qnkMHaI_;JkEtht>l5`pUgEDo^0N(;F$X$Y3t4(b% z#09BW6vU!Tod%n)CD$g4mjeZPT9sRvB-stOm^h8We0JNZeWpwzbt6h54Z>~6MwiU0 zH0zXTwkX?QT{e}IWz03J@SRhbA_}9SaDJXYy*AUiRVTlw58Gz<6k1x$Vc{wC1U*Ic z4a#rlN+z4f>+=VK1);+5sG{PM(PPGr8$V&F<9q#h=!F_W2j}4NDroRANnEeZ6$q z^7uE+-+q_)UTsNgdaAX}X#XLd$>utKG%dUHr>>v7fBALAZ@>QmD`6G%Kri&cYFGnn zVI8c8e%JsTVH0eIEwB}~!FJdIJ7E{>hCQ$s_Q8HQ00-d^9EKxs6pq1hH~}Z&6r6@L za2C$NdAI-<;SyYiD{vLA!F9L+H{llChC6T-exUdJ1F6K~;dyn}b~9^S_X_z)lAV|)_jY!O$vZECqBwMlL* z4nbU6Fe4mpa9>im{MlUg2YR={mGKgghfC3$l05b-MLDADv=x%cLIbFAbIY QOZ{cOvOwYJ;8WrM3w5`eB>(^b literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_10.py b/PythonEnv/2.7/Lib/encodings/iso8859_10.py new file mode 100644 index 0000000000..757e5c5eb9 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso8859_10.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_10 generated from 'MAPPINGS/ISO8859/8859-10.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-10', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\u0112' # 0xA2 -> LATIN CAPITAL LETTER E WITH MACRON + u'\u0122' # 0xA3 -> LATIN CAPITAL LETTER G WITH CEDILLA + u'\u012a' # 0xA4 -> LATIN CAPITAL LETTER I WITH MACRON + u'\u0128' # 0xA5 -> LATIN CAPITAL LETTER I WITH TILDE + u'\u0136' # 0xA6 -> LATIN CAPITAL LETTER K WITH CEDILLA + u'\xa7' # 0xA7 -> SECTION SIGN + u'\u013b' # 0xA8 -> LATIN CAPITAL LETTER L WITH CEDILLA + u'\u0110' # 0xA9 -> LATIN CAPITAL LETTER D WITH STROKE + u'\u0160' # 0xAA -> LATIN CAPITAL LETTER S WITH CARON + u'\u0166' # 0xAB -> LATIN CAPITAL LETTER T WITH STROKE + u'\u017d' # 0xAC -> LATIN CAPITAL LETTER Z WITH CARON + u'\xad' # 0xAD -> SOFT HYPHEN + u'\u016a' # 0xAE -> LATIN CAPITAL LETTER U WITH MACRON + u'\u014a' # 0xAF -> LATIN CAPITAL LETTER ENG + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK + u'\u0113' # 0xB2 -> LATIN SMALL LETTER E WITH MACRON + u'\u0123' # 0xB3 -> LATIN SMALL LETTER G WITH CEDILLA + u'\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON + u'\u0129' # 0xB5 -> LATIN SMALL LETTER I WITH TILDE + u'\u0137' # 0xB6 -> LATIN SMALL LETTER K WITH CEDILLA + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\u013c' # 0xB8 -> LATIN SMALL LETTER L WITH CEDILLA + u'\u0111' # 0xB9 -> LATIN SMALL LETTER D WITH STROKE + u'\u0161' # 0xBA -> LATIN SMALL LETTER S WITH CARON + u'\u0167' # 0xBB -> LATIN SMALL LETTER T WITH STROKE + u'\u017e' # 0xBC -> LATIN SMALL LETTER Z WITH CARON + u'\u2015' # 0xBD -> HORIZONTAL BAR + u'\u016b' # 0xBE -> LATIN SMALL LETTER U WITH MACRON + u'\u014b' # 0xBF -> LATIN SMALL LETTER ENG + u'\u0100' # 0xC0 -> LATIN CAPITAL LETTER A WITH MACRON + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\u012e' # 0xC7 -> LATIN CAPITAL LETTER I WITH OGONEK + u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\u0116' # 0xCC -> LATIN CAPITAL LETTER E WITH DOT ABOVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH (Icelandic) + u'\u0145' # 0xD1 -> LATIN CAPITAL LETTER N WITH CEDILLA + u'\u014c' # 0xD2 -> LATIN CAPITAL LETTER O WITH MACRON + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\u0168' # 0xD7 -> LATIN CAPITAL LETTER U WITH TILDE + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\u0172' # 0xD9 -> LATIN CAPITAL LETTER U WITH OGONEK + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xde' # 0xDE -> LATIN CAPITAL LETTER THORN (Icelandic) + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + u'\u0101' # 0xE0 -> LATIN SMALL LETTER A WITH MACRON + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\u012f' # 0xE7 -> LATIN SMALL LETTER I WITH OGONEK + u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\u0117' # 0xEC -> LATIN SMALL LETTER E WITH DOT ABOVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf0' # 0xF0 -> LATIN SMALL LETTER ETH (Icelandic) + u'\u0146' # 0xF1 -> LATIN SMALL LETTER N WITH CEDILLA + u'\u014d' # 0xF2 -> LATIN SMALL LETTER O WITH MACRON + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\u0169' # 0xF7 -> LATIN SMALL LETTER U WITH TILDE + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\u0173' # 0xF9 -> LATIN SMALL LETTER U WITH OGONEK + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + u'\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic) + u'\u0138' # 0xFF -> LATIN SMALL LETTER KRA +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_10.pyc b/PythonEnv/2.7/Lib/encodings/iso8859_10.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07eecf491baabe951d0b8fd332ed077401f71b24 GIT binary patch literal 2858 zcmc&$c~=}o5br%%mMgasQ8!+!M>wJ}B*vIP4pAXE8%=`fI_%8C;2t$cQZQxn3tM5<<|j%KE}HX*QcRiyVguMIK>ESKAbJ`J zmtX)15TT}Svpt;()wRpI95Yot)F5|uYN@tRU0P9NAi{+-msymslIVbq_RG;6`!d@vAnvfV%v^w<)JRkY{yq(xJ^Z8cSSI$J%&%C>4Rg% z=2=MHps7WVLLgLd9iS7a4uHoHILzGy=N=+O!k7TlkB^(W7BgeG#^Hrghw6nOOhP(b zWEcFoiRmW&9the6`bOt<;hA9;gEj`yC*{tl?XFOXDc}$_<<^91zlA3lY9cN|&{CZl zQ~06kdRjNaU?f5qKR|0X60U!4&R z01w~`m6*95E=XV!+%mpy1PsMaKsisUhu}R>n$3QDSS)MI|rOh+AUTQIPT(c0Cu);Zk=L9bD zatVxo23MK~ra5yLF zmQ%z?rBWCo;u+pZs;vCi-eCPMbG*qyfhny+{dy4geY86-^jxg*a53RZdZ*^lKz(=> z6hF2L=&~ks!~oW%ev%gnBYhf8yqs8~4CK&cWriN+6ez)X&8aDNi_mAQ?HZ_yJVIZB zJi-9vrYX8aV#T?3tws+-Bdkxw)1sO=$4YqdBxH$%a7dV;Ib_&GPPeJx7_?+l?_LH= z1Bpyr`7Xb!5War#&GaJSTyBro=g$k|2MY>|ic99rU$Ah|;w4W!S-SM8vZtSUHni-y z=U;g7rSkC0ue|!&@`}o;>J_iQvGUDTHLKUWwf60G@2uZYTeor3<}L5mzxVzJ4UJoy zK9nNcKKgk3j-Ab)w0!zm^mDm2rl|3@cCF)!L^74`{8Bf}%vW7scYpKkuJ69zO?zlB z?W6s4fDY0<^auJQ-Ajk)FddzXx0Z}UMu&M)%o{3@TI6Z`=`V4b%vTaW(e zIc#0GhItR`Wqqul4X{DBhu`EQY%f2?hWQaT%J#ASY|I+8M%Xwz#169~))jWl`h}ff zC)p`>nw?>1c`rN9F0hO2C-yVD#BcFYc9kDz*ZEO)gWY7e*llZ%HOlU=U)gW$u632& zv+l6p*?snaJ!Fsgy)dQ==!y+gNyngJVvn&Y;t&HlVY34pl!Od6vHVZ{nrY2w3B_(d qpq)maTxx@8<7@54z0L#M7}z|a+j>g_rQT9+nWxN`U*dmEyng}ZWt;W@ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_11.py b/PythonEnv/2.7/Lib/encodings/iso8859_11.py new file mode 100644 index 0000000000..27ece8dc7b --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso8859_11.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_11 generated from 'MAPPINGS/ISO8859/8859-11.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-11', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0e01' # 0xA1 -> THAI CHARACTER KO KAI + u'\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI + u'\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT + u'\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI + u'\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON + u'\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG + u'\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU + u'\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN + u'\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING + u'\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG + u'\u0e0b' # 0xAB -> THAI CHARACTER SO SO + u'\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE + u'\u0e0d' # 0xAD -> THAI CHARACTER YO YING + u'\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA + u'\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK + u'\u0e10' # 0xB0 -> THAI CHARACTER THO THAN + u'\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO + u'\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO + u'\u0e13' # 0xB3 -> THAI CHARACTER NO NEN + u'\u0e14' # 0xB4 -> THAI CHARACTER DO DEK + u'\u0e15' # 0xB5 -> THAI CHARACTER TO TAO + u'\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG + u'\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN + u'\u0e18' # 0xB8 -> THAI CHARACTER THO THONG + u'\u0e19' # 0xB9 -> THAI CHARACTER NO NU + u'\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI + u'\u0e1b' # 0xBB -> THAI CHARACTER PO PLA + u'\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG + u'\u0e1d' # 0xBD -> THAI CHARACTER FO FA + u'\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN + u'\u0e1f' # 0xBF -> THAI CHARACTER FO FAN + u'\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO + u'\u0e21' # 0xC1 -> THAI CHARACTER MO MA + u'\u0e22' # 0xC2 -> THAI CHARACTER YO YAK + u'\u0e23' # 0xC3 -> THAI CHARACTER RO RUA + u'\u0e24' # 0xC4 -> THAI CHARACTER RU + u'\u0e25' # 0xC5 -> THAI CHARACTER LO LING + u'\u0e26' # 0xC6 -> THAI CHARACTER LU + u'\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN + u'\u0e28' # 0xC8 -> THAI CHARACTER SO SALA + u'\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI + u'\u0e2a' # 0xCA -> THAI CHARACTER SO SUA + u'\u0e2b' # 0xCB -> THAI CHARACTER HO HIP + u'\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA + u'\u0e2d' # 0xCD -> THAI CHARACTER O ANG + u'\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK + u'\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI + u'\u0e30' # 0xD0 -> THAI CHARACTER SARA A + u'\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT + u'\u0e32' # 0xD2 -> THAI CHARACTER SARA AA + u'\u0e33' # 0xD3 -> THAI CHARACTER SARA AM + u'\u0e34' # 0xD4 -> THAI CHARACTER SARA I + u'\u0e35' # 0xD5 -> THAI CHARACTER SARA II + u'\u0e36' # 0xD6 -> THAI CHARACTER SARA UE + u'\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE + u'\u0e38' # 0xD8 -> THAI CHARACTER SARA U + u'\u0e39' # 0xD9 -> THAI CHARACTER SARA UU + u'\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT + u'\u0e40' # 0xE0 -> THAI CHARACTER SARA E + u'\u0e41' # 0xE1 -> THAI CHARACTER SARA AE + u'\u0e42' # 0xE2 -> THAI CHARACTER SARA O + u'\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN + u'\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI + u'\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO + u'\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK + u'\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU + u'\u0e48' # 0xE8 -> THAI CHARACTER MAI EK + u'\u0e49' # 0xE9 -> THAI CHARACTER MAI THO + u'\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI + u'\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA + u'\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT + u'\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT + u'\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN + u'\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN + u'\u0e50' # 0xF0 -> THAI DIGIT ZERO + u'\u0e51' # 0xF1 -> THAI DIGIT ONE + u'\u0e52' # 0xF2 -> THAI DIGIT TWO + u'\u0e53' # 0xF3 -> THAI DIGIT THREE + u'\u0e54' # 0xF4 -> THAI DIGIT FOUR + u'\u0e55' # 0xF5 -> THAI DIGIT FIVE + u'\u0e56' # 0xF6 -> THAI DIGIT SIX + u'\u0e57' # 0xF7 -> THAI DIGIT SEVEN + u'\u0e58' # 0xF8 -> THAI DIGIT EIGHT + u'\u0e59' # 0xF9 -> THAI DIGIT NINE + u'\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU + u'\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_11.pyc b/PythonEnv/2.7/Lib/encodings/iso8859_11.pyc new file mode 100644 index 0000000000000000000000000000000000000000..376943da5f40fee52cbd9a6b94253f2c3fb7b856 GIT binary patch literal 2952 zcmc&$X?qk!5biy*SrWpn!KjN@)`MVBEJ` zzHhwm`=Z(p@;v=VtbgDKe*jkXkR3q3M4m@?w|i^4W~!^+db?^uf7Zu`#|AsH;_4?v z|0`*fFVSQQ(M@wem_d;bh;9->!U~A3L6IXlEJlQ=2(hI*D9ngfgtQ`BRfL3DqZMJT zh*cF~Vb%&OsC5yMBLnfOE+Wh+6S}C@)m3#-Vb=3Sca1Qoitd;;K$c>nLJr2+(^Rs7 z1IW{q=o)hSOT|Q6f5ypVUCT*yWCjN8Vqc=IWLnvTT`nzIvS?|#wKdUa6)h*@T4o~W zlnROFj#XVRQb7GtA_VXiIHq$aN)Dn-|SLoB}Mrd1Y zyb5WMR#vk|37RZ&ouJdGj*!O`ILSf5a!44dBqzX)^6jo;XWcAc^9a*uw&xk79W zi0$+X3O6V!AqqM`>z)4N+Ox7dl~%J9eIYZD_T1G=S|l9OZl*VHc~9{UWhIZnwbCrK&vRBk4zZCQ^8?ZU-9dAqk~!d|(@hm>IP3}}?5uyuw)1pZA-20waT zGz2_>ua~rVeKZE=!C)MX8k%mxeQzJe@v8et2Fi`mluj2j1uLC)sSS==w|Y3HLgyUR`sXKvsrZM@r(|bDSU1* zMg9){Tw3)BMa&{jg_u)x@EcP}Hrr{_By`|95e73-18cB%nm<0`nm{?bn92L`PbzfA zkAuAyaHEd5tfxtvUzf?3Ee*84$K)~QtWKZUC>ppC;We6K{|~~PdJkbH*9{08T;cq{ zCj~C^at@7u2G^KIs+;C6V>)|c55kpmmvS8|Q`qF#REDdZWk#;%8#(13XQ>8~EHv-@ zr2D~YX;Kk0l^SX2h_Ca;urlU~d^TA8Vb`2|Wd-u7#X*CL!7m%SS3 z=sZ$iqCCH42Hwt4BbSAUFLM3MUGKR zcAcSlbXjI1i$HB48mOahRDTD5XTk-7p>QNx6RV9+sjHvbFm3vbnX_ikx#iZzxwkdl ze#f1Od3W7?&%O6GC+~mY!H4FzEO@we;UkYOdTjBMrOO^){=|wWSFT#!wr1_R^-r}w z{mio+og2EIGg2F$e__++E!{8ny!3MVl}vBev~qp@_SRSPg<@&oHK*(jzP{~^p*P>! z{`NcXsvT;l8deoGqIRj>YLD8hM%9=aSNqg{bwC|dhty$pL>*Pf)Nyq}om8jPX>~@O zRp-=sbwOQJ?;-3&7)Gcdj3Den*p09UVK2fc!WhCh!ajuk2nP@jA{;_EjBo_uD8ey> z;|M1ZP9mH_IE`=y;Vi;Ag!2d&5H2E+{r3?*K==^hBZQ9;K0){t;WLEK5xzk965%U^ zuMxgM_!i+igzpi4K=={iCxo97enGf|004V@({|yD372#it-rB<0wy{Jc;rY%F`&%pgdc(PePK( zK!<_bvsubgJLV4N5zwa{GtT24w?Bi=hs(`n;$5kC(9WA)bEDO3$T^wHqhAu1d#?p6 cLS&}Qt(kgxxG~lkZVWetnj*Cg(JLbS7nC6B-T(jq literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_13.py b/PythonEnv/2.7/Lib/encodings/iso8859_13.py new file mode 100644 index 0000000000..71adb5c19a --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso8859_13.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_13 generated from 'MAPPINGS/ISO8859/8859-13.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-13', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u201d' # 0xA1 -> RIGHT DOUBLE QUOTATION MARK + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\u201e' # 0xA5 -> DOUBLE LOW-9 QUOTATION MARK + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xd8' # 0xA8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u0156' # 0xAA -> LATIN CAPITAL LETTER R WITH CEDILLA + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xc6' # 0xAF -> LATIN CAPITAL LETTER AE + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\u201c' # 0xB4 -> LEFT DOUBLE QUOTATION MARK + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xf8' # 0xB8 -> LATIN SMALL LETTER O WITH STROKE + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\u0157' # 0xBA -> LATIN SMALL LETTER R WITH CEDILLA + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\xe6' # 0xBF -> LATIN SMALL LETTER AE + u'\u0104' # 0xC0 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\u012e' # 0xC1 -> LATIN CAPITAL LETTER I WITH OGONEK + u'\u0100' # 0xC2 -> LATIN CAPITAL LETTER A WITH MACRON + u'\u0106' # 0xC3 -> LATIN CAPITAL LETTER C WITH ACUTE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\u0118' # 0xC6 -> LATIN CAPITAL LETTER E WITH OGONEK + u'\u0112' # 0xC7 -> LATIN CAPITAL LETTER E WITH MACRON + u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\u0179' # 0xCA -> LATIN CAPITAL LETTER Z WITH ACUTE + u'\u0116' # 0xCB -> LATIN CAPITAL LETTER E WITH DOT ABOVE + u'\u0122' # 0xCC -> LATIN CAPITAL LETTER G WITH CEDILLA + u'\u0136' # 0xCD -> LATIN CAPITAL LETTER K WITH CEDILLA + u'\u012a' # 0xCE -> LATIN CAPITAL LETTER I WITH MACRON + u'\u013b' # 0xCF -> LATIN CAPITAL LETTER L WITH CEDILLA + u'\u0160' # 0xD0 -> LATIN CAPITAL LETTER S WITH CARON + u'\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + u'\u0145' # 0xD2 -> LATIN CAPITAL LETTER N WITH CEDILLA + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\u014c' # 0xD4 -> LATIN CAPITAL LETTER O WITH MACRON + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\u0172' # 0xD8 -> LATIN CAPITAL LETTER U WITH OGONEK + u'\u0141' # 0xD9 -> LATIN CAPITAL LETTER L WITH STROKE + u'\u015a' # 0xDA -> LATIN CAPITAL LETTER S WITH ACUTE + u'\u016a' # 0xDB -> LATIN CAPITAL LETTER U WITH MACRON + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u017b' # 0xDD -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\u017d' # 0xDE -> LATIN CAPITAL LETTER Z WITH CARON + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + u'\u0105' # 0xE0 -> LATIN SMALL LETTER A WITH OGONEK + u'\u012f' # 0xE1 -> LATIN SMALL LETTER I WITH OGONEK + u'\u0101' # 0xE2 -> LATIN SMALL LETTER A WITH MACRON + u'\u0107' # 0xE3 -> LATIN SMALL LETTER C WITH ACUTE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\u0119' # 0xE6 -> LATIN SMALL LETTER E WITH OGONEK + u'\u0113' # 0xE7 -> LATIN SMALL LETTER E WITH MACRON + u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\u017a' # 0xEA -> LATIN SMALL LETTER Z WITH ACUTE + u'\u0117' # 0xEB -> LATIN SMALL LETTER E WITH DOT ABOVE + u'\u0123' # 0xEC -> LATIN SMALL LETTER G WITH CEDILLA + u'\u0137' # 0xED -> LATIN SMALL LETTER K WITH CEDILLA + u'\u012b' # 0xEE -> LATIN SMALL LETTER I WITH MACRON + u'\u013c' # 0xEF -> LATIN SMALL LETTER L WITH CEDILLA + u'\u0161' # 0xF0 -> LATIN SMALL LETTER S WITH CARON + u'\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + u'\u0146' # 0xF2 -> LATIN SMALL LETTER N WITH CEDILLA + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\u014d' # 0xF4 -> LATIN SMALL LETTER O WITH MACRON + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\u0173' # 0xF8 -> LATIN SMALL LETTER U WITH OGONEK + u'\u0142' # 0xF9 -> LATIN SMALL LETTER L WITH STROKE + u'\u015b' # 0xFA -> LATIN SMALL LETTER S WITH ACUTE + u'\u016b' # 0xFB -> LATIN SMALL LETTER U WITH MACRON + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\u017e' # 0xFE -> LATIN SMALL LETTER Z WITH CARON + u'\u2019' # 0xFF -> RIGHT SINGLE QUOTATION MARK +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_13.pyc b/PythonEnv/2.7/Lib/encodings/iso8859_13.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fffb6e89e6bcf77e35a6d7bef0ed05593faa20a6 GIT binary patch literal 2861 zcmc&$`(G4Q6uMzYw2K?Q#$Io-=drIp6cW=d92MlrAQ@S<=OtaN=RIi?zF10_R@V&sZO0`(d z;N^xu&fsNIK9k+t=3@!mAegiHm{c%h^K)Ba&gN%Q5iOeXm{iP~0(=A9DZu*B!611W z4VO>=Nfe>RF1;<24n^8TRgCMh8mbqwStZ>Xiew}?9#XVSb@hf#vC67YtDKfqQJ1Aq zLd~Q?<@MVd8|xZ&Mc36uchfWLNUW`_s@St{PkE?Q(c9>iIBipr?Wza{m3#PU(0zC; z-#iDY8#T4$Q3!>Mt|N3D)qeCC1IM|W(cHs?XqXb9`{{9ARpNS_)-=30BBWl9LT9Yq z#SY+~o9S-W=fR*|sBdsy=bmYLF>2!&eM-#6YZh6SXxZUv6vp@i&RGHNa9i;n?M0O z$MV@ipcC+QmXAZD2ib?LY&r{uIQCUKt z2Y)qc9YP_qkW(Jw6khz&XqdKbP*5-)I8TH?jO4%yBu4!eEXeZQj+|OY@`DA1Ma3mcmM&YqV&$p_9xPq`P}#$eJQ`Z_ z*yB$;`BZuM>1UpOZf(W7=PTD&y|CfMjn$hrzqIA$t*_K#wM}XNAel;MvLC9N-tkfA$6cR%df>Cq4?;Ke zKri$`KMcSi9D*<4FdTs|VF-rdEBG3|fp6g`9E0!RIE=t3oPd*X3QofrI1A_CJY1OW zJ_{G&5?r3{J_lFeN8WmEbI|BF2Fw%YQFF*RY~40T%!}r@dCi=(E?9lmfN{(kGL9P~#;A4E>ak8) z*NijPq;a%ct$u6J7_)|rTgJFC zVU1b6)@kdyF=b6zcc;5ghACsnSn8otCXPLm+KkN-hZ{r-n;_Jq1R}9c9bo1MO-qN8 tl NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u1e02' # 0xA1 -> LATIN CAPITAL LETTER B WITH DOT ABOVE + u'\u1e03' # 0xA2 -> LATIN SMALL LETTER B WITH DOT ABOVE + u'\xa3' # 0xA3 -> POUND SIGN + u'\u010a' # 0xA4 -> LATIN CAPITAL LETTER C WITH DOT ABOVE + u'\u010b' # 0xA5 -> LATIN SMALL LETTER C WITH DOT ABOVE + u'\u1e0a' # 0xA6 -> LATIN CAPITAL LETTER D WITH DOT ABOVE + u'\xa7' # 0xA7 -> SECTION SIGN + u'\u1e80' # 0xA8 -> LATIN CAPITAL LETTER W WITH GRAVE + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u1e82' # 0xAA -> LATIN CAPITAL LETTER W WITH ACUTE + u'\u1e0b' # 0xAB -> LATIN SMALL LETTER D WITH DOT ABOVE + u'\u1ef2' # 0xAC -> LATIN CAPITAL LETTER Y WITH GRAVE + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\u0178' # 0xAF -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\u1e1e' # 0xB0 -> LATIN CAPITAL LETTER F WITH DOT ABOVE + u'\u1e1f' # 0xB1 -> LATIN SMALL LETTER F WITH DOT ABOVE + u'\u0120' # 0xB2 -> LATIN CAPITAL LETTER G WITH DOT ABOVE + u'\u0121' # 0xB3 -> LATIN SMALL LETTER G WITH DOT ABOVE + u'\u1e40' # 0xB4 -> LATIN CAPITAL LETTER M WITH DOT ABOVE + u'\u1e41' # 0xB5 -> LATIN SMALL LETTER M WITH DOT ABOVE + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\u1e56' # 0xB7 -> LATIN CAPITAL LETTER P WITH DOT ABOVE + u'\u1e81' # 0xB8 -> LATIN SMALL LETTER W WITH GRAVE + u'\u1e57' # 0xB9 -> LATIN SMALL LETTER P WITH DOT ABOVE + u'\u1e83' # 0xBA -> LATIN SMALL LETTER W WITH ACUTE + u'\u1e60' # 0xBB -> LATIN CAPITAL LETTER S WITH DOT ABOVE + u'\u1ef3' # 0xBC -> LATIN SMALL LETTER Y WITH GRAVE + u'\u1e84' # 0xBD -> LATIN CAPITAL LETTER W WITH DIAERESIS + u'\u1e85' # 0xBE -> LATIN SMALL LETTER W WITH DIAERESIS + u'\u1e61' # 0xBF -> LATIN SMALL LETTER S WITH DOT ABOVE + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\u0174' # 0xD0 -> LATIN CAPITAL LETTER W WITH CIRCUMFLEX + u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\u1e6a' # 0xD7 -> LATIN CAPITAL LETTER T WITH DOT ABOVE + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\u0176' # 0xDE -> LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\u0175' # 0xF0 -> LATIN SMALL LETTER W WITH CIRCUMFLEX + u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\u1e6b' # 0xF7 -> LATIN SMALL LETTER T WITH DOT ABOVE + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + u'\u0177' # 0xFE -> LATIN SMALL LETTER Y WITH CIRCUMFLEX + u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_14.pyc b/PythonEnv/2.7/Lib/encodings/iso8859_14.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82d143c7c2842954f81adad68519b074d19f0496 GIT binary patch literal 2879 zcmc&$c~=}o5br%%HV|?v5q0CmdIU@)<}gMQa)=7S*=Q0(*I{QC2KT_3K}4eh3ppT% zxyYRmqsAmAK6CCa`h2eoKFE9qKR~SN2|Ee;59U4HrHk&WneM7z{km#Bf0hROhq@YK z?B2(N|7&p=cTgydHKTMf#my2f){GMmQ(dgX&Eh!svH`|2jBRgrGsPzi9%1ko3?8Nw z34>P{0tJJYDaA~63!9I{af4vN=3~l?Nt<8TN(weVQ%Y&kT*Q=_tT`Yyz?}jtgANAC z(@40C0!W|;HT9V7=~Sq$UDoB8sp_EyxwBJCwT0@^iW&=PMta4HWh&lO4Vgk zRYGw+oeWhrtZizlZ`>5Au8(Y{XR1joUQ$!FW!sj@P`75b(bWRP z#yVVV2mZO4>1G)Z2JJ$9qw~7(%rIx7HipqB<<6+>u26|7;t)0E)`V)mMJE_)A}&JE zQk`9<@I%%0v~Gma$b>K|aaOmg#fEn2@|J|w+A_JH(c(agu-F?2lxEQG1O;>bo0uee z^?_&*cm!Xl#Pq>vB+7$CI7&q*9>RV59K!LQ`(Xmg44{ZcQ*u&`M$MpDB-2V)0+$lm zBnsF$R?MaYorJHmVjKn?=XaNQ%sDuzPsMaKsisUhu|eRf$51Oi1)j~rrOh+EU0~n zd|KcVFBjnWXKXdf!!lgpEHQE&JxD3HIg2$A=S=X< zNxBoPm`y8UqEa~y5%B}wNUE&-*WOV5u5i35KtU<3BYiCj`###87ke(%c)XZ+CB2h# zY@j~63W}fF1$J2zJ7R$9Qic^p!bG1&lP)KfD1$h3uQFo~a|)DTyynytyG7_z)piZk zMINy)VIFZHa`!2^MPkLdcC984L?f(E#nYmiImb$L@g!o2L~uxyp@+z@Nt|v|(J^ev zrrxs%mj)4;xr$wWR|$Uo;@dSsgmbw)UZ1}xP#m05QaZD2*6cZR=gnX6$fM;8AFFu$ zi6=vgo_hM3XP>JKKmWpuFD`AhoAqzK z{Z2#U=B9V0$d>os-@0vk^9L;-eiZ#!ZjC8wyscg9_#}}`r8_^>4YTXB?$3L^_;SZr zUw^}Uc^~iR89u-V`A)uz@8)~>5Fh4y`98j%AK>5egZvOb%#ZM+e1sq4$N33Qe zTpzz}B!h+0XdL~mbhck?wK+{U1eiY?e%9w_&gdn-H@zTz_f HUFQ7@*+{Je literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_15.py b/PythonEnv/2.7/Lib/encodings/iso8859_15.py new file mode 100644 index 0000000000..13b140ca3b --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso8859_15.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_15 generated from 'MAPPINGS/ISO8859/8859-15.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-15', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\u20ac' # 0xA4 -> EURO SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\u0160' # 0xA6 -> LATIN CAPITAL LETTER S WITH CARON + u'\xa7' # 0xA7 -> SECTION SIGN + u'\u0161' # 0xA8 -> LATIN SMALL LETTER S WITH CARON + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\u017d' # 0xB4 -> LATIN CAPITAL LETTER Z WITH CARON + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\u017e' # 0xB8 -> LATIN SMALL LETTER Z WITH CARON + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u0152' # 0xBC -> LATIN CAPITAL LIGATURE OE + u'\u0153' # 0xBD -> LATIN SMALL LIGATURE OE + u'\u0178' # 0xBE -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\xbf' # 0xBF -> INVERTED QUESTION MARK + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH + u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xde' # 0xDE -> LATIN CAPITAL LETTER THORN + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf0' # 0xF0 -> LATIN SMALL LETTER ETH + u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + u'\xfe' # 0xFE -> LATIN SMALL LETTER THORN + u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_15.pyc b/PythonEnv/2.7/Lib/encodings/iso8859_15.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa2cceb34aff7ec32ea048207bcba70cfacd926b GIT binary patch literal 2858 zcmc&$d3O{=5br&+SrWpn!KjN@)`K8utts(8QdezOvES(Ik>`| zaGwc?$bHEz@Ltv1FXC7517KAT*&)$?BJb&Ly3$=W(_QteUstW~&*E@bZ+l%rJo@.') + +no_deps = make_option( + '--no-deps', '--no-dependencies', + dest='ignore_dependencies', + action='store_true', + default=False, + help="Don't install package dependencies.") + +build_dir = make_option( + '-b', '--build', '--build-dir', '--build-directory', + dest='build_dir', + metavar='dir', + default=build_prefix, + help='Directory to unpack packages into and build in. ' + 'The default in a virtualenv is "/build". ' + 'The default for global installs is "/pip_build_".') + +install_options = make_option( + '--install-option', + dest='install_options', + action='append', + metavar='options', + help="Extra arguments to be supplied to the setup.py install " + "command (use like --install-option=\"--install-scripts=/usr/local/bin\"). " + "Use multiple --install-option options to pass multiple options to setup.py install. " + "If you are using an option with a directory path, be sure to use absolute path.") + +global_options = make_option( + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the install command.") + +no_clean = make_option( + '--no-clean', + action='store_true', + default=False, + help="Don't clean up build directories.") + + +########## +# groups # +########## + +index_group = { + 'name': 'Package Index Options', + 'options': [ + index_url, + extra_index_url, + no_index, + find_links, + use_mirrors, + mirrors, + allow_external, + allow_all_external, + no_allow_external, + allow_unsafe, + no_allow_unsafe, + ] + } diff --git a/PythonEnv/2.7/Lib/site-packages/pip/cmdoptions.pyc b/PythonEnv/2.7/Lib/site-packages/pip/cmdoptions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e45e5dfeaff8d095d07e2c844fdc6bd7b29297b9 GIT binary patch literal 4780 zcmcInYj+dJ86HW#U~@6XKrkUNahh1Ptkk3lNvLr#7>E-tjtt>c$2~f$osqQh-q@Kn z_#EmqE3ZbQ^)w;_Tl5l)NlG}cq%uYk`8T^DLvs2QPVg*qYB zoKW*ZofPVnP^X1DBh-R;+nDOkGV&~A7E8=Ip_T|a1Y01_i?_Au?g>U-VB|%ifcbzh z8kB*#1k6--o-xZpU1r#a3>%Yz09P3Nk$795?w(}uRiUmiSRSGIFs4mmWaJq}UT5TQD|{Ci^E=k%EMsm|Fbpj6K5OXju2n6HGo$*`}F5d4N&f6I0|&){2({9`FRT(HK1UEtH( ze7er&`V%|-C#G|RM^?9ENK{3V9n7wUmf4~6=U!CMoW8UY5r-;1|X zQ{80-|G=0>rTp;tW5zsTzLy#Elrh^!Fh4TpL&kKDh_u7nT@gNl;h9j+#Z8UaMNlH< z5J?an?uTFDHuwfcUlK!v`(tsl`;kyTiJj&PN~mRejNDW!87J0{BO~2N$zd92iShr9 zzh)f}dlHY(-P64s#p|bh;UPhrH3FT&qo4VK>LsZj_^&;>I#vAN!?*bs4=co*ns~!0 zy!^Hdse>k?MSXhZm3sTrw#VQ*w@Vs5qDM2qBt8m%}T zwv8Vqfo?PDkq#2`CBS!Gqa~=wcp!6?;U88}Zjo%VS&){W7BAOZhBS2?{o1DPL<4&k zyS&#M%WK$2u19&1zb1)}l(_@weY#Gp4e>7QD*3856lfVF^AVm(`E;MQDh6v67K`Fs z1WQJa;+(f7YZ@D;x@Xf&n++_th7s0>8OdfG1qU*S<2^qbO4owJ03tYnAMKf3I6pF0 zy9#Qv=LUw7v8bR#2K~4fFx(W|7Wjk{1DvA!WGDYIX=|Mr1v|^eiDY7QmO@QEL zEEF$Pdu(V-a2y!k3H>yUQ^REn>t3-ocY$~gS&7c}!SzpbuincA&|^6*F(<@1KvlJ=PvQ$?LS8lO;HjXt`3FC&4Mf*C18{K|@*ha(}^NuPd+#a@Bxoy_|mqsP>IDVY5 zX%W_`ewiUfLLFJ|7nQZ)qR2A-2%cMc49Gzmhiu6qGBJ|X3#?E}J{uwQ@*aSIkEl6P zAj%NM*hjUM)(?@xMYYF~gXq-(S9PpY zl17b6!J;a`Ge}Er<{g0xj^}Ai8n|ZSEcNu5YMC#TlR@k%$8)_=?)Gx4mv2$8L47fw z;QJndIFIQLlr4KAW&IjZ>t%i;W|dA%(J%59%D;|0AFYjo!RMmf18Tg_JT~KK)q)=9 zV#z>OVMWdA8%kxz;i;)GGrv0|?&9Q()_Hkkc0 zU`cL=0SW^{X;<$1sm;f4xH&-z&nGTIhW(9*(-fG=+h#4-j+*}c; zCQFjQ&xbmy(+1;Uf`OqFNqTV@Qh+tV9j#(dqv{@JdwXTFW4zQ)thwFJOxosl)y6cn za=j&=-W% zG;w8^@dE8e=40^5bAZ<}ON!_#qZkR)G8ce4Jgq&=e}Z%qJ-ucu2Zl3^oyu- z84oV1&oF;=uF#5-5d#|cr*U88N}O+Hk#Pr_d5vNDUPt0;XN8DROh1Vu-Jwdvx&cc? zrt=wLR_Q^*emM@Z`FM)ql9>+ QURC;YvyIv;^f>zY4<`QwcmMzZ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/commands/__init__.py new file mode 100644 index 0000000000..e0702d2700 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/commands/__init__.py @@ -0,0 +1,88 @@ +""" +Package containing all pip commands +""" + + +from pip.commands.bundle import BundleCommand +from pip.commands.completion import CompletionCommand +from pip.commands.freeze import FreezeCommand +from pip.commands.help import HelpCommand +from pip.commands.list import ListCommand +from pip.commands.search import SearchCommand +from pip.commands.show import ShowCommand +from pip.commands.install import InstallCommand +from pip.commands.uninstall import UninstallCommand +from pip.commands.unzip import UnzipCommand +from pip.commands.zip import ZipCommand +from pip.commands.wheel import WheelCommand + + +commands = { + BundleCommand.name: BundleCommand, + CompletionCommand.name: CompletionCommand, + FreezeCommand.name: FreezeCommand, + HelpCommand.name: HelpCommand, + SearchCommand.name: SearchCommand, + ShowCommand.name: ShowCommand, + InstallCommand.name: InstallCommand, + UninstallCommand.name: UninstallCommand, + UnzipCommand.name: UnzipCommand, + ZipCommand.name: ZipCommand, + ListCommand.name: ListCommand, + WheelCommand.name: WheelCommand, +} + + +commands_order = [ + InstallCommand, + UninstallCommand, + FreezeCommand, + ListCommand, + ShowCommand, + SearchCommand, + WheelCommand, + ZipCommand, + UnzipCommand, + BundleCommand, + HelpCommand, +] + + +def get_summaries(ignore_hidden=True, ordered=True): + """Yields sorted (command name, command summary) tuples.""" + + if ordered: + cmditems = _sort_commands(commands, commands_order) + else: + cmditems = commands.items() + + for name, command_class in cmditems: + if ignore_hidden and command_class.hidden: + continue + + yield (name, command_class.summary) + + +def get_similar_commands(name): + """Command name auto-correct.""" + from difflib import get_close_matches + + close_commands = get_close_matches(name, commands.keys()) + + if close_commands: + guess = close_commands[0] + else: + guess = False + + return guess + + +def _sort_commands(cmddict, order): + def keyfn(key): + try: + return order.index(key[1]) + except ValueError: + # unordered items should come last + return 0xff + + return sorted(cmddict.items(), key=keyfn) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b35b395c1b500d3fc452293c9f02624a935d147c GIT binary patch literal 2808 zcmcgtTW=dh6#i!IIF94kuA8K3fnq>NuAoK&K@ma-dJ{-h6xPtd%4k{dPV8-Gcf-z@ zHdXqR3V7s&|HwN(pqw*fS8>wk*q-sZ%sF%U&ZY9-M&qALEZ5+s5N8_1P#ZpLaiffB4|3k z4z+=-g`nm5HK;bS4uX#38&H>!brEzOzYcX7*(QQb$2Xz2kZmK_cKim^6=XXIb|BIw zq{qKUSMiywf_|2&LDn2qhpan_mNp&Lf^0de1KDv@7qaW9O~_40Z9{H5ssY(>)DGm1 zrGjg0OGdO4Daj+bCmorPJ)f$M$vT2JAm8L)(!vXR!+w{M zd7q}nUKBr$CbAb7xrx#|%_qG`sor6FNTMu@@0{v%!PyryY2&(h_CG)Nkpk@3p?sgw)Pu}6Xx8dVw`_j*jzu|T;4Lr*1OJe+uV z?jdh7`>28wF#Gftjy>G{Pd6dZy7wGl$j8H6(ZuHEI;L(HKevM2Gzf{PU;oMA{ zI*DE}tY0u;Q6{o9eAm>-OdIwvO_N0CW|heK7JXh|BP5;VMJdBmORNW(xIMDOx#5T7 z!&;m9W?`%%t^1^bo%F9nC0~ptshQ5kqy04hMjezgIYo`rd~{ciXOq$1k(n0xz5Msl z$Aep=2kCgEX{VcqF2?nUqI$Hr)F=!o+)Wq`4v*{sCenoNCaKh)(5{-_0F|2PdQI=L zXp5Q`a}w~eD>UxV(6?!t7d9XhcrG9)1_)0=-y!Z|fDkV~XWXggT_w=-8cdbZCzOYM z_NlM2(^DY!qM0df#zk4m*bGi(A*UN3H&%s~VHTNqDs@UiI1Ct+Bt1A#>Db>P+UFdi z-GImPNLwK9M@mb(t-r-9c$p0f=X3E&cI{*)FCLOjI*^4V%~BPWufmicTyrkM>v&sU zO>B6C3+Du5vcSd`w?Bac>M;U;*tDahBv>8^&O&NL1jUIE!#9pE7Uo(Ns138Esl=vDo9h<112e0NpGZ?lk3Z8Ja4 zk|d3d|1Jsq_gF;(_BK{_A=&G5H0;sPj6Otrb+_Lm!k#b;lOhg7!!Z|Yy?iQ#c^LBvH?b-wYJS&__?{EFewyEN4*9r4<4r6L-y{cfyO OC?(E**Q)LITI+u+l8$=- literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/bundle.py b/PythonEnv/2.7/Lib/site-packages/pip/commands/bundle.py new file mode 100644 index 0000000000..0b7f15093a --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/commands/bundle.py @@ -0,0 +1,53 @@ +import textwrap +from pip.locations import build_prefix, src_prefix +from pip.util import display_path, backup_dir +from pip.log import logger +from pip.exceptions import InstallationError +from pip.commands.install import InstallCommand + + +class BundleCommand(InstallCommand): + """Create pybundles (archives containing multiple packages).""" + name = 'bundle' + usage = """ + %prog [options] .pybundle ...""" + summary = 'Create pybundles.' + bundle = True + + def __init__(self, *args, **kw): + super(BundleCommand, self).__init__(*args, **kw) + # bundle uses different default source and build dirs + build_opt = self.parser.get_option("--build") + build_opt.default = backup_dir(build_prefix, '-bundle') + src_opt = self.parser.get_option("--src") + src_opt.default = backup_dir(src_prefix, '-bundle') + self.parser.set_defaults(**{ + src_opt.dest: src_opt.default, + build_opt.dest: build_opt.default, + }) + + def run(self, options, args): + + deprecation = textwrap.dedent(""" + + ############################################### + ## ## + ## Due to lack of interest and maintenance, ## + ## 'pip bundle' and support for installing ## + ## from *.pybundle files is now deprecated, ## + ## and will be removed in pip v1.5. ## + ## ## + ############################################### + + """) + logger.notify(deprecation) + + if not args: + raise InstallationError('You must give a bundle filename') + # We have to get everything when creating a bundle: + options.ignore_installed = True + logger.notify('Putting temporary build files in %s and source/develop files in %s' + % (display_path(options.build_dir), display_path(options.src_dir))) + self.bundle_filename = args.pop(0) + requirement_set = super(BundleCommand, self).run(options, args) + return requirement_set diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/bundle.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/bundle.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69b805eb7b9d9322400dac6cb9e9b2431bab9220 GIT binary patch literal 2755 zcmcguTW=gS6h1S1Np`bo3xWuQ083HT1(8KX;#Nf!H01#ag=&ISby*nA&UiOY=Z5Xc zMM_^OMB&pg+(3kGSC${Gt+vl9`e4ftV>%%|(45O6VUkCrcKr@da zGW-RU6HR?Tq&%P^q-jV+ho&70SffLEmx>-udsOsk+V`_v%2%jZrRl04_b4AwF{J6x zkNcFbQ8A+F2;&u!BU%KMt2bg-^&#?Vxs>hr6^y?wjZN}Av8pP+(zy5X1B&*>d^+XIVgtJh5yuFyjbj(hI?+aIho+^pv5#TIB@>~MWvfgs5+oyX7-O^=XttBa@^Lb0 z?3lN5BO~*L>m+(FgUdpBZK4))`o4wW?>SN4A;y*Z>L<*B0mAT!WzC z&G6O0KciqhNZD_8gWC?8`5glJKLFs*a|{%8I4MYZ03?{3>^0{zpvM7~Fz7Kz;y%H5 zsG>07FJ=x_S*Ps}xW5Q#qg@6mM%7>d#KddN3Mj}HbXQu?0acH>430e)>|OI0QZj6- zz}Ld&i~XLl^=teuxw-kA?cGKSTZtU?DyoH0rIi}M5Fi&(psKAblQNYbh)Zm5AYa0# z>4q}^XzNN_v8Xgwava92aGC8wSA}^0qRVR1LThVO@eTMbZXMu+vO< zhKc%KV=YI^$^t=5^a-?Z!8j#ErWDtW4|3J$RDPJrLz!3g)2|g)q48A+#~D^0+asOS zjx#cu$W4G!&pl1_dB|KG$61x4&%tLcNAQio z{pcgv;4arE(HnRjG1)u9i+KABhhG}m@_{*ThQBuY0Ur3waxfb6RP;K8`|d!!P4Wt5 z$~U;XdHij|F7Ug?s@$Q+T}{qaZ?g0-.') + + cmd_opts.add_option( + '-d', '--download', '--download-dir', '--download-directory', + dest='download_dir', + metavar='dir', + default=None, + help="Download packages into instead of installing them, regardless of what's already installed.") + + cmd_opts.add_option(cmdoptions.download_cache) + + cmd_opts.add_option( + '--src', '--source', '--source-dir', '--source-directory', + dest='src_dir', + metavar='dir', + default=src_prefix, + help='Directory to check out editable projects into. ' + 'The default in a virtualenv is "/src". ' + 'The default for global installs is "/src".') + + cmd_opts.add_option( + '-U', '--upgrade', + dest='upgrade', + action='store_true', + help='Upgrade all packages to the newest available version. ' + 'This process is recursive regardless of whether a dependency is already satisfied.') + + cmd_opts.add_option( + '--force-reinstall', + dest='force_reinstall', + action='store_true', + help='When upgrading, reinstall all packages even if they are ' + 'already up-to-date.') + + cmd_opts.add_option( + '-I', '--ignore-installed', + dest='ignore_installed', + action='store_true', + help='Ignore the installed packages (reinstalling instead).') + + cmd_opts.add_option(cmdoptions.no_deps) + + cmd_opts.add_option( + '--no-install', + dest='no_install', + action='store_true', + help="Download and unpack all packages, but don't actually install them.") + + cmd_opts.add_option( + '--no-download', + dest='no_download', + action="store_true", + help="Don't download any packages, just install the ones already downloaded " + "(completes an install run with --no-install).") + + cmd_opts.add_option(cmdoptions.install_options) + cmd_opts.add_option(cmdoptions.global_options) + + cmd_opts.add_option( + '--user', + dest='use_user_site', + action='store_true', + help='Install using the user scheme.') + + cmd_opts.add_option( + '--egg', + dest='as_egg', + action='store_true', + help="Install as self contained egg file, like easy_install does.") + + cmd_opts.add_option( + '--root', + dest='root_path', + metavar='dir', + default=None, + help="Install everything relative to this alternate root directory.") + + cmd_opts.add_option(cmdoptions.use_wheel) + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help="Include pre-release and development versions. By default, pip only finds stable versions.") + + cmd_opts.add_option(cmdoptions.no_clean) + + index_opts = cmdoptions.make_option_group(cmdoptions.index_group, self.parser) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def _build_package_finder(self, options, index_urls): + """ + Create a package finder appropriate to this install command. + This method is meant to be overridden by subclasses, not + called directly. + """ + return PackageFinder(find_links=options.find_links, + index_urls=index_urls, + use_mirrors=options.use_mirrors, + mirrors=options.mirrors, + use_wheel=options.use_wheel, + allow_external=options.allow_external, + allow_insecure=options.allow_insecure, + allow_all_external=options.allow_all_external, + allow_all_insecure=options.allow_all_insecure, + allow_all_prereleases=options.pre, + ) + + def run(self, options, args): + if options.download_dir: + options.no_install = True + options.ignore_installed = True + options.build_dir = os.path.abspath(options.build_dir) + options.src_dir = os.path.abspath(options.src_dir) + install_options = options.install_options or [] + if options.use_user_site: + if virtualenv_no_global(): + raise InstallationError("Can not perform a '--user' install. User site-packages are not visible in this virtualenv.") + install_options.append('--user') + + temp_target_dir = None + if options.target_dir: + options.ignore_installed = True + temp_target_dir = tempfile.mkdtemp() + options.target_dir = os.path.abspath(options.target_dir) + if os.path.exists(options.target_dir) and not os.path.isdir(options.target_dir): + raise CommandError("Target path exists but is not a directory, will not continue.") + install_options.append('--home=' + temp_target_dir) + + global_options = options.global_options or [] + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.notify('Ignoring indexes: %s' % ','.join(index_urls)) + index_urls = [] + + finder = self._build_package_finder(options, index_urls) + + requirement_set = RequirementSet( + build_dir=options.build_dir, + src_dir=options.src_dir, + download_dir=options.download_dir, + download_cache=options.download_cache, + upgrade=options.upgrade, + as_egg=options.as_egg, + ignore_installed=options.ignore_installed, + ignore_dependencies=options.ignore_dependencies, + force_reinstall=options.force_reinstall, + use_user_site=options.use_user_site, + target_dir=temp_target_dir) + for name in args: + requirement_set.add_requirement( + InstallRequirement.from_line(name, None)) + for name in options.editables: + requirement_set.add_requirement( + InstallRequirement.from_editable(name, default_vcs=options.default_vcs)) + for filename in options.requirements: + for req in parse_requirements(filename, finder=finder, options=options): + requirement_set.add_requirement(req) + if not requirement_set.has_requirements: + opts = {'name': self.name} + if options.find_links: + msg = ('You must give at least one requirement to %(name)s ' + '(maybe you meant "pip %(name)s %(links)s"?)' % + dict(opts, links=' '.join(options.find_links))) + else: + msg = ('You must give at least one requirement ' + 'to %(name)s (see "pip help %(name)s")' % opts) + logger.warn(msg) + return + + try: + if not options.no_download: + requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle) + else: + requirement_set.locate_files() + + if not options.no_install and not self.bundle: + requirement_set.install(install_options, global_options, root=options.root_path) + installed = ' '.join([req.name for req in + requirement_set.successfully_installed]) + if installed: + logger.notify('Successfully installed %s' % installed) + elif not self.bundle: + downloaded = ' '.join([req.name for req in + requirement_set.successfully_downloaded]) + if downloaded: + logger.notify('Successfully downloaded %s' % downloaded) + elif self.bundle: + requirement_set.create_bundle(self.bundle_filename) + logger.notify('Created bundle in %s' % self.bundle_filename) + except PreviousBuildDirError: + return + finally: + # Clean up + if (not options.no_clean) and ((not options.no_install) or options.download_dir): + requirement_set.cleanup_files(bundle=self.bundle) + + if options.target_dir: + if not os.path.exists(options.target_dir): + os.makedirs(options.target_dir) + lib_dir = distutils_scheme('', home=temp_target_dir)['purelib'] + for item in os.listdir(lib_dir): + shutil.move( + os.path.join(lib_dir, item), + os.path.join(options.target_dir, item) + ) + shutil.rmtree(temp_target_dir) + return requirement_set diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/install.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/install.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6ef06bc67552fda452dcc7cfcfabf3b9000277b GIT binary patch literal 8887 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/list.py b/PythonEnv/2.7/Lib/site-packages/pip/commands/list.py new file mode 100644 index 0000000000..aaae7694db --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/commands/list.py @@ -0,0 +1,147 @@ +from pip.basecommand import Command +from pip.exceptions import DistributionNotFound, BestVersionAlreadyInstalled +from pip.index import PackageFinder +from pip.log import logger +from pip.req import InstallRequirement +from pip.util import get_installed_distributions, dist_is_editable +from pip.cmdoptions import make_option_group, index_group + + +class ListCommand(Command): + """List installed packages, including editables.""" + name = 'list' + usage = """ + %prog [options]""" + summary = 'List installed packages.' + + # distributions to skip (python itself is reported by pkg_resources.working_set) + skip = ['python'] + + def __init__(self, *args, **kw): + super(ListCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-o', '--outdated', + action='store_true', + default=False, + help='List outdated packages (excluding editables)') + cmd_opts.add_option( + '-u', '--uptodate', + action='store_true', + default=False, + help='List uptodate packages (excluding editables)') + cmd_opts.add_option( + '-e', '--editable', + action='store_true', + default=False, + help='List editable projects.') + cmd_opts.add_option( + '-l', '--local', + action='store_true', + default=False, + help='If in a virtualenv that has global access, do not list globally-installed packages.') + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help="Include pre-release and development versions. By default, pip only finds stable versions.") + + index_opts = make_option_group(index_group, self.parser) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def _build_package_finder(self, options, index_urls): + """ + Create a package finder appropriate to this list command. + """ + return PackageFinder(find_links=options.find_links, + index_urls=index_urls, + use_mirrors=options.use_mirrors, + mirrors=options.mirrors, + allow_external=options.allow_external, + allow_insecure=options.allow_insecure, + allow_all_external=options.allow_all_external, + allow_all_insecure=options.allow_all_insecure, + allow_all_prereleases=options.pre, + ) + + def run(self, options, args): + if options.outdated: + self.run_outdated(options) + elif options.uptodate: + self.run_uptodate(options) + elif options.editable: + self.run_editables(options) + else: + self.run_listing(options) + + def run_outdated(self, options): + for dist, remote_version_raw, remote_version_parsed in self.find_packages_latests_versions(options): + if remote_version_parsed > dist.parsed_version: + logger.notify('%s (Current: %s Latest: %s)' % (dist.project_name, + dist.version, remote_version_raw)) + + def find_packages_latests_versions(self, options): + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.notify('Ignoring indexes: %s' % ','.join(index_urls)) + index_urls = [] + + dependency_links = [] + for dist in get_installed_distributions(local_only=options.local, skip=self.skip): + if dist.has_metadata('dependency_links.txt'): + dependency_links.extend( + dist.get_metadata_lines('dependency_links.txt'), + ) + + finder = self._build_package_finder(options, index_urls) + finder.add_dependency_links(dependency_links) + + installed_packages = get_installed_distributions(local_only=options.local, include_editables=False, skip=self.skip) + for dist in installed_packages: + req = InstallRequirement.from_line(dist.key, None) + try: + link = finder.find_requirement(req, True) + + # If link is None, means installed version is most up-to-date + if link is None: + continue + except DistributionNotFound: + continue + except BestVersionAlreadyInstalled: + remote_version = req.installed_version + else: + # It might be a good idea that link or finder had a public method + # that returned version + remote_version = finder._link_package_versions(link, req.name)[0] + remote_version_raw = remote_version[2] + remote_version_parsed = remote_version[0] + yield dist, remote_version_raw, remote_version_parsed + + def run_listing(self, options): + installed_packages = get_installed_distributions(local_only=options.local, skip=self.skip) + self.output_package_listing(installed_packages) + + def run_editables(self, options): + installed_packages = get_installed_distributions(local_only=options.local, editables_only=True) + self.output_package_listing(installed_packages) + + def output_package_listing(self, installed_packages): + installed_packages = sorted(installed_packages, key=lambda dist: dist.project_name.lower()) + for dist in installed_packages: + if dist_is_editable(dist): + line = '%s (%s, %s)' % (dist.project_name, dist.version, dist.location) + else: + line = '%s (%s)' % (dist.project_name, dist.version) + logger.notify(line) + + def run_uptodate(self, options): + uptodate = [] + for dist, remote_version_raw, remote_version_parsed in self.find_packages_latests_versions(options): + if dist.parsed_version == remote_version_parsed: + uptodate.append(dist) + self.output_package_listing(uptodate) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/list.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/list.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c38fee1312a870e2380c2e33e890e45a18c4a7c GIT binary patch literal 6463 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.""" + name = 'search' + usage = """ + %prog [options] """ + summary = 'Search PyPI for packages.' + + def __init__(self, *args, **kw): + super(SearchCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '--index', + dest='index', + metavar='URL', + default='https://pypi.python.org/pypi', + help='Base URL of Python Package Index (default %default)') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + raise CommandError('Missing required argument (search query).') + query = args + index_url = options.index + + pypi_hits = self.search(query, index_url) + hits = transform_hits(pypi_hits) + + terminal_width = None + if sys.stdout.isatty(): + terminal_width = get_terminal_size()[0] + + print_results(hits, terminal_width=terminal_width) + if pypi_hits: + return SUCCESS + return NO_MATCHES_FOUND + + def search(self, query, index_url): + pypi = xmlrpclib.ServerProxy(index_url) + hits = pypi.search({'name': query, 'summary': query}, 'or') + return hits + + +def transform_hits(hits): + """ + The list from pypi is really a list of versions. We want a list of + packages with the list of versions stored inline. This converts the + list from pypi into one we can use. + """ + packages = {} + for hit in hits: + name = hit['name'] + summary = hit['summary'] + version = hit['version'] + score = hit['_pypi_ordering'] + if score is None: + score = 0 + + if name not in packages.keys(): + packages[name] = {'name': name, 'summary': summary, 'versions': [version], 'score': score} + else: + packages[name]['versions'].append(version) + + # if this is the highest version, replace summary and score + if version == highest_version(packages[name]['versions']): + packages[name]['summary'] = summary + packages[name]['score'] = score + + # each record has a unique name now, so we will convert the dict into a list sorted by score + package_list = sorted(packages.values(), key=lambda x: x['score'], reverse=True) + return package_list + + +def print_results(hits, name_column_width=25, terminal_width=None): + installed_packages = [p.project_name for p in pkg_resources.working_set] + for hit in hits: + name = hit['name'] + summary = hit['summary'] or '' + if terminal_width is not None: + # wrap and indent summary to fit terminal + summary = textwrap.wrap(summary, terminal_width - name_column_width - 5) + summary = ('\n' + ' ' * (name_column_width + 3)).join(summary) + line = '%s - %s' % (name.ljust(name_column_width), summary) + try: + logger.notify(line) + if name in installed_packages: + dist = pkg_resources.get_distribution(name) + logger.indent += 2 + try: + latest = highest_version(hit['versions']) + if dist.version == latest: + logger.notify('INSTALLED: %s (latest)' % dist.version) + else: + logger.notify('INSTALLED: %s' % dist.version) + logger.notify('LATEST: %s' % latest) + finally: + logger.indent -= 2 + except UnicodeEncodeError: + pass + + +def compare_versions(version1, version2): + try: + return cmp(StrictVersion(version1), StrictVersion(version2)) + # in case of abnormal version number, fall back to LooseVersion + except ValueError: + pass + try: + return cmp(LooseVersion(version1), LooseVersion(version2)) + except TypeError: + # certain LooseVersion comparions raise due to unorderable types, + # fallback to string comparison + return cmp([str(v) for v in LooseVersion(version1).version], + [str(v) for v in LooseVersion(version2).version]) + + +def highest_version(versions): + return reduce((lambda v1, v2: compare_versions(v1, v2) == 1 and v1 or v2), versions) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/search.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/search.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc1154a128eadebef513ecfe249f6a5e5e676f75 GIT binary patch literal 5726 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 ...""" + summary = 'Show information about installed packages.' + + def __init__(self, *args, **kw): + super(ShowCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-f', '--files', + dest='files', + action='store_true', + default=False, + help='Show the full list of installed files for each package.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + logger.warn('ERROR: Please provide a package name or names.') + return + query = args + + results = search_packages_info(query) + print_results(results, options.files) + + +def search_packages_info(query): + """ + Gather details from installed distributions. Print distribution name, + version, location, and installed files. Installed files requires a + pip generated 'installed-files.txt' in the distributions '.egg-info' + directory. + """ + installed_packages = dict( + [(p.project_name.lower(), p) for p in pkg_resources.working_set]) + for name in query: + normalized_name = name.lower() + if normalized_name in installed_packages: + dist = installed_packages[normalized_name] + package = { + 'name': dist.project_name, + 'version': dist.version, + 'location': dist.location, + 'requires': [dep.project_name for dep in dist.requires()], + } + filelist = os.path.join( + dist.location, + dist.egg_name() + '.egg-info', + 'installed-files.txt') + if os.path.isfile(filelist): + package['files'] = filelist + yield package + + +def print_results(distributions, list_all_files): + """ + Print the informations from installed distributions found. + """ + for dist in distributions: + logger.notify("---") + logger.notify("Name: %s" % dist['name']) + logger.notify("Version: %s" % dist['version']) + logger.notify("Location: %s" % dist['location']) + logger.notify("Requires: %s" % ', '.join(dist['requires'])) + if list_all_files: + logger.notify("Files:") + if 'files' in dist: + for line in open(dist['files']): + logger.notify(" %s" % line.strip()) + else: + logger.notify("Cannot locate installed-files.txt") diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/show.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/show.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1d0bf5cd9eafb4e889823d0985abb19bd3296d2 GIT binary patch literal 3547 zcmcgv&u<%55T0E-c9JHv6xtFf)$*gnK)ez?q*YW}AZZa&l~x<65yt6iv-|9^{1#ch4(6{3Ux4XioPK_ zA^Ngaqo~F&tvW?@X-u>7jm9)KivPyndc#7~)FD>0em_W~vZIEMBb0qcYuMBO|2@M2;*QITLE*#HkjjWGB~U7$-}WljTl7%N0ho36exb&L9YPgRau9sq%U()$gJ)>&V~rL7sJ;ud)H_(Ob^# z;q*I>>$>`b|K99hHVFBE92$1OLp=Hkgu&OMBRJTmo=rz++w_dcLRYUsJscT+fD_;W zv~hNvx=scS_d3yw|$6A)6h|QE4_iaiX-GHo`9y5tUu+ zz#!z4nprfpfv0?v7fQkzsZLNNMi%aGJHML!I+m8;-PL|$FpSEwfH`@>5?Y54MYL4=$J%|VGu!Mkab6&ZFLyyDp5*~d4 zf~*B=2A`UI>UPLx^11kT6_5TH0_mWyaGLax2Ns=JWn|HPTp=9c2+_9axJsr%M^#QB zCw6#5Ya78R~)PFc&i*&+!T{;}uZj zNrjH5N0a90Xqt`9f9J-L6s_ASwyD!&Yws4}y9pNEXs|Q%9}q(Op9f&H+=-M4;zT>0 zJnK(TS_G2I8Z*!SZK*fvQSFVl7oskp-lMEb-oyvqmnRl zwO7PIg%gMxP>Iu3smcR`inTbdEhUw^=D;jMr^7rvX^3_fUDfS28KaA$D1y=uw0`Ky zt9Om#&N(tPR2X+;tGtXX(d?qJHa#TTvWA|TA-G>}FdqmmqBt}qJM4Cu8?qt~QFE9D z_p^LAPP;w`+%Nz^NIlr*kD-)g`zQ);VaR)%#XAtf*jZV;28fbu(#sG5Mk~%*F6W96 zYj&kX)_aYYGM5buv(MOnV;U!llvwpTy?k9Yw!O$!%K!@l7ljOj0S|RGKV=$Gw)Y)v?)^N{_L6AZs}sJP(Rm=7>#Sabkc2P6 z$~c+09{xYVad|1ysKkq|KvA>V)SPYW;QSTmx|ZD0oYId=v`Z)Ftq|{nA@Ze{6Ipt_ zA;7s;Zf8r5B)H}P-RBG1ieO1|&>Wt`3RiRK?XvQ#A=aI~pi24}k4xakb9U>>?ks^bCtCn9$nxpR69CyzHeJ(#qfJCKDy YZkM-;JIqg#8w}(N)`iODt20;s0nHgz+yDRo literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/uninstall.py b/PythonEnv/2.7/Lib/site-packages/pip/commands/uninstall.py new file mode 100644 index 0000000000..388053b20f --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/commands/uninstall.py @@ -0,0 +1,54 @@ +from pip.req import InstallRequirement, RequirementSet, parse_requirements +from pip.basecommand import Command +from pip.exceptions import InstallationError + + +class UninstallCommand(Command): + """ + Uninstall packages. + + pip is able to uninstall most installed packages. Known exceptions are: + + - Pure distutils packages installed with ``python setup.py install``, which + leave behind no metadata to determine what files were installed. + - Script wrappers installed by ``python setup.py develop``. + """ + name = 'uninstall' + usage = """ + %prog [options] ... + %prog [options] -r ...""" + summary = 'Uninstall packages.' + + def __init__(self, *args, **kw): + super(UninstallCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Uninstall all the packages listed in the given requirements file. ' + 'This option can be used multiple times.') + self.cmd_opts.add_option( + '-y', '--yes', + dest='yes', + action='store_true', + help="Don't ask for confirmation of uninstall deletions.") + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + requirement_set = RequirementSet( + build_dir=None, + src_dir=None, + download_dir=None) + for name in args: + requirement_set.add_requirement( + InstallRequirement.from_line(name)) + for filename in options.requirements: + for req in parse_requirements(filename, options=options): + requirement_set.add_requirement(req) + if not requirement_set.has_requirements: + raise InstallationError('You must give at least one requirement ' + 'to %(name)s (see "pip help %(name)s")' % dict(name=self.name)) + requirement_set.uninstall(auto_confirm=options.yes) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/uninstall.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/uninstall.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f154572d21bc4286e27e456cbfe2ad9b6901035 GIT binary patch literal 2743 zcmc&$%Z?jG6uoVa?aU;TOcDr03aAt%iX&kQWrGx=2*PB6h=!<#Fp6>1)9xzUHR)HX zs^=liYzP}R?Dz-%g5P1!2f(@29=nCI4z{~okNd29&b8ZrZ*KhlS1U|t@oMAyD?Ii` z3=*G!Qlc!NQ9xOXMlH(PG-^}8XDv$CDC^LuQ?J{Ub}8%8sE73$sSZs8k{$Ym=q=I9 z(FKxS+U@sXTK|JrpS`(j7{1M|i_gwnXXHCtBZ>Sw zg!GWrsJloH8Hc<5F6%yll?{Q{(v2wN4gw)nmPN#OM)i89V-CXSNmnUvsu#7{+i6R*Uh z#qB;8!(pu}#D8T5Mm%al#s}^d>~&avN2Lg6?&-ZxjuNWLY0i6QQEjnn?DdsKu zjVQp@L7NVM4nPKY0a!2xOaPD`&A=64f1Tt8$%|0#G!!n8-1G{Uy}}hQv<0EI7wXUf zY+Plh@BqKeyxl&NX2-TL4vgg(2ZKg}ZVfw9S?4Zc(m1e=F&Za~qI!zrCv6)%N#e03!$4Gv#F=q1Ncm}pslkuL;zfPw{ z$;ND=^YONtRI~AO&*i82;rPMui}5o(8C&ht;Jnj}(PPF*-45+|$s@2nWaQkyV{c)g z;AXIncX#pbwa!<)R>D`!ZPm9{eA_=UfC7whjDR^tAf3B=`>ajJcbE>_uWr%V8l8d; zEke0KiqkcE8}KK1bDQ>#zhvSZbRhXToptE=9s!D{zNg~gZ4hj~x=v@<@+MBZwWgxI zH_vE~H+y9N;1Ypg=o8==lVbx>1UKO1=YVqZ$`_e@?CTPr)x_b#?)dI9sdOqMsf|ax zHHn`yVI;b3TEwfvMYFNbaQL#QfKoJS2Dd;HM8CwUKu>G{otx#|ejaD)z7>6|l(@}p zpDDE5zkT0>frUIz;xQ(Z^er>1EQ1GDwZ9~+<1H|K~ wh6Gock0!BIi~bOD>HOaI^KIqrAW8KaLUt*hmfJ6>z15p$mL(e;u45MHb z5Fnalj0A{mFCwnZzueIVW+je(Q|$jAM;z4bEB+0 zTjJO LGpE|PyXl8NkS~)l literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/wheel.py b/PythonEnv/2.7/Lib/site-packages/pip/commands/wheel.py new file mode 100644 index 0000000000..5bf1c2333b --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/commands/wheel.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +import os +import sys +from pip.basecommand import Command +from pip.index import PackageFinder +from pip.log import logger +from pip.exceptions import CommandError, PreviousBuildDirError +from pip.req import InstallRequirement, RequirementSet, parse_requirements +from pip.util import normalize_path +from pip.wheel import WheelBuilder, wheel_setuptools_support, setuptools_requirement +from pip import cmdoptions + +DEFAULT_WHEEL_DIR = os.path.join(normalize_path(os.curdir), 'wheelhouse') + +class WheelCommand(Command): + """ + Build Wheel archives for your requirements and dependencies. + + Wheel is a built-package format, and offers the advantage of not recompiling your software during every install. + For more details, see the wheel docs: http://wheel.readthedocs.org/en/latest. + + Requirements: setuptools>=0.8, and wheel. + + 'pip wheel' uses the bdist_wheel setuptools extension from the wheel package to build individual wheels. + + """ + + name = 'wheel' + usage = """ + %prog [options] ... + %prog [options] -r ... + %prog [options] ... + %prog [options] ... + %prog [options] ...""" + + summary = 'Build wheels from your requirements.' + + def __init__(self, *args, **kw): + super(WheelCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-w', '--wheel-dir', + dest='wheel_dir', + metavar='dir', + default=DEFAULT_WHEEL_DIR, + help="Build wheels into , where the default is '/wheelhouse'.") + cmd_opts.add_option(cmdoptions.use_wheel) + cmd_opts.add_option( + '--build-option', + dest='build_options', + metavar='options', + action='append', + help="Extra arguments to be supplied to 'setup.py bdist_wheel'.") + cmd_opts.add_option(cmdoptions.requirements) + cmd_opts.add_option(cmdoptions.download_cache) + cmd_opts.add_option(cmdoptions.no_deps) + cmd_opts.add_option(cmdoptions.build_dir) + + cmd_opts.add_option( + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the 'bdist_wheel' command.") + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help="Include pre-release and development versions. By default, pip only finds stable versions.") + + cmd_opts.add_option(cmdoptions.no_clean) + + index_opts = cmdoptions.make_option_group(cmdoptions.index_group, self.parser) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + + # confirm requirements + try: + import wheel.bdist_wheel + except ImportError: + raise CommandError("'pip wheel' requires bdist_wheel from the 'wheel' distribution.") + if not wheel_setuptools_support(): + raise CommandError("'pip wheel' requires %s." % setuptools_requirement) + + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.notify('Ignoring indexes: %s' % ','.join(index_urls)) + index_urls = [] + + finder = PackageFinder(find_links=options.find_links, + index_urls=index_urls, + use_mirrors=options.use_mirrors, + mirrors=options.mirrors, + use_wheel=options.use_wheel, + allow_external=options.allow_external, + allow_insecure=options.allow_insecure, + allow_all_external=options.allow_all_external, + allow_all_insecure=options.allow_all_insecure, + allow_all_prereleases=options.pre, + ) + + options.build_dir = os.path.abspath(options.build_dir) + requirement_set = RequirementSet( + build_dir=options.build_dir, + src_dir=None, + download_dir=None, + download_cache=options.download_cache, + ignore_dependencies=options.ignore_dependencies, + ignore_installed=True) + + #parse args and/or requirements files + for name in args: + if name.endswith(".whl"): + logger.notify("ignoring %s" % name) + continue + requirement_set.add_requirement( + InstallRequirement.from_line(name, None)) + + for filename in options.requirements: + for req in parse_requirements(filename, finder=finder, options=options): + if req.editable or (req.name is None and req.url.endswith(".whl")): + logger.notify("ignoring %s" % req.url) + continue + requirement_set.add_requirement(req) + + #fail if no requirements + if not requirement_set.has_requirements: + opts = {'name': self.name} + msg = ('You must give at least one requirement ' + 'to %(name)s (see "pip help %(name)s")' % opts) + logger.error(msg) + return + + try: + #build wheels + wb = WheelBuilder( + requirement_set, + finder, + options.wheel_dir, + build_options = options.build_options or [], + global_options = options.global_options or [] + ) + wb.build() + except PreviousBuildDirError: + return + finally: + if not options.no_clean: + requirement_set.cleanup_files() + diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/wheel.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e8c33da4a4cfc29d43a3cc250c185a66cc3b97c GIT binary patch literal 5527 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/zip.py b/PythonEnv/2.7/Lib/site-packages/pip/commands/zip.py new file mode 100644 index 0000000000..11ac919846 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/commands/zip.py @@ -0,0 +1,348 @@ +import sys +import re +import fnmatch +import os +import shutil +import zipfile +from pip.util import display_path, backup_dir, rmtree +from pip.log import logger +from pip.exceptions import InstallationError +from pip.basecommand import Command + + +class ZipCommand(Command): + """Zip individual packages.""" + name = 'zip' + usage = """ + %prog [options] ...""" + summary = 'Zip individual packages.' + + def __init__(self, *args, **kw): + super(ZipCommand, self).__init__(*args, **kw) + if self.name == 'zip': + self.cmd_opts.add_option( + '--unzip', + action='store_true', + dest='unzip', + help='Unzip (rather than zip) a package.') + else: + self.cmd_opts.add_option( + '--zip', + action='store_false', + dest='unzip', + default=True, + help='Zip (rather than unzip) a package.') + self.cmd_opts.add_option( + '--no-pyc', + action='store_true', + dest='no_pyc', + help='Do not include .pyc files in zip files (useful on Google App Engine).') + self.cmd_opts.add_option( + '-l', '--list', + action='store_true', + dest='list', + help='List the packages available, and their zip status.') + self.cmd_opts.add_option( + '--sort-files', + action='store_true', + dest='sort_files', + help='With --list, sort packages according to how many files they contain.') + self.cmd_opts.add_option( + '--path', + action='append', + dest='paths', + help='Restrict operations to the given paths (may include wildcards).') + self.cmd_opts.add_option( + '-n', '--simulate', + action='store_true', + help='Do not actually perform the zip/unzip operation.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def paths(self): + """All the entries of sys.path, possibly restricted by --path""" + if not self.select_paths: + return sys.path + result = [] + match_any = set() + for path in sys.path: + path = os.path.normcase(os.path.abspath(path)) + for match in self.select_paths: + match = os.path.normcase(os.path.abspath(match)) + if '*' in match: + if re.search(fnmatch.translate(match + '*'), path): + result.append(path) + match_any.add(match) + break + else: + if path.startswith(match): + result.append(path) + match_any.add(match) + break + else: + logger.debug("Skipping path %s because it doesn't match %s" + % (path, ', '.join(self.select_paths))) + for match in self.select_paths: + if match not in match_any and '*' not in match: + result.append(match) + logger.debug("Adding path %s because it doesn't match " + "anything already on sys.path" % match) + return result + + def run(self, options, args): + self.select_paths = options.paths + self.simulate = options.simulate + if options.list: + return self.list(options, args) + if not args: + raise InstallationError( + 'You must give at least one package to zip or unzip') + packages = [] + for arg in args: + module_name, filename = self.find_package(arg) + if options.unzip and os.path.isdir(filename): + raise InstallationError( + 'The module %s (in %s) is not a zip file; cannot be unzipped' + % (module_name, filename)) + elif not options.unzip and not os.path.isdir(filename): + raise InstallationError( + 'The module %s (in %s) is not a directory; cannot be zipped' + % (module_name, filename)) + packages.append((module_name, filename)) + last_status = None + for module_name, filename in packages: + if options.unzip: + last_status = self.unzip_package(module_name, filename) + else: + last_status = self.zip_package(module_name, filename, options.no_pyc) + return last_status + + def unzip_package(self, module_name, filename): + zip_filename = os.path.dirname(filename) + if not os.path.isfile(zip_filename) and zipfile.is_zipfile(zip_filename): + raise InstallationError( + 'Module %s (in %s) isn\'t located in a zip file in %s' + % (module_name, filename, zip_filename)) + package_path = os.path.dirname(zip_filename) + if not package_path in self.paths(): + logger.warn( + 'Unpacking %s into %s, but %s is not on sys.path' + % (display_path(zip_filename), display_path(package_path), + display_path(package_path))) + logger.notify('Unzipping %s (in %s)' % (module_name, display_path(zip_filename))) + if self.simulate: + logger.notify('Skipping remaining operations because of --simulate') + return + logger.indent += 2 + try: + ## FIXME: this should be undoable: + zip = zipfile.ZipFile(zip_filename) + to_save = [] + for info in zip.infolist(): + name = info.filename + if name.startswith(module_name + os.path.sep): + content = zip.read(name) + dest = os.path.join(package_path, name) + if not os.path.exists(os.path.dirname(dest)): + os.makedirs(os.path.dirname(dest)) + if not content and dest.endswith(os.path.sep): + if not os.path.exists(dest): + os.makedirs(dest) + else: + f = open(dest, 'wb') + f.write(content) + f.close() + else: + to_save.append((name, zip.read(name))) + zip.close() + if not to_save: + logger.info('Removing now-empty zip file %s' % display_path(zip_filename)) + os.unlink(zip_filename) + self.remove_filename_from_pth(zip_filename) + else: + logger.info('Removing entries in %s/ from zip file %s' % (module_name, display_path(zip_filename))) + zip = zipfile.ZipFile(zip_filename, 'w') + for name, content in to_save: + zip.writestr(name, content) + zip.close() + finally: + logger.indent -= 2 + + def zip_package(self, module_name, filename, no_pyc): + orig_filename = filename + logger.notify('Zip %s (in %s)' % (module_name, display_path(filename))) + logger.indent += 2 + if filename.endswith('.egg'): + dest_filename = filename + else: + dest_filename = filename + '.zip' + try: + ## FIXME: I think this needs to be undoable: + if filename == dest_filename: + filename = backup_dir(orig_filename) + logger.notify('Moving %s aside to %s' % (orig_filename, filename)) + if not self.simulate: + shutil.move(orig_filename, filename) + try: + logger.info('Creating zip file in %s' % display_path(dest_filename)) + if not self.simulate: + zip = zipfile.ZipFile(dest_filename, 'w') + zip.writestr(module_name + '/', '') + for dirpath, dirnames, filenames in os.walk(filename): + if no_pyc: + filenames = [f for f in filenames + if not f.lower().endswith('.pyc')] + for fns, is_dir in [(dirnames, True), (filenames, False)]: + for fn in fns: + full = os.path.join(dirpath, fn) + dest = os.path.join(module_name, dirpath[len(filename):].lstrip(os.path.sep), fn) + if is_dir: + zip.writestr(dest + '/', '') + else: + zip.write(full, dest) + zip.close() + logger.info('Removing old directory %s' % display_path(filename)) + if not self.simulate: + rmtree(filename) + except: + ## FIXME: need to do an undo here + raise + ## FIXME: should also be undone: + self.add_filename_to_pth(dest_filename) + finally: + logger.indent -= 2 + + def remove_filename_from_pth(self, filename): + for pth in self.pth_files(): + f = open(pth, 'r') + lines = f.readlines() + f.close() + new_lines = [ + l for l in lines if l.strip() != filename] + if lines != new_lines: + logger.info('Removing reference to %s from .pth file %s' + % (display_path(filename), display_path(pth))) + if not [line for line in new_lines if line]: + logger.info('%s file would be empty: deleting' % display_path(pth)) + if not self.simulate: + os.unlink(pth) + else: + if not self.simulate: + f = open(pth, 'wb') + f.writelines(new_lines) + f.close() + return + logger.warn('Cannot find a reference to %s in any .pth file' % display_path(filename)) + + def add_filename_to_pth(self, filename): + path = os.path.dirname(filename) + dest = filename + '.pth' + if path not in self.paths(): + logger.warn('Adding .pth file %s, but it is not on sys.path' % display_path(dest)) + if not self.simulate: + if os.path.exists(dest): + f = open(dest) + lines = f.readlines() + f.close() + if lines and not lines[-1].endswith('\n'): + lines[-1] += '\n' + lines.append(filename + '\n') + else: + lines = [filename + '\n'] + f = open(dest, 'wb') + f.writelines(lines) + f.close() + + def pth_files(self): + for path in self.paths(): + if not os.path.exists(path) or not os.path.isdir(path): + continue + for filename in os.listdir(path): + if filename.endswith('.pth'): + yield os.path.join(path, filename) + + def find_package(self, package): + for path in self.paths(): + full = os.path.join(path, package) + if os.path.exists(full): + return package, full + if not os.path.isdir(path) and zipfile.is_zipfile(path): + zip = zipfile.ZipFile(path, 'r') + try: + zip.read(os.path.join(package, '__init__.py')) + except KeyError: + pass + else: + zip.close() + return package, full + zip.close() + ## FIXME: need special error for package.py case: + raise InstallationError( + 'No package with the name %s found' % package) + + def list(self, options, args): + if args: + raise InstallationError( + 'You cannot give an argument with --list') + for path in sorted(self.paths()): + if not os.path.exists(path): + continue + basename = os.path.basename(path.rstrip(os.path.sep)) + if os.path.isfile(path) and zipfile.is_zipfile(path): + if os.path.dirname(path) not in self.paths(): + logger.notify('Zipped egg: %s' % display_path(path)) + continue + if (basename != 'site-packages' and basename != 'dist-packages' + and not path.replace('\\', '/').endswith('lib/python')): + continue + logger.notify('In %s:' % display_path(path)) + logger.indent += 2 + zipped = [] + unzipped = [] + try: + for filename in sorted(os.listdir(path)): + ext = os.path.splitext(filename)[1].lower() + if ext in ('.pth', '.egg-info', '.egg-link'): + continue + if ext == '.py': + logger.info('Not displaying %s: not a package' % display_path(filename)) + continue + full = os.path.join(path, filename) + if os.path.isdir(full): + unzipped.append((filename, self.count_package(full))) + elif zipfile.is_zipfile(full): + zipped.append(filename) + else: + logger.info('Unknown file: %s' % display_path(filename)) + if zipped: + logger.notify('Zipped packages:') + logger.indent += 2 + try: + for filename in zipped: + logger.notify(filename) + finally: + logger.indent -= 2 + else: + logger.notify('No zipped packages.') + if unzipped: + if options.sort_files: + unzipped.sort(key=lambda x: -x[1]) + logger.notify('Unzipped packages:') + logger.indent += 2 + try: + for filename, count in unzipped: + logger.notify('%s (%i files)' % (filename, count)) + finally: + logger.indent -= 2 + else: + logger.notify('No unzipped packages.') + finally: + logger.indent -= 2 + + def count_package(self, path): + total = 0 + for dirpath, dirnames, filenames in os.walk(path): + filenames = [f for f in filenames + if not f.lower().endswith('.pyc')] + total += len(filenames) + return total diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/zip.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/zip.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c3e176d2fc464de4ae6a395fffbcae93c5a5d4a GIT binary patch literal 12107 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 py2.5 + if hasattr(self, 'timeout'): + self.connection_kwargs.update(timeout = self.timeout) + + # for >= py2.7 + if hasattr(self, 'source_address'): + self.connection_kwargs.update(source_address = self.source_address) + + sock = socket.create_connection((self.host, self.port), **self.connection_kwargs) + + # for >= py2.7 + if getattr(self, '_tunnel_host', None): + self.sock = sock + self._tunnel() + + # get alternate bundle or use our included bundle + cert_path = os.environ.get('PIP_CERT', '') or default_cert_path + + self.sock = ssl.wrap_socket(sock, + self.key_file, + self.cert_file, + cert_reqs=ssl.CERT_REQUIRED, + ca_certs=cert_path) + + try: + match_hostname(self.sock.getpeercert(), self.host) + except CertificateError: + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + + +class VerifiedHTTPSHandler(urllib2.HTTPSHandler): + """ + A HTTPSHandler that uses our own VerifiedHTTPSConnection. + """ + def __init__(self, connection_class = VerifiedHTTPSConnection): + self.specialized_conn_class = connection_class + urllib2.HTTPSHandler.__init__(self) + def https_open(self, req): + return self.do_open(self.specialized_conn_class, req) + + +class URLOpener(object): + """ + pip's own URL helper that adds HTTP auth and proxy support + """ + def __init__(self): + self.passman = urllib2.HTTPPasswordMgrWithDefaultRealm() + self.proxy_handler = None + + def __call__(self, url): + """ + If the given url contains auth info or if a normal request gets a 401 + response, an attempt is made to fetch the resource using basic HTTP + auth. + + """ + url, username, password, scheme = self.extract_credentials(url) + if username is None: + try: + response = self.get_opener(scheme=scheme).open(url) + except urllib2.HTTPError: + e = sys.exc_info()[1] + if e.code != 401: + raise + response = self.get_response(url) + else: + response = self.get_response(url, username, password) + return response + + def get_request(self, url): + """ + Wraps the URL to retrieve to protects against "creative" + interpretation of the RFC: http://bugs.python.org/issue8732 + """ + if isinstance(url, string_types): + url = urllib2.Request(url, headers={'Accept-encoding': 'identity'}) + return url + + def get_response(self, url, username=None, password=None): + """ + does the dirty work of actually getting the rsponse object using urllib2 + and its HTTP auth builtins. + """ + scheme, netloc, path, query, frag = urlparse.urlsplit(url) + req = self.get_request(url) + + stored_username, stored_password = self.passman.find_user_password(None, netloc) + # see if we have a password stored + if stored_username is None: + if username is None and self.prompting: + username = urllib.quote(raw_input('User for %s: ' % netloc)) + password = urllib.quote(getpass.getpass('Password: ')) + if username and password: + self.passman.add_password(None, netloc, username, password) + stored_username, stored_password = self.passman.find_user_password(None, netloc) + authhandler = urllib2.HTTPBasicAuthHandler(self.passman) + opener = self.get_opener(authhandler, scheme=scheme) + # FIXME: should catch a 401 and offer to let the user reenter credentials + return opener.open(req) + + def get_opener(self, *args, **kwargs): + """ + Build an OpenerDirector instance based on the scheme and proxy option + """ + + args = list(args) + if self.proxy_handler: + args.extend([self.proxy_handler, urllib2.CacheFTPHandler]) + + if kwargs.get('scheme') == 'https': + https_handler = VerifiedHTTPSHandler() + director = urllib2.build_opener(https_handler, *args) + #strip out HTTPHandler to prevent MITM spoof + for handler in director.handlers: + if isinstance(handler, urllib2.HTTPHandler): + director.handlers.remove(handler) + else: + director = urllib2.build_opener(*args) + + # Add our new headers to the opener + headers = [x for x in director.addheaders if x[0].lower() != "user-agent"] + headers.append(("User-agent", build_user_agent())) + director.addheaders = headers + + return director + + def setup(self, proxystr='', prompting=True): + """ + Sets the proxy handler given the option passed on the command + line. If an empty string is passed it looks at the HTTP_PROXY + environment variable. + """ + self.prompting = prompting + proxy = self.get_proxy(proxystr) + if proxy: + self.proxy_handler = urllib2.ProxyHandler({"http": proxy, "ftp": proxy, "https": proxy}) + + def parse_credentials(self, netloc): + if "@" in netloc: + userinfo = netloc.rsplit("@", 1)[0] + if ":" in userinfo: + return userinfo.split(":", 1) + return userinfo, None + return None, None + + def extract_credentials(self, url): + """ + Extracts user/password from a url. + + Returns a tuple: + (url-without-auth, username, password) + """ + if isinstance(url, urllib2.Request): + result = urlparse.urlsplit(url.get_full_url()) + else: + result = urlparse.urlsplit(url) + scheme, netloc, path, query, frag = result + + username, password = self.parse_credentials(netloc) + if username is None: + return url, None, None, scheme + elif password is None and self.prompting: + # remove the auth credentials from the url part + netloc = netloc.replace('%s@' % username, '', 1) + # prompt for the password + prompt = 'Password for %s@%s: ' % (username, netloc) + password = urllib.quote(getpass.getpass(prompt)) + else: + # remove the auth credentials from the url part + netloc = netloc.replace('%s:%s@' % (username, password), '', 1) + + target_url = urlparse.urlunsplit((scheme, netloc, path, query, frag)) + return target_url, username, password, scheme + + def get_proxy(self, proxystr=''): + """ + Get the proxy given the option passed on the command line. + If an empty string is passed it looks at the HTTP_PROXY + environment variable. + """ + if not proxystr: + proxystr = os.environ.get('HTTP_PROXY', '') + if proxystr: + if '@' in proxystr: + user_password, server_port = proxystr.split('@', 1) + if ':' in user_password: + user, password = user_password.split(':', 1) + else: + user = user_password + prompt = 'Password for %s@%s: ' % (user, server_port) + password = urllib.quote(getpass.getpass(prompt)) + return '%s:%s@%s' % (user, password, server_port) + else: + return proxystr + else: + return None + +urlopen = URLOpener() + + +def is_url(name): + """Returns true if the name looks like a URL""" + if ':' not in name: + return False + scheme = name.split(':', 1)[0].lower() + return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes + + +def url_to_path(url): + """ + Convert a file: URL to a path. + """ + assert url.startswith('file:'), ( + "You can only turn file: urls into filenames (not %r)" % url) + path = url[len('file:'):].lstrip('/') + path = urllib.unquote(path) + if _url_drive_re.match(path): + path = path[0] + ':' + path[2:] + else: + path = '/' + path + return path + + +_drive_re = re.compile('^([a-z]):', re.I) +_url_drive_re = re.compile('^([a-z])[:|]', re.I) + + +def path_to_url(path): + """ + Convert a path to a file: URL. The path will be made absolute. + """ + path = os.path.normcase(os.path.abspath(path)) + if _drive_re.match(path): + path = path[0] + '|' + path[2:] + url = urllib.quote(path) + url = url.replace(os.path.sep, '/') + url = url.lstrip('/') + return 'file:///' + url + + +def path_to_url2(path): + """ + Convert a path to a file: URL. The path will be made absolute and have + quoted path parts. + """ + path = os.path.normpath(os.path.abspath(path)) + drive, path = os.path.splitdrive(path) + filepath = path.split(os.path.sep) + url = '/'.join([urllib.quote(part) for part in filepath]) + if not drive: + url = url.lstrip('/') + return 'file:///' + drive + url + + +def geturl(urllib2_resp): + """ + Use instead of urllib.addinfourl.geturl(), which appears to have + some issues with dropping the double slash for certain schemes + (e.g. file://). This implementation is probably over-eager, as it + always restores '://' if it is missing, and it appears some url + schemata aren't always followed by '//' after the colon, but as + far as I know pip doesn't need any of those. + The URI RFC can be found at: http://tools.ietf.org/html/rfc1630 + + This function assumes that + scheme:/foo/bar + is the same as + scheme:///foo/bar + """ + url = urllib2_resp.geturl() + scheme, rest = url.split(':', 1) + if rest.startswith('//'): + return url + else: + # FIXME: write a good test to cover it + return '%s://%s' % (scheme, rest) + + +def is_archive_file(name): + """Return True if `name` is a considered as an archive file.""" + archives = ('.zip', '.tar.gz', '.tar.bz2', '.tgz', '.tar', '.pybundle', + '.whl') + ext = splitext(name)[1].lower() + if ext in archives: + return True + return False + + +def unpack_vcs_link(link, location, only_download=False): + vcs_backend = _get_used_vcs_backend(link) + if only_download: + vcs_backend.export(location) + else: + vcs_backend.unpack(location) + + +def unpack_file_url(link, location): + source = url_to_path(link.url) + content_type = mimetypes.guess_type(source)[0] + if os.path.isdir(source): + # delete the location since shutil will create it again :( + if os.path.isdir(location): + rmtree(location) + shutil.copytree(source, location) + else: + unpack_file(source, location, content_type, link) + + +def _get_used_vcs_backend(link): + for backend in vcs.backends: + if link.scheme in backend.schemes: + vcs_backend = backend(link.url) + return vcs_backend + + +def is_vcs_url(link): + return bool(_get_used_vcs_backend(link)) + + +def is_file_url(link): + return link.url.lower().startswith('file:') + + +def _check_hash(download_hash, link): + if download_hash.digest_size != hashlib.new(link.hash_name).digest_size: + logger.fatal("Hash digest size of the package %d (%s) doesn't match the expected hash name %s!" + % (download_hash.digest_size, link, link.hash_name)) + raise HashMismatch('Hash name mismatch for package %s' % link) + if download_hash.hexdigest() != link.hash: + logger.fatal("Hash of the package %s (%s) doesn't match the expected hash %s!" + % (link, download_hash.hexdigest(), link.hash)) + raise HashMismatch('Bad %s hash for package %s' % (link.hash_name, link)) + + +def _get_hash_from_file(target_file, link): + try: + download_hash = hashlib.new(link.hash_name) + except (ValueError, TypeError): + logger.warn("Unsupported hash name %s for package %s" % (link.hash_name, link)) + return None + + fp = open(target_file, 'rb') + while True: + chunk = fp.read(4096) + if not chunk: + break + download_hash.update(chunk) + fp.close() + return download_hash + + +def _download_url(resp, link, temp_location): + fp = open(temp_location, 'wb') + download_hash = None + if link.hash and link.hash_name: + try: + download_hash = hashlib.new(link.hash_name) + except ValueError: + logger.warn("Unsupported hash name %s for package %s" % (link.hash_name, link)) + try: + total_length = int(resp.info()['content-length']) + except (ValueError, KeyError, TypeError): + total_length = 0 + downloaded = 0 + show_progress = total_length > 40 * 1000 or not total_length + show_url = link.show_url + try: + if show_progress: + ## FIXME: the URL can get really long in this message: + if total_length: + logger.start_progress('Downloading %s (%s): ' % (show_url, format_size(total_length))) + else: + logger.start_progress('Downloading %s (unknown size): ' % show_url) + else: + logger.notify('Downloading %s' % show_url) + logger.info('Downloading from URL %s' % link) + + while True: + chunk = resp.read(4096) + if not chunk: + break + downloaded += len(chunk) + if show_progress: + if not total_length: + logger.show_progress('%s' % format_size(downloaded)) + else: + logger.show_progress('%3i%% %s' % (100 * downloaded / total_length, format_size(downloaded))) + if download_hash is not None: + download_hash.update(chunk) + fp.write(chunk) + fp.close() + finally: + if show_progress: + logger.end_progress('%s downloaded' % format_size(downloaded)) + return download_hash + + +def _copy_file(filename, location, content_type, link): + copy = True + download_location = os.path.join(location, link.filename) + if os.path.exists(download_location): + response = ask_path_exists( + 'The file %s exists. (i)gnore, (w)ipe, (b)ackup ' % + display_path(download_location), ('i', 'w', 'b')) + if response == 'i': + copy = False + elif response == 'w': + logger.warn('Deleting %s' % display_path(download_location)) + os.remove(download_location) + elif response == 'b': + dest_file = backup_dir(download_location) + logger.warn('Backing up %s to %s' + % (display_path(download_location), display_path(dest_file))) + shutil.move(download_location, dest_file) + if copy: + shutil.copy(filename, download_location) + logger.indent -= 2 + logger.notify('Saved %s' % display_path(download_location)) + + +def unpack_http_url(link, location, download_cache, download_dir=None): + temp_dir = tempfile.mkdtemp('-unpack', 'pip-') + temp_location = None + target_url = link.url.split('#', 1)[0] + + already_cached = False + cache_file = None + cache_content_type_file = None + download_hash = None + if download_cache: + cache_file = os.path.join(download_cache, + urllib.quote(target_url, '')) + cache_content_type_file = cache_file + '.content-type' + already_cached = ( + os.path.exists(cache_file) and + os.path.exists(cache_content_type_file) + ) + if not os.path.isdir(download_cache): + create_download_cache_folder(download_cache) + + already_downloaded = None + if download_dir: + already_downloaded = os.path.join(download_dir, link.filename) + if not os.path.exists(already_downloaded): + already_downloaded = None + + if already_downloaded: + temp_location = already_downloaded + content_type = mimetypes.guess_type(already_downloaded)[0] + logger.notify('File was already downloaded %s' % already_downloaded) + if link.hash: + download_hash = _get_hash_from_file(temp_location, link) + try: + _check_hash(download_hash, link) + except HashMismatch: + logger.warn( + 'Previously-downloaded file %s has bad hash, ' + 're-downloading.' % temp_location + ) + temp_location = None + os.unlink(already_downloaded) + already_downloaded = None + + # We have a cached file, and we haven't already found a good downloaded copy + if already_cached and not temp_location: + with open(cache_content_type_file) as fp: + content_type = fp.read().strip() + temp_location = cache_file + logger.notify('Using download cache from %s' % cache_file) + if link.hash and link.hash_name: + download_hash = _get_hash_from_file(cache_file, link) + try: + _check_hash(download_hash, link) + except HashMismatch: + logger.warn( + 'Cached file %s has bad hash, ' + 're-downloading.' % temp_location + ) + temp_location = None + os.unlink(cache_file) + os.unlink(cache_content_type_file) + already_cached = False + + # We don't have either a cached or a downloaded copy + if not temp_location: + resp = _get_response_from_url(target_url, link) + content_type = resp.info().get('content-type', '') + filename = link.filename # fallback + # Have a look at the Content-Disposition header for a better guess + content_disposition = resp.info().get('content-disposition') + if content_disposition: + type, params = cgi.parse_header(content_disposition) + # We use ``or`` here because we don't want to use an "empty" value + # from the filename param. + filename = params.get('filename') or filename + ext = splitext(filename)[1] + if not ext: + ext = mimetypes.guess_extension(content_type) + if ext: + filename += ext + if not ext and link.url != geturl(resp): + ext = os.path.splitext(geturl(resp))[1] + if ext: + filename += ext + temp_location = os.path.join(temp_dir, filename) + download_hash = _download_url(resp, link, temp_location) + if link.hash and link.hash_name: + _check_hash(download_hash, link) + + if download_dir and not already_downloaded: + _copy_file(temp_location, download_dir, content_type, link) + unpack_file(temp_location, location, content_type, link) + if cache_file and not already_cached: + cache_download(cache_file, temp_location, content_type) + if not (already_cached or already_downloaded): + os.unlink(temp_location) + os.rmdir(temp_dir) + + +def _get_response_from_url(target_url, link): + try: + resp = urlopen(target_url) + except urllib2.HTTPError: + e = sys.exc_info()[1] + logger.fatal("HTTP error %s while getting %s" % (e.code, link)) + raise + except IOError: + e = sys.exc_info()[1] + # Typically an FTP error + logger.fatal("Error %s while getting %s" % (e, link)) + raise + return resp + + +class Urllib2HeadRequest(urllib2.Request): + def get_method(self): + return "HEAD" diff --git a/PythonEnv/2.7/Lib/site-packages/pip/download.pyc b/PythonEnv/2.7/Lib/site-packages/pip/download.pyc new file mode 100644 index 0000000000000000000000000000000000000000..878e2f57524df70cd5b56dc47e2f864c2839942a GIT binary patch literal 23806 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/index.py b/PythonEnv/2.7/Lib/site-packages/pip/index.py new file mode 100644 index 0000000000..98a6cac5b5 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/index.py @@ -0,0 +1,1041 @@ +"""Routines related to PyPI, indexes""" + +import sys +import os +import re +import gzip +import mimetypes +import posixpath +import pkg_resources +import random +import socket +import ssl +import string +import zlib + +try: + import threading +except ImportError: + import dummy_threading as threading + +from pip.log import logger +from pip.util import Inf, normalize_name, splitext, is_prerelease +from pip.exceptions import DistributionNotFound, BestVersionAlreadyInstalled,\ + InstallationError +from pip.backwardcompat import (WindowsError, BytesIO, + Queue, urlparse, + URLError, HTTPError, u, + product, url2pathname, + Empty as QueueEmpty) +from pip.backwardcompat import CertificateError +from pip.download import urlopen, path_to_url2, url_to_path, geturl, Urllib2HeadRequest +from pip.wheel import Wheel, wheel_ext, wheel_setuptools_support, setuptools_requirement +from pip.pep425tags import supported_tags, supported_tags_noarch, get_platform +from pip.vendor import html5lib + +__all__ = ['PackageFinder'] + + +DEFAULT_MIRROR_HOSTNAME = "last.pypi.python.org" + + +class PackageFinder(object): + """This finds packages. + + This is meant to match easy_install's technique for looking for + packages, by reading pages and looking for appropriate links + """ + + def __init__(self, find_links, index_urls, + use_mirrors=False, mirrors=None, main_mirror_url=None, + use_wheel=False, allow_external=[], allow_insecure=[], + allow_all_external=False, allow_all_insecure=False, + allow_all_prereleases=False): + self.find_links = find_links + self.index_urls = index_urls + self.dependency_links = [] + self.cache = PageCache() + # These are boring links that have already been logged somehow: + self.logged_links = set() + if use_mirrors: + self.mirror_urls = self._get_mirror_urls(mirrors, main_mirror_url) + logger.info('Using PyPI mirrors: %s' % ', '.join(self.mirror_urls)) + else: + self.mirror_urls = [] + self.use_wheel = use_wheel + + # Do we allow (safe and verifiable) externally hosted files? + self.allow_external = set(normalize_name(n) for n in allow_external) + + # Which names are allowed to install insecure and unverifiable files? + self.allow_insecure = set(normalize_name(n) for n in allow_insecure) + + # Do we allow all (safe and verifiable) externally hosted files? + self.allow_all_external = allow_all_external + + # Do we allow unsafe and unverifiable files? + self.allow_all_insecure = allow_all_insecure + + # Stores if we ignored any external links so that we can instruct + # end users how to install them if no distributions are available + self.need_warn_external = False + + # Stores if we ignored any unsafe links so that we can instruct + # end users how to install them if no distributions are available + self.need_warn_insecure = False + + # Do we want to allow _all_ pre-releases? + self.allow_all_prereleases = allow_all_prereleases + + @property + def use_wheel(self): + return self._use_wheel + + @use_wheel.setter + def use_wheel(self, value): + self._use_wheel = value + if self._use_wheel and not wheel_setuptools_support(): + raise InstallationError("pip's wheel support requires %s." % setuptools_requirement) + + def add_dependency_links(self, links): + ## FIXME: this shouldn't be global list this, it should only + ## apply to requirements of the package that specifies the + ## dependency_links value + ## FIXME: also, we should track comes_from (i.e., use Link) + self.dependency_links.extend(links) + + def _sort_locations(self, locations): + """ + Sort locations into "files" (archives) and "urls", and return + a pair of lists (files,urls) + """ + files = [] + urls = [] + + # puts the url for the given file path into the appropriate list + def sort_path(path): + url = path_to_url2(path) + if mimetypes.guess_type(url, strict=False)[0] == 'text/html': + urls.append(url) + else: + files.append(url) + + for url in locations: + + is_local_path = os.path.exists(url) + is_file_url = url.startswith('file:') + is_find_link = url in self.find_links + + if is_local_path or is_file_url: + if is_local_path: + path = url + else: + path = url_to_path(url) + if is_find_link and os.path.isdir(path): + path = os.path.realpath(path) + for item in os.listdir(path): + sort_path(os.path.join(path, item)) + elif is_file_url and os.path.isdir(path): + urls.append(url) + elif os.path.isfile(path): + sort_path(path) + else: + urls.append(url) + + return files, urls + + def _link_sort_key(self, link_tuple): + """ + Function used to generate link sort key for link tuples. + The greater the return value, the more preferred it is. + If not finding wheels, then sorted by version only. + If finding wheels, then the sort order is by version, then: + 1. existing installs + 2. wheels ordered via Wheel.support_index_min() + 3. source archives + Note: it was considered to embed this logic into the Link + comparison operators, but then different sdist links + with the same version, would have to be considered equal + """ + parsed_version, link, _ = link_tuple + if self.use_wheel: + support_num = len(supported_tags) + if link == InfLink: # existing install + pri = 1 + elif link.wheel: + # all wheel links are known to be supported at this stage + pri = -(link.wheel.support_index_min()) + else: # sdist + pri = -(support_num) + return (parsed_version, pri) + else: + return parsed_version + + def _sort_versions(self, applicable_versions): + """ + Bring the latest version (and wheels) to the front, but maintain the existing ordering as secondary. + See the docstring for `_link_sort_key` for details. + This function is isolated for easier unit testing. + """ + return sorted(applicable_versions, key=self._link_sort_key, reverse=True) + + def find_requirement(self, req, upgrade): + + def mkurl_pypi_url(url): + loc = posixpath.join(url, url_name) + # For maximum compatibility with easy_install, ensure the path + # ends in a trailing slash. Although this isn't in the spec + # (and PyPI can handle it without the slash) some other index + # implementations might break if they relied on easy_install's behavior. + if not loc.endswith('/'): + loc = loc + '/' + return loc + + url_name = req.url_name + # Only check main index if index URL is given: + main_index_url = None + if self.index_urls: + # Check that we have the url_name correctly spelled: + main_index_url = Link(mkurl_pypi_url(self.index_urls[0]), trusted=True) + # This will also cache the page, so it's okay that we get it again later: + page = self._get_page(main_index_url, req) + if page is None: + url_name = self._find_url_name(Link(self.index_urls[0], trusted=True), url_name, req) or req.url_name + + # Combine index URLs with mirror URLs here to allow + # adding more index URLs from requirements files + all_index_urls = self.index_urls + self.mirror_urls + + if url_name is not None: + locations = [ + mkurl_pypi_url(url) + for url in all_index_urls] + self.find_links + else: + locations = list(self.find_links) + for version in req.absolute_versions: + if url_name is not None and main_index_url is not None: + locations = [ + posixpath.join(main_index_url.url, version)] + locations + + file_locations, url_locations = self._sort_locations(locations) + _flocations, _ulocations = self._sort_locations(self.dependency_links) + file_locations.extend(_flocations) + + # We trust every url that the user has given us whether it was given + # via --index-url, --user-mirrors/--mirror, or --find-links or a + # default option thereof + locations = [Link(url, trusted=True) for url in url_locations] + + # We explicitly do not trust links that came from dependency_links + locations.extend([Link(url) for url in _ulocations]) + + logger.debug('URLs to search for versions for %s:' % req) + for location in locations: + logger.debug('* %s' % location) + found_versions = [] + found_versions.extend( + self._package_versions( + # We trust every directly linked archive in find_links + [Link(url, '-f', trusted=True) for url in self.find_links], req.name.lower())) + page_versions = [] + for page in self._get_pages(locations, req): + logger.debug('Analyzing links from page %s' % page.url) + logger.indent += 2 + try: + page_versions.extend(self._package_versions(page.links, req.name.lower())) + finally: + logger.indent -= 2 + dependency_versions = list(self._package_versions( + [Link(url) for url in self.dependency_links], req.name.lower())) + if dependency_versions: + logger.info('dependency_links found: %s' % ', '.join([link.url for parsed, link, version in dependency_versions])) + file_versions = list(self._package_versions( + [Link(url) for url in file_locations], req.name.lower())) + if not found_versions and not page_versions and not dependency_versions and not file_versions: + logger.fatal('Could not find any downloads that satisfy the requirement %s' % req) + + if self.need_warn_external: + logger.warn("Some externally hosted files were ignored (use " + "--allow-external %s to allow)." % req.name) + + if self.need_warn_insecure: + logger.warn("Some insecure and unverifiable files were ignored" + " (use --allow-insecure %s to allow)." % req.name) + + raise DistributionNotFound('No distributions at all found for %s' % req) + installed_version = [] + if req.satisfied_by is not None: + installed_version = [(req.satisfied_by.parsed_version, InfLink, req.satisfied_by.version)] + if file_versions: + file_versions.sort(reverse=True) + logger.info('Local files found: %s' % ', '.join([url_to_path(link.url) for parsed, link, version in file_versions])) + #this is an intentional priority ordering + all_versions = installed_version + file_versions + found_versions + page_versions + dependency_versions + applicable_versions = [] + for (parsed_version, link, version) in all_versions: + if version not in req.req: + logger.info("Ignoring link %s, version %s doesn't match %s" + % (link, version, ','.join([''.join(s) for s in req.req.specs]))) + continue + elif is_prerelease(version) and not (self.allow_all_prereleases or req.prereleases): + # If this version isn't the already installed one, then + # ignore it if it's a pre-release. + if link is not InfLink: + logger.info("Ignoring link %s, version %s is a pre-release (use --pre to allow)." % (link, version)) + continue + applicable_versions.append((parsed_version, link, version)) + applicable_versions = self._sort_versions(applicable_versions) + existing_applicable = bool([link for parsed_version, link, version in applicable_versions if link is InfLink]) + if not upgrade and existing_applicable: + if applicable_versions[0][1] is InfLink: + logger.info('Existing installed version (%s) is most up-to-date and satisfies requirement' + % req.satisfied_by.version) + else: + logger.info('Existing installed version (%s) satisfies requirement (most up-to-date version is %s)' + % (req.satisfied_by.version, applicable_versions[0][2])) + return None + if not applicable_versions: + logger.fatal('Could not find a version that satisfies the requirement %s (from versions: %s)' + % (req, ', '.join([version for parsed_version, link, version in all_versions]))) + + if self.need_warn_external: + logger.warn("Some externally hosted files were ignored (use " + "--allow-external to allow).") + + if self.need_warn_insecure: + logger.warn("Some insecure and unverifiable files were ignored" + " (use --allow-insecure %s to allow)." % req.name) + + raise DistributionNotFound('No distributions matching the version for %s' % req) + if applicable_versions[0][1] is InfLink: + # We have an existing version, and its the best version + logger.info('Installed version (%s) is most up-to-date (past versions: %s)' + % (req.satisfied_by.version, ', '.join([version for parsed_version, link, version in applicable_versions[1:]]) or 'none')) + raise BestVersionAlreadyInstalled + if len(applicable_versions) > 1: + logger.info('Using version %s (newest of versions: %s)' % + (applicable_versions[0][2], ', '.join([version for parsed_version, link, version in applicable_versions]))) + + selected_version = applicable_versions[0][1] + + # TODO: Remove after 1.4 has been released + if (selected_version.internal is not None + and not selected_version.internal): + logger.warn("You are installing an externally hosted file. Future " + "versions of pip will default to disallowing " + "externally hosted files.") + + if (selected_version.verifiable is not None + and not selected_version.verifiable): + logger.warn("You are installing a potentially insecure and " + "unverifiable file. Future versions of pip will " + "default to disallowing insecure files.") + + return selected_version + + + def _find_url_name(self, index_url, url_name, req): + """Finds the true URL name of a package, when the given name isn't quite correct. + This is usually used to implement case-insensitivity.""" + if not index_url.url.endswith('/'): + # Vaguely part of the PyPI API... weird but true. + ## FIXME: bad to modify this? + index_url.url += '/' + page = self._get_page(index_url, req) + if page is None: + logger.fatal('Cannot fetch index base URL %s' % index_url) + return + norm_name = normalize_name(req.url_name) + for link in page.links: + base = posixpath.basename(link.path.rstrip('/')) + if norm_name == normalize_name(base): + logger.notify('Real name of requirement %s is %s' % (url_name, base)) + return base + return None + + def _get_pages(self, locations, req): + """Yields (page, page_url) from the given locations, skipping + locations that have errors, and adding download/homepage links""" + pending_queue = Queue() + for location in locations: + pending_queue.put(location) + done = [] + seen = set() + threads = [] + for i in range(min(10, len(locations))): + t = threading.Thread(target=self._get_queued_page, args=(req, pending_queue, done, seen)) + t.setDaemon(True) + threads.append(t) + t.start() + for t in threads: + t.join() + return done + + _log_lock = threading.Lock() + + def _get_queued_page(self, req, pending_queue, done, seen): + while 1: + try: + location = pending_queue.get(False) + except QueueEmpty: + return + if location in seen: + continue + seen.add(location) + page = self._get_page(location, req) + if page is None: + continue + done.append(page) + for link in page.rel_links(): + normalized = normalize_name(req.name).lower() + + if (not normalized in self.allow_external + and not self.allow_all_external): + self.need_warn_external = True + logger.debug("Not searching %s for files because external " + "urls are disallowed." % link) + continue + + if (link.trusted is not None + and not link.trusted + and not normalized in self.allow_insecure + and not self.allow_all_insecure): # TODO: Remove after release + logger.debug("Not searching %s for urls, it is an " + "untrusted link and cannot produce safe or " + "verifiable files." % link) + self.need_warn_insecure = True + continue + + pending_queue.put(link) + + _egg_fragment_re = re.compile(r'#egg=([^&]*)') + _egg_info_re = re.compile(r'([a-z0-9_.]+)-([a-z0-9_.-]+)', re.I) + _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') + + def _sort_links(self, links): + "Returns elements of links in order, non-egg links first, egg links second, while eliminating duplicates" + eggs, no_eggs = [], [] + seen = set() + for link in links: + if link not in seen: + seen.add(link) + if link.egg_fragment: + eggs.append(link) + else: + no_eggs.append(link) + return no_eggs + eggs + + def _package_versions(self, links, search_name): + for link in self._sort_links(links): + for v in self._link_package_versions(link, search_name): + yield v + + def _known_extensions(self): + extensions = ('.tar.gz', '.tar.bz2', '.tar', '.tgz', '.zip') + if self.use_wheel: + return extensions + (wheel_ext,) + return extensions + + def _link_package_versions(self, link, search_name): + """ + Return an iterable of triples (pkg_resources_version_key, + link, python_version) that can be extracted from the given + link. + + Meant to be overridden by subclasses, not called by clients. + """ + platform = get_platform() + + version = None + if link.egg_fragment: + egg_info = link.egg_fragment + else: + egg_info, ext = link.splitext() + if not ext: + if link not in self.logged_links: + logger.debug('Skipping link %s; not a file' % link) + self.logged_links.add(link) + return [] + if egg_info.endswith('.tar'): + # Special double-extension case: + egg_info = egg_info[:-4] + ext = '.tar' + ext + if ext not in self._known_extensions(): + if link not in self.logged_links: + logger.debug('Skipping link %s; unknown archive format: %s' % (link, ext)) + self.logged_links.add(link) + return [] + if "macosx10" in link.path and ext == '.zip': + if link not in self.logged_links: + logger.debug('Skipping link %s; macosx10 one' % (link)) + self.logged_links.add(link) + return [] + if link.wheel and link.wheel.name.lower() == search_name.lower(): + version = link.wheel.version + if not link.wheel.supported(): + logger.debug('Skipping %s because it is not compatible with this Python' % link) + return [] + + # This is a dirty hack to prevent installing Binary Wheels from + # PyPI or one of its mirrors unless it is a Windows Binary + # Wheel. This is paired with a change to PyPI disabling + # uploads for the same. Once we have a mechanism for enabling + # support for binary wheels on linux that deals with the + # inherent problems of binary distribution this can be + # removed. + comes_from = getattr(link, "comes_from", None) + if (not platform.startswith('win') + and comes_from is not None + and urlparse.urlparse(comes_from.url).netloc.endswith( + "pypi.python.org")): + if not link.wheel.supported(tags=supported_tags_noarch): + logger.debug( + "Skipping %s because it is a pypi-hosted binary " + "Wheel on an unsupported platform" % link + ) + return [] + + if not version: + version = self._egg_info_matches(egg_info, search_name, link) + if version is None: + logger.debug('Skipping link %s; wrong project name (not %s)' % (link, search_name)) + return [] + + if (link.internal is not None + and not link.internal + and not normalize_name(search_name).lower() in self.allow_external + and not self.allow_all_external): + # We have a link that we are sure is external, so we should skip + # it unless we are allowing externals + logger.debug("Skipping %s because it is externally hosted." % link) + self.need_warn_external = True + return [] + + if (link.verifiable is not None + and not link.verifiable + and not normalize_name(search_name).lower() in self.allow_insecure + and not self.allow_all_insecure): # TODO: Remove after release + # We have a link that we are sure we cannot verify it's integrity, + # so we should skip it unless we are allowing unsafe installs + # for this requirement. + logger.debug("Skipping %s because it is an insecure and " + "unverifiable file." % link) + self.need_warn_insecure = True + return [] + + match = self._py_version_re.search(version) + if match: + version = version[:match.start()] + py_version = match.group(1) + if py_version != sys.version[:3]: + logger.debug('Skipping %s because Python version is incorrect' % link) + return [] + logger.debug('Found link %s, version: %s' % (link, version)) + return [(pkg_resources.parse_version(version), + link, + version)] + + def _egg_info_matches(self, egg_info, search_name, link): + match = self._egg_info_re.search(egg_info) + if not match: + logger.debug('Could not parse version from link: %s' % link) + return None + name = match.group(0).lower() + # To match the "safe" name that pkg_resources creates: + name = name.replace('_', '-') + # project name and version must be separated by a dash + look_for = search_name.lower() + "-" + if name.startswith(look_for): + return match.group(0)[len(look_for):] + else: + return None + + def _get_page(self, link, req): + return HTMLPage.get_page(link, req, cache=self.cache) + + def _get_mirror_urls(self, mirrors=None, main_mirror_url=None): + """Retrieves a list of URLs from the main mirror DNS entry + unless a list of mirror URLs are passed. + """ + if not mirrors: + mirrors = get_mirrors(main_mirror_url) + # Should this be made "less random"? E.g. netselect like? + random.shuffle(mirrors) + + mirror_urls = set() + for mirror_url in mirrors: + mirror_url = mirror_url.rstrip('/') + # Make sure we have a valid URL + if not any([mirror_url.startswith(scheme) for scheme in ["http://", "https://", "file://"]]): + mirror_url = "http://%s" % mirror_url + if not mirror_url.endswith("/simple"): + mirror_url = "%s/simple" % mirror_url + mirror_urls.add(mirror_url + '/') + + return list(mirror_urls) + + +class PageCache(object): + """Cache of HTML pages""" + + failure_limit = 3 + + def __init__(self): + self._failures = {} + self._pages = {} + self._archives = {} + + def too_many_failures(self, url): + return self._failures.get(url, 0) >= self.failure_limit + + def get_page(self, url): + return self._pages.get(url) + + def is_archive(self, url): + return self._archives.get(url, False) + + def set_is_archive(self, url, value=True): + self._archives[url] = value + + def add_page_failure(self, url, level): + self._failures[url] = self._failures.get(url, 0)+level + + def add_page(self, urls, page): + for url in urls: + self._pages[url] = page + + +class HTMLPage(object): + """Represents one page, along with its URL""" + + ## FIXME: these regexes are horrible hacks: + _homepage_re = re.compile(r'\s*home\s*page', re.I) + _download_re = re.compile(r'\s*download\s+url', re.I) + _href_re = re.compile('href=(?:"([^"]*)"|\'([^\']*)\'|([^>\\s\\n]*))', re.I|re.S) + + def __init__(self, content, url, headers=None, trusted=None): + self.content = content + self.parsed = html5lib.parse(self.content, namespaceHTMLElements=False) + self.url = url + self.headers = headers + self.trusted = trusted + + def __str__(self): + return self.url + + @classmethod + def get_page(cls, link, req, cache=None, skip_archives=True): + url = link.url + url = url.split('#', 1)[0] + if cache.too_many_failures(url): + return None + + # Check for VCS schemes that do not support lookup as web pages. + from pip.vcs import VcsSupport + for scheme in VcsSupport.schemes: + if url.lower().startswith(scheme) and url[len(scheme)] in '+:': + logger.debug('Cannot look at %(scheme)s URL %(link)s' % locals()) + return None + + if cache is not None: + inst = cache.get_page(url) + if inst is not None: + return inst + try: + if skip_archives: + if cache is not None: + if cache.is_archive(url): + return None + filename = link.filename + for bad_ext in ['.tar', '.tar.gz', '.tar.bz2', '.tgz', '.zip']: + if filename.endswith(bad_ext): + content_type = cls._get_content_type(url) + if content_type.lower().startswith('text/html'): + break + else: + logger.debug('Skipping page %s because of Content-Type: %s' % (link, content_type)) + if cache is not None: + cache.set_is_archive(url) + return None + logger.debug('Getting page %s' % url) + + # Tack index.html onto file:// URLs that point to directories + (scheme, netloc, path, params, query, fragment) = urlparse.urlparse(url) + if scheme == 'file' and os.path.isdir(url2pathname(path)): + # add trailing slash if not present so urljoin doesn't trim final segment + if not url.endswith('/'): + url += '/' + url = urlparse.urljoin(url, 'index.html') + logger.debug(' file: URL is directory, getting %s' % url) + + resp = urlopen(url) + + real_url = geturl(resp) + headers = resp.info() + contents = resp.read() + encoding = headers.get('Content-Encoding', None) + #XXX need to handle exceptions and add testing for this + if encoding is not None: + if encoding == 'gzip': + contents = gzip.GzipFile(fileobj=BytesIO(contents)).read() + if encoding == 'deflate': + contents = zlib.decompress(contents) + + # The check for archives above only works if the url ends with + # something that looks like an archive. However that is not a + # requirement. For instance http://sourceforge.net/projects/docutils/files/docutils/0.8.1/docutils-0.8.1.tar.gz/download + # redirects to http://superb-dca3.dl.sourceforge.net/project/docutils/docutils/0.8.1/docutils-0.8.1.tar.gz + # Unless we issue a HEAD request on every url we cannot know + # ahead of time for sure if something is HTML or not. However we + # can check after we've downloaded it. + content_type = headers.get('Content-Type', 'unknown') + if not content_type.lower().startswith("text/html"): + logger.debug('Skipping page %s because of Content-Type: %s' % + (link, content_type)) + if cache is not None: + cache.set_is_archive(url) + return None + + inst = cls(u(contents), real_url, headers, trusted=link.trusted) + except (HTTPError, URLError, socket.timeout, socket.error, OSError, WindowsError): + e = sys.exc_info()[1] + desc = str(e) + if isinstance(e, socket.timeout): + log_meth = logger.info + level =1 + desc = 'timed out' + elif isinstance(e, URLError): + #ssl/certificate error + if hasattr(e, 'reason') and (isinstance(e.reason, ssl.SSLError) or isinstance(e.reason, CertificateError)): + desc = 'There was a problem confirming the ssl certificate: %s' % e + log_meth = logger.notify + else: + log_meth = logger.info + if hasattr(e, 'reason') and isinstance(e.reason, socket.timeout): + desc = 'timed out' + level = 1 + else: + level = 2 + elif isinstance(e, HTTPError) and e.code == 404: + ## FIXME: notify? + log_meth = logger.info + level = 2 + else: + log_meth = logger.info + level = 1 + log_meth('Could not fetch URL %s: %s' % (link, desc)) + log_meth('Will skip URL %s when looking for download links for %s' % (link.url, req)) + if cache is not None: + cache.add_page_failure(url, level) + return None + if cache is not None: + cache.add_page([url, real_url], inst) + return inst + + @staticmethod + def _get_content_type(url): + """Get the Content-Type of the given url, using a HEAD request""" + scheme, netloc, path, query, fragment = urlparse.urlsplit(url) + if not scheme in ('http', 'https', 'ftp', 'ftps'): + ## FIXME: some warning or something? + ## assertion error? + return '' + req = Urllib2HeadRequest(url, headers={'Host': netloc}) + resp = urlopen(req) + try: + if hasattr(resp, 'code') and resp.code != 200 and scheme not in ('ftp', 'ftps'): + ## FIXME: doesn't handle redirects + return '' + return resp.info().get('content-type', '') + finally: + resp.close() + + @property + def api_version(self): + if not hasattr(self, "_api_version"): + _api_version = None + + metas = [x for x in self.parsed.findall(".//meta") + if x.get("name", "").lower() == "api-version"] + if metas: + try: + _api_version = int(metas[0].get("value", None)) + except (TypeError, ValueError): + _api_version = None + self._api_version = _api_version + return self._api_version + + @property + def base_url(self): + if not hasattr(self, "_base_url"): + base = self.parsed.find(".//base") + if base is not None and base.get("href"): + self._base_url = base.get("href") + else: + self._base_url = self.url + return self._base_url + + @property + def links(self): + """Yields all links in the page""" + for anchor in self.parsed.findall(".//a"): + if anchor.get("href"): + href = anchor.get("href") + url = self.clean_link(urlparse.urljoin(self.base_url, href)) + + # Determine if this link is internal. If that distinction + # doesn't make sense in this context, then we don't make + # any distinction. + internal = None + if self.api_version and self.api_version >= 2: + # Only api_versions >= 2 have a distinction between + # external and internal links + internal = bool(anchor.get("rel") + and "internal" in anchor.get("rel").split()) + + yield Link(url, self, internal=internal) + + def rel_links(self): + for url in self.explicit_rel_links(): + yield url + for url in self.scraped_rel_links(): + yield url + + def explicit_rel_links(self, rels=('homepage', 'download')): + """Yields all links with the given relations""" + rels = set(rels) + + for anchor in self.parsed.findall(".//a"): + if anchor.get("rel") and anchor.get("href"): + found_rels = set(anchor.get("rel").split()) + # Determine the intersection between what rels were found and + # what rels were being looked for + if found_rels & rels: + href = anchor.get("href") + url = self.clean_link(urlparse.urljoin(self.base_url, href)) + yield Link(url, self, trusted=False) + + def scraped_rel_links(self): + # Can we get rid of this horrible horrible method? + for regex in (self._homepage_re, self._download_re): + match = regex.search(self.content) + if not match: + continue + href_match = self._href_re.search(self.content, pos=match.end()) + if not href_match: + continue + url = href_match.group(1) or href_match.group(2) or href_match.group(3) + if not url: + continue + url = self.clean_link(urlparse.urljoin(self.base_url, url)) + yield Link(url, self, trusted=False) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + def clean_link(self, url): + """Makes sure a link is fully encoded. That is, if a ' ' shows up in + the link, it will be rewritten to %20 (while not over-quoting + % or other characters).""" + return self._clean_re.sub( + lambda match: '%%%2x' % ord(match.group(0)), url) + + +class Link(object): + + def __init__(self, url, comes_from=None, internal=None, trusted=None): + self.url = url + self.comes_from = comes_from + self.internal = internal + self.trusted = trusted + + # Set whether it's a wheel + self.wheel = None + if url != Inf and self.splitext()[1] == wheel_ext: + self.wheel = Wheel(self.filename) + + def __str__(self): + if self.comes_from: + return '%s (from %s)' % (self.url, self.comes_from) + else: + return str(self.url) + + def __repr__(self): + return '' % self + + def __eq__(self, other): + return self.url == other.url + + def __ne__(self, other): + return self.url != other.url + + def __lt__(self, other): + return self.url < other.url + + def __le__(self, other): + return self.url <= other.url + + def __gt__(self, other): + return self.url > other.url + + def __ge__(self, other): + return self.url >= other.url + + def __hash__(self): + return hash(self.url) + + @property + def filename(self): + _, netloc, path, _, _ = urlparse.urlsplit(self.url) + name = posixpath.basename(path.rstrip('/')) or netloc + assert name, ('URL %r produced no filename' % self.url) + return name + + @property + def scheme(self): + return urlparse.urlsplit(self.url)[0] + + @property + def path(self): + return urlparse.urlsplit(self.url)[2] + + def splitext(self): + return splitext(posixpath.basename(self.path.rstrip('/'))) + + @property + def url_without_fragment(self): + scheme, netloc, path, query, fragment = urlparse.urlsplit(self.url) + return urlparse.urlunsplit((scheme, netloc, path, query, None)) + + _egg_fragment_re = re.compile(r'#egg=([^&]*)') + + @property + def egg_fragment(self): + match = self._egg_fragment_re.search(self.url) + if not match: + return None + return match.group(1) + + _hash_re = re.compile(r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)') + + @property + def hash(self): + match = self._hash_re.search(self.url) + if match: + return match.group(2) + return None + + @property + def hash_name(self): + match = self._hash_re.search(self.url) + if match: + return match.group(1) + return None + + @property + def show_url(self): + return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0]) + + @property + def verifiable(self): + """ + Returns True if this link can be verified after download, False if it + cannot, and None if we cannot determine. + """ + trusted = self.trusted or getattr(self.comes_from, "trusted", None) + if trusted is not None and trusted: + # This link came from a trusted source. It *may* be verifiable but + # first we need to see if this page is operating under the new + # API version. + try: + api_version = getattr(self.comes_from, "api_version", None) + api_version = int(api_version) + except (ValueError, TypeError): + api_version = None + + if api_version is None or api_version <= 1: + # This link is either trusted, or it came from a trusted, + # however it is not operating under the API version 2 so + # we can't make any claims about if it's safe or not + return + + if self.hash: + # This link came from a trusted source and it has a hash, so we + # can consider it safe. + return True + else: + # This link came from a trusted source, using the new API + # version, and it does not have a hash. It is NOT verifiable + return False + elif trusted is not None: + # This link came from an untrusted source and we cannot trust it + return False + +#An "Infinite Link" that compares greater than other links +InfLink = Link(Inf) #this object is not currently used as a sortable + + +def get_requirement_from_url(url): + """Get a requirement from the URL, if possible. This looks for #egg + in the URL""" + link = Link(url) + egg_info = link.egg_fragment + if not egg_info: + egg_info = splitext(link.filename)[0] + return package_to_requirement(egg_info) + + +def package_to_requirement(package_name): + """Translate a name like Foo-1.2 to Foo==1.3""" + match = re.search(r'^(.*?)-(dev|\d.*)', package_name) + if match: + name = match.group(1) + version = match.group(2) + else: + name = package_name + version = '' + if version: + return '%s==%s' % (name, version) + else: + return name + + +def get_mirrors(hostname=None): + """Return the list of mirrors from the last record found on the DNS + entry:: + + >>> from pip.index import get_mirrors + >>> get_mirrors() + ['a.pypi.python.org', 'b.pypi.python.org', 'c.pypi.python.org', + 'd.pypi.python.org'] + + Originally written for the distutils2 project by Alexis Metaireau. + """ + if hostname is None: + hostname = DEFAULT_MIRROR_HOSTNAME + + # return the last mirror registered on PyPI. + last_mirror_hostname = None + try: + last_mirror_hostname = socket.gethostbyname_ex(hostname)[0] + except socket.gaierror: + return [] + if not last_mirror_hostname or last_mirror_hostname == DEFAULT_MIRROR_HOSTNAME: + last_mirror_hostname = "z.pypi.python.org" + end_letter = last_mirror_hostname.split(".", 1) + + # determine the list from the last one. + return ["%s.%s" % (s, end_letter[1]) for s in string_range(end_letter[0])] + + +def string_range(last): + """Compute the range of string between "a" and last. + + This works for simple "a to z" lists, but also for "a to zz" lists. + """ + for k in range(len(last)): + for x in product(string.ascii_lowercase, repeat=k+1): + result = ''.join(x) + yield result + if result == last: + return + diff --git a/PythonEnv/2.7/Lib/site-packages/pip/index.pyc b/PythonEnv/2.7/Lib/site-packages/pip/index.pyc new file mode 100644 index 0000000000000000000000000000000000000000..626530cdbee34f3a831950f63818d855d8b4a627 GIT binary patch literal 37796 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 N{4SO6pfatN{s#hQ5e)zU literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/log.py b/PythonEnv/2.7/Lib/site-packages/pip/log.py new file mode 100644 index 0000000000..9eb02b90d2 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/log.py @@ -0,0 +1,187 @@ +"""Logging +""" + +import sys +import logging + +from pip import backwardcompat + + +class Logger(object): + """ + Logging object for use in command-line script. Allows ranges of + levels, to avoid some redundancy of displayed information. + """ + VERBOSE_DEBUG = logging.DEBUG - 1 + DEBUG = logging.DEBUG + INFO = logging.INFO + NOTIFY = (logging.INFO + logging.WARN) / 2 + WARN = WARNING = logging.WARN + ERROR = logging.ERROR + FATAL = logging.FATAL + + LEVELS = [VERBOSE_DEBUG, DEBUG, INFO, NOTIFY, WARN, ERROR, FATAL] + + def __init__(self): + self.consumers = [] + self.indent = 0 + self.explicit_levels = False + self.in_progress = None + self.in_progress_hanging = False + + def debug(self, msg, *args, **kw): + self.log(self.DEBUG, msg, *args, **kw) + + def info(self, msg, *args, **kw): + self.log(self.INFO, msg, *args, **kw) + + def notify(self, msg, *args, **kw): + self.log(self.NOTIFY, msg, *args, **kw) + + def warn(self, msg, *args, **kw): + self.log(self.WARN, msg, *args, **kw) + + def error(self, msg, *args, **kw): + self.log(self.WARN, msg, *args, **kw) + + def fatal(self, msg, *args, **kw): + self.log(self.FATAL, msg, *args, **kw) + + def log(self, level, msg, *args, **kw): + if args: + if kw: + raise TypeError( + "You may give positional or keyword arguments, not both") + args = args or kw + rendered = None + for consumer_level, consumer in self.consumers: + if self.level_matches(level, consumer_level): + if (self.in_progress_hanging + and consumer in (sys.stdout, sys.stderr)): + self.in_progress_hanging = False + sys.stdout.write('\n') + sys.stdout.flush() + if rendered is None: + if args: + rendered = msg % args + else: + rendered = msg + rendered = ' ' * self.indent + rendered + if self.explicit_levels: + ## FIXME: should this be a name, not a level number? + rendered = '%02i %s' % (level, rendered) + if hasattr(consumer, 'write'): + rendered += '\n' + backwardcompat.fwrite(consumer, rendered) + else: + consumer(rendered) + + def _show_progress(self): + """Should we display download progress?""" + return (self.stdout_level_matches(self.NOTIFY) and sys.stdout.isatty()) + + def start_progress(self, msg): + assert not self.in_progress, ( + "Tried to start_progress(%r) while in_progress %r" + % (msg, self.in_progress)) + if self._show_progress(): + sys.stdout.write(' ' * self.indent + msg) + sys.stdout.flush() + self.in_progress_hanging = True + else: + self.in_progress_hanging = False + self.in_progress = msg + self.last_message = None + + def end_progress(self, msg='done.'): + assert self.in_progress, ( + "Tried to end_progress without start_progress") + if self._show_progress(): + if not self.in_progress_hanging: + # Some message has been printed out since start_progress + sys.stdout.write('...' + self.in_progress + msg + '\n') + sys.stdout.flush() + else: + # These erase any messages shown with show_progress (besides .'s) + logger.show_progress('') + logger.show_progress('') + sys.stdout.write(msg + '\n') + sys.stdout.flush() + self.in_progress = None + self.in_progress_hanging = False + + def show_progress(self, message=None): + """If we are in a progress scope, and no log messages have been + shown, write out another '.'""" + if self.in_progress_hanging: + if message is None: + sys.stdout.write('.') + sys.stdout.flush() + else: + if self.last_message: + padding = ' ' * max(0, len(self.last_message) - len(message)) + else: + padding = '' + sys.stdout.write('\r%s%s%s%s' % + (' ' * self.indent, self.in_progress, message, padding)) + sys.stdout.flush() + self.last_message = message + + def stdout_level_matches(self, level): + """Returns true if a message at this level will go to stdout""" + return self.level_matches(level, self._stdout_level()) + + def _stdout_level(self): + """Returns the level that stdout runs at""" + for level, consumer in self.consumers: + if consumer is sys.stdout: + return level + return self.FATAL + + def level_matches(self, level, consumer_level): + """ + >>> l = Logger() + >>> l.level_matches(3, 4) + False + >>> l.level_matches(3, 2) + True + >>> l.level_matches(slice(None, 3), 3) + False + >>> l.level_matches(slice(None, 3), 2) + True + >>> l.level_matches(slice(1, 3), 1) + True + >>> l.level_matches(slice(2, 3), 1) + False + """ + if isinstance(level, slice): + start, stop = level.start, level.stop + if start is not None and start > consumer_level: + return False + if stop is not None or stop <= consumer_level: + return False + return True + else: + return level >= consumer_level + + @classmethod + def level_for_integer(cls, level): + levels = cls.LEVELS + if level < 0: + return levels[0] + if level >= len(levels): + return levels[-1] + return levels[level] + + def move_stdout_to_stderr(self): + to_remove = [] + to_add = [] + for consumer_level, consumer in self.consumers: + if consumer == sys.stdout: + to_remove.append((consumer_level, consumer)) + to_add.append((consumer_level, sys.stderr)) + for item in to_remove: + self.consumers.remove(item) + self.consumers.extend(to_add) + +logger = Logger() diff --git a/PythonEnv/2.7/Lib/site-packages/pip/log.pyc b/PythonEnv/2.7/Lib/site-packages/pip/log.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45548ace758e3c52b912840b505a00a88e220905 GIT binary patch literal 7579 zcmc&(TW=f36`oyElu1dEe3NgrJw@V}P94>8k~&QjC%(vrTZ3*#ZVVGj*%fz5uC&~x zc9xa|ST9LXpbza^llQ*#sXz+!5A@&ky+HHWe%~32lANGvQ7aa;!!x&?nRETlu=J0a z+8_Szo3LYGuhQvI@OmX#NlRWzYG7%`zf zQ|eQt9ycp0s*q|<@*PX{3SWH)#r>??jni%|{ulllbq`I&ODI-?_S!~}hwZFC2#SK^ zIW)@0JDfz*O*~d(QiNAyL6p9VN@}&tU7c)Bj4Id`TPuni5rXBUI)Tj`Zyu7iNma(~ znpLUPRI?_;lxj}#I1%1}xfnXBB6LluE(TAlu*5SqXB19N;-%54o3kpcNXwiGCxtky z!b3tFQDIexqbjTkaZH6%LL67&v=H+u#5-S7pMl*cREYLjp--uBP6nJ-;b9@psPKpo z-&4_96&@x1DQ2Bh;W24Hugp??o}BtEikimXi0e9AS&iC-?qsuyPBJeFH^Tsi#V{MDIv=s_>ScZxE&WQcc7w-wnmml z#T1A*Z4L6Qn@83bNB7rTJ+K41>y(zWY?O5B_*PO_11fxXxf>U~;mY!(IK7c{z@9zS zN}Mj=j#h@<<)3dAy)0c!pDbTpxVC&hURkzr5xqWu83f?@@*o~8Cs}u4uvO4(TCF(6 zj$5Zd+ZqbxRY#vT*}&cKln?OOvnar?RabiIDgMFAlKQ<5YbEE%{D$zaD1pR6!lT=Z zH-CAz&UYE|Qu_L~D;x^)u7yC9TH84IBl9RB`J_QuuByEM@0^Chm4n=C+=Z}4<6pT^Y{gxjhjfbBJOOx`g~7Eraii08ZYo{+yVkr zdg-~I%pAw-Uf`){Xi=VL`Q_(&Ea!1=JiKxL1)r@G6hZRCJ!hl4qeG>tinDwNz7Vc4 zKc}9SSr!t25Kuqy)cQGbtRN>=nN15vGDsV!spg)3KMeZh+UY~+ZD^*OXkWPi9dh!&}; zhO#pZ3OE3Q7hy>YNTc10tf6crZrLpd0c;UwLkB29Le~u~*_`1xYJVpg+Mc0W7*-4J zq8C_T(46sH36AKvz3}BOGIFRa{7n3iV4X*R9SHmaYOLmSe+({$j$MuOf|Y}H;t zp}Yz{C2!W7#`nB;1OVbBo;iHjGUHdg!(P>&$B3GD)c-n6JCB!8r(Ee#Q!`kMuT}+u zLsuQNu&-d?QZE}Oq27pgK%ow^jWo%EQ12kD59-45V;JqkRn>^=Uk zQMV^iD5yY{kAL2qE6qR|j=?=vUG_m{@Iayhe+A)$nSV(uMEcM8{PwOtgyoA3JO7AK zinp(0teAM-r8XekK#tC^p&uAdTIQWZ_P8XuvJJ5NdmVb`AeW1PVChPY%j*p%-iN}a=@8j7!TVVTv@UL}wZf-q#pj^+c+(G4#!*6~>0yQmU12w@d& z zh~9{kM0Ydi=ZScnN%1N`46n5}!0s`(S1{n<*~1kW7+u2akVOe~KDXHZ7K+W+M%=jl z@p(bj9+hfxtP3Z%yTB81;4I?qkU98zY zbZ~6t*RNmKiGE)$5~I9+X@AGUJ`7%e^Rj+xcZ6KLecSk}yW{ifr0Z#BhSJ zY>^Fi1E^tOml*E=l_>G6Xfr=y@g95e9IQIi+58TVWzMGNW`UP!Pu^dBXk0j~4GQ znYXcq*tUd?c4Ec6WrXOgJ#elRhp`1`AGi?5HEt0B4E+g>mLNnSMofE$kc`3d>Gc@| z$Cm#&DqW?vJt=*)X~r({uDD2N`M5uDE)u?Be&iMC0?N$y2|>UwI0`gz+_-gpUg7`I zCayj_TxHDj4#5coXqBlyv;Cg)wSrlkDE3|`5eK zv{|4_ei3p(n|PqeT6>0|hQMt^f9Z)u;c*$zKX_^JK8{=6iI>=lyEga|9rg$cmqs&5 zKI)wneAuXKGy}Nto<0rwQLBaYjFo;C4ii?%r&cS>+9R5f7{J6(1tdOyv}kTVSXyk! z6}+L&$km`>3M{jE{duo(SG>TYF%OJk+%oU8;9`bGXShMbgvJnDm=i4cn}OT}IH dG=4Xy6Fqs)X~uOz5&1o*;!h*(oGZ=$<=;6yR!IN= literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/pep425tags.py b/PythonEnv/2.7/Lib/site-packages/pip/pep425tags.py new file mode 100644 index 0000000000..95d3753951 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/pep425tags.py @@ -0,0 +1,102 @@ +"""Generate and work with PEP 425 Compatibility Tags.""" + +import sys +import warnings + +try: + import sysconfig +except ImportError: # pragma nocover + # Python < 2.7 + import distutils.sysconfig as sysconfig +import distutils.util + + +def get_abbr_impl(): + """Return abbreviated implementation name.""" + if hasattr(sys, 'pypy_version_info'): + pyimpl = 'pp' + elif sys.platform.startswith('java'): + pyimpl = 'jy' + elif sys.platform == 'cli': + pyimpl = 'ip' + else: + pyimpl = 'cp' + return pyimpl + + +def get_impl_ver(): + """Return implementation version.""" + return ''.join(map(str, sys.version_info[:2])) + + +def get_platform(): + """Return our platform name 'win32', 'linux_x86_64'""" + # XXX remove distutils dependency + return distutils.util.get_platform().replace('.', '_').replace('-', '_') + + +def get_supported(versions=None, noarch=False): + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + versions = [] + major = sys.version_info[0] + # Support all previous minor Python versions. + for minor in range(sys.version_info[1], -1, -1): + versions.append(''.join(map(str, (major, minor)))) + + impl = get_abbr_impl() + + abis = [] + + try: + soabi = sysconfig.get_config_var('SOABI') + except IOError as e: # Issue #1074 + warnings.warn("{0}".format(e), RuntimeWarning) + soabi = None + + if soabi and soabi.startswith('cpython-'): + abis[0:0] = ['cp' + soabi.split('-', 1)[-1]] + + abi3s = set() + import imp + for suffix in imp.get_suffixes(): + if suffix[0].startswith('.abi'): + abi3s.add(suffix[0].split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + if not noarch: + arch = get_platform() + + # Current version, current API (built specifically for our Python): + for abi in abis: + supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + + # No abi / arch, but requires our implementation: + for i, version in enumerate(versions): + supported.append(('%s%s' % (impl, version), 'none', 'any')) + if i == 0: + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # No abi / arch, generic Python + for i, version in enumerate(versions): + supported.append(('py%s' % (version,), 'none', 'any')) + if i == 0: + supported.append(('py%s' % (version[0]), 'none', 'any')) + + return supported + +supported_tags = get_supported() +supported_tags_noarch = get_supported(noarch=True) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/pep425tags.pyc b/PythonEnv/2.7/Lib/site-packages/pip/pep425tags.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d11ce1728dc44222d27ca39d6ec4ebec206f555 GIT binary patch literal 3346 zcmcguU2+@85$;)lAOQiSBwDg)mt9jzQG_E3wn_g*Wm|SkIi+$+RxPD4p}~R|*a5g8 zu)EwDkU#}^l8=!$A0dbE1#$sb_}d@RghYpE6@?xR6dgjyWseR$np|CU3v^hZgIH716zQZw*%MMq&2^Wk zFY~dYKhK9sbhu1mfquaLD-;$*C{ws3LWRwlDupHb0fuU1YV;hMt1N`eWY*AChp_I^ zetm_V-9hsQ6Pqk>Mh9`I&y(y#pGWRkKY92>f3WkR{wf)!fs5MFAaWD^H0aqz^dI~l z%h44!DB%AU@AeFh!z0Ii?ooD&P0fhn-|=AI;}gOC=ZdmjcAux-o=@QrCs^_gyU*h# zb{WEy7S3*Ad*8TG7VDth&dgZ^uR|RT(}5Y9*ul#r)^RX24R;N?=_H-B&P--8+=}9E z;yfNrT@kN-a280vKXH734vxpuQ7W%aT4yb{jOIA7fpeLt*@<cX2KVwb`&@FOncO8KAE`VBz_p5 zHFp{xH~$#5n>KRhUK(^xf}XL>G)kMPNf92$@kl4GhTVI{wHTNdTVBP0y^4msHC0yE z@yFXMDG3{obH+;8-hzMx>r3QtdK|Q02l6?_4a6P*GKzKH zJjXeSVnJ>gq&b2v^BF-`Me|~GF0pzQfU$K3jE}-e@+SJ0T_^7XAwISsvq`zl zhk!Je3k`tslm=Rm_a$lUdr+Svm5egI$Q4OVy>%YNyE|LkdTS8Hqj78e$w#e^KG?$j zAZke4lJ;JnfMpDak#!>%4Xhx_l7PqVFZPy1%?!F7^GbpAZ^1#0e-2)u!x(bj@y!wN z{*I9z(ahtk99HOLg|br_k%R*)0LzV8fyR$G^>U&Bo*Q5aCW`{?9o?l_k(YB`7OB6) zcMM0K7HC?eu3(Qu#iLFifKajV3b>ADOJb))lXY@s>VqMdSZlTnr5!4|E5f=zk(#ZL z0;qiuWr_N$G{t&F4vguMg40;RJUm^dtfMtzDVl=B zgbeSpOV`CE=-^xx8m!Z-LgQ~}TA}`HJhgZ98O^TH^ojt&7OseeJ8BBwZ(K~k5J(=} z4&(rnocfMBy`v6buYZ%=>*Q_`)?g-o6i)!URqm^)BKr^JHpHDOjXz{R_l|x`vl>m2 z&`?~X>5_yCkpa9nrh8i(g5EQePY z>!;`_A^V@zOS(cs8=MWlSabTb!gDYVU$ptBU)a1xQy5hL*Wfd6Zcr52(#x)$KJ)M# zKxw~zos;^XXcjd`4{#54($#j9rb))Nhv`?N4rmi}j`f_)v`tMX>PB3f;)=%a`}vIh zzEP2Z`)QB`!^Hx7Uk8_)yDW-(7gO78&>b7LGSuJQ-rc>ut#9w{+&Vh)nx?sGkHOyc|BLdO;$ z{q?<>W#aCj+@Lz$^SR9VH_$w`Tq_$vJMz~dNCgn8is6;aZQ4yM>>tDv8AvCaw$7X@ zdhERv1)uA-*v*0%{Kh7NG&OPPb3yahxM6njnZI$R5u%ChByl(DIo4oK%)6~K6lEr% zN8dioGK7nLKM%4P=;lPq9kIaBqQZ-XQS73jImq>VuI}QFP4Rt@*DsU5Q8+GG*p9m0 zXl&+33`5z~j2-+I(Mq<+Q8|Z%GsSrmBP#syRp&#Ai;Gl|g>e#Oo#XtRi=-2OhCv^D za)5?W42c84rA!0_!scEl5T%+J>7%!6{dd?DBb&ROFJUtr<;8+Xu$wz`Sy5imXUxS7 zyTfjNjfR#>g{ms4ny1yahYuOApw{t8v!N>94YlQ!RTcepRrfZ$8a{K%g_^os*ic$k z3-99n7UnlS|9$LKmn7rVXtlzm(`x0Z_ZtlO8V#xfvS!FvJkK0X>WdoOcsb!N$GI;1 zH=!!I=`(#upnd+n68OIk2G;lwxXZbAamW_ah=k#3HZqQ{)XQ_NJP$6zAkwcK3%)O( k4wG;+FrPCq*f-FWysD}K`l|@UI-o7r%1h=0.7, it won't contain an importable + # setuptools, and having an egg-info dir blocks the ability of + # setup.py to find setuptools plugins, so delete the egg-info dir if + # no setuptools. it will get recreated by the run of egg_info + # NOTE: this self.name check only works when installing from a specifier + # (not archive path/urls) + # TODO: take this out later + if self.name == 'distribute' and not os.path.isdir(os.path.join(self.source_dir, 'setuptools')): + rmtree(os.path.join(self.source_dir, 'distribute.egg-info')) + + script = self._run_setup_py + script = script.replace('__SETUP_PY__', repr(self.setup_py)) + script = script.replace('__PKG_NAME__', repr(self.name)) + egg_info_cmd = [sys.executable, '-c', script, 'egg_info'] + # We can't put the .egg-info files at the root, because then the source code will be mistaken + # for an installed egg, causing problems + if self.editable or force_root_egg_info: + egg_base_option = [] + else: + egg_info_dir = os.path.join(self.source_dir, 'pip-egg-info') + if not os.path.exists(egg_info_dir): + os.makedirs(egg_info_dir) + egg_base_option = ['--egg-base', 'pip-egg-info'] + call_subprocess( + egg_info_cmd + egg_base_option, + cwd=self.source_dir, filter_stdout=self._filter_install, show_stdout=False, + command_level=logger.VERBOSE_DEBUG, + command_desc='python setup.py egg_info') + finally: + logger.indent -= 2 + if not self.req: + self.req = pkg_resources.Requirement.parse( + "%(Name)s==%(Version)s" % self.pkg_info()) + self.correct_build_location() + + ## FIXME: This is a lame hack, entirely for PasteScript which has + ## a self-provided entry point that causes this awkwardness + _run_setup_py = """ +__file__ = __SETUP_PY__ +from setuptools.command import egg_info +import pkg_resources +import os +def replacement_run(self): + self.mkpath(self.egg_info) + installer = self.distribution.fetch_build_egg + for ep in pkg_resources.iter_entry_points('egg_info.writers'): + # require=False is the change we're making: + writer = ep.load(require=False) + if writer: + writer(self, ep.name, os.path.join(self.egg_info,ep.name)) + self.find_sources() +egg_info.egg_info.run = replacement_run +exec(compile(open(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec')) +""" + + def egg_info_data(self, filename): + if self.satisfied_by is not None: + if not self.satisfied_by.has_metadata(filename): + return None + return self.satisfied_by.get_metadata(filename) + assert self.source_dir + filename = self.egg_info_path(filename) + if not os.path.exists(filename): + return None + fp = open(filename, 'r') + data = fp.read() + fp.close() + return data + + def egg_info_path(self, filename): + if self._egg_info_path is None: + if self.editable: + base = self.source_dir + else: + base = os.path.join(self.source_dir, 'pip-egg-info') + filenames = os.listdir(base) + if self.editable: + filenames = [] + for root, dirs, files in os.walk(base): + for dir in vcs.dirnames: + if dir in dirs: + dirs.remove(dir) + # Iterate over a copy of ``dirs``, since mutating + # a list while iterating over it can cause trouble. + # (See https://github.com/pypa/pip/pull/462.) + for dir in list(dirs): + # Don't search in anything that looks like a virtualenv environment + if (os.path.exists(os.path.join(root, dir, 'bin', 'python')) + or os.path.exists(os.path.join(root, dir, 'Scripts', 'Python.exe'))): + dirs.remove(dir) + # Also don't search through tests + if dir == 'test' or dir == 'tests': + dirs.remove(dir) + filenames.extend([os.path.join(root, dir) + for dir in dirs]) + filenames = [f for f in filenames if f.endswith('.egg-info')] + + if not filenames: + raise InstallationError('No files/directories in %s (from %s)' % (base, filename)) + assert filenames, "No files/directories in %s (from %s)" % (base, filename) + + # if we have more than one match, we pick the toplevel one. This can + # easily be the case if there is a dist folder which contains an + # extracted tarball for testing purposes. + if len(filenames) > 1: + filenames.sort(key=lambda x: x.count(os.path.sep) + + (os.path.altsep and + x.count(os.path.altsep) or 0)) + self._egg_info_path = os.path.join(base, filenames[0]) + return os.path.join(self._egg_info_path, filename) + + def egg_info_lines(self, filename): + data = self.egg_info_data(filename) + if not data: + return [] + result = [] + for line in data.splitlines(): + line = line.strip() + if not line or line.startswith('#'): + continue + result.append(line) + return result + + def pkg_info(self): + p = FeedParser() + data = self.egg_info_data('PKG-INFO') + if not data: + logger.warn('No PKG-INFO file found in %s' % display_path(self.egg_info_path('PKG-INFO'))) + p.feed(data or '') + return p.close() + + @property + def dependency_links(self): + return self.egg_info_lines('dependency_links.txt') + + _requirements_section_re = re.compile(r'\[(.*?)\]') + + def requirements(self, extras=()): + in_extra = None + for line in self.egg_info_lines('requires.txt'): + match = self._requirements_section_re.match(line.lower()) + if match: + in_extra = match.group(1) + continue + if in_extra and in_extra not in extras: + logger.debug('skipping extra %s' % in_extra) + # Skip requirement for an extra we aren't requiring + continue + yield line + + @property + def absolute_versions(self): + for qualifier, version in self.req.specs: + if qualifier == '==': + yield version + + @property + def installed_version(self): + return self.pkg_info()['version'] + + def assert_source_matches_version(self): + assert self.source_dir + version = self.installed_version + if version not in self.req: + logger.warn('Requested %s, but installing version %s' % (self, self.installed_version)) + else: + logger.debug('Source in %s has version %s, which satisfies requirement %s' + % (display_path(self.source_dir), version, self)) + + def update_editable(self, obtain=True): + if not self.url: + logger.info("Cannot update repository at %s; repository location is unknown" % self.source_dir) + return + assert self.editable + assert self.source_dir + if self.url.startswith('file:'): + # Static paths don't get updated + return + assert '+' in self.url, "bad url: %r" % self.url + if not self.update: + return + vc_type, url = self.url.split('+', 1) + backend = vcs.get_backend(vc_type) + if backend: + vcs_backend = backend(self.url) + if obtain: + vcs_backend.obtain(self.source_dir) + else: + vcs_backend.export(self.source_dir) + else: + assert 0, ( + 'Unexpected version control type (in %s): %s' + % (self.url, vc_type)) + + def uninstall(self, auto_confirm=False): + """ + Uninstall the distribution currently satisfying this requirement. + + Prompts before removing or modifying files unless + ``auto_confirm`` is True. + + Refuses to delete or modify files outside of ``sys.prefix`` - + thus uninstallation within a virtual environment can only + modify that virtual environment, even if the virtualenv is + linked to global site-packages. + + """ + if not self.check_if_exists(): + raise UninstallationError("Cannot uninstall requirement %s, not installed" % (self.name,)) + dist = self.satisfied_by or self.conflicts_with + + paths_to_remove = UninstallPathSet(dist) + + pip_egg_info_path = os.path.join(dist.location, + dist.egg_name()) + '.egg-info' + dist_info_path = os.path.join(dist.location, + '-'.join(dist.egg_name().split('-')[:2]) + ) + '.dist-info' + # workaround for http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=618367 + debian_egg_info_path = pip_egg_info_path.replace( + '-py%s' % pkg_resources.PY_MAJOR, '') + easy_install_egg = dist.egg_name() + '.egg' + develop_egg_link = egg_link_path(dist) + + pip_egg_info_exists = os.path.exists(pip_egg_info_path) + debian_egg_info_exists = os.path.exists(debian_egg_info_path) + dist_info_exists = os.path.exists(dist_info_path) + if pip_egg_info_exists or debian_egg_info_exists: + # package installed by pip + if pip_egg_info_exists: + egg_info_path = pip_egg_info_path + else: + egg_info_path = debian_egg_info_path + paths_to_remove.add(egg_info_path) + if dist.has_metadata('installed-files.txt'): + for installed_file in dist.get_metadata('installed-files.txt').splitlines(): + path = os.path.normpath(os.path.join(egg_info_path, installed_file)) + paths_to_remove.add(path) + #FIXME: need a test for this elif block + #occurs with --single-version-externally-managed/--record outside of pip + elif dist.has_metadata('top_level.txt'): + if dist.has_metadata('namespace_packages.txt'): + namespaces = dist.get_metadata('namespace_packages.txt') + else: + namespaces = [] + for top_level_pkg in [p for p + in dist.get_metadata('top_level.txt').splitlines() + if p and p not in namespaces]: + path = os.path.join(dist.location, top_level_pkg) + paths_to_remove.add(path) + paths_to_remove.add(path + '.py') + paths_to_remove.add(path + '.pyc') + + elif dist.location.endswith(easy_install_egg): + # package installed by easy_install + paths_to_remove.add(dist.location) + easy_install_pth = os.path.join(os.path.dirname(dist.location), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg) + + elif develop_egg_link: + # develop egg + fh = open(develop_egg_link, 'r') + link_pointer = os.path.normcase(fh.readline().strip()) + fh.close() + assert (link_pointer == dist.location), 'Egg-link %s does not match installed location of %s (at %s)' % (link_pointer, self.name, dist.location) + paths_to_remove.add(develop_egg_link) + easy_install_pth = os.path.join(os.path.dirname(develop_egg_link), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, dist.location) + elif dist_info_exists: + for path in pip.wheel.uninstallation_paths(dist): + paths_to_remove.add(path) + + # find distutils scripts= scripts + if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'): + for script in dist.metadata_listdir('scripts'): + paths_to_remove.add(os.path.join(bin_py, script)) + if sys.platform == 'win32': + paths_to_remove.add(os.path.join(bin_py, script) + '.bat') + + # find console_scripts + if dist.has_metadata('entry_points.txt'): + config = ConfigParser.SafeConfigParser() + config.readfp(FakeFile(dist.get_metadata_lines('entry_points.txt'))) + if config.has_section('console_scripts'): + for name, value in config.items('console_scripts'): + paths_to_remove.add(os.path.join(bin_py, name)) + if sys.platform == 'win32': + paths_to_remove.add(os.path.join(bin_py, name) + '.exe') + paths_to_remove.add(os.path.join(bin_py, name) + '.exe.manifest') + paths_to_remove.add(os.path.join(bin_py, name) + '-script.py') + + paths_to_remove.remove(auto_confirm) + self.uninstalled = paths_to_remove + + def rollback_uninstall(self): + if self.uninstalled: + self.uninstalled.rollback() + else: + logger.error("Can't rollback %s, nothing uninstalled." + % (self.project_name,)) + + def commit_uninstall(self): + if self.uninstalled: + self.uninstalled.commit() + else: + logger.error("Can't commit %s, nothing uninstalled." + % (self.project_name,)) + + def archive(self, build_dir): + assert self.source_dir + create_archive = True + archive_name = '%s-%s.zip' % (self.name, self.installed_version) + archive_path = os.path.join(build_dir, archive_name) + if os.path.exists(archive_path): + response = ask_path_exists( + 'The file %s exists. (i)gnore, (w)ipe, (b)ackup ' % + display_path(archive_path), ('i', 'w', 'b')) + if response == 'i': + create_archive = False + elif response == 'w': + logger.warn('Deleting %s' % display_path(archive_path)) + os.remove(archive_path) + elif response == 'b': + dest_file = backup_dir(archive_path) + logger.warn('Backing up %s to %s' + % (display_path(archive_path), display_path(dest_file))) + shutil.move(archive_path, dest_file) + if create_archive: + zip = zipfile.ZipFile(archive_path, 'w', zipfile.ZIP_DEFLATED) + dir = os.path.normcase(os.path.abspath(self.source_dir)) + for dirpath, dirnames, filenames in os.walk(dir): + if 'pip-egg-info' in dirnames: + dirnames.remove('pip-egg-info') + for dirname in dirnames: + dirname = os.path.join(dirpath, dirname) + name = self._clean_zip_name(dirname, dir) + zipdir = zipfile.ZipInfo(self.name + '/' + name + '/') + zipdir.external_attr = 0x1ED << 16 # 0o755 + zip.writestr(zipdir, '') + for filename in filenames: + if filename == PIP_DELETE_MARKER_FILENAME: + continue + filename = os.path.join(dirpath, filename) + name = self._clean_zip_name(filename, dir) + zip.write(filename, self.name + '/' + name) + zip.close() + logger.indent -= 2 + logger.notify('Saved %s' % display_path(archive_path)) + + def _clean_zip_name(self, name, prefix): + assert name.startswith(prefix+os.path.sep), ( + "name %r doesn't start with prefix %r" % (name, prefix)) + name = name[len(prefix)+1:] + name = name.replace(os.path.sep, '/') + return name + + def install(self, install_options, global_options=(), root=None): + if self.editable: + self.install_editable(install_options, global_options) + return + if self.is_wheel: + self.move_wheel_files(self.source_dir) + self.install_succeeded = True + return + + temp_location = tempfile.mkdtemp('-record', 'pip-') + record_filename = os.path.join(temp_location, 'install-record.txt') + try: + install_args = [sys.executable] + install_args.append('-c') + install_args.append( + "import setuptools;__file__=%r;"\ + "exec(compile(open(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec'))" % self.setup_py) + install_args += list(global_options) + ['install','--record', record_filename] + + if not self.as_egg: + install_args += ['--single-version-externally-managed'] + + if root is not None: + install_args += ['--root', root] + + if running_under_virtualenv(): + ## FIXME: I'm not sure if this is a reasonable location; probably not + ## but we can't put it in the default location, as that is a virtualenv symlink that isn't writable + install_args += ['--install-headers', + os.path.join(sys.prefix, 'include', 'site', + 'python' + get_python_version())] + logger.notify('Running setup.py install for %s' % self.name) + logger.indent += 2 + try: + call_subprocess(install_args + install_options, + cwd=self.source_dir, filter_stdout=self._filter_install, show_stdout=False) + finally: + logger.indent -= 2 + if not os.path.exists(record_filename): + logger.notify('Record file %s not found' % record_filename) + return + self.install_succeeded = True + if self.as_egg: + # there's no --always-unzip option we can pass to install command + # so we unable to save the installed-files.txt + return + + def prepend_root(path): + if root is None or not os.path.isabs(path): + return path + else: + return change_root(root, path) + + f = open(record_filename) + for line in f: + line = line.strip() + if line.endswith('.egg-info'): + egg_info_dir = prepend_root(line) + break + else: + logger.warn('Could not find .egg-info directory in install record for %s' % self) + ## FIXME: put the record somewhere + ## FIXME: should this be an error? + return + f.close() + new_lines = [] + f = open(record_filename) + for line in f: + filename = line.strip() + if os.path.isdir(filename): + filename += os.path.sep + new_lines.append(make_path_relative(prepend_root(filename), egg_info_dir)) + f.close() + f = open(os.path.join(egg_info_dir, 'installed-files.txt'), 'w') + f.write('\n'.join(new_lines)+'\n') + f.close() + finally: + if os.path.exists(record_filename): + os.remove(record_filename) + os.rmdir(temp_location) + + def remove_temporary_source(self): + """Remove the source files from this requirement, if they are marked + for deletion""" + if self.is_bundle or os.path.exists(self.delete_marker_filename): + logger.info('Removing source in %s' % self.source_dir) + if self.source_dir: + rmtree(self.source_dir) + self.source_dir = None + if self._temp_build_dir and os.path.exists(self._temp_build_dir): + rmtree(self._temp_build_dir) + self._temp_build_dir = None + + def install_editable(self, install_options, global_options=()): + logger.notify('Running setup.py develop for %s' % self.name) + logger.indent += 2 + try: + ## FIXME: should we do --install-headers here too? + call_subprocess( + [sys.executable, '-c', + "import setuptools; __file__=%r; exec(compile(open(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec'))" % self.setup_py] + + list(global_options) + ['develop', '--no-deps'] + list(install_options), + + cwd=self.source_dir, filter_stdout=self._filter_install, + show_stdout=False) + finally: + logger.indent -= 2 + self.install_succeeded = True + + def _filter_install(self, line): + level = logger.NOTIFY + for regex in [r'^running .*', r'^writing .*', '^creating .*', '^[Cc]opying .*', + r'^reading .*', r"^removing .*\.egg-info' \(and everything under it\)$", + r'^byte-compiling ', + # Not sure what this warning is, but it seems harmless: + r"^warning: manifest_maker: standard file '-c' not found$"]: + if re.search(regex, line.strip()): + level = logger.INFO + break + return (level, line) + + def check_if_exists(self): + """Find an installed distribution that satisfies or conflicts + with this requirement, and set self.satisfied_by or + self.conflicts_with appropriately.""" + + if self.req is None: + return False + try: + # DISTRIBUTE TO SETUPTOOLS UPGRADE HACK (1 of 3 parts) + # if we've already set distribute as a conflict to setuptools + # then this check has already run before. we don't want it to + # run again, and return False, since it would block the uninstall + # TODO: remove this later + if (self.req.project_name == 'setuptools' + and self.conflicts_with + and self.conflicts_with.project_name == 'distribute'): + return True + else: + self.satisfied_by = pkg_resources.get_distribution(self.req) + except pkg_resources.DistributionNotFound: + return False + except pkg_resources.VersionConflict: + existing_dist = pkg_resources.get_distribution(self.req.project_name) + if self.use_user_site: + if dist_in_usersite(existing_dist): + self.conflicts_with = existing_dist + elif running_under_virtualenv() and dist_in_site_packages(existing_dist): + raise InstallationError("Will not install to the user site because it will lack sys.path precedence to %s in %s" + %(existing_dist.project_name, existing_dist.location)) + else: + self.conflicts_with = existing_dist + return True + + @property + def is_wheel(self): + return self.url and '.whl' in self.url + + @property + def is_bundle(self): + if self._is_bundle is not None: + return self._is_bundle + base = self._temp_build_dir + if not base: + ## FIXME: this doesn't seem right: + return False + self._is_bundle = (os.path.exists(os.path.join(base, 'pip-manifest.txt')) + or os.path.exists(os.path.join(base, 'pyinstall-manifest.txt'))) + return self._is_bundle + + def bundle_requirements(self): + for dest_dir in self._bundle_editable_dirs: + package = os.path.basename(dest_dir) + ## FIXME: svnism: + for vcs_backend in vcs.backends: + url = rev = None + vcs_bundle_file = os.path.join( + dest_dir, vcs_backend.bundle_file) + if os.path.exists(vcs_bundle_file): + vc_type = vcs_backend.name + fp = open(vcs_bundle_file) + content = fp.read() + fp.close() + url, rev = vcs_backend().parse_vcs_bundle_file(content) + break + if url: + url = '%s+%s@%s' % (vc_type, url, rev) + else: + url = None + yield InstallRequirement( + package, self, editable=True, url=url, + update=False, source_dir=dest_dir, from_bundle=True) + for dest_dir in self._bundle_build_dirs: + package = os.path.basename(dest_dir) + yield InstallRequirement(package, self,source_dir=dest_dir, from_bundle=True) + + def move_bundle_files(self, dest_build_dir, dest_src_dir): + base = self._temp_build_dir + assert base + src_dir = os.path.join(base, 'src') + build_dir = os.path.join(base, 'build') + bundle_build_dirs = [] + bundle_editable_dirs = [] + for source_dir, dest_dir, dir_collection in [ + (src_dir, dest_src_dir, bundle_editable_dirs), + (build_dir, dest_build_dir, bundle_build_dirs)]: + if os.path.exists(source_dir): + for dirname in os.listdir(source_dir): + dest = os.path.join(dest_dir, dirname) + dir_collection.append(dest) + if os.path.exists(dest): + logger.warn('The directory %s (containing package %s) already exists; cannot move source from bundle %s' + % (dest, dirname, self)) + continue + if not os.path.exists(dest_dir): + logger.info('Creating directory %s' % dest_dir) + os.makedirs(dest_dir) + shutil.move(os.path.join(source_dir, dirname), dest) + if not os.listdir(source_dir): + os.rmdir(source_dir) + self._temp_build_dir = None + self._bundle_build_dirs = bundle_build_dirs + self._bundle_editable_dirs = bundle_editable_dirs + + def move_wheel_files(self, wheeldir): + move_wheel_files(self.name, self.req, wheeldir, user=self.use_user_site, home=self.target_dir) + + @property + def delete_marker_filename(self): + assert self.source_dir + return os.path.join(self.source_dir, PIP_DELETE_MARKER_FILENAME) + + +class Requirements(object): + + def __init__(self): + self._keys = [] + self._dict = {} + + def keys(self): + return self._keys + + def values(self): + return [self._dict[key] for key in self._keys] + + def __contains__(self, item): + return item in self._keys + + def __setitem__(self, key, value): + if key not in self._keys: + self._keys.append(key) + self._dict[key] = value + + def __getitem__(self, key): + return self._dict[key] + + def __repr__(self): + values = ['%s: %s' % (repr(k), repr(self[k])) for k in self.keys()] + return 'Requirements({%s})' % ', '.join(values) + + +class RequirementSet(object): + + def __init__(self, build_dir, src_dir, download_dir, download_cache=None, + upgrade=False, ignore_installed=False, as_egg=False, target_dir=None, + ignore_dependencies=False, force_reinstall=False, use_user_site=False): + self.build_dir = build_dir + self.src_dir = src_dir + self.download_dir = download_dir + self.download_cache = download_cache + self.upgrade = upgrade + self.ignore_installed = ignore_installed + self.force_reinstall = force_reinstall + self.requirements = Requirements() + # Mapping of alias: real_name + self.requirement_aliases = {} + self.unnamed_requirements = [] + self.ignore_dependencies = ignore_dependencies + self.successfully_downloaded = [] + self.successfully_installed = [] + self.reqs_to_cleanup = [] + self.as_egg = as_egg + self.use_user_site = use_user_site + self.target_dir = target_dir #set from --target option + + def __str__(self): + reqs = [req for req in self.requirements.values() + if not req.comes_from] + reqs.sort(key=lambda req: req.name.lower()) + return ' '.join([str(req.req) for req in reqs]) + + def add_requirement(self, install_req): + name = install_req.name + install_req.as_egg = self.as_egg + install_req.use_user_site = self.use_user_site + install_req.target_dir = self.target_dir + if not name: + #url or path requirement w/o an egg fragment + self.unnamed_requirements.append(install_req) + else: + if self.has_requirement(name): + raise InstallationError( + 'Double requirement given: %s (already in %s, name=%r)' + % (install_req, self.get_requirement(name), name)) + self.requirements[name] = install_req + ## FIXME: what about other normalizations? E.g., _ vs. -? + if name.lower() != name: + self.requirement_aliases[name.lower()] = name + + def has_requirement(self, project_name): + for name in project_name, project_name.lower(): + if name in self.requirements or name in self.requirement_aliases: + return True + return False + + @property + def has_requirements(self): + return list(self.requirements.values()) or self.unnamed_requirements + + @property + def has_editables(self): + if any(req.editable for req in self.requirements.values()): + return True + if any(req.editable for req in self.unnamed_requirements): + return True + return False + + @property + def is_download(self): + if self.download_dir: + self.download_dir = os.path.expanduser(self.download_dir) + if os.path.exists(self.download_dir): + return True + else: + logger.fatal('Could not find download directory') + raise InstallationError( + "Could not find or access download directory '%s'" + % display_path(self.download_dir)) + return False + + def get_requirement(self, project_name): + for name in project_name, project_name.lower(): + if name in self.requirements: + return self.requirements[name] + if name in self.requirement_aliases: + return self.requirements[self.requirement_aliases[name]] + raise KeyError("No project with the name %r" % project_name) + + def uninstall(self, auto_confirm=False): + for req in self.requirements.values(): + req.uninstall(auto_confirm=auto_confirm) + req.commit_uninstall() + + def locate_files(self): + ## FIXME: duplicates code from prepare_files; relevant code should + ## probably be factored out into a separate method + unnamed = list(self.unnamed_requirements) + reqs = list(self.requirements.values()) + while reqs or unnamed: + if unnamed: + req_to_install = unnamed.pop(0) + else: + req_to_install = reqs.pop(0) + install_needed = True + if not self.ignore_installed and not req_to_install.editable: + req_to_install.check_if_exists() + if req_to_install.satisfied_by: + if self.upgrade: + #don't uninstall conflict if user install and and conflict is not user install + if not (self.use_user_site and not dist_in_usersite(req_to_install.satisfied_by)): + req_to_install.conflicts_with = req_to_install.satisfied_by + req_to_install.satisfied_by = None + else: + install_needed = False + if req_to_install.satisfied_by: + logger.notify('Requirement already satisfied ' + '(use --upgrade to upgrade): %s' + % req_to_install) + + if req_to_install.editable: + if req_to_install.source_dir is None: + req_to_install.source_dir = req_to_install.build_location(self.src_dir) + elif install_needed: + req_to_install.source_dir = req_to_install.build_location(self.build_dir, not self.is_download) + + if req_to_install.source_dir is not None and not os.path.isdir(req_to_install.source_dir): + raise InstallationError('Could not install requirement %s ' + 'because source folder %s does not exist ' + '(perhaps --no-download was used without first running ' + 'an equivalent install with --no-install?)' + % (req_to_install, req_to_install.source_dir)) + + def prepare_files(self, finder, force_root_egg_info=False, bundle=False): + """Prepare process. Create temp directories, download and/or unpack files.""" + unnamed = list(self.unnamed_requirements) + reqs = list(self.requirements.values()) + while reqs or unnamed: + if unnamed: + req_to_install = unnamed.pop(0) + else: + req_to_install = reqs.pop(0) + install = True + best_installed = False + not_found = None + if not self.ignore_installed and not req_to_install.editable: + req_to_install.check_if_exists() + if req_to_install.satisfied_by: + if self.upgrade: + if not self.force_reinstall and not req_to_install.url: + try: + url = finder.find_requirement( + req_to_install, self.upgrade) + except BestVersionAlreadyInstalled: + best_installed = True + install = False + except DistributionNotFound: + not_found = sys.exc_info()[1] + else: + # Avoid the need to call find_requirement again + req_to_install.url = url.url + + if not best_installed: + #don't uninstall conflict if user install and conflict is not user install + if not (self.use_user_site and not dist_in_usersite(req_to_install.satisfied_by)): + req_to_install.conflicts_with = req_to_install.satisfied_by + req_to_install.satisfied_by = None + else: + install = False + if req_to_install.satisfied_by: + if best_installed: + logger.notify('Requirement already up-to-date: %s' + % req_to_install) + else: + logger.notify('Requirement already satisfied ' + '(use --upgrade to upgrade): %s' + % req_to_install) + if req_to_install.editable: + logger.notify('Obtaining %s' % req_to_install) + elif install: + if req_to_install.url and req_to_install.url.lower().startswith('file:'): + logger.notify('Unpacking %s' % display_path(url_to_path(req_to_install.url))) + else: + logger.notify('Downloading/unpacking %s' % req_to_install) + logger.indent += 2 + try: + is_bundle = False + is_wheel = False + if req_to_install.editable: + if req_to_install.source_dir is None: + location = req_to_install.build_location(self.src_dir) + req_to_install.source_dir = location + else: + location = req_to_install.source_dir + if not os.path.exists(self.build_dir): + _make_build_dir(self.build_dir) + req_to_install.update_editable(not self.is_download) + if self.is_download: + req_to_install.run_egg_info() + req_to_install.archive(self.download_dir) + else: + req_to_install.run_egg_info() + elif install: + ##@@ if filesystem packages are not marked + ##editable in a req, a non deterministic error + ##occurs when the script attempts to unpack the + ##build directory + + # NB: This call can result in the creation of a temporary build directory + location = req_to_install.build_location(self.build_dir, not self.is_download) + unpack = True + url = None + + # In the case where the req comes from a bundle, we should + # assume a build dir exists and move on + if req_to_install.from_bundle: + pass + # If a checkout exists, it's unwise to keep going. version + # inconsistencies are logged later, but do not fail the + # installation. + elif os.path.exists(os.path.join(location, 'setup.py')): + msg = textwrap.dedent(""" + pip can't proceed with requirement '%s' due to a pre-existing build directory. + location: %s + This is likely due to a previous installation that failed. + pip is being responsible and not assuming it can delete this. + Please delete it and try again. + """ % (req_to_install, location)) + e = PreviousBuildDirError(msg) + logger.fatal(msg) + raise e + else: + ## FIXME: this won't upgrade when there's an existing package unpacked in `location` + if req_to_install.url is None: + if not_found: + raise not_found + url = finder.find_requirement(req_to_install, upgrade=self.upgrade) + else: + ## FIXME: should req_to_install.url already be a link? + url = Link(req_to_install.url) + assert url + if url: + try: + self.unpack_url(url, location, self.is_download) + except HTTPError: + e = sys.exc_info()[1] + logger.fatal('Could not install requirement %s because of error %s' + % (req_to_install, e)) + raise InstallationError( + 'Could not install requirement %s because of HTTP error %s for URL %s' + % (req_to_install, e, url)) + else: + unpack = False + if unpack: + is_bundle = req_to_install.is_bundle + is_wheel = url and url.filename.endswith('.whl') + if is_bundle: + req_to_install.move_bundle_files(self.build_dir, self.src_dir) + for subreq in req_to_install.bundle_requirements(): + reqs.append(subreq) + self.add_requirement(subreq) + elif self.is_download: + req_to_install.source_dir = location + if not is_wheel: + # FIXME: see https://github.com/pypa/pip/issues/1112 + req_to_install.run_egg_info() + if url and url.scheme in vcs.all_schemes: + req_to_install.archive(self.download_dir) + elif is_wheel: + req_to_install.source_dir = location + req_to_install.url = url.url + dist = list(pkg_resources.find_distributions(location))[0] + if not req_to_install.req: + req_to_install.req = dist.as_requirement() + self.add_requirement(req_to_install) + if not self.ignore_dependencies: + for subreq in dist.requires(req_to_install.extras): + if self.has_requirement(subreq.project_name): + continue + subreq = InstallRequirement(str(subreq), + req_to_install) + reqs.append(subreq) + self.add_requirement(subreq) + else: + req_to_install.source_dir = location + req_to_install.run_egg_info() + if force_root_egg_info: + # We need to run this to make sure that the .egg-info/ + # directory is created for packing in the bundle + req_to_install.run_egg_info(force_root_egg_info=True) + req_to_install.assert_source_matches_version() + #@@ sketchy way of identifying packages not grabbed from an index + if bundle and req_to_install.url: + self.copy_to_build_dir(req_to_install) + install = False + # req_to_install.req is only avail after unpack for URL pkgs + # repeat check_if_exists to uninstall-on-upgrade (#14) + req_to_install.check_if_exists() + if req_to_install.satisfied_by: + if self.upgrade or self.ignore_installed: + #don't uninstall conflict if user install and and conflict is not user install + if not (self.use_user_site and not dist_in_usersite(req_to_install.satisfied_by)): + req_to_install.conflicts_with = req_to_install.satisfied_by + req_to_install.satisfied_by = None + else: + install = False + if not (is_bundle or is_wheel): + ## FIXME: shouldn't be globally added: + finder.add_dependency_links(req_to_install.dependency_links) + if (req_to_install.extras): + logger.notify("Installing extra requirements: %r" % ','.join(req_to_install.extras)) + if not self.ignore_dependencies: + for req in req_to_install.requirements(req_to_install.extras): + try: + name = pkg_resources.Requirement.parse(req).project_name + except ValueError: + e = sys.exc_info()[1] + ## FIXME: proper warning + logger.error('Invalid requirement: %r (%s) in requirement %s' % (req, e, req_to_install)) + continue + if self.has_requirement(name): + ## FIXME: check for conflict + continue + subreq = InstallRequirement(req, req_to_install) + reqs.append(subreq) + self.add_requirement(subreq) + if not self.has_requirement(req_to_install.name): + #'unnamed' requirements will get added here + self.add_requirement(req_to_install) + if self.is_download or req_to_install._temp_build_dir is not None: + self.reqs_to_cleanup.append(req_to_install) + else: + self.reqs_to_cleanup.append(req_to_install) + + if install: + self.successfully_downloaded.append(req_to_install) + if bundle and (req_to_install.url and req_to_install.url.startswith('file:///')): + self.copy_to_build_dir(req_to_install) + finally: + logger.indent -= 2 + + def cleanup_files(self, bundle=False): + """Clean up files, remove builds.""" + logger.notify('Cleaning up...') + logger.indent += 2 + for req in self.reqs_to_cleanup: + req.remove_temporary_source() + + remove_dir = [] + if self._pip_has_created_build_dir(): + remove_dir.append(self.build_dir) + + # The source dir of a bundle can always be removed. + # FIXME: not if it pre-existed the bundle! + if bundle: + remove_dir.append(self.src_dir) + + for dir in remove_dir: + if os.path.exists(dir): + logger.info('Removing temporary dir %s...' % dir) + rmtree(dir) + + logger.indent -= 2 + + def _pip_has_created_build_dir(self): + return (self.build_dir == build_prefix and + os.path.exists(os.path.join(self.build_dir, PIP_DELETE_MARKER_FILENAME))) + + def copy_to_build_dir(self, req_to_install): + target_dir = req_to_install.editable and self.src_dir or self.build_dir + logger.info("Copying %s to %s" % (req_to_install.name, target_dir)) + dest = os.path.join(target_dir, req_to_install.name) + shutil.copytree(req_to_install.source_dir, dest) + call_subprocess(["python", "%s/setup.py" % dest, "clean"], cwd=dest, + command_desc='python setup.py clean') + + def unpack_url(self, link, location, only_download=False): + if only_download: + loc = self.download_dir + else: + loc = location + if is_vcs_url(link): + return unpack_vcs_link(link, loc, only_download) + # a local file:// index could have links with hashes + elif not link.hash and is_file_url(link): + return unpack_file_url(link, loc) + else: + if self.download_cache: + self.download_cache = os.path.expanduser(self.download_cache) + retval = unpack_http_url(link, location, self.download_cache, self.download_dir) + if only_download: + write_delete_marker_file(location) + return retval + + def install(self, install_options, global_options=(), *args, **kwargs): + """Install everything in this set (after having downloaded and unpacked the packages)""" + to_install = [r for r in self.requirements.values() + if not r.satisfied_by] + + # DISTRIBUTE TO SETUPTOOLS UPGRADE HACK (1 of 3 parts) + # move the distribute-0.7.X wrapper to the end because it does not + # install a setuptools package. by moving it to the end, we ensure it's + # setuptools dependency is handled first, which will provide the + # setuptools package + # TODO: take this out later + distribute_req = pkg_resources.Requirement.parse("distribute>=0.7") + for req in to_install: + if req.name == 'distribute' and req.installed_version in distribute_req: + to_install.remove(req) + to_install.append(req) + + if to_install: + logger.notify('Installing collected packages: %s' % ', '.join([req.name for req in to_install])) + logger.indent += 2 + try: + for requirement in to_install: + + # DISTRIBUTE TO SETUPTOOLS UPGRADE HACK (1 of 3 parts) + # when upgrading from distribute-0.6.X to the new merged + # setuptools in py2, we need to force setuptools to uninstall + # distribute. In py3, which is always using distribute, this + # conversion is already happening in distribute's pkg_resources. + # It's ok *not* to check if setuptools>=0.7 because if someone + # were actually trying to ugrade from distribute to setuptools + # 0.6.X, then all this could do is actually help, although that + # upgade path was certainly never "supported" + # TODO: remove this later + if requirement.name == 'setuptools': + try: + # only uninstall distribute<0.7. For >=0.7, setuptools + # will also be present, and that's what we need to + # uninstall + distribute_requirement = pkg_resources.Requirement.parse("distribute<0.7") + existing_distribute = pkg_resources.get_distribution("distribute") + if existing_distribute in distribute_requirement: + requirement.conflicts_with = existing_distribute + except pkg_resources.DistributionNotFound: + # distribute wasn't installed, so nothing to do + pass + + if requirement.conflicts_with: + logger.notify('Found existing installation: %s' + % requirement.conflicts_with) + logger.indent += 2 + try: + requirement.uninstall(auto_confirm=True) + finally: + logger.indent -= 2 + try: + requirement.install(install_options, global_options, *args, **kwargs) + except: + # if install did not succeed, rollback previous uninstall + if requirement.conflicts_with and not requirement.install_succeeded: + requirement.rollback_uninstall() + raise + else: + if requirement.conflicts_with and requirement.install_succeeded: + requirement.commit_uninstall() + requirement.remove_temporary_source() + finally: + logger.indent -= 2 + self.successfully_installed = to_install + + def create_bundle(self, bundle_filename): + ## FIXME: can't decide which is better; zip is easier to read + ## random files from, but tar.bz2 is smaller and not as lame a + ## format. + + ## FIXME: this file should really include a manifest of the + ## packages, maybe some other metadata files. It would make + ## it easier to detect as well. + zip = zipfile.ZipFile(bundle_filename, 'w', zipfile.ZIP_DEFLATED) + vcs_dirs = [] + for dir, basename in (self.build_dir, 'build'), (self.src_dir, 'src'): + dir = os.path.normcase(os.path.abspath(dir)) + for dirpath, dirnames, filenames in os.walk(dir): + for backend in vcs.backends: + vcs_backend = backend() + vcs_url = vcs_rev = None + if vcs_backend.dirname in dirnames: + for vcs_dir in vcs_dirs: + if dirpath.startswith(vcs_dir): + # vcs bundle file already in parent directory + break + else: + vcs_url, vcs_rev = vcs_backend.get_info( + os.path.join(dir, dirpath)) + vcs_dirs.append(dirpath) + vcs_bundle_file = vcs_backend.bundle_file + vcs_guide = vcs_backend.guide % {'url': vcs_url, + 'rev': vcs_rev} + dirnames.remove(vcs_backend.dirname) + break + if 'pip-egg-info' in dirnames: + dirnames.remove('pip-egg-info') + for dirname in dirnames: + dirname = os.path.join(dirpath, dirname) + name = self._clean_zip_name(dirname, dir) + zip.writestr(basename + '/' + name + '/', '') + for filename in filenames: + if filename == PIP_DELETE_MARKER_FILENAME: + continue + filename = os.path.join(dirpath, filename) + name = self._clean_zip_name(filename, dir) + zip.write(filename, basename + '/' + name) + if vcs_url: + name = os.path.join(dirpath, vcs_bundle_file) + name = self._clean_zip_name(name, dir) + zip.writestr(basename + '/' + name, vcs_guide) + + zip.writestr('pip-manifest.txt', self.bundle_requirements()) + zip.close() + + BUNDLE_HEADER = '''\ +# This is a pip bundle file, that contains many source packages +# that can be installed as a group. You can install this like: +# pip this_file.zip +# The rest of the file contains a list of all the packages included: +''' + + def bundle_requirements(self): + parts = [self.BUNDLE_HEADER] + for req in [req for req in self.requirements.values() + if not req.comes_from]: + parts.append('%s==%s\n' % (req.name, req.installed_version)) + parts.append('# These packages were installed to satisfy the above requirements:\n') + for req in [req for req in self.requirements.values() + if req.comes_from]: + parts.append('%s==%s\n' % (req.name, req.installed_version)) + ## FIXME: should we do something with self.unnamed_requirements? + return ''.join(parts) + + def _clean_zip_name(self, name, prefix): + assert name.startswith(prefix+os.path.sep), ( + "name %r doesn't start with prefix %r" % (name, prefix)) + name = name[len(prefix)+1:] + name = name.replace(os.path.sep, '/') + return name + + +def _make_build_dir(build_dir): + os.makedirs(build_dir) + write_delete_marker_file(build_dir) + + +_scheme_re = re.compile(r'^(http|https|file):', re.I) + + +def parse_requirements(filename, finder=None, comes_from=None, options=None): + skip_match = None + skip_regex = options.skip_requirements_regex if options else None + if skip_regex: + skip_match = re.compile(skip_regex) + reqs_file_dir = os.path.dirname(os.path.abspath(filename)) + filename, content = get_file_content(filename, comes_from=comes_from) + for line_number, line in enumerate(content.splitlines()): + line_number += 1 + line = line.strip() + if not line or line.startswith('#'): + continue + if skip_match and skip_match.search(line): + continue + if line.startswith('-r') or line.startswith('--requirement'): + if line.startswith('-r'): + req_url = line[2:].strip() + else: + req_url = line[len('--requirement'):].strip().strip('=') + if _scheme_re.search(filename): + # Relative to a URL + req_url = urlparse.urljoin(filename, req_url) + elif not _scheme_re.search(req_url): + req_url = os.path.join(os.path.dirname(filename), req_url) + for item in parse_requirements(req_url, finder, comes_from=filename, options=options): + yield item + elif line.startswith('-Z') or line.startswith('--always-unzip'): + # No longer used, but previously these were used in + # requirement files, so we'll ignore. + pass + elif line.startswith('-f') or line.startswith('--find-links'): + if line.startswith('-f'): + line = line[2:].strip() + else: + line = line[len('--find-links'):].strip().lstrip('=') + ## FIXME: it would be nice to keep track of the source of + ## the find_links: + # support a find-links local path relative to a requirements file + relative_to_reqs_file = os.path.join(reqs_file_dir, line) + if os.path.exists(relative_to_reqs_file): + line = relative_to_reqs_file + if finder: + finder.find_links.append(line) + elif line.startswith('-i') or line.startswith('--index-url'): + if line.startswith('-i'): + line = line[2:].strip() + else: + line = line[len('--index-url'):].strip().lstrip('=') + if finder: + finder.index_urls = [line] + elif line.startswith('--extra-index-url'): + line = line[len('--extra-index-url'):].strip().lstrip('=') + if finder: + finder.index_urls.append(line) + elif line.startswith('--use-wheel'): + finder.use_wheel = True + elif line.startswith('--no-index'): + finder.index_urls = [] + elif line.startswith("--allow-external"): + line = line[len("--allow-external"):].strip().lstrip("=") + finder.allow_external |= set([normalize_name(line).lower()]) + elif line.startswith("--allow-all-external"): + finder.allow_all_external = True + elif line.startswith("--no-allow-external"): + finder.allow_external = False + elif line.startswith("--no-allow-insecure"): + finder.allow_all_insecure = False + elif line.startswith("--allow-insecure"): + line = line[len("--allow-insecure"):].strip().lstrip("=") + finder.allow_insecure |= set([normalize_name(line).lower()]) + else: + comes_from = '-r %s (line %s)' % (filename, line_number) + if line.startswith('-e') or line.startswith('--editable'): + if line.startswith('-e'): + line = line[2:].strip() + else: + line = line[len('--editable'):].strip().lstrip('=') + req = InstallRequirement.from_editable( + line, comes_from=comes_from, default_vcs=options.default_vcs if options else None) + else: + req = InstallRequirement.from_line(line, comes_from, prereleases=getattr(options, "pre", None)) + yield req + + +def parse_editable(editable_req, default_vcs=None): + """Parses svn+http://blahblah@rev#egg=Foobar into a requirement + (Foobar) and a URL""" + + url = editable_req + extras = None + + # If a file path is specified with extras, strip off the extras. + m = re.match(r'^(.+)(\[[^\]]+\])$', url) + if m: + url_no_extras = m.group(1) + extras = m.group(2) + else: + url_no_extras = url + + if os.path.isdir(url_no_extras): + if not os.path.exists(os.path.join(url_no_extras, 'setup.py')): + raise InstallationError("Directory %r is not installable. File 'setup.py' not found." % url_no_extras) + # Treating it as code that has already been checked out + url_no_extras = path_to_url(url_no_extras) + + if url_no_extras.lower().startswith('file:'): + if extras: + return None, url_no_extras, pkg_resources.Requirement.parse('__placeholder__' + extras).extras + else: + return None, url_no_extras, None + + for version_control in vcs: + if url.lower().startswith('%s:' % version_control): + url = '%s+%s' % (version_control, url) + if '+' not in url: + if default_vcs: + url = default_vcs + '+' + url + else: + raise InstallationError( + '%s should either by a path to a local project or a VCS url beginning with svn+, git+, hg+, or bzr+' % editable_req) + vc_type = url.split('+', 1)[0].lower() + if not vcs.get_backend(vc_type): + error_message = 'For --editable=%s only ' % editable_req + \ + ', '.join([backend.name + '+URL' for backend in vcs.backends]) + \ + ' is currently supported' + raise InstallationError(error_message) + match = re.search(r'(?:#|#.*?&)egg=([^&]*)', editable_req) + if (not match or not match.group(1)) and vcs.get_backend(vc_type): + parts = [p for p in editable_req.split('#', 1)[0].split('/') if p] + if parts[-2] in ('tags', 'branches', 'tag', 'branch'): + req = parts[-3] + elif parts[-1] == 'trunk': + req = parts[-2] + else: + raise InstallationError( + '--editable=%s is not the right format; it must have #egg=Package' + % editable_req) + else: + req = match.group(1) + ## FIXME: use package_to_requirement? + match = re.search(r'^(.*?)(?:-dev|-\d.*)$', req) + if match: + # Strip off -dev, -0.2, etc. + req = match.group(1) + return req, url, None + + +class UninstallPathSet(object): + """A set of file paths to be removed in the uninstallation of a + requirement.""" + def __init__(self, dist): + self.paths = set() + self._refuse = set() + self.pth = {} + self.dist = dist + self.save_dir = None + self._moved_paths = [] + + def _permitted(self, path): + """ + Return True if the given path is one we are permitted to + remove/modify, False otherwise. + + """ + return is_local(path) + + def _can_uninstall(self): + if not dist_is_local(self.dist): + logger.notify("Not uninstalling %s at %s, outside environment %s" + % (self.dist.project_name, normalize_path(self.dist.location), sys.prefix)) + return False + return True + + def add(self, path): + path = normalize_path(path) + if not os.path.exists(path): + return + if self._permitted(path): + self.paths.add(path) + else: + self._refuse.add(path) + + # __pycache__ files can show up after 'installed-files.txt' is created, due to imports + if os.path.splitext(path)[1] == '.py' and uses_pycache: + self.add(imp.cache_from_source(path)) + + + def add_pth(self, pth_file, entry): + pth_file = normalize_path(pth_file) + if self._permitted(pth_file): + if pth_file not in self.pth: + self.pth[pth_file] = UninstallPthEntries(pth_file) + self.pth[pth_file].add(entry) + else: + self._refuse.add(pth_file) + + def compact(self, paths): + """Compact a path set to contain the minimal number of paths + necessary to contain all paths in the set. If /a/path/ and + /a/path/to/a/file.txt are both in the set, leave only the + shorter path.""" + short_paths = set() + for path in sorted(paths, key=len): + if not any([(path.startswith(shortpath) and + path[len(shortpath.rstrip(os.path.sep))] == os.path.sep) + for shortpath in short_paths]): + short_paths.add(path) + return short_paths + + def _stash(self, path): + return os.path.join( + self.save_dir, os.path.splitdrive(path)[1].lstrip(os.path.sep)) + + def remove(self, auto_confirm=False): + """Remove paths in ``self.paths`` with confirmation (unless + ``auto_confirm`` is True).""" + if not self._can_uninstall(): + return + if not self.paths: + logger.notify("Can't uninstall '%s'. No files were found to uninstall." % self.dist.project_name) + return + logger.notify('Uninstalling %s:' % self.dist.project_name) + logger.indent += 2 + paths = sorted(self.compact(self.paths)) + try: + if auto_confirm: + response = 'y' + else: + for path in paths: + logger.notify(path) + response = ask('Proceed (y/n)? ', ('y', 'n')) + if self._refuse: + logger.notify('Not removing or modifying (outside of prefix):') + for path in self.compact(self._refuse): + logger.notify(path) + if response == 'y': + self.save_dir = tempfile.mkdtemp(suffix='-uninstall', + prefix='pip-') + for path in paths: + new_path = self._stash(path) + logger.info('Removing file or directory %s' % path) + self._moved_paths.append(path) + renames(path, new_path) + for pth in self.pth.values(): + pth.remove() + logger.notify('Successfully uninstalled %s' % self.dist.project_name) + + finally: + logger.indent -= 2 + + def rollback(self): + """Rollback the changes previously made by remove().""" + if self.save_dir is None: + logger.error("Can't roll back %s; was not uninstalled" % self.dist.project_name) + return False + logger.notify('Rolling back uninstall of %s' % self.dist.project_name) + for path in self._moved_paths: + tmp_path = self._stash(path) + logger.info('Replacing %s' % path) + renames(tmp_path, path) + for pth in self.pth: + pth.rollback() + + def commit(self): + """Remove temporary save dir: rollback will no longer be possible.""" + if self.save_dir is not None: + rmtree(self.save_dir) + self.save_dir = None + self._moved_paths = [] + + +class UninstallPthEntries(object): + def __init__(self, pth_file): + if not os.path.isfile(pth_file): + raise UninstallationError("Cannot remove entries from nonexistent file %s" % pth_file) + self.file = pth_file + self.entries = set() + self._saved_lines = None + + def add(self, entry): + entry = os.path.normcase(entry) + # On Windows, os.path.normcase converts the entry to use + # backslashes. This is correct for entries that describe absolute + # paths outside of site-packages, but all the others use forward + # slashes. + if sys.platform == 'win32' and not os.path.splitdrive(entry)[0]: + entry = entry.replace('\\', '/') + self.entries.add(entry) + + def remove(self): + logger.info('Removing pth entries from %s:' % self.file) + fh = open(self.file, 'rb') + # windows uses '\r\n' with py3k, but uses '\n' with py2.x + lines = fh.readlines() + self._saved_lines = lines + fh.close() + if any(b('\r\n') in line for line in lines): + endline = '\r\n' + else: + endline = '\n' + for entry in self.entries: + try: + logger.info('Removing entry: %s' % entry) + lines.remove(b(entry + endline)) + except ValueError: + pass + fh = open(self.file, 'wb') + fh.writelines(lines) + fh.close() + + def rollback(self): + if self._saved_lines is None: + logger.error('Cannot roll back changes to %s, none were made' % self.file) + return False + logger.info('Rolling %s back to previous state' % self.file) + fh = open(self.file, 'wb') + fh.writelines(self._saved_lines) + fh.close() + return True + + +class FakeFile(object): + """Wrap a list of lines in an object with readline() to make + ConfigParser happy.""" + def __init__(self, lines): + self._gen = (l for l in lines) + + def readline(self): + try: + try: + return next(self._gen) + except NameError: + return self._gen.next() + except StopIteration: + return '' + + def __iter__(self): + return self._gen diff --git a/PythonEnv/2.7/Lib/site-packages/pip/req.pyc b/PythonEnv/2.7/Lib/site-packages/pip/req.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d16778966c9bce9c6a0f27b124f72a2c51c4941e GIT binary patch literal 60020 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/util.py b/PythonEnv/2.7/Lib/site-packages/pip/util.py new file mode 100644 index 0000000000..77f9de6efc --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/util.py @@ -0,0 +1,693 @@ +import sys +import shutil +import os +import stat +import re +import posixpath +import pkg_resources +import zipfile +import tarfile +import subprocess +import textwrap +from pip.exceptions import InstallationError, BadCommand, PipError +from pip.backwardcompat import(WindowsError, string_types, raw_input, + console_to_str, user_site, PermissionError) +from pip.locations import site_packages, running_under_virtualenv, virtualenv_no_global +from pip.log import logger +from pip.vendor.distlib import version + +__all__ = ['rmtree', 'display_path', 'backup_dir', + 'find_command', 'ask', 'Inf', + 'normalize_name', 'splitext', + 'format_size', 'is_installable_dir', + 'is_svn_page', 'file_contents', + 'split_leading_dir', 'has_leading_dir', + 'make_path_relative', 'normalize_path', + 'renames', 'get_terminal_size', 'get_prog', + 'unzip_file', 'untar_file', 'create_download_cache_folder', + 'cache_download', 'unpack_file', 'call_subprocess'] + + +def get_prog(): + try: + if os.path.basename(sys.argv[0]) in ('__main__.py', '-c'): + return "%s -m pip" % sys.executable + except (AttributeError, TypeError, IndexError): + pass + return 'pip' + + +def rmtree(dir, ignore_errors=False): + shutil.rmtree(dir, ignore_errors=ignore_errors, + onerror=rmtree_errorhandler) + + +def rmtree_errorhandler(func, path, exc_info): + """On Windows, the files in .svn are read-only, so when rmtree() tries to + remove them, an exception is thrown. We catch that here, remove the + read-only attribute, and hopefully continue without problems.""" + exctype, value = exc_info[:2] + if not ((exctype is WindowsError and value.args[0] == 5) or #others + (exctype is OSError and value.args[0] == 13) or #python2.4 + (exctype is PermissionError and value.args[3] == 5) #python3.3 + ): + raise + # file type should currently be read only + if ((os.stat(path).st_mode & stat.S_IREAD) != stat.S_IREAD): + raise + # convert to read/write + os.chmod(path, stat.S_IWRITE) + # use the original function to repeat the operation + func(path) + + +def display_path(path): + """Gives the display value for a given path, making it relative to cwd + if possible.""" + path = os.path.normcase(os.path.abspath(path)) + if path.startswith(os.getcwd() + os.path.sep): + path = '.' + path[len(os.getcwd()):] + return path + + +def backup_dir(dir, ext='.bak'): + """Figure out the name of a directory to back up the given dir to + (adding .bak, .bak2, etc)""" + n = 1 + extension = ext + while os.path.exists(dir + extension): + n += 1 + extension = ext + str(n) + return dir + extension + + +def find_command(cmd, paths=None, pathext=None): + """Searches the PATH for the given command and returns its path""" + if paths is None: + paths = os.environ.get('PATH', '').split(os.pathsep) + if isinstance(paths, string_types): + paths = [paths] + # check if there are funny path extensions for executables, e.g. Windows + if pathext is None: + pathext = get_pathext() + pathext = [ext for ext in pathext.lower().split(os.pathsep) if len(ext)] + # don't use extensions if the command ends with one of them + if os.path.splitext(cmd)[1].lower() in pathext: + pathext = [''] + # check if we find the command on PATH + for path in paths: + # try without extension first + cmd_path = os.path.join(path, cmd) + for ext in pathext: + # then including the extension + cmd_path_ext = cmd_path + ext + if os.path.isfile(cmd_path_ext): + return cmd_path_ext + if os.path.isfile(cmd_path): + return cmd_path + raise BadCommand('Cannot find command %r' % cmd) + + +def get_pathext(default_pathext=None): + """Returns the path extensions from environment or a default""" + if default_pathext is None: + default_pathext = os.pathsep.join(['.COM', '.EXE', '.BAT', '.CMD']) + pathext = os.environ.get('PATHEXT', default_pathext) + return pathext + + +def ask_path_exists(message, options): + for action in os.environ.get('PIP_EXISTS_ACTION', ''): + if action in options: + return action + return ask(message, options) + + +def ask(message, options): + """Ask the message interactively, with the given possible responses""" + while 1: + if os.environ.get('PIP_NO_INPUT'): + raise Exception('No input was expected ($PIP_NO_INPUT set); question: %s' % message) + response = raw_input(message) + response = response.strip().lower() + if response not in options: + print('Your response (%r) was not one of the expected responses: %s' % ( + response, ', '.join(options))) + else: + return response + + +class _Inf(object): + """I am bigger than everything!""" + + def __eq__(self, other): + if self is other: + return True + else: + return False + + def __ne__(self, other): + return not self.__eq__(other) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __gt__(self, other): + return True + + def __ge__(self, other): + return True + + def __repr__(self): + return 'Inf' + + +Inf = _Inf() #this object is not currently used as a sortable in our code +del _Inf + + +_normalize_re = re.compile(r'[^a-z]', re.I) + + +def normalize_name(name): + return _normalize_re.sub('-', name.lower()) + + +def format_size(bytes): + if bytes > 1000*1000: + return '%.1fMB' % (bytes/1000.0/1000) + elif bytes > 10*1000: + return '%ikB' % (bytes/1000) + elif bytes > 1000: + return '%.1fkB' % (bytes/1000.0) + else: + return '%ibytes' % bytes + + +def is_installable_dir(path): + """Return True if `path` is a directory containing a setup.py file.""" + if not os.path.isdir(path): + return False + setup_py = os.path.join(path, 'setup.py') + if os.path.isfile(setup_py): + return True + return False + + +def is_svn_page(html): + """Returns true if the page appears to be the index page of an svn repository""" + return (re.search(r'[^<]*Revision \d+:', html) + and re.search(r'Powered by (?:<a[^>]*?>)?Subversion', html, re.I)) + + +def file_contents(filename): + fp = open(filename, 'rb') + try: + return fp.read().decode('utf-8') + finally: + fp.close() + + +def split_leading_dir(path): + path = str(path) + path = path.lstrip('/').lstrip('\\') + if '/' in path and (('\\' in path and path.find('/') < path.find('\\')) + or '\\' not in path): + return path.split('/', 1) + elif '\\' in path: + return path.split('\\', 1) + else: + return path, '' + + +def has_leading_dir(paths): + """Returns true if all the paths have the same leading path name + (i.e., everything is in one subdirectory in an archive)""" + common_prefix = None + for path in paths: + prefix, rest = split_leading_dir(path) + if not prefix: + return False + elif common_prefix is None: + common_prefix = prefix + elif prefix != common_prefix: + return False + return True + + +def make_path_relative(path, rel_to): + """ + Make a filename relative, where the filename path, and it is + relative to rel_to + + >>> make_relative_path('/usr/share/something/a-file.pth', + ... '/usr/share/another-place/src/Directory') + '../../../something/a-file.pth' + >>> make_relative_path('/usr/share/something/a-file.pth', + ... '/home/user/src/Directory') + '../../../usr/share/something/a-file.pth' + >>> make_relative_path('/usr/share/a-file.pth', '/usr/share/') + 'a-file.pth' + """ + path_filename = os.path.basename(path) + path = os.path.dirname(path) + path = os.path.normpath(os.path.abspath(path)) + rel_to = os.path.normpath(os.path.abspath(rel_to)) + path_parts = path.strip(os.path.sep).split(os.path.sep) + rel_to_parts = rel_to.strip(os.path.sep).split(os.path.sep) + while path_parts and rel_to_parts and path_parts[0] == rel_to_parts[0]: + path_parts.pop(0) + rel_to_parts.pop(0) + full_parts = ['..']*len(rel_to_parts) + path_parts + [path_filename] + if full_parts == ['']: + return '.' + os.path.sep + return os.path.sep.join(full_parts) + + +def normalize_path(path): + """ + Convert a path to its canonical, case-normalized, absolute version. + + """ + return os.path.normcase(os.path.realpath(path)) + + +def splitext(path): + """Like os.path.splitext, but take off .tar too""" + base, ext = posixpath.splitext(path) + if base.lower().endswith('.tar'): + ext = base[-4:] + ext + base = base[:-4] + return base, ext + + +def renames(old, new): + """Like os.renames(), but handles renaming across devices.""" + # Implementation borrowed from os.renames(). + head, tail = os.path.split(new) + if head and tail and not os.path.exists(head): + os.makedirs(head) + + shutil.move(old, new) + + head, tail = os.path.split(old) + if head and tail: + try: + os.removedirs(head) + except OSError: + pass + + +def is_local(path): + """ + Return True if path is within sys.prefix, if we're running in a virtualenv. + + If we're not in a virtualenv, all paths are considered "local." + + """ + if not running_under_virtualenv(): + return True + return normalize_path(path).startswith(normalize_path(sys.prefix)) + + +def dist_is_local(dist): + """ + Return True if given Distribution object is installed locally + (i.e. within current virtualenv). + + Always True if we're not in a virtualenv. + + """ + return is_local(dist_location(dist)) + + +def dist_in_usersite(dist): + """ + Return True if given Distribution is installed in user site. + """ + if user_site: + return normalize_path(dist_location(dist)).startswith(normalize_path(user_site)) + else: + return False + +def dist_in_site_packages(dist): + """ + Return True if given Distribution is installed in distutils.sysconfig.get_python_lib(). + """ + return normalize_path(dist_location(dist)).startswith(normalize_path(site_packages)) + + +def dist_is_editable(dist): + """Is distribution an editable install?""" + #TODO: factor out determining editableness out of FrozenRequirement + from pip import FrozenRequirement + req = FrozenRequirement.from_dist(dist, []) + return req.editable + +def get_installed_distributions(local_only=True, + skip=('setuptools', 'pip', 'python'), + include_editables=True, + editables_only=False): + """ + Return a list of installed Distribution objects. + + If ``local_only`` is True (default), only return installations + local to the current virtualenv, if in a virtualenv. + + ``skip`` argument is an iterable of lower-case project names to + ignore; defaults to ('setuptools', 'pip', 'python'). [FIXME also + skip virtualenv?] + + If ``editables`` is False, don't report editables. + + If ``editables_only`` is True , only report editables. + + """ + if local_only: + local_test = dist_is_local + else: + local_test = lambda d: True + + if include_editables: + editable_test = lambda d: True + else: + editable_test = lambda d: not dist_is_editable(d) + + if editables_only: + editables_only_test = lambda d: dist_is_editable(d) + else: + editables_only_test = lambda d: True + + return [d for d in pkg_resources.working_set + if local_test(d) + and d.key not in skip + and editable_test(d) + and editables_only_test(d) + ] + + +def egg_link_path(dist): + """ + Return the path for the .egg-link file if it exists, otherwise, None. + + There's 3 scenarios: + 1) not in a virtualenv + try to find in site.USER_SITE, then site_packages + 2) in a no-global virtualenv + try to find in site_packages + 3) in a yes-global virtualenv + try to find in site_packages, then site.USER_SITE (don't look in global location) + + For #1 and #3, there could be odd cases, where there's an egg-link in 2 locations. + This method will just return the first one found. + """ + sites = [] + if running_under_virtualenv(): + if virtualenv_no_global(): + sites.append(site_packages) + else: + sites.append(site_packages) + if user_site: + sites.append(user_site) + else: + if user_site: + sites.append(user_site) + sites.append(site_packages) + + for site in sites: + egglink = os.path.join(site, dist.project_name) + '.egg-link' + if os.path.isfile(egglink): + return egglink + + +def dist_location(dist): + """ + Get the site-packages location of this distribution. Generally + this is dist.location, except in the case of develop-installed + packages, where dist.location is the source code location, and we + want to know where the egg-link file is. + + """ + egg_link = egg_link_path(dist) + if egg_link: + return egg_link + return dist.location + + +def get_terminal_size(): + """Returns a tuple (x, y) representing the width(x) and the height(x) + in characters of the terminal window.""" + def ioctl_GWINSZ(fd): + try: + import fcntl + import termios + import struct + cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, + '1234')) + except: + return None + if cr == (0, 0): + return None + if cr == (0, 0): + return None + return cr + cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + cr = ioctl_GWINSZ(fd) + os.close(fd) + except: + pass + if not cr: + cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80)) + return int(cr[1]), int(cr[0]) + + +def unzip_file(filename, location, flatten=True): + """Unzip the file (zip file located at filename) to the destination + location""" + if not os.path.exists(location): + os.makedirs(location) + zipfp = open(filename, 'rb') + try: + zip = zipfile.ZipFile(zipfp) + leading = has_leading_dir(zip.namelist()) and flatten + for info in zip.infolist(): + name = info.filename + data = zip.read(name) + fn = name + if leading: + fn = split_leading_dir(name)[1] + fn = os.path.join(location, fn) + dir = os.path.dirname(fn) + if not os.path.exists(dir): + os.makedirs(dir) + if fn.endswith('/') or fn.endswith('\\'): + # A directory + if not os.path.exists(fn): + os.makedirs(fn) + else: + fp = open(fn, 'wb') + try: + fp.write(data) + finally: + fp.close() + unix_attributes = info.external_attr >> 16 + if unix_attributes: + os.chmod(fn, unix_attributes) + + + finally: + zipfp.close() + + +def untar_file(filename, location): + """Untar the file (tar file located at filename) to the destination location""" + if not os.path.exists(location): + os.makedirs(location) + if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'): + mode = 'r:gz' + elif filename.lower().endswith('.bz2') or filename.lower().endswith('.tbz'): + mode = 'r:bz2' + elif filename.lower().endswith('.tar'): + mode = 'r' + else: + logger.warn('Cannot determine compression type for file %s' % filename) + mode = 'r:*' + tar = tarfile.open(filename, mode) + try: + # note: python<=2.5 doesnt seem to know about pax headers, filter them + leading = has_leading_dir([ + member.name for member in tar.getmembers() + if member.name != 'pax_global_header' + ]) + for member in tar.getmembers(): + fn = member.name + if fn == 'pax_global_header': + continue + if leading: + fn = split_leading_dir(fn)[1] + path = os.path.join(location, fn) + if member.isdir(): + if not os.path.exists(path): + os.makedirs(path) + elif member.issym(): + try: + tar._extract_member(member, path) + except: + e = sys.exc_info()[1] + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warn( + 'In the tar file %s the member %s is invalid: %s' + % (filename, member.name, e)) + continue + else: + try: + fp = tar.extractfile(member) + except (KeyError, AttributeError): + e = sys.exc_info()[1] + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warn( + 'In the tar file %s the member %s is invalid: %s' + % (filename, member.name, e)) + continue + if not os.path.exists(os.path.dirname(path)): + os.makedirs(os.path.dirname(path)) + destfp = open(path, 'wb') + try: + shutil.copyfileobj(fp, destfp) + finally: + destfp.close() + fp.close() + finally: + tar.close() + + +def create_download_cache_folder(folder): + logger.indent -= 2 + logger.notify('Creating supposed download cache at %s' % folder) + logger.indent += 2 + os.makedirs(folder) + + +def cache_download(target_file, temp_location, content_type): + logger.notify('Storing download in cache at %s' % display_path(target_file)) + shutil.copyfile(temp_location, target_file) + fp = open(target_file+'.content-type', 'w') + fp.write(content_type) + fp.close() + + +def unpack_file(filename, location, content_type, link): + filename = os.path.realpath(filename) + if (content_type == 'application/zip' + or filename.endswith('.zip') + or filename.endswith('.pybundle') + or filename.endswith('.whl') + or zipfile.is_zipfile(filename)): + unzip_file(filename, location, flatten=not filename.endswith(('.pybundle', '.whl'))) + elif (content_type == 'application/x-gzip' + or tarfile.is_tarfile(filename) + or splitext(filename)[1].lower() in ('.tar', '.tar.gz', '.tar.bz2', '.tgz', '.tbz')): + untar_file(filename, location) + elif (content_type and content_type.startswith('text/html') + and is_svn_page(file_contents(filename))): + # We don't really care about this + from pip.vcs.subversion import Subversion + Subversion('svn+' + link.url).unpack(location) + else: + ## FIXME: handle? + ## FIXME: magic signatures? + logger.fatal('Cannot unpack file %s (downloaded from %s, content-type: %s); cannot detect archive format' + % (filename, location, content_type)) + raise InstallationError('Cannot determine archive format of %s' % location) + + +def call_subprocess(cmd, show_stdout=True, + filter_stdout=None, cwd=None, + raise_on_returncode=True, + command_level=logger.DEBUG, command_desc=None, + extra_environ=None): + if command_desc is None: + cmd_parts = [] + for part in cmd: + if ' ' in part or '\n' in part or '"' in part or "'" in part: + part = '"%s"' % part.replace('"', '\\"') + cmd_parts.append(part) + command_desc = ' '.join(cmd_parts) + if show_stdout: + stdout = None + else: + stdout = subprocess.PIPE + logger.log(command_level, "Running command %s" % command_desc) + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + try: + proc = subprocess.Popen( + cmd, stderr=subprocess.STDOUT, stdin=None, stdout=stdout, + cwd=cwd, env=env) + except Exception: + e = sys.exc_info()[1] + logger.fatal( + "Error %s while executing command %s" % (e, command_desc)) + raise + all_output = [] + if stdout is not None: + stdout = proc.stdout + while 1: + line = console_to_str(stdout.readline()) + if not line: + break + line = line.rstrip() + all_output.append(line + '\n') + if filter_stdout: + level = filter_stdout(line) + if isinstance(level, tuple): + level, line = level + logger.log(level, line) + if not logger.stdout_level_matches(level): + logger.show_progress() + else: + logger.info(line) + else: + returned_stdout, returned_stderr = proc.communicate() + all_output = [returned_stdout or ''] + proc.wait() + if proc.returncode: + if raise_on_returncode: + if all_output: + logger.notify('Complete output from command %s:' % command_desc) + logger.notify('\n'.join(all_output) + '\n----------------------------------------') + raise InstallationError( + "Command %s failed with error code %s in %s" + % (command_desc, proc.returncode, cwd)) + else: + logger.warn( + "Command %s had error code %s in %s" + % (command_desc, proc.returncode, cwd)) + if stdout is not None: + return ''.join(all_output) + + +def is_prerelease(vers): + """ + Attempt to determine if this is a pre-release using PEP386/PEP426 rules. + + Will return True if it is a pre-release and False if not. Versions are + assumed to be a pre-release if they cannot be parsed. + """ + normalized = version.suggest_normalized_version(vers) + + if normalized is None: + # Cannot normalize, assume it is a pre-release + return True + + parsed = version.normalized_key(normalized) + return any([any([y in set(["a", "b", "c", "rc", "dev"]) for y in x]) for x in parsed]) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/util.pyc b/PythonEnv/2.7/Lib/site-packages/pip/util.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1e08075493ce8a332d302d19c6114e804b293d7 GIT binary patch literal 26305 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vcs/__init__.py new file mode 100644 index 0000000000..a56dd202bc --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vcs/__init__.py @@ -0,0 +1,251 @@ +"""Handles all VCS (version control) support""" + +import os +import shutil + +from pip.backwardcompat import urlparse, urllib +from pip.log import logger +from pip.util import (display_path, backup_dir, find_command, + rmtree, ask_path_exists) + + +__all__ = ['vcs', 'get_src_requirement'] + + +class VcsSupport(object): + _registry = {} + schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] + + def __init__(self): + # Register more schemes with urlparse for various version control systems + urlparse.uses_netloc.extend(self.schemes) + # Python >= 2.7.4, 3.3 doesn't have uses_fragment + if getattr(urlparse, 'uses_fragment', None): + urlparse.uses_fragment.extend(self.schemes) + super(VcsSupport, self).__init__() + + def __iter__(self): + return self._registry.__iter__() + + @property + def backends(self): + return list(self._registry.values()) + + @property + def dirnames(self): + return [backend.dirname for backend in self.backends] + + @property + def all_schemes(self): + schemes = [] + for backend in self.backends: + schemes.extend(backend.schemes) + return schemes + + def register(self, cls): + if not hasattr(cls, 'name'): + logger.warn('Cannot register VCS %s' % cls.__name__) + return + if cls.name not in self._registry: + self._registry[cls.name] = cls + + def unregister(self, cls=None, name=None): + if name in self._registry: + del self._registry[name] + elif cls in self._registry.values(): + del self._registry[cls.name] + else: + logger.warn('Cannot unregister because no class or name given') + + def get_backend_name(self, location): + """ + Return the name of the version control backend if found at given + location, e.g. vcs.get_backend_name('/path/to/vcs/checkout') + """ + for vc_type in self._registry.values(): + path = os.path.join(location, vc_type.dirname) + if os.path.exists(path): + return vc_type.name + return None + + def get_backend(self, name): + name = name.lower() + if name in self._registry: + return self._registry[name] + + def get_backend_from_location(self, location): + vc_type = self.get_backend_name(location) + if vc_type: + return self.get_backend(vc_type) + return None + + +vcs = VcsSupport() + + +class VersionControl(object): + name = '' + dirname = '' + + def __init__(self, url=None, *args, **kwargs): + self.url = url + self._cmd = None + super(VersionControl, self).__init__(*args, **kwargs) + + def _filter(self, line): + return (logger.INFO, line) + + def _is_local_repository(self, repo): + """ + posix absolute paths start with os.path.sep, + win32 ones ones start with drive (like c:\\folder) + """ + drive, tail = os.path.splitdrive(repo) + return repo.startswith(os.path.sep) or drive + + @property + def cmd(self): + if self._cmd is not None: + return self._cmd + command = find_command(self.name) + logger.info('Found command %r at %r' % (self.name, command)) + self._cmd = command + return command + + def get_url_rev(self): + """ + Returns the correct repository URL and revision by parsing the given + repository URL + """ + error_message = ( + "Sorry, '%s' is a malformed VCS url. " + "The format is <vcs>+<protocol>://<url>, " + "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp") + assert '+' in self.url, error_message % self.url + url = self.url.split('+', 1)[1] + scheme, netloc, path, query, frag = urlparse.urlsplit(url) + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + url = urlparse.urlunsplit((scheme, netloc, path, query, '')) + return url, rev + + def get_info(self, location): + """ + Returns (url, revision), where both are strings + """ + assert not location.rstrip('/').endswith(self.dirname), 'Bad directory: %s' % location + return self.get_url(location), self.get_revision(location) + + def normalize_url(self, url): + """ + Normalize a URL for comparison by unquoting it and removing any trailing slash. + """ + return urllib.unquote(url).rstrip('/') + + def compare_urls(self, url1, url2): + """ + Compare two repo URLs for identity, ignoring incidental differences. + """ + return (self.normalize_url(url1) == self.normalize_url(url2)) + + def parse_vcs_bundle_file(self, content): + """ + Takes the contents of the bundled text file that explains how to revert + the stripped off version control data of the given package and returns + the URL and revision of it. + """ + raise NotImplementedError + + def obtain(self, dest): + """ + Called when installing or updating an editable package, takes the + source path of the checkout. + """ + raise NotImplementedError + + def switch(self, dest, url, rev_options): + """ + Switch the repo at ``dest`` to point to ``URL``. + """ + raise NotImplemented + + def update(self, dest, rev_options): + """ + Update an already-existing repo to the given ``rev_options``. + """ + raise NotImplementedError + + def check_destination(self, dest, url, rev_options, rev_display): + """ + Prepare a location to receive a checkout/clone. + + Return True if the location is ready for (and requires) a + checkout/clone, False otherwise. + """ + checkout = True + prompt = False + if os.path.exists(dest): + checkout = False + if os.path.exists(os.path.join(dest, self.dirname)): + existing_url = self.get_url(dest) + if self.compare_urls(existing_url, url): + logger.info('%s in %s exists, and has correct URL (%s)' % + (self.repo_name.title(), display_path(dest), + url)) + logger.notify('Updating %s %s%s' % + (display_path(dest), self.repo_name, + rev_display)) + self.update(dest, rev_options) + else: + logger.warn('%s %s in %s exists with URL %s' % + (self.name, self.repo_name, + display_path(dest), existing_url)) + prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ', + ('s', 'i', 'w', 'b')) + else: + logger.warn('Directory %s already exists, ' + 'and is not a %s %s.' % + (dest, self.name, self.repo_name)) + prompt = ('(i)gnore, (w)ipe, (b)ackup ', ('i', 'w', 'b')) + if prompt: + logger.warn('The plan is to install the %s repository %s' % + (self.name, url)) + response = ask_path_exists('What to do? %s' % prompt[0], + prompt[1]) + + if response == 's': + logger.notify('Switching %s %s to %s%s' % + (self.repo_name, display_path(dest), url, + rev_display)) + self.switch(dest, url, rev_options) + elif response == 'i': + # do nothing + pass + elif response == 'w': + logger.warn('Deleting %s' % display_path(dest)) + rmtree(dest) + checkout = True + elif response == 'b': + dest_dir = backup_dir(dest) + logger.warn('Backing up %s to %s' + % (display_path(dest), dest_dir)) + shutil.move(dest, dest_dir) + checkout = True + return checkout + + def unpack(self, location): + if os.path.exists(location): + rmtree(location) + self.obtain(location) + + def get_src_requirement(self, dist, location, find_tags=False): + raise NotImplementedError + + +def get_src_requirement(dist, location, find_tags): + version_control = vcs.get_backend_from_location(location) + if version_control: + return version_control().get_src_requirement(dist, location, find_tags) + logger.warn('cannot determine version of editable source in %s (is not SVN checkout, Git clone, Mercurial clone or Bazaar branch)' % location) + return dist.as_requirement() diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vcs/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31a709c7cef72d441065d846444ff6c1ec1e2412 GIT binary patch literal 11818 zcmc&)&vV<@eSaWDQq&JimTj$_qzSTH#Z;`75+}{JuGft%uj5P{We3`LTU8qh1Rg0^ zAVA}RlC@*CGu`bi(?e%E%`vx}a%p?&t+yWXhvd>rJJTH7&*%F9kajx0Eh`(35AXN) z_m7AAe=RTk!*6R|po+gbe!q{${40u3sRNXb3TrBM)B!5CUQ-7(sn=CpSHn4VFsFtM zb<j`_N6e|XsfI0e(6a9h70;_-TOG93a6ug`sNteISX9F$b+Dv{%j#em<C-dLsR35L zq{4ZnS5zM>wbkcJeWui39IPt6%G$wY6)u$Bi&giU3YYkDaD|86?<^CBO%#v)B#gCj z{Wx}??(VytQ=OS8P23<&@+^%vT{9ky(kzeu2Y-8=8s_BlD8^Yl@-w6JrhSQ{UdLf4 z-{W*J&{?O!_azizWJa-n-W~b*alU|to*$fyN8K>Wq`w~}VK+#JL!3qy$cA~Qb-se3 zzB!S3UHu|5xyea_)4=3c@H^0X*JMFA)6d6IriVJoW%;Lp*|*0IFiQS-tOt0^FHmS; z!ch@Q(5WP0SSM-1h8i^00qRXb7+P9VX($aE%(MO(h~1J`O8~rrB<Nizd)q1$<b#;u zs{9A~LA)guF3W1mD!e2WkaI;UE6UsNT*l!9LSv5QcM#<{aeh3I*WRaDK1V3}`N)nt zO#-5w4?A|*>7mG#dgiESHT4peI*;sNCR)jX0HLn3Kb1kvR|h4S+9HWD@3WeE)+Sdu zn6WRk-^<B5W1~&CpZNn~yhDO=OO-E{eTmNFG!Rni7r6#iTj(;uF=%9@4$}E~ZlT#r z6YUA;<QOoV&O9zEjMnW&NtAcHmb(Oa9rruvR#KS1L@m5?2uvN1dxsxK$^E#W>2Rvn zi;}~Kx;Gviet4cAr^yG&>EZ3|_YR*#y+ae_`rQ%O(I04YIEqGxV6MY*)9ul@cOC1K z*$mlU)vnamoOP!{IuS2OCtiqa!8>raF9$9prj1T;=>Qy@otI$cIxE2PZlHgLAblCz z@iAmAH35dN0u12=uMi$#BESO<DnY8Vmz0PBkM||MQM^w5c&v?pJ!60bqtq$jH1ky) z#R66nDiJ82SOEJ2R0buX9)7Z-E*$j|AUf)2HT8U<0+EwEt|ZI~J(c)FEfOH0No%p; z?C2(77H2VU<8aep62uD3ZM*<X0QchS1y?@&WL;fA9SE>5A=x!i3eQ*7$7q`-t-$S( z1-z>$I$TwtmRHYZ8=l#SpXd}=r*5G<zJZMkNo+c+&Q&KMsa~P+hiD-4LeV+YVdkdF zg^OYO2!36yQyo&L@pVoR)KDial|A7Aa(zQa&Z)c5hobz5ggs$;a)MdM>#m<9Y3^FF z)|uGP4b!102!9;=hAPhE;bi8SpCyIxbCGV>dk0-2KvS&6or2iR5XJM@v4rAX)D4xd za#n!dIcLoYcp^RoWEYPZ7_g94cPCAieWj?Q@%`j>iNsPBa>V^|gizxBWSMpjxF?AU zVps!XzQtWEYR5@=EVrivA7;l*Qa6ZwW85@zi9~l0o$5qf4MC(w3AcFValH)`QyhG= z?42QciOmTl-^E*n;AQ8Uvsx1trat8(2>uBwFCG^tgL3*zsfVAuNBM;}00t)0f>BX# zki#$PWqVV-6l0&QN^eW;Q^0{_Yrf4tV&Mh1`15o=&Js6223m>Av@iA7TtK(bb8ggk z`{_6dT|c*2uNH!>_j7oSTdv+7Y`d_a+jPx}iCr$<xw%8{ZzoT8(7gjsAUH|K`OVF0 zk-ZMB<b;Ug_oPN7M;u3D=UEyh-q%nmd<(jSmfDoa4u@C;O`a}~CDM2rbo29(_HJ<; zo*AjHRqXUSF7BeuvOr_qxef_ioM^F1#=eO`R8O$HqR0!y<S0thH-t670gk${AHL>n z(20uEGdNK+%@fTcc$y*T^aiIu{{dbNm7{W&pj(9L>v*dmrfRn;1z<rb&|1}0_I3%Y z7_4b%IoqSU@NTmZ4v;pwQyy)gw}WDaAamm>kl`bz!*0ojPta*i7r<{i%g$bh+~E;! z30u0|VH%EO8U|9%np?V`9-TF@9HT6ScbuPF8~t_mz0HC!3IaSvbyG<B4qhh+klGjS zF;n3&bTd4A6QEwNwddRQl{x%twOcFm?ZtK@zl6@GHrm{^!DfIK`6Ej_z+--e!Uk(# zavQ8MG($+`sLv60H5kr*jxGdWb*UgOn`az{Mz9b<Y6Nr~fI!R!bc<y`hgeLaIfU0X zkY;Et5!}H_8NOj78#g1Ywt*WWX&bm*QTnRHZrJ5o6}$2Hl{zOcQj;5Up_SjRxD(*= zE>t<Rwm2Wq;B+{^?sfHdWwgb>V$V7gTnF*C&{x!9HyDQATWIyZ$AV~{s6OwH@hZdo zY+yuBp1|`M%+RBd6CpQJ%6r>s{~sET5fl70m^a|2&$NVvnbe;+O+Vaw^plAW6S(3i z(G#BjqS;xjN4FovjMoSg&!;RrbExrk7mxWi3JVXzZc$-}u+3tg@d~qD^v;nrN8cjF zEzIVxFtsv-u+F2@L@!*wXVQ3_YnSHFxF+|r+&x2_>!xO#ZQDkVwx;KuMag$=y9lS@ zAF-I45@v9e+)f;wXg9cX*iYk7XA|pdJt!I-v5=yVkhF<%nP*?Qzv2Ei^`J)+rW3kk zdX(n0K6Va~llxITLsDJEmfgsR%8e0l6OVbCo%hggcplZbZo^$tjSWIMYG!MBLZwdH zDqAmJ_u+)FLwqVkQvef^3gu%PE#FEsfhwh1<h)3gNRaSIJf<SI<!)qjo;EU(Ywu66 ztyS7Y+QexUWJXCpo#OizMii^e5TDdM&^2&Elwl%I)mEGqtk;()(3DoXY_#cu#(zNt zxB;FRX#s6OW>Z1$ApElUK?||<Hx_{yf&3f(1HDq-po43@TQT;B4Z5}$bLs+>rn+cR ziC>6*e~Ew%j?m8)D$k((5lP4@lsF8YR|wp=REtXWCDbewEQU2yA0Bh*TfCgNdWXn0 zLll)PS=ZQzKOCf4rUM3gB|Eu4^`5xMRif!Ml5}bB972lBX)=&05|mVny*jaKHmBHe zAB&%Fxi>e=O*cXw)*bqBKh1_Zlz0+qf7|^C4m#VwIv8>n{`0+Cci{=-X^_VE?(FQ` z#jtyY^KDL(TgQ1mLi6yPJMW-n=f~&wN27Q2VDP@wKoF&FMJ%QIeeXR~_d4?^t^J^N zzHbbC4fypRWEoPxWKvNHHrdCq*w?nu_YzZ+$-C$abdD2wwVpklBS{}>F4sjAZIE=c z+mVNCgfFYu{GruE-1hlcBX34|W!6#D4^TftK`4D$zy!5&YIxi=6sp;*zwO*`z6vjA z$@wyV#rjjbP<BKt9-~72FTw%dqrnr_M}5g`kxgx8VoEe5zC%9;N-hF*F_B!=+(%Kd zQOT+uoNcS($jvSH>{w^o?WM36J}O8(f;~+&PYAzbn0I~Phc5C;U~=fnJ8qf8AW<?- z8;S49<QlcV#9!Wz&?%;o{w}tbL_X`KOiYxQxZ*P;7CDnAp$h$5)UD>9+nUg(vf0A7 zz_BPO(gu1+EO!wv`<Px~Y>zS+N1tklDK!9O689uS2!3R6Wda>APM(j`oLV5t3k5Mu zPx<aA=Wd?C8uG;;gK@lFt?PY^U2Kv<B$DdLuB5#`XBUraGjR0nW{63;Xh{h*sr+*^ zSO;jXN()tt{uOjuwGVbLm=`Ug%1<g^=P5>2pzjL$w40x$qF;$uBZ!Sc+$}^obYnEY z5d^16Agz83ZteHM-ASO$1dlfL{4=aS$@qxUz`?&=R&LJ_eKeVtK{SzP{vPio_DEAc zq`0Vw1ytZ5!Zv~f3-<dB+A3Uq<e$K$W44BubHEOqJe#rUAuAKZV&u4Nap9=~pT{s3 z`UP&?qQtnz>6x1o!AR}o)p}e>q<e&^X}|Bjp7;s<+%LBfiv}Af7bOL2GkY|pPq5tY z*+m>M$|n@s6B5bY-Cmmia5#$P(oTnBVJ3Voilu;ZhV;4ybjz(~7dEzQu}aTh{{kJB zaLr1;zmae+rU|!;{54PveVn);M~+vrGqlHe1RPuS;Oa2S{T^snAbHEpOM+J<GwC=B zY&=jBrp%<hj%2TgBTQkG#xum_+YHf3`;qn#0wljg&El^S@F0BNh`$FIP(i&9s}mdx z=hLB~3w?A%SdNa!)+6Kub5@Ryz<)<auVX?o4X?7>ByjOGcCtPQZ9GJzn~v!7%rIOQ zmxrb`IA+45)DYCGeBOvC<`*hN{gmtk>y+R=Khu7A{;ph_lfeXWz!8Ps%JR|C6tKUK zHOoKT-&!8Q(=lFW%s?U{`q$XF#0wolD$6SFcmh2N%?ZCBJ`Li8=^Q!CP`2Z+9ld4l zyr_s{MT6C3{K1jR;VWVWn}9?Gueb|G1p|<b{CAbN)iWfMtZTNYo-Hvy3%9l~c{SB9 z?w2?a86`wCRVNl(WH3?=;p!_A8cFQpJl}FS3t1<`Ea<x|<>J%|E!CeZuCEaBtkEX~ zz|R4po!6Gtrlyu#A+r@;DTX67LM)U$t`(DTCOZR%ui4de`C^0-)3Um;&fiPw1`vS2 z3PBUXDA@DtpJZ40f`JQ6pA+#Pz$}i+&MR^-Gy~GQa-Kh~ah;~D^Ka#AOJ09h0<$^+ zTw?6}YJp|PQoC4WUS<KBYen}(Tc`vyUY@M*vONKAT|IkC&V#QTYWOfhcn7NyF%8(> ztK>GaTqRi_LVoB(`)--dwFWiN%&PcqsfBlf7>Sqdg=%7P$MR7&*1SNW_*E+)m=h@# zf2U*PN%@e)Y`T86!mCSfxsUu9_h9hqb#@jR>{VXp$Ok<e1||j`Jd8i@Mz+LM<0cY5 zgN<ToqB|RA(=hie3WMqa6E@6-k;`+bzp{!=I&mh3Y+zo;Y>K+tay!u`-7}5a*=982 zZ*Nn+?r|l+Fj7WRo=Mr08@`8SxWTOpZS~5TfgIkh`u1qshAHqjY-Vnu|07@*E)T3M z{G_zBwSsi)LKSG!K?H*d>W}FqVPKg4nTxgvO-h1d!{n+pI~8^~P;f*$@leNF3^!Kd zP5A?W%#q^}&nqLXjX6Q57qeh~!2^dC&gpAy*U=#^Dmg_$ZK1RGP0k{0-n%TeSn&SK zV|vx|S<s909-)9Z(}Imsxp9+4;6caQtFx2p5*Us8=N>{)doyZtPK-A^0`GB*N8@Zw z((yP)+LP~yVzm9xNA6ZCqv_Ei$Q?b6N%5VRM2jWc%1TI93`e<yh^0l6m~kGnGi^pN zw_0Y=s`In385$V|z;f6wH;)pz$^2(D8lqUWc!9Bo=MRzhT0`FJ8m{Zws4qHKYHbAl zSDm`ERBPAXl3Sg&bJ@A%EZ3GWh8KJ5=tIBrma~ACCH!k+#wvaT(ye@UxgW2xpo<WU zRte<nYfKMV+u~3?p}Wit*srqa9qhf9y|ug|#O$Mc;swq+66X=d2_4%1K&`m_Tf^1Y z8@<5EeI|jkjtH61-t4jlM#}{jVR`v{F!yJA!$DE|PdwHs!BrkJ338R^eV4U&ScsrX z2gTdF$KnGPf5hT33r54<Aq&Q>R-i-HNH{B$BCR02@-A46SaAD^j7aT^z6X)JCLUKl zJ)%@JYfFuGy*<CuZm+dl?I!-s7r%Gf4apCXSbT)PAE9FTyYR2T+4v6emN*4qY)KlU zi@sJ}?K6EVABdny>_3?w*;}#)<z~-dF%{TPMM911nISHQswftrXBAQvag()-ox-&2 zKi#YB_LlntWNgHEZ@E9#SuoBbq#2}vf!YKAQ{T_rUgjsk@up4R&trFw_p3q;tA=SD zCEoB25@FR>sn!<omPfeO`)dxP1u8;reEce(+fGROg;SFp^xt@@Z&8}iRhJ#{ee9K2 zH%tRuMT-R@rr{GJJdQ@&{H_BxilL-7au2P_qom3-4#4-n_5zP6Vgv1nSRpYkUV}5J z8$6nxVmE%|)fH=z_MRaXDW8CPg5>XU=>G%Di%Gg`FXitMLUR=b*d9uK9ZI}2w^Uz$ K*sibt@_zyQL%5#+ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/bazaar.py b/PythonEnv/2.7/Lib/site-packages/pip/vcs/bazaar.py new file mode 100644 index 0000000000..86f4bbc624 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vcs/bazaar.py @@ -0,0 +1,131 @@ +import os +import tempfile +import re +from pip.backwardcompat import urlparse +from pip.log import logger +from pip.util import rmtree, display_path, call_subprocess +from pip.vcs import vcs, VersionControl +from pip.download import path_to_url2 + + +class Bazaar(VersionControl): + name = 'bzr' + dirname = '.bzr' + repo_name = 'branch' + bundle_file = 'bzr-branch.txt' + schemes = ('bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp', 'bzr+lp') + guide = ('# This was a Bazaar branch; to make it a branch again run:\n' + 'bzr branch -r %(rev)s %(url)s .\n') + + def __init__(self, url=None, *args, **kwargs): + super(Bazaar, self).__init__(url, *args, **kwargs) + # Python >= 2.7.4, 3.3 doesn't have uses_fragment or non_hierarchical + # Register lp but do not expose as a scheme to support bzr+lp. + if getattr(urlparse, 'uses_fragment', None): + urlparse.uses_fragment.extend(['lp']) + urlparse.non_hierarchical.extend(['lp']) + + def parse_vcs_bundle_file(self, content): + url = rev = None + for line in content.splitlines(): + if not line.strip() or line.strip().startswith('#'): + continue + match = re.search(r'^bzr\s*branch\s*-r\s*(\d*)', line) + if match: + rev = match.group(1).strip() + url = line[match.end():].strip().split(None, 1)[0] + if url and rev: + return url, rev + return None, None + + def export(self, location): + """Export the Bazaar repository at the url to the destination location""" + temp_dir = tempfile.mkdtemp('-export', 'pip-') + self.unpack(temp_dir) + if os.path.exists(location): + # Remove the location to make sure Bazaar can export it correctly + rmtree(location) + try: + call_subprocess([self.cmd, 'export', location], cwd=temp_dir, + filter_stdout=self._filter, show_stdout=False) + finally: + rmtree(temp_dir) + + def switch(self, dest, url, rev_options): + call_subprocess([self.cmd, 'switch', url], cwd=dest) + + def update(self, dest, rev_options): + call_subprocess( + [self.cmd, 'pull', '-q'] + rev_options, cwd=dest) + + def obtain(self, dest): + url, rev = self.get_url_rev() + if rev: + rev_options = ['-r', rev] + rev_display = ' (to revision %s)' % rev + else: + rev_options = [] + rev_display = '' + if self.check_destination(dest, url, rev_options, rev_display): + logger.notify('Checking out %s%s to %s' + % (url, rev_display, display_path(dest))) + call_subprocess( + [self.cmd, 'branch', '-q'] + rev_options + [url, dest]) + + def get_url_rev(self): + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it + url, rev = super(Bazaar, self).get_url_rev() + if url.startswith('ssh://'): + url = 'bzr+' + url + return url, rev + + def get_url(self, location): + urls = call_subprocess( + [self.cmd, 'info'], show_stdout=False, cwd=location) + for line in urls.splitlines(): + line = line.strip() + for x in ('checkout of branch: ', + 'parent branch: '): + if line.startswith(x): + repo = line.split(x)[1] + if self._is_local_repository(repo): + return path_to_url2(repo) + return repo + return None + + def get_revision(self, location): + revision = call_subprocess( + [self.cmd, 'revno'], show_stdout=False, cwd=location) + return revision.splitlines()[-1] + + def get_tag_revs(self, location): + tags = call_subprocess( + [self.cmd, 'tags'], show_stdout=False, cwd=location) + tag_revs = [] + for line in tags.splitlines(): + tags_match = re.search(r'([.\w-]+)\s*(.*)$', line) + if tags_match: + tag = tags_match.group(1) + rev = tags_match.group(2) + tag_revs.append((rev.strip(), tag.strip())) + return dict(tag_revs) + + def get_src_requirement(self, dist, location, find_tags): + repo = self.get_url(location) + if not repo.lower().startswith('bzr:'): + repo = 'bzr+' + repo + egg_project_name = dist.egg_name().split('-', 1)[0] + if not repo: + return None + current_rev = self.get_revision(location) + tag_revs = self.get_tag_revs(location) + + if current_rev in tag_revs: + # It's a tag + full_egg_name = '%s-%s' % (egg_project_name, tag_revs[current_rev]) + else: + full_egg_name = '%s-dev_r%s' % (dist.egg_name(), current_rev) + return '%s@%s#egg=%s' % (repo, current_rev, full_egg_name) + + +vcs.register(Bazaar) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/bazaar.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vcs/bazaar.pyc new file mode 100644 index 0000000000000000000000000000000000000000..363ce4d46609090be406cfbe7a3194eddb19a0bf GIT binary patch literal 6339 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 X97844kWAFP75v@w*1VPS+Q~lw)3#q_ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/git.py b/PythonEnv/2.7/Lib/site-packages/pip/vcs/git.py new file mode 100644 index 0000000000..16acebdc4a --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vcs/git.py @@ -0,0 +1,194 @@ +import tempfile +import re +import os.path +from pip.util import call_subprocess +from pip.util import display_path, rmtree +from pip.vcs import vcs, VersionControl +from pip.log import logger +from pip.backwardcompat import url2pathname, urlparse +urlsplit = urlparse.urlsplit +urlunsplit = urlparse.urlunsplit + + +class Git(VersionControl): + name = 'git' + dirname = '.git' + repo_name = 'clone' + schemes = ('git', 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file') + bundle_file = 'git-clone.txt' + guide = ('# This was a Git repo; to make it a repo again run:\n' + 'git init\ngit remote add origin %(url)s -f\ngit checkout %(rev)s\n') + + def __init__(self, url=None, *args, **kwargs): + + # Works around an apparent Git bug + # (see http://article.gmane.org/gmane.comp.version-control.git/146500) + if url: + scheme, netloc, path, query, fragment = urlsplit(url) + if scheme.endswith('file'): + initial_slashes = path[:-len(path.lstrip('/'))] + newpath = initial_slashes + url2pathname(path).replace('\\', '/').lstrip('/') + url = urlunsplit((scheme, netloc, newpath, query, fragment)) + after_plus = scheme.find('+') + 1 + url = scheme[:after_plus] + urlunsplit((scheme[after_plus:], netloc, newpath, query, fragment)) + + super(Git, self).__init__(url, *args, **kwargs) + + def parse_vcs_bundle_file(self, content): + url = rev = None + for line in content.splitlines(): + if not line.strip() or line.strip().startswith('#'): + continue + url_match = re.search(r'git\s*remote\s*add\s*origin(.*)\s*-f', line) + if url_match: + url = url_match.group(1).strip() + rev_match = re.search(r'^git\s*checkout\s*-q\s*(.*)\s*', line) + if rev_match: + rev = rev_match.group(1).strip() + if url and rev: + return url, rev + return None, None + + def export(self, location): + """Export the Git repository at the url to the destination location""" + temp_dir = tempfile.mkdtemp('-export', 'pip-') + self.unpack(temp_dir) + try: + if not location.endswith('/'): + location = location + '/' + call_subprocess( + [self.cmd, 'checkout-index', '-a', '-f', '--prefix', location], + filter_stdout=self._filter, show_stdout=False, cwd=temp_dir) + finally: + rmtree(temp_dir) + + def check_rev_options(self, rev, dest, rev_options): + """Check the revision options before checkout to compensate that tags + and branches may need origin/ as a prefix. + Returns the SHA1 of the branch or tag if found. + """ + revisions = self.get_refs(dest) + + origin_rev = 'origin/%s' % rev + if origin_rev in revisions: + # remote branch + return [revisions[origin_rev]] + elif rev in revisions: + # a local tag or branch name + return [revisions[rev]] + else: + logger.warn("Could not find a tag or branch '%s', assuming commit." % rev) + return rev_options + + def switch(self, dest, url, rev_options): + call_subprocess( + [self.cmd, 'config', 'remote.origin.url', url], cwd=dest) + call_subprocess( + [self.cmd, 'checkout', '-q'] + rev_options, cwd=dest) + + self.update_submodules(dest) + + def update(self, dest, rev_options): + # First fetch changes from the default remote + call_subprocess([self.cmd, 'fetch', '-q'], cwd=dest) + # Then reset to wanted revision (maby even origin/master) + if rev_options: + rev_options = self.check_rev_options(rev_options[0], dest, rev_options) + call_subprocess([self.cmd, 'reset', '--hard', '-q'] + rev_options, cwd=dest) + #: update submodules + self.update_submodules(dest) + + def obtain(self, dest): + url, rev = self.get_url_rev() + if rev: + rev_options = [rev] + rev_display = ' (to %s)' % rev + else: + rev_options = ['origin/master'] + rev_display = '' + if self.check_destination(dest, url, rev_options, rev_display): + logger.notify('Cloning %s%s to %s' % (url, rev_display, display_path(dest))) + call_subprocess([self.cmd, 'clone', '-q', url, dest]) + #: repo may contain submodules + self.update_submodules(dest) + if rev: + rev_options = self.check_rev_options(rev, dest, rev_options) + # Only do a checkout if rev_options differs from HEAD + if not self.get_revision(dest).startswith(rev_options[0]): + call_subprocess([self.cmd, 'checkout', '-q'] + rev_options, cwd=dest) + + def get_url(self, location): + url = call_subprocess( + [self.cmd, 'config', 'remote.origin.url'], + show_stdout=False, cwd=location) + return url.strip() + + def get_revision(self, location): + current_rev = call_subprocess( + [self.cmd, 'rev-parse', 'HEAD'], show_stdout=False, cwd=location) + return current_rev.strip() + + def get_refs(self, location): + """Return map of named refs (branches or tags) to commit hashes.""" + output = call_subprocess([self.cmd, 'show-ref'], + show_stdout=False, cwd=location) + rv = {} + for line in output.strip().splitlines(): + commit, ref = line.split(' ', 1) + ref = ref.strip() + ref_name = None + if ref.startswith('refs/remotes/'): + ref_name = ref[len('refs/remotes/'):] + elif ref.startswith('refs/heads/'): + ref_name = ref[len('refs/heads/'):] + elif ref.startswith('refs/tags/'): + ref_name = ref[len('refs/tags/'):] + if ref_name is not None: + rv[ref_name] = commit.strip() + return rv + + def get_src_requirement(self, dist, location, find_tags): + repo = self.get_url(location) + if not repo.lower().startswith('git:'): + repo = 'git+' + repo + egg_project_name = dist.egg_name().split('-', 1)[0] + if not repo: + return None + current_rev = self.get_revision(location) + refs = self.get_refs(location) + # refs maps names to commit hashes; we need the inverse + # if multiple names map to a single commit, this arbitrarily picks one + names_by_commit = dict((commit, ref) for ref, commit in refs.items()) + + if current_rev in names_by_commit: + # It's a tag + full_egg_name = '%s-%s' % (egg_project_name, names_by_commit[current_rev]) + else: + full_egg_name = '%s-dev' % egg_project_name + + return '%s@%s#egg=%s' % (repo, current_rev, full_egg_name) + + def get_url_rev(self): + """ + Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. + That's required because although they use SSH they sometimes doesn't + work with a ssh:// scheme (e.g. Github). But we need a scheme for + parsing. Hence we remove it again afterwards and return it as a stub. + """ + if not '://' in self.url: + assert not 'file:' in self.url + self.url = self.url.replace('git+', 'git+ssh://') + url, rev = super(Git, self).get_url_rev() + url = url.replace('ssh://', '') + else: + url, rev = super(Git, self).get_url_rev() + + return url, rev + + def update_submodules(self, location): + if not os.path.exists(os.path.join(location, '.gitmodules')): + return + call_subprocess([self.cmd, 'submodule', 'update', '--init', '--recursive', '-q'], + cwd=location) + +vcs.register(Git) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/git.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vcs/git.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a7d3343b144eafc92e367da0b81f6e8b4e922e1 GIT binary patch literal 8737 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/mercurial.py b/PythonEnv/2.7/Lib/site-packages/pip/vcs/mercurial.py new file mode 100644 index 0000000000..af427f77e7 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vcs/mercurial.py @@ -0,0 +1,151 @@ +import os +import tempfile +import re +import sys +from pip.util import call_subprocess +from pip.util import display_path, rmtree +from pip.log import logger +from pip.vcs import vcs, VersionControl +from pip.download import path_to_url2 +from pip.backwardcompat import ConfigParser + + +class Mercurial(VersionControl): + name = 'hg' + dirname = '.hg' + repo_name = 'clone' + schemes = ('hg', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http') + bundle_file = 'hg-clone.txt' + guide = ('# This was a Mercurial repo; to make it a repo again run:\n' + 'hg init\nhg pull %(url)s\nhg update -r %(rev)s\n') + + def parse_vcs_bundle_file(self, content): + url = rev = None + for line in content.splitlines(): + if not line.strip() or line.strip().startswith('#'): + continue + url_match = re.search(r'hg\s*pull\s*(.*)\s*', line) + if url_match: + url = url_match.group(1).strip() + rev_match = re.search(r'^hg\s*update\s*-r\s*(.*)\s*', line) + if rev_match: + rev = rev_match.group(1).strip() + if url and rev: + return url, rev + return None, None + + def export(self, location): + """Export the Hg repository at the url to the destination location""" + temp_dir = tempfile.mkdtemp('-export', 'pip-') + self.unpack(temp_dir) + try: + call_subprocess( + [self.cmd, 'archive', location], + filter_stdout=self._filter, show_stdout=False, cwd=temp_dir) + finally: + rmtree(temp_dir) + + def switch(self, dest, url, rev_options): + repo_config = os.path.join(dest, self.dirname, 'hgrc') + config = ConfigParser.SafeConfigParser() + try: + config.read(repo_config) + config.set('paths', 'default', url) + config_file = open(repo_config, 'w') + config.write(config_file) + config_file.close() + except (OSError, ConfigParser.NoSectionError): + e = sys.exc_info()[1] + logger.warn( + 'Could not switch Mercurial repository to %s: %s' + % (url, e)) + else: + call_subprocess([self.cmd, 'update', '-q'] + rev_options, cwd=dest) + + def update(self, dest, rev_options): + call_subprocess([self.cmd, 'pull', '-q'], cwd=dest) + call_subprocess( + [self.cmd, 'update', '-q'] + rev_options, cwd=dest) + + def obtain(self, dest): + url, rev = self.get_url_rev() + if rev: + rev_options = [rev] + rev_display = ' (to revision %s)' % rev + else: + rev_options = [] + rev_display = '' + if self.check_destination(dest, url, rev_options, rev_display): + logger.notify('Cloning hg %s%s to %s' + % (url, rev_display, display_path(dest))) + call_subprocess([self.cmd, 'clone', '--noupdate', '-q', url, dest]) + call_subprocess([self.cmd, 'update', '-q'] + rev_options, cwd=dest) + + def get_url(self, location): + url = call_subprocess( + [self.cmd, 'showconfig', 'paths.default'], + show_stdout=False, cwd=location).strip() + if self._is_local_repository(url): + url = path_to_url2(url) + return url.strip() + + def get_tag_revs(self, location): + tags = call_subprocess( + [self.cmd, 'tags'], show_stdout=False, cwd=location) + tag_revs = [] + for line in tags.splitlines(): + tags_match = re.search(r'([\w\d\.-]+)\s*([\d]+):.*$', line) + if tags_match: + tag = tags_match.group(1) + rev = tags_match.group(2) + if "tip" != tag: + tag_revs.append((rev.strip(), tag.strip())) + return dict(tag_revs) + + def get_branch_revs(self, location): + branches = call_subprocess( + [self.cmd, 'branches'], show_stdout=False, cwd=location) + branch_revs = [] + for line in branches.splitlines(): + branches_match = re.search(r'([\w\d\.-]+)\s*([\d]+):.*$', line) + if branches_match: + branch = branches_match.group(1) + rev = branches_match.group(2) + if "default" != branch: + branch_revs.append((rev.strip(), branch.strip())) + return dict(branch_revs) + + def get_revision(self, location): + current_revision = call_subprocess( + [self.cmd, 'parents', '--template={rev}'], + show_stdout=False, cwd=location).strip() + return current_revision + + def get_revision_hash(self, location): + current_rev_hash = call_subprocess( + [self.cmd, 'parents', '--template={node}'], + show_stdout=False, cwd=location).strip() + return current_rev_hash + + def get_src_requirement(self, dist, location, find_tags): + repo = self.get_url(location) + if not repo.lower().startswith('hg:'): + repo = 'hg+' + repo + egg_project_name = dist.egg_name().split('-', 1)[0] + if not repo: + return None + current_rev = self.get_revision(location) + current_rev_hash = self.get_revision_hash(location) + tag_revs = self.get_tag_revs(location) + branch_revs = self.get_branch_revs(location) + if current_rev in tag_revs: + # It's a tag + full_egg_name = '%s-%s' % (egg_project_name, tag_revs[current_rev]) + elif current_rev in branch_revs: + # It's the tip of a branch + full_egg_name = '%s-%s' % (egg_project_name, branch_revs[current_rev]) + else: + full_egg_name = '%s-dev' % egg_project_name + return '%s@%s#egg=%s' % (repo, current_rev_hash, full_egg_name) + +vcs.register(Mercurial) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/mercurial.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vcs/mercurial.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b388790f1d26048cfb5cd53db128f8b5613b30d GIT binary patch literal 7095 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/subversion.py b/PythonEnv/2.7/Lib/site-packages/pip/vcs/subversion.py new file mode 100644 index 0000000000..88163ff73f --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vcs/subversion.py @@ -0,0 +1,273 @@ +import os +import re +from pip.backwardcompat import urlparse +from pip.index import Link +from pip.util import rmtree, display_path, call_subprocess +from pip.log import logger +from pip.vcs import vcs, VersionControl + +_svn_xml_url_re = re.compile('url="([^"]+)"') +_svn_rev_re = re.compile('committed-rev="(\d+)"') +_svn_url_re = re.compile(r'URL: (.+)') +_svn_revision_re = re.compile(r'Revision: (.+)') +_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') +_svn_info_xml_url_re = re.compile(r'<url>(.*)</url>') + + +class Subversion(VersionControl): + name = 'svn' + dirname = '.svn' + repo_name = 'checkout' + schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') + bundle_file = 'svn-checkout.txt' + guide = ('# This was an svn checkout; to make it a checkout again run:\n' + 'svn checkout --force -r %(rev)s %(url)s .\n') + + def get_info(self, location): + """Returns (url, revision), where both are strings""" + assert not location.rstrip('/').endswith(self.dirname), 'Bad directory: %s' % location + output = call_subprocess( + [self.cmd, 'info', location], show_stdout=False, extra_environ={'LANG': 'C'}) + match = _svn_url_re.search(output) + if not match: + logger.warn('Cannot determine URL of svn checkout %s' % display_path(location)) + logger.info('Output that cannot be parsed: \n%s' % output) + return None, None + url = match.group(1).strip() + match = _svn_revision_re.search(output) + if not match: + logger.warn('Cannot determine revision of svn checkout %s' % display_path(location)) + logger.info('Output that cannot be parsed: \n%s' % output) + return url, None + return url, match.group(1) + + def parse_vcs_bundle_file(self, content): + for line in content.splitlines(): + if not line.strip() or line.strip().startswith('#'): + continue + match = re.search(r'^-r\s*([^ ])?', line) + if not match: + return None, None + rev = match.group(1) + rest = line[match.end():].strip().split(None, 1)[0] + return rest, rev + return None, None + + def export(self, location): + """Export the svn repository at the url to the destination location""" + url, rev = self.get_url_rev() + rev_options = get_rev_options(url, rev) + logger.notify('Exporting svn repository %s to %s' % (url, location)) + logger.indent += 2 + try: + if os.path.exists(location): + # Subversion doesn't like to check out over an existing directory + # --force fixes this, but was only added in svn 1.5 + rmtree(location) + call_subprocess( + [self.cmd, 'export'] + rev_options + [url, location], + filter_stdout=self._filter, show_stdout=False) + finally: + logger.indent -= 2 + + def switch(self, dest, url, rev_options): + call_subprocess( + [self.cmd, 'switch'] + rev_options + [url, dest]) + + def update(self, dest, rev_options): + call_subprocess( + [self.cmd, 'update'] + rev_options + [dest]) + + def obtain(self, dest): + url, rev = self.get_url_rev() + rev_options = get_rev_options(url, rev) + if rev: + rev_display = ' (to revision %s)' % rev + else: + rev_display = '' + if self.check_destination(dest, url, rev_options, rev_display): + logger.notify('Checking out %s%s to %s' + % (url, rev_display, display_path(dest))) + call_subprocess( + [self.cmd, 'checkout', '-q'] + rev_options + [url, dest]) + + def get_location(self, dist, dependency_links): + for url in dependency_links: + egg_fragment = Link(url).egg_fragment + if not egg_fragment: + continue + if '-' in egg_fragment: + ## FIXME: will this work when a package has - in the name? + key = '-'.join(egg_fragment.split('-')[:-1]).lower() + else: + key = egg_fragment + if key == dist.key: + return url.split('#', 1)[0] + return None + + def get_revision(self, location): + """ + Return the maximum revision for all files under a given location + """ + # Note: taken from setuptools.command.egg_info + revision = 0 + + for base, dirs, files in os.walk(location): + if self.dirname not in dirs: + dirs[:] = [] + continue # no sense walking uncontrolled subdirs + dirs.remove(self.dirname) + entries_fn = os.path.join(base, self.dirname, 'entries') + if not os.path.exists(entries_fn): + ## FIXME: should we warn? + continue + + dirurl, localrev = self._get_svn_url_rev(base) + + if base == location: + base_url = dirurl + '/' # save the root url + elif not dirurl or not dirurl.startswith(base_url): + dirs[:] = [] + continue # not part of the same svn tree, skip it + revision = max(revision, localrev) + return revision + + def get_url_rev(self): + # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it + url, rev = super(Subversion, self).get_url_rev() + if url.startswith('ssh://'): + url = 'svn+' + url + return url, rev + + def get_url(self, location): + # In cases where the source is in a subdirectory, not alongside setup.py + # we have to look up in the location until we find a real setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without finding setup.py + logger.warn("Could not find setup.py for directory %s (tried all parent directories)" + % orig_location) + return None + + return self._get_svn_url_rev(location)[0] + + def _get_svn_url_rev(self, location): + from pip.exceptions import InstallationError + + f = open(os.path.join(location, self.dirname, 'entries')) + data = f.read() + f.close() + if data.startswith('8') or data.startswith('9') or data.startswith('10'): + data = list(map(str.splitlines, data.split('\n\x0c\n'))) + del data[0][0] # get rid of the '8' + url = data[0][3] + revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0] + elif data.startswith('<?xml'): + match = _svn_xml_url_re.search(data) + if not match: + raise ValueError('Badly formatted data: %r' % data) + url = match.group(1) # get repository URL + revs = [int(m.group(1)) for m in _svn_rev_re.finditer(data)] + [0] + else: + try: + # subversion >= 1.7 + xml = call_subprocess([self.cmd, 'info', '--xml', location], show_stdout=False) + url = _svn_info_xml_url_re.search(xml).group(1) + revs = [int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml)] + except InstallationError: + url, revs = None, [] + + if revs: + rev = max(revs) + else: + rev = 0 + + return url, rev + + def get_tag_revs(self, svn_tag_url): + stdout = call_subprocess( + [self.cmd, 'ls', '-v', svn_tag_url], show_stdout=False) + results = [] + for line in stdout.splitlines(): + parts = line.split() + rev = int(parts[0]) + tag = parts[-1].strip('/') + results.append((tag, rev)) + return results + + def find_tag_match(self, rev, tag_revs): + best_match_rev = None + best_tag = None + for tag, tag_rev in tag_revs: + if (tag_rev > rev and + (best_match_rev is None or best_match_rev > tag_rev)): + # FIXME: Is best_match > tag_rev really possible? + # or is it a sign something is wacky? + best_match_rev = tag_rev + best_tag = tag + return best_tag + + def get_src_requirement(self, dist, location, find_tags=False): + repo = self.get_url(location) + if repo is None: + return None + parts = repo.split('/') + ## FIXME: why not project name? + egg_project_name = dist.egg_name().split('-', 1)[0] + rev = self.get_revision(location) + if parts[-2] in ('tags', 'tag'): + # It's a tag, perfect! + full_egg_name = '%s-%s' % (egg_project_name, parts[-1]) + elif parts[-2] in ('branches', 'branch'): + # It's a branch :( + full_egg_name = '%s-%s-r%s' % (dist.egg_name(), parts[-1], rev) + elif parts[-1] == 'trunk': + # Trunk :-/ + full_egg_name = '%s-dev_r%s' % (dist.egg_name(), rev) + if find_tags: + tag_url = '/'.join(parts[:-1]) + '/tags' + tag_revs = self.get_tag_revs(tag_url) + match = self.find_tag_match(rev, tag_revs) + if match: + logger.notify('trunk checkout %s seems to be equivalent to tag %s' % match) + repo = '%s/%s' % (tag_url, match) + full_egg_name = '%s-%s' % (egg_project_name, match) + else: + # Don't know what it is + logger.warn('svn URL does not fit normal structure (tags/branches/trunk): %s' % repo) + full_egg_name = '%s-dev_r%s' % (egg_project_name, rev) + return 'svn+%s@%s#egg=%s' % (repo, rev, full_egg_name) + + +def get_rev_options(url, rev): + if rev: + rev_options = ['-r', rev] + else: + rev_options = [] + + r = urlparse.urlsplit(url) + if hasattr(r, 'username'): + # >= Python-2.5 + username, password = r.username, r.password + else: + netloc = r[1] + if '@' in netloc: + auth = netloc.split('@')[0] + if ':' in auth: + username, password = auth.split(':', 1) + else: + username, password = auth, None + else: + username, password = None, None + + if username: + rev_options += ['--username', username] + if password: + rev_options += ['--password', password] + return rev_options + + +vcs.register(Subversion) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/subversion.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vcs/subversion.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab7ff6eb080b71b10e73f017019c7e6fd48c6fb1 GIT binary patch literal 10698 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 J_~+WS{|0nw4_*KO literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/__init__.py new file mode 100644 index 0000000000..a996951fc2 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/__init__.py @@ -0,0 +1,8 @@ +""" +pip.vendor is for vendoring dependencies of pip to prevent needing pip to +depend on something external. + +Files inside of pip.vendor should be considered immutable and should only be +updated to versions from upstream. +""" +from __future__ import absolute_import diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60c3dc59c12f679cbc86d54b61883096532ff6a4 GIT binary patch literal 490 zcmY*W&1xGl5Z10s6BbJDInB|R>>-yzDaC;%rx1#B2pCbZyPCC!Y9%3!O#L8vxjsSf zeSyrzE+jg9Go$aDAB`6OJ~hvO>-C^crxv?fDU~n9u}W<OD`jitDmB$=Q>)4@)Z_Al z(D{!*6DhWP^fn}*45OH1M1BhvqcG?P!VF;q(E<mE2}Q%;5$!BHUN=WI1P?h($h(=s z-;Bw3u5Fq-a#DqSCX1(H{~PCBD9%EUFoah=p#_?z!d>qWI&a}53Emw<*OX{G7LiP| z$COFZU`%0x5;G_4rnVt@omy4`d?C>FIk>`TXo?~6!*Ve*X9C99Fc`zlt3MVl35{7x zq?Yd?|CHE%(OcqO>Gc!&8#l_VZ@iwo{*Haw>K_N*1%K=J`nvtB@2S_B7_VYC{OY!t hwQNlvSFMd9Pi#yZ4}2~yzD~gwhu`Mu^8BSAs~3?Vl6U|B literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/__init__.py new file mode 100644 index 0000000000..d6ae0f2954 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import logging + +__version__ = '0.1.1' + +class DistlibException(Exception): + pass + +try: + from logging import NullHandler +except ImportError: # pragma: no cover + class NullHandler(logging.Handler): + def handle(self, record): pass + def emit(self, record): pass + +logger = logging.getLogger(__name__) +logger.addHandler(NullHandler()) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb68abad033387572ff10e104ccdcbbdd88b11c2 GIT binary patch literal 1338 zcmc&!QE$^Q5I!eqx)vrFOgtd*9wAXNUXUh)7_1UVQ-#upL1ZaPYB%+kIFapE^m#n; z%75gY9{_i5)lK4wmo3Vj&*$^qcjvRi-}}R#zk+lI+pmY?J0$x9nZTbx4UnM_K*m6X zAOo1A5W#nVD}b+A2<t;{+9T5@f-C}duAf6BdvG}fvjE1Jh(Q8e#C~&sw>bjM;0vwv zLGHm7gKPkD02f1$5&1_ALlDzs4*{t^_)RQ<d^tKA9l3`nohs{URgS;SWam_?ceyZJ ze2-*lD~3S)=`=wZk^q?_b)M^@k$LWhe$upJS>tqLg(~opoued<d8OQ9S@LtGPwKgm z;)YZz%}-^ytoY}(TeNztSNzrJH9u1&x5~*ET`{{XDrtGAI=+%xw1$ffbe`u*E0^b^ zZk<xldq|cr#w?*M94RKty8c*bQA?ACIR7`#r>NcJi6@80lLd5sB!rYXIh+wABDWuq zY=jKWr#{f+MtNw#%6jf%6pWm;MqHQW7AxZ8FMQ&U2olnNq>)k@DRs=<fT!@XQSLF0 z9(v*dQTbCkhm@+D_K{uV^U^I=*tgRGLh#KHvjIz};T)l=+p1E!@*SAxD`_lVF}yDW zT-#ka-?ZL~xBJv|t#M;xkdu#X*ZMt`bZ6)id)PNNWltfb@i(v#VrzVN)$s4ao6Sq` Xmf%}@W$p)Y@FWb`A=_uqq6h3RA)`U( literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/__init__.py new file mode 100644 index 0000000000..f7dbf4c9aa --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/__init__.py @@ -0,0 +1,6 @@ +"""Modules copied from Python 3 standard libraries, for internal use only. + +Individual classes and functions are found in d2._backport.misc. Intended +usage is to always import things missing from 3.1 from that module: the +built-in/stdlib objects will be used if found. +""" diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13d56fa79e6c00b7ab552ddc76198abc2d6f5fd3 GIT binary patch literal 489 zcmYjN!Ab-%3>_6zM*N2y_u!7`9t06l(8Gd?=s}P|X{VjtXty1jbY(xpfAsDTm~})g zBz;Mf^u26-?$_@hn-6XEb2j9@5Tjb0tEy-58`a}zbDi6h*W2Vu@C0q@(L3mJTEP8^ z=PAMjh)r}RI|yjA$>`|-x|9JU`y5SxLLO2KtER4}(cuzZk!%|bk<654=t^uEQ<Nxs zX)cn(2=2Ji*0isE%G@lF+6G`MQ={{)E@WmNkbo1I@Mcy7xL8*L&oRyjq=5tsY$wgp z0C;W~7T<bKrP9~7VBj&vLt-ZiAlVn+GQk^$0M@VB3z=?U)zo*R^|p9NoYpS2T8{)) ze~x+y-Km-(&x=)07%xMYz59nOMs?+FnW<rk*Kw(in-g_|RuQrv_aa)<k?OHmOVOLM fa!4%v)bB==))<ksZu%AP%BN?8tn+QbBvyR^nr@mz literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/misc.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/misc.py new file mode 100644 index 0000000000..cfb318d34f --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/misc.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Backports for individual classes and functions.""" + +import os +import sys + +__all__ = ['cache_from_source', 'callable', 'fsencode'] + + +try: + from imp import cache_from_source +except ImportError: + def cache_from_source(py_file, debug=__debug__): + ext = debug and 'c' or 'o' + return py_file + ext + + +try: + callable = callable +except NameError: + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode +except AttributeError: + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, str): + return filename.encode(sys.getfilesystemencoding()) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/misc.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/misc.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c30ba03398bb842dd67ca82a84dc2638b69781ba GIT binary patch literal 1580 zcmc&!;c65y5T5MbU9Z<WtF|gsghdbz(F%eHB4VxmA;=+Dp|UKjyGibvb2nKwx#B|o zWBUr?^Z3VS@xKqCGuhJi33Op5lgT$p=9|fezej^_zk(@;v#*QeOBDMPl>mrQGY|n3 z3}Q4|JAgO<5rXJ|=)ydNID}@?ulAtmK-q=33+zDOfsX9KrvcO-fiWgmK&-$iZq)_N z;6pP2*@w6f2l_rDS3UAOA?ct#6ay&NAYKC|R^b$H({IB@AQ>!%5DzhO3nNE9@`sNc zc;wI{@#6dAHOl7^s#h8RRGHe@XlCk2X`zmkSY}1Ui_BVSqfCovw$$7yqwTi(gWtqm z!$_X-Lz&KMQ>NA|Yc5^idy68=i*_=zQgb8ZnBmG41$cleMCqXHqS!4|#|-KrQB|!I zuU`T<MrQ!G_Q!;sIEv?9n=zW;-EIY~s!3-GkE0?9nJ?##BIIY+;?M?L(Au+PuH4}= zPY#scDQ2}4m#kdr<TXVn?;3Y#^qxLS9&bNQ-l{yY%E^Zn(v;1mO)6C-M^Xz@Cqh|Q zARx`pI7~`q`F7R#Oo<{(SpvJxJOQ4c-K^z@Q%WRsT~EXa4Tou?W^h79qUFh$7;^(u z$|`MLrn#IF)9s!VZt}(d%$BZs8^zL1ft_b|USi_oa%S}gWx0Rm3Mkq73Aq*_xDG73 zZ~}0`5YeNiz&hg^&KG^SiNjZX2N>>&nOHhmey${UQQkOgSZrhK>IacFF1lyOtGGTT z<y*u<e2X9kx5rrDp{=X2?gqN%(os)YoXXO#D?N9#$NQ#|dv%TPg_3hP^F>Wlos}|8 zFUm~u<olm>p>o_su|rhA)>#K-Bj~a56`cFmlcvJ(G<5_uc6!N=ZHj*CE>%{(p&k7* z-jwvSXel5<a07ZaX*#7Y@ElDr?G``*+!O`YhJGHtYo~OSql0#wt5v>qE%<^cZ~gN( p>+ATuG-6rE7t|LvLe&d~Y#6MEA=_jlcC{O_0gb_^6XG~xe*u>{dY1qI literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/shutil.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/shutil.py new file mode 100644 index 0000000000..9e2e234d46 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/shutil.py @@ -0,0 +1,761 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Utility functions for copying and archiving files and directory trees. + +XXX The functions here don't copy the resource fork or other metadata on Mac. + +""" + +import os +import sys +import stat +from os.path import abspath +import fnmatch +import collections +import errno +from . import tarfile + +try: + import bz2 + _BZ2_SUPPORTED = True +except ImportError: + _BZ2_SUPPORTED = False + +try: + from pwd import getpwnam +except ImportError: + getpwnam = None + +try: + from grp import getgrnam +except ImportError: + getgrnam = None + +__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", + "copytree", "move", "rmtree", "Error", "SpecialFileError", + "ExecError", "make_archive", "get_archive_formats", + "register_archive_format", "unregister_archive_format", + "get_unpack_formats", "register_unpack_format", + "unregister_unpack_format", "unpack_archive", "ignore_patterns"] + +class Error(EnvironmentError): + pass + +class SpecialFileError(EnvironmentError): + """Raised when trying to do a kind of operation (e.g. copying) which is + not supported on a special file (e.g. a named pipe)""" + +class ExecError(EnvironmentError): + """Raised when a command could not be executed""" + +class ReadError(EnvironmentError): + """Raised when an archive cannot be read""" + +class RegistryError(Exception): + """Raised when a registery operation with the archiving + and unpacking registeries fails""" + + +try: + WindowsError +except NameError: + WindowsError = None + +def copyfileobj(fsrc, fdst, length=16*1024): + """copy data from file-like object fsrc to file-like object fdst""" + while 1: + buf = fsrc.read(length) + if not buf: + break + fdst.write(buf) + +def _samefile(src, dst): + # Macintosh, Unix. + if hasattr(os.path, 'samefile'): + try: + return os.path.samefile(src, dst) + except OSError: + return False + + # All other platforms: check for same pathname. + return (os.path.normcase(os.path.abspath(src)) == + os.path.normcase(os.path.abspath(dst))) + +def copyfile(src, dst): + """Copy data from src to dst""" + if _samefile(src, dst): + raise Error("`%s` and `%s` are the same file" % (src, dst)) + + for fn in [src, dst]: + try: + st = os.stat(fn) + except OSError: + # File most likely does not exist + pass + else: + # XXX What about other special files? (sockets, devices...) + if stat.S_ISFIFO(st.st_mode): + raise SpecialFileError("`%s` is a named pipe" % fn) + + with open(src, 'rb') as fsrc: + with open(dst, 'wb') as fdst: + copyfileobj(fsrc, fdst) + +def copymode(src, dst): + """Copy mode bits from src to dst""" + if hasattr(os, 'chmod'): + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + os.chmod(dst, mode) + +def copystat(src, dst): + """Copy all stat info (mode bits, atime, mtime, flags) from src to dst""" + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + if hasattr(os, 'utime'): + os.utime(dst, (st.st_atime, st.st_mtime)) + if hasattr(os, 'chmod'): + os.chmod(dst, mode) + if hasattr(os, 'chflags') and hasattr(st, 'st_flags'): + try: + os.chflags(dst, st.st_flags) + except OSError as why: + if (not hasattr(errno, 'EOPNOTSUPP') or + why.errno != errno.EOPNOTSUPP): + raise + +def copy(src, dst): + """Copy data and mode bits ("cp src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copymode(src, dst) + +def copy2(src, dst): + """Copy data and all stat info ("cp -p src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copystat(src, dst) + +def ignore_patterns(*patterns): + """Function that can be used as copytree() ignore parameter. + + Patterns is a sequence of glob-style patterns + that are used to exclude files""" + def _ignore_patterns(path, names): + ignored_names = [] + for pattern in patterns: + ignored_names.extend(fnmatch.filter(names, pattern)) + return set(ignored_names) + return _ignore_patterns + +def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, + ignore_dangling_symlinks=False): + """Recursively copy a directory tree. + + The destination directory must not already exist. + If exception(s) occur, an Error is raised with a list of reasons. + + If the optional symlinks flag is true, symbolic links in the + source tree result in symbolic links in the destination tree; if + it is false, the contents of the files pointed to by symbolic + links are copied. If the file pointed by the symlink doesn't + exist, an exception will be added in the list of errors raised in + an Error exception at the end of the copy process. + + You can set the optional ignore_dangling_symlinks flag to true if you + want to silence this exception. Notice that this has no effect on + platforms that don't support os.symlink. + + The optional ignore argument is a callable. If given, it + is called with the `src` parameter, which is the directory + being visited by copytree(), and `names` which is the list of + `src` contents, as returned by os.listdir(): + + callable(src, names) -> ignored_names + + Since copytree() is called recursively, the callable will be + called once for each directory that is copied. It returns a + list of names relative to the `src` directory that should + not be copied. + + The optional copy_function argument is a callable that will be used + to copy each file. It will be called with the source path and the + destination path as arguments. By default, copy2() is used, but any + function that supports the same signature (like copy()) can be used. + + """ + names = os.listdir(src) + if ignore is not None: + ignored_names = ignore(src, names) + else: + ignored_names = set() + + os.makedirs(dst) + errors = [] + for name in names: + if name in ignored_names: + continue + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + if os.path.islink(srcname): + linkto = os.readlink(srcname) + if symlinks: + os.symlink(linkto, dstname) + else: + # ignore dangling symlink if the flag is on + if not os.path.exists(linkto) and ignore_dangling_symlinks: + continue + # otherwise let the copy occurs. copy2 will raise an error + copy_function(srcname, dstname) + elif os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore, copy_function) + else: + # Will raise a SpecialFileError for unsupported file types + copy_function(srcname, dstname) + # catch the Error from the recursive copytree so that we can + # continue with other files + except Error as err: + errors.extend(err.args[0]) + except EnvironmentError as why: + errors.append((srcname, dstname, str(why))) + try: + copystat(src, dst) + except OSError as why: + if WindowsError is not None and isinstance(why, WindowsError): + # Copying file access times may fail on Windows + pass + else: + errors.extend((src, dst, str(why))) + if errors: + raise Error(errors) + +def rmtree(path, ignore_errors=False, onerror=None): + """Recursively delete a directory tree. + + If ignore_errors is set, errors are ignored; otherwise, if onerror + is set, it is called to handle the error with arguments (func, + path, exc_info) where func is os.listdir, os.remove, or os.rmdir; + path is the argument to that function that caused it to fail; and + exc_info is a tuple returned by sys.exc_info(). If ignore_errors + is false and onerror is None, an exception is raised. + + """ + if ignore_errors: + def onerror(*args): + pass + elif onerror is None: + def onerror(*args): + raise + try: + if os.path.islink(path): + # symlinks to directories are forbidden, see bug #1669 + raise OSError("Cannot call rmtree on a symbolic link") + except OSError: + onerror(os.path.islink, path, sys.exc_info()) + # can't continue even if onerror hook returns + return + names = [] + try: + names = os.listdir(path) + except os.error: + onerror(os.listdir, path, sys.exc_info()) + for name in names: + fullname = os.path.join(path, name) + try: + mode = os.lstat(fullname).st_mode + except os.error: + mode = 0 + if stat.S_ISDIR(mode): + rmtree(fullname, ignore_errors, onerror) + else: + try: + os.remove(fullname) + except os.error: + onerror(os.remove, fullname, sys.exc_info()) + try: + os.rmdir(path) + except os.error: + onerror(os.rmdir, path, sys.exc_info()) + + +def _basename(path): + # A basename() variant which first strips the trailing slash, if present. + # Thus we always get the last component of the path, even for directories. + return os.path.basename(path.rstrip(os.path.sep)) + +def move(src, dst): + """Recursively move a file or directory to another location. This is + similar to the Unix "mv" command. + + If the destination is a directory or a symlink to a directory, the source + is moved inside the directory. The destination path must not already + exist. + + If the destination already exists but is not a directory, it may be + overwritten depending on os.rename() semantics. + + If the destination is on our current filesystem, then rename() is used. + Otherwise, src is copied to the destination and then removed. + A lot more could be done here... A look at a mv.c shows a lot of + the issues this implementation glosses over. + + """ + real_dst = dst + if os.path.isdir(dst): + if _samefile(src, dst): + # We might be on a case insensitive filesystem, + # perform the rename anyway. + os.rename(src, dst) + return + + real_dst = os.path.join(dst, _basename(src)) + if os.path.exists(real_dst): + raise Error("Destination path '%s' already exists" % real_dst) + try: + os.rename(src, real_dst) + except OSError: + if os.path.isdir(src): + if _destinsrc(src, dst): + raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) + copytree(src, real_dst, symlinks=True) + rmtree(src) + else: + copy2(src, real_dst) + os.unlink(src) + +def _destinsrc(src, dst): + src = abspath(src) + dst = abspath(dst) + if not src.endswith(os.path.sep): + src += os.path.sep + if not dst.endswith(os.path.sep): + dst += os.path.sep + return dst.startswith(src) + +def _get_gid(name): + """Returns a gid, given a group name.""" + if getgrnam is None or name is None: + return None + try: + result = getgrnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _get_uid(name): + """Returns an uid, given a user name.""" + if getpwnam is None or name is None: + return None + try: + result = getpwnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, + owner=None, group=None, logger=None): + """Create a (possibly compressed) tar file from all the files under + 'base_dir'. + + 'compress' must be "gzip" (the default), "bzip2", or None. + + 'owner' and 'group' can be used to define an owner and a group for the + archive that is being built. If not provided, the current owner and group + will be used. + + The output tar file will be named 'base_name' + ".tar", possibly plus + the appropriate compression extension (".gz", or ".bz2"). + + Returns the output filename. + """ + tar_compression = {'gzip': 'gz', None: ''} + compress_ext = {'gzip': '.gz'} + + if _BZ2_SUPPORTED: + tar_compression['bzip2'] = 'bz2' + compress_ext['bzip2'] = '.bz2' + + # flags for compression program, each element of list will be an argument + if compress is not None and compress not in compress_ext: + raise ValueError("bad value for 'compress', or compression format not " + "supported : {0}".format(compress)) + + archive_name = base_name + '.tar' + compress_ext.get(compress, '') + archive_dir = os.path.dirname(archive_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # creating the tarball + if logger is not None: + logger.info('Creating tar archive') + + uid = _get_uid(owner) + gid = _get_gid(group) + + def _set_uid_gid(tarinfo): + if gid is not None: + tarinfo.gid = gid + tarinfo.gname = group + if uid is not None: + tarinfo.uid = uid + tarinfo.uname = owner + return tarinfo + + if not dry_run: + tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) + try: + tar.add(base_dir, filter=_set_uid_gid) + finally: + tar.close() + + return archive_name + +def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): + # XXX see if we want to keep an external call here + if verbose: + zipoptions = "-r" + else: + zipoptions = "-rq" + from distutils.errors import DistutilsExecError + from distutils.spawn import spawn + try: + spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) + except DistutilsExecError: + # XXX really should distinguish between "couldn't find + # external 'zip' command" and "zip failed". + raise ExecError("unable to create zip file '%s': " + "could neither import the 'zipfile' module nor " + "find a standalone zip utility") % zip_filename + +def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): + """Create a zip file from all the files under 'base_dir'. + + The output zip file will be named 'base_name' + ".zip". Uses either the + "zipfile" Python module (if available) or the InfoZIP "zip" utility + (if installed and found on the default search path). If neither tool is + available, raises ExecError. Returns the name of the output zip + file. + """ + zip_filename = base_name + ".zip" + archive_dir = os.path.dirname(base_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # If zipfile module is not available, try spawning an external 'zip' + # command. + try: + import zipfile + except ImportError: + zipfile = None + + if zipfile is None: + _call_external_zip(base_dir, zip_filename, verbose, dry_run) + else: + if logger is not None: + logger.info("creating '%s' and adding '%s' to it", + zip_filename, base_dir) + + if not dry_run: + zip = zipfile.ZipFile(zip_filename, "w", + compression=zipfile.ZIP_DEFLATED) + + for dirpath, dirnames, filenames in os.walk(base_dir): + for name in filenames: + path = os.path.normpath(os.path.join(dirpath, name)) + if os.path.isfile(path): + zip.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + zip.close() + + return zip_filename + +_ARCHIVE_FORMATS = { + 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), + 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), + 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), + 'zip': (_make_zipfile, [], "ZIP file"), + } + +if _BZ2_SUPPORTED: + _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], + "bzip2'ed tar-file") + +def get_archive_formats(): + """Returns a list of supported formats for archiving and unarchiving. + + Each element of the returned sequence is a tuple (name, description) + """ + formats = [(name, registry[2]) for name, registry in + _ARCHIVE_FORMATS.items()] + formats.sort() + return formats + +def register_archive_format(name, function, extra_args=None, description=''): + """Registers an archive format. + + name is the name of the format. function is the callable that will be + used to create archives. If provided, extra_args is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_archive_formats() function. + """ + if extra_args is None: + extra_args = [] + if not isinstance(function, collections.Callable): + raise TypeError('The %s object is not callable' % function) + if not isinstance(extra_args, (tuple, list)): + raise TypeError('extra_args needs to be a sequence') + for element in extra_args: + if not isinstance(element, (tuple, list)) or len(element) !=2: + raise TypeError('extra_args elements are : (arg_name, value)') + + _ARCHIVE_FORMATS[name] = (function, extra_args, description) + +def unregister_archive_format(name): + del _ARCHIVE_FORMATS[name] + +def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, + dry_run=0, owner=None, group=None, logger=None): + """Create an archive file (eg. zip or tar). + + 'base_name' is the name of the file to create, minus any format-specific + extension; 'format' is the archive format: one of "zip", "tar", "bztar" + or "gztar". + + 'root_dir' is a directory that will be the root directory of the + archive; ie. we typically chdir into 'root_dir' before creating the + archive. 'base_dir' is the directory where we start archiving from; + ie. 'base_dir' will be the common prefix of all files and + directories in the archive. 'root_dir' and 'base_dir' both default + to the current directory. Returns the name of the archive file. + + 'owner' and 'group' are used when creating a tar archive. By default, + uses the current owner and group. + """ + save_cwd = os.getcwd() + if root_dir is not None: + if logger is not None: + logger.debug("changing into '%s'", root_dir) + base_name = os.path.abspath(base_name) + if not dry_run: + os.chdir(root_dir) + + if base_dir is None: + base_dir = os.curdir + + kwargs = {'dry_run': dry_run, 'logger': logger} + + try: + format_info = _ARCHIVE_FORMATS[format] + except KeyError: + raise ValueError("unknown archive format '%s'" % format) + + func = format_info[0] + for arg, val in format_info[1]: + kwargs[arg] = val + + if format != 'zip': + kwargs['owner'] = owner + kwargs['group'] = group + + try: + filename = func(base_name, base_dir, **kwargs) + finally: + if root_dir is not None: + if logger is not None: + logger.debug("changing back to '%s'", save_cwd) + os.chdir(save_cwd) + + return filename + + +def get_unpack_formats(): + """Returns a list of supported formats for unpacking. + + Each element of the returned sequence is a tuple + (name, extensions, description) + """ + formats = [(name, info[0], info[3]) for name, info in + _UNPACK_FORMATS.items()] + formats.sort() + return formats + +def _check_unpack_options(extensions, function, extra_args): + """Checks what gets registered as an unpacker.""" + # first make sure no other unpacker is registered for this extension + existing_extensions = {} + for name, info in _UNPACK_FORMATS.items(): + for ext in info[0]: + existing_extensions[ext] = name + + for extension in extensions: + if extension in existing_extensions: + msg = '%s is already registered for "%s"' + raise RegistryError(msg % (extension, + existing_extensions[extension])) + + if not isinstance(function, collections.Callable): + raise TypeError('The registered function must be a callable') + + +def register_unpack_format(name, extensions, function, extra_args=None, + description=''): + """Registers an unpack format. + + `name` is the name of the format. `extensions` is a list of extensions + corresponding to the format. + + `function` is the callable that will be + used to unpack archives. The callable will receive archives to unpack. + If it's unable to handle an archive, it needs to raise a ReadError + exception. + + If provided, `extra_args` is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_unpack_formats() function. + """ + if extra_args is None: + extra_args = [] + _check_unpack_options(extensions, function, extra_args) + _UNPACK_FORMATS[name] = extensions, function, extra_args, description + +def unregister_unpack_format(name): + """Removes the pack format from the registery.""" + del _UNPACK_FORMATS[name] + +def _ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): + os.makedirs(dirname) + +def _unpack_zipfile(filename, extract_dir): + """Unpack zip `filename` to `extract_dir` + """ + try: + import zipfile + except ImportError: + raise ReadError('zlib not supported, cannot unpack this archive.') + + if not zipfile.is_zipfile(filename): + raise ReadError("%s is not a zip file" % filename) + + zip = zipfile.ZipFile(filename) + try: + for info in zip.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name: + continue + + target = os.path.join(extract_dir, *name.split('/')) + if not target: + continue + + _ensure_directory(target) + if not name.endswith('/'): + # file + data = zip.read(info.filename) + f = open(target, 'wb') + try: + f.write(data) + finally: + f.close() + del data + finally: + zip.close() + +def _unpack_tarfile(filename, extract_dir): + """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` + """ + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise ReadError( + "%s is not a compressed or uncompressed tar file" % filename) + try: + tarobj.extractall(extract_dir) + finally: + tarobj.close() + +_UNPACK_FORMATS = { + 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"), + 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), + 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file") + } + +if _BZ2_SUPPORTED: + _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [], + "bzip2'ed tar-file") + +def _find_unpack_format(filename): + for name, info in _UNPACK_FORMATS.items(): + for extension in info[0]: + if filename.endswith(extension): + return name + return None + +def unpack_archive(filename, extract_dir=None, format=None): + """Unpack an archive. + + `filename` is the name of the archive. + + `extract_dir` is the name of the target directory, where the archive + is unpacked. If not provided, the current working directory is used. + + `format` is the archive format: one of "zip", "tar", or "gztar". Or any + other registered format. If not provided, unpack_archive will use the + filename extension and see if an unpacker was registered for that + extension. + + In case none is found, a ValueError is raised. + """ + if extract_dir is None: + extract_dir = os.getcwd() + + if format is not None: + try: + format_info = _UNPACK_FORMATS[format] + except KeyError: + raise ValueError("Unknown unpack format '{0}'".format(format)) + + func = format_info[1] + func(filename, extract_dir, **dict(format_info[2])) + else: + # we need to look at the registered unpackers supported extensions + format = _find_unpack_format(filename) + if format is None: + raise ReadError("Unknown archive format '{0}'".format(filename)) + + func = _UNPACK_FORMATS[format][1] + kwargs = dict(_UNPACK_FORMATS[format][2]) + func(filename, extract_dir, **kwargs) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/shutil.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/shutil.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be53f70b53a55526be4518368cf3dc212705e2fa GIT binary patch literal 28060 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 Iz;?U;HwC+^8~^|S literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/sysconfig.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/sysconfig.py new file mode 100644 index 0000000000..34e2ef1976 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/sysconfig.py @@ -0,0 +1,787 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Access to Python's configuration information.""" + +import codecs +import os +import re +import sys +from os.path import pardir, realpath +try: + import configparser +except ImportError: + import ConfigParser as configparser + + +__all__ = [ + 'get_config_h_filename', + 'get_config_var', + 'get_config_vars', + 'get_makefile_filename', + 'get_path', + 'get_path_names', + 'get_paths', + 'get_platform', + 'get_python_version', + 'get_scheme_names', + 'parse_config_h', +] + + +def _safe_realpath(path): + try: + return realpath(path) + except OSError: + return path + + +if sys.executable: + _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable)) +else: + # sys.executable can be empty if argv[0] has been changed and Python is + # unable to retrieve the real program name + _PROJECT_BASE = _safe_realpath(os.getcwd()) + +if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir)) +# PC/VS7.1 +if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) +# PC/AMD64 +if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) + + +def is_python_build(): + for fn in ("Setup.dist", "Setup.local"): + if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)): + return True + return False + +_PYTHON_BUILD = is_python_build() + +_cfg_read = False + +def _ensure_cfg_read(): + global _cfg_read + if not _cfg_read: + from distlib.resources import finder + _finder = finder('distlib._backport') + _cfgfile = _finder.find('sysconfig.cfg') + assert _cfgfile, 'sysconfig.cfg exists' + with _cfgfile.as_stream() as s: + _SCHEMES.readfp(s) + if _PYTHON_BUILD: + for scheme in ('posix_prefix', 'posix_home'): + _SCHEMES.set(scheme, 'include', '{srcdir}/Include') + _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.') + + _cfg_read = True + + +_SCHEMES = configparser.RawConfigParser() +_VAR_REPL = re.compile(r'\{([^{]*?)\}') + +def _expand_globals(config): + _ensure_cfg_read() + if config.has_section('globals'): + globals = config.items('globals') + else: + globals = tuple() + + sections = config.sections() + for section in sections: + if section == 'globals': + continue + for option, value in globals: + if config.has_option(section, option): + continue + config.set(section, option, value) + config.remove_section('globals') + + # now expanding local variables defined in the cfg file + # + for section in config.sections(): + variables = dict(config.items(section)) + + def _replacer(matchobj): + name = matchobj.group(1) + if name in variables: + return variables[name] + return matchobj.group(0) + + for option, value in config.items(section): + config.set(section, option, _VAR_REPL.sub(_replacer, value)) + +#_expand_globals(_SCHEMES) + + # FIXME don't rely on sys.version here, its format is an implementation detail + # of CPython, use sys.version_info or sys.hexversion +_PY_VERSION = sys.version.split()[0] +_PY_VERSION_SHORT = sys.version[:3] +_PY_VERSION_SHORT_NO_DOT = _PY_VERSION[0] + _PY_VERSION[2] +_PREFIX = os.path.normpath(sys.prefix) +_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) +_CONFIG_VARS = None +_USER_BASE = None + + +def _subst_vars(path, local_vars): + """In the string `path`, replace tokens like {some.thing} with the + corresponding value from the map `local_vars`. + + If there is no corresponding value, leave the token unchanged. + """ + def _replacer(matchobj): + name = matchobj.group(1) + if name in local_vars: + return local_vars[name] + elif name in os.environ: + return os.environ[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, path) + + +def _extend_dict(target_dict, other_dict): + target_keys = target_dict.keys() + for key, value in other_dict.items(): + if key in target_keys: + continue + target_dict[key] = value + + +def _expand_vars(scheme, vars): + res = {} + if vars is None: + vars = {} + _extend_dict(vars, get_config_vars()) + + for key, value in _SCHEMES.items(scheme): + if os.name in ('posix', 'nt'): + value = os.path.expanduser(value) + res[key] = os.path.normpath(_subst_vars(value, vars)) + return res + + +def format_value(value, vars): + def _replacer(matchobj): + name = matchobj.group(1) + if name in vars: + return vars[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, value) + + +def _get_default_scheme(): + if os.name == 'posix': + # the default scheme for posix is posix_prefix + return 'posix_prefix' + return os.name + + +def _getuserbase(): + env_base = os.environ.get("PYTHONUSERBASE", None) + + def joinuser(*args): + return os.path.expanduser(os.path.join(*args)) + + # what about 'os2emx', 'riscos' ? + if os.name == "nt": + base = os.environ.get("APPDATA") or "~" + if env_base: + return env_base + else: + return joinuser(base, "Python") + + if sys.platform == "darwin": + framework = get_config_var("PYTHONFRAMEWORK") + if framework: + if env_base: + return env_base + else: + return joinuser("~", "Library", framework, "%d.%d" % + sys.version_info[:2]) + + if env_base: + return env_base + else: + return joinuser("~", ".local") + + +def _parse_makefile(filename, vars=None): + """Parse a Makefile-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + # Regexes needed for parsing Makefile (and similar syntaxes, + # like old-style Setup files). + _variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") + _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") + _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") + + if vars is None: + vars = {} + done = {} + notdone = {} + + with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f: + lines = f.readlines() + + for line in lines: + if line.startswith('#') or line.strip() == '': + continue + m = _variable_rx.match(line) + if m: + n, v = m.group(1, 2) + v = v.strip() + # `$$' is a literal `$' in make + tmpv = v.replace('$$', '') + + if "$" in tmpv: + notdone[n] = v + else: + try: + v = int(v) + except ValueError: + # insert literal `$' + done[n] = v.replace('$$', '$') + else: + done[n] = v + + # do variable interpolation here + variables = list(notdone.keys()) + + # Variables with a 'PY_' prefix in the makefile. These need to + # be made available without that prefix through sysconfig. + # Special care is needed to ensure that variable expansion works, even + # if the expansion uses the name without a prefix. + renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS') + + while len(variables) > 0: + for name in tuple(variables): + value = notdone[name] + m = _findvar1_rx.search(value) or _findvar2_rx.search(value) + if m is not None: + n = m.group(1) + found = True + if n in done: + item = str(done[n]) + elif n in notdone: + # get it on a subsequent round + found = False + elif n in os.environ: + # do it like make: fall back to environment + item = os.environ[n] + + elif n in renamed_variables: + if (name.startswith('PY_') and + name[3:] in renamed_variables): + item = "" + + elif 'PY_' + n in notdone: + found = False + + else: + item = str(done['PY_' + n]) + + else: + done[n] = item = "" + + if found: + after = value[m.end():] + value = value[:m.start()] + item + after + if "$" in after: + notdone[name] = value + else: + try: + value = int(value) + except ValueError: + done[name] = value.strip() + else: + done[name] = value + variables.remove(name) + + if (name.startswith('PY_') and + name[3:] in renamed_variables): + + name = name[3:] + if name not in done: + done[name] = value + + else: + # bogus variable reference (e.g. "prefix=$/opt/python"); + # just drop it since we can't deal + done[name] = value + variables.remove(name) + + # strip spurious spaces + for k, v in done.items(): + if isinstance(v, str): + done[k] = v.strip() + + # save the results in the global dictionary + vars.update(done) + return vars + + +def get_makefile_filename(): + """Return the path of the Makefile.""" + if _PYTHON_BUILD: + return os.path.join(_PROJECT_BASE, "Makefile") + if hasattr(sys, 'abiflags'): + config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) + else: + config_dir_name = 'config' + return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') + + +def _init_posix(vars): + """Initialize the module as appropriate for POSIX systems.""" + # load the installed Makefile: + makefile = get_makefile_filename() + try: + _parse_makefile(makefile, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % makefile + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # load the installed pyconfig.h: + config_h = get_config_h_filename() + try: + with open(config_h) as f: + parse_config_h(f, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % config_h + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # On AIX, there are wrong paths to the linker scripts in the Makefile + # -- these paths are relative to the Python source, but when installed + # the scripts are in another directory. + if _PYTHON_BUILD: + vars['LDSHARED'] = vars['BLDSHARED'] + + +def _init_non_posix(vars): + """Initialize the module as appropriate for NT""" + # set basic install directories + vars['LIBDEST'] = get_path('stdlib') + vars['BINLIBDEST'] = get_path('platstdlib') + vars['INCLUDEPY'] = get_path('include') + vars['SO'] = '.pyd' + vars['EXE'] = '.exe' + vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT + vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) + +# +# public APIs +# + + +def parse_config_h(fp, vars=None): + """Parse a config.h-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + if vars is None: + vars = {} + define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") + undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") + + while True: + line = fp.readline() + if not line: + break + m = define_rx.match(line) + if m: + n, v = m.group(1, 2) + try: + v = int(v) + except ValueError: + pass + vars[n] = v + else: + m = undef_rx.match(line) + if m: + vars[m.group(1)] = 0 + return vars + + +def get_config_h_filename(): + """Return the path of pyconfig.h.""" + if _PYTHON_BUILD: + if os.name == "nt": + inc_dir = os.path.join(_PROJECT_BASE, "PC") + else: + inc_dir = _PROJECT_BASE + else: + inc_dir = get_path('platinclude') + return os.path.join(inc_dir, 'pyconfig.h') + + +def get_scheme_names(): + """Return a tuple containing the schemes names.""" + return tuple(sorted(_SCHEMES.sections())) + + +def get_path_names(): + """Return a tuple containing the paths names.""" + # xxx see if we want a static list + return _SCHEMES.options('posix_prefix') + + +def get_paths(scheme=_get_default_scheme(), vars=None, expand=True): + """Return a mapping containing an install scheme. + + ``scheme`` is the install scheme name. If not provided, it will + return the default scheme for the current platform. + """ + _ensure_cfg_read() + if expand: + return _expand_vars(scheme, vars) + else: + return dict(_SCHEMES.items(scheme)) + + +def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True): + """Return a path corresponding to the scheme. + + ``scheme`` is the install scheme name. + """ + return get_paths(scheme, vars, expand)[name] + + +def get_config_vars(*args): + """With no arguments, return a dictionary of all configuration + variables relevant for the current platform. + + On Unix, this means every variable defined in Python's installed Makefile; + On Windows and Mac OS it's a much smaller set. + + With arguments, return a list of values that result from looking up + each argument in the configuration variable dictionary. + """ + global _CONFIG_VARS + if _CONFIG_VARS is None: + _CONFIG_VARS = {} + # Normalized versions of prefix and exec_prefix are handy to have; + # in fact, these are the standard versions used most places in the + # distutils2 module. + _CONFIG_VARS['prefix'] = _PREFIX + _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX + _CONFIG_VARS['py_version'] = _PY_VERSION + _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT + _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2] + _CONFIG_VARS['base'] = _PREFIX + _CONFIG_VARS['platbase'] = _EXEC_PREFIX + _CONFIG_VARS['projectbase'] = _PROJECT_BASE + try: + _CONFIG_VARS['abiflags'] = sys.abiflags + except AttributeError: + # sys.abiflags may not be defined on all platforms. + _CONFIG_VARS['abiflags'] = '' + + if os.name in ('nt', 'os2'): + _init_non_posix(_CONFIG_VARS) + if os.name == 'posix': + _init_posix(_CONFIG_VARS) + # Setting 'userbase' is done below the call to the + # init function to enable using 'get_config_var' in + # the init-function. + if sys.version >= '2.6': + _CONFIG_VARS['userbase'] = _getuserbase() + + if 'srcdir' not in _CONFIG_VARS: + _CONFIG_VARS['srcdir'] = _PROJECT_BASE + else: + _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) + + # Convert srcdir into an absolute path if it appears necessary. + # Normally it is relative to the build directory. However, during + # testing, for example, we might be running a non-installed python + # from a different directory. + if _PYTHON_BUILD and os.name == "posix": + base = _PROJECT_BASE + try: + cwd = os.getcwd() + except OSError: + cwd = None + if (not os.path.isabs(_CONFIG_VARS['srcdir']) and + base != cwd): + # srcdir is relative and we are not in the same directory + # as the executable. Assume executable is in the build + # directory and make srcdir absolute. + srcdir = os.path.join(base, _CONFIG_VARS['srcdir']) + _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) + + if sys.platform == 'darwin': + kernel_version = os.uname()[2] # Kernel version (8.4.3) + major_version = int(kernel_version.split('.')[0]) + + if major_version < 8: + # On Mac OS X before 10.4, check if -arch and -isysroot + # are in CFLAGS or LDFLAGS and remove them if they are. + # This is needed when building extensions on a 10.3 system + # using a universal build of python. + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + flags = _CONFIG_VARS[key] + flags = re.sub('-arch\s+\w+\s', ' ', flags) + flags = re.sub('-isysroot [^ \t]*', ' ', flags) + _CONFIG_VARS[key] = flags + else: + # Allow the user to override the architecture flags using + # an environment variable. + # NOTE: This name was introduced by Apple in OSX 10.5 and + # is used by several scripting languages distributed with + # that OS release. + if 'ARCHFLAGS' in os.environ: + arch = os.environ['ARCHFLAGS'] + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub('-arch\s+\w+\s', ' ', flags) + flags = flags + ' ' + arch + _CONFIG_VARS[key] = flags + + # If we're on OSX 10.5 or later and the user tries to + # compiles an extension using an SDK that is not present + # on the current machine it is better to not use an SDK + # than to fail. + # + # The major usecase for this is users using a Python.org + # binary installer on OSX 10.6: that installer uses + # the 10.4u SDK, but that SDK is not installed by default + # when you install Xcode. + # + CFLAGS = _CONFIG_VARS.get('CFLAGS', '') + m = re.search('-isysroot\s+(\S+)', CFLAGS) + if m is not None: + sdk = m.group(1) + if not os.path.exists(sdk): + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub('-isysroot\s+\S+(\s|$)', ' ', flags) + _CONFIG_VARS[key] = flags + + if args: + vals = [] + for name in args: + vals.append(_CONFIG_VARS.get(name)) + return vals + else: + return _CONFIG_VARS + + +def get_config_var(name): + """Return the value of a single variable using the dictionary returned by + 'get_config_vars()'. + + Equivalent to get_config_vars().get(name) + """ + return get_config_vars().get(name) + + +def get_platform(): + """Return a string that identifies the current platform. + + This is used mainly to distinguish platform-specific build directories and + platform-specific built distributions. Typically includes the OS name + and version and the architecture (as supplied by 'os.uname()'), + although the exact information included depends on the OS; eg. for IRIX + the architecture isn't particularly important (IRIX only runs on SGI + hardware), but for Linux the kernel version isn't particularly + important. + + Examples of returned values: + linux-i586 + linux-alpha (?) + solaris-2.6-sun4u + irix-5.3 + irix64-6.2 + + Windows will return one of: + win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) + win-ia64 (64bit Windows on Itanium) + win32 (all others - specifically, sys.platform is returned) + + For other non-POSIX platforms, currently just returns 'sys.platform'. + """ + if os.name == 'nt': + # sniff sys.version for architecture. + prefix = " bit (" + i = sys.version.find(prefix) + if i == -1: + return sys.platform + j = sys.version.find(")", i) + look = sys.version[i+len(prefix):j].lower() + if look == 'amd64': + return 'win-amd64' + if look == 'itanium': + return 'win-ia64' + return sys.platform + + if os.name != "posix" or not hasattr(os, 'uname'): + # XXX what about the architecture? NT is Intel or Alpha, + # Mac OS is M68k or PPC, etc. + return sys.platform + + # Try to distinguish various flavours of Unix + osname, host, release, version, machine = os.uname() + + # Convert the OS name to lowercase, remove '/' characters + # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") + osname = osname.lower().replace('/', '') + machine = machine.replace(' ', '_') + machine = machine.replace('/', '-') + + if osname[:5] == "linux": + # At least on Linux/Intel, 'machine' is the processor -- + # i386, etc. + # XXX what about Alpha, SPARC, etc? + return "%s-%s" % (osname, machine) + elif osname[:5] == "sunos": + if release[0] >= "5": # SunOS 5 == Solaris 2 + osname = "solaris" + release = "%d.%s" % (int(release[0]) - 3, release[2:]) + # fall through to standard osname-release-machine representation + elif osname[:4] == "irix": # could be "irix64"! + return "%s-%s" % (osname, release) + elif osname[:3] == "aix": + return "%s-%s.%s" % (osname, version, release) + elif osname[:6] == "cygwin": + osname = "cygwin" + rel_re = re.compile(r'[\d.]+') + m = rel_re.match(release) + if m: + release = m.group() + elif osname[:6] == "darwin": + # + # For our purposes, we'll assume that the system version from + # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set + # to. This makes the compatibility story a bit more sane because the + # machine is going to compile and link as if it were + # MACOSX_DEPLOYMENT_TARGET. + cfgvars = get_config_vars() + macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') + + if True: + # Always calculate the release of the running machine, + # needed to determine if we can build fat binaries or not. + + macrelease = macver + # Get the system version. Reading this plist is a documented + # way to get the system version (see the documentation for + # the Gestalt Manager) + try: + f = open('/System/Library/CoreServices/SystemVersion.plist') + except IOError: + # We're on a plain darwin box, fall back to the default + # behaviour. + pass + else: + try: + m = re.search(r'<key>ProductUserVisibleVersion</key>\s*' + r'<string>(.*?)</string>', f.read()) + finally: + f.close() + if m is not None: + macrelease = '.'.join(m.group(1).split('.')[:2]) + # else: fall back to the default behaviour + + if not macver: + macver = macrelease + + if macver: + release = macver + osname = "macosx" + + if ((macrelease + '.') >= '10.4.' and + '-arch' in get_config_vars().get('CFLAGS', '').strip()): + # The universal build will build fat binaries, but not on + # systems before 10.4 + # + # Try to detect 4-way universal builds, those have machine-type + # 'universal' instead of 'fat'. + + machine = 'fat' + cflags = get_config_vars().get('CFLAGS') + + archs = re.findall('-arch\s+(\S+)', cflags) + archs = tuple(sorted(set(archs))) + + if len(archs) == 1: + machine = archs[0] + elif archs == ('i386', 'ppc'): + machine = 'fat' + elif archs == ('i386', 'x86_64'): + machine = 'intel' + elif archs == ('i386', 'ppc', 'x86_64'): + machine = 'fat3' + elif archs == ('ppc64', 'x86_64'): + machine = 'fat64' + elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): + machine = 'universal' + else: + raise ValueError( + "Don't know machine value for archs=%r" % (archs,)) + + elif machine == 'i386': + # On OSX the machine type returned by uname is always the + # 32-bit variant, even if the executable architecture is + # the 64-bit variant + if sys.maxsize >= 2**32: + machine = 'x86_64' + + elif machine in ('PowerPC', 'Power_Macintosh'): + # Pick a sane name for the PPC architecture. + # See 'i386' case + if sys.maxsize >= 2**32: + machine = 'ppc64' + else: + machine = 'ppc' + + return "%s-%s-%s" % (osname, release, machine) + + +def get_python_version(): + return _PY_VERSION_SHORT + + +def _print_dict(title, data): + for index, (key, value) in enumerate(sorted(data.items())): + if index == 0: + print('%s: ' % (title)) + print('\t%s = "%s"' % (key, value)) + + +def _main(): + """Display all information sysconfig detains.""" + print('Platform: "%s"' % get_platform()) + print('Python version: "%s"' % get_python_version()) + print('Current installation scheme: "%s"' % _get_default_scheme()) + print() + _print_dict('Paths', get_paths()) + print() + _print_dict('Variables', get_config_vars()) + + +if __name__ == '__main__': + _main() diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/sysconfig.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/sysconfig.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c4b1138e1f31547d2c2a62d1f7031fb18ec4c0d GIT binary patch literal 22090 zcmdUXYiwL+dfs<tMx=%!MT)wak}MtFEXoooUu4;9OSUPJwwX{QeJGo<Oz!A#&LMfI z;mq)yGZMKL8=&%T;!WB`+HS8KwB2kABt@MdP0-zLuz$AQB5AN~Q}ptyEl{B7kD@?t zivlg$KF{-=84hi=aeuT-DV;Ol{rZ0I{X6;p*wgjRf0OgdCi~lm-#76jrMxkLF?aEH zOpr4b$J|B0hI8g_t{KjoyZL6gVD1(a&YQ{}v({nmc9^wJbGOqtn|;kfd(GXwX0H0Q zDTGCHzstlQ8OL$5mb;i)b<CXr4ec>OhY31Ou-61d6Lgtip9#86&|`xAW_h2vi)gR; z7^CbqVZp5SnD`%=FlScxo7G+uHWME^2LJE&nQFfhQQ&}iY_dd_?>9l8xt}xfpc5Q0 zA%@y-POTnfq5B<7Wm~r0L(C34%;Q|MQKPI@6ICZTs3s1zH&J~;6Ko~_zi8z*o#3!q zInv(BZ~nop1V^<XsC<~izk9@lM~(lK37%5=fC=}S)nm#!Zo<4-Jz;_Y4dQ7N98;N- zTFg^s)n&2ZxEZ*6I!g*p829cO6P{Kwf1Wl2NAI3(uFg4?JFoVh*_n7jiGzeC|5?88 zUNXT+b$HnXrxX}6fvdo<2~I0;#RO**c+Lc86?mR?gLCF%Z0QRoIIqMPP4J8YS50t1 zftOTlP{pp9;Gz;=Ho>zBykde&3Vg|g&uNx96TWJK%jRRi^J_a3hm?5T1jDLw!vt3p zc-;igDe#5~o>$;a6TG0nhzVX);HC*jO>kAf^<h4|$-bN_RyAj42Vder8^UX(Tn>}O zO>6GVX1Y?VUP#<>t-2H~H)21HYE?I?F4f{Sg@>d6fxoH29O|VVc-8$lh~jiFf^q0q z>VCSC9!6w2OiQ+v(n@J5s)SX4Ell_C%z5C)Y47Kfl2!w2{{4`3w;NzTY+C&^TVtfe z_LH>OmY<~E%~-`xIfb;pnV^Z59)xj%38sBna#CIi*TSqRwvO2)VQU^`2T6SP;2Fh} zT)=B{ze$aGq!T?mhf`ii9buL;#4Jdky#rJ>JIIQ5;XDS@PQ0dP$K$w$BhG{ZUYyDx zevMwqIzqv#^UG1X(pa3Ii>f1)r8o@QLW@y#ek@#UEYI7`8?Qc?e_{CL`N?Q;K8ezB zsP32V`^#Z6UythZ55j6ti|2zVNh>H&T0~~O7N_&cW@2}1xW1`fDkc6>SZZ$R8H^+0 z+8ZbD?00&clmJjoHHmt8u@O~*=)V9m5-!bry*&RQ`U#_4L_}3!-d_u@U5)+&(#uHJ zN)m*$k~a|8z)>lfv4vr?h2=12)iJBNW+2Z63i4WL;jOsSq<hTldZ(EKB+d@9=c%L% z@7XYI)Q36AgcQX_E48v;(Rgpwf<`4w1jBzo`9W@y=2}ZU&P6aEB?L<C*J>@Qraj0g z&3My4H9mT~baP~OTv@l{Mu-6#^Oj#pLc7IWwWaE=Z!phXl$5a5IPN8F&Z|hucDTnm z=j?T~MI3%>i+%$U>`L-!la@MWEyt}QkYi^+=C&O32%83yTu?M;9_36js;%3@ls}3B zAY}*}^NmAh3%lB3Ry)ljRd?oaQr^7-Y!d$!vjKeB4QRM*whAg$G>-rQqQ;<H4lCLu zk!B{X#~|$(WS8*)ofs6)9d~C+Xv^*a=d%=51DyQ>2xeztxOEm1R@god<)!81&}UQJ zaD&h#1XHgi(MG8r15<6FXPjXrtki(-2tHA@TxkShLL~E15|@E4x2{as#FX$^2X<-} z;?8_jk87)8IbHOVaO=vjg;S!k_MQZ|+dU1kAz{A~2F!CCr0uhd!=%=Tf#<#BEJ#$t zHPBHXNs=%oq8BbwBYsj!QZ%wA#9o>meP{gE_^g1RO)u3mnE&ARJJVC8o9|6bj-`3D znS`l#6u&x*wks|H@Hf}nHiq%(_z>qMYSN<JT|X7vpi)>(8Zl6QwuoaK<WqQ=T!+)= zbUVFHKc0h52aw=F=U6V`#>{^-_~Dm7T6p%2i}PC|5}Y*ArPgE!GsU?9#Pgs4se#+X zQHTeL%Yfi)6i268G+0HH<1s=O&Je;mv$4oSGq!M-=LIJP7052moAoh5`NkVObYlxI zn|U0^g4x=m+IXWh+Cb5tHS1*-Wvd-o`Xd}do|&?lLpyWK0<){3IU5hR2Qan}>74FW z5>B*^DkkuWF+U41!hCY(YZz#U*|@%=%-F)EokMDN4H#SPGLI0&7{JPM7(c-<e%lZM z%nowdrgV6gE44+SPc15uC!d3OlIQT^ka2)DWQ%!z&a%vB4FXt`f!VBx*yXI<h=3R2 zF%};X$1TUTM%^+s+&1t!<(1mvs?G@+3tN)R1z48IUnKcJ#OxA*=0I@9fjG)xjBRaV z?p^@sUPrjVBWEY{vckg*bV5dla|KhdmM8=&2{OhBXZeZn7c122EbnoW!Vz(}R(lY( z+9Cc3qH=06&if-?$s3=Uv?!plXsIUgtmP@ZVFbOG*%l8*b1*Dm`_X6~_?1TJy@*6D zt(M$-f#r9H3nD5mg&TFh8k90Hyu;C)!^=3G#00rwt{Zru8`$6=@Ir@k-03MCbPnfw zJ5D$Pv524?5o*hPG1h#NQ;1{-$k736@;W%|fLk1lS&RF>kAf3bH(d!`VCAT~?A{}v zc<-{C!2o#o`#@Z7CAuHFA0?nX!|4jjZMhG@IkIAxi@$O$1|6u^ssY>3db>+;ZA~q& z`E~c6n4}V5Jh?aAr8*N!%#A}gO5AGgNljdKE1~}&R3jRP+o+aT{OWQT4BKvb;C39| zpF+YHIlPVmD-8@uG5AIn{sPCEE9_n2i>N{{7gircajmNL^oTpW=kc<~nlyWR;=6dR z1^i#fXhc*DAdJVk*V*UTalgiKU+1_r!~Kko^7WZR!?ayGG-N|cNn<fd1w|ioBt#ab zqqkEhfEb7g8sh{477iX;LU&E<BM`a)JsTA9$djazl36f#*{lzUk|7b5^X59@mTC~p zGRc%Z+z&Ssk3z1P5uw7=k10F~b8**e1Z^7?|75dSQK$?7?@cy<XIBL>@)$rxDWo@z z_D>-$2G9UP284fFi^~Pp;{FK)fP=t4;K&464{+7Tl>$x!$3m<+WE-qCP>r*3kIV;n z4lFB(``E(t_VNQigKY@%I*9ivc7at`1w&xD{DRuEiC|$s+0hC%QB;@6jJxz2SPWt` zZq1YszPMM9T$e?29J$gGB8zHjd0LgPRYQ+R!(+@l&lh)A=UXS)3TNC?i?JJIY4;*p zh1gGI>5U;`+0x4hiLw*VX`_J^J;LH2s@)dh;Sj%tktNhz7*LpQr|9(MP5>($cFsE5 z^*nN#&le^tQ~wuPD&gKIp;~VmL)~oz`>Pm3Ch2DU62Z;;403&wX&mlnkt@@73Aqvt zSWO&|E10EU;ZS%YKq~f>`O81fW)x3y3@^wXR^Xt(a8Qaro0Kub-cO^DcLFcFUnH28 zG$OG3h>yc531x>%exs6>tf)v$L_+ov6VDZ_s)Fml1Fxz74gz+bR=x^^<Dja5sPZvz zA{YxSjPyxdm{MC|p|tu<>i>y4q1K${dlm={_zNZhptV`zPm2>fC5nAYE(59wAWkcy z#h<F`*PB&oO@OijvRjvGLW{A_xJMorpuqYxlg#4pwwLZ!M;Lgf!4MlhBZ2$9*>UeC z)J)oPQoTH$IXnqBvNi84AeGrK2&p%fkX$Q^JH<oXVw6f-%MURZl+a2zyLeiKzo}p& zGXHH1N_4?EA{pZ9MrLNlMsAOQlo|6!q)M<#Pz3`&ehB4UFY@fNz2%ME8lRi?ep+>* zAdUTaQwq!T!SMM&T)LoYSlr-X5jE{9-9$))0-)$kGMU_?QlKc(IH|<p+4Q&<(hFtE z<r1~$qIxO^MiiQ+B=p{AIW9G0lB1SlNSY68@qMlNZZ13#4UZicp2Pbd;>j7j3}l;P zq1Sl|l&FyF%MpQgC=7Z84M`y<igW}exq3Q_{}n4@K{1omn_>>mqCGEJuJj6I_Q0;} z6}xhCn_Y=;YWFDGvCXGI%h)p0J$7>6IB2$@N(5^n{o)o3eQ4<2I~)JfJlYG6=AW4@ zoI&Uwz{?cbck)$5JIMp#U=kJlhFSlr&LgyxU~p7y3mgqBg(%!bm7}!-0u9VV-LlVY zb(=@sWQfp67KTC+R>Cfx;4PU8AN7cJI^v)t)gJr65G~Lu3APkTT!wC_E-%1#&@J1+ zG)xC93^j>0IHD;iOR|c0*i07tDhE6VeH_|_=@ElqYx@l>cw4<@<4O)E;1SZXsQu=C z!Nk9s-#C(k$-^d&E$q#0A%a2mnSreX#8EI%K7x(XG4&rgVC7m-yAIr&qKSVY-&zfJ zxX-}2venNKVq_H9in;V)Hp&5(IB2SWRoNZNKAB6Q|Lr%`Ut}UoKC4HRej{hYNE~3D zSao`p_m^`RBzF(SQ7F*X84Y0Rd}OoNb69iKS^u>hN}z$Gm==ff^{g*s*fC|<&2eG1 zx=bNkQ8e(V-^9P1#~N^oN4ch_whnPk7=Ma!_t8PLe#jifioqO=5c~N_j%Boz*VjME zXZx$AM7g=@>DK;U%yWMaWMIRd`^@#~K68f+*ckR_b%5!Zs<UI>pX7JWyA|g~;y>2E z)5KrX1Z-RDU&~`W>%W{|{|oH(Nj)HEZvBxnM;#tWn~bzH#Sq8=O5G+sPEf`A0Tko! z<_VmFc{X+!@ci98{?Fm?!l;WhjoJbAA~HyR53d;-(_G)Zm09(Ml612Yx>N>d%7zh_ zq8SuVK+Lp3rhZhVs)8!GD^_1o_oFzWG9m_gimT8uxGr=QepRXlt4{JO?d_m!-G_=h zfF0BIVdtb8B}D6i3o6%G3#;j6H%if_ngGsY$s~oI+pVExw;DcdYtQO5gbfEj^oPDO zGIVz#`+aWcOQnTN7w3~_Z{Qgme)eMWH0C{jZhmm^LzF}5h3r>FpS?JLF*&XhP#{0C zz*a^y$~Ee2M64R=($FiSa3O7ni6|VD)^TmwPs1=N`}J^2B=IZ|D`Y@YM@!tu8lF3+ zymM+{^sUK}w`VOq9J68ZP%|@%0O@9AZsvoMR9VtIh)CM12^D&iwyK!w(X8qqXD-Vb zHj0JHwY55STI5rGV@hE;5ecl-u?Zv?G%i%4Dh#<4<r2v2X+jm2<VEVf>Iz9eD=9-w zXIe1PV^Dn6eV+`nHE58?R$#92#t~2<SfjmbjF5*+LO(9A$ZTOLdK!Dw_<x4<L-x)_ zfkCOF)rm?FRhLmhu<@(qP}z-ofc+5oYZD3Q1Y}7S;t;4JkutdyZ`cIdNs##bXA@pv z0_PDx64sonwNznl?ve&(*Ue5Ag_yCXcUA8Ps-LdaA4sVx>rku#1+8%;R+fGfRn_ED zt$|syNh*z%<S(U=tl9YPvngcl;0ZtzebZCmpCBm#vkU&C7cz1$^s_~BD7ll+*7i83 z5$?tFl+&H-r|veFhgGL1cPw`x-`~-ZI}AN;mva(a4NG++)}1S&l|Gd1Mag0gPyT3r zzpO!MrP+dWDA$EB%HX%#IkKnAIh-Froum04E1z)5xRRrIl6!dJaK;0fQWF+aEHn8d z2p3pq01&w&AX>P2AP=T)Q1`uNDQAvAim4(Sb{@1L^(bqDEfLOzsKRFQK)eEO7d?4G zl|p<}g%GO|2{!TYu)wn!Q^a44mMZ>oBKx^j;t!oq&L`dt4qOeVIH-$*Jf_|Sz9czH zoS-D(5$g+3VNLK;9H}oefhNfkaLN1Q-s}V{hqLcYd$+wm!wPKF${*ZT+b5J=vAi*M zn<Mt9o0`NHTFoqW{~-4E2!6}lSB{-HPJ5d}3ikG~#LUeDnW7E*g6(wXs*~UWpvnY4 zxndkhnDjjZ(L6#^xU`(v#(yAbQ7I5qj~qolrA}$nKwDu*r=uERg&h^l<}=(EtB|8% z9WVq|7^FGt7x41#o%Y`U^>*)Q{<FRR(=XOLREqzdT>$n5_|pL<20xH$WdllR^O>kd zY2;U;uUHeon!GPai2XVY-F0BV6ih%Zc4ww%C+@fus9>NPPKHr8s)FiALFSkwvg}uA zF0WNzg_(hdIQlJ-ez@nYAV#~j=pwhw9Xy|0oDyldIXO1_&WJZYCID|ntdPf|-Z$|Q z#7<0$Zg_u=so&y@bkmFZqGTj^*XgpToD{Q(e}oxB(UG-eSzTqIyyAU=a=Q)4QiDSz zjo?B>H-$OE^fMTk$rs_;a{y4?h363P7~{ZS+bM+%+6nP_Jc4%G<^b(hv?B=Q%yq^k z%rRcD@fLCdh`_0mIeQU;Jcdvg%HR|r1i=U(4ul4nw|J0DCJ>s<?nad!02lF0atW_5 z3|v#Uy+6yLieH(yIW|6fTSS|3dm>z>=*@|#Nt^4PWN|Vj6H}v;?~RSmd>~yL9HavA zHM7$;9&XtE9=|iL)-&8DEQ#jECcLRZf`~9&O3vbQ7_c-oT^gIdy^TZF5Rjkv1>!@C zKCON`EH_d@zO|4}BX`%KN|aboRfR*5RpJw}xKAeE2g=z8xZ=Mu&k~n|XHF3GuMnWf z4^a*1<nXr0Z;6|QEFj7(+Ef~B{0i}9{LcwC0G7wXg1~=?XJ&wdpsRxxz~VzXMC>u~ zuS>82>9p=iR(|iG%7B8J6bAq^MCYmpfTSVj0!e?HPJG0)P%B`R5bmz8!%77J{Y>ld zT|){=SiPX&pGEPXLQ#eg+vOmO7=~B=zn6o~2Jn5VhOT6o9TLu^i!Q~WE}@t!A3nR_ zo&`r4E<L#@@~?Dliz|{orYwe@1dw<&zUq7(#Y@PwDKK~sn0$q=4Zb$<(y7x?U8-A5 z&C_hhN`9J9sL>$e{XA=tarFKeUw<60-9A+!Hh@TDHL;y!Wy#VO!C*qwhA<gfF|de{ z`Rs6xIc1Dou9bQGj^at)!;8%3wdN7B?n6V0HZiT`I>1t{-z4HClL=v8hlPg%Ey%AA zCyi)YUPadBG9jLP0*6`OY{K`jRoL?2&y0HXda%xGtpef|+PFw6S7p$XQd+EJ8+%9$ z4tF{7hP%E)oYS|tL*xtSA_mo{oI<n<Ol$3e7-B7>C2)_WsKeS?rF?Q3g|lV!U3uoT zYe1y5kasfNFd#%G!%``?NwM(a4FhW$CD*mRGz#sG#mb{q{Zp<F7s}*XtHS6g9{E}V zHd{_{na9hs$ot<f1_hbsQncBx&ZDA;r_}_t*)Vo<83?j}qqPkAGJ&G`Xc=Tqkj&tK zaK*=X+HlT5HzW{(`01P?2>?Tw0aeVF>et(s3QjzAD$H>7nz}Qe{`*i%R4T4Do@KhW zd-rVg-aTs52wyvk3CxD6TZ5{>1*iTX3c^5|vWHQnB3)U$Em#7r(m<E>A%321mZ6t| zZpUq!N38a2${OP7qUOEJ7rl?S&HC28MF)c1jW{W5*58KeT>|L67|-{(lMI-SPN3YL zT$yrx^U;1DLIS{=?0^;6WP}^Yj{1klZ9%sr@|~VpkZ88g`~T5)X;&;?$N^d$A#~bW zO^?Q$U0+8^%s*<K2y471v&fV3HlE}caXzquxPL>g(944v@R1_h5rF?X4g|9)Z9q~$ z2tFnh7(|?yMv;_19k?RI)J{nj3_<S5Y8MfLISFZyKq#uqtA%mMA#>H^-~#O>v2W>; z7zm=xlH?6j0B(StmE!+<H2EPDN0aw!AWAR~RtX&De{5i!Y0E<&us7hw7g*B&WT3r$ zY-f7F%Fg{POZ`1AS=h1lBjb>P#fH828yYQa=sNT%@eiCGy&(#g))7mKQS^&3&Vi*p zipd-lOB>R*goOo9-JHlFvwFC#`EImoVfQ{*Y}*5h93enA2LZDHwg6oq<0u*8?P0C| zK#PEh;^r6n#3Fck7R6OBOaVIrg++Rd-1+Kp8gNjR+l3#?s>6159}LUw+{W7uE?bQ) zjM2LoJ%jxo0E3>MFsryQhPp5{Kt6<zSSu0fZHdUW)vm7>b93v{d0hJ9NKR_ozMr#U zBo4q@xbY5ebd4?C_yWD5Vf1qpcEzLUyRDmtxj8}rXxb@Wd&3n5pm5k7IcAqv&1h3Z zifoDmZ`jhNWlKBF`)6DOn8WP4o}m#7DamAh1NXz8!Pu@macrpi<VhdQ&#h19G4FLR zk70p;#GmAsWvJXZ$LQF?3EC)W%{iNm8pcZWiT}=e2!l>HG?MT_z))ugFYst?;@r;B zuN3~EO$$mwUsM`oT))j$BKrvlkL3ij>tw=FP0cs$IF;~$4-!EY(344qYD`z%_o~sx zWt0KES_^&nyN0l_Z^Dt)YSCTG+RM&k{Qz*2EhB2M=`<CbuQi*)b*iBD5PB$Bf^PX` zcX}3PAXM?)wMKcxP1Zm&!x*-rG{eD~^pj>x>jLL06BUW6pJHAK>7o2<E4A8vlI2ES zeTP1pZ?=OG+G+2&a<@IFmO;#tP7%ZGvI)5>XdlWuE}v}fxYbr~MN7#FSVYNGG6w0= zTU&Ou7SvL25lu=kBEepyX97EEyO3g)wQR<6^?8J9$qVu$N*H-z_?nfhGT#9W*j{__ zaG#f)jWNR!$&*)MoJx(GBeUbypyc7;TeS<+#97iWAxWI#5G^(H$))*+m*x{S<my_@ zPz0@ETmzr-;g{Xw!n0D_jCiB($cmL5K>bz`R3Dt5y>wA>W<p(cdlqsA=aWb0E?P&@ z%o9-)!z{(Nw41!Vzr&%Cm}Nu#5#tmyTk6LDXLZh@S8GKYot}DY;_VXL@@K8NjZ_sE z)W+YMxMNE|S2fy9;0Cv8q`W_mxRtr6ve$mg_h<xK{AjU}TC1AXRf)9_2l^e972}<` zy?6mDQ!gaJPEY`klJdjA>tP~^J?J$=xx`;gte`i=j8ZcL>RlMiD9x)}Qm;g*RRLUQ zxtn|~@C7VpMSpdY-OS>ifEk9>PRc@$La>Ey0x5^_L;PxD_i=|Jth9~|hqvah*5YQ0 zTthVm*+jrp&_4<$LxQSw24E+!?ZJIz0SQ<;+O9KM9O#e9WPJ?*vkzK>f>pwGIY%;e z996zOx&6=`^gwp)fol&<T|K!&9f!f%THQhyl)&AE0p|qGTh2hPdrv;kb`Im;flk&$ z9A>Y>xEXq&yB`-J>@}%o>M_X0ye@T&?m;~Ld|DD<A0nVHk0k_RD?xWMHu+B?Cu5UI z7ld4`MIMIMWoZ6eNV35MVbM1K0ZWg7_!l>YbuZA5&{87#rVn1ckm2?5^+tr&DW`z- z{#>zPqzn=mFRC5uD9N=I_*rh72VvLun^5>J7S>AJ9c4rfaUYNWD4ygVMorEH?3UF5 z{b_R0RPHo&?sfz0WvT%F-eBEcRW5GYwhBT0V<l5+WmS`WA*@f@y`vC$PFvRyaENqy zgg*+}`5AJ4vy5Ax$#0MoSEFp(jtbm%-Xy<85`+|R<=~XM;rqv4vQprl;8Fn%l`gu0 zEd=`o-i^GZ+)?N;1>W1TT^J}nIMC)p#gaBf{5csh)dfH9;^PY(=kpGjY&3^*G`G$o zs9ej){)_`26fElic~o%l(}my&$AT{((3i{R0fxc)J;m67IVGcQhgqL4RR2MatsO&O z$JN&_HT&w=?&~S!o>1-&9DLw_BLRbn0{Lt(CsE*(3UuWVATJH>4Sr^pd$cZY@JWKJ zDws*@yEa{*>yl&*EE$I~uA#84(`swF0FD4l3+@w4Cw#uZ@UcGR8hAtfFb6&md?GdF za3emeto@m$9L`VBl>0e|73)9D-TBH14d^hxlRzh?BW%{PymR2MnIxYo=MKh%1aiPX z%z?Y5yOTzVuPC5v_#h#XYdK(C4yDJSd2+GcCi(pw*i;P8MzIYXAJ%)2>wzrPJc{ow zaEtzP9^YNCljF25WxxT^1LLCG77E~!F+ffWV9T(-Ud;oas2DQvFyjm``=?C`5dv(y z9J5f2C6O+#FN866LeYcFM~iaB`b2>aTdyhO=d;eT#Oq4@OL=_5VY}oFCH__(-*ebb zd|ipZo5%MYwiDk_;=jlTFJ*}-WDM9R`gkw%2!;bY@%m%|u#E3Va9k&7eO^6nf;Y7` z69s%l!Zw!`8_|+XHjCX<u{R6&qJ%Am&rdKgSs)PMjJ_%e#q4oh2%&?c#58{`-@@H~ z^U|8wVknWSX|xoDR_FA2{g80%ZSwf|FK4VZc!5<miJEy=8<@TkB`YnB(oj+l%V@Cd z>K;4F#JKEOi`fG>do|b8KJ6@<sy*>EuqP*QB)h#?kMNZMbk@9&EusR!faqUMQCP@W z90?AjOk@V&AXA3?10x75+exDiZbhWWy--Vr#ma!*T)b@CsNmjxV_6sTaFg6G!})Cc z6C2IG1IRPvUlJFe;9xh?v#+_~@~{M@32)+#+WK7oQBu7CeH)yVqH?3+$DGU>zwtmB zYmoKO9ungQ1SqsT`}TwyTET}r9{O>3@iG?DN@J67z1~pQmPKk!{PTUNiB>;Ny1L=7 z;f5)?S<0kCEQytoUR4F$Nrcx@V`C_K>6L3cQ}8K~72h3v!_r(7Olp`+lng<>7)lz| ztBq#)D2_IUUK)O}J$~)#(6!+g><z}Im`AN;HVn)=#GqP(fS>q~K2G5dUc0&oU%+M^ ztk1};v1?bctM`3(<CSZrYgaG36V)`VFfe}W+SS{aU9h#SVX~>nXN}LbG=VLM8f)!E zUwi>AV_3R~mbgQ16PO8vm+1>J+=N{ohbBvN(a!8GNX)7UNxV8_-6xvGA&_Th3wyoV zfP88zC+>yzR>1=CW~gL2$uTacKd8?oNWi)%##f6Yxu&&LV)i3DC22#OGq+bt{voh{ z8o1&~Sp2)qcuA>45qW>LEeNn~_z9ehEVJLJ!aD&aY#T4BvkU@kQF!bp+m~x2vSZ@D z2@PV${b)nOI?qN~m=b{`g!1Mx#;VzVI3ElzT(WX0E%UcVMyF@*lwj<ioc`d}_|)yv z?Gf+o@!QFB$h<Nu*OV*S&4DYUwK$v&;|CEwtB~crZ$Bu5P2=YwZlKb2Tq1mZCWg~X zIeiZz@%!)+gzY{nc>M~q;VgRHUhI7x*3vgFUcZvXro6w6CM2n9<ZFJpmTYJNo_}um z>aao*imliTq-&Po&p;8TDJx6ZwM+BjE7!C%^?F&&S$Nih!)-FGs1)kIs3erSc2yxH zAw;RRQH_ZFAmN-xYz*HDO5OX_+Cvv3!-eA}lTK9*kz#V=d>pwbsr{R&Jq+WSQF|kU z;S#hi=(v`wZ0{5{%QD#i7S$woV;tKl-oHb#wGXrxu*sAuynoM^N{L0^QL2?!;Y#tZ zklj5bi=2%wq0p-E_W0V%pFwt;^eZ9x$4pZO#aHhmytHx^PSZLP@j!SF`I3RU#!#KF zZOgR=ERmM>ZR>FK7a5|2tIeUgTMd^hHQXVYWF}P@-tY6(U@^{wZlu5<vJQHGlUbBa zWE5Ban!l02A8YUcQ~wrTI+Ky!_M->XSP4dI2}z$iU#TVbgFjT+@d^uPowcXkR|RC^ z(*#y5=2-A04ajNsLmz+=fR8jj2sWGfgw61DmaTkE%pmC5b%BZ?k8jPH<U0tMfnEr* z6mB~q>bm$X=;_Rz%6I0E7oI|1f3B~vU*0YqxU<~{fw&I>b|1uFdZV&-Unl)ZI|>~I z3D@}oJWz|y!Q4Kybt&Hg4^s-u9jJS{6XkRLFevxy8v``^?|4x2V6Gb?dv~ro-;0{P z+XhyO*kZ&8QxK(^H@}!J4bS%4Dzr=HH0u8T8y6T4^a5r6aQiuG4WAmrjakkBzzHc6 z*ZCex$^>gWw(uq0POy$V_MW)Drb0e<l#(sZ&5^g?se((DAPP~6ve?`2w62V^pDEE9 z`Es34UUlW0P&}WwH{3JllQY6K!hK;CcLnf8w9uZYmrzx@J)OriO0zFQ!Rgyq5<hvf z@rUSIvGja!x2)O=@H9XR?HcD2AgkLcV?z2vhFyFQ0VoQv_*io+8&(v%kcDCV(OxjU z)4cr-C=2ugKorP_sN_Jnw}~*y$w^g-{7@H9RYD8@SOle>zv+?#YG;7KpjbT(IAEHw z;S9PT#b>fBcCTt<^id|O=5O+)S;lFU9nI{{nfl*;$IcqOZ7FTh44nwHx$ieW>oV1L zFo=^pj@Bcbdb50W;{<to86xbo6-I2g?gjJ2zym(2c4F(S&mEL_{I>_VXOAO&d`Trr zrNJ?j7S=A6f?By$^45`H37Uu!37YaDxX?IFC@}Vub=?TrosrjlEaSk0qzil1f(1rp z$k1h<IO_)+jDDmH{xvqn-Sj@?i(WC_-{<RjzJ9`&2--1*F7QRZ%yapozks+0&wtq7 zi$`X}5>wsc9%1yye2Fan9z)V<|8<6@_#)BsewVNB^Y!=m5;grDghZf9yk)Dex#`mZ z_VWYpvK$x00z<&iH~Hcgc;Dem+HkIe^%~}>^GFBfvt}Vja7FOZWzjYW6L9qc!m=GB z>BWwrWE-UI4yx9Ou3P8r*ExaY=kV&t;0!k&GG%ce=-TK16$?esy_1Fh+<E6Dp3{8t z#ST!rT=4+Z#ku0ygP?N#QYwS~<%@mAy~Unl5%r$#eo)+3JW=fHK2_{4?kRR0?m4`- N_!xQLR=ZGa|4*@#2}u9| literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/tarfile.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/tarfile.py new file mode 100644 index 0000000000..0580fb7953 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/tarfile.py @@ -0,0 +1,2607 @@ +#------------------------------------------------------------------- +# tarfile.py +#------------------------------------------------------------------- +# Copyright (C) 2002 Lars Gustaebel <lars@gustaebel.de> +# All rights reserved. +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +from __future__ import print_function + +"""Read from and write to tar format archives. +""" + +__version__ = "$Revision$" + +version = "0.9.0" +__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" +__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $" +__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $" +__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." + +#--------- +# Imports +#--------- +import sys +import os +import stat +import errno +import time +import struct +import copy +import re + +try: + import grp, pwd +except ImportError: + grp = pwd = None + +# os.symlink on Windows prior to 6.0 raises NotImplementedError +symlink_exception = (AttributeError, NotImplementedError) +try: + # WindowsError (1314) will be raised if the caller does not hold the + # SeCreateSymbolicLinkPrivilege privilege + symlink_exception += (WindowsError,) +except NameError: + pass + +# from tarfile import * +__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] + +if sys.version_info[0] < 3: + import __builtin__ as builtins +else: + import builtins + +_open = builtins.open # Since 'open' is TarFile.open + +#--------------------------------------------------------- +# tar constants +#--------------------------------------------------------- +NUL = b"\0" # the null character +BLOCKSIZE = 512 # length of processing blocks +RECORDSIZE = BLOCKSIZE * 20 # length of records +GNU_MAGIC = b"ustar \0" # magic gnu tar string +POSIX_MAGIC = b"ustar\x0000" # magic posix tar string + +LENGTH_NAME = 100 # maximum length of a filename +LENGTH_LINK = 100 # maximum length of a linkname +LENGTH_PREFIX = 155 # maximum length of the prefix field + +REGTYPE = b"0" # regular file +AREGTYPE = b"\0" # regular file +LNKTYPE = b"1" # link (inside tarfile) +SYMTYPE = b"2" # symbolic link +CHRTYPE = b"3" # character special device +BLKTYPE = b"4" # block special device +DIRTYPE = b"5" # directory +FIFOTYPE = b"6" # fifo special device +CONTTYPE = b"7" # contiguous file + +GNUTYPE_LONGNAME = b"L" # GNU tar longname +GNUTYPE_LONGLINK = b"K" # GNU tar longlink +GNUTYPE_SPARSE = b"S" # GNU tar sparse file + +XHDTYPE = b"x" # POSIX.1-2001 extended header +XGLTYPE = b"g" # POSIX.1-2001 global header +SOLARIS_XHDTYPE = b"X" # Solaris extended header + +USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format +GNU_FORMAT = 1 # GNU tar format +PAX_FORMAT = 2 # POSIX.1-2001 (pax) format +DEFAULT_FORMAT = GNU_FORMAT + +#--------------------------------------------------------- +# tarfile constants +#--------------------------------------------------------- +# File types that tarfile supports: +SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, + SYMTYPE, DIRTYPE, FIFOTYPE, + CONTTYPE, CHRTYPE, BLKTYPE, + GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# File types that will be treated as a regular file. +REGULAR_TYPES = (REGTYPE, AREGTYPE, + CONTTYPE, GNUTYPE_SPARSE) + +# File types that are part of the GNU tar format. +GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# Fields from a pax header that override a TarInfo attribute. +PAX_FIELDS = ("path", "linkpath", "size", "mtime", + "uid", "gid", "uname", "gname") + +# Fields from a pax header that are affected by hdrcharset. +PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname")) + +# Fields in a pax header that are numbers, all other fields +# are treated as strings. +PAX_NUMBER_FIELDS = { + "atime": float, + "ctime": float, + "mtime": float, + "uid": int, + "gid": int, + "size": int +} + +#--------------------------------------------------------- +# Bits used in the mode field, values in octal. +#--------------------------------------------------------- +S_IFLNK = 0o120000 # symbolic link +S_IFREG = 0o100000 # regular file +S_IFBLK = 0o060000 # block device +S_IFDIR = 0o040000 # directory +S_IFCHR = 0o020000 # character device +S_IFIFO = 0o010000 # fifo + +TSUID = 0o4000 # set UID on execution +TSGID = 0o2000 # set GID on execution +TSVTX = 0o1000 # reserved + +TUREAD = 0o400 # read by owner +TUWRITE = 0o200 # write by owner +TUEXEC = 0o100 # execute/search by owner +TGREAD = 0o040 # read by group +TGWRITE = 0o020 # write by group +TGEXEC = 0o010 # execute/search by group +TOREAD = 0o004 # read by other +TOWRITE = 0o002 # write by other +TOEXEC = 0o001 # execute/search by other + +#--------------------------------------------------------- +# initialization +#--------------------------------------------------------- +if os.name in ("nt", "ce"): + ENCODING = "utf-8" +else: + ENCODING = sys.getfilesystemencoding() + +#--------------------------------------------------------- +# Some useful functions +#--------------------------------------------------------- + +def stn(s, length, encoding, errors): + """Convert a string to a null-terminated bytes object. + """ + s = s.encode(encoding, errors) + return s[:length] + (length - len(s)) * NUL + +def nts(s, encoding, errors): + """Convert a null-terminated bytes object to a string. + """ + p = s.find(b"\0") + if p != -1: + s = s[:p] + return s.decode(encoding, errors) + +def nti(s): + """Convert a number field to a python number. + """ + # There are two possible encodings for a number field, see + # itn() below. + if s[0] != chr(0o200): + try: + n = int(nts(s, "ascii", "strict") or "0", 8) + except ValueError: + raise InvalidHeaderError("invalid header") + else: + n = 0 + for i in range(len(s) - 1): + n <<= 8 + n += ord(s[i + 1]) + return n + +def itn(n, digits=8, format=DEFAULT_FORMAT): + """Convert a python number to a number field. + """ + # POSIX 1003.1-1988 requires numbers to be encoded as a string of + # octal digits followed by a null-byte, this allows values up to + # (8**(digits-1))-1. GNU tar allows storing numbers greater than + # that if necessary. A leading 0o200 byte indicates this particular + # encoding, the following digits-1 bytes are a big-endian + # representation. This allows values up to (256**(digits-1))-1. + if 0 <= n < 8 ** (digits - 1): + s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL + else: + if format != GNU_FORMAT or n >= 256 ** (digits - 1): + raise ValueError("overflow in number field") + + if n < 0: + # XXX We mimic GNU tar's behaviour with negative numbers, + # this could raise OverflowError. + n = struct.unpack("L", struct.pack("l", n))[0] + + s = bytearray() + for i in range(digits - 1): + s.insert(0, n & 0o377) + n >>= 8 + s.insert(0, 0o200) + return s + +def calc_chksums(buf): + """Calculate the checksum for a member's header by summing up all + characters except for the chksum field which is treated as if + it was filled with spaces. According to the GNU tar sources, + some tars (Sun and NeXT) calculate chksum with signed char, + which will be different if there are chars in the buffer with + the high bit set. So we calculate two checksums, unsigned and + signed. + """ + unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512])) + signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512])) + return unsigned_chksum, signed_chksum + +def copyfileobj(src, dst, length=None): + """Copy length bytes from fileobj src to fileobj dst. + If length is None, copy the entire content. + """ + if length == 0: + return + if length is None: + while True: + buf = src.read(16*1024) + if not buf: + break + dst.write(buf) + return + + BUFSIZE = 16 * 1024 + blocks, remainder = divmod(length, BUFSIZE) + for b in range(blocks): + buf = src.read(BUFSIZE) + if len(buf) < BUFSIZE: + raise IOError("end of file reached") + dst.write(buf) + + if remainder != 0: + buf = src.read(remainder) + if len(buf) < remainder: + raise IOError("end of file reached") + dst.write(buf) + return + +filemode_table = ( + ((S_IFLNK, "l"), + (S_IFREG, "-"), + (S_IFBLK, "b"), + (S_IFDIR, "d"), + (S_IFCHR, "c"), + (S_IFIFO, "p")), + + ((TUREAD, "r"),), + ((TUWRITE, "w"),), + ((TUEXEC|TSUID, "s"), + (TSUID, "S"), + (TUEXEC, "x")), + + ((TGREAD, "r"),), + ((TGWRITE, "w"),), + ((TGEXEC|TSGID, "s"), + (TSGID, "S"), + (TGEXEC, "x")), + + ((TOREAD, "r"),), + ((TOWRITE, "w"),), + ((TOEXEC|TSVTX, "t"), + (TSVTX, "T"), + (TOEXEC, "x")) +) + +def filemode(mode): + """Convert a file's mode to a string of the form + -rwxrwxrwx. + Used by TarFile.list() + """ + perm = [] + for table in filemode_table: + for bit, char in table: + if mode & bit == bit: + perm.append(char) + break + else: + perm.append("-") + return "".join(perm) + +class TarError(Exception): + """Base exception.""" + pass +class ExtractError(TarError): + """General exception for extract errors.""" + pass +class ReadError(TarError): + """Exception for unreadble tar archives.""" + pass +class CompressionError(TarError): + """Exception for unavailable compression methods.""" + pass +class StreamError(TarError): + """Exception for unsupported operations on stream-like TarFiles.""" + pass +class HeaderError(TarError): + """Base exception for header errors.""" + pass +class EmptyHeaderError(HeaderError): + """Exception for empty headers.""" + pass +class TruncatedHeaderError(HeaderError): + """Exception for truncated headers.""" + pass +class EOFHeaderError(HeaderError): + """Exception for end of file headers.""" + pass +class InvalidHeaderError(HeaderError): + """Exception for invalid headers.""" + pass +class SubsequentHeaderError(HeaderError): + """Exception for missing and invalid extended headers.""" + pass + +#--------------------------- +# internal stream interface +#--------------------------- +class _LowLevelFile(object): + """Low-level file object. Supports reading and writing. + It is used instead of a regular file object for streaming + access. + """ + + def __init__(self, name, mode): + mode = { + "r": os.O_RDONLY, + "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, + }[mode] + if hasattr(os, "O_BINARY"): + mode |= os.O_BINARY + self.fd = os.open(name, mode, 0o666) + + def close(self): + os.close(self.fd) + + def read(self, size): + return os.read(self.fd, size) + + def write(self, s): + os.write(self.fd, s) + +class _Stream(object): + """Class that serves as an adapter between TarFile and + a stream-like object. The stream-like object only + needs to have a read() or write() method and is accessed + blockwise. Use of gzip or bzip2 compression is possible. + A stream-like object could be for example: sys.stdin, + sys.stdout, a socket, a tape device etc. + + _Stream is intended to be used only internally. + """ + + def __init__(self, name, mode, comptype, fileobj, bufsize): + """Construct a _Stream object. + """ + self._extfileobj = True + if fileobj is None: + fileobj = _LowLevelFile(name, mode) + self._extfileobj = False + + if comptype == '*': + # Enable transparent compression detection for the + # stream interface + fileobj = _StreamProxy(fileobj) + comptype = fileobj.getcomptype() + + self.name = name or "" + self.mode = mode + self.comptype = comptype + self.fileobj = fileobj + self.bufsize = bufsize + self.buf = b"" + self.pos = 0 + self.closed = False + + try: + if comptype == "gz": + try: + import zlib + except ImportError: + raise CompressionError("zlib module is not available") + self.zlib = zlib + self.crc = zlib.crc32(b"") + if mode == "r": + self._init_read_gz() + else: + self._init_write_gz() + + if comptype == "bz2": + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + if mode == "r": + self.dbuf = b"" + self.cmp = bz2.BZ2Decompressor() + else: + self.cmp = bz2.BZ2Compressor() + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + def __del__(self): + if hasattr(self, "closed") and not self.closed: + self.close() + + def _init_write_gz(self): + """Initialize for writing with gzip compression. + """ + self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, + -self.zlib.MAX_WBITS, + self.zlib.DEF_MEM_LEVEL, + 0) + timestamp = struct.pack("<L", int(time.time())) + self.__write(b"\037\213\010\010" + timestamp + b"\002\377") + if self.name.endswith(".gz"): + self.name = self.name[:-3] + # RFC1952 says we must use ISO-8859-1 for the FNAME field. + self.__write(self.name.encode("iso-8859-1", "replace") + NUL) + + def write(self, s): + """Write string s to the stream. + """ + if self.comptype == "gz": + self.crc = self.zlib.crc32(s, self.crc) + self.pos += len(s) + if self.comptype != "tar": + s = self.cmp.compress(s) + self.__write(s) + + def __write(self, s): + """Write string s to the stream if a whole new block + is ready to be written. + """ + self.buf += s + while len(self.buf) > self.bufsize: + self.fileobj.write(self.buf[:self.bufsize]) + self.buf = self.buf[self.bufsize:] + + def close(self): + """Close the _Stream object. No operation should be + done on it afterwards. + """ + if self.closed: + return + + if self.mode == "w" and self.comptype != "tar": + self.buf += self.cmp.flush() + + if self.mode == "w" and self.buf: + self.fileobj.write(self.buf) + self.buf = b"" + if self.comptype == "gz": + # The native zlib crc is an unsigned 32-bit integer, but + # the Python wrapper implicitly casts that to a signed C + # long. So, on a 32-bit box self.crc may "look negative", + # while the same crc on a 64-bit box may "look positive". + # To avoid irksome warnings from the `struct` module, force + # it to look positive on all boxes. + self.fileobj.write(struct.pack("<L", self.crc & 0xffffffff)) + self.fileobj.write(struct.pack("<L", self.pos & 0xffffFFFF)) + + if not self._extfileobj: + self.fileobj.close() + + self.closed = True + + def _init_read_gz(self): + """Initialize for reading a gzip compressed fileobj. + """ + self.cmp = self.zlib.decompressobj(-self.zlib.MAX_WBITS) + self.dbuf = b"" + + # taken from gzip.GzipFile with some alterations + if self.__read(2) != b"\037\213": + raise ReadError("not a gzip file") + if self.__read(1) != b"\010": + raise CompressionError("unsupported compression method") + + flag = ord(self.__read(1)) + self.__read(6) + + if flag & 4: + xlen = ord(self.__read(1)) + 256 * ord(self.__read(1)) + self.read(xlen) + if flag & 8: + while True: + s = self.__read(1) + if not s or s == NUL: + break + if flag & 16: + while True: + s = self.__read(1) + if not s or s == NUL: + break + if flag & 2: + self.__read(2) + + def tell(self): + """Return the stream's file pointer position. + """ + return self.pos + + def seek(self, pos=0): + """Set the stream's file pointer to pos. Negative seeking + is forbidden. + """ + if pos - self.pos >= 0: + blocks, remainder = divmod(pos - self.pos, self.bufsize) + for i in range(blocks): + self.read(self.bufsize) + self.read(remainder) + else: + raise StreamError("seeking backwards is not allowed") + return self.pos + + def read(self, size=None): + """Return the next size number of bytes from the stream. + If size is not defined, return all bytes of the stream + up to EOF. + """ + if size is None: + t = [] + while True: + buf = self._read(self.bufsize) + if not buf: + break + t.append(buf) + buf = "".join(t) + else: + buf = self._read(size) + self.pos += len(buf) + return buf + + def _read(self, size): + """Return size bytes from the stream. + """ + if self.comptype == "tar": + return self.__read(size) + + c = len(self.dbuf) + while c < size: + buf = self.__read(self.bufsize) + if not buf: + break + try: + buf = self.cmp.decompress(buf) + except IOError: + raise ReadError("invalid compressed data") + self.dbuf += buf + c += len(buf) + buf = self.dbuf[:size] + self.dbuf = self.dbuf[size:] + return buf + + def __read(self, size): + """Return size bytes from stream. If internal buffer is empty, + read another block from the stream. + """ + c = len(self.buf) + while c < size: + buf = self.fileobj.read(self.bufsize) + if not buf: + break + self.buf += buf + c += len(buf) + buf = self.buf[:size] + self.buf = self.buf[size:] + return buf +# class _Stream + +class _StreamProxy(object): + """Small proxy class that enables transparent compression + detection for the Stream interface (mode 'r|*'). + """ + + def __init__(self, fileobj): + self.fileobj = fileobj + self.buf = self.fileobj.read(BLOCKSIZE) + + def read(self, size): + self.read = self.fileobj.read + return self.buf + + def getcomptype(self): + if self.buf.startswith(b"\037\213\010"): + return "gz" + if self.buf.startswith(b"BZh91"): + return "bz2" + return "tar" + + def close(self): + self.fileobj.close() +# class StreamProxy + +class _BZ2Proxy(object): + """Small proxy class that enables external file object + support for "r:bz2" and "w:bz2" modes. This is actually + a workaround for a limitation in bz2 module's BZ2File + class which (unlike gzip.GzipFile) has no support for + a file object argument. + """ + + blocksize = 16 * 1024 + + def __init__(self, fileobj, mode): + self.fileobj = fileobj + self.mode = mode + self.name = getattr(self.fileobj, "name", None) + self.init() + + def init(self): + import bz2 + self.pos = 0 + if self.mode == "r": + self.bz2obj = bz2.BZ2Decompressor() + self.fileobj.seek(0) + self.buf = b"" + else: + self.bz2obj = bz2.BZ2Compressor() + + def read(self, size): + x = len(self.buf) + while x < size: + raw = self.fileobj.read(self.blocksize) + if not raw: + break + data = self.bz2obj.decompress(raw) + self.buf += data + x += len(data) + + buf = self.buf[:size] + self.buf = self.buf[size:] + self.pos += len(buf) + return buf + + def seek(self, pos): + if pos < self.pos: + self.init() + self.read(pos - self.pos) + + def tell(self): + return self.pos + + def write(self, data): + self.pos += len(data) + raw = self.bz2obj.compress(data) + self.fileobj.write(raw) + + def close(self): + if self.mode == "w": + raw = self.bz2obj.flush() + self.fileobj.write(raw) +# class _BZ2Proxy + +#------------------------ +# Extraction file object +#------------------------ +class _FileInFile(object): + """A thin wrapper around an existing file object that + provides a part of its data as an individual file + object. + """ + + def __init__(self, fileobj, offset, size, blockinfo=None): + self.fileobj = fileobj + self.offset = offset + self.size = size + self.position = 0 + + if blockinfo is None: + blockinfo = [(0, size)] + + # Construct a map with data and zero blocks. + self.map_index = 0 + self.map = [] + lastpos = 0 + realpos = self.offset + for offset, size in blockinfo: + if offset > lastpos: + self.map.append((False, lastpos, offset, None)) + self.map.append((True, offset, offset + size, realpos)) + realpos += size + lastpos = offset + size + if lastpos < self.size: + self.map.append((False, lastpos, self.size, None)) + + def seekable(self): + if not hasattr(self.fileobj, "seekable"): + # XXX gzip.GzipFile and bz2.BZ2File + return True + return self.fileobj.seekable() + + def tell(self): + """Return the current file position. + """ + return self.position + + def seek(self, position): + """Seek to a position in the file. + """ + self.position = position + + def read(self, size=None): + """Read data from the file. + """ + if size is None: + size = self.size - self.position + else: + size = min(size, self.size - self.position) + + buf = b"" + while size > 0: + while True: + data, start, stop, offset = self.map[self.map_index] + if start <= self.position < stop: + break + else: + self.map_index += 1 + if self.map_index == len(self.map): + self.map_index = 0 + length = min(size, stop - self.position) + if data: + self.fileobj.seek(offset + (self.position - start)) + buf += self.fileobj.read(length) + else: + buf += NUL * length + size -= length + self.position += length + return buf +#class _FileInFile + + +class ExFileObject(object): + """File-like object for reading an archive member. + Is returned by TarFile.extractfile(). + """ + blocksize = 1024 + + def __init__(self, tarfile, tarinfo): + self.fileobj = _FileInFile(tarfile.fileobj, + tarinfo.offset_data, + tarinfo.size, + tarinfo.sparse) + self.name = tarinfo.name + self.mode = "r" + self.closed = False + self.size = tarinfo.size + + self.position = 0 + self.buffer = b"" + + def readable(self): + return True + + def writable(self): + return False + + def seekable(self): + return self.fileobj.seekable() + + def read(self, size=None): + """Read at most size bytes from the file. If size is not + present or None, read all data until EOF is reached. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + buf = b"" + if self.buffer: + if size is None: + buf = self.buffer + self.buffer = b"" + else: + buf = self.buffer[:size] + self.buffer = self.buffer[size:] + + if size is None: + buf += self.fileobj.read() + else: + buf += self.fileobj.read(size - len(buf)) + + self.position += len(buf) + return buf + + # XXX TextIOWrapper uses the read1() method. + read1 = read + + def readline(self, size=-1): + """Read one entire line from the file. If size is present + and non-negative, return a string with at most that + size, which may be an incomplete line. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + while True: + buf = self.fileobj.read(self.blocksize) + self.buffer += buf + if not buf or b"\n" in buf: + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + pos = len(self.buffer) + break + + if size != -1: + pos = min(size, pos) + + buf = self.buffer[:pos] + self.buffer = self.buffer[pos:] + self.position += len(buf) + return buf + + def readlines(self): + """Return a list with all remaining lines. + """ + result = [] + while True: + line = self.readline() + if not line: break + result.append(line) + return result + + def tell(self): + """Return the current file position. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + return self.position + + def seek(self, pos, whence=os.SEEK_SET): + """Seek to a position in the file. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + if whence == os.SEEK_SET: + self.position = min(max(pos, 0), self.size) + elif whence == os.SEEK_CUR: + if pos < 0: + self.position = max(self.position + pos, 0) + else: + self.position = min(self.position + pos, self.size) + elif whence == os.SEEK_END: + self.position = max(min(self.size + pos, self.size), 0) + else: + raise ValueError("Invalid argument") + + self.buffer = b"" + self.fileobj.seek(self.position) + + def close(self): + """Close the file object. + """ + self.closed = True + + def __iter__(self): + """Get an iterator over the file's lines. + """ + while True: + line = self.readline() + if not line: + break + yield line +#class ExFileObject + +#------------------ +# Exported Classes +#------------------ +class TarInfo(object): + """Informational class which holds the details about an + archive member given by a tar header block. + TarInfo objects are returned by TarFile.getmember(), + TarFile.getmembers() and TarFile.gettarinfo() and are + usually created internally. + """ + + __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", + "chksum", "type", "linkname", "uname", "gname", + "devmajor", "devminor", + "offset", "offset_data", "pax_headers", "sparse", + "tarfile", "_sparse_structs", "_link_target") + + def __init__(self, name=""): + """Construct a TarInfo object. name is the optional name + of the member. + """ + self.name = name # member name + self.mode = 0o644 # file permissions + self.uid = 0 # user id + self.gid = 0 # group id + self.size = 0 # file size + self.mtime = 0 # modification time + self.chksum = 0 # header checksum + self.type = REGTYPE # member type + self.linkname = "" # link name + self.uname = "" # user name + self.gname = "" # group name + self.devmajor = 0 # device major number + self.devminor = 0 # device minor number + + self.offset = 0 # the tar header starts here + self.offset_data = 0 # the file's data starts here + + self.sparse = None # sparse member information + self.pax_headers = {} # pax header information + + # In pax headers the "name" and "linkname" field are called + # "path" and "linkpath". + def _getpath(self): + return self.name + def _setpath(self, name): + self.name = name + path = property(_getpath, _setpath) + + def _getlinkpath(self): + return self.linkname + def _setlinkpath(self, linkname): + self.linkname = linkname + linkpath = property(_getlinkpath, _setlinkpath) + + def __repr__(self): + return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) + + def get_info(self): + """Return the TarInfo's attributes as a dictionary. + """ + info = { + "name": self.name, + "mode": self.mode & 0o7777, + "uid": self.uid, + "gid": self.gid, + "size": self.size, + "mtime": self.mtime, + "chksum": self.chksum, + "type": self.type, + "linkname": self.linkname, + "uname": self.uname, + "gname": self.gname, + "devmajor": self.devmajor, + "devminor": self.devminor + } + + if info["type"] == DIRTYPE and not info["name"].endswith("/"): + info["name"] += "/" + + return info + + def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): + """Return a tar header as a string of 512 byte blocks. + """ + info = self.get_info() + + if format == USTAR_FORMAT: + return self.create_ustar_header(info, encoding, errors) + elif format == GNU_FORMAT: + return self.create_gnu_header(info, encoding, errors) + elif format == PAX_FORMAT: + return self.create_pax_header(info, encoding) + else: + raise ValueError("invalid format") + + def create_ustar_header(self, info, encoding, errors): + """Return the object as a ustar header block. + """ + info["magic"] = POSIX_MAGIC + + if len(info["linkname"]) > LENGTH_LINK: + raise ValueError("linkname is too long") + + if len(info["name"]) > LENGTH_NAME: + info["prefix"], info["name"] = self._posix_split_name(info["name"]) + + return self._create_header(info, USTAR_FORMAT, encoding, errors) + + def create_gnu_header(self, info, encoding, errors): + """Return the object as a GNU header block sequence. + """ + info["magic"] = GNU_MAGIC + + buf = b"" + if len(info["linkname"]) > LENGTH_LINK: + buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) + + if len(info["name"]) > LENGTH_NAME: + buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) + + return buf + self._create_header(info, GNU_FORMAT, encoding, errors) + + def create_pax_header(self, info, encoding): + """Return the object as a ustar header block. If it cannot be + represented this way, prepend a pax extended header sequence + with supplement information. + """ + info["magic"] = POSIX_MAGIC + pax_headers = self.pax_headers.copy() + + # Test string fields for values that exceed the field length or cannot + # be represented in ASCII encoding. + for name, hname, length in ( + ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), + ("uname", "uname", 32), ("gname", "gname", 32)): + + if hname in pax_headers: + # The pax header has priority. + continue + + # Try to encode the string as ASCII. + try: + info[name].encode("ascii", "strict") + except UnicodeEncodeError: + pax_headers[hname] = info[name] + continue + + if len(info[name]) > length: + pax_headers[hname] = info[name] + + # Test number fields for values that exceed the field limit or values + # that like to be stored as float. + for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): + if name in pax_headers: + # The pax header has priority. Avoid overflow. + info[name] = 0 + continue + + val = info[name] + if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float): + pax_headers[name] = str(val) + info[name] = 0 + + # Create a pax extended header if necessary. + if pax_headers: + buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) + else: + buf = b"" + + return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") + + @classmethod + def create_pax_global_header(cls, pax_headers): + """Return the object as a pax global header block sequence. + """ + return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8") + + def _posix_split_name(self, name): + """Split a name longer than 100 chars into a prefix + and a name part. + """ + prefix = name[:LENGTH_PREFIX + 1] + while prefix and prefix[-1] != "/": + prefix = prefix[:-1] + + name = name[len(prefix):] + prefix = prefix[:-1] + + if not prefix or len(name) > LENGTH_NAME: + raise ValueError("name is too long") + return prefix, name + + @staticmethod + def _create_header(info, format, encoding, errors): + """Return a header block. info is a dictionary with file + information, format must be one of the *_FORMAT constants. + """ + parts = [ + stn(info.get("name", ""), 100, encoding, errors), + itn(info.get("mode", 0) & 0o7777, 8, format), + itn(info.get("uid", 0), 8, format), + itn(info.get("gid", 0), 8, format), + itn(info.get("size", 0), 12, format), + itn(info.get("mtime", 0), 12, format), + b" ", # checksum field + info.get("type", REGTYPE), + stn(info.get("linkname", ""), 100, encoding, errors), + info.get("magic", POSIX_MAGIC), + stn(info.get("uname", ""), 32, encoding, errors), + stn(info.get("gname", ""), 32, encoding, errors), + itn(info.get("devmajor", 0), 8, format), + itn(info.get("devminor", 0), 8, format), + stn(info.get("prefix", ""), 155, encoding, errors) + ] + + buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) + chksum = calc_chksums(buf[-BLOCKSIZE:])[0] + buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:] + return buf + + @staticmethod + def _create_payload(payload): + """Return the string payload filled with zero bytes + up to the next 512 byte border. + """ + blocks, remainder = divmod(len(payload), BLOCKSIZE) + if remainder > 0: + payload += (BLOCKSIZE - remainder) * NUL + return payload + + @classmethod + def _create_gnu_long_header(cls, name, type, encoding, errors): + """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence + for name. + """ + name = name.encode(encoding, errors) + NUL + + info = {} + info["name"] = "././@LongLink" + info["type"] = type + info["size"] = len(name) + info["magic"] = GNU_MAGIC + + # create extended header + name blocks. + return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ + cls._create_payload(name) + + @classmethod + def _create_pax_generic_header(cls, pax_headers, type, encoding): + """Return a POSIX.1-2008 extended or global header sequence + that contains a list of keyword, value pairs. The values + must be strings. + """ + # Check if one of the fields contains surrogate characters and thereby + # forces hdrcharset=BINARY, see _proc_pax() for more information. + binary = False + for keyword, value in pax_headers.items(): + try: + value.encode("utf8", "strict") + except UnicodeEncodeError: + binary = True + break + + records = b"" + if binary: + # Put the hdrcharset field at the beginning of the header. + records += b"21 hdrcharset=BINARY\n" + + for keyword, value in pax_headers.items(): + keyword = keyword.encode("utf8") + if binary: + # Try to restore the original byte representation of `value'. + # Needless to say, that the encoding must match the string. + value = value.encode(encoding, "surrogateescape") + else: + value = value.encode("utf8") + + l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' + n = p = 0 + while True: + n = l + len(str(p)) + if n == p: + break + p = n + records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" + + # We use a hardcoded "././@PaxHeader" name like star does + # instead of the one that POSIX recommends. + info = {} + info["name"] = "././@PaxHeader" + info["type"] = type + info["size"] = len(records) + info["magic"] = POSIX_MAGIC + + # Create pax header + record blocks. + return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ + cls._create_payload(records) + + @classmethod + def frombuf(cls, buf, encoding, errors): + """Construct a TarInfo object from a 512 byte bytes object. + """ + if len(buf) == 0: + raise EmptyHeaderError("empty header") + if len(buf) != BLOCKSIZE: + raise TruncatedHeaderError("truncated header") + if buf.count(NUL) == BLOCKSIZE: + raise EOFHeaderError("end of file header") + + chksum = nti(buf[148:156]) + if chksum not in calc_chksums(buf): + raise InvalidHeaderError("bad checksum") + + obj = cls() + obj.name = nts(buf[0:100], encoding, errors) + obj.mode = nti(buf[100:108]) + obj.uid = nti(buf[108:116]) + obj.gid = nti(buf[116:124]) + obj.size = nti(buf[124:136]) + obj.mtime = nti(buf[136:148]) + obj.chksum = chksum + obj.type = buf[156:157] + obj.linkname = nts(buf[157:257], encoding, errors) + obj.uname = nts(buf[265:297], encoding, errors) + obj.gname = nts(buf[297:329], encoding, errors) + obj.devmajor = nti(buf[329:337]) + obj.devminor = nti(buf[337:345]) + prefix = nts(buf[345:500], encoding, errors) + + # Old V7 tar format represents a directory as a regular + # file with a trailing slash. + if obj.type == AREGTYPE and obj.name.endswith("/"): + obj.type = DIRTYPE + + # The old GNU sparse format occupies some of the unused + # space in the buffer for up to 4 sparse structures. + # Save the them for later processing in _proc_sparse(). + if obj.type == GNUTYPE_SPARSE: + pos = 386 + structs = [] + for i in range(4): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[482]) + origsize = nti(buf[483:495]) + obj._sparse_structs = (structs, isextended, origsize) + + # Remove redundant slashes from directories. + if obj.isdir(): + obj.name = obj.name.rstrip("/") + + # Reconstruct a ustar longname. + if prefix and obj.type not in GNU_TYPES: + obj.name = prefix + "/" + obj.name + return obj + + @classmethod + def fromtarfile(cls, tarfile): + """Return the next TarInfo object from TarFile object + tarfile. + """ + buf = tarfile.fileobj.read(BLOCKSIZE) + obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) + obj.offset = tarfile.fileobj.tell() - BLOCKSIZE + return obj._proc_member(tarfile) + + #-------------------------------------------------------------------------- + # The following are methods that are called depending on the type of a + # member. The entry point is _proc_member() which can be overridden in a + # subclass to add custom _proc_*() methods. A _proc_*() method MUST + # implement the following + # operations: + # 1. Set self.offset_data to the position where the data blocks begin, + # if there is data that follows. + # 2. Set tarfile.offset to the position where the next member's header will + # begin. + # 3. Return self or another valid TarInfo object. + def _proc_member(self, tarfile): + """Choose the right processing method depending on + the type and call it. + """ + if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): + return self._proc_gnulong(tarfile) + elif self.type == GNUTYPE_SPARSE: + return self._proc_sparse(tarfile) + elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): + return self._proc_pax(tarfile) + else: + return self._proc_builtin(tarfile) + + def _proc_builtin(self, tarfile): + """Process a builtin type or an unknown type which + will be treated as a regular file. + """ + self.offset_data = tarfile.fileobj.tell() + offset = self.offset_data + if self.isreg() or self.type not in SUPPORTED_TYPES: + # Skip the following data blocks. + offset += self._block(self.size) + tarfile.offset = offset + + # Patch the TarInfo object with saved global + # header information. + self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) + + return self + + def _proc_gnulong(self, tarfile): + """Process the blocks that hold a GNU longname + or longlink member. + """ + buf = tarfile.fileobj.read(self._block(self.size)) + + # Fetch the next header and process it. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Patch the TarInfo object from the next header with + # the longname information. + next.offset = self.offset + if self.type == GNUTYPE_LONGNAME: + next.name = nts(buf, tarfile.encoding, tarfile.errors) + elif self.type == GNUTYPE_LONGLINK: + next.linkname = nts(buf, tarfile.encoding, tarfile.errors) + + return next + + def _proc_sparse(self, tarfile): + """Process a GNU sparse header plus extra headers. + """ + # We already collected some sparse structures in frombuf(). + structs, isextended, origsize = self._sparse_structs + del self._sparse_structs + + # Collect sparse structures from extended header blocks. + while isextended: + buf = tarfile.fileobj.read(BLOCKSIZE) + pos = 0 + for i in range(21): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + if offset and numbytes: + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[504]) + self.sparse = structs + + self.offset_data = tarfile.fileobj.tell() + tarfile.offset = self.offset_data + self._block(self.size) + self.size = origsize + return self + + def _proc_pax(self, tarfile): + """Process an extended or global header as described in + POSIX.1-2008. + """ + # Read the header information. + buf = tarfile.fileobj.read(self._block(self.size)) + + # A pax header stores supplemental information for either + # the following file (extended) or all following files + # (global). + if self.type == XGLTYPE: + pax_headers = tarfile.pax_headers + else: + pax_headers = tarfile.pax_headers.copy() + + # Check if the pax header contains a hdrcharset field. This tells us + # the encoding of the path, linkpath, uname and gname fields. Normally, + # these fields are UTF-8 encoded but since POSIX.1-2008 tar + # implementations are allowed to store them as raw binary strings if + # the translation to UTF-8 fails. + match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) + if match is not None: + pax_headers["hdrcharset"] = match.group(1).decode("utf8") + + # For the time being, we don't care about anything other than "BINARY". + # The only other value that is currently allowed by the standard is + # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. + hdrcharset = pax_headers.get("hdrcharset") + if hdrcharset == "BINARY": + encoding = tarfile.encoding + else: + encoding = "utf8" + + # Parse pax header information. A record looks like that: + # "%d %s=%s\n" % (length, keyword, value). length is the size + # of the complete record including the length field itself and + # the newline. keyword and value are both UTF-8 encoded strings. + regex = re.compile(br"(\d+) ([^=]+)=") + pos = 0 + while True: + match = regex.match(buf, pos) + if not match: + break + + length, keyword = match.groups() + length = int(length) + value = buf[match.end(2) + 1:match.start(1) + length - 1] + + # Normally, we could just use "utf8" as the encoding and "strict" + # as the error handler, but we better not take the risk. For + # example, GNU tar <= 1.23 is known to store filenames it cannot + # translate to UTF-8 as raw strings (unfortunately without a + # hdrcharset=BINARY header). + # We first try the strict standard encoding, and if that fails we + # fall back on the user's encoding and error handler. + keyword = self._decode_pax_field(keyword, "utf8", "utf8", + tarfile.errors) + if keyword in PAX_NAME_FIELDS: + value = self._decode_pax_field(value, encoding, tarfile.encoding, + tarfile.errors) + else: + value = self._decode_pax_field(value, "utf8", "utf8", + tarfile.errors) + + pax_headers[keyword] = value + pos += length + + # Fetch the next header. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Process GNU sparse information. + if "GNU.sparse.map" in pax_headers: + # GNU extended sparse format version 0.1. + self._proc_gnusparse_01(next, pax_headers) + + elif "GNU.sparse.size" in pax_headers: + # GNU extended sparse format version 0.0. + self._proc_gnusparse_00(next, pax_headers, buf) + + elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": + # GNU extended sparse format version 1.0. + self._proc_gnusparse_10(next, pax_headers, tarfile) + + if self.type in (XHDTYPE, SOLARIS_XHDTYPE): + # Patch the TarInfo object with the extended header info. + next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) + next.offset = self.offset + + if "size" in pax_headers: + # If the extended header replaces the size field, + # we need to recalculate the offset where the next + # header starts. + offset = next.offset_data + if next.isreg() or next.type not in SUPPORTED_TYPES: + offset += next._block(next.size) + tarfile.offset = offset + + return next + + def _proc_gnusparse_00(self, next, pax_headers, buf): + """Process a GNU tar extended sparse header, version 0.0. + """ + offsets = [] + for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): + offsets.append(int(match.group(1))) + numbytes = [] + for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): + numbytes.append(int(match.group(1))) + next.sparse = list(zip(offsets, numbytes)) + + def _proc_gnusparse_01(self, next, pax_headers): + """Process a GNU tar extended sparse header, version 0.1. + """ + sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _proc_gnusparse_10(self, next, pax_headers, tarfile): + """Process a GNU tar extended sparse header, version 1.0. + """ + fields = None + sparse = [] + buf = tarfile.fileobj.read(BLOCKSIZE) + fields, buf = buf.split(b"\n", 1) + fields = int(fields) + while len(sparse) < fields * 2: + if b"\n" not in buf: + buf += tarfile.fileobj.read(BLOCKSIZE) + number, buf = buf.split(b"\n", 1) + sparse.append(int(number)) + next.offset_data = tarfile.fileobj.tell() + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _apply_pax_info(self, pax_headers, encoding, errors): + """Replace fields with supplemental information from a previous + pax extended or global header. + """ + for keyword, value in pax_headers.items(): + if keyword == "GNU.sparse.name": + setattr(self, "path", value) + elif keyword == "GNU.sparse.size": + setattr(self, "size", int(value)) + elif keyword == "GNU.sparse.realsize": + setattr(self, "size", int(value)) + elif keyword in PAX_FIELDS: + if keyword in PAX_NUMBER_FIELDS: + try: + value = PAX_NUMBER_FIELDS[keyword](value) + except ValueError: + value = 0 + if keyword == "path": + value = value.rstrip("/") + setattr(self, keyword, value) + + self.pax_headers = pax_headers.copy() + + def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): + """Decode a single field from a pax record. + """ + try: + return value.decode(encoding, "strict") + except UnicodeDecodeError: + return value.decode(fallback_encoding, fallback_errors) + + def _block(self, count): + """Round up a byte count by BLOCKSIZE and return it, + e.g. _block(834) => 1024. + """ + blocks, remainder = divmod(count, BLOCKSIZE) + if remainder: + blocks += 1 + return blocks * BLOCKSIZE + + def isreg(self): + return self.type in REGULAR_TYPES + def isfile(self): + return self.isreg() + def isdir(self): + return self.type == DIRTYPE + def issym(self): + return self.type == SYMTYPE + def islnk(self): + return self.type == LNKTYPE + def ischr(self): + return self.type == CHRTYPE + def isblk(self): + return self.type == BLKTYPE + def isfifo(self): + return self.type == FIFOTYPE + def issparse(self): + return self.sparse is not None + def isdev(self): + return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) +# class TarInfo + +class TarFile(object): + """The TarFile Class provides an interface to tar archives. + """ + + debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) + + dereference = False # If true, add content of linked file to the + # tar file, else the link. + + ignore_zeros = False # If true, skips empty or invalid blocks and + # continues processing. + + errorlevel = 1 # If 0, fatal errors only appear in debug + # messages (if debug >= 0). If > 0, errors + # are passed to the caller as exceptions. + + format = DEFAULT_FORMAT # The format to use when creating an archive. + + encoding = ENCODING # Encoding for 8-bit character strings. + + errors = None # Error handler for unicode conversion. + + tarinfo = TarInfo # The default TarInfo class to use. + + fileobject = ExFileObject # The default ExFileObject class to use. + + def __init__(self, name=None, mode="r", fileobj=None, format=None, + tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, + errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None): + """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to + read from an existing archive, 'a' to append data to an existing + file or 'w' to create a new file overwriting an existing one. `mode' + defaults to 'r'. + If `fileobj' is given, it is used for reading or writing data. If it + can be determined, `mode' is overridden by `fileobj's mode. + `fileobj' is not closed, when TarFile is closed. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + self.mode = mode + self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] + + if not fileobj: + if self.mode == "a" and not os.path.exists(name): + # Create nonexistent files in append mode. + self.mode = "w" + self._mode = "wb" + fileobj = bltn_open(name, self._mode) + self._extfileobj = False + else: + if name is None and hasattr(fileobj, "name"): + name = fileobj.name + if hasattr(fileobj, "mode"): + self._mode = fileobj.mode + self._extfileobj = True + self.name = os.path.abspath(name) if name else None + self.fileobj = fileobj + + # Init attributes. + if format is not None: + self.format = format + if tarinfo is not None: + self.tarinfo = tarinfo + if dereference is not None: + self.dereference = dereference + if ignore_zeros is not None: + self.ignore_zeros = ignore_zeros + if encoding is not None: + self.encoding = encoding + self.errors = errors + + if pax_headers is not None and self.format == PAX_FORMAT: + self.pax_headers = pax_headers + else: + self.pax_headers = {} + + if debug is not None: + self.debug = debug + if errorlevel is not None: + self.errorlevel = errorlevel + + # Init datastructures. + self.closed = False + self.members = [] # list of members as TarInfo objects + self._loaded = False # flag if all members have been read + self.offset = self.fileobj.tell() + # current position in the archive file + self.inodes = {} # dictionary caching the inodes of + # archive members already added + + try: + if self.mode == "r": + self.firstmember = None + self.firstmember = self.next() + + if self.mode == "a": + # Move to the end of the archive, + # before the first empty block. + while True: + self.fileobj.seek(self.offset) + try: + tarinfo = self.tarinfo.fromtarfile(self) + self.members.append(tarinfo) + except EOFHeaderError: + self.fileobj.seek(self.offset) + break + except HeaderError as e: + raise ReadError(str(e)) + + if self.mode in "aw": + self._loaded = True + + if self.pax_headers: + buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) + self.fileobj.write(buf) + self.offset += len(buf) + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + #-------------------------------------------------------------------------- + # Below are the classmethods which act as alternate constructors to the + # TarFile class. The open() method is the only one that is needed for + # public use; it is the "super"-constructor and is able to select an + # adequate "sub"-constructor for a particular compression using the mapping + # from OPEN_METH. + # + # This concept allows one to subclass TarFile without losing the comfort of + # the super-constructor. A sub-constructor is registered and made available + # by adding it to the mapping in OPEN_METH. + + @classmethod + def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): + """Open a tar archive for reading, writing or appending. Return + an appropriate TarFile class. + + mode: + 'r' or 'r:*' open for reading with transparent compression + 'r:' open for reading exclusively uncompressed + 'r:gz' open for reading with gzip compression + 'r:bz2' open for reading with bzip2 compression + 'a' or 'a:' open for appending, creating the file if necessary + 'w' or 'w:' open for writing without compression + 'w:gz' open for writing with gzip compression + 'w:bz2' open for writing with bzip2 compression + + 'r|*' open a stream of tar blocks with transparent compression + 'r|' open an uncompressed stream of tar blocks for reading + 'r|gz' open a gzip compressed stream of tar blocks + 'r|bz2' open a bzip2 compressed stream of tar blocks + 'w|' open an uncompressed stream for writing + 'w|gz' open a gzip compressed stream for writing + 'w|bz2' open a bzip2 compressed stream for writing + """ + + if not name and not fileobj: + raise ValueError("nothing to open") + + if mode in ("r", "r:*"): + # Find out which *open() is appropriate for opening the file. + for comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + if fileobj is not None: + saved_pos = fileobj.tell() + try: + return func(name, "r", fileobj, **kwargs) + except (ReadError, CompressionError) as e: + if fileobj is not None: + fileobj.seek(saved_pos) + continue + raise ReadError("file could not be opened successfully") + + elif ":" in mode: + filemode, comptype = mode.split(":", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + # Select the *open() function according to + # given compression. + if comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + else: + raise CompressionError("unknown compression type %r" % comptype) + return func(name, filemode, fileobj, **kwargs) + + elif "|" in mode: + filemode, comptype = mode.split("|", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + if filemode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + stream = _Stream(name, filemode, comptype, fileobj, bufsize) + try: + t = cls(name, filemode, stream, **kwargs) + except: + stream.close() + raise + t._extfileobj = False + return t + + elif mode in "aw": + return cls.taropen(name, mode, fileobj, **kwargs) + + raise ValueError("undiscernible mode") + + @classmethod + def taropen(cls, name, mode="r", fileobj=None, **kwargs): + """Open uncompressed tar archive name for reading or writing. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + return cls(name, mode, fileobj, **kwargs) + + @classmethod + def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open gzip compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + try: + import gzip + gzip.GzipFile + except (ImportError, AttributeError): + raise CompressionError("gzip module is not available") + + extfileobj = fileobj is not None + try: + fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) + t = cls.taropen(name, mode, fileobj, **kwargs) + except IOError: + if not extfileobj and fileobj is not None: + fileobj.close() + if fileobj is None: + raise + raise ReadError("not a gzip file") + except: + if not extfileobj and fileobj is not None: + fileobj.close() + raise + t._extfileobj = extfileobj + return t + + @classmethod + def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open bzip2 compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'.") + + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + + if fileobj is not None: + fileobj = _BZ2Proxy(fileobj, mode) + else: + fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel) + + try: + t = cls.taropen(name, mode, fileobj, **kwargs) + except (IOError, EOFError): + fileobj.close() + raise ReadError("not a bzip2 file") + t._extfileobj = False + return t + + # All *open() methods are registered here. + OPEN_METH = { + "tar": "taropen", # uncompressed tar + "gz": "gzopen", # gzip compressed tar + "bz2": "bz2open" # bzip2 compressed tar + } + + #-------------------------------------------------------------------------- + # The public methods which TarFile provides: + + def close(self): + """Close the TarFile. In write-mode, two finishing zero blocks are + appended to the archive. + """ + if self.closed: + return + + if self.mode in "aw": + self.fileobj.write(NUL * (BLOCKSIZE * 2)) + self.offset += (BLOCKSIZE * 2) + # fill up the end with zero-blocks + # (like option -b20 for tar does) + blocks, remainder = divmod(self.offset, RECORDSIZE) + if remainder > 0: + self.fileobj.write(NUL * (RECORDSIZE - remainder)) + + if not self._extfileobj: + self.fileobj.close() + self.closed = True + + def getmember(self, name): + """Return a TarInfo object for member `name'. If `name' can not be + found in the archive, KeyError is raised. If a member occurs more + than once in the archive, its last occurrence is assumed to be the + most up-to-date version. + """ + tarinfo = self._getmember(name) + if tarinfo is None: + raise KeyError("filename %r not found" % name) + return tarinfo + + def getmembers(self): + """Return the members of the archive as a list of TarInfo objects. The + list has the same order as the members in the archive. + """ + self._check() + if not self._loaded: # if we want to obtain a list of + self._load() # all members, we first have to + # scan the whole archive. + return self.members + + def getnames(self): + """Return the members of the archive as a list of their names. It has + the same order as the list returned by getmembers(). + """ + return [tarinfo.name for tarinfo in self.getmembers()] + + def gettarinfo(self, name=None, arcname=None, fileobj=None): + """Create a TarInfo object for either the file `name' or the file + object `fileobj' (using os.fstat on its file descriptor). You can + modify some of the TarInfo's attributes before you add it using + addfile(). If given, `arcname' specifies an alternative name for the + file in the archive. + """ + self._check("aw") + + # When fileobj is given, replace name by + # fileobj's real name. + if fileobj is not None: + name = fileobj.name + + # Building the name of the member in the archive. + # Backward slashes are converted to forward slashes, + # Absolute paths are turned to relative paths. + if arcname is None: + arcname = name + drv, arcname = os.path.splitdrive(arcname) + arcname = arcname.replace(os.sep, "/") + arcname = arcname.lstrip("/") + + # Now, fill the TarInfo object with + # information specific for the file. + tarinfo = self.tarinfo() + tarinfo.tarfile = self + + # Use os.stat or os.lstat, depending on platform + # and if symlinks shall be resolved. + if fileobj is None: + if hasattr(os, "lstat") and not self.dereference: + statres = os.lstat(name) + else: + statres = os.stat(name) + else: + statres = os.fstat(fileobj.fileno()) + linkname = "" + + stmd = statres.st_mode + if stat.S_ISREG(stmd): + inode = (statres.st_ino, statres.st_dev) + if not self.dereference and statres.st_nlink > 1 and \ + inode in self.inodes and arcname != self.inodes[inode]: + # Is it a hardlink to an already + # archived file? + type = LNKTYPE + linkname = self.inodes[inode] + else: + # The inode is added only if its valid. + # For win32 it is always 0. + type = REGTYPE + if inode[0]: + self.inodes[inode] = arcname + elif stat.S_ISDIR(stmd): + type = DIRTYPE + elif stat.S_ISFIFO(stmd): + type = FIFOTYPE + elif stat.S_ISLNK(stmd): + type = SYMTYPE + linkname = os.readlink(name) + elif stat.S_ISCHR(stmd): + type = CHRTYPE + elif stat.S_ISBLK(stmd): + type = BLKTYPE + else: + return None + + # Fill the TarInfo object with all + # information we can get. + tarinfo.name = arcname + tarinfo.mode = stmd + tarinfo.uid = statres.st_uid + tarinfo.gid = statres.st_gid + if type == REGTYPE: + tarinfo.size = statres.st_size + else: + tarinfo.size = 0 + tarinfo.mtime = statres.st_mtime + tarinfo.type = type + tarinfo.linkname = linkname + if pwd: + try: + tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] + except KeyError: + pass + if grp: + try: + tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] + except KeyError: + pass + + if type in (CHRTYPE, BLKTYPE): + if hasattr(os, "major") and hasattr(os, "minor"): + tarinfo.devmajor = os.major(statres.st_rdev) + tarinfo.devminor = os.minor(statres.st_rdev) + return tarinfo + + def list(self, verbose=True): + """Print a table of contents to sys.stdout. If `verbose' is False, only + the names of the members are printed. If it is True, an `ls -l'-like + output is produced. + """ + self._check() + + for tarinfo in self: + if verbose: + print(filemode(tarinfo.mode), end=' ') + print("%s/%s" % (tarinfo.uname or tarinfo.uid, + tarinfo.gname or tarinfo.gid), end=' ') + if tarinfo.ischr() or tarinfo.isblk(): + print("%10s" % ("%d,%d" \ + % (tarinfo.devmajor, tarinfo.devminor)), end=' ') + else: + print("%10d" % tarinfo.size, end=' ') + print("%d-%02d-%02d %02d:%02d:%02d" \ + % time.localtime(tarinfo.mtime)[:6], end=' ') + + print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') + + if verbose: + if tarinfo.issym(): + print("->", tarinfo.linkname, end=' ') + if tarinfo.islnk(): + print("link to", tarinfo.linkname, end=' ') + print() + + def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): + """Add the file `name' to the archive. `name' may be any type of file + (directory, fifo, symbolic link, etc.). If given, `arcname' + specifies an alternative name for the file in the archive. + Directories are added recursively by default. This can be avoided by + setting `recursive' to False. `exclude' is a function that should + return True for each filename to be excluded. `filter' is a function + that expects a TarInfo object argument and returns the changed + TarInfo object, if it returns None the TarInfo object will be + excluded from the archive. + """ + self._check("aw") + + if arcname is None: + arcname = name + + # Exclude pathnames. + if exclude is not None: + import warnings + warnings.warn("use the filter argument instead", + DeprecationWarning, 2) + if exclude(name): + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Skip if somebody tries to archive the archive... + if self.name is not None and os.path.abspath(name) == self.name: + self._dbg(2, "tarfile: Skipped %r" % name) + return + + self._dbg(1, name) + + # Create a TarInfo object from the file. + tarinfo = self.gettarinfo(name, arcname) + + if tarinfo is None: + self._dbg(1, "tarfile: Unsupported type %r" % name) + return + + # Change or exclude the TarInfo object. + if filter is not None: + tarinfo = filter(tarinfo) + if tarinfo is None: + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Append the tar header and data to the archive. + if tarinfo.isreg(): + f = bltn_open(name, "rb") + self.addfile(tarinfo, f) + f.close() + + elif tarinfo.isdir(): + self.addfile(tarinfo) + if recursive: + for f in os.listdir(name): + self.add(os.path.join(name, f), os.path.join(arcname, f), + recursive, exclude, filter=filter) + + else: + self.addfile(tarinfo) + + def addfile(self, tarinfo, fileobj=None): + """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is + given, tarinfo.size bytes are read from it and added to the archive. + You can create TarInfo objects using gettarinfo(). + On Windows platforms, `fileobj' should always be opened with mode + 'rb' to avoid irritation about the file size. + """ + self._check("aw") + + tarinfo = copy.copy(tarinfo) + + buf = tarinfo.tobuf(self.format, self.encoding, self.errors) + self.fileobj.write(buf) + self.offset += len(buf) + + # If there's data to follow, append it. + if fileobj is not None: + copyfileobj(fileobj, self.fileobj, tarinfo.size) + blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) + if remainder > 0: + self.fileobj.write(NUL * (BLOCKSIZE - remainder)) + blocks += 1 + self.offset += blocks * BLOCKSIZE + + self.members.append(tarinfo) + + def extractall(self, path=".", members=None): + """Extract all members from the archive to the current working + directory and set owner, modification time and permissions on + directories afterwards. `path' specifies a different directory + to extract to. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + directories = [] + + if members is None: + members = self + + for tarinfo in members: + if tarinfo.isdir(): + # Extract directories with a safe mode. + directories.append(tarinfo) + tarinfo = copy.copy(tarinfo) + tarinfo.mode = 0o700 + # Do not set_attrs directories, as we will do that further down + self.extract(tarinfo, path, set_attrs=not tarinfo.isdir()) + + # Reverse sort directories. + directories.sort(key=lambda a: a.name) + directories.reverse() + + # Set correct owner, mtime and filemode on directories. + for tarinfo in directories: + dirpath = os.path.join(path, tarinfo.name) + try: + self.chown(tarinfo, dirpath) + self.utime(tarinfo, dirpath) + self.chmod(tarinfo, dirpath) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extract(self, member, path="", set_attrs=True): + """Extract a member from the archive to the current working directory, + using its full name. Its file information is extracted as accurately + as possible. `member' may be a filename or a TarInfo object. You can + specify a different directory using `path'. File attributes (owner, + mtime, mode) are set unless `set_attrs' is False. + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + # Prepare the link target for makelink(). + if tarinfo.islnk(): + tarinfo._link_target = os.path.join(path, tarinfo.linkname) + + try: + self._extract_member(tarinfo, os.path.join(path, tarinfo.name), + set_attrs=set_attrs) + except EnvironmentError as e: + if self.errorlevel > 0: + raise + else: + if e.filename is None: + self._dbg(1, "tarfile: %s" % e.strerror) + else: + self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extractfile(self, member): + """Extract a member from the archive as a file object. `member' may be + a filename or a TarInfo object. If `member' is a regular file, a + file-like object is returned. If `member' is a link, a file-like + object is constructed from the link's target. If `member' is none of + the above, None is returned. + The file-like object is read-only and provides the following + methods: read(), readline(), readlines(), seek() and tell() + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + if tarinfo.isreg(): + return self.fileobject(self, tarinfo) + + elif tarinfo.type not in SUPPORTED_TYPES: + # If a member's type is unknown, it is treated as a + # regular file. + return self.fileobject(self, tarinfo) + + elif tarinfo.islnk() or tarinfo.issym(): + if isinstance(self.fileobj, _Stream): + # A small but ugly workaround for the case that someone tries + # to extract a (sym)link as a file-object from a non-seekable + # stream of tar blocks. + raise StreamError("cannot extract (sym)link as file object") + else: + # A (sym)link's file object is its target's file object. + return self.extractfile(self._find_link_target(tarinfo)) + else: + # If there's no data associated with the member (directory, chrdev, + # blkdev, etc.), return None instead of a file object. + return None + + def _extract_member(self, tarinfo, targetpath, set_attrs=True): + """Extract the TarInfo object tarinfo to a physical + file called targetpath. + """ + # Fetch the TarInfo object for the given name + # and build the destination pathname, replacing + # forward slashes to platform specific separators. + targetpath = targetpath.rstrip("/") + targetpath = targetpath.replace("/", os.sep) + + # Create all upper directories. + upperdirs = os.path.dirname(targetpath) + if upperdirs and not os.path.exists(upperdirs): + # Create directories that are not part of the archive with + # default permissions. + os.makedirs(upperdirs) + + if tarinfo.islnk() or tarinfo.issym(): + self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) + else: + self._dbg(1, tarinfo.name) + + if tarinfo.isreg(): + self.makefile(tarinfo, targetpath) + elif tarinfo.isdir(): + self.makedir(tarinfo, targetpath) + elif tarinfo.isfifo(): + self.makefifo(tarinfo, targetpath) + elif tarinfo.ischr() or tarinfo.isblk(): + self.makedev(tarinfo, targetpath) + elif tarinfo.islnk() or tarinfo.issym(): + self.makelink(tarinfo, targetpath) + elif tarinfo.type not in SUPPORTED_TYPES: + self.makeunknown(tarinfo, targetpath) + else: + self.makefile(tarinfo, targetpath) + + if set_attrs: + self.chown(tarinfo, targetpath) + if not tarinfo.issym(): + self.chmod(tarinfo, targetpath) + self.utime(tarinfo, targetpath) + + #-------------------------------------------------------------------------- + # Below are the different file methods. They are called via + # _extract_member() when extract() is called. They can be replaced in a + # subclass to implement other functionality. + + def makedir(self, tarinfo, targetpath): + """Make a directory called targetpath. + """ + try: + # Use a safe mode for the directory, the real mode is set + # later in _extract_member(). + os.mkdir(targetpath, 0o700) + except EnvironmentError as e: + if e.errno != errno.EEXIST: + raise + + def makefile(self, tarinfo, targetpath): + """Make a file called targetpath. + """ + source = self.fileobj + source.seek(tarinfo.offset_data) + target = bltn_open(targetpath, "wb") + if tarinfo.sparse is not None: + for offset, size in tarinfo.sparse: + target.seek(offset) + copyfileobj(source, target, size) + else: + copyfileobj(source, target, tarinfo.size) + target.seek(tarinfo.size) + target.truncate() + target.close() + + def makeunknown(self, tarinfo, targetpath): + """Make a file from a TarInfo object with an unknown type + at targetpath. + """ + self.makefile(tarinfo, targetpath) + self._dbg(1, "tarfile: Unknown file type %r, " \ + "extracted as regular file." % tarinfo.type) + + def makefifo(self, tarinfo, targetpath): + """Make a fifo called targetpath. + """ + if hasattr(os, "mkfifo"): + os.mkfifo(targetpath) + else: + raise ExtractError("fifo not supported by system") + + def makedev(self, tarinfo, targetpath): + """Make a character or block device called targetpath. + """ + if not hasattr(os, "mknod") or not hasattr(os, "makedev"): + raise ExtractError("special devices not supported by system") + + mode = tarinfo.mode + if tarinfo.isblk(): + mode |= stat.S_IFBLK + else: + mode |= stat.S_IFCHR + + os.mknod(targetpath, mode, + os.makedev(tarinfo.devmajor, tarinfo.devminor)) + + def makelink(self, tarinfo, targetpath): + """Make a (symbolic) link called targetpath. If it cannot be created + (platform limitation), we try to make a copy of the referenced file + instead of a link. + """ + try: + # For systems that support symbolic and hard links. + if tarinfo.issym(): + os.symlink(tarinfo.linkname, targetpath) + else: + # See extract(). + if os.path.exists(tarinfo._link_target): + os.link(tarinfo._link_target, targetpath) + else: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except symlink_exception: + if tarinfo.issym(): + linkpath = os.path.join(os.path.dirname(tarinfo.name), + tarinfo.linkname) + else: + linkpath = tarinfo.linkname + else: + try: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except KeyError: + raise ExtractError("unable to resolve link inside archive") + + def chown(self, tarinfo, targetpath): + """Set owner of targetpath according to tarinfo. + """ + if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: + # We have to be root to do so. + try: + g = grp.getgrnam(tarinfo.gname)[2] + except KeyError: + g = tarinfo.gid + try: + u = pwd.getpwnam(tarinfo.uname)[2] + except KeyError: + u = tarinfo.uid + try: + if tarinfo.issym() and hasattr(os, "lchown"): + os.lchown(targetpath, u, g) + else: + if sys.platform != "os2emx": + os.chown(targetpath, u, g) + except EnvironmentError as e: + raise ExtractError("could not change owner") + + def chmod(self, tarinfo, targetpath): + """Set file permissions of targetpath according to tarinfo. + """ + if hasattr(os, 'chmod'): + try: + os.chmod(targetpath, tarinfo.mode) + except EnvironmentError as e: + raise ExtractError("could not change mode") + + def utime(self, tarinfo, targetpath): + """Set modification time of targetpath according to tarinfo. + """ + if not hasattr(os, 'utime'): + return + try: + os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) + except EnvironmentError as e: + raise ExtractError("could not change modification time") + + #-------------------------------------------------------------------------- + def next(self): + """Return the next member of the archive as a TarInfo object, when + TarFile is opened for reading. Return None if there is no more + available. + """ + self._check("ra") + if self.firstmember is not None: + m = self.firstmember + self.firstmember = None + return m + + # Read the next block. + self.fileobj.seek(self.offset) + tarinfo = None + while True: + try: + tarinfo = self.tarinfo.fromtarfile(self) + except EOFHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + except InvalidHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + elif self.offset == 0: + raise ReadError(str(e)) + except EmptyHeaderError: + if self.offset == 0: + raise ReadError("empty file") + except TruncatedHeaderError as e: + if self.offset == 0: + raise ReadError(str(e)) + except SubsequentHeaderError as e: + raise ReadError(str(e)) + break + + if tarinfo is not None: + self.members.append(tarinfo) + else: + self._loaded = True + + return tarinfo + + #-------------------------------------------------------------------------- + # Little helper methods: + + def _getmember(self, name, tarinfo=None, normalize=False): + """Find an archive member by name from bottom to top. + If tarinfo is given, it is used as the starting point. + """ + # Ensure that all members have been loaded. + members = self.getmembers() + + # Limit the member search list up to tarinfo. + if tarinfo is not None: + members = members[:members.index(tarinfo)] + + if normalize: + name = os.path.normpath(name) + + for member in reversed(members): + if normalize: + member_name = os.path.normpath(member.name) + else: + member_name = member.name + + if name == member_name: + return member + + def _load(self): + """Read through the entire archive file and look for readable + members. + """ + while True: + tarinfo = self.next() + if tarinfo is None: + break + self._loaded = True + + def _check(self, mode=None): + """Check if TarFile is still open, and if the operation's mode + corresponds to TarFile's mode. + """ + if self.closed: + raise IOError("%s is closed" % self.__class__.__name__) + if mode is not None and self.mode not in mode: + raise IOError("bad operation for mode %r" % self.mode) + + def _find_link_target(self, tarinfo): + """Find the target member of a symlink or hardlink member in the + archive. + """ + if tarinfo.issym(): + # Always search the entire archive. + linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname + limit = None + else: + # Search the archive before the link, because a hard link is + # just a reference to an already archived file. + linkname = tarinfo.linkname + limit = tarinfo + + member = self._getmember(linkname, tarinfo=limit, normalize=True) + if member is None: + raise KeyError("linkname %r not found" % linkname) + return member + + def __iter__(self): + """Provide an iterator object. + """ + if self._loaded: + return iter(self.members) + else: + return TarIter(self) + + def _dbg(self, level, msg): + """Write debugging output to sys.stderr. + """ + if level <= self.debug: + print(msg, file=sys.stderr) + + def __enter__(self): + self._check() + return self + + def __exit__(self, type, value, traceback): + if type is None: + self.close() + else: + # An exception occurred. We must not call close() because + # it would try to write end-of-archive blocks and padding. + if not self._extfileobj: + self.fileobj.close() + self.closed = True +# class TarFile + +class TarIter(object): + """Iterator Class. + + for tarinfo in TarFile(...): + suite... + """ + + def __init__(self, tarfile): + """Construct a TarIter object. + """ + self.tarfile = tarfile + self.index = 0 + def __iter__(self): + """Return iterator object. + """ + return self + + def __next__(self): + """Return the next item using TarFile's next() method. + When all members have been read, set TarFile as _loaded. + """ + # Fix for SF #1100429: Under rare circumstances it can + # happen that getmembers() is called during iteration, + # which will cause TarIter to stop prematurely. + if not self.tarfile._loaded: + tarinfo = self.tarfile.next() + if not tarinfo: + self.tarfile._loaded = True + raise StopIteration + else: + try: + tarinfo = self.tarfile.members[self.index] + except IndexError: + raise StopIteration + self.index += 1 + return tarinfo + + next = __next__ # for Python 2.x + +#-------------------- +# exported functions +#-------------------- +def is_tarfile(name): + """Return True if name points to a tar archive that we + are able to handle, else return False. + """ + try: + t = open(name) + t.close() + return True + except TarError: + return False + +bltn_open = open +open = TarFile.open diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/tarfile.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/tarfile.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbd0d293cb43f3025f7b5db009c7d9c8828412cc GIT binary patch literal 85592 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 Wc&+wY?Lnun)qXbc_MUUPJN^TtqX`NC literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/compat.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/compat.py new file mode 100644 index 0000000000..fd2c1cb8e2 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/compat.py @@ -0,0 +1,754 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import absolute_import + +import os +import re +import sys + +if sys.version_info[0] < 3: + from StringIO import StringIO + string_types = basestring, + text_type = unicode + from types import FileType as file_type + import __builtin__ as builtins + import ConfigParser as configparser + from ._backport import shutil + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit + from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, + pathname2url, ContentTooShortError, splittype) + + def quote(s): + if isinstance(s, unicode): + s = s.encode('utf-8') + return _quote(s) + + import urllib2 + from urllib2 import (Request, urlopen, URLError, HTTPError, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPSHandler, HTTPHandler, HTTPRedirectHandler, + build_opener) + import httplib + import xmlrpclib + import Queue as queue + from HTMLParser import HTMLParser + import htmlentitydefs + raw_input = raw_input + from itertools import ifilter as filter + from itertools import ifilterfalse as filterfalse + + _userprog = None + def splituser(host): + """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + global _userprog + if _userprog is None: + import re + _userprog = re.compile('^(.*)@(.*)$') + + match = _userprog.match(host) + if match: return match.group(1, 2) + return None, host + + class CertificateError(ValueError): + pass + + + def _dnsname_to_pat(dn): + pats = [] + for frag in dn.split(r'.'): + if frag == '*': + # When '*' is a fragment by itself, it matches a non-empty + # dotless fragment. + pats.append('[^.]+') + else: + # Otherwise, '*' matches any dotless fragment. + frag = re.escape(frag) + pats.append(frag.replace(r'\*', '[^.]*')) + return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 rules + are mostly followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_to_pat(value).match(hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_to_pat(value).match(hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + +else: + from io import StringIO + string_types = str, + text_type = str + from io import TextIOWrapper as file_type + import builtins + import configparser + import shutil + from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote, + unquote, urlsplit, urlunsplit, splittype) + from urllib.request import (urlopen, urlretrieve, Request, url2pathname, + pathname2url, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPSHandler, HTTPHandler, HTTPRedirectHandler, + build_opener) + from urllib.error import HTTPError, URLError, ContentTooShortError + import http.client as httplib + import urllib.request as urllib2 + import xmlrpc.client as xmlrpclib + import queue + from html.parser import HTMLParser + import html.entities as htmlentitydefs + raw_input = input + from itertools import filterfalse + filter = filter + + from ssl import match_hostname, CertificateError + +# ZipFile is a context manager in 2.7, but not in 2.6 + +from zipfile import ZipFile as BaseZipFile + +if hasattr(BaseZipFile, '__enter__'): + ZipFile = BaseZipFile +else: + from zipfile import ZipExtFile as BaseZipExtFile + + class ZipExtFile(BaseZipExtFile): + def __init__(self, base): + self.__dict__.update(base.__dict__) + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + class ZipFile(BaseZipFile): + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + def open(self, *args, **kwargs): + base = BaseZipFile.open(self, *args, **kwargs) + return ZipExtFile(base) + +try: + from platform import python_implementation +except ImportError: # pragma: no cover + def python_implementation(): + """Return a string identifying the Python implementation.""" + if 'PyPy' in sys.version: + return 'PyPy' + if os.name == 'java': + return 'Jython' + if sys.version.startswith('IronPython'): + return 'IronPython' + return 'CPython' + +try: + import sysconfig +except ImportError: # pragma: no cover + from ._backport import sysconfig + +try: + callable = callable +except NameError: # pragma: no cover + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode + fsdecode = os.fsdecode +except AttributeError: # pragma: no cover + _fsencoding = sys.getfilesystemencoding() + if _fsencoding == 'mbcs': + _fserrors = 'strict' + else: + _fserrors = 'surrogateescape' + + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, text_type): + return filename.encode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + + def fsdecode(filename): + if isinstance(filename, text_type): + return filename + elif isinstance(filename, bytes): + return filename.decode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + +try: + from tokenize import detect_encoding +except ImportError: # pragma: no cover + from codecs import BOM_UTF8, lookup + import re + + cookie_re = re.compile("coding[:=]\s*([-\w.]+)") + + def _get_normal_name(orig_enc): + """Imitates get_normal_name in tokenizer.c.""" + # Only care about the first 12 characters. + enc = orig_enc[:12].lower().replace("_", "-") + if enc == "utf-8" or enc.startswith("utf-8-"): + return "utf-8" + if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ + enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): + return "iso-8859-1" + return orig_enc + + def detect_encoding(readline): + """ + The detect_encoding() function is used to detect the encoding that should + be used to decode a Python source file. It requires one argment, readline, + in the same way as the tokenize() generator. + + It will call readline a maximum of twice, and return the encoding used + (as a string) and a list of any lines (left as bytes) it has read in. + + It detects the encoding from the presence of a utf-8 bom or an encoding + cookie as specified in pep-0263. If both a bom and a cookie are present, + but disagree, a SyntaxError will be raised. If the encoding cookie is an + invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, + 'utf-8-sig' is returned. + + If no encoding is specified, then the default of 'utf-8' will be returned. + """ + try: + filename = readline.__self__.name + except AttributeError: + filename = None + bom_found = False + encoding = None + default = 'utf-8' + def read_or_stop(): + try: + return readline() + except StopIteration: + return b'' + + def find_cookie(line): + try: + # Decode as UTF-8. Either the line is an encoding declaration, + # in which case it should be pure ASCII, or it must be UTF-8 + # per default encoding. + line_string = line.decode('utf-8') + except UnicodeDecodeError: + msg = "invalid or missing encoding declaration" + if filename is not None: + msg = '{} for {!r}'.format(msg, filename) + raise SyntaxError(msg) + + matches = cookie_re.findall(line_string) + if not matches: + return None + encoding = _get_normal_name(matches[0]) + try: + codec = lookup(encoding) + except LookupError: + # This behaviour mimics the Python interpreter + if filename is None: + msg = "unknown encoding: " + encoding + else: + msg = "unknown encoding for {!r}: {}".format(filename, + encoding) + raise SyntaxError(msg) + + if bom_found: + if codec.name != 'utf-8': + # This behaviour mimics the Python interpreter + if filename is None: + msg = 'encoding problem: utf-8' + else: + msg = 'encoding problem for {!r}: utf-8'.format(filename) + raise SyntaxError(msg) + encoding += '-sig' + return encoding + + first = read_or_stop() + if first.startswith(BOM_UTF8): + bom_found = True + first = first[3:] + default = 'utf-8-sig' + if not first: + return default, [] + + encoding = find_cookie(first) + if encoding: + return encoding, [first] + + second = read_or_stop() + if not second: + return default, [first] + + encoding = find_cookie(second) + if encoding: + return encoding, [first, second] + + return default, [first, second] + +# For converting & <-> & etc. +try: + from html import escape +except ImportError: + from cgi import escape +unescape = HTMLParser().unescape + +try: + from collections import ChainMap +except ImportError: # pragma: no cover + from collections import MutableMapping + + try: + from reprlib import recursive_repr as _recursive_repr + except ImportError: + def _recursive_repr(fillvalue='...'): + ''' + Decorator to make a repr function return fillvalue for a recursive + call + ''' + + def decorating_function(user_function): + repr_running = set() + + def wrapper(self): + key = id(self), get_ident() + if key in repr_running: + return fillvalue + repr_running.add(key) + try: + result = user_function(self) + finally: + repr_running.discard(key) + return result + + # Can't use functools.wraps() here because of bootstrap issues + wrapper.__module__ = getattr(user_function, '__module__') + wrapper.__doc__ = getattr(user_function, '__doc__') + wrapper.__name__ = getattr(user_function, '__name__') + wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) + return wrapper + + return decorating_function + + class ChainMap(MutableMapping): + ''' A ChainMap groups multiple dicts (or other mappings) together + to create a single, updateable view. + + The underlying mappings are stored in a list. That list is public and can + accessed or updated using the *maps* attribute. There is no other state. + + Lookups search the underlying mappings successively until a key is found. + In contrast, writes, updates, and deletions only operate on the first + mapping. + + ''' + + def __init__(self, *maps): + '''Initialize a ChainMap by setting *maps* to the given mappings. + If no mappings are provided, a single empty dictionary is used. + + ''' + self.maps = list(maps) or [{}] # always at least one map + + def __missing__(self, key): + raise KeyError(key) + + def __getitem__(self, key): + for mapping in self.maps: + try: + return mapping[key] # can't use 'key in mapping' with defaultdict + except KeyError: + pass + return self.__missing__(key) # support subclasses that define __missing__ + + def get(self, key, default=None): + return self[key] if key in self else default + + def __len__(self): + return len(set().union(*self.maps)) # reuses stored hash values if possible + + def __iter__(self): + return iter(set().union(*self.maps)) + + def __contains__(self, key): + return any(key in m for m in self.maps) + + def __bool__(self): + return any(self.maps) + + @_recursive_repr() + def __repr__(self): + return '{0.__class__.__name__}({1})'.format( + self, ', '.join(map(repr, self.maps))) + + @classmethod + def fromkeys(cls, iterable, *args): + 'Create a ChainMap with a single dict created from the iterable.' + return cls(dict.fromkeys(iterable, *args)) + + def copy(self): + 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' + return self.__class__(self.maps[0].copy(), *self.maps[1:]) + + __copy__ = copy + + def new_child(self): # like Django's Context.push() + 'New ChainMap with a new dict followed by all previous maps.' + return self.__class__({}, *self.maps) + + @property + def parents(self): # like Django's Context.pop() + 'New ChainMap from maps[1:].' + return self.__class__(*self.maps[1:]) + + def __setitem__(self, key, value): + self.maps[0][key] = value + + def __delitem__(self, key): + try: + del self.maps[0][key] + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def popitem(self): + 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' + try: + return self.maps[0].popitem() + except KeyError: + raise KeyError('No keys found in the first mapping.') + + def pop(self, key, *args): + 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' + try: + return self.maps[0].pop(key, *args) + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def clear(self): + 'Clear maps[0], leaving maps[1:] intact.' + self.maps[0].clear() + +try: + from imp import cache_from_source +except ImportError: # pragma: no cover + def cache_from_source(path, debug_override=None): + assert path.endswith('.py') + if debug_override is None: + debug_override = __debug__ + if debug_override: + suffix = 'c' + else: + suffix = 'o' + return path + suffix + +try: + from collections import OrderedDict +except ImportError: # pragma: no cover +## {{{ http://code.activestate.com/recipes/576693/ (r9) +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. + try: + from thread import get_ident as _get_ident + except ImportError: + from dummy_thread import get_ident as _get_ident + + try: + from _abcoll import KeysView, ValuesView, ItemsView + except ImportError: + pass + + + class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running=None): + 'od.__repr__() <==> repr(od)' + if not _repr_running: _repr_running = {} + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/compat.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/compat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad5586f69dcf2b6dbef9533009b771db5f273236 GIT binary patch literal 31683 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/database.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/database.py new file mode 100644 index 0000000000..eb6444a5ee --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/database.py @@ -0,0 +1,1301 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2013 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""PEP 376 implementation.""" + +from __future__ import unicode_literals + +import base64 +import codecs +import hashlib +import logging +import os +import sys +import zipimport + +from . import DistlibException +from .compat import StringIO, configparser, string_types +from .version import get_scheme, UnsupportedVersionError +from .markers import interpret +from .metadata import Metadata +from .util import (parse_requirement, cached_property, get_export_entry, + CSVReader, CSVWriter) + + +__all__ = ['Distribution', 'BaseInstalledDistribution', + 'InstalledDistribution', 'EggInfoDistribution', + 'DistributionPath'] + + +logger = logging.getLogger(__name__) + +DIST_FILES = ('INSTALLER', 'METADATA', 'RECORD', 'REQUESTED', 'RESOURCES', + 'EXPORTS', 'SHARED') + +DISTINFO_EXT = '.dist-info' + + +class _Cache(object): + """ + A simple cache mapping names and .dist-info paths to distributions + """ + def __init__(self): + """ + Initialise an instance. There is normally one for each DistributionPath. + """ + self.name = {} + self.path = {} + self.generated = False + + def clear(self): + """ + Clear the cache, setting it to its initial state. + """ + self.name.clear() + self.path.clear() + self.generated = False + + def add(self, dist): + """ + Add a distribution to the cache. + :param dist: The distribution to add. + """ + if dist.path not in self.path: + self.path[dist.path] = dist + self.name.setdefault(dist.key, []).append(dist) + +class DistributionPath(object): + """ + Represents a set of distributions installed on a path (typically sys.path). + """ + def __init__(self, path=None, include_egg=False): + """ + Create an instance from a path, optionally including legacy (distutils/ + setuptools/distribute) distributions. + :param path: The path to use, as a list of directories. If not specified, + sys.path is used. + :param include_egg: If True, this instance will look for and return legacy + distributions as well as those based on PEP 376. + """ + if path is None: + path = sys.path + self.path = path + self._include_dist = True + self._include_egg = include_egg + + self._cache = _Cache() + self._cache_egg = _Cache() + self._cache_enabled = True + self._scheme = get_scheme('default') + + def _get_cache_enabled(self): + return self._cache_enabled + + def _set_cache_enabled(self, value): + self._cache_enabled = value + + cache_enabled = property(_get_cache_enabled, _set_cache_enabled) + + def clear_cache(self): + """ + Clears the internal cache. + """ + self._cache.clear() + self._cache_egg.clear() + + + def _yield_distributions(self): + """ + Yield .dist-info and/or .egg(-info) distributions. + """ + for path in self.path: + realpath = os.path.realpath(path) + if not os.path.isdir(realpath): + continue + for dir in os.listdir(realpath): + dist_path = os.path.join(realpath, dir) + if self._include_dist and dir.endswith(DISTINFO_EXT): + yield new_dist_class(dist_path, env=self) + elif self._include_egg and dir.endswith(('.egg-info', + '.egg')): + yield old_dist_class(dist_path, self) + + def _generate_cache(self): + """ + Scan the path for distributions and populate the cache with + those that are found. + """ + gen_dist = not self._cache.generated + gen_egg = self._include_egg and not self._cache_egg.generated + if gen_dist or gen_egg: + for dist in self._yield_distributions(): + if isinstance(dist, InstalledDistribution): + self._cache.add(dist) + else: + self._cache_egg.add(dist) + + if gen_dist: + self._cache.generated = True + if gen_egg: + self._cache_egg.generated = True + + @classmethod + def distinfo_dirname(cls, name, version): + """ + The *name* and *version* parameters are converted into their + filename-escaped form, i.e. any ``'-'`` characters are replaced + with ``'_'`` other than the one in ``'dist-info'`` and the one + separating the name from the version number. + + :parameter name: is converted to a standard distribution name by replacing + any runs of non- alphanumeric characters with a single + ``'-'``. + :type name: string + :parameter version: is converted to a standard version string. Spaces + become dots, and all other non-alphanumeric characters + (except dots) become dashes, with runs of multiple + dashes condensed to a single dash. + :type version: string + :returns: directory name + :rtype: string""" + name = name.replace('-', '_') + return '-'.join([name, version]) + DISTINFO_EXT + + + def get_distributions(self): + """ + Provides an iterator that looks for distributions and returns + :class:`InstalledDistribution` or + :class:`EggInfoDistribution` instances for each one of them. + + :rtype: iterator of :class:`InstalledDistribution` and + :class:`EggInfoDistribution` instances + """ + if not self._cache_enabled: + for dist in self._yield_distributions(): + yield dist + else: + self._generate_cache() + + for dist in self._cache.path.values(): + yield dist + + if self._include_egg: + for dist in self._cache_egg.path.values(): + yield dist + + + def get_distribution(self, name): + """ + Looks for a named distribution on the path. + + This function only returns the first result found, as no more than one + value is expected. If nothing is found, ``None`` is returned. + + :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` + or ``None`` + """ + result = None + name = name.lower() + if not self._cache_enabled: + for dist in self._yield_distributions(): + if dist.key == name: + result = dist + break + else: + self._generate_cache() + + if name in self._cache.name: + result = self._cache.name[name][0] + elif self._include_egg and name in self._cache_egg.name: + result = self._cache_egg.name[name][0] + return result + + def provides_distribution(self, name, version=None): + """ + Iterates over all distributions to find which distributions provide *name*. + If a *version* is provided, it will be used to filter the results. + + This function only returns the first result found, since no more than + one values are expected. If the directory is not found, returns ``None``. + + :parameter version: a version specifier that indicates the version + required, conforming to the format in ``PEP-345`` + + :type name: string + :type version: string + """ + matcher = None + if not version is None: + try: + matcher = self._scheme.matcher('%s (%s)' % (name, version)) + except ValueError: + raise DistlibException('invalid name or version: %r, %r' % + (name, version)) + + for dist in self.get_distributions(): + provided = dist.provides + + for p in provided: + p_components = p.rsplit(' ', 1) + if len(p_components) == 1 or matcher is None: + if name == p_components[0]: + yield dist + break + else: + p_name, p_ver = p_components + if len(p_ver) < 2 or p_ver[0] != '(' or p_ver[-1] != ')': + raise DistlibException( + 'distribution %r has invalid Provides field: %r' % + (dist.name, p)) + p_ver = p_ver[1:-1] # trim off the parenthesis + if p_name == name and matcher.match(p_ver): + yield dist + break + + def get_file_path(self, name, relative_path): + """ + Return the path to a resource file. + """ + dist = self.get_distribution(name) + if dist is None: + raise LookupError('no distribution named %r found' % name) + return dist.get_resource_path(relative_path) + + def get_exported_entries(self, category, name=None): + """ + Return all of the exported entries in a particular category. + + :param category: The category to search for entries. + :param name: If specified, only entries with that name are returned. + """ + for dist in self.get_distributions(): + r = dist.exports + if category in r: + d = r[category] + if name is not None: + if name in d: + yield d[name] + else: + for v in d.values(): + yield v + +class Distribution(object): + """ + A base class for distributions, whether installed or from indexes. + Either way, it must have some metadata, so that's all that's needed + for construction. + """ + + build_time_dependency = False + """ + Set to True if it's known to be only a build-time dependency (i.e. + not needed after installation). + """ + + requested = False + """A boolean that indicates whether the ``REQUESTED`` metadata file is + present (in other words, whether the package was installed by user + request or it was installed as a dependency).""" + + def __init__(self, metadata): + """ + Initialise an instance. + :param metadata: The instance of :class:`Metadata` describing this + distribution. + """ + self.metadata = metadata + self.name = metadata.name + self.key = self.name.lower() # for case-insensitive comparisons + self.version = metadata.version + self.locator = None + self.md5_digest = None + self.extras = None # additional features requested during installation + + @property + def download_url(self): + """ + The download URL for this distribution. + """ + return self.metadata.download_url + + @property + def name_and_version(self): + """ + A utility property which displays the name and version in parentheses. + """ + return '%s (%s)' % (self.name, self.version) + + @property + def provides(self): + """ + A set of distribution names and versions provided by this distribution. + :return: A set of "name (version)" strings. + """ + plist = self.metadata['Provides-Dist'] + s = '%s (%s)' % (self.name, self.version) + if s not in plist: + plist.append(s) + return self.filter_requirements(plist) + + @property + def requires(self): + rlist = self.metadata['Requires-Dist'] + return self.filter_requirements(rlist) + + @property + def setup_requires(self): + rlist = self.metadata['Setup-Requires-Dist'] + return self.filter_requirements(rlist) + + @property + def test_requires(self): + rlist = self.metadata['Requires-Dist'] + return self.filter_requirements(rlist, extras=['test']) + + @property + def doc_requires(self): + rlist = self.metadata['Requires-Dist'] + return self.filter_requirements(rlist, extras=['doc']) + + def filter_requirements(self, rlist, context=None, extras=None): + result = set() + marked = [] + for req in rlist: + if ';' not in req: + result.add(req) + else: + marked.append(req.split(';', 1)) + if marked: + if context is None: + context = {} + if extras is None: + extras = self.extras + if not extras: + extras = [None] + else: + extras = list(extras) # leave original alone + extras.append(None) + for extra in extras: + context['extra'] = extra + for r, marker in marked: + if interpret(marker, context): + result.add(r.strip()) + return result + + def matches_requirement(self, req): + """ + Say if this instance matches (fulfills) a requirement. + :param req: The requirement to match. + :rtype req: str + :return: True if it matches, else False. + """ + scheme = get_scheme(self.metadata.scheme) + try: + matcher = scheme.matcher(req) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + result = False + # Note this is similar to code in make_graph - to be refactored + for p in self.provides: + vm = scheme.matcher(p) + if vm.key != name: + continue + version = vm.exact_version + assert version + try: + result = matcher.match(version) + break + except UnsupportedVersionError: + pass + return result + + def __repr__(self): + """ + Return a textual representation of this instance, + """ + if self.download_url: + suffix = ' [%s]' % self.download_url + else: + suffix = '' + return '<Distribution %s (%s)%s>' % (self.name, self.version, suffix) + + def __eq__(self, other): + """ + See if this distribution is the same as another. + :param other: The distribution to compare with. To be equal to one + another. distributions must have the same type, name, + version and download_url. + :return: True if it is the same, else False. + """ + if type(other) is not type(self): + result = False + else: + result = (self.name == other.name and + self.version == other.version and + self.download_url == other.download_url) + return result + + def __hash__(self): + """ + Compute hash in a way which matches the equality test. + """ + return hash(self.name) + hash(self.version) + hash(self.download_url) + + +class BaseInstalledDistribution(Distribution): + """ + This is the base class for installed distributions (whether PEP 376 or + legacy). + """ + + hasher = None + + def __init__(self, metadata, path, env=None): + """ + Initialise an instance. + :param metadata: An instance of :class:`Metadata` which describes the + distribution. This will normally have been initialised + from a metadata file in the ``path``. + :param path: The path of the ``.dist-info`` or ``.egg-info`` + directory for the distribution. + :param env: This is normally the :class:`DistributionPath` + instance where this distribution was found. + """ + super(BaseInstalledDistribution, self).__init__(metadata) + self.path = path + self.dist_path = env + + def get_hash(self, data, hasher=None): + """ + Get the hash of some data, using a particular hash algorithm, if + specified. + + :param data: The data to be hashed. + :type data: bytes + :param hasher: The name of a hash implementation, supported by hashlib, + or ``None``. Examples of valid values are ``'sha1'``, + ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and + ``'sha512'``. If no hasher is specified, the ``hasher`` + attribute of the :class:`InstalledDistribution` instance + is used. If the hasher is determined to be ``None``, MD5 + is used as the hashing algorithm. + :returns: The hash of the data. If a hasher was explicitly specified, + the returned hash will be prefixed with the specified hasher + followed by '='. + :rtype: str + """ + if hasher is None: + hasher = self.hasher + if hasher is None: + hasher = hashlib.md5 + prefix = '' + else: + hasher = getattr(hashlib, hasher) + prefix = '%s=' % self.hasher + digest = hasher(data).digest() + digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') + return '%s%s' % (prefix, digest) + +class InstalledDistribution(BaseInstalledDistribution): + """Created with the *path* of the ``.dist-info`` directory provided to the + constructor. It reads the metadata contained in ``METADATA`` when it is + instantiated., or uses a passed in Metadata instance (useful for when + dry-run mode is being used).""" + + hasher = 'sha256' + + def __init__(self, path, metadata=None, env=None): + if env and env._cache_enabled and path in env._cache.path: + metadata = env._cache.path[path].metadata + elif metadata is None: + metadata_path = os.path.join(path, 'METADATA') + metadata = Metadata(path=metadata_path, scheme='legacy') + + super(InstalledDistribution, self).__init__(metadata, path, env) + + if env and env._cache_enabled: + env._cache.add(self) + + path = self.get_distinfo_file('REQUESTED') + self.requested = os.path.exists(path) + + def __repr__(self): + return '<InstalledDistribution %r %s at %r>' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def _get_records(self): + """ + Get the list of installed files for the distribution + :return: A list of tuples of path, hash and size. Note that hash and + size might be ``None`` for some entries. The path is exactly + as stored in the file (which is as in PEP 376). + """ + results = [] + path = self.get_distinfo_file('RECORD') + with CSVReader(path) as record_reader: + # Base location is parent dir of .dist-info dir + #base_location = os.path.dirname(self.path) + #base_location = os.path.abspath(base_location) + for row in record_reader: + missing = [None for i in range(len(row), 3)] + path, checksum, size = row + missing + #if not os.path.isabs(path): + # path = path.replace('/', os.sep) + # path = os.path.join(base_location, path) + results.append((path, checksum, size)) + return results + + @cached_property + def exports(self): + """ + Return the information exported by this distribution. + :return: A dictionary of exports, mapping an export category to a list + of :class:`ExportEntry` instances describing the individual + export entries. + """ + result = {} + rf = self.get_distinfo_file('EXPORTS') + if os.path.exists(rf): + result = self.read_exports(rf) + return result + + def read_exports(self, filename=None): + """ + Read exports data from a file in .ini format. + :param filename: An absolute pathname of the file to read. If not + specified, the EXPORTS file in the .dist-info + directory of the distribution is read. + :return: A dictionary of exports, mapping an export category to a list + of :class:`ExportEntry` instances describing the individual + export entries. + """ + result = {} + rf = filename or self.get_distinfo_file('EXPORTS') + if os.path.exists(rf): + cp = configparser.ConfigParser() + cp.read(rf) + for key in cp.sections(): + result[key] = entries = {} + for name, value in cp.items(key): + s = '%s = %s' % (name, value) + entry = get_export_entry(s) + assert entry is not None + entry.dist = self + entries[name] = entry + return result + + def write_exports(self, exports, filename=None): + """ + Write a dictionary of exports to a file in .ini format. + :param exports: A dictionary of exports, mapping an export category to + a list of :class:`ExportEntry` instances describing the + individual export entries. + :param filename: The absolute pathname of the file to write to. If not + specified, the EXPORTS file in the .dist-info + directory is written to. + """ + rf = filename or self.get_distinfo_file('EXPORTS') + cp = configparser.ConfigParser() + for k, v in exports.items(): + # TODO check k, v for valid values + cp.add_section(k) + for entry in v.values(): + if entry.suffix is None: + s = entry.prefix + else: + s = '%s:%s' % (entry.prefix, entry.suffix) + if entry.flags: + s = '%s [%s]' % (s, ', '.join(entry.flags)) + cp.set(k, entry.name, s) + with open(rf, 'w') as f: + cp.write(f) + + def get_resource_path(self, relative_path): + """ + NOTE: This API may change in the future. + + Return the absolute path to a resource file with the given relative + path. + + :param relative_path: The path, relative to .dist-info, of the resource + of interest. + :return: The absolute path where the resource is to be found. + """ + path = self.get_distinfo_file('RESOURCES') + with CSVReader(path) as resources_reader: + for relative, destination in resources_reader: + if relative == relative_path: + return destination + raise KeyError('no resource file with relative path %r ' + 'is installed' % relative_path) + + def list_installed_files(self): + """ + Iterates over the ``RECORD`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: iterator of (path, hash, size) + """ + for result in self._get_records(): + yield result + + def write_installed_files(self, paths, prefix, dry_run=False): + """ + Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any + existing ``RECORD`` file is silently overwritten. + + prefix is used to determine when to write absolute paths. + """ + prefix = os.path.join(prefix, '') + base = os.path.dirname(self.path) + base_under_prefix = base.startswith(prefix) + base = os.path.join(base, '') + record_path = os.path.join(self.path, 'RECORD') + logger.info('creating %s', record_path) + if dry_run: + return + with CSVWriter(record_path) as writer: + for path in paths: + if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): + # do not put size and hash, as in PEP-376 + hash_value = size = '' + else: + size = '%d' % os.path.getsize(path) + with open(path, 'rb') as fp: + hash_value = self.get_hash(fp.read()) + if path.startswith(base) or (base_under_prefix and + path.startswith(prefix)): + path = os.path.relpath(path, base) + writer.writerow((path, hash_value, size)) + + # add the RECORD file itself + if record_path.startswith(base): + record_path = os.path.relpath(record_path, base) + writer.writerow((record_path, '', '')) + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + base = os.path.dirname(self.path) + record_path = os.path.join(self.path, 'RECORD') + for path, hash_value, size in self.list_installed_files(): + if not os.path.isabs(path): + path = os.path.join(base, path) + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + elif os.path.isfile(path): + actual_size = str(os.path.getsize(path)) + if size and actual_size != size: + mismatches.append((path, 'size', size, actual_size)) + elif hash_value: + if '=' in hash_value: + hasher = hash_value.split('=', 1)[0] + else: + hasher = None + + with open(path, 'rb') as f: + actual_hash = self.get_hash(f.read(), hasher) + if actual_hash != hash_value: + mismatches.append((path, 'hash', hash_value, actual_hash)) + return mismatches + + @cached_property + def shared_locations(self): + """ + A dictionary of shared locations whose keys are in the set 'prefix', + 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. + The corresponding value is the absolute path of that category for + this distribution, and takes into account any paths selected by the + user at installation time (e.g. via command-line arguments). In the + case of the 'namespace' key, this would be a list of absolute paths + for the roots of namespace packages in this distribution. + + The first time this property is accessed, the relevant information is + read from the SHARED file in the .dist-info directory. + """ + result = {} + shared_path = os.path.join(self.path, 'SHARED') + if os.path.isfile(shared_path): + with codecs.open(shared_path, 'r', encoding='utf-8') as f: + lines = f.read().splitlines() + for line in lines: + key, value = line.split('=', 1) + if key == 'namespace': + result.setdefault(key, []).append(value) + else: + result[key] = value + return result + + def write_shared_locations(self, paths, dry_run=False): + """ + Write shared location information to the SHARED file in .dist-info. + :param paths: A dictionary as described in the documentation for + :meth:`shared_locations`. + :param dry_run: If True, the action is logged but no file is actually + written. + :return: The path of the file written to. + """ + shared_path = os.path.join(self.path, 'SHARED') + logger.info('creating %s', shared_path) + if dry_run: + return + lines = [] + for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): + path = paths[key] + if os.path.isdir(paths[key]): + lines.append('%s=%s' % (key, path)) + for ns in paths.get('namespace', ()): + lines.append('namespace=%s' % ns) + + with codecs.open(shared_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + return shared_path + + def get_distinfo_file(self, path): + """ + Returns a path located under the ``.dist-info`` directory. Returns a + string representing the path. + + :parameter path: a ``'/'``-separated path relative to the + ``.dist-info`` directory or an absolute path; + If *path* is an absolute path and doesn't start + with the ``.dist-info`` directory path, + a :class:`DistlibException` is raised + :type path: string + :rtype: str + """ + # Check if it is an absolute path # XXX use relpath, add tests + if path.find(os.sep) >= 0: + # it's an absolute path? + distinfo_dirname, path = path.split(os.sep)[-2:] + if distinfo_dirname != self.path.split(os.sep)[-1]: + raise DistlibException( + 'dist-info file %r does not belong to the %r %s ' + 'distribution' % (path, self.name, self.version)) + + # The file must be relative + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: %r' % + path) + + return os.path.join(self.path, path) + + def list_distinfo_files(self): + """ + Iterates over the ``RECORD`` entries and returns paths for each line if + the path is pointing to a file located in the ``.dist-info`` directory + or one of its subdirectories. + + :returns: iterator of paths + """ + base = os.path.dirname(self.path) + for path, checksum, size in self._get_records(): + # XXX add separator or use real relpath algo + if not os.path.isabs(path): + path = os.path.join(base, path) + if path.startswith(self.path): + yield path + + def __eq__(self, other): + return (isinstance(other, InstalledDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + + +class EggInfoDistribution(BaseInstalledDistribution): + """Created with the *path* of the ``.egg-info`` directory or file provided + to the constructor. It reads the metadata contained in the file itself, or + if the given path happens to be a directory, the metadata is read from the + file ``PKG-INFO`` under that directory.""" + + requested = True # as we have no way of knowing, assume it was + shared_locations = {} + + def __init__(self, path, env=None): + def set_name_and_version(s, n, v): + s.name = n + s.key = n.lower() # for case-insensitive comparisons + s.version = v + + self.path = path + self.dist_path = env + if env and env._cache_enabled and path in env._cache_egg.path: + metadata = env._cache_egg.path[path].metadata + set_name_and_version(self, metadata['Name'], metadata['Version']) + else: + metadata = self._get_metadata(path) + + # Need to be set before caching + set_name_and_version(self, metadata['Name'], metadata['Version']) + + if env and env._cache_enabled: + env._cache_egg.add(self) + super(EggInfoDistribution, self).__init__(metadata, path, env) + + def _get_metadata(self, path): + requires = None + + def parse_requires(req_path): + """Create a list of dependencies from a requires.txt file. + + *req_path* must be the path to a setuptools-produced requires.txt file. + """ + + reqs = [] + try: + with open(req_path, 'r') as fp: + lines = fp.read().splitlines() + except IOError: + return reqs + + for line in lines: + line = line.strip() + if line.startswith('['): + logger.warning('Unexpected line: quitting requirement scan: %r', + line) + break + r = parse_requirement(line) + if not r: + logger.warning('Not recognised as a requirement: %r', line) + continue + if r.extras: + logger.warning('extra requirements in requires.txt are ' + 'not supported') + if not r.constraints: + reqs.append(r.name) + else: + cons = ', '.join('%s%s' % c for c in r.constraints) + reqs.append('%s (%s)' % (r.name, cons)) + return reqs + + if path.endswith('.egg'): + if os.path.isdir(path): + meta_path = os.path.join(path, 'EGG-INFO', 'PKG-INFO') + metadata = Metadata(path=meta_path, scheme='legacy') + req_path = os.path.join(path, 'EGG-INFO', 'requires.txt') + requires = parse_requires(req_path) + else: + # FIXME handle the case where zipfile is not available + zipf = zipimport.zipimporter(path) + fileobj = StringIO( + zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) + metadata = Metadata(fileobj=fileobj, scheme='legacy') + try: + requires = zipf.get_data('EGG-INFO/requires.txt') + except IOError: + requires = None + elif path.endswith('.egg-info'): + if os.path.isdir(path): + path = os.path.join(path, 'PKG-INFO') + req_path = os.path.join(path, 'requires.txt') + requires = parse_requires(req_path) + metadata = Metadata(path=path, scheme='legacy') + else: + raise DistlibException('path must end with .egg-info or .egg, ' + 'got %r' % path) + + if requires: + if metadata['Metadata-Version'] == '1.1': + # we can't have 1.1 metadata *and* Setuptools requires + for field in ('Obsoletes', 'Requires', 'Provides'): + if field in metadata: + del metadata[field] + metadata['Requires-Dist'] += requires + return metadata + + def __repr__(self): + return '<EggInfoDistribution %r %s at %r>' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + for path, hash, size in self.list_installed_files(): + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + return mismatches + + def list_installed_files(self, local=False): + """ + Iterates over the ``installed-files.txt`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: a list of (path, hash, size) + """ + + def _md5(path): + f = open(path, 'rb') + try: + content = f.read() + finally: + f.close() + return hashlib.md5(content).hexdigest() + + def _size(path): + return os.stat(path).st_size + + record_path = os.path.join(self.path, 'installed-files.txt') + result = [] + if os.path.exists(record_path): + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + p = os.path.normpath(os.path.join(self.path, line)) + # "./" is present as a marker between installed files + # and installation metadata files + if not os.path.exists(p): + logger.warning('Non-existent file: %s', p) + if p.endswith(('.pyc', '.pyo')): + continue + #otherwise fall through and fail + if not os.path.isdir(p): + result.append((p, _md5(p), _size(p))) + result.append((record_path, None, None)) + return result + + def list_distinfo_files(self, local=False): + """ + Iterates over the ``installed-files.txt`` entries and returns paths for + each line if the path is pointing to a file located in the + ``.egg-info`` directory or one of its subdirectories. + + :parameter local: If *local* is ``True``, each returned path is + transformed into a local absolute path. Otherwise the + raw value from ``installed-files.txt`` is returned. + :type local: boolean + :returns: iterator of paths + """ + record_path = os.path.join(self.path, 'installed-files.txt') + skip = True + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line == './': + skip = False + continue + if not skip: + p = os.path.normpath(os.path.join(self.path, line)) + if p.startswith(self.path): + if local: + yield p + else: + yield line + + def __eq__(self, other): + return (isinstance(other, EggInfoDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + +new_dist_class = InstalledDistribution +old_dist_class = EggInfoDistribution + + +class DependencyGraph(object): + """ + Represents a dependency graph between distributions. + + The dependency relationships are stored in an ``adjacency_list`` that maps + distributions to a list of ``(other, label)`` tuples where ``other`` + is a distribution and the edge is labeled with ``label`` (i.e. the version + specifier, if such was provided). Also, for more efficient traversal, for + every distribution ``x``, a list of predecessors is kept in + ``reverse_list[x]``. An edge from distribution ``a`` to + distribution ``b`` means that ``a`` depends on ``b``. If any missing + dependencies are found, they are stored in ``missing``, which is a + dictionary that maps distributions to a list of requirements that were not + provided by any other distributions. + """ + + def __init__(self): + self.adjacency_list = {} + self.reverse_list = {} + self.missing = {} + + def add_distribution(self, distribution): + """Add the *distribution* to the graph. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + """ + self.adjacency_list[distribution] = [] + self.reverse_list[distribution] = [] + #self.missing[distribution] = [] + + def add_edge(self, x, y, label=None): + """Add an edge from distribution *x* to distribution *y* with the given + *label*. + + :type x: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type y: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type label: ``str`` or ``None`` + """ + self.adjacency_list[x].append((y, label)) + # multiple edges are allowed, so be careful + if x not in self.reverse_list[y]: + self.reverse_list[y].append(x) + + def add_missing(self, distribution, requirement): + """ + Add a missing *requirement* for the given *distribution*. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + :type requirement: ``str`` + """ + logger.debug('%s missing %r', distribution, requirement) + self.missing.setdefault(distribution, []).append(requirement) + + def _repr_dist(self, dist): + return '%s %s' % (dist.name, dist.version) + + def repr_node(self, dist, level=1): + """Prints only a subgraph""" + output = [self._repr_dist(dist)] + for other, label in self.adjacency_list[dist]: + dist = self._repr_dist(other) + if label is not None: + dist = '%s [%s]' % (dist, label) + output.append(' ' * level + str(dist)) + suboutput = self.repr_node(other, level + 1) + subs = suboutput.split('\n') + output.extend(subs[1:]) + return '\n'.join(output) + + def to_dot(self, f, skip_disconnected=True): + """Writes a DOT output for the graph to the provided file *f*. + + If *skip_disconnected* is set to ``True``, then all distributions + that are not dependent on any other distribution are skipped. + + :type f: has to support ``file``-like operations + :type skip_disconnected: ``bool`` + """ + disconnected = [] + + f.write("digraph dependencies {\n") + for dist, adjs in self.adjacency_list.items(): + if len(adjs) == 0 and not skip_disconnected: + disconnected.append(dist) + for other, label in adjs: + if not label is None: + f.write('"%s" -> "%s" [label="%s"]\n' % + (dist.name, other.name, label)) + else: + f.write('"%s" -> "%s"\n' % (dist.name, other.name)) + if not skip_disconnected and len(disconnected) > 0: + f.write('subgraph disconnected {\n') + f.write('label = "Disconnected"\n') + f.write('bgcolor = red\n') + + for dist in disconnected: + f.write('"%s"' % dist.name) + f.write('\n') + f.write('}\n') + f.write('}\n') + + def topological_sort(self): + """ + Perform a topological sort of the graph. + :return: A tuple, the first element of which is a topologically sorted + list of distributions, and the second element of which is a + list of distributions that cannot be sorted because they have + circular dependencies and so form a cycle. + """ + result = [] + # Make a shallow copy of the adjacency list + alist = {} + for k, v in self.adjacency_list.items(): + alist[k] = v[:] + while True: + # See what we can remove in this run + to_remove = [] + for k, v in list(alist.items())[:]: + if not v: + to_remove.append(k) + del alist[k] + if not to_remove: + # What's left in alist (if anything) is a cycle. + break + # Remove from the adjacency list of others + for k, v in alist.items(): + alist[k] = [(d, r) for d, r in v if d not in to_remove] + logger.debug('Moving to result: %s', + ['%s (%s)' % (d.name, d.version) for d in to_remove]) + result.extend(to_remove) + return result, list(alist.keys()) + + def __repr__(self): + """Representation of the graph""" + output = [] + for dist, adjs in self.adjacency_list.items(): + output.append(self.repr_node(dist)) + return '\n'.join(output) + + +def make_graph(dists, scheme='default'): + """Makes a dependency graph from the given distributions. + + :parameter dists: a list of distributions + :type dists: list of :class:`distutils2.database.InstalledDistribution` and + :class:`distutils2.database.EggInfoDistribution` instances + :rtype: a :class:`DependencyGraph` instance + """ + scheme = get_scheme(scheme) + graph = DependencyGraph() + provided = {} # maps names to lists of (version, dist) tuples + + # first, build the graph and find out what's provided + for dist in dists: + graph.add_distribution(dist) + + for p in dist.provides: + comps = p.strip().rsplit(" ", 1) + name = comps[0] + version = None + if len(comps) == 2: + version = comps[1] + if len(version) < 3 or version[0] != '(' or version[-1] != ')': + logger.warning('distribution %r has ill-formed ' + 'provides field: %r', dist.name, p) + continue + # don't raise an exception. Legacy installed distributions + # could have all manner of metadata + #raise DistlibException('distribution %r has ill-formed ' + # 'provides field: %r' % (dist.name, p)) + version = version[1:-1] # trim off parenthesis + # Add name in lower case for case-insensitivity + name = name.lower() + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + provided.setdefault(name, []).append((version, dist)) + + # now make the edges + for dist in dists: + requires = (dist.requires | dist.setup_requires) + for req in requires: + try: + matcher = scheme.matcher(req) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + matched = False + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + graph.add_edge(dist, provider, req) + matched = True + break + if not matched: + graph.add_missing(dist, req) + return graph + + +def get_dependent_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + dependent on *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + dep = [dist] # dependent distributions + todo = graph.reverse_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop() + dep.append(d) + for succ in graph.reverse_list[d]: + if succ not in dep: + todo.append(succ) + + dep.pop(0) # remove dist from dep, was there to prevent infinite loops + return dep + +def get_required_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + required by *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + req = [] # required distributions + todo = graph.adjacency_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop()[0] + req.append(d) + for pred in graph.adjacency_list[d]: + if pred not in req: + todo.append(pred) + + return req + +def make_dist(name, version, **kwargs): + """ + A convenience method for making a dist given just a name and version. + """ + md = Metadata(**kwargs) + md['Name'] = name + md['Version'] = version + return Distribution(md) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/database.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/database.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80eeaad3fc5c5d4d2ee08bcf4d9eed14108492b7 GIT binary patch literal 52143 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 Z&mQ>Q==_0S<lN|iADW(>JUn^m{{`>g4t)Rs literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/index.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/index.py new file mode 100644 index 0000000000..282f6b7455 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/index.py @@ -0,0 +1,515 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import hashlib +import itertools +import logging +import os +import shutil +import socket +from string import ascii_lowercase +import subprocess +import tempfile +from threading import Thread + +from distlib import DistlibException +from distlib.compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, + urlparse, build_opener) +from distlib.util import cached_property, zip_dir + +logger = logging.getLogger(__name__) + +DEFAULT_MIRROR_HOST = 'last.pypi.python.org' +DEFAULT_INDEX = 'http://pypi.python.org/pypi' +DEFAULT_REALM = 'pypi' + +class PackageIndex(object): + """ + This class represents a package index compatible with PyPI, the Python + Package Index. + """ + + boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' + + def __init__(self, url=None, mirror_host=None): + """ + Initialise an instance. + + :param url: The URL of the index. If not specified, the URL for PyPI is + used. + :param mirror_host: If not specified, ``last.pypi.python.org`` is used. + This is expected to have a canonial name which + allows all mirror hostnames to be divined (e.g. if + the canonical hostname for ``last.pypi.python.org`` + is ``g.pypi.python.org``, then the mirrors that are + available would be assumed to be + ``a.pypi.python.org``, ``b.pypi.python.org``, ... + up to and including ``g.pypi.python.org``. + """ + self.url = url or DEFAULT_INDEX + self.mirror_host = mirror_host or DEFAULT_MIRROR_HOST + self.read_configuration() + scheme, netloc, path, params, query, frag = urlparse(self.url) + if params or query or frag or scheme not in ('http', 'https'): + raise DistlibException('invalid repository: %s' % self.url) + self.password_handler = None + self.ssl_verifier = None + self.gpg = None + self.gpg_home = None + with open(os.devnull, 'w') as sink: + for s in ('gpg2', 'gpg'): + try: + rc = subprocess.check_call([s, '--version'], stdout=sink, + stderr=sink) + if rc == 0: + self.gpg = s + break + except OSError: + pass + + def _get_pypirc_command(self): + """ + Get the distutils command for interacting with PyPI configurations. + :return: the command. + """ + from distutils.core import Distribution + from distutils.config import PyPIRCCommand + d = Distribution() + return PyPIRCCommand(d) + + def read_configuration(self): + """ + Read the PyPI access configuration as supported by distutils, getting + PyPI to do the acutal work. This populates ``username``, ``password``, + ``realm`` and ``url`` attributes from the configuration. + """ + # get distutils to do the work + c = self._get_pypirc_command() + c.repository = self.url + cfg = c._read_pypirc() + self.username = cfg.get('username') + self.password = cfg.get('password') + self.realm = cfg.get('realm', 'pypi') + self.url = cfg.get('repository', self.url) + + def save_configuration(self): + """ + Save the PyPI access configuration. You must have set ``username`` and + ``password`` attributes before calling this method. + + Again, distutils is used to do the actual work. + """ + self.check_credentials() + # get distutils to do the work + c = self._get_pypirc_command() + c._store_pypirc(self.username, self.password) + + def check_credentials(self): + """ + Check that ``username`` and ``password`` have been set, and raise an + exception if not. + """ + if self.username is None or self.password is None: + raise DistlibException('username and password must be set') + pm = HTTPPasswordMgr() + _, netloc, _, _, _, _ = urlparse(self.url) + pm.add_password(self.realm, netloc, self.username, self.password) + self.password_handler = HTTPBasicAuthHandler(pm) + + def register(self, metadata): + """ + Register a distribution on PyPI, using the provided metadata. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the distribution to be + registered. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + missing, warnings = metadata.check(True) # strict check + logger.debug('result of check: missing: %s, warnings: %s', + missing, warnings) + d = metadata.todict(True) + d[':action'] = 'verify' + request = self.encode_request(d.items(), []) + response = self.send_request(request) + d[':action'] = 'submit' + request = self.encode_request(d.items(), []) + return self.send_request(request) + + def _reader(self, name, stream, outbuf): + """ + Thread runner for reading lines of from a subprocess into a buffer. + + :param name: The logical name of the stream (used for logging only). + :param stream: The stream to read from. This will typically a pipe + connected to the output stream of a subprocess. + :param outbuf: The list to append the read lines to. + """ + while True: + s = stream.readline() + if not s: + break + s = s.decode('utf-8').rstrip() + outbuf.append(s) + logger.debug('%s: %s' % (name, s)) + stream.close() + + def get_sign_command(self, filename, signer, sign_password): + """ + Return a suitable command for signing a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :return: The signing command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if self.gpg_home: + cmd.extend(['--homedir', self.gpg_home]) + if sign_password is not None: + cmd.extend(['--batch', '--passphrase-fd', '0']) + td = tempfile.mkdtemp() + sf = os.path.join(td, os.path.basename(filename) + '.asc') + cmd.extend(['--detach-sign', '--armor', '--local-user', + signer, '--output', sf, filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd, sf + + def run_command(self, cmd, input_data=None): + """ + Run a command in a child process , passing it any input data specified. + + :param cmd: The command to run. + :param input_data: If specified, this must be a byte string containing + data to be sent to the child process. + :return: A tuple consisting of the subprocess' exit code, a list of + lines read from the subprocess' ``stdout``, and a list of + lines read from the subprocess' ``stderr``. + """ + kwargs = { + 'stdout': subprocess.PIPE, + 'stderr': subprocess.PIPE, + } + if input_data is not None: + kwargs['stdin'] = subprocess.PIPE + stdout = [] + stderr = [] + p = subprocess.Popen(cmd, **kwargs) + # We don't use communicate() here because we may need to + # get clever with interacting with the command + t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) + t1.start() + t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) + t2.start() + if input_data is not None: + p.stdin.write(input_data) + p.stdin.close() + + p.wait() + t1.join() + t2.join() + return p.returncode, stdout, stderr + + def sign_file(self, filename, signer, sign_password): + """ + Sign a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :return: The absolute pathname of the file where the signature is + stored. + """ + cmd, sig_file = self.get_sign_command(filename, signer, sign_password) + rc, stdout, stderr = self.run_command(cmd, + sign_password.encode('utf-8')) + if rc != 0: + raise DistlibException('sign command failed with error ' + 'code %s' % rc) + return sig_file + + def upload_file(self, metadata, filename, signer=None, sign_password=None, + filetype='sdist', pyversion='source'): + """ + Upload a release file to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the file to be uploaded. + :param filename: The pathname of the file to be uploaded. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param filetype: The type of the file being uploaded. This is the + distutils command which produced that file, e.g. + ``sdist`` or ``bdist_wheel``. + :param pyversion: The version of Python which the release relates + to. For code compatible with any Python, this would + be ``source``, otherwise it would be e.g. ``3.2``. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.exists(filename): + raise DistlibException('not found: %s' % filename) + missing, warnings = metadata.check(True) # strict check + logger.debug('result of check: missing: %s, warnings: %s', + missing, warnings) + d = metadata.todict(True) + sig_file = None + if signer: + if not self.gpg: + logger.warning('no signing program available - not signed') + else: + sig_file = self.sign_file(filename, signer, sign_password) + with open(filename, 'rb') as f: + file_data = f.read() + digest = hashlib.md5(file_data).hexdigest() + d.update({ + ':action': 'file_upload', + 'protcol_version': '1', + 'filetype': filetype, + 'pyversion': pyversion, + 'md5_digest': digest, + }) + files = [('content', os.path.basename(filename), file_data)] + if sig_file: + with open(sig_file, 'rb') as f: + sig_data = f.read() + files.append(('gpg_signature', os.path.basename(sig_file), + sig_data)) + shutil.rmtree(os.path.dirname(sig_file)) + logger.debug('files: %s', files) + request = self.encode_request(d.items(), files) + return self.send_request(request) + + def upload_documentation(self, metadata, doc_dir): + """ + Upload documentation to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the documentation to be + uploaded. + :param doc_dir: The pathname of the directory which contains the + documentation. This should be the directory that + contains the ``index.html`` for the documentation. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.isdir(doc_dir): + raise DistlibException('not a directory: %r' % doc_dir) + fn = os.path.join(doc_dir, 'index.html') + if not os.path.exists(fn): + raise DistlibException('not found: %r' % fn) + missing, warnings = metadata.check(True) # strict check + logger.debug('result of check: missing: %s, warnings: %s', + missing, warnings) + name, version = metadata.name, metadata.version + zip_data = zip_dir(doc_dir).getvalue() + fields = [(':action', 'doc_upload'), + ('name', name), ('version', version)] + files = [('content', name, zip_data)] + request = self.encode_request(fields, files) + return self.send_request(request) + + def get_verify_command(self, signature_filename, data_filename): + """ + Return a suitable command for verifying a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :return: The verifying command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if self.gpg_home: + cmd.extend(['--homedir', self.gpg_home]) + cmd.extend(['--verify', signature_filename, data_filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd + + def verify_signature(self, signature_filename, data_filename): + """ + Verify a signature for a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :return: True if the signature was verified, else False. + """ + if not self.gpg: + raise DistlibException('verification unavailable because gpg ' + 'unavailable') + cmd = self.get_verify_command(signature_filename, data_filename) + rc, stdout, stderr = self.run_command(cmd) + if rc not in (0, 1): + raise DistlibException('verify command failed with error ' + 'code %s' % rc) + return rc == 0 + + def download_file(self, url, destfile, digest=None, reporthook=None): + """ + This is a convenience method for downloading a file from an URL. + Normally, this will be a file from the index, though currently + no check is made for this (i.e. a file can be downloaded from + anywhere). + + The method is just like the :func:`urlretrieve` function in the + standard library, except that it allows digest computation to be + done during download and checking that the downloaded data + matched any expected value. + + :param url: The URL of the file to be downloaded (assumed to be + available via an HTTP GET request). + :param destfile: The pathname where the downloaded file is to be + saved. + :param digest: If specified, this must be a (hasher, value) + tuple, where hasher is the algorithm used (e.g. + ``'md5'``) and ``value`` is the expected value. + :param reporthook: The same as for :func:`urlretrieve` in the + standard library. + """ + if digest is None: + digester = None + else: + if isinstance(digest, (list, tuple)): + hasher, digest = digest + else: + hasher = 'md5' + digester = getattr(hashlib, hasher)() + # The following code is equivalent to urlretrieve. + # We need to do it this way so that we can compute the + # digest of the file as we go. + with open(destfile, 'wb') as dfp: + # addinfourl is not a context manager on 2.x + # so we have to use try/finally + sfp = self.send_request(Request(url)) + try: + headers = sfp.info() + blocksize = 8192 + size = -1 + read = 0 + blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) + if reporthook: + reporthook(blocknum, blocksize, size) + while True: + block = sfp.read(blocksize) + if not block: + break + read += len(block) + dfp.write(block) + if digester: + digester.update(block) + blocknum += 1 + if reporthook: + reporthook(blocknum, blocksize, size) + finally: + sfp.close() + + # check that we got the whole file, if we can + if size >= 0 and read < size: + raise DistlibException( + 'retrieval incomplete: got only %d out of %d bytes' + % (read, size)) + # if we have a digest, it must match. + if digester: + actual = digester.hexdigest() + if digest != actual: + raise DistlibException('MD5 digest mismatch for %s: expected ' + '%s, got %s' % (destfile, digest, + actual)) + + def send_request(self, req): + """ + Send a standard library :class:`Request` to PyPI and return its + response. + + :param req: The request to send. + :return: The HTTP response from PyPI (a standard library HTTPResponse). + """ + handlers = [] + if self.password_handler: + handlers.append(self.password_handler) + if self.ssl_verifier: + handlers.append(self.ssl_verifier) + opener = build_opener(*handlers) + return opener.open(req) + + def encode_request(self, fields, files): + """ + Encode fields and files for posting to an HTTP server. + + :param fields: The fields to send as a list of (fieldname, value) + tuples. + :param files: The files to send as a list of (fieldname, filename, + file_bytes) tuple. + """ + # Adapted from packaging, which in turn was adapted from + # http://code.activestate.com/recipes/146306 + + parts = [] + boundary = self.boundary + for k, values in fields: + if not isinstance(values, (list, tuple)): + values = [values] + + for v in values: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"' % + k).encode('utf-8'), + b'', + v.encode('utf-8'))) + for key, filename, value in files: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"; filename="%s"' % + (key, filename)).encode('utf-8'), + b'', + value)) + + parts.extend((b'--' + boundary + b'--', b'')) + + body = b'\r\n'.join(parts) + ct = b'multipart/form-data; boundary=' + boundary + headers = { + 'Content-type': ct, + 'Content-length': str(len(body)) + } + return Request(self.url, body, headers) + + @cached_property + def mirrors(self): + """ + Return the list of hostnames which are mirrors for this index. + :return: A (possibly empty) list of hostnames of mirrors. + """ + result = [] + try: + host = socket.gethostbyname_ex(self.mirror_host)[0] + except socket.gaierror: # pragma: no cover + host = None + if host: + last, rest = host.split('.', 1) + n = len(last) + host_list = (''.join(w) for w in itertools.chain.from_iterable( + itertools.product(ascii_lowercase, repeat=i) + for i in range(1, n + 1))) + for s in host_list: + result.append('.'.join((s, rest))) + if s == last: + break + return result diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/index.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/index.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b8be972bda7e634f1f526cea2de8f290d7b4edd GIT binary patch literal 21368 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 C7@zb2 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/locators.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/locators.py new file mode 100644 index 0000000000..3dab8a2fcb --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/locators.py @@ -0,0 +1,1131 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# + +import gzip +from io import BytesIO +import json +import logging +import os +import posixpath +import re +import threading +import zlib + +from . import DistlibException +from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, + queue, quote, unescape, string_types, build_opener, + HTTPRedirectHandler as BaseRedirectHandler, + Request, HTTPError, URLError) +from .database import Distribution, DistributionPath, make_dist +from .metadata import Metadata +from .util import (cached_property, parse_credentials, ensure_slash, + split_filename, get_project_data, parse_requirement, + ServerProxy) +from .version import get_scheme, UnsupportedVersionError +from .wheel import Wheel, is_compatible + +logger = logging.getLogger(__name__) + +MD5_HASH = re.compile('^md5=([a-f0-9]+)$') +CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I) +HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') +DEFAULT_INDEX = 'http://python.org/pypi' + +def get_all_distribution_names(url=None): + """ + Return all distribution names known by an index. + :param url: The URL of the index. + :return: A list of all known distribution names. + """ + if url is None: + url = DEFAULT_INDEX + client = ServerProxy(url, timeout=3.0) + return client.list_packages() + +class RedirectHandler(BaseRedirectHandler): + """ + A class to work around a bug in some Python 3.2.x releases. + """ + # There's a bug in the base version for some 3.2.x + # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header + # returns e.g. /abc, it bails because it says the scheme '' + # is bogus, when actually it should use the request's + # URL for the scheme. See Python issue #13696. + def http_error_302(self, req, fp, code, msg, headers): + # Some servers (incorrectly) return multiple Location headers + # (so probably same goes for URI). Use first header. + newurl = None + for key in ('location', 'uri'): + if key in headers: + newurl = headers[key] + break + if newurl is None: + return + urlparts = urlparse(newurl) + if urlparts.scheme == '': + newurl = urljoin(req.get_full_url(), newurl) + if hasattr(headers, 'replace_header'): + headers.replace_header(key, newurl) + else: + headers[key] = newurl + return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, + headers) + + http_error_301 = http_error_303 = http_error_307 = http_error_302 + +class Locator(object): + """ + A base class for locators - things that locate distributions. + """ + source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') + binary_extensions = ('.egg', '.exe', '.whl') + excluded_extensions = ('.pdf',) + + # A list of tags indicating which wheels you want to match. The default + # value of None matches against the tags compatible with the running + # Python. If you want to match other values, set wheel_tags on a locator + # instance to a list of tuples (pyver, abi, arch) which you want to match. + wheel_tags = None + + downloadable_extensions = source_extensions + ('.whl',) + + def __init__(self, scheme='default'): + """ + Initialise an instance. + :param scheme: Because locators look for most recent versions, they + need to know the version scheme to use. This specifies + the current PEP-recommended scheme - use ``'legacy'`` + if you need to support existing distributions on PyPI. + """ + self._cache = {} + self.scheme = scheme + # Because of bugs in some of the handlers on some of the platforms, + # we use our own opener rather than just using urlopen. + self.opener = build_opener(RedirectHandler()) + + def clear_cache(self): + self._cache.clear() + + def _get_scheme(self): + return self._scheme + + def _set_scheme(self, value): + self._scheme = value + + scheme = property(_get_scheme, _set_scheme) + + def _get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This should be implemented in subclasses. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This calls _get_project to do all the work, and just implements a caching layer on top. + """ + if self._cache is None: + result = self._get_project(name) + elif name in self._cache: + result = self._cache[name] + else: + result = self._get_project(name) + self._cache[name] = result + return result + + def score_url(self, url): + """ + Give an url a score which can be used to choose preferred URLs + for a given project release. + """ + t = urlparse(url) + return (t.scheme != 'https', 'pypi.python.org' in t.netloc, + posixpath.basename(t.path)) + + def prefer_url(self, url1, url2): + """ + Choose one of two URLs where both are candidates for distribution + archives for the same version of a distribution (for example, + .tar.gz vs. zip). + + The current implement favours http:// URLs over https://, archives + from PyPI over those from other locations and then the archive name. + """ + if url1 == 'UNKNOWN': + result = url2 + else: + result = url2 + s1 = self.score_url(url1) + s2 = self.score_url(url2) + if s1 > s2: + result = url1 + if result != url2: + logger.debug('Not replacing %r with %r', url1, url2) + else: + logger.debug('Replacing %r with %r', url1, url2) + return result + + def split_filename(self, filename, project_name): + """ + Attempt to split a filename in project name, version and Python version. + """ + return split_filename(filename, project_name) + + def convert_url_to_download_info(self, url, project_name): + """ + See if a URL is a candidate for a download URL for a project (the URL + has typically been scraped from an HTML page). + + If it is, a dictionary is returned with keys "name", "version", + "filename" and "url"; otherwise, None is returned. + """ + def same_project(name1, name2): + name1, name2 = name1.lower(), name2.lower() + if name1 == name2: + result = True + else: + # distribute replaces '-' by '_' in project names, so it + # can tell where the version starts in a filename. + result = name1.replace('_', '-') == name2.replace('_', '-') + return result + + result = None + scheme, netloc, path, params, query, frag = urlparse(url) + if frag.lower().startswith('egg='): + logger.debug('%s: version hint in fragment: %r', + project_name, frag) + origpath = path + if path and path[-1] == '/': + path = path[:-1] + if path.endswith('.whl'): + try: + wheel = Wheel(path) + if is_compatible(wheel, self.wheel_tags): + if project_name is None: + include = True + else: + include = same_project(wheel.name, project_name) + if include: + result = { + 'name': wheel.name, + 'version': wheel.version, + 'filename': wheel.filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + 'python-version': ', '.join( + ['.'.join(list(v[2:])) for v in wheel.pyver]), + } + m = MD5_HASH.match(frag) + if m: + result['md5_digest'] = m.group(1) + except Exception as e: + logger.warning('invalid path for wheel: %s', path) + elif path.endswith(self.downloadable_extensions): + path = filename = posixpath.basename(path) + for ext in self.downloadable_extensions: + if path.endswith(ext): + path = path[:-len(ext)] + t = self.split_filename(path, project_name) + if not t: + logger.debug('No match for project/version: %s', path) + else: + name, version, pyver = t + if not project_name or same_project(project_name, name): + result = { + 'name': name, + 'version': version, + 'filename': filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + #'packagetype': 'sdist', + } + if pyver: + result['python-version'] = pyver + m = MD5_HASH.match(frag) + if m: + result['md5_digest'] = m.group(1) + break + return result + + def _update_version_data(self, result, info): + """ + Update a result dictionary (the final result from _get_project) with a dictionary for a + specific version, whih typically holds information gleaned from a filename or URL for an + archive for the distribution. + """ + name = info.pop('name') + version = info.pop('version') + if version in result: + dist = result[version] + md = dist.metadata + else: + dist = make_dist(name, version, scheme=self.scheme) + md = dist.metadata + dist.md5_digest = info.get('md5_digest') + if 'python-version' in info: + md['Requires-Python'] = info['python-version'] + if md['Download-URL'] != info['url']: + md['Download-URL'] = self.prefer_url(md['Download-URL'], + info['url']) + dist.locator = self + result[version] = dist + + def locate(self, requirement, prereleases=False): + """ + Find the most recent distribution which matches the given + requirement. + + :param requirement: A requirement of the form 'foo (1.0)' or perhaps + 'foo (>= 1.0, < 2.0, != 1.3)' + :param prereleases: If ``True``, allow pre-release versions + to be located. Otherwise, pre-release versions + are not returned. + :return: A :class:`Distribution` instance, or ``None`` if no such + distribution could be located. + """ + result = None + scheme = get_scheme(self.scheme) + r = parse_requirement(requirement) + if r is None: + raise DistlibException('Not a valid requirement: %r' % requirement) + if r.extras: + # lose the extras part of the requirement + requirement = r.requirement + matcher = scheme.matcher(requirement) + vcls = matcher.version_class + logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) + versions = self.get_project(matcher.name) + if versions: + # sometimes, versions are invalid + slist = [] + for k in versions: + try: + if not matcher.match(k): + logger.debug('%s did not match %r', matcher, k) + else: + if prereleases or not vcls(k).is_prerelease: + slist.append(k) + else: + logger.debug('skipping pre-release version %s', k) + except Exception: + logger.warning('error matching %s with %r', matcher, k) + pass # slist.append(k) + if len(slist) > 1: + slist = sorted(slist, key=scheme.key) + if slist: + logger.debug('sorted list: %s', slist) + result = versions[slist[-1]] + if result and r.extras: + result.extras = r.extras + return result + + +class PyPIRPCLocator(Locator): + """ + This locator uses XML-RPC to locate distributions. It therefore cannot be + used with simple mirrors (that only mirror file content). + """ + def __init__(self, url, **kwargs): + """ + Initialise an instance. + + :param url: The URL to use for XML-RPC. + :param kwargs: Passed to the superclass constructor. + """ + super(PyPIRPCLocator, self).__init__(**kwargs) + self.base_url = url + self.client = ServerProxy(url, timeout=3.0) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + return set(self.client.list_packages()) + + def _get_project(self, name): + result = {} + versions = self.client.package_releases(name, True) + for v in versions: + urls = self.client.release_urls(name, v) + data = self.client.release_data(name, v) + metadata = Metadata(scheme=self.scheme) + metadata.update(data) + dist = Distribution(metadata) + if urls: + info = urls[0] + metadata['Download-URL'] = info['url'] + dist.md5_digest = info.get('md5_digest') + dist.locator = self + result[v] = dist + return result + +class PyPIJSONLocator(Locator): + """ + This locator uses PyPI's JSON interface. It's very limited in functionality + nad probably not worth using. + """ + def __init__(self, url, **kwargs): + super(PyPIJSONLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {} + url = urljoin(self.base_url, '%s/json' % quote(name)) + try: + resp = self.opener.open(url) + data = resp.read().decode() # for now + d = json.loads(data) + md = Metadata(scheme=self.scheme) + md.update(d['info']) + dist = Distribution(md) + urls = d['urls'] + if urls: + info = urls[0] + md['Download-URL'] = info['url'] + dist.md5_digest = info.get('md5_digest') + dist.locator = self + result[md.version] = dist + except Exception as e: + logger.exception('JSON fetch failed: %s', e) + return result + + +class Page(object): + """ + This class represents a scraped HTML page. + """ + # The following slightly hairy-looking regex just looks for the contents of + # an anchor link, which has an attribute "href" either immediately preceded + # or immediately followed by a "rel" attribute. The attribute values can be + # declared with double quotes, single quotes or no quotes - which leads to + # the length of the expression. + _href = re.compile(""" +(rel\s*=\s*(?:"(?P<rel1>[^"]*)"|'(?P<rel2>[^']*)'|(?P<rel3>[^>\s\n]*))\s+)? +href\s*=\s*(?:"(?P<url1>[^"]*)"|'(?P<url2>[^']*)'|(?P<url3>[^>\s\n]*)) +(\s+rel\s*=\s*(?:"(?P<rel4>[^"]*)"|'(?P<rel5>[^']*)'|(?P<rel6>[^>\s\n]*)))? +""", re.I | re.S | re.X) + _base = re.compile(r"""<base\s+href\s*=\s*['"]?([^'">]+)""", re.I | re.S) + + def __init__(self, data, url): + """ + Initialise an instance with the Unicode page contents and the URL they + came from. + """ + self.data = data + self.base_url = self.url = url + m = self._base.search(self.data) + if m: + self.base_url = m.group(1) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + @cached_property + def links(self): + """ + Return the URLs of all the links on a page together with information + about their "rel" attribute, for determining which ones to treat as + downloads and which ones to queue for further scraping. + """ + def clean(url): + "Tidy up an URL." + scheme, netloc, path, params, query, frag = urlparse(url) + return urlunparse((scheme, netloc, quote(path), + params, query, frag)) + + result = set() + for match in self._href.finditer(self.data): + d = match.groupdict('') + rel = (d['rel1'] or d['rel2'] or d['rel3'] or + d['rel4'] or d['rel5'] or d['rel6']) + url = d['url1'] or d['url2'] or d['url3'] + url = urljoin(self.base_url, url) + url = unescape(url) + url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) + result.add((url, rel)) + # We sort the result, hoping to bring the most recent versions + # to the front + result = sorted(result, key=lambda t: t[0], reverse=True) + return result + + +class SimpleScrapingLocator(Locator): + """ + A locator which scrapes HTML pages to locate downloads for a distribution. + This runs multiple threads to do the I/O; performance is at least as good + as pip's PackageFinder, which works in an analogous fashion. + """ + + # These are used to deal with various Content-Encoding schemes. + decoders = { + 'deflate': zlib.decompress, + 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(), + 'none': lambda b: b, + } + + def __init__(self, url, timeout=None, num_workers=10, **kwargs): + """ + Initialise an instance. + :param url: The root URL to use for scraping. + :param timeout: The timeout, in seconds, to be applied to requests. + This defaults to ``None`` (no timeout specified). + :param num_workers: The number of worker threads you want to do I/O, + This defaults to 10. + :param kwargs: Passed to the superclass. + """ + super(SimpleScrapingLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + self.timeout = timeout + self._page_cache = {} + self._seen = set() + self._to_fetch = queue.Queue() + self._bad_hosts = set() + self.skip_externals = False + self.num_workers = num_workers + self._lock = threading.RLock() + + def _prepare_threads(self): + """ + Threads are created only when get_project is called, and terminate + before it returns. They are there primarily to parallelise I/O (i.e. + fetching web pages). + """ + self._threads = [] + for i in range(self.num_workers): + t = threading.Thread(target=self._fetch) + t.setDaemon(True) + t.start() + self._threads.append(t) + + def _wait_threads(self): + """ + Tell all the threads to terminate (by sending a sentinel value) and + wait for them to do so. + """ + # Note that you need two loops, since you can't say which + # thread will get each sentinel + for t in self._threads: + self._to_fetch.put(None) # sentinel + for t in self._threads: + t.join() + self._threads = [] + + def _get_project(self, name): + self.result = result = {} + self.project_name = name + url = urljoin(self.base_url, '%s/' % quote(name)) + self._seen.clear() + self._page_cache.clear() + self._prepare_threads() + try: + logger.debug('Queueing %s', url) + self._to_fetch.put(url) + self._to_fetch.join() + finally: + self._wait_threads() + del self.result + return result + + platform_dependent = re.compile(r'\b(linux-(i\d86|x86_64|arm\w+)|' + r'win(32|-amd64)|macosx-?\d+)\b', re.I) + + def _is_platform_dependent(self, url): + """ + Does an URL refer to a platform-specific download? + """ + return self.platform_dependent.search(url) + + def _process_download(self, url): + """ + See if an URL is a suitable download for a project. + + If it is, register information in the result dictionary (for + _get_project) about the specific version it's for. + + Note that the return value isn't actually used other than as a boolean + value. + """ + if self._is_platform_dependent(url): + info = None + else: + info = self.convert_url_to_download_info(url, self.project_name) + logger.debug('process_download: %s -> %s', url, info) + if info: + with self._lock: # needed because self.result is shared + self._update_version_data(self.result, info) + return info + + def _should_queue(self, link, referrer, rel): + """ + Determine whether a link URL from a referring page and with a + particular "rel" attribute should be queued for scraping. + """ + scheme, netloc, path, _, _, _ = urlparse(link) + if path.endswith(self.source_extensions + self.binary_extensions + + self.excluded_extensions): + result = False + elif self.skip_externals and not link.startswith(self.base_url): + result = False + elif not referrer.startswith(self.base_url): + result = False + elif rel not in ('homepage', 'download'): + result = False + elif scheme not in ('http', 'https', 'ftp'): + result = False + elif self._is_platform_dependent(link): + result = False + else: + host = netloc.split(':', 1)[0] + if host.lower() == 'localhost': + result = False + else: + result = True + logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, + referrer, result) + return result + + def _fetch(self): + """ + Get a URL to fetch from the work queue, get the HTML page, examine its + links for download candidates and candidates for further scraping. + + This is a handy method to run in a thread. + """ + while True: + url = self._to_fetch.get() + try: + if url: + page = self.get_page(url) + if page is None: # e.g. after an error + continue + for link, rel in page.links: + if link not in self._seen: + self._seen.add(link) + if (not self._process_download(link) and + self._should_queue(link, url, rel)): + logger.debug('Queueing %s from %s', link, url) + self._to_fetch.put(link) + finally: + # always do this, to avoid hangs :-) + self._to_fetch.task_done() + if not url: + #logger.debug('Sentinel seen, quitting.') + break + + def get_page(self, url): + """ + Get the HTML for an URL, possibly from an in-memory cache. + + XXX TODO Note: this cache is never actually cleared. It's assumed that + the data won't get stale over the lifetime of a locator instance (not + necessarily true for the default_locator). + """ + # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api + scheme, netloc, path, _, _, _ = urlparse(url) + if scheme == 'file' and os.path.isdir(url2pathname(path)): + url = urljoin(ensure_slash(url), 'index.html') + + if url in self._page_cache: + result = self._page_cache[url] + logger.debug('Returning %s from cache: %s', url, result) + else: + host = netloc.split(':', 1)[0] + result = None + if host in self._bad_hosts: + logger.debug('Skipping %s due to bad host %s', url, host) + else: + req = Request(url, headers={'Accept-encoding': 'identity'}) + try: + logger.debug('Fetching %s', url) + resp = self.opener.open(req, timeout=self.timeout) + logger.debug('Fetched %s', url) + headers = resp.info() + content_type = headers.get('Content-Type', '') + if HTML_CONTENT_TYPE.match(content_type): + final_url = resp.geturl() + data = resp.read() + encoding = headers.get('Content-Encoding') + if encoding: + decoder = self.decoders[encoding] # fail if not found + data = decoder(data) + encoding = 'utf-8' + m = CHARSET.search(content_type) + if m: + encoding = m.group(1) + try: + data = data.decode(encoding) + except UnicodeError: + data = data.decode('latin-1') # fallback + result = Page(data, final_url) + self._page_cache[final_url] = result + except HTTPError as e: + if e.code != 404: + logger.exception('Fetch failed: %s: %s', url, e) + except URLError as e: + logger.exception('Fetch failed: %s: %s', url, e) + with self._lock: + self._bad_hosts.add(host) + except Exception as e: + logger.exception('Fetch failed: %s: %s', url, e) + finally: + self._page_cache[url] = result # even if None (failure) + return result + + _distname_re = re.compile('<a href=[^>]*>([^<]+)<') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + page = self.get_page(self.base_url) + if not page: + raise DistlibException('Unable to get %s' % self.base_url) + for match in self._distname_re.finditer(page.data): + result.add(match.group(1)) + return result + +class DirectoryLocator(Locator): + """ + This class locates distributions in a directory tree. + """ + + def __init__(self, path, **kwargs): + """ + Initialise an instance. + :param path: The root of the directory tree to search. + :param kwargs: Passed to the superclass constructor, + except for: + * recursive - if True (the default), subdirectories are + recursed into. If False, only the top-level directory + is searched, + """ + self.recursive = kwargs.pop('recursive', True) + super(DirectoryLocator, self).__init__(**kwargs) + path = os.path.abspath(path) + if not os.path.isdir(path): + raise DistlibException('Not a directory: %r' % path) + self.base_dir = path + + def should_include(self, filename, parent): + """ + Should a filename be considered as a candidate for a distribution + archive? As well as the filename, the directory which contains it + is provided, though not used by the current implementation. + """ + return filename.endswith(self.downloadable_extensions) + + def _get_project(self, name): + result = {} + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, name) + if info: + self._update_version_data(result, info) + if not self.recursive: + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, None) + if info: + result.add(info['name']) + if not self.recursive: + break + return result + +class JSONLocator(Locator): + """ + This locator uses special extended metadata (not available on PyPI) and is + the basis of performant dependency resolution in distlib. Other locators + require archive downloads before dependencies can be determined! As you + might imagine, that can be slow. + """ + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {} + data = get_project_data(name) + if data: + for info in data.get('files', []): + if info['ptype'] != 'sdist' or info['pyversion'] != 'source': + continue + dist = make_dist(data['name'], info['version'], + scheme=self.scheme) + md = dist.metadata + md['Download-URL'] = info['url'] + dist.md5_digest = info.get('digest') + md.dependencies = info.get('requirements', {}) + dist.exports = info.get('exports', {}) + result[dist.version] = dist + return result + +class DistPathLocator(Locator): + """ + This locator finds installed distributions in a path. It can be useful for + adding to an :class:`AggregatingLocator`. + """ + def __init__(self, distpath, **kwargs): + """ + Initialise an instance. + + :param distpath: A :class:`DistributionPath` instance to search. + """ + super(DistPathLocator, self).__init__(**kwargs) + assert isinstance(distpath, DistributionPath) + self.distpath = distpath + + def _get_project(self, name): + dist = self.distpath.get_distribution(name) + if dist is None: + result = {} + else: + result = { dist.version: dist } + return result + + +class AggregatingLocator(Locator): + """ + This class allows you to chain and/or merge a list of locators. + """ + def __init__(self, *locators, **kwargs): + """ + Initialise an instance. + + :param locators: The list of locators to search. + :param kwargs: Passed to the superclass constructor, + except for: + * merge - if False (the default), the first successful + search from any of the locators is returned. If True, + the results from all locators are merged (this can be + slow). + """ + self.merge = kwargs.pop('merge', False) + self.locators = locators + super(AggregatingLocator, self).__init__(**kwargs) + + def clear_cache(self): + super(AggregatingLocator, self).clear_cache() + for locator in self.locators: + locator.clear_cache() + + def _set_scheme(self, value): + self._scheme = value + for locator in self.locators: + locator.scheme = value + + scheme = property(Locator.scheme.fget, _set_scheme) + + def _get_project(self, name): + result = {} + for locator in self.locators: + r = locator.get_project(name) + if r: + if self.merge: + result.update(r) + else: + result = r + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for locator in self.locators: + try: + result |= locator.get_distribution_names() + except NotImplementedError: + pass + return result + + +default_locator = AggregatingLocator( + JSONLocator(), + SimpleScrapingLocator('https://pypi.python.org/simple/', + timeout=3.0)) + +locate = default_locator.locate + +class DependencyFinder(object): + """ + Locate dependencies for distributions. + """ + + def __init__(self, locator=None): + """ + Initialise an instance, using the specified locator + to locate distributions. + """ + self.locator = locator or default_locator + self.scheme = get_scheme(self.locator.scheme) + + def _get_name_and_version(self, p): + """ + A utility method used to get name and version from e.g. a Provides-Dist + value. + + :param p: A value in a form foo (1.0) + :return: The name and version as a tuple. + """ + comps = p.strip().rsplit(' ', 1) + name = comps[0] + version = None + if len(comps) == 2: + version = comps[1] + if len(version) < 3 or version[0] != '(' or version[-1] != ')': + raise DistlibException('Ill-formed provides field: %r' % p) + version = version[1:-1] # trim off parentheses + # Name in lower case for case-insensitivity + return name.lower(), version + + def add_distribution(self, dist): + """ + Add a distribution to the finder. This will update internal information + about who provides what. + :param dist: The distribution to add. + """ + logger.debug('adding distribution %s', dist) + name = dist.key + self.dists_by_name[name] = dist + self.dists[(name, dist.version)] = dist + for p in dist.provides: + name, version = self._get_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + self.provided.setdefault(name, set()).add((version, dist)) + + def remove_distribution(self, dist): + """ + Remove a distribution from the finder. This will update internal + information about who provides what. + :param dist: The distribution to remove. + """ + logger.debug('removing distribution %s', dist) + name = dist.key + del self.dists_by_name[name] + del self.dists[(name, dist.version)] + for p in dist.provides: + name, version = self._get_name_and_version(p) + logger.debug('Remove from provided: %s, %s, %s', name, version, dist) + s = self.provided[name] + s.remove((version, dist)) + if not s: + del self.provided[name] + + def get_matcher(self, reqt): + """ + Get a version matcher for a requirement. + :param reqt: The requirement + :type reqt: str + :return: A version matcher (an instance of + :class:`distlib.version.Matcher`). + """ + try: + matcher = self.scheme.matcher(reqt) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + name = reqt.split()[0] + matcher = self.scheme.matcher(name) + return matcher + + def find_providers(self, reqt): + """ + Find the distributions which can fulfill a requirement. + + :param reqt: The requirement. + :type reqt: str + :return: A set of distribution which can fulfill the requirement. + """ + matcher = self.get_matcher(reqt) + name = matcher.key # case-insensitive + result = set() + provided = self.provided + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + result.add(provider) + break + return result + + def try_to_replace(self, provider, other, problems): + """ + Attempt to replace one provider with another. This is typically used + when resolving dependencies from multiple sources, e.g. A requires + (B >= 1.0) while C requires (B >= 1.1). + + For successful replacement, ``provider`` must meet all the requirements + which ``other`` fulfills. + + :param provider: The provider we are trying to replace with. + :param other: The provider we're trying to replace. + :param problems: If False is returned, this will contain what + problems prevented replacement. This is currently + a tuple of the literal string 'cantreplace', + ``provider``, ``other`` and the set of requirements + that ``provider`` couldn't fulfill. + :return: True if we can replace ``other`` with ``provider``, else + False. + """ + rlist = self.reqts[other] + unmatched = set() + for s in rlist: + matcher = self.get_matcher(s) + if not matcher.match(provider.version): + unmatched.add(s) + if unmatched: + # can't replace other with provider + problems.add(('cantreplace', provider, other, unmatched)) + result = False + else: + # can replace other with provider + self.remove_distribution(other) + del self.reqts[other] + for s in rlist: + self.reqts.setdefault(provider, set()).add(s) + self.add_distribution(provider) + result = True + return result + + def find(self, requirement, tests=False, prereleases=False): + """ + Find a distribution matching requirement and all distributions + it depends on. Use the ``tests`` argument to determine whether + distributions used only for testing should be included in the + results. Allow ``requirement`` to be either a :class:`Distribution` + instance or a string expressing a requirement. If ``prereleases`` + is True, allow pre-release versions to be returned - otherwise, + don't. + + Return a set of :class:`Distribution` instances and a set of + problems. + + The distributions returned should be such that they have the + :attr:`required` attribute set to ``True`` if they were + from the ``requirement`` passed to ``find()``, and they have the + :attr:`build_time_dependency` attribute set to ``True`` unless they + are post-installation dependencies of the ``requirement``. + + The problems should be a tuple consisting of the string + ``'unsatisfied'`` and the requirement which couldn't be satisfied + by any distribution known to the locator. + """ + + self.provided = {} + self.dists = {} + self.dists_by_name = {} + self.reqts = {} + + if isinstance(requirement, Distribution): + dist = odist = requirement + logger.debug('passed %s as requirement', odist) + else: + dist = odist = self.locator.locate(requirement, + prereleases=prereleases) + if dist is None: + raise DistlibException('Unable to locate %r' % requirement) + logger.debug('located %s', odist) + dist.requested = True + problems = set() + todo = set([dist]) + install_dists = set([odist]) + while todo: + dist = todo.pop() + name = dist.key # case-insensitive + if name not in self.dists_by_name: + self.add_distribution(dist) + else: + #import pdb; pdb.set_trace() + other = self.dists_by_name[name] + if other != dist: + self.try_to_replace(dist, other, problems) + + ireqts = dist.requires + sreqts = dist.setup_requires + ereqts = set() + if not tests or dist not in install_dists: + treqts = set() + else: + treqts = dist.test_requires + all_reqts = ireqts | sreqts | treqts | ereqts + for r in all_reqts: + providers = self.find_providers(r) + if not providers: + logger.debug('No providers found for %r', r) + provider = self.locator.locate(r, prereleases=prereleases) + if provider is None: + logger.debug('Cannot satisfy %r', r) + problems.add(('unsatisfied', r)) + else: + n, v = provider.key, provider.version + if (n, v) not in self.dists: + todo.add(provider) + providers.add(provider) + if r in ireqts and dist in install_dists: + install_dists.add(provider) + logger.debug('Adding %s to install_dists', + provider.name_and_version) + for p in providers: + name = p.key + if name not in self.dists_by_name: + self.reqts.setdefault(p, set()).add(r) + else: + other = self.dists_by_name[name] + if other != p: + # see if other can be replaced by p + self.try_to_replace(p, other, problems) + + dists = set(self.dists.values()) + for dist in dists: + dist.build_time_dependency = dist not in install_dists + if dist.build_time_dependency: + logger.debug('%s is a build-time dependency only.', + dist.name_and_version) + logger.debug('find done for %s', odist) + return dists, problems diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/locators.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/locators.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81b549fc86bc168a6014cf92595b7cdc147c73bb GIT binary patch literal 45269 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/manifest.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/manifest.py new file mode 100644 index 0000000000..ae2c3ea607 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/manifest.py @@ -0,0 +1,361 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2013 Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Class representing the list of files in a distribution. + +Equivalent to distutils.filelist, but fixes some problems. +""" +import fnmatch +import logging +import os +import re + +from . import DistlibException +from .compat import fsdecode +from .util import convert_path + + +__all__ = ['Manifest'] + +logger = logging.getLogger(__name__) + +# a \ followed by some spaces + EOL +_COLLAPSE_PATTERN = re.compile('\\\w*\n', re.M) +_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S) + + +class Manifest(object): + """A list of files built by on exploring the filesystem and filtered by + applying various patterns to what we find there. + """ + + def __init__(self, base=None): + """ + Initialise an instance. + + :param base: The base directory to explore under. + """ + self.base = os.path.abspath(os.path.normpath(base or os.getcwd())) + self.prefix = self.base + os.sep + self.allfiles = None + self.files = set() + + # + # Public API + # + + def findall(self): + """Find all files under the base and set ``allfiles`` to the absolute + pathnames of files found. + """ + from stat import S_ISREG, S_ISDIR, S_ISLNK + + self.allfiles = allfiles = [] + root = self.base + stack = [root] + pop = stack.pop + push = stack.append + + while stack: + root = pop() + names = os.listdir(root) + + for name in names: + fullname = os.path.join(root, name) + + # Avoid excess stat calls -- just one will do, thank you! + stat = os.stat(fullname) + mode = stat.st_mode + if S_ISREG(mode): + allfiles.append(fsdecode(fullname)) + elif S_ISDIR(mode) and not S_ISLNK(mode): + push(fullname) + + def add(self, item): + """ + Add a file to the manifest. + + :param item: The pathname to add. This can be relative to the base. + """ + if not item.startswith(self.prefix): + item = os.path.join(self.base, item) + self.files.add(os.path.normpath(item)) + + def add_many(self, items): + """ + Add a list of files to the manifest. + + :param items: The pathnames to add. These can be relative to the base. + """ + for item in items: + self.add(item) + + def sorted(self, wantdirs=False): + """ + Return sorted files in directory order + """ + def add_dir(dirs, d): + dirs.add(d) + logger.debug('add_dir added %s', d) + if d != self.base: + parent, _ = os.path.split(d) + assert parent not in ('', '/') + add_dir(dirs, parent) + + result = set(self.files) # make a copy! + if wantdirs: + dirs = set() + for f in result: + add_dir(dirs, os.path.dirname(f)) + result |= dirs + return [os.path.join(*path_tuple) for path_tuple in + sorted(os.path.split(path) for path in result)] + + def clear(self): + """Clear all collected files.""" + self.files = set() + self.allfiles = [] + + def process_directive(self, directive): + """ + Process a directive which either adds some files from ``allfiles`` to + ``files``, or removes some files from ``files``. + + :param directive: The directive to process. This should be in a format + compatible with distutils ``MANIFEST.in`` files: + + http://docs.python.org/distutils/sourcedist.html#commands + """ + # Parse the line: split it up, make sure the right number of words + # is there, and return the relevant words. 'action' is always + # defined: it's the first word of the line. Which of the other + # three are defined depends on the action; it'll be either + # patterns, (dir and patterns), or (dirpattern). + action, patterns, thedir, dirpattern = self._parse_directive(directive) + + # OK, now we know that the action is valid and we have the + # right number of words on the line for that action -- so we + # can proceed with minimal error-checking. + if action == 'include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=True): + logger.warning('no files found matching %r', pattern) + + elif action == 'exclude': + for pattern in patterns: + if not self._exclude_pattern(pattern, anchor=True): + logger.warning('no previously-included files ' + 'found matching %r', pattern) + + elif action == 'global-include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=False): + logger.warning('no files found matching %r ' + 'anywhere in distribution', pattern) + + elif action == 'global-exclude': + for pattern in patterns: + if not self._exclude_pattern(pattern, anchor=False): + logger.warning('no previously-included files ' + 'matching %r found anywhere in ' + 'distribution', pattern) + + elif action == 'recursive-include': + for pattern in patterns: + if not self._include_pattern(pattern, prefix=thedir): + logger.warning('no files found matching %r ' + 'under directory %r', pattern, thedir) + + elif action == 'recursive-exclude': + for pattern in patterns: + if not self._exclude_pattern(pattern, prefix=thedir): + logger.warning('no previously-included files ' + 'matching %r found under directory %r', + pattern, thedir) + + elif action == 'graft': + if not self._include_pattern(None, prefix=dirpattern): + logger.warning('no directories found matching %r', + dirpattern) + + elif action == 'prune': + if not self._exclude_pattern(None, prefix=dirpattern): + logger.warning('no previously-included directories found ' + 'matching %r', dirpattern) + else: #pragma: no cover + # This should never happen, as it should be caught in + # _parse_template_line + raise DistlibException( + 'invalid action %r' % action) + + # + # Private API + # + + def _parse_directive(self, directive): + """ + Validate a directive. + :param directive: The directive to validate. + :return: A tuple of action, patterns, thedir, dir_patterns + """ + words = directive.split() + if len(words) == 1 and words[0] not in ( + 'include', 'exclude', 'global-include', 'global-exclude', + 'recursive-include', 'recursive-exclude', 'graft', 'prune'): + # no action given, let's use the default 'include' + words.insert(0, 'include') + + action = words[0] + patterns = thedir = dir_pattern = None + + if action in ('include', 'exclude', + 'global-include', 'global-exclude'): + if len(words) < 2: + raise DistlibException( + '%r expects <pattern1> <pattern2> ...' % action) + + patterns = [convert_path(word) for word in words[1:]] + + elif action in ('recursive-include', 'recursive-exclude'): + if len(words) < 3: + raise DistlibException( + '%r expects <dir> <pattern1> <pattern2> ...' % action) + + thedir = convert_path(words[1]) + patterns = [convert_path(word) for word in words[2:]] + + elif action in ('graft', 'prune'): + if len(words) != 2: + raise DistlibException( + '%r expects a single <dir_pattern>' % action) + + dir_pattern = convert_path(words[1]) + + else: + raise DistlibException('unknown action %r' % action) + + return action, patterns, thedir, dir_pattern + + def _include_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Select strings (presumably filenames) from 'self.files' that + match 'pattern', a Unix-style wildcard (glob) pattern. + + Patterns are not quite the same as implemented by the 'fnmatch' + module: '*' and '?' match non-special characters, where "special" + is platform-dependent: slash on Unix; colon, slash, and backslash on + DOS/Windows; and colon on Mac OS. + + If 'anchor' is true (the default), then the pattern match is more + stringent: "*.py" will match "foo.py" but not "foo/bar.py". If + 'anchor' is false, both of these will match. + + If 'prefix' is supplied, then only filenames starting with 'prefix' + (itself a pattern) and ending with 'pattern', with anything in between + them, will match. 'anchor' is ignored in this case. + + If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and + 'pattern' is assumed to be either a string containing a regex or a + regex object -- no translation is done, the regex is just compiled + and used as-is. + + Selected strings will be added to self.files. + + Return True if files are found. + """ + # XXX docstring lying about what the special chars are? + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + + # delayed loading of allfiles list + if self.allfiles is None: + self.findall() + + for name in self.allfiles: + if pattern_re.search(name): + self.files.add(name) + found = True + return found + + def _exclude_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Remove strings (presumably filenames) from 'files' that match + 'pattern'. + + Other parameters are the same as for 'include_pattern()', above. + The list 'self.files' is modified in place. Return True if files are + found. + + This API is public to allow e.g. exclusion of SCM subdirs, e.g. when + packaging source distributions + """ + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + for f in list(self.files): + if pattern_re.search(f): + self.files.remove(f) + found = True + return found + + + def _translate_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Translate a shell-like wildcard pattern to a compiled regular + expression. + + Return the compiled regex. If 'is_regex' true, + then 'pattern' is directly compiled to a regex (if it's a string) + or just returned as-is (assumes it's a regex object). + """ + if is_regex: + if isinstance(pattern, str): + return re.compile(pattern) + else: + return pattern + + if pattern: + pattern_re = self._glob_to_re(pattern) + else: + pattern_re = '' + + base = re.escape(os.path.join(self.base, '')) + if prefix is not None: + # ditch end of pattern character + empty_pattern = self._glob_to_re('') + prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] + sep = os.sep + if os.sep == '\\': + sep = r'\\' + pattern_re = '^' + base + sep.join((prefix_re, + '.*' + pattern_re)) + else: # no prefix -- respect anchor flag + if anchor: + pattern_re = '^' + base + pattern_re + + return re.compile(pattern_re) + + def _glob_to_re(self, pattern): + """Translate a shell-like glob pattern to a regular expression. + + Return a string containing the regex. Differs from + 'fnmatch.translate()' in that '*' does not match "special characters" + (which are platform-specific). + """ + pattern_re = fnmatch.translate(pattern) + + # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which + # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, + # and by extension they shouldn't match such "special characters" under + # any OS. So change all non-escaped dots in the RE to match any + # character except the special characters (currently: just os.sep). + sep = os.sep + if os.sep == '\\': + # we're using a regex to manipulate a regex, so we need + # to escape the backslash twice + sep = r'\\\\' + escaped = r'\1[^%s]' % sep + pattern_re = re.sub(r'((?<!\\)(\\\\)*)\.', escaped, pattern_re) + return pattern_re diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/manifest.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/manifest.pyc new file mode 100644 index 0000000000000000000000000000000000000000..130b52184259ff931953fea7abb3dd5e5992b647 GIT binary patch literal 12454 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 H-YWk$nQQ|u literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/markers.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/markers.py new file mode 100644 index 0000000000..182474008a --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/markers.py @@ -0,0 +1,189 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Parser for the environment markers micro-language defined in PEP 345.""" + +import ast +import os +import sys +import platform + +from .compat import python_implementation, string_types +from .util import in_venv + +__all__ = ['interpret'] + +class Evaluator(object): + """ + A limited evaluator for Python expressions. + """ + + operators = { + 'eq': lambda x, y: x == y, + 'gt': lambda x, y: x > y, + 'gte': lambda x, y: x >= y, + 'in': lambda x, y: x in y, + 'lt': lambda x, y: x < y, + 'lte': lambda x, y: x <= y, + 'not': lambda x: not x, + 'noteq': lambda x, y: x != y, + 'notin': lambda x, y: x not in y, + } + + allowed_values = { + 'sys.platform': sys.platform, + 'python_version': '%s.%s' % sys.version_info[:2], + # parsing sys.platform is not reliable, but there is no other + # way to get e.g. 2.7.2+, and the PEP is defined with sys.version + 'python_full_version': sys.version.split(' ', 1)[0], + 'os.name': os.name, + 'platform.in_venv': str(in_venv()), + 'platform.version': platform.version(), + 'platform.machine': platform.machine(), + 'platform.python_implementation': platform.python_implementation(), + } + + def __init__(self, context=None): + """ + Initialise an instance. + + :param context: If specified, names are looked up in this mapping. + """ + self.context = context or {} + self.source = None + + def get_fragment(self, offset): + """ + Get the part of the source which is causing a problem. + """ + fragment_len = 10 + s = '%r' % (self.source[offset:offset + fragment_len]) + if offset + fragment_len < len(self.source): + s += '...' + return s + + def get_handler(self, node_type): + """ + Get a handler for the specified AST node type. + """ + return getattr(self, 'do_%s' % node_type, None) + + def evaluate(self, node, filename=None): + """ + Evaluate a source string or node, using ``filename`` when + displaying errors. + """ + if isinstance(node, string_types): + self.source = node + kwargs = {'mode': 'eval'} + if filename: + kwargs['filename'] = filename + try: + node = ast.parse(node, **kwargs) + except SyntaxError as e: + s = self.get_fragment(e.offset) + raise SyntaxError('syntax error %s' % s) + node_type = node.__class__.__name__.lower() + handler = self.get_handler(node_type) + if handler is None: + if self.source is None: + s = '(source not available)' + else: + s = self.get_fragment(node.col_offset) + raise SyntaxError("don't know how to evaluate %r %s" % ( + node_type, s)) + return handler(node) + + def get_attr_key(self, node): + assert isinstance(node, ast.Attribute), 'attribute node expected' + return '%s.%s' % (node.value.id, node.attr) + + def do_attribute(self, node): + valid = True + if not isinstance(node.value, ast.Name): + valid = False + else: + key = self.get_attr_key(node) + valid = key in self.context or key in self.allowed_values + if not valid: + raise SyntaxError('invalid expression: %s' % key) + if key in self.context: + result = self.context[key] + else: + result = self.allowed_values[key] + return result + + def do_boolop(self, node): + result = self.evaluate(node.values[0]) + is_or = node.op.__class__ is ast.Or + is_and = node.op.__class__ is ast.And + assert is_or or is_and + if (is_and and result) or (is_or and not result): + for n in node.values[1:]: + result = self.evaluate(n) + if (is_or and result) or (is_and and not result): + break + return result + + def do_compare(self, node): + def sanity_check(lhsnode, rhsnode): + valid = True + if isinstance(lhsnode, ast.Str) and isinstance(rhsnode, ast.Str): + valid = False + elif (isinstance(lhsnode, ast.Attribute) + and isinstance(rhsnode, ast.Attribute)): + klhs = self.get_attr_key(lhsnode) + krhs = self.get_attr_key(rhsnode) + valid = klhs != krhs + if not valid: + s = self.get_fragment(node.col_offset) + raise SyntaxError('Invalid comparison: %s' % s) + + lhsnode = node.left + lhs = self.evaluate(lhsnode) + result = True + for op, rhsnode in zip(node.ops, node.comparators): + sanity_check(lhsnode, rhsnode) + op = op.__class__.__name__.lower() + if op not in self.operators: + raise SyntaxError('unsupported operation: %r' % op) + rhs = self.evaluate(rhsnode) + result = self.operators[op](lhs, rhs) + if not result: + break + lhs = rhs + lhsnode = rhsnode + return result + + def do_expression(self, node): + return self.evaluate(node.body) + + def do_name(self, node): + valid = False + if node.id in self.context: + valid = True + result = self.context[node.id] + elif node.id in self.allowed_values: + valid = True + result = self.allowed_values[node.id] + if not valid: + raise SyntaxError('invalid expression: %s' % node.id) + return result + + def do_str(self, node): + return node.s + + +def interpret(marker, execution_context=None): + """ + Interpret a marker and return a result depending on environment. + + :param marker: The marker to interpret. + :type marker: str + :param execution_context: The context used for name lookup. + :type execution_context: mapping + """ + return Evaluator(execution_context).evaluate(marker.strip()) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/markers.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/markers.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7fbb22b52f708ef6cf31ae5dee9575bbaae5cfc GIT binary patch literal 9174 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/metadata.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/metadata.py new file mode 100644 index 0000000000..51dbe853f6 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/metadata.py @@ -0,0 +1,708 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Implementation of the Metadata for Python packages PEPs. + +Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental). +""" +from __future__ import unicode_literals + +import codecs +from email import message_from_file +import logging +import re + + +from . import DistlibException +from .compat import StringIO, string_types +from .markers import interpret +from .version import get_scheme + +logger = logging.getLogger(__name__) + +class MetadataMissingError(DistlibException): + """A required metadata is missing""" + + +class MetadataConflictError(DistlibException): + """Attempt to read or write metadata fields that are conflictual.""" + + +class MetadataUnrecognizedVersionError(DistlibException): + """Unknown metadata version number.""" + + +try: + # docutils is installed + from docutils.utils import Reporter + from docutils.parsers.rst import Parser + from docutils import frontend + from docutils import nodes + + class SilentReporter(Reporter, object): + + def __init__(self, source, report_level, halt_level, stream=None, + debug=0, encoding='ascii', error_handler='replace'): + self.messages = [] + super(SilentReporter, self).__init__( + source, report_level, halt_level, stream, + debug, encoding, error_handler) + + def system_message(self, level, message, *children, **kwargs): + self.messages.append((level, message, children, kwargs)) + return nodes.system_message(message, level=level, type=self. + levels[level], *children, **kwargs) + + _HAS_DOCUTILS = True +except ImportError: + # docutils is not installed + _HAS_DOCUTILS = False + +# public API of this module +__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] + +# Encoding used for the PKG-INFO files +PKG_INFO_ENCODING = 'utf-8' + +# preferred version. Hopefully will be changed +# to 1.2 once PEP 345 is supported everywhere +PKG_INFO_PREFERRED_VERSION = '1.1' + +_LINE_PREFIX = re.compile('\n \|') +_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License') + +_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License', 'Classifier', 'Download-URL', 'Obsoletes', + 'Provides', 'Requires') + +_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', + 'Download-URL') + +_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External') + +_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', + 'Obsoletes-Dist', 'Requires-External', 'Maintainer', + 'Maintainer-email', 'Project-URL') + +_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External', 'Private-Version', + 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', + 'Provides-Extra') + +_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', + 'Setup-Requires-Dist', 'Extension') + +_ALL_FIELDS = set() +_ALL_FIELDS.update(_241_FIELDS) +_ALL_FIELDS.update(_314_FIELDS) +_ALL_FIELDS.update(_345_FIELDS) +_ALL_FIELDS.update(_426_FIELDS) + +EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') + +def _version2fieldlist(version): + if version == '1.0': + return _241_FIELDS + elif version == '1.1': + return _314_FIELDS + elif version == '1.2': + return _345_FIELDS + elif version == '2.0': + return _426_FIELDS + raise MetadataUnrecognizedVersionError(version) + + +def _best_version(fields): + """Detect the best version depending on the fields used.""" + def _has_marker(keys, markers): + for marker in markers: + if marker in keys: + return True + return False + + keys = [] + for key, value in fields.items(): + if value in ([], 'UNKNOWN', None): + continue + keys.append(key) + + possible_versions = ['1.0', '1.1', '1.2', '2.0'] + + # first let's try to see if a field is not part of one of the version + for key in keys: + if key not in _241_FIELDS and '1.0' in possible_versions: + possible_versions.remove('1.0') + if key not in _314_FIELDS and '1.1' in possible_versions: + possible_versions.remove('1.1') + if key not in _345_FIELDS and '1.2' in possible_versions: + possible_versions.remove('1.2') + if key not in _426_FIELDS and '2.0' in possible_versions: + possible_versions.remove('2.0') + + # possible_version contains qualified versions + if len(possible_versions) == 1: + return possible_versions[0] # found ! + elif len(possible_versions) == 0: + raise MetadataConflictError('Unknown metadata set') + + # let's see if one unique marker is found + is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) + is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) + is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) + if int(is_1_1) + int(is_1_2) + int(is_2_0) > 1: + raise MetadataConflictError('You used incompatible 1.1/1.2/2.0 fields') + + # we have the choice, 1.0, or 1.2, or 2.0 + # - 1.0 has a broken Summary field but works with all tools + # - 1.1 is to avoid + # - 1.2 fixes Summary but has little adoption + # - 2.0 adds more features and is very new + if not is_1_1 and not is_1_2 and not is_2_0: + # we couldn't find any specific marker + if PKG_INFO_PREFERRED_VERSION in possible_versions: + return PKG_INFO_PREFERRED_VERSION + if is_1_1: + return '1.1' + if is_1_2: + return '1.2' + + return '2.0' + +_ATTR2FIELD = { + 'metadata_version': 'Metadata-Version', + 'name': 'Name', + 'version': 'Version', + 'platform': 'Platform', + 'supported_platform': 'Supported-Platform', + 'summary': 'Summary', + 'description': 'Description', + 'keywords': 'Keywords', + 'home_page': 'Home-page', + 'author': 'Author', + 'author_email': 'Author-email', + 'maintainer': 'Maintainer', + 'maintainer_email': 'Maintainer-email', + 'license': 'License', + 'classifier': 'Classifier', + 'download_url': 'Download-URL', + 'obsoletes_dist': 'Obsoletes-Dist', + 'provides_dist': 'Provides-Dist', + 'requires_dist': 'Requires-Dist', + 'setup_requires_dist': 'Setup-Requires-Dist', + 'requires_python': 'Requires-Python', + 'requires_external': 'Requires-External', + 'requires': 'Requires', + 'provides': 'Provides', + 'obsoletes': 'Obsoletes', + 'project_url': 'Project-URL', + 'private_version': 'Private-Version', + 'obsoleted_by': 'Obsoleted-By', + 'extension': 'Extension', + 'provides_extra': 'Provides-Extra', +} + +_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') +_VERSIONS_FIELDS = ('Requires-Python',) +_VERSION_FIELDS = ('Version',) +_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', + 'Requires', 'Provides', 'Obsoletes-Dist', + 'Provides-Dist', 'Requires-Dist', 'Requires-External', + 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', + 'Provides-Extra', 'Extension') +_LISTTUPLEFIELDS = ('Project-URL',) + +_ELEMENTSFIELD = ('Keywords',) + +_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') + +_MISSING = object() + +_FILESAFE = re.compile('[^A-Za-z0-9.]+') + + +class Metadata(object): + """The metadata of a release. + + Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can + instantiate the class with one of these arguments (or none): + - *path*, the path to a METADATA file + - *fileobj* give a file-like object with METADATA as content + - *mapping* is a dict-like object + - *scheme* is a version scheme name + """ + # TODO document that execution_context and platform_dependent are used + # to filter on query, not when setting a key + # also document the mapping API and UNKNOWN default key + + def __init__(self, path=None, platform_dependent=False, + execution_context=None, fileobj=None, mapping=None, + scheme='default'): + self._fields = {} + self.requires_files = [] + self.docutils_support = _HAS_DOCUTILS + self.platform_dependent = platform_dependent + self.execution_context = execution_context + self._dependencies = None + self.scheme = scheme + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + if path is not None: + self.read(path) + elif fileobj is not None: + self.read_file(fileobj) + elif mapping is not None: + self.update(mapping) + self.set_metadata_version() + + def set_metadata_version(self): + self._fields['Metadata-Version'] = _best_version(self._fields) + + def _write_field(self, file, name, value): + file.write('%s: %s\n' % (name, value)) + + def __getitem__(self, name): + return self.get(name) + + def __setitem__(self, name, value): + return self.set(name, value) + + def __delitem__(self, name): + field_name = self._convert_name(name) + try: + del self._fields[field_name] + except KeyError: + raise KeyError(name) + + def __contains__(self, name): + return (name in self._fields or + self._convert_name(name) in self._fields) + + def _convert_name(self, name): + if name in _ALL_FIELDS: + return name + name = name.replace('-', '_').lower() + return _ATTR2FIELD.get(name, name) + + def _default_value(self, name): + if name in _LISTFIELDS or name in _ELEMENTSFIELD: + return [] + return 'UNKNOWN' + + def _check_rst_data(self, data): + """Return warnings when the provided data has syntax errors.""" + source_path = StringIO() + parser = Parser() + settings = frontend.OptionParser().get_default_values() + settings.tab_width = 4 + settings.pep_references = None + settings.rfc_references = None + reporter = SilentReporter(source_path, + settings.report_level, + settings.halt_level, + stream=settings.warning_stream, + debug=settings.debug, + encoding=settings.error_encoding, + error_handler=settings.error_encoding_error_handler) + + document = nodes.document(settings, reporter, source=source_path) + document.note_source(source_path, -1) + try: + parser.parse(data, document) + except AttributeError: + reporter.messages.append((-1, 'Could not finish the parsing.', + '', {})) + + return reporter.messages + + def _platform(self, value): + if not self.platform_dependent or ';' not in value: + return True, value + value, marker = value.split(';') + return interpret(marker, self.execution_context), value + + def _remove_line_prefix(self, value): + return _LINE_PREFIX.sub('\n', value) + + def __getattr__(self, name): + if name in _ATTR2FIELD: + return self[name] + raise AttributeError(name) + + def _get_dependencies(self): + def handle_req(req, rlist, extras): + if ';' not in req: + rlist.append(req) + else: + r, marker = req.split(';') + m = EXTRA_RE.search(marker) + if m: + extra = m.groups()[0][1:-1] + extras.setdefault(extra, []).append(r) + + result = self._dependencies + if result is None: + self._dependencies = result = {} + extras = {} + setup_reqs = self['Setup-Requires-Dist'] + if setup_reqs: + result['setup'] = setup_reqs + install_reqs = [] + for req in self['Requires-Dist']: + handle_req(req, install_reqs, extras) + if install_reqs: + result['install'] = install_reqs + if extras: + result['extras'] = extras + return result + + def _set_dependencies(self, value): + if 'test' in value: + value = dict(value) # don't change value passed in + value.setdefault('extras', {})['test'] = value.pop('test') + self._dependencies = value + setup_reqs = value.get('setup', []) + install_reqs = value.get('install', []) + klist = [] + for k, rlist in value.get('extras', {}).items(): + klist.append(k) + for r in rlist: + install_reqs.append('%s; extra == "%s"' % (r, k)) + if setup_reqs: + self['Setup-Requires-Dist'] = setup_reqs + if install_reqs: + self['Requires-Dist'] = install_reqs + if klist: + self['Provides-Extra'] = klist + # + # Public API + # + + dependencies = property(_get_dependencies, _set_dependencies) + + def get_fullname(self, filesafe=False): + """Return the distribution name with version. + + If filesafe is true, return a filename-escaped form.""" + name, version = self['Name'], self['Version'] + if filesafe: + # For both name and version any runs of non-alphanumeric or '.' + # characters are replaced with a single '-'. Additionally any + # spaces in the version string become '.' + name = _FILESAFE.sub('-', name) + version = _FILESAFE.sub('-', version.replace(' ', '.')) + return '%s-%s' % (name, version) + + def is_field(self, name): + """return True if name is a valid metadata key""" + name = self._convert_name(name) + return name in _ALL_FIELDS + + def is_multi_field(self, name): + name = self._convert_name(name) + return name in _LISTFIELDS + + def read(self, filepath): + """Read the metadata values from a file path.""" + fp = codecs.open(filepath, 'r', encoding='utf-8') + try: + self.read_file(fp) + finally: + fp.close() + + def read_file(self, fileob): + """Read the metadata values from a file object.""" + msg = message_from_file(fileob) + self._fields['Metadata-Version'] = msg['metadata-version'] + + for field in _version2fieldlist(self['Metadata-Version']): + if field in _LISTFIELDS: + # we can have multiple lines + values = msg.get_all(field) + if field in _LISTTUPLEFIELDS and values is not None: + values = [tuple(value.split(',')) for value in values] + self.set(field, values) + else: + # single line + value = msg[field] + if value is not None and value != 'UNKNOWN': + self.set(field, value) + self.set_metadata_version() + + def write(self, filepath, skip_unknown=False): + """Write the metadata fields to filepath.""" + fp = codecs.open(filepath, 'w', encoding='utf-8') + try: + self.write_file(fp, skip_unknown) + finally: + fp.close() + + def write_file(self, fileobject, skip_unknown=False): + """Write the PKG-INFO format data to a file object.""" + self.set_metadata_version() + + for field in _version2fieldlist(self['Metadata-Version']): + values = self.get(field) + if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): + continue + if field in _ELEMENTSFIELD: + self._write_field(fileobject, field, ','.join(values)) + continue + if field not in _LISTFIELDS: + if field == 'Description': + values = values.replace('\n', '\n |') + values = [values] + + if field in _LISTTUPLEFIELDS: + values = [','.join(value) for value in values] + + for value in values: + self._write_field(fileobject, field, value) + + def update(self, other=None, **kwargs): + """Set metadata values from the given iterable `other` and kwargs. + + Behavior is like `dict.update`: If `other` has a ``keys`` method, + they are looped over and ``self[key]`` is assigned ``other[key]``. + Else, ``other`` is an iterable of ``(key, value)`` iterables. + + Keys that don't match a metadata field or that have an empty value are + dropped. + """ + def _set(key, value): + if key in _ATTR2FIELD and value: + self.set(self._convert_name(key), value) + + if not other: + # other is None or empty container + pass + elif hasattr(other, 'keys'): + for k in other.keys(): + _set(k, other[k]) + else: + for k, v in other: + _set(k, v) + + if kwargs: + for k, v in kwargs.items(): + _set(k, v) + + def set(self, name, value): + """Control then set a metadata field.""" + name = self._convert_name(name) + + if ((name in _ELEMENTSFIELD or name == 'Platform') and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [v.strip() for v in value.split(',')] + else: + value = [] + elif (name in _LISTFIELDS and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [value] + else: + value = [] + + if logger.isEnabledFor(logging.WARNING): + project_name = self['Name'] + + scheme = get_scheme(self.scheme) + if name in _PREDICATE_FIELDS and value is not None: + for v in value: + # check that the values are valid + if not scheme.is_valid_matcher(v.split(';')[0]): + logger.warning( + '%r: %r is not valid (field %r)', + project_name, v, name) + # FIXME this rejects UNKNOWN, is that right? + elif name in _VERSIONS_FIELDS and value is not None: + if not scheme.is_valid_constraint_list(value): + logger.warning('%r: %r is not a valid version (field %r)', + project_name, value, name) + elif name in _VERSION_FIELDS and value is not None: + if not scheme.is_valid_version(value): + logger.warning('%r: %r is not a valid version (field %r)', + project_name, value, name) + + if name in _UNICODEFIELDS: + if name == 'Description': + value = self._remove_line_prefix(value) + + self._fields[name] = value + + def get(self, name, default=_MISSING): + """Get a metadata field.""" + name = self._convert_name(name) + if name not in self._fields: + if default is _MISSING: + default = self._default_value(name) + return default + if name in _UNICODEFIELDS: + value = self._fields[name] + return value + elif name in _LISTFIELDS: + value = self._fields[name] + if value is None: + return [] + res = [] + for val in value: + valid, val = self._platform(val) + if not valid: + continue + if name not in _LISTTUPLEFIELDS: + res.append(val) + else: + # That's for Project-URL + res.append((val[0], val[1])) + return res + + elif name in _ELEMENTSFIELD: + valid, value = self._platform(self._fields[name]) + if not valid: + return [] + if isinstance(value, string_types): + return value.split(',') + valid, value = self._platform(self._fields[name]) + if not valid: + return None + return value + + def check(self, strict=False, restructuredtext=False): + """Check if the metadata is compliant. If strict is True then raise if + no Name or Version are provided""" + self.set_metadata_version() + + # XXX should check the versions (if the file was loaded) + missing, warnings = [], [] + + for attr in ('Name', 'Version'): # required by PEP 345 + if attr not in self: + missing.append(attr) + + if strict and missing != []: + msg = 'missing required metadata: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + + for attr in ('Home-page', 'Author'): + if attr not in self: + missing.append(attr) + + if _HAS_DOCUTILS and restructuredtext: + warnings.extend(self._check_rst_data(self['Description'])) + + # checking metadata 1.2 (XXX needs to check 1.1, 1.0) + if self['Metadata-Version'] != '1.2': + return missing, warnings + + scheme = get_scheme(self.scheme) + + def are_valid_constraints(value): + for v in value: + if not scheme.is_valid_matcher(v.split(';')[0]): + return False + return True + + for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), + (_VERSIONS_FIELDS, + scheme.is_valid_constraint_list), + (_VERSION_FIELDS, + scheme.is_valid_version)): + for field in fields: + value = self.get(field, None) + if value is not None and not controller(value): + warnings.append('Wrong value for %r: %s' % (field, value)) + + return missing, warnings + + def todict(self, skip_missing=False): + """Return fields as a dict. + + Field names will be converted to use the underscore-lowercase style + instead of hyphen-mixed case (i.e. home_page instead of Home-page). + """ + self.set_metadata_version() + + mapping_1_0 = ( + ('metadata_version', 'Metadata-Version'), + ('name', 'Name'), + ('version', 'Version'), + ('summary', 'Summary'), + ('home_page', 'Home-page'), + ('author', 'Author'), + ('author_email', 'Author-email'), + ('license', 'License'), + ('description', 'Description'), + ('keywords', 'Keywords'), + ('platform', 'Platform'), + ('classifier', 'Classifier'), + ('download_url', 'Download-URL'), + ) + + data = {} + for key, field_name in mapping_1_0: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + if self['Metadata-Version'] == '1.2': + mapping_1_2 = ( + ('requires_dist', 'Requires-Dist'), + ('requires_python', 'Requires-Python'), + ('requires_external', 'Requires-External'), + ('provides_dist', 'Provides-Dist'), + ('obsoletes_dist', 'Obsoletes-Dist'), + ('project_url', 'Project-URL'), + ) + for key, field_name in mapping_1_2: + if not skip_missing or field_name in self._fields: + if key != 'project_url': + data[key] = self[field_name] + else: + data[key] = [','.join(u) for u in self[field_name]] + + elif self['Metadata-Version'] == '1.1': + mapping_1_1 = ( + ('provides', 'Provides'), + ('requires', 'Requires'), + ('obsoletes', 'Obsoletes'), + ) + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + return data + + # Mapping API + # TODO could add iter* variants + + def keys(self): + return list(_version2fieldlist(self['Metadata-Version'])) + + def __iter__(self): + for key in self.keys(): + yield key + + def values(self): + return [self[key] for key in self.keys()] + + def items(self): + return [(key, self[key]) for key in self.keys()] + + def __repr__(self): + return '<Metadata %s %s>' % (self.name, self.version) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/metadata.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/metadata.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f5806f407d152c36f4196e1386a7110343070c8 GIT binary patch literal 27613 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 J?aK^h{|{(`qjUfO literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/resources.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/resources.py new file mode 100644 index 0000000000..5f2d212b17 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/resources.py @@ -0,0 +1,304 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import bisect +import io +import logging +import os +import shutil +import sys +import zipimport + +from . import DistlibException +from .util import cached_property, get_cache_base, path_to_cache_dir + +logger = logging.getLogger(__name__) + +class Cache(object): + """ + A class implementing a cache for resources that need to live in the file system + e.g. shared libraries. + """ + + def __init__(self, base=None): + """ + Initialise an instance. + + :param base: The base directory where the cache should be located. If + not specified, this will be the ``resource-cache`` + directory under whatever :func:`get_cache_base` returns. + """ + if base is None: + base = os.path.join(get_cache_base(), 'resource-cache') + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if not os.path.isdir(base): + os.makedirs(base) + self.base = os.path.abspath(os.path.normpath(base)) + + def prefix_to_dir(self, prefix): + """ + Converts a resource prefix to a directory name in the cache. + """ + return path_to_cache_dir(prefix) + + def is_stale(self, resource, path): + """ + Is the cache stale for the given resource? + + :param resource: The :class:`Resource` being cached. + :param path: The path of the resource in the cache. + :return: True if the cache is stale. + """ + # Cache invalidation is a hard problem :-) + return True + + def get(self, resource): + """ + Get a resource into the cache, + + :param resource: A :class:`Resource` instance. + :return: The pathname of the resource in the cache. + """ + prefix, path = resource.finder.get_cache_info(resource) + if prefix is None: + result = path + else: + result = os.path.join(self.base, self.prefix_to_dir(prefix), path) + dirname = os.path.dirname(result) + if not os.path.isdir(dirname): + os.makedirs(dirname) + if not os.path.exists(result): + stale = True + else: + stale = self.is_stale(resource, path) + if stale: + # write the bytes of the resource to the cache location + with open(result, 'wb') as f: + f.write(resource.bytes) + return result + + def clear(self): + """ + Clear the cache. + """ + not_removed = [] + for fn in os.listdir(self.base): + fn = os.path.join(self.base, fn) + try: + if os.path.islink(fn) or os.path.isfile(fn): + os.remove(fn) + elif os.path.isdir(fn): + shutil.rmtree(fn) + except Exception: + not_removed.append(fn) + return not_removed + +cache = Cache() + +class ResourceBase(object): + def __init__(self, finder, name): + self.finder = finder + self.name = name + +class Resource(ResourceBase): + """ + A class representing an in-package resource, such as a data file. This is + not normally instantiated by user code, but rather by a + :class:`ResourceFinder` which manages the resource. + """ + is_container = False # Backwards compatibility + + def as_stream(self): + "Get the resource as a stream. Not a property, as not idempotent." + return self.finder.get_stream(self) + + @cached_property + def file_path(self): + return cache.get(self) + + @cached_property + def bytes(self): + return self.finder.get_bytes(self) + + @cached_property + def size(self): + return self.finder.get_size(self) + +class ResourceContainer(ResourceBase): + is_container = True # Backwards compatibility + + @cached_property + def resources(self): + return self.finder.get_resources(self) + +class ResourceFinder(object): + """ + Resource finder for file system resources. + """ + def __init__(self, module): + self.module = module + self.loader = getattr(module, '__loader__', None) + self.base = os.path.dirname(getattr(module, '__file__', '')) + + def _make_path(self, resource_name): + parts = resource_name.split('/') + parts.insert(0, self.base) + return os.path.join(*parts) + + def _find(self, path): + return os.path.exists(path) + + def get_cache_info(self, resource): + return None, resource.path + + def find(self, resource_name): + path = self._make_path(resource_name) + if not self._find(path): + result = None + else: + if self._is_directory(path): + result = ResourceContainer(self, resource_name) + else: + result = Resource(self, resource_name) + result.path = path + return result + + def get_stream(self, resource): + return open(resource.path, 'rb') + + def get_bytes(self, resource): + with open(resource.path, 'rb') as f: + return f.read() + + def get_size(self, resource): + return os.path.getsize(resource.path) + + def get_resources(self, resource): + def allowed(f): + return f != '__pycache__' and not f.endswith(('.pyc', '.pyo')) + return set([f for f in os.listdir(resource.path) if allowed(f)]) + + def is_container(self, resource): + return self._is_directory(resource.path) + + _is_directory = staticmethod(os.path.isdir) + +class ZipResourceFinder(ResourceFinder): + """ + Resource finder for resources in .zip files. + """ + def __init__(self, module): + super(ZipResourceFinder, self).__init__(module) + archive = self.loader.archive + self.prefix_len = 1 + len(archive) + # PyPy doesn't have a _files attr on zipimporter, and you can't set one + if hasattr(self.loader, '_files'): + self._files = self.loader._files + else: + self._files = zipimport._zip_directory_cache[archive] + self.index = sorted(self._files) + + def _find(self, path): + path = path[self.prefix_len:] + if path in self._files: + result = True + else: + if path[-1] != os.sep: + path = path + os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + if not result: + logger.debug('_find failed: %r %r', path, self.loader.prefix) + else: + logger.debug('_find worked: %r %r', path, self.loader.prefix) + return result + + def get_cache_info(self, resource): + prefix = self.loader.archive + path = resource.path[1 + len(prefix):] + return prefix, path + + def get_bytes(self, resource): + return self.loader.get_data(resource.path) + + def get_stream(self, resource): + return io.BytesIO(self.get_bytes(resource)) + + def get_size(self, resource): + path = resource.path[self.prefix_len:] + return self._files[path][3] + + def get_resources(self, resource): + path = resource.path[self.prefix_len:] + if path[-1] != os.sep: + path += os.sep + plen = len(path) + result = set() + i = bisect.bisect(self.index, path) + while i < len(self.index): + if not self.index[i].startswith(path): + break + s = self.index[i][plen:] + result.add(s.split(os.sep, 1)[0]) # only immediate children + i += 1 + return result + + def _is_directory(self, path): + path = path[self.prefix_len:] + if path[-1] != os.sep: + path += os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + return result + +_finder_registry = { + type(None): ResourceFinder, + zipimport.zipimporter: ZipResourceFinder +} + +try: + import _frozen_importlib + _finder_registry[_frozen_importlib.SourceFileLoader] = ResourceFinder +except (ImportError, AttributeError): + pass + +def register_finder(loader, finder_maker): + _finder_registry[type(loader)] = finder_maker + +_finder_cache = {} + +def finder(package): + """ + Return a resource finder for a package. + :param package: The name of the package. + :return: A :class:`ResourceFinder` instance for the package. + """ + if package in _finder_cache: + result = _finder_cache[package] + else: + if package not in sys.modules: + __import__(package) + module = sys.modules[package] + path = getattr(module, '__path__', None) + if path is None: + raise DistlibException('You cannot get a finder for a module, ' + 'only for a package') + loader = getattr(module, '__loader__', None) + finder_maker = _finder_registry.get(type(loader)) + if finder_maker is None: + raise DistlibException('Unable to locate finder for %r' % package) + result = finder_maker(module) + _finder_cache[package] = result + return result diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/resources.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/resources.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8de9112f6f11c6bc2b6fca7a6507984826bba195 GIT binary patch literal 14530 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 Qb$oRe*lyHX^=9pV0feF@SO5S3 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/scripts.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/scripts.py new file mode 100644 index 0000000000..be923f61b4 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/scripts.py @@ -0,0 +1,253 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import logging +import os +import re +import struct +import sys + +from . import DistlibException +from .compat import sysconfig, fsencode, detect_encoding +from .resources import finder +from .util import FileOperator, get_export_entry, convert_path, get_executable + +logger = logging.getLogger(__name__) + +# check if Python is called on the first line with this expression +FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') +SCRIPT_TEMPLATE = '''%(shebang)s +if __name__ == '__main__': + import sys, re + + def _resolve(module, func): + __import__(module) + mod = sys.modules[module] + parts = func.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + try: + sys.argv[0] = re.sub('-script.pyw?$', '', sys.argv[0]) + + func = _resolve('%(module)s', '%(func)s') + rc = func() # None interpreted as 0 + except Exception as e: # only supporting Python >= 2.6 + sys.stderr.write('%%s\\n' %% e) + rc = 1 + sys.exit(rc) +''' + + +class ScriptMaker(object): + """ + A class to copy or create scripts from source scripts or callable + specifications. + """ + script_template = SCRIPT_TEMPLATE + + executable = None # for shebangs + + def __init__(self, source_dir, target_dir, add_launchers=True, + dry_run=False, fileop=None): + self.source_dir = source_dir + self.target_dir = target_dir + self.add_launchers = add_launchers + self.force = False + self.set_mode = False + self._fileop = fileop or FileOperator(dry_run) + + def _get_alternate_executable(self, executable, flags): + if 'gui' in flags and os.name == 'nt': + dn, fn = os.path.split(executable) + fn = fn.replace('python', 'pythonw') + executable = os.path.join(dn, fn) + return executable + + def _get_shebang(self, encoding, post_interp=b'', flags=None): + if self.executable: + executable = self.executable + elif not sysconfig.is_python_build(): + executable = get_executable() + elif hasattr(sys, 'base_prefix') and sys.prefix != sys.base_prefix: + executable = os.path.join( + sysconfig.get_path('scripts'), + 'python%s' % sysconfig.get_config_var('EXE')) + else: + executable = os.path.join( + sysconfig.get_config_var('BINDIR'), + 'python%s%s' % (sysconfig.get_config_var('VERSION'), + sysconfig.get_config_var('EXE'))) + if flags: + executable = self._get_alternate_executable(executable, flags) + + executable = fsencode(executable) + shebang = b'#!' + executable + post_interp + b'\n' + # Python parser starts to read a script using UTF-8 until + # it gets a #coding:xxx cookie. The shebang has to be the + # first line of a file, the #coding:xxx cookie cannot be + # written before. So the shebang has to be decodable from + # UTF-8. + try: + shebang.decode('utf-8') + except UnicodeDecodeError: + raise ValueError( + 'The shebang (%r) is not decodable from utf-8' % shebang) + # If the script is encoded to a custom encoding (use a + # #coding:xxx cookie), the shebang has to be decodable from + # the script encoding too. + if encoding != 'utf-8': + try: + shebang.decode(encoding) + except UnicodeDecodeError: + raise ValueError( + 'The shebang (%r) is not decodable ' + 'from the script encoding (%r)' % (shebang, encoding)) + return shebang + + def _get_script_text(self, shebang, entry): + return self.script_template % dict(shebang=shebang, + module=entry.prefix, + func=entry.suffix) + + def _make_script(self, entry, filenames): + shebang = self._get_shebang('utf-8', flags=entry.flags).decode('utf-8') + script = self._get_script_text(shebang, entry) + outname = os.path.join(self.target_dir, entry.name) + use_launcher = self.add_launchers and os.name == 'nt' + if use_launcher: + exename = '%s.exe' % outname + if 'gui' in entry.flags: + ext = 'pyw' + launcher = self._get_launcher('w') + else: + ext = 'py' + launcher = self._get_launcher('t') + outname = '%s-script.%s' % (outname, ext) + self._fileop.write_text_file(outname, script, 'utf-8') + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + if use_launcher: + self._fileop.write_binary_file(exename, launcher) + filenames.append(exename) + + def _copy_script(self, script, filenames): + adjust = False + script = convert_path(script) + outname = os.path.join(self.target_dir, os.path.basename(script)) + filenames.append(outname) + script = os.path.join(self.source_dir, script) + if not self.force and not self._fileop.newer(script, outname): + logger.debug('not copying %s (up-to-date)', script) + return + + # Always open the file, but ignore failures in dry-run mode -- + # that way, we'll get accurate feedback if we can read the + # script. + try: + f = open(script, 'rb') + except IOError: + if not self.dry_run: + raise + f = None + else: + encoding, lines = detect_encoding(f.readline) + f.seek(0) + first_line = f.readline() + if not first_line: + logger.warning('%s: %s is an empty file (skipping)', + self.get_command_name(), script) + return + + match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) + if match: + adjust = True + post_interp = match.group(1) or b'' + + if not adjust: + if f: + f.close() + self._fileop.copy_file(script, outname) + else: + logger.info('copying and adjusting %s -> %s', script, + self.target_dir) + if not self._fileop.dry_run: + shebang = self._get_shebang(encoding, post_interp) + use_launcher = self.add_launchers and os.name == 'nt' + if use_launcher: + n, e = os.path.splitext(outname) + exename = n + '.exe' + if b'pythonw' in first_line: + launcher = self._get_launcher('w') + suffix = '-script.pyw' + else: + launcher = self._get_launcher('t') + suffix = '-script.py' + outname = n + suffix + filenames[-1] = outname + self._fileop.write_binary_file(outname, shebang + f.read()) + if use_launcher: + self._fileop.write_binary_file(exename, launcher) + filenames.append(exename) + if f: + f.close() + if self.set_mode: + self._fileop.set_executable_mode([outname]) + + @property + def dry_run(self): + return self._fileop.dry_run + + @dry_run.setter + def dry_run(self, value): + self._fileop.dry_run = value + + if os.name == 'nt': + # Executable launcher support. + # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ + + def _get_launcher(self, kind): + if struct.calcsize('P') == 8: # 64-bit + bits = '64' + else: + bits = '32' + name = '%s%s.exe' % (kind, bits) + result = finder('distlib').find(name).bytes + return result + + # Public API follows + + def make(self, specification): + """ + Make a script. + + :param specification: The specification, which is either a valid export + entry specification (to make a script from a + callable) or a filename (to make a script by + copying from a source location). + :return: A list of all absolute pathnames written to, + """ + filenames = [] + entry = get_export_entry(specification) + if entry is None: + self._copy_script(specification, filenames) + else: + self._make_script(entry, filenames) + return filenames + + def make_multiple(self, specifications): + """ + Take a list of specifications and make scripts from them, + :param specifications: A list of specifications. + :return: A list of all absolute pathnames written to, + """ + filenames = [] + for specification in specifications: + filenames.extend(self.make(specification)) + return filenames diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/scripts.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/scripts.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a05456a7c2b3d011ff2aac359e73864ff4468ed GIT binary patch literal 8838 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/util.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/util.py new file mode 100644 index 0000000000..f44e8c3528 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/util.py @@ -0,0 +1,1313 @@ +# +# Copyright (C) 2012-2013 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import codecs +from collections import deque +import contextlib +import csv +from glob import iglob as std_iglob +import io +import json +import logging +import os +import py_compile +import re +import shutil +import socket +import ssl +import sys +import tarfile +import tempfile +import time +import zipfile + +from . import DistlibException +from .compat import (string_types, text_type, shutil, raw_input, + cache_from_source, urlopen, httplib, xmlrpclib, splittype, + HTTPHandler, HTTPSHandler as BaseHTTPSHandler, + URLError, match_hostname, CertificateError) + +logger = logging.getLogger(__name__) + +class Container(object): + """ + A generic container for when multiple values need to be returned + """ + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + +# +# Requirement parsing code for name + optional constraints + optional extras +# +# e.g. 'foo >= 1.2, < 2.0 [bar, baz]' +# +# The regex can seem a bit hairy, so we build it up out of smaller pieces +# which are manageable. +# + +COMMA = r'\s*,\s*' +COMMA_RE = re.compile(COMMA) + +IDENT = r'(\w|[.-])+' +RELOP = '([<>=!]=)|[<>]' + +# +# The first relop is optional - if absent, will be taken as '==' +# +BARE_CONSTRAINTS = ('(' + RELOP + r')?\s*(' + IDENT + ')(' + COMMA + '(' + + RELOP + r')\s*(' + IDENT + '))*') + +# +# Either the bare constraints or the bare constraints in parentheses +# +CONSTRAINTS = (r'\(\s*(?P<c1>' + BARE_CONSTRAINTS + r')\s*\)|(?P<c2>' + + BARE_CONSTRAINTS + '\s*)') + +EXTRA_LIST = IDENT + '(' + COMMA + IDENT + ')*' +EXTRAS = r'\[\s*(?P<ex>' + EXTRA_LIST + r')?\s*\]' +REQUIREMENT = ('(?P<dn>' + IDENT + r')\s*(' + EXTRAS + r'\s*)?(\s*' + + CONSTRAINTS + ')?$') +REQUIREMENT_RE = re.compile(REQUIREMENT) + +# +# Used to scan through the constraints +# +RELOP_IDENT = '(?P<op>' + RELOP + r')\s*(?P<vn>' + IDENT + ')' +RELOP_IDENT_RE = re.compile(RELOP_IDENT) + +def parse_requirement(s): + + def get_constraint(m): + d = m.groupdict() + return d['op'], d['vn'] + + result = None + m = REQUIREMENT_RE.match(s) + if m: + d = m.groupdict() + name = d['dn'] + cons = d['c1'] or d['c2'] + if not cons: + cons = None + constr = '' + rs = d['dn'] + else: + if cons[0] not in '<>!=': + cons = '==' + cons + iterator = RELOP_IDENT_RE.finditer(cons) + cons = [get_constraint(m) for m in iterator] + rs = '%s (%s)' % (name, ', '.join(['%s %s' % con for con in cons])) + if not d['ex']: + extras = None + else: + extras = COMMA_RE.split(d['ex']) + result = Container(name=name, constraints=cons, extras=extras, + requirement=rs, source=s) + return result + + +def get_resources_dests(resources_root, rules): + """Find destinations for resources files""" + + def get_rel_path(base, path): + # normalizes and returns a lstripped-/-separated path + base = base.replace(os.path.sep, '/') + path = path.replace(os.path.sep, '/') + assert path.startswith(base) + return path[len(base):].lstrip('/') + + + destinations = {} + for base, suffix, dest in rules: + prefix = os.path.join(resources_root, base) + for abs_base in iglob(prefix): + abs_glob = os.path.join(abs_base, suffix) + for abs_path in iglob(abs_glob): + resource_file = get_rel_path(resources_root, abs_path) + if dest is None: # remove the entry if it was here + destinations.pop(resource_file, None) + else: + rel_path = get_rel_path(abs_base, abs_path) + rel_dest = dest.replace(os.path.sep, '/').rstrip('/') + destinations[resource_file] = rel_dest + '/' + rel_path + return destinations + + +def in_venv(): + if hasattr(sys, 'real_prefix'): + # virtualenv venvs + result = True + else: + # PEP 405 venvs + result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) + return result + + +def get_executable(): + if sys.platform == 'darwin' and ('__VENV_LAUNCHER__' + in os.environ): + result = os.environ['__VENV_LAUNCHER__'] + else: + result = sys.executable + return result + + +def proceed(prompt, allowed_chars, error_prompt=None, default=None): + p = prompt + while True: + s = raw_input(p) + p = prompt + if not s and default: + s = default + if s: + c = s[0].lower() + if c in allowed_chars: + break + if error_prompt: + p = '%c: %s\n%s' % (c, error_prompt, prompt) + return c + +@contextlib.contextmanager +def tempdir(): + td = tempfile.mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + +@contextlib.contextmanager +def chdir(d): + cwd = os.getcwd() + try: + os.chdir(d) + yield + finally: + os.chdir(cwd) + + +@contextlib.contextmanager +def socket_timeout(seconds=15): + cto = socket.getdefaulttimeout() + try: + socket.setdefaulttimeout(seconds) + yield + finally: + socket.setdefaulttimeout(cto) + + +class cached_property(object): + def __init__(self, func): + self.func = func + #for attr in ('__name__', '__module__', '__doc__'): + # setattr(self, attr, getattr(func, attr, None)) + + def __get__(self, obj, type=None): + if obj is None: + return self + value = self.func(obj) + object.__setattr__(obj, self.func.__name__, value) + #obj.__dict__[self.func.__name__] = value = self.func(obj) + return value + +def convert_path(pathname): + """Return 'pathname' as a name that will work on the native filesystem. + + The path is split on '/' and put back together again using the current + directory separator. Needed because filenames in the setup script are + always supplied in Unix style, and have to be converted to the local + convention before we can actually use them in the filesystem. Raises + ValueError on non-Unix-ish systems if 'pathname' either starts or + ends with a slash. + """ + if os.sep == '/': + return pathname + if not pathname: + return pathname + if pathname[0] == '/': + raise ValueError("path '%s' cannot be absolute" % pathname) + if pathname[-1] == '/': + raise ValueError("path '%s' cannot end with '/'" % pathname) + + paths = pathname.split('/') + while os.curdir in paths: + paths.remove(os.curdir) + if not paths: + return os.curdir + return os.path.join(*paths) + + +class FileOperator(object): + def __init__(self, dry_run=False): + self.dry_run = dry_run + self.ensured = set() + self._init_record() + + def _init_record(self): + self.record = False + self.files_written = set() + self.dirs_created = set() + + def record_as_written(self, path): + if self.record: + self.files_written.add(path) + + def newer(self, source, target): + """Tell if the target is newer than the source. + + Returns true if 'source' exists and is more recently modified than + 'target', or if 'source' exists and 'target' doesn't. + + Returns false if both exist and 'target' is the same age or younger + than 'source'. Raise PackagingFileError if 'source' does not exist. + + Note that this test is not very accurate: files created in the same + second will have the same "age". + """ + if not os.path.exists(source): + raise DistlibException("file '%r' does not exist" % + os.path.abspath(source)) + if not os.path.exists(target): + return True + + return os.stat(source).st_mtime > os.stat(target).st_mtime + + def copy_file(self, infile, outfile): + """Copy a file respecting dry-run and force flags. + """ + assert not os.path.isdir(outfile) + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying %s to %s', infile, outfile) + if not self.dry_run: + shutil.copyfile(infile, outfile) + if self.record: + self.files_written.add(outfile) + + def copy_stream(self, instream, outfile, encoding=None): + assert not os.path.isdir(outfile) + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying stream %s to %s', instream, outfile) + if not self.dry_run: + if encoding is None: + outstream = open(outfile, 'wb') + else: + outstream = codecs.open(outfile, 'w', encoding=encoding) + try: + shutil.copyfileobj(instream, outstream) + finally: + outstream.close() + if self.record: + self.files_written.add(outfile) + + def write_binary_file(self, path, data): + self.ensure_dir(os.path.dirname(path)) + if not self.dry_run: + with open(path, 'wb') as f: + f.write(data) + if self.record: + self.files_written.add(path) + + def write_text_file(self, path, data, encoding): + self.ensure_dir(os.path.dirname(path)) + if not self.dry_run: + with open(path, 'wb') as f: + f.write(data.encode(encoding)) + if self.record: + self.files_written.add(path) + + def set_mode(self, bits, mask, files): + if os.name == 'posix': + # Set the executable bits (owner, group, and world) on + # all the files specified. + for f in files: + if self.dry_run: + logger.info("changing mode of %s", f) + else: + mode = (os.stat(f).st_mode | bits) & mask + logger.info("changing mode of %s to %o", f, mode) + os.chmod(f, mode) + + set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) + + def ensure_dir(self, path): + path = os.path.abspath(path) + if path not in self.ensured and not os.path.exists(path): + self.ensured.add(path) + d, f = os.path.split(path) + self.ensure_dir(d) + logger.info('Creating %s' % path) + if not self.dry_run: + os.mkdir(path) + if self.record: + self.dirs_created.add(path) + + def byte_compile(self, path, optimize=False, force=False, prefix=None): + dpath = cache_from_source(path, not optimize) + logger.info('Byte-compiling %s to %s', path, dpath) + if not self.dry_run: + if force or self.newer(path, dpath): + if not prefix: + diagpath = None + else: + assert path.startswith(prefix) + diagpath = path[len(prefix):] + py_compile.compile(path, dpath, diagpath, True) # raise on error + if self.record: + self.files_written.add(dpath) + return dpath + + def ensure_removed(self, path): + if os.path.exists(path): + if os.path.isdir(path) and not os.path.islink(path): + logger.debug('Removing directory tree at %s', path) + if not self.dry_run: + shutil.rmtree(path) + if self.record: + if path in self.dirs_created: + self.dirs_created.remove(path) + else: + if os.path.islink(path): + s = 'link' + else: + s = 'file' + logger.debug('Removing %s %s', s, path) + if not self.dry_run: + os.remove(path) + if self.record: + if path in self.files_written: + self.files_written.remove(path) + + def is_writable(self, path): + result = False + while not result: + if os.path.exists(path): + result = os.access(path, os.W_OK) + break + parent = os.path.dirname(path) + if parent == path: + break + path = parent + return result + + def commit(self): + """ + Commit recorded changes, turn off recording, return + changes. + """ + assert self.record + result = self.files_written, self.dirs_created + self._init_record() + return result + + def rollback(self): + if not self.dry_run: + for f in list(self.files_written): + if os.path.exists(f): + os.remove(f) + # dirs should all be empty now, except perhaps for + # __pycache__ subdirs + # reverse so that subdirs appear before their parents + dirs = sorted(self.dirs_created, reverse=True) + for d in dirs: + flist = os.listdir(d) + if flist: + assert flist == ['__pycache__'] + sd = os.path.join(d, flist[0]) + os.rmdir(sd) + os.rmdir(d) # should fail if non-empty + self._init_record() + +def resolve(module_name, dotted_path): + if module_name in sys.modules: + mod = sys.modules[module_name] + else: + mod = __import__(module_name) + if dotted_path is None: + result = mod + else: + parts = dotted_path.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + +class ExportEntry(object): + def __init__(self, name, prefix, suffix, flags): + self.name = name + self.prefix = prefix + self.suffix = suffix + self.flags = flags + + @cached_property + def value(self): + return resolve(self.prefix, self.suffix) + + def __repr__(self): + return '<ExportEntry %s = %s:%s %s>' % (self.name, self.prefix, + self.suffix, self.flags) + + def __eq__(self, other): + if not isinstance(other, ExportEntry): + result = False + else: + result = (self.name == other.name and + self.prefix == other.prefix and + self.suffix == other.suffix and + self.flags == other.flags) + return result + + __hash__ = object.__hash__ + + +ENTRY_RE = re.compile(r'''(?P<name>(\w|[-.])+) + \s*=\s*(?P<callable>(\w+)([:\.]\w+)*) + \s*(\[\s*(?P<flags>\w+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? + ''', re.VERBOSE) + + +def get_export_entry(specification): + m = ENTRY_RE.search(specification) + if not m: + result = None + if '[' in specification or ']' in specification: + raise DistlibException('Invalid specification ' + '%r' % specification) + else: + d = m.groupdict() + name = d['name'] + path = d['callable'] + colons = path.count(':') + if colons == 0: + prefix, suffix = path, None + else: + if colons != 1: + raise DistlibException('Invalid specification ' + '%r' % specification) + prefix, suffix = path.split(':') + flags = d['flags'] + if flags is None: + if '[' in specification or ']' in specification: + raise DistlibException('Invalid specification ' + '%r' % specification) + flags = [] + else: + flags = [f.strip() for f in flags.split(',')] + result = ExportEntry(name, prefix, suffix, flags) + return result + + +def get_cache_base(suffix=None): + """ + Return the default base location for distlib caches. If the directory does + not exist, it is created. Use the suffix provided for the base directory, + and default to '.distlib' if it isn't provided. + + On Windows, if LOCALAPPDATA is defined in the environment, then it is + assumed to be a directory, and will be the parent directory of the result. + On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home + directory - using os.expanduser('~') - will be the parent directory of + the result. + + The result is just the directory '.distlib' in the parent directory as + determined above, or with the name specified with ``suffix``. + """ + if suffix is None: + suffix = '.distlib' + if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: + result = os.path.expandvars('$localappdata') + else: + # Assume posix, or old Windows + result = os.path.expanduser('~') + result = os.path.join(result, suffix) + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if not os.path.isdir(result): + os.makedirs(result) + return result + + +def path_to_cache_dir(path): + """ + Convert an absolute path to a directory name for use in a cache. + + The algorithm used is: + + #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. + #. Any occurrence of ``os.sep`` is replaced with ``'--'``. + #. ``'.cache'`` is appended. + """ + d, p = os.path.splitdrive(os.path.abspath(path)) + if d: + d = d.replace(':', '---') + p = p.replace(os.sep, '--') + return d + p + '.cache' + + +def ensure_slash(s): + if not s.endswith('/'): + return s + '/' + return s + + +def parse_credentials(netloc): + username = password = None + if '@' in netloc: + prefix, netloc = netloc.split('@', 1) + if ':' not in prefix: + username = prefix + else: + username, password = prefix.split(':', 1) + return username, password, netloc + + +def get_process_umask(): + result = os.umask(0o22) + os.umask(result) + return result + +def is_string_sequence(seq): + result = True + i = None + for i, s in enumerate(seq): + if not isinstance(s, string_types): + result = False + break + assert i is not None + return result + +PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' + '([0-9][a-z0-9_.+-]*)', re.I) +PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)$') + + +def split_filename(filename, project_name=None): + """ + Extract name, version, python version from a filename (no extension) + + Return name, version, pyver or None + """ + result = None + pyver = None + m = PYTHON_VERSION.search(filename) + if m: + pyver = m.group(1) + filename = filename[:m.start()] + if project_name and len(filename) > len(project_name) + 1: + m = re.match(re.escape(project_name) + r'\b', filename) + if m: + n = m.end() + result = filename[:n], filename[n + 1:], pyver + if result is None: + m = PROJECT_NAME_AND_VERSION.match(filename) + if m: + result = m.group(1), m.group(3), pyver + return result + +# +# Extended metadata functionality +# + +def _get_external_data(url): + result = {} + try: + # urlopen might fail if it runs into redirections, + # because of Python issue #13696. Fixed in locators + # using a custom redirect handler. + resp = urlopen(url) + headers = resp.info() + if headers.get('Content-Type') != 'application/json': + logger.debug('Unexpected response for JSON request') + else: + reader = codecs.getreader('utf-8')(resp) + #data = reader.read().decode('utf-8') + #result = json.loads(data) + result = json.load(reader) + except Exception as e: + logger.exception('Failed to get external data for %s: %s', url, e) + return result + + +def get_project_data(name): + url = ('https://www.red-dove.com/pypi/projects/' + '%s/%s/project.json' % (name[0].upper(), name)) + result = _get_external_data(url) + return result + +def get_package_data(dist): + name, version = dist.name, dist.version + url = ('https://www.red-dove.com/pypi/projects/' + '%s/%s/package-%s.json' % (name[0].upper(), name, version)) + result = _get_external_data(url) + if 'metadata' in result and dist.metadata: + update_metadata(dist.metadata, result) + return result + +RENAMES = { # Temporary + 'classifiers': 'Classifier', + 'use_2to3': None, + 'use_2to3_fixers': None, + 'test_suite': None, +} + +def update_metadata(metadata, pkginfo): + # update dist's metadata from received package data + assert metadata + assert 'metadata' in pkginfo + for k, v in pkginfo['metadata'].items(): + k = k.replace('-', '_') + k = RENAMES.get(k, k) + if k is not None: + metadata[k] = v + metadata.set_metadata_version() + if 'requirements' in pkginfo: + metadata.dependencies = pkginfo['requirements'] + + +# +# Simple event pub/sub +# + +class EventMixin(object): + """ + A very simple publish/subscribe system. + """ + def __init__(self): + self._subscribers = {} + + def add(self, event, subscriber, append=True): + """ + Add a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be added (and called when the + event is published). + :param append: Whether to append or prepend the subscriber to an + existing subscriber list for the event. + """ + subs = self._subscribers + if event not in subs: + subs[event] = deque([subscriber]) + else: + sq = subs[event] + if append: + sq.append(subscriber) + else: + sq.appendleft(subscriber) + + def remove(self, event, subscriber): + """ + Remove a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be removed. + """ + subs = self._subscribers + if event not in subs: + raise ValueError('No subscribers: %r' % event) + subs[event].remove(subscriber) + + def get_subscribers(self, event): + """ + Return an iterator for the subscribers for an event. + :param event: The event to return subscribers for. + """ + return iter(self._subscribers.get(event, ())) + + def publish(self, event, *args, **kwargs): + """ + Publish a event and return a list of values returned by its + subscribers. + + :param event: The event to publish. + :param args: The positional arguments to pass to the event's + subscribers. + :param kwargs: The keyword arguments to pass to the event's + subscribers. + """ + result = [] + for subscriber in self.get_subscribers(event): + try: + value = subscriber(event, *args, **kwargs) + except Exception: + logger.exception('Exception during event publication') + value = None + result.append(value) + logger.debug('publish %s: args = %s, kwargs = %s, result = %s', + event, args, kwargs, result) + return result + +# +# Simple sequencing +# +class Sequencer(object): + def __init__(self): + self._preds = {} + self._succs = {} + self._nodes = set() # nodes with no preds/succs + + def add_node(self, node): + self._nodes.add(node) + + def remove_node(self, node): + self._nodes.remove(node) + + def add(self, pred, succ): + assert pred != succ + self._preds.setdefault(succ, set()).add(pred) + self._succs.setdefault(pred, set()).add(succ) + + def remove(self, pred, succ): + assert pred != succ + try: + preds = self._preds[succ] + succs = self._succs[pred] + except KeyError: + raise ValueError('%r not a successor of anything' % succ) + try: + preds.remove(pred) + succs.remove(succ) + except KeyError: + raise ValueError('%r not a successor of %r' % (succ, pred)) + + def is_step(self, step): + return (step in self._preds or step in self._succs or + step in self._nodes) + + def get_steps(self, final): + if not self.is_step(final): + raise ValueError('Unknown: %r' % final) + result = [] + todo = [] + seen = set() + todo.append(final) + while todo: + step = todo.pop(0) + if step in seen: + # if a step was already seen, + # move it to the end (so it will appear earlier + # when reversed on return) ... but not for the + # final step, as that would be confusing for + # users + if step != final: + result.remove(step) + result.append(step) + else: + seen.add(step) + result.append(step) + preds = self._preds.get(step, ()) + todo.extend(preds) + return reversed(result) + + @property + def strong_connections(self): + #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + index_counter = [0] + stack = [] + lowlinks = {} + index = {} + result = [] + + graph = self._succs + + def strongconnect(node): + # set the depth index for this node to the smallest unused index + index[node] = index_counter[0] + lowlinks[node] = index_counter[0] + index_counter[0] += 1 + stack.append(node) + + # Consider successors + try: + successors = graph[node] + except Exception: + successors = [] + for successor in successors: + if successor not in lowlinks: + # Successor has not yet been visited + strongconnect(successor) + lowlinks[node] = min(lowlinks[node],lowlinks[successor]) + elif successor in stack: + # the successor is in the stack and hence in the current + # strongly connected component (SCC) + lowlinks[node] = min(lowlinks[node],index[successor]) + + # If `node` is a root node, pop the stack and generate an SCC + if lowlinks[node] == index[node]: + connected_component = [] + + while True: + successor = stack.pop() + connected_component.append(successor) + if successor == node: break + component = tuple(connected_component) + # storing the result + result.append(component) + + for node in graph: + if node not in lowlinks: + strongconnect(node) + + return result + + @property + def dot(self): + result = ['digraph G {'] + for succ in self._preds: + preds = self._preds[succ] + for pred in preds: + result.append(' %s -> %s;' % (pred, succ)) + for node in self._nodes: + result.append(' %s;' % node) + result.append('}') + return '\n'.join(result) + +# +# Unarchiving functionality for zip, tar, tgz, tbz, whl +# + +ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', + '.tgz', '.tbz', '.whl') + +def unarchive(archive_filename, dest_dir, format=None, check=True): + + def check_path(path): + if not isinstance(path, text_type): + path = path.decode('utf-8') + p = os.path.abspath(os.path.join(dest_dir, path)) + if not p.startswith(dest_dir) or p[plen] != os.sep: + raise ValueError('path outside destination: %r' % p) + + dest_dir = os.path.abspath(dest_dir) + plen = len(dest_dir) + archive = None + if format is None: + if archive_filename.endswith(('.zip', '.whl')): + format = 'zip' + elif archive_filename.endswith(('.tar.gz', '.tgz')): + format = 'tgz' + mode = 'r:gz' + elif archive_filename.endswith(('.tar.bz2', '.tbz')): + format = 'tbz' + mode = 'r:bz2' + elif archive_filename.endswith('.tar'): + format = 'tar' + mode = 'r' + else: + raise ValueError('Unknown format for %r' % archive_filename) + try: + if format == 'zip': + archive = zipfile.ZipFile(archive_filename, 'r') + if check: + names = archive.namelist() + for name in names: + check_path(name) + else: + archive = tarfile.open(archive_filename, mode) + if check: + names = archive.getnames() + for name in names: + check_path(name) + if format != 'zip' and sys.version_info[0] < 3: + # See Python issue 17153. If the dest path contains Unicode, + # tarfile extraction fails on Python 2.x if a member path name + # contains non-ASCII characters - it leads to an implicit + # bytes -> unicode conversion using ASCII to decode. + for tarinfo in archive.getmembers(): + if not isinstance(tarinfo.name, text_type): + tarinfo.name = tarinfo.name.decode('utf-8') + archive.extractall(dest_dir) + + finally: + if archive: + archive.close() + + +def zip_dir(directory): + """zip a directory tree into a BytesIO object""" + result = io.BytesIO() + dlen = len(directory) + with zipfile.ZipFile(result, "w") as zf: + for root, dirs, files in os.walk(directory): + for name in files: + full = os.path.join(root, name) + rel = root[dlen:] + dest = os.path.join(rel, name) + zf.write(full, dest) + return result + +# +# Simple progress bar +# + +UNITS = ('', 'K', 'M', 'G','T','P') + +class Progress(object): + unknown = 'UNKNOWN' + + def __init__(self, minval=0, maxval=100): + assert maxval is None or maxval >= minval + self.min = self.cur = minval + self.max = maxval + self.started = None + self.elapsed = 0 + self.done = False + + def update(self, curval): + assert self.min <= curval + assert self.max is None or curval <= self.max + self.cur = curval + now = time.time() + if self.started is None: + self.started = now + else: + self.elapsed = now - self.started + + def increment(self, incr): + assert incr >= 0 + self.update(self.cur + incr) + + def start(self): + self.update(self.min) + return self + + def stop(self): + if self.max is not None: + self.update(self.max) + self.done = True + + @property + def maximum(self): + return self.unknown if self.max is None else self.max + + @property + def percentage(self): + if self.done: + result = '100 %' + elif self.max is None: + result = ' ?? %' + else: + v = 100.0 * (self.cur - self.min) / (self.max - self.min) + result = '%3d %%' % v + return result + + def format_duration(self, duration): + if (duration <= 0) and self.max is None or self.cur == self.min: + result = '??:??:??' + #elif duration < 1: + # result = '--:--:--' + else: + result = time.strftime('%H:%M:%S', time.gmtime(duration)) + return result + + @property + def ETA(self): + if self.done: + prefix = 'Done' + t = self.elapsed + #import pdb; pdb.set_trace() + else: + prefix = 'ETA ' + if self.max is None: + t = -1 + elif self.elapsed == 0 or (self.cur == self.min): + t = 0 + else: + #import pdb; pdb.set_trace() + t = float(self.max - self.min) + t /= self.cur - self.min + t = (t - 1) * self.elapsed + return '%s: %s' % (prefix, self.format_duration(t)) + + @property + def speed(self): + if self.elapsed == 0: + result = 0.0 + else: + result = (self.cur - self.min) / self.elapsed + for unit in UNITS: + if result < 1000: + break + result /= 1000.0 + return '%d %sB/s' % (result, unit) + +# +# Glob functionality +# + +RICH_GLOB = re.compile(r'\{([^}]*)\}') +_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') +_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') + + +def iglob(path_glob): + """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" + if _CHECK_RECURSIVE_GLOB.search(path_glob): + msg = """invalid glob %r: recursive glob "**" must be used alone""" + raise ValueError(msg % path_glob) + if _CHECK_MISMATCH_SET.search(path_glob): + msg = """invalid glob %r: mismatching set marker '{' or '}'""" + raise ValueError(msg % path_glob) + return _iglob(path_glob) + + +def _iglob(path_glob): + rich_path_glob = RICH_GLOB.split(path_glob, 1) + if len(rich_path_glob) > 1: + assert len(rich_path_glob) == 3, rich_path_glob + prefix, set, suffix = rich_path_glob + for item in set.split(','): + for path in _iglob(''.join((prefix, item, suffix))): + yield path + else: + if '**' not in path_glob: + for item in std_iglob(path_glob): + yield item + else: + prefix, radical = path_glob.split('**', 1) + if prefix == '': + prefix = '.' + if radical == '': + radical = '*' + else: + # we support both + radical = radical.lstrip('/') + radical = radical.lstrip('\\') + for path, dir, files in os.walk(prefix): + path = os.path.normpath(path) + for file in _iglob(os.path.join(path, radical)): + yield file + + + +# +# HTTPSConnection which verifies certificates/matches domains +# + +class HTTPSConnection(httplib.HTTPSConnection): + ca_certs = None # set this to the path to the certs file (.pem) + check_domain = True # only used if ca_certs is not None + + # noinspection PyPropertyAccess + def connect(self): + sock = socket.create_connection((self.host, self.port), self.timeout) + if getattr(self, '_tunnel_host', False): + self.sock = sock + self._tunnel() + + if not hasattr(ssl, 'SSLContext'): + # For 2.x + if self.ca_certs: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, + cert_reqs=cert_reqs, + ssl_version=ssl.PROTOCOL_SSLv23, + ca_certs=self.ca_certs) + else: + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + context.options |= ssl.OP_NO_SSLv2 + if self.cert_file: + context.load_cert_chain(self.cert_file, self.key_file) + kwargs = {} + if self.ca_certs: + context.verify_mode = ssl.CERT_REQUIRED + context.load_verify_locations(cafile=self.ca_certs) + if getattr(ssl, 'HAS_SNI', False): + kwargs['server_hostname'] = self.host + self.sock = context.wrap_socket(sock, **kwargs) + if self.ca_certs and self.check_domain: + try: + match_hostname(self.sock.getpeercert(), self.host) + except CertificateError: + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + +class HTTPSHandler(BaseHTTPSHandler): + def __init__(self, ca_certs, check_domain=True): + BaseHTTPSHandler.__init__(self) + self.ca_certs = ca_certs + self.check_domain = check_domain + + def _conn_maker(self, *args, **kwargs): + """ + This is called to create a connection instance. Normally you'd + pass a connection class to do_open, but it doesn't actually check for + a class, and just expects a callable. As long as we behave just as a + constructor would have, we should be OK. If it ever changes so that + we *must* pass a class, we'll create an UnsafeHTTPSConnection class + which just sets check_domain to False in the class definition, and + choose which one to pass to do_open. + """ + result = HTTPSConnection(*args, **kwargs) + if self.ca_certs: + result.ca_certs = self.ca_certs + result.check_domain = self.check_domain + return result + + def https_open(self, req): + try: + return self.do_open(self._conn_maker, req) + except URLError as e: + if 'certificate verify failed' in str(e.reason): + raise CertificateError('Unable to verify server certificate ' + 'for %s' % req.host) + else: + raise + +# +# To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- +# Middle proxy using HTTP listens on port 443, or an index mistakenly serves +# HTML containing a http://xyz link when it should be https://xyz), +# you can use the following handler class, which does not allow HTTP traffic. +# +# It works by inheriting from HTTPHandler - so build_opener won't add a +# handler for HTTP itself. +# +class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): + def http_open(self, req): + raise URLError('Unexpected HTTP request on what should be a secure ' + 'connection: %s' % req) + +# +# XML-RPC with timeouts +# + +_ver_info = sys.version_info[:2] + +if _ver_info == (2, 6): + class HTTP(httplib.HTTP): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + + class HTTPS(httplib.HTTPS): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + +class Transport(xmlrpclib.Transport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.Transport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, x509 = self.get_host_info(host) + if _ver_info == (2, 6): + result = HTTP(h, timeout=self.timeout) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPConnection(h) + result = self._connection[1] + return result + +class SafeTransport(xmlrpclib.SafeTransport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.SafeTransport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, kwargs = self.get_host_info(host) + if not kwargs: + kwargs = {} + kwargs['timeout'] = self.timeout + if _ver_info == (2, 6): + result = HTTPS(host, None, **kwargs) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPSConnection(h, None, + **kwargs) + result = self._connection[1] + return result + + +class ServerProxy(xmlrpclib.ServerProxy): + def __init__(self, uri, **kwargs): + self.timeout = timeout = kwargs.pop('timeout', None) + # The above classes only come into play if a timeout + # is specified + if timeout is not None: + scheme, _ = splittype(uri) + use_datetime = kwargs.get('use_datetime', 0) + if scheme == 'https': + tcls = SafeTransport + else: + tcls = Transport + kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) + self.transport = t + xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) + +# +# CSV functionality. This is provided because on 2.x, the csv module can't +# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. +# + +def _csv_open(fn, mode, **kwargs): + if sys.version_info[0] < 3: + mode += 'b' + else: + kwargs['newline'] = '' + return open(fn, mode, **kwargs) + + +class CSVBase(object): + defaults = { + 'delimiter': str(','), # The strs are used because we need native + 'quotechar': str('"'), # str in the csv API (2.x won't take + 'lineterminator': str('\n') # Unicode) + } + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.stream.close() + + +class CSVReader(CSVBase): + def __init__(self, fn, **kwargs): + if 'stream' in kwargs: + stream = kwargs['stream'] + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + self.stream = stream + else: + self.stream = _csv_open(fn, 'r') + self.reader = csv.reader(self.stream, **self.defaults) + + def __iter__(self): + return self + + def next(self): + result = next(self.reader) + if sys.version_info[0] < 3: + for i, item in enumerate(result): + if not isinstance(item, text_type): + result[i] = item.decode('utf-8') + return result + + __next__ = next + +class CSVWriter(CSVBase): + def __init__(self, fn, **kwargs): + self.stream = _csv_open(fn, 'w') + self.writer = csv.writer(self.stream, **self.defaults) + + def writerow(self, row): + if sys.version_info[0] < 3: + r = [] + for item in row: + if isinstance(item, text_type): + item = item.encode('utf-8') + r.append(item) + row = r + self.writer.writerow(row) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/util.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/util.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4d2b82d7be75c89b9012f5d9a2fa2ccad82acfb GIT binary patch literal 51522 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/version.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/version.py new file mode 100644 index 0000000000..1e45e31182 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/version.py @@ -0,0 +1,719 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2013 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Implementation of a flexible versioning scheme providing support for PEP-386, +distribute-compatible and semantic versioning. +""" + +import re + +from .compat import string_types + +__all__ = ['NormalizedVersion', 'NormalizedMatcher', + 'LegacyVersion', 'LegacyMatcher', + 'SemanticVersion', 'SemanticMatcher', + 'AdaptiveVersion', 'AdaptiveMatcher', + 'UnsupportedVersionError', 'HugeMajorVersionError', + 'suggest_normalized_version', 'suggest_semantic_version', + 'suggest_adaptive_version', + 'normalized_key', 'legacy_key', 'semantic_key', 'adaptive_key', + 'get_scheme'] + +class UnsupportedVersionError(Exception): + """This is an unsupported version.""" + pass + + +class HugeMajorVersionError(UnsupportedVersionError): + """An irrational version because the major version number is huge + (often because a year or date was used). + + See `error_on_huge_major_num` option in `NormalizedVersion` for details. + This guard can be disabled by setting that option False. + """ + pass + + +class _Common(object): + def __repr__(self): + return "%s(%r)" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + +class Version(_Common): + def __init__(self, s): + self._string = s = s.strip() + self._parts = parts = self.parse(s) + assert isinstance(parts, tuple) + assert len(parts) > 0 + + def parse(self, s): + raise NotImplementedError('please implement in a subclass') + + def _check_compatible(self, other): + if type(self) != type(other): + raise TypeError('cannot compare %r and %r' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + def __lt__(self, other): + self._check_compatible(other) + return self._parts < other._parts + + def __gt__(self, other): + return not (self.__lt__(other) or self.__eq__(other)) + + def __le__(self, other): + return self.__lt__(other) or self.__eq__(other) + + def __ge__(self, other): + return self.__gt__(other) or self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self._parts) + + @property + def is_prerelease(self): + raise NotImplementedError('Please implement in subclasses.') + +class Matcher(_Common): + version_class = None + + predicate_re = re.compile(r"^(\w[\s\w'.-]*)(\((.*)\))?") + constraint_re = re.compile(r'^(<=|>=|<|>|!=|==)?\s*([^\s,]+)$') + + _operators = { + "<": lambda x, y: x < y, + ">": lambda x, y: x > y, + "<=": lambda x, y: x == y or x < y, + ">=": lambda x, y: x == y or x > y, + "==": lambda x, y: x == y, + "!=": lambda x, y: x != y, + } + + def __init__(self, s): + if self.version_class is None: + raise ValueError('Please specify a version class') + self._string = s = s.strip() + m = self.predicate_re.match(s) + if not m: + raise ValueError('Not valid: %r' % s) + groups = m.groups('') + self.name = groups[0].strip() + self.key = self.name.lower() # for case-insensitive comparisons + clist = [] + if groups[2]: + constraints = [c.strip() for c in groups[2].split(',')] + for c in constraints: + m = self.constraint_re.match(c) + if not m: + raise ValueError('Invalid %r in %r' % (c, s)) + groups = m.groups('==') + clist.append((groups[0], self.version_class(groups[1]))) + self._parts = tuple(clist) + + def match(self, version): + """Check if the provided version matches the constraints.""" + if isinstance(version, string_types): + version = self.version_class(version) + for operator, constraint in self._parts: + if not self._operators[operator](version, constraint): + return False + return True + + @property + def exact_version(self): + result = None + if len(self._parts) == 1 and self._parts[0][0] == '==': + result = self._parts[0][1] + return result + + def _check_compatible(self, other): + if type(self) != type(other) or self.name != other.name: + raise TypeError('cannot compare %s and %s' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return (self.key == other.key and self._parts == other._parts) + + def __ne__(self, other): + return not self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self.key) + hash(self._parts) + +# A marker used in the second and third parts of the `parts` tuple, for +# versions that don't have those segments, to sort properly. An example +# of versions in sort order ('highest' last): +# 1.0b1 ((1,0), ('b',1), ('z',)) +# 1.0.dev345 ((1,0), ('z',), ('dev', 345)) +# 1.0 ((1,0), ('z',), ('z',)) +# 1.0.post256.dev345 ((1,0), ('z',), ('z', 'post', 256, 'dev', 345)) +# 1.0.post345 ((1,0), ('z',), ('z', 'post', 345, 'z')) +# ^ ^ ^ +# 'b' < 'z' ---------------------/ | | +# | | +# 'dev' < 'z' ----------------------------/ | +# | +# 'dev' < 'z' ----------------------------------------------/ +# 'f' for 'final' would be kind of nice, but due to bugs in the support of +# 'rc' we must use 'z' +_FINAL_MARKER = ('z',) + +_VERSION_RE = re.compile(r''' + ^ + (?P<version>\d+\.\d+(\.\d+)*) # minimum 'N.N' + (?: + (?P<prerel>[abc]|rc) # 'a'=alpha, 'b'=beta, 'c'=release candidate + # 'rc'= alias for release candidate + (?P<prerelversion>\d+(?:\.\d+)*) + )? + (?P<postdev>(\.post(?P<post>\d+))?(\.dev(?P<dev>\d+))?)? + $''', re.VERBOSE) + + +def _parse_numdots(s, full_ver, drop_zeroes=False, min_length=0): + """Parse 'N.N.N' sequences, return a list of ints. + + @param s {str} 'N.N.N...' sequence to be parsed + @param full_ver_str {str} The full version string from which this + comes. Used for error strings. + @param min_length {int} The length to which to pad the + returned list with zeros, if necessary. Default 0. + """ + result = [] + for n in s.split("."): + #if len(n) > 1 and n[0] == '0': + # raise UnsupportedVersionError("cannot have leading zero in " + # "version number segment: '%s' in %r" % (n, full_ver)) + result.append(int(n)) + if drop_zeroes: + while (result and result[-1] == 0 and + (1 + len(result)) > min_length): + result.pop() + return result + +def pep386_key(s, fail_on_huge_major_ver=True): + """Parses a string version into parts using PEP-386 logic.""" + + match = _VERSION_RE.search(s) + if not match: + raise UnsupportedVersionError(s) + + groups = match.groupdict() + parts = [] + + # main version + block = _parse_numdots(groups['version'], s, min_length=2) + parts.append(tuple(block)) + + # prerelease + prerel = groups.get('prerel') + if prerel is not None: + block = [prerel] + block += _parse_numdots(groups.get('prerelversion'), s, min_length=1) + parts.append(tuple(block)) + else: + parts.append(_FINAL_MARKER) + + # postdev + if groups.get('postdev'): + post = groups.get('post') + dev = groups.get('dev') + postdev = [] + if post is not None: + postdev.extend((_FINAL_MARKER[0], 'post', int(post))) + if dev is None: + postdev.append(_FINAL_MARKER[0]) + if dev is not None: + postdev.extend(('dev', int(dev))) + parts.append(tuple(postdev)) + else: + parts.append(_FINAL_MARKER) + if fail_on_huge_major_ver and parts[0][0] > 1980: + raise HugeMajorVersionError("huge major version number, %r, " + "which might cause future problems: %r" % (parts[0][0], s)) + return tuple(parts) + + +PEP426_VERSION_RE = re.compile('^(\d+\.\d+(\.\d+)*)((a|b|c|rc)(\d+))?' + '(\.(post)(\d+))?(\.(dev)(\d+))?$') + +def pep426_key(s, _=None): + s = s.strip() + m = PEP426_VERSION_RE.match(s) + if not m: + raise UnsupportedVersionError('Not a valid version: %s' % s) + groups = m.groups() + nums = tuple(int(v) for v in groups[0].split('.')) + while len(nums) > 1 and nums[-1] == 0: + nums = nums[:-1] + + pre = groups[3:5] + post = groups[6:8] + dev = groups[9:11] + if pre == (None, None): + pre = () + else: + pre = pre[0], int(pre[1]) + if post == (None, None): + post = () + else: + post = post[0], int(post[1]) + if dev == (None, None): + dev = () + else: + dev = dev[0], int(dev[1]) + if not pre: + # either before pre-release, or final release and after + if not post and dev: + # before pre-release + pre = ('a', -1) # to sort before a0 + else: + pre = ('z',) # to sort after all pre-releases + # now look at the state of post and dev. + if not post: + post = ('_',) # sort before 'a' + if not dev: + dev = ('final',) + + #print('%s -> %s' % (s, m.groups())) + return nums, pre, post, dev + + +normalized_key = pep426_key + +class NormalizedVersion(Version): + """A rational version. + + Good: + 1.2 # equivalent to "1.2.0" + 1.2.0 + 1.2a1 + 1.2.3a2 + 1.2.3b1 + 1.2.3c1 + 1.2.3.4 + TODO: fill this out + + Bad: + 1 # mininum two numbers + 1.2a # release level must have a release serial + 1.2.3b + """ + def parse(self, s): return normalized_key(s) + + PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) + + @property + def is_prerelease(self): + return any(t[0] in self.PREREL_TAGS for t in self._parts) + +class UnlimitedMajorVersion(Version): + def parse(self, s): return normalized_key(s, False) + +# We want '2.5' to match '2.5.4' but not '2.50'. + +def _match_at_front(x, y): + if x == y: + return True + x = str(x) + y = str(y) + if not x.startswith(y): + return False + n = len(y) + return x[n] == '.' + +class NormalizedMatcher(Matcher): + version_class = NormalizedVersion + + _operators = dict(Matcher._operators) + _operators.update({ + "<=": lambda x, y: _match_at_front(x, y) or x < y, + ">=": lambda x, y: _match_at_front(x, y) or x > y, + "==": lambda x, y: _match_at_front(x, y), + "!=": lambda x, y: not _match_at_front(x, y), + }) + +_REPLACEMENTS = ( + (re.compile('[.+-]$'), ''), # remove trailing puncts + (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start + (re.compile('^[.-]'), ''), # remove leading puncts + (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses + (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha + (re.compile(r'\b(pre-alpha|prealpha)\b'), + 'pre.alpha'), # standardise + (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses +) + +_SUFFIX_REPLACEMENTS = ( + (re.compile('^[:~._+-]+'), ''), # remove leading puncts + (re.compile('[,*")([\]]'), ''), # remove unwanted chars + (re.compile('[~:+_ -]'), '.'), # replace illegal chars + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\.$'), ''), # trailing '.' +) + +_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') + +def suggest_semantic_version(s): + """ + Try to suggest a semantic form for a version for which + suggest_normalized_version couldn't come up with anything. + """ + result = s.strip().lower() + for pat, repl in _REPLACEMENTS: + result = pat.sub(repl, result) + if not result: + result = '0.0.0' + + # Now look for numeric prefix, and separate it out from + # the rest. + #import pdb; pdb.set_trace() + m = _NUMERIC_PREFIX.match(result) + if not m: + prefix = '0.0.0' + suffix = result + else: + prefix = m.groups()[0].split('.') + prefix = [int(i) for i in prefix] + while len(prefix) < 3: + prefix.append(0) + if len(prefix) == 3: + suffix = result[m.end():] + else: + suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] + prefix = prefix[:3] + prefix = '.'.join([str(i) for i in prefix]) + suffix = suffix.strip() + if suffix: + #import pdb; pdb.set_trace() + # massage the suffix. + for pat, repl in _SUFFIX_REPLACEMENTS: + suffix = pat.sub(repl, suffix) + + if not suffix: + result = prefix + else: + sep = '-' if 'dev' in suffix else '+' + result = prefix + sep + suffix + if not is_semver(result): + result = None + return result + + +def suggest_normalized_version(s): + """Suggest a normalized version close to the given version string. + + If you have a version string that isn't rational (i.e. NormalizedVersion + doesn't like it) then you might be able to get an equivalent (or close) + rational version from this function. + + This does a number of simple normalizations to the given string, based + on observation of versions currently in use on PyPI. Given a dump of + those version during PyCon 2009, 4287 of them: + - 2312 (53.93%) match NormalizedVersion without change + with the automatic suggestion + - 3474 (81.04%) match when using this suggestion method + + @param s {str} An irrational version string. + @returns A rational version string, or None, if couldn't determine one. + """ + try: + normalized_key(s) + return s # already rational + except UnsupportedVersionError: + pass + + rs = s.lower() + + # part of this could use maketrans + for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), + ('beta', 'b'), ('rc', 'c'), ('-final', ''), + ('-pre', 'c'), + ('-release', ''), ('.release', ''), ('-stable', ''), + ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), + ('final', '')): + rs = rs.replace(orig, repl) + + # if something ends with dev or pre, we add a 0 + rs = re.sub(r"pre$", r"pre0", rs) + rs = re.sub(r"dev$", r"dev0", rs) + + # if we have something like "b-2" or "a.2" at the end of the + # version, that is pobably beta, alpha, etc + # let's remove the dash or dot + rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) + + # 1.0-dev-r371 -> 1.0.dev371 + # 0.1-dev-r79 -> 0.1.dev79 + rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) + + # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 + rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) + + # Clean: v0.3, v1.0 + if rs.startswith('v'): + rs = rs[1:] + + # Clean leading '0's on numbers. + #TODO: unintended side-effect on, e.g., "2003.05.09" + # PyPI stats: 77 (~2%) better + rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) + + # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers + # zero. + # PyPI stats: 245 (7.56%) better + rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) + + # the 'dev-rNNN' tag is a dev tag + rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) + + # clean the - when used as a pre delimiter + rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) + + # a terminal "dev" or "devel" can be changed into ".dev0" + rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) + + # a terminal "dev" can be changed into ".dev0" + rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) + + # a terminal "final" or "stable" can be removed + rs = re.sub(r"(final|stable)$", "", rs) + + # The 'r' and the '-' tags are post release tags + # 0.4a1.r10 -> 0.4a1.post10 + # 0.9.33-17222 -> 0.9.33.post17222 + # 0.9.33-r17222 -> 0.9.33.post17222 + rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) + + # Clean 'r' instead of 'dev' usage: + # 0.9.33+r17222 -> 0.9.33.dev17222 + # 1.0dev123 -> 1.0.dev123 + # 1.0.git123 -> 1.0.dev123 + # 1.0.bzr123 -> 1.0.dev123 + # 0.1a0dev.123 -> 0.1a0.dev123 + # PyPI stats: ~150 (~4%) better + rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) + + # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: + # 0.2.pre1 -> 0.2c1 + # 0.2-c1 -> 0.2c1 + # 1.0preview123 -> 1.0c123 + # PyPI stats: ~21 (0.62%) better + rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) + + # Tcl/Tk uses "px" for their post release markers + rs = re.sub(r"p(\d+)$", r".post\1", rs) + + try: + normalized_key(rs) + except UnsupportedVersionError: + rs = None + return rs + +def suggest_adaptive_version(s): + return suggest_normalized_version(s) or suggest_semantic_version(s) + +# +# Legacy version processing (distribute-compatible) +# + +_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) +_VERSION_REPLACE = { + 'pre':'c', + 'preview':'c', + '-':'final-', + 'rc':'c', + 'dev':'@', + '': None, + '.': None, +} + + +def legacy_key(s): + def get_parts(s): + result = [] + for p in _VERSION_PART.split(s.lower()): + p = _VERSION_REPLACE.get(p, p) + if p: + if '0' <= p[:1] <= '9': + p = p.zfill(8) + else: + p = '*' + p + result.append(p) + result.append('*final') + return result + + result = [] + for p in get_parts(s): + if p.startswith('*'): + if p < '*final': + while result and result[-1] == '*final-': + result.pop() + while result and result[-1] == '00000000': + result.pop() + result.append(p) + return tuple(result) + +class LegacyVersion(Version): + def parse(self, s): return legacy_key(s) + + PREREL_TAGS = set( + ['*a', '*alpha', '*b', '*beta', '*c', '*rc', '*r', '*@', '*pre'] + ) + + @property + def is_prerelease(self): + return any(x in self.PREREL_TAGS for x in self._parts) + +class LegacyMatcher(Matcher): + version_class = LegacyVersion + +# +# Semantic versioning +# + +_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' + r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' + r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) + +def is_semver(s): + return _SEMVER_RE.match(s) + +def semantic_key(s): + def make_tuple(s, absent): + if s is None: + result = (absent,) + else: + parts = s[1:].split('.') + # We can't compare ints and strings on Python 3, so fudge it + # by zero-filling numeric values so simulate a numeric comparison + result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) + return result + + result = None + m = is_semver(s) + if not m: + raise UnsupportedVersionError(s) + groups = m.groups() + major, minor, patch = [int(i) for i in groups[:3]] + # choose the '|' and '*' so that versions sort correctly + pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') + return ((major, minor, patch), pre, build) + + +class SemanticVersion(Version): + def parse(self, s): return semantic_key(s) + + @property + def is_prerelease(self): + return self._parts[1][0] != '|' + + +class SemanticMatcher(Matcher): + version_class = SemanticVersion + +# +# Adaptive versioning. When handed a legacy version string, tries to +# determine a suggested normalized version, and work with that. +# + +def adaptive_key(s): + try: + result = normalized_key(s, False) + except UnsupportedVersionError: + ss = suggest_normalized_version(s) + if ss is not None: + result = normalized_key(ss) # "guaranteed" to work + else: + ss = s # suggest_semantic_version(s) or s + result = semantic_key(ss) # let's hope ... + return result + + +class AdaptiveVersion(NormalizedVersion): + def parse(self, s): return adaptive_key(s) + + @property + def is_prerelease(self): + try: + normalized_key(self._string) + not_sem = True + except UnsupportedVersionError: + ss = suggest_normalized_version(self._string) + not_sem = ss is not None + if not_sem: + return any(t[0] in self.PREREL_TAGS for t in self._parts) + return self._parts[1][0] != '|' + +class AdaptiveMatcher(NormalizedMatcher): + version_class = AdaptiveVersion + + +class VersionScheme(object): + def __init__(self, key, matcher, suggester=None): + self.key = key + self.matcher = matcher + self.suggester = suggester + + def is_valid_version(self, s): + try: + self.matcher.version_class(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_matcher(self, s): + try: + self.matcher(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_constraint_list(self, s): + """ + Used for processing some metadata fields + """ + return self.is_valid_matcher('dummy_name (%s)' % s) + + def suggest(self, s): + if self.suggester is None: + result = None + else: + result = self.suggester(s) + return result + +_SCHEMES = { + 'normalized': VersionScheme(normalized_key, NormalizedMatcher, + suggest_normalized_version), + 'legacy': VersionScheme(legacy_key, LegacyMatcher, lambda self, s: s), + 'semantic': VersionScheme(semantic_key, SemanticMatcher, + suggest_semantic_version), + 'adaptive': VersionScheme(adaptive_key, AdaptiveMatcher, + suggest_adaptive_version), +} + +_SCHEMES['default'] = _SCHEMES['adaptive'] + +def get_scheme(name): + if name not in _SCHEMES: + raise ValueError('unknown scheme name: %r' % name) + return _SCHEMES[name] diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/version.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/version.pyc new file mode 100644 index 0000000000000000000000000000000000000000..368cf690f9e7b45cdf165a8bef380d1d3c66b292 GIT binary patch literal 29953 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%0D{44Qq?a)QI^9H3NyU%i84F>D;KJ5Br(CwNtr z;}x5Lx{34!vNd!*oRJSHHHy$QQm2@b8m!j1#*LDMB#(y{hnPh$g>(C)@jzVDaL0K9 z!1atJET+XLAzN}nc}lzP)2&!HaS{DFzZf>d<#u#&0KJoJQ?P1NkIFU?L(7G5taUOV zutFjrPS;sMo!UhW!uLK)qg7Ffg?iI(Xsk0cc7O!hx5d3Dtc`~ctofRi*;tguVzzH< z<(ilJRqj?G_h(L>?IWF*Xt94%iCVR(IH#jbldwiIC^tq?K##3>AEhNk^}&n8ma&S$ z9--Tcxe~ty8plzB#{DmJ)6zIlF4D0B_<Phj=Ij9t<1Z*(?$sB<LT-1ih+mkgk-wO) zp$h$QI<Ml1uOI*+&(08l0)fO>tF&c~KxDA`U_V$Cb8`>pxv+fYwTkr)3pGr`M2z?b zkm-uM*4;i~{6A>5f}VJHvV1BN#g4iV9qL$bIQl~7|1EqhPra4#(|YZH^H27_l~4Pp zUVNWl^S!p_y?iFifBTc`pPX|S>JT9)D7dX|$I2;J{r=u&eRW+cxB^Gq&a;+_zw<aM zlGTU4`f28)nH<>&pN0*0sS9c7q5m{={p<_;VC#OPzj*odyk0XqCRfijf|tlowTY-q zsxlFE*@G{AD!fs?;<3TzG4%52I8Tbg#<j9VBIdo1@oqIFHE|81rR;h>d1BgBFt{IK zrOR9NH;nnQxcg*tOT3U@Ai~s^NLN8346-jhDJbs<OTxZVFqRfmmrN*%g|nXVV!Cd5 z)86#Q)!SD-u;0BFJHc*sED6fgPMZhA7s>Ng0+U@Y*!dM%@|!DGfytiA7Gx(od)>U= z$`j{u+DVhMg!KUX^$G(XIuTZ=<M0sozGRB@UuO{OVX0!9*l_}DoE;xTq_7XPG51<d z=fpm3HtI__q7?KW7R%@+%U#72??aH$O;XJ4_*J%YiQHPbV)M0ffnBgcrHhv{>v8dV zba~q@D|nh<L4S<36!d2E4W{Ws7Hr~-eT7D^vuj!pRwF<N^Hor$LKTz%^pR}p%OoeW zfOo=VYh_#7NkRb%ks1)=@00VMr3`QRXna65)Q=@z*lc1(tdX=|-YvXajP69*qjAas zQYiI2nn~$qEc7x58Lx^$J?L#7;5vKJFixStep&T9Rj9_A9q!at&jM~?01x>I{;eUe zeg+U;#S?o7ES`rr`z>cRoJoi5!Mz{OY6U7taB3EG7pnje<1t~zzQtP&#hip;SiewY z3{7Vd3#ENHozXS?^bgT1yIwK?Zv|}SPxV>4UWAz&c_4lJuzF5NsKj{NX;`1XFswdL zBrZBFxRk7E&GnJBZ8sD!w;OvTWkVqm2EDN414DVy%C?=R<^Bs}IdWm`mMh?2<Z!rz zr81&jM<yt#gSu@RMtZA7vCSh#9*HS!MmoK0txUzl!lVP5_sb_H=SIEr$fnKt!Ts_a z^e$tvkxrE>CnXOeb#hKD@q^U+bX4mP-??Kwcv`YYxUKIg^)~kNshITeK~#diMsBJ4 z1ht+)J3lxz@mzFXnJV)ozp>!2`mi*ORpuq#%IqZjI=(`MIH`nH#1ug`ad3Dq+pLsE zD<zt!Dr2LX6UJ@N@1OgsT*YWl==J`@_*-M8`<1yljr;yr=T1~z43bD%DUZtAi3+I9 znkHtL^;1CBiu~_@E4MbOnP_O0Gsg1UWWKM@z0v0wBds_zJlyi2v2o0k5$J*(6MsY+ zj(4a`&|CN=Cz~R6N1O|6>Z=l|R{2XNaxah~eS`||yi`#;sH290MgC?xX_bJU1*D(; zW<RBZX89;J(8z&A2$+vyJpGS+g%%t82RDf)e*zDk{w&zk{|9@+CSPKcZ?X&5*(AKx zY<sBc&9qHu*t0fs4yt^i>>(6Jdnn+dJN<QRRQ@W<TfLSAE=w0o^!v{87=75j1-P^T zQ2+GgsdE<qrAq2g9kfdLzD=nbDG*blKX)KrH>HV#dLJ2}bU%b|hmaBbx1ECczd2CT z*{MOwY>87J{|y8Z7;i@_l%A8z3|t=;x#XS)m^7DU>+1Q>(aI?UmWqD+1qe8d*KGvN z<2scWy4|)bV-`dZh|A4IYqrvYoGRm25|-5=<<T$6dJ?E66`n}!=W?K%Mh2^~_NH%r zeC68o&FPujvzD#u&Rec!=F^+g-i>QjNNVrj_^eMS{Q+y2M*ApZH&_>2grZw(>`|-U z^az>`<&f&^r|+XYl<R#B5qdbU04P!2P2G?HYSluwS(Fvx;tW-YGuRF3iBdDdLVek4 z>bnb!lI+%P=fif7xNag{rF+&>(p71}ckI_mRme3vs41d+Gvd67ldJpSzjYvY4ivWp zey@-};EYf^lsoL~!F$oVZgA_MQ{*)~u?vd5vOn1#xiUdvX74ul8F~Ob9x~A}<2X*! zF`tq2VDVa_Giw4|adO%OXH4)t6Pz`{J0^J71n=SM2orqY1m{g~!2}mgaLELh&BER_ zi%9OX;KD(q5())vwIxaRjwG%MoM^@h5uJht7`orJiMUe;n&dS(Uo*k$>k_|Xf;W1J zC_?=@E_Q(}Yqx{fzy-nSql>|j7YZbuc#Ah9t!;0VcOtD##QI;~v*RWxt;;#KQ6g^0 z8CsVU7vxN=OT@J}>s!aIINx2DbIJs8qfCLdvPW}{SIqg{=Amr9U&~>>gDWCMoORM7 z$qIh~OqsQpskpw|yZt0pqr0_6i}!A{<VLxO3tgJoCu@OEl!Z4I+?7^0RhA_-y43uq z3oq(1iBhI(EY-_l*<E+3hNxQr%QrJO>W^^%yEDedo2uX1=iqF>OEuUnSkic5N}oQm z1VX7^kEyP#!L(2EG?40Wq1&wSOnWkf+f*mAX+pwYD*{i5SO>r}(CB6oIF<GT!~$Z% zoyU1`>;J&Zfaakoe41Shl(ZhZwQdwaZQ59&S2OQ4LEc*{w{Dc(4+LG`4Z2Hh_+Y5_ zxQPW>(yj+x`AXbcxrRcgrl#JTaL=52_Z>QH076SvSv%>TI(_n#Tl(JV@_VO`jafg~ z^?=s40OhG$d+0Zln^Ro7SD-G}?{->{K<l-1djg!)qe=JlnRm{(rFT!3r_N;6KjQ>h zldeFU>`%Nq1zyw-Tfv6DBpYA$lHwJ$vX`x2M(nQFQYXkY!JA#^^DR$}Z1cmlEMWx4 z3BotIUq!sC<^H7U)FwDd-p*SF)$||&8}Dy2SYbd7s4XH(hGlO_W+%Zair<?|ypHrz zPG88FPC~r^1oeKziauvRtA(~4S9O+comAS0OGcHJ)kI`UDX>o36hx+UaIKWNRo$;l zR>WfCXqGZpPF7CooLBONrcE2Y6v1Z+tn{cx3tk)<$xh!de>Hc>);LxvUrHEpuZ>SK zCME3j6nIyZE?qi8ex4>IzN;gsk|v4D;`x&or_?y=DWT=bXcb|l9I@i0apt7w6k4a? zHfasC*8Dme??=*oIAl%Eu{=wMjkL#jnNk__!R8r5(y01Z5)@Z0uu*`V1KW&NCs!x? zo9CR!oeS+#v`>1viu;gO=fCXFnSRAQP(*lI51*}0CT3(i;2K7J>SD|)+sWv9)t{7# zV=boHMDqMSbnB%_>JUcSG~!r>l{N`f+C(*>q)i|^Cwq9=D@f$*%Qwh;31$j|ZB8bq z2-}y;aipkAX-=7YNNitae<M!Y*PkKQSA`~eZO1tBUfPTmfQbikm++<$lP3pRHoq2n zclhaVG59qG;`9g=aeCG&Vb5r^qWYru+xW62{2Q0UACrIk5D~MFewTx==?&y|<;j=j z@$4c`mp|wn+;MQ=VE!Qd8FueL9I@oLaIkoAC*tth+=H@18#v<9<-=+^u&v{8AIJ#U zHpE|0O0zQ_IZA5?8D$KQ4K|UfrHW}k@KqGWI9l7FGm~G=omd6wSj8HioEsC0dQXwp zy71VQrgbAkne=`G-$aN-H81y!P(%bGlsMggiU_3NZ^XbZBFvfP-zGz3A#{E2*ORkY zkO8ff8vX6W8-oJuqFFvpy>V1y2+48;5*~HYdbi@Z^W?HzDU+N($#OyvL{7b@IUiZ4 zONi>03#L%~I(T46?Glk^b@*haM%g2ehhv$=6aPK}cHc3}KjdVi!i+V?OzV^vt^k7E z45=P<qc(`CibSsy0_=XyxC8mej%j^L=@^k_&g7h^!H+zyY<=Q#rU{810&5P!Drykh z%nEI1*<YJx&!3TzPP(m`n9}y3=zH=mP;^{VH?FzU7_FR``bgcn;@!3mky`5%RQj9% zB;t9LM5VC#lEz&Lh*lv_RPH%GZi%P{tp?@?_xj0q?QNnr_ZkB!?RA}ma-IFTAsiLi z?RbA5>3z_Ur-XJ33!O>%drl=k_C(RIp@?^%!3_pS5ZDhI`X4jxHiJLn2Rxg;sL3%L z<ETlCj8oig&x7s439x;7;P1&V{29V?6;J#Df-v<{_(t}&5DF8>W%A$zI$9?M>&yf% zrbW3Y;u0>HE9}8|;3O;-{kLeL6FvJ8n<8bDz>`u#t}Txpw)+z|bnP2k0yrArE)j6} zYf0j`Z;`|58abTtdGTiB(lRQcCJo|vR1*;$w?`kxFN@V1#|AI@k<t*-k^g&RJUa+V zGY5|^5D~}xSh~o}5D)UC{Uo`aj<#S6))rzqOTJC)?jI1y1YTly_b{mB)Q}K@XkalQ zd)>rM@eEp@PJ0NWI~lFMGbx+|kLLuojj^3bb&(w&M1;zwyffN!MIs2V;t^kNm$)@G zVx=NEAzlX%vrYx9P3J7_S7l+ai8C;O=5C}jP;lZIyvuVGLW;Qf<WFgmyvo$%dvny< zCvoWeaTEr!3?!d#`#72{O0;5`lf>F)_i~W3bSW`|jL_BD>6_Rhq2-jKbc;E+pQ2m0 zQxF-;h?1)$=&s?3{}F<W*$TvLVe_|~mOb$v!<!W>g}BqinI9|*)Pcx6Aca4OKG+l~ z?BUTamrg*2Murbe1-iiky*;T>N5#s^BQM}}l6T9Y;XU`fXr4ozCQnr8-r+S5kNQ<y zTh99lD22?_2<IKiBQA?920DkX)308tNBAy*32NR{x?|qNWLZ9u?z=g4nJ1Kw>zqEc zmKsZRM<xyQ53gXe(Ds1FpnJb9Th@OV*6P=}l&m)b1scl^9YIVSa6Jy{kVd_Km}MH} zCl17iCJCoU!~q<``<Af*_ArY7IIQYo$j^u?+=30noL#vC`EyR4D_soXs(etz4E2qf zC}w3oB9!&9mEgj`dVj(|!~BRbW%*si#1-mNUK^`JPpKGG{cyRL6v26(@75bo#^Oi8 zCQ=tNw08*(YBInd4bfvAKJ5r6a>skT5i#;Ap4deYZp0gXqqPGb2&9y`g~W{TAw&f6 zjhP<yV!JRs5Iro@vz{!{#SE+Pk%&olu$;?w0AKo!k9&X00cpQ}GmG^$awKi$4#GXW z%~5eCu!j@l*6!ikz)g<bT4FZ|Ozzw@{MFB2ch}Yc>6g%3Qk%W5NdCGh%yE@Chmgm^ zu4yp@h^!n))FU7~*crgb-feya(+7@|!_-x!sfz-*7M7*WD8&<DAE}%qUle-s1@j;S zNQ)JRktiEkZ|7!zdhUOgl8JtaqHF!Jdy+S-$Vz01x8^Dj`a5DcDN)Kp6-9@0IF7-5 z`0{2ECH7*w5T)NDG|(S=6?uwC{Hy=ZVdW4J;>XgyU|Z+qIYOohAQSW{K&ELS(?Bmz zKR)%)C8~4h{?QuG=$$6@jAj#Xys+naM<58}<_LRC*Q$nyH0;%B_UtVLK+M0UyR;;U zK2hxlsAZdoYQM)>;1F?wg$tTonX$BfkTEHS4>NX)L6JdkkpUEmT&I=B?LZ6^?jfdU zfcMXkATre(?Itn;+$4U&@re<D)I^o;ZZHBbgB|#evt2h0%A>!@ZvQ`T8j@_ccGDmd z{hbWQ9BCr&Sl6;y+z7N3){sFzM8d0h;&%~*mK}rY34XEAJ4sdb4H6}WFe0ZTM&M>( zZ->`O8g2@;0R((l<uyDpITi{n&~zdqp$K=p(|-#oP=NI`E5hUVkzIIfuPutCaZIeJ zxF4HU+e@UF(fbz+evZImIwG6N3B8Tx{vH9$k%QZ%4+_W4fn+-~LAnBW2{C#Ufvr~p zX=)A|G<_2+O+B5^R3vM+?K#_v0nt#2P<_<k6TDj8aHieUZo3uG=y2DESCUR2rdJ64 z5urn4jDZ#CWsv|_cGkg&>>@TD3!@Z35=bq8EC(}{a4_ouB&-mCdX#ee!Y0A&f6@;d zOCA&0r0~)DA>UvDL+ggUXwQm7a+i`X0zCw>Yaws}7;kCdsqz>%M$qp7|20p?$62wk z5%dmx$#M)Ii=`F)H#%<VSUhI;ihqeFw*jlt;og^FRPQdaDzB#aIiW{DnSl(S_$rv4 zKqP@#s^S2hA>P0vQ47%`8B#!z`qfb)Cf3j@a<mQB6?c+^0R9^enq-|9(iL&ZO=3bm zfE24?6#q@S<oy`~&ZPIR82oDlJ+h$KCb9$n9IgKWJ5MzUbOJkygZM2-k<xRv(nN9+ z$qi{Dxv()+=?vj*J0PacPW%TBhaHk`%KqnAGHIpGt9nWQQ!H(1fxR;&(*zL1G|c0O z058FGKgN;pH>o+|VmE!aYT_H-N9@YCr@gz)$IaHWX8OOX@t#KB&7hU5#;dc}K7?=T ztalmp+ogS-F+4WdL<}Gw_@4+eyI0a5!1m}fc7_bTJ#u#kF+tS+R}>yzEk97L`nW`= zDt=&kxfbd_q_RvgkxFG+^N&JYG(qE>?z;BQG6n^U@$NDYmlE{MS3jAZ_7<4RO~U(v zfi{jNV}NvW;QAS3;=+lL-d7BM$bdNN{g}Z|82ly!?sAqrm%5uJZg_vl#DBnGF9VSj zZC3x7uhIf?+w`=<6EYsjy(i{zkTEVC@82;X0DCj1*yc^2(CNJW57sVH5Q+Z~K_Ry* z_cCPY-ftdKbul-*V|ZwIaCm%pwva0n_vZH=+;w7ae%E**H~i}Gj^fbpuKh3;_y1B! zcz7U9Ih@~{E0&AR;?9F$8+P{n4h<AXhF==qSwzdYuY4G-3>J3}?;Rc(K1w%}Azbgs Lu;}d0@5%ii&`pAd literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/wheel.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/wheel.py new file mode 100644 index 0000000000..8274732adc --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/wheel.py @@ -0,0 +1,638 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import base64 +import codecs +import datetime +import distutils.util +from email import message_from_file +import hashlib +import imp +import json +import logging +import os +import posixpath +import re +import shutil +import sys +import tempfile +import zipfile + +from . import DistlibException +from .compat import sysconfig, ZipFile, fsdecode, text_type, filter +from .database import DistributionPath, InstalledDistribution +from .metadata import Metadata +from .scripts import ScriptMaker +from .util import (FileOperator, convert_path, CSVReader, CSVWriter, + cached_property, get_cache_base) + + +logger = logging.getLogger(__name__) + + +if hasattr(sys, 'pypy_version_info'): + IMP_PREFIX = 'pp' +elif sys.platform.startswith('java'): + IMP_PREFIX = 'jy' +elif sys.platform == 'cli': + IMP_PREFIX = 'ip' +else: + IMP_PREFIX = 'cp' + +VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') +if not VER_SUFFIX: # pragma: no cover + VER_SUFFIX = '%s%s' % sys.version_info[:2] +PYVER = 'py' + VER_SUFFIX +IMPVER = IMP_PREFIX + VER_SUFFIX + +ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_') + +ABI = sysconfig.get_config_var('SOABI') +if ABI and ABI.startswith('cpython-'): + ABI = ABI.replace('cpython-', 'cp') +else: + ABI = 'none' + +FILENAME_RE = re.compile(r''' +(?P<nm>[^-]+) +-(?P<vn>\d+[^-]*) +(-(?P<bn>\d+[^-]*))? +-(?P<py>\w+\d+(\.\w+\d+)*) +-(?P<bi>\w+) +-(?P<ar>\w+) +\.whl$ +''', re.IGNORECASE | re.VERBOSE) + +NAME_VERSION_RE = re.compile(r''' +(?P<nm>[^-]+) +-(?P<vn>\d+[^-]*) +(-(?P<bn>\d+[^-]*))?$ +''', re.IGNORECASE | re.VERBOSE) + +SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') + +if os.sep == '/': + to_posix = lambda o: o +else: + to_posix = lambda o: o.replace(os.sep, '/') + + +class Mounter(object): + def __init__(self): + self.impure_wheels = {} + self.libs = {} + + def add(self, pathname, extensions): + self.impure_wheels[pathname] = extensions + self.libs.update(extensions) + + def remove(self, pathname): + extensions = self.impure_wheels.pop(pathname) + for k, v in extensions: + if k in self.libs: + del self.libs[k] + + def find_module(self, fullname, path=None): + if fullname in self.libs: + result = self + else: + result = None + return result + + def load_module(self, fullname): + if fullname in sys.modules: + result = sys.modules[fullname] + else: + if fullname not in self.libs: + raise ImportError('unable to find extension for %s' % fullname) + result = imp.load_dynamic(fullname, self.libs[fullname]) + result.__loader__ = self + result.__package__, _ = fullname.rsplit('.', 1) + return result + +_hook = Mounter() + + +class Wheel(object): + """ + Class to build and install from Wheel files (PEP 427). + """ + + wheel_version = (1, 0) + hash_kind = 'sha256' + + def __init__(self, filename=None, sign=False, verify=False): + """ + Initialise an instance using a (valid) filename. + """ + self.sign = sign + self.verify = verify + self.buildver = '' + self.pyver = [PYVER] + self.abi = ['none'] + self.arch = ['any'] + self.dirname = os.getcwd() + if filename is None: + self.name = 'dummy' + self.version = '0.1' + self._filename = self.filename + else: + m = NAME_VERSION_RE.match(filename) + if m: + info = m.groupdict('') + self.name = info['nm'] + self.version = info['vn'] + self.buildver = info['bn'] + self._filename = self.filename + else: + dirname, filename = os.path.split(filename) + m = FILENAME_RE.match(filename) + if not m: + raise DistlibException('Invalid name or ' + 'filename: %r' % filename) + if dirname: + self.dirname = os.path.abspath(dirname) + self._filename = filename + info = m.groupdict('') + self.name = info['nm'] + self.version = info['vn'] + self.buildver = info['bn'] + self.pyver = info['py'].split('.') + self.abi = info['bi'].split('.') + self.arch = info['ar'].split('.') + + @property + def filename(self): + """ + Build and return a filename from the various components. + """ + if self.buildver: + buildver = '-' + self.buildver + else: + buildver = '' + pyver = '.'.join(self.pyver) + abi = '.'.join(self.abi) + arch = '.'.join(self.arch) + return '%s-%s%s-%s-%s-%s.whl' % (self.name, self.version, buildver, + pyver, abi, arch) + + @property + def tags(self): + for pyver in self.pyver: + for abi in self.abi: + for arch in self.arch: + yield pyver, abi, arch + + @cached_property + def metadata(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + metadata_filename = posixpath.join(info_dir, 'METADATA') + wrapper = codecs.getreader('utf-8') + with ZipFile(pathname, 'r') as zf: + with zf.open(metadata_filename) as bf: + wf = wrapper(bf) + result = Metadata() + result.read_file(wf) + return result + + @cached_property + def info(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + metadata_filename = posixpath.join(info_dir, 'WHEEL') + wrapper = codecs.getreader('utf-8') + with ZipFile(pathname, 'r') as zf: + with zf.open(metadata_filename) as bf: + wf = wrapper(bf) + message = message_from_file(wf) + result = dict(message) + return result + + def process_shebang(self, data): + m = SHEBANG_RE.match(data) + if m: + data = b'#!python' + data[m.end():] + else: + cr = data.find(b'\r') + lf = data.find(b'\n') + if cr < 0 or cr > lf: + term = b'\n' + else: + if data[cr:cr + 2] == b'\r\n': + term = b'\r\n' + else: + term = b'\r' + data = b'#!python' + term + data + return data + + def get_hash(self, data, hash_kind=None): + if hash_kind is None: + hash_kind = self.hash_kind + try: + hasher = getattr(hashlib, hash_kind) + except AttributeError: + raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) + result = hasher(data).digest() + result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') + return hash_kind, result + + def write_record(self, records, record_path, base): + with CSVWriter(record_path) as writer: + for row in records: + writer.writerow(row) + p = to_posix(os.path.relpath(record_path, base)) + writer.writerow((p, '', '')) + + def build(self, paths, tags=None): + """ + Build a wheel from files in specified paths, and use any specified tags + when determining the name of the wheel. + """ + if tags is None: + tags = {} + + libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] + if libkey == 'platlib': + is_pure = 'false' + default_pyver = [IMPVER] + default_abi = [ABI] + default_arch = [ARCH] + else: + is_pure = 'true' + default_pyver = [PYVER] + default_abi = ['none'] + default_arch = ['any'] + + self.pyver = tags.get('pyver', default_pyver) + self.abi = tags.get('abi', default_abi) + self.arch = tags.get('arch', default_arch) + + libdir = paths[libkey] + + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + archive_paths = [] + + # First, stuff which is not in site-packages + for key in ('data', 'headers', 'scripts'): + if key not in paths: + continue + path = paths[key] + if os.path.isdir(path): + for root, dirs, files in os.walk(path): + for fn in files: + p = fsdecode(os.path.join(root, fn)) + rp = os.path.relpath(p, path) + ap = to_posix(os.path.join(data_dir, key, rp)) + archive_paths.append((ap, p)) + if key == 'scripts' and not p.endswith('.exe'): + with open(p, 'rb') as f: + data = f.read() + data = self.process_shebang(data) + with open(p, 'wb') as f: + f.write(data) + + # Now, stuff which is in site-packages, other than the + # distinfo stuff. + path = libdir + distinfo = None + for root, dirs, files in os.walk(path): + if root == path: + # At the top level only, save distinfo for later + # and skip it for now + for i, dn in enumerate(dirs): + dn = fsdecode(dn) + if dn.endswith('.dist-info'): + distinfo = os.path.join(root, dn) + del dirs[i] + break + assert distinfo, '.dist-info directory expected, not found' + + for fn in files: + # comment out next suite to leave .pyc files in + if fsdecode(fn).endswith(('.pyc', '.pyo')): + continue + p = os.path.join(root, fn) + rp = to_posix(os.path.relpath(p, path)) + archive_paths.append((rp, p)) + + # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. + files = os.listdir(distinfo) + for fn in files: + if fn not in ('RECORD', 'INSTALLER', 'SHARED'): + p = fsdecode(os.path.join(distinfo, fn)) + ap = to_posix(os.path.join(info_dir, fn)) + archive_paths.append((ap, p)) + + import distlib + + wheel_metadata = [ + 'Wheel-Version: %d.%d' % self.wheel_version, + 'Generator: distlib %s' % distlib.__version__, + 'Root-Is-Purelib: %s' % is_pure, + ] + for pyver, abi, arch in self.tags: + wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) + p = os.path.join(distinfo, 'WHEEL') + with open(p, 'w') as f: + f.write('\n'.join(wheel_metadata)) + ap = to_posix(os.path.join(info_dir, 'WHEEL')) + archive_paths.append((ap, p)) + + # Now, at last, RECORD. + # Paths in here are archive paths - nothing else makes sense. + records = [] + hasher = getattr(hashlib, self.hash_kind) + for ap, p in archive_paths: + with open(p, 'rb') as f: + data = f.read() + digest = '%s=%s' % self.get_hash(data) + size = os.path.getsize(p) + records.append((ap, digest, size)) + + p = os.path.join(distinfo, 'RECORD') + self.write_record(records, p, libdir) + ap = to_posix(os.path.join(info_dir, 'RECORD')) + archive_paths.append((ap, p)) + # Now, ready to build the zip file + pathname = os.path.join(self.dirname, self.filename) + with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: + for ap, p in archive_paths: + logger.debug('Wrote %s to %s in wheel', p, ap) + zf.write(p, ap) + return pathname + + def install(self, paths, dry_run=False, executable=None, warner=None): + """ + Install a wheel to the specified paths. If ``executable`` is specified, + it should be the Unicode absolute path the to the executable written + into the shebang lines of any scripts installed. If ``warner`` is + specified, it should be a callable, which will be called with two + tuples indicating the wheel version of this software and the wheel + version in the file, if there is a discrepancy in the versions. + This can be used to issue any warnings to raise any exceptions. + """ + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if (file_version != self.wheel_version) and warner: + warner(self.wheel_version, file_version) + + if message['Root-Is-Purelib'] == 'true': + libdir = paths['purelib'] + else: + libdir = paths['platlib'] + records = {} + with zf.open(record_name) as bf: + with CSVReader(record_name, stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + data_pfx = posixpath.join(data_dir, '') + script_pfx = posixpath.join(data_dir, 'scripts', '') + + fileop = FileOperator(dry_run=dry_run) + fileop.record = True # so we can rollback if needed + + bc = not sys.dont_write_bytecode # Double negatives. Lovely! + + outfiles = [] # for RECORD writing + + # for script copying/shebang processing + workdir = tempfile.mkdtemp() + # set target dir later + # we default add_launchers to False, as the + # Python Launcher should be used instead + maker = ScriptMaker(workdir, None, fileop=fileop, + add_launchers=False) + maker.executable = executable + try: + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + is_script = (u_arcname.startswith(script_pfx) + and not u_arcname.endswith('.exe')) + + if u_arcname.startswith(data_pfx): + _, where, rp = u_arcname.split('/', 2) + outfile = os.path.join(paths[where], convert_path(rp)) + else: + # meant for site-packages. + if u_arcname in (wheel_metadata_name, record_name): + continue + outfile = os.path.join(libdir, convert_path(u_arcname)) + if not is_script: + with zf.open(arcname) as bf: + fileop.copy_stream(bf, outfile) + outfiles.append(outfile) + # Double check the digest of the written file + if not dry_run and row[1]: + with open(outfile, 'rb') as bf: + data = bf.read() + _, newdigest = self.get_hash(data, kind) + if newdigest != digest: + raise DistlibException('digest mismatch ' + 'on write for ' + '%s' % outfile) + if bc and outfile.endswith('.py'): + try: + pyc = fileop.byte_compile(outfile) + outfiles.append(pyc) + except Exception: + # Don't give up if byte-compilation fails, + # but log it and perhaps warn the user + logger.warning('Byte-compilation failed', + exc_info=True) + else: + fn = os.path.basename(convert_path(arcname)) + workname = os.path.join(workdir, fn) + with zf.open(arcname) as bf: + fileop.copy_stream(bf, workname) + + dn, fn = os.path.split(outfile) + maker.target_dir = dn + filenames = maker.make(fn) + fileop.set_executable_mode(filenames) + outfiles.extend(filenames) + + p = os.path.join(libdir, info_dir) + dist = InstalledDistribution(p) + + # Write SHARED + paths = dict(paths) # don't change passed in dict + del paths['purelib'] + del paths['platlib'] + paths['lib'] = libdir + p = dist.write_shared_locations(paths, dry_run) + outfiles.append(p) + + # Write RECORD + dist.write_installed_files(outfiles, paths['prefix'], + dry_run) + return dist + except Exception as e: # pragma: no cover + logger.exception('installation failed.') + fileop.rollback() + raise + finally: + shutil.rmtree(workdir) + + def _get_dylib_cache(self): + result = os.path.join(get_cache_base(), 'dylib-cache') + if not os.path.isdir(result): + os.makedirs(result) + return result + + def _get_extensions(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + arcname = posixpath.join(info_dir, 'EXTENSIONS') + wrapper = codecs.getreader('utf-8') + result = [] + with ZipFile(pathname, 'r') as zf: + try: + with zf.open(arcname) as bf: + wf = wrapper(bf) + extensions = json.load(wf) + cache_base = self._get_dylib_cache() + for name, relpath in extensions.items(): + dest = os.path.join(cache_base, convert_path(relpath)) + if not os.path.exists(dest): + extract = True + else: + file_time = os.stat(dest).st_mtime + file_time = datetime.datetime.fromtimestamp(file_time) + info = zf.getinfo(relpath) + wheel_time = datetime.datetime(*info.date_time) + extract = wheel_time > file_time + if extract: + zf.extract(relpath, cache_base) + result.append((name, dest)) + except KeyError: + pass + return result + + def mount(self, append=False): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if not is_compatible(self): + msg = 'Wheel %s not mountable in this Python.' % pathname + raise DistlibException(msg) + if pathname in sys.path: + logger.debug('%s already in path', pathname) + else: + if append: + sys.path.append(pathname) + else: + sys.path.insert(0, pathname) + extensions = self._get_extensions() + if extensions: + if _hook not in sys.meta_path: + sys.meta_path.append(_hook) + _hook.add(pathname, extensions) + + def unmount(self): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if pathname not in sys.path: + logger.debug('%s not in path', pathname) + else: + sys.path.remove(pathname) + if pathname in _hook.impure_wheels: + _hook.remove(pathname) + if not _hook.impure_wheels: + if _hook in sys.meta_path: + sys.meta_path.remove(_hook) + + +def compatible_tags(): + """ + Return (pyver, abi, arch) tuples compatible with this Python. + """ + versions = [VER_SUFFIX] + major = VER_SUFFIX[0] + for minor in range(sys.version_info[1] - 1, - 1, -1): + versions.append(''.join([major, str(minor)])) + + abis = [] + for suffix, _, _ in imp.get_suffixes(): + if suffix.startswith('.abi'): + abis.append(suffix.split('.', 2)[1]) + abis.sort() + if ABI != 'none': + abis.insert(0, ABI) + abis.append('none') + result = [] + + # Most specific - our Python version, ABI and arch + for abi in abis: + result.append((''.join((IMP_PREFIX, versions[0])), abi, ARCH)) + + # where no ABI / arch dependency, but IMP_PREFIX dependency + for i, version in enumerate(versions): + result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) + if i == 0: + result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) + + # no IMP_PREFIX, ABI or arch dependency + for i, version in enumerate(versions): + result.append((''.join(('py', version)), 'none', 'any')) + if i == 0: + result.append((''.join(('py', version[0])), 'none', 'any')) + return result + + +COMPATIBLE_TAGS = compatible_tags() + +del compatible_tags + +def is_compatible(wheel, tags=None): + if not isinstance(wheel, Wheel): + wheel = Wheel(wheel) # assume it's a filename + result = False + if tags is None: + tags = COMPATIBLE_TAGS + for ver, abi, arch in tags: + if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: + result = True + break + return result diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/wheel.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03017eb06bf10b6e1b54f121afa47b72a46d3cb4 GIT binary patch literal 21389 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/__init__.py new file mode 100644 index 0000000000..10e2b74c29 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/__init__.py @@ -0,0 +1,23 @@ +""" +HTML parsing library based on the WHATWG "HTML5" +specification. The parser is designed to be compatible with existing +HTML found in the wild and implements well-defined error recovery that +is largely compatible with modern desktop web browsers. + +Example usage: + +import html5lib +f = open("my_document.html") +tree = html5lib.parse(f) +""" + +from __future__ import absolute_import, division, unicode_literals + +from .html5parser import HTMLParser, parse, parseFragment +from .treebuilders import getTreeBuilder +from .treewalkers import getTreeWalker +from .serializer import serialize + +__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder", + "getTreeWalker", "serialize"] +__version__ = "1.0b1" diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aceb365fcf9abc498370ba79eee14af1f107edd0 GIT binary patch literal 1135 zcmZWo&2Abo5FQo+WCKZh&%xqE4na+&s8ZEdP1UqHBvrIULRzilda+roc-Jf23!zWZ zOW(2gzCg#jkTwcP!_0VQzHfeL{~3nAeh1MUwx2Hke)t}M{fP<(h*7qH2cTMz2M`C4 zw;^sr-hsFSE#3y+0ksEt7ve7DJ&1dd_aW{#Z+oEjArB!A8@mhY0P+FEgU0TG8bW>u z@gdrM;QPQs;0M45z=x1w(Iepad<^^uzKxHORCU_|2(PENH>707$|565riPgfNtqR# z=z_SVAhYYs>Ff&``N)e=XiG7d3pr;_>S98s7~#`}A<_~qtjr3`b(*At%ynL3T&e_F zOSdHAL0X4E4eCNy1t+pWSxdzU^LAb;k&D7vvKC66aj}rTqA*4qV#Hjp1X6TM=0ZeN z%w$4so<ZfB3sZPP_fD5sDkZ7WYvgGsVR-exJPfHU%fy>7L{M!US-M<Z;1I$Ec}H|9 zit#AlP_E~dCp7WTqtnnCA@F?{JgM6sFHS@0cRy~Ua7QRuYPG7IpiOnxM<16fX>o9_ z-asMeNRuk*gkj1`T*x**M9mNUt{$!1L$ii)!=3iou*|a>`y_XWA`@<k)IL@?N?{tm z58wJ{Ox^F?`{>3|NT%cuQ9T8#9>J<-VAXS+I_L>R^|ZP#cRqQUo_`&`K-Kk7P(M^k zokym0QMt+pN+Yx&^8G{s3U`2_o^o?wk)LeT@xs@1123@Qv}xEz{y$eIdGESz*G3+$ z#(C`5M1B)n9!x3Z;gKlC!}7bKbc`na6E;JWzezH@;VMmLvba<WBlv$>DvRV3GRcy= zja%yCs#qnjCa;qlnI;z3dsedfJ>Hs4N?9f=QE+XN-329-%0fCyC*`KTlDBxhl@jlL Uht^+8H#iASTF3qy3|fQMUxLswp#T5? literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/constants.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/constants.py new file mode 100644 index 0000000000..1866dd78e7 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/constants.py @@ -0,0 +1,3086 @@ +from __future__ import absolute_import, division, unicode_literals + +import string +import gettext +_ = gettext.gettext + +EOF = None + +E = { + "null-character": + _("Null character in input stream, replaced with U+FFFD."), + "invalid-codepoint": + _("Invalid codepoint in stream."), + "incorrectly-placed-solidus": + _("Solidus (/) incorrectly placed in tag."), + "incorrect-cr-newline-entity": + _("Incorrect CR newline entity, replaced with LF."), + "illegal-windows-1252-entity": + _("Entity used with illegal number (windows-1252 reference)."), + "cant-convert-numeric-entity": + _("Numeric entity couldn't be converted to character " + "(codepoint U+%(charAsInt)08x)."), + "illegal-codepoint-for-numeric-entity": + _("Numeric entity represents an illegal codepoint: " + "U+%(charAsInt)08x."), + "numeric-entity-without-semicolon": + _("Numeric entity didn't end with ';'."), + "expected-numeric-entity-but-got-eof": + _("Numeric entity expected. Got end of file instead."), + "expected-numeric-entity": + _("Numeric entity expected but none found."), + "named-entity-without-semicolon": + _("Named entity didn't end with ';'."), + "expected-named-entity": + _("Named entity expected. Got none."), + "attributes-in-end-tag": + _("End tag contains unexpected attributes."), + 'self-closing-flag-on-end-tag': + _("End tag contains unexpected self-closing flag."), + "expected-tag-name-but-got-right-bracket": + _("Expected tag name. Got '>' instead."), + "expected-tag-name-but-got-question-mark": + _("Expected tag name. Got '?' instead. (HTML doesn't " + "support processing instructions.)"), + "expected-tag-name": + _("Expected tag name. Got something else instead"), + "expected-closing-tag-but-got-right-bracket": + _("Expected closing tag. Got '>' instead. Ignoring '</>'."), + "expected-closing-tag-but-got-eof": + _("Expected closing tag. Unexpected end of file."), + "expected-closing-tag-but-got-char": + _("Expected closing tag. Unexpected character '%(data)s' found."), + "eof-in-tag-name": + _("Unexpected end of file in the tag name."), + "expected-attribute-name-but-got-eof": + _("Unexpected end of file. Expected attribute name instead."), + "eof-in-attribute-name": + _("Unexpected end of file in attribute name."), + "invalid-character-in-attribute-name": + _("Invalid character in attribute name"), + "duplicate-attribute": + _("Dropped duplicate attribute on tag."), + "expected-end-of-tag-name-but-got-eof": + _("Unexpected end of file. Expected = or end of tag."), + "expected-attribute-value-but-got-eof": + _("Unexpected end of file. Expected attribute value."), + "expected-attribute-value-but-got-right-bracket": + _("Expected attribute value. Got '>' instead."), + 'equals-in-unquoted-attribute-value': + _("Unexpected = in unquoted attribute"), + 'unexpected-character-in-unquoted-attribute-value': + _("Unexpected character in unquoted attribute"), + "invalid-character-after-attribute-name": + _("Unexpected character after attribute name."), + "unexpected-character-after-attribute-value": + _("Unexpected character after attribute value."), + "eof-in-attribute-value-double-quote": + _("Unexpected end of file in attribute value (\")."), + "eof-in-attribute-value-single-quote": + _("Unexpected end of file in attribute value (')."), + "eof-in-attribute-value-no-quotes": + _("Unexpected end of file in attribute value."), + "unexpected-EOF-after-solidus-in-tag": + _("Unexpected end of file in tag. Expected >"), + "unexpected-character-after-solidus-in-tag": + _("Unexpected character after / in tag. Expected >"), + "expected-dashes-or-doctype": + _("Expected '--' or 'DOCTYPE'. Not found."), + "unexpected-bang-after-double-dash-in-comment": + _("Unexpected ! after -- in comment"), + "unexpected-space-after-double-dash-in-comment": + _("Unexpected space after -- in comment"), + "incorrect-comment": + _("Incorrect comment."), + "eof-in-comment": + _("Unexpected end of file in comment."), + "eof-in-comment-end-dash": + _("Unexpected end of file in comment (-)"), + "unexpected-dash-after-double-dash-in-comment": + _("Unexpected '-' after '--' found in comment."), + "eof-in-comment-double-dash": + _("Unexpected end of file in comment (--)."), + "eof-in-comment-end-space-state": + _("Unexpected end of file in comment."), + "eof-in-comment-end-bang-state": + _("Unexpected end of file in comment."), + "unexpected-char-in-comment": + _("Unexpected character in comment found."), + "need-space-after-doctype": + _("No space after literal string 'DOCTYPE'."), + "expected-doctype-name-but-got-right-bracket": + _("Unexpected > character. Expected DOCTYPE name."), + "expected-doctype-name-but-got-eof": + _("Unexpected end of file. Expected DOCTYPE name."), + "eof-in-doctype-name": + _("Unexpected end of file in DOCTYPE name."), + "eof-in-doctype": + _("Unexpected end of file in DOCTYPE."), + "expected-space-or-right-bracket-in-doctype": + _("Expected space or '>'. Got '%(data)s'"), + "unexpected-end-of-doctype": + _("Unexpected end of DOCTYPE."), + "unexpected-char-in-doctype": + _("Unexpected character in DOCTYPE."), + "eof-in-innerhtml": + _("XXX innerHTML EOF"), + "unexpected-doctype": + _("Unexpected DOCTYPE. Ignored."), + "non-html-root": + _("html needs to be the first start tag."), + "expected-doctype-but-got-eof": + _("Unexpected End of file. Expected DOCTYPE."), + "unknown-doctype": + _("Erroneous DOCTYPE."), + "expected-doctype-but-got-chars": + _("Unexpected non-space characters. Expected DOCTYPE."), + "expected-doctype-but-got-start-tag": + _("Unexpected start tag (%(name)s). Expected DOCTYPE."), + "expected-doctype-but-got-end-tag": + _("Unexpected end tag (%(name)s). Expected DOCTYPE."), + "end-tag-after-implied-root": + _("Unexpected end tag (%(name)s) after the (implied) root element."), + "expected-named-closing-tag-but-got-eof": + _("Unexpected end of file. Expected end tag (%(name)s)."), + "two-heads-are-not-better-than-one": + _("Unexpected start tag head in existing head. Ignored."), + "unexpected-end-tag": + _("Unexpected end tag (%(name)s). Ignored."), + "unexpected-start-tag-out-of-my-head": + _("Unexpected start tag (%(name)s) that can be in head. Moved."), + "unexpected-start-tag": + _("Unexpected start tag (%(name)s)."), + "missing-end-tag": + _("Missing end tag (%(name)s)."), + "missing-end-tags": + _("Missing end tags (%(name)s)."), + "unexpected-start-tag-implies-end-tag": + _("Unexpected start tag (%(startName)s) " + "implies end tag (%(endName)s)."), + "unexpected-start-tag-treated-as": + _("Unexpected start tag (%(originalName)s). Treated as %(newName)s."), + "deprecated-tag": + _("Unexpected start tag %(name)s. Don't use it!"), + "unexpected-start-tag-ignored": + _("Unexpected start tag %(name)s. Ignored."), + "expected-one-end-tag-but-got-another": + _("Unexpected end tag (%(gotName)s). " + "Missing end tag (%(expectedName)s)."), + "end-tag-too-early": + _("End tag (%(name)s) seen too early. Expected other end tag."), + "end-tag-too-early-named": + _("Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s)."), + "end-tag-too-early-ignored": + _("End tag (%(name)s) seen too early. Ignored."), + "adoption-agency-1.1": + _("End tag (%(name)s) violates step 1, " + "paragraph 1 of the adoption agency algorithm."), + "adoption-agency-1.2": + _("End tag (%(name)s) violates step 1, " + "paragraph 2 of the adoption agency algorithm."), + "adoption-agency-1.3": + _("End tag (%(name)s) violates step 1, " + "paragraph 3 of the adoption agency algorithm."), + "adoption-agency-4.4": + _("End tag (%(name)s) violates step 4, " + "paragraph 4 of the adoption agency algorithm."), + "unexpected-end-tag-treated-as": + _("Unexpected end tag (%(originalName)s). Treated as %(newName)s."), + "no-end-tag": + _("This element (%(name)s) has no end tag."), + "unexpected-implied-end-tag-in-table": + _("Unexpected implied end tag (%(name)s) in the table phase."), + "unexpected-implied-end-tag-in-table-body": + _("Unexpected implied end tag (%(name)s) in the table body phase."), + "unexpected-char-implies-table-voodoo": + _("Unexpected non-space characters in " + "table context caused voodoo mode."), + "unexpected-hidden-input-in-table": + _("Unexpected input with type hidden in table context."), + "unexpected-form-in-table": + _("Unexpected form in table context."), + "unexpected-start-tag-implies-table-voodoo": + _("Unexpected start tag (%(name)s) in " + "table context caused voodoo mode."), + "unexpected-end-tag-implies-table-voodoo": + _("Unexpected end tag (%(name)s) in " + "table context caused voodoo mode."), + "unexpected-cell-in-table-body": + _("Unexpected table cell start tag (%(name)s) " + "in the table body phase."), + "unexpected-cell-end-tag": + _("Got table cell end tag (%(name)s) " + "while required end tags are missing."), + "unexpected-end-tag-in-table-body": + _("Unexpected end tag (%(name)s) in the table body phase. Ignored."), + "unexpected-implied-end-tag-in-table-row": + _("Unexpected implied end tag (%(name)s) in the table row phase."), + "unexpected-end-tag-in-table-row": + _("Unexpected end tag (%(name)s) in the table row phase. Ignored."), + "unexpected-select-in-select": + _("Unexpected select start tag in the select phase " + "treated as select end tag."), + "unexpected-input-in-select": + _("Unexpected input start tag in the select phase."), + "unexpected-start-tag-in-select": + _("Unexpected start tag token (%(name)s in the select phase. " + "Ignored."), + "unexpected-end-tag-in-select": + _("Unexpected end tag (%(name)s) in the select phase. Ignored."), + "unexpected-table-element-start-tag-in-select-in-table": + _("Unexpected table element start tag (%(name)s) in the select in table phase."), + "unexpected-table-element-end-tag-in-select-in-table": + _("Unexpected table element end tag (%(name)s) in the select in table phase."), + "unexpected-char-after-body": + _("Unexpected non-space characters in the after body phase."), + "unexpected-start-tag-after-body": + _("Unexpected start tag token (%(name)s)" + " in the after body phase."), + "unexpected-end-tag-after-body": + _("Unexpected end tag token (%(name)s)" + " in the after body phase."), + "unexpected-char-in-frameset": + _("Unexpected characters in the frameset phase. Characters ignored."), + "unexpected-start-tag-in-frameset": + _("Unexpected start tag token (%(name)s)" + " in the frameset phase. Ignored."), + "unexpected-frameset-in-frameset-innerhtml": + _("Unexpected end tag token (frameset) " + "in the frameset phase (innerHTML)."), + "unexpected-end-tag-in-frameset": + _("Unexpected end tag token (%(name)s)" + " in the frameset phase. Ignored."), + "unexpected-char-after-frameset": + _("Unexpected non-space characters in the " + "after frameset phase. Ignored."), + "unexpected-start-tag-after-frameset": + _("Unexpected start tag (%(name)s)" + " in the after frameset phase. Ignored."), + "unexpected-end-tag-after-frameset": + _("Unexpected end tag (%(name)s)" + " in the after frameset phase. Ignored."), + "unexpected-end-tag-after-body-innerhtml": + _("Unexpected end tag after body(innerHtml)"), + "expected-eof-but-got-char": + _("Unexpected non-space characters. Expected end of file."), + "expected-eof-but-got-start-tag": + _("Unexpected start tag (%(name)s)" + ". Expected end of file."), + "expected-eof-but-got-end-tag": + _("Unexpected end tag (%(name)s)" + ". Expected end of file."), + "eof-in-table": + _("Unexpected end of file. Expected table content."), + "eof-in-select": + _("Unexpected end of file. Expected select content."), + "eof-in-frameset": + _("Unexpected end of file. Expected frameset content."), + "eof-in-script-in-script": + _("Unexpected end of file. Expected script content."), + "eof-in-foreign-lands": + _("Unexpected end of file. Expected foreign content"), + "non-void-element-with-trailing-solidus": + _("Trailing solidus not allowed on element %(name)s"), + "unexpected-html-element-in-foreign-content": + _("Element %(name)s not allowed in a non-html context"), + "unexpected-end-tag-before-html": + _("Unexpected end tag (%(name)s) before html."), + "XXX-undefined-error": + _("Undefined error (this sucks and should be fixed)"), +} + +namespaces = { + "html": "http://www.w3.org/1999/xhtml", + "mathml": "http://www.w3.org/1998/Math/MathML", + "svg": "http://www.w3.org/2000/svg", + "xlink": "http://www.w3.org/1999/xlink", + "xml": "http://www.w3.org/XML/1998/namespace", + "xmlns": "http://www.w3.org/2000/xmlns/" +} + +scopingElements = frozenset(( + (namespaces["html"], "applet"), + (namespaces["html"], "caption"), + (namespaces["html"], "html"), + (namespaces["html"], "marquee"), + (namespaces["html"], "object"), + (namespaces["html"], "table"), + (namespaces["html"], "td"), + (namespaces["html"], "th"), + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext"), + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title"), +)) + +formattingElements = frozenset(( + (namespaces["html"], "a"), + (namespaces["html"], "b"), + (namespaces["html"], "big"), + (namespaces["html"], "code"), + (namespaces["html"], "em"), + (namespaces["html"], "font"), + (namespaces["html"], "i"), + (namespaces["html"], "nobr"), + (namespaces["html"], "s"), + (namespaces["html"], "small"), + (namespaces["html"], "strike"), + (namespaces["html"], "strong"), + (namespaces["html"], "tt"), + (namespaces["html"], "u") +)) + +specialElements = frozenset(( + (namespaces["html"], "address"), + (namespaces["html"], "applet"), + (namespaces["html"], "area"), + (namespaces["html"], "article"), + (namespaces["html"], "aside"), + (namespaces["html"], "base"), + (namespaces["html"], "basefont"), + (namespaces["html"], "bgsound"), + (namespaces["html"], "blockquote"), + (namespaces["html"], "body"), + (namespaces["html"], "br"), + (namespaces["html"], "button"), + (namespaces["html"], "caption"), + (namespaces["html"], "center"), + (namespaces["html"], "col"), + (namespaces["html"], "colgroup"), + (namespaces["html"], "command"), + (namespaces["html"], "dd"), + (namespaces["html"], "details"), + (namespaces["html"], "dir"), + (namespaces["html"], "div"), + (namespaces["html"], "dl"), + (namespaces["html"], "dt"), + (namespaces["html"], "embed"), + (namespaces["html"], "fieldset"), + (namespaces["html"], "figure"), + (namespaces["html"], "footer"), + (namespaces["html"], "form"), + (namespaces["html"], "frame"), + (namespaces["html"], "frameset"), + (namespaces["html"], "h1"), + (namespaces["html"], "h2"), + (namespaces["html"], "h3"), + (namespaces["html"], "h4"), + (namespaces["html"], "h5"), + (namespaces["html"], "h6"), + (namespaces["html"], "head"), + (namespaces["html"], "header"), + (namespaces["html"], "hr"), + (namespaces["html"], "html"), + (namespaces["html"], "iframe"), + # Note that image is commented out in the spec as "this isn't an + # element that can end up on the stack, so it doesn't matter," + (namespaces["html"], "image"), + (namespaces["html"], "img"), + (namespaces["html"], "input"), + (namespaces["html"], "isindex"), + (namespaces["html"], "li"), + (namespaces["html"], "link"), + (namespaces["html"], "listing"), + (namespaces["html"], "marquee"), + (namespaces["html"], "menu"), + (namespaces["html"], "meta"), + (namespaces["html"], "nav"), + (namespaces["html"], "noembed"), + (namespaces["html"], "noframes"), + (namespaces["html"], "noscript"), + (namespaces["html"], "object"), + (namespaces["html"], "ol"), + (namespaces["html"], "p"), + (namespaces["html"], "param"), + (namespaces["html"], "plaintext"), + (namespaces["html"], "pre"), + (namespaces["html"], "script"), + (namespaces["html"], "section"), + (namespaces["html"], "select"), + (namespaces["html"], "style"), + (namespaces["html"], "table"), + (namespaces["html"], "tbody"), + (namespaces["html"], "td"), + (namespaces["html"], "textarea"), + (namespaces["html"], "tfoot"), + (namespaces["html"], "th"), + (namespaces["html"], "thead"), + (namespaces["html"], "title"), + (namespaces["html"], "tr"), + (namespaces["html"], "ul"), + (namespaces["html"], "wbr"), + (namespaces["html"], "xmp"), + (namespaces["svg"], "foreignObject") +)) + +htmlIntegrationPointElements = frozenset(( + (namespaces["mathml"], "annotaion-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title") +)) + +mathmlTextIntegrationPointElements = frozenset(( + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext") +)) + +spaceCharacters = frozenset(( + "\t", + "\n", + "\u000C", + " ", + "\r" +)) + +tableInsertModeElements = frozenset(( + "table", + "tbody", + "tfoot", + "thead", + "tr" +)) + +asciiLowercase = frozenset(string.ascii_lowercase) +asciiUppercase = frozenset(string.ascii_uppercase) +asciiLetters = frozenset(string.ascii_letters) +digits = frozenset(string.digits) +hexDigits = frozenset(string.hexdigits) + +asciiUpper2Lower = dict([(ord(c), ord(c.lower())) + for c in string.ascii_uppercase]) + +# Heading elements need to be ordered +headingElements = ( + "h1", + "h2", + "h3", + "h4", + "h5", + "h6" +) + +voidElements = frozenset(( + "base", + "command", + "event-source", + "link", + "meta", + "hr", + "br", + "img", + "embed", + "param", + "area", + "col", + "input", + "source", + "track" +)) + +cdataElements = frozenset(('title', 'textarea')) + +rcdataElements = frozenset(( + 'style', + 'script', + 'xmp', + 'iframe', + 'noembed', + 'noframes', + 'noscript' +)) + +booleanAttributes = { + "": frozenset(("irrelevant",)), + "style": frozenset(("scoped",)), + "img": frozenset(("ismap",)), + "audio": frozenset(("autoplay", "controls")), + "video": frozenset(("autoplay", "controls")), + "script": frozenset(("defer", "async")), + "details": frozenset(("open",)), + "datagrid": frozenset(("multiple", "disabled")), + "command": frozenset(("hidden", "disabled", "checked", "default")), + "hr": frozenset(("noshade")), + "menu": frozenset(("autosubmit",)), + "fieldset": frozenset(("disabled", "readonly")), + "option": frozenset(("disabled", "readonly", "selected")), + "optgroup": frozenset(("disabled", "readonly")), + "button": frozenset(("disabled", "autofocus")), + "input": frozenset(("disabled", "readonly", "required", "autofocus", "checked", "ismap")), + "select": frozenset(("disabled", "readonly", "autofocus", "multiple")), + "output": frozenset(("disabled", "readonly")), +} + +# entitiesWindows1252 has to be _ordered_ and needs to have an index. It +# therefore can't be a frozenset. +entitiesWindows1252 = ( + 8364, # 0x80 0x20AC EURO SIGN + 65533, # 0x81 UNDEFINED + 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK + 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK + 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK + 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS + 8224, # 0x86 0x2020 DAGGER + 8225, # 0x87 0x2021 DOUBLE DAGGER + 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT + 8240, # 0x89 0x2030 PER MILLE SIGN + 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON + 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE + 65533, # 0x8D UNDEFINED + 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON + 65533, # 0x8F UNDEFINED + 65533, # 0x90 UNDEFINED + 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK + 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK + 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK + 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK + 8226, # 0x95 0x2022 BULLET + 8211, # 0x96 0x2013 EN DASH + 8212, # 0x97 0x2014 EM DASH + 732, # 0x98 0x02DC SMALL TILDE + 8482, # 0x99 0x2122 TRADE MARK SIGN + 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON + 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE + 65533, # 0x9D UNDEFINED + 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON + 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +) + +xmlEntities = frozenset(('lt;', 'gt;', 'amp;', 'apos;', 'quot;')) + +entities = { + "AElig": "\xc6", + "AElig;": "\xc6", + "AMP": "&", + "AMP;": "&", + "Aacute": "\xc1", + "Aacute;": "\xc1", + "Abreve;": "\u0102", + "Acirc": "\xc2", + "Acirc;": "\xc2", + "Acy;": "\u0410", + "Afr;": "\U0001d504", + "Agrave": "\xc0", + "Agrave;": "\xc0", + "Alpha;": "\u0391", + "Amacr;": "\u0100", + "And;": "\u2a53", + "Aogon;": "\u0104", + "Aopf;": "\U0001d538", + "ApplyFunction;": "\u2061", + "Aring": "\xc5", + "Aring;": "\xc5", + "Ascr;": "\U0001d49c", + "Assign;": "\u2254", + "Atilde": "\xc3", + "Atilde;": "\xc3", + "Auml": "\xc4", + "Auml;": "\xc4", + "Backslash;": "\u2216", + "Barv;": "\u2ae7", + "Barwed;": "\u2306", + "Bcy;": "\u0411", + "Because;": "\u2235", + "Bernoullis;": "\u212c", + "Beta;": "\u0392", + "Bfr;": "\U0001d505", + "Bopf;": "\U0001d539", + "Breve;": "\u02d8", + "Bscr;": "\u212c", + "Bumpeq;": "\u224e", + "CHcy;": "\u0427", + "COPY": "\xa9", + "COPY;": "\xa9", + "Cacute;": "\u0106", + "Cap;": "\u22d2", + "CapitalDifferentialD;": "\u2145", + "Cayleys;": "\u212d", + "Ccaron;": "\u010c", + "Ccedil": "\xc7", + "Ccedil;": "\xc7", + "Ccirc;": "\u0108", + "Cconint;": "\u2230", + "Cdot;": "\u010a", + "Cedilla;": "\xb8", + "CenterDot;": "\xb7", + "Cfr;": "\u212d", + "Chi;": "\u03a7", + "CircleDot;": "\u2299", + "CircleMinus;": "\u2296", + "CirclePlus;": "\u2295", + "CircleTimes;": "\u2297", + "ClockwiseContourIntegral;": "\u2232", + "CloseCurlyDoubleQuote;": "\u201d", + "CloseCurlyQuote;": "\u2019", + "Colon;": "\u2237", + "Colone;": "\u2a74", + "Congruent;": "\u2261", + "Conint;": "\u222f", + "ContourIntegral;": "\u222e", + "Copf;": "\u2102", + "Coproduct;": "\u2210", + "CounterClockwiseContourIntegral;": "\u2233", + "Cross;": "\u2a2f", + "Cscr;": "\U0001d49e", + "Cup;": "\u22d3", + "CupCap;": "\u224d", + "DD;": "\u2145", + "DDotrahd;": "\u2911", + "DJcy;": "\u0402", + "DScy;": "\u0405", + "DZcy;": "\u040f", + "Dagger;": "\u2021", + "Darr;": "\u21a1", + "Dashv;": "\u2ae4", + "Dcaron;": "\u010e", + "Dcy;": "\u0414", + "Del;": "\u2207", + "Delta;": "\u0394", + "Dfr;": "\U0001d507", + "DiacriticalAcute;": "\xb4", + "DiacriticalDot;": "\u02d9", + "DiacriticalDoubleAcute;": "\u02dd", + "DiacriticalGrave;": "`", + "DiacriticalTilde;": "\u02dc", + "Diamond;": "\u22c4", + "DifferentialD;": "\u2146", + "Dopf;": "\U0001d53b", + "Dot;": "\xa8", + "DotDot;": "\u20dc", + "DotEqual;": "\u2250", + "DoubleContourIntegral;": "\u222f", + "DoubleDot;": "\xa8", + "DoubleDownArrow;": "\u21d3", + "DoubleLeftArrow;": "\u21d0", + "DoubleLeftRightArrow;": "\u21d4", + "DoubleLeftTee;": "\u2ae4", + "DoubleLongLeftArrow;": "\u27f8", + "DoubleLongLeftRightArrow;": "\u27fa", + "DoubleLongRightArrow;": "\u27f9", + "DoubleRightArrow;": "\u21d2", + "DoubleRightTee;": "\u22a8", + "DoubleUpArrow;": "\u21d1", + "DoubleUpDownArrow;": "\u21d5", + "DoubleVerticalBar;": "\u2225", + "DownArrow;": "\u2193", + "DownArrowBar;": "\u2913", + "DownArrowUpArrow;": "\u21f5", + "DownBreve;": "\u0311", + "DownLeftRightVector;": "\u2950", + "DownLeftTeeVector;": "\u295e", + "DownLeftVector;": "\u21bd", + "DownLeftVectorBar;": "\u2956", + "DownRightTeeVector;": "\u295f", + "DownRightVector;": "\u21c1", + "DownRightVectorBar;": "\u2957", + "DownTee;": "\u22a4", + "DownTeeArrow;": "\u21a7", + "Downarrow;": "\u21d3", + "Dscr;": "\U0001d49f", + "Dstrok;": "\u0110", + "ENG;": "\u014a", + "ETH": "\xd0", + "ETH;": "\xd0", + "Eacute": "\xc9", + "Eacute;": "\xc9", + "Ecaron;": "\u011a", + "Ecirc": "\xca", + "Ecirc;": "\xca", + "Ecy;": "\u042d", + "Edot;": "\u0116", + "Efr;": "\U0001d508", + "Egrave": "\xc8", + "Egrave;": "\xc8", + "Element;": "\u2208", + "Emacr;": "\u0112", + "EmptySmallSquare;": "\u25fb", + "EmptyVerySmallSquare;": "\u25ab", + "Eogon;": "\u0118", + "Eopf;": "\U0001d53c", + "Epsilon;": "\u0395", + "Equal;": "\u2a75", + "EqualTilde;": "\u2242", + "Equilibrium;": "\u21cc", + "Escr;": "\u2130", + "Esim;": "\u2a73", + "Eta;": "\u0397", + "Euml": "\xcb", + "Euml;": "\xcb", + "Exists;": "\u2203", + "ExponentialE;": "\u2147", + "Fcy;": "\u0424", + "Ffr;": "\U0001d509", + "FilledSmallSquare;": "\u25fc", + "FilledVerySmallSquare;": "\u25aa", + "Fopf;": "\U0001d53d", + "ForAll;": "\u2200", + "Fouriertrf;": "\u2131", + "Fscr;": "\u2131", + "GJcy;": "\u0403", + "GT": ">", + "GT;": ">", + "Gamma;": "\u0393", + "Gammad;": "\u03dc", + "Gbreve;": "\u011e", + "Gcedil;": "\u0122", + "Gcirc;": "\u011c", + "Gcy;": "\u0413", + "Gdot;": "\u0120", + "Gfr;": "\U0001d50a", + "Gg;": "\u22d9", + "Gopf;": "\U0001d53e", + "GreaterEqual;": "\u2265", + "GreaterEqualLess;": "\u22db", + "GreaterFullEqual;": "\u2267", + "GreaterGreater;": "\u2aa2", + "GreaterLess;": "\u2277", + "GreaterSlantEqual;": "\u2a7e", + "GreaterTilde;": "\u2273", + "Gscr;": "\U0001d4a2", + "Gt;": "\u226b", + "HARDcy;": "\u042a", + "Hacek;": "\u02c7", + "Hat;": "^", + "Hcirc;": "\u0124", + "Hfr;": "\u210c", + "HilbertSpace;": "\u210b", + "Hopf;": "\u210d", + "HorizontalLine;": "\u2500", + "Hscr;": "\u210b", + "Hstrok;": "\u0126", + "HumpDownHump;": "\u224e", + "HumpEqual;": "\u224f", + "IEcy;": "\u0415", + "IJlig;": "\u0132", + "IOcy;": "\u0401", + "Iacute": "\xcd", + "Iacute;": "\xcd", + "Icirc": "\xce", + "Icirc;": "\xce", + "Icy;": "\u0418", + "Idot;": "\u0130", + "Ifr;": "\u2111", + "Igrave": "\xcc", + "Igrave;": "\xcc", + "Im;": "\u2111", + "Imacr;": "\u012a", + "ImaginaryI;": "\u2148", + "Implies;": "\u21d2", + "Int;": "\u222c", + "Integral;": "\u222b", + "Intersection;": "\u22c2", + "InvisibleComma;": "\u2063", + "InvisibleTimes;": "\u2062", + "Iogon;": "\u012e", + "Iopf;": "\U0001d540", + "Iota;": "\u0399", + "Iscr;": "\u2110", + "Itilde;": "\u0128", + "Iukcy;": "\u0406", + "Iuml": "\xcf", + "Iuml;": "\xcf", + "Jcirc;": "\u0134", + "Jcy;": "\u0419", + "Jfr;": "\U0001d50d", + "Jopf;": "\U0001d541", + "Jscr;": "\U0001d4a5", + "Jsercy;": "\u0408", + "Jukcy;": "\u0404", + "KHcy;": "\u0425", + "KJcy;": "\u040c", + "Kappa;": "\u039a", + "Kcedil;": "\u0136", + "Kcy;": "\u041a", + "Kfr;": "\U0001d50e", + "Kopf;": "\U0001d542", + "Kscr;": "\U0001d4a6", + "LJcy;": "\u0409", + "LT": "<", + "LT;": "<", + "Lacute;": "\u0139", + "Lambda;": "\u039b", + "Lang;": "\u27ea", + "Laplacetrf;": "\u2112", + "Larr;": "\u219e", + "Lcaron;": "\u013d", + "Lcedil;": "\u013b", + "Lcy;": "\u041b", + "LeftAngleBracket;": "\u27e8", + "LeftArrow;": "\u2190", + "LeftArrowBar;": "\u21e4", + "LeftArrowRightArrow;": "\u21c6", + "LeftCeiling;": "\u2308", + "LeftDoubleBracket;": "\u27e6", + "LeftDownTeeVector;": "\u2961", + "LeftDownVector;": "\u21c3", + "LeftDownVectorBar;": "\u2959", + "LeftFloor;": "\u230a", + "LeftRightArrow;": "\u2194", + "LeftRightVector;": "\u294e", + "LeftTee;": "\u22a3", + "LeftTeeArrow;": "\u21a4", + "LeftTeeVector;": "\u295a", + "LeftTriangle;": "\u22b2", + "LeftTriangleBar;": "\u29cf", + "LeftTriangleEqual;": "\u22b4", + "LeftUpDownVector;": "\u2951", + "LeftUpTeeVector;": "\u2960", + "LeftUpVector;": "\u21bf", + "LeftUpVectorBar;": "\u2958", + "LeftVector;": "\u21bc", + "LeftVectorBar;": "\u2952", + "Leftarrow;": "\u21d0", + "Leftrightarrow;": "\u21d4", + "LessEqualGreater;": "\u22da", + "LessFullEqual;": "\u2266", + "LessGreater;": "\u2276", + "LessLess;": "\u2aa1", + "LessSlantEqual;": "\u2a7d", + "LessTilde;": "\u2272", + "Lfr;": "\U0001d50f", + "Ll;": "\u22d8", + "Lleftarrow;": "\u21da", + "Lmidot;": "\u013f", + "LongLeftArrow;": "\u27f5", + "LongLeftRightArrow;": "\u27f7", + "LongRightArrow;": "\u27f6", + "Longleftarrow;": "\u27f8", + "Longleftrightarrow;": "\u27fa", + "Longrightarrow;": "\u27f9", + "Lopf;": "\U0001d543", + "LowerLeftArrow;": "\u2199", + "LowerRightArrow;": "\u2198", + "Lscr;": "\u2112", + "Lsh;": "\u21b0", + "Lstrok;": "\u0141", + "Lt;": "\u226a", + "Map;": "\u2905", + "Mcy;": "\u041c", + "MediumSpace;": "\u205f", + "Mellintrf;": "\u2133", + "Mfr;": "\U0001d510", + "MinusPlus;": "\u2213", + "Mopf;": "\U0001d544", + "Mscr;": "\u2133", + "Mu;": "\u039c", + "NJcy;": "\u040a", + "Nacute;": "\u0143", + "Ncaron;": "\u0147", + "Ncedil;": "\u0145", + "Ncy;": "\u041d", + "NegativeMediumSpace;": "\u200b", + "NegativeThickSpace;": "\u200b", + "NegativeThinSpace;": "\u200b", + "NegativeVeryThinSpace;": "\u200b", + "NestedGreaterGreater;": "\u226b", + "NestedLessLess;": "\u226a", + "NewLine;": "\n", + "Nfr;": "\U0001d511", + "NoBreak;": "\u2060", + "NonBreakingSpace;": "\xa0", + "Nopf;": "\u2115", + "Not;": "\u2aec", + "NotCongruent;": "\u2262", + "NotCupCap;": "\u226d", + "NotDoubleVerticalBar;": "\u2226", + "NotElement;": "\u2209", + "NotEqual;": "\u2260", + "NotEqualTilde;": "\u2242\u0338", + "NotExists;": "\u2204", + "NotGreater;": "\u226f", + "NotGreaterEqual;": "\u2271", + "NotGreaterFullEqual;": "\u2267\u0338", + "NotGreaterGreater;": "\u226b\u0338", + "NotGreaterLess;": "\u2279", + "NotGreaterSlantEqual;": "\u2a7e\u0338", + "NotGreaterTilde;": "\u2275", + "NotHumpDownHump;": "\u224e\u0338", + "NotHumpEqual;": "\u224f\u0338", + "NotLeftTriangle;": "\u22ea", + "NotLeftTriangleBar;": "\u29cf\u0338", + "NotLeftTriangleEqual;": "\u22ec", + "NotLess;": "\u226e", + "NotLessEqual;": "\u2270", + "NotLessGreater;": "\u2278", + "NotLessLess;": "\u226a\u0338", + "NotLessSlantEqual;": "\u2a7d\u0338", + "NotLessTilde;": "\u2274", + "NotNestedGreaterGreater;": "\u2aa2\u0338", + "NotNestedLessLess;": "\u2aa1\u0338", + "NotPrecedes;": "\u2280", + "NotPrecedesEqual;": "\u2aaf\u0338", + "NotPrecedesSlantEqual;": "\u22e0", + "NotReverseElement;": "\u220c", + "NotRightTriangle;": "\u22eb", + "NotRightTriangleBar;": "\u29d0\u0338", + "NotRightTriangleEqual;": "\u22ed", + "NotSquareSubset;": "\u228f\u0338", + "NotSquareSubsetEqual;": "\u22e2", + "NotSquareSuperset;": "\u2290\u0338", + "NotSquareSupersetEqual;": "\u22e3", + "NotSubset;": "\u2282\u20d2", + "NotSubsetEqual;": "\u2288", + "NotSucceeds;": "\u2281", + "NotSucceedsEqual;": "\u2ab0\u0338", + "NotSucceedsSlantEqual;": "\u22e1", + "NotSucceedsTilde;": "\u227f\u0338", + "NotSuperset;": "\u2283\u20d2", + "NotSupersetEqual;": "\u2289", + "NotTilde;": "\u2241", + "NotTildeEqual;": "\u2244", + "NotTildeFullEqual;": "\u2247", + "NotTildeTilde;": "\u2249", + "NotVerticalBar;": "\u2224", + "Nscr;": "\U0001d4a9", + "Ntilde": "\xd1", + "Ntilde;": "\xd1", + "Nu;": "\u039d", + "OElig;": "\u0152", + "Oacute": "\xd3", + "Oacute;": "\xd3", + "Ocirc": "\xd4", + "Ocirc;": "\xd4", + "Ocy;": "\u041e", + "Odblac;": "\u0150", + "Ofr;": "\U0001d512", + "Ograve": "\xd2", + "Ograve;": "\xd2", + "Omacr;": "\u014c", + "Omega;": "\u03a9", + "Omicron;": "\u039f", + "Oopf;": "\U0001d546", + "OpenCurlyDoubleQuote;": "\u201c", + "OpenCurlyQuote;": "\u2018", + "Or;": "\u2a54", + "Oscr;": "\U0001d4aa", + "Oslash": "\xd8", + "Oslash;": "\xd8", + "Otilde": "\xd5", + "Otilde;": "\xd5", + "Otimes;": "\u2a37", + "Ouml": "\xd6", + "Ouml;": "\xd6", + "OverBar;": "\u203e", + "OverBrace;": "\u23de", + "OverBracket;": "\u23b4", + "OverParenthesis;": "\u23dc", + "PartialD;": "\u2202", + "Pcy;": "\u041f", + "Pfr;": "\U0001d513", + "Phi;": "\u03a6", + "Pi;": "\u03a0", + "PlusMinus;": "\xb1", + "Poincareplane;": "\u210c", + "Popf;": "\u2119", + "Pr;": "\u2abb", + "Precedes;": "\u227a", + "PrecedesEqual;": "\u2aaf", + "PrecedesSlantEqual;": "\u227c", + "PrecedesTilde;": "\u227e", + "Prime;": "\u2033", + "Product;": "\u220f", + "Proportion;": "\u2237", + "Proportional;": "\u221d", + "Pscr;": "\U0001d4ab", + "Psi;": "\u03a8", + "QUOT": "\"", + "QUOT;": "\"", + "Qfr;": "\U0001d514", + "Qopf;": "\u211a", + "Qscr;": "\U0001d4ac", + "RBarr;": "\u2910", + "REG": "\xae", + "REG;": "\xae", + "Racute;": "\u0154", + "Rang;": "\u27eb", + "Rarr;": "\u21a0", + "Rarrtl;": "\u2916", + "Rcaron;": "\u0158", + "Rcedil;": "\u0156", + "Rcy;": "\u0420", + "Re;": "\u211c", + "ReverseElement;": "\u220b", + "ReverseEquilibrium;": "\u21cb", + "ReverseUpEquilibrium;": "\u296f", + "Rfr;": "\u211c", + "Rho;": "\u03a1", + "RightAngleBracket;": "\u27e9", + "RightArrow;": "\u2192", + "RightArrowBar;": "\u21e5", + "RightArrowLeftArrow;": "\u21c4", + "RightCeiling;": "\u2309", + "RightDoubleBracket;": "\u27e7", + "RightDownTeeVector;": "\u295d", + "RightDownVector;": "\u21c2", + "RightDownVectorBar;": "\u2955", + "RightFloor;": "\u230b", + "RightTee;": "\u22a2", + "RightTeeArrow;": "\u21a6", + "RightTeeVector;": "\u295b", + "RightTriangle;": "\u22b3", + "RightTriangleBar;": "\u29d0", + "RightTriangleEqual;": "\u22b5", + "RightUpDownVector;": "\u294f", + "RightUpTeeVector;": "\u295c", + "RightUpVector;": "\u21be", + "RightUpVectorBar;": "\u2954", + "RightVector;": "\u21c0", + "RightVectorBar;": "\u2953", + "Rightarrow;": "\u21d2", + "Ropf;": "\u211d", + "RoundImplies;": "\u2970", + "Rrightarrow;": "\u21db", + "Rscr;": "\u211b", + "Rsh;": "\u21b1", + "RuleDelayed;": "\u29f4", + "SHCHcy;": "\u0429", + "SHcy;": "\u0428", + "SOFTcy;": "\u042c", + "Sacute;": "\u015a", + "Sc;": "\u2abc", + "Scaron;": "\u0160", + "Scedil;": "\u015e", + "Scirc;": "\u015c", + "Scy;": "\u0421", + "Sfr;": "\U0001d516", + "ShortDownArrow;": "\u2193", + "ShortLeftArrow;": "\u2190", + "ShortRightArrow;": "\u2192", + "ShortUpArrow;": "\u2191", + "Sigma;": "\u03a3", + "SmallCircle;": "\u2218", + "Sopf;": "\U0001d54a", + "Sqrt;": "\u221a", + "Square;": "\u25a1", + "SquareIntersection;": "\u2293", + "SquareSubset;": "\u228f", + "SquareSubsetEqual;": "\u2291", + "SquareSuperset;": "\u2290", + "SquareSupersetEqual;": "\u2292", + "SquareUnion;": "\u2294", + "Sscr;": "\U0001d4ae", + "Star;": "\u22c6", + "Sub;": "\u22d0", + "Subset;": "\u22d0", + "SubsetEqual;": "\u2286", + "Succeeds;": "\u227b", + "SucceedsEqual;": "\u2ab0", + "SucceedsSlantEqual;": "\u227d", + "SucceedsTilde;": "\u227f", + "SuchThat;": "\u220b", + "Sum;": "\u2211", + "Sup;": "\u22d1", + "Superset;": "\u2283", + "SupersetEqual;": "\u2287", + "Supset;": "\u22d1", + "THORN": "\xde", + "THORN;": "\xde", + "TRADE;": "\u2122", + "TSHcy;": "\u040b", + "TScy;": "\u0426", + "Tab;": "\t", + "Tau;": "\u03a4", + "Tcaron;": "\u0164", + "Tcedil;": "\u0162", + "Tcy;": "\u0422", + "Tfr;": "\U0001d517", + "Therefore;": "\u2234", + "Theta;": "\u0398", + "ThickSpace;": "\u205f\u200a", + "ThinSpace;": "\u2009", + "Tilde;": "\u223c", + "TildeEqual;": "\u2243", + "TildeFullEqual;": "\u2245", + "TildeTilde;": "\u2248", + "Topf;": "\U0001d54b", + "TripleDot;": "\u20db", + "Tscr;": "\U0001d4af", + "Tstrok;": "\u0166", + "Uacute": "\xda", + "Uacute;": "\xda", + "Uarr;": "\u219f", + "Uarrocir;": "\u2949", + "Ubrcy;": "\u040e", + "Ubreve;": "\u016c", + "Ucirc": "\xdb", + "Ucirc;": "\xdb", + "Ucy;": "\u0423", + "Udblac;": "\u0170", + "Ufr;": "\U0001d518", + "Ugrave": "\xd9", + "Ugrave;": "\xd9", + "Umacr;": "\u016a", + "UnderBar;": "_", + "UnderBrace;": "\u23df", + "UnderBracket;": "\u23b5", + "UnderParenthesis;": "\u23dd", + "Union;": "\u22c3", + "UnionPlus;": "\u228e", + "Uogon;": "\u0172", + "Uopf;": "\U0001d54c", + "UpArrow;": "\u2191", + "UpArrowBar;": "\u2912", + "UpArrowDownArrow;": "\u21c5", + "UpDownArrow;": "\u2195", + "UpEquilibrium;": "\u296e", + "UpTee;": "\u22a5", + "UpTeeArrow;": "\u21a5", + "Uparrow;": "\u21d1", + "Updownarrow;": "\u21d5", + "UpperLeftArrow;": "\u2196", + "UpperRightArrow;": "\u2197", + "Upsi;": "\u03d2", + "Upsilon;": "\u03a5", + "Uring;": "\u016e", + "Uscr;": "\U0001d4b0", + "Utilde;": "\u0168", + "Uuml": "\xdc", + "Uuml;": "\xdc", + "VDash;": "\u22ab", + "Vbar;": "\u2aeb", + "Vcy;": "\u0412", + "Vdash;": "\u22a9", + "Vdashl;": "\u2ae6", + "Vee;": "\u22c1", + "Verbar;": "\u2016", + "Vert;": "\u2016", + "VerticalBar;": "\u2223", + "VerticalLine;": "|", + "VerticalSeparator;": "\u2758", + "VerticalTilde;": "\u2240", + "VeryThinSpace;": "\u200a", + "Vfr;": "\U0001d519", + "Vopf;": "\U0001d54d", + "Vscr;": "\U0001d4b1", + "Vvdash;": "\u22aa", + "Wcirc;": "\u0174", + "Wedge;": "\u22c0", + "Wfr;": "\U0001d51a", + "Wopf;": "\U0001d54e", + "Wscr;": "\U0001d4b2", + "Xfr;": "\U0001d51b", + "Xi;": "\u039e", + "Xopf;": "\U0001d54f", + "Xscr;": "\U0001d4b3", + "YAcy;": "\u042f", + "YIcy;": "\u0407", + "YUcy;": "\u042e", + "Yacute": "\xdd", + "Yacute;": "\xdd", + "Ycirc;": "\u0176", + "Ycy;": "\u042b", + "Yfr;": "\U0001d51c", + "Yopf;": "\U0001d550", + "Yscr;": "\U0001d4b4", + "Yuml;": "\u0178", + "ZHcy;": "\u0416", + "Zacute;": "\u0179", + "Zcaron;": "\u017d", + "Zcy;": "\u0417", + "Zdot;": "\u017b", + "ZeroWidthSpace;": "\u200b", + "Zeta;": "\u0396", + "Zfr;": "\u2128", + "Zopf;": "\u2124", + "Zscr;": "\U0001d4b5", + "aacute": "\xe1", + "aacute;": "\xe1", + "abreve;": "\u0103", + "ac;": "\u223e", + "acE;": "\u223e\u0333", + "acd;": "\u223f", + "acirc": "\xe2", + "acirc;": "\xe2", + "acute": "\xb4", + "acute;": "\xb4", + "acy;": "\u0430", + "aelig": "\xe6", + "aelig;": "\xe6", + "af;": "\u2061", + "afr;": "\U0001d51e", + "agrave": "\xe0", + "agrave;": "\xe0", + "alefsym;": "\u2135", + "aleph;": "\u2135", + "alpha;": "\u03b1", + "amacr;": "\u0101", + "amalg;": "\u2a3f", + "amp": "&", + "amp;": "&", + "and;": "\u2227", + "andand;": "\u2a55", + "andd;": "\u2a5c", + "andslope;": "\u2a58", + "andv;": "\u2a5a", + "ang;": "\u2220", + "ange;": "\u29a4", + "angle;": "\u2220", + "angmsd;": "\u2221", + "angmsdaa;": "\u29a8", + "angmsdab;": "\u29a9", + "angmsdac;": "\u29aa", + "angmsdad;": "\u29ab", + "angmsdae;": "\u29ac", + "angmsdaf;": "\u29ad", + "angmsdag;": "\u29ae", + "angmsdah;": "\u29af", + "angrt;": "\u221f", + "angrtvb;": "\u22be", + "angrtvbd;": "\u299d", + "angsph;": "\u2222", + "angst;": "\xc5", + "angzarr;": "\u237c", + "aogon;": "\u0105", + "aopf;": "\U0001d552", + "ap;": "\u2248", + "apE;": "\u2a70", + "apacir;": "\u2a6f", + "ape;": "\u224a", + "apid;": "\u224b", + "apos;": "'", + "approx;": "\u2248", + "approxeq;": "\u224a", + "aring": "\xe5", + "aring;": "\xe5", + "ascr;": "\U0001d4b6", + "ast;": "*", + "asymp;": "\u2248", + "asympeq;": "\u224d", + "atilde": "\xe3", + "atilde;": "\xe3", + "auml": "\xe4", + "auml;": "\xe4", + "awconint;": "\u2233", + "awint;": "\u2a11", + "bNot;": "\u2aed", + "backcong;": "\u224c", + "backepsilon;": "\u03f6", + "backprime;": "\u2035", + "backsim;": "\u223d", + "backsimeq;": "\u22cd", + "barvee;": "\u22bd", + "barwed;": "\u2305", + "barwedge;": "\u2305", + "bbrk;": "\u23b5", + "bbrktbrk;": "\u23b6", + "bcong;": "\u224c", + "bcy;": "\u0431", + "bdquo;": "\u201e", + "becaus;": "\u2235", + "because;": "\u2235", + "bemptyv;": "\u29b0", + "bepsi;": "\u03f6", + "bernou;": "\u212c", + "beta;": "\u03b2", + "beth;": "\u2136", + "between;": "\u226c", + "bfr;": "\U0001d51f", + "bigcap;": "\u22c2", + "bigcirc;": "\u25ef", + "bigcup;": "\u22c3", + "bigodot;": "\u2a00", + "bigoplus;": "\u2a01", + "bigotimes;": "\u2a02", + "bigsqcup;": "\u2a06", + "bigstar;": "\u2605", + "bigtriangledown;": "\u25bd", + "bigtriangleup;": "\u25b3", + "biguplus;": "\u2a04", + "bigvee;": "\u22c1", + "bigwedge;": "\u22c0", + "bkarow;": "\u290d", + "blacklozenge;": "\u29eb", + "blacksquare;": "\u25aa", + "blacktriangle;": "\u25b4", + "blacktriangledown;": "\u25be", + "blacktriangleleft;": "\u25c2", + "blacktriangleright;": "\u25b8", + "blank;": "\u2423", + "blk12;": "\u2592", + "blk14;": "\u2591", + "blk34;": "\u2593", + "block;": "\u2588", + "bne;": "=\u20e5", + "bnequiv;": "\u2261\u20e5", + "bnot;": "\u2310", + "bopf;": "\U0001d553", + "bot;": "\u22a5", + "bottom;": "\u22a5", + "bowtie;": "\u22c8", + "boxDL;": "\u2557", + "boxDR;": "\u2554", + "boxDl;": "\u2556", + "boxDr;": "\u2553", + "boxH;": "\u2550", + "boxHD;": "\u2566", + "boxHU;": "\u2569", + "boxHd;": "\u2564", + "boxHu;": "\u2567", + "boxUL;": "\u255d", + "boxUR;": "\u255a", + "boxUl;": "\u255c", + "boxUr;": "\u2559", + "boxV;": "\u2551", + "boxVH;": "\u256c", + "boxVL;": "\u2563", + "boxVR;": "\u2560", + "boxVh;": "\u256b", + "boxVl;": "\u2562", + "boxVr;": "\u255f", + "boxbox;": "\u29c9", + "boxdL;": "\u2555", + "boxdR;": "\u2552", + "boxdl;": "\u2510", + "boxdr;": "\u250c", + "boxh;": "\u2500", + "boxhD;": "\u2565", + "boxhU;": "\u2568", + "boxhd;": "\u252c", + "boxhu;": "\u2534", + "boxminus;": "\u229f", + "boxplus;": "\u229e", + "boxtimes;": "\u22a0", + "boxuL;": "\u255b", + "boxuR;": "\u2558", + "boxul;": "\u2518", + "boxur;": "\u2514", + "boxv;": "\u2502", + "boxvH;": "\u256a", + "boxvL;": "\u2561", + "boxvR;": "\u255e", + "boxvh;": "\u253c", + "boxvl;": "\u2524", + "boxvr;": "\u251c", + "bprime;": "\u2035", + "breve;": "\u02d8", + "brvbar": "\xa6", + "brvbar;": "\xa6", + "bscr;": "\U0001d4b7", + "bsemi;": "\u204f", + "bsim;": "\u223d", + "bsime;": "\u22cd", + "bsol;": "\\", + "bsolb;": "\u29c5", + "bsolhsub;": "\u27c8", + "bull;": "\u2022", + "bullet;": "\u2022", + "bump;": "\u224e", + "bumpE;": "\u2aae", + "bumpe;": "\u224f", + "bumpeq;": "\u224f", + "cacute;": "\u0107", + "cap;": "\u2229", + "capand;": "\u2a44", + "capbrcup;": "\u2a49", + "capcap;": "\u2a4b", + "capcup;": "\u2a47", + "capdot;": "\u2a40", + "caps;": "\u2229\ufe00", + "caret;": "\u2041", + "caron;": "\u02c7", + "ccaps;": "\u2a4d", + "ccaron;": "\u010d", + "ccedil": "\xe7", + "ccedil;": "\xe7", + "ccirc;": "\u0109", + "ccups;": "\u2a4c", + "ccupssm;": "\u2a50", + "cdot;": "\u010b", + "cedil": "\xb8", + "cedil;": "\xb8", + "cemptyv;": "\u29b2", + "cent": "\xa2", + "cent;": "\xa2", + "centerdot;": "\xb7", + "cfr;": "\U0001d520", + "chcy;": "\u0447", + "check;": "\u2713", + "checkmark;": "\u2713", + "chi;": "\u03c7", + "cir;": "\u25cb", + "cirE;": "\u29c3", + "circ;": "\u02c6", + "circeq;": "\u2257", + "circlearrowleft;": "\u21ba", + "circlearrowright;": "\u21bb", + "circledR;": "\xae", + "circledS;": "\u24c8", + "circledast;": "\u229b", + "circledcirc;": "\u229a", + "circleddash;": "\u229d", + "cire;": "\u2257", + "cirfnint;": "\u2a10", + "cirmid;": "\u2aef", + "cirscir;": "\u29c2", + "clubs;": "\u2663", + "clubsuit;": "\u2663", + "colon;": ":", + "colone;": "\u2254", + "coloneq;": "\u2254", + "comma;": ",", + "commat;": "@", + "comp;": "\u2201", + "compfn;": "\u2218", + "complement;": "\u2201", + "complexes;": "\u2102", + "cong;": "\u2245", + "congdot;": "\u2a6d", + "conint;": "\u222e", + "copf;": "\U0001d554", + "coprod;": "\u2210", + "copy": "\xa9", + "copy;": "\xa9", + "copysr;": "\u2117", + "crarr;": "\u21b5", + "cross;": "\u2717", + "cscr;": "\U0001d4b8", + "csub;": "\u2acf", + "csube;": "\u2ad1", + "csup;": "\u2ad0", + "csupe;": "\u2ad2", + "ctdot;": "\u22ef", + "cudarrl;": "\u2938", + "cudarrr;": "\u2935", + "cuepr;": "\u22de", + "cuesc;": "\u22df", + "cularr;": "\u21b6", + "cularrp;": "\u293d", + "cup;": "\u222a", + "cupbrcap;": "\u2a48", + "cupcap;": "\u2a46", + "cupcup;": "\u2a4a", + "cupdot;": "\u228d", + "cupor;": "\u2a45", + "cups;": "\u222a\ufe00", + "curarr;": "\u21b7", + "curarrm;": "\u293c", + "curlyeqprec;": "\u22de", + "curlyeqsucc;": "\u22df", + "curlyvee;": "\u22ce", + "curlywedge;": "\u22cf", + "curren": "\xa4", + "curren;": "\xa4", + "curvearrowleft;": "\u21b6", + "curvearrowright;": "\u21b7", + "cuvee;": "\u22ce", + "cuwed;": "\u22cf", + "cwconint;": "\u2232", + "cwint;": "\u2231", + "cylcty;": "\u232d", + "dArr;": "\u21d3", + "dHar;": "\u2965", + "dagger;": "\u2020", + "daleth;": "\u2138", + "darr;": "\u2193", + "dash;": "\u2010", + "dashv;": "\u22a3", + "dbkarow;": "\u290f", + "dblac;": "\u02dd", + "dcaron;": "\u010f", + "dcy;": "\u0434", + "dd;": "\u2146", + "ddagger;": "\u2021", + "ddarr;": "\u21ca", + "ddotseq;": "\u2a77", + "deg": "\xb0", + "deg;": "\xb0", + "delta;": "\u03b4", + "demptyv;": "\u29b1", + "dfisht;": "\u297f", + "dfr;": "\U0001d521", + "dharl;": "\u21c3", + "dharr;": "\u21c2", + "diam;": "\u22c4", + "diamond;": "\u22c4", + "diamondsuit;": "\u2666", + "diams;": "\u2666", + "die;": "\xa8", + "digamma;": "\u03dd", + "disin;": "\u22f2", + "div;": "\xf7", + "divide": "\xf7", + "divide;": "\xf7", + "divideontimes;": "\u22c7", + "divonx;": "\u22c7", + "djcy;": "\u0452", + "dlcorn;": "\u231e", + "dlcrop;": "\u230d", + "dollar;": "$", + "dopf;": "\U0001d555", + "dot;": "\u02d9", + "doteq;": "\u2250", + "doteqdot;": "\u2251", + "dotminus;": "\u2238", + "dotplus;": "\u2214", + "dotsquare;": "\u22a1", + "doublebarwedge;": "\u2306", + "downarrow;": "\u2193", + "downdownarrows;": "\u21ca", + "downharpoonleft;": "\u21c3", + "downharpoonright;": "\u21c2", + "drbkarow;": "\u2910", + "drcorn;": "\u231f", + "drcrop;": "\u230c", + "dscr;": "\U0001d4b9", + "dscy;": "\u0455", + "dsol;": "\u29f6", + "dstrok;": "\u0111", + "dtdot;": "\u22f1", + "dtri;": "\u25bf", + "dtrif;": "\u25be", + "duarr;": "\u21f5", + "duhar;": "\u296f", + "dwangle;": "\u29a6", + "dzcy;": "\u045f", + "dzigrarr;": "\u27ff", + "eDDot;": "\u2a77", + "eDot;": "\u2251", + "eacute": "\xe9", + "eacute;": "\xe9", + "easter;": "\u2a6e", + "ecaron;": "\u011b", + "ecir;": "\u2256", + "ecirc": "\xea", + "ecirc;": "\xea", + "ecolon;": "\u2255", + "ecy;": "\u044d", + "edot;": "\u0117", + "ee;": "\u2147", + "efDot;": "\u2252", + "efr;": "\U0001d522", + "eg;": "\u2a9a", + "egrave": "\xe8", + "egrave;": "\xe8", + "egs;": "\u2a96", + "egsdot;": "\u2a98", + "el;": "\u2a99", + "elinters;": "\u23e7", + "ell;": "\u2113", + "els;": "\u2a95", + "elsdot;": "\u2a97", + "emacr;": "\u0113", + "empty;": "\u2205", + "emptyset;": "\u2205", + "emptyv;": "\u2205", + "emsp13;": "\u2004", + "emsp14;": "\u2005", + "emsp;": "\u2003", + "eng;": "\u014b", + "ensp;": "\u2002", + "eogon;": "\u0119", + "eopf;": "\U0001d556", + "epar;": "\u22d5", + "eparsl;": "\u29e3", + "eplus;": "\u2a71", + "epsi;": "\u03b5", + "epsilon;": "\u03b5", + "epsiv;": "\u03f5", + "eqcirc;": "\u2256", + "eqcolon;": "\u2255", + "eqsim;": "\u2242", + "eqslantgtr;": "\u2a96", + "eqslantless;": "\u2a95", + "equals;": "=", + "equest;": "\u225f", + "equiv;": "\u2261", + "equivDD;": "\u2a78", + "eqvparsl;": "\u29e5", + "erDot;": "\u2253", + "erarr;": "\u2971", + "escr;": "\u212f", + "esdot;": "\u2250", + "esim;": "\u2242", + "eta;": "\u03b7", + "eth": "\xf0", + "eth;": "\xf0", + "euml": "\xeb", + "euml;": "\xeb", + "euro;": "\u20ac", + "excl;": "!", + "exist;": "\u2203", + "expectation;": "\u2130", + "exponentiale;": "\u2147", + "fallingdotseq;": "\u2252", + "fcy;": "\u0444", + "female;": "\u2640", + "ffilig;": "\ufb03", + "fflig;": "\ufb00", + "ffllig;": "\ufb04", + "ffr;": "\U0001d523", + "filig;": "\ufb01", + "fjlig;": "fj", + "flat;": "\u266d", + "fllig;": "\ufb02", + "fltns;": "\u25b1", + "fnof;": "\u0192", + "fopf;": "\U0001d557", + "forall;": "\u2200", + "fork;": "\u22d4", + "forkv;": "\u2ad9", + "fpartint;": "\u2a0d", + "frac12": "\xbd", + "frac12;": "\xbd", + "frac13;": "\u2153", + "frac14": "\xbc", + "frac14;": "\xbc", + "frac15;": "\u2155", + "frac16;": "\u2159", + "frac18;": "\u215b", + "frac23;": "\u2154", + "frac25;": "\u2156", + "frac34": "\xbe", + "frac34;": "\xbe", + "frac35;": "\u2157", + "frac38;": "\u215c", + "frac45;": "\u2158", + "frac56;": "\u215a", + "frac58;": "\u215d", + "frac78;": "\u215e", + "frasl;": "\u2044", + "frown;": "\u2322", + "fscr;": "\U0001d4bb", + "gE;": "\u2267", + "gEl;": "\u2a8c", + "gacute;": "\u01f5", + "gamma;": "\u03b3", + "gammad;": "\u03dd", + "gap;": "\u2a86", + "gbreve;": "\u011f", + "gcirc;": "\u011d", + "gcy;": "\u0433", + "gdot;": "\u0121", + "ge;": "\u2265", + "gel;": "\u22db", + "geq;": "\u2265", + "geqq;": "\u2267", + "geqslant;": "\u2a7e", + "ges;": "\u2a7e", + "gescc;": "\u2aa9", + "gesdot;": "\u2a80", + "gesdoto;": "\u2a82", + "gesdotol;": "\u2a84", + "gesl;": "\u22db\ufe00", + "gesles;": "\u2a94", + "gfr;": "\U0001d524", + "gg;": "\u226b", + "ggg;": "\u22d9", + "gimel;": "\u2137", + "gjcy;": "\u0453", + "gl;": "\u2277", + "glE;": "\u2a92", + "gla;": "\u2aa5", + "glj;": "\u2aa4", + "gnE;": "\u2269", + "gnap;": "\u2a8a", + "gnapprox;": "\u2a8a", + "gne;": "\u2a88", + "gneq;": "\u2a88", + "gneqq;": "\u2269", + "gnsim;": "\u22e7", + "gopf;": "\U0001d558", + "grave;": "`", + "gscr;": "\u210a", + "gsim;": "\u2273", + "gsime;": "\u2a8e", + "gsiml;": "\u2a90", + "gt": ">", + "gt;": ">", + "gtcc;": "\u2aa7", + "gtcir;": "\u2a7a", + "gtdot;": "\u22d7", + "gtlPar;": "\u2995", + "gtquest;": "\u2a7c", + "gtrapprox;": "\u2a86", + "gtrarr;": "\u2978", + "gtrdot;": "\u22d7", + "gtreqless;": "\u22db", + "gtreqqless;": "\u2a8c", + "gtrless;": "\u2277", + "gtrsim;": "\u2273", + "gvertneqq;": "\u2269\ufe00", + "gvnE;": "\u2269\ufe00", + "hArr;": "\u21d4", + "hairsp;": "\u200a", + "half;": "\xbd", + "hamilt;": "\u210b", + "hardcy;": "\u044a", + "harr;": "\u2194", + "harrcir;": "\u2948", + "harrw;": "\u21ad", + "hbar;": "\u210f", + "hcirc;": "\u0125", + "hearts;": "\u2665", + "heartsuit;": "\u2665", + "hellip;": "\u2026", + "hercon;": "\u22b9", + "hfr;": "\U0001d525", + "hksearow;": "\u2925", + "hkswarow;": "\u2926", + "hoarr;": "\u21ff", + "homtht;": "\u223b", + "hookleftarrow;": "\u21a9", + "hookrightarrow;": "\u21aa", + "hopf;": "\U0001d559", + "horbar;": "\u2015", + "hscr;": "\U0001d4bd", + "hslash;": "\u210f", + "hstrok;": "\u0127", + "hybull;": "\u2043", + "hyphen;": "\u2010", + "iacute": "\xed", + "iacute;": "\xed", + "ic;": "\u2063", + "icirc": "\xee", + "icirc;": "\xee", + "icy;": "\u0438", + "iecy;": "\u0435", + "iexcl": "\xa1", + "iexcl;": "\xa1", + "iff;": "\u21d4", + "ifr;": "\U0001d526", + "igrave": "\xec", + "igrave;": "\xec", + "ii;": "\u2148", + "iiiint;": "\u2a0c", + "iiint;": "\u222d", + "iinfin;": "\u29dc", + "iiota;": "\u2129", + "ijlig;": "\u0133", + "imacr;": "\u012b", + "image;": "\u2111", + "imagline;": "\u2110", + "imagpart;": "\u2111", + "imath;": "\u0131", + "imof;": "\u22b7", + "imped;": "\u01b5", + "in;": "\u2208", + "incare;": "\u2105", + "infin;": "\u221e", + "infintie;": "\u29dd", + "inodot;": "\u0131", + "int;": "\u222b", + "intcal;": "\u22ba", + "integers;": "\u2124", + "intercal;": "\u22ba", + "intlarhk;": "\u2a17", + "intprod;": "\u2a3c", + "iocy;": "\u0451", + "iogon;": "\u012f", + "iopf;": "\U0001d55a", + "iota;": "\u03b9", + "iprod;": "\u2a3c", + "iquest": "\xbf", + "iquest;": "\xbf", + "iscr;": "\U0001d4be", + "isin;": "\u2208", + "isinE;": "\u22f9", + "isindot;": "\u22f5", + "isins;": "\u22f4", + "isinsv;": "\u22f3", + "isinv;": "\u2208", + "it;": "\u2062", + "itilde;": "\u0129", + "iukcy;": "\u0456", + "iuml": "\xef", + "iuml;": "\xef", + "jcirc;": "\u0135", + "jcy;": "\u0439", + "jfr;": "\U0001d527", + "jmath;": "\u0237", + "jopf;": "\U0001d55b", + "jscr;": "\U0001d4bf", + "jsercy;": "\u0458", + "jukcy;": "\u0454", + "kappa;": "\u03ba", + "kappav;": "\u03f0", + "kcedil;": "\u0137", + "kcy;": "\u043a", + "kfr;": "\U0001d528", + "kgreen;": "\u0138", + "khcy;": "\u0445", + "kjcy;": "\u045c", + "kopf;": "\U0001d55c", + "kscr;": "\U0001d4c0", + "lAarr;": "\u21da", + "lArr;": "\u21d0", + "lAtail;": "\u291b", + "lBarr;": "\u290e", + "lE;": "\u2266", + "lEg;": "\u2a8b", + "lHar;": "\u2962", + "lacute;": "\u013a", + "laemptyv;": "\u29b4", + "lagran;": "\u2112", + "lambda;": "\u03bb", + "lang;": "\u27e8", + "langd;": "\u2991", + "langle;": "\u27e8", + "lap;": "\u2a85", + "laquo": "\xab", + "laquo;": "\xab", + "larr;": "\u2190", + "larrb;": "\u21e4", + "larrbfs;": "\u291f", + "larrfs;": "\u291d", + "larrhk;": "\u21a9", + "larrlp;": "\u21ab", + "larrpl;": "\u2939", + "larrsim;": "\u2973", + "larrtl;": "\u21a2", + "lat;": "\u2aab", + "latail;": "\u2919", + "late;": "\u2aad", + "lates;": "\u2aad\ufe00", + "lbarr;": "\u290c", + "lbbrk;": "\u2772", + "lbrace;": "{", + "lbrack;": "[", + "lbrke;": "\u298b", + "lbrksld;": "\u298f", + "lbrkslu;": "\u298d", + "lcaron;": "\u013e", + "lcedil;": "\u013c", + "lceil;": "\u2308", + "lcub;": "{", + "lcy;": "\u043b", + "ldca;": "\u2936", + "ldquo;": "\u201c", + "ldquor;": "\u201e", + "ldrdhar;": "\u2967", + "ldrushar;": "\u294b", + "ldsh;": "\u21b2", + "le;": "\u2264", + "leftarrow;": "\u2190", + "leftarrowtail;": "\u21a2", + "leftharpoondown;": "\u21bd", + "leftharpoonup;": "\u21bc", + "leftleftarrows;": "\u21c7", + "leftrightarrow;": "\u2194", + "leftrightarrows;": "\u21c6", + "leftrightharpoons;": "\u21cb", + "leftrightsquigarrow;": "\u21ad", + "leftthreetimes;": "\u22cb", + "leg;": "\u22da", + "leq;": "\u2264", + "leqq;": "\u2266", + "leqslant;": "\u2a7d", + "les;": "\u2a7d", + "lescc;": "\u2aa8", + "lesdot;": "\u2a7f", + "lesdoto;": "\u2a81", + "lesdotor;": "\u2a83", + "lesg;": "\u22da\ufe00", + "lesges;": "\u2a93", + "lessapprox;": "\u2a85", + "lessdot;": "\u22d6", + "lesseqgtr;": "\u22da", + "lesseqqgtr;": "\u2a8b", + "lessgtr;": "\u2276", + "lesssim;": "\u2272", + "lfisht;": "\u297c", + "lfloor;": "\u230a", + "lfr;": "\U0001d529", + "lg;": "\u2276", + "lgE;": "\u2a91", + "lhard;": "\u21bd", + "lharu;": "\u21bc", + "lharul;": "\u296a", + "lhblk;": "\u2584", + "ljcy;": "\u0459", + "ll;": "\u226a", + "llarr;": "\u21c7", + "llcorner;": "\u231e", + "llhard;": "\u296b", + "lltri;": "\u25fa", + "lmidot;": "\u0140", + "lmoust;": "\u23b0", + "lmoustache;": "\u23b0", + "lnE;": "\u2268", + "lnap;": "\u2a89", + "lnapprox;": "\u2a89", + "lne;": "\u2a87", + "lneq;": "\u2a87", + "lneqq;": "\u2268", + "lnsim;": "\u22e6", + "loang;": "\u27ec", + "loarr;": "\u21fd", + "lobrk;": "\u27e6", + "longleftarrow;": "\u27f5", + "longleftrightarrow;": "\u27f7", + "longmapsto;": "\u27fc", + "longrightarrow;": "\u27f6", + "looparrowleft;": "\u21ab", + "looparrowright;": "\u21ac", + "lopar;": "\u2985", + "lopf;": "\U0001d55d", + "loplus;": "\u2a2d", + "lotimes;": "\u2a34", + "lowast;": "\u2217", + "lowbar;": "_", + "loz;": "\u25ca", + "lozenge;": "\u25ca", + "lozf;": "\u29eb", + "lpar;": "(", + "lparlt;": "\u2993", + "lrarr;": "\u21c6", + "lrcorner;": "\u231f", + "lrhar;": "\u21cb", + "lrhard;": "\u296d", + "lrm;": "\u200e", + "lrtri;": "\u22bf", + "lsaquo;": "\u2039", + "lscr;": "\U0001d4c1", + "lsh;": "\u21b0", + "lsim;": "\u2272", + "lsime;": "\u2a8d", + "lsimg;": "\u2a8f", + "lsqb;": "[", + "lsquo;": "\u2018", + "lsquor;": "\u201a", + "lstrok;": "\u0142", + "lt": "<", + "lt;": "<", + "ltcc;": "\u2aa6", + "ltcir;": "\u2a79", + "ltdot;": "\u22d6", + "lthree;": "\u22cb", + "ltimes;": "\u22c9", + "ltlarr;": "\u2976", + "ltquest;": "\u2a7b", + "ltrPar;": "\u2996", + "ltri;": "\u25c3", + "ltrie;": "\u22b4", + "ltrif;": "\u25c2", + "lurdshar;": "\u294a", + "luruhar;": "\u2966", + "lvertneqq;": "\u2268\ufe00", + "lvnE;": "\u2268\ufe00", + "mDDot;": "\u223a", + "macr": "\xaf", + "macr;": "\xaf", + "male;": "\u2642", + "malt;": "\u2720", + "maltese;": "\u2720", + "map;": "\u21a6", + "mapsto;": "\u21a6", + "mapstodown;": "\u21a7", + "mapstoleft;": "\u21a4", + "mapstoup;": "\u21a5", + "marker;": "\u25ae", + "mcomma;": "\u2a29", + "mcy;": "\u043c", + "mdash;": "\u2014", + "measuredangle;": "\u2221", + "mfr;": "\U0001d52a", + "mho;": "\u2127", + "micro": "\xb5", + "micro;": "\xb5", + "mid;": "\u2223", + "midast;": "*", + "midcir;": "\u2af0", + "middot": "\xb7", + "middot;": "\xb7", + "minus;": "\u2212", + "minusb;": "\u229f", + "minusd;": "\u2238", + "minusdu;": "\u2a2a", + "mlcp;": "\u2adb", + "mldr;": "\u2026", + "mnplus;": "\u2213", + "models;": "\u22a7", + "mopf;": "\U0001d55e", + "mp;": "\u2213", + "mscr;": "\U0001d4c2", + "mstpos;": "\u223e", + "mu;": "\u03bc", + "multimap;": "\u22b8", + "mumap;": "\u22b8", + "nGg;": "\u22d9\u0338", + "nGt;": "\u226b\u20d2", + "nGtv;": "\u226b\u0338", + "nLeftarrow;": "\u21cd", + "nLeftrightarrow;": "\u21ce", + "nLl;": "\u22d8\u0338", + "nLt;": "\u226a\u20d2", + "nLtv;": "\u226a\u0338", + "nRightarrow;": "\u21cf", + "nVDash;": "\u22af", + "nVdash;": "\u22ae", + "nabla;": "\u2207", + "nacute;": "\u0144", + "nang;": "\u2220\u20d2", + "nap;": "\u2249", + "napE;": "\u2a70\u0338", + "napid;": "\u224b\u0338", + "napos;": "\u0149", + "napprox;": "\u2249", + "natur;": "\u266e", + "natural;": "\u266e", + "naturals;": "\u2115", + "nbsp": "\xa0", + "nbsp;": "\xa0", + "nbump;": "\u224e\u0338", + "nbumpe;": "\u224f\u0338", + "ncap;": "\u2a43", + "ncaron;": "\u0148", + "ncedil;": "\u0146", + "ncong;": "\u2247", + "ncongdot;": "\u2a6d\u0338", + "ncup;": "\u2a42", + "ncy;": "\u043d", + "ndash;": "\u2013", + "ne;": "\u2260", + "neArr;": "\u21d7", + "nearhk;": "\u2924", + "nearr;": "\u2197", + "nearrow;": "\u2197", + "nedot;": "\u2250\u0338", + "nequiv;": "\u2262", + "nesear;": "\u2928", + "nesim;": "\u2242\u0338", + "nexist;": "\u2204", + "nexists;": "\u2204", + "nfr;": "\U0001d52b", + "ngE;": "\u2267\u0338", + "nge;": "\u2271", + "ngeq;": "\u2271", + "ngeqq;": "\u2267\u0338", + "ngeqslant;": "\u2a7e\u0338", + "nges;": "\u2a7e\u0338", + "ngsim;": "\u2275", + "ngt;": "\u226f", + "ngtr;": "\u226f", + "nhArr;": "\u21ce", + "nharr;": "\u21ae", + "nhpar;": "\u2af2", + "ni;": "\u220b", + "nis;": "\u22fc", + "nisd;": "\u22fa", + "niv;": "\u220b", + "njcy;": "\u045a", + "nlArr;": "\u21cd", + "nlE;": "\u2266\u0338", + "nlarr;": "\u219a", + "nldr;": "\u2025", + "nle;": "\u2270", + "nleftarrow;": "\u219a", + "nleftrightarrow;": "\u21ae", + "nleq;": "\u2270", + "nleqq;": "\u2266\u0338", + "nleqslant;": "\u2a7d\u0338", + "nles;": "\u2a7d\u0338", + "nless;": "\u226e", + "nlsim;": "\u2274", + "nlt;": "\u226e", + "nltri;": "\u22ea", + "nltrie;": "\u22ec", + "nmid;": "\u2224", + "nopf;": "\U0001d55f", + "not": "\xac", + "not;": "\xac", + "notin;": "\u2209", + "notinE;": "\u22f9\u0338", + "notindot;": "\u22f5\u0338", + "notinva;": "\u2209", + "notinvb;": "\u22f7", + "notinvc;": "\u22f6", + "notni;": "\u220c", + "notniva;": "\u220c", + "notnivb;": "\u22fe", + "notnivc;": "\u22fd", + "npar;": "\u2226", + "nparallel;": "\u2226", + "nparsl;": "\u2afd\u20e5", + "npart;": "\u2202\u0338", + "npolint;": "\u2a14", + "npr;": "\u2280", + "nprcue;": "\u22e0", + "npre;": "\u2aaf\u0338", + "nprec;": "\u2280", + "npreceq;": "\u2aaf\u0338", + "nrArr;": "\u21cf", + "nrarr;": "\u219b", + "nrarrc;": "\u2933\u0338", + "nrarrw;": "\u219d\u0338", + "nrightarrow;": "\u219b", + "nrtri;": "\u22eb", + "nrtrie;": "\u22ed", + "nsc;": "\u2281", + "nsccue;": "\u22e1", + "nsce;": "\u2ab0\u0338", + "nscr;": "\U0001d4c3", + "nshortmid;": "\u2224", + "nshortparallel;": "\u2226", + "nsim;": "\u2241", + "nsime;": "\u2244", + "nsimeq;": "\u2244", + "nsmid;": "\u2224", + "nspar;": "\u2226", + "nsqsube;": "\u22e2", + "nsqsupe;": "\u22e3", + "nsub;": "\u2284", + "nsubE;": "\u2ac5\u0338", + "nsube;": "\u2288", + "nsubset;": "\u2282\u20d2", + "nsubseteq;": "\u2288", + "nsubseteqq;": "\u2ac5\u0338", + "nsucc;": "\u2281", + "nsucceq;": "\u2ab0\u0338", + "nsup;": "\u2285", + "nsupE;": "\u2ac6\u0338", + "nsupe;": "\u2289", + "nsupset;": "\u2283\u20d2", + "nsupseteq;": "\u2289", + "nsupseteqq;": "\u2ac6\u0338", + "ntgl;": "\u2279", + "ntilde": "\xf1", + "ntilde;": "\xf1", + "ntlg;": "\u2278", + "ntriangleleft;": "\u22ea", + "ntrianglelefteq;": "\u22ec", + "ntriangleright;": "\u22eb", + "ntrianglerighteq;": "\u22ed", + "nu;": "\u03bd", + "num;": "#", + "numero;": "\u2116", + "numsp;": "\u2007", + "nvDash;": "\u22ad", + "nvHarr;": "\u2904", + "nvap;": "\u224d\u20d2", + "nvdash;": "\u22ac", + "nvge;": "\u2265\u20d2", + "nvgt;": ">\u20d2", + "nvinfin;": "\u29de", + "nvlArr;": "\u2902", + "nvle;": "\u2264\u20d2", + "nvlt;": "<\u20d2", + "nvltrie;": "\u22b4\u20d2", + "nvrArr;": "\u2903", + "nvrtrie;": "\u22b5\u20d2", + "nvsim;": "\u223c\u20d2", + "nwArr;": "\u21d6", + "nwarhk;": "\u2923", + "nwarr;": "\u2196", + "nwarrow;": "\u2196", + "nwnear;": "\u2927", + "oS;": "\u24c8", + "oacute": "\xf3", + "oacute;": "\xf3", + "oast;": "\u229b", + "ocir;": "\u229a", + "ocirc": "\xf4", + "ocirc;": "\xf4", + "ocy;": "\u043e", + "odash;": "\u229d", + "odblac;": "\u0151", + "odiv;": "\u2a38", + "odot;": "\u2299", + "odsold;": "\u29bc", + "oelig;": "\u0153", + "ofcir;": "\u29bf", + "ofr;": "\U0001d52c", + "ogon;": "\u02db", + "ograve": "\xf2", + "ograve;": "\xf2", + "ogt;": "\u29c1", + "ohbar;": "\u29b5", + "ohm;": "\u03a9", + "oint;": "\u222e", + "olarr;": "\u21ba", + "olcir;": "\u29be", + "olcross;": "\u29bb", + "oline;": "\u203e", + "olt;": "\u29c0", + "omacr;": "\u014d", + "omega;": "\u03c9", + "omicron;": "\u03bf", + "omid;": "\u29b6", + "ominus;": "\u2296", + "oopf;": "\U0001d560", + "opar;": "\u29b7", + "operp;": "\u29b9", + "oplus;": "\u2295", + "or;": "\u2228", + "orarr;": "\u21bb", + "ord;": "\u2a5d", + "order;": "\u2134", + "orderof;": "\u2134", + "ordf": "\xaa", + "ordf;": "\xaa", + "ordm": "\xba", + "ordm;": "\xba", + "origof;": "\u22b6", + "oror;": "\u2a56", + "orslope;": "\u2a57", + "orv;": "\u2a5b", + "oscr;": "\u2134", + "oslash": "\xf8", + "oslash;": "\xf8", + "osol;": "\u2298", + "otilde": "\xf5", + "otilde;": "\xf5", + "otimes;": "\u2297", + "otimesas;": "\u2a36", + "ouml": "\xf6", + "ouml;": "\xf6", + "ovbar;": "\u233d", + "par;": "\u2225", + "para": "\xb6", + "para;": "\xb6", + "parallel;": "\u2225", + "parsim;": "\u2af3", + "parsl;": "\u2afd", + "part;": "\u2202", + "pcy;": "\u043f", + "percnt;": "%", + "period;": ".", + "permil;": "\u2030", + "perp;": "\u22a5", + "pertenk;": "\u2031", + "pfr;": "\U0001d52d", + "phi;": "\u03c6", + "phiv;": "\u03d5", + "phmmat;": "\u2133", + "phone;": "\u260e", + "pi;": "\u03c0", + "pitchfork;": "\u22d4", + "piv;": "\u03d6", + "planck;": "\u210f", + "planckh;": "\u210e", + "plankv;": "\u210f", + "plus;": "+", + "plusacir;": "\u2a23", + "plusb;": "\u229e", + "pluscir;": "\u2a22", + "plusdo;": "\u2214", + "plusdu;": "\u2a25", + "pluse;": "\u2a72", + "plusmn": "\xb1", + "plusmn;": "\xb1", + "plussim;": "\u2a26", + "plustwo;": "\u2a27", + "pm;": "\xb1", + "pointint;": "\u2a15", + "popf;": "\U0001d561", + "pound": "\xa3", + "pound;": "\xa3", + "pr;": "\u227a", + "prE;": "\u2ab3", + "prap;": "\u2ab7", + "prcue;": "\u227c", + "pre;": "\u2aaf", + "prec;": "\u227a", + "precapprox;": "\u2ab7", + "preccurlyeq;": "\u227c", + "preceq;": "\u2aaf", + "precnapprox;": "\u2ab9", + "precneqq;": "\u2ab5", + "precnsim;": "\u22e8", + "precsim;": "\u227e", + "prime;": "\u2032", + "primes;": "\u2119", + "prnE;": "\u2ab5", + "prnap;": "\u2ab9", + "prnsim;": "\u22e8", + "prod;": "\u220f", + "profalar;": "\u232e", + "profline;": "\u2312", + "profsurf;": "\u2313", + "prop;": "\u221d", + "propto;": "\u221d", + "prsim;": "\u227e", + "prurel;": "\u22b0", + "pscr;": "\U0001d4c5", + "psi;": "\u03c8", + "puncsp;": "\u2008", + "qfr;": "\U0001d52e", + "qint;": "\u2a0c", + "qopf;": "\U0001d562", + "qprime;": "\u2057", + "qscr;": "\U0001d4c6", + "quaternions;": "\u210d", + "quatint;": "\u2a16", + "quest;": "?", + "questeq;": "\u225f", + "quot": "\"", + "quot;": "\"", + "rAarr;": "\u21db", + "rArr;": "\u21d2", + "rAtail;": "\u291c", + "rBarr;": "\u290f", + "rHar;": "\u2964", + "race;": "\u223d\u0331", + "racute;": "\u0155", + "radic;": "\u221a", + "raemptyv;": "\u29b3", + "rang;": "\u27e9", + "rangd;": "\u2992", + "range;": "\u29a5", + "rangle;": "\u27e9", + "raquo": "\xbb", + "raquo;": "\xbb", + "rarr;": "\u2192", + "rarrap;": "\u2975", + "rarrb;": "\u21e5", + "rarrbfs;": "\u2920", + "rarrc;": "\u2933", + "rarrfs;": "\u291e", + "rarrhk;": "\u21aa", + "rarrlp;": "\u21ac", + "rarrpl;": "\u2945", + "rarrsim;": "\u2974", + "rarrtl;": "\u21a3", + "rarrw;": "\u219d", + "ratail;": "\u291a", + "ratio;": "\u2236", + "rationals;": "\u211a", + "rbarr;": "\u290d", + "rbbrk;": "\u2773", + "rbrace;": "}", + "rbrack;": "]", + "rbrke;": "\u298c", + "rbrksld;": "\u298e", + "rbrkslu;": "\u2990", + "rcaron;": "\u0159", + "rcedil;": "\u0157", + "rceil;": "\u2309", + "rcub;": "}", + "rcy;": "\u0440", + "rdca;": "\u2937", + "rdldhar;": "\u2969", + "rdquo;": "\u201d", + "rdquor;": "\u201d", + "rdsh;": "\u21b3", + "real;": "\u211c", + "realine;": "\u211b", + "realpart;": "\u211c", + "reals;": "\u211d", + "rect;": "\u25ad", + "reg": "\xae", + "reg;": "\xae", + "rfisht;": "\u297d", + "rfloor;": "\u230b", + "rfr;": "\U0001d52f", + "rhard;": "\u21c1", + "rharu;": "\u21c0", + "rharul;": "\u296c", + "rho;": "\u03c1", + "rhov;": "\u03f1", + "rightarrow;": "\u2192", + "rightarrowtail;": "\u21a3", + "rightharpoondown;": "\u21c1", + "rightharpoonup;": "\u21c0", + "rightleftarrows;": "\u21c4", + "rightleftharpoons;": "\u21cc", + "rightrightarrows;": "\u21c9", + "rightsquigarrow;": "\u219d", + "rightthreetimes;": "\u22cc", + "ring;": "\u02da", + "risingdotseq;": "\u2253", + "rlarr;": "\u21c4", + "rlhar;": "\u21cc", + "rlm;": "\u200f", + "rmoust;": "\u23b1", + "rmoustache;": "\u23b1", + "rnmid;": "\u2aee", + "roang;": "\u27ed", + "roarr;": "\u21fe", + "robrk;": "\u27e7", + "ropar;": "\u2986", + "ropf;": "\U0001d563", + "roplus;": "\u2a2e", + "rotimes;": "\u2a35", + "rpar;": ")", + "rpargt;": "\u2994", + "rppolint;": "\u2a12", + "rrarr;": "\u21c9", + "rsaquo;": "\u203a", + "rscr;": "\U0001d4c7", + "rsh;": "\u21b1", + "rsqb;": "]", + "rsquo;": "\u2019", + "rsquor;": "\u2019", + "rthree;": "\u22cc", + "rtimes;": "\u22ca", + "rtri;": "\u25b9", + "rtrie;": "\u22b5", + "rtrif;": "\u25b8", + "rtriltri;": "\u29ce", + "ruluhar;": "\u2968", + "rx;": "\u211e", + "sacute;": "\u015b", + "sbquo;": "\u201a", + "sc;": "\u227b", + "scE;": "\u2ab4", + "scap;": "\u2ab8", + "scaron;": "\u0161", + "sccue;": "\u227d", + "sce;": "\u2ab0", + "scedil;": "\u015f", + "scirc;": "\u015d", + "scnE;": "\u2ab6", + "scnap;": "\u2aba", + "scnsim;": "\u22e9", + "scpolint;": "\u2a13", + "scsim;": "\u227f", + "scy;": "\u0441", + "sdot;": "\u22c5", + "sdotb;": "\u22a1", + "sdote;": "\u2a66", + "seArr;": "\u21d8", + "searhk;": "\u2925", + "searr;": "\u2198", + "searrow;": "\u2198", + "sect": "\xa7", + "sect;": "\xa7", + "semi;": ";", + "seswar;": "\u2929", + "setminus;": "\u2216", + "setmn;": "\u2216", + "sext;": "\u2736", + "sfr;": "\U0001d530", + "sfrown;": "\u2322", + "sharp;": "\u266f", + "shchcy;": "\u0449", + "shcy;": "\u0448", + "shortmid;": "\u2223", + "shortparallel;": "\u2225", + "shy": "\xad", + "shy;": "\xad", + "sigma;": "\u03c3", + "sigmaf;": "\u03c2", + "sigmav;": "\u03c2", + "sim;": "\u223c", + "simdot;": "\u2a6a", + "sime;": "\u2243", + "simeq;": "\u2243", + "simg;": "\u2a9e", + "simgE;": "\u2aa0", + "siml;": "\u2a9d", + "simlE;": "\u2a9f", + "simne;": "\u2246", + "simplus;": "\u2a24", + "simrarr;": "\u2972", + "slarr;": "\u2190", + "smallsetminus;": "\u2216", + "smashp;": "\u2a33", + "smeparsl;": "\u29e4", + "smid;": "\u2223", + "smile;": "\u2323", + "smt;": "\u2aaa", + "smte;": "\u2aac", + "smtes;": "\u2aac\ufe00", + "softcy;": "\u044c", + "sol;": "/", + "solb;": "\u29c4", + "solbar;": "\u233f", + "sopf;": "\U0001d564", + "spades;": "\u2660", + "spadesuit;": "\u2660", + "spar;": "\u2225", + "sqcap;": "\u2293", + "sqcaps;": "\u2293\ufe00", + "sqcup;": "\u2294", + "sqcups;": "\u2294\ufe00", + "sqsub;": "\u228f", + "sqsube;": "\u2291", + "sqsubset;": "\u228f", + "sqsubseteq;": "\u2291", + "sqsup;": "\u2290", + "sqsupe;": "\u2292", + "sqsupset;": "\u2290", + "sqsupseteq;": "\u2292", + "squ;": "\u25a1", + "square;": "\u25a1", + "squarf;": "\u25aa", + "squf;": "\u25aa", + "srarr;": "\u2192", + "sscr;": "\U0001d4c8", + "ssetmn;": "\u2216", + "ssmile;": "\u2323", + "sstarf;": "\u22c6", + "star;": "\u2606", + "starf;": "\u2605", + "straightepsilon;": "\u03f5", + "straightphi;": "\u03d5", + "strns;": "\xaf", + "sub;": "\u2282", + "subE;": "\u2ac5", + "subdot;": "\u2abd", + "sube;": "\u2286", + "subedot;": "\u2ac3", + "submult;": "\u2ac1", + "subnE;": "\u2acb", + "subne;": "\u228a", + "subplus;": "\u2abf", + "subrarr;": "\u2979", + "subset;": "\u2282", + "subseteq;": "\u2286", + "subseteqq;": "\u2ac5", + "subsetneq;": "\u228a", + "subsetneqq;": "\u2acb", + "subsim;": "\u2ac7", + "subsub;": "\u2ad5", + "subsup;": "\u2ad3", + "succ;": "\u227b", + "succapprox;": "\u2ab8", + "succcurlyeq;": "\u227d", + "succeq;": "\u2ab0", + "succnapprox;": "\u2aba", + "succneqq;": "\u2ab6", + "succnsim;": "\u22e9", + "succsim;": "\u227f", + "sum;": "\u2211", + "sung;": "\u266a", + "sup1": "\xb9", + "sup1;": "\xb9", + "sup2": "\xb2", + "sup2;": "\xb2", + "sup3": "\xb3", + "sup3;": "\xb3", + "sup;": "\u2283", + "supE;": "\u2ac6", + "supdot;": "\u2abe", + "supdsub;": "\u2ad8", + "supe;": "\u2287", + "supedot;": "\u2ac4", + "suphsol;": "\u27c9", + "suphsub;": "\u2ad7", + "suplarr;": "\u297b", + "supmult;": "\u2ac2", + "supnE;": "\u2acc", + "supne;": "\u228b", + "supplus;": "\u2ac0", + "supset;": "\u2283", + "supseteq;": "\u2287", + "supseteqq;": "\u2ac6", + "supsetneq;": "\u228b", + "supsetneqq;": "\u2acc", + "supsim;": "\u2ac8", + "supsub;": "\u2ad4", + "supsup;": "\u2ad6", + "swArr;": "\u21d9", + "swarhk;": "\u2926", + "swarr;": "\u2199", + "swarrow;": "\u2199", + "swnwar;": "\u292a", + "szlig": "\xdf", + "szlig;": "\xdf", + "target;": "\u2316", + "tau;": "\u03c4", + "tbrk;": "\u23b4", + "tcaron;": "\u0165", + "tcedil;": "\u0163", + "tcy;": "\u0442", + "tdot;": "\u20db", + "telrec;": "\u2315", + "tfr;": "\U0001d531", + "there4;": "\u2234", + "therefore;": "\u2234", + "theta;": "\u03b8", + "thetasym;": "\u03d1", + "thetav;": "\u03d1", + "thickapprox;": "\u2248", + "thicksim;": "\u223c", + "thinsp;": "\u2009", + "thkap;": "\u2248", + "thksim;": "\u223c", + "thorn": "\xfe", + "thorn;": "\xfe", + "tilde;": "\u02dc", + "times": "\xd7", + "times;": "\xd7", + "timesb;": "\u22a0", + "timesbar;": "\u2a31", + "timesd;": "\u2a30", + "tint;": "\u222d", + "toea;": "\u2928", + "top;": "\u22a4", + "topbot;": "\u2336", + "topcir;": "\u2af1", + "topf;": "\U0001d565", + "topfork;": "\u2ada", + "tosa;": "\u2929", + "tprime;": "\u2034", + "trade;": "\u2122", + "triangle;": "\u25b5", + "triangledown;": "\u25bf", + "triangleleft;": "\u25c3", + "trianglelefteq;": "\u22b4", + "triangleq;": "\u225c", + "triangleright;": "\u25b9", + "trianglerighteq;": "\u22b5", + "tridot;": "\u25ec", + "trie;": "\u225c", + "triminus;": "\u2a3a", + "triplus;": "\u2a39", + "trisb;": "\u29cd", + "tritime;": "\u2a3b", + "trpezium;": "\u23e2", + "tscr;": "\U0001d4c9", + "tscy;": "\u0446", + "tshcy;": "\u045b", + "tstrok;": "\u0167", + "twixt;": "\u226c", + "twoheadleftarrow;": "\u219e", + "twoheadrightarrow;": "\u21a0", + "uArr;": "\u21d1", + "uHar;": "\u2963", + "uacute": "\xfa", + "uacute;": "\xfa", + "uarr;": "\u2191", + "ubrcy;": "\u045e", + "ubreve;": "\u016d", + "ucirc": "\xfb", + "ucirc;": "\xfb", + "ucy;": "\u0443", + "udarr;": "\u21c5", + "udblac;": "\u0171", + "udhar;": "\u296e", + "ufisht;": "\u297e", + "ufr;": "\U0001d532", + "ugrave": "\xf9", + "ugrave;": "\xf9", + "uharl;": "\u21bf", + "uharr;": "\u21be", + "uhblk;": "\u2580", + "ulcorn;": "\u231c", + "ulcorner;": "\u231c", + "ulcrop;": "\u230f", + "ultri;": "\u25f8", + "umacr;": "\u016b", + "uml": "\xa8", + "uml;": "\xa8", + "uogon;": "\u0173", + "uopf;": "\U0001d566", + "uparrow;": "\u2191", + "updownarrow;": "\u2195", + "upharpoonleft;": "\u21bf", + "upharpoonright;": "\u21be", + "uplus;": "\u228e", + "upsi;": "\u03c5", + "upsih;": "\u03d2", + "upsilon;": "\u03c5", + "upuparrows;": "\u21c8", + "urcorn;": "\u231d", + "urcorner;": "\u231d", + "urcrop;": "\u230e", + "uring;": "\u016f", + "urtri;": "\u25f9", + "uscr;": "\U0001d4ca", + "utdot;": "\u22f0", + "utilde;": "\u0169", + "utri;": "\u25b5", + "utrif;": "\u25b4", + "uuarr;": "\u21c8", + "uuml": "\xfc", + "uuml;": "\xfc", + "uwangle;": "\u29a7", + "vArr;": "\u21d5", + "vBar;": "\u2ae8", + "vBarv;": "\u2ae9", + "vDash;": "\u22a8", + "vangrt;": "\u299c", + "varepsilon;": "\u03f5", + "varkappa;": "\u03f0", + "varnothing;": "\u2205", + "varphi;": "\u03d5", + "varpi;": "\u03d6", + "varpropto;": "\u221d", + "varr;": "\u2195", + "varrho;": "\u03f1", + "varsigma;": "\u03c2", + "varsubsetneq;": "\u228a\ufe00", + "varsubsetneqq;": "\u2acb\ufe00", + "varsupsetneq;": "\u228b\ufe00", + "varsupsetneqq;": "\u2acc\ufe00", + "vartheta;": "\u03d1", + "vartriangleleft;": "\u22b2", + "vartriangleright;": "\u22b3", + "vcy;": "\u0432", + "vdash;": "\u22a2", + "vee;": "\u2228", + "veebar;": "\u22bb", + "veeeq;": "\u225a", + "vellip;": "\u22ee", + "verbar;": "|", + "vert;": "|", + "vfr;": "\U0001d533", + "vltri;": "\u22b2", + "vnsub;": "\u2282\u20d2", + "vnsup;": "\u2283\u20d2", + "vopf;": "\U0001d567", + "vprop;": "\u221d", + "vrtri;": "\u22b3", + "vscr;": "\U0001d4cb", + "vsubnE;": "\u2acb\ufe00", + "vsubne;": "\u228a\ufe00", + "vsupnE;": "\u2acc\ufe00", + "vsupne;": "\u228b\ufe00", + "vzigzag;": "\u299a", + "wcirc;": "\u0175", + "wedbar;": "\u2a5f", + "wedge;": "\u2227", + "wedgeq;": "\u2259", + "weierp;": "\u2118", + "wfr;": "\U0001d534", + "wopf;": "\U0001d568", + "wp;": "\u2118", + "wr;": "\u2240", + "wreath;": "\u2240", + "wscr;": "\U0001d4cc", + "xcap;": "\u22c2", + "xcirc;": "\u25ef", + "xcup;": "\u22c3", + "xdtri;": "\u25bd", + "xfr;": "\U0001d535", + "xhArr;": "\u27fa", + "xharr;": "\u27f7", + "xi;": "\u03be", + "xlArr;": "\u27f8", + "xlarr;": "\u27f5", + "xmap;": "\u27fc", + "xnis;": "\u22fb", + "xodot;": "\u2a00", + "xopf;": "\U0001d569", + "xoplus;": "\u2a01", + "xotime;": "\u2a02", + "xrArr;": "\u27f9", + "xrarr;": "\u27f6", + "xscr;": "\U0001d4cd", + "xsqcup;": "\u2a06", + "xuplus;": "\u2a04", + "xutri;": "\u25b3", + "xvee;": "\u22c1", + "xwedge;": "\u22c0", + "yacute": "\xfd", + "yacute;": "\xfd", + "yacy;": "\u044f", + "ycirc;": "\u0177", + "ycy;": "\u044b", + "yen": "\xa5", + "yen;": "\xa5", + "yfr;": "\U0001d536", + "yicy;": "\u0457", + "yopf;": "\U0001d56a", + "yscr;": "\U0001d4ce", + "yucy;": "\u044e", + "yuml": "\xff", + "yuml;": "\xff", + "zacute;": "\u017a", + "zcaron;": "\u017e", + "zcy;": "\u0437", + "zdot;": "\u017c", + "zeetrf;": "\u2128", + "zeta;": "\u03b6", + "zfr;": "\U0001d537", + "zhcy;": "\u0436", + "zigrarr;": "\u21dd", + "zopf;": "\U0001d56b", + "zscr;": "\U0001d4cf", + "zwj;": "\u200d", + "zwnj;": "\u200c", +} + +replacementCharacters = { + 0x0: "\uFFFD", + 0x0d: "\u000D", + 0x80: "\u20AC", + 0x81: "\u0081", + 0x81: "\u0081", + 0x82: "\u201A", + 0x83: "\u0192", + 0x84: "\u201E", + 0x85: "\u2026", + 0x86: "\u2020", + 0x87: "\u2021", + 0x88: "\u02C6", + 0x89: "\u2030", + 0x8A: "\u0160", + 0x8B: "\u2039", + 0x8C: "\u0152", + 0x8D: "\u008D", + 0x8E: "\u017D", + 0x8F: "\u008F", + 0x90: "\u0090", + 0x91: "\u2018", + 0x92: "\u2019", + 0x93: "\u201C", + 0x94: "\u201D", + 0x95: "\u2022", + 0x96: "\u2013", + 0x97: "\u2014", + 0x98: "\u02DC", + 0x99: "\u2122", + 0x9A: "\u0161", + 0x9B: "\u203A", + 0x9C: "\u0153", + 0x9D: "\u009D", + 0x9E: "\u017E", + 0x9F: "\u0178", +} + +encodings = { + '437': 'cp437', + '850': 'cp850', + '852': 'cp852', + '855': 'cp855', + '857': 'cp857', + '860': 'cp860', + '861': 'cp861', + '862': 'cp862', + '863': 'cp863', + '865': 'cp865', + '866': 'cp866', + '869': 'cp869', + 'ansix341968': 'ascii', + 'ansix341986': 'ascii', + 'arabic': 'iso8859-6', + 'ascii': 'ascii', + 'asmo708': 'iso8859-6', + 'big5': 'big5', + 'big5hkscs': 'big5hkscs', + 'chinese': 'gbk', + 'cp037': 'cp037', + 'cp1026': 'cp1026', + 'cp154': 'ptcp154', + 'cp367': 'ascii', + 'cp424': 'cp424', + 'cp437': 'cp437', + 'cp500': 'cp500', + 'cp775': 'cp775', + 'cp819': 'windows-1252', + 'cp850': 'cp850', + 'cp852': 'cp852', + 'cp855': 'cp855', + 'cp857': 'cp857', + 'cp860': 'cp860', + 'cp861': 'cp861', + 'cp862': 'cp862', + 'cp863': 'cp863', + 'cp864': 'cp864', + 'cp865': 'cp865', + 'cp866': 'cp866', + 'cp869': 'cp869', + 'cp936': 'gbk', + 'cpgr': 'cp869', + 'cpis': 'cp861', + 'csascii': 'ascii', + 'csbig5': 'big5', + 'cseuckr': 'cp949', + 'cseucpkdfmtjapanese': 'euc_jp', + 'csgb2312': 'gbk', + 'cshproman8': 'hp-roman8', + 'csibm037': 'cp037', + 'csibm1026': 'cp1026', + 'csibm424': 'cp424', + 'csibm500': 'cp500', + 'csibm855': 'cp855', + 'csibm857': 'cp857', + 'csibm860': 'cp860', + 'csibm861': 'cp861', + 'csibm863': 'cp863', + 'csibm864': 'cp864', + 'csibm865': 'cp865', + 'csibm866': 'cp866', + 'csibm869': 'cp869', + 'csiso2022jp': 'iso2022_jp', + 'csiso2022jp2': 'iso2022_jp_2', + 'csiso2022kr': 'iso2022_kr', + 'csiso58gb231280': 'gbk', + 'csisolatin1': 'windows-1252', + 'csisolatin2': 'iso8859-2', + 'csisolatin3': 'iso8859-3', + 'csisolatin4': 'iso8859-4', + 'csisolatin5': 'windows-1254', + 'csisolatin6': 'iso8859-10', + 'csisolatinarabic': 'iso8859-6', + 'csisolatincyrillic': 'iso8859-5', + 'csisolatingreek': 'iso8859-7', + 'csisolatinhebrew': 'iso8859-8', + 'cskoi8r': 'koi8-r', + 'csksc56011987': 'cp949', + 'cspc775baltic': 'cp775', + 'cspc850multilingual': 'cp850', + 'cspc862latinhebrew': 'cp862', + 'cspc8codepage437': 'cp437', + 'cspcp852': 'cp852', + 'csptcp154': 'ptcp154', + 'csshiftjis': 'shift_jis', + 'csunicode11utf7': 'utf-7', + 'cyrillic': 'iso8859-5', + 'cyrillicasian': 'ptcp154', + 'ebcdiccpbe': 'cp500', + 'ebcdiccpca': 'cp037', + 'ebcdiccpch': 'cp500', + 'ebcdiccphe': 'cp424', + 'ebcdiccpnl': 'cp037', + 'ebcdiccpus': 'cp037', + 'ebcdiccpwt': 'cp037', + 'ecma114': 'iso8859-6', + 'ecma118': 'iso8859-7', + 'elot928': 'iso8859-7', + 'eucjp': 'euc_jp', + 'euckr': 'cp949', + 'extendedunixcodepackedformatforjapanese': 'euc_jp', + 'gb18030': 'gb18030', + 'gb2312': 'gbk', + 'gb231280': 'gbk', + 'gbk': 'gbk', + 'greek': 'iso8859-7', + 'greek8': 'iso8859-7', + 'hebrew': 'iso8859-8', + 'hproman8': 'hp-roman8', + 'hzgb2312': 'hz', + 'ibm037': 'cp037', + 'ibm1026': 'cp1026', + 'ibm367': 'ascii', + 'ibm424': 'cp424', + 'ibm437': 'cp437', + 'ibm500': 'cp500', + 'ibm775': 'cp775', + 'ibm819': 'windows-1252', + 'ibm850': 'cp850', + 'ibm852': 'cp852', + 'ibm855': 'cp855', + 'ibm857': 'cp857', + 'ibm860': 'cp860', + 'ibm861': 'cp861', + 'ibm862': 'cp862', + 'ibm863': 'cp863', + 'ibm864': 'cp864', + 'ibm865': 'cp865', + 'ibm866': 'cp866', + 'ibm869': 'cp869', + 'iso2022jp': 'iso2022_jp', + 'iso2022jp2': 'iso2022_jp_2', + 'iso2022kr': 'iso2022_kr', + 'iso646irv1991': 'ascii', + 'iso646us': 'ascii', + 'iso88591': 'windows-1252', + 'iso885910': 'iso8859-10', + 'iso8859101992': 'iso8859-10', + 'iso885911987': 'windows-1252', + 'iso885913': 'iso8859-13', + 'iso885914': 'iso8859-14', + 'iso8859141998': 'iso8859-14', + 'iso885915': 'iso8859-15', + 'iso885916': 'iso8859-16', + 'iso8859162001': 'iso8859-16', + 'iso88592': 'iso8859-2', + 'iso885921987': 'iso8859-2', + 'iso88593': 'iso8859-3', + 'iso885931988': 'iso8859-3', + 'iso88594': 'iso8859-4', + 'iso885941988': 'iso8859-4', + 'iso88595': 'iso8859-5', + 'iso885951988': 'iso8859-5', + 'iso88596': 'iso8859-6', + 'iso885961987': 'iso8859-6', + 'iso88597': 'iso8859-7', + 'iso885971987': 'iso8859-7', + 'iso88598': 'iso8859-8', + 'iso885981988': 'iso8859-8', + 'iso88599': 'windows-1254', + 'iso885991989': 'windows-1254', + 'isoceltic': 'iso8859-14', + 'isoir100': 'windows-1252', + 'isoir101': 'iso8859-2', + 'isoir109': 'iso8859-3', + 'isoir110': 'iso8859-4', + 'isoir126': 'iso8859-7', + 'isoir127': 'iso8859-6', + 'isoir138': 'iso8859-8', + 'isoir144': 'iso8859-5', + 'isoir148': 'windows-1254', + 'isoir149': 'cp949', + 'isoir157': 'iso8859-10', + 'isoir199': 'iso8859-14', + 'isoir226': 'iso8859-16', + 'isoir58': 'gbk', + 'isoir6': 'ascii', + 'koi8r': 'koi8-r', + 'koi8u': 'koi8-u', + 'korean': 'cp949', + 'ksc5601': 'cp949', + 'ksc56011987': 'cp949', + 'ksc56011989': 'cp949', + 'l1': 'windows-1252', + 'l10': 'iso8859-16', + 'l2': 'iso8859-2', + 'l3': 'iso8859-3', + 'l4': 'iso8859-4', + 'l5': 'windows-1254', + 'l6': 'iso8859-10', + 'l8': 'iso8859-14', + 'latin1': 'windows-1252', + 'latin10': 'iso8859-16', + 'latin2': 'iso8859-2', + 'latin3': 'iso8859-3', + 'latin4': 'iso8859-4', + 'latin5': 'windows-1254', + 'latin6': 'iso8859-10', + 'latin8': 'iso8859-14', + 'latin9': 'iso8859-15', + 'ms936': 'gbk', + 'mskanji': 'shift_jis', + 'pt154': 'ptcp154', + 'ptcp154': 'ptcp154', + 'r8': 'hp-roman8', + 'roman8': 'hp-roman8', + 'shiftjis': 'shift_jis', + 'tis620': 'cp874', + 'unicode11utf7': 'utf-7', + 'us': 'ascii', + 'usascii': 'ascii', + 'utf16': 'utf-16', + 'utf16be': 'utf-16-be', + 'utf16le': 'utf-16-le', + 'utf8': 'utf-8', + 'windows1250': 'cp1250', + 'windows1251': 'cp1251', + 'windows1252': 'cp1252', + 'windows1253': 'cp1253', + 'windows1254': 'cp1254', + 'windows1255': 'cp1255', + 'windows1256': 'cp1256', + 'windows1257': 'cp1257', + 'windows1258': 'cp1258', + 'windows936': 'gbk', + 'x-x-big5': 'big5'} + +tokenTypes = { + "Doctype": 0, + "Characters": 1, + "SpaceCharacters": 2, + "StartTag": 3, + "EndTag": 4, + "EmptyTag": 5, + "Comment": 6, + "ParseError": 7 +} + +tagTokenTypes = frozenset((tokenTypes["StartTag"], tokenTypes["EndTag"], + tokenTypes["EmptyTag"])) + + +prefixes = dict([(v, k) for k, v in namespaces.items()]) +prefixes["http://www.w3.org/1998/Math/MathML"] = "math" + + +class DataLossWarning(UserWarning): + pass + + +class ReparseException(Exception): + pass diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/constants.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/constants.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c22d9cb6e2277b2a9fb5bbbb865d4182424d2131 GIT binary patch literal 86306 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 F{2wI~GX4Mn literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ddca85ddefd254cb6da92d8a1ed87ce0a6d193b4 GIT binary patch literal 198 zcmZSn%*!?P1yfKm0~9a<X$K%KW&si@3=F{<AQ3+eAi;n}6z7AKSjD7gmSmJB#e`?( zIp(AlrKTXUk}~sRTvC%t(_;cEOEU8FT=U9ejP%T7d@_?_iZe@6bqf-cvlG)(i(?8h z3u4Mr^HTDQVlql{b4+u9D$+7@N>Yo8W8&j8^D;}~<Mj$EOE`db+T`Y^l;)(`fm~J$ G#0&t$O*M@G literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/_base.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/_base.py new file mode 100644 index 0000000000..c7dbaed0fa --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/_base.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import, division, unicode_literals + + +class Filter(object): + def __init__(self, source): + self.source = source + + def __iter__(self): + return iter(self.source) + + def __getattr__(self, name): + return getattr(self.source, name) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/_base.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/_base.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3e8b13d83129a2865d0cdd899591e646facc51a GIT binary patch literal 1301 zcmd5*&2H2%5FW?d(iT<l0Nl9bLJvrQgb?EYgesIhR9#szN$l*pI8GE#R;tw7_7(b$ z+<5_Jyy;S2fD*-%nTcooeKTYE>-gyAXI9iOJ(9lfzGo0$l49r;-~n0z3ju8giws%` z3kkwxU}w+>FcPi-HUQ^~Juowv=X(_DIA6}$@DYi!ik%<PYS;GNfOtSY<JK;^F5qJ_ z#^CDCSnVC!q4W{=$@#^3vUb=6xjrzqr=(b5NQ96MCsc%!6$ylkl^GQCbbOuB=G*m= zqmRjPCEyA`CyMi&6Q3rTj*Z<o)HdfJoRNsuHw7y>t*wYu6fm#V(&1{X)R_zKeKS~d zN2^>=pKLWQ)wfGrb>VYZtLG=L)K^!jNGzZAW&NXE+NgThtF;ZL8`KJ0|H9LbCQ*+{ zS7o#({bj0{)-E{InhP8m9*CN;^I~&H4~Zebg@BEqer)OO=x~L%bofWX$^HXk1WIcj zi(6uhmlw}aBF1B~BSsC}WPfveK>wE(OT>vDM<;rzi=k}oee!%rXtbUHYR%?EHC>pg z!HiOCJW89}&WxVSf-ghC#VI)K4~wMz^I0soCFx=?u6=PR59Mjj`h>d~aU2*oxu8f> e#=S_FtE(<-jVZ-_^GGFsvn}#lMw$BYME(ZqIYGn# literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/alphabeticalattributes.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/alphabeticalattributes.py new file mode 100644 index 0000000000..fed6996c1d --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/alphabeticalattributes.py @@ -0,0 +1,20 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import _base + +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict + + +class Filter(_base.Filter): + def __iter__(self): + for token in _base.Filter.__iter__(self): + if token["type"] in ("StartTag", "EmptyTag"): + attrs = OrderedDict() + for name, value in sorted(token["data"].items(), + key=lambda x: x[0]): + attrs[name] = value + token["data"] = attrs + yield token diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/alphabeticalattributes.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/alphabeticalattributes.pyc new file mode 100644 index 0000000000000000000000000000000000000000..595e1a577bc1256c3219b3ce8b4c20107a51228a GIT binary patch literal 1547 zcmd5+O=}cE5PdzfyGd4~5kny0#oJ!YL6CripppoJM45=uWy07q-J5i_XJ#|q6S9y+ zMDZW^AHDkrtm<7qE}qSP^j6ipu6^~Yy5k?K{cqo+q`>0UrQatXBDhavDEbIkpcEJi zlo5sz${52KLPbz9YzJi*!!E>hJ-|D#J(NorE<qes_tDYI828Z>5JGT10<8Q3R08i* z7rKkHK1KqnhcCcq;Qg=<wS>dLGO;jBZ4lGqZ_^@kSKHR>%#@S5@tz^dTo`BS%CC{r zR;H+x&aCmek=7YO!2vIxtIKlf^xVBc?yE-WMyowjc;6%cxv{kEw;sIh8S8O}3=Nin zsvwr6L~<C?6pZ1_{4E&!m5j@e@W7eCS%fPpN?`AJjG4d{Wf0h;^2R+hQ}~!Go<+Fa zhVO*O9c-R;IZEOzG!bI&cmrvKS&SK>=tFs9?3^b!Vw19Vuv3Apx8nRRj)>=6z=O6! zg#2`(TNdlk%f`QvC&Ae-Cw|HfLzMKA=m29q4OMYv5pUtDcrR7L<PQfNJ(zcftcAP` zzZ?Xg7dN9tJx))IKW+2$$W%}5h_wF8%1xE->AXEjUr+sMUF}yF>BFt<^rgvDNBw&+ zk;Pb^XqQgRB)!m;s+;uGm-dk*#3=O2rP5ALWv;y`q?O(`Ca3vuTa#%RjvXt@T*+PT zpkrQv{J*6b@E9a4L&6;mIkJq0Da(?eBm*4Ho>pO^=uzng0n3k_wxbaD^;lQIVp5Kp z3skbyA#@>atFMz*$qLcC$^7{cL2QaOu_89;eM_v0`T64!$TF@W%X~jLWvyCEZrJ{( zo?!j|0SF!BWA1ohd*Wcg&Vu@=^=-q{DTIWFH(?YV+eQC9gNxc)U3j`(+`Ri7d=c)R p{idNQV85Q<B8qO2@R!$4i1|sFH*1$mb=>NE(OMLXb?WbW{1fXkc7*@{ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/inject_meta_charset.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/inject_meta_charset.py new file mode 100644 index 0000000000..ca33b70b53 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/inject_meta_charset.py @@ -0,0 +1,65 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import _base + + +class Filter(_base.Filter): + def __init__(self, source, encoding): + _base.Filter.__init__(self, source) + self.encoding = encoding + + def __iter__(self): + state = "pre_head" + meta_found = (self.encoding is None) + pending = [] + + for token in _base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag": + if token["name"].lower() == "head": + state = "in_head" + + elif type == "EmptyTag": + if token["name"].lower() == "meta": + # replace charset with actual encoding + has_http_equiv_content_type = False + for (namespace, name), value in token["data"].items(): + if namespace is not None: + continue + elif name.lower() == 'charset': + token["data"][(namespace, name)] = self.encoding + meta_found = True + break + elif name == 'http-equiv' and value.lower() == 'content-type': + has_http_equiv_content_type = True + else: + if has_http_equiv_content_type and (None, "content") in token["data"]: + token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding + meta_found = True + + elif token["name"].lower() == "head" and not meta_found: + # insert meta into empty head + yield {"type": "StartTag", "name": "head", + "data": token["data"]} + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + yield {"type": "EndTag", "name": "head"} + meta_found = True + continue + + elif type == "EndTag": + if token["name"].lower() == "head" and pending: + # insert meta into head (if necessary) and flush pending queue + yield pending.pop(0) + if not meta_found: + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + while pending: + yield pending.pop(0) + meta_found = True + state = "post_head" + + if state == "in_head": + pending.append(token) + else: + yield token diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/inject_meta_charset.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/inject_meta_charset.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15d473760151ad1d2eb9591d86f34e83701dea01 GIT binary patch literal 2406 zcmd5;QE%f!5T0EpZqsY8?Ufb|4s;Si%1eucM3LY?aI_~Oq3V>L+N1JeoOqKsb!^98 zhZZHgls8^@LE;baWB3mz@ya`|Jn+rf;R@(@<tp2mo&9!p=9}5sI=`>2{P>&h^r-%G z@cZ#snu^aLgm@IiL}Nu~ipHAGG>siPb4Z1nLWkl8jhl4V#JEAGNh6o~iozy+M|4H> z#hFW?OULacSc`azHg90p@d>&`8kg4i(Kt(UYnP!5qiIw`X<|1pD3hp{hQ^O0Yw{p2 zA_ZleKemaF-wg_5T}Th27>K_@V8ne6;Z+ER*mDE|hu}QIVZou!aa&`$$L=iNPkGT@ zC@j%P(MZ#bXr|~&lbXrEci7aiIC0c&0NUZj9hM{j-;a{W`o0WI0{^3AP{quc!o+=X zxk$^rXFBYC8*lX~zJV0J?+qe5EW6%mlzbBRa}!>Zx>4dCm~J`n9$wmEnj9um@14E( zyw9VqSAeJ8Ea;sF15<celzCH=glX;#?Kpln2BI%S6<(B#OwambV*|f8407<emtA(4 zRZdjFu9DhPJ*IL6FKc_u&QBl>9L^O}GlEQXzD#pX1ERS@7gKFDjT{;^7;vTN;7M1{ zF=!A9=JvcvvnJQgxu!f8ZG&!)np`U=8rG&71q1t&R40yR^pfa*RczxKdReqzD$qH1 z>EckPTQIi7#txo*OP=OuzC?3)*rM5zc-x}<7n=Oc&up3Mtyjd@A9YZ?5iDT=5PePe zkWGa6uv!w{5HOav7Ry&_4ddL}`0320{HY3WNt7^mUX5?oo9xuPgj);ylcx$n|2@hD zCn&#FP!pm4@MzixTOeb9VWdU-CyHkgB+o9(EKW?Frk9|rFgOG2*Dai=D!R#@Q2v7? zXk7w&t}_m&X@)GfDBR#IpYZu8?u&oV@nC!5K|*x#3So8b{lmuOP@h)Lgqw>JkOPQ{ z;L`YB@GDFx_Ehi~(h2{bq7IMSJE+p5lKV)O8-Hkmu;fa%mzfdmu?=$jC>V$~3C2bQ z!AXBgsx@rjaGcr81(eT;K*IonoQ3MplzcXZ)@HkAQbyBq6~i97mr3ld>?+twQEsy< z=EA<s$MJ)^^||}-t)k>EaF~SHPFiHy!Z=F{EAB{}I;wW9Ed95p^6WaM*4%(qX*iZi zIZ6}r@7{$rir&S2AWpwFxkwMtdW}fvFXKX1KgvsEx$|XdCjBhPGW41@^U>j;1z*^} z8p}HAH2t(pLd&y^MPC$<P0vBsB2V@;Ob>&?XI6b-)vp=#nNiE!aOw&)IwQ+?B$lQ@ zT$&fBn{wRDdGQz@Qm$H8uD-2S)T-K1s~TVJsy8um)h+chz76$;TGKmf8?&$LO|_;r z(Sx@z(*pXAz6og)Yg@p(Vqrte9fUK3>(FN+kUiel_s3~i#u!Rd@38I}Ga~)pmkno} z3tui9gxENee-di<`=u>$hW!o@)ZuHW!`C$~W=LFka^=2QAxRqURm6Y9E=y>4^oH{% DP$eF5 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/lint.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/lint.py new file mode 100644 index 0000000000..83ad63971d --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/lint.py @@ -0,0 +1,93 @@ +from __future__ import absolute_import, division, unicode_literals + +from gettext import gettext +_ = gettext + +from . import _base +from ..constants import cdataElements, rcdataElements, voidElements + +from ..constants import spaceCharacters +spaceCharacters = "".join(spaceCharacters) + + +class LintError(Exception): + pass + + +class Filter(_base.Filter): + def __iter__(self): + open_elements = [] + contentModelFlag = "PCDATA" + for token in _base.Filter.__iter__(self): + type = token["type"] + if type in ("StartTag", "EmptyTag"): + name = token["name"] + if contentModelFlag != "PCDATA": + raise LintError(_("StartTag not in PCDATA content model flag: %s") % name) + if not isinstance(name, str): + raise LintError(_("Tag name is not a string: %r") % name) + if not name: + raise LintError(_("Empty tag name")) + if type == "StartTag" and name in voidElements: + raise LintError(_("Void element reported as StartTag token: %s") % name) + elif type == "EmptyTag" and name not in voidElements: + raise LintError(_("Non-void element reported as EmptyTag token: %s") % token["name"]) + if type == "StartTag": + open_elements.append(name) + for name, value in token["data"]: + if not isinstance(name, str): + raise LintError(_("Attribute name is not a string: %r") % name) + if not name: + raise LintError(_("Empty attribute name")) + if not isinstance(value, str): + raise LintError(_("Attribute value is not a string: %r") % value) + if name in cdataElements: + contentModelFlag = "CDATA" + elif name in rcdataElements: + contentModelFlag = "RCDATA" + elif name == "plaintext": + contentModelFlag = "PLAINTEXT" + + elif type == "EndTag": + name = token["name"] + if not isinstance(name, str): + raise LintError(_("Tag name is not a string: %r") % name) + if not name: + raise LintError(_("Empty tag name")) + if name in voidElements: + raise LintError(_("Void element reported as EndTag token: %s") % name) + start_name = open_elements.pop() + if start_name != name: + raise LintError(_("EndTag (%s) does not match StartTag (%s)") % (name, start_name)) + contentModelFlag = "PCDATA" + + elif type == "Comment": + if contentModelFlag != "PCDATA": + raise LintError(_("Comment not in PCDATA content model flag")) + + elif type in ("Characters", "SpaceCharacters"): + data = token["data"] + if not isinstance(data, str): + raise LintError(_("Attribute name is not a string: %r") % data) + if not data: + raise LintError(_("%s token with empty data") % type) + if type == "SpaceCharacters": + data = data.strip(spaceCharacters) + if data: + raise LintError(_("Non-space character(s) found in SpaceCharacters token: ") % data) + + elif type == "Doctype": + name = token["name"] + if contentModelFlag != "PCDATA": + raise LintError(_("Doctype not in PCDATA content model flag: %s") % name) + if not isinstance(name, str): + raise LintError(_("Tag name is not a string: %r") % name) + # XXX: what to do with token["data"] ? + + elif type in ("ParseError", "SerializeError"): + pass + + else: + raise LintError(_("Unknown token type: %s") % type) + + yield token diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/lint.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/lint.pyc new file mode 100644 index 0000000000000000000000000000000000000000..636243d480ee6b7707b8cdd84b8e4a5c1e025e21 GIT binary patch literal 3643 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 Vl5CCXf6}}*EsFTiyP?k*{{k3vK?MK+ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/optionaltags.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/optionaltags.py new file mode 100644 index 0000000000..fefe0b3097 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/optionaltags.py @@ -0,0 +1,205 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import _base + + +class Filter(_base.Filter): + def slider(self): + previous1 = previous2 = None + for token in self.source: + if previous1 is not None: + yield previous2, previous1, token + previous2 = previous1 + previous1 = token + yield previous2, previous1, None + + def __iter__(self): + for previous, token, next in self.slider(): + type = token["type"] + if type == "StartTag": + if (token["data"] or + not self.is_optional_start(token["name"], previous, next)): + yield token + elif type == "EndTag": + if not self.is_optional_end(token["name"], next): + yield token + else: + yield token + + def is_optional_start(self, tagname, previous, next): + type = next and next["type"] or None + if tagname in 'html': + # An html element's start tag may be omitted if the first thing + # inside the html element is not a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname == 'head': + # A head element's start tag may be omitted if the first thing + # inside the head element is an element. + # XXX: we also omit the start tag if the head element is empty + if type in ("StartTag", "EmptyTag"): + return True + elif type == "EndTag": + return next["name"] == "head" + elif tagname == 'body': + # A body element's start tag may be omitted if the first thing + # inside the body element is not a space character or a comment, + # except if the first thing inside the body element is a script + # or style element and the node immediately preceding the body + # element is a head element whose end tag has been omitted. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we do not look at the preceding event, so we never omit + # the body element's start tag if it's followed by a script or + # a style element. + return next["name"] not in ('script', 'style') + else: + return True + elif tagname == 'colgroup': + # A colgroup element's start tag may be omitted if the first thing + # inside the colgroup element is a col element, and if the element + # is not immediately preceeded by another colgroup element whose + # end tag has been omitted. + if type in ("StartTag", "EmptyTag"): + # XXX: we do not look at the preceding event, so instead we never + # omit the colgroup element's end tag when it is immediately + # followed by another colgroup element. See is_optional_end. + return next["name"] == "col" + else: + return False + elif tagname == 'tbody': + # A tbody element's start tag may be omitted if the first thing + # inside the tbody element is a tr element, and if the element is + # not immediately preceeded by a tbody, thead, or tfoot element + # whose end tag has been omitted. + if type == "StartTag": + # omit the thead and tfoot elements' end tag when they are + # immediately followed by a tbody element. See is_optional_end. + if previous and previous['type'] == 'EndTag' and \ + previous['name'] in ('tbody', 'thead', 'tfoot'): + return False + return next["name"] == 'tr' + else: + return False + return False + + def is_optional_end(self, tagname, next): + type = next and next["type"] or None + if tagname in ('html', 'head', 'body'): + # An html element's end tag may be omitted if the html element + # is not immediately followed by a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname in ('li', 'optgroup', 'tr'): + # A li element's end tag may be omitted if the li element is + # immediately followed by another li element or if there is + # no more content in the parent element. + # An optgroup element's end tag may be omitted if the optgroup + # element is immediately followed by another optgroup element, + # or if there is no more content in the parent element. + # A tr element's end tag may be omitted if the tr element is + # immediately followed by another tr element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] == tagname + else: + return type == "EndTag" or type is None + elif tagname in ('dt', 'dd'): + # A dt element's end tag may be omitted if the dt element is + # immediately followed by another dt element or a dd element. + # A dd element's end tag may be omitted if the dd element is + # immediately followed by another dd element or a dt element, + # or if there is no more content in the parent element. + if type == "StartTag": + return next["name"] in ('dt', 'dd') + elif tagname == 'dd': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'p': + # A p element's end tag may be omitted if the p element is + # immediately followed by an address, article, aside, + # blockquote, datagrid, dialog, dir, div, dl, fieldset, + # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu, + # nav, ol, p, pre, section, table, or ul, element, or if + # there is no more content in the parent element. + if type in ("StartTag", "EmptyTag"): + return next["name"] in ('address', 'article', 'aside', + 'blockquote', 'datagrid', 'dialog', + 'dir', 'div', 'dl', 'fieldset', 'footer', + 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', + 'header', 'hr', 'menu', 'nav', 'ol', + 'p', 'pre', 'section', 'table', 'ul') + else: + return type == "EndTag" or type is None + elif tagname == 'option': + # An option element's end tag may be omitted if the option + # element is immediately followed by another option element, + # or if it is immediately followed by an <code>optgroup</code> + # element, or if there is no more content in the parent + # element. + if type == "StartTag": + return next["name"] in ('option', 'optgroup') + else: + return type == "EndTag" or type is None + elif tagname in ('rt', 'rp'): + # An rt element's end tag may be omitted if the rt element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + # An rp element's end tag may be omitted if the rp element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('rt', 'rp') + else: + return type == "EndTag" or type is None + elif tagname == 'colgroup': + # A colgroup element's end tag may be omitted if the colgroup + # element is not immediately followed by a space character or + # a comment. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we also look for an immediately following colgroup + # element. See is_optional_start. + return next["name"] != 'colgroup' + else: + return True + elif tagname in ('thead', 'tbody'): + # A thead element's end tag may be omitted if the thead element + # is immediately followed by a tbody or tfoot element. + # A tbody element's end tag may be omitted if the tbody element + # is immediately followed by a tbody or tfoot element, or if + # there is no more content in the parent element. + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] in ['tbody', 'tfoot'] + elif tagname == 'tbody': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'tfoot': + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] == 'tbody' + else: + return type == "EndTag" or type is None + elif tagname in ('td', 'th'): + # A td element's end tag may be omitted if the td element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + # A th element's end tag may be omitted if the th element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('td', 'th') + else: + return type == "EndTag" or type is None + return False diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/optionaltags.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/optionaltags.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2cc7381f8dc7a4f82cfd11c9e4eaaf8a6ac2837 GIT binary patch literal 4616 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 XWZWh8Fbq#w$Df0)1(ZAF?(zNvB`x>c literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/sanitizer.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/sanitizer.py new file mode 100644 index 0000000000..b206b54e7a --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/sanitizer.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import _base +from ..sanitizer import HTMLSanitizerMixin + + +class Filter(_base.Filter, HTMLSanitizerMixin): + def __iter__(self): + for token in _base.Filter.__iter__(self): + token = self.sanitize_token(token) + if token: + yield token diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/sanitizer.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/sanitizer.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f0c913d0d82537cda20ee55a3396cadc9faebd7 GIT binary patch literal 1025 zcmc&yO>fjN5PeSei%QUio{+e4$%P(}P$h&aK&9%Ttxy(G5gCPK<K6Yv`5<;yEh;DY z3;aj!`~haX%a(u8$eGN%*fa0VIQ(;e=hyEbo?`Qa^nLv$fR*GFv;+)L3M2w$fFwW} zA_*ai07VGXL)k~tr?`ir4>LeHL^7m!0M*BG1U1Br_73qA_yK%MMkq#@ME9tG=Bg3b zbh~7-+}5UZD%E9Ex6X|SEA&cRT~}^QL09Q%U8vM(r`pU|EeMR*xIURQ&#cnH7JEeA z$%nJkNmgm6zp3_2U+KyX2tL+^Qfy^&inlELAvp@Hmc$cd5*$x_g(>gh+)Q`Mdk@LE zI)DR~0?Pn5Bv9b!^HY2m94tfJ2!=QmX!qED6kqp1>w@yH6Q4&tN)&V2m{oY$Y047Q z)IA`?ZuqCJzEoAjBpjcy%FMj*HBJa3Hnt&Cyp(h87F{kcboIu}T2=h#<+_qbD(~j< z{k2=v)w^mXpYI>YQ=LmorJps~^fH?(D;wR&m8y!ml?zvz7lwAseD|#UN37j%u48U1 zPt3A`cr13sK&*$$NSanzsYua|56Zge42AxfXMJn#hClayNU!Do4#c^?p&Pcd&UG!b vrC*5oCd7UUKIF+czRufr#D1cj@K%)f?nIftP_NbvKV<HfNA)Bai*fiDO5*f_ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/whitespace.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/whitespace.py new file mode 100644 index 0000000000..dfc60eebd3 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/whitespace.py @@ -0,0 +1,38 @@ +from __future__ import absolute_import, division, unicode_literals + +import re + +from . import _base +from ..constants import rcdataElements, spaceCharacters +spaceCharacters = "".join(spaceCharacters) + +SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) + + +class Filter(_base.Filter): + + spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) + + def __iter__(self): + preserve = 0 + for token in _base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag" \ + and (preserve or token["name"] in self.spacePreserveElements): + preserve += 1 + + elif type == "EndTag" and preserve: + preserve -= 1 + + elif not preserve and type == "SpaceCharacters" and token["data"]: + # Test on token["data"] above to not introduce spaces where there were not + token["data"] = " " + + elif not preserve and type == "Characters": + token["data"] = collapse_spaces(token["data"]) + + yield token + + +def collapse_spaces(text): + return SPACES_REGEX.sub(' ', text) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/whitespace.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/whitespace.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4c6d31202c2a9718fd0b3d6481e12a028130d49 GIT binary patch literal 1816 zcmc&!U5*n+5U%d=&e~oZ5GWu=M9K@2l?WapMMMapz~ba3TCK(?B*UP|c&2TSx95lH zo`prbPjCftf}A3U-~zco-gAM}*W=A5xxiX>xx1>myT0$MZtt)0@WY=nNNM}=`2X8q zB$;1%knvZLCMpDlf(l8Yq{5@nBY~JC-J`HanMYZV^bQq1g+9l2DDz40QqiZdPsM=3 z0eg38GbA;jcf8wxRF5`$l=b1c3D<}+_WHCL(^612r1wPch<*;ol<i>>Ucr&`>4;0q zQSTJh+N*4mg{gFFRh$=f)mYnSUzQ)|Ca+3+jVEoHr&Xq6om<r;+8pG9y;B&w!zNxN zM&%Md7<+|HlV*ucW?B`hw8oud>LgYB>!e9i-p90@MJ?99xMN;^X?-4jmun9FLuij( zPeABh9w-JONXad;D@n=&5e)wpC}7^CL+Vp7cj#I`tQ*w=kyUSO(x@aw+1Pl<zZ9GQ z!2_1+OwgN;WQjI{Hj+-6KtWGm{!V8+;Zr3|&OAD0xjZ_O)V!cmLFT~4dNkqu4F~*f zfMvYTJC??+@ZE~HSkXAk;cpOr2G^+h&1LPnEFSY|eVVYBMeQaJ%P+djk1liQGP&B` zc{0~}o=F(}C|*tIc}6Vx9^*T3nzz7hPwI}5IrCwkB`fDGlR`OJTj($=GX&5b^Z%)a zEg)?R9zSov;)SMD$Qgk40Nc1$iet1*9NSOW<9gt*QARb#>Ob9)R$3>uQL#%gQ&%dC zQF`e%VkO-&*K@Wy;>J41Gvz#T#=PQD_8?m2cHJ(b=Xv>9FB_HpYqZGA=&4$?tLX5= zuB&oZ9!Fo@yC40KFCxRW-etr`$x4~1&g<w{m08t9Yg_2AHD@eci<;>5np0h^_v({i zmruo2F`u#_;fskFiV@qfyw1PR<XGMix8xLgTUNk0vjPI+xTvyLV>;mJvZ>yx(kScj z>D<@=Km)X~JLv-MWnzZHcuow8^W|;nt`^z?4X}@^1xmUb#TN`W3QrK;h=Z<uy7vN` z%nu*$&*pJ3`+oM5#d^~&x);W2%$N59^d)HwY3`sh03b2N?byn<Y;D`Hd;uZ>C<xq3 z2-7HLfE@tk<V~y6*o0rjPE}kPC-kPuON$0ctD?@e3a(=rSPpRX1^!DE-SzInu3H}g Ur@>=?TaM&4aZ_BCH@wN@Zz5!*EdT%j literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/html5parser.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/html5parser.py new file mode 100644 index 0000000000..9dfa4dd0a5 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/html5parser.py @@ -0,0 +1,2725 @@ +from __future__ import absolute_import, division, unicode_literals +from pip.vendor.six import with_metaclass + +import types + +from . import inputstream +from . import tokenizer + +from . import treebuilders +from .treebuilders._base import Marker + +from . import utils +from . import constants +from .constants import spaceCharacters, asciiUpper2Lower +from .constants import specialElements +from .constants import headingElements +from .constants import cdataElements, rcdataElements +from .constants import tokenTypes, ReparseException, namespaces +from .constants import htmlIntegrationPointElements, mathmlTextIntegrationPointElements + + +def parse(doc, treebuilder="etree", encoding=None, + namespaceHTMLElements=True): + """Parse a string or file-like object into a tree""" + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parse(doc, encoding=encoding) + + +def parseFragment(doc, container="div", treebuilder="etree", encoding=None, + namespaceHTMLElements=True): + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parseFragment(doc, container=container, encoding=encoding) + + +def method_decorator_metaclass(function): + class Decorated(type): + def __new__(meta, classname, bases, classDict): + for attributeName, attribute in classDict.items(): + if isinstance(attribute, types.FunctionType): + attribute = function(attribute) + + classDict[attributeName] = attribute + return type.__new__(meta, classname, bases, classDict) + return Decorated + + +class HTMLParser(object): + """HTML parser. Generates a tree structure from a stream of (possibly + malformed) HTML""" + + def __init__(self, tree=None, tokenizer=tokenizer.HTMLTokenizer, + strict=False, namespaceHTMLElements=True, debug=False): + """ + strict - raise an exception when a parse error is encountered + + tree - a treebuilder class controlling the type of tree that will be + returned. Built in treebuilders can be accessed through + html5lib.treebuilders.getTreeBuilder(treeType) + + tokenizer - a class that provides a stream of tokens to the treebuilder. + This may be replaced for e.g. a sanitizer which converts some tags to + text + """ + + # Raise an exception on the first error encountered + self.strict = strict + + if tree is None: + tree = treebuilders.getTreeBuilder("etree") + self.tree = tree(namespaceHTMLElements) + self.tokenizer_class = tokenizer + self.errors = [] + + self.phases = dict([(name, cls(self, self.tree)) for name, cls in + getPhases(debug).items()]) + + def _parse(self, stream, innerHTML=False, container="div", + encoding=None, parseMeta=True, useChardet=True, **kwargs): + + self.innerHTMLMode = innerHTML + self.container = container + self.tokenizer = self.tokenizer_class(stream, encoding=encoding, + parseMeta=parseMeta, + useChardet=useChardet, + parser=self, **kwargs) + self.reset() + + while True: + try: + self.mainLoop() + break + except ReparseException: + self.reset() + + def reset(self): + self.tree.reset() + self.firstStartTag = False + self.errors = [] + self.log = [] # only used with debug mode + # "quirks" / "limited quirks" / "no quirks" + self.compatMode = "no quirks" + + if self.innerHTMLMode: + self.innerHTML = self.container.lower() + + if self.innerHTML in cdataElements: + self.tokenizer.state = self.tokenizer.rcdataState + elif self.innerHTML in rcdataElements: + self.tokenizer.state = self.tokenizer.rawtextState + elif self.innerHTML == 'plaintext': + self.tokenizer.state = self.tokenizer.plaintextState + else: + # state already is data state + # self.tokenizer.state = self.tokenizer.dataState + pass + self.phase = self.phases["beforeHtml"] + self.phase.insertHtmlElement() + self.resetInsertionMode() + else: + self.innerHTML = False + self.phase = self.phases["initial"] + + self.lastPhase = None + + self.beforeRCDataPhase = None + + self.framesetOK = True + + def isHTMLIntegrationPoint(self, element): + if (element.name == "annotation-xml" and + element.namespace == namespaces["mathml"]): + return ("encoding" in element.attributes and + element.attributes["encoding"].translate( + asciiUpper2Lower) in + ("text/html", "application/xhtml+xml")) + else: + return (element.namespace, element.name) in htmlIntegrationPointElements + + def isMathMLTextIntegrationPoint(self, element): + return (element.namespace, element.name) in mathmlTextIntegrationPointElements + + def mainLoop(self): + CharactersToken = tokenTypes["Characters"] + SpaceCharactersToken = tokenTypes["SpaceCharacters"] + StartTagToken = tokenTypes["StartTag"] + EndTagToken = tokenTypes["EndTag"] + CommentToken = tokenTypes["Comment"] + DoctypeToken = tokenTypes["Doctype"] + ParseErrorToken = tokenTypes["ParseError"] + + for token in self.normalizedTokens(): + new_token = token + while new_token is not None: + currentNode = self.tree.openElements[-1] if self.tree.openElements else None + currentNodeNamespace = currentNode.namespace if currentNode else None + currentNodeName = currentNode.name if currentNode else None + + type = new_token["type"] + + if type == ParseErrorToken: + self.parseError(new_token["data"], new_token.get("datavars", {})) + new_token = None + else: + if (len(self.tree.openElements) == 0 or + currentNodeNamespace == self.tree.defaultNamespace or + (self.isMathMLTextIntegrationPoint(currentNode) and + ((type == StartTagToken and + token["name"] not in frozenset(["mglyph", "malignmark"])) or + type in (CharactersToken, SpaceCharactersToken))) or + (currentNodeNamespace == namespaces["mathml"] and + currentNodeName == "annotation-xml" and + token["name"] == "svg") or + (self.isHTMLIntegrationPoint(currentNode) and + type in (StartTagToken, CharactersToken, SpaceCharactersToken))): + phase = self.phase + else: + phase = self.phases["inForeignContent"] + + if type == CharactersToken: + new_token = phase.processCharacters(new_token) + elif type == SpaceCharactersToken: + new_token = phase.processSpaceCharacters(new_token) + elif type == StartTagToken: + new_token = phase.processStartTag(new_token) + elif type == EndTagToken: + new_token = phase.processEndTag(new_token) + elif type == CommentToken: + new_token = phase.processComment(new_token) + elif type == DoctypeToken: + new_token = phase.processDoctype(new_token) + + if (type == StartTagToken and token["selfClosing"] + and not token["selfClosingAcknowledged"]): + self.parseError("non-void-element-with-trailing-solidus", + {"name": token["name"]}) + + # When the loop finishes it's EOF + reprocess = True + phases = [] + while reprocess: + phases.append(self.phase) + reprocess = self.phase.processEOF() + if reprocess: + assert self.phase not in phases + + def normalizedTokens(self): + for token in self.tokenizer: + yield self.normalizeToken(token) + + def parse(self, stream, encoding=None, parseMeta=True, useChardet=True): + """Parse a HTML document into a well-formed tree + + stream - a filelike object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + """ + self._parse(stream, innerHTML=False, encoding=encoding, + parseMeta=parseMeta, useChardet=useChardet) + return self.tree.getDocument() + + def parseFragment(self, stream, container="div", encoding=None, + parseMeta=False, useChardet=True): + """Parse a HTML fragment into a well-formed tree fragment + + container - name of the element we're setting the innerHTML property + if set to None, default to 'div' + + stream - a filelike object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + """ + self._parse(stream, True, container=container, encoding=encoding) + return self.tree.getFragment() + + def parseError(self, errorcode="XXX-undefined-error", datavars={}): + # XXX The idea is to make errorcode mandatory. + self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) + if self.strict: + raise ParseError + + def normalizeToken(self, token): + """ HTML5 specific normalizations to the token stream """ + + if token["type"] == tokenTypes["StartTag"]: + token["data"] = dict(token["data"][::-1]) + + return token + + def adjustMathMLAttributes(self, token): + replacements = {"definitionurl": "definitionURL"} + for k, v in replacements.items(): + if k in token["data"]: + token["data"][v] = token["data"][k] + del token["data"][k] + + def adjustSVGAttributes(self, token): + replacements = { + "attributename": "attributeName", + "attributetype": "attributeType", + "basefrequency": "baseFrequency", + "baseprofile": "baseProfile", + "calcmode": "calcMode", + "clippathunits": "clipPathUnits", + "contentscripttype": "contentScriptType", + "contentstyletype": "contentStyleType", + "diffuseconstant": "diffuseConstant", + "edgemode": "edgeMode", + "externalresourcesrequired": "externalResourcesRequired", + "filterres": "filterRes", + "filterunits": "filterUnits", + "glyphref": "glyphRef", + "gradienttransform": "gradientTransform", + "gradientunits": "gradientUnits", + "kernelmatrix": "kernelMatrix", + "kernelunitlength": "kernelUnitLength", + "keypoints": "keyPoints", + "keysplines": "keySplines", + "keytimes": "keyTimes", + "lengthadjust": "lengthAdjust", + "limitingconeangle": "limitingConeAngle", + "markerheight": "markerHeight", + "markerunits": "markerUnits", + "markerwidth": "markerWidth", + "maskcontentunits": "maskContentUnits", + "maskunits": "maskUnits", + "numoctaves": "numOctaves", + "pathlength": "pathLength", + "patterncontentunits": "patternContentUnits", + "patterntransform": "patternTransform", + "patternunits": "patternUnits", + "pointsatx": "pointsAtX", + "pointsaty": "pointsAtY", + "pointsatz": "pointsAtZ", + "preservealpha": "preserveAlpha", + "preserveaspectratio": "preserveAspectRatio", + "primitiveunits": "primitiveUnits", + "refx": "refX", + "refy": "refY", + "repeatcount": "repeatCount", + "repeatdur": "repeatDur", + "requiredextensions": "requiredExtensions", + "requiredfeatures": "requiredFeatures", + "specularconstant": "specularConstant", + "specularexponent": "specularExponent", + "spreadmethod": "spreadMethod", + "startoffset": "startOffset", + "stddeviation": "stdDeviation", + "stitchtiles": "stitchTiles", + "surfacescale": "surfaceScale", + "systemlanguage": "systemLanguage", + "tablevalues": "tableValues", + "targetx": "targetX", + "targety": "targetY", + "textlength": "textLength", + "viewbox": "viewBox", + "viewtarget": "viewTarget", + "xchannelselector": "xChannelSelector", + "ychannelselector": "yChannelSelector", + "zoomandpan": "zoomAndPan" + } + for originalName in list(token["data"].keys()): + if originalName in replacements: + svgName = replacements[originalName] + token["data"][svgName] = token["data"][originalName] + del token["data"][originalName] + + def adjustForeignAttributes(self, token): + replacements = { + "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]), + "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]), + "xlink:href": ("xlink", "href", namespaces["xlink"]), + "xlink:role": ("xlink", "role", namespaces["xlink"]), + "xlink:show": ("xlink", "show", namespaces["xlink"]), + "xlink:title": ("xlink", "title", namespaces["xlink"]), + "xlink:type": ("xlink", "type", namespaces["xlink"]), + "xml:base": ("xml", "base", namespaces["xml"]), + "xml:lang": ("xml", "lang", namespaces["xml"]), + "xml:space": ("xml", "space", namespaces["xml"]), + "xmlns": (None, "xmlns", namespaces["xmlns"]), + "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"]) + } + + for originalName in token["data"].keys(): + if originalName in replacements: + foreignName = replacements[originalName] + token["data"][foreignName] = token["data"][originalName] + del token["data"][originalName] + + def reparseTokenNormal(self, token): + self.parser.phase() + + def resetInsertionMode(self): + # The name of this method is mostly historical. (It's also used in the + # specification.) + last = False + newModes = { + "select": "inSelect", + "td": "inCell", + "th": "inCell", + "tr": "inRow", + "tbody": "inTableBody", + "thead": "inTableBody", + "tfoot": "inTableBody", + "caption": "inCaption", + "colgroup": "inColumnGroup", + "table": "inTable", + "head": "inBody", + "body": "inBody", + "frameset": "inFrameset", + "html": "beforeHead" + } + for node in self.tree.openElements[::-1]: + nodeName = node.name + new_phase = None + if node == self.tree.openElements[0]: + assert self.innerHTML + last = True + nodeName = self.innerHTML + # Check for conditions that should only happen in the innerHTML + # case + if nodeName in ("select", "colgroup", "head", "html"): + assert self.innerHTML + + if not last and node.namespace != self.tree.defaultNamespace: + continue + + if nodeName in newModes: + new_phase = self.phases[newModes[nodeName]] + break + elif last: + new_phase = self.phases["inBody"] + break + + self.phase = new_phase + + def parseRCDataRawtext(self, token, contentType): + """Generic RCDATA/RAWTEXT Parsing algorithm + contentType - RCDATA or RAWTEXT + """ + assert contentType in ("RAWTEXT", "RCDATA") + + self.tree.insertElement(token) + + if contentType == "RAWTEXT": + self.tokenizer.state = self.tokenizer.rawtextState + else: + self.tokenizer.state = self.tokenizer.rcdataState + + self.originalPhase = self.phase + + self.phase = self.phases["text"] + + +def getPhases(debug): + def log(function): + """Logger that records which phase processes each token""" + type_names = dict((value, key) for key, value in + constants.tokenTypes.items()) + + def wrapped(self, *args, **kwargs): + if function.__name__.startswith("process") and len(args) > 0: + token = args[0] + try: + info = {"type": type_names[token['type']]} + except: + raise + if token['type'] in constants.tagTokenTypes: + info["name"] = token['name'] + + self.parser.log.append((self.parser.tokenizer.state.__name__, + self.parser.phase.__class__.__name__, + self.__class__.__name__, + function.__name__, + info)) + return function(self, *args, **kwargs) + else: + return function(self, *args, **kwargs) + return wrapped + + def getMetaclass(use_metaclass, metaclass_func): + if use_metaclass: + return method_decorator_metaclass(metaclass_func) + else: + return type + + class Phase(with_metaclass(getMetaclass(debug, log))): + """Base class for helper object that implements each phase of processing + """ + + def __init__(self, parser, tree): + self.parser = parser + self.tree = tree + + def processEOF(self): + raise NotImplementedError + + def processComment(self, token): + # For most phases the following is correct. Where it's not it will be + # overridden. + self.tree.insertComment(token, self.tree.openElements[-1]) + + def processDoctype(self, token): + self.parser.parseError("unexpected-doctype") + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processSpaceCharacters(self, token): + self.tree.insertText(token["data"]) + + def processStartTag(self, token): + return self.startTagHandler[token["name"]](token) + + def startTagHtml(self, token): + if not self.parser.firstStartTag and token["name"] == "html": + self.parser.parseError("non-html-root") + # XXX Need a check here to see if the first start tag token emitted is + # this token... If it's not, invoke self.parser.parseError(). + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[0].attributes: + self.tree.openElements[0].attributes[attr] = value + self.parser.firstStartTag = False + + def processEndTag(self, token): + return self.endTagHandler[token["name"]](token) + + class InitialPhase(Phase): + def processSpaceCharacters(self, token): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + correct = token["correct"] + + if (name != "html" or publicId is not None or + systemId is not None and systemId != "about:legacy-compat"): + self.parser.parseError("unknown-doctype") + + if publicId is None: + publicId = "" + + self.tree.insertDoctype(token) + + if publicId != "": + publicId = publicId.translate(asciiUpper2Lower) + + if (not correct or token["name"] != "html" + or publicId.startswith( + ("+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//")) + or publicId in + ("-//w3o//dtd w3 html strict 3.0//en//", + "-/w3c/dtd html 4.0 transitional/en", + "html") + or publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is None + or systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): + self.parser.compatMode = "quirks" + elif (publicId.startswith( + ("-//w3c//dtd xhtml 1.0 frameset//", + "-//w3c//dtd xhtml 1.0 transitional//")) + or publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is not None): + self.parser.compatMode = "limited quirks" + + self.parser.phase = self.parser.phases["beforeHtml"] + + def anythingElse(self): + self.parser.compatMode = "quirks" + self.parser.phase = self.parser.phases["beforeHtml"] + + def processCharacters(self, token): + self.parser.parseError("expected-doctype-but-got-chars") + self.anythingElse() + return token + + def processStartTag(self, token): + self.parser.parseError("expected-doctype-but-got-start-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEndTag(self, token): + self.parser.parseError("expected-doctype-but-got-end-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEOF(self): + self.parser.parseError("expected-doctype-but-got-eof") + self.anythingElse() + return True + + class BeforeHtmlPhase(Phase): + # helper methods + def insertHtmlElement(self): + self.tree.insertRoot(impliedTagToken("html", "StartTag")) + self.parser.phase = self.parser.phases["beforeHead"] + + # other + def processEOF(self): + self.insertHtmlElement() + return True + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.insertHtmlElement() + return token + + def processStartTag(self, token): + if token["name"] == "html": + self.parser.firstStartTag = True + self.insertHtmlElement() + return token + + def processEndTag(self, token): + if token["name"] not in ("head", "body", "html", "br"): + self.parser.parseError("unexpected-end-tag-before-html", + {"name": token["name"]}) + else: + self.insertHtmlElement() + return token + + class BeforeHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + (("head", "body", "html", "br"), self.endTagImplyHead) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.startTagHead(impliedTagToken("head", "StartTag")) + return True + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.tree.insertElement(token) + self.tree.headPointer = self.tree.openElements[-1] + self.parser.phase = self.parser.phases["inHead"] + + def startTagOther(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagImplyHead(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagOther(self, token): + self.parser.parseError("end-tag-after-implied-root", + {"name": token["name"]}) + + class InHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("title", self.startTagTitle), + (("noscript", "noframes", "style"), self.startTagNoScriptNoFramesStyle), + ("script", self.startTagScript), + (("base", "basefont", "bgsound", "command", "link"), + self.startTagBaseLinkCommand), + ("meta", self.startTagMeta), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self. endTagHandler = utils.MethodDispatcher([ + ("head", self.endTagHead), + (("br", "html", "body"), self.endTagHtmlBodyBr) + ]) + self.endTagHandler.default = self.endTagOther + + # the real thing + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.parser.parseError("two-heads-are-not-better-than-one") + + def startTagBaseLinkCommand(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMeta(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + attributes = token["data"] + if self.parser.tokenizer.stream.charEncoding[1] == "tentative": + if "charset" in attributes: + self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) + elif ("content" in attributes and + "http-equiv" in attributes and + attributes["http-equiv"].lower() == "content-type"): + # Encoding it as UTF-8 here is a hack, as really we should pass + # the abstract Unicode string, and just use the + # ContentAttrParser on that, but using UTF-8 allows all chars + # to be encoded and as a ASCII-superset works. + data = inputstream.EncodingBytes(attributes["content"].encode("utf-8")) + parser = inputstream.ContentAttrParser(data) + codec = parser.parse() + self.parser.tokenizer.stream.changeEncoding(codec) + + def startTagTitle(self, token): + self.parser.parseRCDataRawtext(token, "RCDATA") + + def startTagNoScriptNoFramesStyle(self, token): + # Need to decide whether to implement the scripting-disabled case + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagScript(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState + self.parser.originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["text"] + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHead(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "head", "Expected head got %s" % node.name + self.parser.phase = self.parser.phases["afterHead"] + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.endTagHead(impliedTagToken("head")) + + # XXX If we implement a parser for which scripting is disabled we need to + # implement this phase. + # + # class InHeadNoScriptPhase(Phase): + class AfterHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", + "style", "title"), + self.startTagFromHead), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = utils.MethodDispatcher([(("body", "html", "br"), + self.endTagHtmlBodyBr)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBody(self, token): + self.parser.framesetOK = False + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inBody"] + + def startTagFrameset(self, token): + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagFromHead(self, token): + self.parser.parseError("unexpected-start-tag-out-of-my-head", + {"name": token["name"]}) + self.tree.openElements.append(self.tree.headPointer) + self.parser.phases["inHead"].processStartTag(token) + for node in self.tree.openElements[::-1]: + if node.name == "head": + self.tree.openElements.remove(node) + break + + def startTagHead(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.tree.insertElement(impliedTagToken("body", "StartTag")) + self.parser.phase = self.parser.phases["inBody"] + self.parser.framesetOK = True + + class InBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody + # the really-really-really-very crazy mode + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + # Keep a ref to this for special handling of whitespace in <pre> + self.processSpaceCharactersNonPre = self.processSpaceCharacters + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("base", "basefont", "bgsound", "command", "link", "meta", + "noframes", "script", "style", "title"), + self.startTagProcessInHead), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("address", "article", "aside", "blockquote", "center", "details", + "details", "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", + "section", "summary", "ul"), + self.startTagCloseP), + (headingElements, self.startTagHeading), + (("pre", "listing"), self.startTagPreListing), + ("form", self.startTagForm), + (("li", "dd", "dt"), self.startTagListItem), + ("plaintext", self.startTagPlaintext), + ("a", self.startTagA), + (("b", "big", "code", "em", "font", "i", "s", "small", "strike", + "strong", "tt", "u"), self.startTagFormatting), + ("nobr", self.startTagNobr), + ("button", self.startTagButton), + (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), + ("xmp", self.startTagXmp), + ("table", self.startTagTable), + (("area", "br", "embed", "img", "keygen", "wbr"), + self.startTagVoidFormatting), + (("param", "source", "track"), self.startTagParamSource), + ("input", self.startTagInput), + ("hr", self.startTagHr), + ("image", self.startTagImage), + ("isindex", self.startTagIsIndex), + ("textarea", self.startTagTextarea), + ("iframe", self.startTagIFrame), + (("noembed", "noframes", "noscript"), self.startTagRawtext), + ("select", self.startTagSelect), + (("rp", "rt"), self.startTagRpRt), + (("option", "optgroup"), self.startTagOpt), + (("math"), self.startTagMath), + (("svg"), self.startTagSvg), + (("caption", "col", "colgroup", "frame", "head", + "tbody", "td", "tfoot", "th", "thead", + "tr"), self.startTagMisplaced) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("body", self.endTagBody), + ("html", self.endTagHtml), + (("address", "article", "aside", "blockquote", "button", "center", + "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", + "section", "summary", "ul"), self.endTagBlock), + ("form", self.endTagForm), + ("p", self.endTagP), + (("dd", "dt", "li"), self.endTagListItem), + (headingElements, self.endTagHeading), + (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", + "strike", "strong", "tt", "u"), self.endTagFormatting), + (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def isMatchingFormattingElement(self, node1, node2): + if node1.name != node2.name or node1.namespace != node2.namespace: + return False + elif len(node1.attributes) != len(node2.attributes): + return False + else: + attributes1 = sorted(node1.attributes.items()) + attributes2 = sorted(node2.attributes.items()) + for attr1, attr2 in zip(attributes1, attributes2): + if attr1 != attr2: + return False + return True + + # helper + def addFormattingElement(self, token): + self.tree.insertElement(token) + element = self.tree.openElements[-1] + + matchingElements = [] + for node in self.tree.activeFormattingElements[::-1]: + if node is Marker: + break + elif self.isMatchingFormattingElement(node, element): + matchingElements.append(node) + + assert len(matchingElements) <= 3 + if len(matchingElements) == 3: + self.tree.activeFormattingElements.remove(matchingElements[-1]) + self.tree.activeFormattingElements.append(element) + + # the real deal + def processEOF(self): + allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", + "tfoot", "th", "thead", "tr", "body", + "html")) + for node in self.tree.openElements[::-1]: + if node.name not in allowed_elements: + self.parser.parseError("expected-closing-tag-but-got-eof") + break + # Stop parsing + + def processSpaceCharactersDropNewline(self, token): + # Sometimes (start of <pre>, <listing>, and <textarea> blocks) we + # want to drop leading newlines + data = token["data"] + self.processSpaceCharacters = self.processSpaceCharactersNonPre + if (data.startswith("\n") and + self.tree.openElements[-1].name in ("pre", "listing", "textarea") + and not self.tree.openElements[-1].hasContent()): + data = data[1:] + if data: + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(data) + + def processCharacters(self, token): + if token["data"] == "\u0000": + # The tokenizer should always emit null on its own + return + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(token["data"]) + # This must be bad for performance + if (self.parser.framesetOK and + any([char not in spaceCharacters + for char in token["data"]])): + self.parser.framesetOK = False + + def processSpaceCharacters(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(token["data"]) + + def startTagProcessInHead(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagBody(self, token): + self.parser.parseError("unexpected-start-tag", {"name": "body"}) + if (len(self.tree.openElements) == 1 + or self.tree.openElements[1].name != "body"): + assert self.parser.innerHTML + else: + self.parser.framesetOK = False + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[1].attributes: + self.tree.openElements[1].attributes[attr] = value + + def startTagFrameset(self, token): + self.parser.parseError("unexpected-start-tag", {"name": "frameset"}) + if (len(self.tree.openElements) == 1 or self.tree.openElements[1].name != "body"): + assert self.parser.innerHTML + elif not self.parser.framesetOK: + pass + else: + if self.tree.openElements[1].parent: + self.tree.openElements[1].parent.removeChild(self.tree.openElements[1]) + while self.tree.openElements[-1].name != "html": + self.tree.openElements.pop() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagCloseP(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + + def startTagPreListing(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.framesetOK = False + self.processSpaceCharacters = self.processSpaceCharactersDropNewline + + def startTagForm(self, token): + if self.tree.formPointer: + self.parser.parseError("unexpected-start-tag", {"name": "form"}) + else: + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.tree.formPointer = self.tree.openElements[-1] + + def startTagListItem(self, token): + self.parser.framesetOK = False + + stopNamesMap = {"li": ["li"], + "dt": ["dt", "dd"], + "dd": ["dt", "dd"]} + stopNames = stopNamesMap[token["name"]] + for node in reversed(self.tree.openElements): + if node.name in stopNames: + self.parser.phase.processEndTag( + impliedTagToken(node.name, "EndTag")) + break + if (node.nameTuple in specialElements and + node.name not in ("address", "div", "p")): + break + + if self.tree.elementInScope("p", variant="button"): + self.parser.phase.processEndTag( + impliedTagToken("p", "EndTag")) + + self.tree.insertElement(token) + + def startTagPlaintext(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.plaintextState + + def startTagHeading(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + if self.tree.openElements[-1].name in headingElements: + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagA(self, token): + afeAElement = self.tree.elementInActiveFormattingElements("a") + if afeAElement: + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "a", "endName": "a"}) + self.endTagFormatting(impliedTagToken("a")) + if afeAElement in self.tree.openElements: + self.tree.openElements.remove(afeAElement) + if afeAElement in self.tree.activeFormattingElements: + self.tree.activeFormattingElements.remove(afeAElement) + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagFormatting(self, token): + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagNobr(self, token): + self.tree.reconstructActiveFormattingElements() + if self.tree.elementInScope("nobr"): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "nobr", "endName": "nobr"}) + self.processEndTag(impliedTagToken("nobr")) + # XXX Need tests that trigger the following + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagButton(self, token): + if self.tree.elementInScope("button"): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "button", "endName": "button"}) + self.processEndTag(impliedTagToken("button")) + return token + else: + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.parser.framesetOK = False + + def startTagAppletMarqueeObject(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.tree.activeFormattingElements.append(Marker) + self.parser.framesetOK = False + + def startTagXmp(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.reconstructActiveFormattingElements() + self.parser.framesetOK = False + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagTable(self, token): + if self.parser.compatMode != "quirks": + if self.tree.elementInScope("p", variant="button"): + self.processEndTag(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.framesetOK = False + self.parser.phase = self.parser.phases["inTable"] + + def startTagVoidFormatting(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + self.parser.framesetOK = False + + def startTagInput(self, token): + framesetOK = self.parser.framesetOK + self.startTagVoidFormatting(token) + if ("type" in token["data"] and + token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): + # input type=hidden doesn't change framesetOK + self.parser.framesetOK = framesetOK + + def startTagParamSource(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagHr(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + self.parser.framesetOK = False + + def startTagImage(self, token): + # No really... + self.parser.parseError("unexpected-start-tag-treated-as", + {"originalName": "image", "newName": "img"}) + self.processStartTag(impliedTagToken("img", "StartTag", + attributes=token["data"], + selfClosing=token["selfClosing"])) + + def startTagIsIndex(self, token): + self.parser.parseError("deprecated-tag", {"name": "isindex"}) + if self.tree.formPointer: + return + form_attrs = {} + if "action" in token["data"]: + form_attrs["action"] = token["data"]["action"] + self.processStartTag(impliedTagToken("form", "StartTag", + attributes=form_attrs)) + self.processStartTag(impliedTagToken("hr", "StartTag")) + self.processStartTag(impliedTagToken("label", "StartTag")) + # XXX Localization ... + if "prompt" in token["data"]: + prompt = token["data"]["prompt"] + else: + prompt = "This is a searchable index. Enter search keywords: " + self.processCharacters( + {"type": tokenTypes["Characters"], "data": prompt}) + attributes = token["data"].copy() + if "action" in attributes: + del attributes["action"] + if "prompt" in attributes: + del attributes["prompt"] + attributes["name"] = "isindex" + self.processStartTag(impliedTagToken("input", "StartTag", + attributes=attributes, + selfClosing= + token["selfClosing"])) + self.processEndTag(impliedTagToken("label")) + self.processStartTag(impliedTagToken("hr", "StartTag")) + self.processEndTag(impliedTagToken("form")) + + def startTagTextarea(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.rcdataState + self.processSpaceCharacters = self.processSpaceCharactersDropNewline + self.parser.framesetOK = False + + def startTagIFrame(self, token): + self.parser.framesetOK = False + self.startTagRawtext(token) + + def startTagRawtext(self, token): + """iframe, noembed noframes, noscript(if scripting enabled)""" + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagOpt(self, token): + if self.tree.openElements[-1].name == "option": + self.parser.phase.processEndTag(impliedTagToken("option")) + self.tree.reconstructActiveFormattingElements() + self.parser.tree.insertElement(token) + + def startTagSelect(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.parser.framesetOK = False + if self.parser.phase in (self.parser.phases["inTable"], + self.parser.phases["inCaption"], + self.parser.phases["inColumnGroup"], + self.parser.phases["inTableBody"], + self.parser.phases["inRow"], + self.parser.phases["inCell"]): + self.parser.phase = self.parser.phases["inSelectInTable"] + else: + self.parser.phase = self.parser.phases["inSelect"] + + def startTagRpRt(self, token): + if self.tree.elementInScope("ruby"): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "ruby": + self.parser.parseError() + self.tree.insertElement(token) + + def startTagMath(self, token): + self.tree.reconstructActiveFormattingElements() + self.parser.adjustMathMLAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = namespaces["mathml"] + self.tree.insertElement(token) + # Need to get the parse error right for the case where the token + # has a namespace not equal to the xmlns attribute + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagSvg(self, token): + self.tree.reconstructActiveFormattingElements() + self.parser.adjustSVGAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = namespaces["svg"] + self.tree.insertElement(token) + # Need to get the parse error right for the case where the token + # has a namespace not equal to the xmlns attribute + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMisplaced(self, token): + """ Elements that should be children of other elements that have a + different insertion mode; here they are ignored + "caption", "col", "colgroup", "frame", "frameset", "head", + "option", "optgroup", "tbody", "td", "tfoot", "th", "thead", + "tr", "noscript" + """ + self.parser.parseError("unexpected-start-tag-ignored", {"name": token["name"]}) + + def startTagOther(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + + def endTagP(self, token): + if not self.tree.elementInScope("p", variant="button"): + self.startTagCloseP(impliedTagToken("p", "StartTag")) + self.parser.parseError("unexpected-end-tag", {"name": "p"}) + self.endTagP(impliedTagToken("p", "EndTag")) + else: + self.tree.generateImpliedEndTags("p") + if self.tree.openElements[-1].name != "p": + self.parser.parseError("unexpected-end-tag", {"name": "p"}) + node = self.tree.openElements.pop() + while node.name != "p": + node = self.tree.openElements.pop() + + def endTagBody(self, token): + if not self.tree.elementInScope("body"): + self.parser.parseError() + return + elif self.tree.openElements[-1].name != "body": + for node in self.tree.openElements[2:]: + if node.name not in frozenset(("dd", "dt", "li", "optgroup", + "option", "p", "rp", "rt", + "tbody", "td", "tfoot", + "th", "thead", "tr", "body", + "html")): + # Not sure this is the correct name for the parse error + self.parser.parseError( + "expected-one-end-tag-but-got-another", + {"expectedName": "body", "gotName": node.name}) + break + self.parser.phase = self.parser.phases["afterBody"] + + def endTagHtml(self, token): + # We repeat the test for the body end tag token being ignored here + if self.tree.elementInScope("body"): + self.endTagBody(impliedTagToken("body")) + return token + + def endTagBlock(self, token): + # Put us back in the right whitespace handling mode + if token["name"] == "pre": + self.processSpaceCharacters = self.processSpaceCharactersNonPre + inScope = self.tree.elementInScope(token["name"]) + if inScope: + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + if inScope: + node = self.tree.openElements.pop() + while node.name != token["name"]: + node = self.tree.openElements.pop() + + def endTagForm(self, token): + node = self.tree.formPointer + self.tree.formPointer = None + if node is None or not self.tree.elementInScope(node): + self.parser.parseError("unexpected-end-tag", + {"name": "form"}) + else: + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1] != node: + self.parser.parseError("end-tag-too-early-ignored", + {"name": "form"}) + self.tree.openElements.remove(node) + + def endTagListItem(self, token): + if token["name"] == "li": + variant = "list" + else: + variant = None + if not self.tree.elementInScope(token["name"], variant=variant): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + else: + self.tree.generateImpliedEndTags(exclude=token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError( + "end-tag-too-early", + {"name": token["name"]}) + node = self.tree.openElements.pop() + while node.name != token["name"]: + node = self.tree.openElements.pop() + + def endTagHeading(self, token): + for item in headingElements: + if self.tree.elementInScope(item): + self.tree.generateImpliedEndTags() + break + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + + for item in headingElements: + if self.tree.elementInScope(item): + item = self.tree.openElements.pop() + while item.name not in headingElements: + item = self.tree.openElements.pop() + break + + def endTagFormatting(self, token): + """The much-feared adoption agency algorithm""" + # http://svn.whatwg.org/webapps/complete.html#adoptionAgency revision 7867 + # XXX Better parseError messages appreciated. + + # Step 1 + outerLoopCounter = 0 + + # Step 2 + while outerLoopCounter < 8: + + # Step 3 + outerLoopCounter += 1 + + # Step 4: + + # Let the formatting element be the last element in + # the list of active formatting elements that: + # - is between the end of the list and the last scope + # marker in the list, if any, or the start of the list + # otherwise, and + # - has the same tag name as the token. + formattingElement = self.tree.elementInActiveFormattingElements( + token["name"]) + if (not formattingElement or + (formattingElement in self.tree.openElements and + not self.tree.elementInScope(formattingElement.name))): + # If there is no such node, then abort these steps + # and instead act as described in the "any other + # end tag" entry below. + self.endTagOther(token) + return + + # Otherwise, if there is such a node, but that node is + # not in the stack of open elements, then this is a + # parse error; remove the element from the list, and + # abort these steps. + elif formattingElement not in self.tree.openElements: + self.parser.parseError("adoption-agency-1.2", {"name": token["name"]}) + self.tree.activeFormattingElements.remove(formattingElement) + return + + # Otherwise, if there is such a node, and that node is + # also in the stack of open elements, but the element + # is not in scope, then this is a parse error; ignore + # the token, and abort these steps. + elif not self.tree.elementInScope(formattingElement.name): + self.parser.parseError("adoption-agency-4.4", {"name": token["name"]}) + return + + # Otherwise, there is a formatting element and that + # element is in the stack and is in scope. If the + # element is not the current node, this is a parse + # error. In any case, proceed with the algorithm as + # written in the following steps. + else: + if formattingElement != self.tree.openElements[-1]: + self.parser.parseError("adoption-agency-1.3", {"name": token["name"]}) + + # Step 5: + + # Let the furthest block be the topmost node in the + # stack of open elements that is lower in the stack + # than the formatting element, and is an element in + # the special category. There might not be one. + afeIndex = self.tree.openElements.index(formattingElement) + furthestBlock = None + for element in self.tree.openElements[afeIndex:]: + if element.nameTuple in specialElements: + furthestBlock = element + break + + # Step 6: + + # If there is no furthest block, then the UA must + # first pop all the nodes from the bottom of the stack + # of open elements, from the current node up to and + # including the formatting element, then remove the + # formatting element from the list of active + # formatting elements, and finally abort these steps. + if furthestBlock is None: + element = self.tree.openElements.pop() + while element != formattingElement: + element = self.tree.openElements.pop() + self.tree.activeFormattingElements.remove(element) + return + + # Step 7 + commonAncestor = self.tree.openElements[afeIndex - 1] + + # Step 8: + # The bookmark is supposed to help us identify where to reinsert + # nodes in step 15. We have to ensure that we reinsert nodes after + # the node before the active formatting element. Note the bookmark + # can move in step 9.7 + bookmark = self.tree.activeFormattingElements.index(formattingElement) + + # Step 9 + lastNode = node = furthestBlock + innerLoopCounter = 0 + + index = self.tree.openElements.index(node) + while innerLoopCounter < 3: + innerLoopCounter += 1 + # Node is element before node in open elements + index -= 1 + node = self.tree.openElements[index] + if node not in self.tree.activeFormattingElements: + self.tree.openElements.remove(node) + continue + # Step 9.6 + if node == formattingElement: + break + # Step 9.7 + if lastNode == furthestBlock: + bookmark = self.tree.activeFormattingElements.index(node) + 1 + # Step 9.8 + clone = node.cloneNode() + # Replace node with clone + self.tree.activeFormattingElements[ + self.tree.activeFormattingElements.index(node)] = clone + self.tree.openElements[ + self.tree.openElements.index(node)] = clone + node = clone + # Step 9.9 + # Remove lastNode from its parents, if any + if lastNode.parent: + lastNode.parent.removeChild(lastNode) + node.appendChild(lastNode) + # Step 9.10 + lastNode = node + + # Step 10 + # Foster parent lastNode if commonAncestor is a + # table, tbody, tfoot, thead, or tr we need to foster + # parent the lastNode + if lastNode.parent: + lastNode.parent.removeChild(lastNode) + + if commonAncestor.name in frozenset(("table", "tbody", "tfoot", "thead", "tr")): + parent, insertBefore = self.tree.getTableMisnestedNodePosition() + parent.insertBefore(lastNode, insertBefore) + else: + commonAncestor.appendChild(lastNode) + + # Step 11 + clone = formattingElement.cloneNode() + + # Step 12 + furthestBlock.reparentChildren(clone) + + # Step 13 + furthestBlock.appendChild(clone) + + # Step 14 + self.tree.activeFormattingElements.remove(formattingElement) + self.tree.activeFormattingElements.insert(bookmark, clone) + + # Step 15 + self.tree.openElements.remove(formattingElement) + self.tree.openElements.insert( + self.tree.openElements.index(furthestBlock) + 1, clone) + + def endTagAppletMarqueeObject(self, token): + if self.tree.elementInScope(token["name"]): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + + if self.tree.elementInScope(token["name"]): + element = self.tree.openElements.pop() + while element.name != token["name"]: + element = self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + + def endTagBr(self, token): + self.parser.parseError("unexpected-end-tag-treated-as", + {"originalName": "br", "newName": "br element"}) + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(impliedTagToken("br", "StartTag")) + self.tree.openElements.pop() + + def endTagOther(self, token): + for node in self.tree.openElements[::-1]: + if node.name == token["name"]: + self.tree.generateImpliedEndTags(exclude=token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + while self.tree.openElements.pop() != node: + pass + break + else: + if node.nameTuple in specialElements: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + break + + class TextPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = utils.MethodDispatcher([]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = utils.MethodDispatcher([ + ("script", self.endTagScript)]) + self.endTagHandler.default = self.endTagOther + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processEOF(self): + self.parser.parseError("expected-named-closing-tag-but-got-eof", + {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + self.parser.phase = self.parser.originalPhase + return True + + def startTagOther(self, token): + assert False, "Tried to process start tag %s in RCDATA/RAWTEXT mode" % token['name'] + + def endTagScript(self, token): + node = self.tree.openElements.pop() + assert node.name == "script" + self.parser.phase = self.parser.originalPhase + # The rest of this method is all stuff that only happens if + # document.write works + + def endTagOther(self, token): + self.tree.openElements.pop() + self.parser.phase = self.parser.originalPhase + + class InTablePhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-table + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("caption", self.startTagCaption), + ("colgroup", self.startTagColgroup), + ("col", self.startTagCol), + (("tbody", "tfoot", "thead"), self.startTagRowGroup), + (("td", "th", "tr"), self.startTagImplyTbody), + ("table", self.startTagTable), + (("style", "script"), self.startTagStyleScript), + ("input", self.startTagInput), + ("form", self.startTagForm) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("table", self.endTagTable), + (("body", "caption", "col", "colgroup", "html", "tbody", "td", + "tfoot", "th", "thead", "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods + def clearStackToTableContext(self): + # "clear the stack back to a table context" + while self.tree.openElements[-1].name not in ("table", "html"): + # self.parser.parseError("unexpected-implied-end-tag-in-table", + # {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + # When the current node is <html> it's an innerHTML case + + # processing methods + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-table") + else: + assert self.parser.innerHTML + # Stop parsing + + def processSpaceCharacters(self, token): + originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["inTableText"] + self.parser.phase.originalPhase = originalPhase + self.parser.phase.processSpaceCharacters(token) + + def processCharacters(self, token): + originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["inTableText"] + self.parser.phase.originalPhase = originalPhase + self.parser.phase.processCharacters(token) + + def insertText(self, token): + # If we get here there must be at least one non-whitespace character + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processCharacters(token) + self.tree.insertFromTable = False + + def startTagCaption(self, token): + self.clearStackToTableContext() + self.tree.activeFormattingElements.append(Marker) + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inCaption"] + + def startTagColgroup(self, token): + self.clearStackToTableContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inColumnGroup"] + + def startTagCol(self, token): + self.startTagColgroup(impliedTagToken("colgroup", "StartTag")) + return token + + def startTagRowGroup(self, token): + self.clearStackToTableContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inTableBody"] + + def startTagImplyTbody(self, token): + self.startTagRowGroup(impliedTagToken("tbody", "StartTag")) + return token + + def startTagTable(self, token): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "table", "endName": "table"}) + self.parser.phase.processEndTag(impliedTagToken("table")) + if not self.parser.innerHTML: + return token + + def startTagStyleScript(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagInput(self, token): + if ("type" in token["data"] and + token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): + self.parser.parseError("unexpected-hidden-input-in-table") + self.tree.insertElement(token) + # XXX associate with form + self.tree.openElements.pop() + else: + self.startTagOther(token) + + def startTagForm(self, token): + self.parser.parseError("unexpected-form-in-table") + if self.tree.formPointer is None: + self.tree.insertElement(token) + self.tree.formPointer = self.tree.openElements[-1] + self.tree.openElements.pop() + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-implies-table-voodoo", {"name": token["name"]}) + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processStartTag(token) + self.tree.insertFromTable = False + + def endTagTable(self, token): + if self.tree.elementInScope("table", variant="table"): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "table": + self.parser.parseError("end-tag-too-early-named", + {"gotName": "table", + "expectedName": self.tree.openElements[-1].name}) + while self.tree.openElements[-1].name != "table": + self.tree.openElements.pop() + self.tree.openElements.pop() + self.parser.resetInsertionMode() + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-implies-table-voodoo", {"name": token["name"]}) + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processEndTag(token) + self.tree.insertFromTable = False + + class InTableTextPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.originalPhase = None + self.characterTokens = [] + + def flushCharacters(self): + data = "".join([item["data"] for item in self.characterTokens]) + if any([item not in spaceCharacters for item in data]): + token = {"type": tokenTypes["Characters"], "data": data} + self.parser.phases["inTable"].insertText(token) + elif data: + self.tree.insertText(data) + self.characterTokens = [] + + def processComment(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + def processEOF(self): + self.flushCharacters() + self.parser.phase = self.originalPhase + return True + + def processCharacters(self, token): + if token["data"] == "\u0000": + return + self.characterTokens.append(token) + + def processSpaceCharacters(self, token): + # pretty sure we should never reach here + self.characterTokens.append(token) + # assert False + + def processStartTag(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + def processEndTag(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + class InCaptionPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-caption + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.startTagTableElement) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("caption", self.endTagCaption), + ("table", self.endTagTable), + (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + def ignoreEndTagCaption(self): + return not self.tree.elementInScope("caption", variant="table") + + def processEOF(self): + self.parser.phases["inBody"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inBody"].processCharacters(token) + + def startTagTableElement(self, token): + self.parser.parseError() + # XXX Have to duplicate logic here to find out if the tag is ignored + ignoreEndTag = self.ignoreEndTagCaption() + self.parser.phase.processEndTag(impliedTagToken("caption")) + if not ignoreEndTag: + return token + + def startTagOther(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def endTagCaption(self, token): + if not self.ignoreEndTagCaption(): + # AT this code is quite similar to endTagTable in "InTable" + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "caption": + self.parser.parseError("expected-one-end-tag-but-got-another", + {"gotName": "caption", + "expectedName": self.tree.openElements[-1].name}) + while self.tree.openElements[-1].name != "caption": + self.tree.openElements.pop() + self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + self.parser.phase = self.parser.phases["inTable"] + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagTable(self, token): + self.parser.parseError() + ignoreEndTag = self.ignoreEndTagCaption() + self.parser.phase.processEndTag(impliedTagToken("caption")) + if not ignoreEndTag: + return token + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inBody"].processEndTag(token) + + class InColumnGroupPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-column + + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("col", self.startTagCol) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("colgroup", self.endTagColgroup), + ("col", self.endTagCol) + ]) + self.endTagHandler.default = self.endTagOther + + def ignoreEndTagColgroup(self): + return self.tree.openElements[-1].name == "html" + + def processEOF(self): + if self.tree.openElements[-1].name == "html": + assert self.parser.innerHTML + return + else: + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return True + + def processCharacters(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + def startTagCol(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + + def startTagOther(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + def endTagColgroup(self, token): + if self.ignoreEndTagColgroup(): + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + else: + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTable"] + + def endTagCol(self, token): + self.parser.parseError("no-end-tag", {"name": "col"}) + + def endTagOther(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + class InTableBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-table0 + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("tr", self.startTagTr), + (("td", "th"), self.startTagTableCell), + (("caption", "col", "colgroup", "tbody", "tfoot", "thead"), + self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), + ("table", self.endTagTable), + (("body", "caption", "col", "colgroup", "html", "td", "th", + "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods + def clearStackToTableBodyContext(self): + while self.tree.openElements[-1].name not in ("tbody", "tfoot", + "thead", "html"): + # self.parser.parseError("unexpected-implied-end-tag-in-table", + # {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + if self.tree.openElements[-1].name == "html": + assert self.parser.innerHTML + + # the rest + def processEOF(self): + self.parser.phases["inTable"].processEOF() + + def processSpaceCharacters(self, token): + return self.parser.phases["inTable"].processSpaceCharacters(token) + + def processCharacters(self, token): + return self.parser.phases["inTable"].processCharacters(token) + + def startTagTr(self, token): + self.clearStackToTableBodyContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inRow"] + + def startTagTableCell(self, token): + self.parser.parseError("unexpected-cell-in-table-body", + {"name": token["name"]}) + self.startTagTr(impliedTagToken("tr", "StartTag")) + return token + + def startTagTableOther(self, token): + # XXX AT Any ideas on how to share this with endTagTable? + if (self.tree.elementInScope("tbody", variant="table") or + self.tree.elementInScope("thead", variant="table") or + self.tree.elementInScope("tfoot", variant="table")): + self.clearStackToTableBodyContext() + self.endTagTableRowGroup( + impliedTagToken(self.tree.openElements[-1].name)) + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def startTagOther(self, token): + return self.parser.phases["inTable"].processStartTag(token) + + def endTagTableRowGroup(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.clearStackToTableBodyContext() + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTable"] + else: + self.parser.parseError("unexpected-end-tag-in-table-body", + {"name": token["name"]}) + + def endTagTable(self, token): + if (self.tree.elementInScope("tbody", variant="table") or + self.tree.elementInScope("thead", variant="table") or + self.tree.elementInScope("tfoot", variant="table")): + self.clearStackToTableBodyContext() + self.endTagTableRowGroup( + impliedTagToken(self.tree.openElements[-1].name)) + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag-in-table-body", + {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inTable"].processEndTag(token) + + class InRowPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-row + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("td", "th"), self.startTagTableCell), + (("caption", "col", "colgroup", "tbody", "tfoot", "thead", + "tr"), self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("tr", self.endTagTr), + ("table", self.endTagTable), + (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), + (("body", "caption", "col", "colgroup", "html", "td", "th"), + self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods (XXX unify this with other table helper methods) + def clearStackToTableRowContext(self): + while self.tree.openElements[-1].name not in ("tr", "html"): + self.parser.parseError("unexpected-implied-end-tag-in-table-row", + {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + + def ignoreEndTagTr(self): + return not self.tree.elementInScope("tr", variant="table") + + # the rest + def processEOF(self): + self.parser.phases["inTable"].processEOF() + + def processSpaceCharacters(self, token): + return self.parser.phases["inTable"].processSpaceCharacters(token) + + def processCharacters(self, token): + return self.parser.phases["inTable"].processCharacters(token) + + def startTagTableCell(self, token): + self.clearStackToTableRowContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inCell"] + self.tree.activeFormattingElements.append(Marker) + + def startTagTableOther(self, token): + ignoreEndTag = self.ignoreEndTagTr() + self.endTagTr(impliedTagToken("tr")) + # XXX how are we sure it's always ignored in the innerHTML case? + if not ignoreEndTag: + return token + + def startTagOther(self, token): + return self.parser.phases["inTable"].processStartTag(token) + + def endTagTr(self, token): + if not self.ignoreEndTagTr(): + self.clearStackToTableRowContext() + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTableBody"] + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagTable(self, token): + ignoreEndTag = self.ignoreEndTagTr() + self.endTagTr(impliedTagToken("tr")) + # Reprocess the current tag if the tr end tag was not ignored + # XXX how are we sure it's always ignored in the innerHTML case? + if not ignoreEndTag: + return token + + def endTagTableRowGroup(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.endTagTr(impliedTagToken("tr")) + return token + else: + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag-in-table-row", + {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inTable"].processEndTag(token) + + class InCellPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-cell + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + (("td", "th"), self.endTagTableCell), + (("body", "caption", "col", "colgroup", "html"), self.endTagIgnore), + (("table", "tbody", "tfoot", "thead", "tr"), self.endTagImply) + ]) + self.endTagHandler.default = self.endTagOther + + # helper + def closeCell(self): + if self.tree.elementInScope("td", variant="table"): + self.endTagTableCell(impliedTagToken("td")) + elif self.tree.elementInScope("th", variant="table"): + self.endTagTableCell(impliedTagToken("th")) + + # the rest + def processEOF(self): + self.parser.phases["inBody"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inBody"].processCharacters(token) + + def startTagTableOther(self, token): + if (self.tree.elementInScope("td", variant="table") or + self.tree.elementInScope("th", variant="table")): + self.closeCell() + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def startTagOther(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def endTagTableCell(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.tree.generateImpliedEndTags(token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("unexpected-cell-end-tag", + {"name": token["name"]}) + while True: + node = self.tree.openElements.pop() + if node.name == token["name"]: + break + else: + self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + self.parser.phase = self.parser.phases["inRow"] + else: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagImply(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.closeCell() + return token + else: + # sometimes innerHTML case + self.parser.parseError() + + def endTagOther(self, token): + return self.parser.phases["inBody"].processEndTag(token) + + class InSelectPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("option", self.startTagOption), + ("optgroup", self.startTagOptgroup), + ("select", self.startTagSelect), + (("input", "keygen", "textarea"), self.startTagInput), + ("script", self.startTagScript) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("option", self.endTagOption), + ("optgroup", self.endTagOptgroup), + ("select", self.endTagSelect) + ]) + self.endTagHandler.default = self.endTagOther + + # http://www.whatwg.org/specs/web-apps/current-work/#in-select + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-select") + else: + assert self.parser.innerHTML + + def processCharacters(self, token): + if token["data"] == "\u0000": + return + self.tree.insertText(token["data"]) + + def startTagOption(self, token): + # We need to imply </option> if <option> is the current node. + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagOptgroup(self, token): + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + if self.tree.openElements[-1].name == "optgroup": + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagSelect(self, token): + self.parser.parseError("unexpected-select-in-select") + self.endTagSelect(impliedTagToken("select")) + + def startTagInput(self, token): + self.parser.parseError("unexpected-input-in-select") + if self.tree.elementInScope("select", variant="select"): + self.endTagSelect(impliedTagToken("select")) + return token + else: + assert self.parser.innerHTML + + def startTagScript(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-in-select", + {"name": token["name"]}) + + def endTagOption(self, token): + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + else: + self.parser.parseError("unexpected-end-tag-in-select", + {"name": "option"}) + + def endTagOptgroup(self, token): + # </optgroup> implicitly closes <option> + if (self.tree.openElements[-1].name == "option" and + self.tree.openElements[-2].name == "optgroup"): + self.tree.openElements.pop() + # It also closes </optgroup> + if self.tree.openElements[-1].name == "optgroup": + self.tree.openElements.pop() + # But nothing else + else: + self.parser.parseError("unexpected-end-tag-in-select", + {"name": "optgroup"}) + + def endTagSelect(self, token): + if self.tree.elementInScope("select", variant="select"): + node = self.tree.openElements.pop() + while node.name != "select": + node = self.tree.openElements.pop() + self.parser.resetInsertionMode() + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-in-select", + {"name": token["name"]}) + + class InSelectInTablePhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), + self.startTagTable) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), + self.endTagTable) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.phases["inSelect"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inSelect"].processCharacters(token) + + def startTagTable(self, token): + self.parser.parseError("unexpected-table-element-start-tag-in-select-in-table", {"name": token["name"]}) + self.endTagOther(impliedTagToken("select")) + return token + + def startTagOther(self, token): + return self.parser.phases["inSelect"].processStartTag(token) + + def endTagTable(self, token): + self.parser.parseError("unexpected-table-element-end-tag-in-select-in-table", {"name": token["name"]}) + if self.tree.elementInScope(token["name"], variant="table"): + self.endTagOther(impliedTagToken("select")) + return token + + def endTagOther(self, token): + return self.parser.phases["inSelect"].processEndTag(token) + + class InForeignContentPhase(Phase): + breakoutElements = frozenset(["b", "big", "blockquote", "body", "br", + "center", "code", "dd", "div", "dl", "dt", + "em", "embed", "h1", "h2", "h3", + "h4", "h5", "h6", "head", "hr", "i", "img", + "li", "listing", "menu", "meta", "nobr", + "ol", "p", "pre", "ruby", "s", "small", + "span", "strong", "strike", "sub", "sup", + "table", "tt", "u", "ul", "var"]) + + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + def adjustSVGTagNames(self, token): + replacements = {"altglyph": "altGlyph", + "altglyphdef": "altGlyphDef", + "altglyphitem": "altGlyphItem", + "animatecolor": "animateColor", + "animatemotion": "animateMotion", + "animatetransform": "animateTransform", + "clippath": "clipPath", + "feblend": "feBlend", + "fecolormatrix": "feColorMatrix", + "fecomponenttransfer": "feComponentTransfer", + "fecomposite": "feComposite", + "feconvolvematrix": "feConvolveMatrix", + "fediffuselighting": "feDiffuseLighting", + "fedisplacementmap": "feDisplacementMap", + "fedistantlight": "feDistantLight", + "feflood": "feFlood", + "fefunca": "feFuncA", + "fefuncb": "feFuncB", + "fefuncg": "feFuncG", + "fefuncr": "feFuncR", + "fegaussianblur": "feGaussianBlur", + "feimage": "feImage", + "femerge": "feMerge", + "femergenode": "feMergeNode", + "femorphology": "feMorphology", + "feoffset": "feOffset", + "fepointlight": "fePointLight", + "fespecularlighting": "feSpecularLighting", + "fespotlight": "feSpotLight", + "fetile": "feTile", + "feturbulence": "feTurbulence", + "foreignobject": "foreignObject", + "glyphref": "glyphRef", + "lineargradient": "linearGradient", + "radialgradient": "radialGradient", + "textpath": "textPath"} + + if token["name"] in replacements: + token["name"] = replacements[token["name"]] + + def processCharacters(self, token): + if token["data"] == "\u0000": + token["data"] = "\uFFFD" + elif (self.parser.framesetOK and + any(char not in spaceCharacters for char in token["data"])): + self.parser.framesetOK = False + Phase.processCharacters(self, token) + + def processStartTag(self, token): + currentNode = self.tree.openElements[-1] + if (token["name"] in self.breakoutElements or + (token["name"] == "font" and + set(token["data"].keys()) & set(["color", "face", "size"]))): + self.parser.parseError("unexpected-html-element-in-foreign-content", + {"name": token["name"]}) + while (self.tree.openElements[-1].namespace != + self.tree.defaultNamespace and + not self.parser.isHTMLIntegrationPoint(self.tree.openElements[-1]) and + not self.parser.isMathMLTextIntegrationPoint(self.tree.openElements[-1])): + self.tree.openElements.pop() + return token + + else: + if currentNode.namespace == namespaces["mathml"]: + self.parser.adjustMathMLAttributes(token) + elif currentNode.namespace == namespaces["svg"]: + self.adjustSVGTagNames(token) + self.parser.adjustSVGAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = currentNode.namespace + self.tree.insertElement(token) + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def processEndTag(self, token): + nodeIndex = len(self.tree.openElements) - 1 + node = self.tree.openElements[-1] + if node.name != token["name"]: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + while True: + if node.name.translate(asciiUpper2Lower) == token["name"]: + # XXX this isn't in the spec but it seems necessary + if self.parser.phase == self.parser.phases["inTableText"]: + self.parser.phase.flushCharacters() + self.parser.phase = self.parser.phase.originalPhase + while self.tree.openElements.pop() != node: + assert self.tree.openElements + new_token = None + break + nodeIndex -= 1 + + node = self.tree.openElements[nodeIndex] + if node.namespace != self.tree.defaultNamespace: + continue + else: + new_token = self.parser.phase.processEndTag(token) + break + return new_token + + class AfterBodyPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([("html", self.endTagHtml)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + # Stop parsing + pass + + def processComment(self, token): + # This is needed because data is to be appended to the <html> element + # here and not to whatever is currently open. + self.tree.insertComment(token, self.tree.openElements[0]) + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-after-body") + self.parser.phase = self.parser.phases["inBody"] + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-after-body", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + def endTagHtml(self, name): + if self.parser.innerHTML: + self.parser.parseError("unexpected-end-tag-after-body-innerhtml") + else: + self.parser.phase = self.parser.phases["afterAfterBody"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-after-body", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + class InFramesetPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("frameset", self.startTagFrameset), + ("frame", self.startTagFrame), + ("noframes", self.startTagNoframes) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("frameset", self.endTagFrameset) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-frameset") + else: + assert self.parser.innerHTML + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-in-frameset") + + def startTagFrameset(self, token): + self.tree.insertElement(token) + + def startTagFrame(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + + def startTagNoframes(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-in-frameset", + {"name": token["name"]}) + + def endTagFrameset(self, token): + if self.tree.openElements[-1].name == "html": + # innerHTML case + self.parser.parseError("unexpected-frameset-in-frameset-innerhtml") + else: + self.tree.openElements.pop() + if (not self.parser.innerHTML and + self.tree.openElements[-1].name != "frameset"): + # If we're not in innerHTML mode and the the current node is not a + # "frameset" element (anymore) then switch. + self.parser.phase = self.parser.phases["afterFrameset"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-in-frameset", + {"name": token["name"]}) + + class AfterFramesetPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#after3 + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("noframes", self.startTagNoframes) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("html", self.endTagHtml) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + # Stop parsing + pass + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-after-frameset") + + def startTagNoframes(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-after-frameset", + {"name": token["name"]}) + + def endTagHtml(self, token): + self.parser.phase = self.parser.phases["afterAfterFrameset"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-after-frameset", + {"name": token["name"]}) + + class AfterAfterBodyPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml) + ]) + self.startTagHandler.default = self.startTagOther + + def processEOF(self): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + return self.parser.phases["inBody"].processSpaceCharacters(token) + + def processCharacters(self, token): + self.parser.parseError("expected-eof-but-got-char") + self.parser.phase = self.parser.phases["inBody"] + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("expected-eof-but-got-start-tag", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + def processEndTag(self, token): + self.parser.parseError("expected-eof-but-got-end-tag", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + class AfterAfterFramesetPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("noframes", self.startTagNoFrames) + ]) + self.startTagHandler.default = self.startTagOther + + def processEOF(self): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + return self.parser.phases["inBody"].processSpaceCharacters(token) + + def processCharacters(self, token): + self.parser.parseError("expected-eof-but-got-char") + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagNoFrames(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("expected-eof-but-got-start-tag", + {"name": token["name"]}) + + def processEndTag(self, token): + self.parser.parseError("expected-eof-but-got-end-tag", + {"name": token["name"]}) + + return { + "initial": InitialPhase, + "beforeHtml": BeforeHtmlPhase, + "beforeHead": BeforeHeadPhase, + "inHead": InHeadPhase, + # XXX "inHeadNoscript": InHeadNoScriptPhase, + "afterHead": AfterHeadPhase, + "inBody": InBodyPhase, + "text": TextPhase, + "inTable": InTablePhase, + "inTableText": InTableTextPhase, + "inCaption": InCaptionPhase, + "inColumnGroup": InColumnGroupPhase, + "inTableBody": InTableBodyPhase, + "inRow": InRowPhase, + "inCell": InCellPhase, + "inSelect": InSelectPhase, + "inSelectInTable": InSelectInTablePhase, + "inForeignContent": InForeignContentPhase, + "afterBody": AfterBodyPhase, + "inFrameset": InFramesetPhase, + "afterFrameset": AfterFramesetPhase, + "afterAfterBody": AfterAfterBodyPhase, + "afterAfterFrameset": AfterAfterFramesetPhase, + # XXX after after frameset + } + + +def impliedTagToken(name, type="EndTag", attributes=None, + selfClosing=False): + if attributes is None: + attributes = {} + return {"type": tokenTypes[type], "name": name, "data": attributes, + "selfClosing": selfClosing} + + +class ParseError(Exception): + """Error in parsed document""" + pass diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/html5parser.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/html5parser.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d16f90c409e434e2329899b6250a0bf7ea2c3835 GIT binary patch literal 134117 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∓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 E0RazalmGw# literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/ihatexml.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/ihatexml.py new file mode 100644 index 0000000000..0fc79308ef --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/ihatexml.py @@ -0,0 +1,285 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +import warnings + +from .constants import DataLossWarning + +baseChar = """ +[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | +[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | +[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | +[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | +[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | +[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | +[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | +[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | +[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | +[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | +[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | +[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | +[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | +[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | +[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | +[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | +[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | +[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | +[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | +[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | +[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | +[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | +[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | +[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | +[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | +[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | +[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | +[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | +[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | +[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | +#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | +#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | +#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | +[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | +[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | +#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | +[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | +[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | +[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | +[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | +[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | +#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | +[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | +[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | +[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | +[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]""" + +ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]""" + +combiningCharacter = """ +[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | +[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | +[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | +[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | +#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | +[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | +[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | +#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | +[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | +[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | +#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | +[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | +[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | +[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | +[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | +[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | +#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | +[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | +#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | +[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | +[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | +#x3099 | #x309A""" + +digit = """ +[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | +[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | +[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | +[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]""" + +extender = """ +#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | +#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]""" + +letter = " | ".join([baseChar, ideographic]) + +# Without the +name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter, + extender]) +nameFirst = " | ".join([letter, "_"]) + +reChar = re.compile(r"#x([\d|A-F]{4,4})") +reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]") + + +def charStringToList(chars): + charRanges = [item.strip() for item in chars.split(" | ")] + rv = [] + for item in charRanges: + foundMatch = False + for regexp in (reChar, reCharRange): + match = regexp.match(item) + if match is not None: + rv.append([hexToInt(item) for item in match.groups()]) + if len(rv[-1]) == 1: + rv[-1] = rv[-1] * 2 + foundMatch = True + break + if not foundMatch: + assert len(item) == 1 + + rv.append([ord(item)] * 2) + rv = normaliseCharList(rv) + return rv + + +def normaliseCharList(charList): + charList = sorted(charList) + for item in charList: + assert item[1] >= item[0] + rv = [] + i = 0 + while i < len(charList): + j = 1 + rv.append(charList[i]) + while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: + rv[-1][1] = charList[i + j][1] + j += 1 + i += j + return rv + +# We don't really support characters above the BMP :( +max_unicode = int("FFFF", 16) + + +def missingRanges(charList): + rv = [] + if charList[0] != 0: + rv.append([0, charList[0][0] - 1]) + for i, item in enumerate(charList[:-1]): + rv.append([item[1] + 1, charList[i + 1][0] - 1]) + if charList[-1][1] != max_unicode: + rv.append([charList[-1][1] + 1, max_unicode]) + return rv + + +def listToRegexpStr(charList): + rv = [] + for item in charList: + if item[0] == item[1]: + rv.append(escapeRegexp(chr(item[0]))) + else: + rv.append(escapeRegexp(chr(item[0])) + "-" + + escapeRegexp(chr(item[1]))) + return "[%s]" % "".join(rv) + + +def hexToInt(hex_str): + return int(hex_str, 16) + + +def escapeRegexp(string): + specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", + "[", "]", "|", "(", ")", "-") + for char in specialCharacters: + string = string.replace(char, "\\" + char) + + return string + +# output from the above +nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') + +nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') + +# Simpler things +nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\-\'()+,./:=?;!*#@$_%]") + + +class InfosetFilter(object): + replacementRegexp = re.compile(r"U[\dA-F]{5,5}") + + def __init__(self, replaceChars=None, + dropXmlnsLocalName=False, + dropXmlnsAttrNs=False, + preventDoubleDashComments=False, + preventDashAtCommentEnd=False, + replaceFormFeedCharacters=True, + preventSingleQuotePubid=False): + + self.dropXmlnsLocalName = dropXmlnsLocalName + self.dropXmlnsAttrNs = dropXmlnsAttrNs + + self.preventDoubleDashComments = preventDoubleDashComments + self.preventDashAtCommentEnd = preventDashAtCommentEnd + + self.replaceFormFeedCharacters = replaceFormFeedCharacters + + self.preventSingleQuotePubid = preventSingleQuotePubid + + self.replaceCache = {} + + def coerceAttribute(self, name, namespace=None): + if self.dropXmlnsLocalName and name.startswith("xmlns:"): + warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) + return None + elif (self.dropXmlnsAttrNs and + namespace == "http://www.w3.org/2000/xmlns/"): + warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) + return None + else: + return self.toXmlName(name) + + def coerceElement(self, name, namespace=None): + return self.toXmlName(name) + + def coerceComment(self, data): + if self.preventDoubleDashComments: + while "--" in data: + warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) + data = data.replace("--", "- -") + return data + + def coerceCharacters(self, data): + if self.replaceFormFeedCharacters: + for i in range(data.count("\x0C")): + warnings.warn("Text cannot contain U+000C", DataLossWarning) + data = data.replace("\x0C", " ") + # Other non-xml characters + return data + + def coercePubid(self, data): + dataOutput = data + for char in nonPubidCharRegexp.findall(data): + warnings.warn("Coercing non-XML pubid", DataLossWarning) + replacement = self.getReplacementCharacter(char) + dataOutput = dataOutput.replace(char, replacement) + if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: + warnings.warn("Pubid cannot contain single quote", DataLossWarning) + dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) + return dataOutput + + def toXmlName(self, name): + nameFirst = name[0] + nameRest = name[1:] + m = nonXmlNameFirstBMPRegexp.match(nameFirst) + if m: + warnings.warn("Coercing non-XML name", DataLossWarning) + nameFirstOutput = self.getReplacementCharacter(nameFirst) + else: + nameFirstOutput = nameFirst + + nameRestOutput = nameRest + replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) + for char in replaceChars: + warnings.warn("Coercing non-XML name", DataLossWarning) + replacement = self.getReplacementCharacter(char) + nameRestOutput = nameRestOutput.replace(char, replacement) + return nameFirstOutput + nameRestOutput + + def getReplacementCharacter(self, char): + if char in self.replaceCache: + replacement = self.replaceCache[char] + else: + replacement = self.escapeChar(char) + return replacement + + def fromXmlName(self, name): + for item in set(self.replacementRegexp.findall(name)): + name = name.replace(item, self.unescapeChar(item)) + return name + + def escapeChar(self, char): + replacement = "U%05X" % ord(char) + self.replaceCache[char] = replacement + return replacement + + def unescapeChar(self, charcode): + return chr(int(charcode[1:], 16)) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/ihatexml.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/ihatexml.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70f78ee5899474e017a0ec81ef099316b5168cba GIT binary patch literal 16158 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 UdJ)nq@OM^q^}>pUl?yBX3ta50#{d8T literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/inputstream.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/inputstream.py new file mode 100644 index 0000000000..00d837fa51 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/inputstream.py @@ -0,0 +1,881 @@ +from __future__ import absolute_import, division, unicode_literals +from pip.vendor.six import text_type + +import codecs +import re + +from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase +from .constants import encodings, ReparseException +from . import utils + +from io import StringIO + +try: + from io import BytesIO +except ImportError: + BytesIO = StringIO + +try: + from io import BufferedIOBase +except ImportError: + class BufferedIOBase(object): + pass + +# Non-unicode versions of constants for use in the pre-parser +spaceCharactersBytes = frozenset([item.encode("ascii") for item in spaceCharacters]) +asciiLettersBytes = frozenset([item.encode("ascii") for item in asciiLetters]) +asciiUppercaseBytes = frozenset([item.encode("ascii") for item in asciiUppercase]) +spacesAngleBrackets = spaceCharactersBytes | frozenset([b">", b"<"]) + +invalid_unicode_re = re.compile("[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uD800-\uDFFF\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]") + +non_bmp_invalid_codepoints = set([0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, + 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, + 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, + 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, + 0x10FFFE, 0x10FFFF]) + +ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E]") + +# Cache for charsUntil() +charsUntilRegEx = {} + + +class BufferedStream: + """Buffering for streams that do not have buffering of their own + + The buffer is implemented as a list of chunks on the assumption that + joining many strings will be slow since it is O(n**2) + """ + + def __init__(self, stream): + self.stream = stream + self.buffer = [] + self.position = [-1, 0] # chunk number, offset + + def tell(self): + pos = 0 + for chunk in self.buffer[:self.position[0]]: + pos += len(chunk) + pos += self.position[1] + return pos + + def seek(self, pos): + assert pos < self._bufferedBytes() + offset = pos + i = 0 + while len(self.buffer[i]) < offset: + offset -= pos + i += 1 + self.position = [i, offset] + + def read(self, bytes): + if not self.buffer: + return self._readStream(bytes) + elif (self.position[0] == len(self.buffer) and + self.position[1] == len(self.buffer[-1])): + return self._readStream(bytes) + else: + return self._readFromBuffer(bytes) + + def _bufferedBytes(self): + return sum([len(item) for item in self.buffer]) + + def _readStream(self, bytes): + data = self.stream.read(bytes) + self.buffer.append(data) + self.position[0] += 1 + self.position[1] = len(data) + return data + + def _readFromBuffer(self, bytes): + remainingBytes = bytes + rv = [] + bufferIndex = self.position[0] + bufferOffset = self.position[1] + while bufferIndex < len(self.buffer) and remainingBytes != 0: + assert remainingBytes > 0 + bufferedData = self.buffer[bufferIndex] + + if remainingBytes <= len(bufferedData) - bufferOffset: + bytesToRead = remainingBytes + self.position = [bufferIndex, bufferOffset + bytesToRead] + else: + bytesToRead = len(bufferedData) - bufferOffset + self.position = [bufferIndex, len(bufferedData)] + bufferIndex += 1 + rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead]) + remainingBytes -= bytesToRead + + bufferOffset = 0 + + if remainingBytes: + rv.append(self._readStream(remainingBytes)) + + return "".join(rv) + + +def HTMLInputStream(source, encoding=None, parseMeta=True, chardet=True): + if hasattr(source, "read"): + isUnicode = isinstance(source.read(0), text_type) + else: + isUnicode = isinstance(source, text_type) + + if isUnicode: + if encoding is not None: + raise TypeError("Cannot explicitly set an encoding with a unicode string") + + return HTMLUnicodeInputStream(source) + else: + return HTMLBinaryInputStream(source, encoding, parseMeta, chardet) + + +class HTMLUnicodeInputStream: + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + _defaultChunkSize = 10240 + + def __init__(self, source): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + parseMeta - Look for a <meta> element containing encoding information + + """ + + # Craziness + if len("\U0010FFFF") == 1: + self.reportCharacterErrors = self.characterErrorsUCS4 + self.replaceCharactersRegexp = re.compile("[\uD800-\uDFFF]") + else: + self.reportCharacterErrors = self.characterErrorsUCS2 + self.replaceCharactersRegexp = re.compile("([\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF])") + + # List of where new lines occur + self.newLines = [0] + + self.charEncoding = ("utf-8", "certain") + self.dataStream = self.openStream(source) + + self.reset() + + def reset(self): + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + self.errors = [] + + # number of (complete) lines in previous chunks + self.prevNumLines = 0 + # number of columns in the last line of the previous chunk + self.prevNumCols = 0 + + # Deal with CR LF and surrogates split over chunk boundaries + self._bufferedCharacter = None + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = StringIO(source) + + return stream + + def _position(self, offset): + chunk = self.chunk + nLines = chunk.count('\n', 0, offset) + positionLine = self.prevNumLines + nLines + lastLinePos = chunk.rfind('\n', 0, offset) + if lastLinePos == -1: + positionColumn = self.prevNumCols + offset + else: + positionColumn = offset - (lastLinePos + 1) + return (positionLine, positionColumn) + + def position(self): + """Returns (line, col) of the current position in the stream.""" + line, col = self._position(self.chunkOffset) + return (line + 1, col) + + def char(self): + """ Read one character from the stream or queue if available. Return + EOF when EOF is reached. + """ + # Read a new chunk from the input stream if necessary + if self.chunkOffset >= self.chunkSize: + if not self.readChunk(): + return EOF + + chunkOffset = self.chunkOffset + char = self.chunk[chunkOffset] + self.chunkOffset = chunkOffset + 1 + + return char + + def readChunk(self, chunkSize=None): + if chunkSize is None: + chunkSize = self._defaultChunkSize + + self.prevNumLines, self.prevNumCols = self._position(self.chunkSize) + + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + + data = self.dataStream.read(chunkSize) + + # Deal with CR LF and surrogates broken across chunks + if self._bufferedCharacter: + data = self._bufferedCharacter + data + self._bufferedCharacter = None + elif not data: + # We have no more data, bye-bye stream + return False + + if len(data) > 1: + lastv = ord(data[-1]) + if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF: + self._bufferedCharacter = data[-1] + data = data[:-1] + + self.reportCharacterErrors(data) + + # Replace invalid characters + # Note U+0000 is dealt with in the tokenizer + data = self.replaceCharactersRegexp.sub("\ufffd", data) + + data = data.replace("\r\n", "\n") + data = data.replace("\r", "\n") + + self.chunk = data + self.chunkSize = len(data) + + return True + + def characterErrorsUCS4(self, data): + for i in range(len(invalid_unicode_re.findall(data))): + self.errors.append("invalid-codepoint") + + def characterErrorsUCS2(self, data): + # Someone picked the wrong compile option + # You lose + skip = False + for match in invalid_unicode_re.finditer(data): + if skip: + continue + codepoint = ord(match.group()) + pos = match.start() + # Pretty sure there should be endianness issues here + if utils.isSurrogatePair(data[pos:pos + 2]): + # We have a surrogate pair! + char_val = utils.surrogatePairToCodepoint(data[pos:pos + 2]) + if char_val in non_bmp_invalid_codepoints: + self.errors.append("invalid-codepoint") + skip = True + elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and + pos == len(data) - 1): + self.errors.append("invalid-codepoint") + else: + skip = False + self.errors.append("invalid-codepoint") + + def charsUntil(self, characters, opposite=False): + """ Returns a string of characters from the stream up to but not + including any character in 'characters' or EOF. 'characters' must be + a container that supports the 'in' method and iteration over its + characters. + """ + + # Use a cache of regexps to find the required characters + try: + chars = charsUntilRegEx[(characters, opposite)] + except KeyError: + if __debug__: + for c in characters: + assert(ord(c) < 128) + regex = "".join(["\\x%02x" % ord(c) for c in characters]) + if not opposite: + regex = "^%s" % regex + chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex) + + rv = [] + + while True: + # Find the longest matching prefix + m = chars.match(self.chunk, self.chunkOffset) + if m is None: + # If nothing matched, and it wasn't because we ran out of chunk, + # then stop + if self.chunkOffset != self.chunkSize: + break + else: + end = m.end() + # If not the whole chunk matched, return everything + # up to the part that didn't match + if end != self.chunkSize: + rv.append(self.chunk[self.chunkOffset:end]) + self.chunkOffset = end + break + # If the whole remainder of the chunk matched, + # use it all and read the next chunk + rv.append(self.chunk[self.chunkOffset:]) + if not self.readChunk(): + # Reached EOF + break + + r = "".join(rv) + return r + + def unget(self, char): + # Only one character is allowed to be ungotten at once - it must + # be consumed again before any further call to unget + if char is not None: + if self.chunkOffset == 0: + # unget is called quite rarely, so it's a good idea to do + # more work here if it saves a bit of work in the frequently + # called char and charsUntil. + # So, just prepend the ungotten character onto the current + # chunk: + self.chunk = char + self.chunk + self.chunkSize += 1 + else: + self.chunkOffset -= 1 + assert self.chunk[self.chunkOffset] == char + + +class HTMLBinaryInputStream(HTMLUnicodeInputStream): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + def __init__(self, source, encoding=None, parseMeta=True, chardet=True): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + parseMeta - Look for a <meta> element containing encoding information + + """ + # Raw Stream - for unicode objects this will encode to utf-8 and set + # self.charEncoding as appropriate + self.rawStream = self.openStream(source) + + HTMLUnicodeInputStream.__init__(self, self.rawStream) + + self.charEncoding = (codecName(encoding), "certain") + + # Encoding Information + # Number of bytes to use when looking for a meta element with + # encoding information + self.numBytesMeta = 512 + # Number of bytes to use when using detecting encoding using chardet + self.numBytesChardet = 100 + # Encoding to use if no other information can be found + self.defaultEncoding = "windows-1252" + + # Detect encoding iff no explicit "transport level" encoding is supplied + if (self.charEncoding[0] is None): + self.charEncoding = self.detectEncoding(parseMeta, chardet) + + # Call superclass + self.reset() + + def reset(self): + self.dataStream = codecs.getreader(self.charEncoding[0])(self.rawStream, + 'replace') + HTMLUnicodeInputStream.reset(self) + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = BytesIO(source) + + try: + stream.seek(stream.tell()) + except: + stream = BufferedStream(stream) + + return stream + + def detectEncoding(self, parseMeta=True, chardet=True): + # First look for a BOM + # This will also read past the BOM if present + encoding = self.detectBOM() + confidence = "certain" + # If there is no BOM need to look for meta elements with encoding + # information + if encoding is None and parseMeta: + encoding = self.detectEncodingMeta() + confidence = "tentative" + # Guess with chardet, if avaliable + if encoding is None and chardet: + confidence = "tentative" + try: + try: + from charade.universaldetector import UniversalDetector + except ImportError: + from chardet.universaldetector import UniversalDetector + buffers = [] + detector = UniversalDetector() + while not detector.done: + buffer = self.rawStream.read(self.numBytesChardet) + assert isinstance(buffer, bytes) + if not buffer: + break + buffers.append(buffer) + detector.feed(buffer) + detector.close() + encoding = detector.result['encoding'] + self.rawStream.seek(0) + except ImportError: + pass + # If all else fails use the default encoding + if encoding is None: + confidence = "tentative" + encoding = self.defaultEncoding + + # Substitute for equivalent encodings: + encodingSub = {"iso-8859-1": "windows-1252"} + + if encoding.lower() in encodingSub: + encoding = encodingSub[encoding.lower()] + + return encoding, confidence + + def changeEncoding(self, newEncoding): + assert self.charEncoding[1] != "certain" + newEncoding = codecName(newEncoding) + if newEncoding in ("utf-16", "utf-16-be", "utf-16-le"): + newEncoding = "utf-8" + if newEncoding is None: + return + elif newEncoding == self.charEncoding[0]: + self.charEncoding = (self.charEncoding[0], "certain") + else: + self.rawStream.seek(0) + self.reset() + self.charEncoding = (newEncoding, "certain") + raise ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) + + def detectBOM(self): + """Attempts to detect at BOM at the start of the stream. If + an encoding can be determined from the BOM return the name of the + encoding otherwise return None""" + bomDict = { + codecs.BOM_UTF8: 'utf-8', + codecs.BOM_UTF16_LE: 'utf-16-le', codecs.BOM_UTF16_BE: 'utf-16-be', + codecs.BOM_UTF32_LE: 'utf-32-le', codecs.BOM_UTF32_BE: 'utf-32-be' + } + + # Go to beginning of file and read in 4 bytes + string = self.rawStream.read(4) + assert isinstance(string, bytes) + + # Try detecting the BOM using bytes from the string + encoding = bomDict.get(string[:3]) # UTF-8 + seek = 3 + if not encoding: + # Need to detect UTF-32 before UTF-16 + encoding = bomDict.get(string) # UTF-32 + seek = 4 + if not encoding: + encoding = bomDict.get(string[:2]) # UTF-16 + seek = 2 + + # Set the read position past the BOM if one was found, otherwise + # set it to the start of the stream + self.rawStream.seek(encoding and seek or 0) + + return encoding + + def detectEncodingMeta(self): + """Report the encoding declared by the meta element + """ + buffer = self.rawStream.read(self.numBytesMeta) + assert isinstance(buffer, bytes) + parser = EncodingParser(buffer) + self.rawStream.seek(0) + encoding = parser.getEncoding() + + if encoding in ("utf-16", "utf-16-be", "utf-16-le"): + encoding = "utf-8" + + return encoding + + +class EncodingBytes(bytes): + """String-like object with an associated position and various extra methods + If the position is ever greater than the string length then an exception is + raised""" + def __new__(self, value): + assert isinstance(value, bytes) + return bytes.__new__(self, value.lower()) + + def __init__(self, value): + self._position = -1 + + def __iter__(self): + return self + + def __next__(self): + p = self._position = self._position + 1 + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + return self[p:p + 1] + + def next(self): + # Py2 compat + return self.__next__() + + def previous(self): + p = self._position + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + self._position = p = p - 1 + return self[p:p + 1] + + def setPosition(self, position): + if self._position >= len(self): + raise StopIteration + self._position = position + + def getPosition(self): + if self._position >= len(self): + raise StopIteration + if self._position >= 0: + return self._position + else: + return None + + position = property(getPosition, setPosition) + + def getCurrentByte(self): + return self[self.position:self.position + 1] + + currentByte = property(getCurrentByte) + + def skip(self, chars=spaceCharactersBytes): + """Skip past a list of characters""" + p = self.position # use property for the error-checking + while p < len(self): + c = self[p:p + 1] + if c not in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def skipUntil(self, chars): + p = self.position + while p < len(self): + c = self[p:p + 1] + if c in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def matchBytes(self, bytes): + """Look for a sequence of bytes at the start of a string. If the bytes + are found return True and advance the position to the byte after the + match. Otherwise return False and leave the position alone""" + p = self.position + data = self[p:p + len(bytes)] + rv = data.startswith(bytes) + if rv: + self.position += len(bytes) + return rv + + def jumpTo(self, bytes): + """Look for the next sequence of bytes matching a given sequence. If + a match is found advance the position to the last byte of the match""" + newPosition = self[self.position:].find(bytes) + if newPosition > -1: + # XXX: This is ugly, but I can't see a nicer way to fix this. + if self._position == -1: + self._position = 0 + self._position += (newPosition + len(bytes) - 1) + return True + else: + raise StopIteration + + +class EncodingParser(object): + """Mini parser for detecting character encoding from meta elements""" + + def __init__(self, data): + """string - the data to work on for encoding detection""" + self.data = EncodingBytes(data) + self.encoding = None + + def getEncoding(self): + methodDispatch = ( + (b"<!--", self.handleComment), + (b"<meta", self.handleMeta), + (b"</", self.handlePossibleEndTag), + (b"<!", self.handleOther), + (b"<?", self.handleOther), + (b"<", self.handlePossibleStartTag)) + for byte in self.data: + keepParsing = True + for key, method in methodDispatch: + if self.data.matchBytes(key): + try: + keepParsing = method() + break + except StopIteration: + keepParsing = False + break + if not keepParsing: + break + + return self.encoding + + def handleComment(self): + """Skip over comments""" + return self.data.jumpTo(b"-->") + + def handleMeta(self): + if self.data.currentByte not in spaceCharactersBytes: + # if we have <meta not followed by a space so just keep going + return True + # We have a valid meta element we want to search for attributes + hasPragma = False + pendingEncoding = None + while True: + # Try to find the next attribute after the current position + attr = self.getAttribute() + if attr is None: + return True + else: + if attr[0] == b"http-equiv": + hasPragma = attr[1] == b"content-type" + if hasPragma and pendingEncoding is not None: + self.encoding = pendingEncoding + return False + elif attr[0] == b"charset": + tentativeEncoding = attr[1] + codec = codecName(tentativeEncoding) + if codec is not None: + self.encoding = codec + return False + elif attr[0] == b"content": + contentParser = ContentAttrParser(EncodingBytes(attr[1])) + tentativeEncoding = contentParser.parse() + if tentativeEncoding is not None: + codec = codecName(tentativeEncoding) + if codec is not None: + if hasPragma: + self.encoding = codec + return False + else: + pendingEncoding = codec + + def handlePossibleStartTag(self): + return self.handlePossibleTag(False) + + def handlePossibleEndTag(self): + next(self.data) + return self.handlePossibleTag(True) + + def handlePossibleTag(self, endTag): + data = self.data + if data.currentByte not in asciiLettersBytes: + # If the next byte is not an ascii letter either ignore this + # fragment (possible start tag case) or treat it according to + # handleOther + if endTag: + data.previous() + self.handleOther() + return True + + c = data.skipUntil(spacesAngleBrackets) + if c == b"<": + # return to the first step in the overall "two step" algorithm + # reprocessing the < byte + data.previous() + else: + # Read all attributes + attr = self.getAttribute() + while attr is not None: + attr = self.getAttribute() + return True + + def handleOther(self): + return self.data.jumpTo(b">") + + def getAttribute(self): + """Return a name,value pair for the next attribute in the stream, + if one is found, or None""" + data = self.data + # Step 1 (skip chars) + c = data.skip(spaceCharactersBytes | frozenset([b"/"])) + assert c is None or len(c) == 1 + # Step 2 + if c in (b">", None): + return None + # Step 3 + attrName = [] + attrValue = [] + # Step 4 attribute name + while True: + if c == b"=" and attrName: + break + elif c in spaceCharactersBytes: + # Step 6! + c = data.skip() + break + elif c in (b"/", b">"): + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrName.append(c.lower()) + elif c is None: + return None + else: + attrName.append(c) + # Step 5 + c = next(data) + # Step 7 + if c != b"=": + data.previous() + return b"".join(attrName), b"" + # Step 8 + next(data) + # Step 9 + c = data.skip() + # Step 10 + if c in (b"'", b'"'): + # 10.1 + quoteChar = c + while True: + # 10.2 + c = next(data) + # 10.3 + if c == quoteChar: + next(data) + return b"".join(attrName), b"".join(attrValue) + # 10.4 + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + # 10.5 + else: + attrValue.append(c) + elif c == b">": + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + # Step 11 + while True: + c = next(data) + if c in spacesAngleBrackets: + return b"".join(attrName), b"".join(attrValue) + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + + +class ContentAttrParser(object): + def __init__(self, data): + assert isinstance(data, bytes) + self.data = data + + def parse(self): + try: + # Check if the attr name is charset + # otherwise return + self.data.jumpTo(b"charset") + self.data.position += 1 + self.data.skip() + if not self.data.currentByte == b"=": + # If there is no = sign keep looking for attrs + return None + self.data.position += 1 + self.data.skip() + # Look for an encoding between matching quote marks + if self.data.currentByte in (b'"', b"'"): + quoteMark = self.data.currentByte + self.data.position += 1 + oldPosition = self.data.position + if self.data.jumpTo(quoteMark): + return self.data[oldPosition:self.data.position] + else: + return None + else: + # Unquoted value + oldPosition = self.data.position + try: + self.data.skipUntil(spaceCharactersBytes) + return self.data[oldPosition:self.data.position] + except StopIteration: + # Return the whole remaining value + return self.data[oldPosition:] + except StopIteration: + return None + + +def codecName(encoding): + """Return the python codec name corresponding to an encoding or None if the + string doesn't correspond to a valid encoding.""" + if isinstance(encoding, bytes): + try: + encoding = encoding.decode("ascii") + except UnicodeDecodeError: + return None + if encoding: + canonicalName = ascii_punctuation_re.sub("", encoding).lower() + return encodings.get(canonicalName, None) + else: + return None diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/inputstream.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/inputstream.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8645eddd65e1c6e51c42e0f86580dba6b40ef1d1 GIT binary patch literal 29629 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 D*K{D# literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/sanitizer.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/sanitizer.py new file mode 100644 index 0000000000..71dc5212c1 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/sanitizer.py @@ -0,0 +1,271 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +from xml.sax.saxutils import escape, unescape + +from .tokenizer import HTMLTokenizer +from .constants import tokenTypes + + +class HTMLSanitizerMixin(object): + """ sanitization of XHTML+MathML+SVG and of inline style attributes.""" + + acceptable_elements = ['a', 'abbr', 'acronym', 'address', 'area', + 'article', 'aside', 'audio', 'b', 'big', 'blockquote', 'br', 'button', + 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', + 'command', 'datagrid', 'datalist', 'dd', 'del', 'details', 'dfn', + 'dialog', 'dir', 'div', 'dl', 'dt', 'em', 'event-source', 'fieldset', + 'figcaption', 'figure', 'footer', 'font', 'form', 'header', 'h1', + 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'input', 'ins', + 'keygen', 'kbd', 'label', 'legend', 'li', 'm', 'map', 'menu', 'meter', + 'multicol', 'nav', 'nextid', 'ol', 'output', 'optgroup', 'option', + 'p', 'pre', 'progress', 'q', 's', 'samp', 'section', 'select', + 'small', 'sound', 'source', 'spacer', 'span', 'strike', 'strong', + 'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'time', 'tfoot', + 'th', 'thead', 'tr', 'tt', 'u', 'ul', 'var', 'video'] + + mathml_elements = ['maction', 'math', 'merror', 'mfrac', 'mi', + 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', + 'mprescripts', 'mroot', 'mrow', 'mspace', 'msqrt', 'mstyle', 'msub', + 'msubsup', 'msup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', + 'munderover', 'none'] + + svg_elements = ['a', 'animate', 'animateColor', 'animateMotion', + 'animateTransform', 'clipPath', 'circle', 'defs', 'desc', 'ellipse', + 'font-face', 'font-face-name', 'font-face-src', 'g', 'glyph', 'hkern', + 'linearGradient', 'line', 'marker', 'metadata', 'missing-glyph', + 'mpath', 'path', 'polygon', 'polyline', 'radialGradient', 'rect', + 'set', 'stop', 'svg', 'switch', 'text', 'title', 'tspan', 'use'] + + acceptable_attributes = ['abbr', 'accept', 'accept-charset', 'accesskey', + 'action', 'align', 'alt', 'autocomplete', 'autofocus', 'axis', + 'background', 'balance', 'bgcolor', 'bgproperties', 'border', + 'bordercolor', 'bordercolordark', 'bordercolorlight', 'bottompadding', + 'cellpadding', 'cellspacing', 'ch', 'challenge', 'char', 'charoff', + 'choff', 'charset', 'checked', 'cite', 'class', 'clear', 'color', + 'cols', 'colspan', 'compact', 'contenteditable', 'controls', 'coords', + 'data', 'datafld', 'datapagesize', 'datasrc', 'datetime', 'default', + 'delay', 'dir', 'disabled', 'draggable', 'dynsrc', 'enctype', 'end', + 'face', 'for', 'form', 'frame', 'galleryimg', 'gutter', 'headers', + 'height', 'hidefocus', 'hidden', 'high', 'href', 'hreflang', 'hspace', + 'icon', 'id', 'inputmode', 'ismap', 'keytype', 'label', 'leftspacing', + 'lang', 'list', 'longdesc', 'loop', 'loopcount', 'loopend', + 'loopstart', 'low', 'lowsrc', 'max', 'maxlength', 'media', 'method', + 'min', 'multiple', 'name', 'nohref', 'noshade', 'nowrap', 'open', + 'optimum', 'pattern', 'ping', 'point-size', 'poster', 'pqg', 'preload', + 'prompt', 'radiogroup', 'readonly', 'rel', 'repeat-max', 'repeat-min', + 'replace', 'required', 'rev', 'rightspacing', 'rows', 'rowspan', + 'rules', 'scope', 'selected', 'shape', 'size', 'span', 'src', 'start', + 'step', 'style', 'summary', 'suppress', 'tabindex', 'target', + 'template', 'title', 'toppadding', 'type', 'unselectable', 'usemap', + 'urn', 'valign', 'value', 'variable', 'volume', 'vspace', 'vrml', + 'width', 'wrap', 'xml:lang'] + + mathml_attributes = ['actiontype', 'align', 'columnalign', 'columnalign', + 'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'depth', + 'display', 'displaystyle', 'equalcolumns', 'equalrows', 'fence', + 'fontstyle', 'fontweight', 'frame', 'height', 'linethickness', 'lspace', + 'mathbackground', 'mathcolor', 'mathvariant', 'mathvariant', 'maxsize', + 'minsize', 'other', 'rowalign', 'rowalign', 'rowalign', 'rowlines', + 'rowspacing', 'rowspan', 'rspace', 'scriptlevel', 'selection', + 'separator', 'stretchy', 'width', 'width', 'xlink:href', 'xlink:show', + 'xlink:type', 'xmlns', 'xmlns:xlink'] + + svg_attributes = ['accent-height', 'accumulate', 'additive', 'alphabetic', + 'arabic-form', 'ascent', 'attributeName', 'attributeType', + 'baseProfile', 'bbox', 'begin', 'by', 'calcMode', 'cap-height', + 'class', 'clip-path', 'color', 'color-rendering', 'content', 'cx', + 'cy', 'd', 'dx', 'dy', 'descent', 'display', 'dur', 'end', 'fill', + 'fill-opacity', 'fill-rule', 'font-family', 'font-size', + 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'from', + 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'gradientUnits', 'hanging', + 'height', 'horiz-adv-x', 'horiz-origin-x', 'id', 'ideographic', 'k', + 'keyPoints', 'keySplines', 'keyTimes', 'lang', 'marker-end', + 'marker-mid', 'marker-start', 'markerHeight', 'markerUnits', + 'markerWidth', 'mathematical', 'max', 'min', 'name', 'offset', + 'opacity', 'orient', 'origin', 'overline-position', + 'overline-thickness', 'panose-1', 'path', 'pathLength', 'points', + 'preserveAspectRatio', 'r', 'refX', 'refY', 'repeatCount', + 'repeatDur', 'requiredExtensions', 'requiredFeatures', 'restart', + 'rotate', 'rx', 'ry', 'slope', 'stemh', 'stemv', 'stop-color', + 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', + 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', + 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', + 'stroke-width', 'systemLanguage', 'target', 'text-anchor', 'to', + 'transform', 'type', 'u1', 'u2', 'underline-position', + 'underline-thickness', 'unicode', 'unicode-range', 'units-per-em', + 'values', 'version', 'viewBox', 'visibility', 'width', 'widths', 'x', + 'x-height', 'x1', 'x2', 'xlink:actuate', 'xlink:arcrole', + 'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type', + 'xml:base', 'xml:lang', 'xml:space', 'xmlns', 'xmlns:xlink', 'y', + 'y1', 'y2', 'zoomAndPan'] + + attr_val_is_uri = ['href', 'src', 'cite', 'action', 'longdesc', 'poster', + 'xlink:href', 'xml:base'] + + svg_attr_val_allows_ref = ['clip-path', 'color-profile', 'cursor', 'fill', + 'filter', 'marker', 'marker-start', 'marker-mid', 'marker-end', + 'mask', 'stroke'] + + svg_allow_local_href = ['altGlyph', 'animate', 'animateColor', + 'animateMotion', 'animateTransform', 'cursor', 'feImage', 'filter', + 'linearGradient', 'pattern', 'radialGradient', 'textpath', 'tref', + 'set', 'use'] + + acceptable_css_properties = ['azimuth', 'background-color', + 'border-bottom-color', 'border-collapse', 'border-color', + 'border-left-color', 'border-right-color', 'border-top-color', 'clear', + 'color', 'cursor', 'direction', 'display', 'elevation', 'float', 'font', + 'font-family', 'font-size', 'font-style', 'font-variant', 'font-weight', + 'height', 'letter-spacing', 'line-height', 'overflow', 'pause', + 'pause-after', 'pause-before', 'pitch', 'pitch-range', 'richness', + 'speak', 'speak-header', 'speak-numeral', 'speak-punctuation', + 'speech-rate', 'stress', 'text-align', 'text-decoration', 'text-indent', + 'unicode-bidi', 'vertical-align', 'voice-family', 'volume', + 'white-space', 'width'] + + acceptable_css_keywords = ['auto', 'aqua', 'black', 'block', 'blue', + 'bold', 'both', 'bottom', 'brown', 'center', 'collapse', 'dashed', + 'dotted', 'fuchsia', 'gray', 'green', '!important', 'italic', 'left', + 'lime', 'maroon', 'medium', 'none', 'navy', 'normal', 'nowrap', 'olive', + 'pointer', 'purple', 'red', 'right', 'solid', 'silver', 'teal', 'top', + 'transparent', 'underline', 'white', 'yellow'] + + acceptable_svg_properties = ['fill', 'fill-opacity', 'fill-rule', + 'stroke', 'stroke-width', 'stroke-linecap', 'stroke-linejoin', + 'stroke-opacity'] + + acceptable_protocols = ['ed2k', 'ftp', 'http', 'https', 'irc', + 'mailto', 'news', 'gopher', 'nntp', 'telnet', 'webcal', + 'xmpp', 'callto', 'feed', 'urn', 'aim', 'rsync', 'tag', + 'ssh', 'sftp', 'rtsp', 'afs'] + + # subclasses may define their own versions of these constants + allowed_elements = acceptable_elements + mathml_elements + svg_elements + allowed_attributes = acceptable_attributes + mathml_attributes + svg_attributes + allowed_css_properties = acceptable_css_properties + allowed_css_keywords = acceptable_css_keywords + allowed_svg_properties = acceptable_svg_properties + allowed_protocols = acceptable_protocols + + # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and + # stripping out all # attributes not in ALLOWED_ATTRIBUTES. Style + # attributes are parsed, and a restricted set, # specified by + # ALLOWED_CSS_PROPERTIES and ALLOWED_CSS_KEYWORDS, are allowed through. + # attributes in ATTR_VAL_IS_URI are scanned, and only URI schemes specified + # in ALLOWED_PROTOCOLS are allowed. + # + # sanitize_html('<script> do_nasty_stuff() </script>') + # => <script> do_nasty_stuff() </script> + # sanitize_html('<a href="javascript: sucker();">Click here for $100</a>') + # => <a>Click here for $100</a> + def sanitize_token(self, token): + + # accommodate filters which use token_type differently + token_type = token["type"] + if token_type in list(tokenTypes.keys()): + token_type = tokenTypes[token_type] + + if token_type in (tokenTypes["StartTag"], tokenTypes["EndTag"], + tokenTypes["EmptyTag"]): + if token["name"] in self.allowed_elements: + return self.allowed_token(token, token_type) + else: + return self.disallowed_token(token, token_type) + elif token_type == tokenTypes["Comment"]: + pass + else: + return token + + def allowed_token(self, token, token_type): + if "data" in token: + attrs = dict([(name, val) for name, val in + token["data"][::-1] + if name in self.allowed_attributes]) + for attr in self.attr_val_is_uri: + if attr not in attrs: + continue + val_unescaped = re.sub("[`\000-\040\177-\240\s]+", '', + unescape(attrs[attr])).lower() + # remove replacement characters from unescaped characters + val_unescaped = val_unescaped.replace("\ufffd", "") + if (re.match("^[a-z0-9][-+.a-z0-9]*:", val_unescaped) and + (val_unescaped.split(':')[0] not in + self.allowed_protocols)): + del attrs[attr] + for attr in self.svg_attr_val_allows_ref: + if attr in attrs: + attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', + ' ', + unescape(attrs[attr])) + if (token["name"] in self.svg_allow_local_href and + 'xlink:href' in attrs and re.search('^\s*[^#\s].*', + attrs['xlink:href'])): + del attrs['xlink:href'] + if 'style' in attrs: + attrs['style'] = self.sanitize_css(attrs['style']) + token["data"] = [[name, val] for name, val in list(attrs.items())] + return token + + def disallowed_token(self, token, token_type): + if token_type == tokenTypes["EndTag"]: + token["data"] = "</%s>" % token["name"] + elif token["data"]: + attrs = ''.join([' %s="%s"' % (k, escape(v)) for k, v in token["data"]]) + token["data"] = "<%s%s>" % (token["name"], attrs) + else: + token["data"] = "<%s>" % token["name"] + if token.get("selfClosing"): + token["data"] = token["data"][:-1] + "/>" + + if token["type"] in list(tokenTypes.keys()): + token["type"] = "Characters" + else: + token["type"] = tokenTypes["Characters"] + + del token["name"] + return token + + def sanitize_css(self, style): + # disallow urls + style = re.compile('url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) + + # gauntlet + if not re.match("""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): + return '' + if not re.match("^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): + return '' + + clean = [] + for prop, value in re.findall("([-\w]+)\s*:\s*([^:;]*)", style): + if not value: + continue + if prop.lower() in self.allowed_css_properties: + clean.append(prop + ': ' + value + ';') + elif prop.split('-')[0].lower() in ['background', 'border', 'margin', + 'padding']: + for keyword in value.split(): + if not keyword in self.acceptable_css_keywords and \ + not re.match("^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): + break + else: + clean.append(prop + ': ' + value + ';') + elif prop.lower() in self.allowed_svg_properties: + clean.append(prop + ': ' + value + ';') + + return ' '.join(clean) + + +class HTMLSanitizer(HTMLTokenizer, HTMLSanitizerMixin): + def __init__(self, stream, encoding=None, parseMeta=True, useChardet=True, + lowercaseElementName=False, lowercaseAttrName=False, parser=None): + # Change case matching defaults as we only output lowercase html anyway + # This solution doesn't seem ideal... + HTMLTokenizer.__init__(self, stream, encoding, parseMeta, useChardet, + lowercaseElementName, lowercaseAttrName, parser=parser) + + def __iter__(self): + for token in HTMLTokenizer.__iter__(self): + token = self.sanitize_token(token) + if token: + yield token diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/sanitizer.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/sanitizer.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2fbb0de13c449b5e355a79e265720ae1e9c04cb GIT binary patch literal 14580 zcmc(Gd7NC=RpvRbrPjV!wl>RgWZA;4rQ}$#v&gF~IZlEtJS8PcS}nC-)p=F@)UWE5 z-h0)H(;|SKge^b<A%tbf!j`Z@*b@>048xis!3_JbOdv1}fdm3!3*UF{tL_#vznLHZ z#8P+Fz31M0?zv|__q`tb)Rv8J`FPZ9OZ{&Q-w!?!N%<x;3_mKFNKa)_r5DL$B)u`2 z924bOB-t97T;ub`BwH)JahV*K-a46FhZz`HE7^MKZIH<gp+7F!M(J&m$xZ05lVr1W zRBXLGE%KDet0%XJZIA>%Tci_-ZCoDM%H7URYywp&Nu3~})i!*@tuoJsRWhCS26<6c z>jATLE-ll%Uu{Qc*iYNJCDU12B}JT-XC@-99mhvfw&OwKONRZ>Nfq!3epFlV@zQgT zJ$f#mP5SARNfE#sIY!XA#X(Y5JL*|y<9=Fk)??{H+Fxeq8!`M48F~bSB|<)eb>Jg7 zizC^X1U}igfFWQ77=UxzCb7+8;0I2=O>Dc^bz(cjt{1yOY^T^RvE5>O#P*8aD7H`R zCb8#;-7NN8vHfDVh#e5SRqQsggJPd2cDvYw*dejQVn@V|iZ#TJiQOUgJh3~)j*C5C z>@Kmp#a<xxLa`T#y;$so*gazRirpu6zt{s}4~m@>dr0h**lDqc#a<%zh}cWTUMBW( zvCkKKRO~UaGh$yL_PE%85^IW`6+0*P3b9v;ofmtR*sH}R#V&|ViCq-CBsMMfgjg)r z5^GDhO@%WPOT;>2U9lNRSnRUctXL-26YGoRVgs=&Vue^KR*4P8=EUa37Q`0Co)mkH z*pk>)u`iVFK382x;k9C4B=*H(Un2ID*wbRK6MMbb8^pd;?90TyT<j~vzEbRsVqYcp z)nZ>G_9n46i+!!w*NMGF?CZteD)tRxZxj1Qv2POlX0dM(`_E$ED)x5i-YS!8UE=Q$ zd#BjD#J)}J+r_>^>^sH2OYGfZ?-BcMvF{Q4Ua{{J`+l(>5c@%~9}@dvvG<Doh}e&c z{g~K~i~WSyPm2ANE5`f8-Y@pkVjmFupxDodeMszQ#ePog=f(bu*e{6vSFv9d`z5ho zc0KtOv0oMYHL(wi{Wq~+7yF2-$4A9}L+lx`-xT}rV!tK!+hV^X_Pb)gC-(bde<1ch z#Qsq1kHr4imE=#v{-@Z-#Qs$5&%{11_UB@MA@;w-{!;9Ji~W_@C&d0*>~F+ADfTI` zzZLsCu}_Qrz1Tm9eMamb#r{d`pT+(~>|ez`3o}tuwMcCYzC>-U+Blqs+IqDOY8%xy zsclx<qPA6Sn^M8Ht6itIL+yIC8`O5H?NZyVwnr(5y=phA?Nhr+?Kx^Ut36k3zuGNo z2h?s=yG`w&+UIHajr3!7yHY?CTK^nUJFIp@?WkHq?U>pfYR^-<Q|-9g^VPsQaO^I% zyVYKx_CmE6`Ok~hPN?0ZcJJutKDGP(2oI<|sCH8AA+=LZ0BAU^_ORMZ)E-fLsdgK5 zr}i?nm#clg+M{ZZshv^#0=36+YPF`?S+#R&uTXoX8kFI@QW;*Q_G-0BwF_!fY8TZm zsZBfaPbh^RtF_eHYNnQ`b=10QGis^YWwlwgOs%KZSIgA~YFCs8EYwP+4peGGwK=tU zwFRXPEUG=J_8PS%wX14hsP<Z=0zmE%`WLBvvD%lYJ*D=v+UwL_uQZ=GsC}v0m#KZZ z+E=K3rP>?SzDn(@)xJjUO=@pe`&!IYdyCrFtG!k28`R#W_Kj-ar1s5f-varneXH8r z)!w1@PPKQbeVdE^+tt29?K@rc-=+3$wfCrfx7zopeXrX0seQlN52*d1+7CJZe^~9k zYCod(qiR2<_Ty?l;S%{t7s^k$T;4||vG>;kvY%G_fZ7Mue#SLty&KDRsG{3Ai~?E> znZ8fE>lq0toe!z~tdjpfhcm)2Ip4s&pXYJ92#_0Lw&30>*M#}M;Pc^vU@vclMXUWH z_~7nk8)K^dlG-n;{fgSJs{NYUhaqLPUk9n~9Dv~?F8z<H{f06en9F@x=n(ERYQG67 ztNoVRZ>#-|+V86Up4#uL{Q-oo_J?YJr1r;Ze*%fCeN637)&5NF<7$8Irt}wNWA~U$ zZiWX?`%5T*+Fz-CLhY~B{zmPSYM)X@w7*sRJGD=%{k_^hsC`E5AJzUz?Vr{DMeSeJ zJ_{9sABapN`idyBvB=g$wl=cy$ks)+KC%swZH#PFWSb+~64}<Md%G}?0B>8a+fa{p zjdbIkE`qHHsgZ4u?7GNyM0R~-H$=8GvR#qwj%-h4dn3CsvVD==6wy&UC$gI(dv0X= zBfBNC1CiYtb$7|+Hc7@LStGlXwX%D1yCmb1tV3@-de<?zncTrlX7YMTw#wuUl0Zm1 z5sxFJJCnN*mA$bWvDq7Y;BmaMSDI%hn57I)B74|hhRh<akkRbVJNsY7q~yqBaW#Xl zv#)$)f8001(|(rrll^72m?it;sw&bJ@}lzCkl9Q;T*J>+s~E0hqg~|v#a?Ke6-il! z2}KeIU{R&*EE%rl<TACoHMBH$e68UaMp|ii$b6`k<?Y!k!@Np{Os=pA(<^LW<$Z6q z<NjP+I%cF?JV^j2eI#YRa~tVdXdqd0<Za}2%;xajE%M<Ytj>EqoYw~|uHtTyu5_}r ztegNd$6!h3i!7<)G%EwF6SlTA&hl;mrA7Tc7glHCE8t3c!_A-~nFFnjG9MQ0#CPwc zNoHkIIRiRrclEi@9Ttfnv6F)<;fNh%q<+LsUi5r$CW#G$<k`%f;p=$#dVcu2D}3D@ zzFrW%3YS3YG^f3;%P8#+hE;&{OUFH%EOwK=gJxUild`x4j!-mNf-!S+S?cI|KC>4O zoWdSf`jTEk>M4faFoQ}!CKP->o^w3?WTAopcmRwLb3Uv{30LHUDhSTuLF&}Sfuk6J zL7X)x@~-P2hpsp+K^M!o7i3;0?PZNAlMFp4t?b2F7Fzibhv6=@e7re`+co3MK^%l$ z!YF2gT+qz>LH^}1Xmbf2qrO*htJeIgmD{49t_oUK;k+?zgw|B0y<ip<g&d~M1Pl~x z00ik)l^<;AuwmfgTwM6%IapWjdfJP_L5aKv`}QOClA_4N%wDI6+m51_4q2Y`TqtF` zNC#CJ2KwPEchtRn4lJO-_Xe?95)RQD%*6dF?+sZ_^&p240v^6s@GMS2k<SMTz&|Lx zkCs=8ss_@}go$LJZ-NGy=&RYF9D0GB)S4c+=vc_cpl?-h6+H+Ll+u@krV~y){k)$z za(F@TBynS`+o$pjoFOA>z+<^93d_D4a;}K`rQ4gkk}MrOK4NS;E$HF6i6xz&a|T}c zZb^ozWis4=QQB>zLl$gZ-D~t?$e+6}PiT}y+XWqrvYRaqf<ny9CPm+u(?`d}BSmZ} z9E$HwP+(PDU|z5`xGeg&Am+3z(|)(Hf)C<^dXRK)koki=TkOKGx=o?&SV=IqinD8W zENDZN2>lnalvN(AvYhKWDdl`xwZjfBEVqla8rg+g6cG%;BT6}Lx06BTCk)L-dnPW3 zo*X2oEa8#rxh^H5jI*>Gd{mrOLA1jvZ|A*12FDZD0?^6Z!#Y4Mq-6*>aeJ2D1%}Vl zx8f}BLqgu}!c9Rj=(by3_?JO~XqE)G*vboP8dX0u!(3h^tm+#iF{B!;f`QbT%H`3@ z5!l?KAQeZ|hQ83kR`+Q&?9(}dmE;3>l4VK1TSq!@$O$H^@=nKXqdmhGk1=9kXeaGi zm@j$O&SFIC(1I$3mLHgs#Bu64iw6CkFDJDSIZxS!HZ$y68Vu9z0<eM$Dav*Z7S-lJ z4I~1pVka|aDcgg%o0PciSRSO}6B7m#_lv$N>BNW{P9b7(ycnjWB^|6eN34juUH7-# z+7|mn#I;GkUEzYowUnWXXLB2**1@11Df}T!kY1xp#ukeVheXsx>QQ^X5M#s9W)hbn zMKJ@f8`O&P(KCcRZZd-@p;06qCwK-8Xji~I6PzJuA{qv7iwH=R9)o*KUnrau@hQYF z=)E6>I+rD#YNQy%;ds5l+=U#>5SH8xIW&h|5_g718`@qubJ!zOMk6JHQZVSO_SyI* zC*AAD3qG+IFHra3H%ML&3J^Q55aMU@kTCVq;6FU9zyzHS?&ip(eojs}0sXw3LF(e` z`}urPrwyda#}WF|-Z12s@KBINVD5khL3s`Gl<5>zh^Pm7NqLdn!IiF~KwQdlL{T3u zpui#1qBldrz<iM0LM*ntpDp@QtZ?K-GDza8fdgOD#o?$~7|rO+!}2S`w16&h=OUSN z1uv*1tA&I>7;K6S+7uaB3^TYCw#qin?dU>wQrjsw1TdxO$K(zaiLY>Z`B0UFq{Gv8 zr>`6$#VvxZAc!(PmyR9wnj%atI7@(`3-8K9R0-TALn9drM?P{y#P5nnM>y;U;+Aa< zo|_6vvWAcj**q8AF)2iI7|w(=C0$-Lhb#{k=aW|qVXo+fL~K5_IxM+Lkhq0jcEXjM z#D)B3*%;ufhP{5+l*SSI3|yuA+0Y+Jf(Vu&K?a7HGviFNv;+?pgM$j~z){cLuMFd? zUh1Zh5a3efSv&AGE0I1d<7N!&^TA^<%9E~YCT-7xyx>mgVC$@a=~`<gB+)Pl!lrOl zo@b%wtgKBK%DL=7VRqgoF?lsprvRWYu*MZNpAUQ?VL=T&xKI*BAcMPvOfEyQlKDY{ z%vo-cqB0r8MO=X*qC^IqAjU7c+AIM3><PDT?hv}=47|xo*X2eUAyX6?+|OGle6~xB zfgW~U`&ljp1b)EPlbbR|R_R>O)i^^Y+Csc&J2KGLO52U)>L@OWEZ`lLvu8#**K&b- zj!}ZNwBj;(9C0+Q{Z^}$FSxa}k}gc&3)5g#ZD_+|^wT5|b=!zu@~Dlxui;5m2$qmv zqkykX3c4=(k2-*cxV{j+7Cq|=DZd363WpE_!zpNIHmnQ56om^F6SQWHoOwdE=n`@O zJ&T{H&MSK<{2OWWzH5pvW?EVc(N7YFJuP1zAE_J}<m0tM(>HYBRh|4!ptuuCoo=W^ zyT=`==bS64ZnsWcUxB9`!6%}Y0DD6kG?N$Ula1Ks8VjBZhCYCp0T78`u>&Ln7?SgB z)=!2I`8Xp&$nDTOI|%Adok8~;O06&k*N7as!RSZn)!iOKFwb0fLp)poyfj!b_YX4y z`78bN?zqAN7$8hHg_5|RLpsJZma-g4ibjV+Q90`-73?}fQE!p(1_B!N9CpX&L(9+= z_rY@^lH_I5xYG|pm3uUVXX5nuSPrje69FJ8=8}`;0BL)Z_dw3Mpi79zuks*+#;cvf zA^M&2WPw@}`lq3Lq@{rGW5j!S0a+j)l9it4j=(QL;KbEM9q#aai;0ChnY?0%p%oQD zT@a$^49bkr&szvYA-O;>@6GwKSXeZI7bJJRJ7VK52e2ZqW)RT3Gb>!%{eKLtu#VKQ zdPgD83_Ua(79-vk1wsJjunJhqkCjjjrGQ}do(-=8U4{a#UfkmY!z{&@>vBDFM0_|6 zsc3|#=Nl~Y<c~5}M1t(nVD;2MX#!Jl=2f{Xe6?JclB2_5a>L^;BCmz7)gtP_3V4MV z)XMq+r~Ape-2is%PZ|NK$_6T+1}?J5I*;r@zED<bfa~^Ln#?~0he@O2)6-Up2d1H3 z^YfLia|<3h7Df(}v@ZnO7mhmtA#kwPptdk<){p`>j&N&4A0XbP1%__r#U;&x83TQ} z^NF1h-grF}9ModiaWOckC-b~_vTu(gE#r2sYYh~A9tU{f_OK|yd^Q1Nnn~x^i_2L* z3<}RjyiO-CJITv>lpN`x<U9~~9yQ8*<0p~WBI)qra5>=DDo!zlim?%D#2UU*T@sMR zyjh@d>bb!_sJAtMRYJX#Hd{kIFRj5VwP|C;!f5RV;|{k-?BTX-&M%JLKs!jNgEFJK z1|u4y)QVzog{uQMk58wC1@pdg5VO$dG;cNH4*AF<gnkRP6z=or1qOa`;8WSERgoBr zv_0dwlRFEf=(COiZY`dLM)_4JMHm2mB${|$A1u<R42Gx)p;uH{;>WziH-M(qPJx*j zRV-MYUoMdM-nFEiBl{Vxb{O+%c=6g$_?|$cm0IcskMnyJXoM_`bLR52o!~0SBQi;t zpMjHbHik?;#$|=8SBwnP+0jC+F<ZBAN$!I!=GN4zR*srFG@w#ELr|MAA8B4F$Ch=5 zGwA40VR#ew5NNvM4%;&&3OXV~cnz)@_o}GJ$d6mX+Yz|-^Mxq=GsIs`rmBSoZ!?J% z5i$pdy@?_b*&FBK#y5C_J}$2z7RoTsn8|T_4_D9#E*cCAmX4vK3Rf1cxxNH1Yamo} zTA60xu;Z>0Amn`BLXoZR9g(Y2HdNzf*XKB#>5gL&*Dlad(wErrS;x`A{WAeG6&j?H zjd1sm3%_tIJPoMj)K5^_k(_QmVB+mZ?PDcjRgxj)_vU=kVnV>-h29_x1296<N$MIh zhIinmMY-4y<u{&DI9+8Kt`*7=fdy(zABj6<o1T;$;M!AsU*sKVEGb_T*?TpTrAR8! zqjEXon=((S%#KTO2O${Zj6SAg5>}wkud(p8M)r2beD>=d-&)zbByu@`N@05q2e9}l zykf)t+ExAj?h)E?**hCa@iyuE{Ie!_A&0U*<6QCLfL4B%DZ@D&njCz%Z)_6&Fe>;( zcAUjb<GJ`0p65Wy6V7gq@EJ~XxrfxR^tX7x>U=)2X*e{_Fa7PD5zt@9@o6XnuK|Yl zgoqcFP^Thy!(?|7e2ZtAgiio2{!z}LWhbV(DGahTbw2H%%sNPyR<%%sPn}L$!|v4M zi?})IKir?2I)3bhQ;(*tDI|T!{b2FDADbGagDE^Vvb>m@se0Mn8E4>P+TRm8Hdw4Y zXQ%<wPS`uKeaXZ~#y096-4b1=+x2?g9^qHVqBeDe+;rYiPd<vc2ql38sSzJms7ZHO zb08!BMDjXl!|98+%Ty#+$K)y`IOd`ct8Vx18oqONDUvI<Q@^gRm4!F^oJdYze1lva zmnHnHmDzPtEXtLb8dr@`d%{ahU@k^6XD?Pig@JKu>eY3!v`#ML1%|bJ(+MgD2$$h0 zInb>mq=<bEo{Xal&0QZ<bfa&DF~@ozcEr#5g;P${CJ^<aRYc+JpB|9|L>uMblM}Gq zd*#!DpYyb=O<|kO&bTXhm&8v8L|2pq;u-Q5LIB@OBClxZ+=p}Htt@oN@V6>0#=8LW z=$y4x?!_#~0k5c`e|dXtw5KobxmE;gq#Jnt9u3CMb!eTPVAu+l#rxLuv-s!v&4nkV zvH!J=550Y=ym(}YN#Z`_6CZg0kZN=3Lfm-rd5sreywEsutZp7Y;knz1)MxMIk|LWb z4^K_t<HDs|f$74fLl=)cFm=c$?q4y{m2}Oo1{eb`EiXEDIJk6HoD<AmDjJ%l?aJSZ z8yVtqrCx>?_E5@CBMF^O%jsc}R`h(hh@fKQ@llf~+)iolMMXWYFYFwO%B(%(E!_8{ zRmE*b8zJfAvxBUxynLAJPIGJD%cqpnNaCs+xDm(bQKs?W8l>=W{zhPl3w7Y<IY)*% z-7d=}P0n|PefP=<cAHF9np^qdDFzAWRjHo@=kw_#pmesd<xY!7AH8je_wn%0KR&09 zr^z7uUi_9XAOX5r$MqJy4K9YQ&AK<*p*y^{)jv1rnBELGv{Sd}MvUL6FH(0!bkxhP zD1s|u41x|IYB5+Gr0=0(!~N{y_Zk=mf{wTL7O$sQxU3_Gg-~_+;(-+dp@SF`D992V zhtfOkqI-I<c2DpYHENg`2S*$1pbM#oMnH5C^YC&d5EUOBQ2;-&AAVr>Xk~DmFnEXz z$3P@p3AT8r4gLU>Z^jw6`YE@-g9HG-#^gSHot>acoLL?H7<KNw<6wFJie0&(@Zk!E z#KYtMgXMh(4weUe;k^gT(R4KL57{mP*r^QH3b<}@Z$QJjBjEJlOItmK8W_bF>N=08 zD}j{7ZId?U>WQ0USLr5`t1$E5X)~*>S)>ujd7B3~3BS*VqS6vSg5UB+5&&h~2?e}Y z_d!9oK}~N$gxngf(>9qwW#q5tPi@dn5kfEsN1iwZU1SJSAA&w03Styt^iJyLSuOz7 z6Cgq#aVY#a60C)B##V+qsHHDDeeshk$_gDV7v#zlo`@lQxau%AjC-7TH!TBU5DE>w z-HqA1p`^P(m|_i}42Z6s(8;}FHQte8h`B`<-ar$;3~1x&i$@uoq4Gq&!DHkzqvLqA z0pXjAXXNoK&j^0b|Nr(~CKT}&yMdVh2ce+#JlJ@76K8?=v+noL4EKTU*94WR(gO;D z%pt^!I;=d1S(hd*oH%;Vtp|@G6KXtpvN4HZb<4%2srkm#{L<|grpl@Li$`u>I#9O` zEKN;Zn6jgcc2kEA9lkAC%zk15;)x4bhLQ5{i3^ub+;j2p#64&)-R3hH1?mYT;)Kul zS%>^8=EQ!d>mL7Xgy={kT6K?4bqdwD+a*dP-t^JqjUKX0p?zuM)(bdB+~{09vQ%_i z2&{JG-~&ge>@Yqb@UN*u4=hdDYo2%X_|>Un0C{Vo-CIiVv#^x*mwLUWL3?RXEe#fy z4lW&C!f_usblU`7h1YQZ5wa#|H_aRH;SrP%)Nw7|+)3!35wwHq7g4auyrJU9D3BuJ zO|LvQ_rMqr_`tEr<iVqBc*xJ^LX3~o$kXTf)c6`SjIt|eng_9V#n*%w&eXwMcoPG~ zDbLCk4)TjCC%?x2Z26#@LDk3bTOP)TMEk~e=o*B_HPN^}7vXXoKItair5g|+x8Zj^ zywXnHA5G9@`5zZdPct!?p021})6;lFj2nJ*sYlb(mbcO7)zK=ZF4sBCE%+p<m#x%3 zo}PfY%abVARf|_;T+EN^<*T3!QJw=KDG6^0Ho1S3X57399~A|?3gfjJ(QN!*rd%s+ zPqS7bSkBFw<Uw->KaLO!b#%4fjWnrwj8n+MChxjDV`;ipQyeR*@GK-x6dO-b3Stc8 zA8kXWwiEyPd9&`TTYL0ojO_4{&CzDG7_)W&%Jw#-Q5++bYx#fFB5Y4RvJJDh`8uxk zUqAx3efZwy>jJhgb2A_tFtWkdu~)B0%p@I{8`WdbV9pFPh=aeIL3KC{XuwQhs?V`w zY^!c{jmN3CY}m2k<_*^`|C!A4AHcN18vjQ=`QN@AMI#A+`x5y(v;NvF-ke1!F_EY7 zXG18ORG!A1alZV@M5VnRAN(b&J)|E(gCQ6-mM3ZmK`diY%zA~$Di{UiI^`cHo%O%+ zIpe+y7fE=4;(#V|vDzk66ynp<E4h3q0Ps*W?)eNn70&rWPsJq3aXf~XvfPGo8Olrx z@0Gg#da2UJmG#5nc7hKny)s!II0-`|wD}Nlttjv3Ht9cwz1KixOS)NEvs0NP2{R|> zH*XW}L1*Ev6)q#hpT2l26DDRGp34KoF4E}j{CuTe*)I4w?@TAcGcLYsIE{pKdfM$c zNMSkIe70Eea?rVnte}DkocA`U^%=j;YTgA%^KN{2I68y(54~}&7=}>w68sTa(j+sR zM6+@PZ+&h>dJ+VT@f@D}!kBlA`^`ZeX*zflw?L$6VwyB5oF>H`5(BzbJYG3g#tZx% zR(M6)ON3B^Q|tXoihtA=q)8B-e&eAaZs0;~!F}`AWj>gsxi?ABv&j*++<QZWy`Kjz S88dEz+uIdw*X?7wKJ#xZZL;P7 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/__init__.py new file mode 100644 index 0000000000..8380839a6d --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/__init__.py @@ -0,0 +1,16 @@ +from __future__ import absolute_import, division, unicode_literals + +from .. import treewalkers + +from .htmlserializer import HTMLSerializer + + +def serialize(input, tree="etree", format="html", encoding=None, + **serializer_opts): + # XXX: Should we cache this? + walker = treewalkers.getTreeWalker(tree) + if format == "html": + s = HTMLSerializer(**serializer_opts) + else: + raise ValueError("type must be html") + return s.render(walker(input), encoding) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..027e1308a8ac9624b647d08ec9a52fbf718ece53 GIT binary patch literal 942 zcmc&y-;2{g5S~r?<9haNefOb{LGT^~5ky461HoD(cX&_&G3jpGz1wWU?rf#fd+~hr z(f`qR{{d%GulgStlF97s?Cke_Gx4vJ;~zhxbOC>!4*g$!iomDjNO}brfJ(qzKo!9} zf+~i23_?aAV=x`4x-jq3x&yKcrUz9Y=6zcCK=wfnKpw$2Izr9>&XZ#*tNE@ZCW9j~ zMd@o3Q02O6YKM44F{wA&>)PU&7QyO8EmdwbDpwe<BMK&h4Blhol=@tlYvsJ=;C|;m zd2cV?PtTRph0$M>3tb8+&JN6Sjg?uj)2ENYykpu^auDE3z)rxefSWGth^c_<2;3vU z2zDL#4sg>0I|Ph@bfC1al;4A^4(uo&II@f3HX_1Yd3LxkJmC7<Mop^VaZ;)Y!$=re z+6r<)-b&#Gp}cH4r3?{SwvUAg>dZOPs7FhutW+*x^vLJ6Z31GOO^4f*W$mhBFQ~F4 zp|-15aevSxuN(Aj?p{G;0ewOSTH_sg@_Dw>xDI7@sqJgCbV~l?mD*-+R2f#;hb^va zduBJ;lhbF}RF|2jjy-OQ#dWb#K5KN7Z3uPkGG_hMaK-^jmgm}P%=6P`ivxynx5WeD zSpkSgVkkz@P|VsvYGujuWx(K6p7Y2;$_!GT5NhL{syqyQ<)Nh8%gSoaYO7M7!@sQm XD|Kf3qN-&u>SfyvZuY}y9F61O0`=q> literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/htmlserializer.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/htmlserializer.py new file mode 100644 index 0000000000..11a932703b --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/htmlserializer.py @@ -0,0 +1,309 @@ +from __future__ import absolute_import, division, unicode_literals +from pip.vendor.six import text_type + +import gettext +_ = gettext.gettext + +try: + from functools import reduce +except ImportError: + pass + +from ..constants import voidElements, booleanAttributes, spaceCharacters +from ..constants import rcdataElements, entities, xmlEntities +from .. import utils +from xml.sax.saxutils import escape + +spaceCharacters = "".join(spaceCharacters) + +try: + from codecs import register_error, xmlcharrefreplace_errors +except ImportError: + unicode_encode_errors = "strict" +else: + unicode_encode_errors = "htmlentityreplace" + + encode_entity_map = {} + is_ucs4 = len("\U0010FFFF") == 1 + for k, v in list(entities.items()): + # skip multi-character entities + if ((is_ucs4 and len(v) > 1) or + (not is_ucs4 and len(v) > 2)): + continue + if v != "&": + if len(v) == 2: + v = utils.surrogatePairToCodepoint(v) + else: + v = ord(v) + if not v in encode_entity_map or k.islower(): + # prefer < over < and similarly for &, >, etc. + encode_entity_map[v] = k + + def htmlentityreplace_errors(exc): + if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)): + res = [] + codepoints = [] + skip = False + for i, c in enumerate(exc.object[exc.start:exc.end]): + if skip: + skip = False + continue + index = i + exc.start + if utils.isSurrogatePair(exc.object[index:min([exc.end, index + 2])]): + codepoint = utils.surrogatePairToCodepoint(exc.object[index:index + 2]) + skip = True + else: + codepoint = ord(c) + codepoints.append(codepoint) + for cp in codepoints: + e = encode_entity_map.get(cp) + if e: + res.append("&") + res.append(e) + if not e.endswith(";"): + res.append(";") + else: + res.append("&#x%s;" % (hex(cp)[2:])) + return ("".join(res), exc.end) + else: + return xmlcharrefreplace_errors(exc) + + register_error(unicode_encode_errors, htmlentityreplace_errors) + + del register_error + + +class HTMLSerializer(object): + + # attribute quoting options + quote_attr_values = False + quote_char = '"' + use_best_quote_char = True + + # tag syntax options + omit_optional_tags = True + minimize_boolean_attributes = True + use_trailing_solidus = False + space_before_trailing_solidus = True + + # escaping options + escape_lt_in_attrs = False + escape_rcdata = False + resolve_entities = True + + # miscellaneous options + inject_meta_charset = True + strip_whitespace = False + sanitize = False + + options = ("quote_attr_values", "quote_char", "use_best_quote_char", + "minimize_boolean_attributes", "use_trailing_solidus", + "space_before_trailing_solidus", "omit_optional_tags", + "strip_whitespace", "inject_meta_charset", "escape_lt_in_attrs", + "escape_rcdata", "resolve_entities", "sanitize") + + def __init__(self, **kwargs): + """Initialize HTMLSerializer. + + Keyword options (default given first unless specified) include: + + inject_meta_charset=True|False + Whether it insert a meta element to define the character set of the + document. + quote_attr_values=True|False + Whether to quote attribute values that don't require quoting + per HTML5 parsing rules. + quote_char=u'"'|u"'" + Use given quote character for attribute quoting. Default is to + use double quote unless attribute value contains a double quote, + in which case single quotes are used instead. + escape_lt_in_attrs=False|True + Whether to escape < in attribute values. + escape_rcdata=False|True + Whether to escape characters that need to be escaped within normal + elements within rcdata elements such as style. + resolve_entities=True|False + Whether to resolve named character entities that appear in the + source tree. The XML predefined entities < > & " ' + are unaffected by this setting. + strip_whitespace=False|True + Whether to remove semantically meaningless whitespace. (This + compresses all whitespace to a single space except within pre.) + minimize_boolean_attributes=True|False + Shortens boolean attributes to give just the attribute value, + for example <input disabled="disabled"> becomes <input disabled>. + use_trailing_solidus=False|True + Includes a close-tag slash at the end of the start tag of void + elements (empty elements whose end tag is forbidden). E.g. <hr/>. + space_before_trailing_solidus=True|False + Places a space immediately before the closing slash in a tag + using a trailing solidus. E.g. <hr />. Requires use_trailing_solidus. + sanitize=False|True + Strip all unsafe or unknown constructs from output. + See `html5lib user documentation`_ + omit_optional_tags=True|False + Omit start/end tags that are optional. + + .. _html5lib user documentation: http://code.google.com/p/html5lib/wiki/UserDocumentation + """ + if 'quote_char' in kwargs: + self.use_best_quote_char = False + for attr in self.options: + setattr(self, attr, kwargs.get(attr, getattr(self, attr))) + self.errors = [] + self.strict = False + + def encode(self, string): + assert(isinstance(string, text_type)) + if self.encoding: + return string.encode(self.encoding, unicode_encode_errors) + else: + return string + + def encodeStrict(self, string): + assert(isinstance(string, text_type)) + if self.encoding: + return string.encode(self.encoding, "strict") + else: + return string + + def serialize(self, treewalker, encoding=None): + self.encoding = encoding + in_cdata = False + self.errors = [] + if encoding and self.inject_meta_charset: + from ..filters.inject_meta_charset import Filter + treewalker = Filter(treewalker, encoding) + # XXX: WhitespaceFilter should be used before OptionalTagFilter + # for maximum efficiently of this latter filter + if self.strip_whitespace: + from ..filters.whitespace import Filter + treewalker = Filter(treewalker) + if self.sanitize: + from ..filters.sanitizer import Filter + treewalker = Filter(treewalker) + if self.omit_optional_tags: + from ..filters.optionaltags import Filter + treewalker = Filter(treewalker) + for token in treewalker: + type = token["type"] + if type == "Doctype": + doctype = "<!DOCTYPE %s" % token["name"] + + if token["publicId"]: + doctype += ' PUBLIC "%s"' % token["publicId"] + elif token["systemId"]: + doctype += " SYSTEM" + if token["systemId"]: + if token["systemId"].find('"') >= 0: + if token["systemId"].find("'") >= 0: + self.serializeError(_("System identifer contains both single and double quote characters")) + quote_char = "'" + else: + quote_char = '"' + doctype += " %s%s%s" % (quote_char, token["systemId"], quote_char) + + doctype += ">" + yield self.encodeStrict(doctype) + + elif type in ("Characters", "SpaceCharacters"): + if type == "SpaceCharacters" or in_cdata: + if in_cdata and token["data"].find("</") >= 0: + self.serializeError(_("Unexpected </ in CDATA")) + yield self.encode(token["data"]) + else: + yield self.encode(escape(token["data"])) + + elif type in ("StartTag", "EmptyTag"): + name = token["name"] + yield self.encodeStrict("<%s" % name) + if name in rcdataElements and not self.escape_rcdata: + in_cdata = True + elif in_cdata: + self.serializeError(_("Unexpected child element of a CDATA element")) + for (attr_namespace, attr_name), attr_value in token["data"].items(): + # TODO: Add namespace support here + k = attr_name + v = attr_value + yield self.encodeStrict(' ') + + yield self.encodeStrict(k) + if not self.minimize_boolean_attributes or \ + (k not in booleanAttributes.get(name, tuple()) + and k not in booleanAttributes.get("", tuple())): + yield self.encodeStrict("=") + if self.quote_attr_values or not v: + quote_attr = True + else: + quote_attr = reduce(lambda x, y: x or (y in v), + spaceCharacters + ">\"'=", False) + v = v.replace("&", "&") + if self.escape_lt_in_attrs: + v = v.replace("<", "<") + if quote_attr: + quote_char = self.quote_char + if self.use_best_quote_char: + if "'" in v and '"' not in v: + quote_char = '"' + elif '"' in v and "'" not in v: + quote_char = "'" + if quote_char == "'": + v = v.replace("'", "'") + else: + v = v.replace('"', """) + yield self.encodeStrict(quote_char) + yield self.encode(v) + yield self.encodeStrict(quote_char) + else: + yield self.encode(v) + if name in voidElements and self.use_trailing_solidus: + if self.space_before_trailing_solidus: + yield self.encodeStrict(" /") + else: + yield self.encodeStrict("/") + yield self.encode(">") + + elif type == "EndTag": + name = token["name"] + if name in rcdataElements: + in_cdata = False + elif in_cdata: + self.serializeError(_("Unexpected child element of a CDATA element")) + yield self.encodeStrict("</%s>" % name) + + elif type == "Comment": + data = token["data"] + if data.find("--") >= 0: + self.serializeError(_("Comment contains --")) + yield self.encodeStrict("<!--%s-->" % token["data"]) + + elif type == "Entity": + name = token["name"] + key = name + ";" + if not key in entities: + self.serializeError(_("Entity %s not recognized" % name)) + if self.resolve_entities and key not in xmlEntities: + data = entities[key] + else: + data = "&%s;" % name + yield self.encodeStrict(data) + + else: + self.serializeError(token["data"]) + + def render(self, treewalker, encoding=None): + if encoding: + return b"".join(list(self.serialize(treewalker, encoding))) + else: + return "".join(list(self.serialize(treewalker))) + + def serializeError(self, data="XXX ERROR MESSAGE NEEDED"): + # XXX The idea is to make data mandatory. + self.errors.append(data) + if self.strict: + raise SerializeError + + +def SerializeError(Exception): + """Error in serialized tree""" + pass diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/htmlserializer.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/htmlserializer.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24726c14919a4a47ff6ba1a64e6f366ac3eeadb1 GIT binary patch literal 11408 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 a@1q2(KjBPZ#!TUKVerC8p;(;$*Z%>GKNx8M literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/tokenizer.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/tokenizer.py new file mode 100644 index 0000000000..797745787a --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/tokenizer.py @@ -0,0 +1,1731 @@ +from __future__ import absolute_import, division, unicode_literals + +try: + chr = unichr # flake8: noqa +except NameError: + pass + +from collections import deque + +from .constants import spaceCharacters +from .constants import entities +from .constants import asciiLetters, asciiUpper2Lower +from .constants import digits, hexDigits, EOF +from .constants import tokenTypes, tagTokenTypes +from .constants import replacementCharacters + +from .inputstream import HTMLInputStream + +from .trie import Trie + +entitiesTrie = Trie(entities) + + +class HTMLTokenizer(object): + """ This class takes care of tokenizing HTML. + + * self.currentToken + Holds the token that is currently being processed. + + * self.state + Holds a reference to the method to be invoked... XXX + + * self.stream + Points to HTMLInputStream object. + """ + + def __init__(self, stream, encoding=None, parseMeta=True, useChardet=True, + lowercaseElementName=True, lowercaseAttrName=True, parser=None): + + self.stream = HTMLInputStream(stream, encoding, parseMeta, useChardet) + self.parser = parser + + # Perform case conversions? + self.lowercaseElementName = lowercaseElementName + self.lowercaseAttrName = lowercaseAttrName + + # Setup the initial tokenizer state + self.escapeFlag = False + self.lastFourChars = [] + self.state = self.dataState + self.escape = False + + # The current token being created + self.currentToken = None + super(HTMLTokenizer, self).__init__() + + def __iter__(self): + """ This is where the magic happens. + + We do our usually processing through the states and when we have a token + to return we yield the token which pauses processing until the next token + is requested. + """ + self.tokenQueue = deque([]) + # Start processing. When EOF is reached self.state will return False + # instead of True and the loop will terminate. + while self.state(): + while self.stream.errors: + yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)} + while self.tokenQueue: + yield self.tokenQueue.popleft() + + def consumeNumberEntity(self, isHex): + """This function returns either U+FFFD or the character based on the + decimal or hexadecimal representation. It also discards ";" if present. + If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked. + """ + + allowed = digits + radix = 10 + if isHex: + allowed = hexDigits + radix = 16 + + charStack = [] + + # Consume all the characters that are in range while making sure we + # don't hit an EOF. + c = self.stream.char() + while c in allowed and c is not EOF: + charStack.append(c) + c = self.stream.char() + + # Convert the set of characters consumed to an int. + charAsInt = int("".join(charStack), radix) + + # Certain characters get replaced with others + if charAsInt in replacementCharacters: + char = replacementCharacters[charAsInt] + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + elif ((0xD800 <= charAsInt <= 0xDFFF) or + (charAsInt > 0x10FFFF)): + char = "\uFFFD" + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + else: + # Should speed up this check somehow (e.g. move the set to a constant) + if ((0x0001 <= charAsInt <= 0x0008) or + (0x000E <= charAsInt <= 0x001F) or + (0x007F <= charAsInt <= 0x009F) or + (0xFDD0 <= charAsInt <= 0xFDEF) or + charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, + 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, + 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, + 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, + 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, + 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, + 0xFFFFF, 0x10FFFE, 0x10FFFF])): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + try: + # Try/except needed as UCS-2 Python builds' unichar only works + # within the BMP. + char = chr(charAsInt) + except ValueError: + v = charAsInt - 0x10000 + char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF)) + + # Discard the ; if present. Otherwise, put it back on the queue and + # invoke parseError on parser. + if c != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "numeric-entity-without-semicolon"}) + self.stream.unget(c) + + return char + + def consumeEntity(self, allowedChar=None, fromAttribute=False): + # Initialise to the default output for when no entity is matched + output = "&" + + charStack = [self.stream.char()] + if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") + or (allowedChar is not None and allowedChar == charStack[0])): + self.stream.unget(charStack[0]) + + elif charStack[0] == "#": + # Read the next character to see if it's hex or decimal + hex = False + charStack.append(self.stream.char()) + if charStack[-1] in ("x", "X"): + hex = True + charStack.append(self.stream.char()) + + # charStack[-1] should be the first digit + if (hex and charStack[-1] in hexDigits) \ + or (not hex and charStack[-1] in digits): + # At least one digit found, so consume the whole number + self.stream.unget(charStack[-1]) + output = self.consumeNumberEntity(hex) + else: + # No digits found + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "expected-numeric-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + else: + # At this point in the process might have named entity. Entities + # are stored in the global variable "entities". + # + # Consume characters and compare to these to a substring of the + # entity names in the list until the substring no longer matches. + while (charStack[-1] is not EOF): + if not entitiesTrie.has_keys_with_prefix("".join(charStack)): + break + charStack.append(self.stream.char()) + + # At this point we have a string that starts with some characters + # that may match an entity + # Try to find the longest entity the string will match to take care + # of ¬i for instance. + try: + entityName = entitiesTrie.longest_prefix("".join(charStack[:-1])) + entityLength = len(entityName) + except KeyError: + entityName = None + + if entityName is not None: + if entityName[-1] != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "named-entity-without-semicolon"}) + if (entityName[-1] != ";" and fromAttribute and + (charStack[entityLength] in asciiLetters or + charStack[entityLength] in digits or + charStack[entityLength] == "=")): + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + else: + output = entities[entityName] + self.stream.unget(charStack.pop()) + output += "".join(charStack[entityLength:]) + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-named-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + if fromAttribute: + self.currentToken["data"][-1][1] += output + else: + if output in spaceCharacters: + tokenType = "SpaceCharacters" + else: + tokenType = "Characters" + self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output}) + + def processEntityInAttribute(self, allowedChar): + """This method replaces the need for "entityInAttributeValueState". + """ + self.consumeEntity(allowedChar=allowedChar, fromAttribute=True) + + def emitCurrentToken(self): + """This method is a generic handler for emitting the tags. It also sets + the state to "data" because that's what's needed after a token has been + emitted. + """ + token = self.currentToken + # Add token to the queue to be yielded + if (token["type"] in tagTokenTypes): + if self.lowercaseElementName: + token["name"] = token["name"].translate(asciiUpper2Lower) + if token["type"] == tokenTypes["EndTag"]: + if token["data"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "attributes-in-end-tag"}) + if token["selfClosing"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "self-closing-flag-on-end-tag"}) + self.tokenQueue.append(token) + self.state = self.dataState + + # Below are the various tokenizer states worked out. + def dataState(self): + data = self.stream.char() + if data == "&": + self.state = self.entityDataState + elif data == "<": + self.state = self.tagOpenState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\u0000"}) + elif data is EOF: + # Tokenization ends. + return False + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any <!-- or --> sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def entityDataState(self): + self.consumeEntity() + self.state = self.dataState + return True + + def rcdataState(self): + data = self.stream.char() + if data == "&": + self.state = self.characterReferenceInRcdata + elif data == "<": + self.state = self.rcdataLessThanSignState + elif data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any <!-- or --> sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def characterReferenceInRcdata(self): + self.consumeEntity() + self.state = self.rcdataState + return True + + def rawtextState(self): + data = self.stream.char() + if data == "<": + self.state = self.rawtextLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataState(self): + data = self.stream.char() + if data == "<": + self.state = self.scriptDataLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def plaintextState(self): + data = self.stream.char() + if data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + self.stream.charsUntil("\u0000")}) + return True + + def tagOpenState(self): + data = self.stream.char() + if data == "!": + self.state = self.markupDeclarationOpenState + elif data == "/": + self.state = self.closeTagOpenState + elif data in asciiLetters: + self.currentToken = {"type": tokenTypes["StartTag"], + "name": data, "data": [], + "selfClosing": False, + "selfClosingAcknowledged": False} + self.state = self.tagNameState + elif data == ">": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-right-bracket"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) + self.state = self.dataState + elif data == "?": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-question-mark"}) + self.stream.unget(data) + self.state = self.bogusCommentState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.dataState + return True + + def closeTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.currentToken = {"type": tokenTypes["EndTag"], "name": data, + "data": [], "selfClosing": False} + self.state = self.tagNameState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-right-bracket"}) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-eof"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.state = self.dataState + else: + # XXX data can be _'_... + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-char", + "datavars": {"data": data}}) + self.stream.unget(data) + self.state = self.bogusCommentState + return True + + def tagNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-tag-name"}) + self.state = self.dataState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + else: + self.currentToken["name"] += data + # (Don't use charsUntil here, because tag names are + # very short and it's faster to not do anything fancy) + return True + + def rcdataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rcdataEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rcdataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rawtextLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rawtextEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def rawtextEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rawtextEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def rawtextEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def scriptDataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEndTagOpenState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<!"}) + self.state = self.scriptDataEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.scriptDataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapeStartState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapeStartDashState + else: + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapeStartDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashDashState + else: + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashState + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.state = self.dataState + else: + chars = self.stream.charsUntil(("<", "-", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashDashState + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEscapedEndTagOpenState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) + self.temporaryBuffer = data + self.state = self.scriptDataDoubleEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer = data + self.state = self.scriptDataEscapedEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapeStartState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataDoubleEscapedState + else: + self.state = self.scriptDataEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + return True + + def scriptDataDoubleEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) + self.temporaryBuffer = "" + self.state = self.scriptDataDoubleEscapeEndState + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapeEndState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataEscapedState + else: + self.state = self.scriptDataDoubleEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def beforeAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data in ("'", '"', "=", "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-name-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def attributeNameState(self): + data = self.stream.char() + leavingThisState = True + emitToken = False + if data == "=": + self.state = self.beforeAttributeValueState + elif data in asciiLetters: + self.currentToken["data"][-1][0] += data +\ + self.stream.charsUntil(asciiLetters, True) + leavingThisState = False + elif data == ">": + # XXX If we emit here the attributes are converted to a dict + # without being checked and when the code below runs we error + # because data is a dict not a list + emitToken = True + elif data in spaceCharacters: + self.state = self.afterAttributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][0] += "\uFFFD" + leavingThisState = False + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"][-1][0] += data + leavingThisState = False + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-attribute-name"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][0] += data + leavingThisState = False + + if leavingThisState: + # Attributes are not dropped at this stage. That happens when the + # start tag token is emitted so values can still be safely appended + # to attributes, but we do want to report the parse error in time. + if self.lowercaseAttrName: + self.currentToken["data"][-1][0] = ( + self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) + for name, value in self.currentToken["data"][:-1]: + if self.currentToken["data"][-1][0] == name: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "duplicate-attribute"}) + break + # XXX Fix for above XXX + if emitToken: + self.emitCurrentToken() + return True + + def afterAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "=": + self.state = self.beforeAttributeValueState + elif data == ">": + self.emitCurrentToken() + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-after-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-end-of-tag-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def beforeAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "\"": + self.state = self.attributeValueDoubleQuotedState + elif data == "&": + self.state = self.attributeValueUnQuotedState + self.stream.unget(data) + elif data == "'": + self.state = self.attributeValueSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-right-bracket"}) + self.emitCurrentToken() + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + self.state = self.attributeValueUnQuotedState + elif data in ("=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "equals-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + return True + + def attributeValueDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute('"') + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-double-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("\"", "&", "\u0000")) + return True + + def attributeValueSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute("'") + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-single-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("'", "&", "\u0000")) + return True + + def attributeValueUnQuotedState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == "&": + self.processEntityInAttribute(">") + elif data == ">": + self.emitCurrentToken() + elif data in ('"', "'", "=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-no-quotes"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.stream.charsUntil( + frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) + return True + + def afterAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-EOF-after-attribute-value"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-attribute-value"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def selfClosingStartTagState(self): + data = self.stream.char() + if data == ">": + self.currentToken["selfClosing"] = True + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "unexpected-EOF-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def bogusCommentState(self): + # Make a new comment token and give it as value all the characters + # until the first > or EOF (charsUntil checks for EOF automatically) + # and emit it. + data = self.stream.charsUntil(">") + data = data.replace("\u0000", "\uFFFD") + self.tokenQueue.append( + {"type": tokenTypes["Comment"], "data": data}) + + # Eat the character directly after the bogus comment which is either a + # ">" or an EOF. + self.stream.char() + self.state = self.dataState + return True + + def markupDeclarationOpenState(self): + charStack = [self.stream.char()] + if charStack[-1] == "-": + charStack.append(self.stream.char()) + if charStack[-1] == "-": + self.currentToken = {"type": tokenTypes["Comment"], "data": ""} + self.state = self.commentStartState + return True + elif charStack[-1] in ('d', 'D'): + matched = True + for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), + ('y', 'Y'), ('p', 'P'), ('e', 'E')): + charStack.append(self.stream.char()) + if charStack[-1] not in expected: + matched = False + break + if matched: + self.currentToken = {"type": tokenTypes["Doctype"], + "name": "", + "publicId": None, "systemId": None, + "correct": True} + self.state = self.doctypeState + return True + elif (charStack[-1] == "[" and + self.parser is not None and + self.parser.tree.openElements and + self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): + matched = True + for expected in ["C", "D", "A", "T", "A", "["]: + charStack.append(self.stream.char()) + if charStack[-1] != expected: + matched = False + break + if matched: + self.state = self.cdataSectionState + return True + + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-dashes-or-doctype"}) + + while charStack: + self.stream.unget(charStack.pop()) + self.state = self.bogusCommentState + return True + + def commentStartState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentStartDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + self.state = self.commentState + return True + + def commentStartDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + \ + self.stream.charsUntil(("-", "\u0000")) + return True + + def commentEndDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentEndState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--\uFFFD" + self.state = self.commentState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-bang-after-double-dash-in-comment"}) + self.state = self.commentEndBangState + elif data == "-": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-dash-after-double-dash-in-comment"}) + self.currentToken["data"] += data + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-double-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-comment"}) + self.currentToken["data"] += "--" + data + self.state = self.commentState + return True + + def commentEndBangState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "-": + self.currentToken["data"] += "--!" + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--!\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-bang-state"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "--!" + data + self.state = self.commentState + return True + + def doctypeState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "need-space-after-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeNameState + return True + + def beforeDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-right-bracket"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] = "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] = data + self.state = self.doctypeNameState + return True + + def doctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.state = self.afterDoctypeNameState + elif data == ">": + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype-name"}) + self.currentToken["correct"] = False + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] += data + return True + + def afterDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.currentToken["correct"] = False + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + if data in ("p", "P"): + matched = True + for expected in (("u", "U"), ("b", "B"), ("l", "L"), + ("i", "I"), ("c", "C")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypePublicKeywordState + return True + elif data in ("s", "S"): + matched = True + for expected in (("y", "Y"), ("s", "S"), ("t", "T"), + ("e", "E"), ("m", "M")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypeSystemKeywordState + return True + + # All the characters read before the current 'data' will be + # [a-zA-Z], so they're garbage in the bogus doctype and can be + # discarded; only the latest character might be '>' or EOF + # and needs to be ungetted + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-space-or-right-bracket-in-doctype", "datavars": + {"data": data}}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + + return True + + def afterDoctypePublicKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypePublicIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + return True + + def beforeDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypePublicIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def doctypePublicIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def afterDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.betweenDoctypePublicAndSystemIdentifiersState + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def betweenDoctypePublicAndSystemIdentifiersState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def afterDoctypeSystemKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeSystemIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + return True + + def beforeDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypeSystemIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def doctypeSystemIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def afterDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.state = self.bogusDoctypeState + return True + + def bogusDoctypeState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + # XXX EMIT + self.stream.unget(data) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + pass + return True + + def cdataSectionState(self): + data = [] + while True: + data.append(self.stream.charsUntil("]")) + data.append(self.stream.charsUntil(">")) + char = self.stream.char() + if char == EOF: + break + else: + assert char == ">" + if data[-1][-2:] == "]]": + data[-1] = data[-1][:-2] + break + else: + data.append(char) + + data = "".join(data) + # Deal with null here rather than in the parser + nullCount = data.count("\u0000") + if nullCount > 0: + for i in range(nullCount): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + data = data.replace("\u0000", "\uFFFD") + if data: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": data}) + self.state = self.dataState + return True diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/tokenizer.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/tokenizer.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbbcf711b88234e9cdbae62bc8d75b374c7741c2 GIT binary patch literal 56828 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/__init__.py new file mode 100644 index 0000000000..6a6b2a4c45 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/__init__.py @@ -0,0 +1,76 @@ +"""A collection of modules for building different kinds of tree from +HTML documents. + +To create a treebuilder for a new type of tree, you need to do +implement several things: + +1) A set of classes for various types of elements: Document, Doctype, +Comment, Element. These must implement the interface of +_base.treebuilders.Node (although comment nodes have a different +signature for their constructor, see treebuilders.etree.Comment) +Textual content may also be implemented as another node type, or not, as +your tree implementation requires. + +2) A treebuilder object (called TreeBuilder by convention) that +inherits from treebuilders._base.TreeBuilder. This has 4 required attributes: +documentClass - the class to use for the bottommost node of a document +elementClass - the class to use for HTML Elements +commentClass - the class to use for comments +doctypeClass - the class to use for doctypes +It also has one required method: +getDocument - Returns the root node of the complete document tree + +3) If you wish to run the unit tests, you must also create a +testSerializer method on your treebuilder which accepts a node and +returns a string containing Node and its children serialized according +to the format used in the unittests +""" + +from __future__ import absolute_import, division, unicode_literals + +from ..utils import default_etree + +treeBuilderCache = {} + + +def getTreeBuilder(treeType, implementation=None, **kwargs): + """Get a TreeBuilder class for various types of tree with built-in support + + treeType - the name of the tree type required (case-insensitive). Supported + values are: + + "dom" - A generic builder for DOM implementations, defaulting to + a xml.dom.minidom based implementation. + "etree" - A generic builder for tree implementations exposing an + ElementTree-like interface, defaulting to + xml.etree.cElementTree if available and + xml.etree.ElementTree if not. + "lxml" - A etree-based builder for lxml.etree, handling + limitations of lxml's implementation. + + implementation - (Currently applies to the "etree" and "dom" tree types). A + module implementing the tree type e.g. + xml.etree.ElementTree or xml.etree.cElementTree.""" + + treeType = treeType.lower() + if treeType not in treeBuilderCache: + if treeType == "dom": + from . import dom + # Come up with a sane default (pref. from the stdlib) + if implementation is None: + from xml.dom import minidom + implementation = minidom + # NEVER cache here, caching is done in the dom submodule + return dom.getDomModule(implementation, **kwargs).TreeBuilder + elif treeType == "lxml": + from . import etree_lxml + treeBuilderCache[treeType] = etree_lxml.TreeBuilder + elif treeType == "etree": + from . import etree + if implementation is None: + implementation = default_etree + # NEVER cache here, caching is done in the etree submodule + return etree.getETreeModule(implementation, **kwargs).TreeBuilder + else: + raise ValueError("""Unrecognised treebuilder "%s" """ % treeType) + return treeBuilderCache.get(treeType) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7c96a7741af700b586386fa01c3d07ffe8c00fa GIT binary patch literal 3457 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/_base.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/_base.py new file mode 100644 index 0000000000..8d5bc7e8d4 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/_base.py @@ -0,0 +1,377 @@ +from __future__ import absolute_import, division, unicode_literals +from pip.vendor.six import text_type + +from ..constants import scopingElements, tableInsertModeElements, namespaces + +# The scope markers are inserted when entering object elements, +# marquees, table cells, and table captions, and are used to prevent formatting +# from "leaking" into tables, object elements, and marquees. +Marker = None + +listElementsMap = { + None: (frozenset(scopingElements), False), + "button": (frozenset(scopingElements | set([(namespaces["html"], "button")])), False), + "list": (frozenset(scopingElements | set([(namespaces["html"], "ol"), + (namespaces["html"], "ul")])), False), + "table": (frozenset([(namespaces["html"], "html"), + (namespaces["html"], "table")]), False), + "select": (frozenset([(namespaces["html"], "optgroup"), + (namespaces["html"], "option")]), True) +} + + +class Node(object): + def __init__(self, name): + """Node representing an item in the tree. + name - The tag name associated with the node + parent - The parent of the current node (or None for the document node) + value - The value of the current node (applies to text nodes and + comments + attributes - a dict holding name, value pairs for attributes of the node + childNodes - a list of child nodes of the current node. This must + include all elements but not necessarily other node types + _flags - A list of miscellaneous flags that can be set on the node + """ + self.name = name + self.parent = None + self.value = None + self.attributes = {} + self.childNodes = [] + self._flags = [] + + def __str__(self): + attributesStr = " ".join(["%s=\"%s\"" % (name, value) + for name, value in + self.attributes.items()]) + if attributesStr: + return "<%s %s>" % (self.name, attributesStr) + else: + return "<%s>" % (self.name) + + def __repr__(self): + return "<%s>" % (self.name) + + def appendChild(self, node): + """Insert node as a child of the current node + """ + raise NotImplementedError + + def insertText(self, data, insertBefore=None): + """Insert data as text in the current node, positioned before the + start of node insertBefore or to the end of the node's text. + """ + raise NotImplementedError + + def insertBefore(self, node, refNode): + """Insert node as a child of the current node, before refNode in the + list of child nodes. Raises ValueError if refNode is not a child of + the current node""" + raise NotImplementedError + + def removeChild(self, node): + """Remove node from the children of the current node + """ + raise NotImplementedError + + def reparentChildren(self, newParent): + """Move all the children of the current node to newParent. + This is needed so that trees that don't store text as nodes move the + text in the correct way + """ + # XXX - should this method be made more general? + for child in self.childNodes: + newParent.appendChild(child) + self.childNodes = [] + + def cloneNode(self): + """Return a shallow copy of the current node i.e. a node with the same + name and attributes but with no parent or child nodes + """ + raise NotImplementedError + + def hasContent(self): + """Return true if the node has children or text, false otherwise + """ + raise NotImplementedError + + +class ActiveFormattingElements(list): + def append(self, node): + equalCount = 0 + if node != Marker: + for element in self[::-1]: + if element == Marker: + break + if self.nodesEqual(element, node): + equalCount += 1 + if equalCount == 3: + self.remove(element) + break + list.append(self, node) + + def nodesEqual(self, node1, node2): + if not node1.nameTuple == node2.nameTuple: + return False + + if not node1.attributes == node2.attributes: + return False + + return True + + +class TreeBuilder(object): + """Base treebuilder implementation + documentClass - the class to use for the bottommost node of a document + elementClass - the class to use for HTML Elements + commentClass - the class to use for comments + doctypeClass - the class to use for doctypes + """ + + # Document class + documentClass = None + + # The class to use for creating a node + elementClass = None + + # The class to use for creating comments + commentClass = None + + # The class to use for creating doctypes + doctypeClass = None + + # Fragment class + fragmentClass = None + + def __init__(self, namespaceHTMLElements): + if namespaceHTMLElements: + self.defaultNamespace = "http://www.w3.org/1999/xhtml" + else: + self.defaultNamespace = None + self.reset() + + def reset(self): + self.openElements = [] + self.activeFormattingElements = ActiveFormattingElements() + + # XXX - rename these to headElement, formElement + self.headPointer = None + self.formPointer = None + + self.insertFromTable = False + + self.document = self.documentClass() + + def elementInScope(self, target, variant=None): + + # If we pass a node in we match that. if we pass a string + # match any node with that name + exactNode = hasattr(target, "nameTuple") + + listElements, invert = listElementsMap[variant] + + for node in reversed(self.openElements): + if (node.name == target and not exactNode or + node == target and exactNode): + return True + elif (invert ^ (node.nameTuple in listElements)): + return False + + assert False # We should never reach this point + + def reconstructActiveFormattingElements(self): + # Within this algorithm the order of steps described in the + # specification is not quite the same as the order of steps in the + # code. It should still do the same though. + + # Step 1: stop the algorithm when there's nothing to do. + if not self.activeFormattingElements: + return + + # Step 2 and step 3: we start with the last element. So i is -1. + i = len(self.activeFormattingElements) - 1 + entry = self.activeFormattingElements[i] + if entry == Marker or entry in self.openElements: + return + + # Step 6 + while entry != Marker and entry not in self.openElements: + if i == 0: + # This will be reset to 0 below + i = -1 + break + i -= 1 + # Step 5: let entry be one earlier in the list. + entry = self.activeFormattingElements[i] + + while True: + # Step 7 + i += 1 + + # Step 8 + entry = self.activeFormattingElements[i] + clone = entry.cloneNode() # Mainly to get a new copy of the attributes + + # Step 9 + element = self.insertElement({"type": "StartTag", + "name": clone.name, + "namespace": clone.namespace, + "data": clone.attributes}) + + # Step 10 + self.activeFormattingElements[i] = element + + # Step 11 + if element == self.activeFormattingElements[-1]: + break + + def clearActiveFormattingElements(self): + entry = self.activeFormattingElements.pop() + while self.activeFormattingElements and entry != Marker: + entry = self.activeFormattingElements.pop() + + def elementInActiveFormattingElements(self, name): + """Check if an element exists between the end of the active + formatting elements and the last marker. If it does, return it, else + return false""" + + for item in self.activeFormattingElements[::-1]: + # Check for Marker first because if it's a Marker it doesn't have a + # name attribute. + if item == Marker: + break + elif item.name == name: + return item + return False + + def insertRoot(self, token): + element = self.createElement(token) + self.openElements.append(element) + self.document.appendChild(element) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + doctype = self.doctypeClass(name, publicId, systemId) + self.document.appendChild(doctype) + + def insertComment(self, token, parent=None): + if parent is None: + parent = self.openElements[-1] + parent.appendChild(self.commentClass(token["data"])) + + def createElement(self, token): + """Create an element but don't insert it anywhere""" + name = token["name"] + namespace = token.get("namespace", self.defaultNamespace) + element = self.elementClass(name, namespace) + element.attributes = token["data"] + return element + + def _getInsertFromTable(self): + return self._insertFromTable + + def _setInsertFromTable(self, value): + """Switch the function used to insert an element from the + normal one to the misnested table one and back again""" + self._insertFromTable = value + if value: + self.insertElement = self.insertElementTable + else: + self.insertElement = self.insertElementNormal + + insertFromTable = property(_getInsertFromTable, _setInsertFromTable) + + def insertElementNormal(self, token): + name = token["name"] + assert isinstance(name, text_type), "Element %s not unicode" % name + namespace = token.get("namespace", self.defaultNamespace) + element = self.elementClass(name, namespace) + element.attributes = token["data"] + self.openElements[-1].appendChild(element) + self.openElements.append(element) + return element + + def insertElementTable(self, token): + """Create an element and insert it into the tree""" + element = self.createElement(token) + if self.openElements[-1].name not in tableInsertModeElements: + return self.insertElementNormal(token) + else: + # We should be in the InTable mode. This means we want to do + # special magic element rearranging + parent, insertBefore = self.getTableMisnestedNodePosition() + if insertBefore is None: + parent.appendChild(element) + else: + parent.insertBefore(element, insertBefore) + self.openElements.append(element) + return element + + def insertText(self, data, parent=None): + """Insert text data.""" + if parent is None: + parent = self.openElements[-1] + + if (not self.insertFromTable or (self.insertFromTable and + self.openElements[-1].name + not in tableInsertModeElements)): + parent.insertText(data) + else: + # We should be in the InTable mode. This means we want to do + # special magic element rearranging + parent, insertBefore = self.getTableMisnestedNodePosition() + parent.insertText(data, insertBefore) + + def getTableMisnestedNodePosition(self): + """Get the foster parent element, and sibling to insert before + (or None) when inserting a misnested table node""" + # The foster parent element is the one which comes before the most + # recently opened table element + # XXX - this is really inelegant + lastTable = None + fosterParent = None + insertBefore = None + for elm in self.openElements[::-1]: + if elm.name == "table": + lastTable = elm + break + if lastTable: + # XXX - we should really check that this parent is actually a + # node here + if lastTable.parent: + fosterParent = lastTable.parent + insertBefore = lastTable + else: + fosterParent = self.openElements[ + self.openElements.index(lastTable) - 1] + else: + fosterParent = self.openElements[0] + return fosterParent, insertBefore + + def generateImpliedEndTags(self, exclude=None): + name = self.openElements[-1].name + # XXX td, th and tr are not actually needed + if (name in frozenset(("dd", "dt", "li", "option", "optgroup", "p", "rp", "rt")) + and name != exclude): + self.openElements.pop() + # XXX This is not entirely what the specification says. We should + # investigate it more closely. + self.generateImpliedEndTags(exclude) + + def getDocument(self): + "Return the final tree" + return self.document + + def getFragment(self): + "Return the final fragment" + # assert self.innerHTML + fragment = self.fragmentClass() + self.openElements[0].reparentChildren(fragment) + return fragment + + def testSerializer(self, node): + """Serialize the subtree of node in the format required by unit tests + node - the node from which to start serializing""" + raise NotImplementedError diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/_base.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/_base.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d42c6083cf1aabf946da56cfb99036e31989c248 GIT binary patch literal 15572 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/dom.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/dom.py new file mode 100644 index 0000000000..f9e0d76e76 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/dom.py @@ -0,0 +1,290 @@ +from __future__ import absolute_import, division, unicode_literals + + +from xml.dom import minidom, Node, XML_NAMESPACE, XMLNS_NAMESPACE +import weakref + +from . import _base +from .. import constants +from ..constants import namespaces +from ..utils import moduleFactoryFactory + + +def getDomBuilder(DomImplementation): + Dom = DomImplementation + + class AttrList(object): + def __init__(self, element): + self.element = element + + def __iter__(self): + return list(self.element.attributes.items()).__iter__() + + def __setitem__(self, name, value): + self.element.setAttribute(name, value) + + def __len__(self): + return len(list(self.element.attributes.items())) + + def items(self): + return [(item[0], item[1]) for item in + list(self.element.attributes.items())] + + def keys(self): + return list(self.element.attributes.keys()) + + def __getitem__(self, name): + return self.element.getAttribute(name) + + def __contains__(self, name): + if isinstance(name, tuple): + raise NotImplementedError + else: + return self.element.hasAttribute(name) + + class NodeBuilder(_base.Node): + def __init__(self, element): + _base.Node.__init__(self, element.nodeName) + self.element = element + + namespace = property(lambda self: hasattr(self.element, "namespaceURI") + and self.element.namespaceURI or None) + + def appendChild(self, node): + node.parent = self + self.element.appendChild(node.element) + + def insertText(self, data, insertBefore=None): + text = self.element.ownerDocument.createTextNode(data) + if insertBefore: + self.element.insertBefore(text, insertBefore.element) + else: + self.element.appendChild(text) + + def insertBefore(self, node, refNode): + self.element.insertBefore(node.element, refNode.element) + node.parent = self + + def removeChild(self, node): + if node.element.parentNode == self.element: + self.element.removeChild(node.element) + node.parent = None + + def reparentChildren(self, newParent): + while self.element.hasChildNodes(): + child = self.element.firstChild + self.element.removeChild(child) + newParent.element.appendChild(child) + self.childNodes = [] + + def getAttributes(self): + return AttrList(self.element) + + def setAttributes(self, attributes): + if attributes: + for name, value in list(attributes.items()): + if isinstance(name, tuple): + if name[0] is not None: + qualifiedName = (name[0] + ":" + name[1]) + else: + qualifiedName = name[1] + self.element.setAttributeNS(name[2], qualifiedName, + value) + else: + self.element.setAttribute( + name, value) + attributes = property(getAttributes, setAttributes) + + def cloneNode(self): + return NodeBuilder(self.element.cloneNode(False)) + + def hasContent(self): + return self.element.hasChildNodes() + + def getNameTuple(self): + if self.namespace is None: + return namespaces["html"], self.name + else: + return self.namespace, self.name + + nameTuple = property(getNameTuple) + + class TreeBuilder(_base.TreeBuilder): + def documentClass(self): + self.dom = Dom.getDOMImplementation().createDocument(None, None, None) + return weakref.proxy(self) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + domimpl = Dom.getDOMImplementation() + doctype = domimpl.createDocumentType(name, publicId, systemId) + self.document.appendChild(NodeBuilder(doctype)) + if Dom == minidom: + doctype.ownerDocument = self.dom + + def elementClass(self, name, namespace=None): + if namespace is None and self.defaultNamespace is None: + node = self.dom.createElement(name) + else: + node = self.dom.createElementNS(namespace, name) + + return NodeBuilder(node) + + def commentClass(self, data): + return NodeBuilder(self.dom.createComment(data)) + + def fragmentClass(self): + return NodeBuilder(self.dom.createDocumentFragment()) + + def appendChild(self, node): + self.dom.appendChild(node.element) + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + return self.dom + + def getFragment(self): + return _base.TreeBuilder.getFragment(self).element + + def insertText(self, data, parent=None): + data = data + if parent != self: + _base.TreeBuilder.insertText(self, data, parent) + else: + # HACK: allow text nodes as children of the document node + if hasattr(self.dom, '_child_node_types'): + if not Node.TEXT_NODE in self.dom._child_node_types: + self.dom._child_node_types = list(self.dom._child_node_types) + self.dom._child_node_types.append(Node.TEXT_NODE) + self.dom.appendChild(self.dom.createTextNode(data)) + + implementation = DomImplementation + name = None + + def testSerializer(element): + element.normalize() + rv = [] + + def serializeElement(element, indent=0): + if element.nodeType == Node.DOCUMENT_TYPE_NODE: + if element.name: + if element.publicId or element.systemId: + publicId = element.publicId or "" + systemId = element.systemId or "" + rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" % + (' ' * indent, element.name, publicId, systemId)) + else: + rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, element.name)) + else: + rv.append("|%s<!DOCTYPE >" % (' ' * indent,)) + elif element.nodeType == Node.DOCUMENT_NODE: + rv.append("#document") + elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE: + rv.append("#document-fragment") + elif element.nodeType == Node.COMMENT_NODE: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.nodeValue)) + elif element.nodeType == Node.TEXT_NODE: + rv.append("|%s\"%s\"" % (' ' * indent, element.nodeValue)) + else: + if (hasattr(element, "namespaceURI") and + element.namespaceURI is not None): + name = "%s %s" % (constants.prefixes[element.namespaceURI], + element.nodeName) + else: + name = element.nodeName + rv.append("|%s<%s>" % (' ' * indent, name)) + if element.hasAttributes(): + attributes = [] + for i in range(len(element.attributes)): + attr = element.attributes.item(i) + name = attr.nodeName + value = attr.value + ns = attr.namespaceURI + if ns: + name = "%s %s" % (constants.prefixes[ns], attr.localName) + else: + name = attr.nodeName + attributes.append((name, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + indent += 2 + for child in element.childNodes: + serializeElement(child, indent) + serializeElement(element, 0) + + return "\n".join(rv) + + def dom2sax(node, handler, nsmap={'xml': XML_NAMESPACE}): + if node.nodeType == Node.ELEMENT_NODE: + if not nsmap: + handler.startElement(node.nodeName, node.attributes) + for child in node.childNodes: + dom2sax(child, handler, nsmap) + handler.endElement(node.nodeName) + else: + attributes = dict(node.attributes.itemsNS()) + + # gather namespace declarations + prefixes = [] + for attrname in list(node.attributes.keys()): + attr = node.getAttributeNode(attrname) + if (attr.namespaceURI == XMLNS_NAMESPACE or + (attr.namespaceURI is None and attr.nodeName.startswith('xmlns'))): + prefix = (attr.nodeName != 'xmlns' and attr.nodeName or None) + handler.startPrefixMapping(prefix, attr.nodeValue) + prefixes.append(prefix) + nsmap = nsmap.copy() + nsmap[prefix] = attr.nodeValue + del attributes[(attr.namespaceURI, attr.nodeName)] + + # apply namespace declarations + for attrname in list(node.attributes.keys()): + attr = node.getAttributeNode(attrname) + if attr.namespaceURI is None and ':' in attr.nodeName: + prefix = attr.nodeName.split(':')[0] + if prefix in nsmap: + del attributes[(attr.namespaceURI, attr.nodeName)] + attributes[(nsmap[prefix], attr.nodeName)] = attr.nodeValue + + # SAX events + ns = node.namespaceURI or nsmap.get(None, None) + handler.startElementNS((ns, node.nodeName), node.nodeName, attributes) + for child in node.childNodes: + dom2sax(child, handler, nsmap) + handler.endElementNS((ns, node.nodeName), node.nodeName) + for prefix in prefixes: + handler.endPrefixMapping(prefix) + + elif node.nodeType in [Node.TEXT_NODE, Node.CDATA_SECTION_NODE]: + handler.characters(node.nodeValue) + + elif node.nodeType == Node.DOCUMENT_NODE: + handler.startDocument() + for child in node.childNodes: + dom2sax(child, handler, nsmap) + handler.endDocument() + + elif node.nodeType == Node.DOCUMENT_FRAGMENT_NODE: + for child in node.childNodes: + dom2sax(child, handler, nsmap) + + else: + # ATTRIBUTE_NODE + # ENTITY_NODE + # PROCESSING_INSTRUCTION_NODE + # COMMENT_NODE + # DOCUMENT_TYPE_NODE + # NOTATION_NODE + pass + + return locals() + + +# The actual means to get a module! +getDomModule = moduleFactoryFactory(getDomBuilder) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/dom.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/dom.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15d27d6806cc87c0cd4d5057cc364e5698796b1f GIT binary patch literal 14622 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 Ct?Tjt literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree.py new file mode 100644 index 0000000000..7b0cdd8e6d --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree.py @@ -0,0 +1,337 @@ +from __future__ import absolute_import, division, unicode_literals +from pip.vendor.six import text_type + +import re + +from . import _base +from .. import ihatexml +from .. import constants +from ..constants import namespaces +from ..utils import moduleFactoryFactory + +tag_regexp = re.compile("{([^}]*)}(.*)") + + +def getETreeBuilder(ElementTreeImplementation, fullTree=False): + ElementTree = ElementTreeImplementation + ElementTreeCommentType = ElementTree.Comment("asd").tag + + class Element(_base.Node): + def __init__(self, name, namespace=None): + self._name = name + self._namespace = namespace + self._element = ElementTree.Element(self._getETreeTag(name, + namespace)) + if namespace is None: + self.nameTuple = namespaces["html"], self._name + else: + self.nameTuple = self._namespace, self._name + self.parent = None + self._childNodes = [] + self._flags = [] + + def _getETreeTag(self, name, namespace): + if namespace is None: + etree_tag = name + else: + etree_tag = "{%s}%s" % (namespace, name) + return etree_tag + + def _setName(self, name): + self._name = name + self._element.tag = self._getETreeTag(self._name, self._namespace) + + def _getName(self): + return self._name + + name = property(_getName, _setName) + + def _setNamespace(self, namespace): + self._namespace = namespace + self._element.tag = self._getETreeTag(self._name, self._namespace) + + def _getNamespace(self): + return self._namespace + + namespace = property(_getNamespace, _setNamespace) + + def _getAttributes(self): + return self._element.attrib + + def _setAttributes(self, attributes): + # Delete existing attributes first + # XXX - there may be a better way to do this... + for key in list(self._element.attrib.keys()): + del self._element.attrib[key] + for key, value in attributes.items(): + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], key[1]) + else: + name = key + self._element.set(name, value) + + attributes = property(_getAttributes, _setAttributes) + + def _getChildNodes(self): + return self._childNodes + + def _setChildNodes(self, value): + del self._element[:] + self._childNodes = [] + for element in value: + self.insertChild(element) + + childNodes = property(_getChildNodes, _setChildNodes) + + def hasContent(self): + """Return true if the node has children or text""" + return bool(self._element.text or len(self._element)) + + def appendChild(self, node): + self._childNodes.append(node) + self._element.append(node._element) + node.parent = self + + def insertBefore(self, node, refNode): + index = list(self._element).index(refNode._element) + self._element.insert(index, node._element) + node.parent = self + + def removeChild(self, node): + self._element.remove(node._element) + node.parent = None + + def insertText(self, data, insertBefore=None): + if not(len(self._element)): + if not self._element.text: + self._element.text = "" + self._element.text += data + elif insertBefore is None: + # Insert the text as the tail of the last child element + if not self._element[-1].tail: + self._element[-1].tail = "" + self._element[-1].tail += data + else: + # Insert the text before the specified node + children = list(self._element) + index = children.index(insertBefore._element) + if index > 0: + if not self._element[index - 1].tail: + self._element[index - 1].tail = "" + self._element[index - 1].tail += data + else: + if not self._element.text: + self._element.text = "" + self._element.text += data + + def cloneNode(self): + element = type(self)(self.name, self.namespace) + for name, value in self.attributes.items(): + element.attributes[name] = value + return element + + def reparentChildren(self, newParent): + if newParent.childNodes: + newParent.childNodes[-1]._element.tail += self._element.text + else: + if not newParent._element.text: + newParent._element.text = "" + if self._element.text is not None: + newParent._element.text += self._element.text + self._element.text = "" + _base.Node.reparentChildren(self, newParent) + + class Comment(Element): + def __init__(self, data): + # Use the superclass constructor to set all properties on the + # wrapper element + self._element = ElementTree.Comment(data) + self.parent = None + self._childNodes = [] + self._flags = [] + + def _getData(self): + return self._element.text + + def _setData(self, value): + self._element.text = value + + data = property(_getData, _setData) + + class DocumentType(Element): + def __init__(self, name, publicId, systemId): + Element.__init__(self, "<!DOCTYPE>") + self._element.text = name + self.publicId = publicId + self.systemId = systemId + + def _getPublicId(self): + return self._element.get("publicId", "") + + def _setPublicId(self, value): + if value is not None: + self._element.set("publicId", value) + + publicId = property(_getPublicId, _setPublicId) + + def _getSystemId(self): + return self._element.get("systemId", "") + + def _setSystemId(self, value): + if value is not None: + self._element.set("systemId", value) + + systemId = property(_getSystemId, _setSystemId) + + class Document(Element): + def __init__(self): + Element.__init__(self, "DOCUMENT_ROOT") + + class DocumentFragment(Element): + def __init__(self): + Element.__init__(self, "DOCUMENT_FRAGMENT") + + def testSerializer(element): + rv = [] + + def serializeElement(element, indent=0): + if not(hasattr(element, "tag")): + element = element.getroot() + if element.tag == "<!DOCTYPE>": + if element.get("publicId") or element.get("systemId"): + publicId = element.get("publicId") or "" + systemId = element.get("systemId") or "" + rv.append("""<!DOCTYPE %s "%s" "%s">""" % + (element.text, publicId, systemId)) + else: + rv.append("<!DOCTYPE %s>" % (element.text,)) + elif element.tag == "DOCUMENT_ROOT": + rv.append("#document") + if element.text is not None: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + if element.tail is not None: + raise TypeError("Document node cannot have tail") + if hasattr(element, "attrib") and len(element.attrib): + raise TypeError("Document node cannot have attributes") + elif element.tag == ElementTreeCommentType: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) + else: + assert isinstance(element.tag, text_type), \ + "Expected unicode, got %s, %s" % (type(element.tag), element.tag) + nsmatch = tag_regexp.match(element.tag) + + if nsmatch is None: + name = element.tag + else: + ns, name = nsmatch.groups() + prefix = constants.prefixes[ns] + name = "%s %s" % (prefix, name) + rv.append("|%s<%s>" % (' ' * indent, name)) + + if hasattr(element, "attrib"): + attributes = [] + for name, value in element.attrib.items(): + nsmatch = tag_regexp.match(name) + if nsmatch is not None: + ns, name = nsmatch.groups() + prefix = constants.prefixes[ns] + attr_string = "%s %s" % (prefix, name) + else: + attr_string = name + attributes.append((attr_string, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + if element.text: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + indent += 2 + for child in element: + serializeElement(child, indent) + if element.tail: + rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) + serializeElement(element, 0) + + return "\n".join(rv) + + def tostring(element): + """Serialize an element and its child nodes to a string""" + rv = [] + filter = ihatexml.InfosetFilter() + + def serializeElement(element): + if isinstance(element, ElementTree.ElementTree): + element = element.getroot() + + if element.tag == "<!DOCTYPE>": + if element.get("publicId") or element.get("systemId"): + publicId = element.get("publicId") or "" + systemId = element.get("systemId") or "" + rv.append("""<!DOCTYPE %s PUBLIC "%s" "%s">""" % + (element.text, publicId, systemId)) + else: + rv.append("<!DOCTYPE %s>" % (element.text,)) + elif element.tag == "DOCUMENT_ROOT": + if element.text is not None: + rv.append(element.text) + if element.tail is not None: + raise TypeError("Document node cannot have tail") + if hasattr(element, "attrib") and len(element.attrib): + raise TypeError("Document node cannot have attributes") + + for child in element: + serializeElement(child) + + elif element.tag == ElementTreeCommentType: + rv.append("<!--%s-->" % (element.text,)) + else: + # This is assumed to be an ordinary element + if not element.attrib: + rv.append("<%s>" % (filter.fromXmlName(element.tag),)) + else: + attr = " ".join(["%s=\"%s\"" % ( + filter.fromXmlName(name), value) + for name, value in element.attrib.items()]) + rv.append("<%s %s>" % (element.tag, attr)) + if element.text: + rv.append(element.text) + + for child in element: + serializeElement(child) + + rv.append("</%s>" % (element.tag,)) + + if element.tail: + rv.append(element.tail) + + serializeElement(element) + + return "".join(rv) + + class TreeBuilder(_base.TreeBuilder): + documentClass = Document + doctypeClass = DocumentType + elementClass = Element + commentClass = Comment + fragmentClass = DocumentFragment + implementation = ElementTreeImplementation + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + if fullTree: + return self.document._element + else: + if self.defaultNamespace is not None: + return self.document._element.find( + "{%s}html" % self.defaultNamespace) + else: + return self.document._element.find("html") + + def getFragment(self): + return _base.TreeBuilder.getFragment(self)._element + + return locals() + + +getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b502c4a3599505108e59b6d44db4dfa8b79e3bf5 GIT binary patch literal 16360 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree_lxml.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree_lxml.py new file mode 100644 index 0000000000..35d08efaa6 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree_lxml.py @@ -0,0 +1,369 @@ +"""Module for supporting the lxml.etree library. The idea here is to use as much +of the native library as possible, without using fragile hacks like custom element +names that break between releases. The downside of this is that we cannot represent +all possible trees; specifically the following are known to cause problems: + +Text or comments as siblings of the root element +Docypes with no name + +When any of these things occur, we emit a DataLossWarning +""" + +from __future__ import absolute_import, division, unicode_literals + +import warnings +import re +import sys + +from . import _base +from ..constants import DataLossWarning +from .. import constants +from . import etree as etree_builders +from .. import ihatexml + +import lxml.etree as etree + + +fullTree = True +tag_regexp = re.compile("{([^}]*)}(.*)") + +comment_type = etree.Comment("asd").tag + + +class DocumentType(object): + def __init__(self, name, publicId, systemId): + self.name = name + self.publicId = publicId + self.systemId = systemId + + +class Document(object): + def __init__(self): + self._elementTree = None + self._childNodes = [] + + def appendChild(self, element): + self._elementTree.getroot().addnext(element._element) + + def _getChildNodes(self): + return self._childNodes + + childNodes = property(_getChildNodes) + + +def testSerializer(element): + rv = [] + finalText = None + infosetFilter = ihatexml.InfosetFilter() + + def serializeElement(element, indent=0): + if not hasattr(element, "tag"): + if hasattr(element, "getroot"): + # Full tree case + rv.append("#document") + if element.docinfo.internalDTD: + if not (element.docinfo.public_id or + element.docinfo.system_url): + dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name + else: + dtd_str = """<!DOCTYPE %s "%s" "%s">""" % ( + element.docinfo.root_name, + element.docinfo.public_id, + element.docinfo.system_url) + rv.append("|%s%s" % (' ' * (indent + 2), dtd_str)) + next_element = element.getroot() + while next_element.getprevious() is not None: + next_element = next_element.getprevious() + while next_element is not None: + serializeElement(next_element, indent + 2) + next_element = next_element.getnext() + elif isinstance(element, str) or isinstance(element, bytes): + # Text in a fragment + assert isinstance(element, str) or sys.version_info.major == 2 + rv.append("|%s\"%s\"" % (' ' * indent, element)) + else: + # Fragment case + rv.append("#document-fragment") + for next_element in element: + serializeElement(next_element, indent + 2) + elif element.tag == comment_type: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) + if hasattr(element, "tail") and element.tail: + rv.append("|%s\"%s\"" % (' ' * indent, element.tail)) + else: + assert isinstance(element, etree._Element) + nsmatch = etree_builders.tag_regexp.match(element.tag) + if nsmatch is not None: + ns = nsmatch.group(1) + tag = nsmatch.group(2) + prefix = constants.prefixes[ns] + rv.append("|%s<%s %s>" % (' ' * indent, prefix, + infosetFilter.fromXmlName(tag))) + else: + rv.append("|%s<%s>" % (' ' * indent, + infosetFilter.fromXmlName(element.tag))) + + if hasattr(element, "attrib"): + attributes = [] + for name, value in element.attrib.items(): + nsmatch = tag_regexp.match(name) + if nsmatch is not None: + ns, name = nsmatch.groups() + name = infosetFilter.fromXmlName(name) + prefix = constants.prefixes[ns] + attr_string = "%s %s" % (prefix, name) + else: + attr_string = infosetFilter.fromXmlName(name) + attributes.append((attr_string, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + + if element.text: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + indent += 2 + for child in element: + serializeElement(child, indent) + if hasattr(element, "tail") and element.tail: + rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) + serializeElement(element, 0) + + if finalText is not None: + rv.append("|%s\"%s\"" % (' ' * 2, finalText)) + + return "\n".join(rv) + + +def tostring(element): + """Serialize an element and its child nodes to a string""" + rv = [] + finalText = None + + def serializeElement(element): + if not hasattr(element, "tag"): + if element.docinfo.internalDTD: + if element.docinfo.doctype: + dtd_str = element.docinfo.doctype + else: + dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name + rv.append(dtd_str) + serializeElement(element.getroot()) + + elif element.tag == comment_type: + rv.append("<!--%s-->" % (element.text,)) + + else: + # This is assumed to be an ordinary element + if not element.attrib: + rv.append("<%s>" % (element.tag,)) + else: + attr = " ".join(["%s=\"%s\"" % (name, value) + for name, value in element.attrib.items()]) + rv.append("<%s %s>" % (element.tag, attr)) + if element.text: + rv.append(element.text) + + for child in element: + serializeElement(child) + + rv.append("</%s>" % (element.tag,)) + + if hasattr(element, "tail") and element.tail: + rv.append(element.tail) + + serializeElement(element) + + if finalText is not None: + rv.append("%s\"" % (' ' * 2, finalText)) + + return "".join(rv) + + +class TreeBuilder(_base.TreeBuilder): + documentClass = Document + doctypeClass = DocumentType + elementClass = None + commentClass = None + fragmentClass = Document + implementation = etree + + def __init__(self, namespaceHTMLElements, fullTree=False): + builder = etree_builders.getETreeModule(etree, fullTree=fullTree) + infosetFilter = self.infosetFilter = ihatexml.InfosetFilter() + self.namespaceHTMLElements = namespaceHTMLElements + + class Attributes(dict): + def __init__(self, element, value={}): + self._element = element + dict.__init__(self, value) + for key, value in self.items(): + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) + else: + name = infosetFilter.coerceAttribute(key) + self._element._element.attrib[name] = value + + def __setitem__(self, key, value): + dict.__setitem__(self, key, value) + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) + else: + name = infosetFilter.coerceAttribute(key) + self._element._element.attrib[name] = value + + class Element(builder.Element): + def __init__(self, name, namespace): + name = infosetFilter.coerceElement(name) + builder.Element.__init__(self, name, namespace=namespace) + self._attributes = Attributes(self) + + def _setName(self, name): + self._name = infosetFilter.coerceElement(name) + self._element.tag = self._getETreeTag( + self._name, self._namespace) + + def _getName(self): + return infosetFilter.fromXmlName(self._name) + + name = property(_getName, _setName) + + def _getAttributes(self): + return self._attributes + + def _setAttributes(self, attributes): + self._attributes = Attributes(self, attributes) + + attributes = property(_getAttributes, _setAttributes) + + def insertText(self, data, insertBefore=None): + data = infosetFilter.coerceCharacters(data) + builder.Element.insertText(self, data, insertBefore) + + def appendChild(self, child): + builder.Element.appendChild(self, child) + + class Comment(builder.Comment): + def __init__(self, data): + data = infosetFilter.coerceComment(data) + builder.Comment.__init__(self, data) + + def _setData(self, data): + data = infosetFilter.coerceComment(data) + self._element.text = data + + def _getData(self): + return self._element.text + + data = property(_getData, _setData) + + self.elementClass = Element + self.commentClass = builder.Comment + # self.fragmentClass = builder.DocumentFragment + _base.TreeBuilder.__init__(self, namespaceHTMLElements) + + def reset(self): + _base.TreeBuilder.reset(self) + self.insertComment = self.insertCommentInitial + self.initial_comments = [] + self.doctype = None + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + if fullTree: + return self.document._elementTree + else: + return self.document._elementTree.getroot() + + def getFragment(self): + fragment = [] + element = self.openElements[0]._element + if element.text: + fragment.append(element.text) + fragment.extend(list(element)) + if element.tail: + fragment.append(element.tail) + return fragment + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + if not name: + warnings.warn("lxml cannot represent empty doctype", DataLossWarning) + self.doctype = None + else: + coercedName = self.infosetFilter.coerceElement(name) + if coercedName != name: + warnings.warn("lxml cannot represent non-xml doctype", DataLossWarning) + + doctype = self.doctypeClass(coercedName, publicId, systemId) + self.doctype = doctype + + def insertCommentInitial(self, data, parent=None): + self.initial_comments.append(data) + + def insertCommentMain(self, data, parent=None): + if (parent == self.document and + self.document._elementTree.getroot()[-1].tag == comment_type): + warnings.warn("lxml cannot represent adjacent comments beyond the root elements", DataLossWarning) + super(TreeBuilder, self).insertComment(data, parent) + + def insertRoot(self, token): + """Create the document root""" + # Because of the way libxml2 works, it doesn't seem to be possible to + # alter information like the doctype after the tree has been parsed. + # Therefore we need to use the built-in parser to create our iniial + # tree, after which we can add elements like normal + docStr = "" + if self.doctype: + assert self.doctype.name + docStr += "<!DOCTYPE %s" % self.doctype.name + if (self.doctype.publicId is not None or + self.doctype.systemId is not None): + docStr += (' PUBLIC "%s" ' % + (self.infosetFilter.coercePubid(self.doctype.publicId or ""))) + if self.doctype.systemId: + sysid = self.doctype.systemId + if sysid.find("'") >= 0 and sysid.find('"') >= 0: + warnings.warn("DOCTYPE system cannot contain single and double quotes", DataLossWarning) + sysid = sysid.replace("'", 'U00027') + if sysid.find("'") >= 0: + docStr += '"%s"' % sysid + else: + docStr += "'%s'" % sysid + else: + docStr += "''" + docStr += ">" + if self.doctype.name != token["name"]: + warnings.warn("lxml cannot represent doctype with a different name to the root element", DataLossWarning) + docStr += "<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>" + root = etree.fromstring(docStr) + + # Append the initial comments: + for comment_token in self.initial_comments: + root.addprevious(etree.Comment(comment_token["data"])) + + # Create the root document and add the ElementTree to it + self.document = self.documentClass() + self.document._elementTree = root.getroottree() + + # Give the root element the right name + name = token["name"] + namespace = token.get("namespace", self.defaultNamespace) + if namespace is None: + etree_tag = name + else: + etree_tag = "{%s}%s" % (namespace, name) + root.tag = etree_tag + + # Add the root element to the internal child/open data structures + root_element = self.elementClass(name, namespace) + root_element._element = root + self.document._childNodes.append(root_element) + self.openElements.append(root_element) + + # Reset to the default insert comment function + self.insertComment = self.insertCommentMain diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree_lxml.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree_lxml.pyc new file mode 100644 index 0000000000000000000000000000000000000000..582169f91aa9b0152698d98f9d0f7090e427747b GIT binary patch literal 16624 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 Z4w-v6<xUn#$U~ei934J7QC=*c`)`Ei+e`oe literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/__init__.py new file mode 100644 index 0000000000..18124e75f3 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/__init__.py @@ -0,0 +1,57 @@ +"""A collection of modules for iterating through different kinds of +tree, generating tokens identical to those produced by the tokenizer +module. + +To create a tree walker for a new type of tree, you need to do +implement a tree walker object (called TreeWalker by convention) that +implements a 'serialize' method taking a tree as sole argument and +returning an iterator generating tokens. +""" + +from __future__ import absolute_import, division, unicode_literals + +import sys + +from ..utils import default_etree + +treeWalkerCache = {} + + +def getTreeWalker(treeType, implementation=None, **kwargs): + """Get a TreeWalker class for various types of tree with built-in support + + treeType - the name of the tree type required (case-insensitive). Supported + values are: + + "dom" - The xml.dom.minidom DOM implementation + "pulldom" - The xml.dom.pulldom event stream + "etree" - A generic walker for tree implementations exposing an + elementtree-like interface (known to work with + ElementTree, cElementTree and lxml.etree). + "lxml" - Optimized walker for lxml.etree + "genshi" - a Genshi stream + + implementation - (Currently applies to the "etree" tree type only). A module + implementing the tree type e.g. xml.etree.ElementTree or + cElementTree.""" + + treeType = treeType.lower() + if treeType not in treeWalkerCache: + if treeType in ("dom", "pulldom"): + name = "%s.%s" % (__name__, treeType) + __import__(name) + mod = sys.modules[name] + treeWalkerCache[treeType] = mod.TreeWalker + elif treeType == "genshi": + from . import genshistream + treeWalkerCache[treeType] = genshistream.TreeWalker + elif treeType == "lxml": + from . import lxmletree + treeWalkerCache[treeType] = lxmletree.TreeWalker + elif treeType == "etree": + from . import etree + if implementation is None: + implementation = default_etree + # XXX: NEVER cache here, caching is done in the etree submodule + return etree.getETreeModule(implementation, **kwargs).TreeWalker + return treeWalkerCache.get(treeType) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a2b4bd3b62a868e1d0c558a4e10bdb95e25cc8b GIT binary patch literal 2548 zcmc&#&1)M+6o0$=vNv`bN=Yg7Fc{J(5bvST7D6aBNywp1Qe;Cw6{xG-kv!Jy%w|5U zs8~=)p{E}Em-Juiq4(Z$>U%Satwd?BwP7_Mzxln7`Mo!-zxT7>|4IiXtp8H{{pQCM z><JDkfFXVps8Wy#)F}*8s9P{>LEVO78xq=Uf$YGr163QU4#+OlJs9>N5qNrswyQ4u zlE5&d@o~S0#Qx_5;E0u4N?tml71L8z>&i=R*;E@Q95;m%YR25D(SCNyDlwgM!<A!m zp(=|9GG{oy%Vu0%V)dLW%S44RQ5KRpjpw!HtT9Ml@`_ECxWaJ*k>V$AvS>BWvJ=fp z!wbh*!HAhH3OVN{xKl927tAdiPL4*qOYLzLDbYx!Gf_8^*W};Z$Mxh4Lu7q)M<VzH znV&~ubfwhloP5>l4!TviD;A41w=FlKkm%-ZR&xvlZ50^(?2U=SGOHyzY-T>1R#j%W z^F{@fTIUfHx|O9o!}|f~xA5aWz)vwjF7NmlBhkjW9bBu#xv=P+yMYt0M5!x2mf>=w zeJV&SeY{C<`vm6G!b>;il%JCJh=TaPB|-HNcmZ$*@CslR#x8+*56o*?udczo3+4wB ziA!l^n!?Q$PFir$f>#M7t_^1$ntZZq!v#*dfDDMd{~}VfVV;8dm1KyTlRc<+VAX-- zqO*<d1?(RIyA!axu<9bVyN%rq*w+D@1#AW@RQLs|e-Gw6VEzQR2de}W#?^zfeZZ}Y z6n;yH>=;+k(X;F1D+Y4hr*!!*F*T1l>19I{r7UbLf%C!$?QKvU$$c$K;ZE7a3+WDp zV%9fwS6RmJkJ5fZ5<LtOS4ADwN^&PX2l*QQ!V7~!L_u1P92P4^IC0MJ<m@=o@hb2U z=lbuwkRB_uF#KM$^=5;94=P<BpwSaF^s<&YPV-tQfxqnGvnTAbGO(bvdY76VG+xU0 zP^_03rwU;fLn!L)!$E9h{U}OYl$&)M;(pt{W&CBMZLE(izN@%+tY%_3lw!`AP}q~E zMafxzuJl4t-7mD6vjtwse-J&2L?=jemz5hcR;Y?e%2){EPQFEQK)V#&v&M-U`#`lB z+||+TgIMnNRM63aJr3hH84TFBQ-Y}e18=Cg$|WnBMhd*_&^tLhSZ6q-GIl^EmnfE_ zb;I5=9&>nUA~x|&4f1@J2c-n+d^085{0rS?;&P9b11K3!Z^>FGzJudiHos+k7e_Gx zf|^t8P<xk)QA)mz3zWjRy}O<TmjYK9#Z97)Q|fB(v;MSCEz}WE>IFBUqf*LZuYXXK zr#y7j@tEpzJa!pE$Ln5;Q;Ntgt)qz64`G0iY$Aul9T<?;12Qw9D6t~~Jk^R1=)Aj* zpBZ<L=+Kk!ng(86>QgHY4v<sSB?9>Jl0s=ZqMR@AHL-!1JPics&^w0vh=lO57Dv^+ z(G07=Pe#v$I+9atFdL(ZP@{)@;%B4pm-vdQN9ug^dH&VtJ24qy@8O3{QO=7Qx1&Zh zBP{nyo6)JO<rfkW<Zyh7?FbX5gd30ZW*MFwjO;2wAE6`mGji<1y@dX6Bw4bLUm9(G z_mbW8X41cg$dK>xxYFh2l}tUppLjz9Vj7Tu26XF#0H@4*C!`GtA5c~Ybn}Cc@pF}w b|2H$_)%_@<uSwUIwAM{OP506pX}9$c_1&${ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/_base.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/_base.py new file mode 100644 index 0000000000..223ef21c87 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/_base.py @@ -0,0 +1,196 @@ +from __future__ import absolute_import, division, unicode_literals +from pip.vendor.six import text_type + +import gettext +_ = gettext.gettext + +from ..constants import voidElements, spaceCharacters +spaceCharacters = "".join(spaceCharacters) + + +class TreeWalker(object): + def __init__(self, tree): + self.tree = tree + + def __iter__(self): + raise NotImplementedError + + def error(self, msg): + return {"type": "SerializeError", "data": msg} + + def emptyTag(self, namespace, name, attrs, hasChildren=False): + assert namespace is None or isinstance(namespace, text_type), type(namespace) + assert isinstance(name, text_type), type(name) + assert all((namespace is None or isinstance(namespace, text_type)) and + isinstance(name, text_type) and + isinstance(value, text_type) + for (namespace, name), value in attrs.items()) + + yield {"type": "EmptyTag", "name": name, + "namespace": namespace, + "data": attrs} + if hasChildren: + yield self.error(_("Void element has children")) + + def startTag(self, namespace, name, attrs): + assert namespace is None or isinstance(namespace, text_type), type(namespace) + assert isinstance(name, text_type), type(name) + assert all((namespace is None or isinstance(namespace, text_type)) and + isinstance(name, text_type) and + isinstance(value, text_type) + for (namespace, name), value in attrs.items()) + + return {"type": "StartTag", + "name": name, + "namespace": namespace, + "data": attrs} + + def endTag(self, namespace, name): + assert namespace is None or isinstance(namespace, text_type), type(namespace) + assert isinstance(name, text_type), type(namespace) + + return {"type": "EndTag", + "name": name, + "namespace": namespace, + "data": {}} + + def text(self, data): + assert isinstance(data, text_type), type(data) + + data = data + middle = data.lstrip(spaceCharacters) + left = data[:len(data) - len(middle)] + if left: + yield {"type": "SpaceCharacters", "data": left} + data = middle + middle = data.rstrip(spaceCharacters) + right = data[len(middle):] + if middle: + yield {"type": "Characters", "data": middle} + if right: + yield {"type": "SpaceCharacters", "data": right} + + def comment(self, data): + assert isinstance(data, text_type), type(data) + + return {"type": "Comment", "data": data} + + def doctype(self, name, publicId=None, systemId=None, correct=True): + assert name is None or isinstance(name, text_type), type(name) + assert publicId is None or isinstance(publicId, text_type), type(publicId) + assert systemId is None or isinstance(systemId, text_type), type(systemId) + + return {"type": "Doctype", + "name": name if name is not None else "", + "publicId": publicId, + "systemId": systemId, + "correct": correct} + + def entity(self, name): + assert isinstance(name, text_type), type(name) + + return {"type": "Entity", "name": name} + + def unknown(self, nodeType): + return self.error(_("Unknown node type: ") + nodeType) + + +class RecursiveTreeWalker(TreeWalker): + def walkChildren(self, node): + raise NotImplementedError + + def element(self, node, namespace, name, attrs, hasChildren): + if name in voidElements: + for token in self.emptyTag(namespace, name, attrs, hasChildren): + yield token + else: + yield self.startTag(name, attrs) + if hasChildren: + for token in self.walkChildren(node): + yield token + yield self.endTag(name) + +from xml.dom import Node + +DOCUMENT = Node.DOCUMENT_NODE +DOCTYPE = Node.DOCUMENT_TYPE_NODE +TEXT = Node.TEXT_NODE +ELEMENT = Node.ELEMENT_NODE +COMMENT = Node.COMMENT_NODE +ENTITY = Node.ENTITY_NODE +UNKNOWN = "<#UNKNOWN#>" + + +class NonRecursiveTreeWalker(TreeWalker): + def getNodeDetails(self, node): + raise NotImplementedError + + def getFirstChild(self, node): + raise NotImplementedError + + def getNextSibling(self, node): + raise NotImplementedError + + def getParentNode(self, node): + raise NotImplementedError + + def __iter__(self): + currentNode = self.tree + while currentNode is not None: + details = self.getNodeDetails(currentNode) + type, details = details[0], details[1:] + hasChildren = False + + if type == DOCTYPE: + yield self.doctype(*details) + + elif type == TEXT: + for token in self.text(*details): + yield token + + elif type == ELEMENT: + namespace, name, attributes, hasChildren = details + if name in voidElements: + for token in self.emptyTag(namespace, name, attributes, + hasChildren): + yield token + hasChildren = False + else: + yield self.startTag(namespace, name, attributes) + + elif type == COMMENT: + yield self.comment(details[0]) + + elif type == ENTITY: + yield self.entity(details[0]) + + elif type == DOCUMENT: + hasChildren = True + + else: + yield self.unknown(details[0]) + + if hasChildren: + firstChild = self.getFirstChild(currentNode) + else: + firstChild = None + + if firstChild is not None: + currentNode = firstChild + else: + while currentNode is not None: + details = self.getNodeDetails(currentNode) + type, details = details[0], details[1:] + if type == ELEMENT: + namespace, name, attributes, hasChildren = details + if name not in voidElements: + yield self.endTag(namespace, name) + if self.tree is currentNode: + currentNode = None + break + nextSibling = self.getNextSibling(currentNode) + if nextSibling is not None: + currentNode = nextSibling + break + else: + currentNode = self.getParentNode(currentNode) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/_base.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/_base.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db377bd9f6f30329847976c754ec4a3cc2c93768 GIT binary patch literal 9344 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 N=@}bB-TNuz{sY|tD=z>5 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/dom.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/dom.py new file mode 100644 index 0000000000..a01287a944 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/dom.py @@ -0,0 +1,46 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.dom import Node + +import gettext +_ = gettext.gettext + +from . import _base + + +class TreeWalker(_base.NonRecursiveTreeWalker): + def getNodeDetails(self, node): + if node.nodeType == Node.DOCUMENT_TYPE_NODE: + return _base.DOCTYPE, node.name, node.publicId, node.systemId + + elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE): + return _base.TEXT, node.nodeValue + + elif node.nodeType == Node.ELEMENT_NODE: + attrs = {} + for attr in list(node.attributes.keys()): + attr = node.getAttributeNode(attr) + if attr.namespaceURI: + attrs[(attr.namespaceURI, attr.localName)] = attr.value + else: + attrs[(None, attr.name)] = attr.value + return (_base.ELEMENT, node.namespaceURI, node.nodeName, + attrs, node.hasChildNodes()) + + elif node.nodeType == Node.COMMENT_NODE: + return _base.COMMENT, node.nodeValue + + elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE): + return (_base.DOCUMENT,) + + else: + return _base.UNKNOWN, node.nodeType + + def getFirstChild(self, node): + return node.firstChild + + def getNextSibling(self, node): + return node.nextSibling + + def getParentNode(self, node): + return node.parentNode diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/dom.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/dom.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a71a7e7dbb9b59b7474cecf3090336e53d69989b GIT binary patch literal 2507 zcmd5;UvJ|?5Fgt~TBq$bSHuC=0umrDLR=q^5E42eLXtxjcTVM`^corYoOqLLy0(LN z6I!YFbVz&xJ`mrAcb<`$87ED|6XK;;Rnyto+1cN3{;cc#wO9T9Pum~D^2foy-@dd# zr>MmEYk>ktEa+R1*wD8jaiH&jMSC`=5+r5lmy5LnssjBAhzd+m*@CzPaT(M$Brfz_ zbizFsrd1eO5O2Y+0IvZq`a2Li(5-Ldm6CAO35D555e;;v=0=1vnPs^#<Pyt;)G|v= z4HxrN4zpN<N*a+zO4ltqT0-HW*^{&^Y-QBKL8OJLqSniWIFHn&$Zx5W>vu%`b5sNn zV<d?fku;`(6o)vIg1j77%HVhFB|I>+QIJCSG%3sr40vO~6!D<6;nIfu7>onc65Gox zD=fEQRD$l>dz;U=Fv4RM$S?R<m0fqpxZ%3Xf&Zq=y|UqI3}%o0?!k1Q()-$i)=#JK z%3*5_ZX7bv5|P}8{0~+R;Kp8B$o>{x^5o~=)_XCM!Hx22<D7`R%`xw@e83Tq={t1m zsJw~sUB>vKMQ7e)?|-v+$b=79gj?)-M19hwL+|q;42#qeNta9N)jz;ob5EpL?B4ZE z_}n=MXl`|yXV2SSFYH~MwnMMeYWq|jvsLVomD?nZ62T#6^MR7Xlb9F!S{sqz!bSI9 z`$dl<7z*5MHF}M(+ivzwI$mL>z~sc<1m(v_&4t-TbNgAFQ4j#WPf2aK10!Q{Il$i5 zY`+wEC3W;zn8s?0dYHoyN<E8);><rW)L{$0fzYXJ7%7if5DYI%1#?_pe48Ei*h7y= zq?;3|Vv4Ofc(e0-jgj)RG+-lb<dGRX*t9(L8{e-F(rB)d&Ir!DAH2@F$J4>sv``~f zC`HVIa!}AGt&S0ZMe+K49gL-!%m=}_OdD#Hi+DpD$TVn)!F(K?UYkjlw$nxM#qn3c zGdTz}J_e65TbI#T=wK#i!9t{QmIo7)s4o?I7##m!c>Hw`XUXyG+T6p-G53^~mN1c2 zn(C)NAyC$Vbz~n}HT%G-SVz{r<>LAwTFFwwovOq0Pj3J{BRv0<$zq~c?Mho*`;kQ2 zT!lIv@joK*F^aoQ0o5B*@bnhlBQ$722-bh*w}alPxH4Ud^OTO?D1xgRui<_6KN!;Y zV;1Ei<z{)K2resldW-JynqR$wI==^DNbgA)axaEqlErg{OaD`J@TmoTN{dh5!F5C4 z)nNMc+)-2MZ4?#DJ#-z{snc*S@sH+ao)dmFflou`Q_u1vbd{)M9Pr}1Kog1mZLs|K zNydK%3<@Z|3-q$#<LQgxJlAp|*8d<dfV<BFSMEtst8WOsranBfYxb_?+BN4N`ub6X literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/etree.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/etree.py new file mode 100644 index 0000000000..8d19f7db55 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/etree.py @@ -0,0 +1,131 @@ +from __future__ import absolute_import, division, unicode_literals + +import gettext +_ = gettext.gettext + +import re + +from pip.vendor.six import text_type + +from . import _base +from ..utils import moduleFactoryFactory + +tag_regexp = re.compile("{([^}]*)}(.*)") + + +def getETreeBuilder(ElementTreeImplementation): + ElementTree = ElementTreeImplementation + ElementTreeCommentType = ElementTree.Comment("asd").tag + + class TreeWalker(_base.NonRecursiveTreeWalker): + """Given the particular ElementTree representation, this implementation, + to avoid using recursion, returns "nodes" as tuples with the following + content: + + 1. The current element + + 2. The index of the element relative to its parent + + 3. A stack of ancestor elements + + 4. A flag "text", "tail" or None to indicate if the current node is a + text node; either the text or tail of the current element (1) + """ + def getNodeDetails(self, node): + if isinstance(node, tuple): # It might be the root Element + elt, key, parents, flag = node + if flag in ("text", "tail"): + return _base.TEXT, getattr(elt, flag) + else: + node = elt + + if not(hasattr(node, "tag")): + node = node.getroot() + + if node.tag in ("DOCUMENT_ROOT", "DOCUMENT_FRAGMENT"): + return (_base.DOCUMENT,) + + elif node.tag == "<!DOCTYPE>": + return (_base.DOCTYPE, node.text, + node.get("publicId"), node.get("systemId")) + + elif node.tag == ElementTreeCommentType: + return _base.COMMENT, node.text + + else: + assert type(node.tag) == text_type, type(node.tag) + # This is assumed to be an ordinary element + match = tag_regexp.match(node.tag) + if match: + namespace, tag = match.groups() + else: + namespace = None + tag = node.tag + attrs = {} + for name, value in list(node.attrib.items()): + match = tag_regexp.match(name) + if match: + attrs[(match.group(1), match.group(2))] = value + else: + attrs[(None, name)] = value + return (_base.ELEMENT, namespace, tag, + attrs, len(node) or node.text) + + def getFirstChild(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + element, key, parents, flag = node, None, [], None + + if flag in ("text", "tail"): + return None + else: + if element.text: + return element, key, parents, "text" + elif len(element): + parents.append(element) + return element[0], 0, parents, None + else: + return None + + def getNextSibling(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + return None + + if flag == "text": + if len(element): + parents.append(element) + return element[0], 0, parents, None + else: + return None + else: + if element.tail and flag != "tail": + return element, key, parents, "tail" + elif key < len(parents[-1]) - 1: + return parents[-1][key + 1], key + 1, parents, None + else: + return None + + def getParentNode(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + return None + + if flag == "text": + if not parents: + return element + else: + return element, key, parents, None + else: + parent = parents.pop() + if not parents: + return parent + else: + return parent, list(parents[-1]).index(parent), parents, None + + return locals() + +getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/etree.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/etree.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2dcf5b23a118788a31a0c35cb40457fb6254260d GIT binary patch literal 4626 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/genshistream.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/genshistream.py new file mode 100644 index 0000000000..f559c45d04 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/genshistream.py @@ -0,0 +1,69 @@ +from __future__ import absolute_import, division, unicode_literals + +from genshi.core import QName +from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT +from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT + +from . import _base + +from ..constants import voidElements, namespaces + + +class TreeWalker(_base.TreeWalker): + def __iter__(self): + # Buffer the events so we can pass in the following one + previous = None + for event in self.tree: + if previous is not None: + for token in self.tokens(previous, event): + yield token + previous = event + + # Don't forget the final event! + if previous is not None: + for token in self.tokens(previous, None): + yield token + + def tokens(self, event, next): + kind, data, pos = event + if kind == START: + tag, attribs = data + name = tag.localname + namespace = tag.namespace + converted_attribs = {} + for k, v in attribs: + if isinstance(k, QName): + converted_attribs[(k.namespace, k.localname)] = v + else: + converted_attribs[(None, k)] = v + + if namespace == namespaces["html"] and name in voidElements: + for token in self.emptyTag(namespace, name, converted_attribs, + not next or next[0] != END + or next[1] != tag): + yield token + else: + yield self.startTag(namespace, name, converted_attribs) + + elif kind == END: + name = data.localname + namespace = data.namespace + if name not in voidElements: + yield self.endTag(namespace, name) + + elif kind == COMMENT: + yield self.comment(data) + + elif kind == TEXT: + for token in self.text(data): + yield token + + elif kind == DOCTYPE: + yield self.doctype(*data) + + elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS, + START_CDATA, END_CDATA, PI): + pass + + else: + yield self.unknown(kind) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/genshistream.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/genshistream.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c81e558090c649a90732f1e9fa8c21f0b6d0f061 GIT binary patch literal 2601 zcmd5;OK%%h6#ni^V#lw<c{k7%D{si6QiX&HYDmmOYTPifa657}j6FBW)bns=uH6LL z8-ifNmIeF}{sDgiHY`|l!48Qv=bUjVAazac%$@VP=bp!Rk7NJQsDAg{a)wxZY<l1S z+(P~n5dr-vL_n<ID#R9C3$YE?hGLzCXbJH$+~tC|g)hM^Auhu$BVK{Kg17>=g18E| zTG%a#T@7vxaUE_QaRY7x@haR^#A|TZ5I5mA$$A+<3DG*@4Y(V`ml3QW+C;nscMI`0 z+-;Ippf~Vz2WJXF6<+~2z+-m@K@F#^I%N`adM!@QtkL2R@-&(l?S=6;&5T(gSrAUc zJWLbQBxaI?!!*!d6dIlRQQlI#b(xk=JASNNObL71J#e~)9k)A2ra|vV#}B;D!EyWa z<lwMv$|N~@c-Vb>(l$#(ciWG;tr8J(rtJ1Qr-miufXNz>h5Yd7pnG5{3su2c#GQO1 zZVw+GAGbT*kVAVJpEvMx9kN-A7sJ_4(=cd9I@XEFO_c-*<&cm4p)S~NrghJcMmigk zQa<eT1IED{L}+mPspC{xLI7cc2^-F-oH1l$PL7`;Z~B^u0GKOWeT*6KRN?5!dzf38 ziJwsg*+;l~OLQWfS-7#tsD`<XnT^lX<z4g=fE48BvWecytzZ6YD;@OTtz+3ric={} zr|3L~*GUsCjWCq6l-;Bwo#ZW6iXzw1nKWmd>1miwa_O_4Qt^Zm`xaS4mi!q}!MpwQ z&|FLg{a%<HL}!@}{y`1Gq<^Fblk@(`wYf->b~5eX*?*`1ARP2_0@&NsiIIP<^Zqy- z_vxS@&H5K6j_yWe!GS)L=H&fziu5APN#w`-<7)}i^BAL^$Jom^I4-NCnyRk$=&9QL z9x^^x>0vBMgMO!$Q9b)MmwUd1`7#&X03!=oL(P`Zr@EIgFJo5X_RUv>AYp|s)4YnS z2bh(qV@G02eXE1+!K}trq<&;yU{=Sh%95wlVp<i>EZn>NaG{{~kaQvH%_^XF5VZC< zgg-G`0ik?UV*2Wd0EI%Ru$-M*sE>c;7Y(63x+5bS3*N>ag-ra-Qh}!iW(~&EZ|Ge< zSBys5|H9D?LoNA5vL`QebceHFWK4u)ya=X@tZ-0UIG{Yq@pF~@AP(x{U?gYIsZ<BW z-shrR73KHpDv@N?7J7mFix9t2z2u=-H^ur#akb8---2D;5#<JGNSRHTEtqYX9hhC5 z6~+2lC9C597F){sat#Fg6J8luG7gKuu}30@<uYiZbm&Js9fbRPOvuon>6qlkPlnoI zJUN@Ztn<PXQ?RJxvAOR0=Z?%ro~pDVGbE9#M#yF*BT**UFpYU8Ic!*5N_}M<9+{#J z(xJH?YlnxU!_akjb~!vC9Uf~ALtZQ=$tX#mB`x;s?C^4nRh(8rE`=C{Ngzbv8(${& zIL+m4C_FyYHzo@Qd9jUZ;M`^>oZ&D{raCh^@Lt&P$Qv16rw*6!^%w}wHihygJ^6iF zpw?&v)K!JPCACT1p0#D&RvT)UzIAKYDs*+l)H*#oBxP!iY;3!jiQF8|V<>o@;K1|Z zG?+xhI{f1xXTD5dsQ+^)Iy?gz9yzzaq$;bO)-F+t*v}?rl5y-Lg2N4T<ad%$RgBmD zVVW%<&K?BI1qK-;0@hcevA{N&!QuZi<Q5Tl_}Z9U?n!ZDIL6ngW^#G&6>WW=Ym##T PZ(B{(Qu|iZ+OhuvrwA-c literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/lxmletree.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/lxmletree.py new file mode 100644 index 0000000000..66969ee352 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/lxmletree.py @@ -0,0 +1,208 @@ +from __future__ import absolute_import, division, unicode_literals +from pip.vendor.six import text_type + +from lxml import etree +from ..treebuilders.etree import tag_regexp + +from gettext import gettext +_ = gettext + +from . import _base + +from .. import ihatexml + + +def ensure_str(s): + if s is None: + return None + elif isinstance(s, text_type): + return s + else: + return s.decode("utf-8", "strict") + + +class Root(object): + def __init__(self, et): + self.elementtree = et + self.children = [] + if et.docinfo.internalDTD: + self.children.append(Doctype(self, + ensure_str(et.docinfo.root_name), + ensure_str(et.docinfo.public_id), + ensure_str(et.docinfo.system_url))) + root = et.getroot() + node = root + + while node.getprevious() is not None: + node = node.getprevious() + while node is not None: + self.children.append(node) + node = node.getnext() + + self.text = None + self.tail = None + + def __getitem__(self, key): + return self.children[key] + + def getnext(self): + return None + + def __len__(self): + return 1 + + +class Doctype(object): + def __init__(self, root_node, name, public_id, system_id): + self.root_node = root_node + self.name = name + self.public_id = public_id + self.system_id = system_id + + self.text = None + self.tail = None + + def getnext(self): + return self.root_node.children[1] + + +class FragmentRoot(Root): + def __init__(self, children): + self.children = [FragmentWrapper(self, child) for child in children] + self.text = self.tail = None + + def getnext(self): + return None + + +class FragmentWrapper(object): + def __init__(self, fragment_root, obj): + self.root_node = fragment_root + self.obj = obj + if hasattr(self.obj, 'text'): + self.text = ensure_str(self.obj.text) + else: + self.text = None + if hasattr(self.obj, 'tail'): + self.tail = ensure_str(self.obj.tail) + else: + self.tail = None + self.isstring = isinstance(obj, str) or isinstance(obj, bytes) + # Support for bytes here is Py2 + if self.isstring: + self.obj = ensure_str(self.obj) + + def __getattr__(self, name): + return getattr(self.obj, name) + + def getnext(self): + siblings = self.root_node.children + idx = siblings.index(self) + if idx < len(siblings) - 1: + return siblings[idx + 1] + else: + return None + + def __getitem__(self, key): + return self.obj[key] + + def __bool__(self): + return bool(self.obj) + + def getparent(self): + return None + + def __str__(self): + return str(self.obj) + + def __unicode__(self): + return str(self.obj) + + def __len__(self): + return len(self.obj) + + +class TreeWalker(_base.NonRecursiveTreeWalker): + def __init__(self, tree): + if hasattr(tree, "getroot"): + tree = Root(tree) + elif isinstance(tree, list): + tree = FragmentRoot(tree) + _base.NonRecursiveTreeWalker.__init__(self, tree) + self.filter = ihatexml.InfosetFilter() + + def getNodeDetails(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), _("Text nodes are text or tail, found %s") % key + return _base.TEXT, ensure_str(getattr(node, key)) + + elif isinstance(node, Root): + return (_base.DOCUMENT,) + + elif isinstance(node, Doctype): + return _base.DOCTYPE, node.name, node.public_id, node.system_id + + elif isinstance(node, FragmentWrapper) and node.isstring: + return _base.TEXT, node.obj + + elif node.tag == etree.Comment: + return _base.COMMENT, ensure_str(node.text) + + elif node.tag == etree.Entity: + return _base.ENTITY, ensure_str(node.text)[1:-1] # strip &; + + else: + # This is assumed to be an ordinary element + match = tag_regexp.match(ensure_str(node.tag)) + if match: + namespace, tag = match.groups() + else: + namespace = None + tag = ensure_str(node.tag) + attrs = {} + for name, value in list(node.attrib.items()): + name = ensure_str(name) + value = ensure_str(value) + match = tag_regexp.match(name) + if match: + attrs[(match.group(1), match.group(2))] = value + else: + attrs[(None, name)] = value + return (_base.ELEMENT, namespace, self.filter.fromXmlName(tag), + attrs, len(node) > 0 or node.text) + + def getFirstChild(self, node): + assert not isinstance(node, tuple), _("Text nodes have no children") + + assert len(node) or node.text, "Node has no children" + if node.text: + return (node, "text") + else: + return node[0] + + def getNextSibling(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), _("Text nodes are text or tail, found %s") % key + if key == "text": + # XXX: we cannot use a "bool(node) and node[0] or None" construct here + # because node[0] might evaluate to False if it has no child element + if len(node): + return node[0] + else: + return None + else: # tail + return node.getnext() + + return (node, "tail") if node.tail else node.getnext() + + def getParentNode(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), _("Text nodes are text or tail, found %s") % key + if key == "text": + return node + # else: fallback to "normal" processing + + return node.getparent() diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/lxmletree.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/lxmletree.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69a06c9b7943ce2d527cd33977a6e2270e069873 GIT binary patch literal 10348 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 ZOfJ7Dna1}eC=1o<{0sAw^VRv+{tdVCN?ZT{ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/pulldom.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/pulldom.py new file mode 100644 index 0000000000..0b0f515fec --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/pulldom.py @@ -0,0 +1,63 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.dom.pulldom import START_ELEMENT, END_ELEMENT, \ + COMMENT, IGNORABLE_WHITESPACE, CHARACTERS + +from . import _base + +from ..constants import voidElements + + +class TreeWalker(_base.TreeWalker): + def __iter__(self): + ignore_until = None + previous = None + for event in self.tree: + if previous is not None and \ + (ignore_until is None or previous[1] is ignore_until): + if previous[1] is ignore_until: + ignore_until = None + for token in self.tokens(previous, event): + yield token + if token["type"] == "EmptyTag": + ignore_until = previous[1] + previous = event + if ignore_until is None or previous[1] is ignore_until: + for token in self.tokens(previous, None): + yield token + elif ignore_until is not None: + raise ValueError("Illformed DOM event stream: void element without END_ELEMENT") + + def tokens(self, event, next): + type, node = event + if type == START_ELEMENT: + name = node.nodeName + namespace = node.namespaceURI + attrs = {} + for attr in list(node.attributes.keys()): + attr = node.getAttributeNode(attr) + attrs[(attr.namespaceURI, attr.localName)] = attr.value + if name in voidElements: + for token in self.emptyTag(namespace, + name, + attrs, + not next or next[1] is not node): + yield token + else: + yield self.startTag(namespace, name, attrs) + + elif type == END_ELEMENT: + name = node.nodeName + namespace = node.namespaceURI + if name not in voidElements: + yield self.endTag(namespace, name) + + elif type == COMMENT: + yield self.comment(node.nodeValue) + + elif type in (IGNORABLE_WHITESPACE, CHARACTERS): + for token in self.text(node.nodeValue): + yield token + + else: + yield self.unknown(type) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/pulldom.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/pulldom.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d26b81ede9a09e4ace0983bc70d116bf9b5cf07 GIT binary patch literal 2520 zcmd5;OLH4V5boL4)0Q2Rn1>;Nijyw5C<+QH6&{Mc5Ld-YYAvEdCD*djj-8G6A@9yQ za+P!l=FW)=7j7Il@Ef@B8{j8UT=@fh-IDEuKM-tr)ZNq5kLj;_Z2z;i^21-2JEG-} zjqlIDu_%8EBEUycL=-FPD~c`ZTNK;Ww@LAyMNx_3GWE+8SEyg1xJvyh#Wm{JD6Uh# z4n3QK5=AQ%uTp;%e3^m@MGcDAsJ{ljN_v$ZuhWsDphn*jofCcCU#Fl>2dx!E5prlP z4$NG`;t%sQDvb8Rc#>wu)F2DO(=ZRy#B6{ml5ms;+KWP?Ge62(Wj?xw<)GVkyPk8; z*>^f!vkHmR*}dee;CJrt%ibpFy)QfW-S(Y(j@P@p*L4maw09iC0qxvvyX~E>;~s<x zY>OAePQ0O?>(IKCH9(!FVc<kM)``jGbT`ww=SO3mU0ymHxWkwJItWdC*SKC>1+E(f zV8SN%pv9I)tjx|T%<!Q)Bv7Brp}9rVA8AJPSkdm`_cXU@1|vk{I%Pl6Oq9ko%6CPs zXbU3nyeG~s_`{{mglPJi7_?YpX4AO^%PpFhXjY<!3JZX+g*uNd$|e_P5YEYjKRsB$ zDFk-%3iYl6`29k28NlB({p89IA{IZZmwrzEgsC?!GC($EWdvL2ioR6@FF11`#qLO5 ziV|+foK1AW5OLy(IqUkz#ceQqQFN4Mu@0KM_xGFn6vb)gCewa=tH}jx>P5wxPeSu3 zEll$noV3I&FP${eMmUtza6L>q*2$vG5B;dnPL`$F0)MQR>*&ZZD8l0;&9qk}CX58Y zlT4q6X^{(zBp#u}UJD0EmOKL$+!`Dss$w|kg-JU)%5?AyH4Kx%t{xW0g9m2_J#muL z!TZ}E4eo`*L5_xacjAx6{;|#nlW;OX;z61X9+^1$FoFiIKtB;|V!w!@AdR;tXA+_3 zaXWb)ho8U0A*l*}H&jF2#9CKds*LYVwE}(%(uNvw&vL_XX9-lF0;(wYz+zl7fNU~= zCUElyg9(_OmxX{rg&TifrKv-xGw<S4=IMZf?;dW`ye85L&1x)SwnmSuG{Xl3u!^-t zM;6^a`2xr*ld03VLfLOL-4~>-&<v;H5hpBaOn$k9WQqIbyaYc0V4Y@l0R7}w>YdCL z_txsw!E+m1$<LBXLsEH-TjD>dES*;=TNqed8UV&&c&-vH2G+&E$KvCfWVgYo!GR<D zFOj*<32_#wn!YDl+_+MFF5E-aOV&kWlMjoXfLnye$f8ABFN1WsOj6?nW3%JOS}>Y` z$blC9mAfY>kHXx@1oMr_!XZX*F7mNH%VqE$Ytz2i>cEsh_>}tq7f%$WBR^vEE_32g zFPl=B-1wP6hq}^I+)h9z^D@5$Lut%&RIG8V(qk@by1c#UMLji!xgr@S>61jB5SJeg z_xgoS!aCvw(?JNfwjeltj_)#k$%0c}WXqI$0}3y^EnR-n-o{`40Tz;$tD_MsXuxag zP2p{2tG86cdev%Rrw$oYo7Q!1QF}4UcshC>=j(Y=U(buvpoqY_{0@qrt88E7ByxG0 z@VlLJ^(v}<qtoKjF2g=5Oo6fLxe$@d52edkmwy|kakMStY%$gZ^nx^j*E1lJvwSB4 lgHeik?&Iwi(2D>6$5lwn++GywQ%*JKm~UDwd&AnW{{=a$G?@SZ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/__init__.py new file mode 100644 index 0000000000..a8cca8a9ac --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/__init__.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import, division, unicode_literals + +from .py import Trie as PyTrie + +Trie = PyTrie + +try: + from .datrie import Trie as DATrie +except ImportError: + pass +else: + Trie = DATrie diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50ba945377db71d6da0cd10e18f93fa884686296 GIT binary patch literal 479 zcmYk2-AcnS6vt1}uA7tTgkAaoy>S<U2qNOZT?ith3eysZ?UHR_X<E{B&<F7yz4rw? zDH9Fkm;d<)=Og$Y4L`qVvVz0u;d}o<p%y6c3IZCSAdnI$D5MmM0MY=6pdbR!Arw7G zBOo$@v<K}34uO6b7ywzCGYI7o?1o_9fe>Q)@FoX7TZHfu`-;j}j{}4|MPzwh>c&Z~ zimJ5E4bUglUe&5JZj44_)T$JcYvrWPbgc+FV-FW1UagYP@z9$doUa?#Sjl;U79>6| zp$O+uwMkbvLcM7HSLdb3+^>9?b>3t2K6VYwtu1YgCj6nsHG#Nc8|Ai5&X&r|^x8`C zPvy$62bnh;wrJh9G;_0Om(y$Zq;gi{Bo|e-+GQJAvr1KLFO4WI+qyzuY0U8LFwT`x gj`L~Nc3ZhEO3`R}=SQkf5a)DEBN~ti8Ih3w0D?(uga7~l literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/_base.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/_base.py new file mode 100644 index 0000000000..724486b16e --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/_base.py @@ -0,0 +1,37 @@ +from __future__ import absolute_import, division, unicode_literals + +from collections import Mapping + + +class Trie(Mapping): + """Abstract base class for tries""" + + def keys(self, prefix=None): + keys = super().keys() + + if prefix is None: + return set(keys) + + # Python 2.6: no set comprehensions + return set([x for x in keys if x.startswith(prefix)]) + + def has_keys_with_prefix(self, prefix): + for key in self.keys(): + if key.startswith(prefix): + return True + + return False + + def longest_prefix(self, prefix): + if prefix in self: + return prefix + + for i in range(1, len(prefix) + 1): + if prefix[:-i] in self: + return prefix[:-i] + + raise KeyError(prefix) + + def longest_prefix_item(self, prefix): + lprefix = self.longest_prefix(prefix) + return (lprefix, self[lprefix]) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/_base.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/_base.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a74990b8a6d5e89904e95d9f4d6d72f2dfc0862 GIT binary patch literal 1973 zcmc&#?P?r16up|+U4O)m-MA%~Hn0#vhCm%Cm_S=f(>nRnc1dRgA<HD{?2L9Td%i4b zTpOG}bzY(GnE!c!o~s$0j|ZriUCot7(mm(gBW?J8bN%0UL7Y+l3Gw{-uYl}R1UbHf z3ZhcbOi&rnETA%^SxAE41yl^E9MWuven@Ia3qkpS-V$9By_}6GAJQ}$VJpr1N4&e+ zLX*yIU9?U~T{g9GZWUv>KGjy&mD@(At#nrBN*3BFlNL4-ymST4A8FI*YUu`upBt^N zpa&TEg`w{wP{fD<5{Ll;G~R;4fH4Cd00S=vfavkgRw(X}ws)}n@!UF-W^O!Btr}-V zYVCMYo3TSen{g&iKg91>&iE$+=Sd$4rv4_N3!nXXmCQYIAzcJ?DQJplN!&Sj^)<c0 za7af3o{N{}A$MN~bn?*8^^_+OCvn`^wo%5@K33<}2a~!|*b?uQbL;$csd4si?G7Ub z=qFiKEF9OMF>0aDVh$b4c^07|-&n3s{(Z8<%66W-(ADE&VO0K6G}l#fpyur|d3Np& z>*`5$ntZqSDEVE_6N@T++oaiXx>Po4bd#K_Dz8m)=*nWhzzh~Hk*wxkbM7ImA*1EG zlh_J2#CqsuWitHpvhE=`yH6KHM_$~6SG!)?fFN@(+9tVxrYD>90zyoC&6vAS5_6W` zDy{M|K82f<cVf(n#W#2cr-Z84C5ZbH`43Yoxw4YWC%a<Z!gw#zj@S~b!Iel%(TnsN z0knWf$0IV^98b@FU^~L}sB@<i;@g*OyK!$$c<{!!U-ZClzys5h2N2S`7mobLdw3eL z-zS<a)16>;qe-h}=e<Hz{`~%?&Yu`lo6oi7b^6+ry@~8a4XoDnn(ku6ZlEEtAqK%% zd?7YJ=z3*7z6LtybqeyC#@C<T-32_?dyVPEU!nP&H(ypoSH^2&zrz?lVJ~r1%exr1 z>>!*yF^TvT`VvZ6rKOV6-z8F(b>0@-WhzqUbtYxZad)=(p7zY++lW4J^wIx(qc9o1 z*esvvkr)LVYilcO>ywD#_H-7lYYphc7^2wMjh*fI2FU87P?^KukB!*^F>iRSlzc&c Q>`L$xgY^abCfE-D1E4L=Bme*a literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/datrie.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/datrie.py new file mode 100644 index 0000000000..1c3b43202c --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/datrie.py @@ -0,0 +1,44 @@ +from __future__ import absolute_import, division, unicode_literals + +from datrie import Trie as DATrie +from pip.vendor.six import text_type + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + chars = set() + for key in data.keys(): + if not isinstance(key, text_type): + raise TypeError("All keys must be strings") + for char in key: + chars.add(char) + + self._data = DATrie("".join(chars)) + for key, value in data.items(): + self._data[key] = value + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + raise NotImplementedError() + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + return self._data.keys(prefix) + + def has_keys_with_prefix(self, prefix): + return self._data.has_keys_with_prefix(prefix) + + def longest_prefix(self, prefix): + return self._data.longest_prefix(prefix) + + def longest_prefix_item(self, prefix): + return self._data.longest_prefix_item(prefix) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/datrie.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/datrie.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49beb4d05a70057a8f6b203e3b30ccda8741eac8 GIT binary patch literal 3185 zcmd5;ZEG7x5T3i!t7A7#-K24oHl|Q22=#|TDTGie$N5kwB3uHd;==Z%TiGk$i+sE1 z${>GeoxjjO&|lZ@{R4ewPKujCOCeB2x}BSSyP0R_+1U;L*xLB@cRw7{@)zL!?T<d$ z36unnM=4R}(a@vJr=d?-K*NAM?(->aP}ZbjtF8x>wkhk-u!DL-`n%G<fqIkl22DIl zTJ(zOis*-7lae+)?{#3xu>BrecQ+y8kuB27X=SomQ98#%5_4{>DRQ@sN|l>&k!Y0~ zr^`6CJ&&h0AYPP4*R?J;>A6$xVx|ob2-(0GMSecy0b`AzXkv&!1?PYgxLFAp1S>!j zhytG*qO>UK5>UOu+H{tvhG=O^?*=6uQEpK9yte@ZV>Z`9X`nn|v%f)cvJ{s-&7aZ2 zqp8O$bNKRrE(3BtEg%EB!r(`Y4qjb(^ovJ1(fl6w9=_b6%LXlcnl@?C;BN1%Pe*5W z=*YoEw70nz?RXYMszdY7#Z<R8wM&uD)-Ew057D&4AAWrHGaV&_@bH=qs=JW=G~GMZ z7j`eJtlJyuJ?l!7AKMCjBp~4|k=0Hj!9yKGN7!=f;(V+_2Jbj9FA$TbWr^VOlsHM? zEs*y)d@_4lnA|ndrjppjq9N9q?eRDnVRbqY<@JE^NnBd_AZ$w)x5(V{IIVOKQ%QuK zLQ5V+$Htvhqv*)w{d7|5<S*LD<k6uXRmah@3wKiFPxJHW%l)sT@69N(aOI0xJU)$& zwT)(G7M<%nDaz=?W$9NbMqp)h1jq2&pIr!nl`^?;O7W7|_t_P%>+N_q@!#@p`**!v zPe{T<;UXm2f&yZ2T!>CvhzApSATr#9+T)?&dn|5o6=gjT*%_tA*q|}Ot<)XVEjvfv zn0@B*1}t!&VF@!=uy}w3Fx7btPxdXtTOYDEtSbeNl-h;*cTnu%>sZwr8e3HM4tLeD zayzUR?z?Q3>P+WOCqn-^kn6?QfomWqGO1Gcp|1dPFjhqX-atdmL{M^f6*Gy@J4HqI zQ>kO^IAbXF;NLLuX;NbX69Efpas`aB3kgHcIoBIaQq`=~6Ej~MDaEBv-xiqr0ADzX zt>Rp*enK)-OI(6ovdTTij<S}l5;7k@L-|Ke{+IYU29g#zlC^u+0Din&*|!78+2u`u zyq~jc&W7s^<0tU%A<7cvpvU=Qc`D{{rj?SLf>K$LR4J+<Gc&x+;zJgkc*Bn%<X9gR zxt1Lu{0MmsLpE{EQ_=qCQ(mr@e7TX+z2$W`yFvZml=q;=iD?ORQn{*RplG5{awzXP z$u0H0K|UAqZ9({pTgHBU%h<POUf-nTel&`4<Ki=_fAEB_PwQO-3F_lIjNdRU+kv?6 KZ+qMRcJL?88}n5F literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/py.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/py.py new file mode 100644 index 0000000000..f2d3641134 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/py.py @@ -0,0 +1,67 @@ +from __future__ import absolute_import, division, unicode_literals +from pip.vendor.six import text_type + +from bisect import bisect_left + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + if not all(isinstance(x, text_type) for x in data.keys()): + raise TypeError("All keys must be strings") + + self._data = data + self._keys = sorted(data.keys()) + self._cachestr = "" + self._cachepoints = (0, len(data)) + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + return iter(self._data) + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + if prefix is None or prefix == "" or not self._keys: + return set(self._keys) + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + start = i = bisect_left(self._keys, prefix, lo, hi) + else: + start = i = bisect_left(self._keys, prefix) + + keys = set() + if start == len(self._keys): + return keys + + while self._keys[i].startswith(prefix): + keys.add(self._keys[i]) + i += 1 + + self._cachestr = prefix + self._cachepoints = (start, i) + + return keys + + def has_keys_with_prefix(self, prefix): + if prefix in self._data: + return True + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + i = bisect_left(self._keys, prefix, lo, hi) + else: + i = bisect_left(self._keys, prefix) + + if i == len(self._keys): + return False + + return self._keys[i].startswith(prefix) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/py.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/py.pyc new file mode 100644 index 0000000000000000000000000000000000000000..849449d6243301b215fde11533df68cd5247edb6 GIT binary patch literal 3388 zcmd5;O>Y}j6uoaecI?oSl710dXebi0ga`-;icnS2FBS*|G^wbtj2>gpb27<z?9O{G z2}(A!Yj*qwB>ojU_UsYo+=-JEv0{NqJa6v2&wK7Y@7~+^<NWf^zemYXj{h2XfBIb{ zegq-I&qyIMHqtXPj-(gKxFNlU7>-3!#4>J5uUUULq-e=_NqS58jwNeK(Ux&Xddv83 ziCdPDk!(qxi#!wgrq_|IEnD3Vj>>s{m#2pnH0i)kidk?rA5SM$2yOIb`P1CzlQLYu z$E?hUlg!y753WiJ-!)vyor2pBHXKY{-SrZ>2Dx{`U<)@2Ip@_QF{DRT?vf^i69Yu} zxJLtg4#5d=11dBIbQps|gUBfWVnc<dWU&e@!UOK-Fj!lFnbSIwY;}oX$j$i>=Y1Zs z2O+4HG4asIuAyZfJj2U~e@6lijVS+Uq|_OQBDNtRKAnwGc0z}S3eX{zu*3-%8b#U( zWdx=s)XgDnKs91Ko@%@S0egIVNsbKl!P0=$k$i2Q04-N?&1RRY!ZI3oqVypxhb|$Q zdVr%F?_;INeiw~sQ&Z`a{&pUAW`q9Yyu4eCDwmy+26@?k;0Ckp{#OTKXHq^apY}i4 zxYhq6AM`yu{O&Xz?xow#_ow-^|J0S)r0Va4aq(e+839i0PY*Vx2c87Dz3oc3KdtW2 z^`1JlWcDgvcZ*_u&mH*n@yv(yfm`=jS#J9o#*PW71R|icC}3j|&R1GJ0;3*Q705^% z+AIxeXhHJmaarAYGT9E(;f}-hfqNCM4ClB=d#97U48As)I=~epJ&Ic{#A<rGtj)_j zSWD-6YAfctS&2I4vgw!;;?kN*-188?5|CyWMrxf9guYL>TmdGlkkke+&0?^r;q4G% zBL!ovy$Fqz6k_xq%<sYpD$*aQ^zxjgeZsI)LsO81wirlDIN2hamDXPQw`i1cjGg}r zL~TVxb*x=G1BrB-Kk6V}>6&vO-`d<g|3JFrGG;EuJ=D?KZ5M!NZ0&V?&Iv~>^d29@ z^Ctu#L4@6Fi@&L|kv)WD$jZWV)qBhWr<BC>T@CcRG2?qR(XpoVBRRqkxuJDDoA(nd z8}clc_$Zd6rj%D+7)FFY9>5VuJV#hs=Z^UefGX85a)=AQ|M7g=rmRr|y&=_a9NcZ6 z8G};h5ZNe_TR8E_ukx6Rz$VC9_%-J#sj1s)&fly<F#V|2fU<LQQo7`2bZG$bE@<LG z(y4;~9=Rl8p^&`7hH+Hyr%p|?tV;{m(T72LTDeia4~z)L6MgOE8nSgaO;~xt$hQ#2 z=*c&5y5?aqH_iEI)vTBs(G`uqakOSGnU^82L>h^if%qteeu7XNxQ@itMdt1;bnVu( zf&W31FV#cw8JfWU@G?Aph9+Q1xhgQt$q*=l&Qn&jxEopVgCK8g9nXtF37qyq&}1&v z=%U_yRLxxSI=lYnHhQ@B9U*;&TFz;iqTWkrmSmmHn{3`fvk)JJOE`Ha^_Dr_l76-( z)ko;}%mo6E#p<_f(Q0%V@@AKmI?k?TI(F77g{>V=vRQ%8gu5mT;>lGujD5*#Y_754 z^5ktar;t_p4=XAyj_FBHKebG!(`nTI=dNyc8S0K9jb>q15fZv2(TL3J7Pt&W+eTfq zZTNg&3r4M->bhKSZ(TqQQeT(jC|^;p-Mi2Fd~x8_b+>D0-6163MswX<i16R|3*uDr A{Qv*} literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/utils.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/utils.py new file mode 100644 index 0000000000..4e8559db6f --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/utils.py @@ -0,0 +1,78 @@ +from __future__ import absolute_import, division, unicode_literals + +from types import ModuleType + +try: + import xml.etree.cElementTree as default_etree +except ImportError: + import xml.etree.ElementTree as default_etree + + +class MethodDispatcher(dict): + """Dict with 2 special properties: + + On initiation, keys that are lists, sets or tuples are converted to + multiple keys so accessing any one of the items in the original + list-like object returns the matching value + + md = MethodDispatcher({("foo", "bar"):"baz"}) + md["foo"] == "baz" + + A default value which can be set through the default attribute. + """ + + def __init__(self, items=()): + # Using _dictEntries instead of directly assigning to self is about + # twice as fast. Please do careful performance testing before changing + # anything here. + _dictEntries = [] + for name, value in items: + if type(name) in (list, tuple, frozenset, set): + for item in name: + _dictEntries.append((item, value)) + else: + _dictEntries.append((name, value)) + dict.__init__(self, _dictEntries) + self.default = None + + def __getitem__(self, key): + return dict.get(self, key, self.default) + + +# Some utility functions to dal with weirdness around UCS2 vs UCS4 +# python builds + +def isSurrogatePair(data): + return (len(data) == 2 and + ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and + ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF) + + +def surrogatePairToCodepoint(data): + char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 + + (ord(data[1]) - 0xDC00)) + return char_val + +# Module Factory Factory (no, this isn't Java, I know) +# Here to stop this being duplicated all over the place. + + +def moduleFactoryFactory(factory): + moduleCache = {} + + def moduleFactory(baseModule, *args, **kwargs): + if isinstance(ModuleType.__name__, type("")): + name = "_%s_factory" % baseModule.__name__ + else: + name = b"_%s_factory" % baseModule.__name__ + + if name in moduleCache: + return moduleCache[name] + else: + mod = ModuleType(name) + objs = factory(baseModule, *args, **kwargs) + mod.__dict__.update(objs) + moduleCache[name] = mod + return mod + + return moduleFactory diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/utils.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c2832925eb1310225f22a2c08db6189a4d5c68a GIT binary patch literal 3434 zcmc&$-*4PR5T5m2E<c*IA+-5{O0iObu8`)T2vw@uLTQ3j2}0#m3WO`hXYbu@;<K;b zb=s8VsTFNsctGNj{|gBuUU}yafN#dvUQ*uElW)8`JG-9!=G&RA{WCN5>)&1w)9^Qj z_h&zNWPd{=!J{Z8>MPn-)c0uHqkfIHYovJ0qqI)_G1?v@wLdTBHA)+_Gfq1bv^_~% z*+r`BDcYT)qDxB2ESQ`UlW8`|6n&G_NzYJ6Q8GqPiJlOByM3CH26wj4P%<u!SxP3P z@fIaD+H6k3L&I)2YY^@XMAWu<S~?w?{va=$n}9Acd&ZhPbF=7_nThj6hpBP8h*H~B zJar1<t2`-FeQ$rDH^lNQ?Rt5#X6ztxaZeYo5b|LBIU{rt4Gjn3Hl)W+0j;Ni3Jp&@ zty8esti!Gx;6rOBcK$=-dj1vP4s>jy)E^Z2Ko`zvdu?jU$M5URH<@uJa`1V@-_`rp zcfH8@QK9|RSZ7y!tDW`p!gu8$)mBF0Jln%MI`LgD>-5Xi84On|*xZleSX*ndt{-Ll zex7MR?_g!^1B$-IN2QY&rfae&l{NTtms7I~)Ao*r^M!V0k+DPC?=vpE++LKHx^ljs z_&5C5k!$|gT<+xg@`}IQj*8_=*YJA0e0ZsHGx<&i@B24y@c859YNcC#qB{}xP%ZC2 z?3uXd$5H0DHSZrT6nWY0i7PKnBj*a!M*LT0?U+N=82)c_$bLbmOLXYbqm&L5t=&(k z<<Vh{4(sHI4r=s7k;CJWtC6cyr%t;KD!!*jS9x^p{t_LI(Sb)hka%F>@f`KwCT%^K zc{x%$Ix<6BP7cKZz5r`aP7gZaBvWToNVw5t7UGK#AfYrEf5#_M0_~Xaog#m%GXMbh zi1^JLj0OXpB{C-g$%OY|$UF)|(QY8#ZXA|FsG2-WMyyUd@(rPZn}$B*HP$m=sjb*# zQD2LVgj!T=-GnWPu-FDA*IHeWyKJ|%Om-{n6goN5YMZRJrrTw=b$1^pD_hU@T31%D zw!Sp&mc?q92T{Bmb+v5`%%HW0?c_zP=lba<DJ)87QoB0X57@s&{4JkmsyEcz>Vle4 z?|2JpR!P7)=!~KSd>#$Nbw?3nFLDPF;Pk;Ke?wA7aEh%M&#rdCX}p`fNWd9I)HsB1 zV6Tqd3PbqBV29xc=vsD+ROO8@V?vBLLI^ceC=C0O%FyM2hhdV(VJN@_3s8)9BCV4P z9S4QCWaUVnYIxJ9V-5oU*;5Hv4-Gzur~=5VigrE9yL=*{K~h~}ZH;!v{;$PBRY$aA zm2Km=?NB?;wwq1HZo@F7Qb!E^j@G|_K(J4S{^agoLplf(Qk}^=FOsTs@TQW;MI%&C z3{a_f#%`8Hk#{4f??$G$40i-yQgdoW3BJ6)R|nz>`-}W05RU*|OzL!YVW@ot-QvO_ zfM=vQJ{tf@9Yu;)9U&!n1m|H`ot}5ml0+2uq9R1*coPswsyGVJz5F)n{~$M+`xp)m zv075+Mp!XkHLe!C7wq|kqGv?U6lZ!s_Y>;J5EZuE5R949jPZLs?*$rw5~M}00bMW& zv_;x4n#^G^8Txq?oot55JnEysJO|}bZ|-md-K9;YzEmYtsOJ(jPGcVZtfUatX$Ozg zB78%k9#s>sqqUiEabdSMN(d??p}cRyP87Sm*tf6stD?X;1Q({vx+sfvz-cjH7=t6} zh6@Dp3-7udfc|<kwH;Yq-KC^XL`Bz%-R?tf26LDqCkRPO3~;lsLKw+bL(e4jRcY*Y zgxi-;=j0C744kaK{zZk<r%>3l5Tq8>tT*FLs|oz)P;;h+$(XqiTw?JNM8)-y?nCHK z&VTmwnE%6VTxTyhXrvn6+?l2XqpBI55;r@Pkbp-6PJaP=U)?@%AF)CN$My74KV8+X z(0VmqPjw#|@g6#2DQdYx92;UhhZm2qGGXT3kvsZ2vRC2G9b5P4vTS*zFSR;gP6roQ p_$*c+M%m?r$ufbDU$4-<$+%fY^}ILh)zmz0CiAuV<;lk6<bT9ZK}rAs literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/six.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/six.py new file mode 100644 index 0000000000..eae31454ae --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/vendor/six.py @@ -0,0 +1,404 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2013 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.3.0" + + +# True if we are running on Python 3. +PY3 = sys.version_info[0] == 3 + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) + # This is a bit ugly, but it avoids running this again. + delattr(tp, self.name) + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + + +class _MovedItems(types.ModuleType): + """Lazy loading of moved objects""" + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("reload_module", "__builtin__", "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("winreg", "_winreg"), +] +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) +del attr + +moves = sys.modules[__name__ + ".moves"] = _MovedItems("moves") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" + + _iterkeys = "keys" + _itervalues = "values" + _iteritems = "items" + _iterlists = "lists" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + _iterkeys = "iterkeys" + _itervalues = "itervalues" + _iteritems = "iteritems" + _iterlists = "iterlists" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +def iterkeys(d, **kw): + """Return an iterator over the keys of a dictionary.""" + return iter(getattr(d, _iterkeys)(**kw)) + +def itervalues(d, **kw): + """Return an iterator over the values of a dictionary.""" + return iter(getattr(d, _itervalues)(**kw)) + +def iteritems(d, **kw): + """Return an iterator over the (key, value) pairs of a dictionary.""" + return iter(getattr(d, _iteritems)(**kw)) + +def iterlists(d, **kw): + """Return an iterator over the (key, [values]) pairs of a dictionary.""" + return iter(getattr(d, _iterlists)(**kw)) + + +if PY3: + def b(s): + return s.encode("latin-1") + def u(s): + return s + if sys.version_info[1] <= 1: + def int2byte(i): + return bytes((i,)) + else: + # This is about 2x faster than the implementation above on 3.2+ + int2byte = operator.methodcaller("to_bytes", 1, "big") + import io + StringIO = io.StringIO + BytesIO = io.BytesIO +else: + def b(s): + return s + def u(s): + return unicode(s, "unicode_escape") + int2byte = chr + import StringIO + StringIO = BytesIO = StringIO.StringIO +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +if PY3: + import builtins + exec_ = getattr(builtins, "exec") + + + def reraise(tp, value, tb=None): + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + + + print_ = getattr(builtins, "print") + del builtins + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + + def print_(*args, **kwargs): + """The new-style print function.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + def write(data): + if not isinstance(data, basestring): + data = str(data) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) + +_add_doc(reraise, """Reraise an exception.""") + + +def with_metaclass(meta, base=object): + """Create a base class with a metaclass.""" + return meta("NewBase", (base,), {}) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/six.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/six.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69a37c55e76f2ce7f5e2c1f605700961b148af9a GIT binary patch literal 15686 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/wheel.py b/PythonEnv/2.7/Lib/site-packages/pip/wheel.py new file mode 100644 index 0000000000..bd22a89f4b --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/wheel.py @@ -0,0 +1,335 @@ +""" +Support for installing and building the "wheel" binary package format. +""" +from __future__ import with_statement + +import csv +import functools +import hashlib +import os +import pkg_resources +import re +import shutil +import sys +from base64 import urlsafe_b64encode + +from pip.locations import distutils_scheme +from pip.log import logger +from pip import pep425tags +from pip.util import call_subprocess, normalize_path, make_path_relative + +wheel_ext = '.whl' +# don't use pkg_resources.Requirement.parse, to avoid the override in distribute, +# that converts 'setuptools' to 'distribute'. +setuptools_requirement = list(pkg_resources.parse_requirements("setuptools>=0.8"))[0] + +def wheel_setuptools_support(): + """ + Return True if we have a setuptools that supports wheel. + """ + fulfilled = False + try: + installed_setuptools = pkg_resources.get_distribution('setuptools') + if installed_setuptools in setuptools_requirement: + fulfilled = True + except pkg_resources.DistributionNotFound: + pass + if not fulfilled: + logger.warn("%s is required for wheel installs." % setuptools_requirement) + return fulfilled + +def rehash(path, algo='sha256', blocksize=1<<20): + """Return (hash, length) for path using hashlib.new(algo)""" + h = hashlib.new(algo) + length = 0 + with open(path) as f: + block = f.read(blocksize) + while block: + length += len(block) + h.update(block) + block = f.read(blocksize) + digest = 'sha256='+urlsafe_b64encode(h.digest()).decode('latin1').rstrip('=') + return (digest, length) + +try: + unicode + def binary(s): + if isinstance(s, unicode): + return s.encode('ascii') + return s +except NameError: + def binary(s): + if isinstance(s, str): + return s.encode('ascii') + +def open_for_csv(name, mode): + if sys.version_info[0] < 3: + nl = {} + bin = 'b' + else: + nl = { 'newline': '' } + bin = '' + return open(name, mode + bin, **nl) + +def fix_script(path): + """Replace #!python with #!/path/to/python + Return True if file was changed.""" + # XXX RECORD hashes will need to be updated + if os.path.isfile(path): + script = open(path, 'rb') + try: + firstline = script.readline() + if not firstline.startswith(binary('#!python')): + return False + exename = sys.executable.encode(sys.getfilesystemencoding()) + firstline = binary('#!') + exename + binary(os.linesep) + rest = script.read() + finally: + script.close() + script = open(path, 'wb') + try: + script.write(firstline) + script.write(rest) + finally: + script.close() + return True + +dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>\d.+?))?) + \.dist-info$""", re.VERBOSE) + +def root_is_purelib(name, wheeldir): + """ + Return True if the extracted wheel in wheeldir should go into purelib. + """ + name_folded = name.replace("-", "_") + for item in os.listdir(wheeldir): + match = dist_info_re.match(item) + if match and match.group('name') == name_folded: + with open(os.path.join(wheeldir, item, 'WHEEL')) as wheel: + for line in wheel: + line = line.lower().rstrip() + if line == "root-is-purelib: true": + return True + return False + +def move_wheel_files(name, req, wheeldir, user=False, home=None): + """Install a wheel""" + + scheme = distutils_scheme(name, user=user, home=home) + + if root_is_purelib(name, wheeldir): + lib_dir = scheme['purelib'] + else: + lib_dir = scheme['platlib'] + + info_dir = [] + data_dirs = [] + source = wheeldir.rstrip(os.path.sep) + os.path.sep + installed = {} + changed = set() + + def normpath(src, p): + return make_path_relative(src, p).replace(os.path.sep, '/') + + def record_installed(srcfile, destfile, modified=False): + """Map archive RECORD paths to installation RECORD paths.""" + oldpath = normpath(srcfile, wheeldir) + newpath = normpath(destfile, lib_dir) + installed[oldpath] = newpath + if modified: + changed.add(destfile) + + def clobber(source, dest, is_base, fixer=None): + if not os.path.exists(dest): # common for the 'include' path + os.makedirs(dest) + + for dir, subdirs, files in os.walk(source): + basedir = dir[len(source):].lstrip(os.path.sep) + if is_base and basedir.split(os.path.sep, 1)[0].endswith('.data'): + continue + for s in subdirs: + destsubdir = os.path.join(dest, basedir, s) + if is_base and basedir == '' and destsubdir.endswith('.data'): + data_dirs.append(s) + continue + elif (is_base + and s.endswith('.dist-info') + # is self.req.project_name case preserving? + and s.lower().startswith(req.project_name.replace('-', '_').lower())): + assert not info_dir, 'Multiple .dist-info directories' + info_dir.append(destsubdir) + if not os.path.exists(destsubdir): + os.makedirs(destsubdir) + for f in files: + srcfile = os.path.join(dir, f) + destfile = os.path.join(dest, basedir, f) + shutil.move(srcfile, destfile) + changed = False + if fixer: + changed = fixer(destfile) + record_installed(srcfile, destfile, changed) + + clobber(source, lib_dir, True) + + assert info_dir, "%s .dist-info directory not found" % req + + for datadir in data_dirs: + fixer = None + for subdir in os.listdir(os.path.join(wheeldir, datadir)): + fixer = None + if subdir == 'scripts': + fixer = fix_script + source = os.path.join(wheeldir, datadir, subdir) + dest = scheme[subdir] + clobber(source, dest, False, fixer=fixer) + + record = os.path.join(info_dir[0], 'RECORD') + temp_record = os.path.join(info_dir[0], 'RECORD.pip') + with open_for_csv(record, 'r') as record_in: + with open_for_csv(temp_record, 'w+') as record_out: + reader = csv.reader(record_in) + writer = csv.writer(record_out) + for row in reader: + row[0] = installed.pop(row[0], row[0]) + if row[0] in changed: + row[1], row[2] = rehash(row[0]) + writer.writerow(row) + for f in installed: + writer.writerow((installed[f], '', '')) + shutil.move(temp_record, record) + +def _unique(fn): + @functools.wraps(fn) + def unique(*args, **kw): + seen = set() + for item in fn(*args, **kw): + if item not in seen: + seen.add(item) + yield item + return unique + +# TODO: this goes somewhere besides the wheel module +@_unique +def uninstallation_paths(dist): + """ + Yield all the uninstallation paths for dist based on RECORD-without-.pyc + + Yield paths to all the files in RECORD. For each .py file in RECORD, add + the .pyc in the same directory. + + UninstallPathSet.add() takes care of the __pycache__ .pyc. + """ + from pip.req import FakeFile # circular import + r = csv.reader(FakeFile(dist.get_metadata_lines('RECORD'))) + for row in r: + path = os.path.join(dist.location, row[0]) + yield path + if path.endswith('.py'): + dn, fn = os.path.split(path) + base = fn[:-3] + path = os.path.join(dn, base+'.pyc') + yield path + + +class Wheel(object): + """A wheel file""" + + # TODO: maybe move the install code into this class + + wheel_file_re = re.compile( + r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>\d.+?))?) + ((-(?P<build>\d.*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?) + \.whl|\.dist-info)$""", + re.VERBOSE) + + def __init__(self, filename): + wheel_info = self.wheel_file_re.match(filename) + self.filename = filename + self.name = wheel_info.group('name').replace('_', '-') + self.version = wheel_info.group('ver') + self.pyversions = wheel_info.group('pyver').split('.') + self.abis = wheel_info.group('abi').split('.') + self.plats = wheel_info.group('plat').split('.') + + # All the tag combinations from this file + self.file_tags = set((x, y, z) for x in self.pyversions for y + in self.abis for z in self.plats) + + def support_index_min(self, tags=None): + """ + Return the lowest index that a file_tag achieves in the supported_tags list + e.g. if there are 8 supported tags, and one of the file tags is first in the + list, then return 0. + """ + if tags is None: # for mock + tags = pep425tags.supported_tags + indexes = [tags.index(c) for c in self.file_tags if c in tags] + return min(indexes) if indexes else None + + def supported(self, tags=None): + """Is this wheel supported on this system?""" + if tags is None: # for mock + tags = pep425tags.supported_tags + return bool(set(tags).intersection(self.file_tags)) + + +class WheelBuilder(object): + """Build wheels from a RequirementSet.""" + + def __init__(self, requirement_set, finder, wheel_dir, build_options=[], global_options=[]): + self.requirement_set = requirement_set + self.finder = finder + self.wheel_dir = normalize_path(wheel_dir) + self.build_options = build_options + self.global_options = global_options + + def _build_one(self, req): + """Build one wheel.""" + + base_args = [ + sys.executable, '-c', + "import setuptools;__file__=%r;"\ + "exec(compile(open(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec'))" % req.setup_py] + \ + list(self.global_options) + + logger.notify('Running setup.py bdist_wheel for %s' % req.name) + logger.notify('Destination directory: %s' % self.wheel_dir) + wheel_args = base_args + ['bdist_wheel', '-d', self.wheel_dir] + self.build_options + try: + call_subprocess(wheel_args, cwd=req.source_dir, show_stdout=False) + return True + except: + logger.error('Failed building wheel for %s' % req.name) + return False + + def build(self): + """Build wheels.""" + + #unpack and constructs req set + self.requirement_set.prepare_files(self.finder) + + reqset = self.requirement_set.requirements.values() + + #make the wheelhouse + if not os.path.exists(self.wheel_dir): + os.makedirs(self.wheel_dir) + + #build the wheels + logger.notify('Building wheels for collected packages: %s' % ', '.join([req.name for req in reqset])) + logger.indent += 2 + build_success, build_failure = [], [] + for req in reqset: + if req.is_wheel: + logger.notify("Skipping building wheel: %s", req.url) + continue + if self._build_one(req): + build_success.append(req) + else: + build_failure.append(req) + logger.indent -= 2 + + #notify sucess/failure + if build_success: + logger.notify('Successfully built %s' % ' '.join([req.name for req in build_success])) + if build_failure: + logger.notify('Failed to build %s' % ' '.join([req.name for req in build_failure])) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/wheel.pyc b/PythonEnv/2.7/Lib/site-packages/pip/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e519273837456bb138a78ce85da853882072beb9 GIT binary patch literal 14032 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pkg_resources.py b/PythonEnv/2.7/Lib/site-packages/pkg_resources.py new file mode 100644 index 0000000000..36a0e6ed30 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pkg_resources.py @@ -0,0 +1,3029 @@ +"""Package resource API +-------------------- + +A resource is a logical file contained within a package, or a logical +subdirectory thereof. The package resource API expects resource names +to have their path parts separated with ``/``, *not* whatever the local +path separator is. Do not use os.path operations to manipulate resource +names being passed into the API. + +The package resource API is designed to work with normal filesystem packages, +.egg files, and unpacked .egg files. It can also work in a limited way with +.zip files and with custom PEP 302 loaders that support the ``get_data()`` +method. +""" + +import sys, os, time, re, imp, types, zipfile, zipimport +import warnings +import stat +try: + from urlparse import urlparse, urlunparse +except ImportError: + from urllib.parse import urlparse, urlunparse + +try: + frozenset +except NameError: + from sets import ImmutableSet as frozenset +try: + basestring + next = lambda o: o.next() + from cStringIO import StringIO as BytesIO + def exec_(code, globs=None, locs=None): + if globs is None: + frame = sys._getframe(1) + globs = frame.f_globals + if locs is None: + locs = frame.f_locals + del frame + elif locs is None: + locs = globs + exec("""exec code in globs, locs""") +except NameError: + basestring = str + from io import BytesIO + exec_ = eval("exec") + def execfile(fn, globs=None, locs=None): + if globs is None: + globs = globals() + if locs is None: + locs = globs + exec_(compile(open(fn).read(), fn, 'exec'), globs, locs) + import functools + reduce = functools.reduce + +# capture these to bypass sandboxing +from os import utime +try: + from os import mkdir, rename, unlink + WRITE_SUPPORT = True +except ImportError: + # no write support, probably under GAE + WRITE_SUPPORT = False + +from os import open as os_open +from os.path import isdir, split + +# Avoid try/except due to potential problems with delayed import mechanisms. +if sys.version_info >= (3, 3) and sys.implementation.name == "cpython": + import importlib._bootstrap as importlib_bootstrap +else: + importlib_bootstrap = None + +try: + import parser +except ImportError: + pass + +def _bypass_ensure_directory(name, mode=0x1FF): # 0777 + # Sandbox-bypassing version of ensure_directory() + if not WRITE_SUPPORT: + raise IOError('"os.mkdir" not supported on this platform.') + dirname, filename = split(name) + if dirname and filename and not isdir(dirname): + _bypass_ensure_directory(dirname) + mkdir(dirname, mode) + + +_state_vars = {} + +def _declare_state(vartype, **kw): + g = globals() + for name, val in kw.items(): + g[name] = val + _state_vars[name] = vartype + +def __getstate__(): + state = {} + g = globals() + for k, v in _state_vars.items(): + state[k] = g['_sget_'+v](g[k]) + return state + +def __setstate__(state): + g = globals() + for k, v in state.items(): + g['_sset_'+_state_vars[k]](k, g[k], v) + return state + +def _sget_dict(val): + return val.copy() + +def _sset_dict(key, ob, state): + ob.clear() + ob.update(state) + +def _sget_object(val): + return val.__getstate__() + +def _sset_object(key, ob, state): + ob.__setstate__(state) + +_sget_none = _sset_none = lambda *args: None + + + + +def get_supported_platform(): + """Return this platform's maximum compatible version. + + distutils.util.get_platform() normally reports the minimum version + of Mac OS X that would be required to *use* extensions produced by + distutils. But what we want when checking compatibility is to know the + version of Mac OS X that we are *running*. To allow usage of packages that + explicitly require a newer version of Mac OS X, we must also know the + current version of the OS. + + If this condition occurs for any other platform with a version in its + platform strings, this function should be extended accordingly. + """ + plat = get_build_platform(); m = macosVersionString.match(plat) + if m is not None and sys.platform == "darwin": + try: + plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) + except ValueError: + pass # not Mac OS X + return plat + + + + + + + + + + + + + + + + + + + + + +__all__ = [ + # Basic resource access and distribution/entry point discovery + 'require', 'run_script', 'get_provider', 'get_distribution', + 'load_entry_point', 'get_entry_map', 'get_entry_info', 'iter_entry_points', + 'resource_string', 'resource_stream', 'resource_filename', + 'resource_listdir', 'resource_exists', 'resource_isdir', + + # Environmental control + 'declare_namespace', 'working_set', 'add_activation_listener', + 'find_distributions', 'set_extraction_path', 'cleanup_resources', + 'get_default_cache', + + # Primary implementation classes + 'Environment', 'WorkingSet', 'ResourceManager', + 'Distribution', 'Requirement', 'EntryPoint', + + # Exceptions + 'ResolutionError','VersionConflict','DistributionNotFound','UnknownExtra', + 'ExtractionError', + + # Parsing functions and string utilities + 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', + 'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections', + 'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker', + + # filesystem utilities + 'ensure_directory', 'normalize_path', + + # Distribution "precedence" constants + 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST', + + # "Provider" interfaces, implementations, and registration/lookup APIs + 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', + 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', + 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', + 'register_finder', 'register_namespace_handler', 'register_loader_type', + 'fixup_namespace_packages', 'get_importer', + + # Deprecated/backward compatibility only + 'run_main', 'AvailableDistributions', +] +class ResolutionError(Exception): + """Abstract base for dependency resolution errors""" + def __repr__(self): + return self.__class__.__name__+repr(self.args) + +class VersionConflict(ResolutionError): + """An already-installed version conflicts with the requested version""" + +class DistributionNotFound(ResolutionError): + """A requested distribution was not found""" + +class UnknownExtra(ResolutionError): + """Distribution doesn't have an "extra feature" of the given name""" +_provider_factories = {} + +PY_MAJOR = sys.version[:3] +EGG_DIST = 3 +BINARY_DIST = 2 +SOURCE_DIST = 1 +CHECKOUT_DIST = 0 +DEVELOP_DIST = -1 + +def register_loader_type(loader_type, provider_factory): + """Register `provider_factory` to make providers for `loader_type` + + `loader_type` is the type or class of a PEP 302 ``module.__loader__``, + and `provider_factory` is a function that, passed a *module* object, + returns an ``IResourceProvider`` for that module. + """ + _provider_factories[loader_type] = provider_factory + +def get_provider(moduleOrReq): + """Return an IResourceProvider for the named module or requirement""" + if isinstance(moduleOrReq,Requirement): + return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] + try: + module = sys.modules[moduleOrReq] + except KeyError: + __import__(moduleOrReq) + module = sys.modules[moduleOrReq] + loader = getattr(module, '__loader__', None) + return _find_adapter(_provider_factories, loader)(module) + +def _macosx_vers(_cache=[]): + if not _cache: + import platform + version = platform.mac_ver()[0] + # fallback for MacPorts + if version == '': + import plistlib + plist = '/System/Library/CoreServices/SystemVersion.plist' + if os.path.exists(plist): + if hasattr(plistlib, 'readPlist'): + plist_content = plistlib.readPlist(plist) + if 'ProductVersion' in plist_content: + version = plist_content['ProductVersion'] + + _cache.append(version.split('.')) + return _cache[0] + +def _macosx_arch(machine): + return {'PowerPC':'ppc', 'Power_Macintosh':'ppc'}.get(machine,machine) + +def get_build_platform(): + """Return this platform's string for platform-specific distributions + + XXX Currently this is the same as ``distutils.util.get_platform()``, but it + needs some hacks for Linux and Mac OS X. + """ + try: + # Python 2.7 or >=3.2 + from sysconfig import get_platform + except ImportError: + from distutils.util import get_platform + + plat = get_platform() + if sys.platform == "darwin" and not plat.startswith('macosx-'): + try: + version = _macosx_vers() + machine = os.uname()[4].replace(" ", "_") + return "macosx-%d.%d-%s" % (int(version[0]), int(version[1]), + _macosx_arch(machine)) + except ValueError: + # if someone is running a non-Mac darwin system, this will fall + # through to the default implementation + pass + return plat + +macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") +darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") +get_platform = get_build_platform # XXX backward compat + + + + + + + +def compatible_platforms(provided,required): + """Can code for the `provided` platform run on the `required` platform? + + Returns true if either platform is ``None``, or the platforms are equal. + + XXX Needs compatibility checks for Linux and other unixy OSes. + """ + if provided is None or required is None or provided==required: + return True # easy case + + # Mac OS X special cases + reqMac = macosVersionString.match(required) + if reqMac: + provMac = macosVersionString.match(provided) + + # is this a Mac package? + if not provMac: + # this is backwards compatibility for packages built before + # setuptools 0.6. All packages built after this point will + # use the new macosx designation. + provDarwin = darwinVersionString.match(provided) + if provDarwin: + dversion = int(provDarwin.group(1)) + macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) + if dversion == 7 and macosversion >= "10.3" or \ + dversion == 8 and macosversion >= "10.4": + + #import warnings + #warnings.warn("Mac eggs should be rebuilt to " + # "use the macosx designation instead of darwin.", + # category=DeprecationWarning) + return True + return False # egg isn't macosx or legacy darwin + + # are they the same major version and machine type? + if provMac.group(1) != reqMac.group(1) or \ + provMac.group(3) != reqMac.group(3): + return False + + + + # is the required OS major update >= the provided one? + if int(provMac.group(2)) > int(reqMac.group(2)): + return False + + return True + + # XXX Linux and other platforms' special cases should go here + return False + + +def run_script(dist_spec, script_name): + """Locate distribution `dist_spec` and run its `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + require(dist_spec)[0].run_script(script_name, ns) + +run_main = run_script # backward compatibility + +def get_distribution(dist): + """Return a current distribution object for a Requirement or string""" + if isinstance(dist,basestring): dist = Requirement.parse(dist) + if isinstance(dist,Requirement): dist = get_provider(dist) + if not isinstance(dist,Distribution): + raise TypeError("Expected string, Requirement, or Distribution", dist) + return dist + +def load_entry_point(dist, group, name): + """Return `name` entry point of `group` for `dist` or raise ImportError""" + return get_distribution(dist).load_entry_point(group, name) + +def get_entry_map(dist, group=None): + """Return the entry point map for `group`, or the full entry map""" + return get_distribution(dist).get_entry_map(group) + +def get_entry_info(dist, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return get_distribution(dist).get_entry_info(group, name) + + +class IMetadataProvider: + + def has_metadata(name): + """Does the package's distribution contain the named metadata?""" + + def get_metadata(name): + """The named metadata resource as a string""" + + def get_metadata_lines(name): + """Yield named metadata resource as list of non-blank non-comment lines + + Leading and trailing whitespace is stripped from each line, and lines + with ``#`` as the first non-blank character are omitted.""" + + def metadata_isdir(name): + """Is the named metadata a directory? (like ``os.path.isdir()``)""" + + def metadata_listdir(name): + """List of metadata names in the directory (like ``os.listdir()``)""" + + def run_script(script_name, namespace): + """Execute the named script in the supplied namespace dictionary""" + + + + + + + + + + +class IResourceProvider(IMetadataProvider): + """An object that provides access to package resources""" + + def get_resource_filename(manager, resource_name): + """Return a true filesystem path for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_stream(manager, resource_name): + """Return a readable file-like object for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_string(manager, resource_name): + """Return a string containing the contents of `resource_name` + + `manager` must be an ``IResourceManager``""" + + def has_resource(resource_name): + """Does the package contain the named resource?""" + + def resource_isdir(resource_name): + """Is the named resource a directory? (like ``os.path.isdir()``)""" + + def resource_listdir(resource_name): + """List of resource names in the directory (like ``os.listdir()``)""" + + + + + + + + + + + + + + + +class WorkingSet(object): + """A collection of active distributions on sys.path (or a similar list)""" + + def __init__(self, entries=None): + """Create working set from list of path entries (default=sys.path)""" + self.entries = [] + self.entry_keys = {} + self.by_key = {} + self.callbacks = [] + + if entries is None: + entries = sys.path + + for entry in entries: + self.add_entry(entry) + + + def add_entry(self, entry): + """Add a path item to ``.entries``, finding any distributions on it + + ``find_distributions(entry, True)`` is used to find distributions + corresponding to the path entry, and they are added. `entry` is + always appended to ``.entries``, even if it is already present. + (This is because ``sys.path`` can contain the same value more than + once, and the ``.entries`` of the ``sys.path`` WorkingSet should always + equal ``sys.path``.) + """ + self.entry_keys.setdefault(entry, []) + self.entries.append(entry) + for dist in find_distributions(entry, True): + self.add(dist, entry, False) + + + def __contains__(self,dist): + """True if `dist` is the active distribution for its project""" + return self.by_key.get(dist.key) == dist + + + + + + def find(self, req): + """Find a distribution matching requirement `req` + + If there is an active distribution for the requested project, this + returns it as long as it meets the version requirement specified by + `req`. But, if there is an active distribution for the project and it + does *not* meet the `req` requirement, ``VersionConflict`` is raised. + If there is no active distribution for the requested project, ``None`` + is returned. + """ + dist = self.by_key.get(req.key) + if dist is not None and dist not in req: + raise VersionConflict(dist,req) # XXX add more info + else: + return dist + + def iter_entry_points(self, group, name=None): + """Yield entry point objects from `group` matching `name` + + If `name` is None, yields all entry points in `group` from all + distributions in the working set, otherwise only ones matching + both `group` and `name` are yielded (in distribution order). + """ + for dist in self: + entries = dist.get_entry_map(group) + if name is None: + for ep in entries.values(): + yield ep + elif name in entries: + yield entries[name] + + def run_script(self, requires, script_name): + """Locate distribution for `requires` and run `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + self.require(requires)[0].run_script(script_name, ns) + + + + def __iter__(self): + """Yield distributions for non-duplicate projects in the working set + + The yield order is the order in which the items' path entries were + added to the working set. + """ + seen = {} + for item in self.entries: + if item not in self.entry_keys: + # workaround a cache issue + continue + + for key in self.entry_keys[item]: + if key not in seen: + seen[key]=1 + yield self.by_key[key] + + def add(self, dist, entry=None, insert=True): + """Add `dist` to working set, associated with `entry` + + If `entry` is unspecified, it defaults to the ``.location`` of `dist`. + On exit from this routine, `entry` is added to the end of the working + set's ``.entries`` (if it wasn't already present). + + `dist` is only added to the working set if it's for a project that + doesn't already have a distribution in the set. If it's added, any + callbacks registered with the ``subscribe()`` method will be called. + """ + if insert: + dist.insert_on(self.entries, entry) + + if entry is None: + entry = dist.location + keys = self.entry_keys.setdefault(entry,[]) + keys2 = self.entry_keys.setdefault(dist.location,[]) + if dist.key in self.by_key: + return # ignore hidden distros + + self.by_key[dist.key] = dist + if dist.key not in keys: + keys.append(dist.key) + if dist.key not in keys2: + keys2.append(dist.key) + self._added_new(dist) + + def resolve(self, requirements, env=None, installer=None): + """List all distributions needed to (recursively) meet `requirements` + + `requirements` must be a sequence of ``Requirement`` objects. `env`, + if supplied, should be an ``Environment`` instance. If + not supplied, it defaults to all distributions available within any + entry or distribution in the working set. `installer`, if supplied, + will be invoked with each requirement that cannot be met by an + already-installed distribution; it should return a ``Distribution`` or + ``None``. + """ + + requirements = list(requirements)[::-1] # set up the stack + processed = {} # set of processed requirements + best = {} # key -> dist + to_activate = [] + + while requirements: + req = requirements.pop(0) # process dependencies breadth-first + if req in processed: + # Ignore cyclic or redundant dependencies + continue + dist = best.get(req.key) + if dist is None: + # Find the best distribution and add it to the map + dist = self.by_key.get(req.key) + if dist is None: + if env is None: + env = Environment(self.entries) + dist = best[req.key] = env.best_match(req, self, installer) + if dist is None: + #msg = ("The '%s' distribution was not found on this " + # "system, and is required by this application.") + #raise DistributionNotFound(msg % req) + + # unfortunately, zc.buildout uses a str(err) + # to get the name of the distribution here.. + raise DistributionNotFound(req) + to_activate.append(dist) + if dist not in req: + # Oops, the "best" so far conflicts with a dependency + raise VersionConflict(dist,req) # XXX put more info here + requirements.extend(dist.requires(req.extras)[::-1]) + processed[req] = True + + return to_activate # return list of distros to activate + + def find_plugins(self, + plugin_env, full_env=None, installer=None, fallback=True + ): + """Find all activatable distributions in `plugin_env` + + Example usage:: + + distributions, errors = working_set.find_plugins( + Environment(plugin_dirlist) + ) + map(working_set.add, distributions) # add plugins+libs to sys.path + print 'Could not load', errors # display errors + + The `plugin_env` should be an ``Environment`` instance that contains + only distributions that are in the project's "plugin directory" or + directories. The `full_env`, if supplied, should be an ``Environment`` + contains all currently-available distributions. If `full_env` is not + supplied, one is created automatically from the ``WorkingSet`` this + method is called on, which will typically mean that every directory on + ``sys.path`` will be scanned for distributions. + + `installer` is a standard installer callback as used by the + ``resolve()`` method. The `fallback` flag indicates whether we should + attempt to resolve older versions of a plugin if the newest version + cannot be resolved. + + This method returns a 2-tuple: (`distributions`, `error_info`), where + `distributions` is a list of the distributions found in `plugin_env` + that were loadable, along with any other distributions that are needed + to resolve their dependencies. `error_info` is a dictionary mapping + unloadable plugin distributions to an exception instance describing the + error that occurred. Usually this will be a ``DistributionNotFound`` or + ``VersionConflict`` instance. + """ + + plugin_projects = list(plugin_env) + plugin_projects.sort() # scan project names in alphabetic order + + error_info = {} + distributions = {} + + if full_env is None: + env = Environment(self.entries) + env += plugin_env + else: + env = full_env + plugin_env + + shadow_set = self.__class__([]) + list(map(shadow_set.add, self)) # put all our entries in shadow_set + + for project_name in plugin_projects: + + for dist in plugin_env[project_name]: + + req = [dist.as_requirement()] + + try: + resolvees = shadow_set.resolve(req, env, installer) + + except ResolutionError: + v = sys.exc_info()[1] + error_info[dist] = v # save error info + if fallback: + continue # try the next older version of project + else: + break # give up on this project, keep going + + else: + list(map(shadow_set.add, resolvees)) + distributions.update(dict.fromkeys(resolvees)) + + # success, no need to try any more versions of this project + break + + distributions = list(distributions) + distributions.sort() + + return distributions, error_info + + + + + + def require(self, *requirements): + """Ensure that distributions matching `requirements` are activated + + `requirements` must be a string or a (possibly-nested) sequence + thereof, specifying the distributions and versions required. The + return value is a sequence of the distributions that needed to be + activated to fulfill the requirements; all relevant distributions are + included, even if they were already activated in this working set. + """ + needed = self.resolve(parse_requirements(requirements)) + + for dist in needed: + self.add(dist) + + return needed + + def subscribe(self, callback): + """Invoke `callback` for all distributions (including existing ones)""" + if callback in self.callbacks: + return + self.callbacks.append(callback) + for dist in self: + callback(dist) + + def _added_new(self, dist): + for callback in self.callbacks: + callback(dist) + + def __getstate__(self): + return ( + self.entries[:], self.entry_keys.copy(), self.by_key.copy(), + self.callbacks[:] + ) + + def __setstate__(self, e_k_b_c): + entries, keys, by_key, callbacks = e_k_b_c + self.entries = entries[:] + self.entry_keys = keys.copy() + self.by_key = by_key.copy() + self.callbacks = callbacks[:] + + +class Environment(object): + """Searchable snapshot of distributions on a search path""" + + def __init__(self, search_path=None, platform=get_supported_platform(), python=PY_MAJOR): + """Snapshot distributions available on a search path + + Any distributions found on `search_path` are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. + + `platform` is an optional string specifying the name of the platform + that platform-specific distributions must be compatible with. If + unspecified, it defaults to the current platform. `python` is an + optional string naming the desired version of Python (e.g. ``'2.4'``); + it defaults to the current version. + + You may explicitly set `platform` (and/or `python`) to ``None`` if you + wish to map *all* distributions, not just those compatible with the + running platform or Python version. + """ + self._distmap = {} + self._cache = {} + self.platform = platform + self.python = python + self.scan(search_path) + + def can_add(self, dist): + """Is distribution `dist` acceptable for this environment? + + The distribution must match the platform and python version + requirements specified when this environment was created, or False + is returned. + """ + return (self.python is None or dist.py_version is None + or dist.py_version==self.python) \ + and compatible_platforms(dist.platform,self.platform) + + def remove(self, dist): + """Remove `dist` from the environment""" + self._distmap[dist.key].remove(dist) + + def scan(self, search_path=None): + """Scan `search_path` for distributions usable in this environment + + Any distributions found are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. Only distributions conforming to + the platform/python version defined at initialization are added. + """ + if search_path is None: + search_path = sys.path + + for item in search_path: + for dist in find_distributions(item): + self.add(dist) + + def __getitem__(self,project_name): + """Return a newest-to-oldest list of distributions for `project_name` + """ + try: + return self._cache[project_name] + except KeyError: + project_name = project_name.lower() + if project_name not in self._distmap: + return [] + + if project_name not in self._cache: + dists = self._cache[project_name] = self._distmap[project_name] + _sort_dists(dists) + + return self._cache[project_name] + + def add(self,dist): + """Add `dist` if we ``can_add()`` it and it isn't already added""" + if self.can_add(dist) and dist.has_version(): + dists = self._distmap.setdefault(dist.key,[]) + if dist not in dists: + dists.append(dist) + if dist.key in self._cache: + _sort_dists(self._cache[dist.key]) + + + def best_match(self, req, working_set, installer=None): + """Find distribution best matching `req` and usable on `working_set` + + This calls the ``find(req)`` method of the `working_set` to see if a + suitable distribution is already active. (This may raise + ``VersionConflict`` if an unsuitable version of the project is already + active in the specified `working_set`.) If a suitable distribution + isn't active, this method returns the newest distribution in the + environment that meets the ``Requirement`` in `req`. If no suitable + distribution is found, and `installer` is supplied, then the result of + calling the environment's ``obtain(req, installer)`` method will be + returned. + """ + dist = working_set.find(req) + if dist is not None: + return dist + for dist in self[req.key]: + if dist in req: + return dist + return self.obtain(req, installer) # try and download/install + + def obtain(self, requirement, installer=None): + """Obtain a distribution matching `requirement` (e.g. via download) + + Obtain a distro that matches requirement (e.g. via download). In the + base ``Environment`` class, this routine just returns + ``installer(requirement)``, unless `installer` is None, in which case + None is returned instead. This method is a hook that allows subclasses + to attempt other ways of obtaining a distribution before falling back + to the `installer` argument.""" + if installer is not None: + return installer(requirement) + + def __iter__(self): + """Yield the unique project names of the available distributions""" + for key in self._distmap.keys(): + if self[key]: yield key + + + + + def __iadd__(self, other): + """In-place addition of a distribution or environment""" + if isinstance(other,Distribution): + self.add(other) + elif isinstance(other,Environment): + for project in other: + for dist in other[project]: + self.add(dist) + else: + raise TypeError("Can't add %r to environment" % (other,)) + return self + + def __add__(self, other): + """Add an environment or distribution to an environment""" + new = self.__class__([], platform=None, python=None) + for env in self, other: + new += env + return new + + +AvailableDistributions = Environment # XXX backward compatibility + + +class ExtractionError(RuntimeError): + """An error occurred extracting a resource + + The following attributes are available from instances of this exception: + + manager + The resource manager that raised this exception + + cache_path + The base directory for resource extraction + + original_error + The exception instance that caused extraction to fail + """ + + + + +class ResourceManager: + """Manage resource extraction and packages""" + extraction_path = None + + def __init__(self): + self.cached_files = {} + + def resource_exists(self, package_or_requirement, resource_name): + """Does the named resource exist?""" + return get_provider(package_or_requirement).has_resource(resource_name) + + def resource_isdir(self, package_or_requirement, resource_name): + """Is the named resource an existing directory?""" + return get_provider(package_or_requirement).resource_isdir( + resource_name + ) + + def resource_filename(self, package_or_requirement, resource_name): + """Return a true filesystem path for specified resource""" + return get_provider(package_or_requirement).get_resource_filename( + self, resource_name + ) + + def resource_stream(self, package_or_requirement, resource_name): + """Return a readable file-like object for specified resource""" + return get_provider(package_or_requirement).get_resource_stream( + self, resource_name + ) + + def resource_string(self, package_or_requirement, resource_name): + """Return specified resource as a string""" + return get_provider(package_or_requirement).get_resource_string( + self, resource_name + ) + + def resource_listdir(self, package_or_requirement, resource_name): + """List the contents of the named resource directory""" + return get_provider(package_or_requirement).resource_listdir( + resource_name + ) + + def extraction_error(self): + """Give an error message for problems extracting file(s)""" + + old_exc = sys.exc_info()[1] + cache_path = self.extraction_path or get_default_cache() + + err = ExtractionError("""Can't extract file(s) to egg cache + +The following error occurred while trying to extract file(s) to the Python egg +cache: + + %s + +The Python egg cache directory is currently set to: + + %s + +Perhaps your account does not have write access to this directory? You can +change the cache directory by setting the PYTHON_EGG_CACHE environment +variable to point to an accessible directory. +""" % (old_exc, cache_path) + ) + err.manager = self + err.cache_path = cache_path + err.original_error = old_exc + raise err + + + + + + + + + + + + + + + + def get_cache_path(self, archive_name, names=()): + """Return absolute location in cache for `archive_name` and `names` + + The parent directory of the resulting path will be created if it does + not already exist. `archive_name` should be the base filename of the + enclosing egg (which may not be the name of the enclosing zipfile!), + including its ".egg" extension. `names`, if provided, should be a + sequence of path name parts "under" the egg's extraction location. + + This method should only be called by resource providers that need to + obtain an extraction location, and only for names they intend to + extract, as it tracks the generated names for possible cleanup later. + """ + extract_path = self.extraction_path or get_default_cache() + target_path = os.path.join(extract_path, archive_name+'-tmp', *names) + try: + _bypass_ensure_directory(target_path) + except: + self.extraction_error() + + self._warn_unsafe_extraction_path(extract_path) + + self.cached_files[target_path] = 1 + return target_path + + @staticmethod + def _warn_unsafe_extraction_path(path): + """ + If the default extraction path is overridden and set to an insecure + location, such as /tmp, it opens up an opportunity for an attacker to + replace an extracted file with an unauthorized payload. Warn the user + if a known insecure location is used. + + See Distribute #375 for more details. + """ + if os.name == 'nt' and not path.startswith(os.environ['windir']): + # On Windows, permissions are generally restrictive by default + # and temp directories are not writable by other users, so + # bypass the warning. + return + mode = os.stat(path).st_mode + if mode & stat.S_IWOTH or mode & stat.S_IWGRP: + msg = ("%s is writable by group/others and vulnerable to attack " + "when " + "used with get_resource_filename. Consider a more secure " + "location (set with .set_extraction_path or the " + "PYTHON_EGG_CACHE environment variable)." % path) + warnings.warn(msg, UserWarning) + + + + + + + + + + + + + + + + + + + def postprocess(self, tempname, filename): + """Perform any platform-specific postprocessing of `tempname` + + This is where Mac header rewrites should be done; other platforms don't + have anything special they should do. + + Resource providers should call this method ONLY after successfully + extracting a compressed resource. They must NOT call it on resources + that are already in the filesystem. + + `tempname` is the current (temporary) name of the file, and `filename` + is the name it will be renamed to by the caller after this routine + returns. + """ + + if os.name == 'posix': + # Make the resource executable + mode = ((os.stat(tempname).st_mode) | 0x16D) & 0xFFF # 0555, 07777 + os.chmod(tempname, mode) + + + + + + + + + + + + + + + + + + + + + + + def set_extraction_path(self, path): + """Set the base path where resources will be extracted to, if needed. + + If you do not call this routine before any extractions take place, the + path defaults to the return value of ``get_default_cache()``. (Which + is based on the ``PYTHON_EGG_CACHE`` environment variable, with various + platform-specific fallbacks. See that routine's documentation for more + details.) + + Resources are extracted to subdirectories of this path based upon + information given by the ``IResourceProvider``. You may set this to a + temporary directory, but then you must call ``cleanup_resources()`` to + delete the extracted files when done. There is no guarantee that + ``cleanup_resources()`` will be able to remove all extracted files. + + (Note: you may not change the extraction path for a given resource + manager once resources have been extracted, unless you first call + ``cleanup_resources()``.) + """ + if self.cached_files: + raise ValueError( + "Can't change extraction path, files already extracted" + ) + + self.extraction_path = path + + def cleanup_resources(self, force=False): + """ + Delete all extracted resource files and directories, returning a list + of the file and directory names that could not be successfully removed. + This function does not have any concurrency protection, so it should + generally only be called when the extraction path is a temporary + directory exclusive to a single process. This method is not + automatically called; you must call it explicitly or register it as an + ``atexit`` function if you wish to ensure cleanup of a temporary + directory used for extractions. + """ + # XXX + + + +def get_default_cache(): + """Determine the default cache location + + This returns the ``PYTHON_EGG_CACHE`` environment variable, if set. + Otherwise, on Windows, it returns a "Python-Eggs" subdirectory of the + "Application Data" directory. On all other systems, it's "~/.python-eggs". + """ + try: + return os.environ['PYTHON_EGG_CACHE'] + except KeyError: + pass + + if os.name!='nt': + return os.path.expanduser('~/.python-eggs') + + app_data = 'Application Data' # XXX this may be locale-specific! + app_homes = [ + (('APPDATA',), None), # best option, should be locale-safe + (('USERPROFILE',), app_data), + (('HOMEDRIVE','HOMEPATH'), app_data), + (('HOMEPATH',), app_data), + (('HOME',), None), + (('WINDIR',), app_data), # 95/98/ME + ] + + for keys, subdir in app_homes: + dirname = '' + for key in keys: + if key in os.environ: + dirname = os.path.join(dirname, os.environ[key]) + else: + break + else: + if subdir: + dirname = os.path.join(dirname,subdir) + return os.path.join(dirname, 'Python-Eggs') + else: + raise RuntimeError( + "Please set the PYTHON_EGG_CACHE enviroment variable" + ) + +def safe_name(name): + """Convert an arbitrary string to a standard distribution name + + Any runs of non-alphanumeric/. characters are replaced with a single '-'. + """ + return re.sub('[^A-Za-z0-9.]+', '-', name) + + +def safe_version(version): + """Convert an arbitrary string to a standard version string + + Spaces become dots, and all other non-alphanumeric characters become + dashes, with runs of multiple dashes condensed to a single dash. + """ + version = version.replace(' ','.') + return re.sub('[^A-Za-z0-9.]+', '-', version) + + +def safe_extra(extra): + """Convert an arbitrary string to a standard 'extra' name + + Any runs of non-alphanumeric characters are replaced with a single '_', + and the result is always lowercased. + """ + return re.sub('[^A-Za-z0-9.]+', '_', extra).lower() + + +def to_filename(name): + """Convert a project or version name to its filename-escaped form + + Any '-' characters are currently replaced with '_'. + """ + return name.replace('-','_') + + + + + + + + +_marker_names = { + 'os': ['name'], 'sys': ['platform'], + 'platform': ['version','machine','python_implementation'], + 'python_version': [], 'python_full_version': [], 'extra':[], +} + +_marker_values = { + 'os_name': lambda: os.name, + 'sys_platform': lambda: sys.platform, + 'python_full_version': lambda: sys.version.split()[0], + 'python_version': lambda:'%s.%s' % (sys.version_info[0], sys.version_info[1]), + 'platform_version': lambda: _platinfo('version'), + 'platform_machine': lambda: _platinfo('machine'), + 'python_implementation': lambda: _platinfo('python_implementation') or _pyimp(), +} + +def _platinfo(attr): + try: + import platform + except ImportError: + return '' + return getattr(platform, attr, lambda:'')() + +def _pyimp(): + if sys.platform=='cli': + return 'IronPython' + elif sys.platform.startswith('java'): + return 'Jython' + elif '__pypy__' in sys.builtin_module_names: + return 'PyPy' + else: + return 'CPython' + +def invalid_marker(text): + """Validate text as a PEP 426 environment marker; return exception or False""" + try: + evaluate_marker(text) + except SyntaxError: + return sys.exc_info()[1] + return False + +def evaluate_marker(text, extra=None, _ops={}): + """ + Evaluate a PEP 426 environment marker on CPython 2.4+. + Return a boolean indicating the marker result in this environment. + Raise SyntaxError if marker is invalid. + + This implementation uses the 'parser' module, which is not implemented on + Jython and has been superseded by the 'ast' module in Python 2.6 and + later. + """ + + if not _ops: + + from token import NAME, STRING + import token, symbol, operator + + def and_test(nodelist): + # MUST NOT short-circuit evaluation, or invalid syntax can be skipped! + return reduce(operator.and_, [interpret(nodelist[i]) for i in range(1,len(nodelist),2)]) + + def test(nodelist): + # MUST NOT short-circuit evaluation, or invalid syntax can be skipped! + return reduce(operator.or_, [interpret(nodelist[i]) for i in range(1,len(nodelist),2)]) + + def atom(nodelist): + t = nodelist[1][0] + if t == token.LPAR: + if nodelist[2][0] == token.RPAR: + raise SyntaxError("Empty parentheses") + return interpret(nodelist[2]) + raise SyntaxError("Language feature not supported in environment markers") + + def comparison(nodelist): + if len(nodelist)>4: + raise SyntaxError("Chained comparison not allowed in environment markers") + comp = nodelist[2][1] + cop = comp[1] + if comp[0] == NAME: + if len(nodelist[2]) == 3: + if cop == 'not': + cop = 'not in' + else: + cop = 'is not' + try: + cop = _ops[cop] + except KeyError: + raise SyntaxError(repr(cop)+" operator not allowed in environment markers") + return cop(evaluate(nodelist[1]), evaluate(nodelist[3])) + + _ops.update({ + symbol.test: test, symbol.and_test: and_test, symbol.atom: atom, + symbol.comparison: comparison, 'not in': lambda x,y: x not in y, + 'in': lambda x,y: x in y, '==': operator.eq, '!=': operator.ne, + }) + if hasattr(symbol,'or_test'): + _ops[symbol.or_test] = test + + def interpret(nodelist): + while len(nodelist)==2: nodelist = nodelist[1] + try: + op = _ops[nodelist[0]] + except KeyError: + raise SyntaxError("Comparison or logical expression expected") + raise SyntaxError("Language feature not supported in environment markers: "+symbol.sym_name[nodelist[0]]) + return op(nodelist) + + def evaluate(nodelist): + while len(nodelist)==2: nodelist = nodelist[1] + kind = nodelist[0] + name = nodelist[1] + #while len(name)==2: name = name[1] + if kind==NAME: + try: + op = _marker_values[name] + except KeyError: + raise SyntaxError("Unknown name %r" % name) + return op() + if kind==STRING: + s = nodelist[1] + if s[:1] not in "'\"" or s.startswith('"""') or s.startswith("'''") \ + or '\\' in s: + raise SyntaxError( + "Only plain strings allowed in environment markers") + return s[1:-1] + raise SyntaxError("Language feature not supported in environment markers") + + return interpret(parser.expr(text).totuple(1)[1]) + +def _markerlib_evaluate(text): + """ + Evaluate a PEP 426 environment marker using markerlib. + Return a boolean indicating the marker result in this environment. + Raise SyntaxError if marker is invalid. + """ + import _markerlib + # markerlib implements Metadata 1.2 (PEP 345) environment markers. + # Translate the variables to Metadata 2.0 (PEP 426). + env = _markerlib.default_environment() + for key in env.keys(): + new_key = key.replace('.', '_') + env[new_key] = env.pop(key) + try: + result = _markerlib.interpret(text, env) + except NameError: + e = sys.exc_info()[1] + raise SyntaxError(e.args[0]) + return result + +if 'parser' not in globals(): + # fallback to less-complete _markerlib implementation if 'parser' module + # is not available. + evaluate_marker = _markerlib_evaluate + +class NullProvider: + """Try to implement resources and metadata for arbitrary PEP 302 loaders""" + + egg_name = None + egg_info = None + loader = None + + def __init__(self, module): + self.loader = getattr(module, '__loader__', None) + self.module_path = os.path.dirname(getattr(module, '__file__', '')) + + def get_resource_filename(self, manager, resource_name): + return self._fn(self.module_path, resource_name) + + def get_resource_stream(self, manager, resource_name): + return BytesIO(self.get_resource_string(manager, resource_name)) + + def get_resource_string(self, manager, resource_name): + return self._get(self._fn(self.module_path, resource_name)) + + def has_resource(self, resource_name): + return self._has(self._fn(self.module_path, resource_name)) + + def has_metadata(self, name): + return self.egg_info and self._has(self._fn(self.egg_info,name)) + + if sys.version_info <= (3,): + def get_metadata(self, name): + if not self.egg_info: + return "" + return self._get(self._fn(self.egg_info,name)) + else: + def get_metadata(self, name): + if not self.egg_info: + return "" + return self._get(self._fn(self.egg_info,name)).decode("utf-8") + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + def resource_isdir(self,resource_name): + return self._isdir(self._fn(self.module_path, resource_name)) + + def metadata_isdir(self,name): + return self.egg_info and self._isdir(self._fn(self.egg_info,name)) + + + def resource_listdir(self,resource_name): + return self._listdir(self._fn(self.module_path,resource_name)) + + def metadata_listdir(self,name): + if self.egg_info: + return self._listdir(self._fn(self.egg_info,name)) + return [] + + def run_script(self,script_name,namespace): + script = 'scripts/'+script_name + if not self.has_metadata(script): + raise ResolutionError("No script named %r" % script_name) + script_text = self.get_metadata(script).replace('\r\n','\n') + script_text = script_text.replace('\r','\n') + script_filename = self._fn(self.egg_info,script) + namespace['__file__'] = script_filename + if os.path.exists(script_filename): + execfile(script_filename, namespace, namespace) + else: + from linecache import cache + cache[script_filename] = ( + len(script_text), 0, script_text.split('\n'), script_filename + ) + script_code = compile(script_text,script_filename,'exec') + exec_(script_code, namespace, namespace) + + def _has(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _isdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _listdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _fn(self, base, resource_name): + if resource_name: + return os.path.join(base, *resource_name.split('/')) + return base + + def _get(self, path): + if hasattr(self.loader, 'get_data'): + return self.loader.get_data(path) + raise NotImplementedError( + "Can't perform this operation for loaders without 'get_data()'" + ) + +register_loader_type(object, NullProvider) + + +class EggProvider(NullProvider): + """Provider based on a virtual filesystem""" + + def __init__(self,module): + NullProvider.__init__(self,module) + self._setup_prefix() + + def _setup_prefix(self): + # we assume here that our metadata may be nested inside a "basket" + # of multiple eggs; that's why we use module_path instead of .archive + path = self.module_path + old = None + while path!=old: + if path.lower().endswith('.egg'): + self.egg_name = os.path.basename(path) + self.egg_info = os.path.join(path, 'EGG-INFO') + self.egg_root = path + break + old = path + path, base = os.path.split(path) + + + + + + +class DefaultProvider(EggProvider): + """Provides access to package resources in the filesystem""" + + def _has(self, path): + return os.path.exists(path) + + def _isdir(self,path): + return os.path.isdir(path) + + def _listdir(self,path): + return os.listdir(path) + + def get_resource_stream(self, manager, resource_name): + return open(self._fn(self.module_path, resource_name), 'rb') + + def _get(self, path): + stream = open(path, 'rb') + try: + return stream.read() + finally: + stream.close() + +register_loader_type(type(None), DefaultProvider) + +if importlib_bootstrap is not None: + register_loader_type(importlib_bootstrap.SourceFileLoader, DefaultProvider) + + +class EmptyProvider(NullProvider): + """Provider that returns nothing for all requests""" + + _isdir = _has = lambda self,path: False + _get = lambda self,path: '' + _listdir = lambda self,path: [] + module_path = None + + def __init__(self): + pass + +empty_provider = EmptyProvider() + + +def build_zipmanifest(path): + """ + This builds a similar dictionary to the zipimport directory + caches. However instead of tuples, ZipInfo objects are stored. + + The translation of the tuple is as follows: + * [0] - zipinfo.filename on stock pythons this needs "/" --> os.sep + on pypy it is the same (one reason why distribute did work + in some cases on pypy and win32). + * [1] - zipinfo.compress_type + * [2] - zipinfo.compress_size + * [3] - zipinfo.file_size + * [4] - len(utf-8 encoding of filename) if zipinfo & 0x800 + len(ascii encoding of filename) otherwise + * [5] - (zipinfo.date_time[0] - 1980) << 9 | + zipinfo.date_time[1] << 5 | zipinfo.date_time[2] + * [6] - (zipinfo.date_time[3] - 1980) << 11 | + zipinfo.date_time[4] << 5 | (zipinfo.date_time[5] // 2) + * [7] - zipinfo.CRC + """ + zipinfo = dict() + zfile = zipfile.ZipFile(path) + #Got ZipFile has not __exit__ on python 3.1 + try: + for zitem in zfile.namelist(): + zpath = zitem.replace('/', os.sep) + zipinfo[zpath] = zfile.getinfo(zitem) + assert zipinfo[zpath] is not None + finally: + zfile.close() + return zipinfo + + +class ZipProvider(EggProvider): + """Resource support for zips and eggs""" + + eagers = None + + def __init__(self, module): + EggProvider.__init__(self,module) + self.zipinfo = build_zipmanifest(self.loader.archive) + self.zip_pre = self.loader.archive+os.sep + + def _zipinfo_name(self, fspath): + # Convert a virtual filename (full path to file) into a zipfile subpath + # usable with the zipimport directory cache for our target archive + if fspath.startswith(self.zip_pre): + return fspath[len(self.zip_pre):] + raise AssertionError( + "%s is not a subpath of %s" % (fspath,self.zip_pre) + ) + + def _parts(self,zip_path): + # Convert a zipfile subpath into an egg-relative path part list + fspath = self.zip_pre+zip_path # pseudo-fs path + if fspath.startswith(self.egg_root+os.sep): + return fspath[len(self.egg_root)+1:].split(os.sep) + raise AssertionError( + "%s is not a subpath of %s" % (fspath,self.egg_root) + ) + + def get_resource_filename(self, manager, resource_name): + if not self.egg_name: + raise NotImplementedError( + "resource_filename() only supported for .egg, not .zip" + ) + # no need to lock for extraction, since we use temp names + zip_path = self._resource_to_zip(resource_name) + eagers = self._get_eager_resources() + if '/'.join(self._parts(zip_path)) in eagers: + for name in eagers: + self._extract_resource(manager, self._eager_to_zip(name)) + return self._extract_resource(manager, zip_path) + + @staticmethod + def _get_date_and_size(zip_stat): + size = zip_stat.file_size + date_time = zip_stat.date_time + (0, 0, -1) # ymdhms+wday, yday, dst + #1980 offset already done + timestamp = time.mktime(date_time) + return timestamp, size + + def _extract_resource(self, manager, zip_path): + + if zip_path in self._index(): + for name in self._index()[zip_path]: + last = self._extract_resource( + manager, os.path.join(zip_path, name) + ) + return os.path.dirname(last) # return the extracted directory name + + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + + if not WRITE_SUPPORT: + raise IOError('"os.rename" and "os.unlink" are not supported ' + 'on this platform') + try: + + real_path = manager.get_cache_path( + self.egg_name, self._parts(zip_path) + ) + + if self._is_current(real_path, zip_path): + return real_path + + outf, tmpnam = _mkstemp(".$extract", dir=os.path.dirname(real_path)) + os.write(outf, self.loader.get_data(zip_path)) + os.close(outf) + utime(tmpnam, (timestamp,timestamp)) + manager.postprocess(tmpnam, real_path) + + try: + rename(tmpnam, real_path) + + except os.error: + if os.path.isfile(real_path): + if self._is_current(real_path, zip_path): + # the file became current since it was checked above, + # so proceed. + return real_path + elif os.name=='nt': # Windows, del old file and retry + unlink(real_path) + rename(tmpnam, real_path) + return real_path + raise + + except os.error: + manager.extraction_error() # report a user-friendly error + + return real_path + + def _is_current(self, file_path, zip_path): + """ + Return True if the file_path is current for this zip_path + """ + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + if not os.path.isfile(file_path): + return False + stat = os.stat(file_path) + if stat.st_size!=size or stat.st_mtime!=timestamp: + return False + # check that the contents match + zip_contents = self.loader.get_data(zip_path) + f = open(file_path, 'rb') + file_contents = f.read() + f.close() + return zip_contents == file_contents + + def _get_eager_resources(self): + if self.eagers is None: + eagers = [] + for name in ('native_libs.txt', 'eager_resources.txt'): + if self.has_metadata(name): + eagers.extend(self.get_metadata_lines(name)) + self.eagers = eagers + return self.eagers + + def _index(self): + try: + return self._dirindex + except AttributeError: + ind = {} + for path in self.zipinfo: + parts = path.split(os.sep) + while parts: + parent = os.sep.join(parts[:-1]) + if parent in ind: + ind[parent].append(parts[-1]) + break + else: + ind[parent] = [parts.pop()] + self._dirindex = ind + return ind + + def _has(self, fspath): + zip_path = self._zipinfo_name(fspath) + return zip_path in self.zipinfo or zip_path in self._index() + + def _isdir(self,fspath): + return self._zipinfo_name(fspath) in self._index() + + def _listdir(self,fspath): + return list(self._index().get(self._zipinfo_name(fspath), ())) + + def _eager_to_zip(self,resource_name): + return self._zipinfo_name(self._fn(self.egg_root,resource_name)) + + def _resource_to_zip(self,resource_name): + return self._zipinfo_name(self._fn(self.module_path,resource_name)) + +register_loader_type(zipimport.zipimporter, ZipProvider) + + + + + + + + + + + + + + + + + + + + + + + + +class FileMetadata(EmptyProvider): + """Metadata handler for standalone PKG-INFO files + + Usage:: + + metadata = FileMetadata("/path/to/PKG-INFO") + + This provider rejects all data and metadata requests except for PKG-INFO, + which is treated as existing, and will be the contents of the file at + the provided location. + """ + + def __init__(self,path): + self.path = path + + def has_metadata(self,name): + return name=='PKG-INFO' + + def get_metadata(self,name): + if name=='PKG-INFO': + f = open(self.path,'rU') + metadata = f.read() + f.close() + return metadata + raise KeyError("No metadata except PKG-INFO is available") + + def get_metadata_lines(self,name): + return yield_lines(self.get_metadata(name)) + + + + + + + + + + + + + + + + +class PathMetadata(DefaultProvider): + """Metadata provider for egg directories + + Usage:: + + # Development eggs: + + egg_info = "/path/to/PackageName.egg-info" + base_dir = os.path.dirname(egg_info) + metadata = PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + dist = Distribution(basedir,project_name=dist_name,metadata=metadata) + + # Unpacked egg directories: + + egg_path = "/path/to/PackageName-ver-pyver-etc.egg" + metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) + dist = Distribution.from_filename(egg_path, metadata=metadata) + """ + + def __init__(self, path, egg_info): + self.module_path = path + self.egg_info = egg_info + + +class EggMetadata(ZipProvider): + """Metadata provider for .egg files""" + + def __init__(self, importer): + """Create a metadata provider from a zipimporter""" + + self.zipinfo = build_zipmanifest(importer.archive) + self.zip_pre = importer.archive+os.sep + self.loader = importer + if importer.prefix: + self.module_path = os.path.join(importer.archive, importer.prefix) + else: + self.module_path = importer.archive + self._setup_prefix() + + +class ImpWrapper: + """PEP 302 Importer that wraps Python's "normal" import algorithm""" + + def __init__(self, path=None): + self.path = path + + def find_module(self, fullname, path=None): + subname = fullname.split(".")[-1] + if subname != fullname and self.path is None: + return None + if self.path is None: + path = None + else: + path = [self.path] + try: + file, filename, etc = imp.find_module(subname, path) + except ImportError: + return None + return ImpLoader(file, filename, etc) + + +class ImpLoader: + """PEP 302 Loader that wraps Python's "normal" import algorithm""" + + def __init__(self, file, filename, etc): + self.file = file + self.filename = filename + self.etc = etc + + def load_module(self, fullname): + try: + mod = imp.load_module(fullname, self.file, self.filename, self.etc) + finally: + if self.file: self.file.close() + # Note: we don't set __loader__ because we want the module to look + # normal; i.e. this is just a wrapper for standard import machinery + return mod + + + + +def get_importer(path_item): + """Retrieve a PEP 302 "importer" for the given path item + + If there is no importer, this returns a wrapper around the builtin import + machinery. The returned importer is only cached if it was created by a + path hook. + """ + try: + importer = sys.path_importer_cache[path_item] + except KeyError: + for hook in sys.path_hooks: + try: + importer = hook(path_item) + except ImportError: + pass + else: + break + else: + importer = None + + sys.path_importer_cache.setdefault(path_item,importer) + if importer is None: + try: + importer = ImpWrapper(path_item) + except ImportError: + pass + return importer + +try: + from pkgutil import get_importer, ImpImporter +except ImportError: + pass # Python 2.3 or 2.4, use our own implementation +else: + ImpWrapper = ImpImporter # Python 2.5, use pkgutil's implementation + del ImpLoader, ImpImporter + + + + + + +_declare_state('dict', _distribution_finders = {}) + +def register_finder(importer_type, distribution_finder): + """Register `distribution_finder` to find distributions in sys.path items + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `distribution_finder` is a callable that, passed a path + item and the importer instance, yields ``Distribution`` instances found on + that path item. See ``pkg_resources.find_on_path`` for an example.""" + _distribution_finders[importer_type] = distribution_finder + + +def find_distributions(path_item, only=False): + """Yield distributions accessible via `path_item`""" + importer = get_importer(path_item) + finder = _find_adapter(_distribution_finders, importer) + return finder(importer, path_item, only) + +def find_in_zip(importer, path_item, only=False): + metadata = EggMetadata(importer) + if metadata.has_metadata('PKG-INFO'): + yield Distribution.from_filename(path_item, metadata=metadata) + if only: + return # don't yield nested distros + for subitem in metadata.resource_listdir('/'): + if subitem.endswith('.egg'): + subpath = os.path.join(path_item, subitem) + for dist in find_in_zip(zipimport.zipimporter(subpath), subpath): + yield dist + +register_finder(zipimport.zipimporter, find_in_zip) + +def find_nothing(importer, path_item, only=False): + return () +register_finder(object,find_nothing) + +def find_on_path(importer, path_item, only=False): + """Yield distributions accessible on a sys.path directory""" + path_item = _normalize_cached(path_item) + + if os.path.isdir(path_item) and os.access(path_item, os.R_OK): + if path_item.lower().endswith('.egg'): + # unpacked egg + yield Distribution.from_filename( + path_item, metadata=PathMetadata( + path_item, os.path.join(path_item,'EGG-INFO') + ) + ) + else: + # scan for .egg and .egg-info in directory + for entry in os.listdir(path_item): + lower = entry.lower() + if lower.endswith('.egg-info') or lower.endswith('.dist-info'): + fullpath = os.path.join(path_item, entry) + if os.path.isdir(fullpath): + # egg-info directory, allow getting metadata + metadata = PathMetadata(path_item, fullpath) + else: + metadata = FileMetadata(fullpath) + yield Distribution.from_location( + path_item,entry,metadata,precedence=DEVELOP_DIST + ) + elif not only and lower.endswith('.egg'): + for dist in find_distributions(os.path.join(path_item, entry)): + yield dist + elif not only and lower.endswith('.egg-link'): + entry_file = open(os.path.join(path_item, entry)) + try: + entry_lines = entry_file.readlines() + finally: + entry_file.close() + for line in entry_lines: + if not line.strip(): continue + for item in find_distributions(os.path.join(path_item,line.rstrip())): + yield item + break +register_finder(ImpWrapper,find_on_path) + +if importlib_bootstrap is not None: + register_finder(importlib_bootstrap.FileFinder, find_on_path) + +_declare_state('dict', _namespace_handlers={}) +_declare_state('dict', _namespace_packages={}) + + +def register_namespace_handler(importer_type, namespace_handler): + """Register `namespace_handler` to declare namespace packages + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `namespace_handler` is a callable like this:: + + def namespace_handler(importer,path_entry,moduleName,module): + # return a path_entry to use for child packages + + Namespace handlers are only called if the importer object has already + agreed that it can handle the relevant path item, and they should only + return a subpath if the module __path__ does not already contain an + equivalent subpath. For an example namespace handler, see + ``pkg_resources.file_ns_handler``. + """ + _namespace_handlers[importer_type] = namespace_handler + +def _handle_ns(packageName, path_item): + """Ensure that named package includes a subpath of path_item (if needed)""" + importer = get_importer(path_item) + if importer is None: + return None + loader = importer.find_module(packageName) + if loader is None: + return None + module = sys.modules.get(packageName) + if module is None: + module = sys.modules[packageName] = imp.new_module(packageName) + module.__path__ = []; _set_parent_ns(packageName) + elif not hasattr(module,'__path__'): + raise TypeError("Not a package:", packageName) + handler = _find_adapter(_namespace_handlers, importer) + subpath = handler(importer,path_item,packageName,module) + if subpath is not None: + path = module.__path__; path.append(subpath) + loader.load_module(packageName); module.__path__ = path + return subpath + +def declare_namespace(packageName): + """Declare that package 'packageName' is a namespace package""" + + imp.acquire_lock() + try: + if packageName in _namespace_packages: + return + + path, parent = sys.path, None + if '.' in packageName: + parent = '.'.join(packageName.split('.')[:-1]) + declare_namespace(parent) + if parent not in _namespace_packages: + __import__(parent) + try: + path = sys.modules[parent].__path__ + except AttributeError: + raise TypeError("Not a package:", parent) + + # Track what packages are namespaces, so when new path items are added, + # they can be updated + _namespace_packages.setdefault(parent,[]).append(packageName) + _namespace_packages.setdefault(packageName,[]) + + for path_item in path: + # Ensure all the parent's path items are reflected in the child, + # if they apply + _handle_ns(packageName, path_item) + + finally: + imp.release_lock() + +def fixup_namespace_packages(path_item, parent=None): + """Ensure that previously-declared namespace packages include path_item""" + imp.acquire_lock() + try: + for package in _namespace_packages.get(parent,()): + subpath = _handle_ns(package, path_item) + if subpath: fixup_namespace_packages(subpath,package) + finally: + imp.release_lock() + +def file_ns_handler(importer, path_item, packageName, module): + """Compute an ns-package subpath for a filesystem or zipfile importer""" + + subpath = os.path.join(path_item, packageName.split('.')[-1]) + normalized = _normalize_cached(subpath) + for item in module.__path__: + if _normalize_cached(item)==normalized: + break + else: + # Only return the path if it's not already there + return subpath + +register_namespace_handler(ImpWrapper,file_ns_handler) +register_namespace_handler(zipimport.zipimporter,file_ns_handler) + +if importlib_bootstrap is not None: + register_namespace_handler(importlib_bootstrap.FileFinder, file_ns_handler) + + +def null_ns_handler(importer, path_item, packageName, module): + return None + +register_namespace_handler(object,null_ns_handler) + + +def normalize_path(filename): + """Normalize a file/dir name for comparison purposes""" + return os.path.normcase(os.path.realpath(filename)) + +def _normalize_cached(filename,_cache={}): + try: + return _cache[filename] + except KeyError: + _cache[filename] = result = normalize_path(filename) + return result + +def _set_parent_ns(packageName): + parts = packageName.split('.') + name = parts.pop() + if parts: + parent = '.'.join(parts) + setattr(sys.modules[parent], name, sys.modules[packageName]) + + +def yield_lines(strs): + """Yield non-empty/non-comment lines of a ``basestring`` or sequence""" + if isinstance(strs,basestring): + for s in strs.splitlines(): + s = s.strip() + if s and not s.startswith('#'): # skip blank lines/comments + yield s + else: + for ss in strs: + for s in yield_lines(ss): + yield s + +LINE_END = re.compile(r"\s*(#.*)?$").match # whitespace and comment +CONTINUE = re.compile(r"\s*\\\s*(#.*)?$").match # line continuation +DISTRO = re.compile(r"\s*((\w|[-.])+)").match # Distribution or extra +VERSION = re.compile(r"\s*(<=?|>=?|==|!=)\s*((\w|[-.])+)").match # ver. info +COMMA = re.compile(r"\s*,").match # comma between items +OBRACKET = re.compile(r"\s*\[").match +CBRACKET = re.compile(r"\s*\]").match +MODULE = re.compile(r"\w+(\.\w+)*$").match +EGG_NAME = re.compile( + r"(?P<name>[^-]+)" + r"( -(?P<ver>[^-]+) (-py(?P<pyver>[^-]+) (-(?P<plat>.+))? )? )?", + re.VERBOSE | re.IGNORECASE +).match + +component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE) +replace = {'pre':'c', 'preview':'c','-':'final-','rc':'c','dev':'@'}.get + +def _parse_version_parts(s): + for part in component_re.split(s): + part = replace(part,part) + if not part or part=='.': + continue + if part[:1] in '0123456789': + yield part.zfill(8) # pad for numeric comparison + else: + yield '*'+part + + yield '*final' # ensure that alpha/beta/candidate are before final + +def parse_version(s): + """Convert a version string to a chronologically-sortable key + + This is a rough cross between distutils' StrictVersion and LooseVersion; + if you give it versions that would work with StrictVersion, then it behaves + the same; otherwise it acts like a slightly-smarter LooseVersion. It is + *possible* to create pathological version coding schemes that will fool + this parser, but they should be very rare in practice. + + The returned value will be a tuple of strings. Numeric portions of the + version are padded to 8 digits so they will compare numerically, but + without relying on how numbers compare relative to strings. Dots are + dropped, but dashes are retained. Trailing zeros between alpha segments + or dashes are suppressed, so that e.g. "2.4.0" is considered the same as + "2.4". Alphanumeric parts are lower-cased. + + The algorithm assumes that strings like "-" and any alpha string that + alphabetically follows "final" represents a "patch level". So, "2.4-1" + is assumed to be a branch or patch of "2.4", and therefore "2.4.1" is + considered newer than "2.4-1", which in turn is newer than "2.4". + + Strings like "a", "b", "c", "alpha", "beta", "candidate" and so on (that + come before "final" alphabetically) are assumed to be pre-release versions, + so that the version "2.4" is considered newer than "2.4a1". + + Finally, to handle miscellaneous cases, the strings "pre", "preview", and + "rc" are treated as if they were "c", i.e. as though they were release + candidates, and therefore are not as new as a version string that does not + contain them, and "dev" is replaced with an '@' so that it sorts lower than + than any other pre-release tag. + """ + parts = [] + for part in _parse_version_parts(s.lower()): + if part.startswith('*'): + if part<'*final': # remove '-' before a prerelease tag + while parts and parts[-1]=='*final-': parts.pop() + # remove trailing zeros from each series of numeric parts + while parts and parts[-1]=='00000000': + parts.pop() + parts.append(part) + return tuple(parts) +class EntryPoint(object): + """Object representing an advertised importable object""" + + def __init__(self, name, module_name, attrs=(), extras=(), dist=None): + if not MODULE(module_name): + raise ValueError("Invalid module name", module_name) + self.name = name + self.module_name = module_name + self.attrs = tuple(attrs) + self.extras = Requirement.parse(("x[%s]" % ','.join(extras))).extras + self.dist = dist + + def __str__(self): + s = "%s = %s" % (self.name, self.module_name) + if self.attrs: + s += ':' + '.'.join(self.attrs) + if self.extras: + s += ' [%s]' % ','.join(self.extras) + return s + + def __repr__(self): + return "EntryPoint.parse(%r)" % str(self) + + def load(self, require=True, env=None, installer=None): + if require: self.require(env, installer) + entry = __import__(self.module_name, globals(),globals(), ['__name__']) + for attr in self.attrs: + try: + entry = getattr(entry,attr) + except AttributeError: + raise ImportError("%r has no %r attribute" % (entry,attr)) + return entry + + def require(self, env=None, installer=None): + if self.extras and not self.dist: + raise UnknownExtra("Can't require() without a distribution", self) + list(map(working_set.add, + working_set.resolve(self.dist.requires(self.extras),env,installer))) + + + + #@classmethod + def parse(cls, src, dist=None): + """Parse a single entry point from string `src` + + Entry point syntax follows the form:: + + name = some.module:some.attr [extra1,extra2] + + The entry name and module name are required, but the ``:attrs`` and + ``[extras]`` parts are optional + """ + try: + attrs = extras = () + name,value = src.split('=',1) + if '[' in value: + value,extras = value.split('[',1) + req = Requirement.parse("x["+extras) + if req.specs: raise ValueError + extras = req.extras + if ':' in value: + value,attrs = value.split(':',1) + if not MODULE(attrs.rstrip()): + raise ValueError + attrs = attrs.rstrip().split('.') + except ValueError: + raise ValueError( + "EntryPoint must be in 'name=module:attrs [extras]' format", + src + ) + else: + return cls(name.strip(), value.strip(), attrs, extras, dist) + + parse = classmethod(parse) + + + + + + + + + #@classmethod + def parse_group(cls, group, lines, dist=None): + """Parse an entry point group""" + if not MODULE(group): + raise ValueError("Invalid group name", group) + this = {} + for line in yield_lines(lines): + ep = cls.parse(line, dist) + if ep.name in this: + raise ValueError("Duplicate entry point", group, ep.name) + this[ep.name]=ep + return this + + parse_group = classmethod(parse_group) + + #@classmethod + def parse_map(cls, data, dist=None): + """Parse a map of entry point groups""" + if isinstance(data,dict): + data = data.items() + else: + data = split_sections(data) + maps = {} + for group, lines in data: + if group is None: + if not lines: + continue + raise ValueError("Entry points must be listed in groups") + group = group.strip() + if group in maps: + raise ValueError("Duplicate group name", group) + maps[group] = cls.parse_group(group, lines, dist) + return maps + + parse_map = classmethod(parse_map) + + +def _remove_md5_fragment(location): + if not location: + return '' + parsed = urlparse(location) + if parsed[-1].startswith('md5='): + return urlunparse(parsed[:-1] + ('',)) + return location + + +class Distribution(object): + """Wrap an actual or potential sys.path entry w/metadata""" + PKG_INFO = 'PKG-INFO' + + def __init__(self, + location=None, metadata=None, project_name=None, version=None, + py_version=PY_MAJOR, platform=None, precedence = EGG_DIST + ): + self.project_name = safe_name(project_name or 'Unknown') + if version is not None: + self._version = safe_version(version) + self.py_version = py_version + self.platform = platform + self.location = location + self.precedence = precedence + self._provider = metadata or empty_provider + + #@classmethod + def from_location(cls,location,basename,metadata=None,**kw): + project_name, version, py_version, platform = [None]*4 + basename, ext = os.path.splitext(basename) + if ext.lower() in _distributionImpl: + # .dist-info gets much metadata differently + match = EGG_NAME(basename) + if match: + project_name, version, py_version, platform = match.group( + 'name','ver','pyver','plat' + ) + cls = _distributionImpl[ext.lower()] + return cls( + location, metadata, project_name=project_name, version=version, + py_version=py_version, platform=platform, **kw + ) + from_location = classmethod(from_location) + + + hashcmp = property( + lambda self: ( + getattr(self,'parsed_version',()), + self.precedence, + self.key, + _remove_md5_fragment(self.location), + self.py_version, + self.platform + ) + ) + def __hash__(self): return hash(self.hashcmp) + def __lt__(self, other): + return self.hashcmp < other.hashcmp + def __le__(self, other): + return self.hashcmp <= other.hashcmp + def __gt__(self, other): + return self.hashcmp > other.hashcmp + def __ge__(self, other): + return self.hashcmp >= other.hashcmp + def __eq__(self, other): + if not isinstance(other, self.__class__): + # It's not a Distribution, so they are not equal + return False + return self.hashcmp == other.hashcmp + def __ne__(self, other): + return not self == other + + # These properties have to be lazy so that we don't have to load any + # metadata until/unless it's actually needed. (i.e., some distributions + # may not know their name or version without loading PKG-INFO) + + #@property + def key(self): + try: + return self._key + except AttributeError: + self._key = key = self.project_name.lower() + return key + key = property(key) + + #@property + def parsed_version(self): + try: + return self._parsed_version + except AttributeError: + self._parsed_version = pv = parse_version(self.version) + return pv + + parsed_version = property(parsed_version) + + #@property + def version(self): + try: + return self._version + except AttributeError: + for line in self._get_metadata(self.PKG_INFO): + if line.lower().startswith('version:'): + self._version = safe_version(line.split(':',1)[1].strip()) + return self._version + else: + raise ValueError( + "Missing 'Version:' header and/or %s file" % self.PKG_INFO, self + ) + version = property(version) + + + + + #@property + def _dep_map(self): + try: + return self.__dep_map + except AttributeError: + dm = self.__dep_map = {None: []} + for name in 'requires.txt', 'depends.txt': + for extra,reqs in split_sections(self._get_metadata(name)): + if extra: + if ':' in extra: + extra, marker = extra.split(':',1) + if invalid_marker(marker): + reqs=[] # XXX warn + elif not evaluate_marker(marker): + reqs=[] + extra = safe_extra(extra) or None + dm.setdefault(extra,[]).extend(parse_requirements(reqs)) + return dm + _dep_map = property(_dep_map) + + def requires(self,extras=()): + """List of Requirements needed for this distro if `extras` are used""" + dm = self._dep_map + deps = [] + deps.extend(dm.get(None,())) + for ext in extras: + try: + deps.extend(dm[safe_extra(ext)]) + except KeyError: + raise UnknownExtra( + "%s has no such extra feature %r" % (self, ext) + ) + return deps + + def _get_metadata(self,name): + if self.has_metadata(name): + for line in self.get_metadata_lines(name): + yield line + + + + def activate(self,path=None): + """Ensure distribution is importable on `path` (default=sys.path)""" + if path is None: path = sys.path + self.insert_on(path) + if path is sys.path: + fixup_namespace_packages(self.location) + list(map(declare_namespace, self._get_metadata('namespace_packages.txt'))) + + + def egg_name(self): + """Return what this distribution's standard .egg filename should be""" + filename = "%s-%s-py%s" % ( + to_filename(self.project_name), to_filename(self.version), + self.py_version or PY_MAJOR + ) + + if self.platform: + filename += '-'+self.platform + return filename + + def __repr__(self): + if self.location: + return "%s (%s)" % (self,self.location) + else: + return str(self) + + def __str__(self): + try: version = getattr(self,'version',None) + except ValueError: version = None + version = version or "[unknown version]" + return "%s %s" % (self.project_name,version) + + def __getattr__(self,attr): + """Delegate all unrecognized public attributes to .metadata provider""" + if attr.startswith('_'): + raise AttributeError(attr) + return getattr(self._provider, attr) + + + + + #@classmethod + def from_filename(cls,filename,metadata=None, **kw): + return cls.from_location( + _normalize_cached(filename), os.path.basename(filename), metadata, + **kw + ) + from_filename = classmethod(from_filename) + + def as_requirement(self): + """Return a ``Requirement`` that matches this distribution exactly""" + return Requirement.parse('%s==%s' % (self.project_name, self.version)) + + def load_entry_point(self, group, name): + """Return the `name` entry point of `group` or raise ImportError""" + ep = self.get_entry_info(group,name) + if ep is None: + raise ImportError("Entry point %r not found" % ((group,name),)) + return ep.load() + + def get_entry_map(self, group=None): + """Return the entry point map for `group`, or the full entry map""" + try: + ep_map = self._ep_map + except AttributeError: + ep_map = self._ep_map = EntryPoint.parse_map( + self._get_metadata('entry_points.txt'), self + ) + if group is not None: + return ep_map.get(group,{}) + return ep_map + + def get_entry_info(self, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return self.get_entry_map(group).get(name) + + + + + + + + def insert_on(self, path, loc = None): + """Insert self.location in path before its nearest parent directory""" + + loc = loc or self.location + if not loc: + return + + nloc = _normalize_cached(loc) + bdir = os.path.dirname(nloc) + npath= [(p and _normalize_cached(p) or p) for p in path] + + bp = None + for p, item in enumerate(npath): + if item==nloc: + break + elif item==bdir and self.precedence==EGG_DIST: + # if it's an .egg, give it precedence over its directory + if path is sys.path: + self.check_version_conflict() + path.insert(p, loc) + npath.insert(p, nloc) + break + else: + if path is sys.path: + self.check_version_conflict() + path.append(loc) + return + + # p is the spot where we found or inserted loc; now remove duplicates + while 1: + try: + np = npath.index(nloc, p+1) + except ValueError: + break + else: + del npath[np], path[np] + p = np # ha! + + return + + + def check_version_conflict(self): + if self.key=='setuptools': + return # ignore the inevitable setuptools self-conflicts :( + + nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) + loc = normalize_path(self.location) + for modname in self._get_metadata('top_level.txt'): + if (modname not in sys.modules or modname in nsp + or modname in _namespace_packages + ): + continue + if modname in ('pkg_resources', 'setuptools', 'site'): + continue + fn = getattr(sys.modules[modname], '__file__', None) + if fn and (normalize_path(fn).startswith(loc) or + fn.startswith(self.location)): + continue + issue_warning( + "Module %s was already imported from %s, but %s is being added" + " to sys.path" % (modname, fn, self.location), + ) + + def has_version(self): + try: + self.version + except ValueError: + issue_warning("Unbuilt egg for "+repr(self)) + return False + return True + + def clone(self,**kw): + """Copy this distribution, substituting in any changed keyword args""" + for attr in ( + 'project_name', 'version', 'py_version', 'platform', 'location', + 'precedence' + ): + kw.setdefault(attr, getattr(self,attr,None)) + kw.setdefault('metadata', self._provider) + return self.__class__(**kw) + + + + + #@property + def extras(self): + return [dep for dep in self._dep_map if dep] + extras = property(extras) + + +class DistInfoDistribution(Distribution): + """Wrap an actual or potential sys.path entry w/metadata, .dist-info style""" + PKG_INFO = 'METADATA' + EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") + + @property + def _parsed_pkg_info(self): + """Parse and cache metadata""" + try: + return self._pkg_info + except AttributeError: + from email.parser import Parser + self._pkg_info = Parser().parsestr(self.get_metadata(self.PKG_INFO)) + return self._pkg_info + + @property + def _dep_map(self): + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._compute_dependencies() + return self.__dep_map + + def _preparse_requirement(self, requires_dist): + """Convert 'Foobar (1); baz' to ('Foobar ==1', 'baz') + Split environment marker, add == prefix to version specifiers as + necessary, and remove parenthesis. + """ + parts = requires_dist.split(';', 1) + [''] + distvers = parts[0].strip() + mark = parts[1].strip() + distvers = re.sub(self.EQEQ, r"\1==\2\3", distvers) + distvers = distvers.replace('(', '').replace(')', '') + return (distvers, mark) + + def _compute_dependencies(self): + """Recompute this distribution's dependencies.""" + from _markerlib import compile as compile_marker + dm = self.__dep_map = {None: []} + + reqs = [] + # Including any condition expressions + for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: + distvers, mark = self._preparse_requirement(req) + parsed = next(parse_requirements(distvers)) + parsed.marker_fn = compile_marker(mark) + reqs.append(parsed) + + def reqs_for_extra(extra): + for req in reqs: + if req.marker_fn(override={'extra':extra}): + yield req + + common = frozenset(reqs_for_extra(None)) + dm[None].extend(common) + + for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: + extra = safe_extra(extra.strip()) + dm[extra] = list(frozenset(reqs_for_extra(extra)) - common) + + return dm + + +_distributionImpl = {'.egg': Distribution, + '.egg-info': Distribution, + '.dist-info': DistInfoDistribution } + + +def issue_warning(*args,**kw): + level = 1 + g = globals() + try: + # find the first stack frame that is *not* code in + # the pkg_resources module, to use for the warning + while sys._getframe(level).f_globals is g: + level += 1 + except ValueError: + pass + from warnings import warn + warn(stacklevel = level+1, *args, **kw) + + + + + + + + + + + + + + + + + + + + + + + +def parse_requirements(strs): + """Yield ``Requirement`` objects for each specification in `strs` + + `strs` must be an instance of ``basestring``, or a (possibly-nested) + iterable thereof. + """ + # create a steppable iterator, so we can handle \-continuations + lines = iter(yield_lines(strs)) + + def scan_list(ITEM,TERMINATOR,line,p,groups,item_name): + + items = [] + + while not TERMINATOR(line,p): + if CONTINUE(line,p): + try: + line = next(lines); p = 0 + except StopIteration: + raise ValueError( + "\\ must not appear on the last nonblank line" + ) + + match = ITEM(line,p) + if not match: + raise ValueError("Expected "+item_name+" in",line,"at",line[p:]) + + items.append(match.group(*groups)) + p = match.end() + + match = COMMA(line,p) + if match: + p = match.end() # skip the comma + elif not TERMINATOR(line,p): + raise ValueError( + "Expected ',' or end-of-list in",line,"at",line[p:] + ) + + match = TERMINATOR(line,p) + if match: p = match.end() # skip the terminator, if any + return line, p, items + + for line in lines: + match = DISTRO(line) + if not match: + raise ValueError("Missing distribution spec", line) + project_name = match.group(1) + p = match.end() + extras = [] + + match = OBRACKET(line,p) + if match: + p = match.end() + line, p, extras = scan_list( + DISTRO, CBRACKET, line, p, (1,), "'extra' name" + ) + + line, p, specs = scan_list(VERSION,LINE_END,line,p,(1,2),"version spec") + specs = [(op,safe_version(val)) for op,val in specs] + yield Requirement(project_name, specs, extras) + + +def _sort_dists(dists): + tmp = [(dist.hashcmp,dist) for dist in dists] + tmp.sort() + dists[::-1] = [d for hc,d in tmp] + + + + + + + + + + + + + + + + + +class Requirement: + def __init__(self, project_name, specs, extras): + """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" + self.unsafe_name, project_name = project_name, safe_name(project_name) + self.project_name, self.key = project_name, project_name.lower() + index = [(parse_version(v),state_machine[op],op,v) for op,v in specs] + index.sort() + self.specs = [(op,ver) for parsed,trans,op,ver in index] + self.index, self.extras = index, tuple(map(safe_extra,extras)) + self.hashCmp = ( + self.key, tuple([(op,parsed) for parsed,trans,op,ver in index]), + frozenset(self.extras) + ) + self.__hash = hash(self.hashCmp) + + def __str__(self): + specs = ','.join([''.join(s) for s in self.specs]) + extras = ','.join(self.extras) + if extras: extras = '[%s]' % extras + return '%s%s%s' % (self.project_name, extras, specs) + + def __eq__(self,other): + return isinstance(other,Requirement) and self.hashCmp==other.hashCmp + + def __contains__(self,item): + if isinstance(item,Distribution): + if item.key != self.key: return False + if self.index: item = item.parsed_version # only get if we need it + elif isinstance(item,basestring): + item = parse_version(item) + last = None + compare = lambda a, b: (a > b) - (a < b) # -1, 0, 1 + for parsed,trans,op,ver in self.index: + action = trans[compare(item,parsed)] # Indexing: 0, 1, -1 + if action=='F': return False + elif action=='T': return True + elif action=='+': last = True + elif action=='-' or last is None: last = False + if last is None: last = True # no rules encountered + return last + + + def __hash__(self): + return self.__hash + + def __repr__(self): return "Requirement.parse(%r)" % str(self) + + #@staticmethod + def parse(s): + reqs = list(parse_requirements(s)) + if reqs: + if len(reqs)==1: + return reqs[0] + raise ValueError("Expected only one requirement", s) + raise ValueError("No requirements found", s) + + parse = staticmethod(parse) + +state_machine = { + # =>< + '<' : '--T', + '<=': 'T-T', + '>' : 'F+F', + '>=': 'T+F', + '==': 'T..', + '!=': 'F++', +} + + +def _get_mro(cls): + """Get an mro for a type or classic class""" + if not isinstance(cls,type): + class cls(cls,object): pass + return cls.__mro__[1:] + return cls.__mro__ + +def _find_adapter(registry, ob): + """Return an adapter factory for `ob` from `registry`""" + for t in _get_mro(getattr(ob, '__class__', type(ob))): + if t in registry: + return registry[t] + + +def ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): + os.makedirs(dirname) + +def split_sections(s): + """Split a string or iterable thereof into (section,content) pairs + + Each ``section`` is a stripped version of the section header ("[section]") + and each ``content`` is a list of stripped lines excluding blank lines and + comment-only lines. If there are any such lines before the first section + header, they're returned in a first ``section`` of ``None``. + """ + section = None + content = [] + for line in yield_lines(s): + if line.startswith("["): + if line.endswith("]"): + if section or content: + yield section, content + section = line[1:-1].strip() + content = [] + else: + raise ValueError("Invalid section heading", line) + else: + content.append(line) + + # wrap up last segment + yield section, content + +def _mkstemp(*args,**kw): + from tempfile import mkstemp + old_open = os.open + try: + os.open = os_open # temporarily bypass sandboxing + return mkstemp(*args,**kw) + finally: + os.open = old_open # and then put it back + + +# Set up global resource manager (deliberately not state-saved) +_manager = ResourceManager() +def _initialize(g): + for name in dir(_manager): + if not name.startswith('_'): + g[name] = getattr(_manager, name) +_initialize(globals()) + +# Prepare the master working set and make the ``require()`` API available +_declare_state('object', working_set = WorkingSet()) +try: + # Does the main program list any requirements? + from __main__ import __requires__ +except ImportError: + pass # No: just use the default working set based on sys.path +else: + # Yes: ensure the requirements are met, by prefixing sys.path if necessary + try: + working_set.require(__requires__) + except VersionConflict: # try it without defaults already on sys.path + working_set = WorkingSet([]) # by starting with an empty path + for dist in working_set.resolve( + parse_requirements(__requires__), Environment() + ): + working_set.add(dist) + for entry in sys.path: # add any missing entries from sys.path + if entry not in working_set.entries: + working_set.add_entry(entry) + sys.path[:] = working_set.entries # then copy back to sys.path + +require = working_set.require +iter_entry_points = working_set.iter_entry_points +add_activation_listener = working_set.subscribe +run_script = working_set.run_script +run_main = run_script # backward compatibility +# Activate all distributions already on sys.path, and ensure that +# all distributions added to the working set in the future (e.g. by +# calling ``require()``) will get activated as well. +add_activation_listener(lambda dist: dist.activate()) +working_set.entries=[]; list(map(working_set.add_entry,sys.path)) # match order + diff --git a/PythonEnv/2.7/Lib/site-packages/pkg_resources.pyc b/PythonEnv/2.7/Lib/site-packages/pkg_resources.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6111bf85a512bb1891f0a689d713a01f1d9c11b8 GIT binary patch literal 118433 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/PKG-INFO b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/PKG-INFO new file mode 100644 index 0000000000..5cc6f0b29f --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/PKG-INFO @@ -0,0 +1,960 @@ +Metadata-Version: 1.1 +Name: setuptools +Version: 0.9.8 +Summary: Easily download, build, install, upgrade, and uninstall Python packages +Home-page: https://pypi.python.org/pypi/setuptools +Author: Python Packaging Authority +Author-email: distutils-sig@python.org +License: PSF or ZPL +Description: =============================== + Installing and Using Setuptools + =============================== + + .. contents:: **Table of Contents** + + + ------------------------- + Installation Instructions + ------------------------- + + Upgrading from Distribute + ========================= + + Currently, Distribute disallows installing Setuptools 0.7+ over Distribute. + You must first uninstall any active version of Distribute first (see + `Uninstalling`_). + + Upgrading from Setuptools 0.6 + ============================= + + Upgrading from prior versions of Setuptools is supported. Initial reports + good success in this regard. + + Windows + ======= + + The recommended way to install setuptools on Windows is to download + `ez_setup.py`_ and run it. The script will download the appropriate .egg + file and install it for you. + + .. _ez_setup.py: https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py + + For best results, uninstall previous versions FIRST (see `Uninstalling`_). + + Once installation is complete, you will find an ``easy_install.exe`` program in + your Python ``Scripts`` subdirectory. For simple invocation and best results, + add this directory to your ``PATH`` environment variable, if it is not already + present. + + + Unix-based Systems including Mac OS X + ===================================== + + Download `ez_setup.py`_ and run it using the target Python version. The script + will download the appropriate version and install it for you:: + + > wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | python + + Note that you will may need to invoke the command with superuser privileges to + install to the system Python. + + Alternatively, on Python 2.6 and later, Setuptools may be installed to a + user-local path:: + + > wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py + > python ez_setup.py --user + + + Advanced Installation + ===================== + + For more advanced installation options, such as installing to custom + locations or prefixes, download and extract the source + tarball from `Setuptools on PyPI <https://pypi.python.org/pypi/setuptools>`_ + and run setup.py with any supported distutils and Setuptools options. + For example:: + + setuptools-x.x$ python setup.py --prefix=/opt/setuptools + + Use ``--help`` to get a full options list, but we recommend consulting + the `EasyInstall manual`_ for detailed instructions, especially `the section + on custom installation locations`_. + + .. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall + .. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations + + + Downloads + ========= + + All setuptools downloads can be found at `the project's home page in the Python + Package Index`_. Scroll to the very bottom of the page to find the links. + + .. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools + + In addition to the PyPI downloads, the development version of ``setuptools`` + is available from the `Bitbucket repo`_, and in-development versions of the + `0.6 branch`_ are available as well. + + .. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev + .. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06 + + Uninstalling + ============ + + On Windows, if Setuptools was installed using an ``.exe`` or ``.msi`` + installer, simply use the uninstall feature of "Add/Remove Programs" in the + Control Panel. + + Otherwise, to uninstall Setuptools or Distribute, regardless of the Python + version, delete all ``setuptools*`` and ``distribute*`` files and + directories from your system's ``site-packages`` directory + (and any other ``sys.path`` directories) FIRST. + + If you are upgrading or otherwise plan to re-install Setuptools or Distribute, + nothing further needs to be done. If you want to completely remove Setuptools, + you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts + and associated executables installed to the Python scripts directory. + + -------------------------------- + Using Setuptools and EasyInstall + -------------------------------- + + Here are some of the available manuals, tutorials, and other resources for + learning about Setuptools, Python Eggs, and EasyInstall: + + * `The EasyInstall user's guide and reference manual`_ + * `The setuptools Developer's Guide`_ + * `The pkg_resources API reference`_ + * `Package Compatibility Notes`_ (user-maintained) + * `The Internal Structure of Python Eggs`_ + + Questions, comments, and bug reports should be directed to the `distutils-sig + mailing list`_. If you have written (or know of) any tutorials, documentation, + plug-ins, or other resources for setuptools users, please let us know about + them there, so this reference list can be updated. If you have working, + *tested* patches to correct problems or add features, you may submit them to + the `setuptools bug tracker`_. + + .. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues + .. _Package Compatibility Notes: https://pythonhosted.org/setuptools/PackageNotes + .. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html + .. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html + .. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html + .. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html + .. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/ + + + ------- + Credits + ------- + + * The original design for the ``.egg`` format and the ``pkg_resources`` API was + co-created by Phillip Eby and Bob Ippolito. Bob also implemented the first + version of ``pkg_resources``, and supplied the OS X operating system version + compatibility algorithm. + + * Ian Bicking implemented many early "creature comfort" features of + easy_install, including support for downloading via Sourceforge and + Subversion repositories. Ian's comments on the Web-SIG about WSGI + application deployment also inspired the concept of "entry points" in eggs, + and he has given talks at PyCon and elsewhere to inform and educate the + community about eggs and setuptools. + + * Jim Fulton contributed time and effort to build automated tests of various + aspects of ``easy_install``, and supplied the doctests for the command-line + ``.exe`` wrappers on Windows. + + * Phillip J. Eby is the seminal author of setuptools, and + first proposed the idea of an importable binary distribution format for + Python application plug-ins. + + * Significant parts of the implementation of setuptools were funded by the Open + Source Applications Foundation, to provide a plug-in infrastructure for the + Chandler PIM application. In addition, many OSAF staffers (such as Mike + "Code Bear" Taylor) contributed their time and stress as guinea pigs for the + use of eggs and setuptools, even before eggs were "cool". (Thanks, guys!) + + * Since the merge with Distribute, Jason R. Coombs is the + maintainer of setuptools. The project is maintained in coordination with + the Python Packaging Authority (PyPA) and the larger Python community. + + .. _files: + + ======= + CHANGES + ======= + + ----- + 0.9.8 + ----- + + * `Issue #53 <https://bitbucket.org/pypa/setuptools/issue/53>`_: Fix NameErrors in `_vcs_split_rev_from_url`. + + ----- + 0.9.7 + ----- + + * `Issue #49 <https://bitbucket.org/pypa/setuptools/issue/49>`_: Correct AttributeError on PyPy where a hashlib.HASH object does + not have a `.name` attribute. + * `Issue #34 <https://bitbucket.org/pypa/setuptools/issue/34>`_: Documentation now refers to bootstrap script in code repository + referenced by bookmark. + * Add underscore-separated keys to environment markers (markerlib). + + ----- + 0.9.6 + ----- + + * `Issue #44 <https://bitbucket.org/pypa/setuptools/issue/44>`_: Test failure on Python 2.4 when MD5 hash doesn't have a `.name` + attribute. + + ----- + 0.9.5 + ----- + + * `Python #17980 <http://bugs.python.org/issue17980>`_: Fix security vulnerability in SSL certificate validation. + + ----- + 0.9.4 + ----- + + * `Issue #43 <https://bitbucket.org/pypa/setuptools/issue/43>`_: Fix issue (introduced in 0.9.1) with version resolution when + upgrading over other releases of Setuptools. + + ----- + 0.9.3 + ----- + + * `Issue #42 <https://bitbucket.org/pypa/setuptools/issue/42>`_: Fix new ``AttributeError`` introduced in last fix. + + ----- + 0.9.2 + ----- + + * `Issue #42 <https://bitbucket.org/pypa/setuptools/issue/42>`_: Fix regression where blank checksums would trigger an + ``AttributeError``. + + ----- + 0.9.1 + ----- + + * `Distribute #386 <https://bitbucket.org/tarek/distribute/issue/386>`_: Allow other positional and keyword arguments to os.open. + * Corrected dependency on certifi mis-referenced in 0.9. + + --- + 0.9 + --- + + * `package_index` now validates hashes other than MD5 in download links. + + --- + 0.8 + --- + + * Code base now runs on Python 2.4 - Python 3.3 without Python 2to3 + conversion. + + ----- + 0.7.8 + ----- + + * `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Yet another fix for yet another regression. + + ----- + 0.7.7 + ----- + + * `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Repair AttributeError created in last release (redo). + * `Issue #30 <https://bitbucket.org/pypa/setuptools/issue/30>`_: Added test for get_cache_path. + + ----- + 0.7.6 + ----- + + * `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Repair AttributeError created in last release. + + ----- + 0.7.5 + ----- + + * `Issue #21 <https://bitbucket.org/pypa/setuptools/issue/21>`_: Restore Python 2.4 compatibility in ``test_easy_install``. + * `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Merged additional warning from Distribute 0.6.46. + * Now honor the environment variable + ``SETUPTOOLS_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT`` in addition to the now + deprecated ``DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT``. + + ----- + 0.7.4 + ----- + + * `Issue #20 <https://bitbucket.org/pypa/setuptools/issue/20>`_: Fix comparison of parsed SVN version on Python 3. + + ----- + 0.7.3 + ----- + + * `Issue #1 <https://bitbucket.org/pypa/setuptools/issue/1>`_: Disable installation of Windows-specific files on non-Windows systems. + * Use new sysconfig module with Python 2.7 or >=3.2. + + ----- + 0.7.2 + ----- + + * `Issue #14 <https://bitbucket.org/pypa/setuptools/issue/14>`_: Use markerlib when the `parser` module is not available. + * `Issue #10 <https://bitbucket.org/pypa/setuptools/issue/10>`_: ``ez_setup.py`` now uses HTTPS to download setuptools from PyPI. + + ----- + 0.7.1 + ----- + + * Fix NameError (`Issue #3 <https://bitbucket.org/pypa/setuptools/issue/3>`_) again - broken in bad merge. + + --- + 0.7 + --- + + * Merged Setuptools and Distribute. See docs/merge.txt for details. + + Added several features that were slated for setuptools 0.6c12: + + * Index URL now defaults to HTTPS. + * Added experimental environment marker support. Now clients may designate a + PEP-426 environment marker for "extra" dependencies. Setuptools uses this + feature in ``setup.py`` for optional SSL and certificate validation support + on older platforms. Based on Distutils-SIG discussions, the syntax is + somewhat tentative. There should probably be a PEP with a firmer spec before + the feature should be considered suitable for use. + * Added support for SSL certificate validation when installing packages from + an HTTPS service. + + ----- + 0.7b4 + ----- + + * `Issue #3 <https://bitbucket.org/pypa/setuptools/issue/3>`_: Fixed NameError in SSL support. + + ------ + 0.6.49 + ------ + + * Move warning check in ``get_cache_path`` to follow the directory creation + to avoid errors when the cache path does not yet exist. Fixes the error + reported in `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_. + + ------ + 0.6.48 + ------ + + * Correct AttributeError in ``ResourceManager.get_cache_path`` introduced in + 0.6.46 (redo). + + ------ + 0.6.47 + ------ + + * Correct AttributeError in ``ResourceManager.get_cache_path`` introduced in + 0.6.46. + + ------ + 0.6.46 + ------ + + * `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Issue a warning if the PYTHON_EGG_CACHE or otherwise + customized egg cache location specifies a directory that's group- or + world-writable. + + ------ + 0.6.45 + ------ + + * `Distribute #379 <https://bitbucket.org/tarek/distribute/issue/379>`_: ``distribute_setup.py`` now traps VersionConflict as well, + restoring ability to upgrade from an older setuptools version. + + ------ + 0.6.44 + ------ + + * ``distribute_setup.py`` has been updated to allow Setuptools 0.7 to + satisfy use_setuptools. + + ------ + 0.6.43 + ------ + + * `Distribute #378 <https://bitbucket.org/tarek/distribute/issue/378>`_: Restore support for Python 2.4 Syntax (regression in 0.6.42). + + ------ + 0.6.42 + ------ + + * External links finder no longer yields duplicate links. + * `Distribute #337 <https://bitbucket.org/tarek/distribute/issue/337>`_: Moved site.py to setuptools/site-patch.py (graft of very old + patch from setuptools trunk which inspired PR `#31 <https://bitbucket.org/pypa/setuptools/issue/31>`_). + + ------ + 0.6.41 + ------ + + * `Distribute #27 <https://bitbucket.org/tarek/distribute/issue/27>`_: Use public api for loading resources from zip files rather than + the private method `_zip_directory_cache`. + * Added a new function ``easy_install.get_win_launcher`` which may be used by + third-party libraries such as buildout to get a suitable script launcher. + + ------ + 0.6.40 + ------ + + * `Distribute #376 <https://bitbucket.org/tarek/distribute/issue/376>`_: brought back cli.exe and gui.exe that were deleted in the + previous release. + + ------ + 0.6.39 + ------ + + * Add support for console launchers on ARM platforms. + * Fix possible issue in GUI launchers where the subsystem was not supplied to + the linker. + * Launcher build script now refactored for robustness. + * `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Resources extracted from a zip egg to the file system now also + check the contents of the file against the zip contents during each + invocation of get_resource_filename. + + ------ + 0.6.38 + ------ + + * `Distribute #371 <https://bitbucket.org/tarek/distribute/issue/371>`_: The launcher manifest file is now installed properly. + + ------ + 0.6.37 + ------ + + * `Distribute #143 <https://bitbucket.org/tarek/distribute/issue/143>`_: Launcher scripts, including easy_install itself, are now + accompanied by a manifest on 32-bit Windows environments to avoid the + Installer Detection Technology and thus undesirable UAC elevation described + in `this Microsoft article + <http://technet.microsoft.com/en-us/library/cc709628%28WS.10%29.aspx>`_. + + ------ + 0.6.36 + ------ + + * Pull Request `#35 <https://bitbucket.org/pypa/setuptools/issue/35>`_: In `Buildout #64 <https://github.com/buildout/buildout/issues/64>`_, it was reported that + under Python 3, installation of distutils scripts could attempt to copy + the ``__pycache__`` directory as a file, causing an error, apparently only + under Windows. Easy_install now skips all directories when processing + metadata scripts. + + ------ + 0.6.35 + ------ + + + Note this release is backward-incompatible with distribute 0.6.23-0.6.34 in + how it parses version numbers. + + * `Distribute #278 <https://bitbucket.org/tarek/distribute/issue/278>`_: Restored compatibility with distribute 0.6.22 and setuptools + 0.6. Updated the documentation to match more closely with the version + parsing as intended in setuptools 0.6. + + ------ + 0.6.34 + ------ + + * `Distribute #341 <https://bitbucket.org/tarek/distribute/issue/341>`_: 0.6.33 fails to build under Python 2.4. + + ------ + 0.6.33 + ------ + + * Fix 2 errors with Jython 2.5. + * Fix 1 failure with Jython 2.5 and 2.7. + * Disable workaround for Jython scripts on Linux systems. + * `Distribute #336 <https://bitbucket.org/tarek/distribute/issue/336>`_: `setup.py` no longer masks failure exit code when tests fail. + * Fix issue in pkg_resources where try/except around a platform-dependent + import would trigger hook load failures on Mercurial. See pull request 32 + for details. + * `Distribute #341 <https://bitbucket.org/tarek/distribute/issue/341>`_: Fix a ResourceWarning. + + ------ + 0.6.32 + ------ + + * Fix test suite with Python 2.6. + * Fix some DeprecationWarnings and ResourceWarnings. + * `Distribute #335 <https://bitbucket.org/tarek/distribute/issue/335>`_: Backed out `setup_requires` superceding installed requirements + until regression can be addressed. + + ------ + 0.6.31 + ------ + + * `Distribute #303 <https://bitbucket.org/tarek/distribute/issue/303>`_: Make sure the manifest only ever contains UTF-8 in Python 3. + * `Distribute #329 <https://bitbucket.org/tarek/distribute/issue/329>`_: Properly close files created by tests for compatibility with + Jython. + * Work around `Jython #1980 <http://bugs.jython.org/issue1980>`_ and `Jython #1981 <http://bugs.jython.org/issue1981>`_. + * `Distribute #334 <https://bitbucket.org/tarek/distribute/issue/334>`_: Provide workaround for packages that reference `sys.__stdout__` + such as numpy does. This change should address + `virtualenv `#359 <https://bitbucket.org/pypa/setuptools/issue/359>`_ <https://github.com/pypa/virtualenv/issues/359>`_ as long + as the system encoding is UTF-8 or the IO encoding is specified in the + environment, i.e.:: + + PYTHONIOENCODING=utf8 pip install numpy + + * Fix for encoding issue when installing from Windows executable on Python 3. + * `Distribute #323 <https://bitbucket.org/tarek/distribute/issue/323>`_: Allow `setup_requires` requirements to supercede installed + requirements. Added some new keyword arguments to existing pkg_resources + methods. Also had to updated how __path__ is handled for namespace packages + to ensure that when a new egg distribution containing a namespace package is + placed on sys.path, the entries in __path__ are found in the same order they + would have been in had that egg been on the path when pkg_resources was + first imported. + + ------ + 0.6.30 + ------ + + * `Distribute #328 <https://bitbucket.org/tarek/distribute/issue/328>`_: Clean up temporary directories in distribute_setup.py. + * Fix fatal bug in distribute_setup.py. + + ------ + 0.6.29 + ------ + + * Pull Request `#14 <https://bitbucket.org/pypa/setuptools/issue/14>`_: Honor file permissions in zip files. + * `Distribute #327 <https://bitbucket.org/tarek/distribute/issue/327>`_: Merged pull request `#24 <https://bitbucket.org/pypa/setuptools/issue/24>`_ to fix a dependency problem with pip. + * Merged pull request `#23 <https://bitbucket.org/pypa/setuptools/issue/23>`_ to fix https://github.com/pypa/virtualenv/issues/301. + * If Sphinx is installed, the `upload_docs` command now runs `build_sphinx` + to produce uploadable documentation. + * `Distribute #326 <https://bitbucket.org/tarek/distribute/issue/326>`_: `upload_docs` provided mangled auth credentials under Python 3. + * `Distribute #320 <https://bitbucket.org/tarek/distribute/issue/320>`_: Fix check for "createable" in distribute_setup.py. + * `Distribute #305 <https://bitbucket.org/tarek/distribute/issue/305>`_: Remove a warning that was triggered during normal operations. + * `Distribute #311 <https://bitbucket.org/tarek/distribute/issue/311>`_: Print metadata in UTF-8 independent of platform. + * `Distribute #303 <https://bitbucket.org/tarek/distribute/issue/303>`_: Read manifest file with UTF-8 encoding under Python 3. + * `Distribute #301 <https://bitbucket.org/tarek/distribute/issue/301>`_: Allow to run tests of namespace packages when using 2to3. + * `Distribute #304 <https://bitbucket.org/tarek/distribute/issue/304>`_: Prevent import loop in site.py under Python 3.3. + * `Distribute #283 <https://bitbucket.org/tarek/distribute/issue/283>`_: Reenable scanning of `*.pyc` / `*.pyo` files on Python 3.3. + * `Distribute #299 <https://bitbucket.org/tarek/distribute/issue/299>`_: The develop command didn't work on Python 3, when using 2to3, + as the egg link would go to the Python 2 source. Linking to the 2to3'd code + in build/lib makes it work, although you will have to rebuild the module + before testing it. + * `Distribute #306 <https://bitbucket.org/tarek/distribute/issue/306>`_: Even if 2to3 is used, we build in-place under Python 2. + * `Distribute #307 <https://bitbucket.org/tarek/distribute/issue/307>`_: Prints the full path when .svn/entries is broken. + * `Distribute #313 <https://bitbucket.org/tarek/distribute/issue/313>`_: Support for sdist subcommands (Python 2.7) + * `Distribute #314 <https://bitbucket.org/tarek/distribute/issue/314>`_: test_local_index() would fail an OS X. + * `Distribute #310 <https://bitbucket.org/tarek/distribute/issue/310>`_: Non-ascii characters in a namespace __init__.py causes errors. + * `Distribute #218 <https://bitbucket.org/tarek/distribute/issue/218>`_: Improved documentation on behavior of `package_data` and + `include_package_data`. Files indicated by `package_data` are now included + in the manifest. + * `distribute_setup.py` now allows a `--download-base` argument for retrieving + distribute from a specified location. + + ------ + 0.6.28 + ------ + + * `Distribute #294 <https://bitbucket.org/tarek/distribute/issue/294>`_: setup.py can now be invoked from any directory. + * Scripts are now installed honoring the umask. + * Added support for .dist-info directories. + * `Distribute #283 <https://bitbucket.org/tarek/distribute/issue/283>`_: Fix and disable scanning of `*.pyc` / `*.pyo` files on + Python 3.3. + + ------ + 0.6.27 + ------ + + * Support current snapshots of CPython 3.3. + * Distribute now recognizes README.rst as a standard, default readme file. + * Exclude 'encodings' modules when removing modules from sys.modules. + Workaround for `#285 <https://bitbucket.org/pypa/setuptools/issue/285>`_. + * `Distribute #231 <https://bitbucket.org/tarek/distribute/issue/231>`_: Don't fiddle with system python when used with buildout + (bootstrap.py) + + ------ + 0.6.26 + ------ + + * `Distribute #183 <https://bitbucket.org/tarek/distribute/issue/183>`_: Symlinked files are now extracted from source distributions. + * `Distribute #227 <https://bitbucket.org/tarek/distribute/issue/227>`_: Easy_install fetch parameters are now passed during the + installation of a source distribution; now fulfillment of setup_requires + dependencies will honor the parameters passed to easy_install. + + ------ + 0.6.25 + ------ + + * `Distribute #258 <https://bitbucket.org/tarek/distribute/issue/258>`_: Workaround a cache issue + * `Distribute #260 <https://bitbucket.org/tarek/distribute/issue/260>`_: distribute_setup.py now accepts the --user parameter for + Python 2.6 and later. + * `Distribute #262 <https://bitbucket.org/tarek/distribute/issue/262>`_: package_index.open_with_auth no longer throws LookupError + on Python 3. + * `Distribute #269 <https://bitbucket.org/tarek/distribute/issue/269>`_: AttributeError when an exception occurs reading Manifest.in + on late releases of Python. + * `Distribute #272 <https://bitbucket.org/tarek/distribute/issue/272>`_: Prevent TypeError when namespace package names are unicode + and single-install-externally-managed is used. Also fixes PIP issue + 449. + * `Distribute #273 <https://bitbucket.org/tarek/distribute/issue/273>`_: Legacy script launchers now install with Python2/3 support. + + ------ + 0.6.24 + ------ + + * `Distribute #249 <https://bitbucket.org/tarek/distribute/issue/249>`_: Added options to exclude 2to3 fixers + + ------ + 0.6.23 + ------ + + * `Distribute #244 <https://bitbucket.org/tarek/distribute/issue/244>`_: Fixed a test + * `Distribute #243 <https://bitbucket.org/tarek/distribute/issue/243>`_: Fixed a test + * `Distribute #239 <https://bitbucket.org/tarek/distribute/issue/239>`_: Fixed a test + * `Distribute #240 <https://bitbucket.org/tarek/distribute/issue/240>`_: Fixed a test + * `Distribute #241 <https://bitbucket.org/tarek/distribute/issue/241>`_: Fixed a test + * `Distribute #237 <https://bitbucket.org/tarek/distribute/issue/237>`_: Fixed a test + * `Distribute #238 <https://bitbucket.org/tarek/distribute/issue/238>`_: easy_install now uses 64bit executable wrappers on 64bit Python + * `Distribute #208 <https://bitbucket.org/tarek/distribute/issue/208>`_: Fixed parsed_versions, it now honors post-releases as noted in the documentation + * `Distribute #207 <https://bitbucket.org/tarek/distribute/issue/207>`_: Windows cli and gui wrappers pass CTRL-C to child python process + * `Distribute #227 <https://bitbucket.org/tarek/distribute/issue/227>`_: easy_install now passes its arguments to setup.py bdist_egg + * `Distribute #225 <https://bitbucket.org/tarek/distribute/issue/225>`_: Fixed a NameError on Python 2.5, 2.4 + + ------ + 0.6.21 + ------ + + * `Distribute #225 <https://bitbucket.org/tarek/distribute/issue/225>`_: FIxed a regression on py2.4 + + ------ + 0.6.20 + ------ + + * `Distribute #135 <https://bitbucket.org/tarek/distribute/issue/135>`_: Include url in warning when processing URLs in package_index. + * `Distribute #212 <https://bitbucket.org/tarek/distribute/issue/212>`_: Fix issue where easy_instal fails on Python 3 on windows installer. + * `Distribute #213 <https://bitbucket.org/tarek/distribute/issue/213>`_: Fix typo in documentation. + + ------ + 0.6.19 + ------ + + * `Distribute #206 <https://bitbucket.org/tarek/distribute/issue/206>`_: AttributeError: 'HTTPMessage' object has no attribute 'getheaders' + + ------ + 0.6.18 + ------ + + * `Distribute #210 <https://bitbucket.org/tarek/distribute/issue/210>`_: Fixed a regression introduced by `Distribute #204 <https://bitbucket.org/tarek/distribute/issue/204>`_ fix. + + ------ + 0.6.17 + ------ + + * Support 'DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT' environment + variable to allow to disable installation of easy_install-${version} script. + * Support Python >=3.1.4 and >=3.2.1. + * `Distribute #204 <https://bitbucket.org/tarek/distribute/issue/204>`_: Don't try to import the parent of a namespace package in + declare_namespace + * `Distribute #196 <https://bitbucket.org/tarek/distribute/issue/196>`_: Tolerate responses with multiple Content-Length headers + * `Distribute #205 <https://bitbucket.org/tarek/distribute/issue/205>`_: Sandboxing doesn't preserve working_set. Leads to setup_requires + problems. + + ------ + 0.6.16 + ------ + + * Builds sdist gztar even on Windows (avoiding `Distribute #193 <https://bitbucket.org/tarek/distribute/issue/193>`_). + * `Distribute #192 <https://bitbucket.org/tarek/distribute/issue/192>`_: Fixed metadata omitted on Windows when package_dir + specified with forward-slash. + * `Distribute #195 <https://bitbucket.org/tarek/distribute/issue/195>`_: Cython build support. + * `Distribute #200 <https://bitbucket.org/tarek/distribute/issue/200>`_: Issues with recognizing 64-bit packages on Windows. + + ------ + 0.6.15 + ------ + + * Fixed typo in bdist_egg + * Several issues under Python 3 has been solved. + * `Distribute #146 <https://bitbucket.org/tarek/distribute/issue/146>`_: Fixed missing DLL files after easy_install of windows exe package. + + ------ + 0.6.14 + ------ + + * `Distribute #170 <https://bitbucket.org/tarek/distribute/issue/170>`_: Fixed unittest failure. Thanks to Toshio. + * `Distribute #171 <https://bitbucket.org/tarek/distribute/issue/171>`_: Fixed race condition in unittests cause deadlocks in test suite. + * `Distribute #143 <https://bitbucket.org/tarek/distribute/issue/143>`_: Fixed a lookup issue with easy_install. + Thanks to David and Zooko. + * `Distribute #174 <https://bitbucket.org/tarek/distribute/issue/174>`_: Fixed the edit mode when its used with setuptools itself + + ------ + 0.6.13 + ------ + + * `Distribute #160 <https://bitbucket.org/tarek/distribute/issue/160>`_: 2.7 gives ValueError("Invalid IPv6 URL") + * `Distribute #150 <https://bitbucket.org/tarek/distribute/issue/150>`_: Fixed using ~/.local even in a --no-site-packages virtualenv + * `Distribute #163 <https://bitbucket.org/tarek/distribute/issue/163>`_: scan index links before external links, and don't use the md5 when + comparing two distributions + + ------ + 0.6.12 + ------ + + * `Distribute #149 <https://bitbucket.org/tarek/distribute/issue/149>`_: Fixed various failures on 2.3/2.4 + + ------ + 0.6.11 + ------ + + * Found another case of SandboxViolation - fixed + * `Distribute #15 <https://bitbucket.org/tarek/distribute/issue/15>`_ and `Distribute #48 <https://bitbucket.org/tarek/distribute/issue/48>`_: Introduced a socket timeout of 15 seconds on url openings + * Added indexsidebar.html into MANIFEST.in + * `Distribute #108 <https://bitbucket.org/tarek/distribute/issue/108>`_: Fixed TypeError with Python3.1 + * `Distribute #121 <https://bitbucket.org/tarek/distribute/issue/121>`_: Fixed --help install command trying to actually install. + * `Distribute #112 <https://bitbucket.org/tarek/distribute/issue/112>`_: Added an os.makedirs so that Tarek's solution will work. + * `Distribute #133 <https://bitbucket.org/tarek/distribute/issue/133>`_: Added --no-find-links to easy_install + * Added easy_install --user + * `Distribute #100 <https://bitbucket.org/tarek/distribute/issue/100>`_: Fixed develop --user not taking '.' in PYTHONPATH into account + * `Distribute #134 <https://bitbucket.org/tarek/distribute/issue/134>`_: removed spurious UserWarnings. Patch by VanLindberg + * `Distribute #138 <https://bitbucket.org/tarek/distribute/issue/138>`_: cant_write_to_target error when setup_requires is used. + * `Distribute #147 <https://bitbucket.org/tarek/distribute/issue/147>`_: respect the sys.dont_write_bytecode flag + + ------ + 0.6.10 + ------ + + * Reverted change made for the DistributionNotFound exception because + zc.buildout uses the exception message to get the name of the + distribution. + + ----- + 0.6.9 + ----- + + * `Distribute #90 <https://bitbucket.org/tarek/distribute/issue/90>`_: unknown setuptools version can be added in the working set + * `Distribute #87 <https://bitbucket.org/tarek/distribute/issue/87>`_: setupt.py doesn't try to convert distribute_setup.py anymore + Initial Patch by arfrever. + * `Distribute #89 <https://bitbucket.org/tarek/distribute/issue/89>`_: added a side bar with a download link to the doc. + * `Distribute #86 <https://bitbucket.org/tarek/distribute/issue/86>`_: fixed missing sentence in pkg_resources doc. + * Added a nicer error message when a DistributionNotFound is raised. + * `Distribute #80 <https://bitbucket.org/tarek/distribute/issue/80>`_: test_develop now works with Python 3.1 + * `Distribute #93 <https://bitbucket.org/tarek/distribute/issue/93>`_: upload_docs now works if there is an empty sub-directory. + * `Distribute #70 <https://bitbucket.org/tarek/distribute/issue/70>`_: exec bit on non-exec files + * `Distribute #99 <https://bitbucket.org/tarek/distribute/issue/99>`_: now the standalone easy_install command doesn't uses a + "setup.cfg" if any exists in the working directory. It will use it + only if triggered by ``install_requires`` from a setup.py call + (install, develop, etc). + * `Distribute #101 <https://bitbucket.org/tarek/distribute/issue/101>`_: Allowing ``os.devnull`` in Sandbox + * `Distribute #92 <https://bitbucket.org/tarek/distribute/issue/92>`_: Fixed the "no eggs" found error with MacPort + (platform.mac_ver() fails) + * `Distribute #103 <https://bitbucket.org/tarek/distribute/issue/103>`_: test_get_script_header_jython_workaround not run + anymore under py3 with C or POSIX local. Contributed by Arfrever. + * `Distribute #104 <https://bitbucket.org/tarek/distribute/issue/104>`_: remvoved the assertion when the installation fails, + with a nicer message for the end user. + * `Distribute #100 <https://bitbucket.org/tarek/distribute/issue/100>`_: making sure there's no SandboxViolation when + the setup script patches setuptools. + + ----- + 0.6.8 + ----- + + * Added "check_packages" in dist. (added in Setuptools 0.6c11) + * Fixed the DONT_PATCH_SETUPTOOLS state. + + ----- + 0.6.7 + ----- + + * `Distribute #58 <https://bitbucket.org/tarek/distribute/issue/58>`_: Added --user support to the develop command + * `Distribute #11 <https://bitbucket.org/tarek/distribute/issue/11>`_: Generated scripts now wrap their call to the script entry point + in the standard "if name == 'main'" + * Added the 'DONT_PATCH_SETUPTOOLS' environment variable, so virtualenv + can drive an installation that doesn't patch a global setuptools. + * Reviewed unladen-swallow specific change from + http://code.google.com/p/unladen-swallow/source/detail?spec=svn875&r=719 + and determined that it no longer applies. Distribute should work fine with + Unladen Swallow 2009Q3. + * `Distribute #21 <https://bitbucket.org/tarek/distribute/issue/21>`_: Allow PackageIndex.open_url to gracefully handle all cases of a + httplib.HTTPException instead of just InvalidURL and BadStatusLine. + * Removed virtual-python.py from this distribution and updated documentation + to point to the actively maintained virtualenv instead. + * `Distribute #64 <https://bitbucket.org/tarek/distribute/issue/64>`_: use_setuptools no longer rebuilds the distribute egg every + time it is run + * use_setuptools now properly respects the requested version + * use_setuptools will no longer try to import a distribute egg for the + wrong Python version + * `Distribute #74 <https://bitbucket.org/tarek/distribute/issue/74>`_: no_fake should be True by default. + * `Distribute #72 <https://bitbucket.org/tarek/distribute/issue/72>`_: avoid a bootstrapping issue with easy_install -U + + ----- + 0.6.6 + ----- + + * Unified the bootstrap file so it works on both py2.x and py3k without 2to3 + (patch by Holger Krekel) + + ----- + 0.6.5 + ----- + + * `Distribute #65 <https://bitbucket.org/tarek/distribute/issue/65>`_: cli.exe and gui.exe are now generated at build time, + depending on the platform in use. + + * `Distribute #67 <https://bitbucket.org/tarek/distribute/issue/67>`_: Fixed doc typo (PEP 381/382) + + * Distribute no longer shadows setuptools if we require a 0.7-series + setuptools. And an error is raised when installing a 0.7 setuptools with + distribute. + + * When run from within buildout, no attempt is made to modify an existing + setuptools egg, whether in a shared egg directory or a system setuptools. + + * Fixed a hole in sandboxing allowing builtin file to write outside of + the sandbox. + + ----- + 0.6.4 + ----- + + * Added the generation of `distribute_setup_3k.py` during the release. + This closes `Distribute #52 <https://bitbucket.org/tarek/distribute/issue/52>`_. + + * Added an upload_docs command to easily upload project documentation to + PyPI's https://pythonhosted.org. This close issue `Distribute #56 <https://bitbucket.org/tarek/distribute/issue/56>`_. + + * Fixed a bootstrap bug on the use_setuptools() API. + + ----- + 0.6.3 + ----- + + setuptools + ========== + + * Fixed a bunch of calls to file() that caused crashes on Python 3. + + bootstrapping + ============= + + * Fixed a bug in sorting that caused bootstrap to fail on Python 3. + + ----- + 0.6.2 + ----- + + setuptools + ========== + + * Added Python 3 support; see docs/python3.txt. + This closes `Old Setuptools #39 <http://bugs.python.org/setuptools/issue39>`_. + + * Added option to run 2to3 automatically when installing on Python 3. + This closes issue `Distribute #31 <https://bitbucket.org/tarek/distribute/issue/31>`_. + + * Fixed invalid usage of requirement.parse, that broke develop -d. + This closes `Old Setuptools #44 <http://bugs.python.org/setuptools/issue44>`_. + + * Fixed script launcher for 64-bit Windows. + This closes `Old Setuptools #2 <http://bugs.python.org/setuptools/issue2>`_. + + * KeyError when compiling extensions. + This closes `Old Setuptools #41 <http://bugs.python.org/setuptools/issue41>`_. + + bootstrapping + ============= + + * Fixed bootstrap not working on Windows. This closes issue `Distribute #49 <https://bitbucket.org/tarek/distribute/issue/49>`_. + + * Fixed 2.6 dependencies. This closes issue `Distribute #50 <https://bitbucket.org/tarek/distribute/issue/50>`_. + + * Make sure setuptools is patched when running through easy_install + This closes `Old Setuptools #40 <http://bugs.python.org/setuptools/issue40>`_. + + ----- + 0.6.1 + ----- + + setuptools + ========== + + * package_index.urlopen now catches BadStatusLine and malformed url errors. + This closes `Distribute #16 <https://bitbucket.org/tarek/distribute/issue/16>`_ and `Distribute #18 <https://bitbucket.org/tarek/distribute/issue/18>`_. + + * zip_ok is now False by default. This closes `Old Setuptools #33 <http://bugs.python.org/setuptools/issue33>`_. + + * Fixed invalid URL error catching. `Old Setuptools #20 <http://bugs.python.org/setuptools/issue20>`_. + + * Fixed invalid bootstraping with easy_install installation (`Distribute #40 <https://bitbucket.org/tarek/distribute/issue/40>`_). + Thanks to Florian Schulze for the help. + + * Removed buildout/bootstrap.py. A new repository will create a specific + bootstrap.py script. + + + bootstrapping + ============= + + * The boostrap process leave setuptools alone if detected in the system + and --root or --prefix is provided, but is not in the same location. + This closes `Distribute #10 <https://bitbucket.org/tarek/distribute/issue/10>`_. + + --- + 0.6 + --- + + setuptools + ========== + + * Packages required at build time where not fully present at install time. + This closes `Distribute #12 <https://bitbucket.org/tarek/distribute/issue/12>`_. + + * Protected against failures in tarfile extraction. This closes `Distribute #10 <https://bitbucket.org/tarek/distribute/issue/10>`_. + + * Made Jython api_tests.txt doctest compatible. This closes `Distribute #7 <https://bitbucket.org/tarek/distribute/issue/7>`_. + + * sandbox.py replaced builtin type file with builtin function open. This + closes `Distribute #6 <https://bitbucket.org/tarek/distribute/issue/6>`_. + + * Immediately close all file handles. This closes `Distribute #3 <https://bitbucket.org/tarek/distribute/issue/3>`_. + + * Added compatibility with Subversion 1.6. This references `Distribute #1 <https://bitbucket.org/tarek/distribute/issue/1>`_. + + pkg_resources + ============= + + * Avoid a call to /usr/bin/sw_vers on OSX and use the official platform API + instead. Based on a patch from ronaldoussoren. This closes issue `#5 <https://bitbucket.org/pypa/setuptools/issue/5>`_. + + * Fixed a SandboxViolation for mkdir that could occur in certain cases. + This closes `Distribute #13 <https://bitbucket.org/tarek/distribute/issue/13>`_. + + * Allow to find_on_path on systems with tight permissions to fail gracefully. + This closes `Distribute #9 <https://bitbucket.org/tarek/distribute/issue/9>`_. + + * Corrected inconsistency between documentation and code of add_entry. + This closes `Distribute #8 <https://bitbucket.org/tarek/distribute/issue/8>`_. + + * Immediately close all file handles. This closes `Distribute #3 <https://bitbucket.org/tarek/distribute/issue/3>`_. + + easy_install + ============ + + * Immediately close all file handles. This closes `Distribute #3 <https://bitbucket.org/tarek/distribute/issue/3>`_. + + +Keywords: CPAN PyPI distutils eggs package management +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Python Software Foundation License +Classifier: License :: OSI Approved :: Zope Public License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2.4 +Classifier: Programming Language :: Python :: 2.5 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.1 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: Topic :: System :: Systems Administration +Classifier: Topic :: Utilities diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/SOURCES.txt b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/SOURCES.txt new file mode 100644 index 0000000000..202fe0d443 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/SOURCES.txt @@ -0,0 +1,132 @@ +CHANGES (links).txt +CHANGES.txt +CONTRIBUTORS.txt +DEVGUIDE.txt +MANIFEST.in +README.txt +easy_install.py +ez_setup.py +launcher.c +pkg_resources.py +release.py +setup.cfg +setup.py +_markerlib/__init__.py +_markerlib/markers.py +docs/Makefile +docs/conf.py +docs/easy_install.txt +docs/formats.txt +docs/index.txt +docs/merge-faq.txt +docs/merge.txt +docs/pkg_resources.txt +docs/python3.txt +docs/roadmap.txt +docs/setuptools.txt +docs/using.txt +docs/_templates/indexsidebar.html +docs/_theme/nature/theme.conf +docs/_theme/nature/static/nature.css_t +docs/_theme/nature/static/pygments.css +docs/build/html/_sources/easy_install.txt +docs/build/html/_sources/formats.txt +docs/build/html/_sources/index.txt +docs/build/html/_sources/merge-faq.txt +docs/build/html/_sources/merge.txt +docs/build/html/_sources/pkg_resources.txt +docs/build/html/_sources/python3.txt +docs/build/html/_sources/roadmap.txt +docs/build/html/_sources/setuptools.txt +docs/build/html/_sources/using.txt +docs/build/html/_static/basic.css +docs/build/html/_static/nature.css +docs/build/html/_static/pygments.css +setuptools/__init__.py +setuptools/archive_util.py +setuptools/cli-32.exe +setuptools/cli-64.exe +setuptools/cli-arm-32.exe +setuptools/cli.exe +setuptools/compat.py +setuptools/depends.py +setuptools/dist.py +setuptools/extension.py +setuptools/gui-32.exe +setuptools/gui-64.exe +setuptools/gui-arm-32.exe +setuptools/gui.exe +setuptools/package_index.py +setuptools/py24compat.py +setuptools/py27compat.py +setuptools/sandbox.py +setuptools/script template (dev).py +setuptools/script template.py +setuptools/site-patch.py +setuptools/ssl_support.py +setuptools.egg-info/PKG-INFO +setuptools.egg-info/SOURCES.txt +setuptools.egg-info/dependency_links.txt +setuptools.egg-info/entry_points.txt +setuptools.egg-info/entry_points.txt.orig +setuptools.egg-info/requires.txt +setuptools.egg-info/top_level.txt +setuptools.egg-info/zip-safe +setuptools/_backport/__init__.py +setuptools/_backport/hashlib/__init__.py +setuptools/_backport/hashlib/_sha.py +setuptools/_backport/hashlib/_sha256.py +setuptools/_backport/hashlib/_sha512.py +setuptools/command/__init__.py +setuptools/command/alias.py +setuptools/command/bdist_egg.py +setuptools/command/bdist_rpm.py +setuptools/command/bdist_wininst.py +setuptools/command/build_ext.py +setuptools/command/build_py.py +setuptools/command/develop.py +setuptools/command/easy_install.py +setuptools/command/egg_info.py +setuptools/command/install.py +setuptools/command/install_egg_info.py +setuptools/command/install_lib.py +setuptools/command/install_scripts.py +setuptools/command/launcher manifest.xml +setuptools/command/register.py +setuptools/command/rotate.py +setuptools/command/saveopts.py +setuptools/command/sdist.py +setuptools/command/setopt.py +setuptools/command/test.py +setuptools/command/upload.py +setuptools/command/upload_docs.py +setuptools/tests/__init__.py +setuptools/tests/doctest.py +setuptools/tests/entries-v10 +setuptools/tests/py26compat.py +setuptools/tests/server.py +setuptools/tests/test_bdist_egg.py +setuptools/tests/test_build_ext.py +setuptools/tests/test_develop.py +setuptools/tests/test_dist_info.py +setuptools/tests/test_easy_install.py +setuptools/tests/test_egg_info.py +setuptools/tests/test_markerlib.py +setuptools/tests/test_packageindex.py +setuptools/tests/test_resources.py +setuptools/tests/test_sandbox.py +setuptools/tests/test_sdist.py +setuptools/tests/test_test.py +setuptools/tests/test_upload_docs.py +setuptools/tests/win_script_wrapper.txt +setuptools/tests/indexes/test_links_priority/external.html +setuptools/tests/indexes/test_links_priority/simple/foobar/index.html +tests/api_tests.txt +tests/manual_test.py +tests/test_ez_setup.py +tests/test_pkg_resources.py +tests/shlib_test/hello.c +tests/shlib_test/hello.pyx +tests/shlib_test/hellolib.c +tests/shlib_test/setup.py +tests/shlib_test/test_hello.py \ No newline at end of file diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/dependency_links.txt b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/dependency_links.txt new file mode 100644 index 0000000000..c688b7eaab --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/dependency_links.txt @@ -0,0 +1,6 @@ +https://pypi.python.org/packages/source/c/certifi/certifi-0.0.8.tar.gz#md5=dc5f5e7f0b5fc08d27654b17daa6ecec +https://pypi.python.org/packages/source/s/ssl/ssl-1.16.tar.gz#md5=fb12d335d56f3c8c7c1fefc1c06c4bfb +https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.1.zip#md5=2f9accbebe8f7b4c06ac7aa83879b81c +https://bitbucket.org/pypa/setuptools/downloads/ctypes-1.0.2.win32-py2.4.exe#md5=9092a0ad5a3d79fa2d980f1ddc5e9dbc +https://bitbucket.org/pypa/setuptools/downloads/ssl-1.16-py2.4-win32.egg#md5=3cfa2c526dc66e318e8520b6f1aadce5 +https://bitbucket.org/pypa/setuptools/downloads/ssl-1.16-py2.5-win32.egg#md5=85ad1cda806d639743121c0bbcb5f39b diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt new file mode 100644 index 0000000000..663882d630 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt @@ -0,0 +1,62 @@ +[distutils.commands] +bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm +rotate = setuptools.command.rotate:rotate +develop = setuptools.command.develop:develop +setopt = setuptools.command.setopt:setopt +build_py = setuptools.command.build_py:build_py +saveopts = setuptools.command.saveopts:saveopts +egg_info = setuptools.command.egg_info:egg_info +register = setuptools.command.register:register +upload_docs = setuptools.command.upload_docs:upload_docs +install_egg_info = setuptools.command.install_egg_info:install_egg_info +alias = setuptools.command.alias:alias +easy_install = setuptools.command.easy_install:easy_install +install_scripts = setuptools.command.install_scripts:install_scripts +bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst +bdist_egg = setuptools.command.bdist_egg:bdist_egg +install = setuptools.command.install:install +test = setuptools.command.test:test +install_lib = setuptools.command.install_lib:install_lib +build_ext = setuptools.command.build_ext:build_ext +sdist = setuptools.command.sdist:sdist + +[egg_info.writers] +dependency_links.txt = setuptools.command.egg_info:overwrite_arg +requires.txt = setuptools.command.egg_info:write_requirements +PKG-INFO = setuptools.command.egg_info:write_pkg_info +eager_resources.txt = setuptools.command.egg_info:overwrite_arg +top_level.txt = setuptools.command.egg_info:write_toplevel_names +namespace_packages.txt = setuptools.command.egg_info:overwrite_arg +entry_points.txt = setuptools.command.egg_info:write_entries +depends.txt = setuptools.command.egg_info:warn_depends_obsolete + +[console_scripts] +easy_install = setuptools.command.easy_install:main +easy_install-2.7 = setuptools.command.easy_install:main + +[setuptools.file_finders] +svn_cvs = setuptools.command.sdist:_default_revctrl + +[distutils.setup_keywords] +dependency_links = setuptools.dist:assert_string_list +entry_points = setuptools.dist:check_entry_points +extras_require = setuptools.dist:check_extras +use_2to3_exclude_fixers = setuptools.dist:assert_string_list +package_data = setuptools.dist:check_package_data +install_requires = setuptools.dist:check_requirements +use_2to3 = setuptools.dist:assert_bool +use_2to3_fixers = setuptools.dist:assert_string_list +include_package_data = setuptools.dist:assert_bool +exclude_package_data = setuptools.dist:check_package_data +namespace_packages = setuptools.dist:check_nsp +test_suite = setuptools.dist:check_test_suite +eager_resources = setuptools.dist:assert_string_list +zip_safe = setuptools.dist:assert_bool +test_loader = setuptools.dist:check_importable +packages = setuptools.dist:check_packages +convert_2to3_doctests = setuptools.dist:assert_string_list +tests_require = setuptools.dist:check_requirements + +[setuptools.installation] +eggsecutable = setuptools.command.easy_install:bootstrap + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt.orig b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt.orig new file mode 100644 index 0000000000..13aaba712a --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt.orig @@ -0,0 +1,62 @@ +[distutils.setup_keywords] +use_2to3 = setuptools.dist:assert_bool +test_loader = setuptools.dist:check_importable +namespace_packages = setuptools.dist:check_nsp +use_2to3_exclude_fixers = setuptools.dist:assert_string_list +package_data = setuptools.dist:check_package_data +packages = setuptools.dist:check_packages +use_2to3_fixers = setuptools.dist:assert_string_list +dependency_links = setuptools.dist:assert_string_list +entry_points = setuptools.dist:check_entry_points +install_requires = setuptools.dist:check_requirements +tests_require = setuptools.dist:check_requirements +convert_2to3_doctests = setuptools.dist:assert_string_list +test_suite = setuptools.dist:check_test_suite +include_package_data = setuptools.dist:assert_bool +eager_resources = setuptools.dist:assert_string_list +exclude_package_data = setuptools.dist:check_package_data +zip_safe = setuptools.dist:assert_bool +extras_require = setuptools.dist:check_extras + +[distutils.commands] +upload_docs = setuptools.command.upload_docs:upload_docs +setopt = setuptools.command.setopt:setopt +install = setuptools.command.install:install +bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst +install_egg_info = setuptools.command.install_egg_info:install_egg_info +easy_install = setuptools.command.easy_install:easy_install +test = setuptools.command.test:test +saveopts = setuptools.command.saveopts:saveopts +sdist = setuptools.command.sdist:sdist +rotate = setuptools.command.rotate:rotate +bdist_egg = setuptools.command.bdist_egg:bdist_egg +build_py = setuptools.command.build_py:build_py +install_scripts = setuptools.command.install_scripts:install_scripts +develop = setuptools.command.develop:develop +install_lib = setuptools.command.install_lib:install_lib +alias = setuptools.command.alias:alias +build_ext = setuptools.command.build_ext:build_ext +register = setuptools.command.register:register +bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm +egg_info = setuptools.command.egg_info:egg_info + +[console_scripts] +easy_install = setuptools.command.easy_install:main +easy_install-3.3 = setuptools.command.easy_install:main + +[egg_info.writers] +entry_points.txt = setuptools.command.egg_info:write_entries +requires.txt = setuptools.command.egg_info:write_requirements +namespace_packages.txt = setuptools.command.egg_info:overwrite_arg +dependency_links.txt = setuptools.command.egg_info:overwrite_arg +PKG-INFO = setuptools.command.egg_info:write_pkg_info +depends.txt = setuptools.command.egg_info:warn_depends_obsolete +top_level.txt = setuptools.command.egg_info:write_toplevel_names +eager_resources.txt = setuptools.command.egg_info:overwrite_arg + +[setuptools.installation] +eggsecutable = setuptools.command.easy_install:bootstrap + +[setuptools.file_finders] +svn_cvs = setuptools.command.sdist:_default_revctrl + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/requires.txt b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/requires.txt new file mode 100644 index 0000000000..91d84d9ca8 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/requires.txt @@ -0,0 +1,13 @@ + + +[ssl:sys_platform=='win32'] +wincertstore==0.1 + +[ssl:sys_platform=='win32' and python_version=='2.4'] +ctypes==1.0.2 + +[certs] +certifi==0.0.8 + +[ssl:python_version in '2.4, 2.5'] +ssl==1.16 \ No newline at end of file diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/top_level.txt b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/top_level.txt new file mode 100644 index 0000000000..5fe9a7ead7 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/top_level.txt @@ -0,0 +1,4 @@ +_markerlib +easy_install +pkg_resources +setuptools diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/zip-safe b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/zip-safe new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/zip-safe @@ -0,0 +1 @@ + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/__init__.py b/PythonEnv/2.7/Lib/site-packages/setuptools/__init__.py new file mode 100644 index 0000000000..8c708bd628 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/__init__.py @@ -0,0 +1,94 @@ +"""Extensions to the 'distutils' for large or complex distributions""" +from setuptools.extension import Extension, Library +from setuptools.dist import Distribution, Feature, _get_unpatched +import distutils.core, setuptools.command +from setuptools.depends import Require +from distutils.core import Command as _Command +from distutils.util import convert_path +import os +import sys + +__version__ = '0.9.8' +__all__ = [ + 'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require', + 'find_packages' +] + +bootstrap_install_from = None + +# If we run 2to3 on .py files, should we also convert docstrings? +# Default: yes; assume that we can detect doctests reliably +run_2to3_on_doctests = True +# Standard package names for fixer packages +lib2to3_fixer_packages = ['lib2to3.fixes'] + +def find_packages(where='.', exclude=()): + """Return a list all Python packages found within directory 'where' + + 'where' should be supplied as a "cross-platform" (i.e. URL-style) path; it + will be converted to the appropriate local path syntax. 'exclude' is a + sequence of package names to exclude; '*' can be used as a wildcard in the + names, such that 'foo.*' will exclude all subpackages of 'foo' (but not + 'foo' itself). + """ + out = [] + stack=[(convert_path(where), '')] + while stack: + where,prefix = stack.pop(0) + for name in os.listdir(where): + fn = os.path.join(where,name) + if ('.' not in name and os.path.isdir(fn) and + os.path.isfile(os.path.join(fn,'__init__.py')) + ): + out.append(prefix+name); stack.append((fn,prefix+name+'.')) + for pat in list(exclude)+['ez_setup']: + from fnmatch import fnmatchcase + out = [item for item in out if not fnmatchcase(item,pat)] + return out + +setup = distutils.core.setup + +_Command = _get_unpatched(_Command) + +class Command(_Command): + __doc__ = _Command.__doc__ + + command_consumes_arguments = False + + def __init__(self, dist, **kw): + # Add support for keyword arguments + _Command.__init__(self,dist) + for k,v in kw.items(): + setattr(self,k,v) + + def reinitialize_command(self, command, reinit_subcommands=0, **kw): + cmd = _Command.reinitialize_command(self, command, reinit_subcommands) + for k,v in kw.items(): + setattr(cmd,k,v) # update command with keywords + return cmd + +import distutils.core +distutils.core.Command = Command # we can't patch distutils.cmd, alas + +def findall(dir = os.curdir): + """Find all files under 'dir' and return the list of full filenames + (relative to 'dir'). + """ + all_files = [] + for base, dirs, files in os.walk(dir): + if base==os.curdir or base.startswith(os.curdir+os.sep): + base = base[2:] + if base: + files = [os.path.join(base, f) for f in files] + all_files.extend(filter(os.path.isfile, files)) + return all_files + +import distutils.filelist +distutils.filelist.findall = findall # fix findall bug in distutils. + +# sys.dont_write_bytecode was introduced in Python 2.6. +if ((hasattr(sys, "dont_write_bytecode") and sys.dont_write_bytecode) or + (not hasattr(sys, "dont_write_bytecode") and os.environ.get("PYTHONDONTWRITEBYTECODE"))): + _dont_write_bytecode = True +else: + _dont_write_bytecode = False diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3257e8e1cc8e9099f638658bff5729c10b1d326 GIT binary patch literal 4216 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 Nt^igx)fNipe*r23>a73( literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/__init__.py b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..982080c9b512d31df64b46ae21c0a3dca240a0a3 GIT binary patch literal 191 zcmZSn%*&Oe`y?=#0SXv_v;z<qvjB+{28Lh_kcgiKkYGR~iZeh;tYXqLOEOB6V!|`? z9COl&Qd5vvNtt;uE~!bS=`jJ7B^mj7u6boKMtbHkKAA}|#hE3kx&?{J*@@|?#WBUH zC8Y%=`T04;G4V-2!Gipvl9>4T%)HE!_;|g7$`THsWj49_DWy57b|5De12F>tFYz+x literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/__init__.py b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/__init__.py new file mode 100644 index 0000000000..5aeab496af --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/__init__.py @@ -0,0 +1,146 @@ +# $Id$ +# +# Copyright (C) 2005 Gregory P. Smith (greg@krypto.org) +# Licensed to PSF under a Contributor Agreement. +# + +__doc__ = """hashlib module - A common interface to many hash functions. + +new(name, string='') - returns a new hash object implementing the + given hash function; initializing the hash + using the given string data. + +Named constructor functions are also available, these are much faster +than using new(): + +md5(), sha1(), sha224(), sha256(), sha384(), and sha512() + +More algorithms may be available on your platform but the above are +guaranteed to exist. + +NOTE: If you want the adler32 or crc32 hash functions they are available in +the zlib module. + +Choose your hash function wisely. Some have known collision weaknesses. +sha384 and sha512 will be slow on 32 bit platforms. + +Hash objects have these methods: + - update(arg): Update the hash object with the string arg. Repeated calls + are equivalent to a single call with the concatenation of all + the arguments. + - digest(): Return the digest of the strings passed to the update() method + so far. This may contain non-ASCII characters, including + NUL bytes. + - hexdigest(): Like digest() except the digest is returned as a string of + double length, containing only hexadecimal digits. + - copy(): Return a copy (clone) of the hash object. This can be used to + efficiently compute the digests of strings that share a common + initial substring. + +For example, to obtain the digest of the string 'Nobody inspects the +spammish repetition': + + >>> import hashlib + >>> m = hashlib.md5() + >>> m.update("Nobody inspects") + >>> m.update(" the spammish repetition") + >>> m.digest() + '\\xbbd\\x9c\\x83\\xdd\\x1e\\xa5\\xc9\\xd9\\xde\\xc9\\xa1\\x8d\\xf0\\xff\\xe9' + +More condensed: + + >>> hashlib.sha224("Nobody inspects the spammish repetition").hexdigest() + 'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2' + +""" + +# This tuple and __get_builtin_constructor() must be modified if a new +# always available algorithm is added. +__always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512') + +algorithms = __always_supported + +__all__ = __always_supported + ('new', 'algorithms') + + +def __get_builtin_constructor(name): + try: + if name in ('SHA1', 'sha1'): + import _sha + return _sha.new + elif name in ('MD5', 'md5'): + import md5 + return md5.new + elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'): + import _sha256 + bs = name[3:] + if bs == '256': + return _sha256.sha256 + elif bs == '224': + return _sha256.sha224 + elif name in ('SHA512', 'sha512', 'SHA384', 'sha384'): + import _sha512 + bs = name[3:] + if bs == '512': + return _sha512.sha512 + elif bs == '384': + return _sha512.sha384 + except ImportError: + pass # no extension module, this hash is unsupported. + + raise ValueError('unsupported hash type %s' % name) + + +def __get_openssl_constructor(name): + try: + f = getattr(_hashlib, 'openssl_' + name) + # Allow the C module to raise ValueError. The function will be + # defined but the hash not actually available thanks to OpenSSL. + f() + # Use the C function directly (very fast) + return f + except (AttributeError, ValueError): + return __get_builtin_constructor(name) + + +def __py_new(name, string=''): + """new(name, string='') - Return a new hashing object using the named algorithm; + optionally initialized with a string. + """ + return __get_builtin_constructor(name)(string) + + +def __hash_new(name, string=''): + """new(name, string='') - Return a new hashing object using the named algorithm; + optionally initialized with a string. + """ + try: + return _hashlib.new(name, string) + except ValueError: + # If the _hashlib module (OpenSSL) doesn't support the named + # hash, try using our builtin implementations. + # This allows for SHA224/256 and SHA384/512 support even though + # the OpenSSL library prior to 0.9.8 doesn't provide them. + return __get_builtin_constructor(name)(string) + + +try: + import _hashlib + new = __hash_new + __get_hash = __get_openssl_constructor +except ImportError: + new = __py_new + __get_hash = __get_builtin_constructor + +for __func_name in __always_supported: + # try them all, some may not work due to the OpenSSL + # version not supporting that algorithm. + try: + globals()[__func_name] = __get_hash(__func_name) + except ValueError: + import logging + logging.exception('code for hash %s was not found.', __func_name) + +# Cleanup locals() +del __always_supported, __func_name, __get_hash +del __py_new, __hash_new, __get_openssl_constructor diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19af21fa4e7ebc591faa62a3fccde4f21240c285 GIT binary patch literal 4847 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 G>--NN2LgZq literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha.py b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha.py new file mode 100644 index 0000000000..d49993c887 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha.py @@ -0,0 +1,359 @@ +# -*- coding: iso-8859-1 -*- +"""A sample implementation of SHA-1 in pure Python. + + Framework adapted from Dinu Gherman's MD5 implementation by + J. Hallén and L. Creighton. SHA-1 implementation based directly on + the text of the NIST standard FIPS PUB 180-1. +""" + + +__date__ = '2004-11-17' +__version__ = 0.91 # Modernised by J. Hallén and L. Creighton for Pypy + + +import struct, copy + + +# ====================================================================== +# Bit-Manipulation helpers +# +# _long2bytes() was contributed by Barry Warsaw +# and is reused here with tiny modifications. +# ====================================================================== + +def _long2bytesBigEndian(n, blocksize=0): + """Convert a long integer to a byte string. + + If optional blocksize is given and greater than zero, pad the front + of the byte string with binary zeros so that the length is a multiple + of blocksize. + """ + + # After much testing, this algorithm was deemed to be the fastest. + s = '' + pack = struct.pack + while n > 0: + s = pack('>I', n & 0xffffffff) + s + n = n >> 32 + + # Strip off leading zeros. + for i in range(len(s)): + if s[i] != '\000': + break + else: + # Only happens when n == 0. + s = '\000' + i = 0 + + s = s[i:] + + # Add back some pad bytes. This could be done more efficiently + # w.r.t. the de-padding being done above, but sigh... + if blocksize > 0 and len(s) % blocksize: + s = (blocksize - len(s) % blocksize) * '\000' + s + + return s + + +def _bytelist2longBigEndian(list): + "Transform a list of characters into a list of longs." + + imax = len(list) // 4 + hl = [0] * imax + + j = 0 + i = 0 + while i < imax: + b0 = ord(list[j]) << 24 + b1 = ord(list[j+1]) << 16 + b2 = ord(list[j+2]) << 8 + b3 = ord(list[j+3]) + hl[i] = b0 | b1 | b2 | b3 + i = i+1 + j = j+4 + + return hl + + +def _rotateLeft(x, n): + "Rotate x (32 bit) left n bits circularly." + + return (x << n) | (x >> (32-n)) + + +# ====================================================================== +# The SHA transformation functions +# +# ====================================================================== + +def f0_19(B, C, D): + return (B & C) | ((~ B) & D) + +def f20_39(B, C, D): + return B ^ C ^ D + +def f40_59(B, C, D): + return (B & C) | (B & D) | (C & D) + +def f60_79(B, C, D): + return B ^ C ^ D + + +f = [f0_19, f20_39, f40_59, f60_79] + +# Constants to be used +K = [ + 0x5A827999, # ( 0 <= t <= 19) + 0x6ED9EBA1, # (20 <= t <= 39) + 0x8F1BBCDC, # (40 <= t <= 59) + 0xCA62C1D6 # (60 <= t <= 79) + ] + +class sha: + "An implementation of the MD5 hash function in pure Python." + + digest_size = digestsize = 20 + block_size = 1 + + def __init__(self): + "Initialisation." + + # Initial message length in bits(!). + self.length = 0 + self.count = [0, 0] + + # Initial empty message as a sequence of bytes (8 bit characters). + self.input = [] + + # Call a separate init function, that can be used repeatedly + # to start from scratch on the same object. + self.init() + + + def init(self): + "Initialize the message-digest and set all fields to zero." + + self.length = 0 + self.input = [] + + # Initial 160 bit message digest (5 times 32 bit). + self.H0 = 0x67452301 + self.H1 = 0xEFCDAB89 + self.H2 = 0x98BADCFE + self.H3 = 0x10325476 + self.H4 = 0xC3D2E1F0 + + def _transform(self, W): + + for t in range(16, 80): + W.append(_rotateLeft( + W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1) & 0xffffffff) + + A = self.H0 + B = self.H1 + C = self.H2 + D = self.H3 + E = self.H4 + + """ + This loop was unrolled to gain about 10% in speed + for t in range(0, 80): + TEMP = _rotateLeft(A, 5) + f[t/20] + E + W[t] + K[t/20] + E = D + D = C + C = _rotateLeft(B, 30) & 0xffffffff + B = A + A = TEMP & 0xffffffff + """ + + for t in range(0, 20): + TEMP = _rotateLeft(A, 5) + ((B & C) | ((~ B) & D)) + E + W[t] + K[0] + E = D + D = C + C = _rotateLeft(B, 30) & 0xffffffff + B = A + A = TEMP & 0xffffffff + + for t in range(20, 40): + TEMP = _rotateLeft(A, 5) + (B ^ C ^ D) + E + W[t] + K[1] + E = D + D = C + C = _rotateLeft(B, 30) & 0xffffffff + B = A + A = TEMP & 0xffffffff + + for t in range(40, 60): + TEMP = _rotateLeft(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2] + E = D + D = C + C = _rotateLeft(B, 30) & 0xffffffff + B = A + A = TEMP & 0xffffffff + + for t in range(60, 80): + TEMP = _rotateLeft(A, 5) + (B ^ C ^ D) + E + W[t] + K[3] + E = D + D = C + C = _rotateLeft(B, 30) & 0xffffffff + B = A + A = TEMP & 0xffffffff + + + self.H0 = (self.H0 + A) & 0xffffffff + self.H1 = (self.H1 + B) & 0xffffffff + self.H2 = (self.H2 + C) & 0xffffffff + self.H3 = (self.H3 + D) & 0xffffffff + self.H4 = (self.H4 + E) & 0xffffffff + + + # Down from here all methods follow the Python Standard Library + # API of the sha module. + + def update(self, inBuf): + """Add to the current message. + + Update the md5 object with the string arg. Repeated calls + are equivalent to a single call with the concatenation of all + the arguments, i.e. m.update(a); m.update(b) is equivalent + to m.update(a+b). + + The hash is immediately calculated for all full blocks. The final + calculation is made in digest(). It will calculate 1-2 blocks, + depending on how much padding we have to add. This allows us to + keep an intermediate value for the hash, so that we only need to + make minimal recalculation if we call update() to add more data + to the hashed string. + """ + + leninBuf = len(inBuf) + + # Compute number of bytes mod 64. + index = (self.count[1] >> 3) & 0x3F + + # Update number of bits. + self.count[1] = self.count[1] + (leninBuf << 3) + if self.count[1] < (leninBuf << 3): + self.count[0] = self.count[0] + 1 + self.count[0] = self.count[0] + (leninBuf >> 29) + + partLen = 64 - index + + if leninBuf >= partLen: + self.input[index:] = list(inBuf[:partLen]) + self._transform(_bytelist2longBigEndian(self.input)) + i = partLen + while i + 63 < leninBuf: + self._transform(_bytelist2longBigEndian(list(inBuf[i:i+64]))) + i = i + 64 + else: + self.input = list(inBuf[i:leninBuf]) + else: + i = 0 + self.input = self.input + list(inBuf) + + + def digest(self): + """Terminate the message-digest computation and return digest. + + Return the digest of the strings passed to the update() + method so far. This is a 16-byte string which may contain + non-ASCII characters, including null bytes. + """ + + H0 = self.H0 + H1 = self.H1 + H2 = self.H2 + H3 = self.H3 + H4 = self.H4 + input = [] + self.input + count = [] + self.count + + index = (self.count[1] >> 3) & 0x3f + + if index < 56: + padLen = 56 - index + else: + padLen = 120 - index + + padding = ['\200'] + ['\000'] * 63 + self.update(padding[:padLen]) + + # Append length (before padding). + bits = _bytelist2longBigEndian(self.input[:56]) + count + + self._transform(bits) + + # Store state in digest. + digest = _long2bytesBigEndian(self.H0, 4) + \ + _long2bytesBigEndian(self.H1, 4) + \ + _long2bytesBigEndian(self.H2, 4) + \ + _long2bytesBigEndian(self.H3, 4) + \ + _long2bytesBigEndian(self.H4, 4) + + self.H0 = H0 + self.H1 = H1 + self.H2 = H2 + self.H3 = H3 + self.H4 = H4 + self.input = input + self.count = count + + return digest + + + def hexdigest(self): + """Terminate and return digest in HEX form. + + Like digest() except the digest is returned as a string of + length 32, containing only hexadecimal digits. This may be + used to exchange the value safely in email or other non- + binary environments. + """ + return ''.join(['%02x' % ord(c) for c in self.digest()]) + + def copy(self): + """Return a clone object. + + Return a copy ('clone') of the md5 object. This can be used + to efficiently compute the digests of strings that share + a common initial substring. + """ + + return copy.deepcopy(self) + + +# ====================================================================== +# Mimic Python top-level functions from standard library API +# for consistency with the _sha module of the standard library. +# ====================================================================== + +# These are mandatory variables in the module. They have constant values +# in the SHA standard. + +digest_size = 20 +digestsize = 20 +blocksize = 1 + +def new(arg=None): + """Return a new sha crypto object. + + If arg is present, the method call update(arg) is made. + """ + + crypto = sha() + if arg: + crypto.update(arg) + + return crypto + + +if __name__ == "__main__": + a_str = "just a test string" + + assert 'da39a3ee5e6b4b0d3255bfef95601890afd80709' == new().hexdigest() + assert '3f0cf2e3d9e5903e839417dfc47fed6bfa6457f6' == new(a_str).hexdigest() + assert '0852b254078fe3772568a4aba37b917f3d4066ba' == new(a_str*7).hexdigest() + + s = new(a_str) + s.update(a_str) + assert '8862c1b50967f39d3db6bdc2877d9ccebd3102e5' == s.hexdigest() diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39328b2a48928fc35820e8184321d83126c29afd GIT binary patch literal 9874 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 CWAvy1 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha256.py b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha256.py new file mode 100644 index 0000000000..805dbd086c --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha256.py @@ -0,0 +1,260 @@ +import struct + +SHA_BLOCKSIZE = 64 +SHA_DIGESTSIZE = 32 + + +def new_shaobject(): + return { + 'digest': [0]*8, + 'count_lo': 0, + 'count_hi': 0, + 'data': [0]* SHA_BLOCKSIZE, + 'local': 0, + 'digestsize': 0 + } + +ROR = lambda x, y: (((x & 0xffffffff) >> (y & 31)) | (x << (32 - (y & 31)))) & 0xffffffff +Ch = lambda x, y, z: (z ^ (x & (y ^ z))) +Maj = lambda x, y, z: (((x | y) & z) | (x & y)) +S = lambda x, n: ROR(x, n) +R = lambda x, n: (x & 0xffffffff) >> n +Sigma0 = lambda x: (S(x, 2) ^ S(x, 13) ^ S(x, 22)) +Sigma1 = lambda x: (S(x, 6) ^ S(x, 11) ^ S(x, 25)) +Gamma0 = lambda x: (S(x, 7) ^ S(x, 18) ^ R(x, 3)) +Gamma1 = lambda x: (S(x, 17) ^ S(x, 19) ^ R(x, 10)) + +def sha_transform(sha_info): + W = [] + + d = sha_info['data'] + for i in xrange(0,16): + W.append( (d[4*i]<<24) + (d[4*i+1]<<16) + (d[4*i+2]<<8) + d[4*i+3]) + + for i in xrange(16,64): + W.append( (Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]) & 0xffffffff ) + + ss = sha_info['digest'][:] + + def RND(a,b,c,d,e,f,g,h,i,ki): + t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i]; + t1 = Sigma0(a) + Maj(a, b, c); + d += t0; + h = t0 + t1; + return d & 0xffffffff, h & 0xffffffff + + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],0,0x428a2f98); + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],1,0x71374491); + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],2,0xb5c0fbcf); + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],3,0xe9b5dba5); + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],4,0x3956c25b); + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],5,0x59f111f1); + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],6,0x923f82a4); + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],7,0xab1c5ed5); + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],8,0xd807aa98); + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],9,0x12835b01); + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],10,0x243185be); + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],11,0x550c7dc3); + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],12,0x72be5d74); + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],13,0x80deb1fe); + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],14,0x9bdc06a7); + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],15,0xc19bf174); + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],16,0xe49b69c1); + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],17,0xefbe4786); + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],18,0x0fc19dc6); + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],19,0x240ca1cc); + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],20,0x2de92c6f); + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],21,0x4a7484aa); + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],22,0x5cb0a9dc); + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],23,0x76f988da); + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],24,0x983e5152); + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],25,0xa831c66d); + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],26,0xb00327c8); + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],27,0xbf597fc7); + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],28,0xc6e00bf3); + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],29,0xd5a79147); + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],30,0x06ca6351); + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],31,0x14292967); + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],32,0x27b70a85); + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],33,0x2e1b2138); + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],34,0x4d2c6dfc); + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],35,0x53380d13); + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],36,0x650a7354); + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],37,0x766a0abb); + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],38,0x81c2c92e); + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],39,0x92722c85); + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],40,0xa2bfe8a1); + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],41,0xa81a664b); + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],42,0xc24b8b70); + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],43,0xc76c51a3); + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],44,0xd192e819); + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],45,0xd6990624); + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],46,0xf40e3585); + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],47,0x106aa070); + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],48,0x19a4c116); + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],49,0x1e376c08); + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],50,0x2748774c); + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],51,0x34b0bcb5); + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],52,0x391c0cb3); + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],53,0x4ed8aa4a); + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],54,0x5b9cca4f); + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],55,0x682e6ff3); + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],56,0x748f82ee); + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],57,0x78a5636f); + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],58,0x84c87814); + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],59,0x8cc70208); + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],60,0x90befffa); + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],61,0xa4506ceb); + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],62,0xbef9a3f7); + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],63,0xc67178f2); + + dig = [] + for i, x in enumerate(sha_info['digest']): + dig.append( (x + ss[i]) & 0xffffffff ) + sha_info['digest'] = dig + +def sha_init(): + sha_info = new_shaobject() + sha_info['digest'] = [0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19] + sha_info['count_lo'] = 0 + sha_info['count_hi'] = 0 + sha_info['local'] = 0 + sha_info['digestsize'] = 32 + return sha_info + +def sha224_init(): + sha_info = new_shaobject() + sha_info['digest'] = [0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4] + sha_info['count_lo'] = 0 + sha_info['count_hi'] = 0 + sha_info['local'] = 0 + sha_info['digestsize'] = 28 + return sha_info + +def getbuf(s): + if isinstance(s, str): + return s + elif isinstance(s, unicode): + return str(s) + else: + return buffer(s) + +def sha_update(sha_info, buffer): + count = len(buffer) + buffer_idx = 0 + clo = (sha_info['count_lo'] + (count << 3)) & 0xffffffff + if clo < sha_info['count_lo']: + sha_info['count_hi'] += 1 + sha_info['count_lo'] = clo + + sha_info['count_hi'] += (count >> 29) + + if sha_info['local']: + i = SHA_BLOCKSIZE - sha_info['local'] + if i > count: + i = count + + # copy buffer + for x in enumerate(buffer[buffer_idx:buffer_idx+i]): + sha_info['data'][sha_info['local']+x[0]] = struct.unpack('B', x[1])[0] + + count -= i + buffer_idx += i + + sha_info['local'] += i + if sha_info['local'] == SHA_BLOCKSIZE: + sha_transform(sha_info) + sha_info['local'] = 0 + else: + return + + while count >= SHA_BLOCKSIZE: + # copy buffer + sha_info['data'] = [struct.unpack('B',c)[0] for c in buffer[buffer_idx:buffer_idx + SHA_BLOCKSIZE]] + count -= SHA_BLOCKSIZE + buffer_idx += SHA_BLOCKSIZE + sha_transform(sha_info) + + + # copy buffer + pos = sha_info['local'] + sha_info['data'][pos:pos+count] = [struct.unpack('B',c)[0] for c in buffer[buffer_idx:buffer_idx + count]] + sha_info['local'] = count + +def sha_final(sha_info): + lo_bit_count = sha_info['count_lo'] + hi_bit_count = sha_info['count_hi'] + count = (lo_bit_count >> 3) & 0x3f + sha_info['data'][count] = 0x80; + count += 1 + if count > SHA_BLOCKSIZE - 8: + # zero the bytes in data after the count + sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count)) + sha_transform(sha_info) + # zero bytes in data + sha_info['data'] = [0] * SHA_BLOCKSIZE + else: + sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count)) + + sha_info['data'][56] = (hi_bit_count >> 24) & 0xff + sha_info['data'][57] = (hi_bit_count >> 16) & 0xff + sha_info['data'][58] = (hi_bit_count >> 8) & 0xff + sha_info['data'][59] = (hi_bit_count >> 0) & 0xff + sha_info['data'][60] = (lo_bit_count >> 24) & 0xff + sha_info['data'][61] = (lo_bit_count >> 16) & 0xff + sha_info['data'][62] = (lo_bit_count >> 8) & 0xff + sha_info['data'][63] = (lo_bit_count >> 0) & 0xff + + sha_transform(sha_info) + + dig = [] + for i in sha_info['digest']: + dig.extend([ ((i>>24) & 0xff), ((i>>16) & 0xff), ((i>>8) & 0xff), (i & 0xff) ]) + return ''.join([chr(i) for i in dig]) + +class sha256(object): + digest_size = digestsize = SHA_DIGESTSIZE + block_size = SHA_BLOCKSIZE + + def __init__(self, s=None): + self._sha = sha_init() + if s: + sha_update(self._sha, getbuf(s)) + + def update(self, s): + sha_update(self._sha, getbuf(s)) + + def digest(self): + return sha_final(self._sha.copy())[:self._sha['digestsize']] + + def hexdigest(self): + return ''.join(['%.2x' % ord(i) for i in self.digest()]) + + def copy(self): + new = sha256.__new__(sha256) + new._sha = self._sha.copy() + return new + +class sha224(sha256): + digest_size = digestsize = 28 + + def __init__(self, s=None): + self._sha = sha224_init() + if s: + sha_update(self._sha, getbuf(s)) + + def copy(self): + new = sha224.__new__(sha224) + new._sha = self._sha.copy() + return new + +if __name__ == "__main__": + a_str = "just a test string" + + assert 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' == sha256().hexdigest() + assert 'd7b553c6f09ac85d142415f857c5310f3bbbe7cdd787cce4b985acedd585266f' == sha256(a_str).hexdigest() + assert '8113ebf33c97daa9998762aacafe750c7cefc2b2f173c90c59663a57fe626f21' == sha256(a_str*7).hexdigest() + + s = sha256(a_str) + s.update(a_str) + assert '03d9963e05a094593190b6fc794cb1a3e1ac7d7883f0b5855268afeccc70d461' == s.hexdigest() diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha256.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha256.pyc new file mode 100644 index 0000000000000000000000000000000000000000..356c43df7d6c4b6227ec45d495b9e47235bb4532 GIT binary patch literal 16462 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 I-RiLZAA=E!D*ylh literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha512.py b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha512.py new file mode 100644 index 0000000000..68ff46f308 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha512.py @@ -0,0 +1,288 @@ +""" +This code was Ported from CPython's sha512module.c +""" + +import struct + +SHA_BLOCKSIZE = 128 +SHA_DIGESTSIZE = 64 + + +def new_shaobject(): + return { + 'digest': [0]*8, + 'count_lo': 0, + 'count_hi': 0, + 'data': [0]* SHA_BLOCKSIZE, + 'local': 0, + 'digestsize': 0 + } + +ROR64 = lambda x, y: (((x & 0xffffffffffffffff) >> (y & 63)) | (x << (64 - (y & 63)))) & 0xffffffffffffffff +Ch = lambda x, y, z: (z ^ (x & (y ^ z))) +Maj = lambda x, y, z: (((x | y) & z) | (x & y)) +S = lambda x, n: ROR64(x, n) +R = lambda x, n: (x & 0xffffffffffffffff) >> n +Sigma0 = lambda x: (S(x, 28) ^ S(x, 34) ^ S(x, 39)) +Sigma1 = lambda x: (S(x, 14) ^ S(x, 18) ^ S(x, 41)) +Gamma0 = lambda x: (S(x, 1) ^ S(x, 8) ^ R(x, 7)) +Gamma1 = lambda x: (S(x, 19) ^ S(x, 61) ^ R(x, 6)) + +def sha_transform(sha_info): + W = [] + + d = sha_info['data'] + for i in xrange(0,16): + W.append( (d[8*i]<<56) + (d[8*i+1]<<48) + (d[8*i+2]<<40) + (d[8*i+3]<<32) + (d[8*i+4]<<24) + (d[8*i+5]<<16) + (d[8*i+6]<<8) + d[8*i+7]) + + for i in xrange(16,80): + W.append( (Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]) & 0xffffffffffffffff ) + + ss = sha_info['digest'][:] + + def RND(a,b,c,d,e,f,g,h,i,ki): + t0 = (h + Sigma1(e) + Ch(e, f, g) + ki + W[i]) & 0xffffffffffffffff + t1 = (Sigma0(a) + Maj(a, b, c)) & 0xffffffffffffffff + d = (d + t0) & 0xffffffffffffffff + h = (t0 + t1) & 0xffffffffffffffff + return d & 0xffffffffffffffff, h & 0xffffffffffffffff + + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],0,0x428a2f98d728ae22) + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],1,0x7137449123ef65cd) + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],2,0xb5c0fbcfec4d3b2f) + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],3,0xe9b5dba58189dbbc) + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],4,0x3956c25bf348b538) + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],5,0x59f111f1b605d019) + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],6,0x923f82a4af194f9b) + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],7,0xab1c5ed5da6d8118) + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],8,0xd807aa98a3030242) + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],9,0x12835b0145706fbe) + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],10,0x243185be4ee4b28c) + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],11,0x550c7dc3d5ffb4e2) + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],12,0x72be5d74f27b896f) + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],13,0x80deb1fe3b1696b1) + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],14,0x9bdc06a725c71235) + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],15,0xc19bf174cf692694) + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],16,0xe49b69c19ef14ad2) + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],17,0xefbe4786384f25e3) + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],18,0x0fc19dc68b8cd5b5) + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],19,0x240ca1cc77ac9c65) + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],20,0x2de92c6f592b0275) + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],21,0x4a7484aa6ea6e483) + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],22,0x5cb0a9dcbd41fbd4) + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],23,0x76f988da831153b5) + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],24,0x983e5152ee66dfab) + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],25,0xa831c66d2db43210) + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],26,0xb00327c898fb213f) + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],27,0xbf597fc7beef0ee4) + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],28,0xc6e00bf33da88fc2) + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],29,0xd5a79147930aa725) + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],30,0x06ca6351e003826f) + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],31,0x142929670a0e6e70) + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],32,0x27b70a8546d22ffc) + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],33,0x2e1b21385c26c926) + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],34,0x4d2c6dfc5ac42aed) + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],35,0x53380d139d95b3df) + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],36,0x650a73548baf63de) + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],37,0x766a0abb3c77b2a8) + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],38,0x81c2c92e47edaee6) + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],39,0x92722c851482353b) + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],40,0xa2bfe8a14cf10364) + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],41,0xa81a664bbc423001) + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],42,0xc24b8b70d0f89791) + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],43,0xc76c51a30654be30) + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],44,0xd192e819d6ef5218) + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],45,0xd69906245565a910) + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],46,0xf40e35855771202a) + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],47,0x106aa07032bbd1b8) + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],48,0x19a4c116b8d2d0c8) + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],49,0x1e376c085141ab53) + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],50,0x2748774cdf8eeb99) + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],51,0x34b0bcb5e19b48a8) + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],52,0x391c0cb3c5c95a63) + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],53,0x4ed8aa4ae3418acb) + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],54,0x5b9cca4f7763e373) + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],55,0x682e6ff3d6b2b8a3) + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],56,0x748f82ee5defb2fc) + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],57,0x78a5636f43172f60) + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],58,0x84c87814a1f0ab72) + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],59,0x8cc702081a6439ec) + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],60,0x90befffa23631e28) + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],61,0xa4506cebde82bde9) + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],62,0xbef9a3f7b2c67915) + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],63,0xc67178f2e372532b) + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],64,0xca273eceea26619c) + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],65,0xd186b8c721c0c207) + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],66,0xeada7dd6cde0eb1e) + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],67,0xf57d4f7fee6ed178) + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],68,0x06f067aa72176fba) + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],69,0x0a637dc5a2c898a6) + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],70,0x113f9804bef90dae) + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],71,0x1b710b35131c471b) + ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],72,0x28db77f523047d84) + ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],73,0x32caab7b40c72493) + ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],74,0x3c9ebe0a15c9bebc) + ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],75,0x431d67c49c100d4c) + ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],76,0x4cc5d4becb3e42b6) + ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],77,0x597f299cfc657e2a) + ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],78,0x5fcb6fab3ad6faec) + ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],79,0x6c44198c4a475817) + + dig = [] + for i, x in enumerate(sha_info['digest']): + dig.append( (x + ss[i]) & 0xffffffffffffffff ) + sha_info['digest'] = dig + +def sha_init(): + sha_info = new_shaobject() + sha_info['digest'] = [ 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179] + sha_info['count_lo'] = 0 + sha_info['count_hi'] = 0 + sha_info['local'] = 0 + sha_info['digestsize'] = 64 + return sha_info + +def sha384_init(): + sha_info = new_shaobject() + sha_info['digest'] = [ 0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17, 0x152fecd8f70e5939, 0x67332667ffc00b31, 0x8eb44a8768581511, 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4] + sha_info['count_lo'] = 0 + sha_info['count_hi'] = 0 + sha_info['local'] = 0 + sha_info['digestsize'] = 48 + return sha_info + +def getbuf(s): + if isinstance(s, str): + return s + elif isinstance(s, unicode): + return str(s) + else: + return buffer(s) + +def sha_update(sha_info, buffer): + count = len(buffer) + buffer_idx = 0 + clo = (sha_info['count_lo'] + (count << 3)) & 0xffffffff + if clo < sha_info['count_lo']: + sha_info['count_hi'] += 1 + sha_info['count_lo'] = clo + + sha_info['count_hi'] += (count >> 29) + + if sha_info['local']: + i = SHA_BLOCKSIZE - sha_info['local'] + if i > count: + i = count + + # copy buffer + for x in enumerate(buffer[buffer_idx:buffer_idx+i]): + sha_info['data'][sha_info['local']+x[0]] = struct.unpack('B', x[1])[0] + + count -= i + buffer_idx += i + + sha_info['local'] += i + if sha_info['local'] == SHA_BLOCKSIZE: + sha_transform(sha_info) + sha_info['local'] = 0 + else: + return + + while count >= SHA_BLOCKSIZE: + # copy buffer + sha_info['data'] = [struct.unpack('B',c)[0] for c in buffer[buffer_idx:buffer_idx + SHA_BLOCKSIZE]] + count -= SHA_BLOCKSIZE + buffer_idx += SHA_BLOCKSIZE + sha_transform(sha_info) + + # copy buffer + pos = sha_info['local'] + sha_info['data'][pos:pos+count] = [struct.unpack('B',c)[0] for c in buffer[buffer_idx:buffer_idx + count]] + sha_info['local'] = count + +def sha_final(sha_info): + lo_bit_count = sha_info['count_lo'] + hi_bit_count = sha_info['count_hi'] + count = (lo_bit_count >> 3) & 0x7f + sha_info['data'][count] = 0x80; + count += 1 + if count > SHA_BLOCKSIZE - 16: + # zero the bytes in data after the count + sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count)) + sha_transform(sha_info) + # zero bytes in data + sha_info['data'] = [0] * SHA_BLOCKSIZE + else: + sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count)) + + sha_info['data'][112] = 0; + sha_info['data'][113] = 0; + sha_info['data'][114] = 0; + sha_info['data'][115] = 0; + sha_info['data'][116] = 0; + sha_info['data'][117] = 0; + sha_info['data'][118] = 0; + sha_info['data'][119] = 0; + + sha_info['data'][120] = (hi_bit_count >> 24) & 0xff + sha_info['data'][121] = (hi_bit_count >> 16) & 0xff + sha_info['data'][122] = (hi_bit_count >> 8) & 0xff + sha_info['data'][123] = (hi_bit_count >> 0) & 0xff + sha_info['data'][124] = (lo_bit_count >> 24) & 0xff + sha_info['data'][125] = (lo_bit_count >> 16) & 0xff + sha_info['data'][126] = (lo_bit_count >> 8) & 0xff + sha_info['data'][127] = (lo_bit_count >> 0) & 0xff + + sha_transform(sha_info) + + dig = [] + for i in sha_info['digest']: + dig.extend([ ((i>>56) & 0xff), ((i>>48) & 0xff), ((i>>40) & 0xff), ((i>>32) & 0xff), ((i>>24) & 0xff), ((i>>16) & 0xff), ((i>>8) & 0xff), (i & 0xff) ]) + return ''.join([chr(i) for i in dig]) + +class sha512(object): + digest_size = digestsize = SHA_DIGESTSIZE + block_size = SHA_BLOCKSIZE + + def __init__(self, s=None): + self._sha = sha_init() + if s: + sha_update(self._sha, getbuf(s)) + + def update(self, s): + sha_update(self._sha, getbuf(s)) + + def digest(self): + return sha_final(self._sha.copy())[:self._sha['digestsize']] + + def hexdigest(self): + return ''.join(['%.2x' % ord(i) for i in self.digest()]) + + def copy(self): + new = sha512.__new__(sha512) + new._sha = self._sha.copy() + return new + +class sha384(sha512): + digest_size = digestsize = 48 + + def __init__(self, s=None): + self._sha = sha384_init() + if s: + sha_update(self._sha, getbuf(s)) + + def copy(self): + new = sha384.__new__(sha384) + new._sha = self._sha.copy() + return new + +if __name__ == "__main__": + a_str = "just a test string" + + assert sha512().hexdigest() == "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" + assert sha512(a_str).hexdigest() == "68be4c6664af867dd1d01c8d77e963d87d77b702400c8fabae355a41b8927a5a5533a7f1c28509bbd65c5f3ac716f33be271fbda0ca018b71a84708c9fae8a53" + assert sha512(a_str*7).hexdigest() == "3233acdbfcfff9bff9fc72401d31dbffa62bd24e9ec846f0578d647da73258d9f0879f7fde01fe2cc6516af3f343807fdef79e23d696c923d79931db46bf1819" + + s = sha512(a_str) + s.update(a_str) + assert s.hexdigest() == "341aeb668730bbb48127d5531115f3c39d12cb9586a6ca770898398aff2411087cfe0b570689adf328cddeb1f00803acce6737a19f310b53bbdb0320828f75bb" diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha512.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha512.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8eca4a1b00cfb78e71d549608643eed79ea1ca13 GIT binary patch literal 19417 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 Dau&m8 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/archive_util.py b/PythonEnv/2.7/Lib/site-packages/setuptools/archive_util.py new file mode 100644 index 0000000000..1109f34677 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/archive_util.py @@ -0,0 +1,210 @@ +"""Utilities for extracting common archive formats""" + + +__all__ = [ + "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter", + "UnrecognizedFormat", "extraction_drivers", "unpack_directory", +] + +import zipfile, tarfile, os, shutil, posixpath +from pkg_resources import ensure_directory +from distutils.errors import DistutilsError + +class UnrecognizedFormat(DistutilsError): + """Couldn't recognize the archive type""" + +def default_filter(src,dst): + """The default progress/filter callback; returns True for all files""" + return dst + + + + + + + + + + + + + + + + + + + + + + + +def unpack_archive(filename, extract_dir, progress_filter=default_filter, + drivers=None +): + """Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat`` + + `progress_filter` is a function taking two arguments: a source path + internal to the archive ('/'-separated), and a filesystem path where it + will be extracted. The callback must return the desired extract path + (which may be the same as the one passed in), or else ``None`` to skip + that file or directory. The callback can thus be used to report on the + progress of the extraction, as well as to filter the items extracted or + alter their extraction paths. + + `drivers`, if supplied, must be a non-empty sequence of functions with the + same signature as this function (minus the `drivers` argument), that raise + ``UnrecognizedFormat`` if they do not support extracting the designated + archive type. The `drivers` are tried in sequence until one is found that + does not raise an error, or until all are exhausted (in which case + ``UnrecognizedFormat`` is raised). If you do not supply a sequence of + drivers, the module's ``extraction_drivers`` constant will be used, which + means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that + order. + """ + for driver in drivers or extraction_drivers: + try: + driver(filename, extract_dir, progress_filter) + except UnrecognizedFormat: + continue + else: + return + else: + raise UnrecognizedFormat( + "Not a recognized archive type: %s" % filename + ) + + + + + + + +def unpack_directory(filename, extract_dir, progress_filter=default_filter): + """"Unpack" a directory, using the same interface as for archives + + Raises ``UnrecognizedFormat`` if `filename` is not a directory + """ + if not os.path.isdir(filename): + raise UnrecognizedFormat("%s is not a directory" % (filename,)) + + paths = {filename:('',extract_dir)} + for base, dirs, files in os.walk(filename): + src,dst = paths[base] + for d in dirs: + paths[os.path.join(base,d)] = src+d+'/', os.path.join(dst,d) + for f in files: + name = src+f + target = os.path.join(dst,f) + target = progress_filter(src+f, target) + if not target: + continue # skip non-files + ensure_directory(target) + f = os.path.join(base,f) + shutil.copyfile(f, target) + shutil.copystat(f, target) + + + + + + + + + + + + + + + + + + +def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): + """Unpack zip `filename` to `extract_dir` + + Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined + by ``zipfile.is_zipfile()``). See ``unpack_archive()`` for an explanation + of the `progress_filter` argument. + """ + + if not zipfile.is_zipfile(filename): + raise UnrecognizedFormat("%s is not a zip file" % (filename,)) + + z = zipfile.ZipFile(filename) + try: + for info in z.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name.split('/'): + continue + + target = os.path.join(extract_dir, *name.split('/')) + target = progress_filter(name, target) + if not target: + continue + if name.endswith('/'): + # directory + ensure_directory(target) + else: + # file + ensure_directory(target) + data = z.read(info.filename) + f = open(target,'wb') + try: + f.write(data) + finally: + f.close() + del data + unix_attributes = info.external_attr >> 16 + if unix_attributes: + os.chmod(target, unix_attributes) + finally: + z.close() + + +def unpack_tarfile(filename, extract_dir, progress_filter=default_filter): + """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` + + Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined + by ``tarfile.open()``). See ``unpack_archive()`` for an explanation + of the `progress_filter` argument. + """ + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise UnrecognizedFormat( + "%s is not a compressed or uncompressed tar file" % (filename,) + ) + try: + tarobj.chown = lambda *args: None # don't do any chowning! + for member in tarobj: + name = member.name + # don't extract absolute paths or ones with .. in them + if not name.startswith('/') and '..' not in name.split('/'): + prelim_dst = os.path.join(extract_dir, *name.split('/')) + + # resolve any links and to extract the link targets as normal files + while member is not None and (member.islnk() or member.issym()): + linkpath = member.linkname + if member.issym(): + linkpath = posixpath.join(posixpath.dirname(member.name), linkpath) + linkpath = posixpath.normpath(linkpath) + member = tarobj._getmember(linkpath) + + if member is not None and (member.isfile() or member.isdir()): + final_dst = progress_filter(name, prelim_dst) + if final_dst: + if final_dst.endswith(os.sep): + final_dst = final_dst[:-1] + try: + tarobj._extract_member(member, final_dst) # XXX Ugh + except tarfile.ExtractError: + pass # chown/chmod/mkfifo/mknode/makedev failed + return True + finally: + tarobj.close() + +extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/archive_util.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/archive_util.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fc4d98991efb695cd0b567bf8bd54e6cdcf9da6 GIT binary patch literal 6449 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/cli-32.exe b/PythonEnv/2.7/Lib/site-packages/setuptools/cli-32.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 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[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/cli-64.exe b/PythonEnv/2.7/Lib/site-packages/setuptools/cli-64.exe new file mode 100644 index 0000000000000000000000000000000000000000..675e6bf3743f3d3011c238657e7128ee9960ef7f GIT binary patch literal 74752 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 &sjKl@1{;unAiW2w^OujNoW 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/cli-arm-32.exe b/PythonEnv/2.7/Lib/site-packages/setuptools/cli-arm-32.exe new file mode 100644 index 0000000000000000000000000000000000000000..2f40402d4370fd0b032331896762593dd75b5ae0 GIT binary patch literal 69120 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 J|K&OGe*tckh(rJY literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/cli.exe b/PythonEnv/2.7/Lib/site-packages/setuptools/cli.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 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[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/__init__.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/__init__.py new file mode 100644 index 0000000000..b063fa1925 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/__init__.py @@ -0,0 +1,21 @@ +__all__ = [ + 'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop', + 'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts', + 'sdist', 'setopt', 'test', 'upload', 'install_egg_info', 'install_scripts', + 'register', 'bdist_wininst', 'upload_docs', +] + +from setuptools.command import install_scripts +import sys + +if sys.version>='2.5': + # In Python 2.5 and above, distutils includes its own upload command + __all__.remove('upload') + +from distutils.command.bdist import bdist + +if 'egg' not in bdist.format_commands: + bdist.format_command['egg'] = ('bdist_egg', "Python .egg file") + bdist.format_commands.append('egg') + +del bdist, sys diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9fb4f9e0a2e4a572c0a8d74cdb68eb371bef7ac GIT binary patch literal 959 zcmZuvO>fgc5FOiX-LEuhOGv3e>M@t*P^m&f6#@xv2thd@rIuE9X5((M_FCR?AU7m_ z7-#+m|9~F=v+I-wft^hDy`6dUcCyjW&Te-8<NX9yPoIBZ@YjClfcyynL%;}d18@^? z3or)U2HXMM1>6JN2kZbI0CoX;fQNubfX9FjAn(JN75ab=K?hKTFb*MbcmO(raRf4g z8S9?Fd=u&~AOU9FqYGaH2+Fqf5$G)_Vi?C<dI~az**45$sJ{U|_K=;N!d1I5V^61d z<u@_hu<-$W7(U_C&?bjetJKmCuQF7Ygv|3bR98id8l_Rl&qUiU)1zuhF$0tfsZB-u zyq2k53RPN4wf32;#&~Lc=H12~XRg*ltBkf7*M?G(zQ(2t$$Hk?v(A*yu#%Xi4NfMx z;+jgE6sfl+_@`rcjkJ?mIYno_mN`qxnmP>HGk;R0^Fz*9D=E-Stop^zFktffki%OW zal9B^ddj==<>Y8?Yn_dEOS(1X*@*GkRB1U3nY4e6_y2jWx1W*_JUk)j$Q4RzDl$gf z(Zm!*TB3L2JKCl7`3qTFWy*GnvM>ut11@!QYe?N!j=b4xcc014W@_ppC9%@Abnp-7 zCDW>sB@THL?t`5&#Aiva=(fp{kE(pBr?tejRi?`1mCTwvX-D$9TqGBxr^y?YC03C< zuhPjp&81E551FjYB!VxEA|Xb6$J~E*RTylveC~&N!o*SF-fq+j_QP)2<F^}hg5&Tv D6It=q literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/alias.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/alias.py new file mode 100644 index 0000000000..52384e1a28 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/alias.py @@ -0,0 +1,82 @@ +import distutils, os +from setuptools import Command +from distutils.util import convert_path +from distutils import log +from distutils.errors import * +from setuptools.command.setopt import edit_config, option_base, config_file + +def shquote(arg): + """Quote an argument for later parsing by shlex.split()""" + for c in '"', "'", "\\", "#": + if c in arg: return repr(arg) + if arg.split() != [arg]: + return repr(arg) + return arg + + +class alias(option_base): + """Define a shortcut that invokes one or more commands""" + + description = "define a shortcut to invoke one or more commands" + command_consumes_arguments = True + + user_options = [ + ('remove', 'r', 'remove (unset) the alias'), + ] + option_base.user_options + + boolean_options = option_base.boolean_options + ['remove'] + + def initialize_options(self): + option_base.initialize_options(self) + self.args = None + self.remove = None + + def finalize_options(self): + option_base.finalize_options(self) + if self.remove and len(self.args) != 1: + raise DistutilsOptionError( + "Must specify exactly one argument (the alias name) when " + "using --remove" + ) + + def run(self): + aliases = self.distribution.get_option_dict('aliases') + + if not self.args: + print("Command Aliases") + print("---------------") + for alias in aliases: + print("setup.py alias", format_alias(alias, aliases)) + return + + elif len(self.args)==1: + alias, = self.args + if self.remove: + command = None + elif alias in aliases: + print("setup.py alias", format_alias(alias, aliases)) + return + else: + print("No alias definition found for %r" % alias) + return + else: + alias = self.args[0] + command = ' '.join(map(shquote,self.args[1:])) + + edit_config(self.filename, {'aliases': {alias:command}}, self.dry_run) + + +def format_alias(name, aliases): + source, command = aliases[name] + if source == config_file('global'): + source = '--global-config ' + elif source == config_file('user'): + source = '--user-config ' + elif source == config_file('local'): + source = '' + else: + source = '--filename=%r' % source + return source+name+' '+command + + + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/alias.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/alias.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7e37e67075ae1d05fdb2c3ad50a635a71e74444 GIT binary patch literal 3504 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_egg.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_egg.py new file mode 100644 index 0000000000..c577615824 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_egg.py @@ -0,0 +1,553 @@ +"""setuptools.command.bdist_egg + +Build .egg distributions""" + +# This module should be kept compatible with Python 2.3 +import sys, os, marshal +from setuptools import Command +from distutils.dir_util import remove_tree, mkpath +try: + # Python 2.7 or >=3.2 + from sysconfig import get_path, get_python_version + def _get_purelib(): + return get_path("purelib") +except ImportError: + from distutils.sysconfig import get_python_lib, get_python_version + def _get_purelib(): + return get_python_lib(False) + +from distutils import log +from distutils.errors import DistutilsSetupError +from pkg_resources import get_build_platform, Distribution, ensure_directory +from pkg_resources import EntryPoint +from types import CodeType +from setuptools.compat import basestring, next +from setuptools.extension import Library + +def strip_module(filename): + if '.' in filename: + filename = os.path.splitext(filename)[0] + if filename.endswith('module'): + filename = filename[:-6] + return filename + +def write_stub(resource, pyfile): + f = open(pyfile,'w') + f.write('\n'.join([ + "def __bootstrap__():", + " global __bootstrap__, __loader__, __file__", + " import sys, pkg_resources, imp", + " __file__ = pkg_resources.resource_filename(__name__,%r)" + % resource, + " __loader__ = None; del __bootstrap__, __loader__", + " imp.load_dynamic(__name__,__file__)", + "__bootstrap__()", + "" # terminal \n + ])) + f.close() + +# stub __init__.py for packages distributed without one +NS_PKG_STUB = '__import__("pkg_resources").declare_namespace(__name__)' + +class bdist_egg(Command): + + description = "create an \"egg\" distribution" + + user_options = [ + ('bdist-dir=', 'b', + "temporary directory for creating the distribution"), + ('plat-name=', 'p', + "platform name to embed in generated filenames " + "(default: %s)" % get_build_platform()), + ('exclude-source-files', None, + "remove all .py files from the generated egg"), + ('keep-temp', 'k', + "keep the pseudo-installation tree around after " + + "creating the distribution archive"), + ('dist-dir=', 'd', + "directory to put final built distributions in"), + ('skip-build', None, + "skip rebuilding everything (for testing/debugging)"), + ] + + boolean_options = [ + 'keep-temp', 'skip-build', 'exclude-source-files' + ] + + + + + + + + + + + + + + + + + + def initialize_options (self): + self.bdist_dir = None + self.plat_name = None + self.keep_temp = 0 + self.dist_dir = None + self.skip_build = 0 + self.egg_output = None + self.exclude_source_files = None + + + def finalize_options(self): + ei_cmd = self.ei_cmd = self.get_finalized_command("egg_info") + self.egg_info = ei_cmd.egg_info + + if self.bdist_dir is None: + bdist_base = self.get_finalized_command('bdist').bdist_base + self.bdist_dir = os.path.join(bdist_base, 'egg') + + if self.plat_name is None: + self.plat_name = get_build_platform() + + self.set_undefined_options('bdist',('dist_dir', 'dist_dir')) + + if self.egg_output is None: + + # Compute filename of the output egg + basename = Distribution( + None, None, ei_cmd.egg_name, ei_cmd.egg_version, + get_python_version(), + self.distribution.has_ext_modules() and self.plat_name + ).egg_name() + + self.egg_output = os.path.join(self.dist_dir, basename+'.egg') + + + + + + + + + def do_install_data(self): + # Hack for packages that install data to install's --install-lib + self.get_finalized_command('install').install_lib = self.bdist_dir + + site_packages = os.path.normcase(os.path.realpath(_get_purelib())) + old, self.distribution.data_files = self.distribution.data_files,[] + + for item in old: + if isinstance(item,tuple) and len(item)==2: + if os.path.isabs(item[0]): + realpath = os.path.realpath(item[0]) + normalized = os.path.normcase(realpath) + if normalized==site_packages or normalized.startswith( + site_packages+os.sep + ): + item = realpath[len(site_packages)+1:], item[1] + # XXX else: raise ??? + self.distribution.data_files.append(item) + + try: + log.info("installing package data to %s" % self.bdist_dir) + self.call_command('install_data', force=0, root=None) + finally: + self.distribution.data_files = old + + + def get_outputs(self): + return [self.egg_output] + + + def call_command(self,cmdname,**kw): + """Invoke reinitialized command `cmdname` with keyword args""" + for dirname in INSTALL_DIRECTORY_ATTRS: + kw.setdefault(dirname,self.bdist_dir) + kw.setdefault('skip_build',self.skip_build) + kw.setdefault('dry_run', self.dry_run) + cmd = self.reinitialize_command(cmdname, **kw) + self.run_command(cmdname) + return cmd + + + def run(self): + # Generate metadata first + self.run_command("egg_info") + # We run install_lib before install_data, because some data hacks + # pull their data path from the install_lib command. + log.info("installing library code to %s" % self.bdist_dir) + instcmd = self.get_finalized_command('install') + old_root = instcmd.root; instcmd.root = None + if self.distribution.has_c_libraries() and not self.skip_build: + self.run_command('build_clib') + cmd = self.call_command('install_lib', warn_dir=0) + instcmd.root = old_root + + all_outputs, ext_outputs = self.get_ext_outputs() + self.stubs = [] + to_compile = [] + for (p,ext_name) in enumerate(ext_outputs): + filename,ext = os.path.splitext(ext_name) + pyfile = os.path.join(self.bdist_dir, strip_module(filename)+'.py') + self.stubs.append(pyfile) + log.info("creating stub loader for %s" % ext_name) + if not self.dry_run: + write_stub(os.path.basename(ext_name), pyfile) + to_compile.append(pyfile) + ext_outputs[p] = ext_name.replace(os.sep,'/') + + to_compile.extend(self.make_init_files()) + if to_compile: + cmd.byte_compile(to_compile) + if self.distribution.data_files: + self.do_install_data() + + # Make the EGG-INFO directory + archive_root = self.bdist_dir + egg_info = os.path.join(archive_root,'EGG-INFO') + self.mkpath(egg_info) + if self.distribution.scripts: + script_dir = os.path.join(egg_info, 'scripts') + log.info("installing scripts to %s" % script_dir) + self.call_command('install_scripts',install_dir=script_dir,no_ep=1) + + self.copy_metadata_to(egg_info) + native_libs = os.path.join(egg_info, "native_libs.txt") + if all_outputs: + log.info("writing %s" % native_libs) + if not self.dry_run: + ensure_directory(native_libs) + libs_file = open(native_libs, 'wt') + libs_file.write('\n'.join(all_outputs)) + libs_file.write('\n') + libs_file.close() + elif os.path.isfile(native_libs): + log.info("removing %s" % native_libs) + if not self.dry_run: + os.unlink(native_libs) + + write_safety_flag( + os.path.join(archive_root,'EGG-INFO'), self.zip_safe() + ) + + if os.path.exists(os.path.join(self.egg_info,'depends.txt')): + log.warn( + "WARNING: 'depends.txt' will not be used by setuptools 0.6!\n" + "Use the install_requires/extras_require setup() args instead." + ) + + if self.exclude_source_files: + self.zap_pyfiles() + + # Make the archive + make_zipfile(self.egg_output, archive_root, verbose=self.verbose, + dry_run=self.dry_run, mode=self.gen_header()) + if not self.keep_temp: + remove_tree(self.bdist_dir, dry_run=self.dry_run) + + # Add to 'Distribution.dist_files' so that the "upload" command works + getattr(self.distribution,'dist_files',[]).append( + ('bdist_egg',get_python_version(),self.egg_output)) + + + + + def zap_pyfiles(self): + log.info("Removing .py files from temporary directory") + for base,dirs,files in walk_egg(self.bdist_dir): + for name in files: + if name.endswith('.py'): + path = os.path.join(base,name) + log.debug("Deleting %s", path) + os.unlink(path) + + def zip_safe(self): + safe = getattr(self.distribution,'zip_safe',None) + if safe is not None: + return safe + log.warn("zip_safe flag not set; analyzing archive contents...") + return analyze_egg(self.bdist_dir, self.stubs) + + def make_init_files(self): + """Create missing package __init__ files""" + init_files = [] + for base,dirs,files in walk_egg(self.bdist_dir): + if base==self.bdist_dir: + # don't put an __init__ in the root + continue + for name in files: + if name.endswith('.py'): + if '__init__.py' not in files: + pkg = base[len(self.bdist_dir)+1:].replace(os.sep,'.') + if self.distribution.has_contents_for(pkg): + log.warn("Creating missing __init__.py for %s",pkg) + filename = os.path.join(base,'__init__.py') + if not self.dry_run: + f = open(filename,'w'); f.write(NS_PKG_STUB) + f.close() + init_files.append(filename) + break + else: + # not a package, don't traverse to subdirectories + dirs[:] = [] + + return init_files + + def gen_header(self): + epm = EntryPoint.parse_map(self.distribution.entry_points or '') + ep = epm.get('setuptools.installation',{}).get('eggsecutable') + if ep is None: + return 'w' # not an eggsecutable, do it the usual way. + + if not ep.attrs or ep.extras: + raise DistutilsSetupError( + "eggsecutable entry point (%r) cannot have 'extras' " + "or refer to a module" % (ep,) + ) + + pyver = sys.version[:3] + pkg = ep.module_name + full = '.'.join(ep.attrs) + base = ep.attrs[0] + basename = os.path.basename(self.egg_output) + + header = ( + "#!/bin/sh\n" + 'if [ `basename $0` = "%(basename)s" ]\n' + 'then exec python%(pyver)s -c "' + "import sys, os; sys.path.insert(0, os.path.abspath('$0')); " + "from %(pkg)s import %(base)s; sys.exit(%(full)s())" + '" "$@"\n' + 'else\n' + ' echo $0 is not the correct name for this egg file.\n' + ' echo Please rename it back to %(basename)s and try again.\n' + ' exec false\n' + 'fi\n' + + ) % locals() + + if not self.dry_run: + mkpath(os.path.dirname(self.egg_output), dry_run=self.dry_run) + f = open(self.egg_output, 'w') + f.write(header) + f.close() + return 'a' + + + def copy_metadata_to(self, target_dir): + "Copy metadata (egg info) to the target_dir" + # normalize the path (so that a forward-slash in egg_info will + # match using startswith below) + norm_egg_info = os.path.normpath(self.egg_info) + prefix = os.path.join(norm_egg_info,'') + for path in self.ei_cmd.filelist.files: + if path.startswith(prefix): + target = os.path.join(target_dir, path[len(prefix):]) + ensure_directory(target) + self.copy_file(path, target) + + def get_ext_outputs(self): + """Get a list of relative paths to C extensions in the output distro""" + + all_outputs = [] + ext_outputs = [] + + paths = {self.bdist_dir:''} + for base, dirs, files in os.walk(self.bdist_dir): + for filename in files: + if os.path.splitext(filename)[1].lower() in NATIVE_EXTENSIONS: + all_outputs.append(paths[base]+filename) + for filename in dirs: + paths[os.path.join(base,filename)] = paths[base]+filename+'/' + + if self.distribution.has_ext_modules(): + build_cmd = self.get_finalized_command('build_ext') + for ext in build_cmd.extensions: + if isinstance(ext,Library): + continue + fullname = build_cmd.get_ext_fullname(ext.name) + filename = build_cmd.get_ext_filename(fullname) + if not os.path.basename(filename).startswith('dl-'): + if os.path.exists(os.path.join(self.bdist_dir,filename)): + ext_outputs.append(filename) + + return all_outputs, ext_outputs + + +NATIVE_EXTENSIONS = dict.fromkeys('.dll .so .dylib .pyd'.split()) + + + + +def walk_egg(egg_dir): + """Walk an unpacked egg's contents, skipping the metadata directory""" + walker = os.walk(egg_dir) + base,dirs,files = next(walker) + if 'EGG-INFO' in dirs: + dirs.remove('EGG-INFO') + yield base,dirs,files + for bdf in walker: + yield bdf + +def analyze_egg(egg_dir, stubs): + # check for existing flag in EGG-INFO + for flag,fn in safety_flags.items(): + if os.path.exists(os.path.join(egg_dir,'EGG-INFO',fn)): + return flag + if not can_scan(): return False + safe = True + for base, dirs, files in walk_egg(egg_dir): + for name in files: + if name.endswith('.py') or name.endswith('.pyw'): + continue + elif name.endswith('.pyc') or name.endswith('.pyo'): + # always scan, even if we already know we're not safe + safe = scan_module(egg_dir, base, name, stubs) and safe + return safe + +def write_safety_flag(egg_dir, safe): + # Write or remove zip safety flag file(s) + for flag,fn in safety_flags.items(): + fn = os.path.join(egg_dir, fn) + if os.path.exists(fn): + if safe is None or bool(safe) != flag: + os.unlink(fn) + elif safe is not None and bool(safe)==flag: + f=open(fn,'wt'); f.write('\n'); f.close() + +safety_flags = { + True: 'zip-safe', + False: 'not-zip-safe', +} + +def scan_module(egg_dir, base, name, stubs): + """Check whether module possibly uses unsafe-for-zipfile stuff""" + + filename = os.path.join(base,name) + if filename[:-1] in stubs: + return True # Extension module + pkg = base[len(egg_dir)+1:].replace(os.sep,'.') + module = pkg+(pkg and '.' or '')+os.path.splitext(name)[0] + if sys.version_info < (3, 3): + skip = 8 # skip magic & date + else: + skip = 12 # skip magic & date & file size + f = open(filename,'rb'); f.read(skip) + code = marshal.load(f); f.close() + safe = True + symbols = dict.fromkeys(iter_symbols(code)) + for bad in ['__file__', '__path__']: + if bad in symbols: + log.warn("%s: module references %s", module, bad) + safe = False + if 'inspect' in symbols: + for bad in [ + 'getsource', 'getabsfile', 'getsourcefile', 'getfile' + 'getsourcelines', 'findsource', 'getcomments', 'getframeinfo', + 'getinnerframes', 'getouterframes', 'stack', 'trace' + ]: + if bad in symbols: + log.warn("%s: module MAY be using inspect.%s", module, bad) + safe = False + if '__name__' in symbols and '__main__' in symbols and '.' not in module: + if sys.version[:3]=="2.4": # -m works w/zipfiles in 2.5 + log.warn("%s: top-level module may be 'python -m' script", module) + safe = False + return safe + +def iter_symbols(code): + """Yield names and strings used by `code` and its nested code objects""" + for name in code.co_names: yield name + for const in code.co_consts: + if isinstance(const,basestring): + yield const + elif isinstance(const,CodeType): + for name in iter_symbols(const): + yield name + +def can_scan(): + if not sys.platform.startswith('java') and sys.platform != 'cli': + # CPython, PyPy, etc. + return True + log.warn("Unable to analyze compiled code on this platform.") + log.warn("Please ask the author to include a 'zip_safe'" + " setting (either True or False) in the package's setup.py") + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# Attribute names of options for commands that might need to be convinced to +# install to the egg build directory + +INSTALL_DIRECTORY_ATTRS = [ + 'install_lib', 'install_dir', 'install_data', 'install_base' +] + +def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=None, + mode='w' +): + """Create a zip file from all the files under 'base_dir'. The output + zip file will be named 'base_dir' + ".zip". Uses either the "zipfile" + Python module (if available) or the InfoZIP "zip" utility (if installed + and found on the default search path). If neither tool is available, + raises DistutilsExecError. Returns the name of the output zip file. + """ + import zipfile + mkpath(os.path.dirname(zip_filename), dry_run=dry_run) + log.info("creating '%s' and adding '%s' to it", zip_filename, base_dir) + + def visit(z, dirname, names): + for name in names: + path = os.path.normpath(os.path.join(dirname, name)) + if os.path.isfile(path): + p = path[len(base_dir)+1:] + if not dry_run: + z.write(path, p) + log.debug("adding '%s'" % p) + + if compress is None: + compress = (sys.version>="2.4") # avoid 2.3 zipimport bug when 64 bits + + compression = [zipfile.ZIP_STORED, zipfile.ZIP_DEFLATED][bool(compress)] + if not dry_run: + z = zipfile.ZipFile(zip_filename, mode, compression=compression) + for dirname, dirs, files in os.walk(base_dir): + visit(z, dirname, files) + z.close() + else: + for dirname, dirs, files in os.walk(base_dir): + visit(None, dirname, files) + return zip_filename +# diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_egg.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_egg.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a12c694af870f678b190e68911655a93b7dc07b0 GIT binary patch literal 19633 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_rpm.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_rpm.py new file mode 100644 index 0000000000..8c48da3559 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_rpm.py @@ -0,0 +1,82 @@ +# This is just a kludge so that bdist_rpm doesn't guess wrong about the +# distribution name and version, if the egg_info command is going to alter +# them, another kludge to allow you to build old-style non-egg RPMs, and +# finally, a kludge to track .rpm files for uploading when run on Python <2.5. + +from distutils.command.bdist_rpm import bdist_rpm as _bdist_rpm +import sys, os + +class bdist_rpm(_bdist_rpm): + + def initialize_options(self): + _bdist_rpm.initialize_options(self) + self.no_egg = None + + if sys.version<"2.5": + # Track for uploading any .rpm file(s) moved to self.dist_dir + def move_file(self, src, dst, level=1): + _bdist_rpm.move_file(self, src, dst, level) + if dst==self.dist_dir and src.endswith('.rpm'): + getattr(self.distribution,'dist_files',[]).append( + ('bdist_rpm', + src.endswith('.src.rpm') and 'any' or sys.version[:3], + os.path.join(dst, os.path.basename(src))) + ) + + def run(self): + self.run_command('egg_info') # ensure distro name is up-to-date + _bdist_rpm.run(self) + + + + + + + + + + + + + + def _make_spec_file(self): + version = self.distribution.get_version() + rpmversion = version.replace('-','_') + spec = _bdist_rpm._make_spec_file(self) + line23 = '%define version '+version + line24 = '%define version '+rpmversion + spec = [ + line.replace( + "Source0: %{name}-%{version}.tar", + "Source0: %{name}-%{unmangled_version}.tar" + ).replace( + "setup.py install ", + "setup.py install --single-version-externally-managed " + ).replace( + "%setup", + "%setup -n %{name}-%{unmangled_version}" + ).replace(line23,line24) + for line in spec + ] + spec.insert(spec.index(line24)+1, "%define unmangled_version "+version) + return spec + + + + + + + + + + + + + + + + + + + + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_rpm.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_rpm.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78f8f40cb50ac6a28642e1e9f67565676e34f5a9 GIT binary patch literal 2527 zcmc&$-EJF26h5>5N$oZyRD$p$wdNwoAgzT06;f3pN((n23)UBi$go;_$L`qc*=1)O zYHDA(Z@>lb!87p&JOF&>tm6iSYZ7H<&&-@Tzu!6I+Fyt5QTXR~W7_@I@ckUaeSs;( zzoLw2q3Apy#p{5w8lBhV40N5&>y*|=2Q*QX*6AhDmgt9bECL#I8xUju#$Q)~@-0lG z)HolP#iAc!MSIl&7Od4h#-xc@1hG7*)-{?zkD@tI8M0{Td<m->WMP!3J#SLl5dH&- z2HhshW~Dq>_7e>E4kk}DQ?!PmN_+wpi$eo3vfr&UQyWvfx7FXp(pck7l9^w1oEP5Y z)_G>_=T>`GXY*K3r<JFC;B+?W;!85QDX8?}aBBRs<!Jc5v5&J!snaXe$k^diJz7qO z->&?#+<s{<hG)G`hu@gd&>648A{oz<sdhuB{j%_Rp1I*TUn~-v4)?b9idDo8-^Ork z2dP8lIJ0NH2ZqBj=3O4_q{QWS5c{~S5uJe6HQLrmF@=ByG!Ll!jc_(YuoMRmO9X&V z8=MmOw?&?ihT0`tUDy&%Ofe^aK(kwvHmL(3%-S@&&3bn99lishTObLVks8h{0Ye9{ ztuK!BfEr1RKxkqz?F2*a7Fc?&918<`n%I@$Z}$*W#6Ao57Wsva`JU$+A|*AYEVNDC zFGvlHB${fUcwhQEJFe1<mYi@&b5ayw_AK75obX@h((y5eJ+DwvB#^~1p5?}hhEd|Q zO%_`46>()$GRm=hQ|CQzX8J;BHv}7w%Ig@89Vhjsx~JYyHFaN&uT|1LFmUP-M#-D< zK!#w2b0>-8X!NV#PN%W4lf278^9;;#Y2zJotMu>*Hl=zbI5!l6w_yi&iGAgW>kJA` z&J#ZQ15@QX`pA}OgL)C?5ed`*5WE4brDcH);n<*Jq$W-_(k+4dlTCvQ21WMt$49hj z(z?mvLn}kAKmyaKq=QQub<^6>Yt)?Z{1nj7U$byXK?(8<IXHqDZ8}L&UW!g2OyOwI z<(&4BC8AK~*d2pDP4&cB-Pu97<L+Z~kT1)z{^()n^aUe!6P~`<oo{+RDcuME&9k)V zMAJ;C@xQnQQQWZ5nK}ktGs&`!djJ{I#;)#$p))KY+zANvbFWK_3#$;a(fiVl<6e6z zSKa%2vJ=`X)?T+n8lUw4OOLPdbfncp94Emjy1=C)Qst#CvSh3)ydHroUL<oJyF!nv zrox87KV4RpY;3BZS27tp5nqw^g*LYHPdWq(kj|1J5oaI2B0rI1-o2q>;3EGJ!}0S+ z>PX$iXsdQmYkw8Ir@GuPq`>2taT3SXvl%b)beUl(?@;s_xWxI0`6I5dh$X*rN~r(! zfrNVEUn7p6z-G{@9|cFP*0KCx@$X`f9|!dO%=LC{s<(e&<;@WkRIYIu-Jma$fJarx OKVt|=>pE6%1^)m=MP2Uz literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_wininst.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_wininst.py new file mode 100644 index 0000000000..e8521f834c --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_wininst.py @@ -0,0 +1,82 @@ +from distutils.command.bdist_wininst import bdist_wininst as _bdist_wininst +import os, sys + +class bdist_wininst(_bdist_wininst): + _good_upload = _bad_upload = None + + def create_exe(self, arcname, fullname, bitmap=None): + _bdist_wininst.create_exe(self, arcname, fullname, bitmap) + installer_name = self.get_installer_filename(fullname) + if self.target_version: + pyversion = self.target_version + # fix 2.5+ bdist_wininst ignoring --target-version spec + self._bad_upload = ('bdist_wininst', 'any', installer_name) + else: + pyversion = 'any' + self._good_upload = ('bdist_wininst', pyversion, installer_name) + + def _fix_upload_names(self): + good, bad = self._good_upload, self._bad_upload + dist_files = getattr(self.distribution, 'dist_files', []) + if bad in dist_files: + dist_files.remove(bad) + if good not in dist_files: + dist_files.append(good) + + def reinitialize_command (self, command, reinit_subcommands=0): + cmd = self.distribution.reinitialize_command( + command, reinit_subcommands) + if command in ('install', 'install_lib'): + cmd.install_lib = None # work around distutils bug + return cmd + + def run(self): + self._is_running = True + try: + _bdist_wininst.run(self) + self._fix_upload_names() + finally: + self._is_running = False + + + if not hasattr(_bdist_wininst, 'get_installer_filename'): + def get_installer_filename(self, fullname): + # Factored out to allow overriding in subclasses + if self.target_version: + # if we create an installer for a specific python version, + # it's better to include this in the name + installer_name = os.path.join(self.dist_dir, + "%s.win32-py%s.exe" % + (fullname, self.target_version)) + else: + installer_name = os.path.join(self.dist_dir, + "%s.win32.exe" % fullname) + return installer_name + # get_installer_filename() + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_wininst.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_wininst.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58a7fb60d90c8b2507a02a178cbb362bcec6cf91 GIT binary patch literal 2671 zcmc&$Yj5L36uo1oNz=!+EVL{S3Go3b5^AO06+%J?@mTn@idYv^h$0y~o}^A4JMv7* zW|e;G{#5<}KLF0TabMy)O*4~wXU4vF&N*|Z;orMk>Cs=WM$&vj{C<n(zDJkgYorjF z85sm(=m%1SG6;1Jc1s2=$wIM#jE!V1c`I@y^7{ZzASb;Iye9t#pPqr`chRL;?tJ`b zUgo9q{Rks+FFYf=Q*>5@ujxn&@ffDVsBe+W2J=FsL7Pz!o`aax@PkdUU9nq|ZOBz1 z?pMj$x_Dbkk?5qi$%rj<Z8RqM1DZQS=S8MQRw66(fviHgYKehAg%ik?k;@jRr=ip@ z8{<-wK^m);j6)8_Eh#mz_0($P&J-34U?I%wt$UhDx$H3+{|H@t4<NsVp;2uUZ)5w~ z`a`%A>tlkK6oswhabDOmnOS|<CpBj;Z0+)@^xOKrB#RgGqDnHqLw{0L*8}UQ#KPHP z>^m@$dZce7O5;UQsKeya+|QD^M!5~Hvt7*2mrcwb9MR65!^*xIPI7;?NQb9+`CT!t zZFa{>^K$sYri;n&=cPZZ${)*%;j`l}hcEMV=yGq5=E>+hnOHY;)-UG1stPw8RkK-A zX2W|p9nY5$q2v}EVH9&{_Dt7wgM*-LMwB1-$)<dR2W4>G8woDKZXg~+D#1|L1X>Q| z5~QjY&f8MIpeUvgfvUkkP?Sn2=N+m4&^fSes1(j2#z`+gpuW<m!Y5r$agUg5q`cDt zZ;AJ{a>SK&o-RB|<ciwPstc=TGN0Qr>v1CyN%FMFsY)qLvWVM%I2!yr2oF`hZbTPT zBknN<9pxwHU2|Y|%syI9e?;222mUHGPhpS*d;zW=MI2=EfN}t=!NU=;1@3XkLk;6Z z0qLuR8+oew8#^xYRGDyux*2pl9(NZgru!K5@1d(LYLw5DB7bA!Msx~xzbb9?K33cz zfv>$@!@aH_j@=?{MxD|#nq?2iO!NeaeTe2*R0M}(NB{J2@POPD!!O{V7_yiddGirZ z1!^8#3Y*llSmn(rNbnH6F8dA6iI(~PZCUxHUf6XN%3WM9N)-J`#1o-tU?4i6!@xf! zg|qs+%K8Ce`UKg0igp82Xm-t`Afh}*OrA=;!Ri$pLITd8iZ{F~)>r`~6cOrIXUBmY zQpSOlAOB|^3XHj)Mr~<s2*;!JnLEa1`TW_@d<heGfF7gkQ4Z)W8!;j9BvLt5={)gg zYD}xV^sE$Gf3m#R>qkM3D1?Z|@&Vx{te>N;%XZKW_e^LGgFS%W?=d$`KGr%C$686_ zcvfYL!p3p*0T$d=QoRFIQ!4g|RBBB)OB}1KYEOy0-LP8!`(=g1wCd@u+h!}++3s%c zbh_O=qkMX%PR4Kv6z;gGBFFbGJ^klty(Q{Z&y-ub2i}^}_4S&dZ&+3w8QwQff`0*C C-E)rs literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_ext.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_ext.py new file mode 100644 index 0000000000..50a039ce50 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_ext.py @@ -0,0 +1,298 @@ +from distutils.command.build_ext import build_ext as _du_build_ext +try: + # Attempt to use Pyrex for building extensions, if available + from Pyrex.Distutils.build_ext import build_ext as _build_ext +except ImportError: + _build_ext = _du_build_ext + +import os, sys +from distutils.file_util import copy_file +from setuptools.extension import Library +from distutils.ccompiler import new_compiler +from distutils.sysconfig import customize_compiler +try: + # Python 2.7 or >=3.2 + from sysconfig import _CONFIG_VARS +except ImportError: + from distutils.sysconfig import get_config_var + get_config_var("LDSHARED") # make sure _config_vars is initialized + del get_config_var + from distutils.sysconfig import _config_vars as _CONFIG_VARS +from distutils import log +from distutils.errors import * + +have_rtld = False +use_stubs = False +libtype = 'shared' + +if sys.platform == "darwin": + use_stubs = True +elif os.name != 'nt': + try: + from dl import RTLD_NOW + have_rtld = True + use_stubs = True + except ImportError: + pass + +def if_dl(s): + if have_rtld: + return s + return '' + + + + + + +class build_ext(_build_ext): + def run(self): + """Build extensions in build directory, then copy if --inplace""" + old_inplace, self.inplace = self.inplace, 0 + _build_ext.run(self) + self.inplace = old_inplace + if old_inplace: + self.copy_extensions_to_source() + + def copy_extensions_to_source(self): + build_py = self.get_finalized_command('build_py') + for ext in self.extensions: + fullname = self.get_ext_fullname(ext.name) + filename = self.get_ext_filename(fullname) + modpath = fullname.split('.') + package = '.'.join(modpath[:-1]) + package_dir = build_py.get_package_dir(package) + dest_filename = os.path.join(package_dir,os.path.basename(filename)) + src_filename = os.path.join(self.build_lib,filename) + + # Always copy, even if source is older than destination, to ensure + # that the right extensions for the current Python/platform are + # used. + copy_file( + src_filename, dest_filename, verbose=self.verbose, + dry_run=self.dry_run + ) + if ext._needs_stub: + self.write_stub(package_dir or os.curdir, ext, True) + + + if _build_ext is not _du_build_ext and not hasattr(_build_ext,'pyrex_sources'): + # Workaround for problems using some Pyrex versions w/SWIG and/or 2.4 + def swig_sources(self, sources, *otherargs): + # first do any Pyrex processing + sources = _build_ext.swig_sources(self, sources) or sources + # Then do any actual SWIG stuff on the remainder + return _du_build_ext.swig_sources(self, sources, *otherargs) + + + + def get_ext_filename(self, fullname): + filename = _build_ext.get_ext_filename(self,fullname) + if fullname in self.ext_map: + ext = self.ext_map[fullname] + if isinstance(ext,Library): + fn, ext = os.path.splitext(filename) + return self.shlib_compiler.library_filename(fn,libtype) + elif use_stubs and ext._links_to_dynamic: + d,fn = os.path.split(filename) + return os.path.join(d,'dl-'+fn) + return filename + + def initialize_options(self): + _build_ext.initialize_options(self) + self.shlib_compiler = None + self.shlibs = [] + self.ext_map = {} + + def finalize_options(self): + _build_ext.finalize_options(self) + self.extensions = self.extensions or [] + self.check_extensions_list(self.extensions) + self.shlibs = [ext for ext in self.extensions + if isinstance(ext,Library)] + if self.shlibs: + self.setup_shlib_compiler() + for ext in self.extensions: + ext._full_name = self.get_ext_fullname(ext.name) + for ext in self.extensions: + fullname = ext._full_name + self.ext_map[fullname] = ext + + # distutils 3.1 will also ask for module names + # XXX what to do with conflicts? + self.ext_map[fullname.split('.')[-1]] = ext + + ltd = ext._links_to_dynamic = \ + self.shlibs and self.links_to_dynamic(ext) or False + ext._needs_stub = ltd and use_stubs and not isinstance(ext,Library) + filename = ext._file_name = self.get_ext_filename(fullname) + libdir = os.path.dirname(os.path.join(self.build_lib,filename)) + if ltd and libdir not in ext.library_dirs: + ext.library_dirs.append(libdir) + if ltd and use_stubs and os.curdir not in ext.runtime_library_dirs: + ext.runtime_library_dirs.append(os.curdir) + + def setup_shlib_compiler(self): + compiler = self.shlib_compiler = new_compiler( + compiler=self.compiler, dry_run=self.dry_run, force=self.force + ) + if sys.platform == "darwin": + tmp = _CONFIG_VARS.copy() + try: + # XXX Help! I don't have any idea whether these are right... + _CONFIG_VARS['LDSHARED'] = "gcc -Wl,-x -dynamiclib -undefined dynamic_lookup" + _CONFIG_VARS['CCSHARED'] = " -dynamiclib" + _CONFIG_VARS['SO'] = ".dylib" + customize_compiler(compiler) + finally: + _CONFIG_VARS.clear() + _CONFIG_VARS.update(tmp) + else: + customize_compiler(compiler) + + if self.include_dirs is not None: + compiler.set_include_dirs(self.include_dirs) + if self.define is not None: + # 'define' option is a list of (name,value) tuples + for (name,value) in self.define: + compiler.define_macro(name, value) + if self.undef is not None: + for macro in self.undef: + compiler.undefine_macro(macro) + if self.libraries is not None: + compiler.set_libraries(self.libraries) + if self.library_dirs is not None: + compiler.set_library_dirs(self.library_dirs) + if self.rpath is not None: + compiler.set_runtime_library_dirs(self.rpath) + if self.link_objects is not None: + compiler.set_link_objects(self.link_objects) + + # hack so distutils' build_extension() builds a library instead + compiler.link_shared_object = link_shared_object.__get__(compiler) + + + + def get_export_symbols(self, ext): + if isinstance(ext,Library): + return ext.export_symbols + return _build_ext.get_export_symbols(self,ext) + + def build_extension(self, ext): + _compiler = self.compiler + try: + if isinstance(ext,Library): + self.compiler = self.shlib_compiler + _build_ext.build_extension(self,ext) + if ext._needs_stub: + self.write_stub( + self.get_finalized_command('build_py').build_lib, ext + ) + finally: + self.compiler = _compiler + + def links_to_dynamic(self, ext): + """Return true if 'ext' links to a dynamic lib in the same package""" + # XXX this should check to ensure the lib is actually being built + # XXX as dynamic, and not just using a locally-found version or a + # XXX static-compiled version + libnames = dict.fromkeys([lib._full_name for lib in self.shlibs]) + pkg = '.'.join(ext._full_name.split('.')[:-1]+['']) + for libname in ext.libraries: + if pkg+libname in libnames: return True + return False + + def get_outputs(self): + outputs = _build_ext.get_outputs(self) + optimize = self.get_finalized_command('build_py').optimize + for ext in self.extensions: + if ext._needs_stub: + base = os.path.join(self.build_lib, *ext._full_name.split('.')) + outputs.append(base+'.py') + outputs.append(base+'.pyc') + if optimize: + outputs.append(base+'.pyo') + return outputs + + def write_stub(self, output_dir, ext, compile=False): + log.info("writing stub loader for %s to %s",ext._full_name, output_dir) + stub_file = os.path.join(output_dir, *ext._full_name.split('.'))+'.py' + if compile and os.path.exists(stub_file): + raise DistutilsError(stub_file+" already exists! Please delete.") + if not self.dry_run: + f = open(stub_file,'w') + f.write('\n'.join([ + "def __bootstrap__():", + " global __bootstrap__, __file__, __loader__", + " import sys, os, pkg_resources, imp"+if_dl(", dl"), + " __file__ = pkg_resources.resource_filename(__name__,%r)" + % os.path.basename(ext._file_name), + " del __bootstrap__", + " if '__loader__' in globals():", + " del __loader__", + if_dl(" old_flags = sys.getdlopenflags()"), + " old_dir = os.getcwd()", + " try:", + " os.chdir(os.path.dirname(__file__))", + if_dl(" sys.setdlopenflags(dl.RTLD_NOW)"), + " imp.load_dynamic(__name__,__file__)", + " finally:", + if_dl(" sys.setdlopenflags(old_flags)"), + " os.chdir(old_dir)", + "__bootstrap__()", + "" # terminal \n + ])) + f.close() + if compile: + from distutils.util import byte_compile + byte_compile([stub_file], optimize=0, + force=True, dry_run=self.dry_run) + optimize = self.get_finalized_command('install_lib').optimize + if optimize > 0: + byte_compile([stub_file], optimize=optimize, + force=True, dry_run=self.dry_run) + if os.path.exists(stub_file) and not self.dry_run: + os.unlink(stub_file) + + +if use_stubs or os.name=='nt': + # Build shared libraries + # + def link_shared_object(self, objects, output_libname, output_dir=None, + libraries=None, library_dirs=None, runtime_library_dirs=None, + export_symbols=None, debug=0, extra_preargs=None, + extra_postargs=None, build_temp=None, target_lang=None + ): self.link( + self.SHARED_LIBRARY, objects, output_libname, + output_dir, libraries, library_dirs, runtime_library_dirs, + export_symbols, debug, extra_preargs, extra_postargs, + build_temp, target_lang + ) +else: + # Build static libraries everywhere else + libtype = 'static' + + def link_shared_object(self, objects, output_libname, output_dir=None, + libraries=None, library_dirs=None, runtime_library_dirs=None, + export_symbols=None, debug=0, extra_preargs=None, + extra_postargs=None, build_temp=None, target_lang=None + ): + # XXX we need to either disallow these attrs on Library instances, + # or warn/abort here if set, or something... + #libraries=None, library_dirs=None, runtime_library_dirs=None, + #export_symbols=None, extra_preargs=None, extra_postargs=None, + #build_temp=None + + assert output_dir is None # distutils build_ext doesn't pass this + output_dir,filename = os.path.split(output_libname) + basename, ext = os.path.splitext(filename) + if self.library_filename("x").startswith('lib'): + # strip 'lib' prefix; this is kludgy if some platform uses + # a different prefix + basename = basename[3:] + + self.create_static_lib( + objects, basename, output_dir, debug, target_lang + ) + + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_ext.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_ext.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3cd7ebf1de51b5fc35652fd8cb1f9d96eb3c4588 GIT binary patch literal 10990 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_py.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_py.py new file mode 100644 index 0000000000..8751acd493 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_py.py @@ -0,0 +1,280 @@ +import os.path, sys, fnmatch +from distutils.command.build_py import build_py as _build_py +from distutils.util import convert_path +from glob import glob + +try: + from distutils.util import Mixin2to3 as _Mixin2to3 + # add support for converting doctests that is missing in 3.1 distutils + from distutils import log + from lib2to3.refactor import RefactoringTool, get_fixers_from_package + import setuptools + class DistutilsRefactoringTool(RefactoringTool): + def log_error(self, msg, *args, **kw): + log.error(msg, *args) + + def log_message(self, msg, *args): + log.info(msg, *args) + + def log_debug(self, msg, *args): + log.debug(msg, *args) + + class Mixin2to3(_Mixin2to3): + def run_2to3(self, files, doctests = False): + # See of the distribution option has been set, otherwise check the + # setuptools default. + if self.distribution.use_2to3 is not True: + return + if not files: + return + log.info("Fixing "+" ".join(files)) + self.__build_fixer_names() + self.__exclude_fixers() + if doctests: + if setuptools.run_2to3_on_doctests: + r = DistutilsRefactoringTool(self.fixer_names) + r.refactor(files, write=True, doctests_only=True) + else: + _Mixin2to3.run_2to3(self, files) + + def __build_fixer_names(self): + if self.fixer_names: return + self.fixer_names = [] + for p in setuptools.lib2to3_fixer_packages: + self.fixer_names.extend(get_fixers_from_package(p)) + if self.distribution.use_2to3_fixers is not None: + for p in self.distribution.use_2to3_fixers: + self.fixer_names.extend(get_fixers_from_package(p)) + + def __exclude_fixers(self): + excluded_fixers = getattr(self, 'exclude_fixers', []) + if self.distribution.use_2to3_exclude_fixers is not None: + excluded_fixers.extend(self.distribution.use_2to3_exclude_fixers) + for fixer_name in excluded_fixers: + if fixer_name in self.fixer_names: + self.fixer_names.remove(fixer_name) + +except ImportError: + class Mixin2to3: + def run_2to3(self, files, doctests=True): + # Nothing done in 2.x + pass + +class build_py(_build_py, Mixin2to3): + """Enhanced 'build_py' command that includes data files with packages + + The data files are specified via a 'package_data' argument to 'setup()'. + See 'setuptools.dist.Distribution' for more details. + + Also, this version of the 'build_py' command allows you to specify both + 'py_modules' and 'packages' in the same setup operation. + """ + def finalize_options(self): + _build_py.finalize_options(self) + self.package_data = self.distribution.package_data + self.exclude_package_data = self.distribution.exclude_package_data or {} + if 'data_files' in self.__dict__: del self.__dict__['data_files'] + self.__updated_files = [] + self.__doctests_2to3 = [] + + def run(self): + """Build modules, packages, and copy data files to build directory""" + if not self.py_modules and not self.packages: + return + + if self.py_modules: + self.build_modules() + + if self.packages: + self.build_packages() + self.build_package_data() + + self.run_2to3(self.__updated_files, False) + self.run_2to3(self.__updated_files, True) + self.run_2to3(self.__doctests_2to3, True) + + # Only compile actual .py files, using our base class' idea of what our + # output files are. + self.byte_compile(_build_py.get_outputs(self, include_bytecode=0)) + + def __getattr__(self,attr): + if attr=='data_files': # lazily compute data files + self.data_files = files = self._get_data_files(); return files + return _build_py.__getattr__(self,attr) + + def build_module(self, module, module_file, package): + outfile, copied = _build_py.build_module(self, module, module_file, package) + if copied: + self.__updated_files.append(outfile) + return outfile, copied + + def _get_data_files(self): + """Generate list of '(package,src_dir,build_dir,filenames)' tuples""" + self.analyze_manifest() + data = [] + for package in self.packages or (): + # Locate package source directory + src_dir = self.get_package_dir(package) + + # Compute package build directory + build_dir = os.path.join(*([self.build_lib] + package.split('.'))) + + # Length of path to strip from found files + plen = len(src_dir)+1 + + # Strip directory from globbed filenames + filenames = [ + file[plen:] for file in self.find_data_files(package, src_dir) + ] + data.append( (package, src_dir, build_dir, filenames) ) + return data + + def find_data_files(self, package, src_dir): + """Return filenames for package's data files in 'src_dir'""" + globs = (self.package_data.get('', []) + + self.package_data.get(package, [])) + files = self.manifest_files.get(package, [])[:] + for pattern in globs: + # Each pattern has to be converted to a platform-specific path + files.extend(glob(os.path.join(src_dir, convert_path(pattern)))) + return self.exclude_data_files(package, src_dir, files) + + def build_package_data(self): + """Copy data files into build directory""" + lastdir = None + for package, src_dir, build_dir, filenames in self.data_files: + for filename in filenames: + target = os.path.join(build_dir, filename) + self.mkpath(os.path.dirname(target)) + srcfile = os.path.join(src_dir, filename) + outf, copied = self.copy_file(srcfile, target) + srcfile = os.path.abspath(srcfile) + if copied and srcfile in self.distribution.convert_2to3_doctests: + self.__doctests_2to3.append(outf) + + + def analyze_manifest(self): + self.manifest_files = mf = {} + if not self.distribution.include_package_data: + return + src_dirs = {} + for package in self.packages or (): + # Locate package source directory + src_dirs[assert_relative(self.get_package_dir(package))] = package + + self.run_command('egg_info') + ei_cmd = self.get_finalized_command('egg_info') + for path in ei_cmd.filelist.files: + d,f = os.path.split(assert_relative(path)) + prev = None + oldf = f + while d and d!=prev and d not in src_dirs: + prev = d + d, df = os.path.split(d) + f = os.path.join(df, f) + if d in src_dirs: + if path.endswith('.py') and f==oldf: + continue # it's a module, not data + mf.setdefault(src_dirs[d],[]).append(path) + + def get_data_files(self): pass # kludge 2.4 for lazy computation + + if sys.version<"2.4": # Python 2.4 already has this code + def get_outputs(self, include_bytecode=1): + """Return complete list of files copied to the build directory + + This includes both '.py' files and data files, as well as '.pyc' + and '.pyo' files if 'include_bytecode' is true. (This method is + needed for the 'install_lib' command to do its job properly, and to + generate a correct installation manifest.) + """ + return _build_py.get_outputs(self, include_bytecode) + [ + os.path.join(build_dir, filename) + for package, src_dir, build_dir,filenames in self.data_files + for filename in filenames + ] + + def check_package(self, package, package_dir): + """Check namespace packages' __init__ for declare_namespace""" + try: + return self.packages_checked[package] + except KeyError: + pass + + init_py = _build_py.check_package(self, package, package_dir) + self.packages_checked[package] = init_py + + if not init_py or not self.distribution.namespace_packages: + return init_py + + for pkg in self.distribution.namespace_packages: + if pkg==package or pkg.startswith(package+'.'): + break + else: + return init_py + + f = open(init_py,'rbU') + if 'declare_namespace'.encode() not in f.read(): + from distutils import log + log.warn( + "WARNING: %s is a namespace package, but its __init__.py does\n" + "not declare_namespace(); setuptools 0.7 will REQUIRE this!\n" + '(See the setuptools manual under "Namespace Packages" for ' + "details.)\n", package + ) + f.close() + return init_py + + def initialize_options(self): + self.packages_checked={} + _build_py.initialize_options(self) + + + def get_package_dir(self, package): + res = _build_py.get_package_dir(self, package) + if self.distribution.src_root is not None: + return os.path.join(self.distribution.src_root, res) + return res + + + def exclude_data_files(self, package, src_dir, files): + """Filter filenames for package's data files in 'src_dir'""" + globs = (self.exclude_package_data.get('', []) + + self.exclude_package_data.get(package, [])) + bad = [] + for pattern in globs: + bad.extend( + fnmatch.filter( + files, os.path.join(src_dir, convert_path(pattern)) + ) + ) + bad = dict.fromkeys(bad) + seen = {} + return [ + f for f in files if f not in bad + and f not in seen and seen.setdefault(f,1) # ditch dupes + ] + + +def assert_relative(path): + if not os.path.isabs(path): + return path + from distutils.errors import DistutilsSetupError + raise DistutilsSetupError( +"""Error: setup script specifies an absolute path: + + %s + +setup() arguments must *always* be /-separated paths relative to the +setup.py directory, *never* absolute paths. +""" % path + ) + + + + + + + + + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_py.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_py.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc3a7c49501a14b7c6b7cabf087d3ebf65255131 GIT binary patch literal 12692 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 VEdYOJolEs+Zp=BCr>_3=e*nb6zhM9X literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/develop.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/develop.py new file mode 100644 index 0000000000..1d500040d0 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/develop.py @@ -0,0 +1,167 @@ +from setuptools.command.easy_install import easy_install +from distutils.util import convert_path, subst_vars +from pkg_resources import Distribution, PathMetadata, normalize_path +from distutils import log +from distutils.errors import DistutilsError, DistutilsOptionError +import os, sys, setuptools, glob + +class develop(easy_install): + """Set up package for development""" + + description = "install package in 'development mode'" + + user_options = easy_install.user_options + [ + ("uninstall", "u", "Uninstall this source package"), + ("egg-path=", None, "Set the path to be used in the .egg-link file"), + ] + + boolean_options = easy_install.boolean_options + ['uninstall'] + + command_consumes_arguments = False # override base + + def run(self): + if self.uninstall: + self.multi_version = True + self.uninstall_link() + else: + self.install_for_development() + self.warn_deprecated_options() + + def initialize_options(self): + self.uninstall = None + self.egg_path = None + easy_install.initialize_options(self) + self.setup_path = None + self.always_copy_from = '.' # always copy eggs installed in curdir + + + + def finalize_options(self): + ei = self.get_finalized_command("egg_info") + if ei.broken_egg_info: + raise DistutilsError( + "Please rename %r to %r before using 'develop'" + % (ei.egg_info, ei.broken_egg_info) + ) + self.args = [ei.egg_name] + + + + + easy_install.finalize_options(self) + self.expand_basedirs() + self.expand_dirs() + # pick up setup-dir .egg files only: no .egg-info + self.package_index.scan(glob.glob('*.egg')) + + self.egg_link = os.path.join(self.install_dir, ei.egg_name+'.egg-link') + self.egg_base = ei.egg_base + if self.egg_path is None: + self.egg_path = os.path.abspath(ei.egg_base) + + target = normalize_path(self.egg_base) + if normalize_path(os.path.join(self.install_dir, self.egg_path)) != target: + raise DistutilsOptionError( + "--egg-path must be a relative path from the install" + " directory to "+target + ) + + # Make a distribution for the package's source + self.dist = Distribution( + target, + PathMetadata(target, os.path.abspath(ei.egg_info)), + project_name = ei.egg_name + ) + + p = self.egg_base.replace(os.sep,'/') + if p!= os.curdir: + p = '../' * (p.count('/')+1) + self.setup_path = p + p = normalize_path(os.path.join(self.install_dir, self.egg_path, p)) + if p != normalize_path(os.curdir): + raise DistutilsOptionError( + "Can't get a consistent path to setup script from" + " installation directory", p, normalize_path(os.curdir)) + + def install_for_development(self): + if sys.version_info >= (3,) and getattr(self.distribution, 'use_2to3', False): + # If we run 2to3 we can not do this inplace: + + # Ensure metadata is up-to-date + self.reinitialize_command('build_py', inplace=0) + self.run_command('build_py') + bpy_cmd = self.get_finalized_command("build_py") + build_path = normalize_path(bpy_cmd.build_lib) + + # Build extensions + self.reinitialize_command('egg_info', egg_base=build_path) + self.run_command('egg_info') + + self.reinitialize_command('build_ext', inplace=0) + self.run_command('build_ext') + + # Fixup egg-link and easy-install.pth + ei_cmd = self.get_finalized_command("egg_info") + self.egg_path = build_path + self.dist.location = build_path + self.dist._provider = PathMetadata(build_path, ei_cmd.egg_info) # XXX + else: + # Without 2to3 inplace works fine: + self.run_command('egg_info') + + # Build extensions in-place + self.reinitialize_command('build_ext', inplace=1) + self.run_command('build_ext') + + self.install_site_py() # ensure that target dir is site-safe + if setuptools.bootstrap_install_from: + self.easy_install(setuptools.bootstrap_install_from) + setuptools.bootstrap_install_from = None + + # create an .egg-link in the installation dir, pointing to our egg + log.info("Creating %s (link to %s)", self.egg_link, self.egg_base) + if not self.dry_run: + f = open(self.egg_link,"w") + f.write(self.egg_path + "\n" + self.setup_path) + f.close() + # postprocess the installed distro, fixing up .pth, installing scripts, + # and handling requirements + self.process_distribution(None, self.dist, not self.no_deps) + + + def uninstall_link(self): + if os.path.exists(self.egg_link): + log.info("Removing %s (link to %s)", self.egg_link, self.egg_base) + egg_link_file = open(self.egg_link) + contents = [line.rstrip() for line in egg_link_file] + egg_link_file.close() + if contents not in ([self.egg_path], [self.egg_path, self.setup_path]): + log.warn("Link points to %s: uninstall aborted", contents) + return + if not self.dry_run: + os.unlink(self.egg_link) + if not self.dry_run: + self.update_pth(self.dist) # remove any .pth link to us + if self.distribution.scripts: + # XXX should also check for entry point scripts! + log.warn("Note: you must uninstall or replace scripts manually!") + + def install_egg_scripts(self, dist): + if dist is not self.dist: + # Installing a dependency, so fall back to normal behavior + return easy_install.install_egg_scripts(self,dist) + + # create wrapper scripts in the script dir, pointing to dist.scripts + + # new-style... + self.install_wrapper_scripts(dist) + + # ...and old-style + for script_name in self.distribution.scripts or []: + script_path = os.path.abspath(convert_path(script_name)) + script_name = os.path.basename(script_path) + f = open(script_path,'rU') + script_text = f.read() + f.close() + self.install_script(dist, script_name, script_text, script_path) + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/develop.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/develop.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8adf38839d86f6273ebf88b7bddc4968fa116440 GIT binary patch literal 6131 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/easy_install.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/easy_install.py new file mode 100644 index 0000000000..3194644e84 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/easy_install.py @@ -0,0 +1,2002 @@ +#!python +"""\ +Easy Install +------------ + +A tool for doing automatic download/extract/build of distutils-based Python +packages. For detailed documentation, see the accompanying EasyInstall.txt +file, or visit the `EasyInstall home page`__. + +__ https://pythonhosted.org/setuptools/easy_install.html + +""" +import sys +import os +import zipimport +import shutil +import tempfile +import zipfile +import re +import stat +import random +import platform +from glob import glob +import pkg_resources +from setuptools import Command, _dont_write_bytecode +from setuptools.sandbox import run_setup +from distutils import log, dir_util +try: + # Python 2.7 or >=3.2 + from sysconfig import get_config_vars, get_path + def _get_platlib(): + return get_path("platlib") + def _get_purelib(): + return get_path("purelib") +except ImportError: + from distutils.sysconfig import get_config_vars, get_python_lib + def _get_platlib(): + return get_python_lib(True) + def _get_purelib(): + return get_python_lib(False) + +from distutils.util import get_platform +from distutils.util import convert_path, subst_vars +from distutils.errors import DistutilsArgError, DistutilsOptionError, \ + DistutilsError, DistutilsPlatformError +from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS +from setuptools.command import setopt +from setuptools.archive_util import unpack_archive +from setuptools.package_index import PackageIndex +from setuptools.package_index import URL_SCHEME +from setuptools.command import bdist_egg, egg_info +from setuptools.compat import (iteritems, maxsize, xrange, basestring, unicode, + reraise) +from pkg_resources import yield_lines, normalize_path, resource_string, \ + ensure_directory, get_distribution, find_distributions, \ + Environment, Requirement, Distribution, \ + PathMetadata, EggMetadata, WorkingSet, \ + DistributionNotFound, VersionConflict, \ + DEVELOP_DIST + +if '__VENV_LAUNCHER__' in os.environ: + sys_executable = os.environ['__VENV_LAUNCHER__'] +else: + sys_executable = os.path.normpath(sys.executable) + +__all__ = [ + 'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg', + 'main', 'get_exe_prefixes', +] + +import site +HAS_USER_SITE = not sys.version < "2.6" and site.ENABLE_USER_SITE + +import struct +def is_64bit(): + return struct.calcsize("P") == 8 + +def samefile(p1,p2): + if hasattr(os.path,'samefile') and ( + os.path.exists(p1) and os.path.exists(p2) + ): + return os.path.samefile(p1,p2) + return ( + os.path.normpath(os.path.normcase(p1)) == + os.path.normpath(os.path.normcase(p2)) + ) + +if sys.version_info <= (3,): + def _to_ascii(s): + return s + def isascii(s): + try: + unicode(s, 'ascii') + return True + except UnicodeError: + return False +else: + def _to_ascii(s): + return s.encode('ascii') + def isascii(s): + try: + s.encode('ascii') + return True + except UnicodeError: + return False + +class easy_install(Command): + """Manage a download/build/install process""" + description = "Find/get/install Python packages" + command_consumes_arguments = True + + user_options = [ + ('prefix=', None, "installation prefix"), + ("zip-ok", "z", "install package as a zipfile"), + ("multi-version", "m", "make apps have to require() a version"), + ("upgrade", "U", "force upgrade (searches PyPI for latest versions)"), + ("install-dir=", "d", "install package to DIR"), + ("script-dir=", "s", "install scripts to DIR"), + ("exclude-scripts", "x", "Don't install scripts"), + ("always-copy", "a", "Copy all needed packages to install dir"), + ("index-url=", "i", "base URL of Python Package Index"), + ("find-links=", "f", "additional URL(s) to search for packages"), + ("delete-conflicting", "D", "no longer needed; don't use this"), + ("ignore-conflicts-at-my-risk", None, + "no longer needed; don't use this"), + ("build-directory=", "b", + "download/extract/build in DIR; keep the results"), + ('optimize=', 'O', + "also compile with optimization: -O1 for \"python -O\", " + "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"), + ('record=', None, + "filename in which to record list of installed files"), + ('always-unzip', 'Z', "don't install as a zipfile, no matter what"), + ('site-dirs=','S',"list of directories where .pth files work"), + ('editable', 'e', "Install specified packages in editable form"), + ('no-deps', 'N', "don't install dependencies"), + ('allow-hosts=', 'H', "pattern(s) that hostnames must match"), + ('local-snapshots-ok', 'l', "allow building eggs from local checkouts"), + ('version', None, "print version information and exit"), + ('no-find-links', None, + "Don't load find-links defined in packages being installed") + ] + boolean_options = [ + 'zip-ok', 'multi-version', 'exclude-scripts', 'upgrade', 'always-copy', + 'delete-conflicting', 'ignore-conflicts-at-my-risk', 'editable', + 'no-deps', 'local-snapshots-ok', 'version' + ] + + if HAS_USER_SITE: + user_options.append(('user', None, + "install in user site-package '%s'" % site.USER_SITE)) + boolean_options.append('user') + + + negative_opt = {'always-unzip': 'zip-ok'} + create_index = PackageIndex + + def initialize_options(self): + if HAS_USER_SITE: + whereami = os.path.abspath(__file__) + self.user = whereami.startswith(site.USER_SITE) + else: + self.user = 0 + + self.zip_ok = self.local_snapshots_ok = None + self.install_dir = self.script_dir = self.exclude_scripts = None + self.index_url = None + self.find_links = None + self.build_directory = None + self.args = None + self.optimize = self.record = None + self.upgrade = self.always_copy = self.multi_version = None + self.editable = self.no_deps = self.allow_hosts = None + self.root = self.prefix = self.no_report = None + self.version = None + self.install_purelib = None # for pure module distributions + self.install_platlib = None # non-pure (dists w/ extensions) + self.install_headers = None # for C/C++ headers + self.install_lib = None # set to either purelib or platlib + self.install_scripts = None + self.install_data = None + self.install_base = None + self.install_platbase = None + if HAS_USER_SITE: + self.install_userbase = site.USER_BASE + self.install_usersite = site.USER_SITE + else: + self.install_userbase = None + self.install_usersite = None + self.no_find_links = None + + # Options not specifiable via command line + self.package_index = None + self.pth_file = self.always_copy_from = None + self.delete_conflicting = None + self.ignore_conflicts_at_my_risk = None + self.site_dirs = None + self.installed_projects = {} + self.sitepy_installed = False + # Always read easy_install options, even if we are subclassed, or have + # an independent instance created. This ensures that defaults will + # always come from the standard configuration file(s)' "easy_install" + # section, even if this is a "develop" or "install" command, or some + # other embedding. + self._dry_run = None + self.verbose = self.distribution.verbose + self.distribution._set_command_options( + self, self.distribution.get_option_dict('easy_install') + ) + + def delete_blockers(self, blockers): + for filename in blockers: + if os.path.exists(filename) or os.path.islink(filename): + log.info("Deleting %s", filename) + if not self.dry_run: + if os.path.isdir(filename) and not os.path.islink(filename): + rmtree(filename) + else: + os.unlink(filename) + + def finalize_options(self): + if self.version: + print('setuptools %s' % get_distribution('setuptools').version) + sys.exit() + + py_version = sys.version.split()[0] + prefix, exec_prefix = get_config_vars('prefix', 'exec_prefix') + + self.config_vars = {'dist_name': self.distribution.get_name(), + 'dist_version': self.distribution.get_version(), + 'dist_fullname': self.distribution.get_fullname(), + 'py_version': py_version, + 'py_version_short': py_version[0:3], + 'py_version_nodot': py_version[0] + py_version[2], + 'sys_prefix': prefix, + 'prefix': prefix, + 'sys_exec_prefix': exec_prefix, + 'exec_prefix': exec_prefix, + # Only python 3.2+ has abiflags + 'abiflags': getattr(sys, 'abiflags', ''), + } + + if HAS_USER_SITE: + self.config_vars['userbase'] = self.install_userbase + self.config_vars['usersite'] = self.install_usersite + + # fix the install_dir if "--user" was used + #XXX: duplicate of the code in the setup command + if self.user and HAS_USER_SITE: + self.create_home_path() + if self.install_userbase is None: + raise DistutilsPlatformError( + "User base directory is not specified") + self.install_base = self.install_platbase = self.install_userbase + if os.name == 'posix': + self.select_scheme("unix_user") + else: + self.select_scheme(os.name + "_user") + + self.expand_basedirs() + self.expand_dirs() + + self._expand('install_dir','script_dir','build_directory','site_dirs') + # If a non-default installation directory was specified, default the + # script directory to match it. + if self.script_dir is None: + self.script_dir = self.install_dir + + if self.no_find_links is None: + self.no_find_links = False + + # Let install_dir get set by install_lib command, which in turn + # gets its info from the install command, and takes into account + # --prefix and --home and all that other crud. + self.set_undefined_options('install_lib', + ('install_dir','install_dir') + ) + # Likewise, set default script_dir from 'install_scripts.install_dir' + self.set_undefined_options('install_scripts', + ('install_dir', 'script_dir') + ) + + if self.user and self.install_purelib: + self.install_dir = self.install_purelib + self.script_dir = self.install_scripts + # default --record from the install command + self.set_undefined_options('install', ('record', 'record')) + # Should this be moved to the if statement below? It's not used + # elsewhere + normpath = map(normalize_path, sys.path) + self.all_site_dirs = get_site_dirs() + if self.site_dirs is not None: + site_dirs = [ + os.path.expanduser(s.strip()) for s in self.site_dirs.split(',') + ] + for d in site_dirs: + if not os.path.isdir(d): + log.warn("%s (in --site-dirs) does not exist", d) + elif normalize_path(d) not in normpath: + raise DistutilsOptionError( + d+" (in --site-dirs) is not on sys.path" + ) + else: + self.all_site_dirs.append(normalize_path(d)) + if not self.editable: self.check_site_dir() + self.index_url = self.index_url or "https://pypi.python.org/simple" + self.shadow_path = self.all_site_dirs[:] + for path_item in self.install_dir, normalize_path(self.script_dir): + if path_item not in self.shadow_path: + self.shadow_path.insert(0, path_item) + + if self.allow_hosts is not None: + hosts = [s.strip() for s in self.allow_hosts.split(',')] + else: + hosts = ['*'] + if self.package_index is None: + self.package_index = self.create_index( + self.index_url, search_path = self.shadow_path, hosts=hosts, + ) + self.local_index = Environment(self.shadow_path+sys.path) + + if self.find_links is not None: + if isinstance(self.find_links, basestring): + self.find_links = self.find_links.split() + else: + self.find_links = [] + if self.local_snapshots_ok: + self.package_index.scan_egg_links(self.shadow_path+sys.path) + if not self.no_find_links: + self.package_index.add_find_links(self.find_links) + self.set_undefined_options('install_lib', ('optimize','optimize')) + if not isinstance(self.optimize,int): + try: + self.optimize = int(self.optimize) + if not (0 <= self.optimize <= 2): raise ValueError + except ValueError: + raise DistutilsOptionError("--optimize must be 0, 1, or 2") + + if self.delete_conflicting and self.ignore_conflicts_at_my_risk: + raise DistutilsOptionError( + "Can't use both --delete-conflicting and " + "--ignore-conflicts-at-my-risk at the same time" + ) + if self.editable and not self.build_directory: + raise DistutilsArgError( + "Must specify a build directory (-b) when using --editable" + ) + if not self.args: + raise DistutilsArgError( + "No urls, filenames, or requirements specified (see --help)") + + self.outputs = [] + + + def _expand_attrs(self, attrs): + for attr in attrs: + val = getattr(self, attr) + if val is not None: + if os.name == 'posix' or os.name == 'nt': + val = os.path.expanduser(val) + val = subst_vars(val, self.config_vars) + setattr(self, attr, val) + + def expand_basedirs(self): + """Calls `os.path.expanduser` on install_base, install_platbase and + root.""" + self._expand_attrs(['install_base', 'install_platbase', 'root']) + + def expand_dirs(self): + """Calls `os.path.expanduser` on install dirs.""" + self._expand_attrs(['install_purelib', 'install_platlib', + 'install_lib', 'install_headers', + 'install_scripts', 'install_data',]) + + def run(self): + if self.verbose != self.distribution.verbose: + log.set_verbosity(self.verbose) + try: + for spec in self.args: + self.easy_install(spec, not self.no_deps) + if self.record: + outputs = self.outputs + if self.root: # strip any package prefix + root_len = len(self.root) + for counter in xrange(len(outputs)): + outputs[counter] = outputs[counter][root_len:] + from distutils import file_util + self.execute( + file_util.write_file, (self.record, outputs), + "writing list of installed files to '%s'" % + self.record + ) + self.warn_deprecated_options() + finally: + log.set_verbosity(self.distribution.verbose) + + def pseudo_tempname(self): + """Return a pseudo-tempname base in the install directory. + This code is intentionally naive; if a malicious party can write to + the target directory you're already in deep doodoo. + """ + try: + pid = os.getpid() + except: + pid = random.randint(0, maxsize) + return os.path.join(self.install_dir, "test-easy-install-%s" % pid) + + def warn_deprecated_options(self): + if self.delete_conflicting or self.ignore_conflicts_at_my_risk: + log.warn( + "Note: The -D, --delete-conflicting and" + " --ignore-conflicts-at-my-risk no longer have any purpose" + " and should not be used." + ) + + def check_site_dir(self): + """Verify that self.install_dir is .pth-capable dir, if needed""" + + instdir = normalize_path(self.install_dir) + pth_file = os.path.join(instdir,'easy-install.pth') + + # Is it a configured, PYTHONPATH, implicit, or explicit site dir? + is_site_dir = instdir in self.all_site_dirs + + if not is_site_dir and not self.multi_version: + # No? Then directly test whether it does .pth file processing + is_site_dir = self.check_pth_processing() + else: + # make sure we can write to target dir + testfile = self.pseudo_tempname()+'.write-test' + test_exists = os.path.exists(testfile) + try: + if test_exists: os.unlink(testfile) + open(testfile,'w').close() + os.unlink(testfile) + except (OSError,IOError): + self.cant_write_to_target() + + if not is_site_dir and not self.multi_version: + # Can't install non-multi to non-site dir + raise DistutilsError(self.no_default_version_msg()) + + if is_site_dir: + if self.pth_file is None: + self.pth_file = PthDistributions(pth_file, self.all_site_dirs) + else: + self.pth_file = None + + PYTHONPATH = os.environ.get('PYTHONPATH','').split(os.pathsep) + if instdir not in map(normalize_path, [_f for _f in PYTHONPATH if _f]): + # only PYTHONPATH dirs need a site.py, so pretend it's there + self.sitepy_installed = True + elif self.multi_version and not os.path.exists(pth_file): + self.sitepy_installed = True # don't need site.py in this case + self.pth_file = None # and don't create a .pth file + self.install_dir = instdir + + def cant_write_to_target(self): + msg = """can't create or remove files in install directory + +The following error occurred while trying to add or remove files in the +installation directory: + + %s + +The installation directory you specified (via --install-dir, --prefix, or +the distutils default setting) was: + + %s +""" % (sys.exc_info()[1], self.install_dir,) + + if not os.path.exists(self.install_dir): + msg += """ +This directory does not currently exist. Please create it and try again, or +choose a different installation directory (using the -d or --install-dir +option). +""" + else: + msg += """ +Perhaps your account does not have write access to this directory? If the +installation directory is a system-owned directory, you may need to sign in +as the administrator or "root" account. If you do not have administrative +access to this machine, you may wish to choose a different installation +directory, preferably one that is listed in your PYTHONPATH environment +variable. + +For information on other options, you may wish to consult the +documentation at: + + https://pythonhosted.org/setuptools/easy_install.html + +Please make the appropriate changes for your system and try again. +""" + raise DistutilsError(msg) + + + + + def check_pth_processing(self): + """Empirically verify whether .pth files are supported in inst. dir""" + instdir = self.install_dir + log.info("Checking .pth file support in %s", instdir) + pth_file = self.pseudo_tempname()+".pth" + ok_file = pth_file+'.ok' + ok_exists = os.path.exists(ok_file) + try: + if ok_exists: os.unlink(ok_file) + dirname = os.path.dirname(ok_file) + if not os.path.exists(dirname): + os.makedirs(dirname) + f = open(pth_file,'w') + except (OSError,IOError): + self.cant_write_to_target() + else: + try: + f.write("import os; f = open(%r, 'w'); f.write('OK'); f.close()\n" % (ok_file,)) + f.close(); f=None + executable = sys.executable + if os.name=='nt': + dirname,basename = os.path.split(executable) + alt = os.path.join(dirname,'pythonw.exe') + if basename.lower()=='python.exe' and os.path.exists(alt): + # use pythonw.exe to avoid opening a console window + executable = alt + + from distutils.spawn import spawn + spawn([executable,'-E','-c','pass'],0) + + if os.path.exists(ok_file): + log.info( + "TEST PASSED: %s appears to support .pth files", + instdir + ) + return True + finally: + if f: f.close() + if os.path.exists(ok_file): os.unlink(ok_file) + if os.path.exists(pth_file): os.unlink(pth_file) + if not self.multi_version: + log.warn("TEST FAILED: %s does NOT support .pth files", instdir) + return False + + def install_egg_scripts(self, dist): + """Write all the scripts for `dist`, unless scripts are excluded""" + if not self.exclude_scripts and dist.metadata_isdir('scripts'): + for script_name in dist.metadata_listdir('scripts'): + if dist.metadata_isdir('scripts/' + script_name): + # The "script" is a directory, likely a Python 3 + # __pycache__ directory, so skip it. + continue + self.install_script( + dist, script_name, + dist.get_metadata('scripts/'+script_name) + ) + self.install_wrapper_scripts(dist) + + def add_output(self, path): + if os.path.isdir(path): + for base, dirs, files in os.walk(path): + for filename in files: + self.outputs.append(os.path.join(base,filename)) + else: + self.outputs.append(path) + + def not_editable(self, spec): + if self.editable: + raise DistutilsArgError( + "Invalid argument %r: you can't use filenames or URLs " + "with --editable (except via the --find-links option)." + % (spec,) + ) + + def check_editable(self,spec): + if not self.editable: + return + + if os.path.exists(os.path.join(self.build_directory, spec.key)): + raise DistutilsArgError( + "%r already exists in %s; can't do a checkout there" % + (spec.key, self.build_directory) + ) + + + + + + + def easy_install(self, spec, deps=False): + tmpdir = tempfile.mkdtemp(prefix="easy_install-") + download = None + if not self.editable: self.install_site_py() + + try: + if not isinstance(spec,Requirement): + if URL_SCHEME(spec): + # It's a url, download it to tmpdir and process + self.not_editable(spec) + download = self.package_index.download(spec, tmpdir) + return self.install_item(None, download, tmpdir, deps, True) + + elif os.path.exists(spec): + # Existing file or directory, just process it directly + self.not_editable(spec) + return self.install_item(None, spec, tmpdir, deps, True) + else: + spec = parse_requirement_arg(spec) + + self.check_editable(spec) + dist = self.package_index.fetch_distribution( + spec, tmpdir, self.upgrade, self.editable, not self.always_copy, + self.local_index + ) + if dist is None: + msg = "Could not find suitable distribution for %r" % spec + if self.always_copy: + msg+=" (--always-copy skips system and development eggs)" + raise DistutilsError(msg) + elif dist.precedence==DEVELOP_DIST: + # .egg-info dists don't need installing, just process deps + self.process_distribution(spec, dist, deps, "Using") + return dist + else: + return self.install_item(spec, dist.location, tmpdir, deps) + + finally: + if os.path.exists(tmpdir): + rmtree(tmpdir) + + def install_item(self, spec, download, tmpdir, deps, install_needed=False): + + # Installation is also needed if file in tmpdir or is not an egg + install_needed = install_needed or self.always_copy + install_needed = install_needed or os.path.dirname(download) == tmpdir + install_needed = install_needed or not download.endswith('.egg') + install_needed = install_needed or ( + self.always_copy_from is not None and + os.path.dirname(normalize_path(download)) == + normalize_path(self.always_copy_from) + ) + + if spec and not install_needed: + # at this point, we know it's a local .egg, we just don't know if + # it's already installed. + for dist in self.local_index[spec.project_name]: + if dist.location==download: + break + else: + install_needed = True # it's not in the local index + + log.info("Processing %s", os.path.basename(download)) + + if install_needed: + dists = self.install_eggs(spec, download, tmpdir) + for dist in dists: + self.process_distribution(spec, dist, deps) + else: + dists = [self.check_conflicts(self.egg_distribution(download))] + self.process_distribution(spec, dists[0], deps, "Using") + + if spec is not None: + for dist in dists: + if dist in spec: + return dist + + + + def select_scheme(self, name): + """Sets the install directories by applying the install schemes.""" + # it's the caller's problem if they supply a bad name! + scheme = INSTALL_SCHEMES[name] + for key in SCHEME_KEYS: + attrname = 'install_' + key + if getattr(self, attrname) is None: + setattr(self, attrname, scheme[key]) + + + + + def process_distribution(self, requirement, dist, deps=True, *info): + self.update_pth(dist) + self.package_index.add(dist) + self.local_index.add(dist) + self.install_egg_scripts(dist) + self.installed_projects[dist.key] = dist + log.info(self.installation_report(requirement, dist, *info)) + if (dist.has_metadata('dependency_links.txt') and + not self.no_find_links): + self.package_index.add_find_links( + dist.get_metadata_lines('dependency_links.txt') + ) + if not deps and not self.always_copy: + return + elif requirement is not None and dist.key != requirement.key: + log.warn("Skipping dependencies for %s", dist) + return # XXX this is not the distribution we were looking for + elif requirement is None or dist not in requirement: + # if we wound up with a different version, resolve what we've got + distreq = dist.as_requirement() + requirement = requirement or distreq + requirement = Requirement( + distreq.project_name, distreq.specs, requirement.extras + ) + log.info("Processing dependencies for %s", requirement) + try: + distros = WorkingSet([]).resolve( + [requirement], self.local_index, self.easy_install + ) + except DistributionNotFound: + e = sys.exc_info()[1] + raise DistutilsError( + "Could not find required distribution %s" % e.args + ) + except VersionConflict: + e = sys.exc_info()[1] + raise DistutilsError( + "Installed distribution %s conflicts with requirement %s" + % e.args + ) + if self.always_copy or self.always_copy_from: + # Force all the relevant distros to be copied or activated + for dist in distros: + if dist.key not in self.installed_projects: + self.easy_install(dist.as_requirement()) + log.info("Finished processing dependencies for %s", requirement) + + def should_unzip(self, dist): + if self.zip_ok is not None: + return not self.zip_ok + if dist.has_metadata('not-zip-safe'): + return True + if not dist.has_metadata('zip-safe'): + return True + return False + + def maybe_move(self, spec, dist_filename, setup_base): + dst = os.path.join(self.build_directory, spec.key) + if os.path.exists(dst): + log.warn( + "%r already exists in %s; build directory %s will not be kept", + spec.key, self.build_directory, setup_base + ) + return setup_base + if os.path.isdir(dist_filename): + setup_base = dist_filename + else: + if os.path.dirname(dist_filename)==setup_base: + os.unlink(dist_filename) # get it out of the tmp dir + contents = os.listdir(setup_base) + if len(contents)==1: + dist_filename = os.path.join(setup_base,contents[0]) + if os.path.isdir(dist_filename): + # if the only thing there is a directory, move it instead + setup_base = dist_filename + ensure_directory(dst); shutil.move(setup_base, dst) + return dst + + def install_wrapper_scripts(self, dist): + if not self.exclude_scripts: + for args in get_script_args(dist): + self.write_script(*args) + + + + def install_script(self, dist, script_name, script_text, dev_path=None): + """Generate a legacy script wrapper and install it""" + spec = str(dist.as_requirement()) + is_script = is_python_script(script_text, script_name) + + def get_template(filename): + """ + There are a couple of template scripts in the package. This + function loads one of them and prepares it for use. + + These templates use triple-quotes to escape variable + substitutions so the scripts get the 2to3 treatment when build + on Python 3. The templates cannot use triple-quotes naturally. + """ + raw_bytes = resource_string('setuptools', template_name) + template_str = raw_bytes.decode('utf-8') + clean_template = template_str.replace('"""', '') + return clean_template + + if is_script: + template_name = 'script template.py' + if dev_path: + template_name = template_name.replace('.py', ' (dev).py') + script_text = (get_script_header(script_text) + + get_template(template_name) % locals()) + self.write_script(script_name, _to_ascii(script_text), 'b') + + def write_script(self, script_name, contents, mode="t", blockers=()): + """Write an executable file to the scripts directory""" + self.delete_blockers( # clean up old .py/.pyw w/o a script + [os.path.join(self.script_dir,x) for x in blockers]) + log.info("Installing %s script to %s", script_name, self.script_dir) + target = os.path.join(self.script_dir, script_name) + self.add_output(target) + + mask = current_umask() + if not self.dry_run: + ensure_directory(target) + f = open(target,"w"+mode) + f.write(contents) + f.close() + chmod(target, 0x1FF-mask) # 0777 + + + + + def install_eggs(self, spec, dist_filename, tmpdir): + # .egg dirs or files are already built, so just return them + if dist_filename.lower().endswith('.egg'): + return [self.install_egg(dist_filename, tmpdir)] + elif dist_filename.lower().endswith('.exe'): + return [self.install_exe(dist_filename, tmpdir)] + + # Anything else, try to extract and build + setup_base = tmpdir + if os.path.isfile(dist_filename) and not dist_filename.endswith('.py'): + unpack_archive(dist_filename, tmpdir, self.unpack_progress) + elif os.path.isdir(dist_filename): + setup_base = os.path.abspath(dist_filename) + + if (setup_base.startswith(tmpdir) # something we downloaded + and self.build_directory and spec is not None + ): + setup_base = self.maybe_move(spec, dist_filename, setup_base) + + # Find the setup.py file + setup_script = os.path.join(setup_base, 'setup.py') + + if not os.path.exists(setup_script): + setups = glob(os.path.join(setup_base, '*', 'setup.py')) + if not setups: + raise DistutilsError( + "Couldn't find a setup script in %s" % os.path.abspath(dist_filename) + ) + if len(setups)>1: + raise DistutilsError( + "Multiple setup scripts in %s" % os.path.abspath(dist_filename) + ) + setup_script = setups[0] + + # Now run it, and return the result + if self.editable: + log.info(self.report_editable(spec, setup_script)) + return [] + else: + return self.build_and_install(setup_script, setup_base) + + def egg_distribution(self, egg_path): + if os.path.isdir(egg_path): + metadata = PathMetadata(egg_path,os.path.join(egg_path,'EGG-INFO')) + else: + metadata = EggMetadata(zipimport.zipimporter(egg_path)) + return Distribution.from_filename(egg_path,metadata=metadata) + + def install_egg(self, egg_path, tmpdir): + destination = os.path.join(self.install_dir,os.path.basename(egg_path)) + destination = os.path.abspath(destination) + if not self.dry_run: + ensure_directory(destination) + + dist = self.egg_distribution(egg_path) + self.check_conflicts(dist) + if not samefile(egg_path, destination): + if os.path.isdir(destination) and not os.path.islink(destination): + dir_util.remove_tree(destination, dry_run=self.dry_run) + elif os.path.exists(destination): + self.execute(os.unlink,(destination,),"Removing "+destination) + uncache_zipdir(destination) + if os.path.isdir(egg_path): + if egg_path.startswith(tmpdir): + f,m = shutil.move, "Moving" + else: + f,m = shutil.copytree, "Copying" + elif self.should_unzip(dist): + self.mkpath(destination) + f,m = self.unpack_and_compile, "Extracting" + elif egg_path.startswith(tmpdir): + f,m = shutil.move, "Moving" + else: + f,m = shutil.copy2, "Copying" + + self.execute(f, (egg_path, destination), + (m+" %s to %s") % + (os.path.basename(egg_path),os.path.dirname(destination))) + + self.add_output(destination) + return self.egg_distribution(destination) + + def install_exe(self, dist_filename, tmpdir): + # See if it's valid, get data + cfg = extract_wininst_cfg(dist_filename) + if cfg is None: + raise DistutilsError( + "%s is not a valid distutils Windows .exe" % dist_filename + ) + # Create a dummy distribution object until we build the real distro + dist = Distribution(None, + project_name=cfg.get('metadata','name'), + version=cfg.get('metadata','version'), platform=get_platform() + ) + + # Convert the .exe to an unpacked egg + egg_path = dist.location = os.path.join(tmpdir, dist.egg_name()+'.egg') + egg_tmp = egg_path+'.tmp' + egg_info = os.path.join(egg_tmp, 'EGG-INFO') + pkg_inf = os.path.join(egg_info, 'PKG-INFO') + ensure_directory(pkg_inf) # make sure EGG-INFO dir exists + dist._provider = PathMetadata(egg_tmp, egg_info) # XXX + self.exe_to_egg(dist_filename, egg_tmp) + + # Write EGG-INFO/PKG-INFO + if not os.path.exists(pkg_inf): + f = open(pkg_inf,'w') + f.write('Metadata-Version: 1.0\n') + for k,v in cfg.items('metadata'): + if k != 'target_version': + f.write('%s: %s\n' % (k.replace('_','-').title(), v)) + f.close() + script_dir = os.path.join(egg_info,'scripts') + self.delete_blockers( # delete entry-point scripts to avoid duping + [os.path.join(script_dir,args[0]) for args in get_script_args(dist)] + ) + # Build .egg file from tmpdir + bdist_egg.make_zipfile( + egg_path, egg_tmp, verbose=self.verbose, dry_run=self.dry_run + ) + # install the .egg + return self.install_egg(egg_path, tmpdir) + + def exe_to_egg(self, dist_filename, egg_tmp): + """Extract a bdist_wininst to the directories an egg would use""" + # Check for .pth file and set up prefix translations + prefixes = get_exe_prefixes(dist_filename) + to_compile = [] + native_libs = [] + top_level = {} + def process(src,dst): + s = src.lower() + for old,new in prefixes: + if s.startswith(old): + src = new+src[len(old):] + parts = src.split('/') + dst = os.path.join(egg_tmp, *parts) + dl = dst.lower() + if dl.endswith('.pyd') or dl.endswith('.dll'): + parts[-1] = bdist_egg.strip_module(parts[-1]) + top_level[os.path.splitext(parts[0])[0]] = 1 + native_libs.append(src) + elif dl.endswith('.py') and old!='SCRIPTS/': + top_level[os.path.splitext(parts[0])[0]] = 1 + to_compile.append(dst) + return dst + if not src.endswith('.pth'): + log.warn("WARNING: can't process %s", src) + return None + # extract, tracking .pyd/.dll->native_libs and .py -> to_compile + unpack_archive(dist_filename, egg_tmp, process) + stubs = [] + for res in native_libs: + if res.lower().endswith('.pyd'): # create stubs for .pyd's + parts = res.split('/') + resource = parts[-1] + parts[-1] = bdist_egg.strip_module(parts[-1])+'.py' + pyfile = os.path.join(egg_tmp, *parts) + to_compile.append(pyfile); stubs.append(pyfile) + bdist_egg.write_stub(resource, pyfile) + self.byte_compile(to_compile) # compile .py's + bdist_egg.write_safety_flag(os.path.join(egg_tmp,'EGG-INFO'), + bdist_egg.analyze_egg(egg_tmp, stubs)) # write zip-safety flag + + for name in 'top_level','native_libs': + if locals()[name]: + txt = os.path.join(egg_tmp, 'EGG-INFO', name+'.txt') + if not os.path.exists(txt): + f = open(txt,'w') + f.write('\n'.join(locals()[name])+'\n') + f.close() + + def check_conflicts(self, dist): + """Verify that there are no conflicting "old-style" packages""" + + return dist # XXX temporarily disable until new strategy is stable + from imp import find_module, get_suffixes + from glob import glob + + blockers = [] + names = dict.fromkeys(dist._get_metadata('top_level.txt')) # XXX private attr + + exts = {'.pyc':1, '.pyo':1} # get_suffixes() might leave one out + for ext,mode,typ in get_suffixes(): + exts[ext] = 1 + + for path,files in expand_paths([self.install_dir]+self.all_site_dirs): + for filename in files: + base,ext = os.path.splitext(filename) + if base in names: + if not ext: + # no extension, check for package + try: + f, filename, descr = find_module(base, [path]) + except ImportError: + continue + else: + if f: f.close() + if filename not in blockers: + blockers.append(filename) + elif ext in exts and base!='site': # XXX ugh + blockers.append(os.path.join(path,filename)) + if blockers: + self.found_conflicts(dist, blockers) + + return dist + + def found_conflicts(self, dist, blockers): + if self.delete_conflicting: + log.warn("Attempting to delete conflicting packages:") + return self.delete_blockers(blockers) + + msg = """\ +------------------------------------------------------------------------- +CONFLICT WARNING: + +The following modules or packages have the same names as modules or +packages being installed, and will be *before* the installed packages in +Python's search path. You MUST remove all of the relevant files and +directories before you will be able to use the package(s) you are +installing: + + %s + +""" % '\n '.join(blockers) + + if self.ignore_conflicts_at_my_risk: + msg += """\ +(Note: you can run EasyInstall on '%s' with the +--delete-conflicting option to attempt deletion of the above files +and/or directories.) +""" % dist.project_name + else: + msg += """\ +Note: you can attempt this installation again with EasyInstall, and use +either the --delete-conflicting (-D) option or the +--ignore-conflicts-at-my-risk option, to either delete the above files +and directories, or to ignore the conflicts, respectively. Note that if +you ignore the conflicts, the installed package(s) may not work. +""" + msg += """\ +------------------------------------------------------------------------- +""" + sys.stderr.write(msg) + sys.stderr.flush() + if not self.ignore_conflicts_at_my_risk: + raise DistutilsError("Installation aborted due to conflicts") + + def installation_report(self, req, dist, what="Installed"): + """Helpful installation message for display to package users""" + msg = "\n%(what)s %(eggloc)s%(extras)s" + if self.multi_version and not self.no_report: + msg += """ + +Because this distribution was installed --multi-version, before you can +import modules from this package in an application, you will need to +'import pkg_resources' and then use a 'require()' call similar to one of +these examples, in order to select the desired version: + + pkg_resources.require("%(name)s") # latest installed version + pkg_resources.require("%(name)s==%(version)s") # this exact version + pkg_resources.require("%(name)s>=%(version)s") # this version or higher +""" + if self.install_dir not in map(normalize_path,sys.path): + msg += """ + +Note also that the installation directory must be on sys.path at runtime for +this to work. (e.g. by being the application's script directory, by being on +PYTHONPATH, or by being added to sys.path by your code.) +""" + eggloc = dist.location + name = dist.project_name + version = dist.version + extras = '' # TODO: self.report_extras(req, dist) + return msg % locals() + + def report_editable(self, spec, setup_script): + dirname = os.path.dirname(setup_script) + python = sys.executable + return """\nExtracted editable version of %(spec)s to %(dirname)s + +If it uses setuptools in its setup script, you can activate it in +"development" mode by going to that directory and running:: + + %(python)s setup.py develop + +See the setuptools documentation for the "develop" command for more info. +""" % locals() + + def run_setup(self, setup_script, setup_base, args): + sys.modules.setdefault('distutils.command.bdist_egg', bdist_egg) + sys.modules.setdefault('distutils.command.egg_info', egg_info) + + args = list(args) + if self.verbose>2: + v = 'v' * (self.verbose - 1) + args.insert(0,'-'+v) + elif self.verbose<2: + args.insert(0,'-q') + if self.dry_run: + args.insert(0,'-n') + log.info( + "Running %s %s", setup_script[len(setup_base)+1:], ' '.join(args) + ) + try: + run_setup(setup_script, args) + except SystemExit: + v = sys.exc_info()[1] + raise DistutilsError("Setup script exited with %s" % (v.args[0],)) + + def build_and_install(self, setup_script, setup_base): + args = ['bdist_egg', '--dist-dir'] + + dist_dir = tempfile.mkdtemp( + prefix='egg-dist-tmp-', dir=os.path.dirname(setup_script) + ) + try: + self._set_fetcher_options(os.path.dirname(setup_script)) + args.append(dist_dir) + + self.run_setup(setup_script, setup_base, args) + all_eggs = Environment([dist_dir]) + eggs = [] + for key in all_eggs: + for dist in all_eggs[key]: + eggs.append(self.install_egg(dist.location, setup_base)) + if not eggs and not self.dry_run: + log.warn("No eggs found in %s (setup script problem?)", + dist_dir) + return eggs + finally: + rmtree(dist_dir) + log.set_verbosity(self.verbose) # restore our log verbosity + + def _set_fetcher_options(self, base): + """ + When easy_install is about to run bdist_egg on a source dist, that + source dist might have 'setup_requires' directives, requiring + additional fetching. Ensure the fetcher options given to easy_install + are available to that command as well. + """ + # find the fetch options from easy_install and write them out + # to the setup.cfg file. + ei_opts = self.distribution.get_option_dict('easy_install').copy() + fetch_directives = ( + 'find_links', 'site_dirs', 'index_url', 'optimize', + 'site_dirs', 'allow_hosts', + ) + fetch_options = {} + for key, val in ei_opts.items(): + if key not in fetch_directives: continue + fetch_options[key.replace('_', '-')] = val[1] + # create a settings dictionary suitable for `edit_config` + settings = dict(easy_install=fetch_options) + cfg_filename = os.path.join(base, 'setup.cfg') + setopt.edit_config(cfg_filename, settings) + + + def update_pth(self,dist): + if self.pth_file is None: + return + + for d in self.pth_file[dist.key]: # drop old entries + if self.multi_version or d.location != dist.location: + log.info("Removing %s from easy-install.pth file", d) + self.pth_file.remove(d) + if d.location in self.shadow_path: + self.shadow_path.remove(d.location) + + if not self.multi_version: + if dist.location in self.pth_file.paths: + log.info( + "%s is already the active version in easy-install.pth", + dist + ) + else: + log.info("Adding %s to easy-install.pth file", dist) + self.pth_file.add(dist) # add new entry + if dist.location not in self.shadow_path: + self.shadow_path.append(dist.location) + + if not self.dry_run: + + self.pth_file.save() + + if dist.key=='setuptools': + # Ensure that setuptools itself never becomes unavailable! + # XXX should this check for latest version? + filename = os.path.join(self.install_dir,'setuptools.pth') + if os.path.islink(filename): os.unlink(filename) + f = open(filename, 'wt') + f.write(self.pth_file.make_relative(dist.location)+'\n') + f.close() + + def unpack_progress(self, src, dst): + # Progress filter for unpacking + log.debug("Unpacking %s to %s", src, dst) + return dst # only unpack-and-compile skips files for dry run + + def unpack_and_compile(self, egg_path, destination): + to_compile = []; to_chmod = [] + + def pf(src,dst): + if dst.endswith('.py') and not src.startswith('EGG-INFO/'): + to_compile.append(dst) + elif dst.endswith('.dll') or dst.endswith('.so'): + to_chmod.append(dst) + self.unpack_progress(src,dst) + return not self.dry_run and dst or None + + unpack_archive(egg_path, destination, pf) + self.byte_compile(to_compile) + if not self.dry_run: + for f in to_chmod: + mode = ((os.stat(f)[stat.ST_MODE]) | 0x16D) & 0xFED # 0555, 07755 + chmod(f, mode) + + def byte_compile(self, to_compile): + if _dont_write_bytecode: + self.warn('byte-compiling is disabled, skipping.') + return + + from distutils.util import byte_compile + try: + # try to make the byte compile messages quieter + log.set_verbosity(self.verbose - 1) + + byte_compile(to_compile, optimize=0, force=1, dry_run=self.dry_run) + if self.optimize: + byte_compile( + to_compile, optimize=self.optimize, force=1, + dry_run=self.dry_run + ) + finally: + log.set_verbosity(self.verbose) # restore original verbosity + + + + + + + + + + def no_default_version_msg(self): + return """bad install directory or PYTHONPATH + +You are attempting to install a package to a directory that is not +on PYTHONPATH and which Python does not read ".pth" files from. The +installation directory you specified (via --install-dir, --prefix, or +the distutils default setting) was: + + %s + +and your PYTHONPATH environment variable currently contains: + + %r + +Here are some of your options for correcting the problem: + +* You can choose a different installation directory, i.e., one that is + on PYTHONPATH or supports .pth files + +* You can add the installation directory to the PYTHONPATH environment + variable. (It must then also be on PYTHONPATH whenever you run + Python and want to use the package(s) you are installing.) + +* You can set up the installation directory to support ".pth" files by + using one of the approaches described here: + + https://pythonhosted.org/setuptools/easy_install.html#custom-installation-locations + +Please make the appropriate changes for your system and try again.""" % ( + self.install_dir, os.environ.get('PYTHONPATH','') + ) + + + + + + + + + + + def install_site_py(self): + """Make sure there's a site.py in the target dir, if needed""" + + if self.sitepy_installed: + return # already did it, or don't need to + + sitepy = os.path.join(self.install_dir, "site.py") + source = resource_string("setuptools", "site-patch.py") + current = "" + + if os.path.exists(sitepy): + log.debug("Checking existing site.py in %s", self.install_dir) + f = open(sitepy,'rb') + current = f.read() + # we want str, not bytes + if sys.version_info >= (3,): + current = current.decode() + + f.close() + if not current.startswith('def __boot():'): + raise DistutilsError( + "%s is not a setuptools-generated site.py; please" + " remove it." % sitepy + ) + + if current != source: + log.info("Creating %s", sitepy) + if not self.dry_run: + ensure_directory(sitepy) + f = open(sitepy,'wb') + f.write(source) + f.close() + self.byte_compile([sitepy]) + + self.sitepy_installed = True + + + + + def create_home_path(self): + """Create directories under ~.""" + if not self.user: + return + home = convert_path(os.path.expanduser("~")) + for name, path in iteritems(self.config_vars): + if path.startswith(home) and not os.path.isdir(path): + self.debug_print("os.makedirs('%s', 0700)" % path) + os.makedirs(path, 0x1C0) # 0700 + + + + + + + + INSTALL_SCHEMES = dict( + posix = dict( + install_dir = '$base/lib/python$py_version_short/site-packages', + script_dir = '$base/bin', + ), + ) + + DEFAULT_SCHEME = dict( + install_dir = '$base/Lib/site-packages', + script_dir = '$base/Scripts', + ) + + def _expand(self, *attrs): + config_vars = self.get_finalized_command('install').config_vars + + if self.prefix: + # Set default install_dir/scripts from --prefix + config_vars = config_vars.copy() + config_vars['base'] = self.prefix + scheme = self.INSTALL_SCHEMES.get(os.name,self.DEFAULT_SCHEME) + for attr,val in scheme.items(): + if getattr(self,attr,None) is None: + setattr(self,attr,val) + + from distutils.util import subst_vars + for attr in attrs: + val = getattr(self, attr) + if val is not None: + val = subst_vars(val, config_vars) + if os.name == 'posix': + val = os.path.expanduser(val) + setattr(self, attr, val) + + + + + + + + + +def get_site_dirs(): + # return a list of 'site' dirs + sitedirs = [_f for _f in os.environ.get('PYTHONPATH', + '').split(os.pathsep) if _f] + prefixes = [sys.prefix] + if sys.exec_prefix != sys.prefix: + prefixes.append(sys.exec_prefix) + for prefix in prefixes: + if prefix: + if sys.platform in ('os2emx', 'riscos'): + sitedirs.append(os.path.join(prefix, "Lib", "site-packages")) + elif os.sep == '/': + sitedirs.extend([os.path.join(prefix, + "lib", + "python" + sys.version[:3], + "site-packages"), + os.path.join(prefix, "lib", "site-python")]) + else: + sitedirs.extend( + [prefix, os.path.join(prefix, "lib", "site-packages")] + ) + if sys.platform == 'darwin': + # for framework builds *only* we add the standard Apple + # locations. Currently only per-user, but /Library and + # /Network/Library could be added too + if 'Python.framework' in prefix: + home = os.environ.get('HOME') + if home: + sitedirs.append( + os.path.join(home, + 'Library', + 'Python', + sys.version[:3], + 'site-packages')) + for site_lib in (_get_purelib(), _get_platlib()): + if site_lib not in sitedirs: sitedirs.append(site_lib) + + if HAS_USER_SITE: + sitedirs.append(site.USER_SITE) + + sitedirs = list(map(normalize_path, sitedirs)) + + return sitedirs + + +def expand_paths(inputs): + """Yield sys.path directories that might contain "old-style" packages""" + + seen = {} + + for dirname in inputs: + dirname = normalize_path(dirname) + if dirname in seen: + continue + + seen[dirname] = 1 + if not os.path.isdir(dirname): + continue + + files = os.listdir(dirname) + yield dirname, files + + for name in files: + if not name.endswith('.pth'): + # We only care about the .pth files + continue + if name in ('easy-install.pth','setuptools.pth'): + # Ignore .pth files that we control + continue + + # Read the .pth file + f = open(os.path.join(dirname,name)) + lines = list(yield_lines(f)) + f.close() + + # Yield existing non-dupe, non-import directory lines from it + for line in lines: + if not line.startswith("import"): + line = normalize_path(line.rstrip()) + if line not in seen: + seen[line] = 1 + if not os.path.isdir(line): + continue + yield line, os.listdir(line) + + +def extract_wininst_cfg(dist_filename): + """Extract configuration data from a bdist_wininst .exe + + Returns a ConfigParser.RawConfigParser, or None + """ + f = open(dist_filename,'rb') + try: + endrec = zipfile._EndRecData(f) + if endrec is None: + return None + + prepended = (endrec[9] - endrec[5]) - endrec[6] + if prepended < 12: # no wininst data here + return None + f.seek(prepended-12) + + from setuptools.compat import StringIO, ConfigParser + import struct + tag, cfglen, bmlen = struct.unpack("<iii",f.read(12)) + if tag not in (0x1234567A, 0x1234567B): + return None # not a valid tag + + f.seek(prepended-(12+cfglen)) + cfg = ConfigParser.RawConfigParser({'version':'','target_version':''}) + try: + part = f.read(cfglen) + # part is in bytes, but we need to read up to the first null + # byte. + if sys.version_info >= (2,6): + null_byte = bytes([0]) + else: + null_byte = chr(0) + config = part.split(null_byte, 1)[0] + # Now the config is in bytes, but on Python 3, it must be + # unicode for the RawConfigParser, so decode it. Is this the + # right encoding? + config = config.decode('ascii') + cfg.readfp(StringIO(config)) + except ConfigParser.Error: + return None + if not cfg.has_section('metadata') or not cfg.has_section('Setup'): + return None + return cfg + + finally: + f.close() + + + + + + + + +def get_exe_prefixes(exe_filename): + """Get exe->egg path translations for a given .exe file""" + + prefixes = [ + ('PURELIB/', ''), ('PLATLIB/pywin32_system32', ''), + ('PLATLIB/', ''), + ('SCRIPTS/', 'EGG-INFO/scripts/'), + ('DATA/lib/site-packages', ''), + ] + z = zipfile.ZipFile(exe_filename) + try: + for info in z.infolist(): + name = info.filename + parts = name.split('/') + if len(parts)==3 and parts[2]=='PKG-INFO': + if parts[1].endswith('.egg-info'): + prefixes.insert(0,('/'.join(parts[:2]), 'EGG-INFO/')) + break + if len(parts) != 2 or not name.endswith('.pth'): + continue + if name.endswith('-nspkg.pth'): + continue + if parts[0].upper() in ('PURELIB','PLATLIB'): + contents = z.read(name) + if sys.version_info >= (3,): + contents = contents.decode() + for pth in yield_lines(contents): + pth = pth.strip().replace('\\','/') + if not pth.startswith('import'): + prefixes.append((('%s/%s/' % (parts[0],pth)), '')) + finally: + z.close() + prefixes = [(x.lower(),y) for x, y in prefixes] + prefixes.sort(); prefixes.reverse() + return prefixes + + +def parse_requirement_arg(spec): + try: + return Requirement.parse(spec) + except ValueError: + raise DistutilsError( + "Not a URL, existing file, or requirement spec: %r" % (spec,) + ) + +class PthDistributions(Environment): + """A .pth file with Distribution paths in it""" + + dirty = False + + def __init__(self, filename, sitedirs=()): + self.filename = filename + self.sitedirs = list(map(normalize_path, sitedirs)) + self.basedir = normalize_path(os.path.dirname(self.filename)) + self._load(); Environment.__init__(self, [], None, None) + for path in yield_lines(self.paths): + list(map(self.add, find_distributions(path, True))) + + def _load(self): + self.paths = [] + saw_import = False + seen = dict.fromkeys(self.sitedirs) + if os.path.isfile(self.filename): + f = open(self.filename,'rt') + for line in f: + if line.startswith('import'): + saw_import = True + continue + path = line.rstrip() + self.paths.append(path) + if not path.strip() or path.strip().startswith('#'): + continue + # skip non-existent paths, in case somebody deleted a package + # manually, and duplicate paths as well + path = self.paths[-1] = normalize_path( + os.path.join(self.basedir,path) + ) + if not os.path.exists(path) or path in seen: + self.paths.pop() # skip it + self.dirty = True # we cleaned up, so we're dirty now :) + continue + seen[path] = 1 + f.close() + + if self.paths and not saw_import: + self.dirty = True # ensure anything we touch has import wrappers + while self.paths and not self.paths[-1].strip(): + self.paths.pop() + + def save(self): + """Write changed .pth file back to disk""" + if not self.dirty: + return + + data = '\n'.join(map(self.make_relative,self.paths)) + if data: + log.debug("Saving %s", self.filename) + data = ( + "import sys; sys.__plen = len(sys.path)\n" + "%s\n" + "import sys; new=sys.path[sys.__plen:];" + " del sys.path[sys.__plen:];" + " p=getattr(sys,'__egginsert',0); sys.path[p:p]=new;" + " sys.__egginsert = p+len(new)\n" + ) % data + + if os.path.islink(self.filename): + os.unlink(self.filename) + f = open(self.filename,'wt') + f.write(data); f.close() + + elif os.path.exists(self.filename): + log.debug("Deleting empty %s", self.filename) + os.unlink(self.filename) + + self.dirty = False + + def add(self,dist): + """Add `dist` to the distribution map""" + if (dist.location not in self.paths and ( + dist.location not in self.sitedirs or + dist.location == os.getcwd() #account for '.' being in PYTHONPATH + )): + self.paths.append(dist.location) + self.dirty = True + Environment.add(self,dist) + + def remove(self,dist): + """Remove `dist` from the distribution map""" + while dist.location in self.paths: + self.paths.remove(dist.location); self.dirty = True + Environment.remove(self,dist) + + + def make_relative(self,path): + npath, last = os.path.split(normalize_path(path)) + baselen = len(self.basedir) + parts = [last] + sep = os.altsep=='/' and '/' or os.sep + while len(npath)>=baselen: + if npath==self.basedir: + parts.append(os.curdir) + parts.reverse() + return sep.join(parts) + npath, last = os.path.split(npath) + parts.append(last) + else: + return path + +def get_script_header(script_text, executable=sys_executable, wininst=False): + """Create a #! line, getting options (if any) from script_text""" + from distutils.command.build_scripts import first_line_re + + # first_line_re in Python >=3.1.4 and >=3.2.1 is a bytes pattern. + if not isinstance(first_line_re.pattern, str): + first_line_re = re.compile(first_line_re.pattern.decode()) + + first = (script_text+'\n').splitlines()[0] + match = first_line_re.match(first) + options = '' + if match: + options = match.group(1) or '' + if options: options = ' '+options + if wininst: + executable = "python.exe" + else: + executable = nt_quote_arg(executable) + hdr = "#!%(executable)s%(options)s\n" % locals() + if not isascii(hdr): + # Non-ascii path to sys.executable, use -x to prevent warnings + if options: + if options.strip().startswith('-'): + options = ' -x'+options.strip()[1:] + # else: punt, we can't do it, let the warning happen anyway + else: + options = ' -x' + executable = fix_jython_executable(executable, options) + hdr = "#!%(executable)s%(options)s\n" % locals() + return hdr + +def auto_chmod(func, arg, exc): + if func is os.remove and os.name=='nt': + chmod(arg, stat.S_IWRITE) + return func(arg) + et, ev, _ = sys.exc_info() + reraise(et, (ev[0], ev[1] + (" %s %s" % (func,arg)))) + +def uncache_zipdir(path): + """Ensure that the importer caches dont have stale info for `path`""" + from zipimport import _zip_directory_cache as zdc + _uncache(path, zdc) + _uncache(path, sys.path_importer_cache) + +def _uncache(path, cache): + if path in cache: + del cache[path] + else: + path = normalize_path(path) + for p in cache: + if normalize_path(p)==path: + del cache[p] + return + +def is_python(text, filename='<string>'): + "Is this string a valid Python script?" + try: + compile(text, filename, 'exec') + except (SyntaxError, TypeError): + return False + else: + return True + +def is_sh(executable): + """Determine if the specified executable is a .sh (contains a #! line)""" + try: + fp = open(executable) + magic = fp.read(2) + fp.close() + except (OSError,IOError): return executable + return magic == '#!' + +def nt_quote_arg(arg): + """Quote a command line argument according to Windows parsing rules""" + + result = [] + needquote = False + nb = 0 + + needquote = (" " in arg) or ("\t" in arg) + if needquote: + result.append('"') + + for c in arg: + if c == '\\': + nb += 1 + elif c == '"': + # double preceding backslashes, then add a \" + result.append('\\' * (nb*2) + '\\"') + nb = 0 + else: + if nb: + result.append('\\' * nb) + nb = 0 + result.append(c) + + if nb: + result.append('\\' * nb) + + if needquote: + result.append('\\' * nb) # double the trailing backslashes + result.append('"') + + return ''.join(result) + + + + + + + + + +def is_python_script(script_text, filename): + """Is this text, as a whole, a Python script? (as opposed to shell/bat/etc. + """ + if filename.endswith('.py') or filename.endswith('.pyw'): + return True # extension says it's Python + if is_python(script_text, filename): + return True # it's syntactically valid Python + if script_text.startswith('#!'): + # It begins with a '#!' line, so check if 'python' is in it somewhere + return 'python' in script_text.splitlines()[0].lower() + + return False # Not any Python I can recognize + +try: + from os import chmod as _chmod +except ImportError: + # Jython compatibility + def _chmod(*args): pass + +def chmod(path, mode): + log.debug("changing mode of %s to %o", path, mode) + try: + _chmod(path, mode) + except os.error: + e = sys.exc_info()[1] + log.debug("chmod failed: %s", e) + +def fix_jython_executable(executable, options): + if sys.platform.startswith('java') and is_sh(executable): + # Workaround for Jython is not needed on Linux systems. + import java + if java.lang.System.getProperty("os.name") == "Linux": + return executable + + # Workaround Jython's sys.executable being a .sh (an invalid + # shebang line interpreter) + if options: + # Can't apply the workaround, leave it broken + log.warn("WARNING: Unable to adapt shebang line for Jython," + " the following script is NOT executable\n" + " see http://bugs.jython.org/issue1112 for" + " more information.") + else: + return '/usr/bin/env %s' % executable + return executable + + +def get_script_args(dist, executable=sys_executable, wininst=False): + """Yield write_script() argument tuples for a distribution's entrypoints""" + spec = str(dist.as_requirement()) + header = get_script_header("", executable, wininst) + for group in 'console_scripts', 'gui_scripts': + for name, ep in dist.get_entry_map(group).items(): + script_text = ( + "# EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r\n" + "__requires__ = %(spec)r\n" + "import sys\n" + "from pkg_resources import load_entry_point\n" + "\n" + "if __name__ == '__main__':" + "\n" + " sys.exit(\n" + " load_entry_point(%(spec)r, %(group)r, %(name)r)()\n" + " )\n" + ) % locals() + if sys.platform=='win32' or wininst: + # On Windows/wininst, add a .py extension and an .exe launcher + if group=='gui_scripts': + launcher_type = 'gui' + ext = '-script.pyw' + old = ['.pyw'] + new_header = re.sub('(?i)python.exe','pythonw.exe',header) + else: + launcher_type = 'cli' + ext = '-script.py' + old = ['.py','.pyc','.pyo'] + new_header = re.sub('(?i)pythonw.exe','python.exe',header) + if os.path.exists(new_header[2:-1].strip('"')) or sys.platform!='win32': + hdr = new_header + else: + hdr = header + yield (name+ext, hdr+script_text, 't', [name+x for x in old]) + yield ( + name+'.exe', get_win_launcher(launcher_type), + 'b' # write in binary mode + ) + if not is_64bit(): + # install a manifest for the launcher to prevent Windows + # from detecting it as an installer (which it will for + # launchers like easy_install.exe). Consider only + # adding a manifest for launchers detected as installers. + # See Distribute #143 for details. + m_name = name + '.exe.manifest' + yield (m_name, load_launcher_manifest(name), 't') + else: + # On other platforms, we assume the right thing to do is to + # just write the stub with no extension. + yield (name, header+script_text) + +def get_win_launcher(type): + """ + Load the Windows launcher (executable) suitable for launching a script. + + `type` should be either 'cli' or 'gui' + + Returns the executable as a byte string. + """ + launcher_fn = '%s.exe' % type + if platform.machine().lower()=='arm': + launcher_fn = launcher_fn.replace(".", "-arm.") + if is_64bit(): + launcher_fn = launcher_fn.replace(".", "-64.") + else: + launcher_fn = launcher_fn.replace(".", "-32.") + return resource_string('setuptools', launcher_fn) + +def load_launcher_manifest(name): + manifest = pkg_resources.resource_string(__name__, 'launcher manifest.xml') + if sys.version_info[0] < 3: + return manifest % vars() + else: + return manifest.decode('utf-8') % vars() + +def rmtree(path, ignore_errors=False, onerror=auto_chmod): + """Recursively delete a directory tree. + + This code is taken from the Python 2.4 version of 'shutil', because + the 2.3 version doesn't really work right. + """ + if ignore_errors: + def onerror(*args): + pass + elif onerror is None: + def onerror(*args): + raise + names = [] + try: + names = os.listdir(path) + except os.error: + onerror(os.listdir, path, sys.exc_info()) + for name in names: + fullname = os.path.join(path, name) + try: + mode = os.lstat(fullname).st_mode + except os.error: + mode = 0 + if stat.S_ISDIR(mode): + rmtree(fullname, ignore_errors, onerror) + else: + try: + os.remove(fullname) + except os.error: + onerror(os.remove, fullname, sys.exc_info()) + try: + os.rmdir(path) + except os.error: + onerror(os.rmdir, path, sys.exc_info()) + +def current_umask(): + tmp = os.umask(0x12) # 022 + os.umask(tmp) + return tmp + +def bootstrap(): + # This function is called when setuptools*.egg is run using /bin/sh + import setuptools; argv0 = os.path.dirname(setuptools.__path__[0]) + sys.argv[0] = argv0; sys.argv.append(argv0); main() + +def main(argv=None, **kw): + from setuptools import setup + from setuptools.dist import Distribution + import distutils.core + + USAGE = """\ +usage: %(script)s [options] requirement_or_url ... + or: %(script)s --help +""" + + def gen_usage (script_name): + script = os.path.basename(script_name) + return USAGE % vars() + + def with_ei_usage(f): + old_gen_usage = distutils.core.gen_usage + try: + distutils.core.gen_usage = gen_usage + return f() + finally: + distutils.core.gen_usage = old_gen_usage + + class DistributionWithoutHelpCommands(Distribution): + common_usage = "" + + def _show_help(self,*args,**kw): + with_ei_usage(lambda: Distribution._show_help(self,*args,**kw)) + + if argv is None: + argv = sys.argv[1:] + + with_ei_usage(lambda: + setup( + script_args = ['-q','easy_install', '-v']+argv, + script_name = sys.argv[0] or 'easy_install', + distclass=DistributionWithoutHelpCommands, **kw + ) + ) + + + + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/easy_install.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/easy_install.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b062271bf5f7ecd418fb84418dea768f7fe7381 GIT binary patch literal 71108 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 Bc5DCu literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/egg_info.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/egg_info.py new file mode 100644 index 0000000000..642687b23f --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/egg_info.py @@ -0,0 +1,489 @@ +"""setuptools.command.egg_info + +Create a distribution's .egg-info directory and contents""" + +# This module should be kept compatible with Python 2.3 +import os, re, sys +from setuptools import Command +from distutils.errors import * +from distutils import log +from setuptools.command.sdist import sdist +from setuptools.compat import basestring +from distutils.util import convert_path +from distutils.filelist import FileList as _FileList +from pkg_resources import parse_requirements, safe_name, parse_version, \ + safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename +from setuptools.command.sdist import walk_revctrl + +class egg_info(Command): + description = "create a distribution's .egg-info directory" + + user_options = [ + ('egg-base=', 'e', "directory containing .egg-info directories" + " (default: top of the source tree)"), + ('tag-svn-revision', 'r', + "Add subversion revision ID to version number"), + ('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"), + ('tag-build=', 'b', "Specify explicit tag to add to version number"), + ('no-svn-revision', 'R', + "Don't add subversion revision ID [default]"), + ('no-date', 'D', "Don't include date stamp [default]"), + ] + + boolean_options = ['tag-date', 'tag-svn-revision'] + negative_opt = {'no-svn-revision': 'tag-svn-revision', + 'no-date': 'tag-date'} + + + + + + + + def initialize_options(self): + self.egg_name = None + self.egg_version = None + self.egg_base = None + self.egg_info = None + self.tag_build = None + self.tag_svn_revision = 0 + self.tag_date = 0 + self.broken_egg_info = False + self.vtags = None + + def save_version_info(self, filename): + from setuptools.command.setopt import edit_config + edit_config( + filename, + {'egg_info': + {'tag_svn_revision':0, 'tag_date': 0, 'tag_build': self.tags()} + } + ) + + + + + + + + + + + + + + + + + + + + + + + def finalize_options (self): + self.egg_name = safe_name(self.distribution.get_name()) + self.vtags = self.tags() + self.egg_version = self.tagged_version() + + try: + list( + parse_requirements('%s==%s' % (self.egg_name,self.egg_version)) + ) + except ValueError: + raise DistutilsOptionError( + "Invalid distribution name or version syntax: %s-%s" % + (self.egg_name,self.egg_version) + ) + + if self.egg_base is None: + dirs = self.distribution.package_dir + self.egg_base = (dirs or {}).get('',os.curdir) + + self.ensure_dirname('egg_base') + self.egg_info = to_filename(self.egg_name)+'.egg-info' + if self.egg_base != os.curdir: + self.egg_info = os.path.join(self.egg_base, self.egg_info) + if '-' in self.egg_name: self.check_broken_egg_info() + + # Set package version for the benefit of dumber commands + # (e.g. sdist, bdist_wininst, etc.) + # + self.distribution.metadata.version = self.egg_version + + # If we bootstrapped around the lack of a PKG-INFO, as might be the + # case in a fresh checkout, make sure that any special tags get added + # to the version info + # + pd = self.distribution._patched_dist + if pd is not None and pd.key==self.egg_name.lower(): + pd._version = self.egg_version + pd._parsed_version = parse_version(self.egg_version) + self.distribution._patched_dist = None + + + def write_or_delete_file(self, what, filename, data, force=False): + """Write `data` to `filename` or delete if empty + + If `data` is non-empty, this routine is the same as ``write_file()``. + If `data` is empty but not ``None``, this is the same as calling + ``delete_file(filename)`. If `data` is ``None``, then this is a no-op + unless `filename` exists, in which case a warning is issued about the + orphaned file (if `force` is false), or deleted (if `force` is true). + """ + if data: + self.write_file(what, filename, data) + elif os.path.exists(filename): + if data is None and not force: + log.warn( + "%s not set in setup(), but %s exists", what, filename + ) + return + else: + self.delete_file(filename) + + def write_file(self, what, filename, data): + """Write `data` to `filename` (if not a dry run) after announcing it + + `what` is used in a log message to identify what is being written + to the file. + """ + log.info("writing %s to %s", what, filename) + if sys.version_info >= (3,): + data = data.encode("utf-8") + if not self.dry_run: + f = open(filename, 'wb') + f.write(data) + f.close() + + def delete_file(self, filename): + """Delete `filename` (if not a dry run) after announcing it""" + log.info("deleting %s", filename) + if not self.dry_run: + os.unlink(filename) + + def tagged_version(self): + version = self.distribution.get_version() + # egg_info may be called more than once for a distribution, + # in which case the version string already contains all tags. + if self.vtags and version.endswith(self.vtags): + return safe_version(version) + return safe_version(version + self.vtags) + + def run(self): + self.mkpath(self.egg_info) + installer = self.distribution.fetch_build_egg + for ep in iter_entry_points('egg_info.writers'): + writer = ep.load(installer=installer) + writer(self, ep.name, os.path.join(self.egg_info,ep.name)) + + # Get rid of native_libs.txt if it was put there by older bdist_egg + nl = os.path.join(self.egg_info, "native_libs.txt") + if os.path.exists(nl): + self.delete_file(nl) + + self.find_sources() + + def tags(self): + version = '' + if self.tag_build: + version+=self.tag_build + if self.tag_svn_revision and ( + os.path.exists('.svn') or os.path.exists('PKG-INFO') + ): version += '-r%s' % self.get_svn_revision() + if self.tag_date: + import time; version += time.strftime("-%Y%m%d") + return version + + + + + + + + + + + + + + + + + + @staticmethod + def get_svn_revision(): + revision = 0 + urlre = re.compile('url="([^"]+)"') + revre = re.compile('committed-rev="(\d+)"') + + for base,dirs,files in os.walk(os.curdir): + if '.svn' not in dirs: + dirs[:] = [] + continue # no sense walking uncontrolled subdirs + dirs.remove('.svn') + f = open(os.path.join(base,'.svn','entries')) + data = f.read() + f.close() + + if data.startswith('<?xml'): + dirurl = urlre.search(data).group(1) # get repository URL + localrev = max([int(m.group(1)) for m in revre.finditer(data)]+[0]) + else: + try: svnver = int(data.splitlines()[0]) + except: svnver=-1 + if svnver<8: + log.warn("unrecognized .svn/entries format; skipping %s", base) + dirs[:] = [] + continue + + data = list(map(str.splitlines,data.split('\n\x0c\n'))) + del data[0][0] # get rid of the '8' or '9' or '10' + dirurl = data[0][3] + localrev = max([int(d[9]) for d in data if len(d)>9 and d[9]]+[0]) + if base==os.curdir: + base_url = dirurl+'/' # save the root url + elif not dirurl.startswith(base_url): + dirs[:] = [] + continue # not part of the same svn tree, skip it + revision = max(revision, localrev) + + return str(revision or get_pkg_info_revision()) + + + + + def find_sources(self): + """Generate SOURCES.txt manifest file""" + manifest_filename = os.path.join(self.egg_info,"SOURCES.txt") + mm = manifest_maker(self.distribution) + mm.manifest = manifest_filename + mm.run() + self.filelist = mm.filelist + + def check_broken_egg_info(self): + bei = self.egg_name+'.egg-info' + if self.egg_base != os.curdir: + bei = os.path.join(self.egg_base, bei) + if os.path.exists(bei): + log.warn( + "-"*78+'\n' + "Note: Your current .egg-info directory has a '-' in its name;" + '\nthis will not work correctly with "setup.py develop".\n\n' + 'Please rename %s to %s to correct this problem.\n'+'-'*78, + bei, self.egg_info + ) + self.broken_egg_info = self.egg_info + self.egg_info = bei # make it work for now + +class FileList(_FileList): + """File list that accepts only existing, platform-independent paths""" + + def append(self, item): + if item.endswith('\r'): # Fix older sdists built on Windows + item = item[:-1] + path = convert_path(item) + + if sys.version_info >= (3,): + try: + if os.path.exists(path) or os.path.exists(path.encode('utf-8')): + self.files.append(path) + except UnicodeEncodeError: + # Accept UTF-8 filenames even if LANG=C + if os.path.exists(path.encode('utf-8')): + self.files.append(path) + else: + log.warn("'%s' not %s encodable -- skipping", path, + sys.getfilesystemencoding()) + else: + if os.path.exists(path): + self.files.append(path) + + + + + + + + +class manifest_maker(sdist): + + template = "MANIFEST.in" + + def initialize_options (self): + self.use_defaults = 1 + self.prune = 1 + self.manifest_only = 1 + self.force_manifest = 1 + + def finalize_options(self): + pass + + def run(self): + self.filelist = FileList() + if not os.path.exists(self.manifest): + self.write_manifest() # it must exist so it'll get in the list + self.filelist.findall() + self.add_defaults() + if os.path.exists(self.template): + self.read_template() + self.prune_file_list() + self.filelist.sort() + self.filelist.remove_duplicates() + self.write_manifest() + + def write_manifest (self): + """Write the file list in 'self.filelist' (presumably as filled in + by 'add_defaults()' and 'read_template()') to the manifest file + named by 'self.manifest'. + """ + # The manifest must be UTF-8 encodable. See #303. + if sys.version_info >= (3,): + files = [] + for file in self.filelist.files: + try: + file.encode("utf-8") + except UnicodeEncodeError: + log.warn("'%s' not UTF-8 encodable -- skipping" % file) + else: + files.append(file) + self.filelist.files = files + + files = self.filelist.files + if os.sep!='/': + files = [f.replace(os.sep,'/') for f in files] + self.execute(write_file, (self.manifest, files), + "writing manifest file '%s'" % self.manifest) + + def warn(self, msg): # suppress missing-file warnings from sdist + if not msg.startswith("standard file not found:"): + sdist.warn(self, msg) + + def add_defaults(self): + sdist.add_defaults(self) + self.filelist.append(self.template) + self.filelist.append(self.manifest) + rcfiles = list(walk_revctrl()) + if rcfiles: + self.filelist.extend(rcfiles) + elif os.path.exists(self.manifest): + self.read_manifest() + ei_cmd = self.get_finalized_command('egg_info') + self.filelist.include_pattern("*", prefix=ei_cmd.egg_info) + + def prune_file_list (self): + build = self.get_finalized_command('build') + base_dir = self.distribution.get_fullname() + self.filelist.exclude_pattern(None, prefix=build.build_base) + self.filelist.exclude_pattern(None, prefix=base_dir) + sep = re.escape(os.sep) + self.filelist.exclude_pattern(sep+r'(RCS|CVS|\.svn)'+sep, is_regex=1) + + +def write_file (filename, contents): + """Create a file with the specified name and write 'contents' (a + sequence of strings without line terminators) to it. + """ + contents = "\n".join(contents) + if sys.version_info >= (3,): + contents = contents.encode("utf-8") + f = open(filename, "wb") # always write POSIX-style manifest + f.write(contents) + f.close() + + + + + + + + + + + + + +def write_pkg_info(cmd, basename, filename): + log.info("writing %s", filename) + if not cmd.dry_run: + metadata = cmd.distribution.metadata + metadata.version, oldver = cmd.egg_version, metadata.version + metadata.name, oldname = cmd.egg_name, metadata.name + try: + # write unescaped data to PKG-INFO, so older pkg_resources + # can still parse it + metadata.write_pkg_info(cmd.egg_info) + finally: + metadata.name, metadata.version = oldname, oldver + + safe = getattr(cmd.distribution,'zip_safe',None) + from setuptools.command import bdist_egg + bdist_egg.write_safety_flag(cmd.egg_info, safe) + +def warn_depends_obsolete(cmd, basename, filename): + if os.path.exists(filename): + log.warn( + "WARNING: 'depends.txt' is not used by setuptools 0.6!\n" + "Use the install_requires/extras_require setup() args instead." + ) + + +def write_requirements(cmd, basename, filename): + dist = cmd.distribution + data = ['\n'.join(yield_lines(dist.install_requires or ()))] + for extra,reqs in (dist.extras_require or {}).items(): + data.append('\n\n[%s]\n%s' % (extra, '\n'.join(yield_lines(reqs)))) + cmd.write_or_delete_file("requirements", filename, ''.join(data)) + +def write_toplevel_names(cmd, basename, filename): + pkgs = dict.fromkeys( + [k.split('.',1)[0] + for k in cmd.distribution.iter_distribution_names() + ] + ) + cmd.write_file("top-level names", filename, '\n'.join(pkgs)+'\n') + + + +def overwrite_arg(cmd, basename, filename): + write_arg(cmd, basename, filename, True) + +def write_arg(cmd, basename, filename, force=False): + argname = os.path.splitext(basename)[0] + value = getattr(cmd.distribution, argname, None) + if value is not None: + value = '\n'.join(value)+'\n' + cmd.write_or_delete_file(argname, filename, value, force) + +def write_entries(cmd, basename, filename): + ep = cmd.distribution.entry_points + + if isinstance(ep,basestring) or ep is None: + data = ep + elif ep is not None: + data = [] + for section, contents in ep.items(): + if not isinstance(contents,basestring): + contents = EntryPoint.parse_group(section, contents) + contents = '\n'.join(map(str,contents.values())) + data.append('[%s]\n%s\n\n' % (section,contents)) + data = ''.join(data) + + cmd.write_or_delete_file('entry points', filename, data, True) + +def get_pkg_info_revision(): + # See if we can get a -r### off of PKG-INFO, in case this is an sdist of + # a subversion revision + # + if os.path.exists('PKG-INFO'): + f = open('PKG-INFO','rU') + for line in f: + match = re.match(r"Version:.*-r(\d+)\s*$", line) + if match: + return int(match.group(1)) + f.close() + return 0 + + + +# diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/egg_info.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/egg_info.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74457963447fff7eb7db37ca8831c0a8101027b3 GIT binary patch literal 18970 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install.py new file mode 100644 index 0000000000..247c4f259c --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install.py @@ -0,0 +1,124 @@ +import setuptools, sys, glob +from distutils.command.install import install as _install +from distutils.errors import DistutilsArgError + +class install(_install): + """Use easy_install to install the package, w/dependencies""" + + user_options = _install.user_options + [ + ('old-and-unmanageable', None, "Try not to use this!"), + ('single-version-externally-managed', None, + "used by system package builders to create 'flat' eggs"), + ] + boolean_options = _install.boolean_options + [ + 'old-and-unmanageable', 'single-version-externally-managed', + ] + new_commands = [ + ('install_egg_info', lambda self: True), + ('install_scripts', lambda self: True), + ] + _nc = dict(new_commands) + + def initialize_options(self): + _install.initialize_options(self) + self.old_and_unmanageable = None + self.single_version_externally_managed = None + self.no_compile = None # make DISTUTILS_DEBUG work right! + + def finalize_options(self): + _install.finalize_options(self) + if self.root: + self.single_version_externally_managed = True + elif self.single_version_externally_managed: + if not self.root and not self.record: + raise DistutilsArgError( + "You must specify --record or --root when building system" + " packages" + ) + + def handle_extra_path(self): + if self.root or self.single_version_externally_managed: + # explicit backward-compatibility mode, allow extra_path to work + return _install.handle_extra_path(self) + + # Ignore extra_path when installing an egg (or being run by another + # command without --root or --single-version-externally-managed + self.path_file = None + self.extra_dirs = '' + + + def run(self): + # Explicit request for old-style install? Just do it + if self.old_and_unmanageable or self.single_version_externally_managed: + return _install.run(self) + + # Attempt to detect whether we were called from setup() or by another + # command. If we were called by setup(), our caller will be the + # 'run_command' method in 'distutils.dist', and *its* caller will be + # the 'run_commands' method. If we were called any other way, our + # immediate caller *might* be 'run_command', but it won't have been + # called by 'run_commands'. This is slightly kludgy, but seems to + # work. + # + caller = sys._getframe(2) + caller_module = caller.f_globals.get('__name__','') + caller_name = caller.f_code.co_name + + if caller_module != 'distutils.dist' or caller_name!='run_commands': + # We weren't called from the command line or setup(), so we + # should run in backward-compatibility mode to support bdist_* + # commands. + _install.run(self) + else: + self.do_egg_install() + + + + + + + def do_egg_install(self): + + easy_install = self.distribution.get_command_class('easy_install') + + cmd = easy_install( + self.distribution, args="x", root=self.root, record=self.record, + ) + cmd.ensure_finalized() # finalize before bdist_egg munges install cmd + cmd.always_copy_from = '.' # make sure local-dir eggs get installed + + # pick up setup-dir .egg files only: no .egg-info + cmd.package_index.scan(glob.glob('*.egg')) + + self.run_command('bdist_egg') + args = [self.distribution.get_command_obj('bdist_egg').egg_output] + + if setuptools.bootstrap_install_from: + # Bootstrap self-installation of setuptools + args.insert(0, setuptools.bootstrap_install_from) + + cmd.args = args + cmd.run() + setuptools.bootstrap_install_from = None + +# XXX Python 3.1 doesn't see _nc if this is inside the class +install.sub_commands = [ + cmd for cmd in _install.sub_commands if cmd[0] not in install._nc + ] + install.new_commands + + + + + + + + + + + + + + + + +# diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09ef39be247a49c3e7c305fa2220145c7f651251 GIT binary patch literal 4114 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 Co#hw+ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_egg_info.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_egg_info.py new file mode 100644 index 0000000000..f44b34b555 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_egg_info.py @@ -0,0 +1,125 @@ +from setuptools import Command +from setuptools.archive_util import unpack_archive +from distutils import log, dir_util +import os, shutil, pkg_resources + +class install_egg_info(Command): + """Install an .egg-info directory for the package""" + + description = "Install an .egg-info directory for the package" + + user_options = [ + ('install-dir=', 'd', "directory to install to"), + ] + + def initialize_options(self): + self.install_dir = None + + def finalize_options(self): + self.set_undefined_options('install_lib',('install_dir','install_dir')) + ei_cmd = self.get_finalized_command("egg_info") + basename = pkg_resources.Distribution( + None, None, ei_cmd.egg_name, ei_cmd.egg_version + ).egg_name()+'.egg-info' + self.source = ei_cmd.egg_info + self.target = os.path.join(self.install_dir, basename) + self.outputs = [self.target] + + def run(self): + self.run_command('egg_info') + target = self.target + if os.path.isdir(self.target) and not os.path.islink(self.target): + dir_util.remove_tree(self.target, dry_run=self.dry_run) + elif os.path.exists(self.target): + self.execute(os.unlink,(self.target,),"Removing "+self.target) + if not self.dry_run: + pkg_resources.ensure_directory(self.target) + self.execute(self.copytree, (), + "Copying %s to %s" % (self.source, self.target) + ) + self.install_namespaces() + + def get_outputs(self): + return self.outputs + + def copytree(self): + # Copy the .egg-info tree to site-packages + def skimmer(src,dst): + # filter out source-control directories; note that 'src' is always + # a '/'-separated path, regardless of platform. 'dst' is a + # platform-specific path. + for skip in '.svn/','CVS/': + if src.startswith(skip) or '/'+skip in src: + return None + self.outputs.append(dst) + log.debug("Copying %s to %s", src, dst) + return dst + unpack_archive(self.source, self.target, skimmer) + + + + + + + + + + + + + + + + + + + + + + + + + + def install_namespaces(self): + nsp = self._get_all_ns_packages() + if not nsp: return + filename,ext = os.path.splitext(self.target) + filename += '-nspkg.pth'; self.outputs.append(filename) + log.info("Installing %s",filename) + if not self.dry_run: + f = open(filename,'wt') + for pkg in nsp: + # ensure pkg is not a unicode string under Python 2.7 + pkg = str(pkg) + pth = tuple(pkg.split('.')) + trailer = '\n' + if '.' in pkg: + trailer = ( + "; m and setattr(sys.modules[%r], %r, m)\n" + % ('.'.join(pth[:-1]), pth[-1]) + ) + f.write( + "import sys,types,os; " + "p = os.path.join(sys._getframe(1).f_locals['sitedir'], " + "*%(pth)r); " + "ie = os.path.exists(os.path.join(p,'__init__.py')); " + "m = not ie and " + "sys.modules.setdefault(%(pkg)r,types.ModuleType(%(pkg)r)); " + "mp = (m or []) and m.__dict__.setdefault('__path__',[]); " + "(p not in mp) and mp.append(p)%(trailer)s" + % locals() + ) + f.close() + + def _get_all_ns_packages(self): + nsp = {} + for pkg in self.distribution.namespace_packages or []: + pkg = pkg.split('.') + while pkg: + nsp['.'.join(pkg)] = 1 + pkg.pop() + nsp=list(nsp) + nsp.sort() # set up shorter names first + return nsp + + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_egg_info.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_egg_info.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54a2b35f78b8946da7a79ee5f03f07beec9b503d GIT binary patch literal 5057 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_lib.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_lib.py new file mode 100644 index 0000000000..82afa1421b --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_lib.py @@ -0,0 +1,82 @@ +from distutils.command.install_lib import install_lib as _install_lib +import os + +class install_lib(_install_lib): + """Don't add compiled flags to filenames of non-Python files""" + + def _bytecode_filenames (self, py_filenames): + bytecode_files = [] + for py_file in py_filenames: + if not py_file.endswith('.py'): + continue + if self.compile: + bytecode_files.append(py_file + "c") + if self.optimize > 0: + bytecode_files.append(py_file + "o") + + return bytecode_files + + def run(self): + self.build() + outfiles = self.install() + if outfiles is not None: + # always compile, in case we have any extension stubs to deal with + self.byte_compile(outfiles) + + def get_exclusions(self): + exclude = {} + nsp = self.distribution.namespace_packages + + if (nsp and self.get_finalized_command('install') + .single_version_externally_managed + ): + for pkg in nsp: + parts = pkg.split('.') + while parts: + pkgdir = os.path.join(self.install_dir, *parts) + for f in '__init__.py', '__init__.pyc', '__init__.pyo': + exclude[os.path.join(pkgdir,f)] = 1 + parts.pop() + return exclude + + def copy_tree( + self, infile, outfile, + preserve_mode=1, preserve_times=1, preserve_symlinks=0, level=1 + ): + assert preserve_mode and preserve_times and not preserve_symlinks + exclude = self.get_exclusions() + + if not exclude: + return _install_lib.copy_tree(self, infile, outfile) + + # Exclude namespace package __init__.py* files from the output + + from setuptools.archive_util import unpack_directory + from distutils import log + + outfiles = [] + + def pf(src, dst): + if dst in exclude: + log.warn("Skipping installation of %s (namespace package)",dst) + return False + + log.info("copying %s -> %s", src, os.path.dirname(dst)) + outfiles.append(dst) + return dst + + unpack_directory(infile, outfile, pf) + return outfiles + + def get_outputs(self): + outputs = _install_lib.get_outputs(self) + exclude = self.get_exclusions() + if exclude: + return [f for f in outputs if f not in exclude] + return outputs + + + + + + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_lib.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_lib.pyc new file mode 100644 index 0000000000000000000000000000000000000000..edf5a65e680b4602013ea204db5b3eaf41ffac51 GIT binary patch literal 3532 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_scripts.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_scripts.py new file mode 100644 index 0000000000..105dabca6a --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_scripts.py @@ -0,0 +1,54 @@ +from distutils.command.install_scripts import install_scripts \ + as _install_scripts +from pkg_resources import Distribution, PathMetadata, ensure_directory +import os +from distutils import log + +class install_scripts(_install_scripts): + """Do normal script install, plus any egg_info wrapper scripts""" + + def initialize_options(self): + _install_scripts.initialize_options(self) + self.no_ep = False + + def run(self): + from setuptools.command.easy_install import get_script_args + from setuptools.command.easy_install import sys_executable + + self.run_command("egg_info") + if self.distribution.scripts: + _install_scripts.run(self) # run first to set up self.outfiles + else: + self.outfiles = [] + if self.no_ep: + # don't install entry point scripts into .egg file! + return + + ei_cmd = self.get_finalized_command("egg_info") + dist = Distribution( + ei_cmd.egg_base, PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info), + ei_cmd.egg_name, ei_cmd.egg_version, + ) + bs_cmd = self.get_finalized_command('build_scripts') + executable = getattr(bs_cmd,'executable',sys_executable) + is_wininst = getattr( + self.get_finalized_command("bdist_wininst"), '_is_running', False + ) + for args in get_script_args(dist, executable, is_wininst): + self.write_script(*args) + + def write_script(self, script_name, contents, mode="t", *ignored): + """Write an executable file to the scripts directory""" + from setuptools.command.easy_install import chmod, current_umask + log.info("Installing %s script to %s", script_name, self.install_dir) + target = os.path.join(self.install_dir, script_name) + self.outfiles.append(target) + + mask = current_umask() + if not self.dry_run: + ensure_directory(target) + f = open(target,"w"+mode) + f.write(contents) + f.close() + chmod(target, 0x1FF-mask) # 0777 + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_scripts.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_scripts.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd03158256b5513dea4c42a1806bf4621a9ebbee GIT binary patch literal 2796 zcmc&$%WfP+6usT^u*b1uCk7LuNDP9AStOQVg9HfiFrY|ah0Y>kG^o|nT^{$OA46Al zoI&H2v*cS?@J+1P@&VzT+tYTE4<IA=?W*c}+<Wdhx7_)6XKQ-@@1J8?|2lYog~v`| z68w3RiR7M)eeu}$CF@Aum2p?{o{W2v_hsB~zI7zqknx7D>q@pM`9Q`4eCvtv<;0Vu zFV96TM1C2g(~(D`4IGocz;EQC<#yREtc$WNv~iU#oE_06w+(ZYT34mh+NEWo0}ms2 z`jc@{61m9jVTLJeU70XRD-*l2S{^sMa)+#(1$aqJ!=I1m8$9+Nj1i$nus%bElj9C! zWur?^lde1m2t5fNje1=5Im}TxEXpd6vSH)vaP9iN;UcT;Fe;WqGn<8JaZ(P?s%Wt= z)q19l87?2X@hu*E8^(#uJy`)FPdw+d72<3GP@H=_>T(hz#ip;I<ZfaxEmD_8S^B#P z%LP%gj=p{$W!7k`C_}SoFyT(tWG5rMMUBnTN<N#+Qg>QUCy&$O>+Ga5$xE$iT1<}2 zw4O~KF5PKad{;c3d~*2d<i~V6v8gln7g78qni)I6f%U?bWo9RFndecFOkVT&aIp;f zIB^S)r8na3cnZq^ZThXS^bj~QLf$D4&w&j4;2QeAoP(EuX|5?EZ0vMp-jnKqxW3Fc zT0Dz^%tRsGq@53>3Kd&+wwPfoKktaUCaaFjx5e$O8|+?}3*-ZhUA231(UtSAZiKZx zUE33PLsmV~eC5kUN6z~?((J#%ImxCVRs6Ie&pwhBvW-nJA749i^y|KyH{R{bYE%9I zD8Kz9kCg$0<@hzN%#2&>B#f$=ZBlz36YbK5=9!6W7fmzcHZjyv5n+i;>oiMRi8<!r zrP(?mf!e||Pzo#pB&3`TtGd9zZ1fiT?md{RJRh#}d}t!OZ0Q+r=YXqq3oH-U(^SAb z<5JNq1#8U*OuwUSu|l0MYj=`n#s-YUy$!?APtro^p0v9Ll*whZ)5w~D0t>cZ9xkHX zs5?aDsi`dM2~WqCk#kkRw)%Hgfz)f1M#Mi*a}^W`Y|=2!6GsX&9&iruT8;(Ggn|p` zS|~YBbA|UC6CMFnntVtvyghHv-|@C#2j0N%`nz7oyXD=)`zBldyPi{EV>-|1`ThZq z{R`$5dE!EVC~+Ymeb6CvN{&MTkVprks>pf6@gBcHR?tEtNXU>vpo;r)A*~j!iT#ra zS%0H0amhe89eIb#2eKMap%fk0qO;589<<1ru$yuVGra=d_Se^r{TRMKW`<Fzhgb9; zl4wI$4&A9~%k}W`N@)a0QfWnvPxCTSMa6YhnZkv29@!^a%^x%+8hRPtwe1yweeYUD z^DKP<P>)9}=fMq{4``T?fcPq-cy}mQ+v*8Na50FKR=+QB1!`knrbTeTW#k|4nj%qB zC)JX&4X7raS>luWuIz52$VzKQN^25a4{W3us#qwx7$U*K=2!%6boX?I8_*<IuIup* z1UF7kBN`g+o4sl7AOhZUmJo@5;2nVAN_TI|+sDnb<&6lO){ao44nvi07$Vp@Gw8A| zgke&~VW?MEKp6$?){U5Xh`fQTl*iIP%Ut!nzCY*=Zfi>2`xs$m!aq)#y)4r$q1uv* zNz&9^mjA_*Sy&lc)>Vw6OYt{_lq?Duqa#r+cU8h_=vU_d2SJnfMU$>C>9c~d=ikxN F_8;8rq^<w} literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/launcher manifest.xml b/PythonEnv/2.7/Lib/site-packages/setuptools/command/launcher manifest.xml new file mode 100644 index 0000000000..844d2264cd --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/launcher manifest.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> +<assemblyIdentity version="1.0.0.0" + processorArchitecture="X86" + name="%(name)s" + type="win32"/> + <!-- Identify the application security requirements. --> + <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> + <security> + <requestedPrivileges> + <requestedExecutionLevel level="asInvoker" uiAccess="false"/> + </requestedPrivileges> + </security> + </trustInfo> +</assembly> diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/register.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/register.py new file mode 100644 index 0000000000..3b2e085907 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/register.py @@ -0,0 +1,10 @@ +from distutils.command.register import register as _register + +class register(_register): + __doc__ = _register.__doc__ + + def run(self): + # Make sure that we are using valid current name/version info + self.run_command('egg_info') + _register.run(self) + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/register.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/register.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb8060cf8fa1e005c3310c651382a37c74bdf19e GIT binary patch literal 809 zcmc&y%}&EG40h7-v!O|xIdHC!)&mzLgb=?sG(mSjRFR^#NxO_TothMB61VZFya5jY zPPPG008#ANiDQ3X;^1RA$VTrEIjl#3>jjEALM3n#r~qmL2?Zi3ND2i35x^V365uI8 zrw5a83&YhXj*y^bcTu&nRL06SMjO5hxZ^7nbAU<$U;@lJ3m^$xJxrVQAfEU%xeIne zQLa(UA*xq^nFqEcKrDe7bz9EC`;*Ycjy(WbmR#wg2^}fBhpO!~&zrhVwXl8k`39qP zA$Yn%-$Td9st9ofuS|iKIAx`>(=KC=N?%q*E5$D>Q<~k#tSj05!cH4~t6$i0bi(db z#*DIZG*9#Aw3LP!X}h^?n#!;>7`DL?%@?t&zKvp>0dz?G<9bG%>$H}f+X0?%UN@qv z(2YI89ls}<95>w6AM}4t0jq<<<SA^EJ{_<A!2P+vrs%AyOtdB+ZOHpZ@m&57x_{=g O)x(~<)-$f3_URX&#mLwI literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/rotate.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/rotate.py new file mode 100644 index 0000000000..b10acfb41f --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/rotate.py @@ -0,0 +1,83 @@ +import distutils, os +from setuptools import Command +from setuptools.compat import basestring +from distutils.util import convert_path +from distutils import log +from distutils.errors import * + +class rotate(Command): + """Delete older distributions""" + + description = "delete older distributions, keeping N newest files" + user_options = [ + ('match=', 'm', "patterns to match (required)"), + ('dist-dir=', 'd', "directory where the distributions are"), + ('keep=', 'k', "number of matching distributions to keep"), + ] + + boolean_options = [] + + def initialize_options(self): + self.match = None + self.dist_dir = None + self.keep = None + + def finalize_options(self): + if self.match is None: + raise DistutilsOptionError( + "Must specify one or more (comma-separated) match patterns " + "(e.g. '.zip' or '.egg')" + ) + if self.keep is None: + raise DistutilsOptionError("Must specify number of files to keep") + try: + self.keep = int(self.keep) + except ValueError: + raise DistutilsOptionError("--keep must be an integer") + if isinstance(self.match, basestring): + self.match = [ + convert_path(p.strip()) for p in self.match.split(',') + ] + self.set_undefined_options('bdist',('dist_dir', 'dist_dir')) + + def run(self): + self.run_command("egg_info") + from glob import glob + for pattern in self.match: + pattern = self.distribution.get_name()+'*'+pattern + files = glob(os.path.join(self.dist_dir,pattern)) + files = [(os.path.getmtime(f),f) for f in files] + files.sort() + files.reverse() + + log.info("%d file(s) matching %s", len(files), pattern) + files = files[self.keep:] + for (t,f) in files: + log.info("Deleting %s", f) + if not self.dry_run: + os.unlink(f) + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/rotate.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/rotate.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ea14bedb8dbe1b64fe323397b3221135f1ba130 GIT binary patch literal 3146 zcmc&$&2k$>5boKPWJ$JTCqRDqN%la>8xrY|Dk@b}LIH7ZU|>UGP$_J!v?F=t{gHP@ zNu07Tgm>U!c!%%`9Jq1h0pRN%|HM>Lz=cTK)=W=NPj}DP-Ru9p+8y<N{c=o4A0Pi8 z;V}mwDSnD_qQS{n(Lf2`quisyr-4t3<$TH;R5WSObn^z~Eh?61u;k`V)>E`;(020{ z<sJGeT_Ww%1S;F~1JQG$ZwFmI^kLY60ofn;Y=sI#y99E-DvG2`9it1zC^6dDIxDA+ zw*ua{Dj)0G#`DDPI4(PtS4SeO>^<88tt*>Yed2l(tWWTmO%M&I#nFMs=D^GJ9HncN zuG17wH)slhCZ)@4_Mk=SiVT)0U6nzbqKDym*7hdIrp~q1L6xVv4$_P*9xZHEmB!r0 za{9N+w}M@*=Ws9B3QGM1z6O&l*T%5@MPkQ0_bfY9n72XUvDI~H0$T;L7=*RnTV%CP zZy1gzAKgo{+HFeBb>Y=|Y^!=dc(S8w9oQXx*2EyGwc+5fDQ@Sk2{A7h#R&dX6L%O} zdB!(3gZGTtLVi3v_wkr(AOH<87E6$MfH*r2LQS}T-mn!mKrNH4s??UP5XWpABR(vK zH?qzLx!Y!Gqw@)yNJ0!0Qu@Jgn%SMjXt<q~ALkPU<)zUmD~FqUw3rUR*ta`X`Jj9} zyxqSu{4^U4O=fj(o{V>ssWwBS?P6}LDmTNigX7QvsXyPh7jRHkW;RRm?3s?Mxm@z= z;L44W>fkH!;8?Ib5|5uTKn!LQmEAVgSIG+Qo-6uZQR!ACFuZzKRy{gd-M`2|Vhuhs zIh;Oim+w#mA=~Xzy+=wZRw?VOQqea^0(U5K>$ykuPYi0unYAfxu&T{Rm+4TE?a+au zS(h^u-0wWv`%#Vo3f!J$N|6qti0i?_kZ)+qd<pv50<bl6J<cZk0j@Eq>Y%6qwNL`s zGkTuX$i(!<5o%9x9P0kGA8hoWW%CW*wb9qp>BbH7?q9W@LQ&G=7<uLj1baQkMo_R7 zBON4Vkd;<XQ6d;(w**up#!|G5dB_)IUWV71Nyrr@;?fgwLRr4rP3%QB=jL;{?gw>U z)e*~C9|VV4mj61*7h2Y2nwhLLHYvwCVl%`FGtV;{u>o$1GBLMrU<%B|i!#-dtkmf- zs>IT0m8Dt3{8iw69S6gxGic|So68`i)|9VS{5AQ%s8-dwy5QaM#%wMZuoL{Rf#ZOO zS_^!sRG^wGDip&{J^fAAJ>c;dI`m}X(+m(r$~5TGfk&5^4Wu?{)}q;xh_nd{fHqVf z`hspB8m`h|<5&*37Mz1lJi&Fwq6bheU{^d^=3|syq1h^<+@9lg=w#(+f0(fGYjh1e zpWfre%}4Lk(4)hq9OX75+i;Wzc?hqQc_B8OKQch=y&(Ly_cmx-@`wA~mee_5KF-QX zCEf6}#!d5T6g41aE`nT7r89))D2cclUpIy!E#1e>LoQI3nf0QKkLp+S7UqI!xai92 zaetEYr$Aqs6dLt|s4`M+xw*<<R%N9m&ar4=Gl+^^Rc)nh*BTAk=!nxnR@fU!j$D^6 zQ`p<I-j89H^yWpGXXS3lC=rN@jiT(RI7o&_vJ3hrLhY-_0rm=J-^8DEVG^LPt4r#t zx~aOV>s<loHGsdPLKc3hc}MKvKlX07>r4ZWIAH(2e>)8)O+4cI_MdvVypG8g$AX18 zmMRv<MU^gcjVT)x$7wajm;sh*Gv@k*w;X}h!sz<AblEisjL<`MQXcc7bKpf>Jfa@R z=}pS$e{10p2T8)isnSv{ujTnDV;#Tcb()<EA^V1Q=<-C$e#Eac5{}b%g9t3L@&b7B zzR*X$0llu?v$x!IL_?pc6n>W@TvksPH8&I^hP|q&$j#q%cl{xkZ^M=1GBEAFUGGm$ ChWd^G literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/saveopts.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/saveopts.py new file mode 100644 index 0000000000..7209be4cd9 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/saveopts.py @@ -0,0 +1,24 @@ +import distutils, os +from setuptools import Command +from setuptools.command.setopt import edit_config, option_base + +class saveopts(option_base): + """Save command-line options to a file""" + + description = "save supplied options to setup.cfg or other config file" + + def run(self): + dist = self.distribution + settings = {} + + for cmd in dist.command_options: + + if cmd=='saveopts': + continue # don't save our own options! + + for opt,(src,val) in dist.get_option_dict(cmd).items(): + if src=="command line": + settings.setdefault(cmd,{})[opt] = val + + edit_config(self.filename, settings, self.dry_run) + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/saveopts.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/saveopts.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47e01ed8a2e18dc8dbf43cce26a4aa3df9812d70 GIT binary patch literal 1348 zcmc&z&2H2{4E9X2+aHRkI3RjJ3gVJWSAt6=R3V^6y`T!Vhe8w-C7DS&ZT^~>RIRjo zS{{Ul;|+KKu)Ry$Cx9sNcsw5a`)tSi^>8!W{rNeE)#Ks%7C-w1g~C@r1rXip0wTe7 z36+G}gUACxejZdl)FX&SP>&%RqtypJh63G3@Eu?Q@HJYafG6P?gPY&@9ESo`w}#@N zt?RT=p(Mit6j~XV<ZV-!lJ{-rOxq+`YPDO(bDLgiwAowi6zV-4Jfqu)nvq75aw1G6 z2}b0@^duyj_63R)3=-ta)Vq~wbg)cg1J?#=P?$>FJ#r>LJ9J%Tw7TzuV1{mz7iG}) zLF>+RkKqV2-^~dVu_ML@6z2zu8NfNfT!29-;o8AWz`20KZwBTb%n+-93km&8xZHsT z;QE+7Bpof#6(yke9>fynKFblz$1ocaOS*XkGu%oz_vsGiS>R<K_AieB-%|{G>P8HN z-3ZYdES9}omgjit5#B8ntNH{~pO8xL$f}HWy~zgZihFeDmaHnswo<#*K2aujm=ini zbZy-xYFIp_i*%^ml;?nAQ^}jO);tudze)O`38{q6=NnbQ3T0o8fp*R`rF8^1uNAKd zfmhq-yk4bMh{wRf7O1J$acSJykj1B_c~=#^R`;~bH1VO%hBE$i<IdXVLvt0sn(W0N zO%_|kzuTqxMOtbbbN^l2RyJOhDgHZ{lkSF-BLOD+m=K5!F_znM3uP#_#B&)^Ntj8J z5bq@6(j-aUs-dDSkxvrU=BU$;p|s6=!+*n+V%{<P*YtQq2*0KI9wR4YwT`OWKtV0S z>8Pxuf4aSG`OtB_rf3AWgW|4+lT{5TXu=-yR7~kMXZn9cxj*~Mj=Z5!Wx`Lzws<1{ E05h6TMgRZ+ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/sdist.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/sdist.py new file mode 100644 index 0000000000..39cd604396 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/sdist.py @@ -0,0 +1,304 @@ +from distutils.command.sdist import sdist as _sdist +from distutils.util import convert_path +from distutils import log +from glob import glob +import os, re, sys, pkg_resources +from glob import glob + +READMES = ('README', 'README.rst', 'README.txt') + +entities = [ + ("<","<"), (">", ">"), (""", '"'), ("'", "'"), + ("&", "&") +] + +def unescape(data): + for old,new in entities: + data = data.replace(old,new) + return data + +def re_finder(pattern, postproc=None): + def find(dirname, filename): + f = open(filename,'rU') + data = f.read() + f.close() + for match in pattern.finditer(data): + path = match.group(1) + if postproc: + path = postproc(path) + yield joinpath(dirname,path) + return find + +def joinpath(prefix,suffix): + if not prefix: + return suffix + return os.path.join(prefix,suffix) + + + + + + + + + +def walk_revctrl(dirname=''): + """Find all files under revision control""" + for ep in pkg_resources.iter_entry_points('setuptools.file_finders'): + for item in ep.load()(dirname): + yield item + +def _default_revctrl(dirname=''): + for path, finder in finders: + path = joinpath(dirname,path) + if os.path.isfile(path): + for path in finder(dirname,path): + if os.path.isfile(path): + yield path + elif os.path.isdir(path): + for item in _default_revctrl(path): + yield item + +def externals_finder(dirname, filename): + """Find any 'svn:externals' directories""" + found = False + f = open(filename,'rt') + for line in iter(f.readline, ''): # can't use direct iter! + parts = line.split() + if len(parts)==2: + kind,length = parts + data = f.read(int(length)) + if kind=='K' and data=='svn:externals': + found = True + elif kind=='V' and found: + f.close() + break + else: + f.close() + return + + for line in data.splitlines(): + parts = line.split() + if parts: + yield joinpath(dirname, parts[0]) + + +entries_pattern = re.compile(r'name="([^"]+)"(?![^>]+deleted="true")', re.I) + +def entries_finder(dirname, filename): + f = open(filename,'rU') + data = f.read() + f.close() + if data.startswith('<?xml'): + for match in entries_pattern.finditer(data): + yield joinpath(dirname,unescape(match.group(1))) + else: + svnver=-1 + try: svnver = int(data.splitlines()[0]) + except: pass + if svnver<8: + log.warn("unrecognized .svn/entries format in %s", os.path.abspath(dirname)) + return + for record in map(str.splitlines, data.split('\n\x0c\n')[1:]): + # subversion 1.6/1.5/1.4 + if not record or len(record)>=6 and record[5]=="delete": + continue # skip deleted + yield joinpath(dirname, record[0]) + + +finders = [ + (convert_path('CVS/Entries'), + re_finder(re.compile(r"^\w?/([^/]+)/", re.M))), + (convert_path('.svn/entries'), entries_finder), + (convert_path('.svn/dir-props'), externals_finder), + (convert_path('.svn/dir-prop-base'), externals_finder), # svn 1.4 +] + + + + + + + + + + + + +class sdist(_sdist): + """Smart sdist that finds anything supported by revision control""" + + user_options = [ + ('formats=', None, + "formats for source distribution (comma-separated list)"), + ('keep-temp', 'k', + "keep the distribution tree around after creating " + + "archive file(s)"), + ('dist-dir=', 'd', + "directory to put the source distribution archive(s) in " + "[default: dist]"), + ] + + negative_opt = {} + + def run(self): + self.run_command('egg_info') + ei_cmd = self.get_finalized_command('egg_info') + self.filelist = ei_cmd.filelist + self.filelist.append(os.path.join(ei_cmd.egg_info,'SOURCES.txt')) + self.check_readme() + + # Run sub commands + for cmd_name in self.get_sub_commands(): + self.run_command(cmd_name) + + # Call check_metadata only if no 'check' command + # (distutils <= 2.6) + import distutils.command + if 'check' not in distutils.command.__all__: + self.check_metadata() + + self.make_distribution() + + dist_files = getattr(self.distribution,'dist_files',[]) + for file in self.archive_files: + data = ('sdist', '', file) + if data not in dist_files: + dist_files.append(data) + + def __read_template_hack(self): + # This grody hack closes the template file (MANIFEST.in) if an + # exception occurs during read_template. + # Doing so prevents an error when easy_install attempts to delete the + # file. + try: + _sdist.read_template(self) + except: + sys.exc_info()[2].tb_next.tb_frame.f_locals['template'].close() + raise + # Beginning with Python 2.7.2, 3.1.4, and 3.2.1, this leaky file handle + # has been fixed, so only override the method if we're using an earlier + # Python. + if ( + sys.version_info < (2,7,2) + or (3,0) <= sys.version_info < (3,1,4) + or (3,2) <= sys.version_info < (3,2,1) + ): + read_template = __read_template_hack + + def add_defaults(self): + standards = [READMES, + self.distribution.script_name] + for fn in standards: + if isinstance(fn, tuple): + alts = fn + got_it = 0 + for fn in alts: + if os.path.exists(fn): + got_it = 1 + self.filelist.append(fn) + break + + if not got_it: + self.warn("standard file not found: should have one of " + + ', '.join(alts)) + else: + if os.path.exists(fn): + self.filelist.append(fn) + else: + self.warn("standard file '%s' not found" % fn) + + optional = ['test/test*.py', 'setup.cfg'] + for pattern in optional: + files = list(filter(os.path.isfile, glob(pattern))) + if files: + self.filelist.extend(files) + + # getting python files + if self.distribution.has_pure_modules(): + build_py = self.get_finalized_command('build_py') + self.filelist.extend(build_py.get_source_files()) + # This functionality is incompatible with include_package_data, and + # will in fact create an infinite recursion if include_package_data + # is True. Use of include_package_data will imply that + # distutils-style automatic handling of package_data is disabled + if not self.distribution.include_package_data: + for _, src_dir, _, filenames in build_py.data_files: + self.filelist.extend([os.path.join(src_dir, filename) + for filename in filenames]) + + if self.distribution.has_ext_modules(): + build_ext = self.get_finalized_command('build_ext') + self.filelist.extend(build_ext.get_source_files()) + + if self.distribution.has_c_libraries(): + build_clib = self.get_finalized_command('build_clib') + self.filelist.extend(build_clib.get_source_files()) + + if self.distribution.has_scripts(): + build_scripts = self.get_finalized_command('build_scripts') + self.filelist.extend(build_scripts.get_source_files()) + + def check_readme(self): + for f in READMES: + if os.path.exists(f): + return + else: + self.warn( + "standard file not found: should have one of " +', '.join(READMES) + ) + + + def make_release_tree(self, base_dir, files): + _sdist.make_release_tree(self, base_dir, files) + + # Save any egg_info command line options used to create this sdist + dest = os.path.join(base_dir, 'setup.cfg') + if hasattr(os,'link') and os.path.exists(dest): + # unlink and re-copy, since it might be hard-linked, and + # we don't want to change the source version + os.unlink(dest) + self.copy_file('setup.cfg', dest) + + self.get_finalized_command('egg_info').save_version_info(dest) + + def _manifest_is_not_generated(self): + # check for special comment used in 2.7.1 and higher + if not os.path.isfile(self.manifest): + return False + + fp = open(self.manifest, 'rbU') + try: + first_line = fp.readline() + finally: + fp.close() + return first_line != '# file GENERATED by distutils, do NOT edit\n'.encode() + + def read_manifest(self): + """Read the manifest file (named by 'self.manifest') and use it to + fill in 'self.filelist', the list of files to include in the source + distribution. + """ + log.info("reading manifest file '%s'", self.manifest) + manifest = open(self.manifest, 'rbU') + for line in manifest: + # The manifest must contain UTF-8. See #303. + if sys.version_info >= (3,): + try: + line = line.decode('UTF-8') + except UnicodeDecodeError: + log.warn("%r not UTF-8 decodable -- skipping" % line) + continue + # ignore comments and blank lines + line = line.strip() + if line.startswith('#') or not line: + continue + self.filelist.append(line) + manifest.close() + + + + + + +# diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/sdist.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/sdist.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c87bb863a93127ce3fa460ca3a2a502777f33d6c GIT binary patch literal 10827 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 VHCa15SE`+^InN;wnQ`Wh{TC20m1+P0 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/setopt.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/setopt.py new file mode 100644 index 0000000000..aa468c88fe --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/setopt.py @@ -0,0 +1,164 @@ +import distutils, os +from setuptools import Command +from distutils.util import convert_path +from distutils import log +from distutils.errors import * + +__all__ = ['config_file', 'edit_config', 'option_base', 'setopt'] + + +def config_file(kind="local"): + """Get the filename of the distutils, local, global, or per-user config + + `kind` must be one of "local", "global", or "user" + """ + if kind=='local': + return 'setup.cfg' + if kind=='global': + return os.path.join( + os.path.dirname(distutils.__file__),'distutils.cfg' + ) + if kind=='user': + dot = os.name=='posix' and '.' or '' + return os.path.expanduser(convert_path("~/%spydistutils.cfg" % dot)) + raise ValueError( + "config_file() type must be 'local', 'global', or 'user'", kind + ) + + + + + + + + + + + + + + + +def edit_config(filename, settings, dry_run=False): + """Edit a configuration file to include `settings` + + `settings` is a dictionary of dictionaries or ``None`` values, keyed by + command/section name. A ``None`` value means to delete the entire section, + while a dictionary lists settings to be changed or deleted in that section. + A setting of ``None`` means to delete that setting. + """ + from setuptools.compat import ConfigParser + log.debug("Reading configuration from %s", filename) + opts = ConfigParser.RawConfigParser() + opts.read([filename]) + for section, options in settings.items(): + if options is None: + log.info("Deleting section [%s] from %s", section, filename) + opts.remove_section(section) + else: + if not opts.has_section(section): + log.debug("Adding new section [%s] to %s", section, filename) + opts.add_section(section) + for option,value in options.items(): + if value is None: + log.debug("Deleting %s.%s from %s", + section, option, filename + ) + opts.remove_option(section,option) + if not opts.options(section): + log.info("Deleting empty [%s] section from %s", + section, filename) + opts.remove_section(section) + else: + log.debug( + "Setting %s.%s to %r in %s", + section, option, value, filename + ) + opts.set(section,option,value) + + log.info("Writing %s", filename) + if not dry_run: + f = open(filename,'w'); opts.write(f); f.close() + +class option_base(Command): + """Abstract base class for commands that mess with config files""" + + user_options = [ + ('global-config', 'g', + "save options to the site-wide distutils.cfg file"), + ('user-config', 'u', + "save options to the current user's pydistutils.cfg file"), + ('filename=', 'f', + "configuration file to use (default=setup.cfg)"), + ] + + boolean_options = [ + 'global-config', 'user-config', + ] + + def initialize_options(self): + self.global_config = None + self.user_config = None + self.filename = None + + def finalize_options(self): + filenames = [] + if self.global_config: + filenames.append(config_file('global')) + if self.user_config: + filenames.append(config_file('user')) + if self.filename is not None: + filenames.append(self.filename) + if not filenames: + filenames.append(config_file('local')) + if len(filenames)>1: + raise DistutilsOptionError( + "Must specify only one configuration file option", + filenames + ) + self.filename, = filenames + + + + +class setopt(option_base): + """Save command-line options to a file""" + + description = "set an option in setup.cfg or another config file" + + user_options = [ + ('command=', 'c', 'command to set an option for'), + ('option=', 'o', 'option to set'), + ('set-value=', 's', 'value of the option'), + ('remove', 'r', 'remove (unset) the value'), + ] + option_base.user_options + + boolean_options = option_base.boolean_options + ['remove'] + + def initialize_options(self): + option_base.initialize_options(self) + self.command = None + self.option = None + self.set_value = None + self.remove = None + + def finalize_options(self): + option_base.finalize_options(self) + if self.command is None or self.option is None: + raise DistutilsOptionError("Must specify --command *and* --option") + if self.set_value is None and not self.remove: + raise DistutilsOptionError("Must specify --set-value or --remove") + + def run(self): + edit_config( + self.filename, { + self.command: {self.option.replace('-','_'):self.set_value} + }, + self.dry_run + ) + + + + + + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/setopt.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/setopt.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0610541abad37022018f9124c6287cae4d281f5 GIT binary patch literal 6440 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 Tui;Y5zopWJa>H$0zjXb-T%9ya literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/test.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/test.py new file mode 100644 index 0000000000..db2fc7b140 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/test.py @@ -0,0 +1,198 @@ +from setuptools import Command +from distutils.errors import DistutilsOptionError +import sys +from pkg_resources import * +from pkg_resources import _namespace_packages +from unittest import TestLoader, main + +class ScanningLoader(TestLoader): + + def loadTestsFromModule(self, module): + """Return a suite of all tests cases contained in the given module + + If the module is a package, load tests from all the modules in it. + If the module has an ``additional_tests`` function, call it and add + the return value to the tests. + """ + tests = [] + if module.__name__!='setuptools.tests.doctest': # ugh + tests.append(TestLoader.loadTestsFromModule(self,module)) + + if hasattr(module, "additional_tests"): + tests.append(module.additional_tests()) + + if hasattr(module, '__path__'): + for file in resource_listdir(module.__name__, ''): + if file.endswith('.py') and file!='__init__.py': + submodule = module.__name__+'.'+file[:-3] + else: + if resource_exists( + module.__name__, file+'/__init__.py' + ): + submodule = module.__name__+'.'+file + else: + continue + tests.append(self.loadTestsFromName(submodule)) + + if len(tests)!=1: + return self.suiteClass(tests) + else: + return tests[0] # don't create a nested suite for only one return + + +class test(Command): + + """Command to run unit tests after in-place build""" + + description = "run unit tests after in-place build" + + user_options = [ + ('test-module=','m', "Run 'test_suite' in specified module"), + ('test-suite=','s', + "Test suite to run (e.g. 'some_module.test_suite')"), + ] + + def initialize_options(self): + self.test_suite = None + self.test_module = None + self.test_loader = None + + + def finalize_options(self): + + if self.test_suite is None: + if self.test_module is None: + self.test_suite = self.distribution.test_suite + else: + self.test_suite = self.test_module+".test_suite" + elif self.test_module: + raise DistutilsOptionError( + "You may specify a module or a suite, but not both" + ) + + self.test_args = [self.test_suite] + + if self.verbose: + self.test_args.insert(0,'--verbose') + if self.test_loader is None: + self.test_loader = getattr(self.distribution,'test_loader',None) + if self.test_loader is None: + self.test_loader = "setuptools.command.test:ScanningLoader" + + + + def with_project_on_sys_path(self, func): + if sys.version_info >= (3,) and getattr(self.distribution, 'use_2to3', False): + # If we run 2to3 we can not do this inplace: + + # Ensure metadata is up-to-date + self.reinitialize_command('build_py', inplace=0) + self.run_command('build_py') + bpy_cmd = self.get_finalized_command("build_py") + build_path = normalize_path(bpy_cmd.build_lib) + + # Build extensions + self.reinitialize_command('egg_info', egg_base=build_path) + self.run_command('egg_info') + + self.reinitialize_command('build_ext', inplace=0) + self.run_command('build_ext') + else: + # Without 2to3 inplace works fine: + self.run_command('egg_info') + + # Build extensions in-place + self.reinitialize_command('build_ext', inplace=1) + self.run_command('build_ext') + + ei_cmd = self.get_finalized_command("egg_info") + + old_path = sys.path[:] + old_modules = sys.modules.copy() + + try: + sys.path.insert(0, normalize_path(ei_cmd.egg_base)) + working_set.__init__() + add_activation_listener(lambda dist: dist.activate()) + require('%s==%s' % (ei_cmd.egg_name, ei_cmd.egg_version)) + func() + finally: + sys.path[:] = old_path + sys.modules.clear() + sys.modules.update(old_modules) + working_set.__init__() + + + def run(self): + if self.distribution.install_requires: + self.distribution.fetch_build_eggs(self.distribution.install_requires) + if self.distribution.tests_require: + self.distribution.fetch_build_eggs(self.distribution.tests_require) + + if self.test_suite: + cmd = ' '.join(self.test_args) + if self.dry_run: + self.announce('skipping "unittest %s" (dry run)' % cmd) + else: + self.announce('running "unittest %s"' % cmd) + self.with_project_on_sys_path(self.run_tests) + + + def run_tests(self): + import unittest + + # Purge modules under test from sys.modules. The test loader will + # re-import them from the build location. Required when 2to3 is used + # with namespace packages. + if sys.version_info >= (3,) and getattr(self.distribution, 'use_2to3', False): + module = self.test_args[-1].split('.')[0] + if module in _namespace_packages: + del_modules = [] + if module in sys.modules: + del_modules.append(module) + module += '.' + for name in sys.modules: + if name.startswith(module): + del_modules.append(name) + list(map(sys.modules.__delitem__, del_modules)) + + loader_ep = EntryPoint.parse("x="+self.test_loader) + loader_class = loader_ep.load(require=False) + cks = loader_class() + unittest.main( + None, None, [unittest.__file__]+self.test_args, + testLoader = cks + ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/test.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/test.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8aeda1e6e407efdc448d118197042362c2c6563a GIT binary patch literal 6289 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload.py new file mode 100644 index 0000000000..02d955eda6 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload.py @@ -0,0 +1,184 @@ +"""distutils.command.upload + +Implements the Distutils 'upload' subcommand (upload package to PyPI).""" + +from distutils.errors import * +from distutils.core import Command +from distutils.spawn import spawn +from distutils import log +try: + from hashlib import md5 +except ImportError: + from md5 import md5 +import os +import sys +import socket +import platform +import base64 + +from setuptools.compat import urlparse, StringIO, httplib, ConfigParser + +class upload(Command): + + description = "upload binary package to PyPI" + + DEFAULT_REPOSITORY = 'https://pypi.python.org/pypi' + + user_options = [ + ('repository=', 'r', + "url of repository [default: %s]" % DEFAULT_REPOSITORY), + ('show-response', None, + 'display full response text from server'), + ('sign', 's', + 'sign files to upload using gpg'), + ('identity=', 'i', 'GPG identity used to sign files'), + ] + boolean_options = ['show-response', 'sign'] + + def initialize_options(self): + self.username = '' + self.password = '' + self.repository = '' + self.show_response = 0 + self.sign = False + self.identity = None + + def finalize_options(self): + if self.identity and not self.sign: + raise DistutilsOptionError( + "Must use --sign for --identity to have meaning" + ) + if 'HOME' in os.environ: + rc = os.path.join(os.environ['HOME'], '.pypirc') + if os.path.exists(rc): + self.announce('Using PyPI login from %s' % rc) + config = ConfigParser.ConfigParser({ + 'username':'', + 'password':'', + 'repository':''}) + config.read(rc) + if not self.repository: + self.repository = config.get('server-login', 'repository') + if not self.username: + self.username = config.get('server-login', 'username') + if not self.password: + self.password = config.get('server-login', 'password') + if not self.repository: + self.repository = self.DEFAULT_REPOSITORY + + def run(self): + if not self.distribution.dist_files: + raise DistutilsOptionError("No dist file created in earlier command") + for command, pyversion, filename in self.distribution.dist_files: + self.upload_file(command, pyversion, filename) + + def upload_file(self, command, pyversion, filename): + # Sign if requested + if self.sign: + gpg_args = ["gpg", "--detach-sign", "-a", filename] + if self.identity: + gpg_args[2:2] = ["--local-user", self.identity] + spawn(gpg_args, + dry_run=self.dry_run) + + # Fill in the data + f = open(filename,'rb') + content = f.read() + f.close() + basename = os.path.basename(filename) + comment = '' + if command=='bdist_egg' and self.distribution.has_ext_modules(): + comment = "built on %s" % platform.platform(terse=1) + data = { + ':action':'file_upload', + 'protocol_version':'1', + 'name':self.distribution.get_name(), + 'version':self.distribution.get_version(), + 'content':(basename,content), + 'filetype':command, + 'pyversion':pyversion, + 'md5_digest':md5(content).hexdigest(), + } + if command == 'bdist_rpm': + dist, version, id = platform.dist() + if dist: + comment = 'built for %s %s' % (dist, version) + elif command == 'bdist_dumb': + comment = 'built for %s' % platform.platform(terse=1) + data['comment'] = comment + + if self.sign: + asc_file = open(filename + ".asc") + data['gpg_signature'] = (os.path.basename(filename) + ".asc", asc_file.read()) + asc_file.close() + + # set up the authentication + auth = "Basic " + base64.encodestring(self.username + ":" + self.password).strip() + + # Build up the MIME payload for the POST data + boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' + sep_boundary = '\n--' + boundary + end_boundary = sep_boundary + '--' + body = StringIO.StringIO() + for key, value in data.items(): + # handle multiple entries for the same name + if type(value) != type([]): + value = [value] + for value in value: + if type(value) is tuple: + fn = ';filename="%s"' % value[0] + value = value[1] + else: + fn = "" + value = str(value) + body.write(sep_boundary) + body.write('\nContent-Disposition: form-data; name="%s"'%key) + body.write(fn) + body.write("\n\n") + body.write(value) + if value and value[-1] == '\r': + body.write('\n') # write an extra newline (lurve Macs) + body.write(end_boundary) + body.write("\n") + body = body.getvalue() + + self.announce("Submitting %s to %s" % (filename, self.repository), log.INFO) + + # build the Request + # We can't use urllib2 since we need to send the Basic + # auth right with the first request + schema, netloc, url, params, query, fragments = \ + urlparse(self.repository) + assert not params and not query and not fragments + if schema == 'http': + http = httplib.HTTPConnection(netloc) + elif schema == 'https': + http = httplib.HTTPSConnection(netloc) + else: + raise AssertionError("unsupported schema " + schema) + + data = '' + loglevel = log.INFO + try: + http.connect() + http.putrequest("POST", url) + http.putheader('Content-type', + 'multipart/form-data; boundary=%s'%boundary) + http.putheader('Content-length', str(len(body))) + http.putheader('Authorization', auth) + http.endheaders() + http.send(body) + except socket.error: + e = sys.exc_info()[1] + self.announce(str(e), log.ERROR) + return + + r = http.getresponse() + if r.status == 200: + self.announce('Server response (%s): %s' % (r.status, r.reason), + log.INFO) + else: + self.announce('Upload failed (%s): %s' % (r.status, r.reason), + log.ERROR) + if self.show_response: + print('-'*75, r.read(), '-'*75) diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5bac6121c92fafcd2e430d2587840ea4c5a509c GIT binary patch literal 6669 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload_docs.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload_docs.py new file mode 100644 index 0000000000..12bc916bb1 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload_docs.py @@ -0,0 +1,203 @@ +# -*- coding: utf-8 -*- +"""upload_docs + +Implements a Distutils 'upload_docs' subcommand (upload documentation to +PyPI's pythonhosted.org). +""" + +import os +import socket +import zipfile +import tempfile +import sys +import shutil + +from base64 import standard_b64encode +from pkg_resources import iter_entry_points + +from distutils import log +from distutils.errors import DistutilsOptionError + +try: + from distutils.command.upload import upload +except ImportError: + from setuptools.command.upload import upload + +from setuptools.compat import httplib, urlparse, unicode, iteritems + +_IS_PYTHON3 = sys.version > '3' + +if _IS_PYTHON3: + errors = 'surrogateescape' +else: + errors = 'strict' + + +# This is not just a replacement for byte literals +# but works as a general purpose encoder +def b(s, encoding='utf-8'): + if isinstance(s, unicode): + return s.encode(encoding, errors) + return s + + +class upload_docs(upload): + + description = 'Upload documentation to PyPI' + + user_options = [ + ('repository=', 'r', + "url of repository [default: %s]" % upload.DEFAULT_REPOSITORY), + ('show-response', None, + 'display full response text from server'), + ('upload-dir=', None, 'directory to upload'), + ] + boolean_options = upload.boolean_options + + def has_sphinx(self): + if self.upload_dir is None: + for ep in iter_entry_points('distutils.commands', 'build_sphinx'): + return True + + sub_commands = [('build_sphinx', has_sphinx)] + + def initialize_options(self): + upload.initialize_options(self) + self.upload_dir = None + self.target_dir = None + + def finalize_options(self): + upload.finalize_options(self) + if self.upload_dir is None: + if self.has_sphinx(): + build_sphinx = self.get_finalized_command('build_sphinx') + self.target_dir = build_sphinx.builder_target_dir + else: + build = self.get_finalized_command('build') + self.target_dir = os.path.join(build.build_base, 'docs') + else: + self.ensure_dirname('upload_dir') + self.target_dir = self.upload_dir + self.announce('Using upload directory %s' % self.target_dir) + + def create_zipfile(self, filename): + zip_file = zipfile.ZipFile(filename, "w") + try: + self.mkpath(self.target_dir) # just in case + for root, dirs, files in os.walk(self.target_dir): + if root == self.target_dir and not files: + raise DistutilsOptionError( + "no files found in upload directory '%s'" + % self.target_dir) + for name in files: + full = os.path.join(root, name) + relative = root[len(self.target_dir):].lstrip(os.path.sep) + dest = os.path.join(relative, name) + zip_file.write(full, dest) + finally: + zip_file.close() + + def run(self): + # Run sub commands + for cmd_name in self.get_sub_commands(): + self.run_command(cmd_name) + + tmp_dir = tempfile.mkdtemp() + name = self.distribution.metadata.get_name() + zip_file = os.path.join(tmp_dir, "%s.zip" % name) + try: + self.create_zipfile(zip_file) + self.upload_file(zip_file) + finally: + shutil.rmtree(tmp_dir) + + def upload_file(self, filename): + f = open(filename, 'rb') + content = f.read() + f.close() + meta = self.distribution.metadata + data = { + ':action': 'doc_upload', + 'name': meta.get_name(), + 'content': (os.path.basename(filename), content), + } + # set up the authentication + credentials = b(self.username + ':' + self.password) + credentials = standard_b64encode(credentials) + if sys.version_info >= (3,): + credentials = credentials.decode('ascii') + auth = "Basic " + credentials + + # Build up the MIME payload for the POST data + boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' + sep_boundary = b('\n--') + b(boundary) + end_boundary = sep_boundary + b('--') + body = [] + for key, values in iteritems(data): + title = '\nContent-Disposition: form-data; name="%s"' % key + # handle multiple entries for the same name + if type(values) != type([]): + values = [values] + for value in values: + if type(value) is tuple: + title += '; filename="%s"' % value[0] + value = value[1] + else: + value = b(value) + body.append(sep_boundary) + body.append(b(title)) + body.append(b("\n\n")) + body.append(value) + if value and value[-1:] == b('\r'): + body.append(b('\n')) # write an extra newline (lurve Macs) + body.append(end_boundary) + body.append(b("\n")) + body = b('').join(body) + + self.announce("Submitting documentation to %s" % (self.repository), + log.INFO) + + # build the Request + # We can't use urllib2 since we need to send the Basic + # auth right with the first request + schema, netloc, url, params, query, fragments = \ + urlparse(self.repository) + assert not params and not query and not fragments + if schema == 'http': + conn = httplib.HTTPConnection(netloc) + elif schema == 'https': + conn = httplib.HTTPSConnection(netloc) + else: + raise AssertionError("unsupported schema "+schema) + + data = '' + loglevel = log.INFO + try: + conn.connect() + conn.putrequest("POST", url) + conn.putheader('Content-type', + 'multipart/form-data; boundary=%s'%boundary) + conn.putheader('Content-length', str(len(body))) + conn.putheader('Authorization', auth) + conn.endheaders() + conn.send(body) + except socket.error: + e = sys.exc_info()[1] + self.announce(str(e), log.ERROR) + return + + r = conn.getresponse() + if r.status == 200: + self.announce('Server response (%s): %s' % (r.status, r.reason), + log.INFO) + elif r.status == 301: + location = r.getheader('Location') + if location is None: + location = 'https://pythonhosted.org/%s/' % meta.get_name() + self.announce('Upload successful. Visit %s' % location, + log.INFO) + else: + self.announce('Upload failed (%s): %s' % (r.status, r.reason), + log.ERROR) + if self.show_response: + print('-'*75, r.read(), '-'*75) diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload_docs.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload_docs.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7688fe85ab72bb3c900bf630069fd06e65104a61 GIT binary patch literal 7529 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/compat.py b/PythonEnv/2.7/Lib/site-packages/setuptools/compat.py new file mode 100644 index 0000000000..3a961c0e3e --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/compat.py @@ -0,0 +1,97 @@ +import sys +import itertools + +if sys.version_info[0] < 3: + PY3 = False + + basestring = basestring + import __builtin__ as builtins + import ConfigParser + from StringIO import StringIO + BytesIO = StringIO + execfile = execfile + func_code = lambda o: o.func_code + func_globals = lambda o: o.func_globals + im_func = lambda o: o.im_func + from htmlentitydefs import name2codepoint + import httplib + from BaseHTTPServer import HTTPServer + from SimpleHTTPServer import SimpleHTTPRequestHandler + from BaseHTTPServer import BaseHTTPRequestHandler + iteritems = lambda o: o.iteritems() + long_type = long + maxsize = sys.maxint + next = lambda o: o.next() + numeric_types = (int, long, float) + reduce = reduce + unichr = unichr + unicode = unicode + from urllib import url2pathname + import urllib2 + from urllib2 import urlopen, HTTPError, URLError, unquote, splituser + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit + xrange = xrange + filterfalse = itertools.ifilterfalse + + def exec_(code, globs=None, locs=None): + if globs is None: + frame = sys._getframe(1) + globs = frame.f_globals + if locs is None: + locs = frame.f_locals + del frame + elif locs is None: + locs = globs + exec("""exec code in globs, locs""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb""") +else: + PY3 = True + + basestring = str + import builtins + import configparser as ConfigParser + exec_ = eval('exec') + from io import StringIO, BytesIO + func_code = lambda o: o.__code__ + func_globals = lambda o: o.__globals__ + im_func = lambda o: o.__func__ + from html.entities import name2codepoint + import http.client as httplib + from http.server import HTTPServer, SimpleHTTPRequestHandler + from http.server import BaseHTTPRequestHandler + iteritems = lambda o: o.items() + long_type = int + maxsize = sys.maxsize + next = next + numeric_types = (int, float) + from functools import reduce + unichr = chr + unicode = str + from urllib.error import HTTPError, URLError + import urllib.request as urllib2 + from urllib.request import urlopen, url2pathname + from urllib.parse import ( + urlparse, urlunparse, unquote, splituser, urljoin, urlsplit, + urlunsplit, + ) + xrange = range + filterfalse = itertools.filterfalse + + def execfile(fn, globs=None, locs=None): + if globs is None: + globs = globals() + if locs is None: + locs = globs + f = open(fn) + try: + source = f.read() + finally: + f.close() + exec_(compile(source, fn, 'exec'), globs, locs) + + def reraise(tp, value, tb=None): + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/compat.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/compat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb0f2a024d2141764f19f37ab07413966c505f3e GIT binary patch literal 5090 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/depends.py b/PythonEnv/2.7/Lib/site-packages/setuptools/depends.py new file mode 100644 index 0000000000..8b9d1217b1 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/depends.py @@ -0,0 +1,246 @@ +from __future__ import generators +import sys, imp, marshal +from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN +from distutils.version import StrictVersion, LooseVersion + +__all__ = [ + 'Require', 'find_module', 'get_module_constant', 'extract_constant' +] + +class Require: + """A prerequisite to building or installing a distribution""" + + def __init__(self,name,requested_version,module,homepage='', + attribute=None,format=None + ): + + if format is None and requested_version is not None: + format = StrictVersion + + if format is not None: + requested_version = format(requested_version) + if attribute is None: + attribute = '__version__' + + self.__dict__.update(locals()) + del self.self + + + def full_name(self): + """Return full package/distribution name, w/version""" + if self.requested_version is not None: + return '%s-%s' % (self.name,self.requested_version) + return self.name + + + def version_ok(self,version): + """Is 'version' sufficiently up-to-date?""" + return self.attribute is None or self.format is None or \ + str(version) != "unknown" and version >= self.requested_version + + + def get_version(self, paths=None, default="unknown"): + + """Get version number of installed module, 'None', or 'default' + + Search 'paths' for module. If not found, return 'None'. If found, + return the extracted version attribute, or 'default' if no version + attribute was specified, or the value cannot be determined without + importing the module. The version is formatted according to the + requirement's version format (if any), unless it is 'None' or the + supplied 'default'. + """ + + if self.attribute is None: + try: + f,p,i = find_module(self.module,paths) + if f: f.close() + return default + except ImportError: + return None + + v = get_module_constant(self.module,self.attribute,default,paths) + + if v is not None and v is not default and self.format is not None: + return self.format(v) + + return v + + + def is_present(self,paths=None): + """Return true if dependency is present on 'paths'""" + return self.get_version(paths) is not None + + + def is_current(self,paths=None): + """Return true if dependency is present and up-to-date on 'paths'""" + version = self.get_version(paths) + if version is None: + return False + return self.version_ok(version) + + +def _iter_code(code): + + """Yield '(op,arg)' pair for each operation in code object 'code'""" + + from array import array + from dis import HAVE_ARGUMENT, EXTENDED_ARG + + bytes = array('b',code.co_code) + eof = len(code.co_code) + + ptr = 0 + extended_arg = 0 + + while ptr<eof: + + op = bytes[ptr] + + if op>=HAVE_ARGUMENT: + + arg = bytes[ptr+1] + bytes[ptr+2]*256 + extended_arg + ptr += 3 + + if op==EXTENDED_ARG: + extended_arg = arg * long_type(65536) + continue + + else: + arg = None + ptr += 1 + + yield op,arg + + + + + + + + + + +def find_module(module, paths=None): + """Just like 'imp.find_module()', but with package support""" + + parts = module.split('.') + + while parts: + part = parts.pop(0) + f, path, (suffix,mode,kind) = info = imp.find_module(part, paths) + + if kind==PKG_DIRECTORY: + parts = parts or ['__init__'] + paths = [path] + + elif parts: + raise ImportError("Can't find %r in %s" % (parts,module)) + + return info + + + + + + + + + + + + + + + + + + + + + + + + +def get_module_constant(module, symbol, default=-1, paths=None): + + """Find 'module' by searching 'paths', and extract 'symbol' + + Return 'None' if 'module' does not exist on 'paths', or it does not define + 'symbol'. If the module defines 'symbol' as a constant, return the + constant. Otherwise, return 'default'.""" + + try: + f, path, (suffix,mode,kind) = find_module(module,paths) + except ImportError: + # Module doesn't exist + return None + + try: + if kind==PY_COMPILED: + f.read(8) # skip magic & date + code = marshal.load(f) + elif kind==PY_FROZEN: + code = imp.get_frozen_object(module) + elif kind==PY_SOURCE: + code = compile(f.read(), path, 'exec') + else: + # Not something we can parse; we'll have to import it. :( + if module not in sys.modules: + imp.load_module(module,f,path,(suffix,mode,kind)) + return getattr(sys.modules[module],symbol,None) + + finally: + if f: + f.close() + + return extract_constant(code,symbol,default) + + + + + + + + +def extract_constant(code,symbol,default=-1): + """Extract the constant value of 'symbol' from 'code' + + If the name 'symbol' is bound to a constant value by the Python code + object 'code', return that value. If 'symbol' is bound to an expression, + return 'default'. Otherwise, return 'None'. + + Return value is based on the first assignment to 'symbol'. 'symbol' must + be a global, or at least a non-"fast" local in the code block. That is, + only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol' + must be present in 'code.co_names'. + """ + + if symbol not in code.co_names: + # name's not there, can't possibly be an assigment + return None + + name_idx = list(code.co_names).index(symbol) + + STORE_NAME = 90 + STORE_GLOBAL = 97 + LOAD_CONST = 100 + + const = default + + for op, arg in _iter_code(code): + + if op==LOAD_CONST: + const = code.co_consts[arg] + elif arg==name_idx and (op==STORE_NAME or op==STORE_GLOBAL): + return const + else: + const = default + +if sys.platform.startswith('java') or sys.platform == 'cli': + # XXX it'd be better to test assertions about bytecode instead... + del extract_constant, get_module_constant + __all__.remove('extract_constant') + __all__.remove('get_module_constant') + + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/depends.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/depends.pyc new file mode 100644 index 0000000000000000000000000000000000000000..188b412150548d144d57dd236b6c8be0f6cf1b52 GIT binary patch literal 7233 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 J*CFvm=fCLVxIF*> literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/dist.py b/PythonEnv/2.7/Lib/site-packages/setuptools/dist.py new file mode 100644 index 0000000000..0188921540 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/dist.py @@ -0,0 +1,892 @@ +__all__ = ['Distribution'] + +import re +import sys +from distutils.core import Distribution as _Distribution +from setuptools.depends import Require +from setuptools.command.install import install +from setuptools.command.sdist import sdist +from setuptools.command.install_lib import install_lib +from setuptools.compat import numeric_types, basestring +from distutils.errors import DistutilsOptionError, DistutilsPlatformError +from distutils.errors import DistutilsSetupError +import setuptools, pkg_resources, distutils.core, distutils.dist, distutils.cmd +import os, distutils.log + +def _get_unpatched(cls): + """Protect against re-patching the distutils if reloaded + + Also ensures that no other distutils extension monkeypatched the distutils + first. + """ + while cls.__module__.startswith('setuptools'): + cls, = cls.__bases__ + if not cls.__module__.startswith('distutils'): + raise AssertionError( + "distutils has already been patched by %r" % cls + ) + return cls + +_Distribution = _get_unpatched(_Distribution) + +sequence = tuple, list + +def check_importable(dist, attr, value): + try: + ep = pkg_resources.EntryPoint.parse('x='+value) + assert not ep.extras + except (TypeError,ValueError,AttributeError,AssertionError): + raise DistutilsSetupError( + "%r must be importable 'module:attrs' string (got %r)" + % (attr,value) + ) + + +def assert_string_list(dist, attr, value): + """Verify that value is a string list or None""" + try: + assert ''.join(value)!=value + except (TypeError,ValueError,AttributeError,AssertionError): + raise DistutilsSetupError( + "%r must be a list of strings (got %r)" % (attr,value) + ) +def check_nsp(dist, attr, value): + """Verify that namespace packages are valid""" + assert_string_list(dist,attr,value) + for nsp in value: + if not dist.has_contents_for(nsp): + raise DistutilsSetupError( + "Distribution contains no modules or packages for " + + "namespace package %r" % nsp + ) + if '.' in nsp: + parent = '.'.join(nsp.split('.')[:-1]) + if parent not in value: + distutils.log.warn( + "WARNING: %r is declared as a package namespace, but %r" + " is not: please correct this in setup.py", nsp, parent + ) + +def check_extras(dist, attr, value): + """Verify that extras_require mapping is valid""" + try: + for k,v in value.items(): + if ':' in k: + k,m = k.split(':',1) + if pkg_resources.invalid_marker(m): + raise DistutilsSetupError("Invalid environment marker: "+m) + list(pkg_resources.parse_requirements(v)) + except (TypeError,ValueError,AttributeError): + raise DistutilsSetupError( + "'extras_require' must be a dictionary whose values are " + "strings or lists of strings containing valid project/version " + "requirement specifiers." + ) + +def assert_bool(dist, attr, value): + """Verify that value is True, False, 0, or 1""" + if bool(value) != value: + raise DistutilsSetupError( + "%r must be a boolean value (got %r)" % (attr,value) + ) +def check_requirements(dist, attr, value): + """Verify that install_requires is a valid requirements list""" + try: + list(pkg_resources.parse_requirements(value)) + except (TypeError,ValueError): + raise DistutilsSetupError( + "%r must be a string or list of strings " + "containing valid project/version requirement specifiers" % (attr,) + ) +def check_entry_points(dist, attr, value): + """Verify that entry_points map is parseable""" + try: + pkg_resources.EntryPoint.parse_map(value) + except ValueError: + e = sys.exc_info()[1] + raise DistutilsSetupError(e) + +def check_test_suite(dist, attr, value): + if not isinstance(value,basestring): + raise DistutilsSetupError("test_suite must be a string") + +def check_package_data(dist, attr, value): + """Verify that value is a dictionary of package names to glob lists""" + if isinstance(value,dict): + for k,v in value.items(): + if not isinstance(k,str): break + try: iter(v) + except TypeError: + break + else: + return + raise DistutilsSetupError( + attr+" must be a dictionary mapping package names to lists of " + "wildcard patterns" + ) + +def check_packages(dist, attr, value): + for pkgname in value: + if not re.match(r'\w+(\.\w+)*', pkgname): + distutils.log.warn( + "WARNING: %r not a valid package name; please use only" + ".-separated package names in setup.py", pkgname + ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +class Distribution(_Distribution): + """Distribution with support for features, tests, and package data + + This is an enhanced version of 'distutils.dist.Distribution' that + effectively adds the following new optional keyword arguments to 'setup()': + + 'install_requires' -- a string or sequence of strings specifying project + versions that the distribution requires when installed, in the format + used by 'pkg_resources.require()'. They will be installed + automatically when the package is installed. If you wish to use + packages that are not available in PyPI, or want to give your users an + alternate download location, you can add a 'find_links' option to the + '[easy_install]' section of your project's 'setup.cfg' file, and then + setuptools will scan the listed web pages for links that satisfy the + requirements. + + 'extras_require' -- a dictionary mapping names of optional "extras" to the + additional requirement(s) that using those extras incurs. For example, + this:: + + extras_require = dict(reST = ["docutils>=0.3", "reSTedit"]) + + indicates that the distribution can optionally provide an extra + capability called "reST", but it can only be used if docutils and + reSTedit are installed. If the user installs your package using + EasyInstall and requests one of your extras, the corresponding + additional requirements will be installed if needed. + + 'features' -- a dictionary mapping option names to 'setuptools.Feature' + objects. Features are a portion of the distribution that can be + included or excluded based on user options, inter-feature dependencies, + and availability on the current system. Excluded features are omitted + from all setup commands, including source and binary distributions, so + you can create multiple distributions from the same source tree. + Feature names should be valid Python identifiers, except that they may + contain the '-' (minus) sign. Features can be included or excluded + via the command line options '--with-X' and '--without-X', where 'X' is + the name of the feature. Whether a feature is included by default, and + whether you are allowed to control this from the command line, is + determined by the Feature object. See the 'Feature' class for more + information. + + 'test_suite' -- the name of a test suite to run for the 'test' command. + If the user runs 'python setup.py test', the package will be installed, + and the named test suite will be run. The format is the same as + would be used on a 'unittest.py' command line. That is, it is the + dotted name of an object to import and call to generate a test suite. + + 'package_data' -- a dictionary mapping package names to lists of filenames + or globs to use to find data files contained in the named packages. + If the dictionary has filenames or globs listed under '""' (the empty + string), those names will be searched for in every package, in addition + to any names for the specific package. Data files found using these + names/globs will be installed along with the package, in the same + location as the package. Note that globs are allowed to reference + the contents of non-package subdirectories, as long as you use '/' as + a path separator. (Globs are automatically converted to + platform-specific paths at runtime.) + + In addition to these new keywords, this class also has several new methods + for manipulating the distribution's contents. For example, the 'include()' + and 'exclude()' methods can be thought of as in-place add and subtract + commands that add or remove packages, modules, extensions, and so on from + the distribution. They are used by the feature subsystem to configure the + distribution for the included and excluded features. + """ + + _patched_dist = None + + def patch_missing_pkg_info(self, attrs): + # Fake up a replacement for the data that would normally come from + # PKG-INFO, but which might not yet be built if this is a fresh + # checkout. + # + if not attrs or 'name' not in attrs or 'version' not in attrs: + return + key = pkg_resources.safe_name(str(attrs['name'])).lower() + dist = pkg_resources.working_set.by_key.get(key) + if dist is not None and not dist.has_metadata('PKG-INFO'): + dist._version = pkg_resources.safe_version(str(attrs['version'])) + self._patched_dist = dist + + def __init__ (self, attrs=None): + have_package_data = hasattr(self, "package_data") + if not have_package_data: + self.package_data = {} + self.require_features = [] + self.features = {} + self.dist_files = [] + self.src_root = attrs and attrs.pop("src_root", None) + self.patch_missing_pkg_info(attrs) + # Make sure we have any eggs needed to interpret 'attrs' + if attrs is not None: + self.dependency_links = attrs.pop('dependency_links', []) + assert_string_list(self,'dependency_links',self.dependency_links) + if attrs and 'setup_requires' in attrs: + self.fetch_build_eggs(attrs.pop('setup_requires')) + for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): + if not hasattr(self,ep.name): + setattr(self,ep.name,None) + _Distribution.__init__(self,attrs) + if isinstance(self.metadata.version, numeric_types): + # Some people apparently take "version number" too literally :) + self.metadata.version = str(self.metadata.version) + + def parse_command_line(self): + """Process features after parsing command line options""" + result = _Distribution.parse_command_line(self) + if self.features: + self._finalize_features() + return result + + def _feature_attrname(self,name): + """Convert feature name to corresponding option attribute name""" + return 'with_'+name.replace('-','_') + + def fetch_build_eggs(self, requires): + """Resolve pre-setup requirements""" + from pkg_resources import working_set, parse_requirements + for dist in working_set.resolve( + parse_requirements(requires), installer=self.fetch_build_egg + ): + working_set.add(dist) + + def finalize_options(self): + _Distribution.finalize_options(self) + if self.features: + self._set_global_opts_from_features() + + for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): + value = getattr(self,ep.name,None) + if value is not None: + ep.require(installer=self.fetch_build_egg) + ep.load()(self, ep.name, value) + if getattr(self, 'convert_2to3_doctests', None): + # XXX may convert to set here when we can rely on set being builtin + self.convert_2to3_doctests = [os.path.abspath(p) for p in self.convert_2to3_doctests] + else: + self.convert_2to3_doctests = [] + + def fetch_build_egg(self, req): + """Fetch an egg needed for building""" + + try: + cmd = self._egg_fetcher + cmd.package_index.to_scan = [] + except AttributeError: + from setuptools.command.easy_install import easy_install + dist = self.__class__({'script_args':['easy_install']}) + dist.parse_config_files() + opts = dist.get_option_dict('easy_install') + keep = ( + 'find_links', 'site_dirs', 'index_url', 'optimize', + 'site_dirs', 'allow_hosts' + ) + for key in opts.keys(): + if key not in keep: + del opts[key] # don't use any other settings + if self.dependency_links: + links = self.dependency_links[:] + if 'find_links' in opts: + links = opts['find_links'][1].split() + links + opts['find_links'] = ('setup', links) + cmd = easy_install( + dist, args=["x"], install_dir=os.curdir, exclude_scripts=True, + always_copy=False, build_directory=None, editable=False, + upgrade=False, multi_version=True, no_report=True, user=False + ) + cmd.ensure_finalized() + self._egg_fetcher = cmd + return cmd.easy_install(req) + + def _set_global_opts_from_features(self): + """Add --with-X/--without-X options based on optional features""" + + go = [] + no = self.negative_opt.copy() + + for name,feature in self.features.items(): + self._set_feature(name,None) + feature.validate(self) + + if feature.optional: + descr = feature.description + incdef = ' (default)' + excdef='' + if not feature.include_by_default(): + excdef, incdef = incdef, excdef + + go.append(('with-'+name, None, 'include '+descr+incdef)) + go.append(('without-'+name, None, 'exclude '+descr+excdef)) + no['without-'+name] = 'with-'+name + + self.global_options = self.feature_options = go + self.global_options + self.negative_opt = self.feature_negopt = no + + + + + + + + + + + + + + + + + + + def _finalize_features(self): + """Add/remove features and resolve dependencies between them""" + + # First, flag all the enabled items (and thus their dependencies) + for name,feature in self.features.items(): + enabled = self.feature_is_included(name) + if enabled or (enabled is None and feature.include_by_default()): + feature.include_in(self) + self._set_feature(name,1) + + # Then disable the rest, so that off-by-default features don't + # get flagged as errors when they're required by an enabled feature + for name,feature in self.features.items(): + if not self.feature_is_included(name): + feature.exclude_from(self) + self._set_feature(name,0) + + + def get_command_class(self, command): + """Pluggable version of get_command_class()""" + if command in self.cmdclass: + return self.cmdclass[command] + + for ep in pkg_resources.iter_entry_points('distutils.commands',command): + ep.require(installer=self.fetch_build_egg) + self.cmdclass[command] = cmdclass = ep.load() + return cmdclass + else: + return _Distribution.get_command_class(self, command) + + def print_commands(self): + for ep in pkg_resources.iter_entry_points('distutils.commands'): + if ep.name not in self.cmdclass: + cmdclass = ep.load(False) # don't require extras, we're not running + self.cmdclass[ep.name] = cmdclass + return _Distribution.print_commands(self) + + + + + + def _set_feature(self,name,status): + """Set feature's inclusion status""" + setattr(self,self._feature_attrname(name),status) + + def feature_is_included(self,name): + """Return 1 if feature is included, 0 if excluded, 'None' if unknown""" + return getattr(self,self._feature_attrname(name)) + + def include_feature(self,name): + """Request inclusion of feature named 'name'""" + + if self.feature_is_included(name)==0: + descr = self.features[name].description + raise DistutilsOptionError( + descr + " is required, but was excluded or is not available" + ) + self.features[name].include_in(self) + self._set_feature(name,1) + + def include(self,**attrs): + """Add items to distribution that are named in keyword arguments + + For example, 'dist.exclude(py_modules=["x"])' would add 'x' to + the distribution's 'py_modules' attribute, if it was not already + there. + + Currently, this method only supports inclusion for attributes that are + lists or tuples. If you need to add support for adding to other + attributes in this or a subclass, you can add an '_include_X' method, + where 'X' is the name of the attribute. The method will be called with + the value passed to 'include()'. So, 'dist.include(foo={"bar":"baz"})' + will try to call 'dist._include_foo({"bar":"baz"})', which can then + handle whatever special inclusion logic is needed. + """ + for k,v in attrs.items(): + include = getattr(self, '_include_'+k, None) + if include: + include(v) + else: + self._include_misc(k,v) + + def exclude_package(self,package): + """Remove packages, modules, and extensions in named package""" + + pfx = package+'.' + if self.packages: + self.packages = [ + p for p in self.packages + if p != package and not p.startswith(pfx) + ] + + if self.py_modules: + self.py_modules = [ + p for p in self.py_modules + if p != package and not p.startswith(pfx) + ] + + if self.ext_modules: + self.ext_modules = [ + p for p in self.ext_modules + if p.name != package and not p.name.startswith(pfx) + ] + + + def has_contents_for(self,package): + """Return true if 'exclude_package(package)' would do something""" + + pfx = package+'.' + + for p in self.iter_distribution_names(): + if p==package or p.startswith(pfx): + return True + + + + + + + + + + + def _exclude_misc(self,name,value): + """Handle 'exclude()' for list/tuple attrs without a special handler""" + if not isinstance(value,sequence): + raise DistutilsSetupError( + "%s: setting must be a list or tuple (%r)" % (name, value) + ) + try: + old = getattr(self,name) + except AttributeError: + raise DistutilsSetupError( + "%s: No such distribution setting" % name + ) + if old is not None and not isinstance(old,sequence): + raise DistutilsSetupError( + name+": this setting cannot be changed via include/exclude" + ) + elif old: + setattr(self,name,[item for item in old if item not in value]) + + def _include_misc(self,name,value): + """Handle 'include()' for list/tuple attrs without a special handler""" + + if not isinstance(value,sequence): + raise DistutilsSetupError( + "%s: setting must be a list (%r)" % (name, value) + ) + try: + old = getattr(self,name) + except AttributeError: + raise DistutilsSetupError( + "%s: No such distribution setting" % name + ) + if old is None: + setattr(self,name,value) + elif not isinstance(old,sequence): + raise DistutilsSetupError( + name+": this setting cannot be changed via include/exclude" + ) + else: + setattr(self,name,old+[item for item in value if item not in old]) + + def exclude(self,**attrs): + """Remove items from distribution that are named in keyword arguments + + For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from + the distribution's 'py_modules' attribute. Excluding packages uses + the 'exclude_package()' method, so all of the package's contained + packages, modules, and extensions are also excluded. + + Currently, this method only supports exclusion from attributes that are + lists or tuples. If you need to add support for excluding from other + attributes in this or a subclass, you can add an '_exclude_X' method, + where 'X' is the name of the attribute. The method will be called with + the value passed to 'exclude()'. So, 'dist.exclude(foo={"bar":"baz"})' + will try to call 'dist._exclude_foo({"bar":"baz"})', which can then + handle whatever special exclusion logic is needed. + """ + for k,v in attrs.items(): + exclude = getattr(self, '_exclude_'+k, None) + if exclude: + exclude(v) + else: + self._exclude_misc(k,v) + + def _exclude_packages(self,packages): + if not isinstance(packages,sequence): + raise DistutilsSetupError( + "packages: setting must be a list or tuple (%r)" % (packages,) + ) + list(map(self.exclude_package, packages)) + + + + + + + + + + + + + def _parse_command_opts(self, parser, args): + # Remove --with-X/--without-X options when processing command args + self.global_options = self.__class__.global_options + self.negative_opt = self.__class__.negative_opt + + # First, expand any aliases + command = args[0] + aliases = self.get_option_dict('aliases') + while command in aliases: + src,alias = aliases[command] + del aliases[command] # ensure each alias can expand only once! + import shlex + args[:1] = shlex.split(alias,True) + command = args[0] + + nargs = _Distribution._parse_command_opts(self, parser, args) + + # Handle commands that want to consume all remaining arguments + cmd_class = self.get_command_class(command) + if getattr(cmd_class,'command_consumes_arguments',None): + self.get_option_dict(command)['args'] = ("command line", nargs) + if nargs is not None: + return [] + + return nargs + + + + + + + + + + + + + + + + + def get_cmdline_options(self): + """Return a '{cmd: {opt:val}}' map of all command-line options + + Option names are all long, but do not include the leading '--', and + contain dashes rather than underscores. If the option doesn't take + an argument (e.g. '--quiet'), the 'val' is 'None'. + + Note that options provided by config files are intentionally excluded. + """ + + d = {} + + for cmd,opts in self.command_options.items(): + + for opt,(src,val) in opts.items(): + + if src != "command line": + continue + + opt = opt.replace('_','-') + + if val==0: + cmdobj = self.get_command_obj(cmd) + neg_opt = self.negative_opt.copy() + neg_opt.update(getattr(cmdobj,'negative_opt',{})) + for neg,pos in neg_opt.items(): + if pos==opt: + opt=neg + val=None + break + else: + raise AssertionError("Shouldn't be able to get here") + + elif val==1: + val = None + + d.setdefault(cmd,{})[opt] = val + + return d + + + def iter_distribution_names(self): + """Yield all packages, modules, and extension names in distribution""" + + for pkg in self.packages or (): + yield pkg + + for module in self.py_modules or (): + yield module + + for ext in self.ext_modules or (): + if isinstance(ext,tuple): + name, buildinfo = ext + else: + name = ext.name + if name.endswith('module'): + name = name[:-6] + yield name + + + def handle_display_options(self, option_order): + """If there were any non-global "display-only" options + (--help-commands or the metadata display options) on the command + line, display the requested info and return true; else return + false. + """ + import sys + + if sys.version_info < (3,) or self.help_commands: + return _Distribution.handle_display_options(self, option_order) + + # Stdout may be StringIO (e.g. in tests) + import io + if not isinstance(sys.stdout, io.TextIOWrapper): + return _Distribution.handle_display_options(self, option_order) + + # Don't wrap stdout if utf-8 is already the encoding. Provides + # workaround for #334. + if sys.stdout.encoding.lower() in ('utf-8', 'utf8'): + return _Distribution.handle_display_options(self, option_order) + + # Print metadata in UTF-8 no matter the platform + encoding = sys.stdout.encoding + errors = sys.stdout.errors + newline = sys.platform != 'win32' and '\n' or None + line_buffering = sys.stdout.line_buffering + + sys.stdout = io.TextIOWrapper( + sys.stdout.detach(), 'utf-8', errors, newline, line_buffering) + try: + return _Distribution.handle_display_options(self, option_order) + finally: + sys.stdout = io.TextIOWrapper( + sys.stdout.detach(), encoding, errors, newline, line_buffering) + + +# Install it throughout the distutils +for module in distutils.dist, distutils.core, distutils.cmd: + module.Distribution = Distribution + + + + + + + + + + + + + + + + + + + + +class Feature: + """A subset of the distribution that can be excluded if unneeded/wanted + + Features are created using these keyword arguments: + + 'description' -- a short, human readable description of the feature, to + be used in error messages, and option help messages. + + 'standard' -- if true, the feature is included by default if it is + available on the current system. Otherwise, the feature is only + included if requested via a command line '--with-X' option, or if + another included feature requires it. The default setting is 'False'. + + 'available' -- if true, the feature is available for installation on the + current system. The default setting is 'True'. + + 'optional' -- if true, the feature's inclusion can be controlled from the + command line, using the '--with-X' or '--without-X' options. If + false, the feature's inclusion status is determined automatically, + based on 'availabile', 'standard', and whether any other feature + requires it. The default setting is 'True'. + + 'require_features' -- a string or sequence of strings naming features + that should also be included if this feature is included. Defaults to + empty list. May also contain 'Require' objects that should be + added/removed from the distribution. + + 'remove' -- a string or list of strings naming packages to be removed + from the distribution if this feature is *not* included. If the + feature *is* included, this argument is ignored. This argument exists + to support removing features that "crosscut" a distribution, such as + defining a 'tests' feature that removes all the 'tests' subpackages + provided by other features. The default for this argument is an empty + list. (Note: the named package(s) or modules must exist in the base + distribution when the 'setup()' function is initially called.) + + other keywords -- any other keyword arguments are saved, and passed to + the distribution's 'include()' and 'exclude()' methods when the + feature is included or excluded, respectively. So, for example, you + could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be + added or removed from the distribution as appropriate. + + A feature must include at least one 'requires', 'remove', or other + keyword argument. Otherwise, it can't affect the distribution in any way. + Note also that you can subclass 'Feature' to create your own specialized + feature types that modify the distribution in other ways when included or + excluded. See the docstrings for the various methods here for more detail. + Aside from the methods, the only feature attributes that distributions look + at are 'description' and 'optional'. + """ + def __init__(self, description, standard=False, available=True, + optional=True, require_features=(), remove=(), **extras + ): + + self.description = description + self.standard = standard + self.available = available + self.optional = optional + if isinstance(require_features,(str,Require)): + require_features = require_features, + + self.require_features = [ + r for r in require_features if isinstance(r,str) + ] + er = [r for r in require_features if not isinstance(r,str)] + if er: extras['require_features'] = er + + if isinstance(remove,str): + remove = remove, + self.remove = remove + self.extras = extras + + if not remove and not require_features and not extras: + raise DistutilsSetupError( + "Feature %s: must define 'require_features', 'remove', or at least one" + " of 'packages', 'py_modules', etc." + ) + + def include_by_default(self): + """Should this feature be included by default?""" + return self.available and self.standard + + def include_in(self,dist): + + """Ensure feature and its requirements are included in distribution + + You may override this in a subclass to perform additional operations on + the distribution. Note that this method may be called more than once + per feature, and so should be idempotent. + + """ + + if not self.available: + raise DistutilsPlatformError( + self.description+" is required," + "but is not available on this platform" + ) + + dist.include(**self.extras) + + for f in self.require_features: + dist.include_feature(f) + + + + def exclude_from(self,dist): + + """Ensure feature is excluded from distribution + + You may override this in a subclass to perform additional operations on + the distribution. This method will be called at most once per + feature, and only after all included features have been asked to + include themselves. + """ + + dist.exclude(**self.extras) + + if self.remove: + for item in self.remove: + dist.exclude_package(item) + + + + def validate(self,dist): + + """Verify that feature makes sense in context of distribution + + This method is called by the distribution just before it parses its + command line. It checks to ensure that the 'remove' attribute, if any, + contains only valid package/module names that are present in the base + distribution when 'setup()' is called. You may override it in a + subclass to perform any other required validation of the feature + against a target distribution. + """ + + for item in self.remove: + if not dist.has_contents_for(item): + raise DistutilsSetupError( + "%s wants to be able to remove %s, but the distribution" + " doesn't contain any packages or modules under %s" + % (self.description, item, item) + ) + + + + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/dist.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/dist.pyc new file mode 100644 index 0000000000000000000000000000000000000000..253e4759cd7c4281b3a064a55f333668b2f8d824 GIT binary patch literal 33320 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ºBolMS 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/extension.py b/PythonEnv/2.7/Lib/site-packages/setuptools/extension.py new file mode 100644 index 0000000000..d7892d3d9f --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/extension.py @@ -0,0 +1,46 @@ +import sys +import distutils.core +import distutils.extension + +from setuptools.dist import _get_unpatched + +_Extension = _get_unpatched(distutils.core.Extension) + +def have_pyrex(): + """ + Return True if Cython or Pyrex can be imported. + """ + pyrex_impls = 'Cython.Distutils.build_ext', 'Pyrex.Distutils.build_ext' + for pyrex_impl in pyrex_impls: + try: + # from (pyrex_impl) import build_ext + __import__(pyrex_impl, fromlist=['build_ext']).build_ext + return True + except Exception: + pass + return False + + +class Extension(_Extension): + """Extension that uses '.c' files in place of '.pyx' files""" + + def __init__(self, *args, **kw): + _Extension.__init__(self, *args, **kw) + if not have_pyrex(): + self._convert_pyx_sources_to_c() + + def _convert_pyx_sources_to_c(self): + "convert .pyx extensions to .c" + def pyx_to_c(source): + if source.endswith('.pyx'): + source = source[:-4] + '.c' + return source + self.sources = list(map(pyx_to_c, self.sources)) + +class Library(Extension): + """Just like a regular Extension, but built as a library instead""" + +distutils.core.Extension = Extension +distutils.extension.Extension = Extension +if 'distutils.command.build_ext' in sys.modules: + sys.modules['distutils.command.build_ext'].Extension = Extension diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/extension.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/extension.pyc new file mode 100644 index 0000000000000000000000000000000000000000..edbed10dc93de226c5605e8f8c896772c92766aa GIT binary patch literal 2585 zcmc&$&2A$_5Uw8oXA_cTr7Q~qwGh%8iTJRW1q5i>BpeWgWsH=?G8&C%+RixR88h9J zwWaJSoOv4#ybo`{6$!qoaV9x%Lkf<oTwUE=U0wB6bsB%}Y)uaS_&%b|r-9#RAp1L5 zjIW}UXjIFJM&7l)aV>k4HfhnKQHzvmk@0BWrg?|1u)0fegMNXD9>q;EU79M2TdcVv z`f=2uxJ{-b+D@(AVpU}(fKbWz2y)ydLp0x}^EMT~$&?JCe}w5wJRbIY@ILt)pOe0V z=-vPeX2u0&whUc#W@5Rq2Xz~C2(sUT!L!#yt7mjcboA55^jgvSJ#s{s@Vdb_m?>OK z%@rx<(eU)=9csD;oo`WbL`o@)UxH3ulZJgZZ9f6q()jqsl|`n1C`zM~sXko0vpmyz zp<k>Ev(izR=?P{Q%e-(V9>^a1Hg;Dl2S<r@rAtyfn3PEx2WI8$BTUQof17n(%ub7Z zkz%LgkklLdeDnWgyx)Qaw*?jimCr%ovsK)jh%YH89<L&^bV;5$UjJ2?S|ew>dl)YH z;=DVxV(Dhw$1Dl60i^iT@hov?<z#%CWM8J!!o;_vNs^6^%%q%+Ur0=kvy1VQ!PD_K z$z*I3XAYKObRN!(9b2Se>GC|aV?@tn7LE;;YdQQZyfA@yz>%_h>_M}wc2vXLS6%#e z)#gT<je;Ov#Rz*2vKkEN904ofs1wDA9sxI=2u<>b{RXdm3U++$fp%x1)1@_5KORJn z^)yK#CYfHQVPteZg?hPOZ6+c<j*W1fzXRC=FhCTT1Zn})OOJl7@Og#V4_P~JaJeZi z4+1dR#7UnGR2i&Y5y&8+S>ljR4uoTf1yP<|n8G1GtH9=E5g8k}Jc#5rl5uO&sR&^) zvnUOs^H+D9MSmNIz5}vcccdPuo|0g(Gkn)WkY%5$yr8xbHHUaf;N~7(;VW{0+@ZRw zT)m4OoBM0dgRY@twafJ&l0!J8e9#bNKLF#X%TX{{Xdc3(MiY664ueEMF_aXXSayyr zCx4-1S++8Ws=n2QY_izC0{SbB^c2a!-9}fC!RhC;zYn)IQQlSe)yWMEq}4Dw7va)% zcv*!ODSDsVu>Sz;ZhiN6aHIxFq{-_wtM0|o4T3COm>}4+vPB-3DG%BAAc*q_b-=(9 z8#iu?bQitJ=N9`GNaEdAZLil7=g{4XuvkZ!k`Dv$ImmL5Z+9W|9G<hEgMD3Er_<!z z=uj7CR;FR0>*D`NPf7<$Ql~?U6=`(@T9I`oj3vwdLzwZ|A)h<L{}B;>6Zu@Jl(w>5 z^Ktz+M)_h9X7SA<+2`!zjmCzxmHz~8FD|Ngs#ZCMXFVF!weEJ=K>dCUc!>{H_1;B! zVI)&NziZMseRfk`j2jyastRG!hi*mhE}$eO{8@GW7XpcW__M9>=k0lKdcEEKz5ND{ Gchx_Y(T1%6 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/gui-32.exe b/PythonEnv/2.7/Lib/site-packages/setuptools/gui-32.exe new file mode 100644 index 0000000000000000000000000000000000000000..f8d3509653ba8f80ca7f3aa7f95616142ba83a94 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/gui-64.exe b/PythonEnv/2.7/Lib/site-packages/setuptools/gui-64.exe new file mode 100644 index 0000000000000000000000000000000000000000..330c51a5dde15a0bb610a48cd0ca11770c914dae GIT binary patch literal 75264 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/gui-arm-32.exe b/PythonEnv/2.7/Lib/site-packages/setuptools/gui-arm-32.exe new file mode 100644 index 0000000000000000000000000000000000000000..537aff3774ecd62f4c26c55d0cc12f85c8a20a1a GIT binary patch literal 69120 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/gui.exe b/PythonEnv/2.7/Lib/site-packages/setuptools/gui.exe new file mode 100644 index 0000000000000000000000000000000000000000..f8d3509653ba8f80ca7f3aa7f95616142ba83a94 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/package_index.py b/PythonEnv/2.7/Lib/site-packages/setuptools/package_index.py new file mode 100644 index 0000000000..9c9d76a186 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/package_index.py @@ -0,0 +1,988 @@ +"""PyPI and direct package downloading""" +import sys +import os +import re +import shutil +import socket +import base64 + +from pkg_resources import ( + CHECKOUT_DIST, Distribution, BINARY_DIST, normalize_path, SOURCE_DIST, + require, Environment, find_distributions, safe_name, safe_version, + to_filename, Requirement, DEVELOP_DIST, +) +from setuptools import ssl_support +from distutils import log +from distutils.errors import DistutilsError +from setuptools.compat import (urllib2, httplib, StringIO, HTTPError, + urlparse, urlunparse, unquote, splituser, + url2pathname, name2codepoint, + unichr, urljoin, urlsplit, urlunsplit) +from setuptools.compat import filterfalse +from fnmatch import translate +from setuptools.py24compat import hashlib +from setuptools.py24compat import wraps +from setuptools.py27compat import get_all_headers + +EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.]+)$') +HREF = re.compile("""href\\s*=\\s*['"]?([^'"> ]+)""", re.I) +# this is here to fix emacs' cruddy broken syntax highlighting +PYPI_MD5 = re.compile( + '<a href="([^"#]+)">([^<]+)</a>\n\s+\\(<a (?:title="MD5 hash"\n\s+)' + 'href="[^?]+\?:action=show_md5&digest=([0-9a-f]{32})">md5</a>\\)' +) +URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):',re.I).match +EXTENSIONS = ".tar.gz .tar.bz2 .tar .zip .tgz".split() + +__all__ = [ + 'PackageIndex', 'distros_for_url', 'parse_bdist_wininst', + 'interpret_distro_name', +] + +_SOCKET_TIMEOUT = 15 + +def parse_bdist_wininst(name): + """Return (base,pyversion) or (None,None) for possible .exe name""" + + lower = name.lower() + base, py_ver, plat = None, None, None + + if lower.endswith('.exe'): + if lower.endswith('.win32.exe'): + base = name[:-10] + plat = 'win32' + elif lower.startswith('.win32-py',-16): + py_ver = name[-7:-4] + base = name[:-16] + plat = 'win32' + elif lower.endswith('.win-amd64.exe'): + base = name[:-14] + plat = 'win-amd64' + elif lower.startswith('.win-amd64-py',-20): + py_ver = name[-7:-4] + base = name[:-20] + plat = 'win-amd64' + return base,py_ver,plat + + +def egg_info_for_url(url): + scheme, server, path, parameters, query, fragment = urlparse(url) + base = unquote(path.split('/')[-1]) + if server=='sourceforge.net' and base=='download': # XXX Yuck + base = unquote(path.split('/')[-2]) + if '#' in base: base, fragment = base.split('#',1) + return base,fragment + +def distros_for_url(url, metadata=None): + """Yield egg or source distribution objects that might be found at a URL""" + base, fragment = egg_info_for_url(url) + for dist in distros_for_location(url, base, metadata): yield dist + if fragment: + match = EGG_FRAGMENT.match(fragment) + if match: + for dist in interpret_distro_name( + url, match.group(1), metadata, precedence = CHECKOUT_DIST + ): + yield dist + +def distros_for_location(location, basename, metadata=None): + """Yield egg or source distribution objects based on basename""" + if basename.endswith('.egg.zip'): + basename = basename[:-4] # strip the .zip + if basename.endswith('.egg') and '-' in basename: + # only one, unambiguous interpretation + return [Distribution.from_location(location, basename, metadata)] + if basename.endswith('.exe'): + win_base, py_ver, platform = parse_bdist_wininst(basename) + if win_base is not None: + return interpret_distro_name( + location, win_base, metadata, py_ver, BINARY_DIST, platform + ) + # Try source distro extensions (.zip, .tgz, etc.) + # + for ext in EXTENSIONS: + if basename.endswith(ext): + basename = basename[:-len(ext)] + return interpret_distro_name(location, basename, metadata) + return [] # no extension matched + +def distros_for_filename(filename, metadata=None): + """Yield possible egg or source distribution objects based on a filename""" + return distros_for_location( + normalize_path(filename), os.path.basename(filename), metadata + ) + + +def interpret_distro_name( + location, basename, metadata, py_version=None, precedence=SOURCE_DIST, + platform=None + ): + """Generate alternative interpretations of a source distro name + + Note: if `location` is a filesystem filename, you should call + ``pkg_resources.normalize_path()`` on it before passing it to this + routine! + """ + # Generate alternative interpretations of a source distro name + # Because some packages are ambiguous as to name/versions split + # e.g. "adns-python-1.1.0", "egenix-mx-commercial", etc. + # So, we generate each possible interepretation (e.g. "adns, python-1.1.0" + # "adns-python, 1.1.0", and "adns-python-1.1.0, no version"). In practice, + # the spurious interpretations should be ignored, because in the event + # there's also an "adns" package, the spurious "python-1.1.0" version will + # compare lower than any numeric version number, and is therefore unlikely + # to match a request for it. It's still a potential problem, though, and + # in the long run PyPI and the distutils should go for "safe" names and + # versions in distribution archive names (sdist and bdist). + + parts = basename.split('-') + if not py_version: + for i,p in enumerate(parts[2:]): + if len(p)==5 and p.startswith('py2.'): + return # It's a bdist_dumb, not an sdist -- bail out + + for p in range(1,len(parts)+1): + yield Distribution( + location, metadata, '-'.join(parts[:p]), '-'.join(parts[p:]), + py_version=py_version, precedence = precedence, + platform = platform + ) + +# From Python 2.7 docs +def unique_everseen(iterable, key=None): + "List unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') --> A B C D + # unique_everseen('ABBCcAD', str.lower) --> A B C D + seen = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element + +def unique_values(func): + """ + Wrap a function returning an iterable such that the resulting iterable + only ever yields unique items. + """ + @wraps(func) + def wrapper(*args, **kwargs): + return unique_everseen(func(*args, **kwargs)) + return wrapper + +REL = re.compile("""<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>""", re.I) +# this line is here to fix emacs' cruddy broken syntax highlighting + +@unique_values +def find_external_links(url, page): + """Find rel="homepage" and rel="download" links in `page`, yielding URLs""" + + for match in REL.finditer(page): + tag, rel = match.groups() + rels = set(map(str.strip, rel.lower().split(','))) + if 'homepage' in rels or 'download' in rels: + for match in HREF.finditer(tag): + yield urljoin(url, htmldecode(match.group(1))) + + for tag in ("<th>Home Page", "<th>Download URL"): + pos = page.find(tag) + if pos!=-1: + match = HREF.search(page,pos) + if match: + yield urljoin(url, htmldecode(match.group(1))) + +user_agent = "Python-urllib/%s setuptools/%s" % ( + sys.version[:3], require('setuptools')[0].version +) + +class ContentChecker(object): + """ + A null content checker that defines the interface for checking content + """ + def feed(self, block): + """ + Feed a block of data to the hash. + """ + return + + def is_valid(self): + """ + Check the hash. Return False if validation fails. + """ + return True + + def report(self, reporter, template): + """ + Call reporter with information about the checker (hash name) + substituted into the template. + """ + return + +class HashChecker(ContentChecker): + pattern = re.compile( + r'(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=' + r'(?P<expected>[a-f0-9]+)' + ) + + def __init__(self, hash_name, expected): + self.hash_name = hash_name + self.hash = hashlib.new(hash_name) + self.expected = expected + + @classmethod + def from_url(cls, url): + "Construct a (possibly null) ContentChecker from a URL" + fragment = urlparse(url)[-1] + if not fragment: + return ContentChecker() + match = cls.pattern.search(fragment) + if not match: + return ContentChecker() + return cls(**match.groupdict()) + + def feed(self, block): + self.hash.update(block) + + def is_valid(self): + return self.hash.hexdigest() == self.expected + + def report(self, reporter, template): + msg = template % self.hash_name + return reporter(msg) + + +class PackageIndex(Environment): + """A distribution index that scans web pages for download URLs""" + + def __init__( + self, index_url="https://pypi.python.org/simple", hosts=('*',), + ca_bundle=None, verify_ssl=True, *args, **kw + ): + Environment.__init__(self,*args,**kw) + self.index_url = index_url + "/"[:not index_url.endswith('/')] + self.scanned_urls = {} + self.fetched_urls = {} + self.package_pages = {} + self.allows = re.compile('|'.join(map(translate,hosts))).match + self.to_scan = [] + if verify_ssl and ssl_support.is_available and (ca_bundle or ssl_support.find_ca_bundle()): + self.opener = ssl_support.opener_for(ca_bundle) + else: self.opener = urllib2.urlopen + + def process_url(self, url, retrieve=False): + """Evaluate a URL as a possible download, and maybe retrieve it""" + if url in self.scanned_urls and not retrieve: + return + self.scanned_urls[url] = True + if not URL_SCHEME(url): + self.process_filename(url) + return + else: + dists = list(distros_for_url(url)) + if dists: + if not self.url_ok(url): + return + self.debug("Found link: %s", url) + + if dists or not retrieve or url in self.fetched_urls: + list(map(self.add, dists)) + return # don't need the actual page + + if not self.url_ok(url): + self.fetched_urls[url] = True + return + + self.info("Reading %s", url) + self.fetched_urls[url] = True # prevent multiple fetch attempts + f = self.open_url(url, "Download error on %s: %%s -- Some packages may not be found!" % url) + if f is None: return + self.fetched_urls[f.url] = True + if 'html' not in f.headers.get('content-type', '').lower(): + f.close() # not html, we can't process it + return + + base = f.url # handle redirects + page = f.read() + if not isinstance(page, str): # We are in Python 3 and got bytes. We want str. + if isinstance(f, HTTPError): + # Errors have no charset, assume latin1: + charset = 'latin-1' + else: + charset = f.headers.get_param('charset') or 'latin-1' + page = page.decode(charset, "ignore") + f.close() + for match in HREF.finditer(page): + link = urljoin(base, htmldecode(match.group(1))) + self.process_url(link) + if url.startswith(self.index_url) and getattr(f,'code',None)!=404: + page = self.process_index(url, page) + + def process_filename(self, fn, nested=False): + # process filenames or directories + if not os.path.exists(fn): + self.warn("Not found: %s", fn) + return + + if os.path.isdir(fn) and not nested: + path = os.path.realpath(fn) + for item in os.listdir(path): + self.process_filename(os.path.join(path,item), True) + + dists = distros_for_filename(fn) + if dists: + self.debug("Found: %s", fn) + list(map(self.add, dists)) + + def url_ok(self, url, fatal=False): + s = URL_SCHEME(url) + if (s and s.group(1).lower()=='file') or self.allows(urlparse(url)[1]): + return True + msg = "\nLink to % s ***BLOCKED*** by --allow-hosts\n" + if fatal: + raise DistutilsError(msg % url) + else: + self.warn(msg, url) + + def scan_egg_links(self, search_path): + for item in search_path: + if os.path.isdir(item): + for entry in os.listdir(item): + if entry.endswith('.egg-link'): + self.scan_egg_link(item, entry) + + def scan_egg_link(self, path, entry): + lines = [_f for _f in map(str.strip, + open(os.path.join(path, entry))) if _f] + if len(lines)==2: + for dist in find_distributions(os.path.join(path, lines[0])): + dist.location = os.path.join(path, *lines) + dist.precedence = SOURCE_DIST + self.add(dist) + + def process_index(self,url,page): + """Process the contents of a PyPI page""" + def scan(link): + # Process a URL to see if it's for a package page + if link.startswith(self.index_url): + parts = list(map( + unquote, link[len(self.index_url):].split('/') + )) + if len(parts)==2 and '#' not in parts[1]: + # it's a package page, sanitize and index it + pkg = safe_name(parts[0]) + ver = safe_version(parts[1]) + self.package_pages.setdefault(pkg.lower(),{})[link] = True + return to_filename(pkg), to_filename(ver) + return None, None + + # process an index page into the package-page index + for match in HREF.finditer(page): + try: + scan(urljoin(url, htmldecode(match.group(1)))) + except ValueError: + pass + + pkg, ver = scan(url) # ensure this page is in the page index + if pkg: + # process individual package page + for new_url in find_external_links(url, page): + # Process the found URL + base, frag = egg_info_for_url(new_url) + if base.endswith('.py') and not frag: + if ver: + new_url+='#egg=%s-%s' % (pkg,ver) + else: + self.need_version_info(url) + self.scan_url(new_url) + + return PYPI_MD5.sub( + lambda m: '<a href="%s#md5=%s">%s</a>' % m.group(1,3,2), page + ) + else: + return "" # no sense double-scanning non-package pages + + def need_version_info(self, url): + self.scan_all( + "Page at %s links to .py file(s) without version info; an index " + "scan is required.", url + ) + + def scan_all(self, msg=None, *args): + if self.index_url not in self.fetched_urls: + if msg: self.warn(msg,*args) + self.info( + "Scanning index of all packages (this may take a while)" + ) + self.scan_url(self.index_url) + + def find_packages(self, requirement): + self.scan_url(self.index_url + requirement.unsafe_name+'/') + + if not self.package_pages.get(requirement.key): + # Fall back to safe version of the name + self.scan_url(self.index_url + requirement.project_name+'/') + + if not self.package_pages.get(requirement.key): + # We couldn't find the target package, so search the index page too + self.not_found_in_index(requirement) + + for url in list(self.package_pages.get(requirement.key,())): + # scan each page that might be related to the desired package + self.scan_url(url) + + def obtain(self, requirement, installer=None): + self.prescan() + self.find_packages(requirement) + for dist in self[requirement.key]: + if dist in requirement: + return dist + self.debug("%s does not match %s", requirement, dist) + return super(PackageIndex, self).obtain(requirement,installer) + + def check_hash(self, checker, filename, tfp): + """ + checker is a ContentChecker + """ + checker.report(self.debug, + "Validating %%s checksum for %s" % filename) + if not checker.is_valid(): + tfp.close() + os.unlink(filename) + raise DistutilsError( + "%s validation failed for %s; " + "possible download problem?" % ( + checker.hash.name, os.path.basename(filename)) + ) + + def add_find_links(self, urls): + """Add `urls` to the list that will be prescanned for searches""" + for url in urls: + if ( + self.to_scan is None # if we have already "gone online" + or not URL_SCHEME(url) # or it's a local file/directory + or url.startswith('file:') + or list(distros_for_url(url)) # or a direct package link + ): + # then go ahead and process it now + self.scan_url(url) + else: + # otherwise, defer retrieval till later + self.to_scan.append(url) + + def prescan(self): + """Scan urls scheduled for prescanning (e.g. --find-links)""" + if self.to_scan: + list(map(self.scan_url, self.to_scan)) + self.to_scan = None # from now on, go ahead and process immediately + + def not_found_in_index(self, requirement): + if self[requirement.key]: # we've seen at least one distro + meth, msg = self.info, "Couldn't retrieve index page for %r" + else: # no distros seen for this name, might be misspelled + meth, msg = (self.warn, + "Couldn't find index page for %r (maybe misspelled?)") + meth(msg, requirement.unsafe_name) + self.scan_all() + + def download(self, spec, tmpdir): + """Locate and/or download `spec` to `tmpdir`, returning a local path + + `spec` may be a ``Requirement`` object, or a string containing a URL, + an existing local filename, or a project/version requirement spec + (i.e. the string form of a ``Requirement`` object). If it is the URL + of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one + that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is + automatically created alongside the downloaded file. + + If `spec` is a ``Requirement`` object or a string containing a + project/version requirement spec, this method returns the location of + a matching distribution (possibly after downloading it to `tmpdir`). + If `spec` is a locally existing file or directory name, it is simply + returned unchanged. If `spec` is a URL, it is downloaded to a subpath + of `tmpdir`, and the local filename is returned. Various errors may be + raised if a problem occurs during downloading. + """ + if not isinstance(spec,Requirement): + scheme = URL_SCHEME(spec) + if scheme: + # It's a url, download it to tmpdir + found = self._download_url(scheme.group(1), spec, tmpdir) + base, fragment = egg_info_for_url(spec) + if base.endswith('.py'): + found = self.gen_setup(found,fragment,tmpdir) + return found + elif os.path.exists(spec): + # Existing file or directory, just return it + return spec + else: + try: + spec = Requirement.parse(spec) + except ValueError: + raise DistutilsError( + "Not a URL, existing file, or requirement spec: %r" % + (spec,) + ) + return getattr(self.fetch_distribution(spec, tmpdir),'location',None) + + def fetch_distribution( + self, requirement, tmpdir, force_scan=False, source=False, + develop_ok=False, local_index=None + ): + """Obtain a distribution suitable for fulfilling `requirement` + + `requirement` must be a ``pkg_resources.Requirement`` instance. + If necessary, or if the `force_scan` flag is set, the requirement is + searched for in the (online) package index as well as the locally + installed packages. If a distribution matching `requirement` is found, + the returned distribution's ``location`` is the value you would have + gotten from calling the ``download()`` method with the matching + distribution's URL or filename. If no matching distribution is found, + ``None`` is returned. + + If the `source` flag is set, only source distributions and source + checkout links will be considered. Unless the `develop_ok` flag is + set, development and system eggs (i.e., those using the ``.egg-info`` + format) will be ignored. + """ + # process a Requirement + self.info("Searching for %s", requirement) + skipped = {} + dist = None + + def find(req, env=None): + if env is None: + env = self + # Find a matching distribution; may be called more than once + + for dist in env[req.key]: + + if dist.precedence==DEVELOP_DIST and not develop_ok: + if dist not in skipped: + self.warn("Skipping development or system egg: %s",dist) + skipped[dist] = 1 + continue + + if dist in req and (dist.precedence<=SOURCE_DIST or not source): + return dist + + if force_scan: + self.prescan() + self.find_packages(requirement) + dist = find(requirement) + + if local_index is not None: + dist = dist or find(requirement, local_index) + + if dist is None and self.to_scan is not None: + self.prescan() + dist = find(requirement) + + if dist is None and not force_scan: + self.find_packages(requirement) + dist = find(requirement) + + if dist is None: + self.warn( + "No local packages or download links found for %s%s", + (source and "a source distribution of " or ""), + requirement, + ) + else: + self.info("Best match: %s", dist) + return dist.clone(location=self.download(dist.location, tmpdir)) + + def fetch(self, requirement, tmpdir, force_scan=False, source=False): + """Obtain a file suitable for fulfilling `requirement` + + DEPRECATED; use the ``fetch_distribution()`` method now instead. For + backward compatibility, this routine is identical but returns the + ``location`` of the downloaded distribution instead of a distribution + object. + """ + dist = self.fetch_distribution(requirement,tmpdir,force_scan,source) + if dist is not None: + return dist.location + return None + + def gen_setup(self, filename, fragment, tmpdir): + match = EGG_FRAGMENT.match(fragment) + dists = match and [ + d for d in + interpret_distro_name(filename, match.group(1), None) if d.version + ] or [] + + if len(dists)==1: # unambiguous ``#egg`` fragment + basename = os.path.basename(filename) + + # Make sure the file has been downloaded to the temp dir. + if os.path.dirname(filename) != tmpdir: + dst = os.path.join(tmpdir, basename) + from setuptools.command.easy_install import samefile + if not samefile(filename, dst): + shutil.copy2(filename, dst) + filename=dst + + file = open(os.path.join(tmpdir, 'setup.py'), 'w') + file.write( + "from setuptools import setup\n" + "setup(name=%r, version=%r, py_modules=[%r])\n" + % ( + dists[0].project_name, dists[0].version, + os.path.splitext(basename)[0] + ) + ) + file.close() + return filename + + elif match: + raise DistutilsError( + "Can't unambiguously interpret project/version identifier %r; " + "any dashes in the name or version should be escaped using " + "underscores. %r" % (fragment,dists) + ) + else: + raise DistutilsError( + "Can't process plain .py files without an '#egg=name-version'" + " suffix to enable automatic setup script generation." + ) + + dl_blocksize = 8192 + def _download_to(self, url, filename): + self.info("Downloading %s", url) + # Download the file + fp, tfp, info = None, None, None + try: + checker = HashChecker.from_url(url) + fp = self.open_url(url) + if isinstance(fp, HTTPError): + raise DistutilsError( + "Can't download %s: %s %s" % (url, fp.code,fp.msg) + ) + headers = fp.info() + blocknum = 0 + bs = self.dl_blocksize + size = -1 + if "content-length" in headers: + # Some servers return multiple Content-Length headers :( + sizes = get_all_headers(headers, 'Content-Length') + size = max(map(int, sizes)) + self.reporthook(url, filename, blocknum, bs, size) + tfp = open(filename,'wb') + while True: + block = fp.read(bs) + if block: + checker.feed(block) + tfp.write(block) + blocknum += 1 + self.reporthook(url, filename, blocknum, bs, size) + else: + break + self.check_hash(checker, filename, tfp) + return headers + finally: + if fp: fp.close() + if tfp: tfp.close() + + def reporthook(self, url, filename, blocknum, blksize, size): + pass # no-op + + def open_url(self, url, warning=None): + if url.startswith('file:'): + return local_open(url) + try: + return open_with_auth(url, self.opener) + except (ValueError, httplib.InvalidURL): + v = sys.exc_info()[1] + msg = ' '.join([str(arg) for arg in v.args]) + if warning: + self.warn(warning, msg) + else: + raise DistutilsError('%s %s' % (url, msg)) + except urllib2.HTTPError: + v = sys.exc_info()[1] + return v + except urllib2.URLError: + v = sys.exc_info()[1] + if warning: + self.warn(warning, v.reason) + else: + raise DistutilsError("Download error for %s: %s" + % (url, v.reason)) + except httplib.BadStatusLine: + v = sys.exc_info()[1] + if warning: + self.warn(warning, v.line) + else: + raise DistutilsError( + '%s returned a bad status line. The server might be ' + 'down, %s' % + (url, v.line) + ) + except httplib.HTTPException: + v = sys.exc_info()[1] + if warning: + self.warn(warning, v) + else: + raise DistutilsError("Download error for %s: %s" + % (url, v)) + + def _download_url(self, scheme, url, tmpdir): + # Determine download filename + # + name, fragment = egg_info_for_url(url) + if name: + while '..' in name: + name = name.replace('..','.').replace('\\','_') + else: + name = "__downloaded__" # default if URL has no path contents + + if name.endswith('.egg.zip'): + name = name[:-4] # strip the extra .zip before download + + filename = os.path.join(tmpdir,name) + + # Download the file + # + if scheme=='svn' or scheme.startswith('svn+'): + return self._download_svn(url, filename) + elif scheme=='git' or scheme.startswith('git+'): + return self._download_git(url, filename) + elif scheme.startswith('hg+'): + return self._download_hg(url, filename) + elif scheme=='file': + return url2pathname(urlparse(url)[2]) + else: + self.url_ok(url, True) # raises error if not allowed + return self._attempt_download(url, filename) + + def scan_url(self, url): + self.process_url(url, True) + + def _attempt_download(self, url, filename): + headers = self._download_to(url, filename) + if 'html' in headers.get('content-type','').lower(): + return self._download_html(url, headers, filename) + else: + return filename + + def _download_html(self, url, headers, filename): + file = open(filename) + for line in file: + if line.strip(): + # Check for a subversion index page + if re.search(r'<title>([^- ]+ - )?Revision \d+:', line): + # it's a subversion index page: + file.close() + os.unlink(filename) + return self._download_svn(url, filename) + break # not an index page + file.close() + os.unlink(filename) + raise DistutilsError("Unexpected HTML page found at "+url) + + def _download_svn(self, url, filename): + url = url.split('#',1)[0] # remove any fragment for svn's sake + creds = '' + if url.lower().startswith('svn:') and '@' in url: + scheme, netloc, path, p, q, f = urlparse(url) + if not netloc and path.startswith('//') and '/' in path[2:]: + netloc, path = path[2:].split('/',1) + auth, host = splituser(netloc) + if auth: + if ':' in auth: + user, pw = auth.split(':',1) + creds = " --username=%s --password=%s" % (user, pw) + else: + creds = " --username="+auth + netloc = host + url = urlunparse((scheme, netloc, url, p, q, f)) + self.info("Doing subversion checkout from %s to %s", url, filename) + os.system("svn checkout%s -q %s %s" % (creds, url, filename)) + return filename + + @staticmethod + def _vcs_split_rev_from_url(url, pop_prefix=False): + scheme, netloc, path, query, frag = urlsplit(url) + + scheme = scheme.split('+', 1)[-1] + + # Some fragment identification fails + path = path.split('#',1)[0] + + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + + # Also, discard fragment + url = urlunsplit((scheme, netloc, path, query, '')) + + return url, rev + + def _download_git(self, url, filename): + filename = filename.split('#',1)[0] + url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) + + self.info("Doing git clone from %s to %s", url, filename) + os.system("git clone --quiet %s %s" % (url, filename)) + + if rev is not None: + self.info("Checking out %s", rev) + os.system("(cd %s && git checkout --quiet %s)" % ( + filename, + rev, + )) + + return filename + + def _download_hg(self, url, filename): + filename = filename.split('#',1)[0] + url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) + + self.info("Doing hg clone from %s to %s", url, filename) + os.system("hg clone --quiet %s %s" % (url, filename)) + + if rev is not None: + self.info("Updating to %s", rev) + os.system("(cd %s && hg up -C -r %s >&-)" % ( + filename, + rev, + )) + + return filename + + def debug(self, msg, *args): + log.debug(msg, *args) + + def info(self, msg, *args): + log.info(msg, *args) + + def warn(self, msg, *args): + log.warn(msg, *args) + +# This pattern matches a character entity reference (a decimal numeric +# references, a hexadecimal numeric reference, or a named reference). +entity_sub = re.compile(r'&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?').sub + +def uchr(c): + if not isinstance(c, int): + return c + if c>255: return unichr(c) + return chr(c) + +def decode_entity(match): + what = match.group(1) + if what.startswith('#x'): + what = int(what[2:], 16) + elif what.startswith('#'): + what = int(what[1:]) + else: + what = name2codepoint.get(what, match.group(0)) + return uchr(what) + +def htmldecode(text): + """Decode HTML entities in the given text.""" + return entity_sub(decode_entity, text) + +def socket_timeout(timeout=15): + def _socket_timeout(func): + def _socket_timeout(*args, **kwargs): + old_timeout = socket.getdefaulttimeout() + socket.setdefaulttimeout(timeout) + try: + return func(*args, **kwargs) + finally: + socket.setdefaulttimeout(old_timeout) + return _socket_timeout + return _socket_timeout + +def _encode_auth(auth): + """ + A function compatible with Python 2.3-3.3 that will encode + auth from a URL suitable for an HTTP header. + >>> _encode_auth('username%3Apassword') + u'dXNlcm5hbWU6cGFzc3dvcmQ=' + """ + auth_s = unquote(auth) + # convert to bytes + auth_bytes = auth_s.encode() + # use the legacy interface for Python 2.3 support + encoded_bytes = base64.encodestring(auth_bytes) + # convert back to a string + encoded = encoded_bytes.decode() + # strip the trailing carriage return + return encoded.rstrip() + +def open_with_auth(url, opener=urllib2.urlopen): + """Open a urllib2 request, handling HTTP authentication""" + + scheme, netloc, path, params, query, frag = urlparse(url) + + # Double scheme does not raise on Mac OS X as revealed by a + # failing test. We would expect "nonnumeric port". Refs #20. + if netloc.endswith(':'): + raise httplib.InvalidURL("nonnumeric port: ''") + + if scheme in ('http', 'https'): + auth, host = splituser(netloc) + else: + auth = None + + if auth: + auth = "Basic " + _encode_auth(auth) + new_url = urlunparse((scheme,host,path,params,query,frag)) + request = urllib2.Request(new_url) + request.add_header("Authorization", auth) + else: + request = urllib2.Request(url) + + request.add_header('User-Agent', user_agent) + fp = opener(request) + + if auth: + # Put authentication info back into request URL if same host, + # so that links found on the page will work + s2, h2, path2, param2, query2, frag2 = urlparse(fp.url) + if s2==scheme and h2==host: + fp.url = urlunparse((s2,netloc,path2,param2,query2,frag2)) + + return fp + +# adding a timeout to avoid freezing package_index +open_with_auth = socket_timeout(_SOCKET_TIMEOUT)(open_with_auth) + + +def fix_sf_url(url): + return url # backward compatibility + +def local_open(url): + """Read a local path, with special support for directories""" + scheme, server, path, param, query, frag = urlparse(url) + filename = url2pathname(path) + if os.path.isfile(filename): + return urllib2.urlopen(url) + elif path.endswith('/') and os.path.isdir(filename): + files = [] + for f in os.listdir(filename): + if f=='index.html': + fp = open(os.path.join(filename,f),'rb') + body = fp.read() + fp.close() + break + elif os.path.isdir(os.path.join(filename,f)): + f+='/' + files.append("<a href=%r>%s</a>" % (f,f)) + else: + body = ("<html><head><title>%s" % url) + \ + "%s" % '\n'.join(files) + status, message = 200, "OK" + else: + status, message, body = 404, "Path not found", "Not found" + + return HTTPError(url, status, message, + {'content-type':'text/html'}, StringIO(body)) diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/package_index.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/package_index.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60197acbdfcfa6307422f2ebe52ebbadcb401510 GIT binary patch literal 38296 zcmdUY3veCRdEVK3K@b2z0(^m_D3ME2Bmt5D&4;9z;zJ}rN{mR5T2P`4fx5W3cL7}T zK7ic|5|ByPHdRSU*s9JeqNu zX{Tw^y5INxyZ2sDa*}pBpd;}foIQK?oU`Zr@Bcq%vwys{>#NUvniKq_&QhVapOI%((A^1U1hx+U+*d#-1r7p z+33bMy2>UuzR7tUQ=2Pqc9lLi-e=dVTzQMDY<1&X?YiBSx4FtAZu}9uUhT@;UFA_X z{-~=w=Efg$l^t$;hpX&#<2zl&cjLaR>~iC~TxGW#-|Z@U-1r_>dEAXZ?kaoT_+D4p z=f?NB%6>P#-&OkEc)zO*xbXpNy+f@ZaN`H;y3>^py2>Fpe#ox7TzSw{hTQm&U9Zvg zVK;u*uDf0NJ+5-ZjURDdm~}Ugy5d@Q9}95IC70`zIqvRbC7wtNdsOGi^s={E=jKyx z{5xE6y}S8dcOQ#-!WB2T;zn28uMBjbC)dy)OJtH;v+bdeFJ|jX&>-`(60FO8Xn7 zm-wRLI+YGIN-w7)Il#7Wj=J$Hu6U5Q$FI8LA!S~0#X)5P&P;Jg?=t3!hgEpZg^#+M zFS_D;RQ{3+$6R=lt%Wb?MP72nBdU4b6^|L50a}(S1bfm^{6zp zP%qW0^))CscX9M=@II@s4%gLMRLPf1uZ6j}e0^3`#;&{=44=0ut5GEi=NB*p-8)~s zU5aYeN?5JeH{jlMsanhxTRMsBohXj;(_yZfuY?+eu5O1>oDQO1%T1Tcp(=1tf%TwP zHR|&(oxgPDs)o?-p@RC3<8m%un47Cbbt?n~a^>2LUGQc2ws_TYd_Ib5Q9q07e1nCk zTrN!=RerW!pTkAH1Lb3wo9fKPD;o22*REaFbGn5`=JHV-*1PQag{obux$68vtsdH& zqOtly97cLmJav@ws5jH}Vh)ZLYQ=D_R>G9Ev$1NaFdL=gy2)~m1&_vTtJ$G0o3D=< ztB28az8r^E$ce5;`D$Fw*OMZSZZ;p!;sveFDiqv_@^i6W_TX|RtmpFOa&9)v7qKSs z7L>gj&di+Ze`WCO;CO!Uwf79ZH#cLCK?C3pog4^t1 zVjw0QV(bTpZ0I-MfArA3ffMmg6c5$&(a_9mzWz?Vc2pUE=(W-uax<@K&8`|=U91+v z#X2WQ;9QGy)3qpvRjF@8nHE1c#ap>MrD~}f*Xx^6j>QY3IUt82K}|qkVk-s0EvKJQ zI*ecZRU~(vy9r9>+&vJd9ygJ7_cHDt(l&P<xSwL?Zh4>1Br0BD%x}i&^KRcCn4M z=dA`fE0}0I>3sA7Ra)(e9c~wz6`Yc|fL!s!#0(l;n3}j=s-7)R zM`5ugH&v=mjD%AQGZR;r>a(>fX!69-p{FJ;m8K@*Qav0@I7K{x&KBnCwOTozNXl}c z*Wu#O+)}U?{T#wCejJI*c6&XU9R$ z6Q&!`d~cPz*Y4^bA)^7-U~t<|_1b_jy2M&=j7 zXh~g9NBJ2tzF-iw1OiG{3J&T-S5SWd#x%IHk-QPU50S@tJG^b)R_{@-+imv>8IoX7>1qLx!=PwLur2R#|R`r-MtV zwzjp%ulF_?vEnpvP6d^_kpZ#7+yXYR-bQ|IirCNU#D(m7`-QopJHCS}U?Zo_!+&Gf*=?>1r-3~57A_eT@C71z70Scpi6l=%k z_qppt*gQ!faGMVaQ<2{Su0L|)g1d*d4A~(LfOepF{OfQ&+itn$2p}tvNC3gnT&GAv zTNVsy(OqYE{p8c}uOWFhtcDSkDnCz^s|u=qJM;x`0&9K`5>S-; zQ0D-ekY*sqh&2K7Zgr5IEzXEp;g*pZ0_|pLd#EQ^_e>}{0#JY2Eq(`S)5wkYBnqKb zG1&<1-&*aWYhr8Sgvq1V-262_um=d{(#D+WOAr@)SQ;Q_`e7M@X|*07@}a20QgNGL zQj4Jc5BULZRi?rSkX~+7^h1cRejJ9?p;6Oh_{LBsMECQ>qA{8se0$P?T&@7?QXWci zE+=V5>;sxel!s2Ihi-*S5@Xn??lO}@Q?i33Bh=F0TKT1y)^C%QQiB0yi};^c|gHhX@&P?$9_wLTl7PP|YCLKDxef|{yT%S*OuOO$-$bm>v4 z5)Y|L0o`iE#7z!1rd`8E44A|CzE@*41~@7<801jJI251CM>DY$oLhI8HIou=@D;Rd zE2gzj+@xJ=E{r~hY|N!_85{I2WHsnu3b}wUZZO3)Q`w3Qlct3Pux{te3t{|&C@^Na zYI`>3uuj5ScKXJFi8u<&?=-W)jHcTIr$v4E+8y}uo#I}+&*I(0IA(xjjiH4&N@6Yb1!<+xC!@uib>m=s`55@{wp{P|Dx(@Y_<8JxeQ&S_>R!VCMPI>y0EX{AbjPL-kFikVW)os-Qe z5YHxtJ{O$75NziY6mn+km2xqpSvq)zWx`=}q2}W-9~EYe=O0h+a&n}8s;7E>Mt?Dv zdKQ0U6+l=vRKs(yh#*-3Qs*w!S=wOaz% zbNI#7$3i%bzzUE`Kz$t<$eXq590*I z5U(53dXb2w)A<6e7m-yX^d`?4=_l;*$AJywCkoUQ7zib*NXhj=2rV`5PeE?IMH!d2 z2$Lv7neC06NXE6LX2S_@FHZ{q_3T4{1A#Gy|F8Lq9F}VnpXO^Xdv%b^M9<@FG+tfn zs7a-Ng2Isu*ca$>p)3y)Ucz)hHuk6U@G>>0qR9%cMGNMO36{|GLzsjPbX$sZ8tbnh zpH4&;dH$A7L=y%UaH}~Hlm;XCtRmo(Py03~Bo%*q`TP`=3e8grmHnJBsXqgaM&gC3 z7%rcMI^YSq6Lpf%hde?fLfD+TQJW(UO;aX%m-elT^qGe+nbdY|EWd%AP35Ylh?|qU zCzlg}$mJ@v;zBvZCE0W?SF9Csx#0bLv3pEDh@|-r%B>WM3>MM%FX9(>AZgFGd!6l_ z?eeNVhn0JffDw1ju{O0oBVeIywIE~Q?-s*B0=CM9((jRHISlzm&mdT|iLiB2k!Q^= zQaDa${5+EWGgnU%WHf)Lo!mH*8QXBxn43$u z0QECz5!k=Y6xaAMPSkx&2<8a(SDNKbCPW6-oRclLaSde_bw9%SW6SXqNWcprcq|}L zA@BDmMzbaHumOKLpY&D<`@|a`#%Gk@W(okhEJv zf0zT$2~D99u)T)Dm4`DCvOhuBMg>g+CNpWgRUa-IZw2@;P=b#yRVle>_Fh7@aM4`* zhB$2MA@NL+=RZaN>8o*|%g}}~5Gbo!F0fG{t*)jw5w@VpBq``WUU0eYzXm@6VW51AdVh@d=VcDf=W@{sYotBarp4u(p(7v42*mjf)oF6T!Kg$%6535z!fJb^Dphp z@y{Ru!=vc}C=5?QyZc_xd0>Fxen=a!3Eln{)PQ_Y66Jz?kYrY+88{#ibpX)@{IQct zp;e+WO4?HSP|5M+MQUm0wH{CKVUOz96Cq-Hnbv{e5o8uBQNB0 zQ}C%{eY#Loo1;ifC$_{m6P;*2?65~l|m}hC1ab%Ae~~4tN>t0?gVq%hgA^mq55Q5qwQZKT(Sh7H4K(x;uUD4 zjT0R$tH7JU6`-IT|9!OeAqP@yZjF|h=?%HL zfrw=z)KhewAhVIhur>my;wh04u+Cb@-Y zZ{jXyuuBF?i#KX?yLiskx4D~GMtLde@T7ZkJLygxArSCzg6ggzA>}{3wN360cUS#* z^S|j`$F$tssoC^dD|#VQ-^BrelVE!8!*;aR(OmjMhSRuPOJ?R$jfRu2z*orZh(e*& zS&mH7Q9n-)WW%AIlGsDCi&pYWh=7445S8EqfqP+8ob`f2VrWl0;qQ$Vj29qqlqM!z zvX6$XGi1;$osxTF)P*H&aL^y4X*7*T^U;T2tu;e!c9~)YYh+Aq~PXXf{xU zQ~~A!MDQIk31wC>xuPDW8Ms74^IW#+>0(&=KA>R#9$W=~g9)a{tao_(+!(^6FP~Sy z(_B<5gfT)q(RZi)C58EhBOBVINMcLhjsrT#J0hbT5ZZ!b6)AosttF-*-?vGv8hr;Ur?6mifXOj) z__ReP&9mWuz(nl9Cb0Stym!G*U=V#Iy`#uD1cS6e%qA6ao7W4{+=X&F_z?Y=>C9{esqVtv9S9;hU__hHz~3-_F^woDPcTf$XzM&O0q0|(Asx-$Iy`4Qy&sU?tc$$f*8!MYSw8~hNS62UP))2Dd3iHR1L{;S|^Bxc%? zD0du}f{|%B6v~hXFnhsASqHxrUcMhjk1uig*0FEk{t3_s>W~{V1xk>doW`ZU2acclGe&hWYKE32>Tccv82MSksJMq6b3_?t!#8yD*~JcT1t}g<_|mkyFS0# z;oo(w5BnZfbUK3o2g!8}7aEus{4A;jUt)3qi3mC6@Eq#P>(w+rh!vPKPkVcUpW_33 zE%=k7rInv{xy+UgHlE}nbYVyiB$?RL(Mj1v>>!AU4<}P|mrg z9qGu84XOOw&v|||i-J)rQb zTu#~_GjM%l-66|bJkES1lB~7NV$`D+YlWQCCM_dzV((>?p>flRnv~V3;{}uleE;BC zCah)wQ_HENMG^iY?ut(4%=-qY3FF`#N>_e~gI_?m2-t06)^RNBK6qX`n+gzLjI$GO zK*cvfhO{bgKtKm4d?8_YDJDI`)ms9G#iEO&Vf8`Ph*-AhVz^jX@A~{s*9Q2$)#ajB zo#%PDei=Uon;QY0fW)nB30SVE%UfI$;lz>(f<|u4Qv4^RAUXoE#i$L103tf%c4+-# z&C%B>t9SDc6t-WHE&v(}yw;Y3zNgT_{MQ);1QUVvN+pZe;L~c?oBwO>I*^kQ6Y`B% z_hZm$#-P;Lt_9lxXi}xa#1Y+thj13lH zM26On-^ztJkOYu)M#QZR>{_zz-pp=Dv%TIC>RvBp?HsF!_XV%nqH`*$**Z0_3|?|~BzjqN_YH|D-OTN3uBWwLpB z2AAdvXJ6R%%xfkqC74O{JXy|Hri%H~-_N;X@4??kV%ubcZ>cyD0$yT_miB-KxA`2+ zmd0n-BUeRe0e5XNI9A(b)SDO@G%a0Rec#oKIc#tgxWEDafLawuY5I3;l}c0aZY#{&vI zV5~th>xd(mu05^rNN!{EIrj{!PIf34hYa{S*gI}UiqBz+SEH@yZM64_@_F?G$3 z#!sTxc$aMsGG|V#nj24%1rk=lr_3-b^!Y(pk!uu!iyxBh9X72M$zKo>B z`%Ni6m}D7#D~s^KSJ309IlJBLn;uuU5p&#Sf;{J!m?U_l)ZaSCm|aMdTR;W3aL#y3 zu5Fe}o`XT*!TQ*Ekk$vodY4CH6^cP7YqNMv403tv6kfywM{aCX#HN8G%_4(5Jtfs)+CjvO);9jsmcXkd3bU#;?deTD7r=dM;kT79AM0Vdj1cjiOjFbV6Agy(iz6h9x45n&HwsPKM{T2n5oc8Mw8GuE zK(4{)c+Zefx3T!qxDdTPdBB4q#SkA5lK_!yD-1!&vTymJi$#AD0$V&uX@fzDH2j+< z`c4Ua5pIwKRpC9=5}OqT4g=B{TFp+3ni=eG;o5BeKg66AlFu^tI1^H8Eim^fREsS% zmMh93D1K?>u~?QEY`%g21B^hD*Dp74I?qb*dij7y3D!=R0P1muxK6BDh_I}`BO_NXic!`wSq-Cu9<-$_8GiNJ_d6d&VA z(t4a(NYfOeTk81z<^`;j;&?6un<<`2q(BN3Ci}h3+;1_V==C6v;wv*&=wVrQe;fUO zjZ4vu42_B#p`3K3=6KSehM4gCxPa9bvkNH3?8d*GSeQUqupF59=xz$yk_!RQxP|&8 zEw-x$0)YxAS}aSnsE9yCi+UWS2%@>sC_M$-K*<;s#)O}#2_9+z-|f;y4u^&lmBJo# zeg2nW*XovC>tE8Y16aK`JfK$mz< z0mS@j@i5q1>IL>EvE&8O#L0SP4(=LkhJgz(-IC^WBP*4L`mAknQms-O$l!#`D; zS*R_BeU4BJA*| znIQwF5xX5{x!1X9K+`&h0GssbbbxpOat6SEVM@rub>n}4s&vE_fgw>uNS1=V**1uR z>g%O^R3fw~(83h5;jMK$m7Qgs;Jp2}zg~?jr z7Z4Gka(x%bJ{%W_QtF_4y=gev3ndo!-3Qwn8=0TNp~Ovk~cLdQ@KeEQ%giKeJnO=_`sye4Dyay z;!uTvP3CWdHd?oA-uII?rkq0TPvc=^Td0#W?&#o*+5GJ$Eu5)g`v`XFaia-&BL~0^ zCMQ!`qysb(mZS}CyqylVLGoMIALC#Q9k@kGp6!LJwZ?PH#{DkuI629KmbLVN83FxoT!%DWnE-O79y<`+fiku)T=LSrDDgL~F>(pjL|?6m62#4<^2O zSr}kNkOP#i|EhZn$JgKwu>UPPQ)7>)0%%q$HhYlZaSt_4&hK&fM=~fymv+KE%(Fo_ zn>`nQlvJqOO2<(5ItG;lZO8jC%&}XgxjDW|>m&knhYYb2AGT|!jsHV zl?mQvLWU+Qg6uv(as3Uex6K;J+p^0vm$PX$iaClf+2XAu@Wk>~%%N1n;D)e_79b5? z*O}dfSiNrOW^2Lsc6%``3!}A$o}trj;qPvWdI>a(a3p{MkpmS1)dPjcQZB`mrA zWHmmA@G(PF&UPZQkd>NRt2zG~FMo%L>hph8Y!47fQg7C5pL%o!XT zhIYsi@M$4>2Ua;;C#IoekYyTdS7Q19CA%Fte>FHieD>P;k*7g~O!b+Ze5a7uO8Bd_ zJ79JQE6kH1UZ_P4GBt%mVG-4c^O&$F3OdSE2}kpS{YsNb&Qv0S2Q{rq{qk|fa;t9B zXlWVm0z{HDrc4OpdMk%X$6|_V>zzhxrcgJjrJYh5a1G54`7CnH_{k=G2LFpy1eFB9 zl^1tS=;jWTmkDeg7=-KC3jD_gN#X#}goVTS#q)p$*k z2eb&M49}Rv!AgQMc<-Vk1Tltx9dUD4_!y)AAq^@rpI``1aL$849icsqP#p{ZVF|np zvcCX+8EpR*dT>|{y9^*&A|<3~a0$quWt~ZnKp_vIK^z(mHiJ0{&#X&rF)E>44IVZB z6><}Vp|>^(36|CxMd#i_=Uomv8xRje*?TpPHpeERB!`$Z8_GtF11u2taquoJK^~vm z= zbd}JUi{C&poToXn#l`})y>S8?^;^0%8-^f5!|4+20(&C{2rS{;ig*_Gl|;s6_hcoh zH;U&PLqV4m!hIZHfHqTW5M*SWjzCEZ7NPy` zFaqs|);~R6TBHR4XFgJSXqaqldSC^|X)SdhIxx>vLukp6ZSOjbo-Im*GDPqU6EZ2R zzH`ZI*a2*pc&p(p(tX%7_{NGRtnbAA=Hd*2qE#Tm4Tbr52`mYF4$9?#Hh!te@hlHe zH?CL1*>J%xu}{+XI}swTga61&!2}O0$AK%s7f>SA+&o=ki}X#|wrui7+aW-3DJo!F zUM-0(MeMj>*TFx>&3^nWSux)CN9YkJ8@QNGZU?SL-gX@PZv(s^+zQZ(vR<6~wS#xE zo4oB=ZWmy!Y-VFN3w7JaZjLM-UW*@Dq3G8q@J_}CDN>qd4qTgn{Z}Sn(5crhdT^aI zlx`k{1cGPr+A=_6(m`vmC?E{cJl7rMhU5jtXesa@TM6Eq6O=bV2|?;m72Ti`TI^y7 zBghM=3Ke8KKpC_Nlnm8Og}Dw&t>hOKQLGCPN6DaeT*+*$ zc1x&hagRU7*51#AdlUn@K7_Xxl`NDc2AEHoW1pT2evbv8XY#vDegugSUjxArka|ZP z@zRDH9G8d$GjZ@5idG(*HB(JvW4-oKVm9fh^LpXaq}0m)v))cgu{^`L8|9nfuj@g8 zGO>Rx{_pZ0&8&jqts~R!pqe(w9f z+RPabs~SQv7`5Jb&}IVc)ou#QRE;J5h~M(xpNY$X!{`WX^r}94ieIA z@OM~OR)4w`^uWcc0&rl26TzeTgn~%8Sb!KaU6ZgAO!B!~Ox|YF!=#r9NvrDPd4>2& z+=0g|Mr1vi_qlv=Os{eYZz8J3SJEwg8fLK&&QU&V(XNQ;!f$SXgM~-)d0V5y0htfW z2TpeKMPmCi$WW;10?FHiaNS<-AV}OsY*b^+ICno%+3$lm!+VyeVAH3Va@K4&-Hfo) zQ1MTar~#iPB}~BaZOT3P?IoTQNr4AnbAXxbIcA{3p#;PLP|7?gf>a$mHNPFZWuVny zO9rqTRUuDEJ)><7#<?|4cn~xFGS@~RhzJ*FRLmf8!1OgRkkGIB>L~V4XLN~Hn(4cWNhWBlq6%C2At@@ zy$^~V6d3{75G_eDAyYM;7tNGENOtczcWAEx>)lQQ|~n z7&&wzRA`o`btgk8fh~!%Xo0lnc=i&vUBG;WIhOd$k<$@C0iTm1Ib>;I|XJ zyo}@_aLaF?+utJoJdTXZ+8*M)nRbRnWj42M2d3~R#Q=Uen8Cq=N?5g1rk+mc=Ei?nY%Q#4Gtk1~nF$4k7%BYZc!p_9 z^pW6)03$*5AwbO#2K!CUA$bx5(RXk+DPNRQR%0eVh6_?pOc#V6C{EW&>qc%|No`jE z7Hqvo6p)ldPO;=5Y-uBj1norQ5Vb+2tPRl^P&>^tmSF7a{6>d=*S|$|@Icce8T6i7 zezF+VXzU|BsjqbL6JCS(#Fszl51a|Y+c=y6=Q>Oj51vrC?2Fa(3_Sn2YnLyjA!NzN zQ_MX6OK2=8GvO=iAU87=$XxNCSay)>ORDq$OVttz`$fG1AN3x>iXKL{?U)(cvhOHF3q3POBa5__{G=o5Z1yZX=8gpjcu^|Q3n@30Aa9*e}%00!~V1_$62(322 zVj_)DgJeU9vi*%P4uFM0g!MgeNM!i@AISWOXJIiAs`J@ycMoA_s0{YDRuU^-rivQ4 z?s8lBX86PpjFaHf>VW_Wu$0+gT5O%RPv4v0lWthSAh7`u)kGW;!5o~FTwbLOt0tgY zJN`x=*bQjj9pV<)(+Tmz&Y#QM!dtKArZ(=M`IAeQ@}g_G67-vq+hh1`DV;Exz{B~5K8 ztDnRLNhoYxfMQ6GVnz*I0XVe^ox(l{U?z$}tQ1HC^|s-Oq8ZD8ekQWkRSz;MV6y@G zKtjd15OdHFpi=-2`E*){gou8O1;7ritM!{>2c=`lYGiQB_YK~I*Eb$Vi8^?c$uTAa zNK7Zu7si6eaBWfMQ6m z=r0sWLH6zQ^(1TXZu8**6QTt@rwIy}hQwqiCVP}+1gm$IlTP98%0o$T2;DwSa3BdJ z`frD0c?%43y)eOLy>(gfRD#1_YLFma8}pdOVeE__cmN`}QN3}ixu#rv3KTE$)K>z8 z@fQ(;20Y-og*kt4*dOHfB>(ij!M~KCFbGh1{?7yjGAR-?{+`88Km*!ubO310{jk92 z^b}Us4>*0n=a4iv+{hFYOtK6=OIFOu#G$;x*W~D+UH!km6vc#Zlb7O9Uj6^_Qg46z zycCC$Z@yGN;L`=)hh(&$WHk5?lMgew&qQUSx!;9L$!7XifT{MMVHH_H{uOh-z~m>H za6`B@&seC@*LnH-O#YC`*O>e^lOs(2n8`Pp{1KCG3@MOaOq;%Wj%csYUbBEYXh5|^ zs+FuWw9b|a$??5n5+uL@QBOEx9-g<+L=!WVTQT(5gTC7^oR~Zdu}3(ZzGrRsd%AnO zyE<2Qc6J`cPFvps7&58%+>$2+s#{hg2D*x%K-y9qv?^_{)= zAIAX4yU^gi{yqKBTkkHuGEu~t@n;7w;LP~DuT0z-Ix&dc(`O3kTAm%OyQy&Gr=T%d zScuY)3-F;N zlF{vxNh>vk=lv}*8OIt=l0CW_$|A!|YUqHs;=%SFc%zYs+1 zorzT!fhDKXN~YbulveWe6+pC6-JV!B&OM9L=Sq|# zn*z1j4xVAzK_;5;ZOr{BlVQxi8Q9L?Qty8UXAU=keWl=B)>AvZF~^v(`cjo^KxRc7 zeGep|9wnoi$~vc~hGnAie`% z-++d<>`eC!Y{pNTj%rx`^sU9?`#oLGQKo?kyn!VDfuG1g=BaunG`9?nC%6 z=Nf0xLh($2$G3CvwY>Ex#fh8AK|}RYC4~I0QiS6yFEy?{i3fr_5(SOc%EesrkU{Vi z@6Z>MmLj`iaiaQ2UM|*~rNjC_lZwzfmc>yp20~mt`}*4D6v%>0jU3-&rO+AFaNqhN}LKRJi+S4iUCZKXYhdFDfkQi?Q@HOc1eFI!s zj14YnkCWGow_vW2W{Z46I(`<-D5msm^Yepgq$^_7v?0PijO8C4IyQK0=osQwaZZn- z_VFETd^t>y)3#)KjW&$IP}Z_V1`%;|oceYOuEngLK7HB;`C|j}^Y-sg4RU*rolUKA z`|Tq_3;T;NkCqFSCuXOvzxZU~*$b}~jumegDleScug;C~Q;!nTS*yxU;j6_@9+&)M zrM3$+_+nZYUtveoogHxVBo{gtOo$4TIFM1HWPX;urXiqGJFX8kU!v%wXRlw1BaT>P2T#?}KPu z5?uyzYUhGal3~zfVm4&irRm4*RLB{2WBfENF_=;Y!s2ipSgt{}0GA9Plj#ihX`0K- zDhxNOh2SE#3@{B7GtS0?VcDLCS*F^P){vmptbxP&6s^W!SH`X3X;`EA-Bph-+pUx5 z?0wg|d+Xf29(S+T-COVOAwo@u(9x57*}DsybEmwzcn~Aiv2=G4jD{Gu_3rM5WTa>? z*X`yn%OKPZRN|~Fa_|a*82mg>HNZFIj%x1}Am&YqhBKnqo!;058I{J$M#@ zq;;_ixq|g5DTp%38EBhuZGK;JsNfL{B#Fj|*H z-yBXEsMdqysNT;PQqCecp3o&*q?uA^rn9W$ro}QK0tQbp`3=?~dU5v}It=)UOU0SR zNA+j+s3wH_Xpc47%OA{)2Bgd7#)I6JOrlnVT4o=Rb)3U{Gmr zL^+)bh>k-uqKkc7&?CM8Gl5~qy9PRk@4!qTa#xqQ3z-WKn#&D(5Zq;Ok3GrITTwfN z;*M$8wGJo>u!{vmNMThvrs0tBaqfWT83H(CN>TaTQJ3y_hqfR`ndpa(0~w-UUAPua z#Uu|WlOrJaM#;&KvUZ$1W1b6X&SR@_*lteMic5M@nUjb0paNdHN)5WVue#Ol9T)3$wGq)|aE zvY8G)83P^Jkg+5|dwIqS%=qW9|z~{(y<-;RfW)oktpJz8jv)XGD?Y zSwyjgCSFFFNS(G_$eCxvkjgn{Qq<2v??f>xAvOrlgb#t}Z3WVQiB#bLhUO3{&yTCF z^>#6|40&E7W**mTVd`IvK(rnTDPI5kP}}Ti+tGrBAbpHwt9bbwldDL??3V4A<}|wi zw_G4S1AQlFBy%S1yEtSbEr-97hS{kE6rX}SOr%v4y13Dbn;v3Wj`e+rM$u5nk6Ofv zQb;wog*okV;YJEDB7+GrQZBPCxWGs}l;Wu|S3#8w6Ep|ecN-pMj<)?^2NEshbXB{M z_2nJx(80VmzDJ8qCr6Jbz50A;7aw|Oou`sIyIJSsOc(?$o6|)*0QJ{dNX6F_<+q^`ps*7(Tp;xo?qr1C%b9V=x-rc>vvuksfjN5FIDk0*hAK!=5+=PJ7ustSXQyRDnv7Kvf0Z!=hEB;KbgIsbfdBLy5$Z zpUOYz4`^o+pydzL(ma1;{N}xJ;_Jz{Sp5E6!k;n1`3;7*2m)XW(9J+F5D{nwbp+c8 z*v34AM8hv&@THsf7ZT73Y!ld+=l_zw^~uOK0zHDd|IX-+NMJob zpu$H8f5HVE~Go_(obEetVvhP!;~A5O766hZme!_%o%b7 zvU25k<4fB9jT2n^M+oQ%C9mfZ9lSvJ*!qw<8Cqx3P|0-HnldP?(Hf#@r1+0$P4^On zpTt7+=W_%Yiqrnbu%|=+6+s+jdljm-$TrHn)jKD}y;Y%1_D&YiWz&VnSmd?lbs_liQ>uyq_e7Cea`nKvE=a}` z3{Sm==zM4qJwnBOrB%_te4v9o7q-mvKj1JN;Duzz@)y zbVQe~4CEx7Bq!(G+xpmw(!KY)44M(*dW6%A5E#HCVgM|JB7jHSwBQZN5O@I3Ensb! z1L%EV>kTjQehBxy4W}_ch)&g_Osq&nA#6?VtFlzulBv?V6t@B;9R7{F_Qp9GFRL5MmRV#y`Skju&B_L>`$cz=L_h9UIYH*jbg* z2O*D(spjn0E)|lV@wCe6D(tyjQp`)QL`sdYe6LKhIa)Q;pw-eURTx^;wFSIuJZ?L!nyiut!`E+qm^PK=7Wx1DaTIopW}_4|81Pc=Lx(+AF8*8tZzUZ xGnK`$Z-A+de`33My2OSGC1W9{>c{s#_GS}J94r*83V!H<7)P|jZrEw>1YdlE+V=ne literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/sandbox.py b/PythonEnv/2.7/Lib/site-packages/setuptools/sandbox.py new file mode 100644 index 0000000000..29fc07b8d9 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/sandbox.py @@ -0,0 +1,324 @@ +import os, sys, tempfile, operator, pkg_resources +if os.name == "java": + import org.python.modules.posix.PosixModule as _os +else: + _os = sys.modules[os.name] +try: + _file = file +except NameError: + _file = None +_open = open +from distutils.errors import DistutilsError +from pkg_resources import working_set + +from setuptools.compat import builtins, execfile, reduce + +__all__ = [ + "AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup", +] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +def run_setup(setup_script, args): + """Run a distutils setup script, sandboxed in its directory""" + old_dir = os.getcwd() + save_argv = sys.argv[:] + save_path = sys.path[:] + setup_dir = os.path.abspath(os.path.dirname(setup_script)) + temp_dir = os.path.join(setup_dir,'temp') + if not os.path.isdir(temp_dir): os.makedirs(temp_dir) + save_tmp = tempfile.tempdir + save_modules = sys.modules.copy() + pr_state = pkg_resources.__getstate__() + try: + tempfile.tempdir = temp_dir + os.chdir(setup_dir) + try: + sys.argv[:] = [setup_script]+list(args) + sys.path.insert(0, setup_dir) + # reset to include setup dir, w/clean callback list + working_set.__init__() + working_set.callbacks.append(lambda dist:dist.activate()) + DirectorySandbox(setup_dir).run( + lambda: execfile( + "setup.py", + {'__file__':setup_script, '__name__':'__main__'} + ) + ) + except SystemExit: + v = sys.exc_info()[1] + if v.args and v.args[0]: + raise + # Normal exit, just return + finally: + pkg_resources.__setstate__(pr_state) + sys.modules.update(save_modules) + # remove any modules imported within the sandbox + del_modules = [ + mod_name for mod_name in sys.modules + if mod_name not in save_modules + # exclude any encodings modules. See #285 + and not mod_name.startswith('encodings.') + ] + list(map(sys.modules.__delitem__, del_modules)) + os.chdir(old_dir) + sys.path[:] = save_path + sys.argv[:] = save_argv + tempfile.tempdir = save_tmp + + + +class AbstractSandbox: + """Wrap 'os' module and 'open()' builtin for virtualizing setup scripts""" + + _active = False + + def __init__(self): + self._attrs = [ + name for name in dir(_os) + if not name.startswith('_') and hasattr(self,name) + ] + + def _copy(self, source): + for name in self._attrs: + setattr(os, name, getattr(source,name)) + + def run(self, func): + """Run 'func' under os sandboxing""" + try: + self._copy(self) + if _file: + builtins.file = self._file + builtins.open = self._open + self._active = True + return func() + finally: + self._active = False + if _file: + builtins.file = _file + builtins.open = _open + self._copy(_os) + + def _mk_dual_path_wrapper(name): + original = getattr(_os,name) + def wrap(self,src,dst,*args,**kw): + if self._active: + src,dst = self._remap_pair(name,src,dst,*args,**kw) + return original(src,dst,*args,**kw) + return wrap + + for name in ["rename", "link", "symlink"]: + if hasattr(_os,name): locals()[name] = _mk_dual_path_wrapper(name) + + + def _mk_single_path_wrapper(name, original=None): + original = original or getattr(_os,name) + def wrap(self,path,*args,**kw): + if self._active: + path = self._remap_input(name,path,*args,**kw) + return original(path,*args,**kw) + return wrap + + if _file: + _file = _mk_single_path_wrapper('file', _file) + _open = _mk_single_path_wrapper('open', _open) + for name in [ + "stat", "listdir", "chdir", "open", "chmod", "chown", "mkdir", + "remove", "unlink", "rmdir", "utime", "lchown", "chroot", "lstat", + "startfile", "mkfifo", "mknod", "pathconf", "access" + ]: + if hasattr(_os,name): locals()[name] = _mk_single_path_wrapper(name) + + def _mk_single_with_return(name): + original = getattr(_os,name) + def wrap(self,path,*args,**kw): + if self._active: + path = self._remap_input(name,path,*args,**kw) + return self._remap_output(name, original(path,*args,**kw)) + return original(path,*args,**kw) + return wrap + + for name in ['readlink', 'tempnam']: + if hasattr(_os,name): locals()[name] = _mk_single_with_return(name) + + def _mk_query(name): + original = getattr(_os,name) + def wrap(self,*args,**kw): + retval = original(*args,**kw) + if self._active: + return self._remap_output(name, retval) + return retval + return wrap + + for name in ['getcwd', 'tmpnam']: + if hasattr(_os,name): locals()[name] = _mk_query(name) + + def _validate_path(self,path): + """Called to remap or validate any path, whether input or output""" + return path + + def _remap_input(self,operation,path,*args,**kw): + """Called for path inputs""" + return self._validate_path(path) + + def _remap_output(self,operation,path): + """Called for path outputs""" + return self._validate_path(path) + + def _remap_pair(self,operation,src,dst,*args,**kw): + """Called for path pairs like rename, link, and symlink operations""" + return ( + self._remap_input(operation+'-from',src,*args,**kw), + self._remap_input(operation+'-to',dst,*args,**kw) + ) + + +if hasattr(os, 'devnull'): + _EXCEPTIONS = [os.devnull,] +else: + _EXCEPTIONS = [] + +try: + from win32com.client.gencache import GetGeneratePath + _EXCEPTIONS.append(GetGeneratePath()) + del GetGeneratePath +except ImportError: + # it appears pywin32 is not installed, so no need to exclude. + pass + +class DirectorySandbox(AbstractSandbox): + """Restrict operations to a single subdirectory - pseudo-chroot""" + + write_ops = dict.fromkeys([ + "open", "chmod", "chown", "mkdir", "remove", "unlink", "rmdir", + "utime", "lchown", "chroot", "mkfifo", "mknod", "tempnam", + ]) + + def __init__(self, sandbox, exceptions=_EXCEPTIONS): + self._sandbox = os.path.normcase(os.path.realpath(sandbox)) + self._prefix = os.path.join(self._sandbox,'') + self._exceptions = [os.path.normcase(os.path.realpath(path)) for path in exceptions] + AbstractSandbox.__init__(self) + + def _violation(self, operation, *args, **kw): + raise SandboxViolation(operation, args, kw) + + if _file: + def _file(self, path, mode='r', *args, **kw): + if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): + self._violation("file", path, mode, *args, **kw) + return _file(path,mode,*args,**kw) + + def _open(self, path, mode='r', *args, **kw): + if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): + self._violation("open", path, mode, *args, **kw) + return _open(path,mode,*args,**kw) + + def tmpnam(self): + self._violation("tmpnam") + + def _ok(self,path): + active = self._active + try: + self._active = False + realpath = os.path.normcase(os.path.realpath(path)) + if (self._exempted(realpath) or realpath == self._sandbox + or realpath.startswith(self._prefix)): + return True + finally: + self._active = active + + def _exempted(self, filepath): + exception_matches = map(filepath.startswith, self._exceptions) + return True in exception_matches + + def _remap_input(self,operation,path,*args,**kw): + """Called for path inputs""" + if operation in self.write_ops and not self._ok(path): + self._violation(operation, os.path.realpath(path), *args, **kw) + return path + + def _remap_pair(self,operation,src,dst,*args,**kw): + """Called for path pairs like rename, link, and symlink operations""" + if not self._ok(src) or not self._ok(dst): + self._violation(operation, src, dst, *args, **kw) + return (src,dst) + + def open(self, file, flags, mode=0x1FF, *args, **kw): # 0777 + """Called for low-level os.open()""" + if flags & WRITE_FLAGS and not self._ok(file): + self._violation("os.open", file, flags, mode, *args, **kw) + return _os.open(file,flags,mode, *args, **kw) + +WRITE_FLAGS = reduce( + operator.or_, [getattr(_os, a, 0) for a in + "O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARY".split()] +) + +class SandboxViolation(DistutilsError): + """A setup script attempted to modify the filesystem outside the sandbox""" + + def __str__(self): + return """SandboxViolation: %s%r %s + +The package setup script has attempted to modify files on your system +that are not within the EasyInstall build area, and has been aborted. + +This package cannot be safely installed by EasyInstall, and may not +support alternate installation locations even if you run its setup +script by hand. Please inform the package's author and the EasyInstall +maintainers to find out if a fix or workaround is available.""" % self.args + + + + + + + + + + + + + + + + + + + + + + + + + + + +# diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/sandbox.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/sandbox.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc7e2f82b5a794215b57653abb16804ded802052 GIT binary patch literal 13316 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/script template.py b/PythonEnv/2.7/Lib/site-packages/setuptools/script template.py new file mode 100644 index 0000000000..8dd5d51001 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/script template.py @@ -0,0 +1,4 @@ +# EASY-INSTALL-SCRIPT: %(spec)r,%(script_name)r +__requires__ = """%(spec)r""" +import pkg_resources +pkg_resources.run_script("""%(spec)r""", """%(script_name)r""") diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/script template.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/script template.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7c08b95038cd28fb8e668935688ab621bb46a4c GIT binary patch literal 314 zcmYk1!Ab)$5QZnaB2rp>1ux3>&>ngzh=_vTM3f$c5(vASaT~jvjhTtiv#;tK_y9Uv z1s%wrf4<2~nEZ1xs%9ULHT*^{_mvzv6R`kmQ3W=GR>4{UDtO5TZgY6gKuKX$91QP| zL{19|SWlz-lDMbiA5=#d*!Z%;X)K2MJQgt~;%jmd$rzpp2-`*w^(od!JQ5OQ<#_=Xq`pNn0_Bo>c=PKv*4OXeq4?EuU{?@= 3.3 + stream, path, descr = imp.find_module('site',[item]) + except ImportError: + continue + if stream is None: + continue + try: + # This should actually reload the current module + imp.load_module('site',stream,path,descr) + finally: + stream.close() + break + else: + raise ImportError("Couldn't find the real 'site' module") + + #print "loaded", __file__ + + known_paths = dict([(makepath(item)[1],1) for item in sys.path]) # 2.2 comp + + oldpos = getattr(sys,'__egginsert',0) # save old insertion position + sys.__egginsert = 0 # and reset the current one + + for item in PYTHONPATH: + addsitedir(item) + + sys.__egginsert += oldpos # restore effective old position + + d,nd = makepath(stdpath[0]) + insert_at = None + new_path = [] + + for item in sys.path: + p,np = makepath(item) + + if np==nd and insert_at is None: + # We've hit the first 'system' path entry, so added entries go here + insert_at = len(new_path) + + if np in known_paths or insert_at is None: + new_path.append(item) + else: + # new path after the insert point, back-insert it + new_path.insert(insert_at, item) + insert_at += 1 + + sys.path[:] = new_path + +if __name__=='site': + __boot() + del __boot + + + + + + + + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/site-patch.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/site-patch.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40d668d4ca922c3c3c091653f28623fcca1e6627 GIT binary patch literal 1839 zcmcgs&2A$_5Uy@J{)?SB&Sps>B%)|Vd`S-B5D6i~YO_+1*buxcIe<6A*weAc9?y(t zI-3M}4iJucf<5yBDRjn(MVIWO@`=(NPSHdB0|&iW)7hOum+=y^#m*Z6;Mb5MnII^ z+ln#)<8#gSRM9X;!#rc%z^iGhIcrp+^pvJV!vc9ZDekhXnz+;lqNcFH`(aTaO7mn} z<{U3iK6vIR%Lzn<>>>xFzxu%{GGA_P4Qjeis>7+tI01k zdBg2ag(!}gDC!o4Xql2t1$($e-h#MFG%ek^UMtwc<+)3pOkOL1UGLqAQ>P4+%kykt z_Z8h}>VSKNvPH_O)D9m|-mcK7LdluJhuJ7PomS>TB@;O!`gT*Gq#C?aG+m{eJgGJm z#lf&4!#h0zLK}#lwDP?oyUL=n+7+nqE~{W4aP#QYE7Atmxu!Eslb;ngU!%Fu=(8+B zqj{0uS);3U*81=zS_90(IgFb8rP`>FAFk1Ki4HU(xdtX*rVW60a37W_t8-J?iVV3y zSGV`9zWWa=j$Wk<0QlDBe%$IQT9T`i+-jaU+6CDanH|DvG%8T~<6B`rX~YcQxu^I{ z_TaxFN17Bv7U=*WlV`e(=$S}O)Op^l;HDq@f8%4>Jo)m)(dWk}k6#?w1#B<<@PmCQ zOBB0y;P~S>N~}qop4%H3o5y+TTa!M5@g%wkyl}^Eo%^A;Wd~*}F>bK6!vQ;68j#68c*B+M^+k~(DBnl<0Z>-cmjzVKg z2#f>Qo=3@8c&BmTTgl<%)Wl*V$F(+*JOSl;feFRw`AO)GXIPGN?gz$kgev#r%=pVb zh}`=<13(lx|5U_znk0~jwd(~@I@8GWdsaA(-I3wKEmltSc0G>;LUCKbnH$F@^u(Nr z)8v1o7Q?mJ-@=;76a$m>Nv$WXaLD+YaTptrW2tyIF@a>}CTTIG>{E*oja$pS=X}qk zy+nE$h0$f`h;|Yg1zwDS@c2BL4oLF<PRe1!Vxs)7>SzSNu9GdP$zjJbJ2T}MmeAU_CJLr7ocRQ@pZtV6(Zr`LGNP7|6 zC<KyEC1q<(j z%IQtLs1|fJzmJSEB9`>Beh5!N*HuHWW4EsAxjN2UduTJ@>ist?S1@(;A literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/ssl_support.py b/PythonEnv/2.7/Lib/site-packages/setuptools/ssl_support.py new file mode 100644 index 0000000000..f8a780a95b --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/ssl_support.py @@ -0,0 +1,255 @@ +import sys, os, socket, atexit, re +import pkg_resources +from pkg_resources import ResolutionError, ExtractionError +from setuptools.compat import urllib2 + +try: + import ssl +except ImportError: + ssl = None + +__all__ = [ + 'VerifyingHTTPSHandler', 'find_ca_bundle', 'is_available', 'cert_paths', + 'opener_for' +] + +cert_paths = """ +/etc/pki/tls/certs/ca-bundle.crt +/etc/ssl/certs/ca-certificates.crt +/usr/share/ssl/certs/ca-bundle.crt +/usr/local/share/certs/ca-root.crt +/etc/ssl/cert.pem +/System/Library/OpenSSL/certs/cert.pem +""".strip().split() + + +HTTPSHandler = HTTPSConnection = object + +for what, where in ( + ('HTTPSHandler', ['urllib2','urllib.request']), + ('HTTPSConnection', ['httplib', 'http.client']), +): + for module in where: + try: + exec("from %s import %s" % (module, what)) + except ImportError: + pass + +is_available = ssl is not None and object not in (HTTPSHandler, HTTPSConnection) + + + + + +try: + from socket import create_connection +except ImportError: + _GLOBAL_DEFAULT_TIMEOUT = getattr(socket, '_GLOBAL_DEFAULT_TIMEOUT', object()) + def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, + source_address=None): + """Connect to *address* and return the socket object. + + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :func:`getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + """ + host, port = address + err = None + for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + if timeout is not _GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(timeout) + if source_address: + sock.bind(source_address) + sock.connect(sa) + return sock + + except error: + err = True + if sock is not None: + sock.close() + if err: + raise + else: + raise error("getaddrinfo returns an empty list") + + +try: + from ssl import CertificateError, match_hostname +except ImportError: + class CertificateError(ValueError): + pass + + def _dnsname_to_pat(dn, max_wildcards=1): + pats = [] + for frag in dn.split(r'.'): + if frag.count('*') > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survery of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + if frag == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + else: + # Otherwise, '*' matches any dotless fragment. + frag = re.escape(frag) + pats.append(frag.replace(r'\*', '[^.]*')) + return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 rules + are mostly followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_to_pat(value).match(hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_to_pat(value).match(hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + + + + + + + + + + + + + + + + + + + + + + + +class VerifyingHTTPSHandler(HTTPSHandler): + """Simple verifying handler: no auth, subclasses, timeouts, etc.""" + + def __init__(self, ca_bundle): + self.ca_bundle = ca_bundle + HTTPSHandler.__init__(self) + + def https_open(self, req): + return self.do_open( + lambda host, **kw: VerifyingHTTPSConn(host, self.ca_bundle, **kw), req + ) + + +class VerifyingHTTPSConn(HTTPSConnection): + """Simple verifying connection: no auth, subclasses, timeouts, etc.""" + def __init__(self, host, ca_bundle, **kw): + HTTPSConnection.__init__(self, host, **kw) + self.ca_bundle = ca_bundle + + def connect(self): + sock = create_connection( + (self.host, self.port), getattr(self,'source_address',None) + ) + self.sock = ssl.wrap_socket( + sock, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca_bundle + ) + try: + match_hostname(self.sock.getpeercert(), self.host) + except CertificateError: + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + +def opener_for(ca_bundle=None): + """Get a urlopen() replacement that uses ca_bundle for verification""" + return urllib2.build_opener( + VerifyingHTTPSHandler(ca_bundle or find_ca_bundle()) + ).open + + + +_wincerts = None + +def get_win_certfile(): + global _wincerts + if _wincerts is not None: + return _wincerts.name + + try: + from wincertstore import CertFile + except ImportError: + return None + + class MyCertFile(CertFile): + def __init__(self, stores=(), certs=()): + CertFile.__init__(self) + for store in stores: + self.addstore(store) + self.addcerts(certs) + atexit.register(self.close) + + _wincerts = MyCertFile(stores=['CA', 'ROOT']) + return _wincerts.name + + +def find_ca_bundle(): + """Return an existing CA bundle path, or None""" + if os.name=='nt': + return get_win_certfile() + else: + for cert_path in cert_paths: + if os.path.isfile(cert_path): + return cert_path + try: + return pkg_resources.resource_filename('certifi', 'cacert.pem') + except (ImportError, ResolutionError, ExtractionError): + return None + + + + + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/ssl_support.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/ssl_support.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e049d5332aef92b162e4458059fd3017e37c412 GIT binary patch literal 9114 zcmc&(O>7)Tc78oG9Fa6>{gIUQXZP+(@rbcWM{ux)*1Iv6q;2iWl-xs^+F5Ex&FLC) z$e!+DSC7O2$ctrcyoX$J337>n?0u0Ok{p5@0tCn@NUk|#FWFmw%^}ACNxtt@&ycc> zMUVqSuxhHRt6sf&|MjZ;AJdb6zxk_=TT=X;!S8!0_CZM`!oMf6NMqFYq~Q(6OVTI} z+hu8#hwX|qD#P}eG{&@Dl6XwIRcTbEdqx^(#3S^w#N*PPkj8{~gLA`0lhT-!jpUM4 z%uBL2DcK*1=XpQ{!-*%4B7g_fszhfb8kcQsGA+@B?7l3|MRw1!Zk!WyUMh_X(zqxG zU5O?odP$-w*)B;NXk)?45}hr&7+HDzfo$SPGt!uqgLlNtV(2Yt%*kL*B0!rHGsC5G zK&0|;W8d?J=)DE(JoF!-Z0!G9HViiNWN$*!bq`pW3t}#E=^jpgNd_}|(DM?Pr2C3A zUJ-92`Q6cB|CG?oWih}K3(xa3&q3cSVy+NubWuJ7p06k=1{eYzXC$7K?p0}AmF_iZ zTqDGHM-cy$5TjW!*QJg1bMhG=iu?$(qe~LKBA0SsZt^Zs)UTe`2yud(cU?KU`mbQ2#JYqS$2l%lOjnBvG>! zHn;j5%cn5ZvCZ&l*ong}3`}C6g}KdMnD1EarahCGtl3U8`*-*{xoGm%VsEdrn8$XJ zb5VzHI)DqUEO!&EjgLQaR;S%*g}JeAO5bLSb|=it;tLZ`LgAD+ZG~|$akN#IrukPl zTIiYXya#gIm#~EGg;v}#Np8=h-_Fvmf7AM%ZVyaD%Q1oQbk!tvHykYP^gPXWjTVXqaKrke~{dh z-I5%ZIXokW<8nAb zg~IqDpj4=**>gFZlHD;KKh{xzE{#Sp3ou^NK9a^`UTKh`l5j-66BxiBLEm$-^v{>n& z`vr7BQ+jm6y&>rfVu1V$BY;bZPoDbN@b%YyKv$i8%g;?5Tixn@orJ_Gv{xMT7(fRC zDfSzvKnCvJN!n>4gup8C$&G;@cWk~^qq%@uiL9lG$*I>)M00*Pv0nT2`^!IU*4Km8 zrH=v{YPH7729+0u!_%ulD$bUVVWLrQ!EM&FzR{spoLW<(G11utjkI0xOx?qa4ALD) z9c_>>dD(&2U#MJ8yBW5jrS2s8py&4MWoe#5-(m8?1lEpntu{7PSUhzNA4Mx0q7~iQ z-0tK%{jJT7PO=oYGZUR?;hdW*W~;xw`CyRmz#%42H*YU|dlQC!({^(6W-n~*h1OmO?%^|X|$&FOSR;@ z@i{D8K6YZx9n)QO!@RZAB#n5);0A_TDEdd&{CyNl>KKF%o&1-SfW?;Iy^v&ZHf{FYZ=ACLH6ealDi8J zQ)Zul^)taEw$&i_xpO|4y1}{d6&m&KP84qG5+dJA`~n|Sg7aW>vj$%&vY_?6eFJR> zi{A~C0j+M-3bP2VJMmA%EdI(`-6x;!_?Be&@lO^W|F#lobAB{1?*^9K&w~4DIF08b z3sajrT}=B)uA-v4keOblrXcJgT8UImU}R|=jBSNbD28{K6^AX?Zl&E`2f-TIvYU1i z6`s2vtlbY*mzV0R>LV3Ql;l+TZg|ifoz3ZTm|JbMvvB)Z*iJ_gHK=MviB-|hQ^uM< z2AXyTl|c9AyxFlb>Z$U%@>%b?r!q()u&4}fgNKkLJ1hB6`kXj9!K75G2;wdS#zS@v z?oy6c9xrL|RM9v@<0neq+Z0bk9T2l!h?xp=W+;gDLgw_FxBs@_e*I>QbLN@mQ5SKkjD5546b;vjMspdgEaJ>Vn zyxX0jErGG+9G%9iSfOFxd2umLyP=CGxfly@^SgXvIwCGWo+2q2ae)Fg-bC!TL2!4g zfENsNf1c_w@7JIxk!ht7;sJPDSVOwv6CuLL&ms!1Yc#e1H`g-;aX^;WZry_B!Gap+ zYUhWBbRGdi@cy!Y`<>r;$IoCA?FbO=41O2(HXdNdI8L82e%b2h{@n*d*AHl%m88I? z)iS-@VdtL!e2rm$WovGm}~U5fKHx=FfN7@Rd#d+WZbhC}VUX~H>bneA_3;*ene z&CHKdW0ThrOOc|!fip!UiMZybRb%vqZ?FBv6*n^%%X}BJfF{gQmiDp^E-VNmhg&m5 zDv&A=_S+p3!)87+pm`g%Ejl(RYH=0$Pr|rwoZsXDAq2rY_*H|b2nTPn%Wtts)H(*Y zha=sv7tm7IXaLl1k%sC(hXl}0VN4UB#Db>893~N-eJ7A03wl6h0b81BwVWl-Sc$ zg1XYrFj8TlK~h@svW|-=ZZA)VNdbSyB?RtJ7{h+P1Ig%bwPIXS45ixz{Al5#zo534 zF#yXlL0&;c+kty4nBgv->eQLGs_R{MO*b#XzarNVjALC9^K_C5vK(AnG)vGZ83urHc z*HNiuZ8oE{)occofZ$_P4r??{lg0r>>=!7O@m>{LKT!$pq1i&wzyE{MzlViiQTpS{ z@BdEki5SJ1g@R{&R1j$jvoio?inNCqf~EjQ=tb=hc=>bGRm~CZLTA zh)%<0hW z$CcivaL!EhliH-|T0jHkY%QE(6Z&UWbCKnxm$Wq|9`*9;C{O#O8o+!*o@aq(1K+-3v4nqZUNC! zFRvS@SNMN%^>kVPh~o4fyl$bRF%`W-nO{IO5)Qh>^z=m~BD^+VrBuP=vUDr*GpyQ3 zENVpuSajo0+~$GKPb zm!Z7x^O{e`_R(P2Rje_h>?YambyP((s8|-8i~LldA&XG3#S@Yj{G|X}$`a7sRorN2 z4z4mzS$TX>vn|flYx2e0pTV^k0}v;@V0w@zh!Ka})fglj1~-&URTH%W$TZpVAL)UNf%ELl&-cK!MnBOmJYh0=qKpbP~?;}knzH=xEc^V7$TtxyO2OCNX_d#XqlsPA8w4Oj}uHiH1ock+g?kzCbRFpw9T+{VinUhNY#8L-2Au&=8Lwe#3KaBo+9 zH8_Aq@Zn;43E2%k*5Y}HS2dVleLSG*C%HOuG7QhFDv>QD3EeB_T5XEQ;k?ua&~gd7 ztd!SeEa9mpb}T8SslwjgHX;c33}ACc4#QrPb0`ZzOeiQ4s6aD9a8`>xp1bSg@v%aj z4)@j1{5voxxP2Dfp2iJ&9O?ZTBok{Itxz}Zzy>}1YG4v^J9B{nPf2C0`|jf_?Io*|W{E1n@$<5Irv z1t1_87qdNNi=5QRN@K3zyX-Q3;ymmIcI@a<2$k3FP>B+T&UCmlB$wKo z_smM9DyKo|7D0f#6m1ctMNyzA+CKHIPkku*Ui6>nThXTied$B``~AL|y-<{Gw5VuN zb9nBT@BV$~u>7BMGwZc~`|XCy|CRCk9elnWIF~rLiZpOZ$+ZHvij3t;Znae8%Wk!- zeA%_8TzlHBPP-uQS8=OHihf6n{FG}|U37b{ zIIaKxleHF1((b!bI~PpE-kz5=iCO)ew>wi&i!EZl1omEHJltaJnxcIV-2T= z4KKK4eyrilu;E3*cV+1;!Tu7GyQ$Co;zqZ>m~EwtmwlQIdRe#I@|PETapQixnKplg zfAuAx$Yn>6B;7`aK}#i8oI!G<>9axBZ29+lS+m=@+3$Dz*}3tC4_a}CCE9ATndZma zSGej}V-<}zce1qOF`xCHMb({d*Qei0`=eTR+!%BkQKOrrqb=S_<806$s|eGN2F-pd z$|KeB9M|#rkCBjmoNGCULY@!Y$ANnsxb2dA?A&(QWm9f@+HF?|y`=2+kWQ%yBscAn zirWiHz}X%KmRxq!ZC71##N98s{;qpma@#ZcJjqe^!T+G+*s!w1Bh&@sY#LdD*84f+ z;$AaSX*t`;vSX;}3ceeyc+(3LIf63w?%m&v`l;^@`VGv$nI1Mf*IxI;19FjX^qajb zdf1P9y|m9MmpEmJkNb6Q&}n8|F5`yoBC|4RW@$#a-{>}OHCw4w5ba$Lcwo&q+frt` z+w5qPn|JQq{$S zHCSJ}*X+F8+UTdrSZ=-9S-X+04>s36*v+;;dYuPruP^`F+MVY5n#W|d9729=MAvJA z=~@&uao{Lg?(JqLu@LsvB=yEE13C%Yv%v)yf(m}l1{caFf`y==IwXYgZ{hPdkbrJ7 z5K7>pf?|wNHi7Jt3m%=yDG1c`bLUp>fqL+NIOO{%tSoUx%@%?m`kloDjMZzk$ z(d_svZnf%5WC&rNYl@kL*haUXW~a~=34oE$y1gjg$kKi`!_B5yl5WIo!4fo2kRJHDSv+AN~rc?MUWEzg(A!KsqbdfH0?J<_Nbs@a9I?>qSX z*N~(T*^(HaAS2Dh4AfG|F$2Vwm6>+o$`a4p;BeAA@p~Pg|63%$eTHd7A0Da$RADnf z@?;>QLYU<82eJqPN5TiRvWMlM8$en6n<0#>86xR`W{4|mMtVT=(W2QV=cY_RiAU0% ztRFWr2wRd(C!2uJ3J*qx!I5H}Eyiv+0VPIVg zKmm;mPox$oL<3ha-nykG*zlj&z4>+^G761 z@bD7}Q+AW~glQZDI+CqFw0Rgfld8liZeg?UX|KPDZTX`}TyPFQ z7Xo35R5irZk5M>S*g#OVO0F$zNRU7yLC#2oz^Z|OpcKl*#IOxE&=J;V6}PR-!2bal2Md}}Vk&?Zu54S{xzJkR)1gLSm1&ZRDxhAr zZ?1LNOZM;NKp-Ak!1NDD1tzcgU|{&MfydYj3auDBD^V~f>XGhK-(l?x1;;GD$!g5< zMD=mbJlXR^QAHTc(#--4;9x3qZ({`YFpQ^MmXtg2^ z9zjW(i6S!>c(SrhpWW>bQWXnn*}bn~(?>n{fl!M@u`%fPQ4EO%*&*Rg=BPPz*eIeO z7eygA8dAmx(n+(=%}9@$3MBAw5EGzpvLC19;6pLzNkNp8xo`g=ik<@AB;@JRd|*H4 zAT6mI&j;sOSGs`uGsvGtdPXJoJBOApBQ@iW7>$GsXd!B^sL)zbcn!tyH<-N33>iKG=dQw!wpiI9jx^AF@{?Uf{4nF?@lJs-CF%XrXpfg0w zv@#Gs6=k66k0?{6t3#MIxCB44(sg{^BY`f0Z3qQp-Y~RIBzHN1%{Vny37Y~n3a6Of zfF+U4xJ}d?%f*;~Z91_=!Nb8wVmDn2g^mltd!*(P_9l{@HVQZWXW`oma zaS$HduCV+vGBhS|gaR)>C8B3AETC+tjD-~rsv8LE$mSwSQHV|>4N0ltm)M}N6G=D^ ze;h7A3cEXJs@-1tC)lJX0^I@7_!X)R8VCr{E6S}F3k}KUGD8g1TxfRGibW3UTh4hz zrq6H^5PHEplMT~ayrT4odtwb~_{kAiU}Qaf{sr>j7Wik+wl538Fiq7^4}XX>Tw_A< zECw-~oS4o|AW3%`twEAP2PxPrH5%d~z=c0z5;2LHtTQ2#94;wHKSJx=w0(bI+x`Xi zrBJI2P6n5ta2D|Mk`&KEaLL@~35NN53>YU7=1o4jK)8XmhAR9wBW!w{1W*fMTre83 z@U%hsv=e0ZzZoj#CArsy5rqrItuhsI92%Zz2N~LkF|{{4!toaaakp(VIsX0*d-N1G zu0%uuY50a(j6{5$J?Q@LpZiNo#%yXM>^P}6*@8ykpm)=)NP zdIh-=_(M>LnVtvn%;5r@?mq3aNlx+qfa*MAaS8TT4sFsFjdDSIgCnWXi(42;QL`VC z!e)S-kW)A5zZ^^qP%!E<2J8p4WR--DpiRkR@gEAEkQ87th#(&e6Ht;JhLWa*CGfU; z+3r80kOQ?EECtmO3763#p#BRo1em388DTd`H5D2MRRUX4exl>hi5+i|axaG16sGU@ zucg`pr;tLLoMNP-#@AA$VCXFB5hD_@Efv61to*-(AYA}f#CN_ramxzp&uCAG1KCJHekH$ znrKF+l6&JR!#}GFW|{u%Sw5=^W`S;k#R9TCV5`{Sc(X`=K1V&HPDVhuhzCb@Pimoi znG#<`2h&Nv!(0uC8KGZikt|}SrWF*U!duCoo_ya8d zQ+$f*!k0Z(Emu!f=it#+s&jG(@@xIO0L=k+bM*bw|ASKt7nW*w$Zs_IB{}~anV|~{ zc0q&>>_-;Y%idd$$D1(jPQl9}U-ACm5a zDRfhBIM*i`VSxjTs3JQd5;(66;)Gu+dLOmk=Us9^y)n}QrYR*C-5besF2U20=eZ9~ z11I_g@?-P-YgjbGa|i0sR&%`{_nV+8Vjm@JT^1pJzlIP0;r&zB z+_-o9J&W5tKvXkc$4wE3V6LXOcM!?LW;=Wib$Y;2tL3-zH6G;>t0}{IHcTpcBsijV zxnUN?PuPjdVSI5#RziX}yvs!P2xro+6bPI~=@!nOhTN!x*`X>p37h}GR{RS{7(J*2 z<=`dUPn|23QK|-WrAwt*L=$F5rV6nkhTB4h41^Pc?C~FgAy6<_2<$aYZrcmWj4Zg( zjle;D!3Nf=FfK3_9H=>YQz;cf6xPEfq~Sv*SlArZ@b{53Q(N`~As+q#lRrcvrIR~0 z(fV$bzk>*e8s$*oFL6l~a>Jfy_!1PF`8mSG%jHUt-|AA+k!S?@%g78N&rET#yO8^# zurLb1(PXcOpCBF6rK~hvIzZ0iJLYiVz0Ki*gr*=t@~&}jv(?OYj}t7U04K0W_VWls zfcz5*29W$x2gG9+B4u}N4S zkM66*>rB*E$7|s|p$eA|qrj+Dfx)osY;G)x8|PeRd=4uLZyyQ)NkXZ^w*q_MbK&nI z8Cn3Oe`*x7bRHdGorFJO|NX{5_z1Nk5y`Em*ekmJFdDpq{xXnA;BbGi(}7`4ER z2}Q38fyiz8F@}b}$3$V+9p+?#NXhYFqU%Bn=4AW@pkD@-DeAxL)0~9;WfCv%ZRIxU zYLJ(L_A?(WOo?=PrlA=^H_=EJCIbzSfIcoQ`NA043xdLHmMuXutR7PHne&O!_HN9= z5(Jx6;tF2IrtO z*>V?P`VgcjvdL76DG#U=T}h7LQqg0R2jIyDwHo(>$A@@8{uborGK+p$Wlzbnug0vSL95kLp+QxL!~W$t}Zq}0Pd=R^c8G}1V@ zg_M2p4gU=N?3$3no`B-(hXKXHx5&XJDBdRQ%(u8O4moOlLGFjhjFYi>w=hw3sZ=5$ zb)ounO13w4k717(al^o|7n#yV#9Izq>a-zj6`?SCCtKCpGOLGF?a!ccSQ0vNg5_aM zVUf^Bh|n7c5w<;f55arHLmDX1LuJ;D{7G9!9WwGqACW|#>SKV!0nbJY)q{SY;JQc&}sL(Ev90oyk` zJOS;m9|p9~5lVnIt~EAV%?AG-CHEcfjRZ*rQK0;SisUyGBz#u|5bptepnS$cKShL? zRW33g(~D0dP!VMKG8T9OPTx2TIMFj8oa$XkiVsJU;xy=Qzj^gb^bY@m$zL-0D<*%< z~JPmKISFzQcr}0ee=x%vt8yU>tV%E((;9r^-TGYy?)ikyb*iLxF zXn(vxB{bH=3G6`hL%F(;Q>td_Spl9sZu?vgEH1Zcm)YTk8( zG*AV`!@{99_AQgyZxe?4`=*Mbva`5=WOVi%e(ML1S!Q7ZAYXzZeSBecp|KGD56em_ A!vFvP literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/doctest.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/doctest.py new file mode 100644 index 0000000000..35d588d074 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/doctest.py @@ -0,0 +1,2683 @@ +# Module doctest. +# Released to the public domain 16-Jan-2001, by Tim Peters (tim@python.org). +# Major enhancements and refactoring by: +# Jim Fulton +# Edward Loper + +# Provided as-is; use at your own risk; no warranty; no promises; enjoy! + +try: + basestring +except NameError: + basestring = str + +try: + enumerate +except NameError: + def enumerate(seq): + return zip(range(len(seq)),seq) + +r"""Module doctest -- a framework for running examples in docstrings. + +In simplest use, end each module M to be tested with: + +def _test(): + import doctest + doctest.testmod() + +if __name__ == "__main__": + _test() + +Then running the module as a script will cause the examples in the +docstrings to get executed and verified: + +python M.py + +This won't display anything unless an example fails, in which case the +failing example(s) and the cause(s) of the failure(s) are printed to stdout +(why not stderr? because stderr is a lame hack <0.2 wink>), and the final +line of output is "Test failed.". + +Run it with the -v switch instead: + +python M.py -v + +and a detailed report of all examples tried is printed to stdout, along +with assorted summaries at the end. + +You can force verbose mode by passing "verbose=True" to testmod, or prohibit +it by passing "verbose=False". In either of those cases, sys.argv is not +examined by testmod. + +There are a variety of other ways to run doctests, including integration +with the unittest framework, and support for running non-Python text +files containing doctests. There are also many ways to override parts +of doctest's default behaviors. See the Library Reference Manual for +details. +""" + +__docformat__ = 'reStructuredText en' + +__all__ = [ + # 0, Option Flags + 'register_optionflag', + 'DONT_ACCEPT_TRUE_FOR_1', + 'DONT_ACCEPT_BLANKLINE', + 'NORMALIZE_WHITESPACE', + 'ELLIPSIS', + 'IGNORE_EXCEPTION_DETAIL', + 'COMPARISON_FLAGS', + 'REPORT_UDIFF', + 'REPORT_CDIFF', + 'REPORT_NDIFF', + 'REPORT_ONLY_FIRST_FAILURE', + 'REPORTING_FLAGS', + # 1. Utility Functions + 'is_private', + # 2. Example & DocTest + 'Example', + 'DocTest', + # 3. Doctest Parser + 'DocTestParser', + # 4. Doctest Finder + 'DocTestFinder', + # 5. Doctest Runner + 'DocTestRunner', + 'OutputChecker', + 'DocTestFailure', + 'UnexpectedException', + 'DebugRunner', + # 6. Test Functions + 'testmod', + 'testfile', + 'run_docstring_examples', + # 7. Tester + 'Tester', + # 8. Unittest Support + 'DocTestSuite', + 'DocFileSuite', + 'set_unittest_reportflags', + # 9. Debugging Support + 'script_from_examples', + 'testsource', + 'debug_src', + 'debug', +] + +import __future__ + +import sys, traceback, inspect, linecache, os, re, types +import unittest, difflib, pdb, tempfile +import warnings +from setuptools.compat import StringIO, execfile, exec_, func_code, im_func + +# Don't whine about the deprecated is_private function in this +# module's tests. +warnings.filterwarnings("ignore", "is_private", DeprecationWarning, + __name__, 0) + +# There are 4 basic classes: +# - Example: a pair, plus an intra-docstring line number. +# - DocTest: a collection of examples, parsed from a docstring, plus +# info about where the docstring came from (name, filename, lineno). +# - DocTestFinder: extracts DocTests from a given object's docstring and +# its contained objects' docstrings. +# - DocTestRunner: runs DocTest cases, and accumulates statistics. +# +# So the basic picture is: +# +# list of: +# +------+ +---------+ +-------+ +# |object| --DocTestFinder-> | DocTest | --DocTestRunner-> |results| +# +------+ +---------+ +-------+ +# | Example | +# | ... | +# | Example | +# +---------+ + +# Option constants. + +OPTIONFLAGS_BY_NAME = {} +def register_optionflag(name): + flag = 1 << len(OPTIONFLAGS_BY_NAME) + OPTIONFLAGS_BY_NAME[name] = flag + return flag + +DONT_ACCEPT_TRUE_FOR_1 = register_optionflag('DONT_ACCEPT_TRUE_FOR_1') +DONT_ACCEPT_BLANKLINE = register_optionflag('DONT_ACCEPT_BLANKLINE') +NORMALIZE_WHITESPACE = register_optionflag('NORMALIZE_WHITESPACE') +ELLIPSIS = register_optionflag('ELLIPSIS') +IGNORE_EXCEPTION_DETAIL = register_optionflag('IGNORE_EXCEPTION_DETAIL') + +COMPARISON_FLAGS = (DONT_ACCEPT_TRUE_FOR_1 | + DONT_ACCEPT_BLANKLINE | + NORMALIZE_WHITESPACE | + ELLIPSIS | + IGNORE_EXCEPTION_DETAIL) + +REPORT_UDIFF = register_optionflag('REPORT_UDIFF') +REPORT_CDIFF = register_optionflag('REPORT_CDIFF') +REPORT_NDIFF = register_optionflag('REPORT_NDIFF') +REPORT_ONLY_FIRST_FAILURE = register_optionflag('REPORT_ONLY_FIRST_FAILURE') + +REPORTING_FLAGS = (REPORT_UDIFF | + REPORT_CDIFF | + REPORT_NDIFF | + REPORT_ONLY_FIRST_FAILURE) + +# Special string markers for use in `want` strings: +BLANKLINE_MARKER = '' +ELLIPSIS_MARKER = '...' + +###################################################################### +## Table of Contents +###################################################################### +# 1. Utility Functions +# 2. Example & DocTest -- store test cases +# 3. DocTest Parser -- extracts examples from strings +# 4. DocTest Finder -- extracts test cases from objects +# 5. DocTest Runner -- runs test cases +# 6. Test Functions -- convenient wrappers for testing +# 7. Tester Class -- for backwards compatibility +# 8. Unittest Support +# 9. Debugging Support +# 10. Example Usage + +###################################################################### +## 1. Utility Functions +###################################################################### + +def is_private(prefix, base): + """prefix, base -> true iff name prefix + "." + base is "private". + + Prefix may be an empty string, and base does not contain a period. + Prefix is ignored (although functions you write conforming to this + protocol may make use of it). + Return true iff base begins with an (at least one) underscore, but + does not both begin and end with (at least) two underscores. + + >>> is_private("a.b", "my_func") + False + >>> is_private("____", "_my_func") + True + >>> is_private("someclass", "__init__") + False + >>> is_private("sometypo", "__init_") + True + >>> is_private("x.y.z", "_") + True + >>> is_private("_x.y.z", "__") + False + >>> is_private("", "") # senseless but consistent + False + """ + warnings.warn("is_private is deprecated; it wasn't useful; " + "examine DocTestFinder.find() lists instead", + DeprecationWarning, stacklevel=2) + return base[:1] == "_" and not base[:2] == "__" == base[-2:] + +def _extract_future_flags(globs): + """ + Return the compiler-flags associated with the future features that + have been imported into the given namespace (globs). + """ + flags = 0 + for fname in __future__.all_feature_names: + feature = globs.get(fname, None) + if feature is getattr(__future__, fname): + flags |= feature.compiler_flag + return flags + +def _normalize_module(module, depth=2): + """ + Return the module specified by `module`. In particular: + - If `module` is a module, then return module. + - If `module` is a string, then import and return the + module with that name. + - If `module` is None, then return the calling module. + The calling module is assumed to be the module of + the stack frame at the given depth in the call stack. + """ + if inspect.ismodule(module): + return module + elif isinstance(module, basestring): + return __import__(module, globals(), locals(), ["*"]) + elif module is None: + return sys.modules[sys._getframe(depth).f_globals['__name__']] + else: + raise TypeError("Expected a module, string, or None") + +def _indent(s, indent=4): + """ + Add the given number of space characters to the beginning every + non-blank line in `s`, and return the result. + """ + # This regexp matches the start of non-blank lines: + return re.sub('(?m)^(?!$)', indent*' ', s) + +def _exception_traceback(exc_info): + """ + Return a string containing a traceback message for the given + exc_info tuple (as returned by sys.exc_info()). + """ + # Get a traceback message. + excout = StringIO() + exc_type, exc_val, exc_tb = exc_info + traceback.print_exception(exc_type, exc_val, exc_tb, file=excout) + return excout.getvalue() + +# Override some StringIO methods. +class _SpoofOut(StringIO): + def getvalue(self): + result = StringIO.getvalue(self) + # If anything at all was written, make sure there's a trailing + # newline. There's no way for the expected output to indicate + # that a trailing newline is missing. + if result and not result.endswith("\n"): + result += "\n" + # Prevent softspace from screwing up the next test case, in + # case they used print with a trailing comma in an example. + if hasattr(self, "softspace"): + del self.softspace + return result + + def truncate(self, size=None): + StringIO.truncate(self, size) + if hasattr(self, "softspace"): + del self.softspace + +# Worst-case linear-time ellipsis matching. +def _ellipsis_match(want, got): + """ + Essentially the only subtle case: + >>> _ellipsis_match('aa...aa', 'aaa') + False + """ + if want.find(ELLIPSIS_MARKER)==-1: + return want == got + + # Find "the real" strings. + ws = want.split(ELLIPSIS_MARKER) + assert len(ws) >= 2 + + # Deal with exact matches possibly needed at one or both ends. + startpos, endpos = 0, len(got) + w = ws[0] + if w: # starts with exact match + if got.startswith(w): + startpos = len(w) + del ws[0] + else: + return False + w = ws[-1] + if w: # ends with exact match + if got.endswith(w): + endpos -= len(w) + del ws[-1] + else: + return False + + if startpos > endpos: + # Exact end matches required more characters than we have, as in + # _ellipsis_match('aa...aa', 'aaa') + return False + + # For the rest, we only need to find the leftmost non-overlapping + # match for each piece. If there's no overall match that way alone, + # there's no overall match period. + for w in ws: + # w may be '' at times, if there are consecutive ellipses, or + # due to an ellipsis at the start or end of `want`. That's OK. + # Search for an empty string succeeds, and doesn't change startpos. + startpos = got.find(w, startpos, endpos) + if startpos < 0: + return False + startpos += len(w) + + return True + +def _comment_line(line): + "Return a commented form of the given line" + line = line.rstrip() + if line: + return '# '+line + else: + return '#' + +class _OutputRedirectingPdb(pdb.Pdb): + """ + A specialized version of the python debugger that redirects stdout + to a given stream when interacting with the user. Stdout is *not* + redirected when traced code is executed. + """ + def __init__(self, out): + self.__out = out + pdb.Pdb.__init__(self) + + def trace_dispatch(self, *args): + # Redirect stdout to the given stream. + save_stdout = sys.stdout + sys.stdout = self.__out + # Call Pdb's trace dispatch method. + try: + return pdb.Pdb.trace_dispatch(self, *args) + finally: + sys.stdout = save_stdout + +# [XX] Normalize with respect to os.path.pardir? +def _module_relative_path(module, path): + if not inspect.ismodule(module): + raise TypeError('Expected a module: %r' % module) + if path.startswith('/'): + raise ValueError('Module-relative files may not have absolute paths') + + # Find the base directory for the path. + if hasattr(module, '__file__'): + # A normal module/package + basedir = os.path.split(module.__file__)[0] + elif module.__name__ == '__main__': + # An interactive session. + if len(sys.argv)>0 and sys.argv[0] != '': + basedir = os.path.split(sys.argv[0])[0] + else: + basedir = os.curdir + else: + # A module w/o __file__ (this includes builtins) + raise ValueError("Can't resolve paths relative to the module " + + module + " (it has no __file__)") + + # Combine the base directory and the path. + return os.path.join(basedir, *(path.split('/'))) + +###################################################################### +## 2. Example & DocTest +###################################################################### +## - An "example" is a pair, where "source" is a +## fragment of source code, and "want" is the expected output for +## "source." The Example class also includes information about +## where the example was extracted from. +## +## - A "doctest" is a collection of examples, typically extracted from +## a string (such as an object's docstring). The DocTest class also +## includes information about where the string was extracted from. + +class Example: + """ + A single doctest example, consisting of source code and expected + output. `Example` defines the following attributes: + + - source: A single Python statement, always ending with a newline. + The constructor adds a newline if needed. + + - want: The expected output from running the source code (either + from stdout, or a traceback in case of exception). `want` ends + with a newline unless it's empty, in which case it's an empty + string. The constructor adds a newline if needed. + + - exc_msg: The exception message generated by the example, if + the example is expected to generate an exception; or `None` if + it is not expected to generate an exception. This exception + message is compared against the return value of + `traceback.format_exception_only()`. `exc_msg` ends with a + newline unless it's `None`. The constructor adds a newline + if needed. + + - lineno: The line number within the DocTest string containing + this Example where the Example begins. This line number is + zero-based, with respect to the beginning of the DocTest. + + - indent: The example's indentation in the DocTest string. + I.e., the number of space characters that preceed the + example's first prompt. + + - options: A dictionary mapping from option flags to True or + False, which is used to override default options for this + example. Any option flags not contained in this dictionary + are left at their default value (as specified by the + DocTestRunner's optionflags). By default, no options are set. + """ + def __init__(self, source, want, exc_msg=None, lineno=0, indent=0, + options=None): + # Normalize inputs. + if not source.endswith('\n'): + source += '\n' + if want and not want.endswith('\n'): + want += '\n' + if exc_msg is not None and not exc_msg.endswith('\n'): + exc_msg += '\n' + # Store properties. + self.source = source + self.want = want + self.lineno = lineno + self.indent = indent + if options is None: options = {} + self.options = options + self.exc_msg = exc_msg + +class DocTest: + """ + A collection of doctest examples that should be run in a single + namespace. Each `DocTest` defines the following attributes: + + - examples: the list of examples. + + - globs: The namespace (aka globals) that the examples should + be run in. + + - name: A name identifying the DocTest (typically, the name of + the object whose docstring this DocTest was extracted from). + + - filename: The name of the file that this DocTest was extracted + from, or `None` if the filename is unknown. + + - lineno: The line number within filename where this DocTest + begins, or `None` if the line number is unavailable. This + line number is zero-based, with respect to the beginning of + the file. + + - docstring: The string that the examples were extracted from, + or `None` if the string is unavailable. + """ + def __init__(self, examples, globs, name, filename, lineno, docstring): + """ + Create a new DocTest containing the given examples. The + DocTest's globals are initialized with a copy of `globs`. + """ + assert not isinstance(examples, basestring), \ + "DocTest no longer accepts str; use DocTestParser instead" + self.examples = examples + self.docstring = docstring + self.globs = globs.copy() + self.name = name + self.filename = filename + self.lineno = lineno + + def __repr__(self): + if len(self.examples) == 0: + examples = 'no examples' + elif len(self.examples) == 1: + examples = '1 example' + else: + examples = '%d examples' % len(self.examples) + return ('' % + (self.name, self.filename, self.lineno, examples)) + + + # This lets us sort tests by name: + def __cmp__(self, other): + if not isinstance(other, DocTest): + return -1 + return cmp((self.name, self.filename, self.lineno, id(self)), + (other.name, other.filename, other.lineno, id(other))) + +###################################################################### +## 3. DocTestParser +###################################################################### + +class DocTestParser: + """ + A class used to parse strings containing doctest examples. + """ + # This regular expression is used to find doctest examples in a + # string. It defines three groups: `source` is the source code + # (including leading indentation and prompts); `indent` is the + # indentation of the first (PS1) line of the source code; and + # `want` is the expected output (including leading indentation). + _EXAMPLE_RE = re.compile(r''' + # Source consists of a PS1 line followed by zero or more PS2 lines. + (?P + (?:^(?P [ ]*) >>> .*) # PS1 line + (?:\n [ ]* \.\.\. .*)*) # PS2 lines + \n? + # Want consists of any non-blank lines that do not start with PS1. + (?P (?:(?![ ]*$) # Not a blank line + (?![ ]*>>>) # Not a line starting with PS1 + .*$\n? # But any other line + )*) + ''', re.MULTILINE | re.VERBOSE) + + # A regular expression for handling `want` strings that contain + # expected exceptions. It divides `want` into three pieces: + # - the traceback header line (`hdr`) + # - the traceback stack (`stack`) + # - the exception message (`msg`), as generated by + # traceback.format_exception_only() + # `msg` may have multiple lines. We assume/require that the + # exception message is the first non-indented line starting with a word + # character following the traceback header line. + _EXCEPTION_RE = re.compile(r""" + # Grab the traceback header. Different versions of Python have + # said different things on the first traceback line. + ^(?P Traceback\ \( + (?: most\ recent\ call\ last + | innermost\ last + ) \) : + ) + \s* $ # toss trailing whitespace on the header. + (?P .*?) # don't blink: absorb stuff until... + ^ (?P \w+ .*) # a line *starts* with alphanum. + """, re.VERBOSE | re.MULTILINE | re.DOTALL) + + # A callable returning a true value iff its argument is a blank line + # or contains a single comment. + _IS_BLANK_OR_COMMENT = re.compile(r'^[ ]*(#.*)?$').match + + def parse(self, string, name=''): + """ + Divide the given string into examples and intervening text, + and return them as a list of alternating Examples and strings. + Line numbers for the Examples are 0-based. The optional + argument `name` is a name identifying this string, and is only + used for error messages. + """ + string = string.expandtabs() + # If all lines begin with the same indentation, then strip it. + min_indent = self._min_indent(string) + if min_indent > 0: + string = '\n'.join([l[min_indent:] for l in string.split('\n')]) + + output = [] + charno, lineno = 0, 0 + # Find all doctest examples in the string: + for m in self._EXAMPLE_RE.finditer(string): + # Add the pre-example text to `output`. + output.append(string[charno:m.start()]) + # Update lineno (lines before this example) + lineno += string.count('\n', charno, m.start()) + # Extract info from the regexp match. + (source, options, want, exc_msg) = \ + self._parse_example(m, name, lineno) + # Create an Example, and add it to the list. + if not self._IS_BLANK_OR_COMMENT(source): + output.append( Example(source, want, exc_msg, + lineno=lineno, + indent=min_indent+len(m.group('indent')), + options=options) ) + # Update lineno (lines inside this example) + lineno += string.count('\n', m.start(), m.end()) + # Update charno. + charno = m.end() + # Add any remaining post-example text to `output`. + output.append(string[charno:]) + return output + + def get_doctest(self, string, globs, name, filename, lineno): + """ + Extract all doctest examples from the given string, and + collect them into a `DocTest` object. + + `globs`, `name`, `filename`, and `lineno` are attributes for + the new `DocTest` object. See the documentation for `DocTest` + for more information. + """ + return DocTest(self.get_examples(string, name), globs, + name, filename, lineno, string) + + def get_examples(self, string, name=''): + """ + Extract all doctest examples from the given string, and return + them as a list of `Example` objects. Line numbers are + 0-based, because it's most common in doctests that nothing + interesting appears on the same line as opening triple-quote, + and so the first interesting line is called \"line 1\" then. + + The optional argument `name` is a name identifying this + string, and is only used for error messages. + """ + return [x for x in self.parse(string, name) + if isinstance(x, Example)] + + def _parse_example(self, m, name, lineno): + """ + Given a regular expression match from `_EXAMPLE_RE` (`m`), + return a pair `(source, want)`, where `source` is the matched + example's source code (with prompts and indentation stripped); + and `want` is the example's expected output (with indentation + stripped). + + `name` is the string's name, and `lineno` is the line number + where the example starts; both are used for error messages. + """ + # Get the example's indentation level. + indent = len(m.group('indent')) + + # Divide source into lines; check that they're properly + # indented; and then strip their indentation & prompts. + source_lines = m.group('source').split('\n') + self._check_prompt_blank(source_lines, indent, name, lineno) + self._check_prefix(source_lines[1:], ' '*indent + '.', name, lineno) + source = '\n'.join([sl[indent+4:] for sl in source_lines]) + + # Divide want into lines; check that it's properly indented; and + # then strip the indentation. Spaces before the last newline should + # be preserved, so plain rstrip() isn't good enough. + want = m.group('want') + want_lines = want.split('\n') + if len(want_lines) > 1 and re.match(r' *$', want_lines[-1]): + del want_lines[-1] # forget final newline & spaces after it + self._check_prefix(want_lines, ' '*indent, name, + lineno + len(source_lines)) + want = '\n'.join([wl[indent:] for wl in want_lines]) + + # If `want` contains a traceback message, then extract it. + m = self._EXCEPTION_RE.match(want) + if m: + exc_msg = m.group('msg') + else: + exc_msg = None + + # Extract options from the source. + options = self._find_options(source, name, lineno) + + return source, options, want, exc_msg + + # This regular expression looks for option directives in the + # source code of an example. Option directives are comments + # starting with "doctest:". Warning: this may give false + # positives for string-literals that contain the string + # "#doctest:". Eliminating these false positives would require + # actually parsing the string; but we limit them by ignoring any + # line containing "#doctest:" that is *followed* by a quote mark. + _OPTION_DIRECTIVE_RE = re.compile(r'#\s*doctest:\s*([^\n\'"]*)$', + re.MULTILINE) + + def _find_options(self, source, name, lineno): + """ + Return a dictionary containing option overrides extracted from + option directives in the given source string. + + `name` is the string's name, and `lineno` is the line number + where the example starts; both are used for error messages. + """ + options = {} + # (note: with the current regexp, this will match at most once:) + for m in self._OPTION_DIRECTIVE_RE.finditer(source): + option_strings = m.group(1).replace(',', ' ').split() + for option in option_strings: + if (option[0] not in '+-' or + option[1:] not in OPTIONFLAGS_BY_NAME): + raise ValueError('line %r of the doctest for %s ' + 'has an invalid option: %r' % + (lineno+1, name, option)) + flag = OPTIONFLAGS_BY_NAME[option[1:]] + options[flag] = (option[0] == '+') + if options and self._IS_BLANK_OR_COMMENT(source): + raise ValueError('line %r of the doctest for %s has an option ' + 'directive on a line with no example: %r' % + (lineno, name, source)) + return options + + # This regular expression finds the indentation of every non-blank + # line in a string. + _INDENT_RE = re.compile('^([ ]*)(?=\S)', re.MULTILINE) + + def _min_indent(self, s): + "Return the minimum indentation of any non-blank line in `s`" + indents = [len(indent) for indent in self._INDENT_RE.findall(s)] + if len(indents) > 0: + return min(indents) + else: + return 0 + + def _check_prompt_blank(self, lines, indent, name, lineno): + """ + Given the lines of a source string (including prompts and + leading indentation), check to make sure that every prompt is + followed by a space character. If any line is not followed by + a space character, then raise ValueError. + """ + for i, line in enumerate(lines): + if len(line) >= indent+4 and line[indent+3] != ' ': + raise ValueError('line %r of the docstring for %s ' + 'lacks blank after %s: %r' % + (lineno+i+1, name, + line[indent:indent+3], line)) + + def _check_prefix(self, lines, prefix, name, lineno): + """ + Check that every line in the given list starts with the given + prefix; if any line does not, then raise a ValueError. + """ + for i, line in enumerate(lines): + if line and not line.startswith(prefix): + raise ValueError('line %r of the docstring for %s has ' + 'inconsistent leading whitespace: %r' % + (lineno+i+1, name, line)) + + +###################################################################### +## 4. DocTest Finder +###################################################################### + +class DocTestFinder: + """ + A class used to extract the DocTests that are relevant to a given + object, from its docstring and the docstrings of its contained + objects. Doctests can currently be extracted from the following + object types: modules, functions, classes, methods, staticmethods, + classmethods, and properties. + """ + + def __init__(self, verbose=False, parser=DocTestParser(), + recurse=True, _namefilter=None, exclude_empty=True): + """ + Create a new doctest finder. + + The optional argument `parser` specifies a class or + function that should be used to create new DocTest objects (or + objects that implement the same interface as DocTest). The + signature for this factory function should match the signature + of the DocTest constructor. + + If the optional argument `recurse` is false, then `find` will + only examine the given object, and not any contained objects. + + If the optional argument `exclude_empty` is false, then `find` + will include tests for objects with empty docstrings. + """ + self._parser = parser + self._verbose = verbose + self._recurse = recurse + self._exclude_empty = exclude_empty + # _namefilter is undocumented, and exists only for temporary backward- + # compatibility support of testmod's deprecated isprivate mess. + self._namefilter = _namefilter + + def find(self, obj, name=None, module=None, globs=None, + extraglobs=None): + """ + Return a list of the DocTests that are defined by the given + object's docstring, or by any of its contained objects' + docstrings. + + The optional parameter `module` is the module that contains + the given object. If the module is not specified or is None, then + the test finder will attempt to automatically determine the + correct module. The object's module is used: + + - As a default namespace, if `globs` is not specified. + - To prevent the DocTestFinder from extracting DocTests + from objects that are imported from other modules. + - To find the name of the file containing the object. + - To help find the line number of the object within its + file. + + Contained objects whose module does not match `module` are ignored. + + If `module` is False, no attempt to find the module will be made. + This is obscure, of use mostly in tests: if `module` is False, or + is None but cannot be found automatically, then all objects are + considered to belong to the (non-existent) module, so all contained + objects will (recursively) be searched for doctests. + + The globals for each DocTest is formed by combining `globs` + and `extraglobs` (bindings in `extraglobs` override bindings + in `globs`). A new copy of the globals dictionary is created + for each DocTest. If `globs` is not specified, then it + defaults to the module's `__dict__`, if specified, or {} + otherwise. If `extraglobs` is not specified, then it defaults + to {}. + + """ + # If name was not specified, then extract it from the object. + if name is None: + name = getattr(obj, '__name__', None) + if name is None: + raise ValueError("DocTestFinder.find: name must be given " + "when obj.__name__ doesn't exist: %r" % + (type(obj),)) + + # Find the module that contains the given object (if obj is + # a module, then module=obj.). Note: this may fail, in which + # case module will be None. + if module is False: + module = None + elif module is None: + module = inspect.getmodule(obj) + + # Read the module's source code. This is used by + # DocTestFinder._find_lineno to find the line number for a + # given object's docstring. + try: + file = inspect.getsourcefile(obj) or inspect.getfile(obj) + source_lines = linecache.getlines(file) + if not source_lines: + source_lines = None + except TypeError: + source_lines = None + + # Initialize globals, and merge in extraglobs. + if globs is None: + if module is None: + globs = {} + else: + globs = module.__dict__.copy() + else: + globs = globs.copy() + if extraglobs is not None: + globs.update(extraglobs) + + # Recursively expore `obj`, extracting DocTests. + tests = [] + self._find(tests, obj, name, module, source_lines, globs, {}) + return tests + + def _filter(self, obj, prefix, base): + """ + Return true if the given object should not be examined. + """ + return (self._namefilter is not None and + self._namefilter(prefix, base)) + + def _from_module(self, module, object): + """ + Return true if the given object is defined in the given + module. + """ + if module is None: + return True + elif inspect.isfunction(object): + return module.__dict__ is func_globals(object) + elif inspect.isclass(object): + return module.__name__ == object.__module__ + elif inspect.getmodule(object) is not None: + return module is inspect.getmodule(object) + elif hasattr(object, '__module__'): + return module.__name__ == object.__module__ + elif isinstance(object, property): + return True # [XX] no way not be sure. + else: + raise ValueError("object must be a class or function") + + def _find(self, tests, obj, name, module, source_lines, globs, seen): + """ + Find tests for the given object and any contained objects, and + add them to `tests`. + """ + if self._verbose: + print('Finding tests in %s' % name) + + # If we've already processed this object, then ignore it. + if id(obj) in seen: + return + seen[id(obj)] = 1 + + # Find a test for this object, and add it to the list of tests. + test = self._get_test(obj, name, module, globs, source_lines) + if test is not None: + tests.append(test) + + # Look for tests in a module's contained objects. + if inspect.ismodule(obj) and self._recurse: + for valname, val in obj.__dict__.items(): + # Check if this contained object should be ignored. + if self._filter(val, name, valname): + continue + valname = '%s.%s' % (name, valname) + # Recurse to functions & classes. + if ((inspect.isfunction(val) or inspect.isclass(val)) and + self._from_module(module, val)): + self._find(tests, val, valname, module, source_lines, + globs, seen) + + # Look for tests in a module's __test__ dictionary. + if inspect.ismodule(obj) and self._recurse: + for valname, val in getattr(obj, '__test__', {}).items(): + if not isinstance(valname, basestring): + raise ValueError("DocTestFinder.find: __test__ keys " + "must be strings: %r" % + (type(valname),)) + if not (inspect.isfunction(val) or inspect.isclass(val) or + inspect.ismethod(val) or inspect.ismodule(val) or + isinstance(val, basestring)): + raise ValueError("DocTestFinder.find: __test__ values " + "must be strings, functions, methods, " + "classes, or modules: %r" % + (type(val),)) + valname = '%s.__test__.%s' % (name, valname) + self._find(tests, val, valname, module, source_lines, + globs, seen) + + # Look for tests in a class's contained objects. + if inspect.isclass(obj) and self._recurse: + for valname, val in obj.__dict__.items(): + # Check if this contained object should be ignored. + if self._filter(val, name, valname): + continue + # Special handling for staticmethod/classmethod. + if isinstance(val, staticmethod): + val = getattr(obj, valname) + if isinstance(val, classmethod): + val = im_func(getattr(obj, valname)) + + # Recurse to methods, properties, and nested classes. + if ((inspect.isfunction(val) or inspect.isclass(val) or + isinstance(val, property)) and + self._from_module(module, val)): + valname = '%s.%s' % (name, valname) + self._find(tests, val, valname, module, source_lines, + globs, seen) + + def _get_test(self, obj, name, module, globs, source_lines): + """ + Return a DocTest for the given object, if it defines a docstring; + otherwise, return None. + """ + # Extract the object's docstring. If it doesn't have one, + # then return None (no test for this object). + if isinstance(obj, basestring): + docstring = obj + else: + try: + if obj.__doc__ is None: + docstring = '' + else: + docstring = obj.__doc__ + if not isinstance(docstring, basestring): + docstring = str(docstring) + except (TypeError, AttributeError): + docstring = '' + + # Find the docstring's location in the file. + lineno = self._find_lineno(obj, source_lines) + + # Don't bother if the docstring is empty. + if self._exclude_empty and not docstring: + return None + + # Return a DocTest for this object. + if module is None: + filename = None + else: + filename = getattr(module, '__file__', module.__name__) + if filename[-4:] in (".pyc", ".pyo"): + filename = filename[:-1] + return self._parser.get_doctest(docstring, globs, name, + filename, lineno) + + def _find_lineno(self, obj, source_lines): + """ + Return a line number of the given object's docstring. Note: + this method assumes that the object has a docstring. + """ + lineno = None + + # Find the line number for modules. + if inspect.ismodule(obj): + lineno = 0 + + # Find the line number for classes. + # Note: this could be fooled if a class is defined multiple + # times in a single file. + if inspect.isclass(obj): + if source_lines is None: + return None + pat = re.compile(r'^\s*class\s*%s\b' % + getattr(obj, '__name__', '-')) + for i, line in enumerate(source_lines): + if pat.match(line): + lineno = i + break + + # Find the line number for functions & methods. + if inspect.ismethod(obj): obj = im_func(obj) + if inspect.isfunction(obj): obj = func_code(obj) + if inspect.istraceback(obj): obj = obj.tb_frame + if inspect.isframe(obj): obj = obj.f_code + if inspect.iscode(obj): + lineno = getattr(obj, 'co_firstlineno', None)-1 + + # Find the line number where the docstring starts. Assume + # that it's the first line that begins with a quote mark. + # Note: this could be fooled by a multiline function + # signature, where a continuation line begins with a quote + # mark. + if lineno is not None: + if source_lines is None: + return lineno+1 + pat = re.compile('(^|.*:)\s*\w*("|\')') + for lineno in range(lineno, len(source_lines)): + if pat.match(source_lines[lineno]): + return lineno + + # We couldn't find the line number. + return None + +###################################################################### +## 5. DocTest Runner +###################################################################### + +class DocTestRunner: + """ + A class used to run DocTest test cases, and accumulate statistics. + The `run` method is used to process a single DocTest case. It + returns a tuple `(f, t)`, where `t` is the number of test cases + tried, and `f` is the number of test cases that failed. + + >>> tests = DocTestFinder().find(_TestClass) + >>> runner = DocTestRunner(verbose=False) + >>> for test in tests: + ... print runner.run(test) + (0, 2) + (0, 1) + (0, 2) + (0, 2) + + The `summarize` method prints a summary of all the test cases that + have been run by the runner, and returns an aggregated `(f, t)` + tuple: + + >>> runner.summarize(verbose=1) + 4 items passed all tests: + 2 tests in _TestClass + 2 tests in _TestClass.__init__ + 2 tests in _TestClass.get + 1 tests in _TestClass.square + 7 tests in 4 items. + 7 passed and 0 failed. + Test passed. + (0, 7) + + The aggregated number of tried examples and failed examples is + also available via the `tries` and `failures` attributes: + + >>> runner.tries + 7 + >>> runner.failures + 0 + + The comparison between expected outputs and actual outputs is done + by an `OutputChecker`. This comparison may be customized with a + number of option flags; see the documentation for `testmod` for + more information. If the option flags are insufficient, then the + comparison may also be customized by passing a subclass of + `OutputChecker` to the constructor. + + The test runner's display output can be controlled in two ways. + First, an output function (`out) can be passed to + `TestRunner.run`; this function will be called with strings that + should be displayed. It defaults to `sys.stdout.write`. If + capturing the output is not sufficient, then the display output + can be also customized by subclassing DocTestRunner, and + overriding the methods `report_start`, `report_success`, + `report_unexpected_exception`, and `report_failure`. + """ + # This divider string is used to separate failure messages, and to + # separate sections of the summary. + DIVIDER = "*" * 70 + + def __init__(self, checker=None, verbose=None, optionflags=0): + """ + Create a new test runner. + + Optional keyword arg `checker` is the `OutputChecker` that + should be used to compare the expected outputs and actual + outputs of doctest examples. + + Optional keyword arg 'verbose' prints lots of stuff if true, + only failures if false; by default, it's true iff '-v' is in + sys.argv. + + Optional argument `optionflags` can be used to control how the + test runner compares expected output to actual output, and how + it displays failures. See the documentation for `testmod` for + more information. + """ + self._checker = checker or OutputChecker() + if verbose is None: + verbose = '-v' in sys.argv + self._verbose = verbose + self.optionflags = optionflags + self.original_optionflags = optionflags + + # Keep track of the examples we've run. + self.tries = 0 + self.failures = 0 + self._name2ft = {} + + # Create a fake output target for capturing doctest output. + self._fakeout = _SpoofOut() + + #///////////////////////////////////////////////////////////////// + # Reporting methods + #///////////////////////////////////////////////////////////////// + + def report_start(self, out, test, example): + """ + Report that the test runner is about to process the given + example. (Only displays a message if verbose=True) + """ + if self._verbose: + if example.want: + out('Trying:\n' + _indent(example.source) + + 'Expecting:\n' + _indent(example.want)) + else: + out('Trying:\n' + _indent(example.source) + + 'Expecting nothing\n') + + def report_success(self, out, test, example, got): + """ + Report that the given example ran successfully. (Only + displays a message if verbose=True) + """ + if self._verbose: + out("ok\n") + + def report_failure(self, out, test, example, got): + """ + Report that the given example failed. + """ + out(self._failure_header(test, example) + + self._checker.output_difference(example, got, self.optionflags)) + + def report_unexpected_exception(self, out, test, example, exc_info): + """ + Report that the given example raised an unexpected exception. + """ + out(self._failure_header(test, example) + + 'Exception raised:\n' + _indent(_exception_traceback(exc_info))) + + def _failure_header(self, test, example): + out = [self.DIVIDER] + if test.filename: + if test.lineno is not None and example.lineno is not None: + lineno = test.lineno + example.lineno + 1 + else: + lineno = '?' + out.append('File "%s", line %s, in %s' % + (test.filename, lineno, test.name)) + else: + out.append('Line %s, in %s' % (example.lineno+1, test.name)) + out.append('Failed example:') + source = example.source + out.append(_indent(source)) + return '\n'.join(out) + + #///////////////////////////////////////////////////////////////// + # DocTest Running + #///////////////////////////////////////////////////////////////// + + def __run(self, test, compileflags, out): + """ + Run the examples in `test`. Write the outcome of each example + with one of the `DocTestRunner.report_*` methods, using the + writer function `out`. `compileflags` is the set of compiler + flags that should be used to execute examples. Return a tuple + `(f, t)`, where `t` is the number of examples tried, and `f` + is the number of examples that failed. The examples are run + in the namespace `test.globs`. + """ + # Keep track of the number of failures and tries. + failures = tries = 0 + + # Save the option flags (since option directives can be used + # to modify them). + original_optionflags = self.optionflags + + SUCCESS, FAILURE, BOOM = range(3) # `outcome` state + + check = self._checker.check_output + + # Process each example. + for examplenum, example in enumerate(test.examples): + + # If REPORT_ONLY_FIRST_FAILURE is set, then supress + # reporting after the first failure. + quiet = (self.optionflags & REPORT_ONLY_FIRST_FAILURE and + failures > 0) + + # Merge in the example's options. + self.optionflags = original_optionflags + if example.options: + for (optionflag, val) in example.options.items(): + if val: + self.optionflags |= optionflag + else: + self.optionflags &= ~optionflag + + # Record that we started this example. + tries += 1 + if not quiet: + self.report_start(out, test, example) + + # Use a special filename for compile(), so we can retrieve + # the source code during interactive debugging (see + # __patched_linecache_getlines). + filename = '' % (test.name, examplenum) + + # Run the example in the given context (globs), and record + # any exception that gets raised. (But don't intercept + # keyboard interrupts.) + try: + # Don't blink! This is where the user's code gets run. + exec_(compile(example.source, filename, "single", + compileflags, 1), test.globs) + self.debugger.set_continue() # ==== Example Finished ==== + exception = None + except KeyboardInterrupt: + raise + except: + exception = sys.exc_info() + self.debugger.set_continue() # ==== Example Finished ==== + + got = self._fakeout.getvalue() # the actual output + self._fakeout.truncate(0) + outcome = FAILURE # guilty until proved innocent or insane + + # If the example executed without raising any exceptions, + # verify its output. + if exception is None: + if check(example.want, got, self.optionflags): + outcome = SUCCESS + + # The example raised an exception: check if it was expected. + else: + exc_info = sys.exc_info() + exc_msg = traceback.format_exception_only(*exc_info[:2])[-1] + if not quiet: + got += _exception_traceback(exc_info) + + # If `example.exc_msg` is None, then we weren't expecting + # an exception. + if example.exc_msg is None: + outcome = BOOM + + # We expected an exception: see whether it matches. + elif check(example.exc_msg, exc_msg, self.optionflags): + outcome = SUCCESS + + # Another chance if they didn't care about the detail. + elif self.optionflags & IGNORE_EXCEPTION_DETAIL: + m1 = re.match(r'[^:]*:', example.exc_msg) + m2 = re.match(r'[^:]*:', exc_msg) + if m1 and m2 and check(m1.group(0), m2.group(0), + self.optionflags): + outcome = SUCCESS + + # Report the outcome. + if outcome is SUCCESS: + if not quiet: + self.report_success(out, test, example, got) + elif outcome is FAILURE: + if not quiet: + self.report_failure(out, test, example, got) + failures += 1 + elif outcome is BOOM: + if not quiet: + self.report_unexpected_exception(out, test, example, + exc_info) + failures += 1 + else: + assert False, ("unknown outcome", outcome) + + # Restore the option flags (in case they were modified) + self.optionflags = original_optionflags + + # Record and return the number of failures and tries. + self.__record_outcome(test, failures, tries) + return failures, tries + + def __record_outcome(self, test, f, t): + """ + Record the fact that the given DocTest (`test`) generated `f` + failures out of `t` tried examples. + """ + f2, t2 = self._name2ft.get(test.name, (0,0)) + self._name2ft[test.name] = (f+f2, t+t2) + self.failures += f + self.tries += t + + __LINECACHE_FILENAME_RE = re.compile(r'[\w\.]+)' + r'\[(?P\d+)\]>$') + def __patched_linecache_getlines(self, filename, module_globals=None): + m = self.__LINECACHE_FILENAME_RE.match(filename) + if m and m.group('name') == self.test.name: + example = self.test.examples[int(m.group('examplenum'))] + return example.source.splitlines(True) + elif func_code(self.save_linecache_getlines).co_argcount > 1: + return self.save_linecache_getlines(filename, module_globals) + else: + return self.save_linecache_getlines(filename) + + def run(self, test, compileflags=None, out=None, clear_globs=True): + """ + Run the examples in `test`, and display the results using the + writer function `out`. + + The examples are run in the namespace `test.globs`. If + `clear_globs` is true (the default), then this namespace will + be cleared after the test runs, to help with garbage + collection. If you would like to examine the namespace after + the test completes, then use `clear_globs=False`. + + `compileflags` gives the set of flags that should be used by + the Python compiler when running the examples. If not + specified, then it will default to the set of future-import + flags that apply to `globs`. + + The output of each example is checked using + `DocTestRunner.check_output`, and the results are formatted by + the `DocTestRunner.report_*` methods. + """ + self.test = test + + if compileflags is None: + compileflags = _extract_future_flags(test.globs) + + save_stdout = sys.stdout + if out is None: + out = save_stdout.write + sys.stdout = self._fakeout + + # Patch pdb.set_trace to restore sys.stdout during interactive + # debugging (so it's not still redirected to self._fakeout). + # Note that the interactive output will go to *our* + # save_stdout, even if that's not the real sys.stdout; this + # allows us to write test cases for the set_trace behavior. + save_set_trace = pdb.set_trace + self.debugger = _OutputRedirectingPdb(save_stdout) + self.debugger.reset() + pdb.set_trace = self.debugger.set_trace + + # Patch linecache.getlines, so we can see the example's source + # when we're inside the debugger. + self.save_linecache_getlines = linecache.getlines + linecache.getlines = self.__patched_linecache_getlines + + try: + return self.__run(test, compileflags, out) + finally: + sys.stdout = save_stdout + pdb.set_trace = save_set_trace + linecache.getlines = self.save_linecache_getlines + if clear_globs: + test.globs.clear() + + #///////////////////////////////////////////////////////////////// + # Summarization + #///////////////////////////////////////////////////////////////// + def summarize(self, verbose=None): + """ + Print a summary of all the test cases that have been run by + this DocTestRunner, and return a tuple `(f, t)`, where `f` is + the total number of failed examples, and `t` is the total + number of tried examples. + + The optional `verbose` argument controls how detailed the + summary is. If the verbosity is not specified, then the + DocTestRunner's verbosity is used. + """ + if verbose is None: + verbose = self._verbose + notests = [] + passed = [] + failed = [] + totalt = totalf = 0 + for x in self._name2ft.items(): + name, (f, t) = x + assert f <= t + totalt += t + totalf += f + if t == 0: + notests.append(name) + elif f == 0: + passed.append( (name, t) ) + else: + failed.append(x) + if verbose: + if notests: + print(len(notests), "items had no tests:") + notests.sort() + for thing in notests: + print(" ", thing) + if passed: + print(len(passed), "items passed all tests:") + passed.sort() + for thing, count in passed: + print(" %3d tests in %s" % (count, thing)) + if failed: + print(self.DIVIDER) + print(len(failed), "items had failures:") + failed.sort() + for thing, (f, t) in failed: + print(" %3d of %3d in %s" % (f, t, thing)) + if verbose: + print(totalt, "tests in", len(self._name2ft), "items.") + print(totalt - totalf, "passed and", totalf, "failed.") + if totalf: + print("***Test Failed***", totalf, "failures.") + elif verbose: + print("Test passed.") + return totalf, totalt + + #///////////////////////////////////////////////////////////////// + # Backward compatibility cruft to maintain doctest.master. + #///////////////////////////////////////////////////////////////// + def merge(self, other): + d = self._name2ft + for name, (f, t) in other._name2ft.items(): + if name in d: + print("*** DocTestRunner.merge: '" + name + "' in both" \ + " testers; summing outcomes.") + f2, t2 = d[name] + f = f + f2 + t = t + t2 + d[name] = f, t + +class OutputChecker: + """ + A class used to check the whether the actual output from a doctest + example matches the expected output. `OutputChecker` defines two + methods: `check_output`, which compares a given pair of outputs, + and returns true if they match; and `output_difference`, which + returns a string describing the differences between two outputs. + """ + def check_output(self, want, got, optionflags): + """ + Return True iff the actual output from an example (`got`) + matches the expected output (`want`). These strings are + always considered to match if they are identical; but + depending on what option flags the test runner is using, + several non-exact match types are also possible. See the + documentation for `TestRunner` for more information about + option flags. + """ + # Handle the common case first, for efficiency: + # if they're string-identical, always return true. + if got == want: + return True + + # The values True and False replaced 1 and 0 as the return + # value for boolean comparisons in Python 2.3. + if not (optionflags & DONT_ACCEPT_TRUE_FOR_1): + if (got,want) == ("True\n", "1\n"): + return True + if (got,want) == ("False\n", "0\n"): + return True + + # can be used as a special sequence to signify a + # blank line, unless the DONT_ACCEPT_BLANKLINE flag is used. + if not (optionflags & DONT_ACCEPT_BLANKLINE): + # Replace in want with a blank line. + want = re.sub('(?m)^%s\s*?$' % re.escape(BLANKLINE_MARKER), + '', want) + # If a line in got contains only spaces, then remove the + # spaces. + got = re.sub('(?m)^\s*?$', '', got) + if got == want: + return True + + # This flag causes doctest to ignore any differences in the + # contents of whitespace strings. Note that this can be used + # in conjunction with the ELLIPSIS flag. + if optionflags & NORMALIZE_WHITESPACE: + got = ' '.join(got.split()) + want = ' '.join(want.split()) + if got == want: + return True + + # The ELLIPSIS flag says to let the sequence "..." in `want` + # match any substring in `got`. + if optionflags & ELLIPSIS: + if _ellipsis_match(want, got): + return True + + # We didn't find any match; return false. + return False + + # Should we do a fancy diff? + def _do_a_fancy_diff(self, want, got, optionflags): + # Not unless they asked for a fancy diff. + if not optionflags & (REPORT_UDIFF | + REPORT_CDIFF | + REPORT_NDIFF): + return False + + # If expected output uses ellipsis, a meaningful fancy diff is + # too hard ... or maybe not. In two real-life failures Tim saw, + # a diff was a major help anyway, so this is commented out. + # [todo] _ellipsis_match() knows which pieces do and don't match, + # and could be the basis for a kick-ass diff in this case. + ##if optionflags & ELLIPSIS and ELLIPSIS_MARKER in want: + ## return False + + # ndiff does intraline difference marking, so can be useful even + # for 1-line differences. + if optionflags & REPORT_NDIFF: + return True + + # The other diff types need at least a few lines to be helpful. + return want.count('\n') > 2 and got.count('\n') > 2 + + def output_difference(self, example, got, optionflags): + """ + Return a string describing the differences between the + expected output for a given example (`example`) and the actual + output (`got`). `optionflags` is the set of option flags used + to compare `want` and `got`. + """ + want = example.want + # If s are being used, then replace blank lines + # with in the actual output string. + if not (optionflags & DONT_ACCEPT_BLANKLINE): + got = re.sub('(?m)^[ ]*(?=\n)', BLANKLINE_MARKER, got) + + # Check if we should use diff. + if self._do_a_fancy_diff(want, got, optionflags): + # Split want & got into lines. + want_lines = want.splitlines(True) # True == keep line ends + got_lines = got.splitlines(True) + # Use difflib to find their differences. + if optionflags & REPORT_UDIFF: + diff = difflib.unified_diff(want_lines, got_lines, n=2) + diff = list(diff)[2:] # strip the diff header + kind = 'unified diff with -expected +actual' + elif optionflags & REPORT_CDIFF: + diff = difflib.context_diff(want_lines, got_lines, n=2) + diff = list(diff)[2:] # strip the diff header + kind = 'context diff with expected followed by actual' + elif optionflags & REPORT_NDIFF: + engine = difflib.Differ(charjunk=difflib.IS_CHARACTER_JUNK) + diff = list(engine.compare(want_lines, got_lines)) + kind = 'ndiff with -expected +actual' + else: + assert 0, 'Bad diff option' + # Remove trailing whitespace on diff output. + diff = [line.rstrip() + '\n' for line in diff] + return 'Differences (%s):\n' % kind + _indent(''.join(diff)) + + # If we're not using diff, then simply list the expected + # output followed by the actual output. + if want and got: + return 'Expected:\n%sGot:\n%s' % (_indent(want), _indent(got)) + elif want: + return 'Expected:\n%sGot nothing\n' % _indent(want) + elif got: + return 'Expected nothing\nGot:\n%s' % _indent(got) + else: + return 'Expected nothing\nGot nothing\n' + +class DocTestFailure(Exception): + """A DocTest example has failed in debugging mode. + + The exception instance has variables: + + - test: the DocTest object being run + + - excample: the Example object that failed + + - got: the actual output + """ + def __init__(self, test, example, got): + self.test = test + self.example = example + self.got = got + + def __str__(self): + return str(self.test) + +class UnexpectedException(Exception): + """A DocTest example has encountered an unexpected exception + + The exception instance has variables: + + - test: the DocTest object being run + + - excample: the Example object that failed + + - exc_info: the exception info + """ + def __init__(self, test, example, exc_info): + self.test = test + self.example = example + self.exc_info = exc_info + + def __str__(self): + return str(self.test) + +class DebugRunner(DocTestRunner): + r"""Run doc tests but raise an exception as soon as there is a failure. + + If an unexpected exception occurs, an UnexpectedException is raised. + It contains the test, the example, and the original exception: + + >>> runner = DebugRunner(verbose=False) + >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42', + ... {}, 'foo', 'foo.py', 0) + >>> try: + ... runner.run(test) + ... except UnexpectedException, failure: + ... pass + + >>> failure.test is test + True + + >>> failure.example.want + '42\n' + + >>> exc_info = failure.exc_info + >>> raise exc_info[0], exc_info[1], exc_info[2] + Traceback (most recent call last): + ... + KeyError + + We wrap the original exception to give the calling application + access to the test and example information. + + If the output doesn't match, then a DocTestFailure is raised: + + >>> test = DocTestParser().get_doctest(''' + ... >>> x = 1 + ... >>> x + ... 2 + ... ''', {}, 'foo', 'foo.py', 0) + + >>> try: + ... runner.run(test) + ... except DocTestFailure, failure: + ... pass + + DocTestFailure objects provide access to the test: + + >>> failure.test is test + True + + As well as to the example: + + >>> failure.example.want + '2\n' + + and the actual output: + + >>> failure.got + '1\n' + + If a failure or error occurs, the globals are left intact: + + >>> del test.globs['__builtins__'] + >>> test.globs + {'x': 1} + + >>> test = DocTestParser().get_doctest(''' + ... >>> x = 2 + ... >>> raise KeyError + ... ''', {}, 'foo', 'foo.py', 0) + + >>> runner.run(test) + Traceback (most recent call last): + ... + UnexpectedException: + + >>> del test.globs['__builtins__'] + >>> test.globs + {'x': 2} + + But the globals are cleared if there is no error: + + >>> test = DocTestParser().get_doctest(''' + ... >>> x = 2 + ... ''', {}, 'foo', 'foo.py', 0) + + >>> runner.run(test) + (0, 1) + + >>> test.globs + {} + + """ + + def run(self, test, compileflags=None, out=None, clear_globs=True): + r = DocTestRunner.run(self, test, compileflags, out, False) + if clear_globs: + test.globs.clear() + return r + + def report_unexpected_exception(self, out, test, example, exc_info): + raise UnexpectedException(test, example, exc_info) + + def report_failure(self, out, test, example, got): + raise DocTestFailure(test, example, got) + +###################################################################### +## 6. Test Functions +###################################################################### +# These should be backwards compatible. + +# For backward compatibility, a global instance of a DocTestRunner +# class, updated by testmod. +master = None + +def testmod(m=None, name=None, globs=None, verbose=None, isprivate=None, + report=True, optionflags=0, extraglobs=None, + raise_on_error=False, exclude_empty=False): + """m=None, name=None, globs=None, verbose=None, isprivate=None, + report=True, optionflags=0, extraglobs=None, raise_on_error=False, + exclude_empty=False + + Test examples in docstrings in functions and classes reachable + from module m (or the current module if m is not supplied), starting + with m.__doc__. Unless isprivate is specified, private names + are not skipped. + + Also test examples reachable from dict m.__test__ if it exists and is + not None. m.__test__ maps names to functions, classes and strings; + function and class docstrings are tested even if the name is private; + strings are tested directly, as if they were docstrings. + + Return (#failures, #tests). + + See doctest.__doc__ for an overview. + + Optional keyword arg "name" gives the name of the module; by default + use m.__name__. + + Optional keyword arg "globs" gives a dict to be used as the globals + when executing examples; by default, use m.__dict__. A copy of this + dict is actually used for each docstring, so that each docstring's + examples start with a clean slate. + + Optional keyword arg "extraglobs" gives a dictionary that should be + merged into the globals that are used to execute examples. By + default, no extra globals are used. This is new in 2.4. + + Optional keyword arg "verbose" prints lots of stuff if true, prints + only failures if false; by default, it's true iff "-v" is in sys.argv. + + Optional keyword arg "report" prints a summary at the end when true, + else prints nothing at the end. In verbose mode, the summary is + detailed, else very brief (in fact, empty if all tests passed). + + Optional keyword arg "optionflags" or's together module constants, + and defaults to 0. This is new in 2.3. Possible values (see the + docs for details): + + DONT_ACCEPT_TRUE_FOR_1 + DONT_ACCEPT_BLANKLINE + NORMALIZE_WHITESPACE + ELLIPSIS + IGNORE_EXCEPTION_DETAIL + REPORT_UDIFF + REPORT_CDIFF + REPORT_NDIFF + REPORT_ONLY_FIRST_FAILURE + + Optional keyword arg "raise_on_error" raises an exception on the + first unexpected exception or failure. This allows failures to be + post-mortem debugged. + + Deprecated in Python 2.4: + Optional keyword arg "isprivate" specifies a function used to + determine whether a name is private. The default function is + treat all functions as public. Optionally, "isprivate" can be + set to doctest.is_private to skip over functions marked as private + using the underscore naming convention; see its docs for details. + + Advanced tomfoolery: testmod runs methods of a local instance of + class doctest.Tester, then merges the results into (or creates) + global Tester instance doctest.master. Methods of doctest.master + can be called directly too, if you want to do something unusual. + Passing report=0 to testmod is especially useful then, to delay + displaying a summary. Invoke doctest.master.summarize(verbose) + when you're done fiddling. + """ + global master + + if isprivate is not None: + warnings.warn("the isprivate argument is deprecated; " + "examine DocTestFinder.find() lists instead", + DeprecationWarning) + + # If no module was given, then use __main__. + if m is None: + # DWA - m will still be None if this wasn't invoked from the command + # line, in which case the following TypeError is about as good an error + # as we should expect + m = sys.modules.get('__main__') + + # Check that we were actually given a module. + if not inspect.ismodule(m): + raise TypeError("testmod: module required; %r" % (m,)) + + # If no name was given, then use the module's name. + if name is None: + name = m.__name__ + + # Find, parse, and run all tests in the given module. + finder = DocTestFinder(_namefilter=isprivate, exclude_empty=exclude_empty) + + if raise_on_error: + runner = DebugRunner(verbose=verbose, optionflags=optionflags) + else: + runner = DocTestRunner(verbose=verbose, optionflags=optionflags) + + for test in finder.find(m, name, globs=globs, extraglobs=extraglobs): + runner.run(test) + + if report: + runner.summarize() + + if master is None: + master = runner + else: + master.merge(runner) + + return runner.failures, runner.tries + +def testfile(filename, module_relative=True, name=None, package=None, + globs=None, verbose=None, report=True, optionflags=0, + extraglobs=None, raise_on_error=False, parser=DocTestParser()): + """ + Test examples in the given file. Return (#failures, #tests). + + Optional keyword arg "module_relative" specifies how filenames + should be interpreted: + + - If "module_relative" is True (the default), then "filename" + specifies a module-relative path. By default, this path is + relative to the calling module's directory; but if the + "package" argument is specified, then it is relative to that + package. To ensure os-independence, "filename" should use + "/" characters to separate path segments, and should not + be an absolute path (i.e., it may not begin with "/"). + + - If "module_relative" is False, then "filename" specifies an + os-specific path. The path may be absolute or relative (to + the current working directory). + + Optional keyword arg "name" gives the name of the test; by default + use the file's basename. + + Optional keyword argument "package" is a Python package or the + name of a Python package whose directory should be used as the + base directory for a module relative filename. If no package is + specified, then the calling module's directory is used as the base + directory for module relative filenames. It is an error to + specify "package" if "module_relative" is False. + + Optional keyword arg "globs" gives a dict to be used as the globals + when executing examples; by default, use {}. A copy of this dict + is actually used for each docstring, so that each docstring's + examples start with a clean slate. + + Optional keyword arg "extraglobs" gives a dictionary that should be + merged into the globals that are used to execute examples. By + default, no extra globals are used. + + Optional keyword arg "verbose" prints lots of stuff if true, prints + only failures if false; by default, it's true iff "-v" is in sys.argv. + + Optional keyword arg "report" prints a summary at the end when true, + else prints nothing at the end. In verbose mode, the summary is + detailed, else very brief (in fact, empty if all tests passed). + + Optional keyword arg "optionflags" or's together module constants, + and defaults to 0. Possible values (see the docs for details): + + DONT_ACCEPT_TRUE_FOR_1 + DONT_ACCEPT_BLANKLINE + NORMALIZE_WHITESPACE + ELLIPSIS + IGNORE_EXCEPTION_DETAIL + REPORT_UDIFF + REPORT_CDIFF + REPORT_NDIFF + REPORT_ONLY_FIRST_FAILURE + + Optional keyword arg "raise_on_error" raises an exception on the + first unexpected exception or failure. This allows failures to be + post-mortem debugged. + + Optional keyword arg "parser" specifies a DocTestParser (or + subclass) that should be used to extract tests from the files. + + Advanced tomfoolery: testmod runs methods of a local instance of + class doctest.Tester, then merges the results into (or creates) + global Tester instance doctest.master. Methods of doctest.master + can be called directly too, if you want to do something unusual. + Passing report=0 to testmod is especially useful then, to delay + displaying a summary. Invoke doctest.master.summarize(verbose) + when you're done fiddling. + """ + global master + + if package and not module_relative: + raise ValueError("Package may only be specified for module-" + "relative paths.") + + # Relativize the path + if module_relative: + package = _normalize_module(package) + filename = _module_relative_path(package, filename) + + # If no name was given, then use the file's name. + if name is None: + name = os.path.basename(filename) + + # Assemble the globals. + if globs is None: + globs = {} + else: + globs = globs.copy() + if extraglobs is not None: + globs.update(extraglobs) + + if raise_on_error: + runner = DebugRunner(verbose=verbose, optionflags=optionflags) + else: + runner = DocTestRunner(verbose=verbose, optionflags=optionflags) + + # Read the file, convert it to a test, and run it. + f = open(filename) + s = f.read() + f.close() + test = parser.get_doctest(s, globs, name, filename, 0) + runner.run(test) + + if report: + runner.summarize() + + if master is None: + master = runner + else: + master.merge(runner) + + return runner.failures, runner.tries + +def run_docstring_examples(f, globs, verbose=False, name="NoName", + compileflags=None, optionflags=0): + """ + Test examples in the given object's docstring (`f`), using `globs` + as globals. Optional argument `name` is used in failure messages. + If the optional argument `verbose` is true, then generate output + even if there are no failures. + + `compileflags` gives the set of flags that should be used by the + Python compiler when running the examples. If not specified, then + it will default to the set of future-import flags that apply to + `globs`. + + Optional keyword arg `optionflags` specifies options for the + testing and output. See the documentation for `testmod` for more + information. + """ + # Find, parse, and run all tests in the given module. + finder = DocTestFinder(verbose=verbose, recurse=False) + runner = DocTestRunner(verbose=verbose, optionflags=optionflags) + for test in finder.find(f, name, globs=globs): + runner.run(test, compileflags=compileflags) + +###################################################################### +## 7. Tester +###################################################################### +# This is provided only for backwards compatibility. It's not +# actually used in any way. + +class Tester: + def __init__(self, mod=None, globs=None, verbose=None, + isprivate=None, optionflags=0): + + warnings.warn("class Tester is deprecated; " + "use class doctest.DocTestRunner instead", + DeprecationWarning, stacklevel=2) + if mod is None and globs is None: + raise TypeError("Tester.__init__: must specify mod or globs") + if mod is not None and not inspect.ismodule(mod): + raise TypeError("Tester.__init__: mod must be a module; %r" % + (mod,)) + if globs is None: + globs = mod.__dict__ + self.globs = globs + + self.verbose = verbose + self.isprivate = isprivate + self.optionflags = optionflags + self.testfinder = DocTestFinder(_namefilter=isprivate) + self.testrunner = DocTestRunner(verbose=verbose, + optionflags=optionflags) + + def runstring(self, s, name): + test = DocTestParser().get_doctest(s, self.globs, name, None, None) + if self.verbose: + print("Running string", name) + (f,t) = self.testrunner.run(test) + if self.verbose: + print(f, "of", t, "examples failed in string", name) + return (f,t) + + def rundoc(self, object, name=None, module=None): + f = t = 0 + tests = self.testfinder.find(object, name, module=module, + globs=self.globs) + for test in tests: + (f2, t2) = self.testrunner.run(test) + (f,t) = (f+f2, t+t2) + return (f,t) + + def rundict(self, d, name, module=None): + import types + m = types.ModuleType(name) + m.__dict__.update(d) + if module is None: + module = False + return self.rundoc(m, name, module) + + def run__test__(self, d, name): + import types + m = types.ModuleType(name) + m.__test__ = d + return self.rundoc(m, name) + + def summarize(self, verbose=None): + return self.testrunner.summarize(verbose) + + def merge(self, other): + self.testrunner.merge(other.testrunner) + +###################################################################### +## 8. Unittest Support +###################################################################### + +_unittest_reportflags = 0 + +def set_unittest_reportflags(flags): + """Sets the unittest option flags. + + The old flag is returned so that a runner could restore the old + value if it wished to: + + >>> old = _unittest_reportflags + >>> set_unittest_reportflags(REPORT_NDIFF | + ... REPORT_ONLY_FIRST_FAILURE) == old + True + + >>> import doctest + >>> doctest._unittest_reportflags == (REPORT_NDIFF | + ... REPORT_ONLY_FIRST_FAILURE) + True + + Only reporting flags can be set: + + >>> set_unittest_reportflags(ELLIPSIS) + Traceback (most recent call last): + ... + ValueError: ('Only reporting flags allowed', 8) + + >>> set_unittest_reportflags(old) == (REPORT_NDIFF | + ... REPORT_ONLY_FIRST_FAILURE) + True + """ + global _unittest_reportflags + + if (flags & REPORTING_FLAGS) != flags: + raise ValueError("Only reporting flags allowed", flags) + old = _unittest_reportflags + _unittest_reportflags = flags + return old + + +class DocTestCase(unittest.TestCase): + + def __init__(self, test, optionflags=0, setUp=None, tearDown=None, + checker=None): + + unittest.TestCase.__init__(self) + self._dt_optionflags = optionflags + self._dt_checker = checker + self._dt_test = test + self._dt_setUp = setUp + self._dt_tearDown = tearDown + + def setUp(self): + test = self._dt_test + + if self._dt_setUp is not None: + self._dt_setUp(test) + + def tearDown(self): + test = self._dt_test + + if self._dt_tearDown is not None: + self._dt_tearDown(test) + + test.globs.clear() + + def runTest(self): + test = self._dt_test + old = sys.stdout + new = StringIO() + optionflags = self._dt_optionflags + + if not (optionflags & REPORTING_FLAGS): + # The option flags don't include any reporting flags, + # so add the default reporting flags + optionflags |= _unittest_reportflags + + runner = DocTestRunner(optionflags=optionflags, + checker=self._dt_checker, verbose=False) + + try: + runner.DIVIDER = "-"*70 + failures, tries = runner.run( + test, out=new.write, clear_globs=False) + finally: + sys.stdout = old + + if failures: + raise self.failureException(self.format_failure(new.getvalue())) + + def format_failure(self, err): + test = self._dt_test + if test.lineno is None: + lineno = 'unknown line number' + else: + lineno = '%s' % test.lineno + lname = '.'.join(test.name.split('.')[-1:]) + return ('Failed doctest test for %s\n' + ' File "%s", line %s, in %s\n\n%s' + % (test.name, test.filename, lineno, lname, err) + ) + + def debug(self): + r"""Run the test case without results and without catching exceptions + + The unit test framework includes a debug method on test cases + and test suites to support post-mortem debugging. The test code + is run in such a way that errors are not caught. This way a + caller can catch the errors and initiate post-mortem debugging. + + The DocTestCase provides a debug method that raises + UnexpectedException errors if there is an unexepcted + exception: + + >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42', + ... {}, 'foo', 'foo.py', 0) + >>> case = DocTestCase(test) + >>> try: + ... case.debug() + ... except UnexpectedException, failure: + ... pass + + The UnexpectedException contains the test, the example, and + the original exception: + + >>> failure.test is test + True + + >>> failure.example.want + '42\n' + + >>> exc_info = failure.exc_info + >>> raise exc_info[0], exc_info[1], exc_info[2] + Traceback (most recent call last): + ... + KeyError + + If the output doesn't match, then a DocTestFailure is raised: + + >>> test = DocTestParser().get_doctest(''' + ... >>> x = 1 + ... >>> x + ... 2 + ... ''', {}, 'foo', 'foo.py', 0) + >>> case = DocTestCase(test) + + >>> try: + ... case.debug() + ... except DocTestFailure, failure: + ... pass + + DocTestFailure objects provide access to the test: + + >>> failure.test is test + True + + As well as to the example: + + >>> failure.example.want + '2\n' + + and the actual output: + + >>> failure.got + '1\n' + + """ + + self.setUp() + runner = DebugRunner(optionflags=self._dt_optionflags, + checker=self._dt_checker, verbose=False) + runner.run(self._dt_test) + self.tearDown() + + def id(self): + return self._dt_test.name + + def __repr__(self): + name = self._dt_test.name.split('.') + return "%s (%s)" % (name[-1], '.'.join(name[:-1])) + + __str__ = __repr__ + + def shortDescription(self): + return "Doctest: " + self._dt_test.name + +def DocTestSuite(module=None, globs=None, extraglobs=None, test_finder=None, + **options): + """ + Convert doctest tests for a module to a unittest test suite. + + This converts each documentation string in a module that + contains doctest tests to a unittest test case. If any of the + tests in a doc string fail, then the test case fails. An exception + is raised showing the name of the file containing the test and a + (sometimes approximate) line number. + + The `module` argument provides the module to be tested. The argument + can be either a module or a module name. + + If no argument is given, the calling module is used. + + A number of options may be provided as keyword arguments: + + setUp + A set-up function. This is called before running the + tests in each file. The setUp function will be passed a DocTest + object. The setUp function can access the test globals as the + globs attribute of the test passed. + + tearDown + A tear-down function. This is called after running the + tests in each file. The tearDown function will be passed a DocTest + object. The tearDown function can access the test globals as the + globs attribute of the test passed. + + globs + A dictionary containing initial global variables for the tests. + + optionflags + A set of doctest option flags expressed as an integer. + """ + + if test_finder is None: + test_finder = DocTestFinder() + + module = _normalize_module(module) + tests = test_finder.find(module, globs=globs, extraglobs=extraglobs) + if globs is None: + globs = module.__dict__ + if not tests: + # Why do we want to do this? Because it reveals a bug that might + # otherwise be hidden. + raise ValueError(module, "has no tests") + + tests.sort() + suite = unittest.TestSuite() + for test in tests: + if len(test.examples) == 0: + continue + if not test.filename: + filename = module.__file__ + if filename[-4:] in (".pyc", ".pyo"): + filename = filename[:-1] + test.filename = filename + suite.addTest(DocTestCase(test, **options)) + + return suite + +class DocFileCase(DocTestCase): + + def id(self): + return '_'.join(self._dt_test.name.split('.')) + + def __repr__(self): + return self._dt_test.filename + __str__ = __repr__ + + def format_failure(self, err): + return ('Failed doctest test for %s\n File "%s", line 0\n\n%s' + % (self._dt_test.name, self._dt_test.filename, err) + ) + +def DocFileTest(path, module_relative=True, package=None, + globs=None, parser=DocTestParser(), **options): + if globs is None: + globs = {} + + if package and not module_relative: + raise ValueError("Package may only be specified for module-" + "relative paths.") + + # Relativize the path. + if module_relative: + package = _normalize_module(package) + path = _module_relative_path(package, path) + + # Find the file and read it. + name = os.path.basename(path) + f = open(path) + doc = f.read() + f.close() + + # Convert it to a test, and wrap it in a DocFileCase. + test = parser.get_doctest(doc, globs, name, path, 0) + return DocFileCase(test, **options) + +def DocFileSuite(*paths, **kw): + """A unittest suite for one or more doctest files. + + The path to each doctest file is given as a string; the + interpretation of that string depends on the keyword argument + "module_relative". + + A number of options may be provided as keyword arguments: + + module_relative + If "module_relative" is True, then the given file paths are + interpreted as os-independent module-relative paths. By + default, these paths are relative to the calling module's + directory; but if the "package" argument is specified, then + they are relative to that package. To ensure os-independence, + "filename" should use "/" characters to separate path + segments, and may not be an absolute path (i.e., it may not + begin with "/"). + + If "module_relative" is False, then the given file paths are + interpreted as os-specific paths. These paths may be absolute + or relative (to the current working directory). + + package + A Python package or the name of a Python package whose directory + should be used as the base directory for module relative paths. + If "package" is not specified, then the calling module's + directory is used as the base directory for module relative + filenames. It is an error to specify "package" if + "module_relative" is False. + + setUp + A set-up function. This is called before running the + tests in each file. The setUp function will be passed a DocTest + object. The setUp function can access the test globals as the + globs attribute of the test passed. + + tearDown + A tear-down function. This is called after running the + tests in each file. The tearDown function will be passed a DocTest + object. The tearDown function can access the test globals as the + globs attribute of the test passed. + + globs + A dictionary containing initial global variables for the tests. + + optionflags + A set of doctest option flags expressed as an integer. + + parser + A DocTestParser (or subclass) that should be used to extract + tests from the files. + """ + suite = unittest.TestSuite() + + # We do this here so that _normalize_module is called at the right + # level. If it were called in DocFileTest, then this function + # would be the caller and we might guess the package incorrectly. + if kw.get('module_relative', True): + kw['package'] = _normalize_module(kw.get('package')) + + for path in paths: + suite.addTest(DocFileTest(path, **kw)) + + return suite + +###################################################################### +## 9. Debugging Support +###################################################################### + +def script_from_examples(s): + r"""Extract script from text with examples. + + Converts text with examples to a Python script. Example input is + converted to regular code. Example output and all other words + are converted to comments: + + >>> text = ''' + ... Here are examples of simple math. + ... + ... Python has super accurate integer addition + ... + ... >>> 2 + 2 + ... 5 + ... + ... And very friendly error messages: + ... + ... >>> 1/0 + ... To Infinity + ... And + ... Beyond + ... + ... You can use logic if you want: + ... + ... >>> if 0: + ... ... blah + ... ... blah + ... ... + ... + ... Ho hum + ... ''' + + >>> print script_from_examples(text) + # Here are examples of simple math. + # + # Python has super accurate integer addition + # + 2 + 2 + # Expected: + ## 5 + # + # And very friendly error messages: + # + 1/0 + # Expected: + ## To Infinity + ## And + ## Beyond + # + # You can use logic if you want: + # + if 0: + blah + blah + # + # Ho hum + """ + output = [] + for piece in DocTestParser().parse(s): + if isinstance(piece, Example): + # Add the example's source code (strip trailing NL) + output.append(piece.source[:-1]) + # Add the expected output: + want = piece.want + if want: + output.append('# Expected:') + output += ['## '+l for l in want.split('\n')[:-1]] + else: + # Add non-example text. + output += [_comment_line(l) + for l in piece.split('\n')[:-1]] + + # Trim junk on both ends. + while output and output[-1] == '#': + output.pop() + while output and output[0] == '#': + output.pop(0) + # Combine the output, and return it. + return '\n'.join(output) + +def testsource(module, name): + """Extract the test sources from a doctest docstring as a script. + + Provide the module (or dotted name of the module) containing the + test to be debugged and the name (within the module) of the object + with the doc string with tests to be debugged. + """ + module = _normalize_module(module) + tests = DocTestFinder().find(module) + test = [t for t in tests if t.name == name] + if not test: + raise ValueError(name, "not found in tests") + test = test[0] + testsrc = script_from_examples(test.docstring) + return testsrc + +def debug_src(src, pm=False, globs=None): + """Debug a single doctest docstring, in argument `src`'""" + testsrc = script_from_examples(src) + debug_script(testsrc, pm, globs) + +def debug_script(src, pm=False, globs=None): + "Debug a test script. `src` is the script, as a string." + import pdb + + # Note that tempfile.NameTemporaryFile() cannot be used. As the + # docs say, a file so created cannot be opened by name a second time + # on modern Windows boxes, and execfile() needs to open it. + srcfilename = tempfile.mktemp(".py", "doctestdebug") + f = open(srcfilename, 'w') + f.write(src) + f.close() + + try: + if globs: + globs = globs.copy() + else: + globs = {} + + if pm: + try: + execfile(srcfilename, globs, globs) + except: + print(sys.exc_info()[1]) + pdb.post_mortem(sys.exc_info()[2]) + else: + # Note that %r is vital here. '%s' instead can, e.g., cause + # backslashes to get treated as metacharacters on Windows. + pdb.run("execfile(%r)" % srcfilename, globs, globs) + + finally: + os.remove(srcfilename) + +def debug(module, name, pm=False): + """Debug a single doctest docstring. + + Provide the module (or dotted name of the module) containing the + test to be debugged and the name (within the module) of the object + with the docstring with tests to be debugged. + """ + module = _normalize_module(module) + testsrc = testsource(module, name) + debug_script(testsrc, pm, module.__dict__) + +###################################################################### +## 10. Example Usage +###################################################################### +class _TestClass: + """ + A pointless class, for sanity-checking of docstring testing. + + Methods: + square() + get() + + >>> _TestClass(13).get() + _TestClass(-12).get() + 1 + >>> hex(_TestClass(13).square().get()) + '0xa9' + """ + + def __init__(self, val): + """val -> _TestClass object with associated value val. + + >>> t = _TestClass(123) + >>> print t.get() + 123 + """ + + self.val = val + + def square(self): + """square() -> square TestClass's associated value + + >>> _TestClass(13).square().get() + 169 + """ + + self.val = self.val ** 2 + return self + + def get(self): + """get() -> return TestClass's associated value. + + >>> x = _TestClass(-42) + >>> print x.get() + -42 + """ + + return self.val + +__test__ = {"_TestClass": _TestClass, + "string": r""" + Example of a string object, searched as-is. + >>> x = 1; y = 2 + >>> x + y, x * y + (3, 2) + """, + + "bool-int equivalence": r""" + In 2.2, boolean expressions displayed + 0 or 1. By default, we still accept + them. This can be disabled by passing + DONT_ACCEPT_TRUE_FOR_1 to the new + optionflags argument. + >>> 4 == 4 + 1 + >>> 4 == 4 + True + >>> 4 > 4 + 0 + >>> 4 > 4 + False + """, + + "blank lines": r""" + Blank lines can be marked with : + >>> print 'foo\n\nbar\n' + foo + + bar + + """, + + "ellipsis": r""" + If the ellipsis flag is used, then '...' can be used to + elide substrings in the desired output: + >>> print range(1000) #doctest: +ELLIPSIS + [0, 1, 2, ..., 999] + """, + + "whitespace normalization": r""" + If the whitespace normalization flag is used, then + differences in whitespace are ignored. + >>> print range(30) #doctest: +NORMALIZE_WHITESPACE + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29] + """, + } + +def _test(): + r = unittest.TextTestRunner() + r.run(DocTestSuite()) + +if __name__ == "__main__": + _test() + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/doctest.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/doctest.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d13e765a006315592bd500b6ec9ce4edbaad99ed GIT binary patch literal 86303 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/py26compat.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/py26compat.py new file mode 100644 index 0000000000..d4fb891af6 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/py26compat.py @@ -0,0 +1,14 @@ +import unittest + +try: + # provide skipIf for Python 2.4-2.6 + skipIf = unittest.skipIf +except AttributeError: + def skipIf(condition, reason): + def skipper(func): + def skip(*args, **kwargs): + return + if condition: + return skip + return func + return skipper diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/py26compat.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/py26compat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14e2826abb8a5da651782d77e7741af1d55c0b4c GIT binary patch literal 951 zcmcgq-D+Dg43k%n7FaF@Bdp0qN->P{4DZalQlvWq{LIUL3d-aqpS0~Q5OgcZOwz@`lv;3vX0 z!pxpSQzx)I1OE;Xu}I*KQ3w{{ie0AN2D_U_9^*V=RgTYl=2>jsmKm$Q=&YWr?;Bb;JF+*b-}|7xnM?&k`l3qn zWjfbE1xohn!k>9jWOBxZ)$7C%{7S>Zs4M}$= (2, 6): + urllib2.urlopen(url, timeout=5) + else: + urllib2.urlopen(url) + except URLError: + # ignore any errors; all that's important is the request + pass + self.thread.join() + self.socket.close() + + def base_url(self): + port = self.server_port + return 'http://127.0.0.1:%s/setuptools/tests/indexes/' % port + +class RequestRecorder(BaseHTTPRequestHandler): + def do_GET(self): + requests = vars(self.server).setdefault('requests', []) + requests.append(self) + self.send_response(200, 'OK') + +class MockServer(HTTPServer, threading.Thread): + """ + A simple HTTP Server that records the requests made to it. + """ + def __init__(self, server_address=('', 0), + RequestHandlerClass=RequestRecorder): + HTTPServer.__init__(self, server_address, RequestHandlerClass) + threading.Thread.__init__(self) + self.setDaemon(True) + self.requests = [] + + def run(self): + self.serve_forever() + + def url(self): + return 'http://localhost:%(server_port)s/' % vars(self) + url = property(url) diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/server.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/server.pyc new file mode 100644 index 0000000000000000000000000000000000000000..301812d289f71f57432a01628b605822ab9686f1 GIT binary patch literal 4663 zcmc&%+in|07@oBq$95B%QW08^U}-6JgyPU#P!w89kF=r6qm1?8+R9sT2r`jMKT~h7Rgf6RgS?ID#D{3&K+B3@IzKV>is$ErsS=F9ZgPLmB z)S#}~b?lf?x~8_Vuc}@ub)eLfc0M9ql;&{@VE2Ax7t|a+uS$FV3bBy`y2Zk4}7fjM#km?KgnYKT$@Jn zFP`i)MxEv*<=enkL;Lh81?p|9qshfX!v-Z}u` zIcP5VpZk{w`@BMSTs}PFq94P!`2e@_{=%6{Om6!V_Q?gGi~iPR&fiW_4H5eJD2@HD z_S3uvc*GDGa@o<)=6PyX1V1ZsCqUv(fkfatACB3!(6CC__2@!u6|~!E#z%+sT~EDG z>IM3eIw&j8mN*XKJOGGbZe5TS@MVEi7$#6@7+M~+RgAO{VKK^@vWL?~r`z@&A&B=d zisM2XW6xshRoLE6BV(GFR??X+sCccjli2>K+j*R1H`DDx$497cl6CIr?r5j8v2Xi% zb~k(0S#4eIJWRSBlUThx#)s)lmDLetVS?PWhWi2i1q{;*R0i+M>aL&UfrG+8Nv`5`REK1oh^og3?$b z=n@Er1O!Nm3nVDdp@2g~xQfUvGE>@hTje`Zv7>F1*H{r>JQqGHt6MS(2m-fT#*QiR zEGqkCG!qbpH1Aj`=bTa~8HEw0{0ibwDF@zB$0#Wv9*V*2;xC@s|58D!T?DzB+M7|u zI-~GzjXs6=heUGVd0sX@o#kndvoop!t?e~bkt=TS)X!9QL+zdtWpgm6cITbuXW@+0 zu{n)y6CRE*r^iul=l9?E{CUHCf<>m8wUw1Ct5;iJ;CE&1Qq#dc93l-YnU#ccCSpK( zflUTFAK8SGuQz4wa6?n9N91sqvt6q7P^f!RYP7>WcRY&nt77GN@j_#fAx3 zRpw{v-hx;5PJ4@`Gv0iu;>}MnM9~C8XF$-5N&zPHEdXXyBw9DiSbN=6W@Q?)UJdXo zF8@nSAyG`sc|<)_BQ1RV`l;dONjm%r^w_KFp5u;4OVE@6c$`AAXrPfo7#PEFkjJBx zL*g+EVj;w3$v;F6T}aS#4Fn<(0fe;UF)RZ^JBT|a;t60v zWX3AP2{)nc!j3YRy_m_H8eA8BPfCyEFP_O;e)wMEcECE&Ii9NvMLKO`y&a8GD=X0u z{u@*;d*~~D{j=E+*BTP+lOx6(Q;ynEB?$&kkMw}_{LwKUpA;G5@2A9~i&`sGB z>X>*8F5_w%(opGDPXPZ2G45@Z_1D;T2oP4*ReoW>s&A{THNH)lVpwGZO7tLe2b~mz zH~DRW8sBH-@4GvZI3gCKgeYoJWRVFv`~m82evl-#C9emEuKRlVNR_|2d}O^Kb;J~y zi02#ty8vp4OgXJB$*|Ox&es<>q?brVfnazi(t|t;YMiI#oNWoyfUz)OrkUFIxXenf z@1Ys;#qx1sk^tz-Y~sQU6Ld}al5|eVweh!{^C(oLAwCB+(&b4Oiwrv`;UD2ou&Ulr zC{i4RAQzNi(8FZ*2^Pl5jNdA0KR5QZy2DAwfOCR!1|Q@84YaY4|4&hZvuWh`3_Hb# z9XeMzV!=Ra+pepC`lo&I#yPmX0+o zFj~EQFpO+~NhJlEE6RujmwlP;ob-G#;Dsk6tEl^$D-*t9BsCPLimw^|7Q74P#nr{? Ee?DVWEC2ui literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_bdist_egg.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_bdist_egg.py new file mode 100644 index 0000000000..1a12218645 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_bdist_egg.py @@ -0,0 +1,69 @@ +"""develop tests +""" +import sys +import os, re, shutil, tempfile, unittest +import tempfile +import site + +from distutils.errors import DistutilsError +from setuptools.compat import StringIO +from setuptools.command.bdist_egg import bdist_egg +from setuptools.command import easy_install as easy_install_pkg +from setuptools.dist import Distribution + +SETUP_PY = """\ +from setuptools import setup + +setup(name='foo', py_modules=['hi']) +""" + +class TestDevelopTest(unittest.TestCase): + + def setUp(self): + self.dir = tempfile.mkdtemp() + self.old_cwd = os.getcwd() + os.chdir(self.dir) + f = open('setup.py', 'w') + f.write(SETUP_PY) + f.close() + f = open('hi.py', 'w') + f.write('1\n') + f.close() + if sys.version >= "2.6": + self.old_base = site.USER_BASE + site.USER_BASE = tempfile.mkdtemp() + self.old_site = site.USER_SITE + site.USER_SITE = tempfile.mkdtemp() + + def tearDown(self): + os.chdir(self.old_cwd) + shutil.rmtree(self.dir) + if sys.version >= "2.6": + shutil.rmtree(site.USER_BASE) + shutil.rmtree(site.USER_SITE) + site.USER_BASE = self.old_base + site.USER_SITE = self.old_site + + def test_bdist_egg(self): + dist = Distribution(dict( + script_name='setup.py', + script_args=['bdist_egg'], + name='foo', + py_modules=['hi'] + )) + os.makedirs(os.path.join('build', 'src')) + old_stdout = sys.stdout + sys.stdout = o = StringIO() + try: + dist.parse_command_line() + dist.run_commands() + finally: + sys.stdout = old_stdout + + # let's see if we got our egg link at the right place + [content] = os.listdir('dist') + self.assertTrue(re.match('foo-0.0.0-py[23].\d.egg$', content)) + +def test_suite(): + return unittest.makeSuite(TestDevelopTest) + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_bdist_egg.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_bdist_egg.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c49e3cd59a927887340cd4f2516decbb1af6ecf5 GIT binary patch literal 3182 zcmc&$>uwuW5T5m|vEy8tUT8&yB7umJh)au91hj}Y$&X4Xly$1ot*e#o-Pr5w#oBY+ zC@B3^o{0zG2M>aH10DdrZ#KSE{3o_{Jaf*RIXky+T>g8l(ck^+r-592%J}^rkNFcM z5b;1A2}%+>;(;mnl6a*VUly-C<16A-W_(q=>Wr_6SDW$6>sQ3PqU&XeS0t&6R~LtO zR3vUlvMSzcAy*}CO0p*2S|QgYUYBG;yv;(sBJov8w#3_lydvH;3F;EoWPDwYVXh&+ zio6qf>D`cEm4bJZPIX#M`npbE!#81^O}1@ltZ795;B(k=uwl8o9~nEfQEU$KJj;vq z6|8q`9;L&lKNc%>tn>q@`r&X`EYW`0GiQF38rzHG#VSqaQ6E;b)a*g+IM0%86WZy- zW?5{uqhylhwpeL2bfcB_lJL>aahC0TzCAhflPs9Vp?UObXB6$c{;Xj)VCM)P>=)jU zou`)0Ji%i=1_==Y1V%I#no9-+i7e?#MchuS47~wQmGDs5!(;vcu_9xK0X-M-OJd71 zuFS-$iZyPHOY+VU#}+w;P?EQfoI5gJ5nINiM~!ZKa%So7si}gFBFKiW-)k6p zf4}{pwS`~H12#-1$59-@H<9Edpo}oUaFkmf%8aG?VQ2@Zfof%O;FG8E!H9Yl>P^B_ zmrnD@hHATWaP<6{|LkR<8E1GoS~h1!?Ys$dgPPIPhG$rI&pQXM|KxG!KrQg9eh=s7 zTb-vzi!GjN@g)lzVSKE9AGfe1O3WBs@J)9Z+0nG$eG#RPT)79W=O?S1sl=|~VVb~cHs6C(DBy$HuoDF<8 z@vJ$GIccqOk)<=fC|ZPTTvTFF#FSBwtT`N9 zWwQOc)^bz%#=LkKzr%T9tU+=cB+9YvHUDNr*ibf4Y#xR#Q{u9Y+-oG)Np6sQKtliB zTObM)?rm~-E+;ERq4)Cr>@@upFQGswND9+JdXWldkG^Xveggx1Kt&b9B0y7DWC#)C z08;=dSfTh%DhM<10PQj^E3Gh90B+zlK!8a=;E=PofS476L&| zcmYH^hqkKyOv|eTe3}+BqL+`*B_vW*i51zi8vTJ2`uG|I63yZqUXY z`J_cqcZn4j`U9(#hL8YydM6>E#OT(fXGhA6vnbUX)50@0$fnk1!&nyHq?en}A7n|= zO9MZS($KPA^JzL;EPy7)n-QkyP0yGxw@3LjRB!T7y-9j@FlsUVTB+_1I8`SA71t`V zWC~mZfEK{+^6HtBoCvhQp1WANfSbBgbNFnO?%;RRDFb%aOO5iDqYi4ceXR)JS0DY0 z@$38Uhm62SBo9Cq4l4IQW2wt@5LFE4Ppwqntk(zN^uu!1E@i0~Qylq3dvp|U4t3_M ztJ5^HjFpZMR#|5XP*>xZ>z~G6vuOB6>J8lzr$q$SO7s078z3(Vvx>_1u;p^DxE$E- z*CY&*-2`C^>c6{o$iH{S#hTcwAdAt}M!%rHiY}s|_qW(e?fFP6V1c*)SIaHaIIms) zU+7OxhWhVq=>T6#``)FtX5|PO*~4JhJh(H0{0;q%Sx_XaVK6+z(=2gF L=(koY-M;%TRR`3e literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_build_ext.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_build_ext.py new file mode 100644 index 0000000000..a520ced9d6 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_build_ext.py @@ -0,0 +1,20 @@ +"""build_ext tests +""" +import os, shutil, tempfile, unittest +from distutils.command.build_ext import build_ext as distutils_build_ext +from setuptools.command.build_ext import build_ext +from setuptools.dist import Distribution + +class TestBuildExtTest(unittest.TestCase): + + def test_get_ext_filename(self): + # setuptools needs to give back the same + # result than distutils, even if the fullname + # is not in ext_map + dist = Distribution() + cmd = build_ext(dist) + cmd.ext_map['foo/bar'] = '' + res = cmd.get_ext_filename('foo') + wanted = distutils_build_ext.get_ext_filename(cmd, 'foo') + assert res == wanted + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_build_ext.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_build_ext.pyc new file mode 100644 index 0000000000000000000000000000000000000000..590ef8a8e20cf93a2ba8714416d054e35c1ba82c GIT binary patch literal 1267 zcmc&z&2G~`5T3Q2v* z4R`?fW<%2g4^T%t`_1g^{CuR$LRFrvCD2f1<*rUk1 z#y&;{oK z!!;>p3nFdvBGcxapRuuQ`}r??N1?(I_imprO&c&BLegQ=)J-T&qD&+<#l!)* z=rWJX%Z?&MAB!}$e2Mmjmu|MuI*ft5EvK~HU{ zf!b6LRVd`~I)v6jiqxfM`mti}lt#TGx_z8ShQy-4&vP`OMxSGCuJ0p2J{1oDb@c&(T^KS=<>fWDA gD1WB?#2Q!q-4f{P*;!8Xjc{dU#$EM7ZOPC34NP7c1iS-z2cV9G_y3#vrJaBVHI18~8` zF0?ZcO%~-B`V*YzJm-7z3;Bb5Kytbl06~=>@??>PK~K+2&!tbFZaDv0c29Qx{cVq? ze-6ICz(@ZJO-R&1Yf)%ZY*7b7F5A?xXR<>bXC@b@Q<%v`>J(@4qP|3(lIR_Z%QUJ` zr$QFnEl^ygkxLyn?-wavqEU@H%Xz;<@d}OV)T!tFGR3PjTBFVy`Y^LjVU;=?6uP8} zG`vH77+s>DiLQyh>)hpAw3{`)+zMY#y;gBLZWyJFcBB8|@33iM!0_l^q|L-cvEI+J zG|Tnnn^n1jZK*(C_)(%w5XZT;0&Ux5Q8GCA=4Kun%%T(6OcVV*ru4IP)X>UI#wJZ; z-H1lxG&8xzb!DKL1S9oqyPu}pkKG3T#zF5a7%2Vhdr|(7YbRRyPfhyqv!iUH9=nfR z%?BIf1g7y2iyykC4#g2Jx|d&?#ktG*&R^l9AEQxlIi8L9*>WGV00-Nmfp;AdisZGM z1uW?Cau$mC?Bb*O&W30RGZvje@qmoY8rZnDDSOD~+s2_`fjx6YX)0IubB{DTx!<}W`K~}HK_NxENE@6qT9eU%4 zJzVxJd#k@FBXnrrVPW}d=9p06p&D%qOBVM7&m^#!B+NZ5g%o4sc z6~z8HQ~l^i*aA+{R5PRm5v}os;Riq0JkE=IaY>*y?MQX<$v{(?AEt zWQOe+H5&J$SjoWXEabi{45JKwB1*MkUt$Of_Ut$?ry>kfK#Dc#SS2#)Jd2DHv+ez( z7tj6Y--)^xr#Nm2GY87_&O_NNjYEGX9~>SW%_pDEHqvaYid8S#`=0;Rm+gHq%?nQg z7@QBa4~}kzc$Gj=j;2-ImovzF$z%0pfS;-f+a!%Xg%tj^JBZBbCm+sfmNtgHBnMGqa--@HSD{LaIKP4D;8NVkcy%_(F zg^$pX^}s4Pb?XEBo>jM&E!V2s@8^=eYSkdsED0_4_B^!yfzGYa`utXC>3LTIC)<_D zKsBPNKxYm?!>Ge~h9$voIghS+Xt@i0pmCT-61;$zQ~ zfBwG&3S5ICL$u(^0u8`~C4zIqG9e*eQvuEbNg^$RBz+8(SzslyH<;5VzapGj&1uqQ z_GE4CW|*iHFKSp{Pt}=IGIa@E#Re^?UVwAD6&V8ifuto#P z0hR$XV$mHY$9x^eK24XMLWrMDO(oME8e2?33g|>$GSb9?;*&pLuvd8hFxhqr` z*sactJ~daS%T2l}&&=gUD!CD8XGX9S9&43zR`z!RISyW-5Erq@N>&ByxoTZh981j& zxa=*wa|m$i_Lzr-!e&$Yypr!K0>x*<10*cM#qTqn;6gs|yKb-OHk}@#Thm zP#MLgGQ;>*iJoN2??*`xN0%zh2k+5&AL zJirt@xya!UvN}V-_!GVQi4u#BUn1amZz=S6vtuaQO+MkF{u|oebP|V+BsC4dFKp;Z zWP+1eHQ3p+;=9pLvxcW$O`=SV;NjLd$h2y1AMEUXb9l6~e|*qB+J1x@lIXx^l`ks! zRUnDp&+^4uqBMt7j)z{JQF^B;t*UOE~D zN!Xg!k)BX3bKOn3Ih*5g-JY}W!p~8Ed^Rx5khd40ocA1_&qrMt;zM}?+PfI=ws;C3 o{|HClMfE1n@Gkuzr};ET$!C0Hff=aHdcx3}*Ho+3l2fw(2PW;ZaR2}S literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_dist_info.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_dist_info.py new file mode 100644 index 0000000000..a8adb68c2d --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_dist_info.py @@ -0,0 +1,83 @@ +"""Test .dist-info style distributions. +""" +import os +import shutil +import tempfile +import unittest +import textwrap + +try: + import ast +except: + pass + +import pkg_resources + +from setuptools.tests.py26compat import skipIf + +def DALS(s): + "dedent and left-strip" + return textwrap.dedent(s).lstrip() + +class TestDistInfo(unittest.TestCase): + + def test_distinfo(self): + dists = {} + for d in pkg_resources.find_distributions(self.tmpdir): + dists[d.project_name] = d + + assert len(dists) == 2, dists + + unversioned = dists['UnversionedDistribution'] + versioned = dists['VersionedDistribution'] + + assert versioned.version == '2.718' # from filename + assert unversioned.version == '0.3' # from METADATA + + @skipIf('ast' not in globals(), + "ast is used to test conditional dependencies (Python >= 2.6)") + def test_conditional_dependencies(self): + requires = [pkg_resources.Requirement.parse('splort==4'), + pkg_resources.Requirement.parse('quux>=1.1')] + + for d in pkg_resources.find_distributions(self.tmpdir): + self.assertEqual(d.requires(), requires[:1]) + self.assertEqual(d.requires(extras=('baz',)), requires) + self.assertEqual(d.extras, ['baz']) + + def setUp(self): + self.tmpdir = tempfile.mkdtemp() + versioned = os.path.join(self.tmpdir, + 'VersionedDistribution-2.718.dist-info') + os.mkdir(versioned) + metadata_file = open(os.path.join(versioned, 'METADATA'), 'w+') + try: + metadata_file.write(DALS( + """ + Metadata-Version: 1.2 + Name: VersionedDistribution + Requires-Dist: splort (4) + Provides-Extra: baz + Requires-Dist: quux (>=1.1); extra == 'baz' + """)) + finally: + metadata_file.close() + unversioned = os.path.join(self.tmpdir, + 'UnversionedDistribution.dist-info') + os.mkdir(unversioned) + metadata_file = open(os.path.join(unversioned, 'METADATA'), 'w+') + try: + metadata_file.write(DALS( + """ + Metadata-Version: 1.2 + Name: UnversionedDistribution + Version: 0.3 + Requires-Dist: splort (==4) + Provides-Extra: baz + Requires-Dist: quux (>=1.1); extra == 'baz' + """)) + finally: + metadata_file.close() + + def tearDown(self): + shutil.rmtree(self.tmpdir) diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_dist_info.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_dist_info.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51f27cbed11bec9cb2c64879a4bf8f7c3cf385bf GIT binary patch literal 3740 zcmc&$QFGfw5WbUaCw7xGw3L!kKy;>42e79Jot6nrhmhoQ7LBryK|%Zi(-jdEg(`^NInjaL5)Hl-;>X4eZD_kXMfOrVYEsQ&fqs>vI9O`FbYhc18*7ZvGFFspU34K$dnfqaSztg5ZJr1} z0_LRXS!8sZC+bUh8K^+T#_{98iB!kb$VytJz?o?h>X|vr{FII4y4;L%J+@CmS0Mxo z-9sx_X?8=iH)u6?!+0&~WGXn(YK3ugL$wCo=A$FCm&BX#)8=yhPV+(7YUHLUHDiB1C8(c|@py3!4)Kyc9){XR<_@MD~ztce_f_=eQTqpuMc) z(Z4~2LL5u+?8Z0&6n!Z+e!3`*E%5?Bq{R|FTiiWZ5WDaM15f~(_AQ~egeeY3eug50 zb>Z0NmMs>Jp$<4d9cWXzYYiCWWLp{kV0fGLp+Y3s!Rha}IJacFUB} zf92%aL6ibS@a1q2Za>6;o`(>!Bp2j+)+bg)R;){s!{EcAyLg9xC)CbBtH3ddLn}D# zBo0CfjUPFIN>z;VZHG!b)x4CPd#lcJ{q`b5l443BVo3guMotBQAs_~zjk^rYuEl`u z@HlV=-as)BU|j|*`T!&VTcQ#nK-$7VjY!fQy#X3QZZ9zi6R*8PNfkvmA3eAub{UhD z+bvCb(rJWTudd$W-oaq-?B429eJNy)p(+CvWe5p5)$*S+g}D^SDiM`SOK|>Obub7s z)d!XsAE}>dr^`@07XGLmBVVxU*qGI)BkXDXKiC`XN`}K!!PvTm|bz+_&ij`4}9a-hU>04OZDXm ztu1ibigT*z3Ed%5b&cqE#mNi6soq+g(0r67Ps2dz+9uV&iUa&l=)AES6_8Wq5?cJm z;o5OlSDhP}dSha){tODGqdgA`ow%T^w>G z_}NBs7`x;W`6eVEQA{-+-*!CD(1GN6{UjJf%JW>hbkPLC_~}MT%a626vbQeIc?=^qrqO?&C_>}lB};ll;q6l RYuR!hz%N)c*1T0N{0HB;b= "2.6": + self.old_has_site = easy_install_pkg.HAS_USER_SITE + self.old_file = easy_install_pkg.__file__ + self.old_base = site.USER_BASE + site.USER_BASE = tempfile.mkdtemp() + self.old_site = site.USER_SITE + site.USER_SITE = tempfile.mkdtemp() + easy_install_pkg.__file__ = site.USER_SITE + + def tearDown(self): + os.chdir(self.old_cwd) + shutil.rmtree(self.dir) + if sys.version >= "2.6": + shutil.rmtree(site.USER_BASE) + shutil.rmtree(site.USER_SITE) + site.USER_BASE = self.old_base + site.USER_SITE = self.old_site + easy_install_pkg.HAS_USER_SITE = self.old_has_site + easy_install_pkg.__file__ = self.old_file + + def test_user_install_implied(self): + easy_install_pkg.HAS_USER_SITE = True # disabled sometimes + #XXX: replace with something meaningfull + if sys.version < "2.6": + return #SKIP + dist = Distribution() + dist.script_name = 'setup.py' + cmd = easy_install(dist) + cmd.args = ['py'] + cmd.ensure_finalized() + self.assertTrue(cmd.user, 'user should be implied') + + def test_multiproc_atexit(self): + if not _MULTIPROC: + return + _LOG.info('this should not break') + + def test_user_install_not_implied_without_usersite_enabled(self): + easy_install_pkg.HAS_USER_SITE = False # usually enabled + #XXX: replace with something meaningfull + if sys.version < "2.6": + return #SKIP + dist = Distribution() + dist.script_name = 'setup.py' + cmd = easy_install(dist) + cmd.args = ['py'] + cmd.initialize_options() + self.assertFalse(cmd.user, 'NOT user should be implied') + + def test_local_index(self): + # make sure the local index is used + # when easy_install looks for installed + # packages + new_location = tempfile.mkdtemp() + target = tempfile.mkdtemp() + egg_file = os.path.join(new_location, 'foo-1.0.egg-info') + f = open(egg_file, 'w') + try: + f.write('Name: foo\n') + finally: + f.close() + + sys.path.append(target) + old_ppath = os.environ.get('PYTHONPATH') + os.environ['PYTHONPATH'] = os.path.pathsep.join(sys.path) + try: + dist = Distribution() + dist.script_name = 'setup.py' + cmd = easy_install(dist) + cmd.install_dir = target + cmd.args = ['foo'] + cmd.ensure_finalized() + cmd.local_index.scan([new_location]) + res = cmd.easy_install('foo') + self.assertEqual(os.path.realpath(res.location), + os.path.realpath(new_location)) + finally: + sys.path.remove(target) + for basedir in [new_location, target, ]: + if not os.path.exists(basedir) or not os.path.isdir(basedir): + continue + try: + shutil.rmtree(basedir) + except: + pass + if old_ppath is not None: + os.environ['PYTHONPATH'] = old_ppath + else: + del os.environ['PYTHONPATH'] + + def test_setup_requires(self): + """Regression test for Distribute issue #318 + + Ensure that a package with setup_requires can be installed when + setuptools is installed in the user site-packages without causing a + SandboxViolation. + """ + + test_setup_attrs = { + 'name': 'test_pkg', 'version': '0.0', + 'setup_requires': ['foobar'], + 'dependency_links': [os.path.abspath(self.dir)] + } + + test_pkg = os.path.join(self.dir, 'test_pkg') + test_setup_py = os.path.join(test_pkg, 'setup.py') + test_setup_cfg = os.path.join(test_pkg, 'setup.cfg') + os.mkdir(test_pkg) + + f = open(test_setup_py, 'w') + f.write(textwrap.dedent("""\ + import setuptools + setuptools.setup(**%r) + """ % test_setup_attrs)) + f.close() + + foobar_path = os.path.join(self.dir, 'foobar-0.1.tar.gz') + make_trivial_sdist( + foobar_path, + textwrap.dedent("""\ + import setuptools + setuptools.setup( + name='foobar', + version='0.1' + ) + """)) + + old_stdout = sys.stdout + old_stderr = sys.stderr + sys.stdout = StringIO() + sys.stderr = StringIO() + try: + try: + reset_setup_stop_context( + lambda: run_setup(test_setup_py, ['install']) + ) + except SandboxViolation: + self.fail('Installation caused SandboxViolation') + finally: + sys.stdout = old_stdout + sys.stderr = old_stderr + + +class TestSetupRequires(unittest.TestCase): + + def test_setup_requires_honors_fetch_params(self): + """ + When easy_install installs a source distribution which specifies + setup_requires, it should honor the fetch parameters (such as + allow-hosts, index-url, and find-links). + """ + # set up a server which will simulate an alternate package index. + p_index = setuptools.tests.server.MockServer() + p_index.start() + netloc = 1 + p_index_loc = urlparse(p_index.url)[netloc] + if p_index_loc.endswith(':0'): + # Some platforms (Jython) don't find a port to which to bind, + # so skip this test for them. + return + + # I realize this is all-but-impossible to read, because it was + # ported from some well-factored, safe code using 'with'. If you + # need to maintain this code, consider making the changes in + # the parent revision (of this comment) and then port the changes + # back for Python 2.4 (or deprecate Python 2.4). + + def install(dist_file): + def install_at(temp_install_dir): + def install_env(): + ei_params = ['--index-url', p_index.url, + '--allow-hosts', p_index_loc, + '--exclude-scripts', '--install-dir', temp_install_dir, + dist_file] + def install_clean_reset(): + def install_clean_argv(): + # attempt to install the dist. It should fail because + # it doesn't exist. + self.assertRaises(SystemExit, + easy_install_pkg.main, ei_params) + argv_context(install_clean_argv, ['easy_install']) + reset_setup_stop_context(install_clean_reset) + environment_context(install_env, PYTHONPATH=temp_install_dir) + tempdir_context(install_at) + + # create an sdist that has a build-time dependency. + self.create_sdist(install) + + # there should have been two or three requests to the server + # (three happens on Python 3.3a) + self.assertTrue(2 <= len(p_index.requests) <= 3) + self.assertEqual(p_index.requests[0].path, '/does-not-exist/') + + def create_sdist(self, installer): + """ + Create an sdist with a setup_requires dependency (of something that + doesn't exist) and invoke installer on it. + """ + def build_sdist(dir): + dist_path = os.path.join(dir, 'setuptools-test-fetcher-1.0.tar.gz') + make_trivial_sdist( + dist_path, + textwrap.dedent(""" + import setuptools + setuptools.setup( + name="setuptools-test-fetcher", + version="1.0", + setup_requires = ['does-not-exist'], + ) + """).lstrip()) + installer(dist_path) + tempdir_context(build_sdist) + + +def make_trivial_sdist(dist_path, setup_py): + """Create a simple sdist tarball at dist_path, containing just a + setup.py, the contents of which are provided by the setup_py string. + """ + + setup_py_file = tarfile.TarInfo(name='setup.py') + try: + # Python 3 (StringIO gets converted to io module) + MemFile = BytesIO + except AttributeError: + MemFile = StringIO + setup_py_bytes = MemFile(setup_py.encode('utf-8')) + setup_py_file.size = len(setup_py_bytes.getvalue()) + dist = tarfile.open(dist_path, 'w:gz') + try: + dist.addfile(setup_py_file, fileobj=setup_py_bytes) + finally: + dist.close() + + +def tempdir_context(f, cd=lambda dir:None): + """ + Invoke f in the context + """ + temp_dir = tempfile.mkdtemp() + orig_dir = os.getcwd() + try: + cd(temp_dir) + f(temp_dir) + finally: + cd(orig_dir) + shutil.rmtree(temp_dir) + +def environment_context(f, **updates): + """ + Invoke f in the context + """ + old_env = os.environ.copy() + os.environ.update(updates) + try: + f() + finally: + for key in updates: + del os.environ[key] + os.environ.update(old_env) + +def argv_context(f, repl): + """ + Invoke f in the context + """ + old_argv = sys.argv[:] + sys.argv[:] = repl + try: + f() + finally: + sys.argv[:] = old_argv + +def reset_setup_stop_context(f): + """ + When the setuptools tests are run using setup.py test, and then + one wants to invoke another setup() command (such as easy_install) + within those tests, it's necessary to reset the global variable + in distutils.core so that the setup() command will run naturally. + """ + setup_stop_after = distutils.core._setup_stop_after + distutils.core._setup_stop_after = None + try: + f() + finally: + distutils.core._setup_stop_after = setup_stop_after diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_easy_install.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_easy_install.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5421d755b3fcc838ebd293a9f4104bc9775fbe6a GIT binary patch literal 18379 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 DIBz-? literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_markerlib.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_markerlib.py new file mode 100644 index 0000000000..dae71cba46 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_markerlib.py @@ -0,0 +1,68 @@ +import os +import unittest +from setuptools.tests.py26compat import skipIf + +try: + import ast +except ImportError: + pass + +class TestMarkerlib(unittest.TestCase): + + @skipIf('ast' not in globals(), + "ast not available (Python < 2.6?)") + def test_markers(self): + from _markerlib import interpret, default_environment, compile + + os_name = os.name + + self.assertTrue(interpret("")) + + self.assertTrue(interpret("os.name != 'buuuu'")) + self.assertTrue(interpret("os_name != 'buuuu'")) + self.assertTrue(interpret("python_version > '1.0'")) + self.assertTrue(interpret("python_version < '5.0'")) + self.assertTrue(interpret("python_version <= '5.0'")) + self.assertTrue(interpret("python_version >= '1.0'")) + self.assertTrue(interpret("'%s' in os.name" % os_name)) + self.assertTrue(interpret("'%s' in os_name" % os_name)) + self.assertTrue(interpret("'buuuu' not in os.name")) + + self.assertFalse(interpret("os.name == 'buuuu'")) + self.assertFalse(interpret("os_name == 'buuuu'")) + self.assertFalse(interpret("python_version < '1.0'")) + self.assertFalse(interpret("python_version > '5.0'")) + self.assertFalse(interpret("python_version >= '5.0'")) + self.assertFalse(interpret("python_version <= '1.0'")) + self.assertFalse(interpret("'%s' not in os.name" % os_name)) + self.assertFalse(interpret("'buuuu' in os.name and python_version >= '5.0'")) + self.assertFalse(interpret("'buuuu' in os_name and python_version >= '5.0'")) + + environment = default_environment() + environment['extra'] = 'test' + self.assertTrue(interpret("extra == 'test'", environment)) + self.assertFalse(interpret("extra == 'doc'", environment)) + + def raises_nameError(): + try: + interpret("python.version == '42'") + except NameError: + pass + else: + raise Exception("Expected NameError") + + raises_nameError() + + def raises_syntaxError(): + try: + interpret("(x for x in (4,))") + except SyntaxError: + pass + else: + raise Exception("Expected SyntaxError") + + raises_syntaxError() + + statement = "python_version == '5'" + self.assertEqual(compile(statement).__doc__, statement) + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_markerlib.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_markerlib.pyc new file mode 100644 index 0000000000000000000000000000000000000000..246995796b0a5e12903dd60c36949b0531120a01 GIT binary patch literal 3044 zcmd5;TW{k;6h338xpaF;x4SLNE|U9z>`D+pw7VdbE!QHgfC}77yF`&JC!TcOI(G0( zs#Ho}Sj6R5@qc*b2f#VUxtO@!C$!+ilkqn*XU^rD&oTd8Up@H!kMDXgy;kt|6TDT3 zO@Lnk5kPz17tj`r8xR>VFrjUNxUA2nmY`jNXYm%417hXq>z^*Qn3+LhRX|5r@ zo#M>9a|ja+a8-g}2PW9=LTi!qHwZ#j%u11&yO%?M0Ve62@G}}&feF?GKupp5jFw@7 zWkED}09O^Raup^9Ot>;Yj z!Ze8oGS<3+crO_Y!$@lEg1U`Oq8hP3kk;N4%kGZwvZt`O4DaCVA+y-Kkf{oh%?FnK ze&an`T{G0O>_;@TTU^z`t!^4Sz%e$tiR#5^>`k-sX0o5m<~Hc2(&@JJ?dJ~s%@>X3siKMt(r+|RODSdvxl6-!V{P_R$| zHL0W=>(uAma?hfi(4eh0W}}P+Nzd*f!WS*17*rFR%MCusnHaHFBfm(i_gJgf;kibM z<^%F0Ykek}M>*a!W|X4cA2u@*9*&2yr)6LrAwv(-G)YM%K@;8Q5I-G`dvd6ek`4|5 zE52(|j~>+-Ho-@o(@?({bvw_(_|vGL${^S4hH>W$*&UsBGMzq*FFMV}2c56OZbyY$ zzB}}L=l-cw9VPW>sFNg89ZFKxdV|@kq=8kc<94YZDyg^<>^K!ktzrYh6dPh)l#G8l zms@Dt8C(4%wZ=pp=ixj1`|1v&^E4h`#@Zj}5_tge)GUg_lyHgsF7a0rnG(gPfy9ny`%1}FpQIzHDLdKYmwtqGUpycF zF!CeTQ_sU=;dxG#?2%<9qke7+(%dBD0k6;Lu}k(``ZK~5R@&E+bb6@(ubaJVHr%s9~d=b+t?P1&#u@N%LtAdHL)so#E!99t?*qI{D(|anmj%go|hHJ8zjLf zlAh<%7M#=5DCuIt-FpaR$)F+bz2;=N^f!$-q^PuIV^eUUU3w95ETcHoETs2o(p(xE zEDfjy&Bye@^)(0QvUpL|pALpes`((YnG?+S=f0A>-+vo2`_sybazNqpTVPGBiMnBm HIxE-T0AJFI literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_packageindex.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_packageindex.py new file mode 100644 index 0000000000..08969b7e8c --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_packageindex.py @@ -0,0 +1,187 @@ +"""Package Index Tests +""" +import sys +import unittest +import pkg_resources +from setuptools.compat import urllib2, httplib, HTTPError, unicode +import distutils.errors +import setuptools.package_index +from setuptools.tests.server import IndexServer + +class TestPackageIndex(unittest.TestCase): + + def test_bad_url_bad_port(self): + index = setuptools.package_index.PackageIndex() + url = 'http://127.0.0.1:0/nonesuch/test_package_index' + try: + v = index.open_url(url) + except Exception: + v = sys.exc_info()[1] + self.assertTrue(url in str(v)) + else: + self.assertTrue(isinstance(v, HTTPError)) + + def test_bad_url_typo(self): + # issue 16 + # easy_install inquant.contentmirror.plone breaks because of a typo + # in its home URL + index = setuptools.package_index.PackageIndex( + hosts=('www.example.com',) + ) + + url = 'url:%20https://svn.plone.org/svn/collective/inquant.contentmirror.plone/trunk' + try: + v = index.open_url(url) + except Exception: + v = sys.exc_info()[1] + self.assertTrue(url in str(v)) + else: + self.assertTrue(isinstance(v, HTTPError)) + + def test_bad_url_bad_status_line(self): + index = setuptools.package_index.PackageIndex( + hosts=('www.example.com',) + ) + + def _urlopen(*args): + raise httplib.BadStatusLine('line') + + index.opener = _urlopen + url = 'http://example.com' + try: + v = index.open_url(url) + except Exception: + v = sys.exc_info()[1] + self.assertTrue('line' in str(v)) + else: + raise AssertionError('Should have raise here!') + + def test_bad_url_double_scheme(self): + """ + A bad URL with a double scheme should raise a DistutilsError. + """ + index = setuptools.package_index.PackageIndex( + hosts=('www.example.com',) + ) + + # issue 20 + url = 'http://http://svn.pythonpaste.org/Paste/wphp/trunk' + try: + index.open_url(url) + except distutils.errors.DistutilsError: + error = sys.exc_info()[1] + msg = unicode(error) + assert 'nonnumeric port' in msg or 'getaddrinfo failed' in msg or 'Name or service not known' in msg + return + raise RuntimeError("Did not raise") + + def test_bad_url_screwy_href(self): + index = setuptools.package_index.PackageIndex( + hosts=('www.example.com',) + ) + + # issue #160 + if sys.version_info[0] == 2 and sys.version_info[1] == 7: + # this should not fail + url = 'http://example.com' + page = ('') + index.process_index(url, page) + + def test_url_ok(self): + index = setuptools.package_index.PackageIndex( + hosts=('www.example.com',) + ) + url = 'file:///tmp/test_package_index' + self.assertTrue(index.url_ok(url, True)) + + def test_links_priority(self): + """ + Download links from the pypi simple index should be used before + external download links. + https://bitbucket.org/tarek/distribute/issue/163 + + Usecase : + - someone uploads a package on pypi, a md5 is generated + - someone manually copies this link (with the md5 in the url) onto an + external page accessible from the package page. + - someone reuploads the package (with a different md5) + - while easy_installing, an MD5 error occurs because the external link + is used + -> Setuptools should use the link from pypi, not the external one. + """ + if sys.platform.startswith('java'): + # Skip this test on jython because binding to :0 fails + return + + # start an index server + server = IndexServer() + server.start() + index_url = server.base_url() + 'test_links_priority/simple/' + + # scan a test index + pi = setuptools.package_index.PackageIndex(index_url) + requirement = pkg_resources.Requirement.parse('foobar') + pi.find_packages(requirement) + server.stop() + + # the distribution has been found + self.assertTrue('foobar' in pi) + # we have only one link, because links are compared without md5 + self.assertTrue(len(pi['foobar'])==1) + # the link should be from the index + self.assertTrue('correct_md5' in pi['foobar'][0].location) + + def test_parse_bdist_wininst(self): + self.assertEqual(setuptools.package_index.parse_bdist_wininst( + 'reportlab-2.5.win32-py2.4.exe'), ('reportlab-2.5', '2.4', 'win32')) + self.assertEqual(setuptools.package_index.parse_bdist_wininst( + 'reportlab-2.5.win32.exe'), ('reportlab-2.5', None, 'win32')) + self.assertEqual(setuptools.package_index.parse_bdist_wininst( + 'reportlab-2.5.win-amd64-py2.7.exe'), ('reportlab-2.5', '2.7', 'win-amd64')) + self.assertEqual(setuptools.package_index.parse_bdist_wininst( + 'reportlab-2.5.win-amd64.exe'), ('reportlab-2.5', None, 'win-amd64')) + + def test__vcs_split_rev_from_url(self): + """ + Test the basic usage of _vcs_split_rev_from_url + """ + vsrfu = setuptools.package_index.PackageIndex._vcs_split_rev_from_url + url, rev = vsrfu('https://example.com/bar@2995') + self.assertEqual(url, 'https://example.com/bar') + self.assertEqual(rev, '2995') + +class TestContentCheckers(unittest.TestCase): + + def test_md5(self): + checker = setuptools.package_index.HashChecker.from_url( + 'http://foo/bar#md5=f12895fdffbd45007040d2e44df98478') + checker.feed('You should probably not be using MD5'.encode('ascii')) + self.assertEqual(checker.hash.hexdigest(), + 'f12895fdffbd45007040d2e44df98478') + self.assertTrue(checker.is_valid()) + + def test_other_fragment(self): + "Content checks should succeed silently if no hash is present" + checker = setuptools.package_index.HashChecker.from_url( + 'http://foo/bar#something%20completely%20different') + checker.feed('anything'.encode('ascii')) + self.assertTrue(checker.is_valid()) + + def test_blank_md5(self): + "Content checks should succeed if a hash is empty" + checker = setuptools.package_index.HashChecker.from_url( + 'http://foo/bar#md5=') + checker.feed('anything'.encode('ascii')) + self.assertTrue(checker.is_valid()) + + def test_get_hash_name_md5(self): + checker = setuptools.package_index.HashChecker.from_url( + 'http://foo/bar#md5=f12895fdffbd45007040d2e44df98478') + self.assertEqual(checker.hash_name, 'md5') + + def test_report(self): + checker = setuptools.package_index.HashChecker.from_url( + 'http://foo/bar#md5=f12895fdffbd45007040d2e44df98478') + rep = checker.report(lambda x: x, 'My message about %s') + self.assertEqual(rep, 'My message about md5') diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_packageindex.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_packageindex.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5410624f55704e5b438d843dce2b468a7c553c47 GIT binary patch literal 10016 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 N@!!kRE|kvx?!VQNoudE% literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_resources.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_resources.py new file mode 100644 index 0000000000..df5261d1ff --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_resources.py @@ -0,0 +1,615 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# NOTE: the shebang and encoding lines are for ScriptHeaderTests; do not remove +from unittest import TestCase, makeSuite; from pkg_resources import * +from setuptools.command.easy_install import get_script_header, is_sh +from setuptools.compat import StringIO, iteritems +import os, pkg_resources, sys, tempfile, shutil +try: frozenset +except NameError: + from sets import ImmutableSet as frozenset + +def safe_repr(obj, short=False): + """ copied from Python2.7""" + try: + result = repr(obj) + except Exception: + result = object.__repr__(obj) + if not short or len(result) < _MAX_LENGTH: + return result + return result[:_MAX_LENGTH] + ' [truncated]...' + +class Metadata(EmptyProvider): + """Mock object to return metadata as if from an on-disk distribution""" + + def __init__(self,*pairs): + self.metadata = dict(pairs) + + def has_metadata(self,name): + return name in self.metadata + + def get_metadata(self,name): + return self.metadata[name] + + def get_metadata_lines(self,name): + return yield_lines(self.get_metadata(name)) + +class DistroTests(TestCase): + + def testCollection(self): + # empty path should produce no distributions + ad = Environment([], platform=None, python=None) + self.assertEqual(list(ad), []) + self.assertEqual(ad['FooPkg'],[]) + ad.add(Distribution.from_filename("FooPkg-1.3_1.egg")) + ad.add(Distribution.from_filename("FooPkg-1.4-py2.4-win32.egg")) + ad.add(Distribution.from_filename("FooPkg-1.2-py2.4.egg")) + + # Name is in there now + self.assertTrue(ad['FooPkg']) + # But only 1 package + self.assertEqual(list(ad), ['foopkg']) + + # Distributions sort by version + self.assertEqual( + [dist.version for dist in ad['FooPkg']], ['1.4','1.3-1','1.2'] + ) + # Removing a distribution leaves sequence alone + ad.remove(ad['FooPkg'][1]) + self.assertEqual( + [dist.version for dist in ad['FooPkg']], ['1.4','1.2'] + ) + # And inserting adds them in order + ad.add(Distribution.from_filename("FooPkg-1.9.egg")) + self.assertEqual( + [dist.version for dist in ad['FooPkg']], ['1.9','1.4','1.2'] + ) + + ws = WorkingSet([]) + foo12 = Distribution.from_filename("FooPkg-1.2-py2.4.egg") + foo14 = Distribution.from_filename("FooPkg-1.4-py2.4-win32.egg") + req, = parse_requirements("FooPkg>=1.3") + + # Nominal case: no distros on path, should yield all applicable + self.assertEqual(ad.best_match(req,ws).version, '1.9') + # If a matching distro is already installed, should return only that + ws.add(foo14); self.assertEqual(ad.best_match(req,ws).version, '1.4') + + # If the first matching distro is unsuitable, it's a version conflict + ws = WorkingSet([]); ws.add(foo12); ws.add(foo14) + self.assertRaises(VersionConflict, ad.best_match, req, ws) + + # If more than one match on the path, the first one takes precedence + ws = WorkingSet([]); ws.add(foo14); ws.add(foo12); ws.add(foo14); + self.assertEqual(ad.best_match(req,ws).version, '1.4') + + def checkFooPkg(self,d): + self.assertEqual(d.project_name, "FooPkg") + self.assertEqual(d.key, "foopkg") + self.assertEqual(d.version, "1.3-1") + self.assertEqual(d.py_version, "2.4") + self.assertEqual(d.platform, "win32") + self.assertEqual(d.parsed_version, parse_version("1.3-1")) + + def testDistroBasics(self): + d = Distribution( + "/some/path", + project_name="FooPkg",version="1.3-1",py_version="2.4",platform="win32" + ) + self.checkFooPkg(d) + + d = Distribution("/some/path") + self.assertEqual(d.py_version, sys.version[:3]) + self.assertEqual(d.platform, None) + + def testDistroParse(self): + d = Distribution.from_filename("FooPkg-1.3_1-py2.4-win32.egg") + self.checkFooPkg(d) + d = Distribution.from_filename("FooPkg-1.3_1-py2.4-win32.egg-info") + self.checkFooPkg(d) + + def testDistroMetadata(self): + d = Distribution( + "/some/path", project_name="FooPkg", py_version="2.4", platform="win32", + metadata = Metadata( + ('PKG-INFO',"Metadata-Version: 1.0\nVersion: 1.3-1\n") + ) + ) + self.checkFooPkg(d) + + + def distRequires(self, txt): + return Distribution("/foo", metadata=Metadata(('depends.txt', txt))) + + def checkRequires(self, dist, txt, extras=()): + self.assertEqual( + list(dist.requires(extras)), + list(parse_requirements(txt)) + ) + + def testDistroDependsSimple(self): + for v in "Twisted>=1.5", "Twisted>=1.5\nZConfig>=2.0": + self.checkRequires(self.distRequires(v), v) + + + def testResolve(self): + ad = Environment([]); ws = WorkingSet([]) + # Resolving no requirements -> nothing to install + self.assertEqual( list(ws.resolve([],ad)), [] ) + # Request something not in the collection -> DistributionNotFound + self.assertRaises( + DistributionNotFound, ws.resolve, parse_requirements("Foo"), ad + ) + Foo = Distribution.from_filename( + "/foo_dir/Foo-1.2.egg", + metadata=Metadata(('depends.txt', "[bar]\nBaz>=2.0")) + ) + ad.add(Foo); ad.add(Distribution.from_filename("Foo-0.9.egg")) + + # Request thing(s) that are available -> list to activate + for i in range(3): + targets = list(ws.resolve(parse_requirements("Foo"), ad)) + self.assertEqual(targets, [Foo]) + list(map(ws.add,targets)) + self.assertRaises(VersionConflict, ws.resolve, + parse_requirements("Foo==0.9"), ad) + ws = WorkingSet([]) # reset + + # Request an extra that causes an unresolved dependency for "Baz" + self.assertRaises( + DistributionNotFound, ws.resolve,parse_requirements("Foo[bar]"), ad + ) + Baz = Distribution.from_filename( + "/foo_dir/Baz-2.1.egg", metadata=Metadata(('depends.txt', "Foo")) + ) + ad.add(Baz) + + # Activation list now includes resolved dependency + self.assertEqual( + list(ws.resolve(parse_requirements("Foo[bar]"), ad)), [Foo,Baz] + ) + # Requests for conflicting versions produce VersionConflict + self.assertRaises( VersionConflict, + ws.resolve, parse_requirements("Foo==1.2\nFoo!=1.2"), ad + ) + + def testDistroDependsOptions(self): + d = self.distRequires(""" + Twisted>=1.5 + [docgen] + ZConfig>=2.0 + docutils>=0.3 + [fastcgi] + fcgiapp>=0.1""") + self.checkRequires(d,"Twisted>=1.5") + self.checkRequires( + d,"Twisted>=1.5 ZConfig>=2.0 docutils>=0.3".split(), ["docgen"] + ) + self.checkRequires( + d,"Twisted>=1.5 fcgiapp>=0.1".split(), ["fastcgi"] + ) + self.checkRequires( + d,"Twisted>=1.5 ZConfig>=2.0 docutils>=0.3 fcgiapp>=0.1".split(), + ["docgen","fastcgi"] + ) + self.checkRequires( + d,"Twisted>=1.5 fcgiapp>=0.1 ZConfig>=2.0 docutils>=0.3".split(), + ["fastcgi", "docgen"] + ) + self.assertRaises(UnknownExtra, d.requires, ["foo"]) + + +class EntryPointTests(TestCase): + + def assertfields(self, ep): + self.assertEqual(ep.name,"foo") + self.assertEqual(ep.module_name,"setuptools.tests.test_resources") + self.assertEqual(ep.attrs, ("EntryPointTests",)) + self.assertEqual(ep.extras, ("x",)) + self.assertTrue(ep.load() is EntryPointTests) + self.assertEqual( + str(ep), + "foo = setuptools.tests.test_resources:EntryPointTests [x]" + ) + + def setUp(self): + self.dist = Distribution.from_filename( + "FooPkg-1.2-py2.4.egg", metadata=Metadata(('requires.txt','[x]'))) + + def testBasics(self): + ep = EntryPoint( + "foo", "setuptools.tests.test_resources", ["EntryPointTests"], + ["x"], self.dist + ) + self.assertfields(ep) + + def testParse(self): + s = "foo = setuptools.tests.test_resources:EntryPointTests [x]" + ep = EntryPoint.parse(s, self.dist) + self.assertfields(ep) + + ep = EntryPoint.parse("bar baz= spammity[PING]") + self.assertEqual(ep.name,"bar baz") + self.assertEqual(ep.module_name,"spammity") + self.assertEqual(ep.attrs, ()) + self.assertEqual(ep.extras, ("ping",)) + + ep = EntryPoint.parse(" fizzly = wocka:foo") + self.assertEqual(ep.name,"fizzly") + self.assertEqual(ep.module_name,"wocka") + self.assertEqual(ep.attrs, ("foo",)) + self.assertEqual(ep.extras, ()) + + def testRejects(self): + for ep in [ + "foo", "x=1=2", "x=a:b:c", "q=x/na", "fez=pish:tush-z", "x=f[a]>2", + ]: + try: EntryPoint.parse(ep) + except ValueError: pass + else: raise AssertionError("Should've been bad", ep) + + def checkSubMap(self, m): + self.assertEqual(len(m), len(self.submap_expect)) + for key, ep in iteritems(self.submap_expect): + self.assertEqual(repr(m.get(key)), repr(ep)) + + submap_expect = dict( + feature1=EntryPoint('feature1', 'somemodule', ['somefunction']), + feature2=EntryPoint('feature2', 'another.module', ['SomeClass'], ['extra1','extra2']), + feature3=EntryPoint('feature3', 'this.module', extras=['something']) + ) + submap_str = """ + # define features for blah blah + feature1 = somemodule:somefunction + feature2 = another.module:SomeClass [extra1,extra2] + feature3 = this.module [something] + """ + + def testParseList(self): + self.checkSubMap(EntryPoint.parse_group("xyz", self.submap_str)) + self.assertRaises(ValueError, EntryPoint.parse_group, "x a", "foo=bar") + self.assertRaises(ValueError, EntryPoint.parse_group, "x", + ["foo=baz", "foo=bar"]) + + def testParseMap(self): + m = EntryPoint.parse_map({'xyz':self.submap_str}) + self.checkSubMap(m['xyz']) + self.assertEqual(list(m.keys()),['xyz']) + m = EntryPoint.parse_map("[xyz]\n"+self.submap_str) + self.checkSubMap(m['xyz']) + self.assertEqual(list(m.keys()),['xyz']) + self.assertRaises(ValueError, EntryPoint.parse_map, ["[xyz]", "[xyz]"]) + self.assertRaises(ValueError, EntryPoint.parse_map, self.submap_str) + +class RequirementsTests(TestCase): + + def testBasics(self): + r = Requirement.parse("Twisted>=1.2") + self.assertEqual(str(r),"Twisted>=1.2") + self.assertEqual(repr(r),"Requirement.parse('Twisted>=1.2')") + self.assertEqual(r, Requirement("Twisted", [('>=','1.2')], ())) + self.assertEqual(r, Requirement("twisTed", [('>=','1.2')], ())) + self.assertNotEqual(r, Requirement("Twisted", [('>=','2.0')], ())) + self.assertNotEqual(r, Requirement("Zope", [('>=','1.2')], ())) + self.assertNotEqual(r, Requirement("Zope", [('>=','3.0')], ())) + self.assertNotEqual(r, Requirement.parse("Twisted[extras]>=1.2")) + + def testOrdering(self): + r1 = Requirement("Twisted", [('==','1.2c1'),('>=','1.2')], ()) + r2 = Requirement("Twisted", [('>=','1.2'),('==','1.2c1')], ()) + self.assertEqual(r1,r2) + self.assertEqual(str(r1),str(r2)) + self.assertEqual(str(r2),"Twisted==1.2c1,>=1.2") + + def testBasicContains(self): + r = Requirement("Twisted", [('>=','1.2')], ()) + foo_dist = Distribution.from_filename("FooPkg-1.3_1.egg") + twist11 = Distribution.from_filename("Twisted-1.1.egg") + twist12 = Distribution.from_filename("Twisted-1.2.egg") + self.assertTrue(parse_version('1.2') in r) + self.assertTrue(parse_version('1.1') not in r) + self.assertTrue('1.2' in r) + self.assertTrue('1.1' not in r) + self.assertTrue(foo_dist not in r) + self.assertTrue(twist11 not in r) + self.assertTrue(twist12 in r) + + def testAdvancedContains(self): + r, = parse_requirements("Foo>=1.2,<=1.3,==1.9,>2.0,!=2.5,<3.0,==4.5") + for v in ('1.2','1.2.2','1.3','1.9','2.0.1','2.3','2.6','3.0c1','4.5'): + self.assertTrue(v in r, (v,r)) + for v in ('1.2c1','1.3.1','1.5','1.9.1','2.0','2.5','3.0','4.0'): + self.assertTrue(v not in r, (v,r)) + + + def testOptionsAndHashing(self): + r1 = Requirement.parse("Twisted[foo,bar]>=1.2") + r2 = Requirement.parse("Twisted[bar,FOO]>=1.2") + r3 = Requirement.parse("Twisted[BAR,FOO]>=1.2.0") + self.assertEqual(r1,r2) + self.assertEqual(r1,r3) + self.assertEqual(r1.extras, ("foo","bar")) + self.assertEqual(r2.extras, ("bar","foo")) # extras are normalized + self.assertEqual(hash(r1), hash(r2)) + self.assertEqual( + hash(r1), hash(("twisted", ((">=",parse_version("1.2")),), + frozenset(["foo","bar"]))) + ) + + def testVersionEquality(self): + r1 = Requirement.parse("foo==0.3a2") + r2 = Requirement.parse("foo!=0.3a4") + d = Distribution.from_filename + + self.assertTrue(d("foo-0.3a4.egg") not in r1) + self.assertTrue(d("foo-0.3a1.egg") not in r1) + self.assertTrue(d("foo-0.3a4.egg") not in r2) + + self.assertTrue(d("foo-0.3a2.egg") in r1) + self.assertTrue(d("foo-0.3a2.egg") in r2) + self.assertTrue(d("foo-0.3a3.egg") in r2) + self.assertTrue(d("foo-0.3a5.egg") in r2) + + def testSetuptoolsProjectName(self): + """ + The setuptools project should implement the setuptools package. + """ + + self.assertEqual( + Requirement.parse('setuptools').project_name, 'setuptools') + # setuptools 0.7 and higher means setuptools. + self.assertEqual( + Requirement.parse('setuptools == 0.7').project_name, 'setuptools') + self.assertEqual( + Requirement.parse('setuptools == 0.7a1').project_name, 'setuptools') + self.assertEqual( + Requirement.parse('setuptools >= 0.7').project_name, 'setuptools') + + + + + + + + + + + +class ParseTests(TestCase): + + def testEmptyParse(self): + self.assertEqual(list(parse_requirements('')), []) + + def testYielding(self): + for inp,out in [ + ([], []), ('x',['x']), ([[]],[]), (' x\n y', ['x','y']), + (['x\n\n','y'], ['x','y']), + ]: + self.assertEqual(list(pkg_resources.yield_lines(inp)),out) + + def testSplitting(self): + self.assertEqual( + list( + pkg_resources.split_sections(""" + x + [Y] + z + + a + [b ] + # foo + c + [ d] + [q] + v + """ + ) + ), + [(None,["x"]), ("Y",["z","a"]), ("b",["c"]), ("d",[]), ("q",["v"])] + ) + self.assertRaises(ValueError,list,pkg_resources.split_sections("[foo")) + + def testSafeName(self): + self.assertEqual(safe_name("adns-python"), "adns-python") + self.assertEqual(safe_name("WSGI Utils"), "WSGI-Utils") + self.assertEqual(safe_name("WSGI Utils"), "WSGI-Utils") + self.assertEqual(safe_name("Money$$$Maker"), "Money-Maker") + self.assertNotEqual(safe_name("peak.web"), "peak-web") + + def testSafeVersion(self): + self.assertEqual(safe_version("1.2-1"), "1.2-1") + self.assertEqual(safe_version("1.2 alpha"), "1.2.alpha") + self.assertEqual(safe_version("2.3.4 20050521"), "2.3.4.20050521") + self.assertEqual(safe_version("Money$$$Maker"), "Money-Maker") + self.assertEqual(safe_version("peak.web"), "peak.web") + + def testSimpleRequirements(self): + self.assertEqual( + list(parse_requirements('Twis-Ted>=1.2-1')), + [Requirement('Twis-Ted',[('>=','1.2-1')], ())] + ) + self.assertEqual( + list(parse_requirements('Twisted >=1.2, \ # more\n<2.0')), + [Requirement('Twisted',[('>=','1.2'),('<','2.0')], ())] + ) + self.assertEqual( + Requirement.parse("FooBar==1.99a3"), + Requirement("FooBar", [('==','1.99a3')], ()) + ) + self.assertRaises(ValueError,Requirement.parse,">=2.3") + self.assertRaises(ValueError,Requirement.parse,"x\\") + self.assertRaises(ValueError,Requirement.parse,"x==2 q") + self.assertRaises(ValueError,Requirement.parse,"X==1\nY==2") + self.assertRaises(ValueError,Requirement.parse,"#") + + def testVersionEquality(self): + def c(s1,s2): + p1, p2 = parse_version(s1),parse_version(s2) + self.assertEqual(p1,p2, (s1,s2,p1,p2)) + + c('1.2-rc1', '1.2rc1') + c('0.4', '0.4.0') + c('0.4.0.0', '0.4.0') + c('0.4.0-0', '0.4-0') + c('0pl1', '0.0pl1') + c('0pre1', '0.0c1') + c('0.0.0preview1', '0c1') + c('0.0c1', '0-rc1') + c('1.2a1', '1.2.a.1'); c('1.2...a', '1.2a') + + def testVersionOrdering(self): + def c(s1,s2): + p1, p2 = parse_version(s1),parse_version(s2) + self.assertTrue(p1= (3,) and os.environ.get("LC_CTYPE") + in (None, "C", "POSIX")): + return + + class java: + class lang: + class System: + @staticmethod + def getProperty(property): + return "" + sys.modules["java"] = java + + platform = sys.platform + sys.platform = 'java1.5.0_13' + stdout, stderr = sys.stdout, sys.stderr + try: + # A mock sys.executable that uses a shebang line (this file) + exe = os.path.normpath(os.path.splitext(__file__)[0] + '.py') + self.assertEqual( + get_script_header('#!/usr/local/bin/python', executable=exe), + '#!/usr/bin/env %s\n' % exe) + + # Ensure we generate what is basically a broken shebang line + # when there's options, with a warning emitted + sys.stdout = sys.stderr = StringIO() + self.assertEqual(get_script_header('#!/usr/bin/python -x', + executable=exe), + '#!%s -x\n' % exe) + self.assertTrue('Unable to adapt shebang line' in sys.stdout.getvalue()) + sys.stdout = sys.stderr = StringIO() + self.assertEqual(get_script_header('#!/usr/bin/python', + executable=self.non_ascii_exe), + '#!%s -x\n' % self.non_ascii_exe) + self.assertTrue('Unable to adapt shebang line' in sys.stdout.getvalue()) + finally: + del sys.modules["java"] + sys.platform = platform + sys.stdout, sys.stderr = stdout, stderr + + + + +class NamespaceTests(TestCase): + + def setUp(self): + self._ns_pkgs = pkg_resources._namespace_packages.copy() + self._tmpdir = tempfile.mkdtemp(prefix="tests-setuptools-") + os.makedirs(os.path.join(self._tmpdir, "site-pkgs")) + self._prev_sys_path = sys.path[:] + sys.path.append(os.path.join(self._tmpdir, "site-pkgs")) + + def tearDown(self): + shutil.rmtree(self._tmpdir) + pkg_resources._namespace_packages = self._ns_pkgs.copy() + sys.path = self._prev_sys_path[:] + + def _assertIn(self, member, container): + """ assertIn and assertTrue does not exist in Python2.3""" + if member not in container: + standardMsg = '%s not found in %s' % (safe_repr(member), + safe_repr(container)) + self.fail(self._formatMessage(msg, standardMsg)) + + def test_two_levels_deep(self): + """ + Test nested namespace packages + Create namespace packages in the following tree : + site-packages-1/pkg1/pkg2 + site-packages-2/pkg1/pkg2 + Check both are in the _namespace_packages dict and that their __path__ + is correct + """ + sys.path.append(os.path.join(self._tmpdir, "site-pkgs2")) + os.makedirs(os.path.join(self._tmpdir, "site-pkgs", "pkg1", "pkg2")) + os.makedirs(os.path.join(self._tmpdir, "site-pkgs2", "pkg1", "pkg2")) + ns_str = "__import__('pkg_resources').declare_namespace(__name__)\n" + for site in ["site-pkgs", "site-pkgs2"]: + pkg1_init = open(os.path.join(self._tmpdir, site, + "pkg1", "__init__.py"), "w") + pkg1_init.write(ns_str) + pkg1_init.close() + pkg2_init = open(os.path.join(self._tmpdir, site, + "pkg1", "pkg2", "__init__.py"), "w") + pkg2_init.write(ns_str) + pkg2_init.close() + import pkg1 + self._assertIn("pkg1", pkg_resources._namespace_packages.keys()) + try: + import pkg1.pkg2 + except ImportError: + self.fail("Setuptools tried to import the parent namespace package") + # check the _namespace_packages dict + self._assertIn("pkg1.pkg2", pkg_resources._namespace_packages.keys()) + self.assertEqual(pkg_resources._namespace_packages["pkg1"], ["pkg1.pkg2"]) + # check the __path__ attribute contains both paths + self.assertEqual(pkg1.pkg2.__path__, [ + os.path.join(self._tmpdir, "site-pkgs", "pkg1", "pkg2"), + os.path.join(self._tmpdir, "site-pkgs2", "pkg1", "pkg2") ]) + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_resources.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_resources.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83fdaac48d9c8c18fcd22a44a6df874b6d928878 GIT binary patch literal 29508 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sandbox.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sandbox.py new file mode 100644 index 0000000000..1609ee861b --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sandbox.py @@ -0,0 +1,66 @@ +"""develop tests +""" +import sys +import os +import shutil +import unittest +import tempfile + +from setuptools.sandbox import DirectorySandbox, SandboxViolation + +def has_win32com(): + """ + Run this to determine if the local machine has win32com, and if it + does, include additional tests. + """ + if not sys.platform.startswith('win32'): + return False + try: + mod = __import__('win32com') + except ImportError: + return False + return True + +class TestSandbox(unittest.TestCase): + + def setUp(self): + self.dir = tempfile.mkdtemp() + + def tearDown(self): + shutil.rmtree(self.dir) + + def test_devnull(self): + if sys.version < '2.4': + return + sandbox = DirectorySandbox(self.dir) + sandbox.run(self._file_writer(os.devnull)) + + def _file_writer(path): + def do_write(): + f = open(path, 'w') + f.write('xxx') + f.close() + return do_write + + _file_writer = staticmethod(_file_writer) + + if has_win32com(): + def test_win32com(self): + """ + win32com should not be prevented from caching COM interfaces + in gen_py. + """ + import win32com + gen_py = win32com.__gen_path__ + target = os.path.join(gen_py, 'test_write') + sandbox = DirectorySandbox(self.dir) + try: + try: + sandbox.run(self._file_writer(target)) + except SandboxViolation: + self.fail("Could not create gen_py file due to SandboxViolation") + finally: + if os.path.exists(target): os.remove(target) + +if __name__ == '__main__': + unittest.main() diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sandbox.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sandbox.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20bd491279d88f1a0a1c90edb6a77b0426955872 GIT binary patch literal 3411 zcmc&$TW{P%6h33`CA;0wlF~xUMV3IYpf*CK5>kaIkQNC+Q*a6?tCcLTJ)3pnn>^zr zi_)he;GGAac;UD45BLG_ontR4HOC zcJRSo!gMdGbYzQaxfAB`tT+~COMjOXX=sxo7tIw`cQLjw%w0^DXkXF3DEU;8xk}ch zo#iF6(9a>To)GQk8`QB~Iv7%Qhm=yh=CSQTLYEIJF%3ODew}-Ekr>YwUaYOIvLx4D zG6z$8X%U5~mxa-SnTybPM@jy{t*FRuc#xZyC034!3vF(ANgkzjti3Rf6IKA5Mg2`# z196Dt0LxZd9X0Ob1>!-frI9Zs)SnksW{1qQVP(xxVi&Ui^Ds49J_JFMl|^NPz+S+* zFXZKZRe{yP`=hGXV>X@~ofYvIG|6NZpyE5zJseukrn^c0X*#cT{0ucq^65Q2tM{f~ zFYThp@8^fpTbmzFze;9PlURMT45Nc^Pn#*EsY_cFshNtdG6$w{>t?yMBU}d41uK17 zSV0JNH&jQt>XKSlT_s990$5rUi1V?O7&D*oo(GsTun9bpfK(vBXa&d};Q#@y5CCtF zbeGWpsOvsswEB|b2Hk4}xcWO|c1XlF;=%W9VVKL98jxYr2~mK12*BY*+X5f)lGRx` zPf~5!f7wCI?_%pXsT#wx8;nlp=Vf_T5AON4yv_vcN9zCTz65roE_6j$!DQ-reS3Vs zqP9tj5P~H$TWRfcAd9B{i%emh2fo&Dt<_<5uQPsY7;(i+whUMHg8L^^V!RSfkRyx1ig=U659wGsydet z2pB8DQH9{Ca3xV;WEb*eUZ<&~MzN!C+xR&zn{v!@GzYD89^MTbn$$(a?8OE~ti{U0 z5;Z@QR0~Bv5j_!8?ucI7k!;1pmgD#`?_mP!evumX)Zv`XUXU8b2yC&43k8e3Z`*PN z9*I?tkB^&3Wa}5D&YR@Q))gvB3)7}Q-ZVcA$TGAGG3(i8K{j4oH2!}FwBa~nYpyGi zrt$xq;Q4Q1YIrQV&%860)qe#yzRkC?aUo+zk_KlJ9$OgZ4@_;tv2rzh_rxJU8==Gz zgsh2}f@fWVOW2=139%0SaF>?X=>*+HU-)ZuBGJcw-_74Z;T}lgKIFp98;6{@`D?D| z@h)tLb zRgrm-l>I$#>)`_wc0}zwjI{aBK}qiI={zWxO@VJt_q?Xrks>WYBtdU(v+e%9FRFBC zb-Uf;+~CEv<}T#BUv#I z+YGLc6SQSbGS^vgsHGN4{%Njacs9DpA~Yd;+WN18+dvb<*`m_285(o8J=ps!!c`We zJ5mF61;OOvcO4;h#o3_ofH!d51wkHW8hsM?Q$c`Us75Ld{0+SNS9p4jCpMLs7%i7g zqD-UliG5Cm{!L7$dJA>7A<4?Ke9}1eoPmp9Z_pn(1J$aSg-IR+V{W~rf&@WaL{O4r zxWS3^HEfSMPb^!~m&I&_(_U=gi1LjOGNdN!< literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sdist.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sdist.py new file mode 100644 index 0000000000..438f7cedbd --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sdist.py @@ -0,0 +1,400 @@ +# -*- coding: utf-8 -*- +"""sdist tests""" + + +import os +import shutil +import sys +import tempfile +import unittest +import unicodedata + +from setuptools.compat import StringIO, unicode +from setuptools.command.sdist import sdist +from setuptools.command.egg_info import manifest_maker +from setuptools.dist import Distribution + + +SETUP_ATTRS = { + 'name': 'sdist_test', + 'version': '0.0', + 'packages': ['sdist_test'], + 'package_data': {'sdist_test': ['*.txt']} +} + + +SETUP_PY = """\ +from setuptools import setup + +setup(**%r) +""" % SETUP_ATTRS + + +if sys.version_info >= (3,): + LATIN1_FILENAME = 'smörbröd.py'.encode('latin-1') +else: + LATIN1_FILENAME = 'sm\xf6rbr\xf6d.py' + + +# Cannot use context manager because of Python 2.4 +def quiet(): + global old_stdout, old_stderr + old_stdout, old_stderr = sys.stdout, sys.stderr + sys.stdout, sys.stderr = StringIO(), StringIO() + +def unquiet(): + sys.stdout, sys.stderr = old_stdout, old_stderr + + +# Fake byte literals for Python <= 2.5 +def b(s, encoding='utf-8'): + if sys.version_info >= (3,): + return s.encode(encoding) + return s + + +# Convert to POSIX path +def posix(path): + if sys.version_info >= (3,) and not isinstance(path, str): + return path.replace(os.sep.encode('ascii'), b('/')) + else: + return path.replace(os.sep, '/') + + +# HFS Plus uses decomposed UTF-8 +def decompose(path): + if isinstance(path, unicode): + return unicodedata.normalize('NFD', path) + try: + path = path.decode('utf-8') + path = unicodedata.normalize('NFD', path) + path = path.encode('utf-8') + except UnicodeError: + pass # Not UTF-8 + return path + + +class TestSdistTest(unittest.TestCase): + + def setUp(self): + self.temp_dir = tempfile.mkdtemp() + f = open(os.path.join(self.temp_dir, 'setup.py'), 'w') + f.write(SETUP_PY) + f.close() + # Set up the rest of the test package + test_pkg = os.path.join(self.temp_dir, 'sdist_test') + os.mkdir(test_pkg) + # *.rst was not included in package_data, so c.rst should not be + # automatically added to the manifest when not under version control + for fname in ['__init__.py', 'a.txt', 'b.txt', 'c.rst']: + # Just touch the files; their contents are irrelevant + open(os.path.join(test_pkg, fname), 'w').close() + + self.old_cwd = os.getcwd() + os.chdir(self.temp_dir) + + def tearDown(self): + os.chdir(self.old_cwd) + shutil.rmtree(self.temp_dir) + + def test_package_data_in_sdist(self): + """Regression test for pull request #4: ensures that files listed in + package_data are included in the manifest even if they're not added to + version control. + """ + + dist = Distribution(SETUP_ATTRS) + dist.script_name = 'setup.py' + cmd = sdist(dist) + cmd.ensure_finalized() + + # squelch output + quiet() + try: + cmd.run() + finally: + unquiet() + + manifest = cmd.filelist.files + self.assertTrue(os.path.join('sdist_test', 'a.txt') in manifest) + self.assertTrue(os.path.join('sdist_test', 'b.txt') in manifest) + self.assertTrue(os.path.join('sdist_test', 'c.rst') not in manifest) + + def test_manifest_is_written_with_utf8_encoding(self): + # Test for #303. + dist = Distribution(SETUP_ATTRS) + dist.script_name = 'setup.py' + mm = manifest_maker(dist) + mm.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') + os.mkdir('sdist_test.egg-info') + + # UTF-8 filename + filename = os.path.join('sdist_test', 'smörbröd.py') + + # Add UTF-8 filename and write manifest + quiet() + try: + mm.run() + mm.filelist.files.append(filename) + mm.write_manifest() + finally: + unquiet() + + manifest = open(mm.manifest, 'rbU') + contents = manifest.read() + manifest.close() + + # The manifest should be UTF-8 encoded + try: + u_contents = contents.decode('UTF-8') + except UnicodeDecodeError: + e = sys.exc_info()[1] + self.fail(e) + + # The manifest should contain the UTF-8 filename + if sys.version_info >= (3,): + self.assertTrue(posix(filename) in u_contents) + else: + self.assertTrue(posix(filename) in contents) + + # Python 3 only + if sys.version_info >= (3,): + + def test_write_manifest_allows_utf8_filenames(self): + # Test for #303. + dist = Distribution(SETUP_ATTRS) + dist.script_name = 'setup.py' + mm = manifest_maker(dist) + mm.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') + os.mkdir('sdist_test.egg-info') + + # UTF-8 filename + filename = os.path.join(b('sdist_test'), b('smörbröd.py')) + + # Add filename and write manifest + quiet() + try: + mm.run() + u_filename = filename.decode('utf-8') + mm.filelist.files.append(u_filename) + # Re-write manifest + mm.write_manifest() + finally: + unquiet() + + manifest = open(mm.manifest, 'rbU') + contents = manifest.read() + manifest.close() + + # The manifest should be UTF-8 encoded + try: + contents.decode('UTF-8') + except UnicodeDecodeError: + e = sys.exc_info()[1] + self.fail(e) + + # The manifest should contain the UTF-8 filename + self.assertTrue(posix(filename) in contents) + + # The filelist should have been updated as well + self.assertTrue(u_filename in mm.filelist.files) + + def test_write_manifest_skips_non_utf8_filenames(self): + # Test for #303. + dist = Distribution(SETUP_ATTRS) + dist.script_name = 'setup.py' + mm = manifest_maker(dist) + mm.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') + os.mkdir('sdist_test.egg-info') + + # Latin-1 filename + filename = os.path.join(b('sdist_test'), LATIN1_FILENAME) + + # Add filename with surrogates and write manifest + quiet() + try: + mm.run() + u_filename = filename.decode('utf-8', 'surrogateescape') + mm.filelist.files.append(u_filename) + # Re-write manifest + mm.write_manifest() + finally: + unquiet() + + manifest = open(mm.manifest, 'rbU') + contents = manifest.read() + manifest.close() + + # The manifest should be UTF-8 encoded + try: + contents.decode('UTF-8') + except UnicodeDecodeError: + e = sys.exc_info()[1] + self.fail(e) + + # The Latin-1 filename should have been skipped + self.assertFalse(posix(filename) in contents) + + # The filelist should have been updated as well + self.assertFalse(u_filename in mm.filelist.files) + + def test_manifest_is_read_with_utf8_encoding(self): + # Test for #303. + dist = Distribution(SETUP_ATTRS) + dist.script_name = 'setup.py' + cmd = sdist(dist) + cmd.ensure_finalized() + + # Create manifest + quiet() + try: + cmd.run() + finally: + unquiet() + + # Add UTF-8 filename to manifest + filename = os.path.join(b('sdist_test'), b('smörbröd.py')) + cmd.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') + manifest = open(cmd.manifest, 'ab') + manifest.write(b('\n')+filename) + manifest.close() + + # The file must exist to be included in the filelist + open(filename, 'w').close() + + # Re-read manifest + cmd.filelist.files = [] + quiet() + try: + cmd.read_manifest() + finally: + unquiet() + + # The filelist should contain the UTF-8 filename + if sys.version_info >= (3,): + filename = filename.decode('utf-8') + self.assertTrue(filename in cmd.filelist.files) + + # Python 3 only + if sys.version_info >= (3,): + + def test_read_manifest_skips_non_utf8_filenames(self): + # Test for #303. + dist = Distribution(SETUP_ATTRS) + dist.script_name = 'setup.py' + cmd = sdist(dist) + cmd.ensure_finalized() + + # Create manifest + quiet() + try: + cmd.run() + finally: + unquiet() + + # Add Latin-1 filename to manifest + filename = os.path.join(b('sdist_test'), LATIN1_FILENAME) + cmd.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') + manifest = open(cmd.manifest, 'ab') + manifest.write(b('\n')+filename) + manifest.close() + + # The file must exist to be included in the filelist + open(filename, 'w').close() + + # Re-read manifest + cmd.filelist.files = [] + quiet() + try: + try: + cmd.read_manifest() + except UnicodeDecodeError: + e = sys.exc_info()[1] + self.fail(e) + finally: + unquiet() + + # The Latin-1 filename should have been skipped + filename = filename.decode('latin-1') + self.assertFalse(filename in cmd.filelist.files) + + def test_sdist_with_utf8_encoded_filename(self): + # Test for #303. + dist = Distribution(SETUP_ATTRS) + dist.script_name = 'setup.py' + cmd = sdist(dist) + cmd.ensure_finalized() + + # UTF-8 filename + filename = os.path.join(b('sdist_test'), b('smörbröd.py')) + open(filename, 'w').close() + + quiet() + try: + cmd.run() + finally: + unquiet() + + if sys.platform == 'darwin': + filename = decompose(filename) + + if sys.version_info >= (3,): + fs_enc = sys.getfilesystemencoding() + + if sys.platform == 'win32': + if fs_enc == 'cp1252': + # Python 3 mangles the UTF-8 filename + filename = filename.decode('cp1252') + self.assertTrue(filename in cmd.filelist.files) + else: + filename = filename.decode('mbcs') + self.assertTrue(filename in cmd.filelist.files) + else: + filename = filename.decode('utf-8') + self.assertTrue(filename in cmd.filelist.files) + else: + self.assertTrue(filename in cmd.filelist.files) + + def test_sdist_with_latin1_encoded_filename(self): + # Test for #303. + dist = Distribution(SETUP_ATTRS) + dist.script_name = 'setup.py' + cmd = sdist(dist) + cmd.ensure_finalized() + + # Latin-1 filename + filename = os.path.join(b('sdist_test'), LATIN1_FILENAME) + open(filename, 'w').close() + self.assertTrue(os.path.isfile(filename)) + + quiet() + try: + cmd.run() + finally: + unquiet() + + if sys.version_info >= (3,): + #not all windows systems have a default FS encoding of cp1252 + if sys.platform == 'win32': + # Latin-1 is similar to Windows-1252 however + # on mbcs filesys it is not in latin-1 encoding + fs_enc = sys.getfilesystemencoding() + if fs_enc == 'mbcs': + filename = filename.decode('mbcs') + else: + filename = filename.decode('latin-1') + + self.assertTrue(filename in cmd.filelist.files) + else: + # The Latin-1 filename should have been skipped + filename = filename.decode('latin-1') + self.assertFalse(filename in cmd.filelist.files) + else: + # No conversion takes place under Python 2 and the file + # is included. We shall keep it that way for BBB. + self.assertTrue(filename in cmd.filelist.files) + + +def test_suite(): + return unittest.defaultTestLoader.loadTestsFromName(__name__) + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sdist.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sdist.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7682f19dd8840706f33914a32602c8264c9a5a4f GIT binary patch literal 11272 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 CAk8rV literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_upload_docs.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_upload_docs.py new file mode 100644 index 0000000000..769f16cc5a --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_upload_docs.py @@ -0,0 +1,72 @@ +"""build_ext tests +""" +import sys, os, shutil, tempfile, unittest, site, zipfile +from setuptools.command.upload_docs import upload_docs +from setuptools.dist import Distribution + +SETUP_PY = """\ +from setuptools import setup + +setup(name='foo') +""" + +class TestUploadDocsTest(unittest.TestCase): + def setUp(self): + self.dir = tempfile.mkdtemp() + setup = os.path.join(self.dir, 'setup.py') + f = open(setup, 'w') + f.write(SETUP_PY) + f.close() + self.old_cwd = os.getcwd() + os.chdir(self.dir) + + self.upload_dir = os.path.join(self.dir, 'build') + os.mkdir(self.upload_dir) + + # A test document. + f = open(os.path.join(self.upload_dir, 'index.html'), 'w') + f.write("Hello world.") + f.close() + + # An empty folder. + os.mkdir(os.path.join(self.upload_dir, 'empty')) + + if sys.version >= "2.6": + self.old_base = site.USER_BASE + site.USER_BASE = upload_docs.USER_BASE = tempfile.mkdtemp() + self.old_site = site.USER_SITE + site.USER_SITE = upload_docs.USER_SITE = tempfile.mkdtemp() + + def tearDown(self): + os.chdir(self.old_cwd) + shutil.rmtree(self.dir) + if sys.version >= "2.6": + shutil.rmtree(site.USER_BASE) + shutil.rmtree(site.USER_SITE) + site.USER_BASE = self.old_base + site.USER_SITE = self.old_site + + def test_create_zipfile(self): + # Test to make sure zipfile creation handles common cases. + # This explicitly includes a folder containing an empty folder. + + dist = Distribution() + + cmd = upload_docs(dist) + cmd.upload_dir = self.upload_dir + cmd.target_dir = self.upload_dir + tmp_dir = tempfile.mkdtemp() + tmp_file = os.path.join(tmp_dir, 'foo.zip') + try: + zip_file = cmd.create_zipfile(tmp_file) + + assert zipfile.is_zipfile(tmp_file) + + zip_file = zipfile.ZipFile(tmp_file) # woh... + + assert zip_file.namelist() == ['index.html'] + + zip_file.close() + finally: + shutil.rmtree(tmp_dir) + diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_upload_docs.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_upload_docs.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3b2713f59729b2513f12cd15c940eaec87433cc GIT binary patch literal 2853 zcmc&$>uwuG6h6DYBzEjLZAmE&qAnNJ{HTHc00{viZGwt~qOeI+YFS#@-gUChUaXyQ z(^TOP;WZGC!pramJOF&(**H$q|J2qTpEGmj%$alf#-)Fn_2I+6e;&!jr-a|{G0Yzz zfk+S3k-(MMksg?Wcctgf`I7WXbG|IS@|>?ouQKPW(yPw-CFw0GUy^uPlA82t;?Qnc z;<_X&(p!Oy-3{l=lrff<|Zt`m@(rrkiUZ!&wvue)!V1ZD_2iNB`op z({Zq5S3qXdI2#0hkc~_+*}&vhWNaP{XEw@G^EoEQd6u+IXlGNKWwB{T$u!GtF;lPW zLMI(0;kOUQS@z)5y1j`_`#A7G&2PavrOQb2_{SLLBajf0#2tipC_+aDadUO1EZ$y+ zp&xM!zCz^+ISAKQGR^?3dL(!EpS0+nhm*w0M zheC}e9PX~qjjgD$#)Ty+UN>G6SmU`(Rb5rprrN}LuW2`#LulhtS3N*3-}GShjjdH~ zQV&`(S!2GBE0S+H_J&Must30gfhc3vzbW<|rO;Scjoa5W)>UI&Qmy5pWOj@e4inv- zo>~U{#8yDHj7%L|lm_9;?vYJm!%}$~#&Om@$?`bps%Dr>?Wtj!9(BL$yo+B%83gm= zC=TrsgycA&i~!;6D7P+tGh><8>A)T-Gs&V@^D~64=b`*-}`ZYvCgepvW1~A9_x8U12L%M4tFatF}UFC{$XT~X2broDBX<5 zc^F*bhEdwz3Wu}9{_d$g%F^xhMgLLvtNu^Xu+O6&P6wmo!C`3nix%x`yDRnQ*G3mI ztGqfC52mYRJ_Zq|<=nw&I(5)Bcf(mL-KSK#=eC@Na~oqszd4w!Cm05Wb5T-7uPr)+ za#7gG3;GNQ#(JGx)HUMBe!FZa%IG?FA~vG!mc_4WFEx~}U)Ctk-nlHUCM1s;@(4HH z4G^sZa|GmymCX~IhoQ#`^wvpkldvkiJ0y2W-XqxnQ3UkfCx`L2@24KZxbD?vFH))k-0d$8*yDR3;3r#Myxa2$w z;Ov@AZty_n{TECWAirY>5O_tpucGNS!0Bk3S%cbq-YwpleQgIhdf!Jkdkl(46GdTg z)#E#78N^W@4s7Vd@+B0_d4)D}xkT+vW5S$I;C7zlwWHBqH2r}f#uV|ri}6r;EeKwl z&5Z9SSul$sdiS8vBb ucrkd!6+PC6rzOpjQ{()n^n@=AU3}YdQjfkVlK34R(w?k3`$VE@)%_1^Bzh$P literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site.py b/PythonEnv/2.7/Lib/site.py new file mode 100644 index 0000000000..3de978a0e8 --- /dev/null +++ b/PythonEnv/2.7/Lib/site.py @@ -0,0 +1,758 @@ +"""Append module search paths for third-party packages to sys.path. + +**************************************************************** +* This module is automatically imported during initialization. * +**************************************************************** + +In earlier versions of Python (up to 1.5a3), scripts or modules that +needed to use site-specific modules would place ``import site'' +somewhere near the top of their code. Because of the automatic +import, this is no longer necessary (but code that does it still +works). + +This will append site-specific paths to the module search path. On +Unix, it starts with sys.prefix and sys.exec_prefix (if different) and +appends lib/python/site-packages as well as lib/site-python. +It also supports the Debian convention of +lib/python/dist-packages. On other platforms (mainly Mac and +Windows), it uses just sys.prefix (and sys.exec_prefix, if different, +but this is unlikely). The resulting directories, if they exist, are +appended to sys.path, and also inspected for path configuration files. + +FOR DEBIAN, this sys.path is augmented with directories in /usr/local. +Local addons go into /usr/local/lib/python/site-packages +(resp. /usr/local/lib/site-python), Debian addons install into +/usr/{lib,share}/python/dist-packages. + +A path configuration file is a file whose name has the form +.pth; its contents are additional directories (one per line) +to be added to sys.path. Non-existing directories (or +non-directories) are never added to sys.path; no directory is added to +sys.path more than once. Blank lines and lines beginning with +'#' are skipped. Lines starting with 'import' are executed. + +For example, suppose sys.prefix and sys.exec_prefix are set to +/usr/local and there is a directory /usr/local/lib/python2.X/site-packages +with three subdirectories, foo, bar and spam, and two path +configuration files, foo.pth and bar.pth. Assume foo.pth contains the +following: + + # foo package configuration + foo + bar + bletch + +and bar.pth contains: + + # bar package configuration + bar + +Then the following directories are added to sys.path, in this order: + + /usr/local/lib/python2.X/site-packages/bar + /usr/local/lib/python2.X/site-packages/foo + +Note that bletch is omitted because it doesn't exist; bar precedes foo +because bar.pth comes alphabetically before foo.pth; and spam is +omitted because it is not mentioned in either path configuration file. + +After these path manipulations, an attempt is made to import a module +named sitecustomize, which can perform arbitrary additional +site-specific customizations. If this import fails with an +ImportError exception, it is silently ignored. + +""" + +import sys +import os +try: + import __builtin__ as builtins +except ImportError: + import builtins +try: + set +except NameError: + from sets import Set as set + +# Prefixes for site-packages; add additional prefixes like /usr/local here +PREFIXES = [sys.prefix, sys.exec_prefix] +# Enable per user site-packages directory +# set it to False to disable the feature or True to force the feature +ENABLE_USER_SITE = None +# for distutils.commands.install +USER_SITE = None +USER_BASE = None + +_is_64bit = (getattr(sys, 'maxsize', None) or getattr(sys, 'maxint')) > 2**32 +_is_pypy = hasattr(sys, 'pypy_version_info') +_is_jython = sys.platform[:4] == 'java' +if _is_jython: + ModuleType = type(os) + +def makepath(*paths): + dir = os.path.join(*paths) + if _is_jython and (dir == '__classpath__' or + dir.startswith('__pyclasspath__')): + return dir, dir + dir = os.path.abspath(dir) + return dir, os.path.normcase(dir) + +def abs__file__(): + """Set all module' __file__ attribute to an absolute path""" + for m in sys.modules.values(): + if ((_is_jython and not isinstance(m, ModuleType)) or + hasattr(m, '__loader__')): + # only modules need the abspath in Jython. and don't mess + # with a PEP 302-supplied __file__ + continue + f = getattr(m, '__file__', None) + if f is None: + continue + m.__file__ = os.path.abspath(f) + +def removeduppaths(): + """ Remove duplicate entries from sys.path along with making them + absolute""" + # This ensures that the initial path provided by the interpreter contains + # only absolute pathnames, even if we're running from the build directory. + L = [] + known_paths = set() + for dir in sys.path: + # Filter out duplicate paths (on case-insensitive file systems also + # if they only differ in case); turn relative paths into absolute + # paths. + dir, dircase = makepath(dir) + if not dircase in known_paths: + L.append(dir) + known_paths.add(dircase) + sys.path[:] = L + return known_paths + +# XXX This should not be part of site.py, since it is needed even when +# using the -S option for Python. See http://www.python.org/sf/586680 +def addbuilddir(): + """Append ./build/lib. in case we're running in the build dir + (especially for Guido :-)""" + from distutils.util import get_platform + s = "build/lib.%s-%.3s" % (get_platform(), sys.version) + if hasattr(sys, 'gettotalrefcount'): + s += '-pydebug' + s = os.path.join(os.path.dirname(sys.path[-1]), s) + sys.path.append(s) + +def _init_pathinfo(): + """Return a set containing all existing directory entries from sys.path""" + d = set() + for dir in sys.path: + try: + if os.path.isdir(dir): + dir, dircase = makepath(dir) + d.add(dircase) + except TypeError: + continue + return d + +def addpackage(sitedir, name, known_paths): + """Add a new path to known_paths by combining sitedir and 'name' or execute + sitedir if it starts with 'import'""" + if known_paths is None: + _init_pathinfo() + reset = 1 + else: + reset = 0 + fullname = os.path.join(sitedir, name) + try: + f = open(fullname, "rU") + except IOError: + return + try: + for line in f: + if line.startswith("#"): + continue + if line.startswith("import"): + exec(line) + continue + line = line.rstrip() + dir, dircase = makepath(sitedir, line) + if not dircase in known_paths and os.path.exists(dir): + sys.path.append(dir) + known_paths.add(dircase) + finally: + f.close() + if reset: + known_paths = None + return known_paths + +def addsitedir(sitedir, known_paths=None): + """Add 'sitedir' argument to sys.path if missing and handle .pth files in + 'sitedir'""" + if known_paths is None: + known_paths = _init_pathinfo() + reset = 1 + else: + reset = 0 + sitedir, sitedircase = makepath(sitedir) + if not sitedircase in known_paths: + sys.path.append(sitedir) # Add path component + try: + names = os.listdir(sitedir) + except os.error: + return + names.sort() + for name in names: + if name.endswith(os.extsep + "pth"): + addpackage(sitedir, name, known_paths) + if reset: + known_paths = None + return known_paths + +def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_prefix): + """Add site-packages (and possibly site-python) to sys.path""" + prefixes = [os.path.join(sys_prefix, "local"), sys_prefix] + if exec_prefix != sys_prefix: + prefixes.append(os.path.join(exec_prefix, "local")) + + for prefix in prefixes: + if prefix: + if sys.platform in ('os2emx', 'riscos') or _is_jython: + sitedirs = [os.path.join(prefix, "Lib", "site-packages")] + elif _is_pypy: + sitedirs = [os.path.join(prefix, 'site-packages')] + elif sys.platform == 'darwin' and prefix == sys_prefix: + + if prefix.startswith("/System/Library/Frameworks/"): # Apple's Python + + sitedirs = [os.path.join("/Library/Python", sys.version[:3], "site-packages"), + os.path.join(prefix, "Extras", "lib", "python")] + + else: # any other Python distros on OSX work this way + sitedirs = [os.path.join(prefix, "lib", + "python" + sys.version[:3], "site-packages")] + + elif os.sep == '/': + sitedirs = [os.path.join(prefix, + "lib", + "python" + sys.version[:3], + "site-packages"), + os.path.join(prefix, "lib", "site-python"), + os.path.join(prefix, "python" + sys.version[:3], "lib-dynload")] + lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages") + if (os.path.exists(lib64_dir) and + os.path.realpath(lib64_dir) not in [os.path.realpath(p) for p in sitedirs]): + if _is_64bit: + sitedirs.insert(0, lib64_dir) + else: + sitedirs.append(lib64_dir) + try: + # sys.getobjects only available in --with-pydebug build + sys.getobjects + sitedirs.insert(0, os.path.join(sitedirs[0], 'debug')) + except AttributeError: + pass + # Debian-specific dist-packages directories: + if sys.version[0] == '2': + sitedirs.append(os.path.join(prefix, "lib", + "python" + sys.version[:3], + "dist-packages")) + else: + sitedirs.append(os.path.join(prefix, "lib", + "python" + sys.version[0], + "dist-packages")) + sitedirs.append(os.path.join(prefix, "local/lib", + "python" + sys.version[:3], + "dist-packages")) + sitedirs.append(os.path.join(prefix, "lib", "dist-python")) + else: + sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")] + if sys.platform == 'darwin': + # for framework builds *only* we add the standard Apple + # locations. Currently only per-user, but /Library and + # /Network/Library could be added too + if 'Python.framework' in prefix: + home = os.environ.get('HOME') + if home: + sitedirs.append( + os.path.join(home, + 'Library', + 'Python', + sys.version[:3], + 'site-packages')) + for sitedir in sitedirs: + if os.path.isdir(sitedir): + addsitedir(sitedir, known_paths) + return None + +def check_enableusersite(): + """Check if user site directory is safe for inclusion + + The function tests for the command line flag (including environment var), + process uid/gid equal to effective uid/gid. + + None: Disabled for security reasons + False: Disabled by user (command line option) + True: Safe and enabled + """ + if hasattr(sys, 'flags') and getattr(sys.flags, 'no_user_site', False): + return False + + if hasattr(os, "getuid") and hasattr(os, "geteuid"): + # check process uid == effective uid + if os.geteuid() != os.getuid(): + return None + if hasattr(os, "getgid") and hasattr(os, "getegid"): + # check process gid == effective gid + if os.getegid() != os.getgid(): + return None + + return True + +def addusersitepackages(known_paths): + """Add a per user site-package to sys.path + + Each user has its own python directory with site-packages in the + home directory. + + USER_BASE is the root directory for all Python versions + + USER_SITE is the user specific site-packages directory + + USER_SITE/.. can be used for data. + """ + global USER_BASE, USER_SITE, ENABLE_USER_SITE + env_base = os.environ.get("PYTHONUSERBASE", None) + + def joinuser(*args): + return os.path.expanduser(os.path.join(*args)) + + #if sys.platform in ('os2emx', 'riscos'): + # # Don't know what to put here + # USER_BASE = '' + # USER_SITE = '' + if os.name == "nt": + base = os.environ.get("APPDATA") or "~" + if env_base: + USER_BASE = env_base + else: + USER_BASE = joinuser(base, "Python") + USER_SITE = os.path.join(USER_BASE, + "Python" + sys.version[0] + sys.version[2], + "site-packages") + else: + if env_base: + USER_BASE = env_base + else: + USER_BASE = joinuser("~", ".local") + USER_SITE = os.path.join(USER_BASE, "lib", + "python" + sys.version[:3], + "site-packages") + + if ENABLE_USER_SITE and os.path.isdir(USER_SITE): + addsitedir(USER_SITE, known_paths) + if ENABLE_USER_SITE: + for dist_libdir in ("lib", "local/lib"): + user_site = os.path.join(USER_BASE, dist_libdir, + "python" + sys.version[:3], + "dist-packages") + if os.path.isdir(user_site): + addsitedir(user_site, known_paths) + return known_paths + + + +def setBEGINLIBPATH(): + """The OS/2 EMX port has optional extension modules that do double duty + as DLLs (and must use the .DLL file extension) for other extensions. + The library search path needs to be amended so these will be found + during module import. Use BEGINLIBPATH so that these are at the start + of the library search path. + + """ + dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload") + libpath = os.environ['BEGINLIBPATH'].split(';') + if libpath[-1]: + libpath.append(dllpath) + else: + libpath[-1] = dllpath + os.environ['BEGINLIBPATH'] = ';'.join(libpath) + + +def setquit(): + """Define new built-ins 'quit' and 'exit'. + These are simply strings that display a hint on how to exit. + + """ + if os.sep == ':': + eof = 'Cmd-Q' + elif os.sep == '\\': + eof = 'Ctrl-Z plus Return' + else: + eof = 'Ctrl-D (i.e. EOF)' + + class Quitter(object): + def __init__(self, name): + self.name = name + def __repr__(self): + return 'Use %s() or %s to exit' % (self.name, eof) + def __call__(self, code=None): + # Shells like IDLE catch the SystemExit, but listen when their + # stdin wrapper is closed. + try: + sys.stdin.close() + except: + pass + raise SystemExit(code) + builtins.quit = Quitter('quit') + builtins.exit = Quitter('exit') + + +class _Printer(object): + """interactive prompt objects for printing the license text, a list of + contributors and the copyright notice.""" + + MAXLINES = 23 + + def __init__(self, name, data, files=(), dirs=()): + self.__name = name + self.__data = data + self.__files = files + self.__dirs = dirs + self.__lines = None + + def __setup(self): + if self.__lines: + return + data = None + for dir in self.__dirs: + for filename in self.__files: + filename = os.path.join(dir, filename) + try: + fp = open(filename, "rU") + data = fp.read() + fp.close() + break + except IOError: + pass + if data: + break + if not data: + data = self.__data + self.__lines = data.split('\n') + self.__linecnt = len(self.__lines) + + def __repr__(self): + self.__setup() + if len(self.__lines) <= self.MAXLINES: + return "\n".join(self.__lines) + else: + return "Type %s() to see the full %s text" % ((self.__name,)*2) + + def __call__(self): + self.__setup() + prompt = 'Hit Return for more, or q (and Return) to quit: ' + lineno = 0 + while 1: + try: + for i in range(lineno, lineno + self.MAXLINES): + print(self.__lines[i]) + except IndexError: + break + else: + lineno += self.MAXLINES + key = None + while key is None: + try: + key = raw_input(prompt) + except NameError: + key = input(prompt) + if key not in ('', 'q'): + key = None + if key == 'q': + break + +def setcopyright(): + """Set 'copyright' and 'credits' in __builtin__""" + builtins.copyright = _Printer("copyright", sys.copyright) + if _is_jython: + builtins.credits = _Printer( + "credits", + "Jython is maintained by the Jython developers (www.jython.org).") + elif _is_pypy: + builtins.credits = _Printer( + "credits", + "PyPy is maintained by the PyPy developers: http://codespeak.net/pypy") + else: + builtins.credits = _Printer("credits", """\ + Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands + for supporting Python development. See www.python.org for more information.""") + here = os.path.dirname(os.__file__) + builtins.license = _Printer( + "license", "See http://www.python.org/%.3s/license.html" % sys.version, + ["LICENSE.txt", "LICENSE"], + [os.path.join(here, os.pardir), here, os.curdir]) + + +class _Helper(object): + """Define the built-in 'help'. + This is a wrapper around pydoc.help (with a twist). + + """ + + def __repr__(self): + return "Type help() for interactive help, " \ + "or help(object) for help about object." + def __call__(self, *args, **kwds): + import pydoc + return pydoc.help(*args, **kwds) + +def sethelper(): + builtins.help = _Helper() + +def aliasmbcs(): + """On Windows, some default encodings are not provided by Python, + while they are always available as "mbcs" in each locale. Make + them usable by aliasing to "mbcs" in such a case.""" + if sys.platform == 'win32': + import locale, codecs + enc = locale.getdefaultlocale()[1] + if enc.startswith('cp'): # "cp***" ? + try: + codecs.lookup(enc) + except LookupError: + import encodings + encodings._cache[enc] = encodings._unknown + encodings.aliases.aliases[enc] = 'mbcs' + +def setencoding(): + """Set the string encoding used by the Unicode implementation. The + default is 'ascii', but if you're willing to experiment, you can + change this.""" + encoding = "ascii" # Default value set by _PyUnicode_Init() + if 0: + # Enable to support locale aware default string encodings. + import locale + loc = locale.getdefaultlocale() + if loc[1]: + encoding = loc[1] + if 0: + # Enable to switch off string to Unicode coercion and implicit + # Unicode to string conversion. + encoding = "undefined" + if encoding != "ascii": + # On Non-Unicode builds this will raise an AttributeError... + sys.setdefaultencoding(encoding) # Needs Python Unicode build ! + + +def execsitecustomize(): + """Run custom site specific code, if available.""" + try: + import sitecustomize + except ImportError: + pass + +def virtual_install_main_packages(): + f = open(os.path.join(os.path.dirname(__file__), 'orig-prefix.txt')) + sys.real_prefix = f.read().strip() + f.close() + pos = 2 + hardcoded_relative_dirs = [] + if sys.path[0] == '': + pos += 1 + if _is_jython: + paths = [os.path.join(sys.real_prefix, 'Lib')] + elif _is_pypy: + if sys.version_info > (3, 2): + cpyver = '%d' % sys.version_info[0] + elif sys.pypy_version_info >= (1, 5): + cpyver = '%d.%d' % sys.version_info[:2] + else: + cpyver = '%d.%d.%d' % sys.version_info[:3] + paths = [os.path.join(sys.real_prefix, 'lib_pypy'), + os.path.join(sys.real_prefix, 'lib-python', cpyver)] + if sys.pypy_version_info < (1, 9): + paths.insert(1, os.path.join(sys.real_prefix, + 'lib-python', 'modified-%s' % cpyver)) + hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below + # + # This is hardcoded in the Python executable, but relative to sys.prefix: + for path in paths[:]: + plat_path = os.path.join(path, 'plat-%s' % sys.platform) + if os.path.exists(plat_path): + paths.append(plat_path) + elif sys.platform == 'win32': + paths = [os.path.join(sys.real_prefix, 'Lib'), os.path.join(sys.real_prefix, 'DLLs')] + else: + paths = [os.path.join(sys.real_prefix, 'lib', 'python'+sys.version[:3])] + hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below + lib64_path = os.path.join(sys.real_prefix, 'lib64', 'python'+sys.version[:3]) + if os.path.exists(lib64_path): + if _is_64bit: + paths.insert(0, lib64_path) + else: + paths.append(lib64_path) + # This is hardcoded in the Python executable, but relative to + # sys.prefix. Debian change: we need to add the multiarch triplet + # here, which is where the real stuff lives. As per PEP 421, in + # Python 3.3+, this lives in sys.implementation, while in Python 2.7 + # it lives in sys. + try: + arch = getattr(sys, 'implementation', sys)._multiarch + except AttributeError: + # This is a non-multiarch aware Python. Fallback to the old way. + arch = sys.platform + plat_path = os.path.join(sys.real_prefix, 'lib', + 'python'+sys.version[:3], + 'plat-%s' % arch) + if os.path.exists(plat_path): + paths.append(plat_path) + # This is hardcoded in the Python executable, but + # relative to sys.prefix, so we have to fix up: + for path in list(paths): + tk_dir = os.path.join(path, 'lib-tk') + if os.path.exists(tk_dir): + paths.append(tk_dir) + + # These are hardcoded in the Apple's Python executable, + # but relative to sys.prefix, so we have to fix them up: + if sys.platform == 'darwin': + hardcoded_paths = [os.path.join(relative_dir, module) + for relative_dir in hardcoded_relative_dirs + for module in ('plat-darwin', 'plat-mac', 'plat-mac/lib-scriptpackages')] + + for path in hardcoded_paths: + if os.path.exists(path): + paths.append(path) + + sys.path.extend(paths) + +def force_global_eggs_after_local_site_packages(): + """ + Force easy_installed eggs in the global environment to get placed + in sys.path after all packages inside the virtualenv. This + maintains the "least surprise" result that packages in the + virtualenv always mask global packages, never the other way + around. + + """ + egginsert = getattr(sys, '__egginsert', 0) + for i, path in enumerate(sys.path): + if i > egginsert and path.startswith(sys.prefix): + egginsert = i + sys.__egginsert = egginsert + 1 + +def virtual_addsitepackages(known_paths): + force_global_eggs_after_local_site_packages() + return addsitepackages(known_paths, sys_prefix=sys.real_prefix) + +def fixclasspath(): + """Adjust the special classpath sys.path entries for Jython. These + entries should follow the base virtualenv lib directories. + """ + paths = [] + classpaths = [] + for path in sys.path: + if path == '__classpath__' or path.startswith('__pyclasspath__'): + classpaths.append(path) + else: + paths.append(path) + sys.path = paths + sys.path.extend(classpaths) + +def execusercustomize(): + """Run custom user specific code, if available.""" + try: + import usercustomize + except ImportError: + pass + + +def main(): + global ENABLE_USER_SITE + virtual_install_main_packages() + abs__file__() + paths_in_sys = removeduppaths() + if (os.name == "posix" and sys.path and + os.path.basename(sys.path[-1]) == "Modules"): + addbuilddir() + if _is_jython: + fixclasspath() + GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), 'no-global-site-packages.txt')) + if not GLOBAL_SITE_PACKAGES: + ENABLE_USER_SITE = False + if ENABLE_USER_SITE is None: + ENABLE_USER_SITE = check_enableusersite() + paths_in_sys = addsitepackages(paths_in_sys) + paths_in_sys = addusersitepackages(paths_in_sys) + if GLOBAL_SITE_PACKAGES: + paths_in_sys = virtual_addsitepackages(paths_in_sys) + if sys.platform == 'os2emx': + setBEGINLIBPATH() + setquit() + setcopyright() + sethelper() + aliasmbcs() + setencoding() + execsitecustomize() + if ENABLE_USER_SITE: + execusercustomize() + # Remove sys.setdefaultencoding() so that users cannot change the + # encoding after initialization. The test for presence is needed when + # this module is run as a script, because this code is executed twice. + if hasattr(sys, "setdefaultencoding"): + del sys.setdefaultencoding + +main() + +def _script(): + help = """\ + %s [--user-base] [--user-site] + + Without arguments print some useful information + With arguments print the value of USER_BASE and/or USER_SITE separated + by '%s'. + + Exit codes with --user-base or --user-site: + 0 - user site directory is enabled + 1 - user site directory is disabled by user + 2 - uses site directory is disabled by super user + or for security reasons + >2 - unknown error + """ + args = sys.argv[1:] + if not args: + print("sys.path = [") + for dir in sys.path: + print(" %r," % (dir,)) + print("]") + def exists(path): + if os.path.isdir(path): + return "exists" + else: + return "doesn't exist" + print("USER_BASE: %r (%s)" % (USER_BASE, exists(USER_BASE))) + print("USER_SITE: %r (%s)" % (USER_SITE, exists(USER_BASE))) + print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE) + sys.exit(0) + + buffer = [] + if '--user-base' in args: + buffer.append(USER_BASE) + if '--user-site' in args: + buffer.append(USER_SITE) + + if buffer: + print(os.pathsep.join(buffer)) + if ENABLE_USER_SITE: + sys.exit(0) + elif ENABLE_USER_SITE is False: + sys.exit(1) + elif ENABLE_USER_SITE is None: + sys.exit(2) + else: + sys.exit(3) + else: + import textwrap + print(textwrap.dedent(help % (sys.argv[0], os.pathsep))) + sys.exit(10) + +if __name__ == '__main__': + _script() diff --git a/PythonEnv/2.7/Lib/site.pyc b/PythonEnv/2.7/Lib/site.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c466819cb687988c50ec44bc198e4bfb58750006 GIT binary patch literal 25343 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/sre.py b/PythonEnv/2.7/Lib/sre.py new file mode 100644 index 0000000000..c04576bafa --- /dev/null +++ b/PythonEnv/2.7/Lib/sre.py @@ -0,0 +1,13 @@ +"""This file is only retained for backwards compatibility. +It will be removed in the future. sre was moved to re in version 2.5. +""" + +import warnings +warnings.warn("The sre module is deprecated, please import re.", + DeprecationWarning, 2) + +from re import * +from re import __all__ + +# old pickles expect the _compile() reconstructor in this module +from re import _compile diff --git a/PythonEnv/2.7/Lib/sre_compile.py b/PythonEnv/2.7/Lib/sre_compile.py new file mode 100644 index 0000000000..7cda2b657b --- /dev/null +++ b/PythonEnv/2.7/Lib/sre_compile.py @@ -0,0 +1,525 @@ +# +# Secret Labs' Regular Expression Engine +# +# convert template to internal format +# +# Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved. +# +# See the sre.py file for information on usage and redistribution. +# + +"""Internal support module for sre""" + +import _sre, sys +import sre_parse +from sre_constants import * +from _sre import MAXREPEAT + +assert _sre.MAGIC == MAGIC, "SRE module mismatch" + +if _sre.CODESIZE == 2: + MAXCODE = 65535 +else: + MAXCODE = 0xFFFFFFFFL + +def _identityfunction(x): + return x + +_LITERAL_CODES = set([LITERAL, NOT_LITERAL]) +_REPEATING_CODES = set([REPEAT, MIN_REPEAT, MAX_REPEAT]) +_SUCCESS_CODES = set([SUCCESS, FAILURE]) +_ASSERT_CODES = set([ASSERT, ASSERT_NOT]) + +def _compile(code, pattern, flags): + # internal: compile a (sub)pattern + emit = code.append + _len = len + LITERAL_CODES = _LITERAL_CODES + REPEATING_CODES = _REPEATING_CODES + SUCCESS_CODES = _SUCCESS_CODES + ASSERT_CODES = _ASSERT_CODES + for op, av in pattern: + if op in LITERAL_CODES: + if flags & SRE_FLAG_IGNORECASE: + emit(OPCODES[OP_IGNORE[op]]) + emit(_sre.getlower(av, flags)) + else: + emit(OPCODES[op]) + emit(av) + elif op is IN: + if flags & SRE_FLAG_IGNORECASE: + emit(OPCODES[OP_IGNORE[op]]) + def fixup(literal, flags=flags): + return _sre.getlower(literal, flags) + else: + emit(OPCODES[op]) + fixup = _identityfunction + skip = _len(code); emit(0) + _compile_charset(av, flags, code, fixup) + code[skip] = _len(code) - skip + elif op is ANY: + if flags & SRE_FLAG_DOTALL: + emit(OPCODES[ANY_ALL]) + else: + emit(OPCODES[ANY]) + elif op in REPEATING_CODES: + if flags & SRE_FLAG_TEMPLATE: + raise error, "internal: unsupported template operator" + emit(OPCODES[REPEAT]) + skip = _len(code); emit(0) + emit(av[0]) + emit(av[1]) + _compile(code, av[2], flags) + emit(OPCODES[SUCCESS]) + code[skip] = _len(code) - skip + elif _simple(av) and op is not REPEAT: + if op is MAX_REPEAT: + emit(OPCODES[REPEAT_ONE]) + else: + emit(OPCODES[MIN_REPEAT_ONE]) + skip = _len(code); emit(0) + emit(av[0]) + emit(av[1]) + _compile(code, av[2], flags) + emit(OPCODES[SUCCESS]) + code[skip] = _len(code) - skip + else: + emit(OPCODES[REPEAT]) + skip = _len(code); emit(0) + emit(av[0]) + emit(av[1]) + _compile(code, av[2], flags) + code[skip] = _len(code) - skip + if op is MAX_REPEAT: + emit(OPCODES[MAX_UNTIL]) + else: + emit(OPCODES[MIN_UNTIL]) + elif op is SUBPATTERN: + if av[0]: + emit(OPCODES[MARK]) + emit((av[0]-1)*2) + # _compile_info(code, av[1], flags) + _compile(code, av[1], flags) + if av[0]: + emit(OPCODES[MARK]) + emit((av[0]-1)*2+1) + elif op in SUCCESS_CODES: + emit(OPCODES[op]) + elif op in ASSERT_CODES: + emit(OPCODES[op]) + skip = _len(code); emit(0) + if av[0] >= 0: + emit(0) # look ahead + else: + lo, hi = av[1].getwidth() + if lo != hi: + raise error, "look-behind requires fixed-width pattern" + emit(lo) # look behind + _compile(code, av[1], flags) + emit(OPCODES[SUCCESS]) + code[skip] = _len(code) - skip + elif op is CALL: + emit(OPCODES[op]) + skip = _len(code); emit(0) + _compile(code, av, flags) + emit(OPCODES[SUCCESS]) + code[skip] = _len(code) - skip + elif op is AT: + emit(OPCODES[op]) + if flags & SRE_FLAG_MULTILINE: + av = AT_MULTILINE.get(av, av) + if flags & SRE_FLAG_LOCALE: + av = AT_LOCALE.get(av, av) + elif flags & SRE_FLAG_UNICODE: + av = AT_UNICODE.get(av, av) + emit(ATCODES[av]) + elif op is BRANCH: + emit(OPCODES[op]) + tail = [] + tailappend = tail.append + for av in av[1]: + skip = _len(code); emit(0) + # _compile_info(code, av, flags) + _compile(code, av, flags) + emit(OPCODES[JUMP]) + tailappend(_len(code)); emit(0) + code[skip] = _len(code) - skip + emit(0) # end of branch + for tail in tail: + code[tail] = _len(code) - tail + elif op is CATEGORY: + emit(OPCODES[op]) + if flags & SRE_FLAG_LOCALE: + av = CH_LOCALE[av] + elif flags & SRE_FLAG_UNICODE: + av = CH_UNICODE[av] + emit(CHCODES[av]) + elif op is GROUPREF: + if flags & SRE_FLAG_IGNORECASE: + emit(OPCODES[OP_IGNORE[op]]) + else: + emit(OPCODES[op]) + emit(av-1) + elif op is GROUPREF_EXISTS: + emit(OPCODES[op]) + emit(av[0]-1) + skipyes = _len(code); emit(0) + _compile(code, av[1], flags) + if av[2]: + emit(OPCODES[JUMP]) + skipno = _len(code); emit(0) + code[skipyes] = _len(code) - skipyes + 1 + _compile(code, av[2], flags) + code[skipno] = _len(code) - skipno + else: + code[skipyes] = _len(code) - skipyes + 1 + else: + raise ValueError, ("unsupported operand type", op) + +def _compile_charset(charset, flags, code, fixup=None): + # compile charset subprogram + emit = code.append + if fixup is None: + fixup = _identityfunction + for op, av in _optimize_charset(charset, fixup): + emit(OPCODES[op]) + if op is NEGATE: + pass + elif op is LITERAL: + emit(fixup(av)) + elif op is RANGE: + emit(fixup(av[0])) + emit(fixup(av[1])) + elif op is CHARSET: + code.extend(av) + elif op is BIGCHARSET: + code.extend(av) + elif op is CATEGORY: + if flags & SRE_FLAG_LOCALE: + emit(CHCODES[CH_LOCALE[av]]) + elif flags & SRE_FLAG_UNICODE: + emit(CHCODES[CH_UNICODE[av]]) + else: + emit(CHCODES[av]) + else: + raise error, "internal: unsupported set operator" + emit(OPCODES[FAILURE]) + +def _optimize_charset(charset, fixup): + # internal: optimize character set + out = [] + outappend = out.append + charmap = [0]*256 + try: + for op, av in charset: + if op is NEGATE: + outappend((op, av)) + elif op is LITERAL: + charmap[fixup(av)] = 1 + elif op is RANGE: + for i in range(fixup(av[0]), fixup(av[1])+1): + charmap[i] = 1 + elif op is CATEGORY: + # XXX: could append to charmap tail + return charset # cannot compress + except IndexError: + # character set contains unicode characters + return _optimize_unicode(charset, fixup) + # compress character map + i = p = n = 0 + runs = [] + runsappend = runs.append + for c in charmap: + if c: + if n == 0: + p = i + n = n + 1 + elif n: + runsappend((p, n)) + n = 0 + i = i + 1 + if n: + runsappend((p, n)) + if len(runs) <= 2: + # use literal/range + for p, n in runs: + if n == 1: + outappend((LITERAL, p)) + else: + outappend((RANGE, (p, p+n-1))) + if len(out) < len(charset): + return out + else: + # use bitmap + data = _mk_bitmap(charmap) + outappend((CHARSET, data)) + return out + return charset + +def _mk_bitmap(bits): + data = [] + dataappend = data.append + if _sre.CODESIZE == 2: + start = (1, 0) + else: + start = (1L, 0L) + m, v = start + for c in bits: + if c: + v = v + m + m = m + m + if m > MAXCODE: + dataappend(v) + m, v = start + return data + +# To represent a big charset, first a bitmap of all characters in the +# set is constructed. Then, this bitmap is sliced into chunks of 256 +# characters, duplicate chunks are eliminated, and each chunk is +# given a number. In the compiled expression, the charset is +# represented by a 16-bit word sequence, consisting of one word for +# the number of different chunks, a sequence of 256 bytes (128 words) +# of chunk numbers indexed by their original chunk position, and a +# sequence of chunks (16 words each). + +# Compression is normally good: in a typical charset, large ranges of +# Unicode will be either completely excluded (e.g. if only cyrillic +# letters are to be matched), or completely included (e.g. if large +# subranges of Kanji match). These ranges will be represented by +# chunks of all one-bits or all zero-bits. + +# Matching can be also done efficiently: the more significant byte of +# the Unicode character is an index into the chunk number, and the +# less significant byte is a bit index in the chunk (just like the +# CHARSET matching). + +# In UCS-4 mode, the BIGCHARSET opcode still supports only subsets +# of the basic multilingual plane; an efficient representation +# for all of UTF-16 has not yet been developed. This means, +# in particular, that negated charsets cannot be represented as +# bigcharsets. + +def _optimize_unicode(charset, fixup): + try: + import array + except ImportError: + return charset + charmap = [0]*65536 + negate = 0 + try: + for op, av in charset: + if op is NEGATE: + negate = 1 + elif op is LITERAL: + charmap[fixup(av)] = 1 + elif op is RANGE: + for i in xrange(fixup(av[0]), fixup(av[1])+1): + charmap[i] = 1 + elif op is CATEGORY: + # XXX: could expand category + return charset # cannot compress + except IndexError: + # non-BMP characters + return charset + if negate: + if sys.maxunicode != 65535: + # XXX: negation does not work with big charsets + return charset + for i in xrange(65536): + charmap[i] = not charmap[i] + comps = {} + mapping = [0]*256 + block = 0 + data = [] + for i in xrange(256): + chunk = tuple(charmap[i*256:(i+1)*256]) + new = comps.setdefault(chunk, block) + mapping[i] = new + if new == block: + block = block + 1 + data = data + _mk_bitmap(chunk) + header = [block] + if _sre.CODESIZE == 2: + code = 'H' + else: + code = 'I' + # Convert block indices to byte array of 256 bytes + mapping = array.array('b', mapping).tostring() + # Convert byte array to word array + mapping = array.array(code, mapping) + assert mapping.itemsize == _sre.CODESIZE + header = header + mapping.tolist() + data[0:0] = header + return [(BIGCHARSET, data)] + +def _simple(av): + # check if av is a "simple" operator + lo, hi = av[2].getwidth() + if lo == 0 and hi == MAXREPEAT: + raise error, "nothing to repeat" + return lo == hi == 1 and av[2][0][0] != SUBPATTERN + +def _compile_info(code, pattern, flags): + # internal: compile an info block. in the current version, + # this contains min/max pattern width, and an optional literal + # prefix or a character map + lo, hi = pattern.getwidth() + if lo == 0: + return # not worth it + # look for a literal prefix + prefix = [] + prefixappend = prefix.append + prefix_skip = 0 + charset = [] # not used + charsetappend = charset.append + if not (flags & SRE_FLAG_IGNORECASE): + # look for literal prefix + for op, av in pattern.data: + if op is LITERAL: + if len(prefix) == prefix_skip: + prefix_skip = prefix_skip + 1 + prefixappend(av) + elif op is SUBPATTERN and len(av[1]) == 1: + op, av = av[1][0] + if op is LITERAL: + prefixappend(av) + else: + break + else: + break + # if no prefix, look for charset prefix + if not prefix and pattern.data: + op, av = pattern.data[0] + if op is SUBPATTERN and av[1]: + op, av = av[1][0] + if op is LITERAL: + charsetappend((op, av)) + elif op is BRANCH: + c = [] + cappend = c.append + for p in av[1]: + if not p: + break + op, av = p[0] + if op is LITERAL: + cappend((op, av)) + else: + break + else: + charset = c + elif op is BRANCH: + c = [] + cappend = c.append + for p in av[1]: + if not p: + break + op, av = p[0] + if op is LITERAL: + cappend((op, av)) + else: + break + else: + charset = c + elif op is IN: + charset = av +## if prefix: +## print "*** PREFIX", prefix, prefix_skip +## if charset: +## print "*** CHARSET", charset + # add an info block + emit = code.append + emit(OPCODES[INFO]) + skip = len(code); emit(0) + # literal flag + mask = 0 + if prefix: + mask = SRE_INFO_PREFIX + if len(prefix) == prefix_skip == len(pattern.data): + mask = mask + SRE_INFO_LITERAL + elif charset: + mask = mask + SRE_INFO_CHARSET + emit(mask) + # pattern length + if lo < MAXCODE: + emit(lo) + else: + emit(MAXCODE) + prefix = prefix[:MAXCODE] + if hi < MAXCODE: + emit(hi) + else: + emit(0) + # add literal prefix + if prefix: + emit(len(prefix)) # length + emit(prefix_skip) # skip + code.extend(prefix) + # generate overlap table + table = [-1] + ([0]*len(prefix)) + for i in xrange(len(prefix)): + table[i+1] = table[i]+1 + while table[i+1] > 0 and prefix[i] != prefix[table[i+1]-1]: + table[i+1] = table[table[i+1]-1]+1 + code.extend(table[1:]) # don't store first entry + elif charset: + _compile_charset(charset, flags, code) + code[skip] = len(code) - skip + +try: + unicode +except NameError: + STRING_TYPES = (type(""),) +else: + STRING_TYPES = (type(""), type(unicode(""))) + +def isstring(obj): + for tp in STRING_TYPES: + if isinstance(obj, tp): + return 1 + return 0 + +def _code(p, flags): + + flags = p.pattern.flags | flags + code = [] + + # compile info block + _compile_info(code, p, flags) + + # compile the pattern + _compile(code, p.data, flags) + + code.append(OPCODES[SUCCESS]) + + return code + +def compile(p, flags=0): + # internal: convert pattern list to internal format + + if isstring(p): + pattern = p + p = sre_parse.parse(p, flags) + else: + pattern = None + + code = _code(p, flags) + + # print code + + # XXX: get rid of this limitation! + if p.pattern.groups > 100: + raise AssertionError( + "sorry, but this version only supports 100 named groups" + ) + + # map in either direction + groupindex = p.pattern.groupdict + indexgroup = [None] * p.pattern.groups + for k, i in groupindex.items(): + indexgroup[i] = k + + return _sre.compile( + pattern, flags | p.pattern.flags, code, + p.pattern.groups-1, + groupindex, indexgroup + ) diff --git a/PythonEnv/2.7/Lib/sre_compile.pyc b/PythonEnv/2.7/Lib/sre_compile.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9617d7d0548b837c25d7afac7bc8e6fead224f0e GIT binary patch literal 11569 zcmcIqU2I%uT7J)&@z~?v@lRqqKg}eYO-<9L?Utq8DvL6)r-@r<>>S&55^PPzGspJW z6S-nsi&mU!%8JBU&sEv;`WK#FYbVB+FbZ(PSldl8Xd8zbk=LM+@Xyu|*2DS2>RED&2Nh%qwWaXeo+{f&;5c_hKb1rU|yB_C3z5cp@KDLm@`1Vt5O+Jh+mY-s8+5?WlSn( z6sPBj-{RC+-oqsnv-QCB>ZMxN-)}Y>UXa~wRQ79bcBA2Ceb23ahJS@AT$ltbUNF@( zs`qjaocuyQx8#qawdmxdrMp#sw-l7Osy6xoK%|yH?X$0a_O*nR2_^bWqwXhB90Gts zE=-{%?fqJ&%})O=ipra-o7G@ze|>eOTF=!sJh#$OTd&qvXWaGu&DDj2V5?Ej*PpC@ z>Bj4;wd(pR4pS^QcAM3jd!u;}3rqdv)Ph_zT{qRfM(@KHQ} z+^u+SiyS3LjH9Fkwj6aykdUL41W7sSmY_?HdZhKe?n6sv*1p@liWzA+>XpN^9Cpc0 zO1$5dLtBEB-12@!4gm>^dN@2ei3_yYla_5Pz#o`W`O@0^VYivedEqonU~TUP7YBW^ z(<9zxD}w#~XTes%0%soeNqsDw5J3$3*?pMgT>$P;KgYo<+#?tW(ZSeZpL~!6p3%g^ zewko*zuXK_8B|mrDk?)b=3PA$j+rsI$A<|9!wx;dA%qp=`Er6s7{jl0X+E0mdB!sw7P-z-fUahPz~vWK9@K1F177V0ND8huy(ht^y6bk8F~8 zRCdx)eO%9Z%{Dg^Oc+4*!3f*Q6Od0I+Ypn_mrN0{I|xHcnA2ZPgnOPdhi%{O`LM&V z=LMzJcN5_ad0w>cVo0R;@^EDnxTP`jT^(8{zBycFbaUpKy+|m6p9loN#t8^$8Rk6f zRwnyFxP8R@;b4yr{$A3YDH@Df{rCkMB*1SwUE)n~O(-q(HEStOJ}4NL^m)J?VO?&ZH_KgnL|*SucubR6J6I6{rQO#;eM2K-%JHBDh)`{@t9

xfFJq=i}?5%6oJULrKZIqw?{q<=fNL< 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/sre_parse.py b/PythonEnv/2.7/Lib/sre_parse.py new file mode 100644 index 0000000000..75f8c9601d --- /dev/null +++ b/PythonEnv/2.7/Lib/sre_parse.py @@ -0,0 +1,803 @@ +# +# Secret Labs' Regular Expression Engine +# +# convert re-style regular expression to sre pattern +# +# Copyright (c) 1998-2001 by Secret Labs AB. All rights reserved. +# +# See the sre.py file for information on usage and redistribution. +# + +"""Internal support module for sre""" + +# XXX: show string offset and offending character for all errors + +import sys + +from sre_constants import * +from _sre import MAXREPEAT + +SPECIAL_CHARS = ".\\[{()*+?^$|" +REPEAT_CHARS = "*+?{" + +DIGITS = set("0123456789") + +OCTDIGITS = set("01234567") +HEXDIGITS = set("0123456789abcdefABCDEF") + +WHITESPACE = set(" \t\n\r\v\f") + +ESCAPES = { + r"\a": (LITERAL, ord("\a")), + r"\b": (LITERAL, ord("\b")), + r"\f": (LITERAL, ord("\f")), + r"\n": (LITERAL, ord("\n")), + r"\r": (LITERAL, ord("\r")), + r"\t": (LITERAL, ord("\t")), + r"\v": (LITERAL, ord("\v")), + r"\\": (LITERAL, ord("\\")) +} + +CATEGORIES = { + r"\A": (AT, AT_BEGINNING_STRING), # start of string + r"\b": (AT, AT_BOUNDARY), + r"\B": (AT, AT_NON_BOUNDARY), + r"\d": (IN, [(CATEGORY, CATEGORY_DIGIT)]), + r"\D": (IN, [(CATEGORY, CATEGORY_NOT_DIGIT)]), + r"\s": (IN, [(CATEGORY, CATEGORY_SPACE)]), + r"\S": (IN, [(CATEGORY, CATEGORY_NOT_SPACE)]), + r"\w": (IN, [(CATEGORY, CATEGORY_WORD)]), + r"\W": (IN, [(CATEGORY, CATEGORY_NOT_WORD)]), + r"\Z": (AT, AT_END_STRING), # end of string +} + +FLAGS = { + # standard flags + "i": SRE_FLAG_IGNORECASE, + "L": SRE_FLAG_LOCALE, + "m": SRE_FLAG_MULTILINE, + "s": SRE_FLAG_DOTALL, + "x": SRE_FLAG_VERBOSE, + # extensions + "t": SRE_FLAG_TEMPLATE, + "u": SRE_FLAG_UNICODE, +} + +class Pattern: + # master pattern object. keeps track of global attributes + def __init__(self): + self.flags = 0 + self.open = [] + self.groups = 1 + self.groupdict = {} + def opengroup(self, name=None): + gid = self.groups + self.groups = gid + 1 + if name is not None: + ogid = self.groupdict.get(name, None) + if ogid is not None: + raise error, ("redefinition of group name %s as group %d; " + "was group %d" % (repr(name), gid, ogid)) + self.groupdict[name] = gid + self.open.append(gid) + return gid + def closegroup(self, gid): + self.open.remove(gid) + def checkgroup(self, gid): + return gid < self.groups and gid not in self.open + +class SubPattern: + # a subpattern, in intermediate form + def __init__(self, pattern, data=None): + self.pattern = pattern + if data is None: + data = [] + self.data = data + self.width = None + def dump(self, level=0): + nl = 1 + seqtypes = type(()), type([]) + for op, av in self.data: + print level*" " + op,; nl = 0 + if op == "in": + # member sublanguage + print; nl = 1 + for op, a in av: + print (level+1)*" " + op, a + elif op == "branch": + print; nl = 1 + i = 0 + for a in av[1]: + if i > 0: + print level*" " + "or" + a.dump(level+1); nl = 1 + i = i + 1 + elif type(av) in seqtypes: + for a in av: + if isinstance(a, SubPattern): + if not nl: print + a.dump(level+1); nl = 1 + else: + print a, ; nl = 0 + else: + print av, ; nl = 0 + if not nl: print + def __repr__(self): + return repr(self.data) + def __len__(self): + return len(self.data) + def __delitem__(self, index): + del self.data[index] + def __getitem__(self, index): + if isinstance(index, slice): + return SubPattern(self.pattern, self.data[index]) + return self.data[index] + def __setitem__(self, index, code): + self.data[index] = code + def insert(self, index, code): + self.data.insert(index, code) + def append(self, code): + self.data.append(code) + def getwidth(self): + # determine the width (min, max) for this subpattern + if self.width: + return self.width + lo = hi = 0L + UNITCODES = (ANY, RANGE, IN, LITERAL, NOT_LITERAL, CATEGORY) + REPEATCODES = (MIN_REPEAT, MAX_REPEAT) + for op, av in self.data: + if op is BRANCH: + i = sys.maxint + j = 0 + for av in av[1]: + l, h = av.getwidth() + i = min(i, l) + j = max(j, h) + lo = lo + i + hi = hi + j + elif op is CALL: + i, j = av.getwidth() + lo = lo + i + hi = hi + j + elif op is SUBPATTERN: + i, j = av[1].getwidth() + lo = lo + i + hi = hi + j + elif op in REPEATCODES: + i, j = av[2].getwidth() + lo = lo + long(i) * av[0] + hi = hi + long(j) * av[1] + elif op in UNITCODES: + lo = lo + 1 + hi = hi + 1 + elif op == SUCCESS: + break + self.width = int(min(lo, sys.maxint)), int(min(hi, sys.maxint)) + return self.width + +class Tokenizer: + def __init__(self, string): + self.string = string + self.index = 0 + self.__next() + def __next(self): + if self.index >= len(self.string): + self.next = None + return + char = self.string[self.index] + if char[0] == "\\": + try: + c = self.string[self.index + 1] + except IndexError: + raise error, "bogus escape (end of line)" + char = char + c + self.index = self.index + len(char) + self.next = char + def match(self, char, skip=1): + if char == self.next: + if skip: + self.__next() + return 1 + return 0 + def get(self): + this = self.next + self.__next() + return this + def tell(self): + return self.index, self.next + def seek(self, index): + self.index, self.next = index + +def isident(char): + return "a" <= char <= "z" or "A" <= char <= "Z" or char == "_" + +def isdigit(char): + return "0" <= char <= "9" + +def isname(name): + # check that group name is a valid string + if not isident(name[0]): + return False + for char in name[1:]: + if not isident(char) and not isdigit(char): + return False + return True + +def _class_escape(source, escape): + # handle escape code inside character class + code = ESCAPES.get(escape) + if code: + return code + code = CATEGORIES.get(escape) + if code and code[0] == IN: + return code + try: + c = escape[1:2] + if c == "x": + # hexadecimal escape (exactly two digits) + while source.next in HEXDIGITS and len(escape) < 4: + escape = escape + source.get() + escape = escape[2:] + if len(escape) != 2: + raise error, "bogus escape: %s" % repr("\\" + escape) + return LITERAL, int(escape, 16) & 0xff + elif c in OCTDIGITS: + # octal escape (up to three digits) + while source.next in OCTDIGITS and len(escape) < 4: + escape = escape + source.get() + escape = escape[1:] + return LITERAL, int(escape, 8) & 0xff + elif c in DIGITS: + raise error, "bogus escape: %s" % repr(escape) + if len(escape) == 2: + return LITERAL, ord(escape[1]) + except ValueError: + pass + raise error, "bogus escape: %s" % repr(escape) + +def _escape(source, escape, state): + # handle escape code in expression + code = CATEGORIES.get(escape) + if code: + return code + code = ESCAPES.get(escape) + if code: + return code + try: + c = escape[1:2] + if c == "x": + # hexadecimal escape + while source.next in HEXDIGITS and len(escape) < 4: + escape = escape + source.get() + if len(escape) != 4: + raise ValueError + return LITERAL, int(escape[2:], 16) & 0xff + elif c == "0": + # octal escape + while source.next in OCTDIGITS and len(escape) < 4: + escape = escape + source.get() + return LITERAL, int(escape[1:], 8) & 0xff + elif c in DIGITS: + # octal escape *or* decimal group reference (sigh) + if source.next in DIGITS: + escape = escape + source.get() + if (escape[1] in OCTDIGITS and escape[2] in OCTDIGITS and + source.next in OCTDIGITS): + # got three octal digits; this is an octal escape + escape = escape + source.get() + return LITERAL, int(escape[1:], 8) & 0xff + # not an octal escape, so this is a group reference + group = int(escape[1:]) + if group < state.groups: + if not state.checkgroup(group): + raise error, "cannot refer to open group" + return GROUPREF, group + raise ValueError + if len(escape) == 2: + return LITERAL, ord(escape[1]) + except ValueError: + pass + raise error, "bogus escape: %s" % repr(escape) + +def _parse_sub(source, state, nested=1): + # parse an alternation: a|b|c + + items = [] + itemsappend = items.append + sourcematch = source.match + while 1: + itemsappend(_parse(source, state)) + if sourcematch("|"): + continue + if not nested: + break + if not source.next or sourcematch(")", 0): + break + else: + raise error, "pattern not properly closed" + + if len(items) == 1: + return items[0] + + subpattern = SubPattern(state) + subpatternappend = subpattern.append + + # check if all items share a common prefix + while 1: + prefix = None + for item in items: + if not item: + break + if prefix is None: + prefix = item[0] + elif item[0] != prefix: + break + else: + # all subitems start with a common "prefix". + # move it out of the branch + for item in items: + del item[0] + subpatternappend(prefix) + continue # check next one + break + + # check if the branch can be replaced by a character set + for item in items: + if len(item) != 1 or item[0][0] != LITERAL: + break + else: + # we can store this as a character set instead of a + # branch (the compiler may optimize this even more) + set = [] + setappend = set.append + for item in items: + setappend(item[0]) + subpatternappend((IN, set)) + return subpattern + + subpattern.append((BRANCH, (None, items))) + return subpattern + +def _parse_sub_cond(source, state, condgroup): + item_yes = _parse(source, state) + if source.match("|"): + item_no = _parse(source, state) + if source.match("|"): + raise error, "conditional backref with more than two branches" + else: + item_no = None + if source.next and not source.match(")", 0): + raise error, "pattern not properly closed" + subpattern = SubPattern(state) + subpattern.append((GROUPREF_EXISTS, (condgroup, item_yes, item_no))) + return subpattern + +_PATTERNENDERS = set("|)") +_ASSERTCHARS = set("=!<") +_LOOKBEHINDASSERTCHARS = set("=!") +_REPEATCODES = set([MIN_REPEAT, MAX_REPEAT]) + +def _parse(source, state): + # parse a simple pattern + subpattern = SubPattern(state) + + # precompute constants into local variables + subpatternappend = subpattern.append + sourceget = source.get + sourcematch = source.match + _len = len + PATTERNENDERS = _PATTERNENDERS + ASSERTCHARS = _ASSERTCHARS + LOOKBEHINDASSERTCHARS = _LOOKBEHINDASSERTCHARS + REPEATCODES = _REPEATCODES + + while 1: + + if source.next in PATTERNENDERS: + break # end of subpattern + this = sourceget() + if this is None: + break # end of pattern + + if state.flags & SRE_FLAG_VERBOSE: + # skip whitespace and comments + if this in WHITESPACE: + continue + if this == "#": + while 1: + this = sourceget() + if this in (None, "\n"): + break + continue + + if this and this[0] not in SPECIAL_CHARS: + subpatternappend((LITERAL, ord(this))) + + elif this == "[": + # character set + set = [] + setappend = set.append +## if sourcematch(":"): +## pass # handle character classes + if sourcematch("^"): + setappend((NEGATE, None)) + # check remaining characters + start = set[:] + while 1: + this = sourceget() + if this == "]" and set != start: + break + elif this and this[0] == "\\": + code1 = _class_escape(source, this) + elif this: + code1 = LITERAL, ord(this) + else: + raise error, "unexpected end of regular expression" + if sourcematch("-"): + # potential range + this = sourceget() + if this == "]": + if code1[0] is IN: + code1 = code1[1][0] + setappend(code1) + setappend((LITERAL, ord("-"))) + break + elif this: + if this[0] == "\\": + code2 = _class_escape(source, this) + else: + code2 = LITERAL, ord(this) + if code1[0] != LITERAL or code2[0] != LITERAL: + raise error, "bad character range" + lo = code1[1] + hi = code2[1] + if hi < lo: + raise error, "bad character range" + setappend((RANGE, (lo, hi))) + else: + raise error, "unexpected end of regular expression" + else: + if code1[0] is IN: + code1 = code1[1][0] + setappend(code1) + + # XXX: should move set optimization to compiler! + if _len(set)==1 and set[0][0] is LITERAL: + subpatternappend(set[0]) # optimization + elif _len(set)==2 and set[0][0] is NEGATE and set[1][0] is LITERAL: + subpatternappend((NOT_LITERAL, set[1][1])) # optimization + else: + # XXX: should add charmap optimization here + subpatternappend((IN, set)) + + elif this and this[0] in REPEAT_CHARS: + # repeat previous item + if this == "?": + min, max = 0, 1 + elif this == "*": + min, max = 0, MAXREPEAT + + elif this == "+": + min, max = 1, MAXREPEAT + elif this == "{": + if source.next == "}": + subpatternappend((LITERAL, ord(this))) + continue + here = source.tell() + min, max = 0, MAXREPEAT + lo = hi = "" + while source.next in DIGITS: + lo = lo + source.get() + if sourcematch(","): + while source.next in DIGITS: + hi = hi + sourceget() + else: + hi = lo + if not sourcematch("}"): + subpatternappend((LITERAL, ord(this))) + source.seek(here) + continue + if lo: + min = int(lo) + if min >= MAXREPEAT: + raise OverflowError("the repetition number is too large") + if hi: + max = int(hi) + if max >= MAXREPEAT: + raise OverflowError("the repetition number is too large") + if max < min: + raise error("bad repeat interval") + else: + raise error, "not supported" + # figure out which item to repeat + if subpattern: + item = subpattern[-1:] + else: + item = None + if not item or (_len(item) == 1 and item[0][0] == AT): + raise error, "nothing to repeat" + if item[0][0] in REPEATCODES: + raise error, "multiple repeat" + if sourcematch("?"): + subpattern[-1] = (MIN_REPEAT, (min, max, item)) + else: + subpattern[-1] = (MAX_REPEAT, (min, max, item)) + + elif this == ".": + subpatternappend((ANY, None)) + + elif this == "(": + group = 1 + name = None + condgroup = None + if sourcematch("?"): + group = 0 + # options + if sourcematch("P"): + # python extensions + if sourcematch("<"): + # named group: skip forward to end of name + name = "" + while 1: + char = sourceget() + if char is None: + raise error, "unterminated name" + if char == ">": + break + name = name + char + group = 1 + if not name: + raise error("missing group name") + if not isname(name): + raise error("bad character in group name %r" % + name) + elif sourcematch("="): + # named backreference + name = "" + while 1: + char = sourceget() + if char is None: + raise error, "unterminated name" + if char == ")": + break + name = name + char + if not name: + raise error("missing group name") + if not isname(name): + raise error("bad character in backref group name " + "%r" % name) + gid = state.groupdict.get(name) + if gid is None: + raise error, "unknown group name" + subpatternappend((GROUPREF, gid)) + continue + else: + char = sourceget() + if char is None: + raise error, "unexpected end of pattern" + raise error, "unknown specifier: ?P%s" % char + elif sourcematch(":"): + # non-capturing group + group = 2 + elif sourcematch("#"): + # comment + while 1: + if source.next is None or source.next == ")": + break + sourceget() + if not sourcematch(")"): + raise error, "unbalanced parenthesis" + continue + elif source.next in ASSERTCHARS: + # lookahead assertions + char = sourceget() + dir = 1 + if char == "<": + if source.next not in LOOKBEHINDASSERTCHARS: + raise error, "syntax error" + dir = -1 # lookbehind + char = sourceget() + p = _parse_sub(source, state) + if not sourcematch(")"): + raise error, "unbalanced parenthesis" + if char == "=": + subpatternappend((ASSERT, (dir, p))) + else: + subpatternappend((ASSERT_NOT, (dir, p))) + continue + elif sourcematch("("): + # conditional backreference group + condname = "" + while 1: + char = sourceget() + if char is None: + raise error, "unterminated name" + if char == ")": + break + condname = condname + char + group = 2 + if not condname: + raise error("missing group name") + if isname(condname): + condgroup = state.groupdict.get(condname) + if condgroup is None: + raise error, "unknown group name" + else: + try: + condgroup = int(condname) + except ValueError: + raise error, "bad character in group name" + else: + # flags + if not source.next in FLAGS: + raise error, "unexpected end of pattern" + while source.next in FLAGS: + state.flags = state.flags | FLAGS[sourceget()] + if group: + # parse group contents + if group == 2: + # anonymous group + group = None + else: + group = state.opengroup(name) + if condgroup: + p = _parse_sub_cond(source, state, condgroup) + else: + p = _parse_sub(source, state) + if not sourcematch(")"): + raise error, "unbalanced parenthesis" + if group is not None: + state.closegroup(group) + subpatternappend((SUBPATTERN, (group, p))) + else: + while 1: + char = sourceget() + if char is None: + raise error, "unexpected end of pattern" + if char == ")": + break + raise error, "unknown extension" + + elif this == "^": + subpatternappend((AT, AT_BEGINNING)) + + elif this == "$": + subpattern.append((AT, AT_END)) + + elif this and this[0] == "\\": + code = _escape(source, this, state) + subpatternappend(code) + + else: + raise error, "parser error" + + return subpattern + +def parse(str, flags=0, pattern=None): + # parse 're' pattern into list of (opcode, argument) tuples + + source = Tokenizer(str) + + if pattern is None: + pattern = Pattern() + pattern.flags = flags + pattern.str = str + + p = _parse_sub(source, pattern, 0) + + tail = source.get() + if tail == ")": + raise error, "unbalanced parenthesis" + elif tail: + raise error, "bogus characters at end of regular expression" + + if flags & SRE_FLAG_DEBUG: + p.dump() + + if not (flags & SRE_FLAG_VERBOSE) and p.pattern.flags & SRE_FLAG_VERBOSE: + # the VERBOSE flag was switched on inside the pattern. to be + # on the safe side, we'll parse the whole thing again... + return parse(str, p.pattern.flags) + + return p + +def parse_template(source, pattern): + # parse 're' replacement string into list of literals and + # group references + s = Tokenizer(source) + sget = s.get + p = [] + a = p.append + def literal(literal, p=p, pappend=a): + if p and p[-1][0] is LITERAL: + p[-1] = LITERAL, p[-1][1] + literal + else: + pappend((LITERAL, literal)) + sep = source[:0] + if type(sep) is type(""): + makechar = chr + else: + makechar = unichr + while 1: + this = sget() + if this is None: + break # end of replacement string + if this and this[0] == "\\": + # group + c = this[1:2] + if c == "g": + name = "" + if s.match("<"): + while 1: + char = sget() + if char is None: + raise error, "unterminated group name" + if char == ">": + break + name = name + char + if not name: + raise error, "missing group name" + try: + index = int(name) + if index < 0: + raise error, "negative group number" + except ValueError: + if not isname(name): + raise error, "bad character in group name" + try: + index = pattern.groupindex[name] + except KeyError: + raise IndexError, "unknown group name" + a((MARK, index)) + elif c == "0": + if s.next in OCTDIGITS: + this = this + sget() + if s.next in OCTDIGITS: + this = this + sget() + literal(makechar(int(this[1:], 8) & 0xff)) + elif c in DIGITS: + isoctal = False + if s.next in DIGITS: + this = this + sget() + if (c in OCTDIGITS and this[2] in OCTDIGITS and + s.next in OCTDIGITS): + this = this + sget() + isoctal = True + literal(makechar(int(this[1:], 8) & 0xff)) + if not isoctal: + a((MARK, int(this[1:]))) + else: + try: + this = makechar(ESCAPES[this][1]) + except KeyError: + pass + literal(this) + else: + literal(this) + # convert template to groups and literals lists + i = 0 + groups = [] + groupsappend = groups.append + literals = [None] * len(p) + for c, s in p: + if c is MARK: + groupsappend((i, s)) + # literal[i] is already None + else: + literals[i] = s + i = i + 1 + return groups, literals + +def expand_template(template, match): + g = match.group + sep = match.string[:0] + groups, literals = template + literals = literals[:] + try: + for index, group in groups: + literals[index] = s = g(group) + if s is None: + raise error, "unmatched group" + except IndexError: + raise error, "invalid group reference" + return sep.join(literals) diff --git a/PythonEnv/2.7/Lib/sre_parse.pyc b/PythonEnv/2.7/Lib/sre_parse.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0141a4038c2e816778b32d425c5b88495e03d99a GIT binary patch literal 20820 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 S>=L$dEcJ;w*?S;0|NjBD46S?s literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/stat.py b/PythonEnv/2.7/Lib/stat.py new file mode 100644 index 0000000000..abed5c9e0f --- /dev/null +++ b/PythonEnv/2.7/Lib/stat.py @@ -0,0 +1,96 @@ +"""Constants/functions for interpreting results of os.stat() and os.lstat(). + +Suggested usage: from stat import * +""" + +# Indices for stat struct members in the tuple returned by os.stat() + +ST_MODE = 0 +ST_INO = 1 +ST_DEV = 2 +ST_NLINK = 3 +ST_UID = 4 +ST_GID = 5 +ST_SIZE = 6 +ST_ATIME = 7 +ST_MTIME = 8 +ST_CTIME = 9 + +# Extract bits from the mode + +def S_IMODE(mode): + return mode & 07777 + +def S_IFMT(mode): + return mode & 0170000 + +# Constants used as S_IFMT() for various file types +# (not all are implemented on all systems) + +S_IFDIR = 0040000 +S_IFCHR = 0020000 +S_IFBLK = 0060000 +S_IFREG = 0100000 +S_IFIFO = 0010000 +S_IFLNK = 0120000 +S_IFSOCK = 0140000 + +# Functions to test for each file type + +def S_ISDIR(mode): + return S_IFMT(mode) == S_IFDIR + +def S_ISCHR(mode): + return S_IFMT(mode) == S_IFCHR + +def S_ISBLK(mode): + return S_IFMT(mode) == S_IFBLK + +def S_ISREG(mode): + return S_IFMT(mode) == S_IFREG + +def S_ISFIFO(mode): + return S_IFMT(mode) == S_IFIFO + +def S_ISLNK(mode): + return S_IFMT(mode) == S_IFLNK + +def S_ISSOCK(mode): + return S_IFMT(mode) == S_IFSOCK + +# Names for permission bits + +S_ISUID = 04000 +S_ISGID = 02000 +S_ENFMT = S_ISGID +S_ISVTX = 01000 +S_IREAD = 00400 +S_IWRITE = 00200 +S_IEXEC = 00100 +S_IRWXU = 00700 +S_IRUSR = 00400 +S_IWUSR = 00200 +S_IXUSR = 00100 +S_IRWXG = 00070 +S_IRGRP = 00040 +S_IWGRP = 00020 +S_IXGRP = 00010 +S_IRWXO = 00007 +S_IROTH = 00004 +S_IWOTH = 00002 +S_IXOTH = 00001 + +# Names for file flags + +UF_NODUMP = 0x00000001 +UF_IMMUTABLE = 0x00000002 +UF_APPEND = 0x00000004 +UF_OPAQUE = 0x00000008 +UF_NOUNLINK = 0x00000010 +UF_COMPRESSED = 0x00000020 # OS X: file is hfs-compressed +UF_HIDDEN = 0x00008000 # OS X: file should not be displayed +SF_ARCHIVED = 0x00010000 +SF_IMMUTABLE = 0x00020000 +SF_APPEND = 0x00040000 +SF_NOUNLINK = 0x00100000 +SF_SNAPSHOT = 0x00200000 diff --git a/PythonEnv/2.7/Lib/stat.pyc b/PythonEnv/2.7/Lib/stat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f80d03be94e0b458f2268a414e41d3bdf8a87bac GIT binary patch literal 3121 zcmcguYi}Ay6g}7&8~n_}iSypPvD1(AYE;`sdwlL==AOCC&M^M>Z0h$viq0;Ee=+{Q&QI@W zW&|k47*q^21~mp6hZ+aPq2izks0mO4Dgl~=ngmTjO@We7Nl*$Z1)9chJjpa@Mw1!P zEYvJ$4r&fG4>b>3fLZ{ZgE|K~4|N`N0qO$iq8@S)w5Z7<=#nOvK$kVS3|i7;33Nr1 zE1;{ITm@Z&x(2!qbsbH{8=xCdH$gX{Zh>w=86X4dHt06g9qqrX{r9y0KIjhA1JGTl zhoE~%z04K8{71SWpXug&t}&xMk9G75o&Q9SeX8gAQZM!y=swg}pa)Q2gC0Vy zg3?gWLCa9zfL7q8AIX={VaRpby>Po7_8#x`+q+@Frm@%Q8bLd3b`QJFFle`oZnM|l z4|_&u&*=0roFAr_jqNsxwLdU3sg&1mwVJ)KNk+f7-D<8Gd)>}~Az>ppIP7#oVhCmaK|8y@*KN`W+X>o@d~>JYYLs7xuR3kB{Zr#&>@;K% znZwtiNb`KFo24b=r$=T^cH_(9-}z=FV^ z0&hRmV-6$KZT>ZeFoqw;c+*I4ZQXHK79Mq@khfeNJDo)hd+tdUuKLlQf0E?f##u<_ zD*8qH*f#kj$uBlvo*Y^jv#kXuHqIq*G)UqnRy=mDmBY)M(N3_UP zpLP}Bvy>U7XDe3e$S92(IWb&0mi2+`%5Cb(Me52lZc<=cU{-+dNVsw}x}we%F>Xp= zMqo}rA4t)GE6O5%B+WN%zFv;}Ta|jmT{D{>NcOFoYgNoBVAjoC#NArGdc>=q8}Zr* zua9ufFGe|T(Je>3Hp1&8ob#P1$8{>3QZ+{)Uy$o3_sP3VznjZCG0zm11lk zFD40tVlq8jwlkc5XnS_H>}@!eG>1?AmxFAEZ}}%vf4}*iY>{4A;3+_d@hid;jJ-*~DtJ?X)8Nej*1$UjSO;$w@HBXHFsuQd0dF3j>3NvI zv+%M8xerPyt>8JH1MfTxF95y)9?A277a*aq7s>zf*#CF-Cu2g}UIbbACU}4y+c%92IVFT$(R?IVb* z5YIq7B?|$*_Zs5SkY!g#xO+{e9|Mw}HeM3_k|;kJ;gL^Mrq{*vDdP@6_cNK^5R(#o z6Yv&zp96jY-fcR+We^9RJ-;CDQ%$RAdhKoG4JO{vRSJ= zp#=pw1lA35bo)VWU6Z(`Z&Ra#%ZEwG$%+tN~mfizLRnY1~OsRChTHlu0zx zwpNM7#v!&T!RvW$^71$~7jC;YPe(g)fPqdU6QcxpT4D*nn;p6qmQNTCk_5{rs{+N7 zdD{W85Z+H1iC#`g4^VkZ0%L8QQl2=OYXn4ldNkoTEg!OKhcsa8BsK;*;>S)LxmzB| zm6a(UGaMIx5e`G>*9OUKwh8j(%4MX=YP>j5Y5N^!un|*=OW(B!I+|mt3}Gl1WM# z0FTS~P%nF)ieu= 0, \ + "lineno must be an int >= 0" + item = (action, re.compile(message, re.I), category, + re.compile(module), lineno) + if append: + filters.append(item) + else: + filters.insert(0, item) + +def simplefilter(action, category=Warning, lineno=0, append=0): + """Insert a simple entry into the list of warnings filters (at the front). + + A simple filter matches all modules and messages. + 'action' -- one of "error", "ignore", "always", "default", "module", + or "once" + 'category' -- a class that the warning must be a subclass of + 'lineno' -- an integer line number, 0 matches all warnings + 'append' -- if true, append to the list of filters + """ + assert action in ("error", "ignore", "always", "default", "module", + "once"), "invalid action: %r" % (action,) + assert isinstance(lineno, int) and lineno >= 0, \ + "lineno must be an int >= 0" + item = (action, None, category, None, lineno) + if append: + filters.append(item) + else: + filters.insert(0, item) + +def resetwarnings(): + """Clear the list of warning filters, so that no filters are active.""" + filters[:] = [] + +class _OptionError(Exception): + """Exception used by option processing helpers.""" + pass + +# Helper to process -W options passed via sys.warnoptions +def _processoptions(args): + for arg in args: + try: + _setoption(arg) + except _OptionError, msg: + print >>sys.stderr, "Invalid -W option ignored:", msg + +# Helper for _processoptions() +def _setoption(arg): + import re + parts = arg.split(':') + if len(parts) > 5: + raise _OptionError("too many fields (max 5): %r" % (arg,)) + while len(parts) < 5: + parts.append('') + action, message, category, module, lineno = [s.strip() + for s in parts] + action = _getaction(action) + message = re.escape(message) + category = _getcategory(category) + module = re.escape(module) + if module: + module = module + '$' + if lineno: + try: + lineno = int(lineno) + if lineno < 0: + raise ValueError + except (ValueError, OverflowError): + raise _OptionError("invalid lineno %r" % (lineno,)) + else: + lineno = 0 + filterwarnings(action, message, category, module, lineno) + +# Helper for _setoption() +def _getaction(action): + if not action: + return "default" + if action == "all": return "always" # Alias + for a in ('default', 'always', 'ignore', 'module', 'once', 'error'): + if a.startswith(action): + return a + raise _OptionError("invalid action: %r" % (action,)) + +# Helper for _setoption() +def _getcategory(category): + import re + if not category: + return Warning + if re.match("^[a-zA-Z0-9_]+$", category): + try: + cat = eval(category) + except NameError: + raise _OptionError("unknown warning category: %r" % (category,)) + else: + i = category.rfind(".") + module = category[:i] + klass = category[i+1:] + try: + m = __import__(module, None, None, [klass]) + except ImportError: + raise _OptionError("invalid module name: %r" % (module,)) + try: + cat = getattr(m, klass) + except AttributeError: + raise _OptionError("unknown warning category: %r" % (category,)) + if not issubclass(cat, Warning): + raise _OptionError("invalid warning category: %r" % (category,)) + return cat + + +# Code typically replaced by _warnings +def warn(message, category=None, stacklevel=1): + """Issue a warning, or maybe ignore it or raise an exception.""" + # Check if message is already a Warning object + if isinstance(message, Warning): + category = message.__class__ + # Check category argument + if category is None: + category = UserWarning + assert issubclass(category, Warning) + # Get context information + try: + caller = sys._getframe(stacklevel) + except ValueError: + globals = sys.__dict__ + lineno = 1 + else: + globals = caller.f_globals + lineno = caller.f_lineno + if '__name__' in globals: + module = globals['__name__'] + else: + module = "" + filename = globals.get('__file__') + if filename: + fnl = filename.lower() + if fnl.endswith((".pyc", ".pyo")): + filename = filename[:-1] + else: + if module == "__main__": + try: + filename = sys.argv[0] + except AttributeError: + # embedded interpreters don't have sys.argv, see bug #839151 + filename = '__main__' + if not filename: + filename = module + registry = globals.setdefault("__warningregistry__", {}) + warn_explicit(message, category, filename, lineno, module, registry, + globals) + +def warn_explicit(message, category, filename, lineno, + module=None, registry=None, module_globals=None): + lineno = int(lineno) + if module is None: + module = filename or "" + if module[-3:].lower() == ".py": + module = module[:-3] # XXX What about leading pathname? + if registry is None: + registry = {} + if isinstance(message, Warning): + text = str(message) + category = message.__class__ + else: + text = message + message = category(message) + key = (text, category, lineno) + # Quick test for common case + if registry.get(key): + return + # Search the filters + for item in filters: + action, msg, cat, mod, ln = item + if ((msg is None or msg.match(text)) and + issubclass(category, cat) and + (mod is None or mod.match(module)) and + (ln == 0 or lineno == ln)): + break + else: + action = defaultaction + # Early exit actions + if action == "ignore": + registry[key] = 1 + return + + # Prime the linecache for formatting, in case the + # "file" is actually in a zipfile or something. + linecache.getlines(filename, module_globals) + + if action == "error": + raise message + # Other actions + if action == "once": + registry[key] = 1 + oncekey = (text, category) + if onceregistry.get(oncekey): + return + onceregistry[oncekey] = 1 + elif action == "always": + pass + elif action == "module": + registry[key] = 1 + altkey = (text, category, 0) + if registry.get(altkey): + return + registry[altkey] = 1 + elif action == "default": + registry[key] = 1 + else: + # Unrecognized actions are errors + raise RuntimeError( + "Unrecognized action (%r) in warnings.filters:\n %s" % + (action, item)) + # Print message and context + showwarning(message, category, filename, lineno) + + +class WarningMessage(object): + + """Holds the result of a single showwarning() call.""" + + _WARNING_DETAILS = ("message", "category", "filename", "lineno", "file", + "line") + + def __init__(self, message, category, filename, lineno, file=None, + line=None): + local_values = locals() + for attr in self._WARNING_DETAILS: + setattr(self, attr, local_values[attr]) + self._category_name = category.__name__ if category else None + + def __str__(self): + return ("{message : %r, category : %r, filename : %r, lineno : %s, " + "line : %r}" % (self.message, self._category_name, + self.filename, self.lineno, self.line)) + + +class catch_warnings(object): + + """A context manager that copies and restores the warnings filter upon + exiting the context. + + The 'record' argument specifies whether warnings should be captured by a + custom implementation of warnings.showwarning() and be appended to a list + returned by the context manager. Otherwise None is returned by the context + manager. The objects appended to the list are arguments whose attributes + mirror the arguments to showwarning(). + + The 'module' argument is to specify an alternative module to the module + named 'warnings' and imported under that name. This argument is only useful + when testing the warnings module itself. + + """ + + def __init__(self, record=False, module=None): + """Specify whether to record warnings and if an alternative module + should be used other than sys.modules['warnings']. + + For compatibility with Python 3.0, please consider all arguments to be + keyword-only. + + """ + self._record = record + self._module = sys.modules['warnings'] if module is None else module + self._entered = False + + def __repr__(self): + args = [] + if self._record: + args.append("record=True") + if self._module is not sys.modules['warnings']: + args.append("module=%r" % self._module) + name = type(self).__name__ + return "%s(%s)" % (name, ", ".join(args)) + + def __enter__(self): + if self._entered: + raise RuntimeError("Cannot enter %r twice" % self) + self._entered = True + self._filters = self._module.filters + self._module.filters = self._filters[:] + self._showwarning = self._module.showwarning + if self._record: + log = [] + def showwarning(*args, **kwargs): + log.append(WarningMessage(*args, **kwargs)) + self._module.showwarning = showwarning + return log + else: + return None + + def __exit__(self, *exc_info): + if not self._entered: + raise RuntimeError("Cannot exit %r without entering first" % self) + self._module.filters = self._filters + self._module.showwarning = self._showwarning + + +# filters contains a sequence of filter 5-tuples +# The components of the 5-tuple are: +# - an action: error, ignore, always, default, module, or once +# - a compiled regex that must match the warning message +# - a class representing the warning category +# - a compiled regex that must match the module that is being warned +# - a line number for the line being warning, or 0 to mean any line +# If either if the compiled regexs are None, match anything. +_warnings_defaults = False +try: + from _warnings import (filters, default_action, once_registry, + warn, warn_explicit) + defaultaction = default_action + onceregistry = once_registry + _warnings_defaults = True +except ImportError: + filters = [] + defaultaction = "default" + onceregistry = {} + + +# Module initialization +_processoptions(sys.warnoptions) +if not _warnings_defaults: + silence = [ImportWarning, PendingDeprecationWarning] + # Don't silence DeprecationWarning if -3 or -Q was used. + if not sys.py3kwarning and not sys.flags.division_warning: + silence.append(DeprecationWarning) + for cls in silence: + simplefilter("ignore", category=cls) + bytes_warning = sys.flags.bytes_warning + if bytes_warning > 1: + bytes_action = "error" + elif bytes_warning: + bytes_action = "default" + else: + bytes_action = "ignore" + simplefilter(bytes_action, category=BytesWarning, append=1) +del _warnings_defaults diff --git a/PythonEnv/2.7/Lib/warnings.pyc b/PythonEnv/2.7/Lib/warnings.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e540b538ac0b442391fa4de8acb370c7e7b994d GIT binary patch literal 13991 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 UM{_6jwCOnKQb;Oc)M@8G0U3@}3IG5A literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Scripts/activate b/PythonEnv/2.7/Scripts/activate new file mode 100644 index 0000000000..c2c0e6fe24 --- /dev/null +++ b/PythonEnv/2.7/Scripts/activate @@ -0,0 +1,80 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + unset pydoc + + # reset old environment variables + if [ -n "$_OLD_VIRTUAL_PATH" ] ; then + PATH="$_OLD_VIRTUAL_PATH" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "$_OLD_VIRTUAL_PYTHONHOME" ] ; then + PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then + hash -r 2>/dev/null + fi + + if [ -n "$_OLD_VIRTUAL_PS1" ] ; then + PS1="$_OLD_VIRTUAL_PS1" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "$1" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="$(if [ "$OSTYPE" "==" "cygwin" ]; then cygpath -u 'd:\github\WinAlfred\WinAlfred\bin\Debug\PythonEnv\2.7'; else echo '/d/github/WinAlfred/WinAlfred/bin/Debug/PythonEnv/2.7'; fi;)" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/Scripts:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "$PYTHONHOME" ] ; then + _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" + unset PYTHONHOME +fi + +if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then + _OLD_VIRTUAL_PS1="$PS1" + if [ "x" != x ] ; then + PS1="$PS1" + else + if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then + # special case for Aspen magic directories + # see http://www.zetadev.com/software/aspen/ + PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" + else + PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" + fi + fi + export PS1 +fi + +alias pydoc="python -m pydoc" + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then + hash -r 2>/dev/null +fi diff --git a/PythonEnv/2.7/Scripts/activate.bat b/PythonEnv/2.7/Scripts/activate.bat new file mode 100644 index 0000000000..be0f8515a9 --- /dev/null +++ b/PythonEnv/2.7/Scripts/activate.bat @@ -0,0 +1,26 @@ +@echo off +set "VIRTUAL_ENV=d:\github\WinAlfred\WinAlfred\bin\Debug\PythonEnv\2.7" + +if defined _OLD_VIRTUAL_PROMPT ( + set "PROMPT=%_OLD_VIRTUAL_PROMPT%" +) else ( + if not defined PROMPT ( + set "PROMPT=$P$G" + ) + set "_OLD_VIRTUAL_PROMPT=%PROMPT%" +) +set "PROMPT=(2.7) %PROMPT%" + +if not defined _OLD_VIRTUAL_PYTHONHOME ( + set "_OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%" +) +set PYTHONHOME= + +if defined _OLD_VIRTUAL_PATH ( + set "PATH=%_OLD_VIRTUAL_PATH%" +) else ( + set "_OLD_VIRTUAL_PATH=%PATH%" +) +set "PATH=%VIRTUAL_ENV%\Scripts;%PATH%" + +:END diff --git a/PythonEnv/2.7/Scripts/activate.ps1 b/PythonEnv/2.7/Scripts/activate.ps1 new file mode 100644 index 0000000000..e40ca1bf03 --- /dev/null +++ b/PythonEnv/2.7/Scripts/activate.ps1 @@ -0,0 +1,148 @@ +# This file must be dot sourced from PoSh; you cannot run it +# directly. Do this: . ./activate.ps1 + +# FIXME: clean up unused vars. +$script:THIS_PATH = $myinvocation.mycommand.path +$script:BASE_DIR = split-path (resolve-path "$THIS_PATH/..") -Parent +$script:DIR_NAME = split-path $BASE_DIR -Leaf + +function global:deactivate ( [switch] $NonDestructive ){ + + if ( test-path variable:_OLD_VIRTUAL_PATH ) { + $env:PATH = $variable:_OLD_VIRTUAL_PATH + remove-variable "_OLD_VIRTUAL_PATH" -scope global + } + + if ( test-path function:_old_virtual_prompt ) { + $function:prompt = $function:_old_virtual_prompt + remove-item function:\_old_virtual_prompt + } + + if ($env:VIRTUAL_ENV) { + $old_env = split-path $env:VIRTUAL_ENV -leaf + remove-item env:VIRTUAL_ENV -erroraction silentlycontinue + } + + if ( !$NonDestructive ) { + # Self destruct! + remove-item function:deactivate + } +} + +# unset irrelevant variables +deactivate -nondestructive + +$VIRTUAL_ENV = $BASE_DIR +$env:VIRTUAL_ENV = $VIRTUAL_ENV + +$global:_OLD_VIRTUAL_PATH = $env:PATH +$env:PATH = "$env:VIRTUAL_ENV/Scripts;" + $env:PATH +function global:_old_virtual_prompt { "" } +$function:_old_virtual_prompt = $function:prompt +function global:prompt { + # Add a prefix to the current prompt, but don't discard it. + write-host "($(split-path $env:VIRTUAL_ENV -leaf)) " -nonewline + & $function:_old_virtual_prompt +} + +# SIG # Begin signature block +# MIISeAYJKoZIhvcNAQcCoIISaTCCEmUCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB +# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR +# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUS5reBwSg3zOUwhXf2jPChZzf +# yPmggg6tMIIGcDCCBFigAwIBAgIBJDANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQG +# EwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERp +# Z2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2Vy +# dGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDcxMDI0MjIwMTQ2WhcNMTcxMDI0MjIw +# MTQ2WjCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKzAp +# BgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcxODA2BgNV +# BAMTL1N0YXJ0Q29tIENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUgT2JqZWN0 +# IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyiOLIjUemqAbPJ1J +# 0D8MlzgWKbr4fYlbRVjvhHDtfhFN6RQxq0PjTQxRgWzwFQNKJCdU5ftKoM5N4YSj +# Id6ZNavcSa6/McVnhDAQm+8H3HWoD030NVOxbjgD/Ih3HaV3/z9159nnvyxQEckR +# ZfpJB2Kfk6aHqW3JnSvRe+XVZSufDVCe/vtxGSEwKCaNrsLc9pboUoYIC3oyzWoU +# TZ65+c0H4paR8c8eK/mC914mBo6N0dQ512/bkSdaeY9YaQpGtW/h/W/FkbQRT3sC +# pttLVlIjnkuY4r9+zvqhToPjxcfDYEf+XD8VGkAqle8Aa8hQ+M1qGdQjAye8OzbV +# uUOw7wIDAQABo4IB6TCCAeUwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +# AQYwHQYDVR0OBBYEFNBOD0CZbLhLGW87KLjg44gHNKq3MB8GA1UdIwQYMBaAFE4L +# 7xqkQFulF2mHMMo0aEPQQa7yMD0GCCsGAQUFBwEBBDEwLzAtBggrBgEFBQcwAoYh +# aHR0cDovL3d3dy5zdGFydHNzbC5jb20vc2ZzY2EuY3J0MFsGA1UdHwRUMFIwJ6Al +# oCOGIWh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3Nmc2NhLmNybDAnoCWgI4YhaHR0 +# cDovL2NybC5zdGFydHNzbC5jb20vc2ZzY2EuY3JsMIGABgNVHSAEeTB3MHUGCysG +# AQQBgbU3AQIBMGYwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +# L3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +# L2ludGVybWVkaWF0ZS5wZGYwEQYJYIZIAYb4QgEBBAQDAgABMFAGCWCGSAGG+EIB +# DQRDFkFTdGFydENvbSBDbGFzcyAyIFByaW1hcnkgSW50ZXJtZWRpYXRlIE9iamVj +# dCBTaWduaW5nIENlcnRpZmljYXRlczANBgkqhkiG9w0BAQUFAAOCAgEAcnMLA3Va +# N4OIE9l4QT5OEtZy5PByBit3oHiqQpgVEQo7DHRsjXD5H/IyTivpMikaaeRxIv95 +# baRd4hoUcMwDj4JIjC3WA9FoNFV31SMljEZa66G8RQECdMSSufgfDYu1XQ+cUKxh +# D3EtLGGcFGjjML7EQv2Iol741rEsycXwIXcryxeiMbU2TPi7X3elbwQMc4JFlJ4B +# y9FhBzuZB1DV2sN2irGVbC3G/1+S2doPDjL1CaElwRa/T0qkq2vvPxUgryAoCppU +# FKViw5yoGYC+z1GaesWWiP1eFKAL0wI7IgSvLzU3y1Vp7vsYaxOVBqZtebFTWRHt +# XjCsFrrQBngt0d33QbQRI5mwgzEp7XJ9xu5d6RVWM4TPRUsd+DDZpBHm9mszvi9g +# VFb2ZG7qRRXCSqys4+u/NLBPbXi/m/lU00cODQTlC/euwjk9HQtRrXQ/zqsBJS6U +# J+eLGw1qOfj+HVBl/ZQpfoLk7IoWlRQvRL1s7oirEaqPZUIWY/grXq9r6jDKAp3L +# ZdKQpPOnnogtqlU4f7/kLjEJhrrc98mrOWmVMK/BuFRAfQ5oDUMnVmCzAzLMjKfG +# cVW/iMew41yfhgKbwpfzm3LBr1Zv+pEBgcgW6onRLSAn3XHM0eNtz+AkxH6rRf6B +# 2mYhLEEGLapH8R1AMAo4BbVFOZR5kXcMCwowggg1MIIHHaADAgECAgIEuDANBgkq +# hkiG9w0BAQUFADCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0 +# ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcx +# ODA2BgNVBAMTL1N0YXJ0Q29tIENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUg +# T2JqZWN0IENBMB4XDTExMTIwMzE1MzQxOVoXDTEzMTIwMzE0NTgwN1owgYwxIDAe +# BgNVBA0TFzU4MTc5Ni1HaDd4Zkp4a3hRU0lPNEUwMQswCQYDVQQGEwJERTEPMA0G +# A1UECBMGQmVybGluMQ8wDQYDVQQHEwZCZXJsaW4xFjAUBgNVBAMTDUphbm5pcyBM +# ZWlkZWwxITAfBgkqhkiG9w0BCQEWEmphbm5pc0BsZWlkZWwuaW5mbzCCAiIwDQYJ +# KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMcPeABYdN7nPq/AkZ/EkyUBGx/l2Yui +# Lfm8ZdLG0ulMb/kQL3fRY7sUjYPyn9S6PhqqlFnNoGHJvbbReCdUC9SIQYmOEjEA +# raHfb7MZU10NjO4U2DdGucj2zuO5tYxKizizOJF0e4yRQZVxpUGdvkW/+GLjCNK5 +# L7mIv3Z1dagxDKHYZT74HXiS4VFUwHF1k36CwfM2vsetdm46bdgSwV+BCMmZICYT +# IJAS9UQHD7kP4rik3bFWjUx08NtYYFAVOd/HwBnemUmJe4j3IhZHr0k1+eDG8hDH +# KVvPgLJIoEjC4iMFk5GWsg5z2ngk0LLu3JZMtckHsnnmBPHQK8a3opUNd8hdMNJx +# gOwKjQt2JZSGUdIEFCKVDqj0FmdnDMPfwy+FNRtpBMl1sz78dUFhSrnM0D8NXrqa +# 4rG+2FoOXlmm1rb6AFtpjAKksHRpYcPk2DPGWp/1sWB+dUQkS3gOmwFzyqeTuXpT +# 0juqd3iAxOGx1VRFQ1VHLLf3AzV4wljBau26I+tu7iXxesVucSdsdQu293jwc2kN +# xK2JyHCoZH+RyytrwS0qw8t7rMOukU9gwP8mn3X6mgWlVUODMcHTULjSiCEtvyZ/ +# aafcwjUbt4ReEcnmuZtWIha86MTCX7U7e+cnpWG4sIHPnvVTaz9rm8RyBkIxtFCB +# nQ3FnoQgyxeJAgMBAAGjggOdMIIDmTAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIH +# gDAuBgNVHSUBAf8EJDAiBggrBgEFBQcDAwYKKwYBBAGCNwIBFQYKKwYBBAGCNwoD +# DTAdBgNVHQ4EFgQUWyCgrIWo8Ifvvm1/YTQIeMU9nc8wHwYDVR0jBBgwFoAU0E4P +# QJlsuEsZbzsouODjiAc0qrcwggIhBgNVHSAEggIYMIICFDCCAhAGCysGAQQBgbU3 +# AQICMIIB/zAuBggrBgEFBQcCARYiaHR0cDovL3d3dy5zdGFydHNzbC5jb20vcG9s +# aWN5LnBkZjA0BggrBgEFBQcCARYoaHR0cDovL3d3dy5zdGFydHNzbC5jb20vaW50 +# ZXJtZWRpYXRlLnBkZjCB9wYIKwYBBQUHAgIwgeowJxYgU3RhcnRDb20gQ2VydGlm +# aWNhdGlvbiBBdXRob3JpdHkwAwIBARqBvlRoaXMgY2VydGlmaWNhdGUgd2FzIGlz +# c3VlZCBhY2NvcmRpbmcgdG8gdGhlIENsYXNzIDIgVmFsaWRhdGlvbiByZXF1aXJl +# bWVudHMgb2YgdGhlIFN0YXJ0Q29tIENBIHBvbGljeSwgcmVsaWFuY2Ugb25seSBm +# b3IgdGhlIGludGVuZGVkIHB1cnBvc2UgaW4gY29tcGxpYW5jZSBvZiB0aGUgcmVs +# eWluZyBwYXJ0eSBvYmxpZ2F0aW9ucy4wgZwGCCsGAQUFBwICMIGPMCcWIFN0YXJ0 +# Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MAMCAQIaZExpYWJpbGl0eSBhbmQg +# d2FycmFudGllcyBhcmUgbGltaXRlZCEgU2VlIHNlY3Rpb24gIkxlZ2FsIGFuZCBM +# aW1pdGF0aW9ucyIgb2YgdGhlIFN0YXJ0Q29tIENBIHBvbGljeS4wNgYDVR0fBC8w +# LTAroCmgJ4YlaHR0cDovL2NybC5zdGFydHNzbC5jb20vY3J0YzItY3JsLmNybDCB +# iQYIKwYBBQUHAQEEfTB7MDcGCCsGAQUFBzABhitodHRwOi8vb2NzcC5zdGFydHNz +# bC5jb20vc3ViL2NsYXNzMi9jb2RlL2NhMEAGCCsGAQUFBzAChjRodHRwOi8vYWlh +# LnN0YXJ0c3NsLmNvbS9jZXJ0cy9zdWIuY2xhc3MyLmNvZGUuY2EuY3J0MCMGA1Ud +# EgQcMBqGGGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tLzANBgkqhkiG9w0BAQUFAAOC +# AQEAhrzEV6zwoEtKjnFRhCsjwiPykVpo5Eiye77Ve801rQDiRKgSCCiW6g3HqedL +# OtaSs65Sj2pm3Viea4KR0TECLcbCTgsdaHqw2x1yXwWBQWZEaV6EB05lIwfr94P1 +# SFpV43zkuc+bbmA3+CRK45LOcCNH5Tqq7VGTCAK5iM7tvHwFlbQRl+I6VEL2mjpF +# NsuRjDOVrv/9qw/a22YJ9R7Y1D0vUSs3IqZx2KMUaYDP7H2mSRxJO2nADQZBtriF +# gTyfD3lYV12MlIi5CQwe3QC6DrrfSMP33i5Wa/OFJiQ27WPxmScYVhiqozpImFT4 +# PU9goiBv9RKXdgTmZE1PN0NQ5jGCAzUwggMxAgEBMIGTMIGMMQswCQYDVQQGEwJJ +# TDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0 +# YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYGA1UEAxMvU3RhcnRDb20gQ2xhc3Mg +# MiBQcmltYXJ5IEludGVybWVkaWF0ZSBPYmplY3QgQ0ECAgS4MAkGBSsOAwIaBQCg +# eDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEE +# AYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJ +# BDEWBBRVGw0FDSiaIi38dWteRUAg/9Pr6DANBgkqhkiG9w0BAQEFAASCAgCInvOZ +# FdaNFzbf6trmFDZKMojyx3UjKMCqNjHVBbuKY0qXwFC/ElYDV1ShJ2CBZbdurydO +# OQ6cIQ0KREOCwmX/xB49IlLHHUxNhEkVv7HGU3EKAFf9IBt9Yr7jikiR9cjIsfHK +# 4cjkoKJL7g28yEpLLkHt1eo37f1Ga9lDWEa5Zq3U5yX+IwXhrUBm1h8Xr033FhTR +# VEpuSz6LHtbrL/zgJnCzJ2ahjtJoYevdcWiNXffosJHFaSfYDDbiNsPRDH/1avmb +# 5j/7BhP8BcBaR6Fp8tFbNGIcWHHGcjqLMnTc4w13b7b4pDhypqElBa4+lCmwdvv9 +# GydYtRgPz8GHeoBoKj30YBlMzRIfFYaIFGIC4Ai3UEXkuH9TxYohVbGm/W0Kl4Lb +# RJ1FwiVcLcTOJdgNId2vQvKc+jtNrjcg5SP9h2v/C4aTx8tyc6tE3TOPh2f9b8DL +# S+SbVArJpuJqrPTxDDoO1QNjTgLcdVYeZDE+r/NjaGZ6cMSd8db3EaG3ijD/0bud +# SItbm/OlNVbQOFRR76D+ZNgPcU5iNZ3bmvQQIg6aSB9MHUpIE/SeCkNl9YeVk1/1 +# GFULgNMRmIYP4KLvu9ylh5Gu3hvD5VNhH6+FlXANwFy07uXks5uF8mfZVxVCnodG +# xkNCx+6PsrA5Z7WP4pXcmYnMn97npP/Q9EHJWw== +# SIG # End signature block diff --git a/PythonEnv/2.7/Scripts/activate_this.py b/PythonEnv/2.7/Scripts/activate_this.py new file mode 100644 index 0000000000..ea12c28aca --- /dev/null +++ b/PythonEnv/2.7/Scripts/activate_this.py @@ -0,0 +1,34 @@ +"""By using execfile(this_file, dict(__file__=this_file)) you will +activate this virtualenv environment. + +This can be used when you must use an existing Python interpreter, not +the virtualenv bin/python +""" + +try: + __file__ +except NameError: + raise AssertionError( + "You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))") +import sys +import os + +old_os_path = os.environ['PATH'] +os.environ['PATH'] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path +base = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +if sys.platform == 'win32': + site_packages = os.path.join(base, 'Lib', 'site-packages') +else: + site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages') +prev_sys_path = list(sys.path) +import site +site.addsitedir(site_packages) +sys.real_prefix = sys.prefix +sys.prefix = base +# Move the added items to the front of the path: +new_sys_path = [] +for item in list(sys.path): + if item not in prev_sys_path: + new_sys_path.append(item) + sys.path.remove(item) +sys.path[:0] = new_sys_path diff --git a/PythonEnv/2.7/Scripts/deactivate.bat b/PythonEnv/2.7/Scripts/deactivate.bat new file mode 100644 index 0000000000..fd4db26459 --- /dev/null +++ b/PythonEnv/2.7/Scripts/deactivate.bat @@ -0,0 +1,20 @@ +@echo off + +set VIRTUAL_ENV= + +if defined _OLD_VIRTUAL_PROMPT ( + set "PROMPT=%_OLD_VIRTUAL_PROMPT%" + set _OLD_VIRTUAL_PROMPT= +) + +if defined _OLD_VIRTUAL_PYTHONHOME ( + set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" + set _OLD_VIRTUAL_PYTHONHOME= +) + +if defined _OLD_VIRTUAL_PATH ( + set "PATH=%_OLD_VIRTUAL_PATH%" + set _OLD_VIRTUAL_PATH= +) + +:END diff --git a/PythonEnv/2.7/Scripts/easy_install-2.7-script.py b/PythonEnv/2.7/Scripts/easy_install-2.7-script.py new file mode 100644 index 0000000000..51ab491080 --- /dev/null +++ b/PythonEnv/2.7/Scripts/easy_install-2.7-script.py @@ -0,0 +1,10 @@ +#!d:\github\WinAlfred\WinAlfred\bin\Debug\PythonEnv\2.7\Scripts\python.exe +# EASY-INSTALL-ENTRY-SCRIPT: 'setuptools==0.9.8','console_scripts','easy_install-2.7' +__requires__ = 'setuptools==0.9.8' +import sys +from pkg_resources import load_entry_point + +if __name__ == '__main__': + sys.exit( + load_entry_point('setuptools==0.9.8', 'console_scripts', 'easy_install-2.7')() + ) diff --git a/PythonEnv/2.7/Scripts/easy_install-2.7.exe b/PythonEnv/2.7/Scripts/easy_install-2.7.exe new file mode 100644 index 0000000000000000000000000000000000000000..675e6bf3743f3d3011c238657e7128ee9960ef7f GIT binary patch literal 74752 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Scripts/easy_install-script.py b/PythonEnv/2.7/Scripts/easy_install-script.py new file mode 100644 index 0000000000..eddb8efb61 --- /dev/null +++ b/PythonEnv/2.7/Scripts/easy_install-script.py @@ -0,0 +1,10 @@ +#!d:\github\WinAlfred\WinAlfred\bin\Debug\PythonEnv\2.7\Scripts\python.exe +# EASY-INSTALL-ENTRY-SCRIPT: 'setuptools==0.9.8','console_scripts','easy_install' +__requires__ = 'setuptools==0.9.8' +import sys +from pkg_resources import load_entry_point + +if __name__ == '__main__': + sys.exit( + load_entry_point('setuptools==0.9.8', 'console_scripts', 'easy_install')() + ) diff --git a/PythonEnv/2.7/Scripts/easy_install.exe b/PythonEnv/2.7/Scripts/easy_install.exe new file mode 100644 index 0000000000000000000000000000000000000000..675e6bf3743f3d3011c238657e7128ee9960ef7f GIT binary patch literal 74752 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Scripts/pip-2.7-script.py b/PythonEnv/2.7/Scripts/pip-2.7-script.py new file mode 100644 index 0000000000..3826512f49 --- /dev/null +++ b/PythonEnv/2.7/Scripts/pip-2.7-script.py @@ -0,0 +1,10 @@ +#!d:\github\WinAlfred\WinAlfred\bin\Debug\PythonEnv\2.7\Scripts\python.exe +# EASY-INSTALL-ENTRY-SCRIPT: 'pip==1.4.1','console_scripts','pip-2.7' +__requires__ = 'pip==1.4.1' +import sys +from pkg_resources import load_entry_point + +if __name__ == '__main__': + sys.exit( + load_entry_point('pip==1.4.1', 'console_scripts', 'pip-2.7')() + ) diff --git a/PythonEnv/2.7/Scripts/pip-2.7.exe b/PythonEnv/2.7/Scripts/pip-2.7.exe new file mode 100644 index 0000000000000000000000000000000000000000..675e6bf3743f3d3011c238657e7128ee9960ef7f GIT binary patch literal 74752 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Scripts/pip-script.py b/PythonEnv/2.7/Scripts/pip-script.py new file mode 100644 index 0000000000..6f6939bd3d --- /dev/null +++ b/PythonEnv/2.7/Scripts/pip-script.py @@ -0,0 +1,10 @@ +#!d:\github\WinAlfred\WinAlfred\bin\Debug\PythonEnv\2.7\Scripts\python.exe +# EASY-INSTALL-ENTRY-SCRIPT: 'pip==1.4.1','console_scripts','pip' +__requires__ = 'pip==1.4.1' +import sys +from pkg_resources import load_entry_point + +if __name__ == '__main__': + sys.exit( + load_entry_point('pip==1.4.1', 'console_scripts', 'pip')() + ) diff --git a/PythonEnv/2.7/Scripts/pip.exe b/PythonEnv/2.7/Scripts/pip.exe new file mode 100644 index 0000000000000000000000000000000000000000..675e6bf3743f3d3011c238657e7128ee9960ef7f GIT binary patch literal 74752 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Scripts/python.exe b/PythonEnv/2.7/Scripts/python.exe new file mode 100644 index 0000000000000000000000000000000000000000..abc25ddb6ed66d1bfe3f58de77b3fd3437b8e21f GIT binary patch literal 27136 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Scripts/pythonw.exe b/PythonEnv/2.7/Scripts/pythonw.exe new file mode 100644 index 0000000000000000000000000000000000000000..bf4e6f12b61690f689e5eeabcfe7b58b28e2f421 GIT binary patch literal 27648 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 literal 0 HcmV?d00001

7B)20)-R3CsEsY-XJ)XNKC`l7`O4+xku`?h%C97Nn~JuMig4I?NS}H;K*!3> z^N@N;Q_UVlNa*A`K_^k|A&)6=ntKJ$eL{&vIRSQ%AGb{-VJCRa!%w4z)e}kBLag?P zwe;r|wpVofC})qF-XO=ydv8rXVkPFkK19nNN2V76fG6DDIBnS ztelMoI)z>rg)}TaF6b@t*%N3|n@N~@TF=;OYO%!COpsQ7@;sYFONVE4!8GA=iz)JV z@TZd2B@{7>IOStb(Zw%~MS0tLgM^TQ%S0&5NC~XM-bwzrh)V(`jf|Rd;~!P%j2{R4 zIN(YVA6ZO7ZofoLS-J$;J!AA3b5_R>9TfD8M0k;;*#Cntr`|!B$u$CDg)5vJ_^7~T zUQVI$&)_QK$n?bAWlSdzok6&A?qas7tLYV{L1j44S!QH4KgcO}I7>B<=0ft$O}ZPb zoQ*1Crcx;l8SyZ06kXN+Yj3!Im$}~Lq2QF(u)d0fb03|~OFfrsJY7t>lK!DNHP8TG z1ue+!g1W3t9Wlgpsaq7pqD-H9n=dDqD2qAts4`Oza|@JYyy4aqr$v|})lLmGWge+7 zQ66a!a*rw2$i&KXom$Nv$VOP3NoHj=bB|T{;wj7$h2c;*Lr;)ln>pR0lVjA9ZL?z< zEiERp@DzH2o+A1N<+r_)3Fq+8o!N8d&U<(MdkfyLT3B7PXz`MzAJl&M(Z_Z5 z%NjmWV#`1MY{kk|jh{Dt@n!rgwK<{b$(B}Q_1CF%CfoLnY1!@HuKBLx`ybZ+_|rOA z51r5j-OvLYU?XgT&9DV}VJmEd?XUxO!Y0{cr#d!XY>eN8l(NgX1s& zgKz>){?T9Zm2oK{CJc`Hg zI1b<-p1_m%GoHd<@HGC4XYeeZ!}E9nFXAP|O literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_16.py b/PythonEnv/2.7/Lib/encodings/iso8859_16.py new file mode 100644 index 0000000000..00b9ac8055 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso8859_16.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_16 generated from 'MAPPINGS/ISO8859/8859-16.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-16', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\u0105' # 0xA2 -> LATIN SMALL LETTER A WITH OGONEK + u'\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE + u'\u20ac' # 0xA4 -> EURO SIGN + u'\u201e' # 0xA5 -> DOUBLE LOW-9 QUOTATION MARK + u'\u0160' # 0xA6 -> LATIN CAPITAL LETTER S WITH CARON + u'\xa7' # 0xA7 -> SECTION SIGN + u'\u0161' # 0xA8 -> LATIN SMALL LETTER S WITH CARON + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u0218' # 0xAA -> LATIN CAPITAL LETTER S WITH COMMA BELOW + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u0179' # 0xAC -> LATIN CAPITAL LETTER Z WITH ACUTE + u'\xad' # 0xAD -> SOFT HYPHEN + u'\u017a' # 0xAE -> LATIN SMALL LETTER Z WITH ACUTE + u'\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u010c' # 0xB2 -> LATIN CAPITAL LETTER C WITH CARON + u'\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE + u'\u017d' # 0xB4 -> LATIN CAPITAL LETTER Z WITH CARON + u'\u201d' # 0xB5 -> RIGHT DOUBLE QUOTATION MARK + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\u017e' # 0xB8 -> LATIN SMALL LETTER Z WITH CARON + u'\u010d' # 0xB9 -> LATIN SMALL LETTER C WITH CARON + u'\u0219' # 0xBA -> LATIN SMALL LETTER S WITH COMMA BELOW + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u0152' # 0xBC -> LATIN CAPITAL LIGATURE OE + u'\u0153' # 0xBD -> LATIN SMALL LIGATURE OE + u'\u0178' # 0xBE -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\u0106' # 0xC5 -> LATIN CAPITAL LETTER C WITH ACUTE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + u'\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\u015a' # 0xD7 -> LATIN CAPITAL LETTER S WITH ACUTE + u'\u0170' # 0xD8 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u0118' # 0xDD -> LATIN CAPITAL LETTER E WITH OGONEK + u'\u021a' # 0xDE -> LATIN CAPITAL LETTER T WITH COMMA BELOW + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u0107' # 0xE5 -> LATIN SMALL LETTER C WITH ACUTE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + u'\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\u015b' # 0xF7 -> LATIN SMALL LETTER S WITH ACUTE + u'\u0171' # 0xF8 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u0119' # 0xFD -> LATIN SMALL LETTER E WITH OGONEK + u'\u021b' # 0xFE -> LATIN SMALL LETTER T WITH COMMA BELOW + u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_16.pyc b/PythonEnv/2.7/Lib/encodings/iso8859_16.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19a7446f45a7091c6ac0ecf53a83495972fd3087 GIT binary patch literal 2860 zcmc&$c~=}o5br%%76`eOh`RA&JpvL9Au&e6<`5NvvuF}T*I{QC2KT_3K}4g%E`fwV z!Vx1!4&w6}V-ii&mzWUsz3!d&_#Au%KR~SNVRr!i2YF9->7u)8rn~A_zph%xp9S9J zKu2wu%zqs4zY2zS8-zqiBS;&O>?CRLMrx*H$YRVA#4agDS|SAjMR(Z|I0km)X0@hRXC(#7VeY`%pjXmT{d zLr~)F9Xj_zR@H>6`N2rI&`Mwy*x6)4yLEe0RB3L??58zZkOC~`1{|e4+#R7Hwto|o zfUho!27m|fxr$F0M>C%G^*JkD*;cj#+jQWFoWa!iivVsszJRSkodf3iGV4@;A0aKR*E zaSJK(cknlX)*=)z3pnLKPQk@53i@%|It2vbf%8NN$Vd*XfZlQbScr21MU=Q0wc=k^ z=!hQ%yAW_8ACD{m!MEQpMm3oOZJn`vj4`WgG6%VBOA+47Dfa&$jHx#fMsh7dSilNr z1->kBk(V1`{4==1YA~&syNKzA%o%_y<}RqKvKTw0Do}>AoJB@f}cd_M7779#h0QFTM%=>6|Ug)`4y6(l#d3+S>sbVLuo;tC;K8Cz4;4TB z$fLf^k3IgxlTVfSpMK`q=eCrVJzu`{g%`I~Y_Ht0^QB!c?|!9fPjz7LzWoPYt$FSB zH)`t+*1stP8{T^R(BUJE?=-#pUg&+XIV{PMmR6+CX#Y^v^p1}@KkoYE)1#k# z{srx(Jv2#Ew3i;EeYBq*rzhwDJxK@Y5Isdt(_uP7N9h8Dp58 zH71Q4Y=TX)DRwSBK0C=SvT1gSeVtCRZ_@qjTXva!$F8vN*;RIpU1vYAAJZd7FZ+r8 z%ziOO*ezqqxXJFYyKIKtOHa&Bu|NEnFd!_pP$?0HmWf@)B#A{0WQEBOY*7MoSjPsC z`90Izp+qIK0fBY_ftFJpcq89sw(i{y*ha(l3H{bt NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\u02d8' # 0xA2 -> BREVE + u'\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\u013d' # 0xA5 -> LATIN CAPITAL LETTER L WITH CARON + u'\u015a' # 0xA6 -> LATIN CAPITAL LETTER S WITH ACUTE + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON + u'\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA + u'\u0164' # 0xAB -> LATIN CAPITAL LETTER T WITH CARON + u'\u0179' # 0xAC -> LATIN CAPITAL LETTER Z WITH ACUTE + u'\xad' # 0xAD -> SOFT HYPHEN + u'\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON + u'\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK + u'\u02db' # 0xB2 -> OGONEK + u'\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\u013e' # 0xB5 -> LATIN SMALL LETTER L WITH CARON + u'\u015b' # 0xB6 -> LATIN SMALL LETTER S WITH ACUTE + u'\u02c7' # 0xB7 -> CARON + u'\xb8' # 0xB8 -> CEDILLA + u'\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON + u'\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA + u'\u0165' # 0xBB -> LATIN SMALL LETTER T WITH CARON + u'\u017a' # 0xBC -> LATIN SMALL LETTER Z WITH ACUTE + u'\u02dd' # 0xBD -> DOUBLE ACUTE ACCENT + u'\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON + u'\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\u0154' # 0xC0 -> LATIN CAPITAL LETTER R WITH ACUTE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\u0139' # 0xC5 -> LATIN CAPITAL LETTER L WITH ACUTE + u'\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\u011a' # 0xCC -> LATIN CAPITAL LETTER E WITH CARON + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\u010e' # 0xCF -> LATIN CAPITAL LETTER D WITH CARON + u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + u'\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + u'\u0147' # 0xD2 -> LATIN CAPITAL LETTER N WITH CARON + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\u0158' # 0xD8 -> LATIN CAPITAL LETTER R WITH CARON + u'\u016e' # 0xD9 -> LATIN CAPITAL LETTER U WITH RING ABOVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\u0170' # 0xDB -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\u0162' # 0xDE -> LATIN CAPITAL LETTER T WITH CEDILLA + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\u0155' # 0xE0 -> LATIN SMALL LETTER R WITH ACUTE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u013a' # 0xE5 -> LATIN SMALL LETTER L WITH ACUTE + u'\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\u011b' # 0xEC -> LATIN SMALL LETTER E WITH CARON + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\u010f' # 0xEF -> LATIN SMALL LETTER D WITH CARON + u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + u'\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + u'\u0148' # 0xF2 -> LATIN SMALL LETTER N WITH CARON + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\u0159' # 0xF8 -> LATIN SMALL LETTER R WITH CARON + u'\u016f' # 0xF9 -> LATIN SMALL LETTER U WITH RING ABOVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\u0171' # 0xFB -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + u'\u0163' # 0xFE -> LATIN SMALL LETTER T WITH CEDILLA + u'\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_2.pyc b/PythonEnv/2.7/Lib/encodings/iso8859_2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8dd56b8bd87759d845c9ad024abdaf330ba2c57c GIT binary patch literal 2843 zcmc&$>sM4&6hHH17(jd%Mm6@3=>ZgFqM51qh>DT!Q0hcYm$`S~(md$iOGH@;Gm0+| z5|xMVXj!YJ*~*nk;)iqY`NW^oA7Fc*D|40lf~{3EoWnk6-+T7nzx_LVkLS;_VE@tX zrUbe7@xcGhFpQfpDTKseb`ix*QZ5n$!9!FR>2#AM$X=2sBuB{Jn42g*q3{TWzo76C zrAR2eLJ=q^yhJG`s$1xMBnbxu3pyWBO6GKap(`!u{6s0kMXZP@i%2XW4uF#aBnJ)# z(bH(S90TZtDb(C+c4RZ5h7MVm6Q-(%n&hr7Ez=%q$SP_gq#4=z`nBuhb)j}Oqw2D$ zDxsvFO^2$Qwlp_4Ms`MP8>74Mky@Op>uOr|v{Z$9G_wQWNZ=tgUA;BIpmrBN5z_}o z#nA;o-LSJ2{RzROg5v<3z%&p3Lf9a?3CbQKMZ*Zc>Bq-ST}zk=T;uSW#|E`r?z#GaPB;K0_L9s|@mF^TQCDch6 zuVYn63jj`nw@EP!1FiYpr5r*mc+hv;snTkWg^vE23dMHlo2qMBE|`64Ft?Dxr6RJPzK1JxMJir=0K?5;>xW zvEC22REieMU=pYAkW+>#V0KI_7-3B5k~uqm*L-}p33~lM_+sL1e34o6@RhK%IdLxp zTIA$P82=2dv=~(XmbZxLia8U2Dkd&!>Z+XHt!q$y3w%X3Zp8;N-!@;N_<>9W=bVf? zp$cgs@gj{XV2F4ha7I#PTd9NT>*ExkrkX>_%iQO3V`P+8w(?t@Y z8$l9b0B-kf^oXnqvv!F_i=zECW|CP^#vHQ}-Z=>=A|VdoHf8xo| z>ZhK5=Giq>;pd)z;l=8j+LvCgd*#)&udS6m5C`gWY@f#y)KQ=;Qb&a$7=ClkFW^=clQ3CfoIyZkXMl_k7X&KJv&CxtPNDt8gdYB%eN9i$ooDR|1|&Q9`vdc(TICuaxf@B9+Kz`y6y zv*-97ew&Z7KGtvbv%Gc7I>ZL7*9EL)I|Q@d0*{jq+i3nw{Ze{2H6! z*V$Qij$dXM_$hXYUAA&;%9^$Y*cEG#{b-G|pR7rCm0hz=SR*{o53^s{4L-ttV>kIY z|CvqmU)XIn!@rvy4`a4~tJpS`Yy#ROwicTp4lR%oHaD;@Nm%|&Ec94@%{zqUYJM# literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_3.py b/PythonEnv/2.7/Lib/encodings/iso8859_3.py new file mode 100644 index 0000000000..23daafdbb1 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso8859_3.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_3 generated from 'MAPPINGS/ISO8859/8859-3.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-3', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0126' # 0xA1 -> LATIN CAPITAL LETTER H WITH STROKE + u'\u02d8' # 0xA2 -> BREVE + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\ufffe' + u'\u0124' # 0xA6 -> LATIN CAPITAL LETTER H WITH CIRCUMFLEX + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\u0130' # 0xA9 -> LATIN CAPITAL LETTER I WITH DOT ABOVE + u'\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA + u'\u011e' # 0xAB -> LATIN CAPITAL LETTER G WITH BREVE + u'\u0134' # 0xAC -> LATIN CAPITAL LETTER J WITH CIRCUMFLEX + u'\xad' # 0xAD -> SOFT HYPHEN + u'\ufffe' + u'\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\u0127' # 0xB1 -> LATIN SMALL LETTER H WITH STROKE + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\u0125' # 0xB6 -> LATIN SMALL LETTER H WITH CIRCUMFLEX + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\u0131' # 0xB9 -> LATIN SMALL LETTER DOTLESS I + u'\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA + u'\u011f' # 0xBB -> LATIN SMALL LETTER G WITH BREVE + u'\u0135' # 0xBC -> LATIN SMALL LETTER J WITH CIRCUMFLEX + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\ufffe' + u'\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\ufffe' + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\u010a' # 0xC5 -> LATIN CAPITAL LETTER C WITH DOT ABOVE + u'\u0108' # 0xC6 -> LATIN CAPITAL LETTER C WITH CIRCUMFLEX + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\ufffe' + u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\u0120' # 0xD5 -> LATIN CAPITAL LETTER G WITH DOT ABOVE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\u011c' # 0xD8 -> LATIN CAPITAL LETTER G WITH CIRCUMFLEX + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u016c' # 0xDD -> LATIN CAPITAL LETTER U WITH BREVE + u'\u015c' # 0xDE -> LATIN CAPITAL LETTER S WITH CIRCUMFLEX + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\ufffe' + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u010b' # 0xE5 -> LATIN SMALL LETTER C WITH DOT ABOVE + u'\u0109' # 0xE6 -> LATIN SMALL LETTER C WITH CIRCUMFLEX + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\ufffe' + u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\u0121' # 0xF5 -> LATIN SMALL LETTER G WITH DOT ABOVE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\u011d' # 0xF8 -> LATIN SMALL LETTER G WITH CIRCUMFLEX + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u016d' # 0xFD -> LATIN SMALL LETTER U WITH BREVE + u'\u015d' # 0xFE -> LATIN SMALL LETTER S WITH CIRCUMFLEX + u'\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_3.pyc b/PythonEnv/2.7/Lib/encodings/iso8859_3.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2002d5ba4018920ff0be831917718ddeef214b68 GIT binary patch literal 2850 zcmc&$Yg-#d6rN<05CW9mm5Q2rDe(emv6j|aDd|O2Qrw_z5sgcB1BN&F{3+NZ{c{E{$Gw1Biob#S{&WZ46fv;`3A6)mvn=J zKJ+vkD8v9-Ve;2?8ZD`$KiDE^Qq)j1f34KkrY4*H!IZ2-{i>d-tlYFEQsHk_l8Po7 zitLYRsf53zc1K-ZO=wTJye7OCA1TMFw4$tje|?F+Lp56PjVNwX*4A0(^Qm{?6EfUz zDBn5@s1r2R=#L*J1sn(9IHo<|FN6)Ulb|dRF&sen4G%tUXlm4m;u?nwMiAAjU@{14 zb&!Mb=Ol)cbPEu&1N0&Lb?%vNECX#6VoykI5zAe!;v%3BF{GxrV!eeY=t?}sLr{}# z?FRQl(X^DN2f#@9q;CKzxV6y&cH`#8xZ2d1*-vlG0t%>D?{kpyaC1b0IF=HUh_B8I z25<-Lxr&SPgAp+eBEl%b~li`Ia5=lx4B@!`we33}W?QvL&XcIAB z`&2G10yq)gCb=+lJk8_G7mSr4)Fh*tl2DR{6yL>B)uN!~pDf8%!_p!d+%1{d#6o`j z9r|^kwb=x;0zwH$D7f=Q;Q($MQeh%IZk`4a>BwOf(K}8a8*k2@n3|O0cKC~l9MQvA z=fW-K%=sZf2hd_^`^RRDQoM}W$BKC8M5Ks_Xo#4frKi_GIyWoe7xZC6>s${@ z9XU)KxekvbAHE*`ZSO_0Ih=ya?aA@x`ttG%mK82vv2xYwHEZv=w`kpc#rHq(pnv^C z4?ptghLXTzk3aEbX<7MGPj9SvX4A8qE4OTYZrk(QU#Qwq9o)HV_nsGPUV8bJ+R)y* zSH*DsYp?Iyf1u%w#y8)Jye&0FWhK_!qPD&hPb5=q?`pcy{$9uXogaL7@S~3p(Zloz z?V{bZhkimorML(wdYFx|adwG)fsaj?gJwUQWS7}D>|6F7yTYc}_v{BWU1QhT4K{6FVn4DObASYFFd3)qFrZ oheL~~4!nhLvzqpH0d~=`b3&_i6?uzXMXq9@*qvMGxl3Gs0q%65u>b%7 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_4.py b/PythonEnv/2.7/Lib/encodings/iso8859_4.py new file mode 100644 index 0000000000..c8e03b566a --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso8859_4.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_4 generated from 'MAPPINGS/ISO8859/8859-4.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-4', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\u0138' # 0xA2 -> LATIN SMALL LETTER KRA + u'\u0156' # 0xA3 -> LATIN CAPITAL LETTER R WITH CEDILLA + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\u0128' # 0xA5 -> LATIN CAPITAL LETTER I WITH TILDE + u'\u013b' # 0xA6 -> LATIN CAPITAL LETTER L WITH CEDILLA + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON + u'\u0112' # 0xAA -> LATIN CAPITAL LETTER E WITH MACRON + u'\u0122' # 0xAB -> LATIN CAPITAL LETTER G WITH CEDILLA + u'\u0166' # 0xAC -> LATIN CAPITAL LETTER T WITH STROKE + u'\xad' # 0xAD -> SOFT HYPHEN + u'\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK + u'\u02db' # 0xB2 -> OGONEK + u'\u0157' # 0xB3 -> LATIN SMALL LETTER R WITH CEDILLA + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\u0129' # 0xB5 -> LATIN SMALL LETTER I WITH TILDE + u'\u013c' # 0xB6 -> LATIN SMALL LETTER L WITH CEDILLA + u'\u02c7' # 0xB7 -> CARON + u'\xb8' # 0xB8 -> CEDILLA + u'\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON + u'\u0113' # 0xBA -> LATIN SMALL LETTER E WITH MACRON + u'\u0123' # 0xBB -> LATIN SMALL LETTER G WITH CEDILLA + u'\u0167' # 0xBC -> LATIN SMALL LETTER T WITH STROKE + u'\u014a' # 0xBD -> LATIN CAPITAL LETTER ENG + u'\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON + u'\u014b' # 0xBF -> LATIN SMALL LETTER ENG + u'\u0100' # 0xC0 -> LATIN CAPITAL LETTER A WITH MACRON + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\u012e' # 0xC7 -> LATIN CAPITAL LETTER I WITH OGONEK + u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\u0116' # 0xCC -> LATIN CAPITAL LETTER E WITH DOT ABOVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\u012a' # 0xCF -> LATIN CAPITAL LETTER I WITH MACRON + u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + u'\u0145' # 0xD1 -> LATIN CAPITAL LETTER N WITH CEDILLA + u'\u014c' # 0xD2 -> LATIN CAPITAL LETTER O WITH MACRON + u'\u0136' # 0xD3 -> LATIN CAPITAL LETTER K WITH CEDILLA + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\u0172' # 0xD9 -> LATIN CAPITAL LETTER U WITH OGONEK + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u0168' # 0xDD -> LATIN CAPITAL LETTER U WITH TILDE + u'\u016a' # 0xDE -> LATIN CAPITAL LETTER U WITH MACRON + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\u0101' # 0xE0 -> LATIN SMALL LETTER A WITH MACRON + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\u012f' # 0xE7 -> LATIN SMALL LETTER I WITH OGONEK + u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\u0117' # 0xEC -> LATIN SMALL LETTER E WITH DOT ABOVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\u012b' # 0xEF -> LATIN SMALL LETTER I WITH MACRON + u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + u'\u0146' # 0xF1 -> LATIN SMALL LETTER N WITH CEDILLA + u'\u014d' # 0xF2 -> LATIN SMALL LETTER O WITH MACRON + u'\u0137' # 0xF3 -> LATIN SMALL LETTER K WITH CEDILLA + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\u0173' # 0xF9 -> LATIN SMALL LETTER U WITH OGONEK + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u0169' # 0xFD -> LATIN SMALL LETTER U WITH TILDE + u'\u016b' # 0xFE -> LATIN SMALL LETTER U WITH MACRON + u'\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_4.pyc b/PythonEnv/2.7/Lib/encodings/iso8859_4.pyc new file mode 100644 index 0000000000000000000000000000000000000000..044849a2ca819b9057638ed6b936a2f393b3c3d0 GIT binary patch literal 2843 zcmc&$=~o;@5br%%HV|?v5q0Ac)&tN;42dxk$RR2OXVD~xuEWkO4DNw5gNR1uj^T(o zfgGCC1j0+=(-?Rr`k}k$6Mv3>K&XsqUKTs`}NhtJd>pZm@fxtvW_# zKOXpB4#Sv&Ng<>jW*1T1B;g|UAb5!CA}wwb2iZ${3F#r^V7;3tKB4dkg+HV45G6|} zyh0JkD7-|;CaPQLd?XGB1T#7xQI^f={6d$L(fNszi;Ma!qAVx%0dWAF6d*m|U=Tfx zg!3?f7MMb{9cFVn6{>8Obvb6LdZ=1%ZPijup~|$P#zLBrE-Tx-HCh^KQd6ofo2n9u z>*-{uuzF{0ZB@A3jooQ&DMg-GREoP`hR};~OzNq`0-CI2hC(z^BIafl+aE z22eNbRG>d0m{f2afD@SZg1-#r}bdw$rgzSR-8s~N4nPD!6-5A84lv|^=yJAa-fI`%i8xyMi7FsaWL|lZRrCQre z;fJd0Y265el8DLJ2vX&?1{>H-TN)BtW5e8eMneWrK*fGvfV2z`Mbzh8 zcfek332}Zf5~e{y7^N(jmhQc622q^#K8!G#0hprEl$=zfQ8OqO$+XgzfTe^w3FCFF z3TY9*N$@twhGC#JzdOfct^%Pd71PzEnlk0YZh@*EgI)2-kZcVsZIZ#=Qiww=3igap$eEC6N^R|Q@V1_j^DKq-(7-U{|~;HcpG12)&hJbENxEQi-8t7 zxemrZLo2NS)xYH}BD!|Y1fYtEi_bRNo9=k&PAjAm-cVD-=JFiQt@*aVJzE zEhb*1Q9cY2?>uKDRaX9EXRvG+IL>5%z;ssPemP9`O|;uBG+Hd}a3$d~dgo;5nm)V* ziXXcKv{n<^U;qnJ56OyzkvcUdUQ4V^1}p9@}^fxH@~{2Z0okyw!gmPjq;rpmAiKD+52YITW`NpU9+$D zT`5xc-uwFx9IXGK;lq!jAIps~MU6K#Yb~E7lBsm-r@CRbeb)YY#}{87`s(X%XeaHW z-L!}H(mvWx57Tey5jsEz=@1>JN9lL;7(Gr;(3A8OJxxdGC>^6`=vjJ>o~Pf_ALs>o zk@xaxYlL3q=L`ouCS}@M|O?h=EH1)pJ9`Hl-*>v_#{7W^;^Syirrzqvb$`GOE%TfkLpn@TzcZ4z6HO%R6`$OxMo*q0d(x!2kdN literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_5.py b/PythonEnv/2.7/Lib/encodings/iso8859_5.py new file mode 100644 index 0000000000..c01cd1caab --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso8859_5.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_5 generated from 'MAPPINGS/ISO8859/8859-5.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-5', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0401' # 0xA1 -> CYRILLIC CAPITAL LETTER IO + u'\u0402' # 0xA2 -> CYRILLIC CAPITAL LETTER DJE + u'\u0403' # 0xA3 -> CYRILLIC CAPITAL LETTER GJE + u'\u0404' # 0xA4 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + u'\u0405' # 0xA5 -> CYRILLIC CAPITAL LETTER DZE + u'\u0406' # 0xA6 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + u'\u0407' # 0xA7 -> CYRILLIC CAPITAL LETTER YI + u'\u0408' # 0xA8 -> CYRILLIC CAPITAL LETTER JE + u'\u0409' # 0xA9 -> CYRILLIC CAPITAL LETTER LJE + u'\u040a' # 0xAA -> CYRILLIC CAPITAL LETTER NJE + u'\u040b' # 0xAB -> CYRILLIC CAPITAL LETTER TSHE + u'\u040c' # 0xAC -> CYRILLIC CAPITAL LETTER KJE + u'\xad' # 0xAD -> SOFT HYPHEN + u'\u040e' # 0xAE -> CYRILLIC CAPITAL LETTER SHORT U + u'\u040f' # 0xAF -> CYRILLIC CAPITAL LETTER DZHE + u'\u0410' # 0xB0 -> CYRILLIC CAPITAL LETTER A + u'\u0411' # 0xB1 -> CYRILLIC CAPITAL LETTER BE + u'\u0412' # 0xB2 -> CYRILLIC CAPITAL LETTER VE + u'\u0413' # 0xB3 -> CYRILLIC CAPITAL LETTER GHE + u'\u0414' # 0xB4 -> CYRILLIC CAPITAL LETTER DE + u'\u0415' # 0xB5 -> CYRILLIC CAPITAL LETTER IE + u'\u0416' # 0xB6 -> CYRILLIC CAPITAL LETTER ZHE + u'\u0417' # 0xB7 -> CYRILLIC CAPITAL LETTER ZE + u'\u0418' # 0xB8 -> CYRILLIC CAPITAL LETTER I + u'\u0419' # 0xB9 -> CYRILLIC CAPITAL LETTER SHORT I + u'\u041a' # 0xBA -> CYRILLIC CAPITAL LETTER KA + u'\u041b' # 0xBB -> CYRILLIC CAPITAL LETTER EL + u'\u041c' # 0xBC -> CYRILLIC CAPITAL LETTER EM + u'\u041d' # 0xBD -> CYRILLIC CAPITAL LETTER EN + u'\u041e' # 0xBE -> CYRILLIC CAPITAL LETTER O + u'\u041f' # 0xBF -> CYRILLIC CAPITAL LETTER PE + u'\u0420' # 0xC0 -> CYRILLIC CAPITAL LETTER ER + u'\u0421' # 0xC1 -> CYRILLIC CAPITAL LETTER ES + u'\u0422' # 0xC2 -> CYRILLIC CAPITAL LETTER TE + u'\u0423' # 0xC3 -> CYRILLIC CAPITAL LETTER U + u'\u0424' # 0xC4 -> CYRILLIC CAPITAL LETTER EF + u'\u0425' # 0xC5 -> CYRILLIC CAPITAL LETTER HA + u'\u0426' # 0xC6 -> CYRILLIC CAPITAL LETTER TSE + u'\u0427' # 0xC7 -> CYRILLIC CAPITAL LETTER CHE + u'\u0428' # 0xC8 -> CYRILLIC CAPITAL LETTER SHA + u'\u0429' # 0xC9 -> CYRILLIC CAPITAL LETTER SHCHA + u'\u042a' # 0xCA -> CYRILLIC CAPITAL LETTER HARD SIGN + u'\u042b' # 0xCB -> CYRILLIC CAPITAL LETTER YERU + u'\u042c' # 0xCC -> CYRILLIC CAPITAL LETTER SOFT SIGN + u'\u042d' # 0xCD -> CYRILLIC CAPITAL LETTER E + u'\u042e' # 0xCE -> CYRILLIC CAPITAL LETTER YU + u'\u042f' # 0xCF -> CYRILLIC CAPITAL LETTER YA + u'\u0430' # 0xD0 -> CYRILLIC SMALL LETTER A + u'\u0431' # 0xD1 -> CYRILLIC SMALL LETTER BE + u'\u0432' # 0xD2 -> CYRILLIC SMALL LETTER VE + u'\u0433' # 0xD3 -> CYRILLIC SMALL LETTER GHE + u'\u0434' # 0xD4 -> CYRILLIC SMALL LETTER DE + u'\u0435' # 0xD5 -> CYRILLIC SMALL LETTER IE + u'\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + u'\u0437' # 0xD7 -> CYRILLIC SMALL LETTER ZE + u'\u0438' # 0xD8 -> CYRILLIC SMALL LETTER I + u'\u0439' # 0xD9 -> CYRILLIC SMALL LETTER SHORT I + u'\u043a' # 0xDA -> CYRILLIC SMALL LETTER KA + u'\u043b' # 0xDB -> CYRILLIC SMALL LETTER EL + u'\u043c' # 0xDC -> CYRILLIC SMALL LETTER EM + u'\u043d' # 0xDD -> CYRILLIC SMALL LETTER EN + u'\u043e' # 0xDE -> CYRILLIC SMALL LETTER O + u'\u043f' # 0xDF -> CYRILLIC SMALL LETTER PE + u'\u0440' # 0xE0 -> CYRILLIC SMALL LETTER ER + u'\u0441' # 0xE1 -> CYRILLIC SMALL LETTER ES + u'\u0442' # 0xE2 -> CYRILLIC SMALL LETTER TE + u'\u0443' # 0xE3 -> CYRILLIC SMALL LETTER U + u'\u0444' # 0xE4 -> CYRILLIC SMALL LETTER EF + u'\u0445' # 0xE5 -> CYRILLIC SMALL LETTER HA + u'\u0446' # 0xE6 -> CYRILLIC SMALL LETTER TSE + u'\u0447' # 0xE7 -> CYRILLIC SMALL LETTER CHE + u'\u0448' # 0xE8 -> CYRILLIC SMALL LETTER SHA + u'\u0449' # 0xE9 -> CYRILLIC SMALL LETTER SHCHA + u'\u044a' # 0xEA -> CYRILLIC SMALL LETTER HARD SIGN + u'\u044b' # 0xEB -> CYRILLIC SMALL LETTER YERU + u'\u044c' # 0xEC -> CYRILLIC SMALL LETTER SOFT SIGN + u'\u044d' # 0xED -> CYRILLIC SMALL LETTER E + u'\u044e' # 0xEE -> CYRILLIC SMALL LETTER YU + u'\u044f' # 0xEF -> CYRILLIC SMALL LETTER YA + u'\u2116' # 0xF0 -> NUMERO SIGN + u'\u0451' # 0xF1 -> CYRILLIC SMALL LETTER IO + u'\u0452' # 0xF2 -> CYRILLIC SMALL LETTER DJE + u'\u0453' # 0xF3 -> CYRILLIC SMALL LETTER GJE + u'\u0454' # 0xF4 -> CYRILLIC SMALL LETTER UKRAINIAN IE + u'\u0455' # 0xF5 -> CYRILLIC SMALL LETTER DZE + u'\u0456' # 0xF6 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + u'\u0457' # 0xF7 -> CYRILLIC SMALL LETTER YI + u'\u0458' # 0xF8 -> CYRILLIC SMALL LETTER JE + u'\u0459' # 0xF9 -> CYRILLIC SMALL LETTER LJE + u'\u045a' # 0xFA -> CYRILLIC SMALL LETTER NJE + u'\u045b' # 0xFB -> CYRILLIC SMALL LETTER TSHE + u'\u045c' # 0xFC -> CYRILLIC SMALL LETTER KJE + u'\xa7' # 0xFD -> SECTION SIGN + u'\u045e' # 0xFE -> CYRILLIC SMALL LETTER SHORT U + u'\u045f' # 0xFF -> CYRILLIC SMALL LETTER DZHE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_5.pyc b/PythonEnv/2.7/Lib/encodings/iso8859_5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dcf2c21d97fa3511f5e1769fccbc93353df7648d GIT binary patch literal 2844 zcmc&$c~=}o5br%%HXON?h`RAe)&rtZ%wdcqsR-s3KBg5& zg8g-rKKU4SL=fN)+HVA`?;T~O+Z^12|?ifPeUz_b$97?KCzNg)^5Efv8zY^D-AZpH=#a|xuF7!OxQd^8JAg*z z(Ro0FC^_v_u)rDv91g1ZTfJ*~FK9e3rH6cL5Etv080=Pj~e>8Yd)!N|0C z*wPQ(G_$4^MJ1DywE?A??M)7_o3}KjjOM0=^Q@*kpoog|z65C*9ZpCv&y9qn(5u%3 zgSaF1a!ZQW2BT0K6oOGH!0E=lcgzrq^WH}ZCOd>vJf2b0dOU82j9gg}jsGaq*VyNg5e7<%YkM$O%1) zburvZ5m_w8NuIt>Onq+ATI(D(!eB@iO`sWbB#& zx&>O0x&*dX8{1%r3Q~?0#G*u&sJNtb`HGdRRyEkl%-gEDL_g7SIdf>s$4?SG<$d;|!wm-V#v7L`s@7i6nXYaoKPt-p7)YEnK z2O6GHVh5jn?$F^Qjn6l|@M8QWwK<{b$(B~5?d4QDlWl*+wCs*oJ74R1{f(nkMPrcl#lTS)Oc|nwL$U%)sq55Z2-Cy_#)7)XCG^g$0?jrUqp)Sbg hy~AnOJAHVHMLiRntiLQ&<}dS?`^p1_rNOJr{}&4RoHzgg literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_6.py b/PythonEnv/2.7/Lib/encodings/iso8859_6.py new file mode 100644 index 0000000000..16c34a3f61 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso8859_6.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_6 generated from 'MAPPINGS/ISO8859/8859-6.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-6', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\u060c' # 0xAC -> ARABIC COMMA + u'\xad' # 0xAD -> SOFT HYPHEN + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\u061b' # 0xBB -> ARABIC SEMICOLON + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\u061f' # 0xBF -> ARABIC QUESTION MARK + u'\ufffe' + u'\u0621' # 0xC1 -> ARABIC LETTER HAMZA + u'\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + u'\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + u'\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + u'\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + u'\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + u'\u0627' # 0xC7 -> ARABIC LETTER ALEF + u'\u0628' # 0xC8 -> ARABIC LETTER BEH + u'\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA + u'\u062a' # 0xCA -> ARABIC LETTER TEH + u'\u062b' # 0xCB -> ARABIC LETTER THEH + u'\u062c' # 0xCC -> ARABIC LETTER JEEM + u'\u062d' # 0xCD -> ARABIC LETTER HAH + u'\u062e' # 0xCE -> ARABIC LETTER KHAH + u'\u062f' # 0xCF -> ARABIC LETTER DAL + u'\u0630' # 0xD0 -> ARABIC LETTER THAL + u'\u0631' # 0xD1 -> ARABIC LETTER REH + u'\u0632' # 0xD2 -> ARABIC LETTER ZAIN + u'\u0633' # 0xD3 -> ARABIC LETTER SEEN + u'\u0634' # 0xD4 -> ARABIC LETTER SHEEN + u'\u0635' # 0xD5 -> ARABIC LETTER SAD + u'\u0636' # 0xD6 -> ARABIC LETTER DAD + u'\u0637' # 0xD7 -> ARABIC LETTER TAH + u'\u0638' # 0xD8 -> ARABIC LETTER ZAH + u'\u0639' # 0xD9 -> ARABIC LETTER AIN + u'\u063a' # 0xDA -> ARABIC LETTER GHAIN + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\u0640' # 0xE0 -> ARABIC TATWEEL + u'\u0641' # 0xE1 -> ARABIC LETTER FEH + u'\u0642' # 0xE2 -> ARABIC LETTER QAF + u'\u0643' # 0xE3 -> ARABIC LETTER KAF + u'\u0644' # 0xE4 -> ARABIC LETTER LAM + u'\u0645' # 0xE5 -> ARABIC LETTER MEEM + u'\u0646' # 0xE6 -> ARABIC LETTER NOON + u'\u0647' # 0xE7 -> ARABIC LETTER HEH + u'\u0648' # 0xE8 -> ARABIC LETTER WAW + u'\u0649' # 0xE9 -> ARABIC LETTER ALEF MAKSURA + u'\u064a' # 0xEA -> ARABIC LETTER YEH + u'\u064b' # 0xEB -> ARABIC FATHATAN + u'\u064c' # 0xEC -> ARABIC DAMMATAN + u'\u064d' # 0xED -> ARABIC KASRATAN + u'\u064e' # 0xEE -> ARABIC FATHA + u'\u064f' # 0xEF -> ARABIC DAMMA + u'\u0650' # 0xF0 -> ARABIC KASRA + u'\u0651' # 0xF1 -> ARABIC SHADDA + u'\u0652' # 0xF2 -> ARABIC SUKUN + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_6.pyc b/PythonEnv/2.7/Lib/encodings/iso8859_6.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea5873ca1b554d115b4ae8a9690103376478992d GIT binary patch literal 2888 zcmc&$d3W1H5MNui<2YAua0#GtH0DSGg{EmKC5?L!Aa0NYZB4)^mYgW~LRu371=={h z()8q}Ksm}yxS_xw@ZNrk)u-SOK0ujS#ZnTE_Z;2>*}IkRRoAuPjtV~1xXe*h`72S(Hg3{kkB={x)9NtaFD7aS~E$7#Rjlbm{h>P2wIwq zwV(rI(8&W6bhKEI9}H&v=@a@H*7 z<+lFq0|R}D-O0|r4KWq(`gzJgM3jd=U}LyPC(+>jkRjb_!I@49tqhCD|$%IwXU;r4f%<$d5lmzZPaaHUX`G zP!bXf?tC;E!)+4=bVT?q!k{1>1*{5MC&=UBE!dMa3Tn=CzZTCCJ@j=x+)5*!*aV%} zeV3ZEbOEz>M9m0eNS9a73HcV|yF<|H|G^gn@8FBfT7<8Hsm=4d7HE-^YoPr#w8}D2 z{afB5qN}S%0IC?cBsFz4zt=P%`?`EZHumC+7;lHKko-U7E?Q1Nw|!Gsti>#h_^rsVU>W=N}&vf zF(Fk*T{4E$Nl?6&n42sd&L!mbE-x_&vKwA9aSDUEc-qN*rU)WbBM2fiz-`{dxQMDa z)=ANLq9}iTg=|rzG4EIf@0@}ZQ4kFU#G*fncaETpwv@Y-(;^PfdC)f--$xgA;> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u2018' # 0xA1 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xA2 -> RIGHT SINGLE QUOTATION MARK + u'\xa3' # 0xA3 -> POUND SIGN + u'\u20ac' # 0xA4 -> EURO SIGN + u'\u20af' # 0xA5 -> DRACHMA SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u037a' # 0xAA -> GREEK YPOGEGRAMMENI + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\ufffe' + u'\u2015' # 0xAF -> HORIZONTAL BAR + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\u0384' # 0xB4 -> GREEK TONOS + u'\u0385' # 0xB5 -> GREEK DIALYTIKA TONOS + u'\u0386' # 0xB6 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\u0388' # 0xB8 -> GREEK CAPITAL LETTER EPSILON WITH TONOS + u'\u0389' # 0xB9 -> GREEK CAPITAL LETTER ETA WITH TONOS + u'\u038a' # 0xBA -> GREEK CAPITAL LETTER IOTA WITH TONOS + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u038c' # 0xBC -> GREEK CAPITAL LETTER OMICRON WITH TONOS + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\u038e' # 0xBE -> GREEK CAPITAL LETTER UPSILON WITH TONOS + u'\u038f' # 0xBF -> GREEK CAPITAL LETTER OMEGA WITH TONOS + u'\u0390' # 0xC0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + u'\u0391' # 0xC1 -> GREEK CAPITAL LETTER ALPHA + u'\u0392' # 0xC2 -> GREEK CAPITAL LETTER BETA + u'\u0393' # 0xC3 -> GREEK CAPITAL LETTER GAMMA + u'\u0394' # 0xC4 -> GREEK CAPITAL LETTER DELTA + u'\u0395' # 0xC5 -> GREEK CAPITAL LETTER EPSILON + u'\u0396' # 0xC6 -> GREEK CAPITAL LETTER ZETA + u'\u0397' # 0xC7 -> GREEK CAPITAL LETTER ETA + u'\u0398' # 0xC8 -> GREEK CAPITAL LETTER THETA + u'\u0399' # 0xC9 -> GREEK CAPITAL LETTER IOTA + u'\u039a' # 0xCA -> GREEK CAPITAL LETTER KAPPA + u'\u039b' # 0xCB -> GREEK CAPITAL LETTER LAMDA + u'\u039c' # 0xCC -> GREEK CAPITAL LETTER MU + u'\u039d' # 0xCD -> GREEK CAPITAL LETTER NU + u'\u039e' # 0xCE -> GREEK CAPITAL LETTER XI + u'\u039f' # 0xCF -> GREEK CAPITAL LETTER OMICRON + u'\u03a0' # 0xD0 -> GREEK CAPITAL LETTER PI + u'\u03a1' # 0xD1 -> GREEK CAPITAL LETTER RHO + u'\ufffe' + u'\u03a3' # 0xD3 -> GREEK CAPITAL LETTER SIGMA + u'\u03a4' # 0xD4 -> GREEK CAPITAL LETTER TAU + u'\u03a5' # 0xD5 -> GREEK CAPITAL LETTER UPSILON + u'\u03a6' # 0xD6 -> GREEK CAPITAL LETTER PHI + u'\u03a7' # 0xD7 -> GREEK CAPITAL LETTER CHI + u'\u03a8' # 0xD8 -> GREEK CAPITAL LETTER PSI + u'\u03a9' # 0xD9 -> GREEK CAPITAL LETTER OMEGA + u'\u03aa' # 0xDA -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + u'\u03ab' # 0xDB -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + u'\u03ac' # 0xDC -> GREEK SMALL LETTER ALPHA WITH TONOS + u'\u03ad' # 0xDD -> GREEK SMALL LETTER EPSILON WITH TONOS + u'\u03ae' # 0xDE -> GREEK SMALL LETTER ETA WITH TONOS + u'\u03af' # 0xDF -> GREEK SMALL LETTER IOTA WITH TONOS + u'\u03b0' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + u'\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA + u'\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA + u'\u03b3' # 0xE3 -> GREEK SMALL LETTER GAMMA + u'\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA + u'\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON + u'\u03b6' # 0xE6 -> GREEK SMALL LETTER ZETA + u'\u03b7' # 0xE7 -> GREEK SMALL LETTER ETA + u'\u03b8' # 0xE8 -> GREEK SMALL LETTER THETA + u'\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA + u'\u03ba' # 0xEA -> GREEK SMALL LETTER KAPPA + u'\u03bb' # 0xEB -> GREEK SMALL LETTER LAMDA + u'\u03bc' # 0xEC -> GREEK SMALL LETTER MU + u'\u03bd' # 0xED -> GREEK SMALL LETTER NU + u'\u03be' # 0xEE -> GREEK SMALL LETTER XI + u'\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON + u'\u03c0' # 0xF0 -> GREEK SMALL LETTER PI + u'\u03c1' # 0xF1 -> GREEK SMALL LETTER RHO + u'\u03c2' # 0xF2 -> GREEK SMALL LETTER FINAL SIGMA + u'\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA + u'\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU + u'\u03c5' # 0xF5 -> GREEK SMALL LETTER UPSILON + u'\u03c6' # 0xF6 -> GREEK SMALL LETTER PHI + u'\u03c7' # 0xF7 -> GREEK SMALL LETTER CHI + u'\u03c8' # 0xF8 -> GREEK SMALL LETTER PSI + u'\u03c9' # 0xF9 -> GREEK SMALL LETTER OMEGA + u'\u03ca' # 0xFA -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + u'\u03cb' # 0xFB -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + u'\u03cc' # 0xFC -> GREEK SMALL LETTER OMICRON WITH TONOS + u'\u03cd' # 0xFD -> GREEK SMALL LETTER UPSILON WITH TONOS + u'\u03ce' # 0xFE -> GREEK SMALL LETTER OMEGA WITH TONOS + u'\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_7.pyc b/PythonEnv/2.7/Lib/encodings/iso8859_7.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c6aea3eaac1b2840037450e9062fa29249f43f6 GIT binary patch literal 2851 zcmc&$X?qk!5biy*S(0$0i%}O3SPz1t7(hf|IgFYRXQM!ju9KbFWa3`V%o?MpAqfyd z2xlPN_@EpTl1AJl)U@7SzSo(<2K=%&)C!+SoKN+^L!E^hSay(IonWY`qzFOF zOG;~PDePyo6aht4?DqvolW227g1H_fB#Bay*C(%(jXCxQW=T|_uf8+P#pI@LNJ*D6!CaQPOI^_85E0jR>`MuDUnU0 zc%4(ltOVdBe4CZyFz7VDyTW5m!%1Bxp{r>%W6G&D0#!YMTJb58Yz8iElHuJ_m_sb$ z$KRo!jar9INGl|ihX{ptJ`{`4whbBzCgK)pkcf@~R*Ae5`7`FIpu_3O5}td z#X1pgse(?dL?L!xE2j)q!0a4RGQyP7sfBa=uKV#_E$H?C;7f_O@g-*6hp$AX&564d zXo-`vaQrj0(iAlPTiz0)GYdx`s+72xsjG5&gRWuqE%KGvxQZU6eA|4*;)io4IOk;C z302HWiI->;!Xe_l#~DeLmH*foD%;hLGesaMol(-SKw;lRyWL`=rP7X95-+2-FvqUx zqg$Z(sY_sMHL(o_s37&SvRH(u(_qrIq}pWAa=akVuXPHOAiL%i6T30!_p9yNr;8+F zH^L<1K-?xMIz?8+v37~36Gi*0%Ota+j5)_jbmt_Zh(u^el%EGruSs-nQ_(N%!=~Of z2bTtMn7PVbepdy4{o_@5}eeCh@ zoF|@q>gl=jBF{Yg-1GBm7QFD{!k1oN^h)jGB}-pj_S*8-SFBtWUA<=Qx;N_HeCzG{ zhV_l_NU^4O-`lWpQ}g>RAAA`9NN!CiYO<|e>-ad8&SZ0+=!Tj9wDYsB&%fCGxAJX#JMZT^_yFI@2l*~O#CP*Od@tX}_wxgMm>=Ya_y|ADkMN`X7(dQW z@RR)1Sog?S_hEi|tY>tr=Mq1|&+>Ep{O>pT1wP6z{&DB_Sobi$%&+jP{2KJZR@la` zLqF_*0e%w(`7IcN-LMDt!amp!2VfWu!XX%e!*B$S!ZA1wC*UNUf^TpqI1S&zcW?&I z!Z|n(-@^qMg^Tb5T!PDR1+Kz1_z`}BpW!8oyxCy_(Ew~MLtZr+I)noNqeb!cM zo3-8Qw{}YEUh547Lf(+K+EeW-pX|TOyng|TnxZ%W literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_8.py b/PythonEnv/2.7/Lib/encodings/iso8859_8.py new file mode 100644 index 0000000000..43cf2138b5 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso8859_8.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_8 generated from 'MAPPINGS/ISO8859/8859-8.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-8', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\ufffe' + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\xd7' # 0xAA -> MULTIPLICATION SIGN + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\xf7' # 0xBA -> DIVISION SIGN + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\u2017' # 0xDF -> DOUBLE LOW LINE + u'\u05d0' # 0xE0 -> HEBREW LETTER ALEF + u'\u05d1' # 0xE1 -> HEBREW LETTER BET + u'\u05d2' # 0xE2 -> HEBREW LETTER GIMEL + u'\u05d3' # 0xE3 -> HEBREW LETTER DALET + u'\u05d4' # 0xE4 -> HEBREW LETTER HE + u'\u05d5' # 0xE5 -> HEBREW LETTER VAV + u'\u05d6' # 0xE6 -> HEBREW LETTER ZAYIN + u'\u05d7' # 0xE7 -> HEBREW LETTER HET + u'\u05d8' # 0xE8 -> HEBREW LETTER TET + u'\u05d9' # 0xE9 -> HEBREW LETTER YOD + u'\u05da' # 0xEA -> HEBREW LETTER FINAL KAF + u'\u05db' # 0xEB -> HEBREW LETTER KAF + u'\u05dc' # 0xEC -> HEBREW LETTER LAMED + u'\u05dd' # 0xED -> HEBREW LETTER FINAL MEM + u'\u05de' # 0xEE -> HEBREW LETTER MEM + u'\u05df' # 0xEF -> HEBREW LETTER FINAL NUN + u'\u05e0' # 0xF0 -> HEBREW LETTER NUN + u'\u05e1' # 0xF1 -> HEBREW LETTER SAMEKH + u'\u05e2' # 0xF2 -> HEBREW LETTER AYIN + u'\u05e3' # 0xF3 -> HEBREW LETTER FINAL PE + u'\u05e4' # 0xF4 -> HEBREW LETTER PE + u'\u05e5' # 0xF5 -> HEBREW LETTER FINAL TSADI + u'\u05e6' # 0xF6 -> HEBREW LETTER TSADI + u'\u05e7' # 0xF7 -> HEBREW LETTER QOF + u'\u05e8' # 0xF8 -> HEBREW LETTER RESH + u'\u05e9' # 0xF9 -> HEBREW LETTER SHIN + u'\u05ea' # 0xFA -> HEBREW LETTER TAV + u'\ufffe' + u'\ufffe' + u'\u200e' # 0xFD -> LEFT-TO-RIGHT MARK + u'\u200f' # 0xFE -> RIGHT-TO-LEFT MARK + u'\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_8.pyc b/PythonEnv/2.7/Lib/encodings/iso8859_8.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db069da85c0aed11e825c0549dadc45f7e1a2826 GIT binary patch literal 2882 zcmc&$X+ltMaz)oW-qjc$GhkH12{3}+oS zA+3;59wHRp`A{N4+r|y-nDkqQK_NOySQWBPlE=YYvL|EY)vV)wC7u&{!eE-0Pjcg@CkqomjWgD(Z%#+R5i3txp&o8xyS&=Mz?V*7h& zmHDXpr@SRZmz0h`R4H%?Zt7}on`vP7E%TMw*hVi>yluW>@2fl-lu1;$`%fWUQJ#x&@k_ssxr+ zj%6@F32B5?B_c$fIHzk#xyhp8R6=fwI*Cb=-EfkLT^P*S({}DNWe~9%VGyw)Zqp_P zWmM&{c8aDGW%+B*X9_ZnImaq==M{{qSGCLU zs>P3Aeg?*gY%aIQ>+@Fys)IGPb@S@yFIc!}@sg!C+!$JRQ^U=-+!|hf+wFJUxuP+0 z*WLHr+tl20-~B5ecyQH2tD|eyKD_Rc^^dl0Xp3#!w0X;8?T*;5< zZQqf6w)?r~Q!l7JX-&`c_8I*zW^?&M@g>vZ11}H0GW6A(QD7+2t zz`O7sybrtK1Naa=f<3So_Q8HQ00-d^9EKw>21nr-9ETHd5>CNsI0I*Y|LrQAgY$3! zF2W@khs$u~+8BHapTXzw1$+r#!PoE&d<);f_wWNuz>o0LwF&qcet}=%DlYz4zmvmb zVxQPA4v2%|kT@)kh%s?g923XI32{=K5~sx(aaMdR&WZElg19IyiE(jRToIqxR!t7? znH=7Wa)g44l&0#c71CHusRG$Na@a$}u_;95OQ9^usXCPY==2O2SFv8b|QDfWf}A#cdr;A!wx*ZZ$C@1Ky3!(0FW literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_9.py b/PythonEnv/2.7/Lib/encodings/iso8859_9.py new file mode 100644 index 0000000000..b8029382c0 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/iso8859_9.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_9 generated from 'MAPPINGS/ISO8859/8859-9.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-9', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\xbf' # 0xBF -> INVERTED QUESTION MARK + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\u011e' # 0xD0 -> LATIN CAPITAL LETTER G WITH BREVE + u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u0130' # 0xDD -> LATIN CAPITAL LETTER I WITH DOT ABOVE + u'\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\u011f' # 0xF0 -> LATIN SMALL LETTER G WITH BREVE + u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u0131' # 0xFD -> LATIN SMALL LETTER DOTLESS I + u'\u015f' # 0xFE -> LATIN SMALL LETTER S WITH CEDILLA + u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/iso8859_9.pyc b/PythonEnv/2.7/Lib/encodings/iso8859_9.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6ed2a1bf0f5d99502e6d0261f0344bc48f4ab36 GIT binary patch literal 2843 zcmc&$`Bxl85bix$mLqqRh`RAe)&tOJOo%a(kV8}m&Z0>WU5A}n7~BJA1`&-W0dimF zJ`K6=i(KT=yjMm3BL9F`)f09C`U~+r-KCrAu9>c?ufDEY-=9U{?oA!F3Gw*jqyJSj ztO1%dAsT7+2+b=}9??jGPv{=e<`qej{i0Wh9wAmVdW9B{3ZGO2a|)l(@}$Bq6``EM zFSLB2d!;TQl5{{grwa(JU`Q8~y26|;D6}G8H0BAdSTu&@0d!JG^pJyL_B0k9!vVC> z6shmBTeF!+b*pNs30pTKwQ762k!gukXEi+$F|6$D*)uESm5~-bqnoO&YmuaxO-H8J z&abbpsaq1OsEIA*M=E$Kt1NF=-Y`AVY1pm&MuHD1Z|^D(hmA+{sj~xQR34oJ)Jr=H z*q;bZIyp|jNlbgmUkaOKuVC3HlvtGEw}bq+Z5jzX!D}9V8r8f#fhJpsHjh|Ie_mmG zMURg{_RxNv`?~bZvWsaqL9wUR_PFD&+>#=p5VzIll z93G6qX;2tOC6A`3_uetXC_eT+$}rg>n&R<{n%3iSJ1iIJtk#jDrNTOe<8`e{X%xUI z^tQ;SVX?KKx6o&gC!r>jF!i*avDMTfiK>~PUHQq8Y$7cklF{ALgi9>u$KRo!Lc1=T zh*m@>9}|l1d`T?I$JQA%2^qIcgTi!_uqy1GB#(=?WKYt_s3|x6(L~PZajZ|mtrW7w zBAVpsi`A5+OPE~~qehrhI&R2L&@&R>g_2(X55Amu2VZ8^2z(VTZEoD7ftEQrnZ`du ztBfVpzvV3>I%&uRp~{Ji*`}_hmzf4t-yC0=jSKie&bPx?Dt;sj$vHRUZm3ckO}tE_ z5*jkzVa_PJs{O~#aM><(oyh^g>8$4cDw>>|=(JmEv|QThO44QY56RRu1AGg#Aa@CB ztv0p65ErB#kr#_Hb?R)smRy@GUOq0!WtDDWl4LjBV&XIgbL6&D`%IZc>PD1A8id;u z8=W$%(yUXW*`jQJHJM~qmND0?!go$#iYSbR!ufgn^x9147M=W}K5Uy^Q)y{2hlMBK z6Z90)Hz>aytC?&bug@O{=7sXZ1%*Y$W5$jfKVjme$V=CIFZrnE<4-=Vty^0EnG$RG z{EKDFS2TXv^wrn#Z`9_5rYBokjka%7=}fl$JJYf|zVG~@>&Kr~{`|`-SPg5S8+xD@ z*1|ei4;x@3Y=X_O1-8OA*bcwK4%i91U^nc6y|54V!vQ!5hu|>$21lR|j>0iG4kzFw zoPyJE2F}7cI1d-#B3y#Ya0RYHKU{&B;cnc6dvPD`#{+l}58>g#s}GN0A0EYHcpOjQ zNj!z8@eH2Db9f#v;6=QIm+{JAANJ!lypA{UCf>pUyp4D8F5biYgZ&Tt@IjQbMO@{! zsbv$?Cb_jZ1aWD>jBvQYeM#Z+XLH#f`UTV6VWc#t>(K5Kq literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/johab.py b/PythonEnv/2.7/Lib/encodings/johab.py new file mode 100644 index 0000000000..512aeeb732 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/johab.py @@ -0,0 +1,39 @@ +# +# johab.py: Python Unicode Codec for JOHAB +# +# Written by Hye-Shik Chang +# + +import _codecs_kr, codecs +import _multibytecodec as mbc + +codec = _codecs_kr.getcodec('johab') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='johab', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/johab.pyc b/PythonEnv/2.7/Lib/encodings/johab.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5720c0275d94ea21ca236e45132798b04ad9827f GIT binary patch literal 1743 zcmc&!JCD;q5FS6`JkCiF0(5{xaaAe`8l)3KCj!M4cS4&2VMVf%>?Y?BJILM$r6pAS zMScc90KOStoahdkG_k$w*_qkhd41#kZnwVwTwP7*_VMw*z$kuU()b)&5JeU3P~>d+ zE=3+0qPb7nr42+i(%?8W4`>QCpMDT+h(1RF=^7c2=5-M_XzG#?-i*dV z^_SXAs(3h%y~8M;VS=yl-ncaP#B~rpMLwxP4^ry!LAHS@j{aR#b?KK!`0H_PnR>)|394`ox5&5EIz{POEsv5g@{!O07p zrehz1xXdQGNlj))iw|;9e%~n$LgiHCR*rb!E0-ss_}l|+t7Gc}jDk-K+`E>&7r&2U z8RzNIo@E@tfz8b*Rc55kQEY0$hSSO>$L?(UlqdE$HgO3*-`P|ZQ5U>E^Di)2AP9iR z2V8q((GI`?MExy|9#JCz0H{aB1Map?y1{VSP<_y2&#x^P8Y4&HPm0l^7${OT$*!JD z;N*ANC5Uo~S|OQ4Hj&9a#y1J0+$OjaFcy|??=vnhv*}Xsw7Xn!2`jD^#cGPaq!=iP4q2i VqhQ>gI-%QjpZZPbiO1s%?_WtYQl$U@ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/koi8_r.py b/PythonEnv/2.7/Lib/encodings/koi8_r.py new file mode 100644 index 0000000000..f9eb82c0db --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/koi8_r.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec koi8_r generated from 'MAPPINGS/VENDORS/MISC/KOI8-R.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='koi8-r', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u2500' # 0x80 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u2502' # 0x81 -> BOX DRAWINGS LIGHT VERTICAL + u'\u250c' # 0x82 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2510' # 0x83 -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x84 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2518' # 0x85 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u251c' # 0x86 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2524' # 0x87 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u252c' # 0x88 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u2534' # 0x89 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u253c' # 0x8A -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u2580' # 0x8B -> UPPER HALF BLOCK + u'\u2584' # 0x8C -> LOWER HALF BLOCK + u'\u2588' # 0x8D -> FULL BLOCK + u'\u258c' # 0x8E -> LEFT HALF BLOCK + u'\u2590' # 0x8F -> RIGHT HALF BLOCK + u'\u2591' # 0x90 -> LIGHT SHADE + u'\u2592' # 0x91 -> MEDIUM SHADE + u'\u2593' # 0x92 -> DARK SHADE + u'\u2320' # 0x93 -> TOP HALF INTEGRAL + u'\u25a0' # 0x94 -> BLACK SQUARE + u'\u2219' # 0x95 -> BULLET OPERATOR + u'\u221a' # 0x96 -> SQUARE ROOT + u'\u2248' # 0x97 -> ALMOST EQUAL TO + u'\u2264' # 0x98 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0x99 -> GREATER-THAN OR EQUAL TO + u'\xa0' # 0x9A -> NO-BREAK SPACE + u'\u2321' # 0x9B -> BOTTOM HALF INTEGRAL + u'\xb0' # 0x9C -> DEGREE SIGN + u'\xb2' # 0x9D -> SUPERSCRIPT TWO + u'\xb7' # 0x9E -> MIDDLE DOT + u'\xf7' # 0x9F -> DIVISION SIGN + u'\u2550' # 0xA0 -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u2551' # 0xA1 -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2552' # 0xA2 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u0451' # 0xA3 -> CYRILLIC SMALL LETTER IO + u'\u2553' # 0xA4 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u2554' # 0xA5 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2555' # 0xA6 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2556' # 0xA7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2557' # 0xA8 -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u2558' # 0xA9 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2559' # 0xAA -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u255a' # 0xAB -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u255b' # 0xAC -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u255c' # 0xAD -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255d' # 0xAE -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255e' # 0xAF -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0xB0 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u2560' # 0xB1 -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2561' # 0xB2 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u0401' # 0xB3 -> CYRILLIC CAPITAL LETTER IO + u'\u2562' # 0xB4 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2563' # 0xB5 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2564' # 0xB6 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0xB7 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2566' # 0xB8 -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2567' # 0xB9 -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0xBA -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2569' # 0xBB -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u256a' # 0xBC -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u256b' # 0xBD -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256c' # 0xBE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\xa9' # 0xBF -> COPYRIGHT SIGN + u'\u044e' # 0xC0 -> CYRILLIC SMALL LETTER YU + u'\u0430' # 0xC1 -> CYRILLIC SMALL LETTER A + u'\u0431' # 0xC2 -> CYRILLIC SMALL LETTER BE + u'\u0446' # 0xC3 -> CYRILLIC SMALL LETTER TSE + u'\u0434' # 0xC4 -> CYRILLIC SMALL LETTER DE + u'\u0435' # 0xC5 -> CYRILLIC SMALL LETTER IE + u'\u0444' # 0xC6 -> CYRILLIC SMALL LETTER EF + u'\u0433' # 0xC7 -> CYRILLIC SMALL LETTER GHE + u'\u0445' # 0xC8 -> CYRILLIC SMALL LETTER HA + u'\u0438' # 0xC9 -> CYRILLIC SMALL LETTER I + u'\u0439' # 0xCA -> CYRILLIC SMALL LETTER SHORT I + u'\u043a' # 0xCB -> CYRILLIC SMALL LETTER KA + u'\u043b' # 0xCC -> CYRILLIC SMALL LETTER EL + u'\u043c' # 0xCD -> CYRILLIC SMALL LETTER EM + u'\u043d' # 0xCE -> CYRILLIC SMALL LETTER EN + u'\u043e' # 0xCF -> CYRILLIC SMALL LETTER O + u'\u043f' # 0xD0 -> CYRILLIC SMALL LETTER PE + u'\u044f' # 0xD1 -> CYRILLIC SMALL LETTER YA + u'\u0440' # 0xD2 -> CYRILLIC SMALL LETTER ER + u'\u0441' # 0xD3 -> CYRILLIC SMALL LETTER ES + u'\u0442' # 0xD4 -> CYRILLIC SMALL LETTER TE + u'\u0443' # 0xD5 -> CYRILLIC SMALL LETTER U + u'\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + u'\u0432' # 0xD7 -> CYRILLIC SMALL LETTER VE + u'\u044c' # 0xD8 -> CYRILLIC SMALL LETTER SOFT SIGN + u'\u044b' # 0xD9 -> CYRILLIC SMALL LETTER YERU + u'\u0437' # 0xDA -> CYRILLIC SMALL LETTER ZE + u'\u0448' # 0xDB -> CYRILLIC SMALL LETTER SHA + u'\u044d' # 0xDC -> CYRILLIC SMALL LETTER E + u'\u0449' # 0xDD -> CYRILLIC SMALL LETTER SHCHA + u'\u0447' # 0xDE -> CYRILLIC SMALL LETTER CHE + u'\u044a' # 0xDF -> CYRILLIC SMALL LETTER HARD SIGN + u'\u042e' # 0xE0 -> CYRILLIC CAPITAL LETTER YU + u'\u0410' # 0xE1 -> CYRILLIC CAPITAL LETTER A + u'\u0411' # 0xE2 -> CYRILLIC CAPITAL LETTER BE + u'\u0426' # 0xE3 -> CYRILLIC CAPITAL LETTER TSE + u'\u0414' # 0xE4 -> CYRILLIC CAPITAL LETTER DE + u'\u0415' # 0xE5 -> CYRILLIC CAPITAL LETTER IE + u'\u0424' # 0xE6 -> CYRILLIC CAPITAL LETTER EF + u'\u0413' # 0xE7 -> CYRILLIC CAPITAL LETTER GHE + u'\u0425' # 0xE8 -> CYRILLIC CAPITAL LETTER HA + u'\u0418' # 0xE9 -> CYRILLIC CAPITAL LETTER I + u'\u0419' # 0xEA -> CYRILLIC CAPITAL LETTER SHORT I + u'\u041a' # 0xEB -> CYRILLIC CAPITAL LETTER KA + u'\u041b' # 0xEC -> CYRILLIC CAPITAL LETTER EL + u'\u041c' # 0xED -> CYRILLIC CAPITAL LETTER EM + u'\u041d' # 0xEE -> CYRILLIC CAPITAL LETTER EN + u'\u041e' # 0xEF -> CYRILLIC CAPITAL LETTER O + u'\u041f' # 0xF0 -> CYRILLIC CAPITAL LETTER PE + u'\u042f' # 0xF1 -> CYRILLIC CAPITAL LETTER YA + u'\u0420' # 0xF2 -> CYRILLIC CAPITAL LETTER ER + u'\u0421' # 0xF3 -> CYRILLIC CAPITAL LETTER ES + u'\u0422' # 0xF4 -> CYRILLIC CAPITAL LETTER TE + u'\u0423' # 0xF5 -> CYRILLIC CAPITAL LETTER U + u'\u0416' # 0xF6 -> CYRILLIC CAPITAL LETTER ZHE + u'\u0412' # 0xF7 -> CYRILLIC CAPITAL LETTER VE + u'\u042c' # 0xF8 -> CYRILLIC CAPITAL LETTER SOFT SIGN + u'\u042b' # 0xF9 -> CYRILLIC CAPITAL LETTER YERU + u'\u0417' # 0xFA -> CYRILLIC CAPITAL LETTER ZE + u'\u0428' # 0xFB -> CYRILLIC CAPITAL LETTER SHA + u'\u042d' # 0xFC -> CYRILLIC CAPITAL LETTER E + u'\u0429' # 0xFD -> CYRILLIC CAPITAL LETTER SHCHA + u'\u0427' # 0xFE -> CYRILLIC CAPITAL LETTER CHE + u'\u042a' # 0xFF -> CYRILLIC CAPITAL LETTER HARD SIGN +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/koi8_r.pyc b/PythonEnv/2.7/Lib/encodings/koi8_r.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6cd79f07c0a3d440429b40dcd9c99ea698103ce GIT binary patch literal 2865 zcmc&$d3O{=5br&+SrTs0VAMra)`LXx01**b4kKoXv&a#n>t<&*8Q3GvPQ)lGkf;ep zO~UkYLx6CjBBDV>eJ_52p07|}!4H5{J!A*aKO(-Tv*}KC*G_fSuYO&%zCWtNJ$pJE z)9l9M!~e^16i0DV8EeMb!&EQJdRQ|GKBjrtRxit->}NfUbu+f5*~`>`RQRMKSXTI$ zS|JsFsR)%7ex_D3%`0^QmO%sIvM#{XN#nYp)K!&rL8eyIqPc>plUZ{}8bC`S){PE^ z$`UrQnz9AhWU~0y4g;zrO8ZPM^{}q ztY60`ZU*pJX}k=n7k5^YM-iMfbRD6SsP>@87&yvaMzW77i6|w&4AR$4Lr(aBLIT?4;7=13)k#yXZTT(kfC|LJMDNPhI1z%;AIEr*s&|Bp*r=!r2Pa9fJ%bTg}YKfSP_lbmspmZZt( z`Bc`8eZpZAZWQRvKr2;rTs2P8^qN$*s7Zib`~M7E%H*{1LxP^$kzFMz_5UDCDR+=1 zLfwX}Leu%j} zO22XYwo~H_nLF$^m^&PZ*i9STWisWNP93JxWrJ(TX9}`nxyLGW$rNISLQp7_nLEs? zN&Ico&?#)QrqMMQmqj8i^Hh3*o+|tV<)`y15zOQD`2)dhRrTa4Q>RUzF>}`J zyY8-;b5HHP_uU_v`@p;hA9{Fx^pQs&dwfA%{S!|veCp|Eo?W!~xh2mpePP*)%U7(7 zty;Zi?Mn?WuY092zP{;IC9&bPjhi-aX@0%sjW?5TrCQUfmT7C(w{FYk@`aAKjiTB4 z&h~e^-g|$?2OoX})=sc?gVhh#09Y1S`@uR4)(BV^!MXz0H7MI=-=s!MoY3%aY=l0pJIL9|C?D_z~bofgb}t4E(s*1^fi?lfXxSp8|dw_!;15fu93@9{2^|7st-o zUx-WMTl*7nMSO4fi0|x=#Z~d6_(}XMu8Cj7ui`iROM9oi%ie8wiyy>gyWjpyjM}~S z=XRg{sl7*hEe6D(I4vx}#faD|PKo{EfH)`)iNoTEI4X{bZ^W=TE>4J(q9lgIMR7sw z6KBO&;+!}m&POTB$ZqPXY9Wn1lvdRBG167Jr_ nxQUh!+0~aieSDb@O%$o0VgvTqglhaX{#svcpmIv^I`jVtm>$5B literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/koi8_u.py b/PythonEnv/2.7/Lib/encodings/koi8_u.py new file mode 100644 index 0000000000..a9317b12b7 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/koi8_u.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec koi8_u generated from 'python-mappings/KOI8-U.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='koi8-u', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u2500' # 0x80 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u2502' # 0x81 -> BOX DRAWINGS LIGHT VERTICAL + u'\u250c' # 0x82 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2510' # 0x83 -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x84 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2518' # 0x85 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u251c' # 0x86 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2524' # 0x87 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u252c' # 0x88 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u2534' # 0x89 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u253c' # 0x8A -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u2580' # 0x8B -> UPPER HALF BLOCK + u'\u2584' # 0x8C -> LOWER HALF BLOCK + u'\u2588' # 0x8D -> FULL BLOCK + u'\u258c' # 0x8E -> LEFT HALF BLOCK + u'\u2590' # 0x8F -> RIGHT HALF BLOCK + u'\u2591' # 0x90 -> LIGHT SHADE + u'\u2592' # 0x91 -> MEDIUM SHADE + u'\u2593' # 0x92 -> DARK SHADE + u'\u2320' # 0x93 -> TOP HALF INTEGRAL + u'\u25a0' # 0x94 -> BLACK SQUARE + u'\u2219' # 0x95 -> BULLET OPERATOR + u'\u221a' # 0x96 -> SQUARE ROOT + u'\u2248' # 0x97 -> ALMOST EQUAL TO + u'\u2264' # 0x98 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0x99 -> GREATER-THAN OR EQUAL TO + u'\xa0' # 0x9A -> NO-BREAK SPACE + u'\u2321' # 0x9B -> BOTTOM HALF INTEGRAL + u'\xb0' # 0x9C -> DEGREE SIGN + u'\xb2' # 0x9D -> SUPERSCRIPT TWO + u'\xb7' # 0x9E -> MIDDLE DOT + u'\xf7' # 0x9F -> DIVISION SIGN + u'\u2550' # 0xA0 -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u2551' # 0xA1 -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2552' # 0xA2 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u0451' # 0xA3 -> CYRILLIC SMALL LETTER IO + u'\u0454' # 0xA4 -> CYRILLIC SMALL LETTER UKRAINIAN IE + u'\u2554' # 0xA5 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u0456' # 0xA6 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + u'\u0457' # 0xA7 -> CYRILLIC SMALL LETTER YI (UKRAINIAN) + u'\u2557' # 0xA8 -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u2558' # 0xA9 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2559' # 0xAA -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u255a' # 0xAB -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u255b' # 0xAC -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u0491' # 0xAD -> CYRILLIC SMALL LETTER UKRAINIAN GHE WITH UPTURN + u'\u255d' # 0xAE -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255e' # 0xAF -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0xB0 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u2560' # 0xB1 -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2561' # 0xB2 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u0401' # 0xB3 -> CYRILLIC CAPITAL LETTER IO + u'\u0404' # 0xB4 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + u'\u2563' # 0xB5 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u0406' # 0xB6 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + u'\u0407' # 0xB7 -> CYRILLIC CAPITAL LETTER YI (UKRAINIAN) + u'\u2566' # 0xB8 -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2567' # 0xB9 -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0xBA -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2569' # 0xBB -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u256a' # 0xBC -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u0490' # 0xBD -> CYRILLIC CAPITAL LETTER UKRAINIAN GHE WITH UPTURN + u'\u256c' # 0xBE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\xa9' # 0xBF -> COPYRIGHT SIGN + u'\u044e' # 0xC0 -> CYRILLIC SMALL LETTER YU + u'\u0430' # 0xC1 -> CYRILLIC SMALL LETTER A + u'\u0431' # 0xC2 -> CYRILLIC SMALL LETTER BE + u'\u0446' # 0xC3 -> CYRILLIC SMALL LETTER TSE + u'\u0434' # 0xC4 -> CYRILLIC SMALL LETTER DE + u'\u0435' # 0xC5 -> CYRILLIC SMALL LETTER IE + u'\u0444' # 0xC6 -> CYRILLIC SMALL LETTER EF + u'\u0433' # 0xC7 -> CYRILLIC SMALL LETTER GHE + u'\u0445' # 0xC8 -> CYRILLIC SMALL LETTER HA + u'\u0438' # 0xC9 -> CYRILLIC SMALL LETTER I + u'\u0439' # 0xCA -> CYRILLIC SMALL LETTER SHORT I + u'\u043a' # 0xCB -> CYRILLIC SMALL LETTER KA + u'\u043b' # 0xCC -> CYRILLIC SMALL LETTER EL + u'\u043c' # 0xCD -> CYRILLIC SMALL LETTER EM + u'\u043d' # 0xCE -> CYRILLIC SMALL LETTER EN + u'\u043e' # 0xCF -> CYRILLIC SMALL LETTER O + u'\u043f' # 0xD0 -> CYRILLIC SMALL LETTER PE + u'\u044f' # 0xD1 -> CYRILLIC SMALL LETTER YA + u'\u0440' # 0xD2 -> CYRILLIC SMALL LETTER ER + u'\u0441' # 0xD3 -> CYRILLIC SMALL LETTER ES + u'\u0442' # 0xD4 -> CYRILLIC SMALL LETTER TE + u'\u0443' # 0xD5 -> CYRILLIC SMALL LETTER U + u'\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + u'\u0432' # 0xD7 -> CYRILLIC SMALL LETTER VE + u'\u044c' # 0xD8 -> CYRILLIC SMALL LETTER SOFT SIGN + u'\u044b' # 0xD9 -> CYRILLIC SMALL LETTER YERU + u'\u0437' # 0xDA -> CYRILLIC SMALL LETTER ZE + u'\u0448' # 0xDB -> CYRILLIC SMALL LETTER SHA + u'\u044d' # 0xDC -> CYRILLIC SMALL LETTER E + u'\u0449' # 0xDD -> CYRILLIC SMALL LETTER SHCHA + u'\u0447' # 0xDE -> CYRILLIC SMALL LETTER CHE + u'\u044a' # 0xDF -> CYRILLIC SMALL LETTER HARD SIGN + u'\u042e' # 0xE0 -> CYRILLIC CAPITAL LETTER YU + u'\u0410' # 0xE1 -> CYRILLIC CAPITAL LETTER A + u'\u0411' # 0xE2 -> CYRILLIC CAPITAL LETTER BE + u'\u0426' # 0xE3 -> CYRILLIC CAPITAL LETTER TSE + u'\u0414' # 0xE4 -> CYRILLIC CAPITAL LETTER DE + u'\u0415' # 0xE5 -> CYRILLIC CAPITAL LETTER IE + u'\u0424' # 0xE6 -> CYRILLIC CAPITAL LETTER EF + u'\u0413' # 0xE7 -> CYRILLIC CAPITAL LETTER GHE + u'\u0425' # 0xE8 -> CYRILLIC CAPITAL LETTER HA + u'\u0418' # 0xE9 -> CYRILLIC CAPITAL LETTER I + u'\u0419' # 0xEA -> CYRILLIC CAPITAL LETTER SHORT I + u'\u041a' # 0xEB -> CYRILLIC CAPITAL LETTER KA + u'\u041b' # 0xEC -> CYRILLIC CAPITAL LETTER EL + u'\u041c' # 0xED -> CYRILLIC CAPITAL LETTER EM + u'\u041d' # 0xEE -> CYRILLIC CAPITAL LETTER EN + u'\u041e' # 0xEF -> CYRILLIC CAPITAL LETTER O + u'\u041f' # 0xF0 -> CYRILLIC CAPITAL LETTER PE + u'\u042f' # 0xF1 -> CYRILLIC CAPITAL LETTER YA + u'\u0420' # 0xF2 -> CYRILLIC CAPITAL LETTER ER + u'\u0421' # 0xF3 -> CYRILLIC CAPITAL LETTER ES + u'\u0422' # 0xF4 -> CYRILLIC CAPITAL LETTER TE + u'\u0423' # 0xF5 -> CYRILLIC CAPITAL LETTER U + u'\u0416' # 0xF6 -> CYRILLIC CAPITAL LETTER ZHE + u'\u0412' # 0xF7 -> CYRILLIC CAPITAL LETTER VE + u'\u042c' # 0xF8 -> CYRILLIC CAPITAL LETTER SOFT SIGN + u'\u042b' # 0xF9 -> CYRILLIC CAPITAL LETTER YERU + u'\u0417' # 0xFA -> CYRILLIC CAPITAL LETTER ZE + u'\u0428' # 0xFB -> CYRILLIC CAPITAL LETTER SHA + u'\u042d' # 0xFC -> CYRILLIC CAPITAL LETTER E + u'\u0429' # 0xFD -> CYRILLIC CAPITAL LETTER SHCHA + u'\u0427' # 0xFE -> CYRILLIC CAPITAL LETTER CHE + u'\u042a' # 0xFF -> CYRILLIC CAPITAL LETTER HARD SIGN +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/koi8_u.pyc b/PythonEnv/2.7/Lib/encodings/koi8_u.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4dde4653ca4c67b4db64118fd1b4e57f5307db34 GIT binary patch literal 2851 zcmc&$`(G4Q6ugJxzU$`XYXj0$vS z6?|bnF)A~Q9#)?Z{R3zG6YjszA7JO)ksYOeAo_f2ckkuSIdjiF=X<{Q9DIM2g?kR> zHYM22j}QOW;Lyi$k{N5n*~4TnOLVlVf6-n>Wu&%D9jeX z^rB=f`4YiNL8lQkfoBi;iXr3L%V_OmQbUxWH-hxKp{WTYLC-Y&IBH2eA18ycHV@m4 zKQA-9tlNj-dQe{PZWo^E#w?U3Fm8+@=C~_FVu=XEjCgZOady!Ox{^wY5Y$Y2&Jcbm znwHh{C@Ptl^rg6}UDf1(x?*KhN^NeMw5K;YU?L>WW`R%%Stb~mXD0DTwDq<~5Of4y zh{W>tNF>UEL>Nj%IL**?=M2K{rt47x$Oz#Si)G?zB^EQn;vt=tb18h3NGDOS?vY|O zUC1Qd%8GI5bX3q=>NDoyqArurl(dpD;;HolPc4B`@hNa?0X{n1!s{e6mrq2Czkq!9uN?|R@YjASzozqXTlT!W03y4?GKe@)X7$Dlq zL23oqI}Pk}A*wyytf(PMbg4J!5>gq`snAi?t<1RvNU&RV>xNVMwW(sK#%UsV*l#d* zI1sU01RWxo;!LLw)9IqY)n$@dQL)@(CAwr1F+(CKB+ASTvuY53TNHE(+pM8=F2P5g zNXtCMo}i}`zd`ZMT_%Egygq**SQIJ_mz0*xnmuRky!i_jF1q8+^2K*m+o5|tCm0Z_=+cp09afZSA`C8(w^=?&XcIY^vY9 z$can@7US+dea+k#@>oICuAkr(yF%YN~JT|_O~_N$i36?Zs&XN@BZM!J>2Z# z=00xrb8~>3CO40A^Efxpa&wHESGjqO=eu~mhv$2FzMtm@cz%%Q5ApnA-ao?gBfNKr z_YU*EUfy?>_nn&<;r*v4E>B#U82^2oTLau0Z~-nwDZ9vO>ZNiv zfxVMjj>9IGLqs2kNYt++DvkzqgvozsnsaJOcDfNtZ(-VWONZ#@tDXM6#)l?!>Z90r V{pF!@f4RTHR}m;2Pzj$g!d_PG3h%A@?iL=#Pz zI;2~aIy7O%CF9Uxi)PGwbV_tW^m@`F-4=l>0>2ixq&p(;M9{4T9_b#LmdM&PV+H+M z)+T*rCG$nLR?B?S>ty(_N^rFnbVy&rWYPuNad;g@FgObSTG}^x7TirEn`B!%cY|TB zP2BJIUlob9CJPRh!HcMfw{|mKnBcit92^((AY4T0)3lmw$N6G&yWbDvP2PR9ERy*f z8w^Kk?_RK*rh&q|43sHN@z&_=VDvJ0wX4+b=H`aF$cTWPN{EA~!zrY6Ip zNYB{wQvQ4;t=Q@?-cQ1nzc4p^v|oAg*WdQj` zC!9bI4aOmKjuIvmVviC6K$ZPPkr$;%EEY?X&Lk{Jc64lon@@BY8PVv8R@gEY+@8DwOp6bCe@i;P5T>)9c8jp)+ z6S954K4B#PkH>Hzj6fR1fpq6PYbX?$20DSTh0>8d0V*(S!9hH{P7 zZ17kGwSl5cr2khaXq$J=K>@VNE5kf{Yl^Qr=3Bd0Wo8V_ek0X z+HZ+zQsxgH+<&;WBSkIwC`~VEnqJj%i_e#}9iD+HG^JLUJnPv_c3KjJ|9>S`_ZwFseEC?P9sf(-K7L2&0QK9tbANucu&9!EZ CONTROL CHARACTER + u'\x01' # 0x0001 -> CONTROL CHARACTER + u'\x02' # 0x0002 -> CONTROL CHARACTER + u'\x03' # 0x0003 -> CONTROL CHARACTER + u'\x04' # 0x0004 -> CONTROL CHARACTER + u'\x05' # 0x0005 -> CONTROL CHARACTER + u'\x06' # 0x0006 -> CONTROL CHARACTER + u'\x07' # 0x0007 -> CONTROL CHARACTER + u'\x08' # 0x0008 -> CONTROL CHARACTER + u'\t' # 0x0009 -> CONTROL CHARACTER + u'\n' # 0x000a -> CONTROL CHARACTER + u'\x0b' # 0x000b -> CONTROL CHARACTER + u'\x0c' # 0x000c -> CONTROL CHARACTER + u'\r' # 0x000d -> CONTROL CHARACTER + u'\x0e' # 0x000e -> CONTROL CHARACTER + u'\x0f' # 0x000f -> CONTROL CHARACTER + u'\x10' # 0x0010 -> CONTROL CHARACTER + u'\x11' # 0x0011 -> CONTROL CHARACTER + u'\x12' # 0x0012 -> CONTROL CHARACTER + u'\x13' # 0x0013 -> CONTROL CHARACTER + u'\x14' # 0x0014 -> CONTROL CHARACTER + u'\x15' # 0x0015 -> CONTROL CHARACTER + u'\x16' # 0x0016 -> CONTROL CHARACTER + u'\x17' # 0x0017 -> CONTROL CHARACTER + u'\x18' # 0x0018 -> CONTROL CHARACTER + u'\x19' # 0x0019 -> CONTROL CHARACTER + u'\x1a' # 0x001a -> CONTROL CHARACTER + u'\x1b' # 0x001b -> CONTROL CHARACTER + u'\x1c' # 0x001c -> CONTROL CHARACTER + u'\x1d' # 0x001d -> CONTROL CHARACTER + u'\x1e' # 0x001e -> CONTROL CHARACTER + u'\x1f' # 0x001f -> CONTROL CHARACTER + u' ' # 0x0020 -> SPACE, left-right + u'!' # 0x0021 -> EXCLAMATION MARK, left-right + u'"' # 0x0022 -> QUOTATION MARK, left-right + u'#' # 0x0023 -> NUMBER SIGN, left-right + u'$' # 0x0024 -> DOLLAR SIGN, left-right + u'%' # 0x0025 -> PERCENT SIGN, left-right + u'&' # 0x0026 -> AMPERSAND, left-right + u"'" # 0x0027 -> APOSTROPHE, left-right + u'(' # 0x0028 -> LEFT PARENTHESIS, left-right + u')' # 0x0029 -> RIGHT PARENTHESIS, left-right + u'*' # 0x002a -> ASTERISK, left-right + u'+' # 0x002b -> PLUS SIGN, left-right + u',' # 0x002c -> COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR + u'-' # 0x002d -> HYPHEN-MINUS, left-right + u'.' # 0x002e -> FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR + u'/' # 0x002f -> SOLIDUS, left-right + u'0' # 0x0030 -> DIGIT ZERO; in Arabic-script context, displayed as 0x0660 ARABIC-INDIC DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE; in Arabic-script context, displayed as 0x0661 ARABIC-INDIC DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO; in Arabic-script context, displayed as 0x0662 ARABIC-INDIC DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE; in Arabic-script context, displayed as 0x0663 ARABIC-INDIC DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR; in Arabic-script context, displayed as 0x0664 ARABIC-INDIC DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE; in Arabic-script context, displayed as 0x0665 ARABIC-INDIC DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX; in Arabic-script context, displayed as 0x0666 ARABIC-INDIC DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN; in Arabic-script context, displayed as 0x0667 ARABIC-INDIC DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT; in Arabic-script context, displayed as 0x0668 ARABIC-INDIC DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE; in Arabic-script context, displayed as 0x0669 ARABIC-INDIC DIGIT NINE + u':' # 0x003a -> COLON, left-right + u';' # 0x003b -> SEMICOLON, left-right + u'<' # 0x003c -> LESS-THAN SIGN, left-right + u'=' # 0x003d -> EQUALS SIGN, left-right + u'>' # 0x003e -> GREATER-THAN SIGN, left-right + u'?' # 0x003f -> QUESTION MARK, left-right + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET, left-right + u'\\' # 0x005c -> REVERSE SOLIDUS, left-right + u']' # 0x005d -> RIGHT SQUARE BRACKET, left-right + u'^' # 0x005e -> CIRCUMFLEX ACCENT, left-right + u'_' # 0x005f -> LOW LINE, left-right + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET, left-right + u'|' # 0x007c -> VERTICAL LINE, left-right + u'}' # 0x007d -> RIGHT CURLY BRACKET, left-right + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> CONTROL CHARACTER + u'\xc4' # 0x0080 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xa0' # 0x0081 -> NO-BREAK SPACE, right-left + u'\xc7' # 0x0082 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc9' # 0x0083 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xd1' # 0x0084 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd6' # 0x0085 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x0086 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xe1' # 0x0087 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe0' # 0x0088 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe2' # 0x0089 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x008a -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u06ba' # 0x008b -> ARABIC LETTER NOON GHUNNA + u'\xab' # 0x008c -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + u'\xe7' # 0x008d -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe9' # 0x008e -> LATIN SMALL LETTER E WITH ACUTE + u'\xe8' # 0x008f -> LATIN SMALL LETTER E WITH GRAVE + u'\xea' # 0x0090 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x0091 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xed' # 0x0092 -> LATIN SMALL LETTER I WITH ACUTE + u'\u2026' # 0x0093 -> HORIZONTAL ELLIPSIS, right-left + u'\xee' # 0x0094 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x0095 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf1' # 0x0096 -> LATIN SMALL LETTER N WITH TILDE + u'\xf3' # 0x0097 -> LATIN SMALL LETTER O WITH ACUTE + u'\xbb' # 0x0098 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + u'\xf4' # 0x0099 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x009a -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0x009b -> DIVISION SIGN, right-left + u'\xfa' # 0x009c -> LATIN SMALL LETTER U WITH ACUTE + u'\xf9' # 0x009d -> LATIN SMALL LETTER U WITH GRAVE + u'\xfb' # 0x009e -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0x009f -> LATIN SMALL LETTER U WITH DIAERESIS + u' ' # 0x00a0 -> SPACE, right-left + u'!' # 0x00a1 -> EXCLAMATION MARK, right-left + u'"' # 0x00a2 -> QUOTATION MARK, right-left + u'#' # 0x00a3 -> NUMBER SIGN, right-left + u'$' # 0x00a4 -> DOLLAR SIGN, right-left + u'\u066a' # 0x00a5 -> ARABIC PERCENT SIGN + u'&' # 0x00a6 -> AMPERSAND, right-left + u"'" # 0x00a7 -> APOSTROPHE, right-left + u'(' # 0x00a8 -> LEFT PARENTHESIS, right-left + u')' # 0x00a9 -> RIGHT PARENTHESIS, right-left + u'*' # 0x00aa -> ASTERISK, right-left + u'+' # 0x00ab -> PLUS SIGN, right-left + u'\u060c' # 0x00ac -> ARABIC COMMA + u'-' # 0x00ad -> HYPHEN-MINUS, right-left + u'.' # 0x00ae -> FULL STOP, right-left + u'/' # 0x00af -> SOLIDUS, right-left + u'\u0660' # 0x00b0 -> ARABIC-INDIC DIGIT ZERO, right-left (need override) + u'\u0661' # 0x00b1 -> ARABIC-INDIC DIGIT ONE, right-left (need override) + u'\u0662' # 0x00b2 -> ARABIC-INDIC DIGIT TWO, right-left (need override) + u'\u0663' # 0x00b3 -> ARABIC-INDIC DIGIT THREE, right-left (need override) + u'\u0664' # 0x00b4 -> ARABIC-INDIC DIGIT FOUR, right-left (need override) + u'\u0665' # 0x00b5 -> ARABIC-INDIC DIGIT FIVE, right-left (need override) + u'\u0666' # 0x00b6 -> ARABIC-INDIC DIGIT SIX, right-left (need override) + u'\u0667' # 0x00b7 -> ARABIC-INDIC DIGIT SEVEN, right-left (need override) + u'\u0668' # 0x00b8 -> ARABIC-INDIC DIGIT EIGHT, right-left (need override) + u'\u0669' # 0x00b9 -> ARABIC-INDIC DIGIT NINE, right-left (need override) + u':' # 0x00ba -> COLON, right-left + u'\u061b' # 0x00bb -> ARABIC SEMICOLON + u'<' # 0x00bc -> LESS-THAN SIGN, right-left + u'=' # 0x00bd -> EQUALS SIGN, right-left + u'>' # 0x00be -> GREATER-THAN SIGN, right-left + u'\u061f' # 0x00bf -> ARABIC QUESTION MARK + u'\u274a' # 0x00c0 -> EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left + u'\u0621' # 0x00c1 -> ARABIC LETTER HAMZA + u'\u0622' # 0x00c2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + u'\u0623' # 0x00c3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + u'\u0624' # 0x00c4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + u'\u0625' # 0x00c5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + u'\u0626' # 0x00c6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + u'\u0627' # 0x00c7 -> ARABIC LETTER ALEF + u'\u0628' # 0x00c8 -> ARABIC LETTER BEH + u'\u0629' # 0x00c9 -> ARABIC LETTER TEH MARBUTA + u'\u062a' # 0x00ca -> ARABIC LETTER TEH + u'\u062b' # 0x00cb -> ARABIC LETTER THEH + u'\u062c' # 0x00cc -> ARABIC LETTER JEEM + u'\u062d' # 0x00cd -> ARABIC LETTER HAH + u'\u062e' # 0x00ce -> ARABIC LETTER KHAH + u'\u062f' # 0x00cf -> ARABIC LETTER DAL + u'\u0630' # 0x00d0 -> ARABIC LETTER THAL + u'\u0631' # 0x00d1 -> ARABIC LETTER REH + u'\u0632' # 0x00d2 -> ARABIC LETTER ZAIN + u'\u0633' # 0x00d3 -> ARABIC LETTER SEEN + u'\u0634' # 0x00d4 -> ARABIC LETTER SHEEN + u'\u0635' # 0x00d5 -> ARABIC LETTER SAD + u'\u0636' # 0x00d6 -> ARABIC LETTER DAD + u'\u0637' # 0x00d7 -> ARABIC LETTER TAH + u'\u0638' # 0x00d8 -> ARABIC LETTER ZAH + u'\u0639' # 0x00d9 -> ARABIC LETTER AIN + u'\u063a' # 0x00da -> ARABIC LETTER GHAIN + u'[' # 0x00db -> LEFT SQUARE BRACKET, right-left + u'\\' # 0x00dc -> REVERSE SOLIDUS, right-left + u']' # 0x00dd -> RIGHT SQUARE BRACKET, right-left + u'^' # 0x00de -> CIRCUMFLEX ACCENT, right-left + u'_' # 0x00df -> LOW LINE, right-left + u'\u0640' # 0x00e0 -> ARABIC TATWEEL + u'\u0641' # 0x00e1 -> ARABIC LETTER FEH + u'\u0642' # 0x00e2 -> ARABIC LETTER QAF + u'\u0643' # 0x00e3 -> ARABIC LETTER KAF + u'\u0644' # 0x00e4 -> ARABIC LETTER LAM + u'\u0645' # 0x00e5 -> ARABIC LETTER MEEM + u'\u0646' # 0x00e6 -> ARABIC LETTER NOON + u'\u0647' # 0x00e7 -> ARABIC LETTER HEH + u'\u0648' # 0x00e8 -> ARABIC LETTER WAW + u'\u0649' # 0x00e9 -> ARABIC LETTER ALEF MAKSURA + u'\u064a' # 0x00ea -> ARABIC LETTER YEH + u'\u064b' # 0x00eb -> ARABIC FATHATAN + u'\u064c' # 0x00ec -> ARABIC DAMMATAN + u'\u064d' # 0x00ed -> ARABIC KASRATAN + u'\u064e' # 0x00ee -> ARABIC FATHA + u'\u064f' # 0x00ef -> ARABIC DAMMA + u'\u0650' # 0x00f0 -> ARABIC KASRA + u'\u0651' # 0x00f1 -> ARABIC SHADDA + u'\u0652' # 0x00f2 -> ARABIC SUKUN + u'\u067e' # 0x00f3 -> ARABIC LETTER PEH + u'\u0679' # 0x00f4 -> ARABIC LETTER TTEH + u'\u0686' # 0x00f5 -> ARABIC LETTER TCHEH + u'\u06d5' # 0x00f6 -> ARABIC LETTER AE + u'\u06a4' # 0x00f7 -> ARABIC LETTER VEH + u'\u06af' # 0x00f8 -> ARABIC LETTER GAF + u'\u0688' # 0x00f9 -> ARABIC LETTER DDAL + u'\u0691' # 0x00fa -> ARABIC LETTER RREH + u'{' # 0x00fb -> LEFT CURLY BRACKET, right-left + u'|' # 0x00fc -> VERTICAL LINE, right-left + u'}' # 0x00fd -> RIGHT CURLY BRACKET, right-left + u'\u0698' # 0x00fe -> ARABIC LETTER JEH + u'\u06d2' # 0x00ff -> ARABIC LETTER YEH BARREE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # CONTROL CHARACTER + 0x0001: 0x0001, # CONTROL CHARACTER + 0x0002: 0x0002, # CONTROL CHARACTER + 0x0003: 0x0003, # CONTROL CHARACTER + 0x0004: 0x0004, # CONTROL CHARACTER + 0x0005: 0x0005, # CONTROL CHARACTER + 0x0006: 0x0006, # CONTROL CHARACTER + 0x0007: 0x0007, # CONTROL CHARACTER + 0x0008: 0x0008, # CONTROL CHARACTER + 0x0009: 0x0009, # CONTROL CHARACTER + 0x000a: 0x000a, # CONTROL CHARACTER + 0x000b: 0x000b, # CONTROL CHARACTER + 0x000c: 0x000c, # CONTROL CHARACTER + 0x000d: 0x000d, # CONTROL CHARACTER + 0x000e: 0x000e, # CONTROL CHARACTER + 0x000f: 0x000f, # CONTROL CHARACTER + 0x0010: 0x0010, # CONTROL CHARACTER + 0x0011: 0x0011, # CONTROL CHARACTER + 0x0012: 0x0012, # CONTROL CHARACTER + 0x0013: 0x0013, # CONTROL CHARACTER + 0x0014: 0x0014, # CONTROL CHARACTER + 0x0015: 0x0015, # CONTROL CHARACTER + 0x0016: 0x0016, # CONTROL CHARACTER + 0x0017: 0x0017, # CONTROL CHARACTER + 0x0018: 0x0018, # CONTROL CHARACTER + 0x0019: 0x0019, # CONTROL CHARACTER + 0x001a: 0x001a, # CONTROL CHARACTER + 0x001b: 0x001b, # CONTROL CHARACTER + 0x001c: 0x001c, # CONTROL CHARACTER + 0x001d: 0x001d, # CONTROL CHARACTER + 0x001e: 0x001e, # CONTROL CHARACTER + 0x001f: 0x001f, # CONTROL CHARACTER + 0x0020: 0x0020, # SPACE, left-right + 0x0020: 0x00a0, # SPACE, right-left + 0x0021: 0x0021, # EXCLAMATION MARK, left-right + 0x0021: 0x00a1, # EXCLAMATION MARK, right-left + 0x0022: 0x0022, # QUOTATION MARK, left-right + 0x0022: 0x00a2, # QUOTATION MARK, right-left + 0x0023: 0x0023, # NUMBER SIGN, left-right + 0x0023: 0x00a3, # NUMBER SIGN, right-left + 0x0024: 0x0024, # DOLLAR SIGN, left-right + 0x0024: 0x00a4, # DOLLAR SIGN, right-left + 0x0025: 0x0025, # PERCENT SIGN, left-right + 0x0026: 0x0026, # AMPERSAND, left-right + 0x0026: 0x00a6, # AMPERSAND, right-left + 0x0027: 0x0027, # APOSTROPHE, left-right + 0x0027: 0x00a7, # APOSTROPHE, right-left + 0x0028: 0x0028, # LEFT PARENTHESIS, left-right + 0x0028: 0x00a8, # LEFT PARENTHESIS, right-left + 0x0029: 0x0029, # RIGHT PARENTHESIS, left-right + 0x0029: 0x00a9, # RIGHT PARENTHESIS, right-left + 0x002a: 0x002a, # ASTERISK, left-right + 0x002a: 0x00aa, # ASTERISK, right-left + 0x002b: 0x002b, # PLUS SIGN, left-right + 0x002b: 0x00ab, # PLUS SIGN, right-left + 0x002c: 0x002c, # COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR + 0x002d: 0x002d, # HYPHEN-MINUS, left-right + 0x002d: 0x00ad, # HYPHEN-MINUS, right-left + 0x002e: 0x002e, # FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR + 0x002e: 0x00ae, # FULL STOP, right-left + 0x002f: 0x002f, # SOLIDUS, left-right + 0x002f: 0x00af, # SOLIDUS, right-left + 0x0030: 0x0030, # DIGIT ZERO; in Arabic-script context, displayed as 0x0660 ARABIC-INDIC DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE; in Arabic-script context, displayed as 0x0661 ARABIC-INDIC DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO; in Arabic-script context, displayed as 0x0662 ARABIC-INDIC DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE; in Arabic-script context, displayed as 0x0663 ARABIC-INDIC DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR; in Arabic-script context, displayed as 0x0664 ARABIC-INDIC DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE; in Arabic-script context, displayed as 0x0665 ARABIC-INDIC DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX; in Arabic-script context, displayed as 0x0666 ARABIC-INDIC DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN; in Arabic-script context, displayed as 0x0667 ARABIC-INDIC DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT; in Arabic-script context, displayed as 0x0668 ARABIC-INDIC DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE; in Arabic-script context, displayed as 0x0669 ARABIC-INDIC DIGIT NINE + 0x003a: 0x003a, # COLON, left-right + 0x003a: 0x00ba, # COLON, right-left + 0x003b: 0x003b, # SEMICOLON, left-right + 0x003c: 0x003c, # LESS-THAN SIGN, left-right + 0x003c: 0x00bc, # LESS-THAN SIGN, right-left + 0x003d: 0x003d, # EQUALS SIGN, left-right + 0x003d: 0x00bd, # EQUALS SIGN, right-left + 0x003e: 0x003e, # GREATER-THAN SIGN, left-right + 0x003e: 0x00be, # GREATER-THAN SIGN, right-left + 0x003f: 0x003f, # QUESTION MARK, left-right + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET, left-right + 0x005b: 0x00db, # LEFT SQUARE BRACKET, right-left + 0x005c: 0x005c, # REVERSE SOLIDUS, left-right + 0x005c: 0x00dc, # REVERSE SOLIDUS, right-left + 0x005d: 0x005d, # RIGHT SQUARE BRACKET, left-right + 0x005d: 0x00dd, # RIGHT SQUARE BRACKET, right-left + 0x005e: 0x005e, # CIRCUMFLEX ACCENT, left-right + 0x005e: 0x00de, # CIRCUMFLEX ACCENT, right-left + 0x005f: 0x005f, # LOW LINE, left-right + 0x005f: 0x00df, # LOW LINE, right-left + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET, left-right + 0x007b: 0x00fb, # LEFT CURLY BRACKET, right-left + 0x007c: 0x007c, # VERTICAL LINE, left-right + 0x007c: 0x00fc, # VERTICAL LINE, right-left + 0x007d: 0x007d, # RIGHT CURLY BRACKET, left-right + 0x007d: 0x00fd, # RIGHT CURLY BRACKET, right-left + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # CONTROL CHARACTER + 0x00a0: 0x0081, # NO-BREAK SPACE, right-left + 0x00ab: 0x008c, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x00bb: 0x0098, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x00c4: 0x0080, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c7: 0x0082, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0083, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d1: 0x0084, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d6: 0x0085, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00dc: 0x0086, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00e0: 0x0088, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x0087, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0089, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x008a, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e7: 0x008d, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008f, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x008e, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0090, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0091, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ed: 0x0092, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x0094, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x0095, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x0096, # LATIN SMALL LETTER N WITH TILDE + 0x00f3: 0x0097, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0099, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x009a, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x009b, # DIVISION SIGN, right-left + 0x00f9: 0x009d, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x009c, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x009e, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x009f, # LATIN SMALL LETTER U WITH DIAERESIS + 0x060c: 0x00ac, # ARABIC COMMA + 0x061b: 0x00bb, # ARABIC SEMICOLON + 0x061f: 0x00bf, # ARABIC QUESTION MARK + 0x0621: 0x00c1, # ARABIC LETTER HAMZA + 0x0622: 0x00c2, # ARABIC LETTER ALEF WITH MADDA ABOVE + 0x0623: 0x00c3, # ARABIC LETTER ALEF WITH HAMZA ABOVE + 0x0624: 0x00c4, # ARABIC LETTER WAW WITH HAMZA ABOVE + 0x0625: 0x00c5, # ARABIC LETTER ALEF WITH HAMZA BELOW + 0x0626: 0x00c6, # ARABIC LETTER YEH WITH HAMZA ABOVE + 0x0627: 0x00c7, # ARABIC LETTER ALEF + 0x0628: 0x00c8, # ARABIC LETTER BEH + 0x0629: 0x00c9, # ARABIC LETTER TEH MARBUTA + 0x062a: 0x00ca, # ARABIC LETTER TEH + 0x062b: 0x00cb, # ARABIC LETTER THEH + 0x062c: 0x00cc, # ARABIC LETTER JEEM + 0x062d: 0x00cd, # ARABIC LETTER HAH + 0x062e: 0x00ce, # ARABIC LETTER KHAH + 0x062f: 0x00cf, # ARABIC LETTER DAL + 0x0630: 0x00d0, # ARABIC LETTER THAL + 0x0631: 0x00d1, # ARABIC LETTER REH + 0x0632: 0x00d2, # ARABIC LETTER ZAIN + 0x0633: 0x00d3, # ARABIC LETTER SEEN + 0x0634: 0x00d4, # ARABIC LETTER SHEEN + 0x0635: 0x00d5, # ARABIC LETTER SAD + 0x0636: 0x00d6, # ARABIC LETTER DAD + 0x0637: 0x00d7, # ARABIC LETTER TAH + 0x0638: 0x00d8, # ARABIC LETTER ZAH + 0x0639: 0x00d9, # ARABIC LETTER AIN + 0x063a: 0x00da, # ARABIC LETTER GHAIN + 0x0640: 0x00e0, # ARABIC TATWEEL + 0x0641: 0x00e1, # ARABIC LETTER FEH + 0x0642: 0x00e2, # ARABIC LETTER QAF + 0x0643: 0x00e3, # ARABIC LETTER KAF + 0x0644: 0x00e4, # ARABIC LETTER LAM + 0x0645: 0x00e5, # ARABIC LETTER MEEM + 0x0646: 0x00e6, # ARABIC LETTER NOON + 0x0647: 0x00e7, # ARABIC LETTER HEH + 0x0648: 0x00e8, # ARABIC LETTER WAW + 0x0649: 0x00e9, # ARABIC LETTER ALEF MAKSURA + 0x064a: 0x00ea, # ARABIC LETTER YEH + 0x064b: 0x00eb, # ARABIC FATHATAN + 0x064c: 0x00ec, # ARABIC DAMMATAN + 0x064d: 0x00ed, # ARABIC KASRATAN + 0x064e: 0x00ee, # ARABIC FATHA + 0x064f: 0x00ef, # ARABIC DAMMA + 0x0650: 0x00f0, # ARABIC KASRA + 0x0651: 0x00f1, # ARABIC SHADDA + 0x0652: 0x00f2, # ARABIC SUKUN + 0x0660: 0x00b0, # ARABIC-INDIC DIGIT ZERO, right-left (need override) + 0x0661: 0x00b1, # ARABIC-INDIC DIGIT ONE, right-left (need override) + 0x0662: 0x00b2, # ARABIC-INDIC DIGIT TWO, right-left (need override) + 0x0663: 0x00b3, # ARABIC-INDIC DIGIT THREE, right-left (need override) + 0x0664: 0x00b4, # ARABIC-INDIC DIGIT FOUR, right-left (need override) + 0x0665: 0x00b5, # ARABIC-INDIC DIGIT FIVE, right-left (need override) + 0x0666: 0x00b6, # ARABIC-INDIC DIGIT SIX, right-left (need override) + 0x0667: 0x00b7, # ARABIC-INDIC DIGIT SEVEN, right-left (need override) + 0x0668: 0x00b8, # ARABIC-INDIC DIGIT EIGHT, right-left (need override) + 0x0669: 0x00b9, # ARABIC-INDIC DIGIT NINE, right-left (need override) + 0x066a: 0x00a5, # ARABIC PERCENT SIGN + 0x0679: 0x00f4, # ARABIC LETTER TTEH + 0x067e: 0x00f3, # ARABIC LETTER PEH + 0x0686: 0x00f5, # ARABIC LETTER TCHEH + 0x0688: 0x00f9, # ARABIC LETTER DDAL + 0x0691: 0x00fa, # ARABIC LETTER RREH + 0x0698: 0x00fe, # ARABIC LETTER JEH + 0x06a4: 0x00f7, # ARABIC LETTER VEH + 0x06af: 0x00f8, # ARABIC LETTER GAF + 0x06ba: 0x008b, # ARABIC LETTER NOON GHUNNA + 0x06d2: 0x00ff, # ARABIC LETTER YEH BARREE + 0x06d5: 0x00f6, # ARABIC LETTER AE + 0x2026: 0x0093, # HORIZONTAL ELLIPSIS, right-left + 0x274a: 0x00c0, # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left +} diff --git a/PythonEnv/2.7/Lib/encodings/mac_arabic.pyc b/PythonEnv/2.7/Lib/encodings/mac_arabic.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b08caec8d70248351aabe3b53538b77d9b25577 GIT binary patch literal 7989 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 TPR CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\u0100' # 0x81 -> LATIN CAPITAL LETTER A WITH MACRON + u'\u0101' # 0x82 -> LATIN SMALL LETTER A WITH MACRON + u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\u0104' # 0x84 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + u'\u0105' # 0x88 -> LATIN SMALL LETTER A WITH OGONEK + u'\u010c' # 0x89 -> LATIN CAPITAL LETTER C WITH CARON + u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u010d' # 0x8B -> LATIN SMALL LETTER C WITH CARON + u'\u0106' # 0x8C -> LATIN CAPITAL LETTER C WITH ACUTE + u'\u0107' # 0x8D -> LATIN SMALL LETTER C WITH ACUTE + u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + u'\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE + u'\u017a' # 0x90 -> LATIN SMALL LETTER Z WITH ACUTE + u'\u010e' # 0x91 -> LATIN CAPITAL LETTER D WITH CARON + u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + u'\u010f' # 0x93 -> LATIN SMALL LETTER D WITH CARON + u'\u0112' # 0x94 -> LATIN CAPITAL LETTER E WITH MACRON + u'\u0113' # 0x95 -> LATIN SMALL LETTER E WITH MACRON + u'\u0116' # 0x96 -> LATIN CAPITAL LETTER E WITH DOT ABOVE + u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + u'\u0117' # 0x98 -> LATIN SMALL LETTER E WITH DOT ABOVE + u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + u'\u011a' # 0x9D -> LATIN CAPITAL LETTER E WITH CARON + u'\u011b' # 0x9E -> LATIN SMALL LETTER E WITH CARON + u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u2020' # 0xA0 -> DAGGER + u'\xb0' # 0xA1 -> DEGREE SIGN + u'\u0118' # 0xA2 -> LATIN CAPITAL LETTER E WITH OGONEK + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa7' # 0xA4 -> SECTION SIGN + u'\u2022' # 0xA5 -> BULLET + u'\xb6' # 0xA6 -> PILCROW SIGN + u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + u'\xae' # 0xA8 -> REGISTERED SIGN + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u2122' # 0xAA -> TRADE MARK SIGN + u'\u0119' # 0xAB -> LATIN SMALL LETTER E WITH OGONEK + u'\xa8' # 0xAC -> DIAERESIS + u'\u2260' # 0xAD -> NOT EQUAL TO + u'\u0123' # 0xAE -> LATIN SMALL LETTER G WITH CEDILLA + u'\u012e' # 0xAF -> LATIN CAPITAL LETTER I WITH OGONEK + u'\u012f' # 0xB0 -> LATIN SMALL LETTER I WITH OGONEK + u'\u012a' # 0xB1 -> LATIN CAPITAL LETTER I WITH MACRON + u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + u'\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON + u'\u0136' # 0xB5 -> LATIN CAPITAL LETTER K WITH CEDILLA + u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + u'\u2211' # 0xB7 -> N-ARY SUMMATION + u'\u0142' # 0xB8 -> LATIN SMALL LETTER L WITH STROKE + u'\u013b' # 0xB9 -> LATIN CAPITAL LETTER L WITH CEDILLA + u'\u013c' # 0xBA -> LATIN SMALL LETTER L WITH CEDILLA + u'\u013d' # 0xBB -> LATIN CAPITAL LETTER L WITH CARON + u'\u013e' # 0xBC -> LATIN SMALL LETTER L WITH CARON + u'\u0139' # 0xBD -> LATIN CAPITAL LETTER L WITH ACUTE + u'\u013a' # 0xBE -> LATIN SMALL LETTER L WITH ACUTE + u'\u0145' # 0xBF -> LATIN CAPITAL LETTER N WITH CEDILLA + u'\u0146' # 0xC0 -> LATIN SMALL LETTER N WITH CEDILLA + u'\u0143' # 0xC1 -> LATIN CAPITAL LETTER N WITH ACUTE + u'\xac' # 0xC2 -> NOT SIGN + u'\u221a' # 0xC3 -> SQUARE ROOT + u'\u0144' # 0xC4 -> LATIN SMALL LETTER N WITH ACUTE + u'\u0147' # 0xC5 -> LATIN CAPITAL LETTER N WITH CARON + u'\u2206' # 0xC6 -> INCREMENT + u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + u'\xa0' # 0xCA -> NO-BREAK SPACE + u'\u0148' # 0xCB -> LATIN SMALL LETTER N WITH CARON + u'\u0150' # 0xCC -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + u'\u0151' # 0xCE -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + u'\u014c' # 0xCF -> LATIN CAPITAL LETTER O WITH MACRON + u'\u2013' # 0xD0 -> EN DASH + u'\u2014' # 0xD1 -> EM DASH + u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + u'\xf7' # 0xD6 -> DIVISION SIGN + u'\u25ca' # 0xD7 -> LOZENGE + u'\u014d' # 0xD8 -> LATIN SMALL LETTER O WITH MACRON + u'\u0154' # 0xD9 -> LATIN CAPITAL LETTER R WITH ACUTE + u'\u0155' # 0xDA -> LATIN SMALL LETTER R WITH ACUTE + u'\u0158' # 0xDB -> LATIN CAPITAL LETTER R WITH CARON + u'\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\u0159' # 0xDE -> LATIN SMALL LETTER R WITH CARON + u'\u0156' # 0xDF -> LATIN CAPITAL LETTER R WITH CEDILLA + u'\u0157' # 0xE0 -> LATIN SMALL LETTER R WITH CEDILLA + u'\u0160' # 0xE1 -> LATIN CAPITAL LETTER S WITH CARON + u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + u'\u0161' # 0xE4 -> LATIN SMALL LETTER S WITH CARON + u'\u015a' # 0xE5 -> LATIN CAPITAL LETTER S WITH ACUTE + u'\u015b' # 0xE6 -> LATIN SMALL LETTER S WITH ACUTE + u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\u0164' # 0xE8 -> LATIN CAPITAL LETTER T WITH CARON + u'\u0165' # 0xE9 -> LATIN SMALL LETTER T WITH CARON + u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + u'\u017d' # 0xEB -> LATIN CAPITAL LETTER Z WITH CARON + u'\u017e' # 0xEC -> LATIN SMALL LETTER Z WITH CARON + u'\u016a' # 0xED -> LATIN CAPITAL LETTER U WITH MACRON + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\u016b' # 0xF0 -> LATIN SMALL LETTER U WITH MACRON + u'\u016e' # 0xF1 -> LATIN CAPITAL LETTER U WITH RING ABOVE + u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\u016f' # 0xF3 -> LATIN SMALL LETTER U WITH RING ABOVE + u'\u0170' # 0xF4 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + u'\u0171' # 0xF5 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + u'\u0172' # 0xF6 -> LATIN CAPITAL LETTER U WITH OGONEK + u'\u0173' # 0xF7 -> LATIN SMALL LETTER U WITH OGONEK + u'\xdd' # 0xF8 -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xfd' # 0xF9 -> LATIN SMALL LETTER Y WITH ACUTE + u'\u0137' # 0xFA -> LATIN SMALL LETTER K WITH CEDILLA + u'\u017b' # 0xFB -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\u0141' # 0xFC -> LATIN CAPITAL LETTER L WITH STROKE + u'\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\u0122' # 0xFE -> LATIN CAPITAL LETTER G WITH CEDILLA + u'\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_centeuro.pyc b/PythonEnv/2.7/Lib/encodings/mac_centeuro.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89a70fce55a9a928932d23893087d45fa6800e49 GIT binary patch literal 2912 zcmc&$YkLz#6rNn0rY(2SV%6Y{pwcQ{P(%dMf>oNn16%sJUP=e*~gbK?55!k;^o zZIH;_#|8g4!pMxnBoopCvxCS^l5mg~Sh$GdAbXr725UFT5z<4*?iMGJJzU}93U5*2 zB60~=xVgetRJe&;N)#v8c}NTn@E3I+B9|3(Ual)I>byj*z)edDk>`;XA3p$2@{t~J z(2t%*g7YzeEKGr>ZmlDo3WPdDRg^SE4K#?Io$*wAAe5FBDUcMUsHCJcC99?b?Mg~f zMNN?dF*ThGtZdlS)Knkd8mZY)7p`p-A~mqzR#y|M3pdwo7aFUZcQvmJbj7s}d{e^n zsyn-@{r>nJc*2?o>~kwcY@Hz4jIIS>QXmGvki(k;*8u@oI|;5`M2G}26Pg#luBmZJ zlW>p24I_l&#V~1v>~WC2@aH6&lk~VCdI!kE_UqiUj5ZIX62OoYJENAnT*Q|ENK_Ns z5{mT}TF5Ag7!M(y>db1~4@FheY9l$cba zQO(ac$+VnJz*az=fFaw4`D$+P32*=@g^@vnUT3*WTLg>xl%y(2V6d2|cLAPd$EB)1JC*uslTkeV&41(3l}Y3 zvUJ%44^}RJsOsTI9u2H`?C~d_d}?KI)zi;BySlpOx#!os@Zw7^uYKj!b+4^|eZw0Y zH*F5p)@|APX8l`lZ)*rQHoYT6nz!%RxodaJyRGlNAN@dVlVl~<-VxvPVIrAIcYdU1 zwCu-SpLBov+1}5;*k|OZPWKxFG-nJMXN+_7AU$kcq=U4V_8FJiO*TQlG=8RE(QoKc zI%M3SCyd{WG2?e*f)3Nu#w}AH$zP`@^B3|znELtrnDJeHG=JI5ou{YrKbiw0^a35F z*XR{<;G#KjiC(2+X8!@R{|GxkC+RIZMQ_uabb=jZy{sqyli5Gaa;(qn@6BJ$Pn!Do z`4QI7zBZ1tBkZuLA2s!3rhdlM&zky4Q$J;lnJ#h~8)7Heh^Y^o z`nT*H8)m1C{p=#UWDK$?cAH%>jvB|6;wz93aB(qI=8uuN*$Aqqcy+OqM4Z1pIRPGi;F3J34^>#YvI d!376pu*X7Ec31i;-IeYtSCyx9zV{As{{@O&$y@*c literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/mac_croatian.py b/PythonEnv/2.7/Lib/encodings/mac_croatian.py new file mode 100644 index 0000000000..f57f7b4b33 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/mac_croatian.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_croatian generated from 'MAPPINGS/VENDORS/APPLE/CROATIAN.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mac-croatian', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u2020' # 0xA0 -> DAGGER + u'\xb0' # 0xA1 -> DEGREE SIGN + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa7' # 0xA4 -> SECTION SIGN + u'\u2022' # 0xA5 -> BULLET + u'\xb6' # 0xA6 -> PILCROW SIGN + u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + u'\xae' # 0xA8 -> REGISTERED SIGN + u'\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON + u'\u2122' # 0xAA -> TRADE MARK SIGN + u'\xb4' # 0xAB -> ACUTE ACCENT + u'\xa8' # 0xAC -> DIAERESIS + u'\u2260' # 0xAD -> NOT EQUAL TO + u'\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON + u'\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + u'\u221e' # 0xB0 -> INFINITY + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + u'\u2206' # 0xB4 -> INCREMENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + u'\u2211' # 0xB7 -> N-ARY SUMMATION + u'\u220f' # 0xB8 -> N-ARY PRODUCT + u'\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON + u'\u222b' # 0xBA -> INTEGRAL + u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + u'\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON + u'\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + u'\xbf' # 0xC0 -> INVERTED QUESTION MARK + u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + u'\xac' # 0xC2 -> NOT SIGN + u'\u221a' # 0xC3 -> SQUARE ROOT + u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + u'\u2248' # 0xC5 -> ALMOST EQUAL TO + u'\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE + u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + u'\xa0' # 0xCA -> NO-BREAK SPACE + u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + u'\u2014' # 0xD1 -> EM DASH + u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + u'\xf7' # 0xD6 -> DIVISION SIGN + u'\u25ca' # 0xD7 -> LOZENGE + u'\uf8ff' # 0xD8 -> Apple logo + u'\xa9' # 0xD9 -> COPYRIGHT SIGN + u'\u2044' # 0xDA -> FRACTION SLASH + u'\u20ac' # 0xDB -> EURO SIGN + u'\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\xc6' # 0xDE -> LATIN CAPITAL LETTER AE + u'\xbb' # 0xDF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2013' # 0xE0 -> EN DASH + u'\xb7' # 0xE1 -> MIDDLE DOT + u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2030' # 0xE4 -> PER MILLE SIGN + u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE + u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u02dc' # 0xF7 -> SMALL TILDE + u'\xaf' # 0xF8 -> MACRON + u'\u03c0' # 0xF9 -> GREEK SMALL LETTER PI + u'\xcb' # 0xFA -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\u02da' # 0xFB -> RING ABOVE + u'\xb8' # 0xFC -> CEDILLA + u'\xca' # 0xFD -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xe6' # 0xFE -> LATIN SMALL LETTER AE + u'\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_croatian.pyc b/PythonEnv/2.7/Lib/encodings/mac_croatian.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b58c6bea2eb5c8f1338beb206954dda1de3c0b8 GIT binary patch literal 2920 zcmc&$YkLz_5I(s!4J~)jV%6Y{pwcQ{P(-Ap1*CKPU=@Rby9rj#?)DRdqd#{>K&orftCiaM{*Rg`pIrc~0VwTvkfS*uSRfG7D_ z4?5^4Pb0xe6hIEAKy$a=nMnsiow6p!bX5y9$z5HEbVneRQPfx%z0FJ`trcgdrt&MJ;!QNGuVM zs4llBRqHLXkX4g$5kex}mD7bEs-|VMY!H=9Oxd}(3N382FrL4lEtzO2kMZPRgUu?_E=!fb{SQU0EQStzw>h5SNhxrkX<2dW}LIyRiZiHXofG9==q09PXK z1dD9c1&!i~w4AgN7-#T=A%!~@bg6=jR^lWKER&O2Re)_TxS%mAhwjjh_0z}YPFWY>RjS3 zF>@(>krHol7b_yJnc$zDdOKjT8fVl*sVW>I>YMzLR9X4&{h^9pZTnM#gHjtJ`4XJ0 zyJUqUJ zXcsKO{e)d%thS-uDz<8(CbEgW3bTm=(HkRJFVZV4Th*I<5Y4eM9nXl`W}B7h3QEKk zi2#u(OLvrKo!H%>qHEZwb*+0gZnH#b<|ub~9ToWTicfAI5zpatxjo)8U%7umMdidv zlc!9bHhsp-yY8-)0q@I9P_ zQ*av2!jJF+oP!H+9WJn;U!JBL8~J9|x|P$N0uxzUd@4E_34w z^qE(=vD3WBjX`eg(M+u(E94qIU->?#bv4j6=QU{B%fXy52w^Yrfq zd^S30UV<%fcyx1+a*2GVeye0+*k7q3Sq!pyLzJ<|L)}cGa;a0NDET6-s{Z$7Z%#hVgLXD literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/mac_cyrillic.py b/PythonEnv/2.7/Lib/encodings/mac_cyrillic.py new file mode 100644 index 0000000000..63324a14b8 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/mac_cyrillic.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_cyrillic generated from 'MAPPINGS/VENDORS/APPLE/CYRILLIC.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mac-cyrillic', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\u0410' # 0x80 -> CYRILLIC CAPITAL LETTER A + u'\u0411' # 0x81 -> CYRILLIC CAPITAL LETTER BE + u'\u0412' # 0x82 -> CYRILLIC CAPITAL LETTER VE + u'\u0413' # 0x83 -> CYRILLIC CAPITAL LETTER GHE + u'\u0414' # 0x84 -> CYRILLIC CAPITAL LETTER DE + u'\u0415' # 0x85 -> CYRILLIC CAPITAL LETTER IE + u'\u0416' # 0x86 -> CYRILLIC CAPITAL LETTER ZHE + u'\u0417' # 0x87 -> CYRILLIC CAPITAL LETTER ZE + u'\u0418' # 0x88 -> CYRILLIC CAPITAL LETTER I + u'\u0419' # 0x89 -> CYRILLIC CAPITAL LETTER SHORT I + u'\u041a' # 0x8A -> CYRILLIC CAPITAL LETTER KA + u'\u041b' # 0x8B -> CYRILLIC CAPITAL LETTER EL + u'\u041c' # 0x8C -> CYRILLIC CAPITAL LETTER EM + u'\u041d' # 0x8D -> CYRILLIC CAPITAL LETTER EN + u'\u041e' # 0x8E -> CYRILLIC CAPITAL LETTER O + u'\u041f' # 0x8F -> CYRILLIC CAPITAL LETTER PE + u'\u0420' # 0x90 -> CYRILLIC CAPITAL LETTER ER + u'\u0421' # 0x91 -> CYRILLIC CAPITAL LETTER ES + u'\u0422' # 0x92 -> CYRILLIC CAPITAL LETTER TE + u'\u0423' # 0x93 -> CYRILLIC CAPITAL LETTER U + u'\u0424' # 0x94 -> CYRILLIC CAPITAL LETTER EF + u'\u0425' # 0x95 -> CYRILLIC CAPITAL LETTER HA + u'\u0426' # 0x96 -> CYRILLIC CAPITAL LETTER TSE + u'\u0427' # 0x97 -> CYRILLIC CAPITAL LETTER CHE + u'\u0428' # 0x98 -> CYRILLIC CAPITAL LETTER SHA + u'\u0429' # 0x99 -> CYRILLIC CAPITAL LETTER SHCHA + u'\u042a' # 0x9A -> CYRILLIC CAPITAL LETTER HARD SIGN + u'\u042b' # 0x9B -> CYRILLIC CAPITAL LETTER YERU + u'\u042c' # 0x9C -> CYRILLIC CAPITAL LETTER SOFT SIGN + u'\u042d' # 0x9D -> CYRILLIC CAPITAL LETTER E + u'\u042e' # 0x9E -> CYRILLIC CAPITAL LETTER YU + u'\u042f' # 0x9F -> CYRILLIC CAPITAL LETTER YA + u'\u2020' # 0xA0 -> DAGGER + u'\xb0' # 0xA1 -> DEGREE SIGN + u'\u0490' # 0xA2 -> CYRILLIC CAPITAL LETTER GHE WITH UPTURN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa7' # 0xA4 -> SECTION SIGN + u'\u2022' # 0xA5 -> BULLET + u'\xb6' # 0xA6 -> PILCROW SIGN + u'\u0406' # 0xA7 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + u'\xae' # 0xA8 -> REGISTERED SIGN + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u2122' # 0xAA -> TRADE MARK SIGN + u'\u0402' # 0xAB -> CYRILLIC CAPITAL LETTER DJE + u'\u0452' # 0xAC -> CYRILLIC SMALL LETTER DJE + u'\u2260' # 0xAD -> NOT EQUAL TO + u'\u0403' # 0xAE -> CYRILLIC CAPITAL LETTER GJE + u'\u0453' # 0xAF -> CYRILLIC SMALL LETTER GJE + u'\u221e' # 0xB0 -> INFINITY + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + u'\u0456' # 0xB4 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + u'\xb5' # 0xB5 -> MICRO SIGN + u'\u0491' # 0xB6 -> CYRILLIC SMALL LETTER GHE WITH UPTURN + u'\u0408' # 0xB7 -> CYRILLIC CAPITAL LETTER JE + u'\u0404' # 0xB8 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + u'\u0454' # 0xB9 -> CYRILLIC SMALL LETTER UKRAINIAN IE + u'\u0407' # 0xBA -> CYRILLIC CAPITAL LETTER YI + u'\u0457' # 0xBB -> CYRILLIC SMALL LETTER YI + u'\u0409' # 0xBC -> CYRILLIC CAPITAL LETTER LJE + u'\u0459' # 0xBD -> CYRILLIC SMALL LETTER LJE + u'\u040a' # 0xBE -> CYRILLIC CAPITAL LETTER NJE + u'\u045a' # 0xBF -> CYRILLIC SMALL LETTER NJE + u'\u0458' # 0xC0 -> CYRILLIC SMALL LETTER JE + u'\u0405' # 0xC1 -> CYRILLIC CAPITAL LETTER DZE + u'\xac' # 0xC2 -> NOT SIGN + u'\u221a' # 0xC3 -> SQUARE ROOT + u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + u'\u2248' # 0xC5 -> ALMOST EQUAL TO + u'\u2206' # 0xC6 -> INCREMENT + u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + u'\xa0' # 0xCA -> NO-BREAK SPACE + u'\u040b' # 0xCB -> CYRILLIC CAPITAL LETTER TSHE + u'\u045b' # 0xCC -> CYRILLIC SMALL LETTER TSHE + u'\u040c' # 0xCD -> CYRILLIC CAPITAL LETTER KJE + u'\u045c' # 0xCE -> CYRILLIC SMALL LETTER KJE + u'\u0455' # 0xCF -> CYRILLIC SMALL LETTER DZE + u'\u2013' # 0xD0 -> EN DASH + u'\u2014' # 0xD1 -> EM DASH + u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + u'\xf7' # 0xD6 -> DIVISION SIGN + u'\u201e' # 0xD7 -> DOUBLE LOW-9 QUOTATION MARK + u'\u040e' # 0xD8 -> CYRILLIC CAPITAL LETTER SHORT U + u'\u045e' # 0xD9 -> CYRILLIC SMALL LETTER SHORT U + u'\u040f' # 0xDA -> CYRILLIC CAPITAL LETTER DZHE + u'\u045f' # 0xDB -> CYRILLIC SMALL LETTER DZHE + u'\u2116' # 0xDC -> NUMERO SIGN + u'\u0401' # 0xDD -> CYRILLIC CAPITAL LETTER IO + u'\u0451' # 0xDE -> CYRILLIC SMALL LETTER IO + u'\u044f' # 0xDF -> CYRILLIC SMALL LETTER YA + u'\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A + u'\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE + u'\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE + u'\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE + u'\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE + u'\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE + u'\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE + u'\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE + u'\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I + u'\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I + u'\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA + u'\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL + u'\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM + u'\u043d' # 0xED -> CYRILLIC SMALL LETTER EN + u'\u043e' # 0xEE -> CYRILLIC SMALL LETTER O + u'\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE + u'\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER + u'\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES + u'\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE + u'\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U + u'\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF + u'\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA + u'\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE + u'\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE + u'\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA + u'\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA + u'\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN + u'\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU + u'\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN + u'\u044d' # 0xFD -> CYRILLIC SMALL LETTER E + u'\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU + u'\u20ac' # 0xFF -> EURO SIGN +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_cyrillic.pyc b/PythonEnv/2.7/Lib/encodings/mac_cyrillic.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa1474313f03f50ec6a5b38b97a56974b9e5f89e GIT binary patch literal 2910 zcmc&$dv_C65Wjgg4J~ibV%6ZQL8VoEpoj>Bg4H(E4f3efxZT~fi+R+|My#R+8lVN_ zS)k=nYI%tuf(oekI47Rt-*fp0`xX2EICGa|3;IvNqnqB_duOtDW`6U#Gx7Xc9V~3m zwJ7Z7TB z$fl--5=JH!s%u%&+S(Ld5o=i87+tnfiZ$TAxv?R#PHJjyZi>{eTDz()v_Ut!=uL&r ztMBfq4+ixc_(V+~+80*J*t$`&lw1qpq+tw*p@6r5t|J1tb~9Rgm=p_BCQLtl-86K? zRA^7biz7nfX*ijTt#`4F_~&M(oAr7ydKb#0&g;UntT_>-3c`?*yW_UILL`<5NZgb= zlA8S%S;%V1ga|=Tcjrvuhh`WVBO68~6H|5$t|ANCZH(v5Z%^tS?WOaw?PIY;VC*9V zP7~;S0)x5kBr1tsy(J!m9^n@vvAi`Ni83J(l2QducNKtbiLksGK$yTX131OwX*s3E z<7QB7QW-Uu#H~a+i9&V^i`Dqxlkfmmi6ct}{q8D{ITaU8X~ob|TH2J8jRIRkL8*Ak zY@3c-n{9aCROT>@i1POY%tEO{E94h4%R|hADE>=WbGr>P6^-jQIHO{DsQZ+b4)VKH}X|np?`$HAI*72td2cKzo}63X@YK`uo_Y4U=jXrh;)0hJzP#v_ z#Y>h(mNhP4@oLj+uQ#_uSGK+(#a6w!dd=E(ZEv-|{Z9N{xkFL4L}!=2{=H->o#}qx z$eOtiHhkFg(Z?G<`Sdf`1AAc~?1uq300-d^48jl`h9htkj=?Y-hY|P!M&SgUgi~-D z&cK&&7QTXWa2~#f3-FDVA1PkEzNdJic*e?)7O%k8;)UW_t1t?i`97?t8ch? z$?898^`GJgif@tT!CT^xZO z{0QviNBIFOzu(FaSoxz?{+N{?wDLp0U$yeXu!|4FZhqV<9E44LFW(Ip;Szic-@*5A z8Lq%p_yK-|pWqt&48Opy@EgzbO?)%&R}QUNt60R>1R(zPEV?KheGKXPK~c@h;F~o?(d5{cu+Z!qs)Sxm}i literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/mac_farsi.py b/PythonEnv/2.7/Lib/encodings/mac_farsi.py new file mode 100644 index 0000000000..9dbd76a232 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/mac_farsi.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_farsi generated from 'MAPPINGS/VENDORS/APPLE/FARSI.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mac-farsi', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE, left-right + u'!' # 0x21 -> EXCLAMATION MARK, left-right + u'"' # 0x22 -> QUOTATION MARK, left-right + u'#' # 0x23 -> NUMBER SIGN, left-right + u'$' # 0x24 -> DOLLAR SIGN, left-right + u'%' # 0x25 -> PERCENT SIGN, left-right + u'&' # 0x26 -> AMPERSAND, left-right + u"'" # 0x27 -> APOSTROPHE, left-right + u'(' # 0x28 -> LEFT PARENTHESIS, left-right + u')' # 0x29 -> RIGHT PARENTHESIS, left-right + u'*' # 0x2A -> ASTERISK, left-right + u'+' # 0x2B -> PLUS SIGN, left-right + u',' # 0x2C -> COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR + u'-' # 0x2D -> HYPHEN-MINUS, left-right + u'.' # 0x2E -> FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR + u'/' # 0x2F -> SOLIDUS, left-right + u'0' # 0x30 -> DIGIT ZERO; in Arabic-script context, displayed as 0x06F0 EXTENDED ARABIC-INDIC DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE; in Arabic-script context, displayed as 0x06F1 EXTENDED ARABIC-INDIC DIGIT ONE + u'2' # 0x32 -> DIGIT TWO; in Arabic-script context, displayed as 0x06F2 EXTENDED ARABIC-INDIC DIGIT TWO + u'3' # 0x33 -> DIGIT THREE; in Arabic-script context, displayed as 0x06F3 EXTENDED ARABIC-INDIC DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR; in Arabic-script context, displayed as 0x06F4 EXTENDED ARABIC-INDIC DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE; in Arabic-script context, displayed as 0x06F5 EXTENDED ARABIC-INDIC DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX; in Arabic-script context, displayed as 0x06F6 EXTENDED ARABIC-INDIC DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN; in Arabic-script context, displayed as 0x06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT; in Arabic-script context, displayed as 0x06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE; in Arabic-script context, displayed as 0x06F9 EXTENDED ARABIC-INDIC DIGIT NINE + u':' # 0x3A -> COLON, left-right + u';' # 0x3B -> SEMICOLON, left-right + u'<' # 0x3C -> LESS-THAN SIGN, left-right + u'=' # 0x3D -> EQUALS SIGN, left-right + u'>' # 0x3E -> GREATER-THAN SIGN, left-right + u'?' # 0x3F -> QUESTION MARK, left-right + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET, left-right + u'\\' # 0x5C -> REVERSE SOLIDUS, left-right + u']' # 0x5D -> RIGHT SQUARE BRACKET, left-right + u'^' # 0x5E -> CIRCUMFLEX ACCENT, left-right + u'_' # 0x5F -> LOW LINE, left-right + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET, left-right + u'|' # 0x7C -> VERTICAL LINE, left-right + u'}' # 0x7D -> RIGHT CURLY BRACKET, left-right + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xa0' # 0x81 -> NO-BREAK SPACE, right-left + u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u06ba' # 0x8B -> ARABIC LETTER NOON GHUNNA + u'\xab' # 0x8C -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + u'\u2026' # 0x93 -> HORIZONTAL ELLIPSIS, right-left + u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + u'\xbb' # 0x98 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0x9B -> DIVISION SIGN, right-left + u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + u' ' # 0xA0 -> SPACE, right-left + u'!' # 0xA1 -> EXCLAMATION MARK, right-left + u'"' # 0xA2 -> QUOTATION MARK, right-left + u'#' # 0xA3 -> NUMBER SIGN, right-left + u'$' # 0xA4 -> DOLLAR SIGN, right-left + u'\u066a' # 0xA5 -> ARABIC PERCENT SIGN + u'&' # 0xA6 -> AMPERSAND, right-left + u"'" # 0xA7 -> APOSTROPHE, right-left + u'(' # 0xA8 -> LEFT PARENTHESIS, right-left + u')' # 0xA9 -> RIGHT PARENTHESIS, right-left + u'*' # 0xAA -> ASTERISK, right-left + u'+' # 0xAB -> PLUS SIGN, right-left + u'\u060c' # 0xAC -> ARABIC COMMA + u'-' # 0xAD -> HYPHEN-MINUS, right-left + u'.' # 0xAE -> FULL STOP, right-left + u'/' # 0xAF -> SOLIDUS, right-left + u'\u06f0' # 0xB0 -> EXTENDED ARABIC-INDIC DIGIT ZERO, right-left (need override) + u'\u06f1' # 0xB1 -> EXTENDED ARABIC-INDIC DIGIT ONE, right-left (need override) + u'\u06f2' # 0xB2 -> EXTENDED ARABIC-INDIC DIGIT TWO, right-left (need override) + u'\u06f3' # 0xB3 -> EXTENDED ARABIC-INDIC DIGIT THREE, right-left (need override) + u'\u06f4' # 0xB4 -> EXTENDED ARABIC-INDIC DIGIT FOUR, right-left (need override) + u'\u06f5' # 0xB5 -> EXTENDED ARABIC-INDIC DIGIT FIVE, right-left (need override) + u'\u06f6' # 0xB6 -> EXTENDED ARABIC-INDIC DIGIT SIX, right-left (need override) + u'\u06f7' # 0xB7 -> EXTENDED ARABIC-INDIC DIGIT SEVEN, right-left (need override) + u'\u06f8' # 0xB8 -> EXTENDED ARABIC-INDIC DIGIT EIGHT, right-left (need override) + u'\u06f9' # 0xB9 -> EXTENDED ARABIC-INDIC DIGIT NINE, right-left (need override) + u':' # 0xBA -> COLON, right-left + u'\u061b' # 0xBB -> ARABIC SEMICOLON + u'<' # 0xBC -> LESS-THAN SIGN, right-left + u'=' # 0xBD -> EQUALS SIGN, right-left + u'>' # 0xBE -> GREATER-THAN SIGN, right-left + u'\u061f' # 0xBF -> ARABIC QUESTION MARK + u'\u274a' # 0xC0 -> EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left + u'\u0621' # 0xC1 -> ARABIC LETTER HAMZA + u'\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + u'\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + u'\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + u'\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + u'\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + u'\u0627' # 0xC7 -> ARABIC LETTER ALEF + u'\u0628' # 0xC8 -> ARABIC LETTER BEH + u'\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA + u'\u062a' # 0xCA -> ARABIC LETTER TEH + u'\u062b' # 0xCB -> ARABIC LETTER THEH + u'\u062c' # 0xCC -> ARABIC LETTER JEEM + u'\u062d' # 0xCD -> ARABIC LETTER HAH + u'\u062e' # 0xCE -> ARABIC LETTER KHAH + u'\u062f' # 0xCF -> ARABIC LETTER DAL + u'\u0630' # 0xD0 -> ARABIC LETTER THAL + u'\u0631' # 0xD1 -> ARABIC LETTER REH + u'\u0632' # 0xD2 -> ARABIC LETTER ZAIN + u'\u0633' # 0xD3 -> ARABIC LETTER SEEN + u'\u0634' # 0xD4 -> ARABIC LETTER SHEEN + u'\u0635' # 0xD5 -> ARABIC LETTER SAD + u'\u0636' # 0xD6 -> ARABIC LETTER DAD + u'\u0637' # 0xD7 -> ARABIC LETTER TAH + u'\u0638' # 0xD8 -> ARABIC LETTER ZAH + u'\u0639' # 0xD9 -> ARABIC LETTER AIN + u'\u063a' # 0xDA -> ARABIC LETTER GHAIN + u'[' # 0xDB -> LEFT SQUARE BRACKET, right-left + u'\\' # 0xDC -> REVERSE SOLIDUS, right-left + u']' # 0xDD -> RIGHT SQUARE BRACKET, right-left + u'^' # 0xDE -> CIRCUMFLEX ACCENT, right-left + u'_' # 0xDF -> LOW LINE, right-left + u'\u0640' # 0xE0 -> ARABIC TATWEEL + u'\u0641' # 0xE1 -> ARABIC LETTER FEH + u'\u0642' # 0xE2 -> ARABIC LETTER QAF + u'\u0643' # 0xE3 -> ARABIC LETTER KAF + u'\u0644' # 0xE4 -> ARABIC LETTER LAM + u'\u0645' # 0xE5 -> ARABIC LETTER MEEM + u'\u0646' # 0xE6 -> ARABIC LETTER NOON + u'\u0647' # 0xE7 -> ARABIC LETTER HEH + u'\u0648' # 0xE8 -> ARABIC LETTER WAW + u'\u0649' # 0xE9 -> ARABIC LETTER ALEF MAKSURA + u'\u064a' # 0xEA -> ARABIC LETTER YEH + u'\u064b' # 0xEB -> ARABIC FATHATAN + u'\u064c' # 0xEC -> ARABIC DAMMATAN + u'\u064d' # 0xED -> ARABIC KASRATAN + u'\u064e' # 0xEE -> ARABIC FATHA + u'\u064f' # 0xEF -> ARABIC DAMMA + u'\u0650' # 0xF0 -> ARABIC KASRA + u'\u0651' # 0xF1 -> ARABIC SHADDA + u'\u0652' # 0xF2 -> ARABIC SUKUN + u'\u067e' # 0xF3 -> ARABIC LETTER PEH + u'\u0679' # 0xF4 -> ARABIC LETTER TTEH + u'\u0686' # 0xF5 -> ARABIC LETTER TCHEH + u'\u06d5' # 0xF6 -> ARABIC LETTER AE + u'\u06a4' # 0xF7 -> ARABIC LETTER VEH + u'\u06af' # 0xF8 -> ARABIC LETTER GAF + u'\u0688' # 0xF9 -> ARABIC LETTER DDAL + u'\u0691' # 0xFA -> ARABIC LETTER RREH + u'{' # 0xFB -> LEFT CURLY BRACKET, right-left + u'|' # 0xFC -> VERTICAL LINE, right-left + u'}' # 0xFD -> RIGHT CURLY BRACKET, right-left + u'\u0698' # 0xFE -> ARABIC LETTER JEH + u'\u06d2' # 0xFF -> ARABIC LETTER YEH BARREE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_farsi.pyc b/PythonEnv/2.7/Lib/encodings/mac_farsi.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a8dbf686493ff5f1f5d0a51da11000cdf228219 GIT binary patch literal 2824 zcmc&$=~o+76n|L>Ve77`sHsbdOF`>W#ae*?6)h=FuuDYakeR?>HfJUxTD1yx!Mf0M z^mvYXY%6vFTS}o&sK*byf8tH@t^b05K)v@(lL7Qg@Eo1+9`D_odH3Gm{k?nR__NA8 zGMep-kvoqA{x`wU=3$ZuiNI_llAR=MBmxTuk!@taPU5h3k`Y3N2{|0G6UoID4z6$) z6%HbmafOpBJVk|*NaaMfbDfLC;Q((@=OR)?LFeYW%A(Fqq$=D*%7|1=A|8GKoa7h4F_s4fHX}0t|7fYo$?3!MOBRHvg+>?GZ`h-=MSbOIp$A_v1nXWHO1d2r({*s zWyv2`(@B3_XLDCqM`&-j;Xqrcb-xg9fc?I|ssJqTTsObIpS`1IB&kWUj zy~=HPLb?kq^Ye?S+CkESPWfSy!FxcD13LmvL+r4&6I?rp5Ds7tbT@uoSCyC^!#xfs zj3A0P!lV;2U?WH1&rWnZ8FoP2Hjsy`*STk!UJcS10FV?jQPW*6;!A)cs*Ak|*?bEv zXmTRXLr_wgtj_(ARW+?@0Zj`snCN%z1Mji$t;9F6K;zDcH~ zYy!3d>I96}vdUK_04KoPq#TBZ*4*|=hrR(89jTZqC*_nbCfYcvY7C_ODUxgxY)z8E z1(S$HEab=Eq2CHpi%mc)Ad~|M1sC5J4&bpN1t!Ad=4lX+jvQ72z2oGu@aF7^D=9Hy zg2BLh;A;J08}w?VO^EQ5Yx5d&9R}wCx zv#^HN>B3texv@(?f7PKEdaxi3ld^CCsT0!iT4HU|a0>-_2XAv$Vd7+0tYTs|26eUA ztbHm^B6K52A`HN7nP8A-m76t7G+N~CuOk&t^D<_c74XgpND%?i5HLS$Pp^)2?vueU z=)<}?v<<*{PUFIqGR#aA1*Q{H=VdJLFTkg8sxAmUd zd+)p7zwLnsA9{FuUEq;NAA5X9eZvz^?tJR$XP({l-1Chu?0#|2OHIu!!Pd6+y)SpX z^6I|M(EhI1gmCxk2M!)O9C@SX&9|a&i@h;Pj`#H|1Meh~sdVODRnxQY4Zc70!G}ja z`uGz%vUG+Xrzhzc{f_=f&(bsW939UsE=|%4^b);DC+H--eCz0WdWBBWX*#oXlg`pP zI!_nr0=-Fp=MEYZribhlxR}41pUz*)&*W$G*Yk7v`TULiLL>VDyk$S%`e~G%W#`y0 zY@Ged&a(^bBD=&U*d+UnU1nF<6uZi%*)=x9X4!Q%$L84$w!jv7D8^CaQ{yvZ*cdTB zH;x&{jT6R6W7PP45G|^pFbVItN CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xb9' # 0x81 -> SUPERSCRIPT ONE + u'\xb2' # 0x82 -> SUPERSCRIPT TWO + u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xb3' # 0x84 -> SUPERSCRIPT THREE + u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u0385' # 0x87 -> GREEK DIALYTIKA TONOS + u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u0384' # 0x8B -> GREEK TONOS + u'\xa8' # 0x8C -> DIAERESIS + u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xa3' # 0x92 -> POUND SIGN + u'\u2122' # 0x93 -> TRADE MARK SIGN + u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\u2022' # 0x96 -> BULLET + u'\xbd' # 0x97 -> VULGAR FRACTION ONE HALF + u'\u2030' # 0x98 -> PER MILLE SIGN + u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xa6' # 0x9B -> BROKEN BAR + u'\u20ac' # 0x9C -> EURO SIGN # before Mac OS 9.2.2, was SOFT HYPHEN + u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u2020' # 0xA0 -> DAGGER + u'\u0393' # 0xA1 -> GREEK CAPITAL LETTER GAMMA + u'\u0394' # 0xA2 -> GREEK CAPITAL LETTER DELTA + u'\u0398' # 0xA3 -> GREEK CAPITAL LETTER THETA + u'\u039b' # 0xA4 -> GREEK CAPITAL LETTER LAMDA + u'\u039e' # 0xA5 -> GREEK CAPITAL LETTER XI + u'\u03a0' # 0xA6 -> GREEK CAPITAL LETTER PI + u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + u'\xae' # 0xA8 -> REGISTERED SIGN + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u03a3' # 0xAA -> GREEK CAPITAL LETTER SIGMA + u'\u03aa' # 0xAB -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + u'\xa7' # 0xAC -> SECTION SIGN + u'\u2260' # 0xAD -> NOT EQUAL TO + u'\xb0' # 0xAE -> DEGREE SIGN + u'\xb7' # 0xAF -> MIDDLE DOT + u'\u0391' # 0xB0 -> GREEK CAPITAL LETTER ALPHA + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + u'\xa5' # 0xB4 -> YEN SIGN + u'\u0392' # 0xB5 -> GREEK CAPITAL LETTER BETA + u'\u0395' # 0xB6 -> GREEK CAPITAL LETTER EPSILON + u'\u0396' # 0xB7 -> GREEK CAPITAL LETTER ZETA + u'\u0397' # 0xB8 -> GREEK CAPITAL LETTER ETA + u'\u0399' # 0xB9 -> GREEK CAPITAL LETTER IOTA + u'\u039a' # 0xBA -> GREEK CAPITAL LETTER KAPPA + u'\u039c' # 0xBB -> GREEK CAPITAL LETTER MU + u'\u03a6' # 0xBC -> GREEK CAPITAL LETTER PHI + u'\u03ab' # 0xBD -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + u'\u03a8' # 0xBE -> GREEK CAPITAL LETTER PSI + u'\u03a9' # 0xBF -> GREEK CAPITAL LETTER OMEGA + u'\u03ac' # 0xC0 -> GREEK SMALL LETTER ALPHA WITH TONOS + u'\u039d' # 0xC1 -> GREEK CAPITAL LETTER NU + u'\xac' # 0xC2 -> NOT SIGN + u'\u039f' # 0xC3 -> GREEK CAPITAL LETTER OMICRON + u'\u03a1' # 0xC4 -> GREEK CAPITAL LETTER RHO + u'\u2248' # 0xC5 -> ALMOST EQUAL TO + u'\u03a4' # 0xC6 -> GREEK CAPITAL LETTER TAU + u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + u'\xa0' # 0xCA -> NO-BREAK SPACE + u'\u03a5' # 0xCB -> GREEK CAPITAL LETTER UPSILON + u'\u03a7' # 0xCC -> GREEK CAPITAL LETTER CHI + u'\u0386' # 0xCD -> GREEK CAPITAL LETTER ALPHA WITH TONOS + u'\u0388' # 0xCE -> GREEK CAPITAL LETTER EPSILON WITH TONOS + u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + u'\u2013' # 0xD0 -> EN DASH + u'\u2015' # 0xD1 -> HORIZONTAL BAR + u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + u'\xf7' # 0xD6 -> DIVISION SIGN + u'\u0389' # 0xD7 -> GREEK CAPITAL LETTER ETA WITH TONOS + u'\u038a' # 0xD8 -> GREEK CAPITAL LETTER IOTA WITH TONOS + u'\u038c' # 0xD9 -> GREEK CAPITAL LETTER OMICRON WITH TONOS + u'\u038e' # 0xDA -> GREEK CAPITAL LETTER UPSILON WITH TONOS + u'\u03ad' # 0xDB -> GREEK SMALL LETTER EPSILON WITH TONOS + u'\u03ae' # 0xDC -> GREEK SMALL LETTER ETA WITH TONOS + u'\u03af' # 0xDD -> GREEK SMALL LETTER IOTA WITH TONOS + u'\u03cc' # 0xDE -> GREEK SMALL LETTER OMICRON WITH TONOS + u'\u038f' # 0xDF -> GREEK CAPITAL LETTER OMEGA WITH TONOS + u'\u03cd' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH TONOS + u'\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA + u'\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA + u'\u03c8' # 0xE3 -> GREEK SMALL LETTER PSI + u'\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA + u'\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON + u'\u03c6' # 0xE6 -> GREEK SMALL LETTER PHI + u'\u03b3' # 0xE7 -> GREEK SMALL LETTER GAMMA + u'\u03b7' # 0xE8 -> GREEK SMALL LETTER ETA + u'\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA + u'\u03be' # 0xEA -> GREEK SMALL LETTER XI + u'\u03ba' # 0xEB -> GREEK SMALL LETTER KAPPA + u'\u03bb' # 0xEC -> GREEK SMALL LETTER LAMDA + u'\u03bc' # 0xED -> GREEK SMALL LETTER MU + u'\u03bd' # 0xEE -> GREEK SMALL LETTER NU + u'\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON + u'\u03c0' # 0xF0 -> GREEK SMALL LETTER PI + u'\u03ce' # 0xF1 -> GREEK SMALL LETTER OMEGA WITH TONOS + u'\u03c1' # 0xF2 -> GREEK SMALL LETTER RHO + u'\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA + u'\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU + u'\u03b8' # 0xF5 -> GREEK SMALL LETTER THETA + u'\u03c9' # 0xF6 -> GREEK SMALL LETTER OMEGA + u'\u03c2' # 0xF7 -> GREEK SMALL LETTER FINAL SIGMA + u'\u03c7' # 0xF8 -> GREEK SMALL LETTER CHI + u'\u03c5' # 0xF9 -> GREEK SMALL LETTER UPSILON + u'\u03b6' # 0xFA -> GREEK SMALL LETTER ZETA + u'\u03ca' # 0xFB -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + u'\u03cb' # 0xFC -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + u'\u0390' # 0xFD -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + u'\u03b0' # 0xFE -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + u'\xad' # 0xFF -> SOFT HYPHEN # before Mac OS 9.2.2, was undefined +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_greek.pyc b/PythonEnv/2.7/Lib/encodings/mac_greek.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41749d16b88c1961dc40b5d13d2aa5677973cfa5 GIT binary patch literal 2864 zcmc&$dv_C65Wjgg4J~ibV%6Y-#s{t914TsWgIb}XZjeW<#%*@f2J)zzt+k30X~3o; zq6mT(simbY@0V08=sCN`e`mkLeg!`O&fKNhQvIj(9NpyJ-aC`MGxM9@ovG{3Qh%!JUPBMCr=y70k=rqQTYbT?%iwWT%6$i}>>1U<68oKrjkLIL+RB%M77-*ZUyBr224*L{ef>jzm;H z-z3vgX9BkZ=>&?`w#rvC08YTSSuu_bS@SweTr?C@t2IiW|fPK8@2A&aFr@zXboiHyu)woS|!VM^(ONjqN0bbM<$z5XA3De)G* z#H?xf3RK_hxMu<_adIh+e}-0=kE(ymTS9cnqzOco5*Jn#SxjzM;#h(Ud?hwk(+?@% z7GJUW;hJ&I*%`M(<*S**OEfCO!Q;Kh89^4M|JWHS+vT=11t2J$H6&k;lXVlVo{Qa< zN;_Ujyo~P2HMUL<-2%x=T>|^7ioMWB1*wM>g@Z($kV@B*YEy=`SddrpHfI+mPWHH6 zOsvMBOcz_VPvJ?#ZiGq1fw)Z(bn&cmvsQ^Fi@g0cq+)4a#%!|!-8q3MA`lt^9Bsbb*sl-hgZdEUv{8LTAJa$mv-&yhw3!>!FY1@f z?4Wkr%wE>7>o>GB=Dzd#O?^VYWo8H92z(32;RpB;2J}1x64Bx;}I0oOr3HToR;S8LEQ5b{sa8f%Dr{E_u-wQ+9Ic>tsp3w$i7)Ia# z^!{`zJSAUS-TLV>>+oljY{b#woPg^ z7GZ3f5JN1kP@fX09IDg?CjX;p?TjZRs|%rY3Ylh5CU`GjYjy8+E<7beEfjmMyUbVS QE_0W=%00#Nymy%UFX0fjPyhe` literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/mac_iceland.py b/PythonEnv/2.7/Lib/encodings/mac_iceland.py new file mode 100644 index 0000000000..c24add2ad0 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/mac_iceland.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_iceland generated from 'MAPPINGS/VENDORS/APPLE/ICELAND.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mac-iceland', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xdd' # 0xA0 -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xb0' # 0xA1 -> DEGREE SIGN + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa7' # 0xA4 -> SECTION SIGN + u'\u2022' # 0xA5 -> BULLET + u'\xb6' # 0xA6 -> PILCROW SIGN + u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + u'\xae' # 0xA8 -> REGISTERED SIGN + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u2122' # 0xAA -> TRADE MARK SIGN + u'\xb4' # 0xAB -> ACUTE ACCENT + u'\xa8' # 0xAC -> DIAERESIS + u'\u2260' # 0xAD -> NOT EQUAL TO + u'\xc6' # 0xAE -> LATIN CAPITAL LETTER AE + u'\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + u'\u221e' # 0xB0 -> INFINITY + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + u'\xa5' # 0xB4 -> YEN SIGN + u'\xb5' # 0xB5 -> MICRO SIGN + u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + u'\u2211' # 0xB7 -> N-ARY SUMMATION + u'\u220f' # 0xB8 -> N-ARY PRODUCT + u'\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + u'\u222b' # 0xBA -> INTEGRAL + u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + u'\xe6' # 0xBE -> LATIN SMALL LETTER AE + u'\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + u'\xbf' # 0xC0 -> INVERTED QUESTION MARK + u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + u'\xac' # 0xC2 -> NOT SIGN + u'\u221a' # 0xC3 -> SQUARE ROOT + u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + u'\u2248' # 0xC5 -> ALMOST EQUAL TO + u'\u2206' # 0xC6 -> INCREMENT + u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + u'\xa0' # 0xCA -> NO-BREAK SPACE + u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + u'\u2013' # 0xD0 -> EN DASH + u'\u2014' # 0xD1 -> EM DASH + u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + u'\xf7' # 0xD6 -> DIVISION SIGN + u'\u25ca' # 0xD7 -> LOZENGE + u'\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\u2044' # 0xDA -> FRACTION SLASH + u'\u20ac' # 0xDB -> EURO SIGN + u'\xd0' # 0xDC -> LATIN CAPITAL LETTER ETH + u'\xf0' # 0xDD -> LATIN SMALL LETTER ETH + u'\xde' # 0xDE -> LATIN CAPITAL LETTER THORN + u'\xfe' # 0xDF -> LATIN SMALL LETTER THORN + u'\xfd' # 0xE0 -> LATIN SMALL LETTER Y WITH ACUTE + u'\xb7' # 0xE1 -> MIDDLE DOT + u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2030' # 0xE4 -> PER MILLE SIGN + u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\uf8ff' # 0xF0 -> Apple logo + u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u02dc' # 0xF7 -> SMALL TILDE + u'\xaf' # 0xF8 -> MACRON + u'\u02d8' # 0xF9 -> BREVE + u'\u02d9' # 0xFA -> DOT ABOVE + u'\u02da' # 0xFB -> RING ABOVE + u'\xb8' # 0xFC -> CEDILLA + u'\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + u'\u02db' # 0xFE -> OGONEK + u'\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_iceland.pyc b/PythonEnv/2.7/Lib/encodings/mac_iceland.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38ae988bd46c2604a06ab7c9ff94d3748d0ec021 GIT binary patch literal 2903 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 CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u2020' # 0xA0 -> DAGGER + u'\xb0' # 0xA1 -> DEGREE SIGN + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa7' # 0xA4 -> SECTION SIGN + u'\u2022' # 0xA5 -> BULLET + u'\xb6' # 0xA6 -> PILCROW SIGN + u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + u'\xae' # 0xA8 -> REGISTERED SIGN + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u2122' # 0xAA -> TRADE MARK SIGN + u'\xb4' # 0xAB -> ACUTE ACCENT + u'\xa8' # 0xAC -> DIAERESIS + u'\u2260' # 0xAD -> NOT EQUAL TO + u'\xc6' # 0xAE -> LATIN CAPITAL LETTER AE + u'\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + u'\u221e' # 0xB0 -> INFINITY + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + u'\xa5' # 0xB4 -> YEN SIGN + u'\xb5' # 0xB5 -> MICRO SIGN + u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + u'\u2211' # 0xB7 -> N-ARY SUMMATION + u'\u220f' # 0xB8 -> N-ARY PRODUCT + u'\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + u'\u222b' # 0xBA -> INTEGRAL + u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + u'\xe6' # 0xBE -> LATIN SMALL LETTER AE + u'\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + u'\xbf' # 0xC0 -> INVERTED QUESTION MARK + u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + u'\xac' # 0xC2 -> NOT SIGN + u'\u221a' # 0xC3 -> SQUARE ROOT + u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + u'\u2248' # 0xC5 -> ALMOST EQUAL TO + u'\u2206' # 0xC6 -> INCREMENT + u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + u'\xa0' # 0xCA -> NO-BREAK SPACE + u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + u'\u2013' # 0xD0 -> EN DASH + u'\u2014' # 0xD1 -> EM DASH + u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + u'\xf7' # 0xD6 -> DIVISION SIGN + u'\u25ca' # 0xD7 -> LOZENGE + u'\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\u2044' # 0xDA -> FRACTION SLASH + u'\u20ac' # 0xDB -> EURO SIGN + u'\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\ufb01' # 0xDE -> LATIN SMALL LIGATURE FI + u'\ufb02' # 0xDF -> LATIN SMALL LIGATURE FL + u'\u2021' # 0xE0 -> DOUBLE DAGGER + u'\xb7' # 0xE1 -> MIDDLE DOT + u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2030' # 0xE4 -> PER MILLE SIGN + u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\uf8ff' # 0xF0 -> Apple logo + u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u02dc' # 0xF7 -> SMALL TILDE + u'\xaf' # 0xF8 -> MACRON + u'\u02d8' # 0xF9 -> BREVE + u'\u02d9' # 0xFA -> DOT ABOVE + u'\u02da' # 0xFB -> RING ABOVE + u'\xb8' # 0xFC -> CEDILLA + u'\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + u'\u02db' # 0xFE -> OGONEK + u'\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_roman.pyc b/PythonEnv/2.7/Lib/encodings/mac_roman.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec1651939d1ff12ce3ceaf87232831128ee7a445 GIT binary patch literal 2881 zcmc&$>sM4&6hHH17(sj&Mm6@(=^>OoEHhIPjgo=xkPo7!%iKFKG!MFSi73mvuXpDT0K`hu-hcjg?<*?aEUd;j+D?2YTs zVt;Rcdrg$xdR+K-Eso3tP6}fUI6Ii)WC;grz=eyc4%X^qFss(D~wzhbxIZ&Ba)My|nM zYD(2)T~z`x6a<#ltgEZ54s8loY^e%usFlJMxZhk=A=TEb3zgSzt6vuAi0du%T9i&I zZ|f}g`{Ot93F#iREY8oP>O{$Uaw>q6iryo70@z-38e_+`lhNA6q;QaOpnK`(x)zV> zQQFgRt}0hGTIjA=*_enoHBO(GY0RUFs95g{ zkY>^0gamWkOGpyEdPgvbJ7OR7^MQ7?%jLK454_-`yj!j`*4axQgTv_ zM0CH{B-2WJ0=E+BB#PIzDpoT9PQtfYA&v}L^E!)M`aE1zr=psgR8zW~s1m4ZQIv`& zPqGELwMd2+Okp;$h#!B4elbdIHX*H$P%a`AUi{KXc^jwLwHS7PIO z`XS}p;wu(ETrQ~pi zwszh6$_-T;H@#l{#+#dKLbY{oN#Xjpw`|?Ez2Tk4ci)S=FE>RMHP+k`Z~Y*VOr_gC z)G~VeM;#w`e)8##&pzJ?z3>I>hCbK}-@zaZ!w`(XaX1Di;1ryJ({L6>;YS#Qb8sHU z;b-^>F2ZHF1e0(TuE8(d7&0%IBjz#l6gNi9%kYDF&OF0=N6d@nY2G&kyWk+t9yP~# z-*Mh|!aQMK;@NJV-OICk{xEoU)I4iW{(c5d!WDDM95%;zcHp;tyf4eMyUbDZ8aGaw zLtsD;e0zQ0_5Iwy?*VQMa^na$4szoVOz`jfVe0x7-qp*y$GCBo8@IB?_G6zqcmI1Gn=9nbB`4Vve32XlvV1Ll?7 zk=)_j?jWTT$xMA!Nk_4dQtz=CWb=k7W08j%mqhhZr@k=#FHTc?JfT=^38lBOYX)^g jH22k3J743%Q!><3u?f3NeWmVFcbTiqQ&{4?$=rVda;U#c literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/mac_romanian.py b/PythonEnv/2.7/Lib/encodings/mac_romanian.py new file mode 100644 index 0000000000..5bd5ae8625 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/mac_romanian.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_romanian generated from 'MAPPINGS/VENDORS/APPLE/ROMANIAN.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mac-romanian', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u2020' # 0xA0 -> DAGGER + u'\xb0' # 0xA1 -> DEGREE SIGN + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa7' # 0xA4 -> SECTION SIGN + u'\u2022' # 0xA5 -> BULLET + u'\xb6' # 0xA6 -> PILCROW SIGN + u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + u'\xae' # 0xA8 -> REGISTERED SIGN + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u2122' # 0xAA -> TRADE MARK SIGN + u'\xb4' # 0xAB -> ACUTE ACCENT + u'\xa8' # 0xAC -> DIAERESIS + u'\u2260' # 0xAD -> NOT EQUAL TO + u'\u0102' # 0xAE -> LATIN CAPITAL LETTER A WITH BREVE + u'\u0218' # 0xAF -> LATIN CAPITAL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later + u'\u221e' # 0xB0 -> INFINITY + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + u'\xa5' # 0xB4 -> YEN SIGN + u'\xb5' # 0xB5 -> MICRO SIGN + u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + u'\u2211' # 0xB7 -> N-ARY SUMMATION + u'\u220f' # 0xB8 -> N-ARY PRODUCT + u'\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + u'\u222b' # 0xBA -> INTEGRAL + u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + u'\u0103' # 0xBE -> LATIN SMALL LETTER A WITH BREVE + u'\u0219' # 0xBF -> LATIN SMALL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later + u'\xbf' # 0xC0 -> INVERTED QUESTION MARK + u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + u'\xac' # 0xC2 -> NOT SIGN + u'\u221a' # 0xC3 -> SQUARE ROOT + u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + u'\u2248' # 0xC5 -> ALMOST EQUAL TO + u'\u2206' # 0xC6 -> INCREMENT + u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + u'\xa0' # 0xCA -> NO-BREAK SPACE + u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + u'\u2013' # 0xD0 -> EN DASH + u'\u2014' # 0xD1 -> EM DASH + u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + u'\xf7' # 0xD6 -> DIVISION SIGN + u'\u25ca' # 0xD7 -> LOZENGE + u'\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\u2044' # 0xDA -> FRACTION SLASH + u'\u20ac' # 0xDB -> EURO SIGN + u'\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\u021a' # 0xDE -> LATIN CAPITAL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later + u'\u021b' # 0xDF -> LATIN SMALL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later + u'\u2021' # 0xE0 -> DOUBLE DAGGER + u'\xb7' # 0xE1 -> MIDDLE DOT + u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2030' # 0xE4 -> PER MILLE SIGN + u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\uf8ff' # 0xF0 -> Apple logo + u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u02dc' # 0xF7 -> SMALL TILDE + u'\xaf' # 0xF8 -> MACRON + u'\u02d8' # 0xF9 -> BREVE + u'\u02d9' # 0xFA -> DOT ABOVE + u'\u02da' # 0xFB -> RING ABOVE + u'\xb8' # 0xFC -> CEDILLA + u'\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + u'\u02db' # 0xFE -> OGONEK + u'\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_romanian.pyc b/PythonEnv/2.7/Lib/encodings/mac_romanian.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ecd750519d262ebadd98623335a215de627e0b0 GIT binary patch literal 2921 zcmc&$d2tts(8Qdez&Wcf#A&IcT zgW^z0xIzFq^FY{U>1Q?7o-xx_4f8|N8g3{5B^<*BYO!ag|QZ#T}*Maq>HuS!oyS-Tjyp8TzgqBV?B(mZE-WjClnr` z@Rt-Grj!YVS11A{g_kMiOmz#Lk0tPcU`gj=%DAG=FLV_pou4U{v}q}0%6Qfi5C`B% z0oH>K2FcTCcmf5G!zt9r37pYmfX63BVdd=vd zH{*0(O=nk4FsR+cCt~=}zOYil){T0(ONzpK6!tm42 z4PA>HaoW@H;;1L_6r2pk*16aQ{JNRpW<4H^-i7jr^SbaXYm7%}9AQYwoiW>8Areaj zBxcBMN!5OfEM(PWLWH2DJ9CEcL)G<+o(-dti77i9SM~E-ZH(v6YfWlxt;O@Qt)sC; zVC*9VPUGl&0)x5kCMtA0?@)U+Wd8w9p` z9HrtZv27}DZMNZkQ<%drBFf(rFaxCyt&m^HEDtdY>p)dBOvgqvoR|n*Bts%z3UDRz zPO!*9UC=0@rRAi9z!-xk3@O~vpi32Gv=S#_V5ywUsse1s%H7~hxt&xr<#*kQ@)AL{ z{|9ACzl}0c><*MADtb=nV+5G^IUUD811wEM)xW@D!gX5F3Svtcj2gNsr&jA4R_79T ziJ6P(hm?4myI2u%%>@6P)H?x-)fl5DN>$+yQQzi|q{_;F?+;bS1NkFwrPt&_$(!m8B$Lt)5ft zgHFK`+}E56W48_cPO)7Rb&*Z%RhUg2h~6l{dXZjX*{0h#&5wy17#{gQ^I%U*AMb(EV!)?BphXcX4wsH}`RKH#hs?690ZHT)%OdZ|ddUr?`2An^#8$ zM)q*?pmm9x1Kixt&9l%ATVWG?33>P$zJYD<73_pve;m3FJ756zK>zT$!sfzW>r7#H zp}#O-T`ue^>?v#sQ! CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u2020' # 0xA0 -> DAGGER + u'\xb0' # 0xA1 -> DEGREE SIGN + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa7' # 0xA4 -> SECTION SIGN + u'\u2022' # 0xA5 -> BULLET + u'\xb6' # 0xA6 -> PILCROW SIGN + u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + u'\xae' # 0xA8 -> REGISTERED SIGN + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u2122' # 0xAA -> TRADE MARK SIGN + u'\xb4' # 0xAB -> ACUTE ACCENT + u'\xa8' # 0xAC -> DIAERESIS + u'\u2260' # 0xAD -> NOT EQUAL TO + u'\xc6' # 0xAE -> LATIN CAPITAL LETTER AE + u'\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + u'\u221e' # 0xB0 -> INFINITY + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + u'\xa5' # 0xB4 -> YEN SIGN + u'\xb5' # 0xB5 -> MICRO SIGN + u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + u'\u2211' # 0xB7 -> N-ARY SUMMATION + u'\u220f' # 0xB8 -> N-ARY PRODUCT + u'\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + u'\u222b' # 0xBA -> INTEGRAL + u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + u'\xe6' # 0xBE -> LATIN SMALL LETTER AE + u'\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + u'\xbf' # 0xC0 -> INVERTED QUESTION MARK + u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + u'\xac' # 0xC2 -> NOT SIGN + u'\u221a' # 0xC3 -> SQUARE ROOT + u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + u'\u2248' # 0xC5 -> ALMOST EQUAL TO + u'\u2206' # 0xC6 -> INCREMENT + u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + u'\xa0' # 0xCA -> NO-BREAK SPACE + u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + u'\u2013' # 0xD0 -> EN DASH + u'\u2014' # 0xD1 -> EM DASH + u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + u'\xf7' # 0xD6 -> DIVISION SIGN + u'\u25ca' # 0xD7 -> LOZENGE + u'\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\u011e' # 0xDA -> LATIN CAPITAL LETTER G WITH BREVE + u'\u011f' # 0xDB -> LATIN SMALL LETTER G WITH BREVE + u'\u0130' # 0xDC -> LATIN CAPITAL LETTER I WITH DOT ABOVE + u'\u0131' # 0xDD -> LATIN SMALL LETTER DOTLESS I + u'\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA + u'\u015f' # 0xDF -> LATIN SMALL LETTER S WITH CEDILLA + u'\u2021' # 0xE0 -> DOUBLE DAGGER + u'\xb7' # 0xE1 -> MIDDLE DOT + u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2030' # 0xE4 -> PER MILLE SIGN + u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\uf8ff' # 0xF0 -> Apple logo + u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\uf8a0' # 0xF5 -> undefined1 + u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u02dc' # 0xF7 -> SMALL TILDE + u'\xaf' # 0xF8 -> MACRON + u'\u02d8' # 0xF9 -> BREVE + u'\u02d9' # 0xFA -> DOT ABOVE + u'\u02da' # 0xFB -> RING ABOVE + u'\xb8' # 0xFC -> CEDILLA + u'\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + u'\u02db' # 0xFE -> OGONEK + u'\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_turkish.pyc b/PythonEnv/2.7/Lib/encodings/mac_turkish.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c21227a90c5ef97a0bea4226779fb7d520c19b69 GIT binary patch literal 2904 zcmc&$>2nlS5Py4Svn1T0!KjND>p`M;poj|&CeC0(o;7ak_N*k(6N;M&W&8S7$fQ?r{%KCbX^ zg}ikS9r%iJSlP0s~06zdv z3a~D8Fi4(8!&4{#4X03Jr{11PhicnJRgCMh8fp+bI+S!uH%e;Au@Fu&Mt}%%aJ$iQj33u-Mr#ifqG8H|?x&yY zsuI`Zw5Q?4QA^?(IO&XScCl^vbu-<~x;z-W3*`~#b?%v_Pey4RK}d-mF*!{_F5*js zBc_Y3N!fmjENF5v!9!5e9a)|GA**Ue)xxM`eB#U6MJ+bM3l_E{mDZNRd0NXjWDytp z1a5Z{9Zy&=*Zl+~(5rWagUA=c;mf$Psdd`C8u>US;vu8<0$1% zk!mw>Yf}xcn#3G>5lj9F{~VM$oI-LTtvp04ECChKFdZ9FaAG`io(h3T$)Od+X){vV7f z`8LMHuX`{SsM4Q4zDm3RS(WzLUmTb2qH`Ai|VQ@rZ%Vw7Ud#uiIp|< zL(00%TP%gRW}JIY-kosyYGN@HohoqfnD25&kVWY~cZUjjrQ=Q!3`%P)$(Q0}-%7g^ zV-KcckJl3~rnj)hhU%mHAo;0pVAs{LLk6fkb+M9Ym?#v{>55XN(kSm(qUYafe*E_E zM046JPHC~5g?g{pu7xU3C3YxGB@V=HoM0=@EjMfzZE}IP#QJn1!;6|@R-oG_5K#oe zL!cZzNRo95uuVqKu&wKA=Um)s#AfCyb@^Ro`0?{kwx3Ana(lc!e@UP;IH|0B@|3C5 zrq7r;YxYAASIl{&^3lg056ykz$)}!vW?uN&=bnFIepU60FD-cal~-R|`1%`*-dz0F zlDC&GtEpXHw_@e0`gc~ZX^5Azty{lgJY0Z_ zFbu!I&u|&8!WFm{jg@o zM3#7Kp7<;LA^rzH0M5PZ+EM$2YkS5s_s++;XU@IhKlh^BKUYsP+I&L%pP@B>p)*7i z^Z}U;6#)~9E&3o$Gxp1B6FW7lOx7)8NbJ%|3;^NTl+;_sfXn>YaXgm zZEU7ywNqDlW$K$IilR|bSJtTMT0KqOOZ9VFmUU%RTrS$tS@SYqF7wLzVOE#Jbakp` zt}a#DWO+VZt{+7=i#%JXo3v3kF8AJ6o5QlN&MV`r`o)&hm7C+pv^Xo;37>U3jG{O@ z1*+xR<@1GCqp`ktq|S>%X`VMq+s3-ztr@EEuj=Yt>+|um=h&A2i%;A^g#HK}N0-^&I#q0$zj^%L8L(i+9xs`42JHRZj zmMbp@Tjy%m#ITWc%@-JrzP)aF|N5KjBA;Fhvb>r%*9;V#$<`L%hgjb*CJOuq=r5|w z+0s@%Eq;`M+*Xdf>IquIdn{gC#AZlj7Lsm}XRO-SO@id*9Av<8zCe&2mhs7@#52y} zr8Zg~X^t=E{StR$i7<3ZC+X zKcz)uH9K~<{tupYA3HxrlS_MVG5mu_WXCW+w=jGkgDu0zaBvF?324oV)5qM2Ja}y~ zUCn0JCGDH;hn3Iy4DB^mzTwh4o0eBdE4x2RoI~%xA?L{FXm8`vHZ|{ni`mnho%`|i z06RI`Hn=hj<-^5KbpIFw=pKr1t2RobhxEJTLoUwHH!3q^hMJ6oL^1Y#RObF=Jix}W z$e)!d15RAwPykD&=DSR7)$QIiw`y>nUlJ7vFNp@m?ijdYS{ENORHlMUR@Qh%AjSHk zn$^2|MbDarqB(laPqP3}$pI7gPp9%Y}EfwE0Sq<0DUieYxxZCR-hbP^W5Z{CU E0JwRUsQ>@~ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/palmos.py b/PythonEnv/2.7/Lib/encodings/palmos.py new file mode 100644 index 0000000000..4b77e2ba91 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/palmos.py @@ -0,0 +1,83 @@ +""" Python Character Mapping Codec for PalmOS 3.5. + +Written by Sjoerd Mullender (sjoerd@acm.org); based on iso8859_15.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_map) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_map)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='palmos', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) + +# The PalmOS character set is mostly iso-8859-1 with some differences. +decoding_map.update({ + 0x0080: 0x20ac, # EURO SIGN + 0x0082: 0x201a, # SINGLE LOW-9 QUOTATION MARK + 0x0083: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x0084: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x0085: 0x2026, # HORIZONTAL ELLIPSIS + 0x0086: 0x2020, # DAGGER + 0x0087: 0x2021, # DOUBLE DAGGER + 0x0088: 0x02c6, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x0089: 0x2030, # PER MILLE SIGN + 0x008a: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x008b: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x008c: 0x0152, # LATIN CAPITAL LIGATURE OE + 0x008d: 0x2666, # BLACK DIAMOND SUIT + 0x008e: 0x2663, # BLACK CLUB SUIT + 0x008f: 0x2665, # BLACK HEART SUIT + 0x0090: 0x2660, # BLACK SPADE SUIT + 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x0095: 0x2022, # BULLET + 0x0096: 0x2013, # EN DASH + 0x0097: 0x2014, # EM DASH + 0x0098: 0x02dc, # SMALL TILDE + 0x0099: 0x2122, # TRADE MARK SIGN + 0x009a: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x009c: 0x0153, # LATIN SMALL LIGATURE OE + 0x009f: 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/PythonEnv/2.7/Lib/encodings/palmos.pyc b/PythonEnv/2.7/Lib/encodings/palmos.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08167b89a4fe1f5b4dead18008312009414679df GIT binary patch literal 3041 zcmc&$*=`&~6umv0?XjKB&SJ+7Z3oPR#bm+GN-%a36bYNC=K*0^nzZNEIBjNAcU!~~ z4+w`X>~Dj`$@?3NReAi$ z!Or1|9yuZ^vW(Ud%}CvmWq_<0N7ge^1J21kku8xomouVy>&RM1q3g(s_E<;GI(oZ~ zoM@kzjP>QEh5?FQUtYAo<11L-K-X6g9pue&GHkDyKGA)$van0=tLM#3JjCyn|mx;*4x%K>)NVOX=fP1{=lu z&|3u)4ZmG6O?Jiu=&}%;RM4M1!|@|iuh{^CW_u&Ht1w~M3ZoL7Vw>nB(88sagygg5 zSL(s)N@uiar43?R5eP{hwi9x`h$M)!muNgb`lmP$SSJn(x5wd;e~w+#Z@_Q>|A*N=hDxb=6x0r8JxVYQde@{yfl}_t% zlX+BzM=CsKW{+8osoyn&MXjOog`1POjVM}i`W%!-d<*s)2+|t-?4o%W-e8pIJ)#G6 zfLjSpu6GR^p{er?5d_;7beIFCu<|y}xF0$_vB9DEa64j>Ad`46y z`kcrReL-}a=u4twE}E~1Mu;8|jS)R08YlXiXp-m~q9LMhiH3beMdAof#!Q6 zpKJMns7&-D(OsgSfJ#gV)Wb7NTUDG<7(tS(rMY67l7t=S-+9~c-!hdzL46Q!Rupd` zwhV`UbIsT)Wo5U~RzEf|6K)^qyae!-A~_}C*`|QqZfSeUUP;c?t31u4*U%I)1G$l& Xk=#gbEIXF(8$6utb9(ml?a%)Kz0EZq literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/ptcp154.py b/PythonEnv/2.7/Lib/encodings/ptcp154.py new file mode 100644 index 0000000000..aef897538f --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/ptcp154.py @@ -0,0 +1,175 @@ +""" Python Character Mapping Codec generated from 'PTCP154.txt' with gencodec.py. + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_map) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_map)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='ptcp154', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0496, # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER + 0x0081: 0x0492, # CYRILLIC CAPITAL LETTER GHE WITH STROKE + 0x0082: 0x04ee, # CYRILLIC CAPITAL LETTER U WITH MACRON + 0x0083: 0x0493, # CYRILLIC SMALL LETTER GHE WITH STROKE + 0x0084: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x0085: 0x2026, # HORIZONTAL ELLIPSIS + 0x0086: 0x04b6, # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER + 0x0087: 0x04ae, # CYRILLIC CAPITAL LETTER STRAIGHT U + 0x0088: 0x04b2, # CYRILLIC CAPITAL LETTER HA WITH DESCENDER + 0x0089: 0x04af, # CYRILLIC SMALL LETTER STRAIGHT U + 0x008a: 0x04a0, # CYRILLIC CAPITAL LETTER BASHKIR KA + 0x008b: 0x04e2, # CYRILLIC CAPITAL LETTER I WITH MACRON + 0x008c: 0x04a2, # CYRILLIC CAPITAL LETTER EN WITH DESCENDER + 0x008d: 0x049a, # CYRILLIC CAPITAL LETTER KA WITH DESCENDER + 0x008e: 0x04ba, # CYRILLIC CAPITAL LETTER SHHA + 0x008f: 0x04b8, # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE + 0x0090: 0x0497, # CYRILLIC SMALL LETTER ZHE WITH DESCENDER + 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x0095: 0x2022, # BULLET + 0x0096: 0x2013, # EN DASH + 0x0097: 0x2014, # EM DASH + 0x0098: 0x04b3, # CYRILLIC SMALL LETTER HA WITH DESCENDER + 0x0099: 0x04b7, # CYRILLIC SMALL LETTER CHE WITH DESCENDER + 0x009a: 0x04a1, # CYRILLIC SMALL LETTER BASHKIR KA + 0x009b: 0x04e3, # CYRILLIC SMALL LETTER I WITH MACRON + 0x009c: 0x04a3, # CYRILLIC SMALL LETTER EN WITH DESCENDER + 0x009d: 0x049b, # CYRILLIC SMALL LETTER KA WITH DESCENDER + 0x009e: 0x04bb, # CYRILLIC SMALL LETTER SHHA + 0x009f: 0x04b9, # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE + 0x00a1: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U (Byelorussian) + 0x00a2: 0x045e, # CYRILLIC SMALL LETTER SHORT U (Byelorussian) + 0x00a3: 0x0408, # CYRILLIC CAPITAL LETTER JE + 0x00a4: 0x04e8, # CYRILLIC CAPITAL LETTER BARRED O + 0x00a5: 0x0498, # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER + 0x00a6: 0x04b0, # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE + 0x00a8: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x00aa: 0x04d8, # CYRILLIC CAPITAL LETTER SCHWA + 0x00ad: 0x04ef, # CYRILLIC SMALL LETTER U WITH MACRON + 0x00af: 0x049c, # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE + 0x00b1: 0x04b1, # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE + 0x00b2: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x00b3: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x00b4: 0x0499, # CYRILLIC SMALL LETTER ZE WITH DESCENDER + 0x00b5: 0x04e9, # CYRILLIC SMALL LETTER BARRED O + 0x00b8: 0x0451, # CYRILLIC SMALL LETTER IO + 0x00b9: 0x2116, # NUMERO SIGN + 0x00ba: 0x04d9, # CYRILLIC SMALL LETTER SCHWA + 0x00bc: 0x0458, # CYRILLIC SMALL LETTER JE + 0x00bd: 0x04aa, # CYRILLIC CAPITAL LETTER ES WITH DESCENDER + 0x00be: 0x04ab, # CYRILLIC SMALL LETTER ES WITH DESCENDER + 0x00bf: 0x049d, # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE + 0x00c0: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x00c1: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x00c2: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x00c3: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x00c4: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x00c5: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x00c6: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x00c7: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x00c8: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x00c9: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x00ca: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x00cb: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x00cc: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x00cd: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x00ce: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x00cf: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x00d0: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x00d1: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x00d2: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x00d3: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x00d4: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x00d5: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x00d6: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x00d7: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x00d8: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x00d9: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x00da: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x00db: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x00dc: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x00dd: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x00de: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x00df: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00e0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00e1: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00e2: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00e3: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00e4: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00e5: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00e6: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00e7: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00e8: 0x0438, # CYRILLIC SMALL LETTER I + 0x00e9: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00ea: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00eb: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00ec: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00ed: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00ee: 0x043e, # CYRILLIC SMALL LETTER O + 0x00ef: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00f0: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00f1: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00f2: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00f3: 0x0443, # CYRILLIC SMALL LETTER U + 0x00f4: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00f5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00f6: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00f7: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00f8: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00f9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00fa: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x00fb: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00fc: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00fd: 0x044d, # CYRILLIC SMALL LETTER E + 0x00fe: 0x044e, # CYRILLIC SMALL LETTER YU + 0x00ff: 0x044f, # CYRILLIC SMALL LETTER YA +}) + +### Encoding Map + +encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/PythonEnv/2.7/Lib/encodings/ptcp154.pyc b/PythonEnv/2.7/Lib/encodings/ptcp154.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f8095aeed0eb4c16d781124a10475d2f90f9493 GIT binary patch literal 4865 zcmd_tcYG9O8VB%a(+LRzp@rsv2tgqRq$naLgdz$7C!9!*b8p#ak_>LU*$J3C?@kRi z?4Wd1Ks^sn5wHOE-g^VPU;zuL*splM-@B0I@cuyV^Ev-8$;|IN^X{}~-g$SDxvMb0 z=bVNKVcGqYg)GOEEQC~~2J?VuhC~8V17wO5kQo_L3unn}ktUI;H5sDWrXkZbj;OLYxfKmMyi|L4I>vwrI;eZ8@f`pt&taw2%umsomy@(?YbBGzIuq zlP^xb%xEd@OwofxTgwn_Bia^GB-#$qUbF+Eqi82Yv1n&R7tyYWZlc{02a8&W9-=)F zhlut<94guy(MPld(O2{^#Nnd-5dB3<5l4uYAqI#JL>wtP2r*c62x6${QHY~Oharv; z9ga9wbOho!(Q-tE=txAR=qSW!(J_dzqQ@h~iJpKsQFJ_Ff@l?DqUa>VNuoBQT68kv zSE45)rih+`m?~O>__gRX#BW4TMFd5EiwKEMM}$Qc;fU5E>O|`iuILQJX`&HCR5XT& zizX1i6ZH^DQ6JGDIukKV^mIg{=WPi$oVAmWVDzEEBy7akc0* zh~=Uy5GzHmMO-I(J>oB-Hz58hx(acl=-&`GiQbG@EqV)Ljp$m$I?-DZw~5}4xI=V3 zVuR>L#GRsdA?_Bv2XU|HeTe%-A3!`P`Vit_(MJ%Eiav&TT=WUVlcG-{o)&!u@vP`` zi04ILK)fjW65?giR}im?ZbEDpeGT!t=o^SPMc+caE&2}PUC}Lwt)lNC-WUA<@uBE8 z#CFk-5Fd+vg7{Q)2V$q_XNb>5zd-B~{Sxt&=+}sEM88FRC;Gh%!GjdwLtem#iBDA_ zpa1HTzjIi43o~m{qhBA7S(Wu6FBJA2&zcZQB-~h?RT)<&Y}Gk2#|!z6TD4w0YW0~k zxpLBg!GlWu)BQfyEZ48+C&K(_X`-<-KYxnn`o0shrZ-|oUbufnOg+aM??k6Jcy(4u zG!!Y1q!voU@n~OcQ4;QpVe#Im`Zv}`BocrzU>wW=msQz~q` zqH6Ng(tWlXSXNeMjcsr>Zp{qEEIXb|Hbk*+_Xqq``PsNob2-gJV+PiYWDP9L91KAL z4v-ifXQM_Kz~BtyOtGs=GVvilhadMnH|&SG%qa^~C07?==8Mb-$Qk&{5I;kjGEwFL z)>oxBH+4$-t*|zXdPhTvV5)e20ah8J@@05_Is@Xc8`o)`C$C1?~g zOZI{)hfPb}%7H_tMcnDr_UtV=E#Zd~yk&{T)Yj&9wdSr_1qmF;<=EWxKQ0740KLFm zh~eHBV)F*rETEl>*@2#U>JY5;?lUi8f&4tog27lQ>I8#+zFCOIwIPBYQ%^69wdSX}Yqi5-s%zo9Q6=4-*eiZq z^v+nD?nCHI=ti0BM(CBr)g|0*m5Z5}t2Q^lW+yZywRv`?)1+%{dQGhx3q{fwzyH_G z%5}uFcd2c5Q@ao|v+psXNYXJSP9NYWR+p9Su;(Z_fqiQ`%5&OkYdi>-1$B?SB{IgVG(-k59#RLi&F_6%HCb(x=k=u<|yV5xg8oJ$vU~7N4@9PmyXoO0 z^#$PVyE--2dFJ-vTL-rf6Kb~Cidp7V;8|D}fe)oInA7bIh+R=w$AE6vRCft?pdvENTaJHZ_kz zoyF~LVK$rUO`SvC&en6Oo2m1twbc34YU%>&8fp%;g}RVhL0v>GrY@#7QkPKcsY|H^ z)MZpB3$x3qVrnkcm6}I&qpqNOQdd$%)O@NPwSZd3{Vk;KpcYZfsm0V*Y6-QHT1qXU zmQi<7S5X_NtEpDha_UrS1(ipwq_$DlQVXf;s9UJ(sQ`5YwTW6q?WAs^mQt&!HPjj^ zhgwUWOs%69QMXdtsoSWNsP$9_JXr1qYBSeuq)wskqE=CNQ#VrgP|K)$sn*neR2%Ak zsx9>ZRYW~VwWA)Q+EWix9jHgBj?|-6C+ab(n0lP*Og%w$p`N6=QcqFcsHds!)HBq< z)U%XDJxBGRo~L?JFHnb2FH*gzm#9Ojm#N;=D^wrqRf^x;?k1`)wV67MdW|}qdY$S= zy+QS--lR$?zO%bWP;XOZ)H~Dw>RoCewS_v8+DZ+g-lGOn?^8pl52&HkhtyHjHtJ|< zJ2i~@h&qP)m>N!fLLEzeN{yg)P{&a_sdDNws)G8Q8cBUYRZ_dCQPh{zXzD9!4D~fN zmimS|p8A#=M}0?~Kz&c0Nbz4AcRckEY6A67s*3s-HIe!ODrtq88K;9mjfe5Vn1K~G zCfRGiY|F(W&iKu3M(SwjG$-gPhCkPD3@ZL9FmFU&C|2i~_XYE+-H=fH>*Tk=R%U}e z@8o>Lw{Z>!J_6@q92W_HbPQP>{CaqchXw`KOf0deir At^fc4 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/punycode.py b/PythonEnv/2.7/Lib/encodings/punycode.py new file mode 100644 index 0000000000..d97200fd35 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/punycode.py @@ -0,0 +1,238 @@ +# -*- coding: iso-8859-1 -*- +""" Codec for the Punicode encoding, as specified in RFC 3492 + +Written by Martin v. Löwis. +""" + +import codecs + +##################### Encoding ##################################### + +def segregate(str): + """3.1 Basic code point segregation""" + base = [] + extended = {} + for c in str: + if ord(c) < 128: + base.append(c) + else: + extended[c] = 1 + extended = extended.keys() + extended.sort() + return "".join(base).encode("ascii"),extended + +def selective_len(str, max): + """Return the length of str, considering only characters below max.""" + res = 0 + for c in str: + if ord(c) < max: + res += 1 + return res + +def selective_find(str, char, index, pos): + """Return a pair (index, pos), indicating the next occurrence of + char in str. index is the position of the character considering + only ordinals up to and including char, and pos is the position in + the full string. index/pos is the starting position in the full + string.""" + + l = len(str) + while 1: + pos += 1 + if pos == l: + return (-1, -1) + c = str[pos] + if c == char: + return index+1, pos + elif c < char: + index += 1 + +def insertion_unsort(str, extended): + """3.2 Insertion unsort coding""" + oldchar = 0x80 + result = [] + oldindex = -1 + for c in extended: + index = pos = -1 + char = ord(c) + curlen = selective_len(str, char) + delta = (curlen+1) * (char - oldchar) + while 1: + index,pos = selective_find(str,c,index,pos) + if index == -1: + break + delta += index - oldindex + result.append(delta-1) + oldindex = index + delta = 0 + oldchar = char + + return result + +def T(j, bias): + # Punycode parameters: tmin = 1, tmax = 26, base = 36 + res = 36 * (j + 1) - bias + if res < 1: return 1 + if res > 26: return 26 + return res + +digits = "abcdefghijklmnopqrstuvwxyz0123456789" +def generate_generalized_integer(N, bias): + """3.3 Generalized variable-length integers""" + result = [] + j = 0 + while 1: + t = T(j, bias) + if N < t: + result.append(digits[N]) + return result + result.append(digits[t + ((N - t) % (36 - t))]) + N = (N - t) // (36 - t) + j += 1 + +def adapt(delta, first, numchars): + if first: + delta //= 700 + else: + delta //= 2 + delta += delta // numchars + # ((base - tmin) * tmax) // 2 == 455 + divisions = 0 + while delta > 455: + delta = delta // 35 # base - tmin + divisions += 36 + bias = divisions + (36 * delta // (delta + 38)) + return bias + + +def generate_integers(baselen, deltas): + """3.4 Bias adaptation""" + # Punycode parameters: initial bias = 72, damp = 700, skew = 38 + result = [] + bias = 72 + for points, delta in enumerate(deltas): + s = generate_generalized_integer(delta, bias) + result.extend(s) + bias = adapt(delta, points==0, baselen+points+1) + return "".join(result) + +def punycode_encode(text): + base, extended = segregate(text) + base = base.encode("ascii") + deltas = insertion_unsort(text, extended) + extended = generate_integers(len(base), deltas) + if base: + return base + "-" + extended + return extended + +##################### Decoding ##################################### + +def decode_generalized_number(extended, extpos, bias, errors): + """3.3 Generalized variable-length integers""" + result = 0 + w = 1 + j = 0 + while 1: + try: + char = ord(extended[extpos]) + except IndexError: + if errors == "strict": + raise UnicodeError, "incomplete punicode string" + return extpos + 1, None + extpos += 1 + if 0x41 <= char <= 0x5A: # A-Z + digit = char - 0x41 + elif 0x30 <= char <= 0x39: + digit = char - 22 # 0x30-26 + elif errors == "strict": + raise UnicodeError("Invalid extended code point '%s'" + % extended[extpos]) + else: + return extpos, None + t = T(j, bias) + result += digit * w + if digit < t: + return extpos, result + w = w * (36 - t) + j += 1 + + +def insertion_sort(base, extended, errors): + """3.2 Insertion unsort coding""" + char = 0x80 + pos = -1 + bias = 72 + extpos = 0 + while extpos < len(extended): + newpos, delta = decode_generalized_number(extended, extpos, + bias, errors) + if delta is None: + # There was an error in decoding. We can't continue because + # synchronization is lost. + return base + pos += delta+1 + char += pos // (len(base) + 1) + if char > 0x10FFFF: + if errors == "strict": + raise UnicodeError, ("Invalid character U+%x" % char) + char = ord('?') + pos = pos % (len(base) + 1) + base = base[:pos] + unichr(char) + base[pos:] + bias = adapt(delta, (extpos == 0), len(base)) + extpos = newpos + return base + +def punycode_decode(text, errors): + pos = text.rfind("-") + if pos == -1: + base = "" + extended = text + else: + base = text[:pos] + extended = text[pos+1:] + base = unicode(base, "ascii", errors) + extended = extended.upper() + return insertion_sort(base, extended, errors) + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + res = punycode_encode(input) + return res, len(input) + + def decode(self,input,errors='strict'): + if errors not in ('strict', 'replace', 'ignore'): + raise UnicodeError, "Unsupported error handling "+errors + res = punycode_decode(input, errors) + return res, len(input) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return punycode_encode(input) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + if self.errors not in ('strict', 'replace', 'ignore'): + raise UnicodeError, "Unsupported error handling "+self.errors + return punycode_decode(input, self.errors) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='punycode', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/PythonEnv/2.7/Lib/encodings/punycode.pyc b/PythonEnv/2.7/Lib/encodings/punycode.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d532269c552161bd63d8949bc1c2fb549316a2a7 GIT binary patch literal 7915 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 WK84?B$_wR*g|UUw!ti2oap>RC3J~D{ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/quopri_codec.py b/PythonEnv/2.7/Lib/encodings/quopri_codec.py new file mode 100644 index 0000000000..d8683fd56d --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/quopri_codec.py @@ -0,0 +1,75 @@ +"""Codec for quoted-printable encoding. + +Like base64 and rot13, this returns Python strings, not Unicode. +""" + +import codecs, quopri +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + +def quopri_encode(input, errors='strict'): + """Encode the input, returning a tuple (output object, length consumed). + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + # using str() because of cStringIO's Unicode undesired Unicode behavior. + f = StringIO(str(input)) + g = StringIO() + quopri.encode(f, g, 1) + output = g.getvalue() + return (output, len(input)) + +def quopri_decode(input, errors='strict'): + """Decode the input, returning a tuple (output object, length consumed). + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + f = StringIO(str(input)) + g = StringIO() + quopri.decode(f, g) + output = g.getvalue() + return (output, len(input)) + +class Codec(codecs.Codec): + + def encode(self, input,errors='strict'): + return quopri_encode(input,errors) + def decode(self, input,errors='strict'): + return quopri_decode(input,errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return quopri_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return quopri_decode(input, self.errors)[0] + +class StreamWriter(Codec, codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +# encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='quopri', + encode=quopri_encode, + decode=quopri_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/PythonEnv/2.7/Lib/encodings/quopri_codec.pyc b/PythonEnv/2.7/Lib/encodings/quopri_codec.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd916dc1bc86f19195c1272eb998f13369c851f7 GIT binary patch literal 3560 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/shift_jis.py b/PythonEnv/2.7/Lib/encodings/shift_jis.py new file mode 100644 index 0000000000..8338117276 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/shift_jis.py @@ -0,0 +1,39 @@ +# +# shift_jis.py: Python Unicode Codec for SHIFT_JIS +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('shift_jis') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='shift_jis', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/shift_jis.pyc b/PythonEnv/2.7/Lib/encodings/shift_jis.pyc new file mode 100644 index 0000000000000000000000000000000000000000..536622071175bbda42ad14ef66fce1f740b46447 GIT binary patch literal 1775 zcmc&!OK;Oa5FS6`JnA$E0V*JI;DB=Czy%2*R1rAz&=j!AcU6ZP1qVgDHZrN8l9*f#rnnNDq- zrKN3PH&|+u)G=|u`N%rYu)tqLz_^ro;ywtUBA?W-4=MHexNTvH<9xg@acn!XSuFKx z&RbSU_9NNN+7s`yaIhb8sohP+jj@{YywMgyZ?BcS1zO$I> zLFul(D=-ze*%hz~iCifeMOKl~J;rwlrTk5>C;%;`GYlB3XZds~_}cwkaXBll8pTE` zj>rFl!ye)I%)q)Cpjxb7U|TX+2sjR$5F?P$XJ*w?DkJ0UN(qkxA1_vOn@-kNu#{Ma z?P8KhL&EKHLUA<38O!-Q-=4VJD8$8oD&62!LSP^7-?R@K3C`cdRrN~P6!)on#Ez5j bzG|=^I4dRN_{0g_p8M2qJ5M~GFERcAfhb_S literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/shift_jis_2004.py b/PythonEnv/2.7/Lib/encodings/shift_jis_2004.py new file mode 100644 index 0000000000..161b1e86f9 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/shift_jis_2004.py @@ -0,0 +1,39 @@ +# +# shift_jis_2004.py: Python Unicode Codec for SHIFT_JIS_2004 +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('shift_jis_2004') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='shift_jis_2004', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/shift_jis_2004.pyc b/PythonEnv/2.7/Lib/encodings/shift_jis_2004.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a0b3b2fb71a266ae2868bf490a1b8c456e1f722 GIT binary patch literal 1815 zcmc&!OK;Oa5FS6`JnAF}0V*JI;1mf7RTUBvLZ~8e=%E$b91vC{EAcw1qu8nJjZn_% ziNDCt;0M4rYP z@NEhliiu_}X`9v%)kuS5(afU>)LgnDS`&Q>Jkm9a9h%ie+@Og~+N;D3(hxx06md($ zjY`}i4S^>bN21}=#39|PG>@pc@cEkr$Mg+|B~N$E)A2#RWdQ* zEGfd%lan{523CKeG5_n8Gj{rEwUV zmMqeRUe0;R3K5@gJWz4Qw2)wdEKh-igeqQv>c1O)S(&RvcKUWWPsT&plw{Ll__yt^ zuUCqV^)U)gr)M=S^AN;&7UgjoXJ$12EH~!&z2jI^-UW8$kpsT6c@m1x-Pg!E&Uk=P z@UfnK*Thc}iNl)6DSWhJBFA)K@_3Z0c%VM*zSf#XQ>g;f?ff5ph=iI=>}tKP4z*KLvU%h7#U^? ze^LxB#i){kO13p$qAb75E)kbY_zKA_@{8Q=FuqGXETso;W;S;{5}2Luw2F literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/shift_jisx0213.py b/PythonEnv/2.7/Lib/encodings/shift_jisx0213.py new file mode 100644 index 0000000000..cb653f5305 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/shift_jisx0213.py @@ -0,0 +1,39 @@ +# +# shift_jisx0213.py: Python Unicode Codec for SHIFT_JISX0213 +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('shift_jisx0213') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='shift_jisx0213', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/shift_jisx0213.pyc b/PythonEnv/2.7/Lib/encodings/shift_jisx0213.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0e410ffefa8604686656a6988af8f4ba714dd1a GIT binary patch literal 1815 zcmc&!OK;Oa5FS6`Jeo8J0V*JI;1mf7(Q-gS2vr0QJ+wlb1Hy`AC0-}B6+4x^5#*en z_>24uegJ$kZk*7Ga|pDE%L23 z-zMLoh$wMM+q8nHMj9N85|1WObLpCBMfBD8NY^NGD5;CMK@*#_SBV>>A%M6k;+BXT zmAFM30#7s!M59d;hjgpbXp@GZ)aZ!Dp=h)#jYHBMUie-1Y0x`_fAMcT7lz5=GM<0N17C0YR@d+k4jW9$uC62@ZgiF3lYS4p}dc55`Z4*CAB=&0}r|`j+i5$~`$)i!KqLGgFYg`k?9970yW@Fr!JT`kaj_dvD#<;4` zy5RMhe~QVVcc4w+LpN~9poxG3V7qG?oux)V3wj0MfhJ+nZ3*0ID+ iaRb{mfSitZWe~7kss30p9a%&XagBPKQ6stnf7I}LRmxYifZ)-|6Tawq71#j)i zKf`}f@T&7ox=GPqY!A)uo1M%gZ{~e7^R4r9%|HKsyqnO)m$6N0M;wkgyvE^B+7*W@j$Y$%DeaTC#n+)JZ{Rn+4y7wg zpC`W6#^+JGhMRF0NsYog$n^t@;M2lVQY2>6(V<|HhndFasC z6{SOCkJKn+FNIwerpF?Rig>1@$oO(Io2SP)ZauzDkYr`nSgrGpbOD<=a3< zXSy(P{!X$f8w6~23jz;WX%OH(Ip_9paCTsnpo^AkoAv4u3qy2h(Kr6GV$&Jd+@irK z#GZQ@3kva$5`lzj5Xy31R^l-*Ryv%H?;p6|N_}quZuFw+<9vcXdP1#0tis0Ydi{kNK&M;{ ztwLujJkv(F7OEhD2g@*wDv};CIky9*%5w39Z!2s|R^Re?LE;l4G{c2|f^?ol nQO$68@~W&98s~yn0kLEQ3S2(z5t=famz#X{j&bspl@4}Dh literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/tis_620.py b/PythonEnv/2.7/Lib/encodings/tis_620.py new file mode 100644 index 0000000000..b2cd22b23d --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/tis_620.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec tis_620 generated from 'python-mappings/TIS-620.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='tis-620', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\ufffe' + u'\u0e01' # 0xA1 -> THAI CHARACTER KO KAI + u'\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI + u'\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT + u'\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI + u'\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON + u'\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG + u'\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU + u'\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN + u'\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING + u'\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG + u'\u0e0b' # 0xAB -> THAI CHARACTER SO SO + u'\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE + u'\u0e0d' # 0xAD -> THAI CHARACTER YO YING + u'\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA + u'\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK + u'\u0e10' # 0xB0 -> THAI CHARACTER THO THAN + u'\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO + u'\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO + u'\u0e13' # 0xB3 -> THAI CHARACTER NO NEN + u'\u0e14' # 0xB4 -> THAI CHARACTER DO DEK + u'\u0e15' # 0xB5 -> THAI CHARACTER TO TAO + u'\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG + u'\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN + u'\u0e18' # 0xB8 -> THAI CHARACTER THO THONG + u'\u0e19' # 0xB9 -> THAI CHARACTER NO NU + u'\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI + u'\u0e1b' # 0xBB -> THAI CHARACTER PO PLA + u'\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG + u'\u0e1d' # 0xBD -> THAI CHARACTER FO FA + u'\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN + u'\u0e1f' # 0xBF -> THAI CHARACTER FO FAN + u'\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO + u'\u0e21' # 0xC1 -> THAI CHARACTER MO MA + u'\u0e22' # 0xC2 -> THAI CHARACTER YO YAK + u'\u0e23' # 0xC3 -> THAI CHARACTER RO RUA + u'\u0e24' # 0xC4 -> THAI CHARACTER RU + u'\u0e25' # 0xC5 -> THAI CHARACTER LO LING + u'\u0e26' # 0xC6 -> THAI CHARACTER LU + u'\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN + u'\u0e28' # 0xC8 -> THAI CHARACTER SO SALA + u'\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI + u'\u0e2a' # 0xCA -> THAI CHARACTER SO SUA + u'\u0e2b' # 0xCB -> THAI CHARACTER HO HIP + u'\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA + u'\u0e2d' # 0xCD -> THAI CHARACTER O ANG + u'\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK + u'\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI + u'\u0e30' # 0xD0 -> THAI CHARACTER SARA A + u'\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT + u'\u0e32' # 0xD2 -> THAI CHARACTER SARA AA + u'\u0e33' # 0xD3 -> THAI CHARACTER SARA AM + u'\u0e34' # 0xD4 -> THAI CHARACTER SARA I + u'\u0e35' # 0xD5 -> THAI CHARACTER SARA II + u'\u0e36' # 0xD6 -> THAI CHARACTER SARA UE + u'\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE + u'\u0e38' # 0xD8 -> THAI CHARACTER SARA U + u'\u0e39' # 0xD9 -> THAI CHARACTER SARA UU + u'\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT + u'\u0e40' # 0xE0 -> THAI CHARACTER SARA E + u'\u0e41' # 0xE1 -> THAI CHARACTER SARA AE + u'\u0e42' # 0xE2 -> THAI CHARACTER SARA O + u'\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN + u'\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI + u'\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO + u'\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK + u'\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU + u'\u0e48' # 0xE8 -> THAI CHARACTER MAI EK + u'\u0e49' # 0xE9 -> THAI CHARACTER MAI THO + u'\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI + u'\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA + u'\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT + u'\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT + u'\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN + u'\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN + u'\u0e50' # 0xF0 -> THAI DIGIT ZERO + u'\u0e51' # 0xF1 -> THAI DIGIT ONE + u'\u0e52' # 0xF2 -> THAI DIGIT TWO + u'\u0e53' # 0xF3 -> THAI DIGIT THREE + u'\u0e54' # 0xF4 -> THAI DIGIT FOUR + u'\u0e55' # 0xF5 -> THAI DIGIT FIVE + u'\u0e56' # 0xF6 -> THAI DIGIT SIX + u'\u0e57' # 0xF7 -> THAI DIGIT SEVEN + u'\u0e58' # 0xF8 -> THAI DIGIT EIGHT + u'\u0e59' # 0xF9 -> THAI DIGIT NINE + u'\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU + u'\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/tis_620.pyc b/PythonEnv/2.7/Lib/encodings/tis_620.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7ce3674744b7bed19c8945522535dffce8771ca GIT binary patch literal 2913 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/unicode_internal.py b/PythonEnv/2.7/Lib/encodings/unicode_internal.py new file mode 100644 index 0000000000..df3e7752d2 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/unicode_internal.py @@ -0,0 +1,45 @@ +""" Python 'unicode-internal' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.unicode_internal_encode + decode = codecs.unicode_internal_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.unicode_internal_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.unicode_internal_decode(input, self.errors)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='unicode-internal', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/PythonEnv/2.7/Lib/encodings/unicode_internal.pyc b/PythonEnv/2.7/Lib/encodings/unicode_internal.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa1f95cbfe62b94bcfd78af63851beffca6d75ea GIT binary patch literal 2157 zcmc&#QEL-H5T46jF3Gi35k(^f4-t9=n+IQnBGMQY3O33{C=G$*dbdfhTrOpIqXc|w zpTu9`U-Sp)%v^IPwNL3oFWu?v&fU&8-^|Y1zc;*RKjsH9Ts}7b-@~DQp-2FRC@n~8 zkXbN9#Rh4?X${7xJ8%JT4sbNAK~iUf%?7tL*pM{X;IN@t8XQPkAZu)^!x%U4N?RS0 zwWZBv+j?npA=#kGutA^(!5zZ-6NUeIVNPbbzctU(c$UbWG&fS^QMTpxa2k7_cc@Zh zWbPj?{DVlvJKa1{(*G!@$8$CDgK3oQWyPcu&!*cQ&kN#h{Q7L6(#eVOdwsG0!tZ98 zFKDiPA+=OrWzzBcpZvqF5Z(TlBm6A=gHPYo5f=L{*|l)xEg^n_LShsa#d&JO&|#$x zLl?v#Kq~|d6sCzH4D)Cz!_asNydhjvi7PRla)QQ6O9C8shs zQTCppsgjr)nwgjfsFcKD{as+$*+dCZ7gKdEM-O#P0U3Z(3%=tYDm6IATC$)$2x!lK ziUI=qMzA121tUt$lxB;eMJ=;2XDrRn=7zO#ise(0u>ucN0S{?&!U9%6js!&_Xn~!4 zh%zk&y;yl#mG&m?LIkoq_dn9#aiVX5bShNQq7XR;RK{YB#5%3vSh>*XjI?oFPq3gG z6!cEzWL0jd(L7#yLT(BAz$h6_sjbM0)$)u}Hi}YSo@h#XmHwM!x{Ld5;#lUp!X#vr z+zzIDi05gADMpna!rH^3cTp5awzydEN-^966NeSN8R~R25|<7tULOWqeUm!jIWz_V zl~JEhEHy<7I{-?i4AcBAdIolSeQ{ug9ixmo}K literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/utf_16.py b/PythonEnv/2.7/Lib/encodings/utf_16.py new file mode 100644 index 0000000000..f3fadff615 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/utf_16.py @@ -0,0 +1,126 @@ +""" Python 'utf-16' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs, sys + +### Codec APIs + +encode = codecs.utf_16_encode + +def decode(input, errors='strict'): + return codecs.utf_16_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + codecs.IncrementalEncoder.__init__(self, errors) + self.encoder = None + + def encode(self, input, final=False): + if self.encoder is None: + result = codecs.utf_16_encode(input, self.errors)[0] + if sys.byteorder == 'little': + self.encoder = codecs.utf_16_le_encode + else: + self.encoder = codecs.utf_16_be_encode + return result + return self.encoder(input, self.errors)[0] + + def reset(self): + codecs.IncrementalEncoder.reset(self) + self.encoder = None + + def getstate(self): + # state info we return to the caller: + # 0: stream is in natural order for this platform + # 2: endianness hasn't been determined yet + # (we're never writing in unnatural order) + return (2 if self.encoder is None else 0) + + def setstate(self, state): + if state: + self.encoder = None + else: + if sys.byteorder == 'little': + self.encoder = codecs.utf_16_le_encode + else: + self.encoder = codecs.utf_16_be_encode + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def __init__(self, errors='strict'): + codecs.BufferedIncrementalDecoder.__init__(self, errors) + self.decoder = None + + def _buffer_decode(self, input, errors, final): + if self.decoder is None: + (output, consumed, byteorder) = \ + codecs.utf_16_ex_decode(input, errors, 0, final) + if byteorder == -1: + self.decoder = codecs.utf_16_le_decode + elif byteorder == 1: + self.decoder = codecs.utf_16_be_decode + elif consumed >= 2: + raise UnicodeError("UTF-16 stream does not start with BOM") + return (output, consumed) + return self.decoder(input, self.errors, final) + + def reset(self): + codecs.BufferedIncrementalDecoder.reset(self) + self.decoder = None + +class StreamWriter(codecs.StreamWriter): + def __init__(self, stream, errors='strict'): + codecs.StreamWriter.__init__(self, stream, errors) + self.encoder = None + + def reset(self): + codecs.StreamWriter.reset(self) + self.encoder = None + + def encode(self, input, errors='strict'): + if self.encoder is None: + result = codecs.utf_16_encode(input, errors) + if sys.byteorder == 'little': + self.encoder = codecs.utf_16_le_encode + else: + self.encoder = codecs.utf_16_be_encode + return result + else: + return self.encoder(input, errors) + +class StreamReader(codecs.StreamReader): + + def reset(self): + codecs.StreamReader.reset(self) + try: + del self.decode + except AttributeError: + pass + + def decode(self, input, errors='strict'): + (object, consumed, byteorder) = \ + codecs.utf_16_ex_decode(input, errors, 0, False) + if byteorder == -1: + self.decode = codecs.utf_16_le_decode + elif byteorder == 1: + self.decode = codecs.utf_16_be_decode + elif consumed>=2: + raise UnicodeError,"UTF-16 stream does not start with BOM" + return (object, consumed) + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-16', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_16.pyc b/PythonEnv/2.7/Lib/encodings/utf_16.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d87dc8b580a0c12549a2e3ef14e87fdc49946541 GIT binary patch literal 5108 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 AjQ{`u literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/utf_16_be.py b/PythonEnv/2.7/Lib/encodings/utf_16_be.py new file mode 100644 index 0000000000..86b458eb9b --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/utf_16_be.py @@ -0,0 +1,42 @@ +""" Python 'utf-16-be' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +encode = codecs.utf_16_be_encode + +def decode(input, errors='strict'): + return codecs.utf_16_be_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_16_be_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_16_be_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_16_be_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_16_be_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-16-be', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_16_be.pyc b/PythonEnv/2.7/Lib/encodings/utf_16_be.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15906adbf84d0c4bb244a0248fbaa58202cf5b65 GIT binary patch literal 1974 zcmbtUZEF)j5T48B^_u#Q67j?72YUq@s7M77X&My@Hp;e88Un}Vc9UMYT*}@?3G`d* z7k`2O(;uKSbLk~iznEOQ)7_b!-DjV9v45>Q&wfk}LYRFv{@=xs{zM@Gx+pD>1&A%^ zTA(aAD?rx)VP4qsW>S%as+;&Iozi?Y|>%^h6hgZ%9szps2$q1w<{M|z?>I@pv@M9KNYu%FU;tWytlz#@H)v-X=_ z#?H&vy*TRkRD$P3$uRBZXE)EM?4Mn68=X=*9V~MX<$e-sHByNQ;t%AjbVx?}XxAQ& z^Z^Qmfx*-$P`*$`*dVf(h4irN(WdQ>P|SE>DlnNY(a(a$A-}5=;Rawr1aWhN3VwnT z^!SW4A|+MvK+uFq8AM4CFV94F1BGkGgvTdWQQ`YZFjBs69A1pZauU;$(0mNyREag5 z&9DC7NQer$6YqR;`L7tf=RBClfcW7U+{H;AgEN~-5(9ur@CcizlUOG~E`nlbsDk|d zWH3;AmS8IYr^I=P;~F?!cxbc=MpT0fX|pWkDjv8hyTnrCpCE+_7IS-9ki@H?Ca?mN z6#gf3ka@ik!(2eGaFP{J)|RmkV=s|KFxZewfL#JRFs3B7UaV|c1yjLpTsib==-A;V zLRp;BGVhs8EkozJkLGosm4m*i&iaKm6liRD7-$^G;ez5DN8aPe5u=7~Y*T;RPX^=p zjhyv@-Y4ksg2J>sfrd(Os1VW+`<9+Q#brwE6s($6Uif*m5xJqVmgCU(v)afLjoDyq x<}q&C<4RF-p(W1BF@sL1GyIfdE8r&pZ?o3&j^+%$Y}JdkLfvi@8#ew*e*kBDh`0a% literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/utf_16_le.py b/PythonEnv/2.7/Lib/encodings/utf_16_le.py new file mode 100644 index 0000000000..ec454142ee --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/utf_16_le.py @@ -0,0 +1,42 @@ +""" Python 'utf-16-le' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +encode = codecs.utf_16_le_encode + +def decode(input, errors='strict'): + return codecs.utf_16_le_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_16_le_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_16_le_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_16_le_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_16_le_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-16-le', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_16_le.pyc b/PythonEnv/2.7/Lib/encodings/utf_16_le.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ebec057fd047f219fd55bc4516835fb15d6cbd5 GIT binary patch literal 1974 zcmbtUZEF)j5T48B^_u#Q67j?72YUq@s7M77X&My@Hp;e88Un}Vc9UMYT*}@?3G`d* z7k`2O(;uKSbLk~iznEOQ)7_b!-DjV9v45>Q&wfk}LYRFv{@=xs{zM@Gx+pD>1&A%^ zTA(aAD?rxIRZo4D)U%0I}b_K0dSEy9! zuSz!E&S&?yB}A)pbb@ZtZ~Qu@OrVU8LK7BnN~4IQP3rq748WNM7XTL)m;zkd_z(;A z9gj$7_mH5c<_@m$LH_oRA1fbKs5W%gk)9}z4mKqeQF1;p?5DII>(oOXut=Zdto^2! zvGekEFOK>>mEbv1GE95<+0FAQ`)60&MyHfc2g}?;xu1kujZ|WS_yhSW9g>kg+O>xx zeSkt?U@$cblrNMKHi+zHAwBGRv}yYz6f+)}3QVR;^s}IG$nWYzxB-|DLEPM+f}fxS zJw79iNJ&*Z5Hw*@22m2k%QKPPK;fD(;ql2;RQP@pjFj&ihZm!0fa7vtqIIe-yg@;C~U_>>zkT%OguHu2KvP&#A{s~g3U@^Cs1xdULY62@T zN#TDo2btF!G0X+@3MW|sWo;SzF!mBz1cME^1lT3817k{J>&42JRWKFo#+5^_hK?O> zB9z4`E%Tnq)G~Cg`)FSGSvlyN>a1UALxIMYhk?d{94;unapXOY95HI>#y0i0{bVqn z-^f`n=zW47FDOjQ6KJRehYBGLv2W?=Q(UIhPQj{K<%OR|8<86-YdH>mKdX&A(U=X! xW*+0FJ+2fb7h2-195d*II>S#XwgP?v@HT5L?`Y28%T~QuE7a{qv0>w{^amaPi7)^F literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/utf_32.py b/PythonEnv/2.7/Lib/encodings/utf_32.py new file mode 100644 index 0000000000..6c8016fe1b --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/utf_32.py @@ -0,0 +1,150 @@ +""" +Python 'utf-32' Codec +""" +import codecs, sys + +### Codec APIs + +encode = codecs.utf_32_encode + +def decode(input, errors='strict'): + return codecs.utf_32_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + codecs.IncrementalEncoder.__init__(self, errors) + self.encoder = None + + def encode(self, input, final=False): + if self.encoder is None: + result = codecs.utf_32_encode(input, self.errors)[0] + if sys.byteorder == 'little': + self.encoder = codecs.utf_32_le_encode + else: + self.encoder = codecs.utf_32_be_encode + return result + return self.encoder(input, self.errors)[0] + + def reset(self): + codecs.IncrementalEncoder.reset(self) + self.encoder = None + + def getstate(self): + # state info we return to the caller: + # 0: stream is in natural order for this platform + # 2: endianness hasn't been determined yet + # (we're never writing in unnatural order) + return (2 if self.encoder is None else 0) + + def setstate(self, state): + if state: + self.encoder = None + else: + if sys.byteorder == 'little': + self.encoder = codecs.utf_32_le_encode + else: + self.encoder = codecs.utf_32_be_encode + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def __init__(self, errors='strict'): + codecs.BufferedIncrementalDecoder.__init__(self, errors) + self.decoder = None + + def _buffer_decode(self, input, errors, final): + if self.decoder is None: + (output, consumed, byteorder) = \ + codecs.utf_32_ex_decode(input, errors, 0, final) + if byteorder == -1: + self.decoder = codecs.utf_32_le_decode + elif byteorder == 1: + self.decoder = codecs.utf_32_be_decode + elif consumed >= 4: + raise UnicodeError("UTF-32 stream does not start with BOM") + return (output, consumed) + return self.decoder(input, self.errors, final) + + def reset(self): + codecs.BufferedIncrementalDecoder.reset(self) + self.decoder = None + + def getstate(self): + # additonal state info from the base class must be None here, + # as it isn't passed along to the caller + state = codecs.BufferedIncrementalDecoder.getstate(self)[0] + # additional state info we pass to the caller: + # 0: stream is in natural order for this platform + # 1: stream is in unnatural order + # 2: endianness hasn't been determined yet + if self.decoder is None: + return (state, 2) + addstate = int((sys.byteorder == "big") != + (self.decoder is codecs.utf_32_be_decode)) + return (state, addstate) + + def setstate(self, state): + # state[1] will be ignored by BufferedIncrementalDecoder.setstate() + codecs.BufferedIncrementalDecoder.setstate(self, state) + state = state[1] + if state == 0: + self.decoder = (codecs.utf_32_be_decode + if sys.byteorder == "big" + else codecs.utf_32_le_decode) + elif state == 1: + self.decoder = (codecs.utf_32_le_decode + if sys.byteorder == "big" + else codecs.utf_32_be_decode) + else: + self.decoder = None + +class StreamWriter(codecs.StreamWriter): + def __init__(self, stream, errors='strict'): + self.encoder = None + codecs.StreamWriter.__init__(self, stream, errors) + + def reset(self): + codecs.StreamWriter.reset(self) + self.encoder = None + + def encode(self, input, errors='strict'): + if self.encoder is None: + result = codecs.utf_32_encode(input, errors) + if sys.byteorder == 'little': + self.encoder = codecs.utf_32_le_encode + else: + self.encoder = codecs.utf_32_be_encode + return result + else: + return self.encoder(input, errors) + +class StreamReader(codecs.StreamReader): + + def reset(self): + codecs.StreamReader.reset(self) + try: + del self.decode + except AttributeError: + pass + + def decode(self, input, errors='strict'): + (object, consumed, byteorder) = \ + codecs.utf_32_ex_decode(input, errors, 0, False) + if byteorder == -1: + self.decode = codecs.utf_32_le_decode + elif byteorder == 1: + self.decode = codecs.utf_32_be_decode + elif consumed>=4: + raise UnicodeError,"UTF-32 stream does not start with BOM" + return (object, consumed) + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-32', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_32.pyc b/PythonEnv/2.7/Lib/encodings/utf_32.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a48e5292a5d8c5b7ac1aa087f54f7091c03b894d GIT binary patch literal 5666 zcmcIoe{UPd5uH08Ns*>v$97$*aa+1>YbHh7)Na$FHQK~#3^4HQ5Oys!0^c3rwg>RM-B7j4`tzFGNm6 zzSwC<)YO5d4y=^}YZA3|prr%ta-b#AB^_w%K&KpNOSI01ol6vJyZ0KU{VuBZr$_GT zH0|D*x$)cg?%wHcO`~|!PX3Eu-!(YRWy#2md^A}Clr45&L*+#FJ$Wwj+!N=^Nex?j z=xh zc1_s3zuBE6d%JOpeUkJ^zH1x*{Hr5fZ2PydBInlPxvQu@Oh;LK7^iMH`G5=KY{WtS zIO_pQ{(Dq0lmsiN1!*0a43_fMQff775hjD}(13~R+Gt9+-J`lf6e+buHEf~eT~wy6 zeZNrHi7y`B1MLm4v6QN#Dne>8Y;w^Ws=**h6E_&B()!ahb{tX##F;5DKt~==#vzxV zUvnW}qp09U;$8Dbl${Ud84mFPY4;W52Wyi3nMMbkVSV-of+GR!o5wX8bRWv`<-nKh zq0VdSQAN^@KCTsy&jA|Sb#S1zHy8vxz&ut_|V}LLxJ# z+Qqxy@G6W@F-w`<4etkX)yyCG@JYvPp*s4cQth5`_nBiqs>cWIt_&O>( zE1{$)QaR6W06iwmsmt$Rvz#Usui$;yP8bXhr_l^pAE=+J1P_Ok zJPxm8RIM7`U~2`Uqe(Sn0( z+5lA=^=jDUP~-nVz3zJu=D}<{j3jokfdJT{E@Na8CQ8BFV0gTnNdP0E5w~U%34I~qS@NHt`s~p| zOWf1$gHJwID2G45^aYwkC^?s8+4*n&kkU^kc3J z10`NPxpGy|3%)k~Xwqv8gHPeO+Qv>|}X~D`pl; z%+av~cLs}tP(MQ(4cRw`MN7h;qFU7}!^Daf!!G+uU02~Qq*BlCEgFg*VQEfR6#p8u z*zq^$A*_9iyPFsa$<@ZlB$rnd&2D0=cTmb`)>=n2d(F|R+e%!Iv&5Zti+B?=V#KB8 zTSOJdkUk@n;c5{ua8cbMifF#QGhQ)p{jNrJ^#utj=&@rg~Zl38tFsmjAanGD2nX3#TC` zeXMlRSv(X2o)_DEC!{?8^nX`Q1!iYS=zD3G@#jAnR*1gL4`O@-8 zoM}fgZwCVTg~bxPd2YuP&92z@buzBvNHGFQ?`igCiQQuzGQP*q2D3Nh&`j*6MPm1j zuUQ?I2O5xHN&cp3mFo3}I7|2jt1c^^GrYy>N2u(p$ui6>^V-{wM=ty^C-Op7LGjEe z zg*6b}kzfO*`2L4<2p|5SgJ?}~zc`WRwg%unhQT_x)~Q$77dyMbQEa_vCDmuH;`7jI zcX3%!Z?rgoESz6O7}>1jnMO8Cz-d7Je6qz4c^{_ZY4t|E@`X1sBUIO+)4!zh907p) zdlo;zH@fWTA9ysYc`e*-tG^z_)LYkJ5KTw8(JI9B+O14_9peTu1)%1EDxyXhm6KL@ hSvl9R_P*Vw|3ETQAsgOC(DFOA&D)#zHm`5q_#X|t!Gr(+ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/utf_32_be.py b/PythonEnv/2.7/Lib/encodings/utf_32_be.py new file mode 100644 index 0000000000..fe272b5faf --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/utf_32_be.py @@ -0,0 +1,37 @@ +""" +Python 'utf-32-be' Codec +""" +import codecs + +### Codec APIs + +encode = codecs.utf_32_be_encode + +def decode(input, errors='strict'): + return codecs.utf_32_be_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_32_be_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_32_be_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_32_be_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_32_be_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-32-be', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_32_be.pyc b/PythonEnv/2.7/Lib/encodings/utf_32_be.pyc new file mode 100644 index 0000000000000000000000000000000000000000..082d83dc013b8e9dc8b343c979a61db0ace0e9e3 GIT binary patch literal 1867 zcmbtUO>5gg5FJ_mj?-@_E4HJnBVI7Gok~lJS z#5i(Vk)bOQ{;G0?$*M#(ov+ChE9-J4aw+nCSd*xsj=DOUrK2HHOC3#hv`a@*q8)X# z)X^y&Es1tH7`6#z;N2m@Cot_V=k~`u-P>Q->5IdI7ZbC;*PBNsY{!4`^=+LiZ5D?% ztf0$QMeA|;A&eC{b>u?i!Vz1MOBc}{%=bMqq1!{o%k4dkaY}G_5KK&fDNI|&`kF0_ z$H2A*6Q^ejtNTor&9mIYoT$m4qt|;gDj*-c9wqT)WKzV5)02Eu#(sHruKSB4+Srsc zx;XX$>~R`qW@b`5PCjz4$wE5$an%u8{s_i^E##}hBr;8|_{GgaUhKN{xco89k_V*% z8NS3mN4f*OS3kxAQ9^ujbAt-Kg7JCzf;5tnn`G*as5`anZh|TZNFtAeU^In!W3?_@|)MU#CwgvFJ2u2Xszw?X=5y#BT~1xa3gioh03vg}wROOR!~kzp;MSLhT4RA?o{5n2*e#X==( z0+oO);z>deQQ1*bYy%S67FYhx=n-geRf+q%$PM}-a`BMyY%BeUl zr@r>{xDed1lB0PT1VwF>4^7!nY?k7Gq?KZ#HA!5SV*#D03;bR5w!lvSZwqO8N99!T Rb*EEpRXT3B+I8`({R8~1W!C@z literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/utf_32_le.py b/PythonEnv/2.7/Lib/encodings/utf_32_le.py new file mode 100644 index 0000000000..9e48210928 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/utf_32_le.py @@ -0,0 +1,37 @@ +""" +Python 'utf-32-le' Codec +""" +import codecs + +### Codec APIs + +encode = codecs.utf_32_le_encode + +def decode(input, errors='strict'): + return codecs.utf_32_le_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_32_le_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_32_le_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_32_le_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_32_le_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-32-le', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_32_le.pyc b/PythonEnv/2.7/Lib/encodings/utf_32_le.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4e1ec3b248433dd95d2ea34104a30b2403a21b8 GIT binary patch literal 1867 zcmbtUO>5gg5FJ_mj?-@_Ep5&u4_N(&?U0-a`#-g0j z#j%fIkJ2zRQ+@|Bom(e@webuZvDTR@EcgZjix!M-^sy8y$8!2kRQ##Lv+d< zoVlzMBmjfrktx4J!@x?Z&vRLxFgTu1CMH{4unmCUM=*l80nQBvHZ$Yt_bj$6*JfSF zO$6MOT>|87y$jMeal#DP&5mLf5*Fmvvv1Lw0+((2LA6(U3eO z8Vww-4E)s0dzv||WbW9bz8$5L*>Xp{^*+z%^YA{?v_65BC3s>0=>)o!T|CEUPB|5) z<<5lK~U62dC`;&#bzn~hgvBnT9L#>ITp}~y1?H>Zv*@U@UD=S_f$>= RUw1myR;A;1t6djw?H{iLW={YB literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/utf_7.py b/PythonEnv/2.7/Lib/encodings/utf_7.py new file mode 100644 index 0000000000..8e0567f208 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/utf_7.py @@ -0,0 +1,38 @@ +""" Python 'utf-7' Codec + +Written by Brian Quinlan (brian@sweetapp.com). +""" +import codecs + +### Codec APIs + +encode = codecs.utf_7_encode + +def decode(input, errors='strict'): + return codecs.utf_7_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_7_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_7_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_7_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_7_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-7', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_7.pyc b/PythonEnv/2.7/Lib/encodings/utf_7.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57b8bdf916a89421e9895d8025a03d292d523966 GIT binary patch literal 1867 zcmbtUU279T6uq0xcT>MbD+s}tt`GJ>go22aMhkr~=tdAjU`ci-b<1WGb|;iT-`XdC zf&bGVpy%9;Nl;&mN#4W$&fkTy{J8i(!pOftL?V4iN1~D>j`STd zj+~dI?@EMUS+1chOH@&PMaI}!m1~hJkc-e0N`y~NHYiZ&#^<98 zqDV$=lCjT;k};0cVX_?qh4-6uSuo(K*E$qIkPas%2y9aqlW8bvXPVR>{u&zXJ5la5Im$1xP-97W$S9lD&s( zfUCM9vsx%GFewV9=$mMi=oL{}EIMXI&v;_v>}sQ6*5*tG zZE8xVLe|=j*R@@we)hY%=n0ty7wrte#Q=93iVKalr_mylmX~+fyH3;bbbX^{xzD%x ze7Mi>Y)71Bsht_XIYVE{7LT#aZ$XIDaH<<$j~l@W%Qu>aK~U7eDzTIa#bqC1)3H{C ri8fl^vh)hrL|kCs!)#0Jy!=(sK3;3{BJiryDmO|kcdxwX;#>I%@GNJH literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/utf_8.py b/PythonEnv/2.7/Lib/encodings/utf_8.py new file mode 100644 index 0000000000..1bf6336571 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/utf_8.py @@ -0,0 +1,42 @@ +""" Python 'utf-8' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +encode = codecs.utf_8_encode + +def decode(input, errors='strict'): + return codecs.utf_8_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_8_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_8_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_8_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_8_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-8', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_8.pyc b/PythonEnv/2.7/Lib/encodings/utf_8.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8faa25067bba2b1e52e9e9e6cbad936814b33b6f GIT binary patch literal 1926 zcmbtU-)j>=5T48LTvLCeRD3x5(ks|Lh+q+swo##AqihPLp>QO3oAk=%Qua1VpfA!s z`4{+q`UmJYb7>OP7vrTn-JRLl{pQ=5DgIb>*T0PqLz;d?{NKgMzC%Pr9Y}|w0woT0 z9MTS*7pPOD2!AEIhO$IaS@dPTWL!F{kUUXcB()MpL!mkkCr-?lqrQXKa_P2I6yyhsz2iNl_F6|LaEpK9YuO3|vL+5~SiqD=38TsC`w*7s+@VXNONVTMu8Ii4fxhK4 z;o=@L^vpJ}MliunfF)Fx&p9$?m#0bG zJJl)9iPJ%LD(7xrOvE=o{x%#kKA9YQ5Aq-ljUMXMc9VDPr%lL4{&?3uM)m+g<1vs9 z1 zPLzijH=y~lwl%stw*5LBThb^vYcoy;>4!q6 zK$hB$=e3=uzWH69_XHyqh<1j@#Q=8;iZAlozPuJQY5DRd_pXDqKbqetS*|!X#epk+ zp5=(MTxtUiI0N)0GkJ<-b_ar-x>H&B`MeRFaQQ}~FbMKGm?f4lA-L>gY}%Kq(9uH6 no0eVQ=+s7N83-F55DAfy%;#z5~h+p{^@z{9q literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/utf_8_sig.py b/PythonEnv/2.7/Lib/encodings/utf_8_sig.py new file mode 100644 index 0000000000..8784694f02 --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/utf_8_sig.py @@ -0,0 +1,117 @@ +""" Python 'utf-8-sig' Codec +This work similar to UTF-8 with the following changes: + +* On encoding/writing a UTF-8 encoded BOM will be prepended/written as the + first three bytes. + +* On decoding/reading if the first three bytes are a UTF-8 encoded BOM, these + bytes will be skipped. +""" +import codecs + +### Codec APIs + +def encode(input, errors='strict'): + return (codecs.BOM_UTF8 + codecs.utf_8_encode(input, errors)[0], len(input)) + +def decode(input, errors='strict'): + prefix = 0 + if input[:3] == codecs.BOM_UTF8: + input = input[3:] + prefix = 3 + (output, consumed) = codecs.utf_8_decode(input, errors, True) + return (output, consumed+prefix) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + codecs.IncrementalEncoder.__init__(self, errors) + self.first = 1 + + def encode(self, input, final=False): + if self.first: + self.first = 0 + return codecs.BOM_UTF8 + codecs.utf_8_encode(input, self.errors)[0] + else: + return codecs.utf_8_encode(input, self.errors)[0] + + def reset(self): + codecs.IncrementalEncoder.reset(self) + self.first = 1 + + def getstate(self): + return self.first + + def setstate(self, state): + self.first = state + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def __init__(self, errors='strict'): + codecs.BufferedIncrementalDecoder.__init__(self, errors) + self.first = True + + def _buffer_decode(self, input, errors, final): + if self.first: + if len(input) < 3: + if codecs.BOM_UTF8.startswith(input): + # not enough data to decide if this really is a BOM + # => try again on the next call + return (u"", 0) + else: + self.first = None + else: + self.first = None + if input[:3] == codecs.BOM_UTF8: + (output, consumed) = codecs.utf_8_decode(input[3:], errors, final) + return (output, consumed+3) + return codecs.utf_8_decode(input, errors, final) + + def reset(self): + codecs.BufferedIncrementalDecoder.reset(self) + self.first = True + +class StreamWriter(codecs.StreamWriter): + def reset(self): + codecs.StreamWriter.reset(self) + try: + del self.encode + except AttributeError: + pass + + def encode(self, input, errors='strict'): + self.encode = codecs.utf_8_encode + return encode(input, errors) + +class StreamReader(codecs.StreamReader): + def reset(self): + codecs.StreamReader.reset(self) + try: + del self.decode + except AttributeError: + pass + + def decode(self, input, errors='strict'): + if len(input) < 3: + if codecs.BOM_UTF8.startswith(input): + # not enough data to decide if this is a BOM + # => try again on the next call + return (u"", 0) + elif input[:3] == codecs.BOM_UTF8: + self.decode = codecs.utf_8_decode + (output, consumed) = codecs.utf_8_decode(input[3:],errors) + return (output, consumed+3) + # (else) no BOM present + self.decode = codecs.utf_8_decode + return codecs.utf_8_decode(input, errors) + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-8-sig', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_8_sig.pyc b/PythonEnv/2.7/Lib/encodings/utf_8_sig.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a060efd083c72d8deaa36412f7dc882a6f95b469 GIT binary patch literal 4925 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/encodings/zlib_codec.py b/PythonEnv/2.7/Lib/encodings/zlib_codec.py new file mode 100644 index 0000000000..3419f9f48f --- /dev/null +++ b/PythonEnv/2.7/Lib/encodings/zlib_codec.py @@ -0,0 +1,102 @@ +""" Python 'zlib_codec' Codec - zlib compression encoding + + Unlike most of the other codecs which target Unicode, this codec + will return Python string objects for both encode and decode. + + Written by Marc-Andre Lemburg (mal@lemburg.com). + +""" +import codecs +import zlib # this codec needs the optional zlib module ! + +### Codec APIs + +def zlib_encode(input,errors='strict'): + + """ Encodes the object input and returns a tuple (output + object, length consumed). + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + output = zlib.compress(input) + return (output, len(input)) + +def zlib_decode(input,errors='strict'): + + """ Decodes the object input and returns a tuple (output + object, length consumed). + + input must be an object which provides the bf_getreadbuf + buffer slot. Python strings, buffer objects and memory + mapped files are examples of objects providing this slot. + + errors defines the error handling to apply. It defaults to + 'strict' handling which is the only currently supported + error handling for this codec. + + """ + assert errors == 'strict' + output = zlib.decompress(input) + return (output, len(input)) + +class Codec(codecs.Codec): + + def encode(self, input, errors='strict'): + return zlib_encode(input, errors) + def decode(self, input, errors='strict'): + return zlib_decode(input, errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + assert errors == 'strict' + self.errors = errors + self.compressobj = zlib.compressobj() + + def encode(self, input, final=False): + if final: + c = self.compressobj.compress(input) + return c + self.compressobj.flush() + else: + return self.compressobj.compress(input) + + def reset(self): + self.compressobj = zlib.compressobj() + +class IncrementalDecoder(codecs.IncrementalDecoder): + def __init__(self, errors='strict'): + assert errors == 'strict' + self.errors = errors + self.decompressobj = zlib.decompressobj() + + def decode(self, input, final=False): + if final: + c = self.decompressobj.decompress(input) + return c + self.decompressobj.flush() + else: + return self.decompressobj.decompress(input) + + def reset(self): + self.decompressobj = zlib.decompressobj() + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='zlib', + encode=zlib_encode, + decode=zlib_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/PythonEnv/2.7/Lib/encodings/zlib_codec.pyc b/PythonEnv/2.7/Lib/encodings/zlib_codec.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0ff2c53aca53dc5873da1dfeb6af4459b2f71fb GIT binary patch literal 4563 zcmdT{S#KOg5boLa9^Pzh#~i`nhZaKeMoKJ*I3zA5aS|zlSZJ&Wu#8r-GrjgWbF8L& z35&uD$rC?}7k&;Bukd}`H?C!1U?y0WhtE%q$pBFn%e;ePA)%2<3_Xe8% z9bKZ-KKeieE*^W3NXxwjIE(cW5eOy;VdLoff096Y;&iR!7>6N14&Ra_lfC2BBrW>Q{AUibE(K zmxUeYCZXt@=3}a=tSk&MOpEC@GNg}SpN#f%rH)3UY_hHIIj)Pw8La8bIg2f?`_|$U z?=kpCd|6}@9gnNZ6b_Ufk49zXOfvue#D4VC!nspXLl{K$me9EsbT_Rvl>?OSP<+R6 zg3Pr+%zy@qDh17Z{B;dz|GnYXnPSI5+Cv)GTjp< zIO@DBeaM*gF-m={$%YGcUrsZq~Xrw+`Z75mzQhQjRiTWUA*K ze+BEFcf7%o#5*2GlDeD+8VU#?dr8!i_-J)DK>)XZz6=r&&>i)#rjF}8%q^{rp7;Joe1na@FhYvNJ>+}U) zfamH8r9Q?#vWAx`V8OOHaZnFq1>ffOpa`GxQy4umO`Dz-64;!AEAkxn?bkHZJi8_+fs2~ ztj;%)2}F0*?b-HCVz-{8cXoIvy4sl3m$`W4zaMFNFA zYb1n3G;`j61VQ)~*HCy_y-@!2_}>7NJKT-2HpM@~c#r40ocAHKKt9uh#Ah3XFAB){ zpq0g2FLPE=we zT*2Tmp2l%6qS5@oBXMDm9+S%s?~<`~++B`(_ljXD2e6RG9m$6wK@n2(kj^-RGo?h! z9pMnCjB4@&*jeUsg>u?_=C8*C3M|88P*TP?_Ph()8-=2K;kf7-2`QWx^F2^!5tCbd f?oV7_lD14Xh=!oM)LrSWZ?rbnHr6)ln~i?}G&jLv literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/fnmatch.py b/PythonEnv/2.7/Lib/fnmatch.py new file mode 100644 index 0000000000..ffe99b5762 --- /dev/null +++ b/PythonEnv/2.7/Lib/fnmatch.py @@ -0,0 +1,116 @@ +"""Filename matching with shell patterns. + +fnmatch(FILENAME, PATTERN) matches according to the local convention. +fnmatchcase(FILENAME, PATTERN) always takes case in account. + +The functions operate by translating the pattern into a regular +expression. They cache the compiled regular expressions for speed. + +The function translate(PATTERN) returns a regular expression +corresponding to PATTERN. (It does not compile it.) +""" + +import re + +__all__ = ["filter", "fnmatch", "fnmatchcase", "translate"] + +_cache = {} +_MAXCACHE = 100 + +def _purge(): + """Clear the pattern cache""" + _cache.clear() + +def fnmatch(name, pat): + """Test whether FILENAME matches PATTERN. + + Patterns are Unix shell style: + + * matches everything + ? matches any single character + [seq] matches any character in seq + [!seq] matches any char not in seq + + An initial period in FILENAME is not special. + Both FILENAME and PATTERN are first case-normalized + if the operating system requires it. + If you don't want this, use fnmatchcase(FILENAME, PATTERN). + """ + + import os + name = os.path.normcase(name) + pat = os.path.normcase(pat) + return fnmatchcase(name, pat) + +def filter(names, pat): + """Return the subset of the list NAMES that match PAT""" + import os,posixpath + result=[] + pat=os.path.normcase(pat) + if not pat in _cache: + res = translate(pat) + if len(_cache) >= _MAXCACHE: + _cache.clear() + _cache[pat] = re.compile(res) + match=_cache[pat].match + if os.path is posixpath: + # normcase on posix is NOP. Optimize it away from the loop. + for name in names: + if match(name): + result.append(name) + else: + for name in names: + if match(os.path.normcase(name)): + result.append(name) + return result + +def fnmatchcase(name, pat): + """Test whether FILENAME matches PATTERN, including case. + + This is a version of fnmatch() which doesn't case-normalize + its arguments. + """ + + if not pat in _cache: + res = translate(pat) + if len(_cache) >= _MAXCACHE: + _cache.clear() + _cache[pat] = re.compile(res) + return _cache[pat].match(name) is not None + +def translate(pat): + """Translate a shell PATTERN to a regular expression. + + There is no way to quote meta-characters. + """ + + i, n = 0, len(pat) + res = '' + while i < n: + c = pat[i] + i = i+1 + if c == '*': + res = res + '.*' + elif c == '?': + res = res + '.' + elif c == '[': + j = i + if j < n and pat[j] == '!': + j = j+1 + if j < n and pat[j] == ']': + j = j+1 + while j < n and pat[j] != ']': + j = j+1 + if j >= n: + res = res + '\\[' + else: + stuff = pat[i:j].replace('\\','\\\\') + i = j+1 + if stuff[0] == '!': + stuff = '^' + stuff[1:] + elif stuff[0] == '^': + stuff = '\\' + stuff + res = '%s[%s]' % (res, stuff) + else: + res = res + re.escape(c) + return res + '\Z(?ms)' diff --git a/PythonEnv/2.7/Lib/fnmatch.pyc b/PythonEnv/2.7/Lib/fnmatch.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a375f6d4d64103c3362e337607ed430fc1c4d628 GIT binary patch literal 3756 zcmcIn-EJF26h6C7oY>7@f73`sOeqOwU#wBb?&84OO)2F54pIl7pwNux?( zT^bVi=7wddQQ8zmj}G_qY~x;l%ljcB6 z;2ZsKn*8{w-#5zoyHLkMDoR9co>-h=9Xi{260k0#(w@$ItJQX2+00K&>|5CzLgl%! z8Yl5praO7;XLWth%d|0k5~ZN5k39m2^I3y*uLo0v17US6Y*ahVl<8?5zIKS=#=0@I zMy72JlO1n6qNxr8;RL-j8JMYDhVwM;TNS3bcaqw{X;fsJSL)H<_^jG0o~#|kcn~|m z&Ei4qiQ_g~%+}B!*h5D^5)Cni=cYR-W`<>mb{u*}PaCMFqJQH-=I z5^{(w8L;CJ4p_K>1|3)CF1q2(RtGrBw_A^*WGQZEIviw5D>D~`5X<-MA{ez93E&pP@HR2n`axdH#Fltpgy5jv%>5FNR6=<>~W&>(u|&=HM{ z;Kmqn$X0mv5MA~LR%d>NdDgYD>Slp9iILC_mHcVGmKF+8Sakfg?P8!+zLNi_Ietia<*d2^X(_5&P5&|}Yf3sCmh z_0FRhJ_yZCIj8UyDDwaxQ=nXh+$fZXA>gP&9e{gGpbUHiz5^(ufqU#uP+pTI;l+NsmwxJW>+L$`QTS_?ZT=%`xmby%U@Ny>hsgEsrj z-OWpMG(m@$p5V3F3p#|}sj}Q24x8Zj&bs!!il}qLh+8Sgp)3pp3`7EW3MC zJi+V@u;;Orz0mYdvP2zK1Er|m7BJLgbl-D&jZQJ;6t z6i{SKa1khmXfU)$ptVBQ89>Wrn_!%w1#AFXHzb+>Y=|ZdqH)?0^st0z5ok$kVF%ce zwZQgnZ4i0B$8P_Ne6ND1f;gA>$lYgt7)QzSmap?2%N?E+jw9m zF?lG47fl>LZNOZ^Xl2NW#4iP_@KcE8T?9bHNhE@xm4j~_JTqeEE&%$YQ$)oDW*W&l z=OGJ!48briWe*8#fGl(#3->R`L{%mdnV1-zn3Rd{So;xZ3BO{GpZOH%E+AQDo#-QR ztzhXm0X)ZozYhiLB8dK|;KAaE>|dj@70S>b%I^OGN-4GnR?j5Ir2 zkRylFoDwkkmFsbRq|?suxGg7~k)aB`I}f?!ouR;t9JB904c5pc=zNw_N=o!q25KAMv^7Xnw81crtBN>t$Z6f$Jh8FH;cCu!ni=NP;=^292CVf;a*x^5azP z=P7b!L^}W4FmWh>j{hWpU#=pC4ji3mQL?S(qI7Oc-IV&V)EA}R6rt8*!z)@vrzJCA z83x~F^Z2saG>pa8M&tILxgx|@UIGX`vS#$fQqW8L7=lv9p5RCXHlxo1+=-m>&)<&yMXyQ=OoIsbK0GE z8cgqU)vc{C4Ysz5tMdJ}w){B8fW#nS6*ie93PRqJrATl(zMZt*Sd5UQ=+<5u=CS^m a!<9LOs_IU;r`)Pjb!%g_v$b=znSTJra&SBV literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/genericpath.py b/PythonEnv/2.7/Lib/genericpath.py new file mode 100644 index 0000000000..a0bf6013e9 --- /dev/null +++ b/PythonEnv/2.7/Lib/genericpath.py @@ -0,0 +1,105 @@ +""" +Path operations common to more than one OS +Do not use directly. The OS specific modules import the appropriate +functions from this module themselves. +""" +import os +import stat + +__all__ = ['commonprefix', 'exists', 'getatime', 'getctime', 'getmtime', + 'getsize', 'isdir', 'isfile'] + + +# Does a path exist? +# This is false for dangling symbolic links on systems that support them. +def exists(path): + """Test whether a path exists. Returns False for broken symbolic links""" + try: + os.stat(path) + except os.error: + return False + return True + + +# This follows symbolic links, so both islink() and isdir() can be true +# for the same path ono systems that support symlinks +def isfile(path): + """Test whether a path is a regular file""" + try: + st = os.stat(path) + except os.error: + return False + return stat.S_ISREG(st.st_mode) + + +# Is a path a directory? +# This follows symbolic links, so both islink() and isdir() +# can be true for the same path on systems that support symlinks +def isdir(s): + """Return true if the pathname refers to an existing directory.""" + try: + st = os.stat(s) + except os.error: + return False + return stat.S_ISDIR(st.st_mode) + + +def getsize(filename): + """Return the size of a file, reported by os.stat().""" + return os.stat(filename).st_size + + +def getmtime(filename): + """Return the last modification time of a file, reported by os.stat().""" + return os.stat(filename).st_mtime + + +def getatime(filename): + """Return the last access time of a file, reported by os.stat().""" + return os.stat(filename).st_atime + + +def getctime(filename): + """Return the metadata change time of a file, reported by os.stat().""" + return os.stat(filename).st_ctime + + +# Return the longest prefix of all list elements. +def commonprefix(m): + "Given a list of pathnames, returns the longest common leading component" + if not m: return '' + s1 = min(m) + s2 = max(m) + for i, c in enumerate(s1): + if c != s2[i]: + return s1[:i] + return s1 + +# Split a path in root and extension. +# The extension is everything starting at the last dot in the last +# pathname component; the root is everything before that. +# It is always true that root + ext == p. + +# Generic implementation of splitext, to be parametrized with +# the separators +def _splitext(p, sep, altsep, extsep): + """Split the extension from a pathname. + + Extension is everything from the last dot to the end, ignoring + leading dots. Returns "(root, ext)"; ext may be empty.""" + + sepIndex = p.rfind(sep) + if altsep: + altsepIndex = p.rfind(altsep) + sepIndex = max(sepIndex, altsepIndex) + + dotIndex = p.rfind(extsep) + if dotIndex > sepIndex: + # skip all leading dots + filenameIndex = sepIndex + 1 + while filenameIndex < dotIndex: + if p[filenameIndex] != extsep: + return p[:dotIndex], p[dotIndex:] + filenameIndex += 1 + + return p, '' diff --git a/PythonEnv/2.7/Lib/genericpath.pyc b/PythonEnv/2.7/Lib/genericpath.pyc new file mode 100644 index 0000000000000000000000000000000000000000..207b17bb6631655efeab36391b007e52fe3ad77a GIT binary patch literal 3633 zcmcIn&2Jk;6o0$^NbNWzX+cmfj4D8GRa~_~RM1kWno@cIs&!FOFj(u|u`|u?>~>}x zVw9Zd331^D2X09Gf&2mRd$V?$MwOrx+nMJ#-|zkAeWmv2TKn;j)6Wu`e@@}|V>J6S zNJ_K~8c-Ti7SJ}BiVtZ!q_jq9oze!SO-ffNJw<7Y(l$*_(Ke=5=`prrLB}&#w&ocu ze#tY~vhEpd-0%#xZ+fOp>1ofbQhLTS9hRZreVIl31*Cm1b~~adrHP#?v=vE_=YLiOXg^A@1++q_Cw-)L13hmQFKih04pqI2<5F zT$ZLNjf$OYkEc4RZW@~+$F#EZExa_hGTW23*H(Yw^SSFl#7d&l$g$dYO$^9=Wu0{l z@kBbvoy$cBM?dN0zOzy-v+8^48sL?M@ctZS$10OafI)6Nc?-?H12WqrNAxhD1EL=S z3LfZJsLmrH?Y7BuDF^~rqyAT}4mf$c-2%BUtrOqvNT^~&EJ_Bq5*J8C(oGE@{v^%- z;kYnjWQtv>g`MT2A_I1r(z~|Hg18W*us9tjLq{*VGzO6Jv_Ha6-ZxX}@Ao~vu#0)} z#C{4c{a`RrZf80gJW%>(Ha0Rn#*LI7Y{}7dGPpN$JB7Zj_XbybR|lCI4JJ}cqY^%| zSI#0am?F=6SVRS?H7-yh!XN4M{I-nt=-Q+8R{XpL7eXWg;@ zf!SCZ%Z?3?_BN^XWbVj?nf3k|$E~|j z#0KC2bl&Ep4ep~Y!{GQ~-$r{DetbK>o_AOl;<&fMN#|B{88Zt|5QsPkh++&2V#~P* zOgKi#RE%b#uswFP?)hG~#=DLzYGFIPx$-og;sY4hWhu|zbP3I}mJ}XEsehp~V{%OC zEJjR%;d6BML0)iNe0~^MYjz>t?Qw`Wi!4ij4t($OjnA+DhuC&f|2Rpch4sIP=04Lb zUvpOY{r{%<&8Ia-DvZYy z!|kgKjSPd3H0MLwzrxWSNd*~Y>zg-e5Yl0d4v}Z@hlv`U-K~+i#7oc-{YRJR0r8P|}^dyB!4VLxp67r_+rI^eI9KH63D3z~F*zdG&K$^6C) zUi8(&725xZ4pw+>m&p9ehoXBH&%{smlkYc4@Nkpf7$ewY8e6Yo>!WW`X!vVT=kku8dQ|Q^sV&M~;cL*UPUB$SYqteHw~yvgZOA=oP#W=@&MQ{DIfv8~wJ@?N z+kn*RMWH6TFj(e~SeOA8*<+>OxvnV+cM^rJMB>zkl=^NR?#S z^37Q3G~z;{%a7m4T2l3S5^_}?u7ei2%#U<2 zu!L;xjeThO4It8&xWlrV)Lajm!Fq5yTn{>78{9^4I@k=mzCPm$YB)@bWH>yLkB7rJ z%P{Kk;$@L90~xP~%{AgE8nMAfXcS!ld7_!;{@3c*BYwU5-{%HPVfn$D>_yOQz0q22 Oby}@f!+)Et&A$PVpj(0f literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/linecache.py b/PythonEnv/2.7/Lib/linecache.py new file mode 100644 index 0000000000..811f27fe36 --- /dev/null +++ b/PythonEnv/2.7/Lib/linecache.py @@ -0,0 +1,135 @@ +"""Cache lines from files. + +This is intended to read lines from modules imported -- hence if a filename +is not found, it will look down the module search path for a file by +that name. +""" + +import sys +import os + +__all__ = ["getline", "clearcache", "checkcache"] + +def getline(filename, lineno, module_globals=None): + lines = getlines(filename, module_globals) + if 1 <= lineno <= len(lines): + return lines[lineno-1] + else: + return '' + + +# The cache + +cache = {} # The cache + + +def clearcache(): + """Clear the cache entirely.""" + + global cache + cache = {} + + +def getlines(filename, module_globals=None): + """Get the lines for a file from the cache. + Update the cache if it doesn't contain an entry for this file already.""" + + if filename in cache: + return cache[filename][2] + else: + return updatecache(filename, module_globals) + + +def checkcache(filename=None): + """Discard cache entries that are out of date. + (This is not checked upon each call!)""" + + if filename is None: + filenames = cache.keys() + else: + if filename in cache: + filenames = [filename] + else: + return + + for filename in filenames: + size, mtime, lines, fullname = cache[filename] + if mtime is None: + continue # no-op for files loaded via a __loader__ + try: + stat = os.stat(fullname) + except os.error: + del cache[filename] + continue + if size != stat.st_size or mtime != stat.st_mtime: + del cache[filename] + + +def updatecache(filename, module_globals=None): + """Update a cache entry and return its list of lines. + If something's wrong, print a message, discard the cache entry, + and return an empty list.""" + + if filename in cache: + del cache[filename] + if not filename or (filename.startswith('<') and filename.endswith('>')): + return [] + + fullname = filename + try: + stat = os.stat(fullname) + except OSError: + basename = filename + + # Try for a __loader__, if available + if module_globals and '__loader__' in module_globals: + name = module_globals.get('__name__') + loader = module_globals['__loader__'] + get_source = getattr(loader, 'get_source', None) + + if name and get_source: + try: + data = get_source(name) + except (ImportError, IOError): + pass + else: + if data is None: + # No luck, the PEP302 loader cannot find the source + # for this module. + return [] + cache[filename] = ( + len(data), None, + [line+'\n' for line in data.splitlines()], fullname + ) + return cache[filename][2] + + # Try looking through the module search path, which is only useful + # when handling a relative filename. + if os.path.isabs(filename): + return [] + + for dirname in sys.path: + # When using imputil, sys.path may contain things other than + # strings; ignore them when it happens. + try: + fullname = os.path.join(dirname, basename) + except (TypeError, AttributeError): + # Not sufficiently string-like to do anything useful with. + continue + try: + stat = os.stat(fullname) + break + except os.error: + pass + else: + return [] + try: + with open(fullname, 'rU') as fp: + lines = fp.readlines() + except IOError: + return [] + if lines and not lines[-1].endswith('\n'): + lines[-1] += '\n' + size, mtime = stat.st_size, stat.st_mtime + cache[filename] = size, mtime, lines, fullname + return lines diff --git a/PythonEnv/2.7/Lib/linecache.pyc b/PythonEnv/2.7/Lib/linecache.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a25f78daa33efe126dab96cca63928f65dc6e81f GIT binary patch literal 3433 zcmcIn-EJF26h5=-pLpvuA?cqBs-{S&Mx?ob3sgu8RZ|cbq_Ck%RJmAd@7msYv+L}P zX1-D%A0EkE66%Y>q-#NRf^8l^m8K0Rsb7szW{wD6ftKN&3)35tf zeq8*1j%Ft4LZV0L6@?BZiXMR|Xons-6uJ~vD6G=ZrAMGKQ==DPt5Qr9)F`ae3rMKT z(uypt2;C66A+#s7$Mk;t9H0Cfx_d!?6zL>RBclg-cB}_+5}9q!`)(8)&EM2UX&8mt zW;&08@GS3f7EZyfb43+*tSH+ei;+vu6=9e<$l{Yh%Ig%)C^95vuA!bEvjaP7cfO8&X0YP_|WW69U zwpy;5HVBf=d;u!_q%(}|Xxi%>#Od8+kVoMesu!o7-KaMmcD|X}QI_6Mf9QO;{c$IW zduVASfNW1@J_}t%GkjT6YwBIqboxy5hZPc}7+Cf)anF5G&$M`v!4}JjL>;9z&ZA_u zz1J2n`1Z20y!~refe*ThW*Bs;^!bMyBQBSJ9|UX+OOI=mUnx!Af(cvuY+L8MtPG2#8%l(*w~A)lp2p|lBn)hH1_}5+Ts+JoliskppQSd4QyruXQ9cu| zwj5mS20BPMsAk(S-+NEs^%-)@5jqvo1&X}xv%~mouO+Cj(Ouq{SnhcCG$vMiuRxW#CY#Men|^xDEPNJ z6plTL7c%hK%M53QU-H#^a-oa3`N$NCJAR9e+@Hl#(!9o z573N8$NsbCun$$7Rdq=Bc z2IZDr4ep5JTx!ATU<|kvig4JV=PoTUtjdNu_p^1H%M5Q@!Eu-2p$$SEf>M0w-|VC( zx76VrmAN6I^AGWj5$Kr0Hq2rS`l!j#wEK9S77d!Cc-QFi_YR$S3T{29l(6g+<*S9- z-`YRfQ9y}9VwH~0GcXK^ulRtc&&aOv!tUcCEj*gFP8o4$kLFMn@#o;qS8?aJ$Znk8 z`4VHbh&m!!W; z&SI4ofMJ#9=$m~05;u&?_s`F8yfS+SX99kPTpi-AW2bqFOm6VvF%tDs4vMhF>x(rrS-jAdK>ES0cIF!*I6*LXA=}t zX6NcDcJbfB$lpNMW+j%T(!az*QH-;2FEGX9i^VKoVS=y!Hs(Y=5_}*8%NFIsI2Uft zaf6AZRsRBL|023KlTI1pT{P1{N7bhC)O)Jp6lru-)!Yrd+B~&^BZ-sH2t`3$4ap!j^a^`>rU}RzQd0Z!?vzTfkBz^YHp+6^qQ^z0XoX~ AJOBUy literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/locale.py b/PythonEnv/2.7/Lib/locale.py new file mode 100644 index 0000000000..7ddfdb782c --- /dev/null +++ b/PythonEnv/2.7/Lib/locale.py @@ -0,0 +1,1882 @@ +""" Locale support. + + The module provides low-level access to the C lib's locale APIs + and adds high level number formatting APIs as well as a locale + aliasing engine to complement these. + + The aliasing engine includes support for many commonly used locale + names and maps them to values suitable for passing to the C lib's + setlocale() function. It also includes default encodings for all + supported locale names. + +""" + +import sys +import encodings +import encodings.aliases +import re +import operator +import functools + +try: + _unicode = unicode +except NameError: + # If Python is built without Unicode support, the unicode type + # will not exist. Fake one. + class _unicode(object): + pass + +# Try importing the _locale module. +# +# If this fails, fall back on a basic 'C' locale emulation. + +# Yuck: LC_MESSAGES is non-standard: can't tell whether it exists before +# trying the import. So __all__ is also fiddled at the end of the file. +__all__ = ["getlocale", "getdefaultlocale", "getpreferredencoding", "Error", + "setlocale", "resetlocale", "localeconv", "strcoll", "strxfrm", + "str", "atof", "atoi", "format", "format_string", "currency", + "normalize", "LC_CTYPE", "LC_COLLATE", "LC_TIME", "LC_MONETARY", + "LC_NUMERIC", "LC_ALL", "CHAR_MAX"] + +try: + + from _locale import * + +except ImportError: + + # Locale emulation + + CHAR_MAX = 127 + LC_ALL = 6 + LC_COLLATE = 3 + LC_CTYPE = 0 + LC_MESSAGES = 5 + LC_MONETARY = 4 + LC_NUMERIC = 1 + LC_TIME = 2 + Error = ValueError + + def localeconv(): + """ localeconv() -> dict. + Returns numeric and monetary locale-specific parameters. + """ + # 'C' locale default values + return {'grouping': [127], + 'currency_symbol': '', + 'n_sign_posn': 127, + 'p_cs_precedes': 127, + 'n_cs_precedes': 127, + 'mon_grouping': [], + 'n_sep_by_space': 127, + 'decimal_point': '.', + 'negative_sign': '', + 'positive_sign': '', + 'p_sep_by_space': 127, + 'int_curr_symbol': '', + 'p_sign_posn': 127, + 'thousands_sep': '', + 'mon_thousands_sep': '', + 'frac_digits': 127, + 'mon_decimal_point': '', + 'int_frac_digits': 127} + + def setlocale(category, value=None): + """ setlocale(integer,string=None) -> string. + Activates/queries locale processing. + """ + if value not in (None, '', 'C'): + raise Error, '_locale emulation only supports "C" locale' + return 'C' + + def strcoll(a,b): + """ strcoll(string,string) -> int. + Compares two strings according to the locale. + """ + return cmp(a,b) + + def strxfrm(s): + """ strxfrm(string) -> string. + Returns a string that behaves for cmp locale-aware. + """ + return s + + +_localeconv = localeconv + +# With this dict, you can override some items of localeconv's return value. +# This is useful for testing purposes. +_override_localeconv = {} + +@functools.wraps(_localeconv) +def localeconv(): + d = _localeconv() + if _override_localeconv: + d.update(_override_localeconv) + return d + + +### Number formatting APIs + +# Author: Martin von Loewis +# improved by Georg Brandl + +# Iterate over grouping intervals +def _grouping_intervals(grouping): + last_interval = None + for interval in grouping: + # if grouping is -1, we are done + if interval == CHAR_MAX: + return + # 0: re-use last group ad infinitum + if interval == 0: + if last_interval is None: + raise ValueError("invalid grouping") + while True: + yield last_interval + yield interval + last_interval = interval + +#perform the grouping from right to left +def _group(s, monetary=False): + conv = localeconv() + thousands_sep = conv[monetary and 'mon_thousands_sep' or 'thousands_sep'] + grouping = conv[monetary and 'mon_grouping' or 'grouping'] + if not grouping: + return (s, 0) + if s[-1] == ' ': + stripped = s.rstrip() + right_spaces = s[len(stripped):] + s = stripped + else: + right_spaces = '' + left_spaces = '' + groups = [] + for interval in _grouping_intervals(grouping): + if not s or s[-1] not in "0123456789": + # only non-digit characters remain (sign, spaces) + left_spaces = s + s = '' + break + groups.append(s[-interval:]) + s = s[:-interval] + if s: + groups.append(s) + groups.reverse() + return ( + left_spaces + thousands_sep.join(groups) + right_spaces, + len(thousands_sep) * (len(groups) - 1) + ) + +# Strip a given amount of excess padding from the given string +def _strip_padding(s, amount): + lpos = 0 + while amount and s[lpos] == ' ': + lpos += 1 + amount -= 1 + rpos = len(s) - 1 + while amount and s[rpos] == ' ': + rpos -= 1 + amount -= 1 + return s[lpos:rpos+1] + +_percent_re = re.compile(r'%(?:\((?P.*?)\))?' + r'(?P[-#0-9 +*.hlL]*?)[eEfFgGdiouxXcrs%]') + +def format(percent, value, grouping=False, monetary=False, *additional): + """Returns the locale-aware substitution of a %? specifier + (percent). + + additional is for format strings which contain one or more + '*' modifiers.""" + # this is only for one-percent-specifier strings and this should be checked + match = _percent_re.match(percent) + if not match or len(match.group())!= len(percent): + raise ValueError(("format() must be given exactly one %%char " + "format specifier, %s not valid") % repr(percent)) + return _format(percent, value, grouping, monetary, *additional) + +def _format(percent, value, grouping=False, monetary=False, *additional): + if additional: + formatted = percent % ((value,) + additional) + else: + formatted = percent % value + # floats and decimal ints need special action! + if percent[-1] in 'eEfFgG': + seps = 0 + parts = formatted.split('.') + if grouping: + parts[0], seps = _group(parts[0], monetary=monetary) + decimal_point = localeconv()[monetary and 'mon_decimal_point' + or 'decimal_point'] + formatted = decimal_point.join(parts) + if seps: + formatted = _strip_padding(formatted, seps) + elif percent[-1] in 'diu': + seps = 0 + if grouping: + formatted, seps = _group(formatted, monetary=monetary) + if seps: + formatted = _strip_padding(formatted, seps) + return formatted + +def format_string(f, val, grouping=False): + """Formats a string in the same way that the % formatting would use, + but takes the current locale into account. + Grouping is applied if the third parameter is true.""" + percents = list(_percent_re.finditer(f)) + new_f = _percent_re.sub('%s', f) + + if operator.isMappingType(val): + new_val = [] + for perc in percents: + if perc.group()[-1]=='%': + new_val.append('%') + else: + new_val.append(format(perc.group(), val, grouping)) + else: + if not isinstance(val, tuple): + val = (val,) + new_val = [] + i = 0 + for perc in percents: + if perc.group()[-1]=='%': + new_val.append('%') + else: + starcount = perc.group('modifiers').count('*') + new_val.append(_format(perc.group(), + val[i], + grouping, + False, + *val[i+1:i+1+starcount])) + i += (1 + starcount) + val = tuple(new_val) + + return new_f % val + +def currency(val, symbol=True, grouping=False, international=False): + """Formats val according to the currency settings + in the current locale.""" + conv = localeconv() + + # check for illegal values + digits = conv[international and 'int_frac_digits' or 'frac_digits'] + if digits == 127: + raise ValueError("Currency formatting is not possible using " + "the 'C' locale.") + + s = format('%%.%if' % digits, abs(val), grouping, monetary=True) + # '<' and '>' are markers if the sign must be inserted between symbol and value + s = '<' + s + '>' + + if symbol: + smb = conv[international and 'int_curr_symbol' or 'currency_symbol'] + precedes = conv[val<0 and 'n_cs_precedes' or 'p_cs_precedes'] + separated = conv[val<0 and 'n_sep_by_space' or 'p_sep_by_space'] + + if precedes: + s = smb + (separated and ' ' or '') + s + else: + s = s + (separated and ' ' or '') + smb + + sign_pos = conv[val<0 and 'n_sign_posn' or 'p_sign_posn'] + sign = conv[val<0 and 'negative_sign' or 'positive_sign'] + + if sign_pos == 0: + s = '(' + s + ')' + elif sign_pos == 1: + s = sign + s + elif sign_pos == 2: + s = s + sign + elif sign_pos == 3: + s = s.replace('<', sign) + elif sign_pos == 4: + s = s.replace('>', sign) + else: + # the default if nothing specified; + # this should be the most fitting sign position + s = sign + s + + return s.replace('<', '').replace('>', '') + +def str(val): + """Convert float to integer, taking the locale into account.""" + return format("%.12g", val) + +def atof(string, func=float): + "Parses a string as a float according to the locale settings." + #First, get rid of the grouping + ts = localeconv()['thousands_sep'] + if ts: + string = string.replace(ts, '') + #next, replace the decimal point with a dot + dd = localeconv()['decimal_point'] + if dd: + string = string.replace(dd, '.') + #finally, parse the string + return func(string) + +def atoi(str): + "Converts a string to an integer according to the locale settings." + return atof(str, int) + +def _test(): + setlocale(LC_ALL, "") + #do grouping + s1 = format("%d", 123456789,1) + print s1, "is", atoi(s1) + #standard formatting + s1 = str(3.14) + print s1, "is", atof(s1) + +### Locale name aliasing engine + +# Author: Marc-Andre Lemburg, mal@lemburg.com +# Various tweaks by Fredrik Lundh + +# store away the low-level version of setlocale (it's +# overridden below) +_setlocale = setlocale + +# Avoid relying on the locale-dependent .lower() method +# (see issue #1813). +_ascii_lower_map = ''.join( + chr(x + 32 if x >= ord('A') and x <= ord('Z') else x) + for x in range(256) +) + +def normalize(localename): + + """ Returns a normalized locale code for the given locale + name. + + The returned locale code is formatted for use with + setlocale(). + + If normalization fails, the original name is returned + unchanged. + + If the given encoding is not known, the function defaults to + the default encoding for the locale code just like setlocale() + does. + + """ + # Normalize the locale name and extract the encoding + if isinstance(localename, _unicode): + localename = localename.encode('ascii') + fullname = localename.translate(_ascii_lower_map) + if ':' in fullname: + # ':' is sometimes used as encoding delimiter. + fullname = fullname.replace(':', '.') + if '.' in fullname: + langname, encoding = fullname.split('.')[:2] + fullname = langname + '.' + encoding + else: + langname = fullname + encoding = '' + + # First lookup: fullname (possibly with encoding) + norm_encoding = encoding.replace('-', '') + norm_encoding = norm_encoding.replace('_', '') + lookup_name = langname + '.' + encoding + code = locale_alias.get(lookup_name, None) + if code is not None: + return code + #print 'first lookup failed' + + # Second try: langname (without encoding) + code = locale_alias.get(langname, None) + if code is not None: + #print 'langname lookup succeeded' + if '.' in code: + langname, defenc = code.split('.') + else: + langname = code + defenc = '' + if encoding: + # Convert the encoding to a C lib compatible encoding string + norm_encoding = encodings.normalize_encoding(encoding) + #print 'norm encoding: %r' % norm_encoding + norm_encoding = encodings.aliases.aliases.get(norm_encoding, + norm_encoding) + #print 'aliased encoding: %r' % norm_encoding + encoding = locale_encoding_alias.get(norm_encoding, + norm_encoding) + else: + encoding = defenc + #print 'found encoding %r' % encoding + if encoding: + return langname + '.' + encoding + else: + return langname + + else: + return localename + +def _parse_localename(localename): + + """ Parses the locale code for localename and returns the + result as tuple (language code, encoding). + + The localename is normalized and passed through the locale + alias engine. A ValueError is raised in case the locale name + cannot be parsed. + + The language code corresponds to RFC 1766. code and encoding + can be None in case the values cannot be determined or are + unknown to this implementation. + + """ + code = normalize(localename) + if '@' in code: + # Deal with locale modifiers + code, modifier = code.split('@') + if modifier == 'euro' and '.' not in code: + # Assume Latin-9 for @euro locales. This is bogus, + # since some systems may use other encodings for these + # locales. Also, we ignore other modifiers. + return code, 'iso-8859-15' + + if '.' in code: + return tuple(code.split('.')[:2]) + elif code == 'C': + return None, None + raise ValueError, 'unknown locale: %s' % localename + +def _build_localename(localetuple): + + """ Builds a locale code from the given tuple (language code, + encoding). + + No aliasing or normalizing takes place. + + """ + language, encoding = localetuple + if language is None: + language = 'C' + if encoding is None: + return language + else: + return language + '.' + encoding + +def getdefaultlocale(envvars=('LC_ALL', 'LC_CTYPE', 'LANG', 'LANGUAGE')): + + """ Tries to determine the default locale settings and returns + them as tuple (language code, encoding). + + According to POSIX, a program which has not called + setlocale(LC_ALL, "") runs using the portable 'C' locale. + Calling setlocale(LC_ALL, "") lets it use the default locale as + defined by the LANG variable. Since we don't want to interfere + with the current locale setting we thus emulate the behavior + in the way described above. + + To maintain compatibility with other platforms, not only the + LANG variable is tested, but a list of variables given as + envvars parameter. The first found to be defined will be + used. envvars defaults to the search path used in GNU gettext; + it must always contain the variable name 'LANG'. + + Except for the code 'C', the language code corresponds to RFC + 1766. code and encoding can be None in case the values cannot + be determined. + + """ + + try: + # check if it's supported by the _locale module + import _locale + code, encoding = _locale._getdefaultlocale() + except (ImportError, AttributeError): + pass + else: + # make sure the code/encoding values are valid + if sys.platform == "win32" and code and code[:2] == "0x": + # map windows language identifier to language name + code = windows_locale.get(int(code, 0)) + # ...add other platform-specific processing here, if + # necessary... + return code, encoding + + # fall back on POSIX behaviour + import os + lookup = os.environ.get + for variable in envvars: + localename = lookup(variable,None) + if localename: + if variable == 'LANGUAGE': + localename = localename.split(':')[0] + break + else: + localename = 'C' + return _parse_localename(localename) + + +def getlocale(category=LC_CTYPE): + + """ Returns the current setting for the given locale category as + tuple (language code, encoding). + + category may be one of the LC_* value except LC_ALL. It + defaults to LC_CTYPE. + + Except for the code 'C', the language code corresponds to RFC + 1766. code and encoding can be None in case the values cannot + be determined. + + """ + localename = _setlocale(category) + if category == LC_ALL and ';' in localename: + raise TypeError, 'category LC_ALL is not supported' + return _parse_localename(localename) + +def setlocale(category, locale=None): + + """ Set the locale for the given category. The locale can be + a string, an iterable of two strings (language code and encoding), + or None. + + Iterables are converted to strings using the locale aliasing + engine. Locale strings are passed directly to the C lib. + + category may be given as one of the LC_* values. + + """ + if locale and type(locale) is not type(""): + # convert to string + locale = normalize(_build_localename(locale)) + return _setlocale(category, locale) + +def resetlocale(category=LC_ALL): + + """ Sets the locale for category to the default setting. + + The default setting is determined by calling + getdefaultlocale(). category defaults to LC_ALL. + + """ + _setlocale(category, _build_localename(getdefaultlocale())) + +if sys.platform.startswith("win"): + # On Win32, this will return the ANSI code page + def getpreferredencoding(do_setlocale = True): + """Return the charset that the user is likely using.""" + import _locale + return _locale._getdefaultlocale()[1] +else: + # On Unix, if CODESET is available, use that. + try: + CODESET + except NameError: + # Fall back to parsing environment variables :-( + def getpreferredencoding(do_setlocale = True): + """Return the charset that the user is likely using, + by looking at environment variables.""" + return getdefaultlocale()[1] + else: + def getpreferredencoding(do_setlocale = True): + """Return the charset that the user is likely using, + according to the system configuration.""" + if do_setlocale: + oldloc = setlocale(LC_CTYPE) + try: + setlocale(LC_CTYPE, "") + except Error: + pass + result = nl_langinfo(CODESET) + setlocale(LC_CTYPE, oldloc) + return result + else: + return nl_langinfo(CODESET) + + +### Database +# +# The following data was extracted from the locale.alias file which +# comes with X11 and then hand edited removing the explicit encoding +# definitions and adding some more aliases. The file is usually +# available as /usr/lib/X11/locale/locale.alias. +# + +# +# The local_encoding_alias table maps lowercase encoding alias names +# to C locale encoding names (case-sensitive). Note that normalize() +# first looks up the encoding in the encodings.aliases dictionary and +# then applies this mapping to find the correct C lib name for the +# encoding. +# +locale_encoding_alias = { + + # Mappings for non-standard encoding names used in locale names + '437': 'C', + 'c': 'C', + 'en': 'ISO8859-1', + 'jis': 'JIS7', + 'jis7': 'JIS7', + 'ajec': 'eucJP', + + # Mappings from Python codec names to C lib encoding names + 'ascii': 'ISO8859-1', + 'latin_1': 'ISO8859-1', + 'iso8859_1': 'ISO8859-1', + 'iso8859_10': 'ISO8859-10', + 'iso8859_11': 'ISO8859-11', + 'iso8859_13': 'ISO8859-13', + 'iso8859_14': 'ISO8859-14', + 'iso8859_15': 'ISO8859-15', + 'iso8859_16': 'ISO8859-16', + 'iso8859_2': 'ISO8859-2', + 'iso8859_3': 'ISO8859-3', + 'iso8859_4': 'ISO8859-4', + 'iso8859_5': 'ISO8859-5', + 'iso8859_6': 'ISO8859-6', + 'iso8859_7': 'ISO8859-7', + 'iso8859_8': 'ISO8859-8', + 'iso8859_9': 'ISO8859-9', + 'iso2022_jp': 'JIS7', + 'shift_jis': 'SJIS', + 'tactis': 'TACTIS', + 'euc_jp': 'eucJP', + 'euc_kr': 'eucKR', + 'utf_8': 'UTF-8', + 'koi8_r': 'KOI8-R', + 'koi8_u': 'KOI8-U', + # XXX This list is still incomplete. If you know more + # mappings, please file a bug report. Thanks. +} + +# +# The locale_alias table maps lowercase alias names to C locale names +# (case-sensitive). Encodings are always separated from the locale +# name using a dot ('.'); they should only be given in case the +# language name is needed to interpret the given encoding alias +# correctly (CJK codes often have this need). +# +# Note that the normalize() function which uses this tables +# removes '_' and '-' characters from the encoding part of the +# locale name before doing the lookup. This saves a lot of +# space in the table. +# +# MAL 2004-12-10: +# Updated alias mapping to most recent locale.alias file +# from X.org distribution using makelocalealias.py. +# +# These are the differences compared to the old mapping (Python 2.4 +# and older): +# +# updated 'bg' -> 'bg_BG.ISO8859-5' to 'bg_BG.CP1251' +# updated 'bg_bg' -> 'bg_BG.ISO8859-5' to 'bg_BG.CP1251' +# updated 'bulgarian' -> 'bg_BG.ISO8859-5' to 'bg_BG.CP1251' +# updated 'cz' -> 'cz_CZ.ISO8859-2' to 'cs_CZ.ISO8859-2' +# updated 'cz_cz' -> 'cz_CZ.ISO8859-2' to 'cs_CZ.ISO8859-2' +# updated 'czech' -> 'cs_CS.ISO8859-2' to 'cs_CZ.ISO8859-2' +# updated 'dutch' -> 'nl_BE.ISO8859-1' to 'nl_NL.ISO8859-1' +# updated 'et' -> 'et_EE.ISO8859-4' to 'et_EE.ISO8859-15' +# updated 'et_ee' -> 'et_EE.ISO8859-4' to 'et_EE.ISO8859-15' +# updated 'fi' -> 'fi_FI.ISO8859-1' to 'fi_FI.ISO8859-15' +# updated 'fi_fi' -> 'fi_FI.ISO8859-1' to 'fi_FI.ISO8859-15' +# updated 'iw' -> 'iw_IL.ISO8859-8' to 'he_IL.ISO8859-8' +# updated 'iw_il' -> 'iw_IL.ISO8859-8' to 'he_IL.ISO8859-8' +# updated 'japanese' -> 'ja_JP.SJIS' to 'ja_JP.eucJP' +# updated 'lt' -> 'lt_LT.ISO8859-4' to 'lt_LT.ISO8859-13' +# updated 'lv' -> 'lv_LV.ISO8859-4' to 'lv_LV.ISO8859-13' +# updated 'sl' -> 'sl_CS.ISO8859-2' to 'sl_SI.ISO8859-2' +# updated 'slovene' -> 'sl_CS.ISO8859-2' to 'sl_SI.ISO8859-2' +# updated 'th_th' -> 'th_TH.TACTIS' to 'th_TH.ISO8859-11' +# updated 'zh_cn' -> 'zh_CN.eucCN' to 'zh_CN.gb2312' +# updated 'zh_cn.big5' -> 'zh_TW.eucTW' to 'zh_TW.big5' +# updated 'zh_tw' -> 'zh_TW.eucTW' to 'zh_TW.big5' +# +# MAL 2008-05-30: +# Updated alias mapping to most recent locale.alias file +# from X.org distribution using makelocalealias.py. +# +# These are the differences compared to the old mapping (Python 2.5 +# and older): +# +# updated 'cs_cs.iso88592' -> 'cs_CZ.ISO8859-2' to 'cs_CS.ISO8859-2' +# updated 'serbocroatian' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sh' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sh_hr.iso88592' -> 'sh_HR.ISO8859-2' to 'hr_HR.ISO8859-2' +# updated 'sh_sp' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sh_yu' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sp' -> 'sp_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sp_yu' -> 'sp_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr@cyrillic' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr_sp' -> 'sr_SP.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sr_yu' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr_yu.cp1251@cyrillic' -> 'sr_YU.CP1251' to 'sr_CS.CP1251' +# updated 'sr_yu.iso88592' -> 'sr_YU.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sr_yu.iso88595' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr_yu.iso88595@cyrillic' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr_yu.microsoftcp1251@cyrillic' -> 'sr_YU.CP1251' to 'sr_CS.CP1251' +# updated 'sr_yu.utf8@cyrillic' -> 'sr_YU.UTF-8' to 'sr_CS.UTF-8' +# updated 'sr_yu@cyrillic' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# +# AP 2010-04-12: +# Updated alias mapping to most recent locale.alias file +# from X.org distribution using makelocalealias.py. +# +# These are the differences compared to the old mapping (Python 2.6.5 +# and older): +# +# updated 'ru' -> 'ru_RU.ISO8859-5' to 'ru_RU.UTF-8' +# updated 'ru_ru' -> 'ru_RU.ISO8859-5' to 'ru_RU.UTF-8' +# updated 'serbocroatian' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin' +# updated 'sh' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin' +# updated 'sh_yu' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin' +# updated 'sr' -> 'sr_CS.ISO8859-5' to 'sr_RS.UTF-8' +# updated 'sr@cyrillic' -> 'sr_CS.ISO8859-5' to 'sr_RS.UTF-8' +# updated 'sr@latn' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin' +# updated 'sr_cs.utf8@latn' -> 'sr_CS.UTF-8' to 'sr_RS.UTF-8@latin' +# updated 'sr_cs@latn' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin' +# updated 'sr_yu' -> 'sr_CS.ISO8859-5' to 'sr_RS.UTF-8@latin' +# updated 'sr_yu.utf8@cyrillic' -> 'sr_CS.UTF-8' to 'sr_RS.UTF-8' +# updated 'sr_yu@cyrillic' -> 'sr_CS.ISO8859-5' to 'sr_RS.UTF-8' +# + +locale_alias = { + 'a3': 'a3_AZ.KOI8-C', + 'a3_az': 'a3_AZ.KOI8-C', + 'a3_az.koi8c': 'a3_AZ.KOI8-C', + 'af': 'af_ZA.ISO8859-1', + 'af_za': 'af_ZA.ISO8859-1', + 'af_za.iso88591': 'af_ZA.ISO8859-1', + 'am': 'am_ET.UTF-8', + 'am_et': 'am_ET.UTF-8', + 'american': 'en_US.ISO8859-1', + 'american.iso88591': 'en_US.ISO8859-1', + 'ar': 'ar_AA.ISO8859-6', + 'ar_aa': 'ar_AA.ISO8859-6', + 'ar_aa.iso88596': 'ar_AA.ISO8859-6', + 'ar_ae': 'ar_AE.ISO8859-6', + 'ar_ae.iso88596': 'ar_AE.ISO8859-6', + 'ar_bh': 'ar_BH.ISO8859-6', + 'ar_bh.iso88596': 'ar_BH.ISO8859-6', + 'ar_dz': 'ar_DZ.ISO8859-6', + 'ar_dz.iso88596': 'ar_DZ.ISO8859-6', + 'ar_eg': 'ar_EG.ISO8859-6', + 'ar_eg.iso88596': 'ar_EG.ISO8859-6', + 'ar_iq': 'ar_IQ.ISO8859-6', + 'ar_iq.iso88596': 'ar_IQ.ISO8859-6', + 'ar_jo': 'ar_JO.ISO8859-6', + 'ar_jo.iso88596': 'ar_JO.ISO8859-6', + 'ar_kw': 'ar_KW.ISO8859-6', + 'ar_kw.iso88596': 'ar_KW.ISO8859-6', + 'ar_lb': 'ar_LB.ISO8859-6', + 'ar_lb.iso88596': 'ar_LB.ISO8859-6', + 'ar_ly': 'ar_LY.ISO8859-6', + 'ar_ly.iso88596': 'ar_LY.ISO8859-6', + 'ar_ma': 'ar_MA.ISO8859-6', + 'ar_ma.iso88596': 'ar_MA.ISO8859-6', + 'ar_om': 'ar_OM.ISO8859-6', + 'ar_om.iso88596': 'ar_OM.ISO8859-6', + 'ar_qa': 'ar_QA.ISO8859-6', + 'ar_qa.iso88596': 'ar_QA.ISO8859-6', + 'ar_sa': 'ar_SA.ISO8859-6', + 'ar_sa.iso88596': 'ar_SA.ISO8859-6', + 'ar_sd': 'ar_SD.ISO8859-6', + 'ar_sd.iso88596': 'ar_SD.ISO8859-6', + 'ar_sy': 'ar_SY.ISO8859-6', + 'ar_sy.iso88596': 'ar_SY.ISO8859-6', + 'ar_tn': 'ar_TN.ISO8859-6', + 'ar_tn.iso88596': 'ar_TN.ISO8859-6', + 'ar_ye': 'ar_YE.ISO8859-6', + 'ar_ye.iso88596': 'ar_YE.ISO8859-6', + 'arabic': 'ar_AA.ISO8859-6', + 'arabic.iso88596': 'ar_AA.ISO8859-6', + 'as': 'as_IN.UTF-8', + 'az': 'az_AZ.ISO8859-9E', + 'az_az': 'az_AZ.ISO8859-9E', + 'az_az.iso88599e': 'az_AZ.ISO8859-9E', + 'be': 'be_BY.CP1251', + 'be@latin': 'be_BY.UTF-8@latin', + 'be_by': 'be_BY.CP1251', + 'be_by.cp1251': 'be_BY.CP1251', + 'be_by.microsoftcp1251': 'be_BY.CP1251', + 'be_by.utf8@latin': 'be_BY.UTF-8@latin', + 'be_by@latin': 'be_BY.UTF-8@latin', + 'bg': 'bg_BG.CP1251', + 'bg_bg': 'bg_BG.CP1251', + 'bg_bg.cp1251': 'bg_BG.CP1251', + 'bg_bg.iso88595': 'bg_BG.ISO8859-5', + 'bg_bg.koi8r': 'bg_BG.KOI8-R', + 'bg_bg.microsoftcp1251': 'bg_BG.CP1251', + 'bn_in': 'bn_IN.UTF-8', + 'bokmal': 'nb_NO.ISO8859-1', + 'bokm\xe5l': 'nb_NO.ISO8859-1', + 'br': 'br_FR.ISO8859-1', + 'br_fr': 'br_FR.ISO8859-1', + 'br_fr.iso88591': 'br_FR.ISO8859-1', + 'br_fr.iso885914': 'br_FR.ISO8859-14', + 'br_fr.iso885915': 'br_FR.ISO8859-15', + 'br_fr.iso885915@euro': 'br_FR.ISO8859-15', + 'br_fr.utf8@euro': 'br_FR.UTF-8', + 'br_fr@euro': 'br_FR.ISO8859-15', + 'bs': 'bs_BA.ISO8859-2', + 'bs_ba': 'bs_BA.ISO8859-2', + 'bs_ba.iso88592': 'bs_BA.ISO8859-2', + 'bulgarian': 'bg_BG.CP1251', + 'c': 'C', + 'c-french': 'fr_CA.ISO8859-1', + 'c-french.iso88591': 'fr_CA.ISO8859-1', + 'c.en': 'C', + 'c.iso88591': 'en_US.ISO8859-1', + 'c_c': 'C', + 'c_c.c': 'C', + 'ca': 'ca_ES.ISO8859-1', + 'ca_ad': 'ca_AD.ISO8859-1', + 'ca_ad.iso88591': 'ca_AD.ISO8859-1', + 'ca_ad.iso885915': 'ca_AD.ISO8859-15', + 'ca_ad.iso885915@euro': 'ca_AD.ISO8859-15', + 'ca_ad.utf8@euro': 'ca_AD.UTF-8', + 'ca_ad@euro': 'ca_AD.ISO8859-15', + 'ca_es': 'ca_ES.ISO8859-1', + 'ca_es.iso88591': 'ca_ES.ISO8859-1', + 'ca_es.iso885915': 'ca_ES.ISO8859-15', + 'ca_es.iso885915@euro': 'ca_ES.ISO8859-15', + 'ca_es.utf8@euro': 'ca_ES.UTF-8', + 'ca_es@euro': 'ca_ES.ISO8859-15', + 'ca_fr': 'ca_FR.ISO8859-1', + 'ca_fr.iso88591': 'ca_FR.ISO8859-1', + 'ca_fr.iso885915': 'ca_FR.ISO8859-15', + 'ca_fr.iso885915@euro': 'ca_FR.ISO8859-15', + 'ca_fr.utf8@euro': 'ca_FR.UTF-8', + 'ca_fr@euro': 'ca_FR.ISO8859-15', + 'ca_it': 'ca_IT.ISO8859-1', + 'ca_it.iso88591': 'ca_IT.ISO8859-1', + 'ca_it.iso885915': 'ca_IT.ISO8859-15', + 'ca_it.iso885915@euro': 'ca_IT.ISO8859-15', + 'ca_it.utf8@euro': 'ca_IT.UTF-8', + 'ca_it@euro': 'ca_IT.ISO8859-15', + 'catalan': 'ca_ES.ISO8859-1', + 'cextend': 'en_US.ISO8859-1', + 'cextend.en': 'en_US.ISO8859-1', + 'chinese-s': 'zh_CN.eucCN', + 'chinese-t': 'zh_TW.eucTW', + 'croatian': 'hr_HR.ISO8859-2', + 'cs': 'cs_CZ.ISO8859-2', + 'cs_cs': 'cs_CZ.ISO8859-2', + 'cs_cs.iso88592': 'cs_CS.ISO8859-2', + 'cs_cz': 'cs_CZ.ISO8859-2', + 'cs_cz.iso88592': 'cs_CZ.ISO8859-2', + 'cy': 'cy_GB.ISO8859-1', + 'cy_gb': 'cy_GB.ISO8859-1', + 'cy_gb.iso88591': 'cy_GB.ISO8859-1', + 'cy_gb.iso885914': 'cy_GB.ISO8859-14', + 'cy_gb.iso885915': 'cy_GB.ISO8859-15', + 'cy_gb@euro': 'cy_GB.ISO8859-15', + 'cz': 'cs_CZ.ISO8859-2', + 'cz_cz': 'cs_CZ.ISO8859-2', + 'czech': 'cs_CZ.ISO8859-2', + 'da': 'da_DK.ISO8859-1', + 'da.iso885915': 'da_DK.ISO8859-15', + 'da_dk': 'da_DK.ISO8859-1', + 'da_dk.88591': 'da_DK.ISO8859-1', + 'da_dk.885915': 'da_DK.ISO8859-15', + 'da_dk.iso88591': 'da_DK.ISO8859-1', + 'da_dk.iso885915': 'da_DK.ISO8859-15', + 'da_dk@euro': 'da_DK.ISO8859-15', + 'danish': 'da_DK.ISO8859-1', + 'danish.iso88591': 'da_DK.ISO8859-1', + 'dansk': 'da_DK.ISO8859-1', + 'de': 'de_DE.ISO8859-1', + 'de.iso885915': 'de_DE.ISO8859-15', + 'de_at': 'de_AT.ISO8859-1', + 'de_at.iso88591': 'de_AT.ISO8859-1', + 'de_at.iso885915': 'de_AT.ISO8859-15', + 'de_at.iso885915@euro': 'de_AT.ISO8859-15', + 'de_at.utf8@euro': 'de_AT.UTF-8', + 'de_at@euro': 'de_AT.ISO8859-15', + 'de_be': 'de_BE.ISO8859-1', + 'de_be.iso88591': 'de_BE.ISO8859-1', + 'de_be.iso885915': 'de_BE.ISO8859-15', + 'de_be.iso885915@euro': 'de_BE.ISO8859-15', + 'de_be.utf8@euro': 'de_BE.UTF-8', + 'de_be@euro': 'de_BE.ISO8859-15', + 'de_ch': 'de_CH.ISO8859-1', + 'de_ch.iso88591': 'de_CH.ISO8859-1', + 'de_ch.iso885915': 'de_CH.ISO8859-15', + 'de_ch@euro': 'de_CH.ISO8859-15', + 'de_de': 'de_DE.ISO8859-1', + 'de_de.88591': 'de_DE.ISO8859-1', + 'de_de.885915': 'de_DE.ISO8859-15', + 'de_de.885915@euro': 'de_DE.ISO8859-15', + 'de_de.iso88591': 'de_DE.ISO8859-1', + 'de_de.iso885915': 'de_DE.ISO8859-15', + 'de_de.iso885915@euro': 'de_DE.ISO8859-15', + 'de_de.utf8@euro': 'de_DE.UTF-8', + 'de_de@euro': 'de_DE.ISO8859-15', + 'de_lu': 'de_LU.ISO8859-1', + 'de_lu.iso88591': 'de_LU.ISO8859-1', + 'de_lu.iso885915': 'de_LU.ISO8859-15', + 'de_lu.iso885915@euro': 'de_LU.ISO8859-15', + 'de_lu.utf8@euro': 'de_LU.UTF-8', + 'de_lu@euro': 'de_LU.ISO8859-15', + 'deutsch': 'de_DE.ISO8859-1', + 'dutch': 'nl_NL.ISO8859-1', + 'dutch.iso88591': 'nl_BE.ISO8859-1', + 'ee': 'ee_EE.ISO8859-4', + 'ee_ee': 'ee_EE.ISO8859-4', + 'ee_ee.iso88594': 'ee_EE.ISO8859-4', + 'eesti': 'et_EE.ISO8859-1', + 'el': 'el_GR.ISO8859-7', + 'el_gr': 'el_GR.ISO8859-7', + 'el_gr.iso88597': 'el_GR.ISO8859-7', + 'el_gr@euro': 'el_GR.ISO8859-15', + 'en': 'en_US.ISO8859-1', + 'en.iso88591': 'en_US.ISO8859-1', + 'en_au': 'en_AU.ISO8859-1', + 'en_au.iso88591': 'en_AU.ISO8859-1', + 'en_be': 'en_BE.ISO8859-1', + 'en_be@euro': 'en_BE.ISO8859-15', + 'en_bw': 'en_BW.ISO8859-1', + 'en_bw.iso88591': 'en_BW.ISO8859-1', + 'en_ca': 'en_CA.ISO8859-1', + 'en_ca.iso88591': 'en_CA.ISO8859-1', + 'en_gb': 'en_GB.ISO8859-1', + 'en_gb.88591': 'en_GB.ISO8859-1', + 'en_gb.iso88591': 'en_GB.ISO8859-1', + 'en_gb.iso885915': 'en_GB.ISO8859-15', + 'en_gb@euro': 'en_GB.ISO8859-15', + 'en_hk': 'en_HK.ISO8859-1', + 'en_hk.iso88591': 'en_HK.ISO8859-1', + 'en_ie': 'en_IE.ISO8859-1', + 'en_ie.iso88591': 'en_IE.ISO8859-1', + 'en_ie.iso885915': 'en_IE.ISO8859-15', + 'en_ie.iso885915@euro': 'en_IE.ISO8859-15', + 'en_ie.utf8@euro': 'en_IE.UTF-8', + 'en_ie@euro': 'en_IE.ISO8859-15', + 'en_in': 'en_IN.ISO8859-1', + 'en_nz': 'en_NZ.ISO8859-1', + 'en_nz.iso88591': 'en_NZ.ISO8859-1', + 'en_ph': 'en_PH.ISO8859-1', + 'en_ph.iso88591': 'en_PH.ISO8859-1', + 'en_sg': 'en_SG.ISO8859-1', + 'en_sg.iso88591': 'en_SG.ISO8859-1', + 'en_uk': 'en_GB.ISO8859-1', + 'en_us': 'en_US.ISO8859-1', + 'en_us.88591': 'en_US.ISO8859-1', + 'en_us.885915': 'en_US.ISO8859-15', + 'en_us.iso88591': 'en_US.ISO8859-1', + 'en_us.iso885915': 'en_US.ISO8859-15', + 'en_us.iso885915@euro': 'en_US.ISO8859-15', + 'en_us@euro': 'en_US.ISO8859-15', + 'en_us@euro@euro': 'en_US.ISO8859-15', + 'en_za': 'en_ZA.ISO8859-1', + 'en_za.88591': 'en_ZA.ISO8859-1', + 'en_za.iso88591': 'en_ZA.ISO8859-1', + 'en_za.iso885915': 'en_ZA.ISO8859-15', + 'en_za@euro': 'en_ZA.ISO8859-15', + 'en_zw': 'en_ZW.ISO8859-1', + 'en_zw.iso88591': 'en_ZW.ISO8859-1', + 'eng_gb': 'en_GB.ISO8859-1', + 'eng_gb.8859': 'en_GB.ISO8859-1', + 'english': 'en_EN.ISO8859-1', + 'english.iso88591': 'en_EN.ISO8859-1', + 'english_uk': 'en_GB.ISO8859-1', + 'english_uk.8859': 'en_GB.ISO8859-1', + 'english_united-states': 'en_US.ISO8859-1', + 'english_united-states.437': 'C', + 'english_us': 'en_US.ISO8859-1', + 'english_us.8859': 'en_US.ISO8859-1', + 'english_us.ascii': 'en_US.ISO8859-1', + 'eo': 'eo_XX.ISO8859-3', + 'eo_eo': 'eo_EO.ISO8859-3', + 'eo_eo.iso88593': 'eo_EO.ISO8859-3', + 'eo_xx': 'eo_XX.ISO8859-3', + 'eo_xx.iso88593': 'eo_XX.ISO8859-3', + 'es': 'es_ES.ISO8859-1', + 'es_ar': 'es_AR.ISO8859-1', + 'es_ar.iso88591': 'es_AR.ISO8859-1', + 'es_bo': 'es_BO.ISO8859-1', + 'es_bo.iso88591': 'es_BO.ISO8859-1', + 'es_cl': 'es_CL.ISO8859-1', + 'es_cl.iso88591': 'es_CL.ISO8859-1', + 'es_co': 'es_CO.ISO8859-1', + 'es_co.iso88591': 'es_CO.ISO8859-1', + 'es_cr': 'es_CR.ISO8859-1', + 'es_cr.iso88591': 'es_CR.ISO8859-1', + 'es_do': 'es_DO.ISO8859-1', + 'es_do.iso88591': 'es_DO.ISO8859-1', + 'es_ec': 'es_EC.ISO8859-1', + 'es_ec.iso88591': 'es_EC.ISO8859-1', + 'es_es': 'es_ES.ISO8859-1', + 'es_es.88591': 'es_ES.ISO8859-1', + 'es_es.iso88591': 'es_ES.ISO8859-1', + 'es_es.iso885915': 'es_ES.ISO8859-15', + 'es_es.iso885915@euro': 'es_ES.ISO8859-15', + 'es_es.utf8@euro': 'es_ES.UTF-8', + 'es_es@euro': 'es_ES.ISO8859-15', + 'es_gt': 'es_GT.ISO8859-1', + 'es_gt.iso88591': 'es_GT.ISO8859-1', + 'es_hn': 'es_HN.ISO8859-1', + 'es_hn.iso88591': 'es_HN.ISO8859-1', + 'es_mx': 'es_MX.ISO8859-1', + 'es_mx.iso88591': 'es_MX.ISO8859-1', + 'es_ni': 'es_NI.ISO8859-1', + 'es_ni.iso88591': 'es_NI.ISO8859-1', + 'es_pa': 'es_PA.ISO8859-1', + 'es_pa.iso88591': 'es_PA.ISO8859-1', + 'es_pa.iso885915': 'es_PA.ISO8859-15', + 'es_pa@euro': 'es_PA.ISO8859-15', + 'es_pe': 'es_PE.ISO8859-1', + 'es_pe.iso88591': 'es_PE.ISO8859-1', + 'es_pe.iso885915': 'es_PE.ISO8859-15', + 'es_pe@euro': 'es_PE.ISO8859-15', + 'es_pr': 'es_PR.ISO8859-1', + 'es_pr.iso88591': 'es_PR.ISO8859-1', + 'es_py': 'es_PY.ISO8859-1', + 'es_py.iso88591': 'es_PY.ISO8859-1', + 'es_py.iso885915': 'es_PY.ISO8859-15', + 'es_py@euro': 'es_PY.ISO8859-15', + 'es_sv': 'es_SV.ISO8859-1', + 'es_sv.iso88591': 'es_SV.ISO8859-1', + 'es_sv.iso885915': 'es_SV.ISO8859-15', + 'es_sv@euro': 'es_SV.ISO8859-15', + 'es_us': 'es_US.ISO8859-1', + 'es_us.iso88591': 'es_US.ISO8859-1', + 'es_uy': 'es_UY.ISO8859-1', + 'es_uy.iso88591': 'es_UY.ISO8859-1', + 'es_uy.iso885915': 'es_UY.ISO8859-15', + 'es_uy@euro': 'es_UY.ISO8859-15', + 'es_ve': 'es_VE.ISO8859-1', + 'es_ve.iso88591': 'es_VE.ISO8859-1', + 'es_ve.iso885915': 'es_VE.ISO8859-15', + 'es_ve@euro': 'es_VE.ISO8859-15', + 'estonian': 'et_EE.ISO8859-1', + 'et': 'et_EE.ISO8859-15', + 'et_ee': 'et_EE.ISO8859-15', + 'et_ee.iso88591': 'et_EE.ISO8859-1', + 'et_ee.iso885913': 'et_EE.ISO8859-13', + 'et_ee.iso885915': 'et_EE.ISO8859-15', + 'et_ee.iso88594': 'et_EE.ISO8859-4', + 'et_ee@euro': 'et_EE.ISO8859-15', + 'eu': 'eu_ES.ISO8859-1', + 'eu_es': 'eu_ES.ISO8859-1', + 'eu_es.iso88591': 'eu_ES.ISO8859-1', + 'eu_es.iso885915': 'eu_ES.ISO8859-15', + 'eu_es.iso885915@euro': 'eu_ES.ISO8859-15', + 'eu_es.utf8@euro': 'eu_ES.UTF-8', + 'eu_es@euro': 'eu_ES.ISO8859-15', + 'fa': 'fa_IR.UTF-8', + 'fa_ir': 'fa_IR.UTF-8', + 'fa_ir.isiri3342': 'fa_IR.ISIRI-3342', + 'fi': 'fi_FI.ISO8859-15', + 'fi.iso885915': 'fi_FI.ISO8859-15', + 'fi_fi': 'fi_FI.ISO8859-15', + 'fi_fi.88591': 'fi_FI.ISO8859-1', + 'fi_fi.iso88591': 'fi_FI.ISO8859-1', + 'fi_fi.iso885915': 'fi_FI.ISO8859-15', + 'fi_fi.iso885915@euro': 'fi_FI.ISO8859-15', + 'fi_fi.utf8@euro': 'fi_FI.UTF-8', + 'fi_fi@euro': 'fi_FI.ISO8859-15', + 'finnish': 'fi_FI.ISO8859-1', + 'finnish.iso88591': 'fi_FI.ISO8859-1', + 'fo': 'fo_FO.ISO8859-1', + 'fo_fo': 'fo_FO.ISO8859-1', + 'fo_fo.iso88591': 'fo_FO.ISO8859-1', + 'fo_fo.iso885915': 'fo_FO.ISO8859-15', + 'fo_fo@euro': 'fo_FO.ISO8859-15', + 'fr': 'fr_FR.ISO8859-1', + 'fr.iso885915': 'fr_FR.ISO8859-15', + 'fr_be': 'fr_BE.ISO8859-1', + 'fr_be.88591': 'fr_BE.ISO8859-1', + 'fr_be.iso88591': 'fr_BE.ISO8859-1', + 'fr_be.iso885915': 'fr_BE.ISO8859-15', + 'fr_be.iso885915@euro': 'fr_BE.ISO8859-15', + 'fr_be.utf8@euro': 'fr_BE.UTF-8', + 'fr_be@euro': 'fr_BE.ISO8859-15', + 'fr_ca': 'fr_CA.ISO8859-1', + 'fr_ca.88591': 'fr_CA.ISO8859-1', + 'fr_ca.iso88591': 'fr_CA.ISO8859-1', + 'fr_ca.iso885915': 'fr_CA.ISO8859-15', + 'fr_ca@euro': 'fr_CA.ISO8859-15', + 'fr_ch': 'fr_CH.ISO8859-1', + 'fr_ch.88591': 'fr_CH.ISO8859-1', + 'fr_ch.iso88591': 'fr_CH.ISO8859-1', + 'fr_ch.iso885915': 'fr_CH.ISO8859-15', + 'fr_ch@euro': 'fr_CH.ISO8859-15', + 'fr_fr': 'fr_FR.ISO8859-1', + 'fr_fr.88591': 'fr_FR.ISO8859-1', + 'fr_fr.iso88591': 'fr_FR.ISO8859-1', + 'fr_fr.iso885915': 'fr_FR.ISO8859-15', + 'fr_fr.iso885915@euro': 'fr_FR.ISO8859-15', + 'fr_fr.utf8@euro': 'fr_FR.UTF-8', + 'fr_fr@euro': 'fr_FR.ISO8859-15', + 'fr_lu': 'fr_LU.ISO8859-1', + 'fr_lu.88591': 'fr_LU.ISO8859-1', + 'fr_lu.iso88591': 'fr_LU.ISO8859-1', + 'fr_lu.iso885915': 'fr_LU.ISO8859-15', + 'fr_lu.iso885915@euro': 'fr_LU.ISO8859-15', + 'fr_lu.utf8@euro': 'fr_LU.UTF-8', + 'fr_lu@euro': 'fr_LU.ISO8859-15', + 'fran\xe7ais': 'fr_FR.ISO8859-1', + 'fre_fr': 'fr_FR.ISO8859-1', + 'fre_fr.8859': 'fr_FR.ISO8859-1', + 'french': 'fr_FR.ISO8859-1', + 'french.iso88591': 'fr_CH.ISO8859-1', + 'french_france': 'fr_FR.ISO8859-1', + 'french_france.8859': 'fr_FR.ISO8859-1', + 'ga': 'ga_IE.ISO8859-1', + 'ga_ie': 'ga_IE.ISO8859-1', + 'ga_ie.iso88591': 'ga_IE.ISO8859-1', + 'ga_ie.iso885914': 'ga_IE.ISO8859-14', + 'ga_ie.iso885915': 'ga_IE.ISO8859-15', + 'ga_ie.iso885915@euro': 'ga_IE.ISO8859-15', + 'ga_ie.utf8@euro': 'ga_IE.UTF-8', + 'ga_ie@euro': 'ga_IE.ISO8859-15', + 'galego': 'gl_ES.ISO8859-1', + 'galician': 'gl_ES.ISO8859-1', + 'gd': 'gd_GB.ISO8859-1', + 'gd_gb': 'gd_GB.ISO8859-1', + 'gd_gb.iso88591': 'gd_GB.ISO8859-1', + 'gd_gb.iso885914': 'gd_GB.ISO8859-14', + 'gd_gb.iso885915': 'gd_GB.ISO8859-15', + 'gd_gb@euro': 'gd_GB.ISO8859-15', + 'ger_de': 'de_DE.ISO8859-1', + 'ger_de.8859': 'de_DE.ISO8859-1', + 'german': 'de_DE.ISO8859-1', + 'german.iso88591': 'de_CH.ISO8859-1', + 'german_germany': 'de_DE.ISO8859-1', + 'german_germany.8859': 'de_DE.ISO8859-1', + 'gl': 'gl_ES.ISO8859-1', + 'gl_es': 'gl_ES.ISO8859-1', + 'gl_es.iso88591': 'gl_ES.ISO8859-1', + 'gl_es.iso885915': 'gl_ES.ISO8859-15', + 'gl_es.iso885915@euro': 'gl_ES.ISO8859-15', + 'gl_es.utf8@euro': 'gl_ES.UTF-8', + 'gl_es@euro': 'gl_ES.ISO8859-15', + 'greek': 'el_GR.ISO8859-7', + 'greek.iso88597': 'el_GR.ISO8859-7', + 'gu_in': 'gu_IN.UTF-8', + 'gv': 'gv_GB.ISO8859-1', + 'gv_gb': 'gv_GB.ISO8859-1', + 'gv_gb.iso88591': 'gv_GB.ISO8859-1', + 'gv_gb.iso885914': 'gv_GB.ISO8859-14', + 'gv_gb.iso885915': 'gv_GB.ISO8859-15', + 'gv_gb@euro': 'gv_GB.ISO8859-15', + 'he': 'he_IL.ISO8859-8', + 'he_il': 'he_IL.ISO8859-8', + 'he_il.cp1255': 'he_IL.CP1255', + 'he_il.iso88598': 'he_IL.ISO8859-8', + 'he_il.microsoftcp1255': 'he_IL.CP1255', + 'hebrew': 'iw_IL.ISO8859-8', + 'hebrew.iso88598': 'iw_IL.ISO8859-8', + 'hi': 'hi_IN.ISCII-DEV', + 'hi_in': 'hi_IN.ISCII-DEV', + 'hi_in.isciidev': 'hi_IN.ISCII-DEV', + 'hne': 'hne_IN.UTF-8', + 'hr': 'hr_HR.ISO8859-2', + 'hr_hr': 'hr_HR.ISO8859-2', + 'hr_hr.iso88592': 'hr_HR.ISO8859-2', + 'hrvatski': 'hr_HR.ISO8859-2', + 'hu': 'hu_HU.ISO8859-2', + 'hu_hu': 'hu_HU.ISO8859-2', + 'hu_hu.iso88592': 'hu_HU.ISO8859-2', + 'hungarian': 'hu_HU.ISO8859-2', + 'icelandic': 'is_IS.ISO8859-1', + 'icelandic.iso88591': 'is_IS.ISO8859-1', + 'id': 'id_ID.ISO8859-1', + 'id_id': 'id_ID.ISO8859-1', + 'in': 'id_ID.ISO8859-1', + 'in_id': 'id_ID.ISO8859-1', + 'is': 'is_IS.ISO8859-1', + 'is_is': 'is_IS.ISO8859-1', + 'is_is.iso88591': 'is_IS.ISO8859-1', + 'is_is.iso885915': 'is_IS.ISO8859-15', + 'is_is@euro': 'is_IS.ISO8859-15', + 'iso-8859-1': 'en_US.ISO8859-1', + 'iso-8859-15': 'en_US.ISO8859-15', + 'iso8859-1': 'en_US.ISO8859-1', + 'iso8859-15': 'en_US.ISO8859-15', + 'iso_8859_1': 'en_US.ISO8859-1', + 'iso_8859_15': 'en_US.ISO8859-15', + 'it': 'it_IT.ISO8859-1', + 'it.iso885915': 'it_IT.ISO8859-15', + 'it_ch': 'it_CH.ISO8859-1', + 'it_ch.iso88591': 'it_CH.ISO8859-1', + 'it_ch.iso885915': 'it_CH.ISO8859-15', + 'it_ch@euro': 'it_CH.ISO8859-15', + 'it_it': 'it_IT.ISO8859-1', + 'it_it.88591': 'it_IT.ISO8859-1', + 'it_it.iso88591': 'it_IT.ISO8859-1', + 'it_it.iso885915': 'it_IT.ISO8859-15', + 'it_it.iso885915@euro': 'it_IT.ISO8859-15', + 'it_it.utf8@euro': 'it_IT.UTF-8', + 'it_it@euro': 'it_IT.ISO8859-15', + 'italian': 'it_IT.ISO8859-1', + 'italian.iso88591': 'it_IT.ISO8859-1', + 'iu': 'iu_CA.NUNACOM-8', + 'iu_ca': 'iu_CA.NUNACOM-8', + 'iu_ca.nunacom8': 'iu_CA.NUNACOM-8', + 'iw': 'he_IL.ISO8859-8', + 'iw_il': 'he_IL.ISO8859-8', + 'iw_il.iso88598': 'he_IL.ISO8859-8', + 'ja': 'ja_JP.eucJP', + 'ja.jis': 'ja_JP.JIS7', + 'ja.sjis': 'ja_JP.SJIS', + 'ja_jp': 'ja_JP.eucJP', + 'ja_jp.ajec': 'ja_JP.eucJP', + 'ja_jp.euc': 'ja_JP.eucJP', + 'ja_jp.eucjp': 'ja_JP.eucJP', + 'ja_jp.iso-2022-jp': 'ja_JP.JIS7', + 'ja_jp.iso2022jp': 'ja_JP.JIS7', + 'ja_jp.jis': 'ja_JP.JIS7', + 'ja_jp.jis7': 'ja_JP.JIS7', + 'ja_jp.mscode': 'ja_JP.SJIS', + 'ja_jp.pck': 'ja_JP.SJIS', + 'ja_jp.sjis': 'ja_JP.SJIS', + 'ja_jp.ujis': 'ja_JP.eucJP', + 'japan': 'ja_JP.eucJP', + 'japanese': 'ja_JP.eucJP', + 'japanese-euc': 'ja_JP.eucJP', + 'japanese.euc': 'ja_JP.eucJP', + 'japanese.sjis': 'ja_JP.SJIS', + 'jp_jp': 'ja_JP.eucJP', + 'ka': 'ka_GE.GEORGIAN-ACADEMY', + 'ka_ge': 'ka_GE.GEORGIAN-ACADEMY', + 'ka_ge.georgianacademy': 'ka_GE.GEORGIAN-ACADEMY', + 'ka_ge.georgianps': 'ka_GE.GEORGIAN-PS', + 'ka_ge.georgianrs': 'ka_GE.GEORGIAN-ACADEMY', + 'kl': 'kl_GL.ISO8859-1', + 'kl_gl': 'kl_GL.ISO8859-1', + 'kl_gl.iso88591': 'kl_GL.ISO8859-1', + 'kl_gl.iso885915': 'kl_GL.ISO8859-15', + 'kl_gl@euro': 'kl_GL.ISO8859-15', + 'km_kh': 'km_KH.UTF-8', + 'kn': 'kn_IN.UTF-8', + 'kn_in': 'kn_IN.UTF-8', + 'ko': 'ko_KR.eucKR', + 'ko_kr': 'ko_KR.eucKR', + 'ko_kr.euc': 'ko_KR.eucKR', + 'ko_kr.euckr': 'ko_KR.eucKR', + 'korean': 'ko_KR.eucKR', + 'korean.euc': 'ko_KR.eucKR', + 'ks': 'ks_IN.UTF-8', + 'ks_in@devanagari': 'ks_IN@devanagari.UTF-8', + 'kw': 'kw_GB.ISO8859-1', + 'kw_gb': 'kw_GB.ISO8859-1', + 'kw_gb.iso88591': 'kw_GB.ISO8859-1', + 'kw_gb.iso885914': 'kw_GB.ISO8859-14', + 'kw_gb.iso885915': 'kw_GB.ISO8859-15', + 'kw_gb@euro': 'kw_GB.ISO8859-15', + 'ky': 'ky_KG.UTF-8', + 'ky_kg': 'ky_KG.UTF-8', + 'lithuanian': 'lt_LT.ISO8859-13', + 'lo': 'lo_LA.MULELAO-1', + 'lo_la': 'lo_LA.MULELAO-1', + 'lo_la.cp1133': 'lo_LA.IBM-CP1133', + 'lo_la.ibmcp1133': 'lo_LA.IBM-CP1133', + 'lo_la.mulelao1': 'lo_LA.MULELAO-1', + 'lt': 'lt_LT.ISO8859-13', + 'lt_lt': 'lt_LT.ISO8859-13', + 'lt_lt.iso885913': 'lt_LT.ISO8859-13', + 'lt_lt.iso88594': 'lt_LT.ISO8859-4', + 'lv': 'lv_LV.ISO8859-13', + 'lv_lv': 'lv_LV.ISO8859-13', + 'lv_lv.iso885913': 'lv_LV.ISO8859-13', + 'lv_lv.iso88594': 'lv_LV.ISO8859-4', + 'mai': 'mai_IN.UTF-8', + 'mi': 'mi_NZ.ISO8859-1', + 'mi_nz': 'mi_NZ.ISO8859-1', + 'mi_nz.iso88591': 'mi_NZ.ISO8859-1', + 'mk': 'mk_MK.ISO8859-5', + 'mk_mk': 'mk_MK.ISO8859-5', + 'mk_mk.cp1251': 'mk_MK.CP1251', + 'mk_mk.iso88595': 'mk_MK.ISO8859-5', + 'mk_mk.microsoftcp1251': 'mk_MK.CP1251', + 'ml': 'ml_IN.UTF-8', + 'mr': 'mr_IN.UTF-8', + 'mr_in': 'mr_IN.UTF-8', + 'ms': 'ms_MY.ISO8859-1', + 'ms_my': 'ms_MY.ISO8859-1', + 'ms_my.iso88591': 'ms_MY.ISO8859-1', + 'mt': 'mt_MT.ISO8859-3', + 'mt_mt': 'mt_MT.ISO8859-3', + 'mt_mt.iso88593': 'mt_MT.ISO8859-3', + 'nb': 'nb_NO.ISO8859-1', + 'nb_no': 'nb_NO.ISO8859-1', + 'nb_no.88591': 'nb_NO.ISO8859-1', + 'nb_no.iso88591': 'nb_NO.ISO8859-1', + 'nb_no.iso885915': 'nb_NO.ISO8859-15', + 'nb_no@euro': 'nb_NO.ISO8859-15', + 'nl': 'nl_NL.ISO8859-1', + 'nl.iso885915': 'nl_NL.ISO8859-15', + 'nl_be': 'nl_BE.ISO8859-1', + 'nl_be.88591': 'nl_BE.ISO8859-1', + 'nl_be.iso88591': 'nl_BE.ISO8859-1', + 'nl_be.iso885915': 'nl_BE.ISO8859-15', + 'nl_be.iso885915@euro': 'nl_BE.ISO8859-15', + 'nl_be.utf8@euro': 'nl_BE.UTF-8', + 'nl_be@euro': 'nl_BE.ISO8859-15', + 'nl_nl': 'nl_NL.ISO8859-1', + 'nl_nl.88591': 'nl_NL.ISO8859-1', + 'nl_nl.iso88591': 'nl_NL.ISO8859-1', + 'nl_nl.iso885915': 'nl_NL.ISO8859-15', + 'nl_nl.iso885915@euro': 'nl_NL.ISO8859-15', + 'nl_nl.utf8@euro': 'nl_NL.UTF-8', + 'nl_nl@euro': 'nl_NL.ISO8859-15', + 'nn': 'nn_NO.ISO8859-1', + 'nn_no': 'nn_NO.ISO8859-1', + 'nn_no.88591': 'nn_NO.ISO8859-1', + 'nn_no.iso88591': 'nn_NO.ISO8859-1', + 'nn_no.iso885915': 'nn_NO.ISO8859-15', + 'nn_no@euro': 'nn_NO.ISO8859-15', + 'no': 'no_NO.ISO8859-1', + 'no@nynorsk': 'ny_NO.ISO8859-1', + 'no_no': 'no_NO.ISO8859-1', + 'no_no.88591': 'no_NO.ISO8859-1', + 'no_no.iso88591': 'no_NO.ISO8859-1', + 'no_no.iso885915': 'no_NO.ISO8859-15', + 'no_no.iso88591@bokmal': 'no_NO.ISO8859-1', + 'no_no.iso88591@nynorsk': 'no_NO.ISO8859-1', + 'no_no@euro': 'no_NO.ISO8859-15', + 'norwegian': 'no_NO.ISO8859-1', + 'norwegian.iso88591': 'no_NO.ISO8859-1', + 'nr': 'nr_ZA.ISO8859-1', + 'nr_za': 'nr_ZA.ISO8859-1', + 'nr_za.iso88591': 'nr_ZA.ISO8859-1', + 'nso': 'nso_ZA.ISO8859-15', + 'nso_za': 'nso_ZA.ISO8859-15', + 'nso_za.iso885915': 'nso_ZA.ISO8859-15', + 'ny': 'ny_NO.ISO8859-1', + 'ny_no': 'ny_NO.ISO8859-1', + 'ny_no.88591': 'ny_NO.ISO8859-1', + 'ny_no.iso88591': 'ny_NO.ISO8859-1', + 'ny_no.iso885915': 'ny_NO.ISO8859-15', + 'ny_no@euro': 'ny_NO.ISO8859-15', + 'nynorsk': 'nn_NO.ISO8859-1', + 'oc': 'oc_FR.ISO8859-1', + 'oc_fr': 'oc_FR.ISO8859-1', + 'oc_fr.iso88591': 'oc_FR.ISO8859-1', + 'oc_fr.iso885915': 'oc_FR.ISO8859-15', + 'oc_fr@euro': 'oc_FR.ISO8859-15', + 'or': 'or_IN.UTF-8', + 'pa': 'pa_IN.UTF-8', + 'pa_in': 'pa_IN.UTF-8', + 'pd': 'pd_US.ISO8859-1', + 'pd_de': 'pd_DE.ISO8859-1', + 'pd_de.iso88591': 'pd_DE.ISO8859-1', + 'pd_de.iso885915': 'pd_DE.ISO8859-15', + 'pd_de@euro': 'pd_DE.ISO8859-15', + 'pd_us': 'pd_US.ISO8859-1', + 'pd_us.iso88591': 'pd_US.ISO8859-1', + 'pd_us.iso885915': 'pd_US.ISO8859-15', + 'pd_us@euro': 'pd_US.ISO8859-15', + 'ph': 'ph_PH.ISO8859-1', + 'ph_ph': 'ph_PH.ISO8859-1', + 'ph_ph.iso88591': 'ph_PH.ISO8859-1', + 'pl': 'pl_PL.ISO8859-2', + 'pl_pl': 'pl_PL.ISO8859-2', + 'pl_pl.iso88592': 'pl_PL.ISO8859-2', + 'polish': 'pl_PL.ISO8859-2', + 'portuguese': 'pt_PT.ISO8859-1', + 'portuguese.iso88591': 'pt_PT.ISO8859-1', + 'portuguese_brazil': 'pt_BR.ISO8859-1', + 'portuguese_brazil.8859': 'pt_BR.ISO8859-1', + 'posix': 'C', + 'posix-utf2': 'C', + 'pp': 'pp_AN.ISO8859-1', + 'pp_an': 'pp_AN.ISO8859-1', + 'pp_an.iso88591': 'pp_AN.ISO8859-1', + 'pt': 'pt_PT.ISO8859-1', + 'pt.iso885915': 'pt_PT.ISO8859-15', + 'pt_br': 'pt_BR.ISO8859-1', + 'pt_br.88591': 'pt_BR.ISO8859-1', + 'pt_br.iso88591': 'pt_BR.ISO8859-1', + 'pt_br.iso885915': 'pt_BR.ISO8859-15', + 'pt_br@euro': 'pt_BR.ISO8859-15', + 'pt_pt': 'pt_PT.ISO8859-1', + 'pt_pt.88591': 'pt_PT.ISO8859-1', + 'pt_pt.iso88591': 'pt_PT.ISO8859-1', + 'pt_pt.iso885915': 'pt_PT.ISO8859-15', + 'pt_pt.iso885915@euro': 'pt_PT.ISO8859-15', + 'pt_pt.utf8@euro': 'pt_PT.UTF-8', + 'pt_pt@euro': 'pt_PT.ISO8859-15', + 'ro': 'ro_RO.ISO8859-2', + 'ro_ro': 'ro_RO.ISO8859-2', + 'ro_ro.iso88592': 'ro_RO.ISO8859-2', + 'romanian': 'ro_RO.ISO8859-2', + 'ru': 'ru_RU.UTF-8', + 'ru.koi8r': 'ru_RU.KOI8-R', + 'ru_ru': 'ru_RU.UTF-8', + 'ru_ru.cp1251': 'ru_RU.CP1251', + 'ru_ru.iso88595': 'ru_RU.ISO8859-5', + 'ru_ru.koi8r': 'ru_RU.KOI8-R', + 'ru_ru.microsoftcp1251': 'ru_RU.CP1251', + 'ru_ua': 'ru_UA.KOI8-U', + 'ru_ua.cp1251': 'ru_UA.CP1251', + 'ru_ua.koi8u': 'ru_UA.KOI8-U', + 'ru_ua.microsoftcp1251': 'ru_UA.CP1251', + 'rumanian': 'ro_RO.ISO8859-2', + 'russian': 'ru_RU.ISO8859-5', + 'rw': 'rw_RW.ISO8859-1', + 'rw_rw': 'rw_RW.ISO8859-1', + 'rw_rw.iso88591': 'rw_RW.ISO8859-1', + 'sd': 'sd_IN@devanagari.UTF-8', + 'se_no': 'se_NO.UTF-8', + 'serbocroatian': 'sr_RS.UTF-8@latin', + 'sh': 'sr_RS.UTF-8@latin', + 'sh_ba.iso88592@bosnia': 'sr_CS.ISO8859-2', + 'sh_hr': 'sh_HR.ISO8859-2', + 'sh_hr.iso88592': 'hr_HR.ISO8859-2', + 'sh_sp': 'sr_CS.ISO8859-2', + 'sh_yu': 'sr_RS.UTF-8@latin', + 'si': 'si_LK.UTF-8', + 'si_lk': 'si_LK.UTF-8', + 'sinhala': 'si_LK.UTF-8', + 'sk': 'sk_SK.ISO8859-2', + 'sk_sk': 'sk_SK.ISO8859-2', + 'sk_sk.iso88592': 'sk_SK.ISO8859-2', + 'sl': 'sl_SI.ISO8859-2', + 'sl_cs': 'sl_CS.ISO8859-2', + 'sl_si': 'sl_SI.ISO8859-2', + 'sl_si.iso88592': 'sl_SI.ISO8859-2', + 'slovak': 'sk_SK.ISO8859-2', + 'slovene': 'sl_SI.ISO8859-2', + 'slovenian': 'sl_SI.ISO8859-2', + 'sp': 'sr_CS.ISO8859-5', + 'sp_yu': 'sr_CS.ISO8859-5', + 'spanish': 'es_ES.ISO8859-1', + 'spanish.iso88591': 'es_ES.ISO8859-1', + 'spanish_spain': 'es_ES.ISO8859-1', + 'spanish_spain.8859': 'es_ES.ISO8859-1', + 'sq': 'sq_AL.ISO8859-2', + 'sq_al': 'sq_AL.ISO8859-2', + 'sq_al.iso88592': 'sq_AL.ISO8859-2', + 'sr': 'sr_RS.UTF-8', + 'sr@cyrillic': 'sr_RS.UTF-8', + 'sr@latin': 'sr_RS.UTF-8@latin', + 'sr@latn': 'sr_RS.UTF-8@latin', + 'sr_cs': 'sr_RS.UTF-8', + 'sr_cs.iso88592': 'sr_CS.ISO8859-2', + 'sr_cs.iso88592@latn': 'sr_CS.ISO8859-2', + 'sr_cs.iso88595': 'sr_CS.ISO8859-5', + 'sr_cs.utf8@latn': 'sr_RS.UTF-8@latin', + 'sr_cs@latn': 'sr_RS.UTF-8@latin', + 'sr_me': 'sr_ME.UTF-8', + 'sr_rs': 'sr_RS.UTF-8', + 'sr_rs.utf8@latn': 'sr_RS.UTF-8@latin', + 'sr_rs@latin': 'sr_RS.UTF-8@latin', + 'sr_rs@latn': 'sr_RS.UTF-8@latin', + 'sr_sp': 'sr_CS.ISO8859-2', + 'sr_yu': 'sr_RS.UTF-8@latin', + 'sr_yu.cp1251@cyrillic': 'sr_CS.CP1251', + 'sr_yu.iso88592': 'sr_CS.ISO8859-2', + 'sr_yu.iso88595': 'sr_CS.ISO8859-5', + 'sr_yu.iso88595@cyrillic': 'sr_CS.ISO8859-5', + 'sr_yu.microsoftcp1251@cyrillic': 'sr_CS.CP1251', + 'sr_yu.utf8@cyrillic': 'sr_RS.UTF-8', + 'sr_yu@cyrillic': 'sr_RS.UTF-8', + 'ss': 'ss_ZA.ISO8859-1', + 'ss_za': 'ss_ZA.ISO8859-1', + 'ss_za.iso88591': 'ss_ZA.ISO8859-1', + 'st': 'st_ZA.ISO8859-1', + 'st_za': 'st_ZA.ISO8859-1', + 'st_za.iso88591': 'st_ZA.ISO8859-1', + 'sv': 'sv_SE.ISO8859-1', + 'sv.iso885915': 'sv_SE.ISO8859-15', + 'sv_fi': 'sv_FI.ISO8859-1', + 'sv_fi.iso88591': 'sv_FI.ISO8859-1', + 'sv_fi.iso885915': 'sv_FI.ISO8859-15', + 'sv_fi.iso885915@euro': 'sv_FI.ISO8859-15', + 'sv_fi.utf8@euro': 'sv_FI.UTF-8', + 'sv_fi@euro': 'sv_FI.ISO8859-15', + 'sv_se': 'sv_SE.ISO8859-1', + 'sv_se.88591': 'sv_SE.ISO8859-1', + 'sv_se.iso88591': 'sv_SE.ISO8859-1', + 'sv_se.iso885915': 'sv_SE.ISO8859-15', + 'sv_se@euro': 'sv_SE.ISO8859-15', + 'swedish': 'sv_SE.ISO8859-1', + 'swedish.iso88591': 'sv_SE.ISO8859-1', + 'ta': 'ta_IN.TSCII-0', + 'ta_in': 'ta_IN.TSCII-0', + 'ta_in.tscii': 'ta_IN.TSCII-0', + 'ta_in.tscii0': 'ta_IN.TSCII-0', + 'te': 'te_IN.UTF-8', + 'tg': 'tg_TJ.KOI8-C', + 'tg_tj': 'tg_TJ.KOI8-C', + 'tg_tj.koi8c': 'tg_TJ.KOI8-C', + 'th': 'th_TH.ISO8859-11', + 'th_th': 'th_TH.ISO8859-11', + 'th_th.iso885911': 'th_TH.ISO8859-11', + 'th_th.tactis': 'th_TH.TIS620', + 'th_th.tis620': 'th_TH.TIS620', + 'thai': 'th_TH.ISO8859-11', + 'tl': 'tl_PH.ISO8859-1', + 'tl_ph': 'tl_PH.ISO8859-1', + 'tl_ph.iso88591': 'tl_PH.ISO8859-1', + 'tn': 'tn_ZA.ISO8859-15', + 'tn_za': 'tn_ZA.ISO8859-15', + 'tn_za.iso885915': 'tn_ZA.ISO8859-15', + 'tr': 'tr_TR.ISO8859-9', + 'tr_tr': 'tr_TR.ISO8859-9', + 'tr_tr.iso88599': 'tr_TR.ISO8859-9', + 'ts': 'ts_ZA.ISO8859-1', + 'ts_za': 'ts_ZA.ISO8859-1', + 'ts_za.iso88591': 'ts_ZA.ISO8859-1', + 'tt': 'tt_RU.TATAR-CYR', + 'tt_ru': 'tt_RU.TATAR-CYR', + 'tt_ru.koi8c': 'tt_RU.KOI8-C', + 'tt_ru.tatarcyr': 'tt_RU.TATAR-CYR', + 'turkish': 'tr_TR.ISO8859-9', + 'turkish.iso88599': 'tr_TR.ISO8859-9', + 'uk': 'uk_UA.KOI8-U', + 'uk_ua': 'uk_UA.KOI8-U', + 'uk_ua.cp1251': 'uk_UA.CP1251', + 'uk_ua.iso88595': 'uk_UA.ISO8859-5', + 'uk_ua.koi8u': 'uk_UA.KOI8-U', + 'uk_ua.microsoftcp1251': 'uk_UA.CP1251', + 'univ': 'en_US.utf', + 'universal': 'en_US.utf', + 'universal.utf8@ucs4': 'en_US.UTF-8', + 'ur': 'ur_PK.CP1256', + 'ur_pk': 'ur_PK.CP1256', + 'ur_pk.cp1256': 'ur_PK.CP1256', + 'ur_pk.microsoftcp1256': 'ur_PK.CP1256', + 'uz': 'uz_UZ.UTF-8', + 'uz_uz': 'uz_UZ.UTF-8', + 'uz_uz.iso88591': 'uz_UZ.ISO8859-1', + 'uz_uz.utf8@cyrillic': 'uz_UZ.UTF-8', + 'uz_uz@cyrillic': 'uz_UZ.UTF-8', + 've': 've_ZA.UTF-8', + 've_za': 've_ZA.UTF-8', + 'vi': 'vi_VN.TCVN', + 'vi_vn': 'vi_VN.TCVN', + 'vi_vn.tcvn': 'vi_VN.TCVN', + 'vi_vn.tcvn5712': 'vi_VN.TCVN', + 'vi_vn.viscii': 'vi_VN.VISCII', + 'vi_vn.viscii111': 'vi_VN.VISCII', + 'wa': 'wa_BE.ISO8859-1', + 'wa_be': 'wa_BE.ISO8859-1', + 'wa_be.iso88591': 'wa_BE.ISO8859-1', + 'wa_be.iso885915': 'wa_BE.ISO8859-15', + 'wa_be.iso885915@euro': 'wa_BE.ISO8859-15', + 'wa_be@euro': 'wa_BE.ISO8859-15', + 'xh': 'xh_ZA.ISO8859-1', + 'xh_za': 'xh_ZA.ISO8859-1', + 'xh_za.iso88591': 'xh_ZA.ISO8859-1', + 'yi': 'yi_US.CP1255', + 'yi_us': 'yi_US.CP1255', + 'yi_us.cp1255': 'yi_US.CP1255', + 'yi_us.microsoftcp1255': 'yi_US.CP1255', + 'zh': 'zh_CN.eucCN', + 'zh_cn': 'zh_CN.gb2312', + 'zh_cn.big5': 'zh_TW.big5', + 'zh_cn.euc': 'zh_CN.eucCN', + 'zh_cn.gb18030': 'zh_CN.gb18030', + 'zh_cn.gb2312': 'zh_CN.gb2312', + 'zh_cn.gbk': 'zh_CN.gbk', + 'zh_hk': 'zh_HK.big5hkscs', + 'zh_hk.big5': 'zh_HK.big5', + 'zh_hk.big5hk': 'zh_HK.big5hkscs', + 'zh_hk.big5hkscs': 'zh_HK.big5hkscs', + 'zh_tw': 'zh_TW.big5', + 'zh_tw.big5': 'zh_TW.big5', + 'zh_tw.euc': 'zh_TW.eucTW', + 'zh_tw.euctw': 'zh_TW.eucTW', + 'zu': 'zu_ZA.ISO8859-1', + 'zu_za': 'zu_ZA.ISO8859-1', + 'zu_za.iso88591': 'zu_ZA.ISO8859-1', +} + +# +# This maps Windows language identifiers to locale strings. +# +# This list has been updated from +# http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_238z.asp +# to include every locale up to Windows Vista. +# +# NOTE: this mapping is incomplete. If your language is missing, please +# submit a bug report to the Python bug tracker at http://bugs.python.org/ +# Make sure you include the missing language identifier and the suggested +# locale code. +# + +windows_locale = { + 0x0436: "af_ZA", # Afrikaans + 0x041c: "sq_AL", # Albanian + 0x0484: "gsw_FR",# Alsatian - France + 0x045e: "am_ET", # Amharic - Ethiopia + 0x0401: "ar_SA", # Arabic - Saudi Arabia + 0x0801: "ar_IQ", # Arabic - Iraq + 0x0c01: "ar_EG", # Arabic - Egypt + 0x1001: "ar_LY", # Arabic - Libya + 0x1401: "ar_DZ", # Arabic - Algeria + 0x1801: "ar_MA", # Arabic - Morocco + 0x1c01: "ar_TN", # Arabic - Tunisia + 0x2001: "ar_OM", # Arabic - Oman + 0x2401: "ar_YE", # Arabic - Yemen + 0x2801: "ar_SY", # Arabic - Syria + 0x2c01: "ar_JO", # Arabic - Jordan + 0x3001: "ar_LB", # Arabic - Lebanon + 0x3401: "ar_KW", # Arabic - Kuwait + 0x3801: "ar_AE", # Arabic - United Arab Emirates + 0x3c01: "ar_BH", # Arabic - Bahrain + 0x4001: "ar_QA", # Arabic - Qatar + 0x042b: "hy_AM", # Armenian + 0x044d: "as_IN", # Assamese - India + 0x042c: "az_AZ", # Azeri - Latin + 0x082c: "az_AZ", # Azeri - Cyrillic + 0x046d: "ba_RU", # Bashkir + 0x042d: "eu_ES", # Basque - Russia + 0x0423: "be_BY", # Belarusian + 0x0445: "bn_IN", # Begali + 0x201a: "bs_BA", # Bosnian - Cyrillic + 0x141a: "bs_BA", # Bosnian - Latin + 0x047e: "br_FR", # Breton - France + 0x0402: "bg_BG", # Bulgarian +# 0x0455: "my_MM", # Burmese - Not supported + 0x0403: "ca_ES", # Catalan + 0x0004: "zh_CHS",# Chinese - Simplified + 0x0404: "zh_TW", # Chinese - Taiwan + 0x0804: "zh_CN", # Chinese - PRC + 0x0c04: "zh_HK", # Chinese - Hong Kong S.A.R. + 0x1004: "zh_SG", # Chinese - Singapore + 0x1404: "zh_MO", # Chinese - Macao S.A.R. + 0x7c04: "zh_CHT",# Chinese - Traditional + 0x0483: "co_FR", # Corsican - France + 0x041a: "hr_HR", # Croatian + 0x101a: "hr_BA", # Croatian - Bosnia + 0x0405: "cs_CZ", # Czech + 0x0406: "da_DK", # Danish + 0x048c: "gbz_AF",# Dari - Afghanistan + 0x0465: "div_MV",# Divehi - Maldives + 0x0413: "nl_NL", # Dutch - The Netherlands + 0x0813: "nl_BE", # Dutch - Belgium + 0x0409: "en_US", # English - United States + 0x0809: "en_GB", # English - United Kingdom + 0x0c09: "en_AU", # English - Australia + 0x1009: "en_CA", # English - Canada + 0x1409: "en_NZ", # English - New Zealand + 0x1809: "en_IE", # English - Ireland + 0x1c09: "en_ZA", # English - South Africa + 0x2009: "en_JA", # English - Jamaica + 0x2409: "en_CB", # English - Carribbean + 0x2809: "en_BZ", # English - Belize + 0x2c09: "en_TT", # English - Trinidad + 0x3009: "en_ZW", # English - Zimbabwe + 0x3409: "en_PH", # English - Philippines + 0x4009: "en_IN", # English - India + 0x4409: "en_MY", # English - Malaysia + 0x4809: "en_IN", # English - Singapore + 0x0425: "et_EE", # Estonian + 0x0438: "fo_FO", # Faroese + 0x0464: "fil_PH",# Filipino + 0x040b: "fi_FI", # Finnish + 0x040c: "fr_FR", # French - France + 0x080c: "fr_BE", # French - Belgium + 0x0c0c: "fr_CA", # French - Canada + 0x100c: "fr_CH", # French - Switzerland + 0x140c: "fr_LU", # French - Luxembourg + 0x180c: "fr_MC", # French - Monaco + 0x0462: "fy_NL", # Frisian - Netherlands + 0x0456: "gl_ES", # Galician + 0x0437: "ka_GE", # Georgian + 0x0407: "de_DE", # German - Germany + 0x0807: "de_CH", # German - Switzerland + 0x0c07: "de_AT", # German - Austria + 0x1007: "de_LU", # German - Luxembourg + 0x1407: "de_LI", # German - Liechtenstein + 0x0408: "el_GR", # Greek + 0x046f: "kl_GL", # Greenlandic - Greenland + 0x0447: "gu_IN", # Gujarati + 0x0468: "ha_NG", # Hausa - Latin + 0x040d: "he_IL", # Hebrew + 0x0439: "hi_IN", # Hindi + 0x040e: "hu_HU", # Hungarian + 0x040f: "is_IS", # Icelandic + 0x0421: "id_ID", # Indonesian + 0x045d: "iu_CA", # Inuktitut - Syllabics + 0x085d: "iu_CA", # Inuktitut - Latin + 0x083c: "ga_IE", # Irish - Ireland + 0x0410: "it_IT", # Italian - Italy + 0x0810: "it_CH", # Italian - Switzerland + 0x0411: "ja_JP", # Japanese + 0x044b: "kn_IN", # Kannada - India + 0x043f: "kk_KZ", # Kazakh + 0x0453: "kh_KH", # Khmer - Cambodia + 0x0486: "qut_GT",# K'iche - Guatemala + 0x0487: "rw_RW", # Kinyarwanda - Rwanda + 0x0457: "kok_IN",# Konkani + 0x0412: "ko_KR", # Korean + 0x0440: "ky_KG", # Kyrgyz + 0x0454: "lo_LA", # Lao - Lao PDR + 0x0426: "lv_LV", # Latvian + 0x0427: "lt_LT", # Lithuanian + 0x082e: "dsb_DE",# Lower Sorbian - Germany + 0x046e: "lb_LU", # Luxembourgish + 0x042f: "mk_MK", # FYROM Macedonian + 0x043e: "ms_MY", # Malay - Malaysia + 0x083e: "ms_BN", # Malay - Brunei Darussalam + 0x044c: "ml_IN", # Malayalam - India + 0x043a: "mt_MT", # Maltese + 0x0481: "mi_NZ", # Maori + 0x047a: "arn_CL",# Mapudungun + 0x044e: "mr_IN", # Marathi + 0x047c: "moh_CA",# Mohawk - Canada + 0x0450: "mn_MN", # Mongolian - Cyrillic + 0x0850: "mn_CN", # Mongolian - PRC + 0x0461: "ne_NP", # Nepali + 0x0414: "nb_NO", # Norwegian - Bokmal + 0x0814: "nn_NO", # Norwegian - Nynorsk + 0x0482: "oc_FR", # Occitan - France + 0x0448: "or_IN", # Oriya - India + 0x0463: "ps_AF", # Pashto - Afghanistan + 0x0429: "fa_IR", # Persian + 0x0415: "pl_PL", # Polish + 0x0416: "pt_BR", # Portuguese - Brazil + 0x0816: "pt_PT", # Portuguese - Portugal + 0x0446: "pa_IN", # Punjabi + 0x046b: "quz_BO",# Quechua (Bolivia) + 0x086b: "quz_EC",# Quechua (Ecuador) + 0x0c6b: "quz_PE",# Quechua (Peru) + 0x0418: "ro_RO", # Romanian - Romania + 0x0417: "rm_CH", # Romansh + 0x0419: "ru_RU", # Russian + 0x243b: "smn_FI",# Sami Finland + 0x103b: "smj_NO",# Sami Norway + 0x143b: "smj_SE",# Sami Sweden + 0x043b: "se_NO", # Sami Northern Norway + 0x083b: "se_SE", # Sami Northern Sweden + 0x0c3b: "se_FI", # Sami Northern Finland + 0x203b: "sms_FI",# Sami Skolt + 0x183b: "sma_NO",# Sami Southern Norway + 0x1c3b: "sma_SE",# Sami Southern Sweden + 0x044f: "sa_IN", # Sanskrit + 0x0c1a: "sr_SP", # Serbian - Cyrillic + 0x1c1a: "sr_BA", # Serbian - Bosnia Cyrillic + 0x081a: "sr_SP", # Serbian - Latin + 0x181a: "sr_BA", # Serbian - Bosnia Latin + 0x045b: "si_LK", # Sinhala - Sri Lanka + 0x046c: "ns_ZA", # Northern Sotho + 0x0432: "tn_ZA", # Setswana - Southern Africa + 0x041b: "sk_SK", # Slovak + 0x0424: "sl_SI", # Slovenian + 0x040a: "es_ES", # Spanish - Spain + 0x080a: "es_MX", # Spanish - Mexico + 0x0c0a: "es_ES", # Spanish - Spain (Modern) + 0x100a: "es_GT", # Spanish - Guatemala + 0x140a: "es_CR", # Spanish - Costa Rica + 0x180a: "es_PA", # Spanish - Panama + 0x1c0a: "es_DO", # Spanish - Dominican Republic + 0x200a: "es_VE", # Spanish - Venezuela + 0x240a: "es_CO", # Spanish - Colombia + 0x280a: "es_PE", # Spanish - Peru + 0x2c0a: "es_AR", # Spanish - Argentina + 0x300a: "es_EC", # Spanish - Ecuador + 0x340a: "es_CL", # Spanish - Chile + 0x380a: "es_UR", # Spanish - Uruguay + 0x3c0a: "es_PY", # Spanish - Paraguay + 0x400a: "es_BO", # Spanish - Bolivia + 0x440a: "es_SV", # Spanish - El Salvador + 0x480a: "es_HN", # Spanish - Honduras + 0x4c0a: "es_NI", # Spanish - Nicaragua + 0x500a: "es_PR", # Spanish - Puerto Rico + 0x540a: "es_US", # Spanish - United States +# 0x0430: "", # Sutu - Not supported + 0x0441: "sw_KE", # Swahili + 0x041d: "sv_SE", # Swedish - Sweden + 0x081d: "sv_FI", # Swedish - Finland + 0x045a: "syr_SY",# Syriac + 0x0428: "tg_TJ", # Tajik - Cyrillic + 0x085f: "tmz_DZ",# Tamazight - Latin + 0x0449: "ta_IN", # Tamil + 0x0444: "tt_RU", # Tatar + 0x044a: "te_IN", # Telugu + 0x041e: "th_TH", # Thai + 0x0851: "bo_BT", # Tibetan - Bhutan + 0x0451: "bo_CN", # Tibetan - PRC + 0x041f: "tr_TR", # Turkish + 0x0442: "tk_TM", # Turkmen - Cyrillic + 0x0480: "ug_CN", # Uighur - Arabic + 0x0422: "uk_UA", # Ukrainian + 0x042e: "wen_DE",# Upper Sorbian - Germany + 0x0420: "ur_PK", # Urdu + 0x0820: "ur_IN", # Urdu - India + 0x0443: "uz_UZ", # Uzbek - Latin + 0x0843: "uz_UZ", # Uzbek - Cyrillic + 0x042a: "vi_VN", # Vietnamese + 0x0452: "cy_GB", # Welsh + 0x0488: "wo_SN", # Wolof - Senegal + 0x0434: "xh_ZA", # Xhosa - South Africa + 0x0485: "sah_RU",# Yakut - Cyrillic + 0x0478: "ii_CN", # Yi - PRC + 0x046a: "yo_NG", # Yoruba - Nigeria + 0x0435: "zu_ZA", # Zulu +} + +def _print_locale(): + + """ Test function. + """ + categories = {} + def _init_categories(categories=categories): + for k,v in globals().items(): + if k[:3] == 'LC_': + categories[k] = v + _init_categories() + del categories['LC_ALL'] + + print 'Locale defaults as determined by getdefaultlocale():' + print '-'*72 + lang, enc = getdefaultlocale() + print 'Language: ', lang or '(undefined)' + print 'Encoding: ', enc or '(undefined)' + print + + print 'Locale settings on startup:' + print '-'*72 + for name,category in categories.items(): + print name, '...' + lang, enc = getlocale(category) + print ' Language: ', lang or '(undefined)' + print ' Encoding: ', enc or '(undefined)' + print + + print + print 'Locale settings after calling resetlocale():' + print '-'*72 + resetlocale() + for name,category in categories.items(): + print name, '...' + lang, enc = getlocale(category) + print ' Language: ', lang or '(undefined)' + print ' Encoding: ', enc or '(undefined)' + print + + try: + setlocale(LC_ALL, "") + except: + print 'NOTE:' + print 'setlocale(LC_ALL, "") does not support the default locale' + print 'given in the OS environment variables.' + else: + print + print 'Locale settings after calling setlocale(LC_ALL, ""):' + print '-'*72 + for name,category in categories.items(): + print name, '...' + lang, enc = getlocale(category) + print ' Language: ', lang or '(undefined)' + print ' Encoding: ', enc or '(undefined)' + print + +### + +try: + LC_MESSAGES +except NameError: + pass +else: + __all__.append("LC_MESSAGES") + +if __name__=='__main__': + print 'Locale aliasing:' + print + _print_locale() + print + print 'Number formatting:' + print + _test() diff --git a/PythonEnv/2.7/Lib/locale.pyc b/PythonEnv/2.7/Lib/locale.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f717f0dbb9d0e460b853857609e4a0e3f750e08f GIT binary patch literal 51088 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/no-global-site-packages.txt b/PythonEnv/2.7/Lib/no-global-site-packages.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/PythonEnv/2.7/Lib/ntpath.py b/PythonEnv/2.7/Lib/ntpath.py new file mode 100644 index 0000000000..4f8f423c08 --- /dev/null +++ b/PythonEnv/2.7/Lib/ntpath.py @@ -0,0 +1,533 @@ +# Module 'ntpath' -- common operations on WinNT/Win95 pathnames +"""Common pathname manipulations, WindowsNT/95 version. + +Instead of importing this module directly, import os and refer to this +module as os.path. +""" + +import os +import sys +import stat +import genericpath +import warnings + +from genericpath import * + +__all__ = ["normcase","isabs","join","splitdrive","split","splitext", + "basename","dirname","commonprefix","getsize","getmtime", + "getatime","getctime", "islink","exists","lexists","isdir","isfile", + "ismount","walk","expanduser","expandvars","normpath","abspath", + "splitunc","curdir","pardir","sep","pathsep","defpath","altsep", + "extsep","devnull","realpath","supports_unicode_filenames","relpath"] + +# strings representing various path-related bits and pieces +curdir = '.' +pardir = '..' +extsep = '.' +sep = '\\' +pathsep = ';' +altsep = '/' +defpath = '.;C:\\bin' +if 'ce' in sys.builtin_module_names: + defpath = '\\Windows' +elif 'os2' in sys.builtin_module_names: + # OS/2 w/ VACPP + altsep = '/' +devnull = 'nul' + +# Normalize the case of a pathname and map slashes to backslashes. +# Other normalizations (such as optimizing '../' away) are not done +# (this is done by normpath). + +def normcase(s): + """Normalize case of pathname. + + Makes all characters lowercase and all slashes into backslashes.""" + return s.replace("/", "\\").lower() + + +# Return whether a path is absolute. +# Trivial in Posix, harder on the Mac or MS-DOS. +# For DOS it is absolute if it starts with a slash or backslash (current +# volume), or if a pathname after the volume letter and colon / UNC resource +# starts with a slash or backslash. + +def isabs(s): + """Test whether a path is absolute""" + s = splitdrive(s)[1] + return s != '' and s[:1] in '/\\' + + +# Join two (or more) paths. + +def join(a, *p): + """Join two or more pathname components, inserting "\\" as needed. + If any component is an absolute path, all previous path components + will be discarded.""" + path = a + for b in p: + b_wins = 0 # set to 1 iff b makes path irrelevant + if path == "": + b_wins = 1 + + elif isabs(b): + # This probably wipes out path so far. However, it's more + # complicated if path begins with a drive letter: + # 1. join('c:', '/a') == 'c:/a' + # 2. join('c:/', '/a') == 'c:/a' + # But + # 3. join('c:/a', '/b') == '/b' + # 4. join('c:', 'd:/') = 'd:/' + # 5. join('c:/', 'd:/') = 'd:/' + if path[1:2] != ":" or b[1:2] == ":": + # Path doesn't start with a drive letter, or cases 4 and 5. + b_wins = 1 + + # Else path has a drive letter, and b doesn't but is absolute. + elif len(path) > 3 or (len(path) == 3 and + path[-1] not in "/\\"): + # case 3 + b_wins = 1 + + if b_wins: + path = b + else: + # Join, and ensure there's a separator. + assert len(path) > 0 + if path[-1] in "/\\": + if b and b[0] in "/\\": + path += b[1:] + else: + path += b + elif path[-1] == ":": + path += b + elif b: + if b[0] in "/\\": + path += b + else: + path += "\\" + b + else: + # path is not empty and does not end with a backslash, + # but b is empty; since, e.g., split('a/') produces + # ('a', ''), it's best if join() adds a backslash in + # this case. + path += '\\' + + return path + + +# Split a path in a drive specification (a drive letter followed by a +# colon) and the path specification. +# It is always true that drivespec + pathspec == p +def splitdrive(p): + """Split a pathname into drive and path specifiers. Returns a 2-tuple +"(drive,path)"; either part may be empty""" + if p[1:2] == ':': + return p[0:2], p[2:] + return '', p + + +# Parse UNC paths +def splitunc(p): + """Split a pathname into UNC mount point and relative path specifiers. + + Return a 2-tuple (unc, rest); either part may be empty. + If unc is not empty, it has the form '//host/mount' (or similar + using backslashes). unc+rest is always the input path. + Paths containing drive letters never have an UNC part. + """ + if p[1:2] == ':': + return '', p # Drive letter present + firstTwo = p[0:2] + if firstTwo == '//' or firstTwo == '\\\\': + # is a UNC path: + # vvvvvvvvvvvvvvvvvvvv equivalent to drive letter + # \\machine\mountpoint\directories... + # directory ^^^^^^^^^^^^^^^ + normp = normcase(p) + index = normp.find('\\', 2) + if index == -1: + ##raise RuntimeError, 'illegal UNC path: "' + p + '"' + return ("", p) + index = normp.find('\\', index + 1) + if index == -1: + index = len(p) + return p[:index], p[index:] + return '', p + + +# Split a path in head (everything up to the last '/') and tail (the +# rest). After the trailing '/' is stripped, the invariant +# join(head, tail) == p holds. +# The resulting head won't end in '/' unless it is the root. + +def split(p): + """Split a pathname. + + Return tuple (head, tail) where tail is everything after the final slash. + Either part may be empty.""" + + d, p = splitdrive(p) + # set i to index beyond p's last slash + i = len(p) + while i and p[i-1] not in '/\\': + i = i - 1 + head, tail = p[:i], p[i:] # now tail has no slashes + # remove trailing slashes from head, unless it's all slashes + head2 = head + while head2 and head2[-1] in '/\\': + head2 = head2[:-1] + head = head2 or head + return d + head, tail + + +# Split a path in root and extension. +# The extension is everything starting at the last dot in the last +# pathname component; the root is everything before that. +# It is always true that root + ext == p. + +def splitext(p): + return genericpath._splitext(p, sep, altsep, extsep) +splitext.__doc__ = genericpath._splitext.__doc__ + + +# Return the tail (basename) part of a path. + +def basename(p): + """Returns the final component of a pathname""" + return split(p)[1] + + +# Return the head (dirname) part of a path. + +def dirname(p): + """Returns the directory component of a pathname""" + return split(p)[0] + +# Is a path a symbolic link? +# This will always return false on systems where posix.lstat doesn't exist. + +def islink(path): + """Test for symbolic link. + On WindowsNT/95 and OS/2 always returns false + """ + return False + +# alias exists to lexists +lexists = exists + +# Is a path a mount point? Either a root (with or without drive letter) +# or an UNC path with at most a / or \ after the mount point. + +def ismount(path): + """Test whether a path is a mount point (defined as root of drive)""" + unc, rest = splitunc(path) + if unc: + return rest in ("", "/", "\\") + p = splitdrive(path)[1] + return len(p) == 1 and p[0] in '/\\' + + +# Directory tree walk. +# For each directory under top (including top itself, but excluding +# '.' and '..'), func(arg, dirname, filenames) is called, where +# dirname is the name of the directory and filenames is the list +# of files (and subdirectories etc.) in the directory. +# The func may modify the filenames list, to implement a filter, +# or to impose a different order of visiting. + +def walk(top, func, arg): + """Directory tree walk with callback function. + + For each directory in the directory tree rooted at top (including top + itself, but excluding '.' and '..'), call func(arg, dirname, fnames). + dirname is the name of the directory, and fnames a list of the names of + the files and subdirectories in dirname (excluding '.' and '..'). func + may modify the fnames list in-place (e.g. via del or slice assignment), + and walk will only recurse into the subdirectories whose names remain in + fnames; this can be used to implement a filter, or to impose a specific + order of visiting. No semantics are defined for, or required of, arg, + beyond that arg is always passed to func. It can be used, e.g., to pass + a filename pattern, or a mutable object designed to accumulate + statistics. Passing None for arg is common.""" + warnings.warnpy3k("In 3.x, os.path.walk is removed in favor of os.walk.", + stacklevel=2) + try: + names = os.listdir(top) + except os.error: + return + func(arg, top, names) + for name in names: + name = join(top, name) + if isdir(name): + walk(name, func, arg) + + +# Expand paths beginning with '~' or '~user'. +# '~' means $HOME; '~user' means that user's home directory. +# If the path doesn't begin with '~', or if the user or $HOME is unknown, +# the path is returned unchanged (leaving error reporting to whatever +# function is called with the expanded path as argument). +# See also module 'glob' for expansion of *, ? and [...] in pathnames. +# (A function should also be defined to do full *sh-style environment +# variable expansion.) + +def expanduser(path): + """Expand ~ and ~user constructs. + + If user or $HOME is unknown, do nothing.""" + if path[:1] != '~': + return path + i, n = 1, len(path) + while i < n and path[i] not in '/\\': + i = i + 1 + + if 'HOME' in os.environ: + userhome = os.environ['HOME'] + elif 'USERPROFILE' in os.environ: + userhome = os.environ['USERPROFILE'] + elif not 'HOMEPATH' in os.environ: + return path + else: + try: + drive = os.environ['HOMEDRIVE'] + except KeyError: + drive = '' + userhome = join(drive, os.environ['HOMEPATH']) + + if i != 1: #~user + userhome = join(dirname(userhome), path[1:i]) + + return userhome + path[i:] + + +# Expand paths containing shell variable substitutions. +# The following rules apply: +# - no expansion within single quotes +# - '$$' is translated into '$' +# - '%%' is translated into '%' if '%%' are not seen in %var1%%var2% +# - ${varname} is accepted. +# - $varname is accepted. +# - %varname% is accepted. +# - varnames can be made out of letters, digits and the characters '_-' +# (though is not verified in the ${varname} and %varname% cases) +# XXX With COMMAND.COM you can use any characters in a variable name, +# XXX except '^|<>='. + +def expandvars(path): + """Expand shell variables of the forms $var, ${var} and %var%. + + Unknown variables are left unchanged.""" + if '$' not in path and '%' not in path: + return path + import string + varchars = string.ascii_letters + string.digits + '_-' + res = '' + index = 0 + pathlen = len(path) + while index < pathlen: + c = path[index] + if c == '\'': # no expansion within single quotes + path = path[index + 1:] + pathlen = len(path) + try: + index = path.index('\'') + res = res + '\'' + path[:index + 1] + except ValueError: + res = res + path + index = pathlen - 1 + elif c == '%': # variable or '%' + if path[index + 1:index + 2] == '%': + res = res + c + index = index + 1 + else: + path = path[index+1:] + pathlen = len(path) + try: + index = path.index('%') + except ValueError: + res = res + '%' + path + index = pathlen - 1 + else: + var = path[:index] + if var in os.environ: + res = res + os.environ[var] + else: + res = res + '%' + var + '%' + elif c == '$': # variable or '$$' + if path[index + 1:index + 2] == '$': + res = res + c + index = index + 1 + elif path[index + 1:index + 2] == '{': + path = path[index+2:] + pathlen = len(path) + try: + index = path.index('}') + var = path[:index] + if var in os.environ: + res = res + os.environ[var] + else: + res = res + '${' + var + '}' + except ValueError: + res = res + '${' + path + index = pathlen - 1 + else: + var = '' + index = index + 1 + c = path[index:index + 1] + while c != '' and c in varchars: + var = var + c + index = index + 1 + c = path[index:index + 1] + if var in os.environ: + res = res + os.environ[var] + else: + res = res + '$' + var + if c != '': + index = index - 1 + else: + res = res + c + index = index + 1 + return res + + +# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A\B. +# Previously, this function also truncated pathnames to 8+3 format, +# but as this module is called "ntpath", that's obviously wrong! + +def normpath(path): + """Normalize path, eliminating double slashes, etc.""" + # Preserve unicode (if path is unicode) + backslash, dot = (u'\\', u'.') if isinstance(path, unicode) else ('\\', '.') + if path.startswith(('\\\\.\\', '\\\\?\\')): + # in the case of paths with these prefixes: + # \\.\ -> device names + # \\?\ -> literal paths + # do not do any normalization, but return the path unchanged + return path + path = path.replace("/", "\\") + prefix, path = splitdrive(path) + # We need to be careful here. If the prefix is empty, and the path starts + # with a backslash, it could either be an absolute path on the current + # drive (\dir1\dir2\file) or a UNC filename (\\server\mount\dir1\file). It + # is therefore imperative NOT to collapse multiple backslashes blindly in + # that case. + # The code below preserves multiple backslashes when there is no drive + # letter. This means that the invalid filename \\\a\b is preserved + # unchanged, where a\\\b is normalised to a\b. It's not clear that there + # is any better behaviour for such edge cases. + if prefix == '': + # No drive letter - preserve initial backslashes + while path[:1] == "\\": + prefix = prefix + backslash + path = path[1:] + else: + # We have a drive letter - collapse initial backslashes + if path.startswith("\\"): + prefix = prefix + backslash + path = path.lstrip("\\") + comps = path.split("\\") + i = 0 + while i < len(comps): + if comps[i] in ('.', ''): + del comps[i] + elif comps[i] == '..': + if i > 0 and comps[i-1] != '..': + del comps[i-1:i+1] + i -= 1 + elif i == 0 and prefix.endswith("\\"): + del comps[i] + else: + i += 1 + else: + i += 1 + # If the path is now empty, substitute '.' + if not prefix and not comps: + comps.append(dot) + return prefix + backslash.join(comps) + + +# Return an absolute path. +try: + from nt import _getfullpathname + +except ImportError: # not running on Windows - mock up something sensible + def abspath(path): + """Return the absolute version of a path.""" + if not isabs(path): + if isinstance(path, unicode): + cwd = os.getcwdu() + else: + cwd = os.getcwd() + path = join(cwd, path) + return normpath(path) + +else: # use native Windows method on Windows + def abspath(path): + """Return the absolute version of a path.""" + + if path: # Empty path must return current working directory. + try: + path = _getfullpathname(path) + except WindowsError: + pass # Bad path - return unchanged. + elif isinstance(path, unicode): + path = os.getcwdu() + else: + path = os.getcwd() + return normpath(path) + +# realpath is a no-op on systems without islink support +realpath = abspath +# Win9x family and earlier have no Unicode filename support. +supports_unicode_filenames = (hasattr(sys, "getwindowsversion") and + sys.getwindowsversion()[3] >= 2) + +def _abspath_split(path): + abs = abspath(normpath(path)) + prefix, rest = splitunc(abs) + is_unc = bool(prefix) + if not is_unc: + prefix, rest = splitdrive(abs) + return is_unc, prefix, [x for x in rest.split(sep) if x] + +def relpath(path, start=curdir): + """Return a relative version of a path""" + + if not path: + raise ValueError("no path specified") + + start_is_unc, start_prefix, start_list = _abspath_split(start) + path_is_unc, path_prefix, path_list = _abspath_split(path) + + if path_is_unc ^ start_is_unc: + raise ValueError("Cannot mix UNC and non-UNC paths (%s and %s)" + % (path, start)) + if path_prefix.lower() != start_prefix.lower(): + if path_is_unc: + raise ValueError("path is on UNC root %s, start on UNC root %s" + % (path_prefix, start_prefix)) + else: + raise ValueError("path is on drive %s, start on drive %s" + % (path_prefix, start_prefix)) + # Work out how much of the filepath is shared by start and path. + i = 0 + for e1, e2 in zip(start_list, path_list): + if e1.lower() != e2.lower(): + break + i += 1 + + rel_list = [pardir] * (len(start_list)-i) + path_list[i:] + if not rel_list: + return curdir + return join(*rel_list) + +try: + # The genericpath.isdir implementation uses os.stat and checks the mode + # attribute to tell whether or not the path is a directory. + # This is overkill on Windows - just pass the path to GetFileAttributes + # and check the attribute from there. + from nt import _isdir as isdir +except ImportError: + # Use genericpath.isdir as imported above. + pass diff --git a/PythonEnv/2.7/Lib/ntpath.pyc b/PythonEnv/2.7/Lib/ntpath.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a68a8268727224375e5a8219184767c9029d34c GIT binary patch literal 12621 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 integer + +Execute file with arguments from args in a subprocess. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return _spawnvef(mode, file, args, None, execv) + + def spawnve(mode, file, args, env): + """spawnve(mode, file, args, env) -> integer + +Execute file with arguments from args in a subprocess with the +specified environment. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return _spawnvef(mode, file, args, env, execve) + + # Note: spawnvp[e] is't currently supported on Windows + + def spawnvp(mode, file, args): + """spawnvp(mode, file, args) -> integer + +Execute file (which is looked for along $PATH) with arguments from +args in a subprocess. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return _spawnvef(mode, file, args, None, execvp) + + def spawnvpe(mode, file, args, env): + """spawnvpe(mode, file, args, env) -> integer + +Execute file (which is looked for along $PATH) with arguments from +args in a subprocess with the supplied environment. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return _spawnvef(mode, file, args, env, execvpe) + +if _exists("spawnv"): + # These aren't supplied by the basic Windows code + # but can be easily implemented in Python + + def spawnl(mode, file, *args): + """spawnl(mode, file, *args) -> integer + +Execute file with arguments from args in a subprocess. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return spawnv(mode, file, args) + + def spawnle(mode, file, *args): + """spawnle(mode, file, *args, env) -> integer + +Execute file with arguments from args in a subprocess with the +supplied environment. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + env = args[-1] + return spawnve(mode, file, args[:-1], env) + + + __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",]) + + +if _exists("spawnvp"): + # At the moment, Windows doesn't implement spawnvp[e], + # so it won't have spawnlp[e] either. + def spawnlp(mode, file, *args): + """spawnlp(mode, file, *args) -> integer + +Execute file (which is looked for along $PATH) with arguments from +args in a subprocess with the supplied environment. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return spawnvp(mode, file, args) + + def spawnlpe(mode, file, *args): + """spawnlpe(mode, file, *args, env) -> integer + +Execute file (which is looked for along $PATH) with arguments from +args in a subprocess with the supplied environment. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + env = args[-1] + return spawnvpe(mode, file, args[:-1], env) + + + __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",]) + + +# Supply popen2 etc. (for Unix) +if _exists("fork"): + if not _exists("popen2"): + def popen2(cmd, mode="t", bufsize=-1): + """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd' + may be a sequence, in which case arguments will be passed directly to + the program without shell intervention (as with os.spawnv()). If 'cmd' + is a string it will be passed to the shell (as with os.system()). If + 'bufsize' is specified, it sets the buffer size for the I/O pipes. The + file objects (child_stdin, child_stdout) are returned.""" + import warnings + msg = "os.popen2 is deprecated. Use the subprocess module." + warnings.warn(msg, DeprecationWarning, stacklevel=2) + + import subprocess + PIPE = subprocess.PIPE + p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring), + bufsize=bufsize, stdin=PIPE, stdout=PIPE, + close_fds=True) + return p.stdin, p.stdout + __all__.append("popen2") + + if not _exists("popen3"): + def popen3(cmd, mode="t", bufsize=-1): + """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd' + may be a sequence, in which case arguments will be passed directly to + the program without shell intervention (as with os.spawnv()). If 'cmd' + is a string it will be passed to the shell (as with os.system()). If + 'bufsize' is specified, it sets the buffer size for the I/O pipes. The + file objects (child_stdin, child_stdout, child_stderr) are returned.""" + import warnings + msg = "os.popen3 is deprecated. Use the subprocess module." + warnings.warn(msg, DeprecationWarning, stacklevel=2) + + import subprocess + PIPE = subprocess.PIPE + p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring), + bufsize=bufsize, stdin=PIPE, stdout=PIPE, + stderr=PIPE, close_fds=True) + return p.stdin, p.stdout, p.stderr + __all__.append("popen3") + + if not _exists("popen4"): + def popen4(cmd, mode="t", bufsize=-1): + """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd' + may be a sequence, in which case arguments will be passed directly to + the program without shell intervention (as with os.spawnv()). If 'cmd' + is a string it will be passed to the shell (as with os.system()). If + 'bufsize' is specified, it sets the buffer size for the I/O pipes. The + file objects (child_stdin, child_stdout_stderr) are returned.""" + import warnings + msg = "os.popen4 is deprecated. Use the subprocess module." + warnings.warn(msg, DeprecationWarning, stacklevel=2) + + import subprocess + PIPE = subprocess.PIPE + p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring), + bufsize=bufsize, stdin=PIPE, stdout=PIPE, + stderr=subprocess.STDOUT, close_fds=True) + return p.stdin, p.stdout + __all__.append("popen4") + +import copy_reg as _copy_reg + +def _make_stat_result(tup, dict): + return stat_result(tup, dict) + +def _pickle_stat_result(sr): + (type, args) = sr.__reduce__() + return (_make_stat_result, args) + +try: + _copy_reg.pickle(stat_result, _pickle_stat_result, _make_stat_result) +except NameError: # stat_result may not exist + pass + +def _make_statvfs_result(tup, dict): + return statvfs_result(tup, dict) + +def _pickle_statvfs_result(sr): + (type, args) = sr.__reduce__() + return (_make_statvfs_result, args) + +try: + _copy_reg.pickle(statvfs_result, _pickle_statvfs_result, + _make_statvfs_result) +except NameError: # statvfs_result may not exist + pass diff --git a/PythonEnv/2.7/Lib/os.pyc b/PythonEnv/2.7/Lib/os.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5de03e6ef5be73c1328c5788dbb1971352f65935 GIT binary patch literal 27518 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/posixpath.py b/PythonEnv/2.7/Lib/posixpath.py new file mode 100644 index 0000000000..d65dc757b2 --- /dev/null +++ b/PythonEnv/2.7/Lib/posixpath.py @@ -0,0 +1,431 @@ +"""Common operations on Posix pathnames. + +Instead of importing this module directly, import os and refer to +this module as os.path. The "os.path" name is an alias for this +module on Posix systems; on other systems (e.g. Mac, Windows), +os.path provides the same operations in a manner specific to that +platform, and is an alias to another module (e.g. macpath, ntpath). + +Some of this can actually be useful on non-Posix systems too, e.g. +for manipulation of the pathname component of URLs. +""" + +import os +import sys +import stat +import genericpath +import warnings +from genericpath import * + +try: + _unicode = unicode +except NameError: + # If Python is built without Unicode support, the unicode type + # will not exist. Fake one. + class _unicode(object): + pass + +__all__ = ["normcase","isabs","join","splitdrive","split","splitext", + "basename","dirname","commonprefix","getsize","getmtime", + "getatime","getctime","islink","exists","lexists","isdir","isfile", + "ismount","walk","expanduser","expandvars","normpath","abspath", + "samefile","sameopenfile","samestat", + "curdir","pardir","sep","pathsep","defpath","altsep","extsep", + "devnull","realpath","supports_unicode_filenames","relpath"] + +# strings representing various path-related bits and pieces +curdir = '.' +pardir = '..' +extsep = '.' +sep = '/' +pathsep = ':' +defpath = ':/bin:/usr/bin' +altsep = None +devnull = '/dev/null' + +# Normalize the case of a pathname. Trivial in Posix, string.lower on Mac. +# On MS-DOS this may also turn slashes into backslashes; however, other +# normalizations (such as optimizing '../' away) are not allowed +# (another function should be defined to do that). + +def normcase(s): + """Normalize case of pathname. Has no effect under Posix""" + return s + + +# Return whether a path is absolute. +# Trivial in Posix, harder on the Mac or MS-DOS. + +def isabs(s): + """Test whether a path is absolute""" + return s.startswith('/') + + +# Join pathnames. +# Ignore the previous parts if a part is absolute. +# Insert a '/' unless the first part is empty or already ends in '/'. + +def join(a, *p): + """Join two or more pathname components, inserting '/' as needed. + If any component is an absolute path, all previous path components + will be discarded. An empty last part will result in a path that + ends with a separator.""" + path = a + for b in p: + if b.startswith('/'): + path = b + elif path == '' or path.endswith('/'): + path += b + else: + path += '/' + b + return path + + +# Split a path in head (everything up to the last '/') and tail (the +# rest). If the path ends in '/', tail will be empty. If there is no +# '/' in the path, head will be empty. +# Trailing '/'es are stripped from head unless it is the root. + +def split(p): + """Split a pathname. Returns tuple "(head, tail)" where "tail" is + everything after the final slash. Either part may be empty.""" + i = p.rfind('/') + 1 + head, tail = p[:i], p[i:] + if head and head != '/'*len(head): + head = head.rstrip('/') + return head, tail + + +# Split a path in root and extension. +# The extension is everything starting at the last dot in the last +# pathname component; the root is everything before that. +# It is always true that root + ext == p. + +def splitext(p): + return genericpath._splitext(p, sep, altsep, extsep) +splitext.__doc__ = genericpath._splitext.__doc__ + +# Split a pathname into a drive specification and the rest of the +# path. Useful on DOS/Windows/NT; on Unix, the drive is always empty. + +def splitdrive(p): + """Split a pathname into drive and path. On Posix, drive is always + empty.""" + return '', p + + +# Return the tail (basename) part of a path, same as split(path)[1]. + +def basename(p): + """Returns the final component of a pathname""" + i = p.rfind('/') + 1 + return p[i:] + + +# Return the head (dirname) part of a path, same as split(path)[0]. + +def dirname(p): + """Returns the directory component of a pathname""" + i = p.rfind('/') + 1 + head = p[:i] + if head and head != '/'*len(head): + head = head.rstrip('/') + return head + + +# Is a path a symbolic link? +# This will always return false on systems where os.lstat doesn't exist. + +def islink(path): + """Test whether a path is a symbolic link""" + try: + st = os.lstat(path) + except (os.error, AttributeError): + return False + return stat.S_ISLNK(st.st_mode) + +# Being true for dangling symbolic links is also useful. + +def lexists(path): + """Test whether a path exists. Returns True for broken symbolic links""" + try: + os.lstat(path) + except os.error: + return False + return True + + +# Are two filenames really pointing to the same file? + +def samefile(f1, f2): + """Test whether two pathnames reference the same actual file""" + s1 = os.stat(f1) + s2 = os.stat(f2) + return samestat(s1, s2) + + +# Are two open files really referencing the same file? +# (Not necessarily the same file descriptor!) + +def sameopenfile(fp1, fp2): + """Test whether two open file objects reference the same file""" + s1 = os.fstat(fp1) + s2 = os.fstat(fp2) + return samestat(s1, s2) + + +# Are two stat buffers (obtained from stat, fstat or lstat) +# describing the same file? + +def samestat(s1, s2): + """Test whether two stat buffers reference the same file""" + return s1.st_ino == s2.st_ino and \ + s1.st_dev == s2.st_dev + + +# Is a path a mount point? +# (Does this work for all UNIXes? Is it even guaranteed to work by Posix?) + +def ismount(path): + """Test whether a path is a mount point""" + if islink(path): + # A symlink can never be a mount point + return False + try: + s1 = os.lstat(path) + s2 = os.lstat(join(path, '..')) + except os.error: + return False # It doesn't exist -- so not a mount point :-) + dev1 = s1.st_dev + dev2 = s2.st_dev + if dev1 != dev2: + return True # path/.. on a different device as path + ino1 = s1.st_ino + ino2 = s2.st_ino + if ino1 == ino2: + return True # path/.. is the same i-node as path + return False + + +# Directory tree walk. +# For each directory under top (including top itself, but excluding +# '.' and '..'), func(arg, dirname, filenames) is called, where +# dirname is the name of the directory and filenames is the list +# of files (and subdirectories etc.) in the directory. +# The func may modify the filenames list, to implement a filter, +# or to impose a different order of visiting. + +def walk(top, func, arg): + """Directory tree walk with callback function. + + For each directory in the directory tree rooted at top (including top + itself, but excluding '.' and '..'), call func(arg, dirname, fnames). + dirname is the name of the directory, and fnames a list of the names of + the files and subdirectories in dirname (excluding '.' and '..'). func + may modify the fnames list in-place (e.g. via del or slice assignment), + and walk will only recurse into the subdirectories whose names remain in + fnames; this can be used to implement a filter, or to impose a specific + order of visiting. No semantics are defined for, or required of, arg, + beyond that arg is always passed to func. It can be used, e.g., to pass + a filename pattern, or a mutable object designed to accumulate + statistics. Passing None for arg is common.""" + warnings.warnpy3k("In 3.x, os.path.walk is removed in favor of os.walk.", + stacklevel=2) + try: + names = os.listdir(top) + except os.error: + return + func(arg, top, names) + for name in names: + name = join(top, name) + try: + st = os.lstat(name) + except os.error: + continue + if stat.S_ISDIR(st.st_mode): + walk(name, func, arg) + + +# Expand paths beginning with '~' or '~user'. +# '~' means $HOME; '~user' means that user's home directory. +# If the path doesn't begin with '~', or if the user or $HOME is unknown, +# the path is returned unchanged (leaving error reporting to whatever +# function is called with the expanded path as argument). +# See also module 'glob' for expansion of *, ? and [...] in pathnames. +# (A function should also be defined to do full *sh-style environment +# variable expansion.) + +def expanduser(path): + """Expand ~ and ~user constructions. If user or $HOME is unknown, + do nothing.""" + if not path.startswith('~'): + return path + i = path.find('/', 1) + if i < 0: + i = len(path) + if i == 1: + if 'HOME' not in os.environ: + import pwd + userhome = pwd.getpwuid(os.getuid()).pw_dir + else: + userhome = os.environ['HOME'] + else: + import pwd + try: + pwent = pwd.getpwnam(path[1:i]) + except KeyError: + return path + userhome = pwent.pw_dir + userhome = userhome.rstrip('/') + return (userhome + path[i:]) or '/' + + +# Expand paths containing shell variable substitutions. +# This expands the forms $variable and ${variable} only. +# Non-existent variables are left unchanged. + +_varprog = None + +def expandvars(path): + """Expand shell variables of form $var and ${var}. Unknown variables + are left unchanged.""" + global _varprog + if '$' not in path: + return path + if not _varprog: + import re + _varprog = re.compile(r'\$(\w+|\{[^}]*\})') + i = 0 + while True: + m = _varprog.search(path, i) + if not m: + break + i, j = m.span(0) + name = m.group(1) + if name.startswith('{') and name.endswith('}'): + name = name[1:-1] + if name in os.environ: + tail = path[j:] + path = path[:i] + os.environ[name] + i = len(path) + path += tail + else: + i = j + return path + + +# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B. +# It should be understood that this may change the meaning of the path +# if it contains symbolic links! + +def normpath(path): + """Normalize path, eliminating double slashes, etc.""" + # Preserve unicode (if path is unicode) + slash, dot = (u'/', u'.') if isinstance(path, _unicode) else ('/', '.') + if path == '': + return dot + initial_slashes = path.startswith('/') + # POSIX allows one or two initial slashes, but treats three or more + # as single slash. + if (initial_slashes and + path.startswith('//') and not path.startswith('///')): + initial_slashes = 2 + comps = path.split('/') + new_comps = [] + for comp in comps: + if comp in ('', '.'): + continue + if (comp != '..' or (not initial_slashes and not new_comps) or + (new_comps and new_comps[-1] == '..')): + new_comps.append(comp) + elif new_comps: + new_comps.pop() + comps = new_comps + path = slash.join(comps) + if initial_slashes: + path = slash*initial_slashes + path + return path or dot + + +def abspath(path): + """Return an absolute path.""" + if not isabs(path): + if isinstance(path, _unicode): + cwd = os.getcwdu() + else: + cwd = os.getcwd() + path = join(cwd, path) + return normpath(path) + + +# Return a canonical path (i.e. the absolute location of a file on the +# filesystem). + +def realpath(filename): + """Return the canonical path of the specified filename, eliminating any +symbolic links encountered in the path.""" + path, ok = _joinrealpath('', filename, {}) + return abspath(path) + +# Join two paths, normalizing ang eliminating any symbolic links +# encountered in the second path. +def _joinrealpath(path, rest, seen): + if isabs(rest): + rest = rest[1:] + path = sep + + while rest: + name, _, rest = rest.partition(sep) + if not name or name == curdir: + # current dir + continue + if name == pardir: + # parent dir + if path: + path, name = split(path) + if name == pardir: + path = join(path, pardir, pardir) + else: + path = pardir + continue + newpath = join(path, name) + if not islink(newpath): + path = newpath + continue + # Resolve the symbolic link + if newpath in seen: + # Already seen this path + path = seen[newpath] + if path is not None: + # use cached value + continue + # The symlink is not resolved, so we must have a symlink loop. + # Return already resolved part + rest of the path unchanged. + return join(newpath, rest), False + seen[newpath] = None # not resolved symlink + path, ok = _joinrealpath(path, os.readlink(newpath), seen) + if not ok: + return join(path, rest), False + seen[newpath] = path # resolved symlink + + return path, True + + +supports_unicode_filenames = (sys.platform == 'darwin') + +def relpath(path, start=curdir): + """Return a relative version of a path""" + + if not path: + raise ValueError("no path specified") + + start_list = [x for x in abspath(start).split(sep) if x] + path_list = [x for x in abspath(path).split(sep) if x] + + # Work out how much of the filepath is shared by start and path. + i = len(commonprefix([start_list, path_list])) + + rel_list = [pardir] * (len(start_list)-i) + path_list[i:] + if not rel_list: + return curdir + return join(*rel_list) diff --git a/PythonEnv/2.7/Lib/posixpath.pyc b/PythonEnv/2.7/Lib/posixpath.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2cbce408ff0b640bd107612ee30c2a9a279b5224 GIT binary patch literal 12185 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...) The substring matched by the group is accessible by name. + (?P=name) Matches the text matched earlier by the group named name. + (?#...) A comment; ignored. + (?=...) Matches if ... matches next, but doesn't consume the string. + (?!...) Matches if ... doesn't match next. + (?<=...) Matches if preceded by ... (must be fixed length). + (?= 0x02020000: + __all__.append("finditer") + def finditer(pattern, string, flags=0): + """Return an iterator over all non-overlapping matches in the + string. For each match, the iterator returns a match object. + + Empty matches are included in the result.""" + return _compile(pattern, flags).finditer(string) + +def compile(pattern, flags=0): + "Compile a regular expression pattern, returning a pattern object." + return _compile(pattern, flags) + +def purge(): + "Clear the regular expression cache" + _cache.clear() + _cache_repl.clear() + +def template(pattern, flags=0): + "Compile a template pattern, returning a pattern object" + return _compile(pattern, flags|T) + +_alphanum = frozenset( + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + +def escape(pattern): + "Escape all non-alphanumeric characters in pattern." + s = list(pattern) + alphanum = _alphanum + for i, c in enumerate(pattern): + if c not in alphanum: + if c == "\000": + s[i] = "\\000" + else: + s[i] = "\\" + c + return pattern[:0].join(s) + +# -------------------------------------------------------------------- +# internals + +_cache = {} +_cache_repl = {} + +_pattern_type = type(sre_compile.compile("", 0)) + +_MAXCACHE = 100 + +def _compile(*key): + # internal: compile pattern + cachekey = (type(key[0]),) + key + p = _cache.get(cachekey) + if p is not None: + return p + pattern, flags = key + if isinstance(pattern, _pattern_type): + if flags: + raise ValueError('Cannot process flags argument with a compiled pattern') + return pattern + if not sre_compile.isstring(pattern): + raise TypeError, "first argument must be string or compiled pattern" + try: + p = sre_compile.compile(pattern, flags) + except error, v: + raise error, v # invalid expression + if len(_cache) >= _MAXCACHE: + _cache.clear() + _cache[cachekey] = p + return p + +def _compile_repl(*key): + # internal: compile replacement pattern + p = _cache_repl.get(key) + if p is not None: + return p + repl, pattern = key + try: + p = sre_parse.parse_template(repl, pattern) + except error, v: + raise error, v # invalid expression + if len(_cache_repl) >= _MAXCACHE: + _cache_repl.clear() + _cache_repl[key] = p + return p + +def _expand(pattern, match, template): + # internal: match.expand implementation hook + template = sre_parse.parse_template(template, pattern) + return sre_parse.expand_template(template, match) + +def _subx(pattern, template): + # internal: pattern.sub/subn implementation helper + template = _compile_repl(template, pattern) + if not template[0] and len(template[1]) == 1: + # literal replacement + return template[1][0] + def filter(match, template=template): + return sre_parse.expand_template(template, match) + return filter + +# register myself for pickling + +import copy_reg + +def _pickle(p): + return _compile, (p.pattern, p.flags) + +copy_reg.pickle(_pattern_type, _pickle, _compile) + +# -------------------------------------------------------------------- +# experimental stuff (see python-dev discussions for details) + +class Scanner: + def __init__(self, lexicon, flags=0): + from sre_constants import BRANCH, SUBPATTERN + self.lexicon = lexicon + # combine phrases into a compound pattern + p = [] + s = sre_parse.Pattern() + s.flags = flags + for phrase, action in lexicon: + p.append(sre_parse.SubPattern(s, [ + (SUBPATTERN, (len(p)+1, sre_parse.parse(phrase, flags))), + ])) + s.groups = len(p)+1 + p = sre_parse.SubPattern(s, [(BRANCH, (None, p))]) + self.scanner = sre_compile.compile(p) + def scan(self, string): + result = [] + append = result.append + match = self.scanner.scanner(string).match + i = 0 + while 1: + m = match() + if not m: + break + j = m.end() + if i == j: + break + action = self.lexicon[m.lastindex-1][1] + if hasattr(action, '__call__'): + self.match = m + action = action(self, m.group()) + if action is not None: + append(action) + i = j + return result, string[i:] diff --git a/PythonEnv/2.7/Lib/re.pyc b/PythonEnv/2.7/Lib/re.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f95444a656a46d4e26329c2aa3ad71d030145cf5 GIT binary patch literal 13871 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 C<`Uch literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/_markerlib/__init__.py b/PythonEnv/2.7/Lib/site-packages/_markerlib/__init__.py new file mode 100644 index 0000000000..e2b237b1f6 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/_markerlib/__init__.py @@ -0,0 +1,16 @@ +try: + import ast + from _markerlib.markers import default_environment, compile, interpret +except ImportError: + if 'ast' in globals(): + raise + def default_environment(): + return {} + def compile(marker): + def marker_fn(environment=None, override=None): + # 'empty markers are True' heuristic won't install extra deps. + return not marker.strip() + marker_fn.__doc__ = marker + return marker_fn + def interpret(marker, environment=None, override=None): + return compile(marker)() diff --git a/PythonEnv/2.7/Lib/site-packages/_markerlib/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/_markerlib/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..614edeada9aa2a69a34e3f8ed2d9d75b7588b3a1 GIT binary patch literal 1292 zcmcgqO^?$s5FICJpk=E?Anu4$4{Q%ykPt$wmK8!m6`MUQsv@j>xZTjiiEOu05nNye z{80V@KLF-Az*hW#M)AwU_Ke@W=kVuvlpp;#E9lQN;O}!D_5;KAA(cd>pqgmT0lxv& zf|`Kl0W~4bLuw+LM z#&pFsBhrH2^8fkd1|MJj;%7DqIdpd!O0~$=wUbJ3D%0vlY3H!7Xq&F8l^Y^QJ7qef zoI_e>-M`KR|DW)%5w;PZftlHaf&K&gj_1lJ>9TT{>pZ=v^l`l~s@#e4N~bSWzFwwp zw(hdkr+SkLC&lIVxS77vbPv`<9mVy2Y-9TvV+CenX2=- z4m)=hy~+RWMj2C;%1h*8p6Q$LI_*InZ)Ja^T<8%9qdN+E%Ft-mYUSORvTO?}{YnBw z6LjF2dis8D51bQ-iz{fM7m0h}P!wO$eTn}-Umt0IBXM!f&9fs@cJnap#{wjO!2{QbJdewBTai_*G!jom)=2>kM=yTnT ikM_`#Lkmxvwp`ch8Emq*8A5R&?u)TF6tNfv!}vESHZ5)d literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/_markerlib/markers.py b/PythonEnv/2.7/Lib/site-packages/_markerlib/markers.py new file mode 100644 index 0000000000..fa837061e0 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/_markerlib/markers.py @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- +"""Interpret PEP 345 environment markers. + +EXPR [in|==|!=|not in] EXPR [or|and] ... + +where EXPR belongs to any of those: + + python_version = '%s.%s' % (sys.version_info[0], sys.version_info[1]) + python_full_version = sys.version.split()[0] + os.name = os.name + sys.platform = sys.platform + platform.version = platform.version() + platform.machine = platform.machine() + platform.python_implementation = platform.python_implementation() + a free string, like '2.6', or 'win32' +""" + +__all__ = ['default_environment', 'compile', 'interpret'] + +import ast +import os +import platform +import sys +import weakref + +_builtin_compile = compile + +try: + from platform import python_implementation +except ImportError: + if os.name == "java": + # Jython 2.5 has ast module, but not platform.python_implementation() function. + def python_implementation(): + return "Jython" + else: + raise + + +# restricted set of variables +_VARS = {'sys.platform': sys.platform, + 'python_version': '%s.%s' % sys.version_info[:2], + # FIXME parsing sys.platform is not reliable, but there is no other + # way to get e.g. 2.7.2+, and the PEP is defined with sys.version + 'python_full_version': sys.version.split(' ', 1)[0], + 'os.name': os.name, + 'platform.version': platform.version(), + 'platform.machine': platform.machine(), + 'platform.python_implementation': python_implementation(), + 'extra': None # wheel extension + } + +for var in list(_VARS.keys()): + if '.' in var: + _VARS[var.replace('.', '_')] = _VARS[var] + +def default_environment(): + """Return copy of default PEP 385 globals dictionary.""" + return dict(_VARS) + +class ASTWhitelist(ast.NodeTransformer): + def __init__(self, statement): + self.statement = statement # for error messages + + ALLOWED = (ast.Compare, ast.BoolOp, ast.Attribute, ast.Name, ast.Load, ast.Str) + # Bool operations + ALLOWED += (ast.And, ast.Or) + # Comparison operations + ALLOWED += (ast.Eq, ast.Gt, ast.GtE, ast.In, ast.Is, ast.IsNot, ast.Lt, ast.LtE, ast.NotEq, ast.NotIn) + + def visit(self, node): + """Ensure statement only contains allowed nodes.""" + if not isinstance(node, self.ALLOWED): + raise SyntaxError('Not allowed in environment markers.\n%s\n%s' % + (self.statement, + (' ' * node.col_offset) + '^')) + return ast.NodeTransformer.visit(self, node) + + def visit_Attribute(self, node): + """Flatten one level of attribute access.""" + new_node = ast.Name("%s.%s" % (node.value.id, node.attr), node.ctx) + return ast.copy_location(new_node, node) + +def parse_marker(marker): + tree = ast.parse(marker, mode='eval') + new_tree = ASTWhitelist(marker).generic_visit(tree) + return new_tree + +def compile_marker(parsed_marker): + return _builtin_compile(parsed_marker, '', 'eval', + dont_inherit=True) + +_cache = weakref.WeakValueDictionary() + +def compile(marker): + """Return compiled marker as a function accepting an environment dict.""" + try: + return _cache[marker] + except KeyError: + pass + if not marker.strip(): + def marker_fn(environment=None, override=None): + """""" + return True + else: + compiled_marker = compile_marker(parse_marker(marker)) + def marker_fn(environment=None, override=None): + """override updates environment""" + if override is None: + override = {} + if environment is None: + environment = default_environment() + environment.update(override) + return eval(compiled_marker, environment) + marker_fn.__doc__ = marker + _cache[marker] = marker_fn + return _cache[marker] + +def interpret(marker, environment=None): + return compile(marker)(environment) diff --git a/PythonEnv/2.7/Lib/site-packages/_markerlib/markers.pyc b/PythonEnv/2.7/Lib/site-packages/_markerlib/markers.pyc new file mode 100644 index 0000000000000000000000000000000000000000..adf3b14527fd8741841a42fcc9c8bddf4d4bc127 GIT binary patch literal 5570 zcmcgw>vG%16+Qr|3u(!+WL+%VNubWSqB}OzI*pxrWH+)cdz7lQ3wa`!k%EDUr3?xJ zXzWt9W|Wyul{^&FGeLDTu2S~ni7NqFZe=U+&9GpGa%lXc2S^D2(_5Q#A z^M@7{pHbXD$EE+}5Jf~yv<^isMJ3uRQ4@5Tq7h15YJzEL@JoHVOieH?e}tMNeR`Cd zqol^DIZj8j!W^ZfOa~QeR>;{(Kc=#((tefle~{xiszjZ06phioOZnd^8mI5DmMI*eP0!E}+K_Jq@bN zGAG#LjD47rhl_Zq2sMk5v4c6f-JGU34@u3Cnx@W0?mThm(ay)z#AfD6&C>oTw2}i_TriEeHEw2_wF4p-8)V*$;o7rgj~}$P1aSr{RIZoCPIZexaL$rk&*n=o)^s(-eLE zl|iO2-e=W{1@$El!q&?;<%tH81?#7hg*M`YZlYNCp|MICy!TFlVwBKp=Sq3n~gg95B8R)N7#VCym|#FS@(E7n_&8 z-R-S7T}`m9Xo%X4)9puUx3{Si}=?T33xZwJA zxO?Q6FvAiq&FdjYPcS`%x*h>TtT1K?a~@5x=fWBd@6C(3jd79av=AA#Kg~KVj7wht zJ;1RT=xt_U6#Bzq$#-j;m#E&DJd~x>r40tE=VgoPs~`-14hNr2fl%K9&sV0Gr(P@T zibEFWV7>pdPrbb)+YJ-#MRAJ_FwBqY0-k`(OvCdBU#|L_XAd7{rq6I$_*}#At!_Tw zdI{*0SetFYT1H7oti$Bap$n zo3%0q)Hl(rrMidoGf;__rO6Sj9RW2?wHGEy_F6?=nng<2^>w__Kq~9A@0zY& z(>}YjxZBq?-l<_1i#3KdVcJp>MOQaAo^Gu@GHigGN0{`@TApXQKq2z2ED5r9TPtH2 z?NA%TFg38A=XscF&OIs@Cp*O0Mj-V$fQSe3y3Z0)e-Sf3#-(|)2)otU)S&`VQg5j4Tv#dVB`IQT2IBa{GXxY)S!iW|AETqyuN}<3V>0k zQu>8E?>=@b<1J3?Z`pMn3~Sd2H!y7krW42c#^GoM4x*AZa}cm>*t8Af4N)pkQ9`K0 zFp(f-p_`cQ<$GI3OIW}51G#lBM=Kh;VuW>HB=P<{!!jgi_?gWp-b9m9<4!;oqP) zk@*YBanYqeizEaPg9F4}*skERVsDE@`ef7w)u9{)q5={xMCSC`y;N#KiNaj~u!mFK zTltdf!+MLi#}`|JSPA2UscaDn0v^wO{^v}wq@>FsOAss1P$=i|*`_-Qj@IRZcB-(n zqSPF0iZSD3lzxH+ngkI0xcEth!zLBoHHsXMqN z&XPOfRGbNXC!K~QZi#R~3uj~-*nX#uq+F6D!H3zd&uaD`aKixCD)CQ24`RY3zp@Lo`N9M`!_Gq>xwPw z?sM8h>_>KWr{G1!*Byn?&BB|&D~**Wote^Q7~LekRi|27gxr!_DK9QmMk?hAw{q!6 DMu$fO literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/easy_install.py b/PythonEnv/2.7/Lib/site-packages/easy_install.py new file mode 100644 index 0000000000..d87e984034 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/easy_install.py @@ -0,0 +1,5 @@ +"""Run the EasyInstall command""" + +if __name__ == '__main__': + from setuptools.command.easy_install import main + main() diff --git a/PythonEnv/2.7/Lib/site-packages/easy_install.pyc b/PythonEnv/2.7/Lib/site-packages/easy_install.pyc new file mode 100644 index 0000000000000000000000000000000000000000..222d9290b51f04e999d49d6fae2bffbbc0b5a942 GIT binary patch literal 354 zcmYk0%}T>S5XWbeT16DRd$7kGY!EMkh$z^DP(P3a1Z)bM6d0!P1;8B5 zPT)N|=r_*^tJck8jkARe-Lnf(8Z#@swbH40M13Kw)J_QfOO`RJ#0jAQmg)8Mm|DVQ>t!xrDNR|e68K1`PiWvMTK_! z35&MkuU)LYTeweto!{`KE_l!p=Z!44vckZ}VtLc;KX_-oY7O4^+F?qVCMWES{Q(e{ BTYvxn literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/PKG-INFO b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/PKG-INFO new file mode 100644 index 0000000000..b192ea88ff --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/PKG-INFO @@ -0,0 +1,87 @@ +Metadata-Version: 1.1 +Name: pip +Version: 1.4.1 +Summary: A tool for installing and managing Python packages. +Home-page: http://www.pip-installer.org +Author: The pip developers +Author-email: python-virtualenv@groups.google.com +License: MIT +Description: + Project Info + ============ + + * Project Page: https://github.com/pypa/pip + * Install howto: http://www.pip-installer.org/en/latest/installing.html + * Changelog: http://www.pip-installer.org/en/latest/news.html + * Bug Tracking: https://github.com/pypa/pip/issues + * Mailing list: http://groups.google.com/group/python-virtualenv + * Docs: http://www.pip-installer.org/ + * IRC: #pip on Freenode. + + Quickstart + ========== + + Install a package: + + :: + + $ pip install SomePackage==1.0 + [...] + Successfully installed SomePackage + + Show what files were installed: + + :: + + $ pip show --files SomePackage + Name: SomePackage + Version: 1.0 + Location: /my/env/lib/pythonx.x/site-packages + Files: + ../somepackage/__init__.py + [...] + + List what packages are outdated: + + :: + + $ pip list --outdated + SomePackage (Current: 1.0 Latest: 2.0) + + Upgrade a package: + + :: + + $ pip install --upgrade SomePackage + [...] + Found existing installation: SomePackage 1.0 + Uninstalling SomePackage: + Successfully uninstalled SomePackage + Running setup.py install for SomePackage + Successfully installed SomePackage + + Uninstall a package: + + :: + + $ pip uninstall SomePackage + Uninstalling SomePackage: + /my/env/lib/pythonx.x/site-packages/somepackage + Proceed (y/n)? y + Successfully uninstalled SomePackage + + +Keywords: easy_install distutils setuptools egg virtualenv +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Build Tools +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.5 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.1 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 diff --git a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/SOURCES.txt b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/SOURCES.txt new file mode 100644 index 0000000000..7426a21dc8 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/SOURCES.txt @@ -0,0 +1,116 @@ +AUTHORS.txt +CHANGES.txt +LICENSE.txt +MANIFEST.in +PROJECT.txt +README.rst +setup.cfg +setup.py +docs/configuration.rst +docs/cookbook.rst +docs/development.rst +docs/index.rst +docs/installing.rst +docs/logic.rst +docs/news.rst +docs/other-tools.rst +docs/quickstart.rst +docs/usage.rst +pip/__init__.py +pip/__main__.py +pip/basecommand.py +pip/baseparser.py +pip/cacert.pem +pip/cmdoptions.py +pip/download.py +pip/exceptions.py +pip/index.py +pip/locations.py +pip/log.py +pip/pep425tags.py +pip/req.py +pip/runner.py +pip/status_codes.py +pip/util.py +pip/wheel.py +pip.egg-info/PKG-INFO +pip.egg-info/SOURCES.txt +pip.egg-info/dependency_links.txt +pip.egg-info/entry_points.txt +pip.egg-info/not-zip-safe +pip.egg-info/requires.txt +pip.egg-info/top_level.txt +pip/backwardcompat/__init__.py +pip/backwardcompat/ssl_match_hostname.py +pip/commands/__init__.py +pip/commands/bundle.py +pip/commands/completion.py +pip/commands/freeze.py +pip/commands/help.py +pip/commands/install.py +pip/commands/list.py +pip/commands/search.py +pip/commands/show.py +pip/commands/uninstall.py +pip/commands/unzip.py +pip/commands/wheel.py +pip/commands/zip.py +pip/vcs/__init__.py +pip/vcs/bazaar.py +pip/vcs/git.py +pip/vcs/mercurial.py +pip/vcs/subversion.py +pip/vendor/__init__.py +pip/vendor/six.py +pip/vendor/distlib/__init__.py +pip/vendor/distlib/compat.py +pip/vendor/distlib/database.py +pip/vendor/distlib/index.py +pip/vendor/distlib/locators.py +pip/vendor/distlib/manifest.py +pip/vendor/distlib/markers.py +pip/vendor/distlib/metadata.py +pip/vendor/distlib/resources.py +pip/vendor/distlib/scripts.py +pip/vendor/distlib/util.py +pip/vendor/distlib/version.py +pip/vendor/distlib/wheel.py +pip/vendor/distlib/_backport/__init__.py +pip/vendor/distlib/_backport/misc.py +pip/vendor/distlib/_backport/shutil.py +pip/vendor/distlib/_backport/sysconfig.py +pip/vendor/distlib/_backport/tarfile.py +pip/vendor/html5lib/__init__.py +pip/vendor/html5lib/constants.py +pip/vendor/html5lib/html5parser.py +pip/vendor/html5lib/ihatexml.py +pip/vendor/html5lib/inputstream.py +pip/vendor/html5lib/sanitizer.py +pip/vendor/html5lib/tokenizer.py +pip/vendor/html5lib/utils.py +pip/vendor/html5lib/filters/__init__.py +pip/vendor/html5lib/filters/_base.py +pip/vendor/html5lib/filters/alphabeticalattributes.py +pip/vendor/html5lib/filters/inject_meta_charset.py +pip/vendor/html5lib/filters/lint.py +pip/vendor/html5lib/filters/optionaltags.py +pip/vendor/html5lib/filters/sanitizer.py +pip/vendor/html5lib/filters/whitespace.py +pip/vendor/html5lib/serializer/__init__.py +pip/vendor/html5lib/serializer/htmlserializer.py +pip/vendor/html5lib/treebuilders/__init__.py +pip/vendor/html5lib/treebuilders/_base.py +pip/vendor/html5lib/treebuilders/dom.py +pip/vendor/html5lib/treebuilders/etree.py +pip/vendor/html5lib/treebuilders/etree_lxml.py +pip/vendor/html5lib/treewalkers/__init__.py +pip/vendor/html5lib/treewalkers/_base.py +pip/vendor/html5lib/treewalkers/dom.py +pip/vendor/html5lib/treewalkers/etree.py +pip/vendor/html5lib/treewalkers/genshistream.py +pip/vendor/html5lib/treewalkers/lxmletree.py +pip/vendor/html5lib/treewalkers/pulldom.py +pip/vendor/html5lib/trie/__init__.py +pip/vendor/html5lib/trie/_base.py +pip/vendor/html5lib/trie/datrie.py +pip/vendor/html5lib/trie/py.py \ No newline at end of file diff --git a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/dependency_links.txt b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/dependency_links.txt new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/entry_points.txt b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/entry_points.txt new file mode 100644 index 0000000000..5f7b7cf995 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/entry_points.txt @@ -0,0 +1,4 @@ +[console_scripts] +pip = pip:main +pip-2.7 = pip:main + diff --git a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/not-zip-safe b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/not-zip-safe new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/requires.txt b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/requires.txt new file mode 100644 index 0000000000..1c97870de3 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/requires.txt @@ -0,0 +1,7 @@ + + +[testing] +nose>=1.3.0 +virtualenv>=1.10 +scripttest>=1.1.1 +mock \ No newline at end of file diff --git a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/top_level.txt b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/top_level.txt new file mode 100644 index 0000000000..a1b589e38a --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/PythonEnv/2.7/Lib/site-packages/pip/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/__init__.py new file mode 100644 index 0000000000..8bc68aaca2 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/__init__.py @@ -0,0 +1,235 @@ +#!/usr/bin/env python +import os +import optparse + +import sys +import re + +from pip.exceptions import InstallationError, CommandError, PipError +from pip.log import logger +from pip.util import get_installed_distributions, get_prog +from pip.vcs import git, mercurial, subversion, bazaar # noqa +from pip.baseparser import create_main_parser +from pip.commands import commands, get_similar_commands, get_summaries + + +# The version as used in the setup.py and the docs conf.py +__version__ = "1.4.1" + +def autocomplete(): + """Command and option completion for the main option parser (and options) + and its subcommands (and options). + + Enable by sourcing one of the completion shell scripts (bash or zsh). + """ + # Don't complete if user hasn't sourced bash_completion file. + if 'PIP_AUTO_COMPLETE' not in os.environ: + return + cwords = os.environ['COMP_WORDS'].split()[1:] + cword = int(os.environ['COMP_CWORD']) + try: + current = cwords[cword - 1] + except IndexError: + current = '' + + subcommands = [cmd for cmd, summary in get_summaries()] + options = [] + # subcommand + try: + subcommand_name = [w for w in cwords if w in subcommands][0] + except IndexError: + subcommand_name = None + + parser = create_main_parser() + # subcommand options + if subcommand_name: + # special case: 'help' subcommand has no options + if subcommand_name == 'help': + sys.exit(1) + # special case: list locally installed dists for uninstall command + if subcommand_name == 'uninstall' and not current.startswith('-'): + installed = [] + lc = current.lower() + for dist in get_installed_distributions(local_only=True): + if dist.key.startswith(lc) and dist.key not in cwords[1:]: + installed.append(dist.key) + # if there are no dists installed, fall back to option completion + if installed: + for dist in installed: + print(dist) + sys.exit(1) + + subcommand = commands[subcommand_name](parser) + options += [(opt.get_opt_string(), opt.nargs) + for opt in subcommand.parser.option_list_all + if opt.help != optparse.SUPPRESS_HELP] + + # filter out previously specified options from available options + prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]] + options = [(x, v) for (x, v) in options if x not in prev_opts] + # filter options by current input + options = [(k, v) for k, v in options if k.startswith(current)] + for option in options: + opt_label = option[0] + # append '=' to options which require args + if option[1]: + opt_label += '=' + print(opt_label) + else: + # show main parser options only when necessary + if current.startswith('-') or current.startswith('--'): + opts = [i.option_list for i in parser.option_groups] + opts.append(parser.option_list) + opts = (o for it in opts for o in it) + + subcommands += [i.get_opt_string() for i in opts + if i.help != optparse.SUPPRESS_HELP] + + print(' '.join([x for x in subcommands if x.startswith(current)])) + sys.exit(1) + + +def parseopts(args): + parser = create_main_parser() + parser.main = True # so the help formatter knows + + # create command listing + command_summaries = get_summaries() + + description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries] + parser.description = '\n'.join(description) + + options, args = parser.parse_args(args) + + if options.version: + sys.stdout.write(parser.version) + sys.stdout.write(os.linesep) + sys.exit() + + # pip || pip help || pip --help -> print_help() + if not args or (args[0] == 'help' and len(args) == 1): + parser.print_help() + sys.exit() + + if not args: + msg = ('You must give a command ' + '(use "pip --help" to see a list of commands)') + raise CommandError(msg) + + command = args[0].lower() + + if command not in commands: + guess = get_similar_commands(command) + + msg = ['unknown command "%s"' % command] + if guess: + msg.append('maybe you meant "%s"' % guess) + + raise CommandError(' - '.join(msg)) + + return command, options, args, parser + + +def main(initial_args=None): + if initial_args is None: + initial_args = sys.argv[1:] + + autocomplete() + + try: + cmd_name, options, args, parser = parseopts(initial_args) + except PipError: + e = sys.exc_info()[1] + sys.stderr.write("ERROR: %s" % e) + sys.stderr.write(os.linesep) + sys.exit(1) + + command = commands[cmd_name](parser) # see baseparser.Command + return command.main(args[1:], options) + + +def bootstrap(): + """ + Bootstrapping function to be called from install-pip.py script. + """ + return main(['install', '--upgrade', 'pip'] + sys.argv[1:]) + +############################################################ +## Writing freeze files + + +class FrozenRequirement(object): + + def __init__(self, name, req, editable, comments=()): + self.name = name + self.req = req + self.editable = editable + self.comments = comments + + _rev_re = re.compile(r'-r(\d+)$') + _date_re = re.compile(r'-(20\d\d\d\d\d\d)$') + + @classmethod + def from_dist(cls, dist, dependency_links, find_tags=False): + location = os.path.normcase(os.path.abspath(dist.location)) + comments = [] + from pip.vcs import vcs, get_src_requirement + if vcs.get_backend_name(location): + editable = True + try: + req = get_src_requirement(dist, location, find_tags) + except InstallationError: + ex = sys.exc_info()[1] + logger.warn("Error when trying to get requirement for VCS system %s, falling back to uneditable format" % ex) + req = None + if req is None: + logger.warn('Could not determine repository location of %s' % location) + comments.append('## !! Could not determine repository location') + req = dist.as_requirement() + editable = False + else: + editable = False + req = dist.as_requirement() + specs = req.specs + assert len(specs) == 1 and specs[0][0] == '==' + version = specs[0][1] + ver_match = cls._rev_re.search(version) + date_match = cls._date_re.search(version) + if ver_match or date_match: + svn_backend = vcs.get_backend('svn') + if svn_backend: + svn_location = svn_backend( + ).get_location(dist, dependency_links) + if not svn_location: + logger.warn( + 'Warning: cannot find svn location for %s' % req) + comments.append('## FIXME: could not find svn URL in dependency_links for this package:') + else: + comments.append('# Installing as editable to satisfy requirement %s:' % req) + if ver_match: + rev = ver_match.group(1) + else: + rev = '{%s}' % date_match.group(1) + editable = True + req = '%s@%s#egg=%s' % (svn_location, rev, cls.egg_name(dist)) + return cls(dist.project_name, req, editable, comments) + + @staticmethod + def egg_name(dist): + name = dist.egg_name() + match = re.search(r'-py\d\.\d$', name) + if match: + name = name[:match.start()] + return name + + def __str__(self): + req = self.req + if self.editable: + req = '-e %s' % req + return '\n'.join(list(self.comments) + [str(req)]) + '\n' + + +if __name__ == '__main__': + exit = main() + if exit: + sys.exit(exit) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f4ca28887441417d3c9ae3fe7aea9c04fbdd4b0 GIT binary patch literal 8247 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 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/__main__.py b/PythonEnv/2.7/Lib/site-packages/pip/__main__.py new file mode 100644 index 0000000000..5ca3746342 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/__main__.py @@ -0,0 +1,7 @@ +import sys +from .runner import run + +if __name__ == '__main__': + exit = run() + if exit: + sys.exit(exit) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/__main__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/__main__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b4567bf604b7305d0cc1a5f32e5706dd855034d GIT binary patch literal 340 zcmYk1!Ab)$5Qb;6Ytd4{$JmQKco9TIK`%v$)I*^J!frEe$L^-@|K{FC_^CdudV@cl#0maq>c`C6`@3alK23Sc2ZflZ)7s1+;}ASGZ^SSx5JKnk{E zN`cZ?0z5~(MZlK{xH#r9JCKq5B{5|bne7k~LEE`-DA|}gXJ<@w#*XiO82mUKwKGw$ zce=bLV?rt~^u{6Ewf^AeQrZh$a#(eRp0m5Do?5d1RKZT)Qqh(Ap%1H#yK}GlY<#Zo rxzL^ioi_P$otNZw!;Su3ZQS&6fy;VhyNa%MfAB-W2v5`qk8ptBuA5Ag literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/__init__.py new file mode 100644 index 0000000000..465759d802 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/__init__.py @@ -0,0 +1,125 @@ +"""Stuff that differs in different Python versions""" + +import os +import imp +import sys +import site + +__all__ = ['WindowsError'] + +uses_pycache = hasattr(imp, 'cache_from_source') + +class NeverUsedException(Exception): + """this exception should never be raised""" + +try: + WindowsError = WindowsError +except NameError: + WindowsError = NeverUsedException + +try: + #new in Python 3.3 + PermissionError = PermissionError +except NameError: + PermissionError = NeverUsedException + +console_encoding = sys.__stdout__.encoding + +if sys.version_info >= (3,): + from io import StringIO, BytesIO + from functools import reduce + from urllib.error import URLError, HTTPError + from queue import Queue, Empty + from urllib.request import url2pathname + from urllib.request import urlretrieve + from email import message as emailmessage + import urllib.parse as urllib + import urllib.request as urllib2 + import configparser as ConfigParser + import xmlrpc.client as xmlrpclib + import urllib.parse as urlparse + import http.client as httplib + + def cmp(a, b): + return (a > b) - (a < b) + + def b(s): + return s.encode('utf-8') + + def u(s): + return s.decode('utf-8') + + def console_to_str(s): + try: + return s.decode(console_encoding) + except UnicodeDecodeError: + return s.decode('utf_8') + + def fwrite(f, s): + f.buffer.write(b(s)) + + def get_http_message_param(http_message, param, default_value): + return http_message.get_param(param, default_value) + + bytes = bytes + string_types = (str,) + raw_input = input +else: + from cStringIO import StringIO + from urllib2 import URLError, HTTPError + from Queue import Queue, Empty + from urllib import url2pathname, urlretrieve + from email import Message as emailmessage + import urllib + import urllib2 + import urlparse + import ConfigParser + import xmlrpclib + import httplib + + def b(s): + return s + + def u(s): + return s + + def console_to_str(s): + return s + + def fwrite(f, s): + f.write(s) + + def get_http_message_param(http_message, param, default_value): + result = http_message.getparam(param) + return result or default_value + + bytes = str + string_types = (basestring,) + reduce = reduce + cmp = cmp + raw_input = raw_input + BytesIO = StringIO + + +from distutils.sysconfig import get_python_lib, get_python_version + +#site.USER_SITE was created in py2.6 +user_site = getattr(site, 'USER_SITE', None) + + +def product(*args, **kwds): + # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy + # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 + pools = list(map(tuple, args)) * kwds.get('repeat', 1) + result = [[]] + for pool in pools: + result = [x + [y] for x in result for y in pool] + for prod in result: + yield tuple(prod) + + +## only >=py32 has ssl.match_hostname and ssl.CertificateError +try: + from ssl import match_hostname, CertificateError +except ImportError: + from ssl_match_hostname import match_hostname, CertificateError diff --git a/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..269938c60af863e5cb1554eb8210192c99bff147 GIT binary patch literal 5529 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 QA9K;1H|tH)Siv{`2bz@t0ssI2 literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/ssl_match_hostname.py b/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/ssl_match_hostname.py new file mode 100644 index 0000000000..a6fadf424b --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/ssl_match_hostname.py @@ -0,0 +1,68 @@ +"""The match_hostname() function from Python 3.2, essential when using SSL.""" + +import re + +__version__ = '3.2a3' + +class CertificateError(ValueError): + pass + +def _dnsname_to_pat(dn, max_wildcards=1): + pats = [] + for frag in dn.split(r'.'): + if frag.count('*') > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survery of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + if frag == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + else: + # Otherwise, '*' matches any dotless fragment. + frag = re.escape(frag) + pats.append(frag.replace(r'\*', '[^.]*')) + return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + +def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 rules + are mostly followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_to_pat(value).match(hostname): + return + dnsnames.append(value) + if not san: + # The subject is only checked when subjectAltName is empty + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_to_pat(value).match(hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") diff --git a/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/ssl_match_hostname.pyc b/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/ssl_match_hostname.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d01111f374e1115677d6a2ea0205dc87cad36184 GIT binary patch literal 2610 zcmc&$-EJF26h5>5X_}@#qD?{th>;-RnqY~x5>@#TAqk~bl~y)tL~vNGcgFTQ>)p-F zxQV6YhW3VAB(D1wJO__~#3c^^-edv3xvrL&&#UHTVd!RkXPm1^if*ZeA@Y(fAgR0ELE?s!UUxIeR?@!F>Xg(=vhJGhO$Oca zB1;&c{XMy4I%Q+4!`IX`8n{hsUzF zb&>FSVwS6TI0mbD>~ClWM27+G|4au&BcHivg4VY8>99fv6&m?WV(387PL<39a!6){ z9A=S5L5p~P5|j~ZBXv6gnLZr^G(vi-tRZ$6$kk|6XASh(u%Bl0=NJ%x!L#64b(3{x z7#Bdq=sfH4HtIYr^2{u&b{ZV>4adi7`L=17A-g;WShA_yOHvghNLD79j8C#G*ETwm z({@*SDE#naYx^S~q;B)&K(icJDPOJfwbi)58*uDwktWVdaX!hM54PjL8eJGyhY%Ho z&J-fWV}3;2I4ZQ`oIop$;!@@$CaLzTM|qNYEZx7i@up&lN}MuCJtEab#sQ$Tf1hEsw!K1K^s97OqXQtX;(>UZgLhD4 z0F8h;!Gh6@%gzx5{hZjnP55uZko}YP6JHCSs?;UkW^KDohjqVI{l8n){Z=ntwbk#h z*y;uCzM#$BUuY9G0~D3`2Hd&48Uknm?%^r`kLm!^xUvR(8T12Mz!^9spPgNdvfK2F zXL&JX8PG1}S6az_Zon`y zvJzmPm<&U`>8!*L#M;T@9qn2J?Fy|8FK*npQ8Ko+FsWtpn7ErQDcj$y%A0pSxg!n8 z(t0D20mFma(W!alJdH=DDlrl`|R!;3i9g)6-}ZF<(*`ZuA=1WreZ zg+AXFQIbxKZplZPv=bPzcGCT70Tn;aGuH8>Y(IeFae(BKkt)|V`_PpUlp42&HZt$a zCF^-;S=zV%cg2!PFi-XiG;kA4Wb(o!xZ&i<)_jJu4$FR`Q_$s}Mx6VgHFd%zo@~AI zPoi{E-jx1;NP7D!_VHZkFQN7fclq$C&O9-;nYR4MI4as)=M8Q=WieX(ReBr%-#OwB z>lfK5^Y0x!^}9S}56YQI@5IH|LwB6_vv=>i7_luhG*cIs!FX?ot71;fi>kOL>cMq! zwNm!p!c09_^6g?!hJ@o1hANN4u+85;j&GbWe5#Gbw+;s1M86CwN4@<%nv)QC>Gi~c Zlm2=6{qrSX$(BjK9?S*xV4*TM{|^{9g!2FZ literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/basecommand.py b/PythonEnv/2.7/Lib/site-packages/pip/basecommand.py new file mode 100644 index 0000000000..1a22c47f23 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/basecommand.py @@ -0,0 +1,207 @@ +"""Base Command class, and related routines""" + +import os +import socket +import sys +import tempfile +import traceback +import time +import optparse + +from pip.log import logger +from pip.download import urlopen +from pip.exceptions import (BadCommand, InstallationError, UninstallationError, + CommandError) +from pip.backwardcompat import StringIO +from pip.baseparser import ConfigOptionParser, UpdatingDefaultsHelpFormatter +from pip.status_codes import SUCCESS, ERROR, UNKNOWN_ERROR, VIRTUALENV_NOT_FOUND +from pip.util import get_prog + + +__all__ = ['Command'] + + +# for backwards compatibiliy +get_proxy = urlopen.get_proxy + + +class Command(object): + name = None + usage = None + hidden = False + + def __init__(self, main_parser): + parser_kw = { + 'usage': self.usage, + 'prog': '%s %s' % (get_prog(), self.name), + 'formatter': UpdatingDefaultsHelpFormatter(), + 'add_help_option': False, + 'name': self.name, + 'description': self.__doc__, + } + self.main_parser = main_parser + self.parser = ConfigOptionParser(**parser_kw) + + # Commands should add options to this option group + optgroup_name = '%s Options' % self.name.capitalize() + self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) + + # Re-add all options and option groups. + for group in main_parser.option_groups: + self._copy_option_group(self.parser, group) + + # Copies all general options from the main parser. + self._copy_options(self.parser, main_parser.option_list) + + def _copy_options(self, parser, options): + """Populate an option parser or group with options.""" + for option in options: + if not option.dest: + continue + parser.add_option(option) + + def _copy_option_group(self, parser, group): + """Copy option group (including options) to another parser.""" + new_group = optparse.OptionGroup(parser, group.title) + self._copy_options(new_group, group.option_list) + + parser.add_option_group(new_group) + + def merge_options(self, initial_options, options): + # Make sure we have all global options carried over + attrs = ['log', 'proxy', 'require_venv', + 'log_explicit_levels', 'log_file', + 'timeout', 'default_vcs', + 'skip_requirements_regex', + 'no_input', 'exists_action', + 'cert'] + for attr in attrs: + setattr(options, attr, getattr(initial_options, attr) or getattr(options, attr)) + options.quiet += initial_options.quiet + options.verbose += initial_options.verbose + + def setup_logging(self): + pass + + def main(self, args, initial_options): + options, args = self.parser.parse_args(args) + self.merge_options(initial_options, options) + + level = 1 # Notify + level += options.verbose + level -= options.quiet + level = logger.level_for_integer(4 - level) + complete_log = [] + logger.consumers.extend( + [(level, sys.stdout), + (logger.DEBUG, complete_log.append)]) + if options.log_explicit_levels: + logger.explicit_levels = True + + self.setup_logging() + + #TODO: try to get these passing down from the command? + # without resorting to os.environ to hold these. + + if options.no_input: + os.environ['PIP_NO_INPUT'] = '1' + + if options.exists_action: + os.environ['PIP_EXISTS_ACTION'] = ''.join(options.exists_action) + + if options.cert: + os.environ['PIP_CERT'] = options.cert + + if options.require_venv: + # If a venv is required check if it can really be found + if not os.environ.get('VIRTUAL_ENV'): + logger.fatal('Could not find an activated virtualenv (required).') + sys.exit(VIRTUALENV_NOT_FOUND) + + if options.log: + log_fp = open_logfile(options.log, 'a') + logger.consumers.append((logger.DEBUG, log_fp)) + else: + log_fp = None + + socket.setdefaulttimeout(options.timeout or None) + + urlopen.setup(proxystr=options.proxy, prompting=not options.no_input) + + exit = SUCCESS + store_log = False + try: + status = self.run(options, args) + # FIXME: all commands should return an exit status + # and when it is done, isinstance is not needed anymore + if isinstance(status, int): + exit = status + except (InstallationError, UninstallationError): + e = sys.exc_info()[1] + logger.fatal(str(e)) + logger.info('Exception information:\n%s' % format_exc()) + store_log = True + exit = ERROR + except BadCommand: + e = sys.exc_info()[1] + logger.fatal(str(e)) + logger.info('Exception information:\n%s' % format_exc()) + store_log = True + exit = ERROR + except CommandError: + e = sys.exc_info()[1] + logger.fatal('ERROR: %s' % e) + logger.info('Exception information:\n%s' % format_exc()) + exit = ERROR + except KeyboardInterrupt: + logger.fatal('Operation cancelled by user') + logger.info('Exception information:\n%s' % format_exc()) + store_log = True + exit = ERROR + except: + logger.fatal('Exception:\n%s' % format_exc()) + store_log = True + exit = UNKNOWN_ERROR + if log_fp is not None: + log_fp.close() + if store_log: + log_fn = options.log_file + text = '\n'.join(complete_log) + try: + log_fp = open_logfile(log_fn, 'w') + except IOError: + temp = tempfile.NamedTemporaryFile(delete=False) + log_fn = temp.name + log_fp = open_logfile(log_fn, 'w') + logger.fatal('Storing complete log in %s' % log_fn) + log_fp.write(text) + log_fp.close() + return exit + + +def format_exc(exc_info=None): + if exc_info is None: + exc_info = sys.exc_info() + out = StringIO() + traceback.print_exception(*exc_info, **dict(file=out)) + return out.getvalue() + + +def open_logfile(filename, mode='a'): + """Open the named log file in append mode. + + If the file already exists, a separator will also be printed to + the file to separate past activity from current activity. + """ + filename = os.path.expanduser(filename) + filename = os.path.abspath(filename) + dirname = os.path.dirname(filename) + if not os.path.exists(dirname): + os.makedirs(dirname) + exists = os.path.exists(filename) + + log_fp = open(filename, mode) + if exists: + log_fp.write('%s\n' % ('-' * 60)) + log_fp.write('%s run on %s\n' % (sys.argv[0], time.strftime('%c'))) + return log_fp diff --git a/PythonEnv/2.7/Lib/site-packages/pip/basecommand.pyc b/PythonEnv/2.7/Lib/site-packages/pip/basecommand.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1ee6759af148c855b48d2a5d89ad0ac5655df34 GIT binary patch literal 7170 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', ', ') + + def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '): + """ + Return a comma-separated list of option strings and metavars. + + :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') + :param mvarfmt: metavar format string - evaluated as mvarfmt % metavar + :param optsep: separator + """ + opts = [] + + if option._short_opts: + opts.append(option._short_opts[0]) + if option._long_opts: + opts.append(option._long_opts[0]) + if len(opts) > 1: + opts.insert(1, optsep) + + if option.takes_value(): + metavar = option.metavar or option.dest.lower() + opts.append(mvarfmt % metavar.lower()) + + return ''.join(opts) + + def format_heading(self, heading): + if heading == 'Options': + return '' + return heading + ':\n' + + def format_usage(self, usage): + """ + Ensure there is only one newline between usage and the first heading + if there is no description. + """ + msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), " ") + return msg + + def format_description(self, description): + # leave full control over description to us + if description: + if hasattr(self.parser, 'main'): + label = 'Commands' + else: + label = 'Description' + #some doc strings have inital newlines, some don't + description = description.lstrip('\n') + #some doc strings have final newlines and spaces, some don't + description = description.rstrip() + #dedent, then reindent + description = self.indent_lines(textwrap.dedent(description), " ") + description = '%s:\n%s\n' % (label, description) + return description + else: + return '' + + def format_epilog(self, epilog): + # leave full control over epilog to us + if epilog: + return epilog + else: + return '' + + def indent_lines(self, text, indent): + new_lines = [indent + line for line in text.split('\n')] + return "\n".join(new_lines) + + +class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): + """Custom help formatter for use in ConfigOptionParser that updates + the defaults before expanding them, allowing them to show up correctly + in the help listing""" + + def expand_default(self, option): + if self.parser is not None: + self.parser.update_defaults(self.parser.defaults) + return optparse.IndentedHelpFormatter.expand_default(self, option) + + +class CustomOptionParser(optparse.OptionParser): + def insert_option_group(self, idx, *args, **kwargs): + """Insert an OptionGroup at a given position.""" + group = self.add_option_group(*args, **kwargs) + + self.option_groups.pop() + self.option_groups.insert(idx, group) + + return group + + @property + def option_list_all(self): + """Get a list of all options, including those in option groups.""" + res = self.option_list[:] + for i in self.option_groups: + res.extend(i.option_list) + + return res + + +class ConfigOptionParser(CustomOptionParser): + """Custom option parser which updates its defaults by by checking the + configuration files and environmental variables""" + + def __init__(self, *args, **kwargs): + self.config = ConfigParser.RawConfigParser() + self.name = kwargs.pop('name') + self.files = self.get_config_files() + self.config.read(self.files) + assert self.name + optparse.OptionParser.__init__(self, *args, **kwargs) + + def get_config_files(self): + config_file = os.environ.get('PIP_CONFIG_FILE', False) + if config_file and os.path.exists(config_file): + return [config_file] + return [default_config_file] + + def update_defaults(self, defaults): + """Updates the given defaults with values from the config files and + the environ. Does a little special handling for certain types of + options (lists).""" + # Then go and look for the other sources of configuration: + config = {} + # 1. config files + for section in ('global', self.name): + config.update(self.normalize_keys(self.get_config_section(section))) + # 2. environmental variables + config.update(self.normalize_keys(self.get_environ_vars())) + # Then set the options with those values + for key, val in config.items(): + option = self.get_option(key) + if option is not None: + # ignore empty values + if not val: + continue + # handle multiline configs + if option.action == 'append': + val = val.split() + else: + option.nargs = 1 + if option.action in ('store_true', 'store_false', 'count'): + val = strtobool(val) + try: + val = option.convert_value(key, val) + except optparse.OptionValueError: + e = sys.exc_info()[1] + print("An error occurred during configuration: %s" % e) + sys.exit(3) + defaults[option.dest] = val + return defaults + + def normalize_keys(self, items): + """Return a config dictionary with normalized keys regardless of + whether the keys were specified in environment variables or in config + files""" + normalized = {} + for key, val in items: + key = key.replace('_', '-') + if not key.startswith('--'): + key = '--%s' % key # only prefer long opts + normalized[key] = val + return normalized + + def get_config_section(self, name): + """Get a section of a configuration""" + if self.config.has_section(name): + return self.config.items(name) + return [] + + def get_environ_vars(self, prefix='PIP_'): + """Returns a generator with all environmental vars with prefix PIP_""" + for key, val in os.environ.items(): + if key.startswith(prefix): + yield (key.replace(prefix, '').lower(), val) + + def get_default_values(self): + """Overridding to make updating the defaults after instantiation of + the option parser possible, update_defaults() does the dirty work.""" + if not self.process_default_values: + # Old, pre-Optik 1.5 behaviour. + return optparse.Values(self.defaults) + + defaults = self.update_defaults(self.defaults.copy()) # ours + for option in self._get_all_options(): + default = defaults.get(option.dest) + if isinstance(default, string_types): + opt_str = option.get_opt_string() + defaults[option.dest] = option.check_value(opt_str, default) + return optparse.Values(defaults) + + def error(self, msg): + self.print_usage(sys.stderr) + self.exit(2, "%s\n" % msg) + + +try: + pip_dist = pkg_resources.get_distribution('pip') + version = '%s from %s (python %s)' % ( + pip_dist, pip_dist.location, sys.version[:3]) +except pkg_resources.DistributionNotFound: + # when running pip.py without installing + version = None + + +def create_main_parser(): + parser_kw = { + 'usage': '\n%prog [options]', + 'add_help_option': False, + 'formatter': UpdatingDefaultsHelpFormatter(), + 'name': 'global', + 'prog': get_prog(), + } + + parser = ConfigOptionParser(**parser_kw) + genopt = optparse.OptionGroup(parser, 'General Options') + parser.disable_interspersed_args() + + # having a default version action just causes trouble + parser.version = version + + for opt in standard_options: + genopt.add_option(opt) + parser.add_option_group(genopt) + + return parser + + +standard_options = [ + optparse.make_option( + '-h', '--help', + dest='help', + action='help', + help='Show help.'), + + optparse.make_option( + # Run only if inside a virtualenv, bail if not. + '--require-virtualenv', '--require-venv', + dest='require_venv', + action='store_true', + default=False, + help=optparse.SUPPRESS_HELP), + + optparse.make_option( + '-v', '--verbose', + dest='verbose', + action='count', + default=0, + help='Give more output. Option is additive, and can be used up to 3 times.'), + + optparse.make_option( + '-V', '--version', + dest='version', + action='store_true', + help='Show version and exit.'), + + optparse.make_option( + '-q', '--quiet', + dest='quiet', + action='count', + default=0, + help='Give less output.'), + + optparse.make_option( + '--log', + dest='log', + metavar='file', + help='Log file where a complete (maximum verbosity) record will be kept.'), + + optparse.make_option( + # Writes the log levels explicitely to the log' + '--log-explicit-levels', + dest='log_explicit_levels', + action='store_true', + default=False, + help=optparse.SUPPRESS_HELP), + + optparse.make_option( + # The default log file + '--local-log', '--log-file', + dest='log_file', + metavar='file', + default=default_log_file, + help=optparse.SUPPRESS_HELP), + + optparse.make_option( + # Don't ask for input + '--no-input', + dest='no_input', + action='store_true', + default=False, + help=optparse.SUPPRESS_HELP), + + optparse.make_option( + '--proxy', + dest='proxy', + type='str', + default='', + help="Specify a proxy in the form [user:passwd@]proxy.server:port."), + + optparse.make_option( + '--timeout', '--default-timeout', + metavar='sec', + dest='timeout', + type='float', + default=15, + help='Set the socket timeout (default %default seconds).'), + + optparse.make_option( + # The default version control system for editables, e.g. 'svn' + '--default-vcs', + dest='default_vcs', + type='str', + default='', + help=optparse.SUPPRESS_HELP), + + optparse.make_option( + # A regex to be used to skip requirements + '--skip-requirements-regex', + dest='skip_requirements_regex', + type='str', + default='', + help=optparse.SUPPRESS_HELP), + + optparse.make_option( + # Option when path already exist + '--exists-action', + dest='exists_action', + type='choice', + choices=['s', 'i', 'w', 'b'], + default=[], + action='append', + metavar='action', + help="Default action when a path already exists: " + "(s)witch, (i)gnore, (w)ipe, (b)ackup."), + + optparse.make_option( + '--cert', + dest='cert', + type='str', + default='', + metavar='path', + help = "Path to alternate CA bundle."), + + ] diff --git a/PythonEnv/2.7/Lib/site-packages/pip/baseparser.pyc b/PythonEnv/2.7/Lib/site-packages/pip/baseparser.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec721c362a4fda95a450eb026ed7b42f629cbaa8 GIT binary patch literal 13258 zcmc&)O>Z1Wdaj-!hnf*7QnXBow%6OXm(p;f8Ekeu@alIMA=dS+xB z*pnENU97HpyFTCdc|WSk|1($ni~lNlEoFbch5xtk=zl0H6)Lrh)KOtcC63xf#^g(C zw^ZcIYPVeEr_}CLk)Kw((~>W%q@sE=YIjCC{C-L$=Txt%cB`saQ@b@&I<1oPsyC~4 zXH{=b?arCfib^i1-n`nKSG@(byMWRe6_wP%Mb$=A=hT-E~(S+si>?DE~{`}J;#i%sBl3=SNM0ZtRhDpyr#m7 z%59g`((Y^OasM?n#SdOrhc%Vmbnt_h!ViS< zw~BT^IrmMoyCGyB{<;Q#TgZM#g=;GONLFB7#`b-Tt?2Zo3V$Ho-4f#4LVQPvH-vZ- z)10=edRJ)feYHWm_@g%O3)#oNj_iSu{ZPn$q{4?P{9P4psqm2sw^avn@-5YYbb%9o zEF&~5;bHJIc04=M!cSi82wU)pjQmqjPIn+1*!_~)sXwOJUO{pv(2<)C@;L3ggCNsU z=ISUP4&wjC&sN<5NnRy!p5^I&nkMxUi)N8*r2Tf>*_Mx_05oyGJA>gha`efLHLmh2vNp>KqV12EGzOzr`4AbL?BQ_$}0-MLCP76 z8oTF+7%Zu(P!I!1eY7Z_ix`(wxiL3r>6v#2=(O=0?Y|tK5UQA4dJ$kNd4G>LC}SOvSRp)5smiVcxBCd>&tA z8;bGgucG9Ed>@4`Y=n^cXf)1!zs?!vY(hs#TQWh`(Rl?WhsVs;kyDcB&yWk(_BwIi z9q#Wvj{CQhb{2&bx&64mw;AmZJA2!wc{lCf?H}#E*ZgqrVZ6VG$wiGp&^in{k=`4` zgS~w)w_)n$;MAK#>s$}b^--moQ*&N*TAVB&4v`z6$zE8~16fw1!=9J1s+`D{<~q3R zEBdD9N7r2=Axp^nW}kf{Oui8YBM06E)XS7j>Mf><{+7>R^AwX^psQb2n`lXlOUk4f>(mi}K(IK-a8|npp#51wBi==DNVl z1W4L;>$;m}XlRgMcayZ=VQ%%h8#Oy?Zv9%LeeJq?tT z&1l?)8yyA7P{tc**HXJH1^HK-L*JMnhG(alW+MtC>jDMXURAFl$%$ybOn`iB#55QT zqJEgO-sgl&4aFe=WROwfKJ-Q|ALqegq!jC7t;fRgkW^klDtH15~g zgouc@h@AP%EJGnP7`>2lOy27tIx7kC2pH^8Q^eJ|N~!8xcK9qhuast;E6!`B5rhyC zHb_h9f@nZ44j~K+nJ`}?<`C+oXOL5x9sEfD9Lb0a@AmaD zi`={$A&s@0_LEa2k=u`slNkT^qx?9E`tDEz)$c+z!fJ;%YAkM#8|tSn_^p-2 zvdGO5jV6oNK4EKX?uxF-!n>}~Q#5O=PGsj=R9POKsn^ z?)vQZiG#KKBm?*m@0weproTPjBaUi=HK$0hDcMs6dxAS942s>!-Xeoyi~2Bp%FKWa zC=SyDJNV3?Jir;aYqoewL5dG5B;ytXs_{88D3Nd5+;RDA2bRiCII>AZhI>KWmv!AB z{`NyHxUo6jD@{x)_C-?yR`gm8TP1>0XMu=MH_$NrGT9cR>f@G0{TYBADaHhs^!)214 zWh30#8q*!fp;>aG$d*|%_kn^KSqJU6wDE`BA-&0Mws$G zUOF-{SR9xXSZ(vkf_f%qF^q-FKP#!Hc!%)-b_Kf$yY9#|w+s&%mx8V8K@#U4P2xIV z%`&hn3b(M05qsfKioQ5Kz#w06;H;KOSoNnIugI};)e#@VTGaiZ7x}(X#C|UghY4RP z556C!E#DUt*P{U|ddvF`bKhn10h1d{C=BE2NbV)u-5elwiYA{{9H`KlYI**0b-H@4 zx>%jb8AkeK5C%Dv+@^6B^$QL~3k32*j=zIPUq%wa9Ruhf6$|rAWXg2P$oBg0kZcTf zp7y@U2OGjQi~Fu|V2u{uHokA(4RUwL!9-eA29=HVU^R3RSU7T{lL2rGqoua#U3Y^7 z22Jtm=BWz<>KLuS!pyR$l_#gt6nbQ9;uF%=#1|vef!x2rfq#U=s8P)9u&T1UeFY$! za=3gD1sdC6)&m2?A|^oL9dSpt1S7q7(UkD>7W8R8k2f14lpO?%!T#|h}*7%rrmL21cu5+;8XL6GX>BfUP3#KMSKfxn{S}9jbIl0@g z+$2Y}P%1xUOW|D?nGx@jYfB6x0>hBU#v&+cnOK;EXjR4|0RjrJVFD`Jviha*$wZff zKc2%rV>RFqAZZX09u+Pp#>WG8Hq1rR3q`7R6VevDa|lP%924iaY{01#{YrCkn%xI9h@fxfvTiN!AmammZ&Y7J9R1~ zk3203%nOcRh&t0JHBng)S~8YYep`xHg~fu%|r)E zD0`9z#Ht!g+8E2mEcxs{yaTER-PA0cZhK_|I6+vew%Vw*8GqTlXH^_wPM;c-Qz{>?_q`b6OS> zI1c&&uJ8%Ym%yN4U-&O2K>v#MKAyuHc0MqO zhOjX=3j5PNM${ijgutP8+ZhaZ(ik2Y1DAjr1G%iU9N2U>Q^Fb)ZJr|rs|Qgl2C8*o zq{DmbxG>t?7Q`HZ2UiZK5T+e9WDr)nb?R5W+7zbkB9C z;N3!n%s!B>J;sxSy3b=8jzWpyhdsghR&Ij41~Lh`1~Nb81`3!8FlY>pk`_%O9WbY_Tg8@<8KR{A;;HC-t! zIq#I-C@lkhXA!wTWX73CP#CFGc9vl9EFe65(Ya($g^Nu%+`uDB!lKGU3d-h_O%Z*> z+#rHDwvadn#G0}wkOBmO&_TR3&XI*?2^B;Dyod|1{&Y^TW=E_n{a5H`;(&t(v~C#7 zeg@g8k+Bi)gf5xK&7w|_g>r5=As5Hp2r`z5pa~g5_ExsqF<2V1G+{)HO$Zl!k2)i` zBPlbgmpkW+h1!s?Yoj6dSEI3F&dFr&vuKb6tw^|2=RuZhBE#6H@UTouYR41tpz@SA zL~>?)fzXutM?Crh5;awUKBiWlb1s;jr>5j1JAV}!qeG|@jOu;6D8W8T$qt&d&Vvj3 z`{F!UN#MZ}Ppr717C#JXh{zC*5DoP$v8>Qo*@{(kX6w?$SpEf%jqNQ$9z^JAPKZZK zap2P;(GHT6ht|S0F6`!$k3=er42Z31S8PGFCO98bffYlQF*?iC%%3_42IB8A=0lP${K3rO@gC@}n}mz6!Q5iuW zMk)Q@CsGK5UIDru6)rHW0qler0l+3$_CPX-C$=ZMDOKnB0TB*l#@Ya+3DcVo*Pq^0 z_K>=rVYAM-M^38%u4@YyJ&F&EF4RUDQdNr@ z)JCgOgNO*U(!r_dWS?3W3}`j4_83VLjVQPlYcq#d*2p zu&G6U#<;7st|X7S^YgPpf{{^T$6(j!-!LkP1gmnjv{1TYadXyj$GADtm>jF&Q^Oo! zM2T=oybOX4Bv=9~nQJd)5O2xl70oOTj7$WJ=s1A=mHTo`<_+*JGOF_stmS2RpFqo1 zzTz>-%k}KUyb@dS-_fBcLj}N;pue|{qKOzMdC#N&;*p^|>L0Jmgc9%lf(gZCJaoyu z-0^!n#lZ&I*gnpw5Yw+z->%M9E3=jAyclk{i6f`yE7q>Z|2hN#w|8IxuZjuWLKC7C zxN#e7?@y7$2%!M#OX>#HJM5qvV1nn!O{p7*s34YdBbT5j9FiN)u%|GYl=>534cy+s z$)$G!O(LuU*9xCI5C-s#Kch}wXE$t#6RC)h0)+&7#-U#CF6fN}apEQf-p(r+M9u)}BYTf;L~o`qFb1JcaFCZ8)AtFtS*vC-h}7}Vt+$Xmiz=MO z%rs2y5Ep=&`c*U|-867KmBg($ZzR!CgcE-{%IMZF%6(HVmp%AJD@Zsz*;>;Aha#>i zKa)Xn+Z&C3+KBsDZ>j62kR!a<#ekTeoC;=}9NC5e1(`KetGUTT+}>dfqJ4^43MD-v z+7gt1_jBx2hU;TmABVS|NPQC}*od_OZjLqWc5w@_^|IoPhE<{sTWWfQn@^!G%4p)X zlN5#zp+rtEcHl&?W1Y4RnKf;?b=#b~Qe@ydq_~T*+SJrD9UM#WY?gJtl>@263+e>o8rVFBS{f$IARz@);@c8pORJm4Z~{3!lQkzB z+S@`2^Z+iWO1dvW8oiBzO>=hanpVhWyyeG0Bu;1<@jb=KEqlg2JiQ7hpw-3w&3Lr~ zKN6x;KVFRo{J+17JETJhKF85$FmhzfH)K2?WdbwXY!|W?B*57|z{uUW?d}f|a*CSu zw?So2CTVOKu;#iB4m(&0oenctkDmAwS5Yh$9)LR^=5eB%Oij3jb{y1aa~~tZW!aD- z6XX&PH>RO93IcLCLp~Iq|>vmZ-yrUkwq@z3XwUXK`SsWHi^Z4a IqK^On4?&MiEdT%j literal 0 HcmV?d00001 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/cacert.pem b/PythonEnv/2.7/Lib/site-packages/pip/cacert.pem new file mode 100644 index 0000000000..99b310bce9 --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/cacert.pem @@ -0,0 +1,3895 @@ +## +## ca-bundle.crt -- Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Sat Dec 29 20:03:40 2012 +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## + +# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.87 $ $Date: 2012/12/29 16:32:45 $ + +GTE CyberTrust Global Root +========================== +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg +Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG +A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz +MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL +Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 +IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u +sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql +HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID +AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW +M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF +NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +Thawte Server CA +================ +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE +AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j +b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV +BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u +c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG +A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl +/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 +1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J +GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ +GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +Thawte Premium Server CA +======================== +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE +AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl +ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU +VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 +aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ +cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 +aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh +Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ +qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm +SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf +8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t +UCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +Equifax Secure CA +================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE +ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT +B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR +fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW +8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE +CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS +spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 +zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB +BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 +70+sB3c4 +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 1 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy +MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE +NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i +o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq +kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 +RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 3 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy +MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD +VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS +xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi +up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 +mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA +TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah +WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf +Tqj/ZA1k +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd +k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq +WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM +XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC +lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h +cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp +Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h +cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp +Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx +nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC +wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA +ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK +1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk +LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO +FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 +lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT +1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD +Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 +-----END CERTIFICATE----- + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +ValiCert Class 1 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy +MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi +GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm +DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG +lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX +icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP +Orf1LXLI +-----END CERTIFICATE----- + +ValiCert Class 2 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC +CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf +ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ +SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV +UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 +W9ViH0Pd +-----END CERTIFICATE----- + +RSA Root Certificate 1 +====================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td +3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H +BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs +3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF +V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r +on+jjBXu +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E +bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ +rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+ +Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB +FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N +y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h +a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc +D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y +azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug +b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6 +tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7 +C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS +0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs +Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0 +JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf +0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx +JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j +GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS +tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM +8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW +Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX +Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt +mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd +RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG +UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +Entrust.net Secure Server CA +============================ +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg +cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl +ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG +A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi +eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p +dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ +aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 +gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw +ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw +CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l +dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw +NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow +HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN +Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 +n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC +AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER +gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B +AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS +o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z +2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX +OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Equifax Secure Global eBusiness CA +================================== +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp +bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds +b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV +PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN +qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn +hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs +MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN +I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY +NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 1 +============================= +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB +LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE +ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz +IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ +1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a +IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk +MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW +Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF +AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 +lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ +KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 2 +============================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE +ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y +MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT +DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn +2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 +BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx +JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e +uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 +jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia +78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm +V+GRMOrN +-----END CERTIFICATE----- + +AddTrust Low-Value Services Root +================================ +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU +cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO +ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 +54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr +oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 +Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui +GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w +HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw +HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt +ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr +mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj +ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +AddTrust Public Services Root +============================= +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU +cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ +BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l +dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu +nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i +d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG +Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw +HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G +A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G +A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 +JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 +Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H +EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust Qualified Certificates Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU +cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx +CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx +64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 +KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o +L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR +wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU +MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE +BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y +azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze +RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB +iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +RSA Security 2048 v3 +==================== +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy +MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 +Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb +WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH +KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP ++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E +FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY +v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj +0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj +VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 +nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Global CA 2 +==================== +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw +MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ +NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k +LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA +Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b +HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH +K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 +srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh +ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL +OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC +x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF +H4z1Ir+rzoPz4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +UTN-USER First-Network Applications +=================================== +-----BEGIN CERTIFICATE----- +MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp +BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5 +WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T +YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB +cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug +mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj +DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu +Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi +P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE +j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w +HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j +cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G +CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y +IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK +RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp +xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq +DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE +-----END CERTIFICATE----- + +America Online Root Certification Authority 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG +v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z +DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh +sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP +8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z +o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf +GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF +VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft +3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +America Online Root Certification Authority 2 +============================================= +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en +fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 +f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO +qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN +RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 +gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn +6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid +FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 +Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj +B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY +T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p ++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg +JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy +zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO +ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh +1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf +GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff +Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP +cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo Secure Services root +=========================== +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw +MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi +BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP +9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc +rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC +oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V +p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E +FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj +YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm +aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL +DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw +pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H +RR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo Trusted Services root +============================ +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw +MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h +bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw +IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 +3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y +/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 +juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS +ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud +DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp +ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl +cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA +BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l +R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O +9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 1 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw +NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88 +7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9 +EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl +0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645 +2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa +HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT +iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9 +28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV +yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR +vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P +qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z +IRlXvVWa +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA +============================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE +ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w +HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh +bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt +vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P +jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca +C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth +vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 +22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV +HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v +dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN +BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR +EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw +MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +TDC Internet Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE +ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx +NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu +ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j +xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL +znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc +5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 +otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI +AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM +VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM +MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC +AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe +UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G +CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m +gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb +O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU +Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- + +TDC OCES Root CA +================ +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE +ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 +MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH +nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 +zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV +iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde +dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO +3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB +5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k +ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm +cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp +Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x +LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM +MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm +aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy +MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 ++RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 +NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 +A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc +A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 +AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 +AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== +-----END CERTIFICATE----- + +UTN DATACorp SGC Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ +BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa +MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w +HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy +dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys +raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo +wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA +9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv +33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud +DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 +BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD +LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 +DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 +I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx +EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP +DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +UTN USERFirst Email Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0 +BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05 +OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx +FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx +ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz +dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx +B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8 +om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG +TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl +yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE +AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV +HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll +bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH +AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne +xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+ +5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV +NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ +w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- + +UTN USERFirst Hardware Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd +BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx +OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 +eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz +ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI +wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd +tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 +i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf +Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw +gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF +lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF +UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW +XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 +lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn +iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 +nfhmqA== +-----END CERTIFICATE----- + +UTN USERFirst Object Root CA +============================ +-----BEGIN CERTIFICATE----- +MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb +BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz +NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx +HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy +dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR +loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ +w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu +lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7 +RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL +BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8 +ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly +c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw +DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw +NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO +PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE +qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG +hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +NetLock Qualified (Class QA) Root +================================= +-----BEGIN CERTIFICATE----- +MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn +eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0 +bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0 +LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0 +dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP +aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV +CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e +8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb +m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ +0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM +0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2 +YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh +biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p +a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz +YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg +YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg +ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov +L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr +Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0 +aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg +YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0 +IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3 +DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN +wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg +W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc +R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR +5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko +-----END CERTIFICATE----- + +NetLock Notary (Class A) Root +============================= +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI +EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j +ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX +DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH +EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD +VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz +cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM +D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ +z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC +/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 +tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 +4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG +A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC +Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv +bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn +LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 +ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz +IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh +IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu +b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg +Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp +bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 +ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP +ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB +CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr +KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM +8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +NetLock Business (Class B) Root +=============================== +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg +VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD +VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv +bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg +VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S +o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr +1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ +RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh +dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 +ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv +c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg +YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz +Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA +bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl +IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 +YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj +cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM +43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR +stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +NetLock Express (Class C) Root +============================== +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ +BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j +ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z +W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 +euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw +DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN +RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn +YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB +IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i +aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 +ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y +emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k +IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ +UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg +YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 +xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW +gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +Firmaprofesional Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT +GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp +Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA +ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL +MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT +OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 +ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V +j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH +lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf +3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 +NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww +KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG +AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD +ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf +wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm +7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG +VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= +-----END CERTIFICATE----- + +Wells Fargo Root CA +=================== +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl +bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv +MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX +x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 +E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 +OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j +sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj +YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF +BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD +ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv +m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R +OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 +tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- + +Swisscom Root CA 1 +================== +-----BEGIN CERTIFICATE----- +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 +NY6E0F/6MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 1 +============================================== +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP +MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 +acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx +MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB +TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC +aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX +yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i +Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ +8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 +W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME +BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 +sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE +q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY +nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2 +============================================== +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN +MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr +dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G +A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls +acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe +LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI +x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g +QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr +5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB +AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt +Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ +hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P +9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 +UrbnBEI= +-----END CERTIFICATE----- + +SwissSign Platinum CA - G2 +========================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +WellsSecure Public Root Certificate Authority +============================================= +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM +F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw +NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl +bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD +VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 +iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 +i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 +bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB +K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB +AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu +cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm +lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB +i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww +GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI +K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 +bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj +qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es +E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ +tylv2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +IGC/A +===== +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD +VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE +Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy +MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI +EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT +STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 +TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW +So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy +HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd +frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ +tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB +egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC +iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK +q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q +MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI +lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF +0mBWWg== +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +S-TRUST Authentication and Encryption Root CA 2005 PN +===================================================== +-----BEGIN CERTIFICATE----- +MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE +BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh +cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT +LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w +NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk +ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj +aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp +b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob +4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL +g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf +eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3 +KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB +/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv +bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU +D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD +pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08 +P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA +nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit +F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b +Hz2eBIPdltkdOpQ= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE +BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL +EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 +MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz +dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT +GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG +d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N +oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc +QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ +PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb +MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG +IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD +VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 +LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A +dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA +4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg +AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA +egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 +Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO +PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv +c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h +cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw +IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT +WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV +MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp +Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal +HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT +nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE +aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK +yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB +S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. +====================================== +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT +AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg +LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w +HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ +U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh +IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN +yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU +2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 +4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP +2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm +8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf +HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa +Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK +5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b +czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g +ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF +BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug +cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf +AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX +EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v +/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 +MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 +3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk +eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f +/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h +RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU +Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 2 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw +MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw +IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 +xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ +Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u +SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G +dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ +KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj +TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP +JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk +vQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 3 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw +MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W +yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo +6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ +uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk +2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE +O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 +yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 +IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal +092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc +5A== +-----END CERTIFICATE----- + +TC TrustCenter Universal CA I +============================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN +MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg +VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw +JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC +qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv +xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw +ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O +gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j +BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG +1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy +vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 +ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a +7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +ComSign CA +========== +-----BEGIN CERTIFICATE----- +MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD +EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy +MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp +Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q +ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy +P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN +GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk +YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM +rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy +oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P +AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+ +VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2 +QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI +mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb +/627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG +zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U +AGegcQCCSA== +-----END CERTIFICATE----- + +ComSign Secured CA +================== +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE +AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w +NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD +QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs +49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH +7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB +kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 +9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw +AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t +U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA +j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC +AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a +BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp +FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP +51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 +============================================================================================================================= +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH +DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q +aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry +b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV +BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg +S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 +MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl +IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF +n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl +IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft +dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl +cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO +Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 +xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR +6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd +BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 +N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT +y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh +LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M +dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +Buypass Class 2 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 +MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M +cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 +0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 +0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R +uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV +1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt +7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 +fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w +wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +Buypass Class 3 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 +MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx +ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 +n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia +AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c +1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 +pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA +EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 +htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj +el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- + +EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 +========================================================================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +CNNIC ROOT +========== +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE +ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw +OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD +o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz +VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT +VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or +czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK +y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC +wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S +lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 +Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM +O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 +BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 +G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m +mxE= +-----END CERTIFICATE----- + +ApplicationCA - Japanese Government +=================================== +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT +SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw +MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl +cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 +fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN +wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE +jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu +nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU +WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV +BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD +vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs +o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g +/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD +io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW +dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) FÅ‘tanúsítvány +============================================ +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +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 +66+KAQ== +-----END CERTIFICATE----- + +CA Disig +======== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK +QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw +MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz +bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm +GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD +Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo +hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt +ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w +gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P +AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz +aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff +ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa +BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t +WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 +mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K +ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA +4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +Juur-SK +======= +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA +c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw +DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG +SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy +aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf +TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC ++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw +UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa +Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF +MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD +HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh +AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA +cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr +AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw +cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G +A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo +ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL +abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 +IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh +Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 +yyqcjg== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +ACEDICOM Root +============= +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ +VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2 +yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa +XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n +0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ +RjXZ+Hxb +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky +CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX +bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ +D/xwzoiQ +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi +=================================================== +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz +ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 +MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 +cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u +aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY +8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y +jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI +JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk +9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG +SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d +F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq +D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 +Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +TC TrustCenter Universal CA III +=============================== +-----BEGIN CERTIFICATE----- +MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe +Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU +QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex +KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt +QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO +juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut +CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 +M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G +A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA +g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ +KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK +BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV +CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq +woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +Certinomis - Autorité Racine +============================= +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg +LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG +A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw +JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa +wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly +Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw +2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N +jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q +c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC +lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb +xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g +530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna +4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x +WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva +R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 +nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B +CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv +JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE +qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b +WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE +wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ +vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +Root CA Generalitat Valenciana +============================== +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE +ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 +IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 +WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE +CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 +F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B +ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ +D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte +JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB +AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n +dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB +ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl +AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA +YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy +AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt +AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA +YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu +AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA +OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 +dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV +BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S +b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh +TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz +Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 +NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH +iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt ++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +A-Trust-nQual-03 +================ +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE +Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy +a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R +dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw +RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 +ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 +c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA +zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n +yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE +SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 +iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V +cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV +eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 +ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr +sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd +JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 +ahq97BvIxYSazQ== +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Trustis FPS Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 +IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV +BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ +RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk +H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa +cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt +o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA +AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd +BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c +GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC +yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P +8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV +l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl +iB6XzCGcKQENZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ +Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 +dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu +c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv +bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 +aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 +fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm +N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN +Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T +tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX +e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA +2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs +HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib +D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +StartCom Certification Authority G2 +=================================== +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE +ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O +o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG +4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi +Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul +Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs +O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H +vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L +nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS +FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa +z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ +KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk +J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ +JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG +/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc +nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld +blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc +l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm +7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm +obp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +EE Certification Centre Root CA +=============================== +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy +dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw +MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB +UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy +ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM +TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 +rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw +93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN +P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ +MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF +BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj +xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM +lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU +3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM +dcGWxZ0= +-----END CERTIFICATE----- diff --git a/PythonEnv/2.7/Lib/site-packages/pip/cmdoptions.py b/PythonEnv/2.7/Lib/site-packages/pip/cmdoptions.py new file mode 100644 index 0000000000..4bf910cfdc --- /dev/null +++ b/PythonEnv/2.7/Lib/site-packages/pip/cmdoptions.py @@ -0,0 +1,190 @@ +"""shared options and groups""" +from optparse import make_option, OptionGroup +from pip.locations import build_prefix + + +def make_option_group(group, parser): + """ + Return an OptionGroup object + group -- assumed to be dict with 'name' and 'options' keys + parser -- an optparse Parser + """ + option_group = OptionGroup(parser, group['name']) + for option in group['options']: + option_group.add_option(option) + return option_group + +########### +# options # +########### + +index_url = make_option( + '-i', '--index-url', '--pypi-url', + dest='index_url', + metavar='URL', + default='https://pypi.python.org/simple/', + help='Base URL of Python Package Index (default %default).') + +extra_index_url = make_option( + '--extra-index-url', + dest='extra_index_urls', + metavar='URL', + action='append', + default=[], + help='Extra URLs of package indexes to use in addition to --index-url.') + +no_index = make_option( + '--no-index', + dest='no_index', + action='store_true', + default=False, + help='Ignore package index (only looking at --find-links URLs instead).') + +find_links = make_option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='url', + help="If a url or path to an html file, then parse for links to archives. If a local path or file:// url that's a directory, then look for archives in the directory listing.") + +use_mirrors = make_option( + '-M', '--use-mirrors', + dest='use_mirrors', + action='store_true', + default=False, + help='Use the PyPI mirrors as a fallback in case the main index is down.') + +mirrors = make_option( + '--mirrors', + dest='mirrors', + metavar='URL', + action='append', + default=[], + help='Specific mirror URLs to query when --use-mirrors is used.') + +allow_external = make_option( + "--allow-external", + dest="allow_external", + action="append", + default=[], + metavar="PACKAGE", + help="Allow the installation of externally hosted files", +) + +allow_all_external = make_option( + "--allow-all-external", + dest="allow_all_external", + action="store_true", + default=True, # TODO: Change to False after 1.4 has been released + help="Allow the installation of all externally hosted files", +) + +# TODO: NOOP after 1.4 has been released +no_allow_external = make_option( + "--no-allow-external", + dest="allow_all_external", + action="store_false", + help="Disallow the installation of all externally hosted files", +) + +allow_unsafe = make_option( + "--allow-insecure", + dest="allow_insecure", + action="append", + default=[], + metavar="PACKAGE", + help="Allow the installation of insecure and unverifiable files", +) + +no_allow_unsafe = make_option( + "--no-allow-insecure", + dest="allow_all_insecure", + action="store_false", + default=True, + help="Disallow the installation of insecure and unverifiable files" +) + +requirements = make_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Install from the given requirements file. ' + 'This option can be used multiple times.') + +use_wheel = make_option( + '--use-wheel', + dest='use_wheel', + action='store_true', + help='Find and prefer wheel archives when searching indexes and find-links locations. Default to accepting source archives.') + +download_cache = make_option( + '--download-cache', + dest='download_cache', + metavar='dir', + default=None, + help='Cache downloaded packages in